1.9.6: Better management to update/create domain

This commit is contained in:
Cyrille L 2023-09-26 16:34:16 +02:00
parent 7a1eca5aa0
commit 45cdecd7a5
20 changed files with 248 additions and 105 deletions

View File

@ -7,6 +7,9 @@ Tyto - Littérateur
- License: - License:
- Documentation: - Documentation:
## [1.9.6]
- Better management to create/update domain
## [1.9.5] ## [1.9.5]
- Preparing post database - Preparing post database

View File

@ -9,7 +9,6 @@ tyto
## ToDo next (working on) ## ToDo next (working on)
- check action - check action
- user is in articles/ directory
- target post exists and compatible - target post exists and compatible
- create template post database - create template post database

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Version: 1.9.5 # Version: 1.9.6
# Updated: 2023-09-25 1695637945 # Updated: 2023-09-26 1695738690
# Tyto - Littérateur # Tyto - Littérateur
# Copyright (C) 2023 Cyrille Louarn <echolib+tyto@a-lec.org> # Copyright (C) 2023 Cyrille Louarn <echolib+tyto@a-lec.org>

View File

@ -33,7 +33,7 @@
#-------------------------- #--------------------------
import sys import sys
import domain, langs, debug, post import domain, langs, debug, post, tools
#===========================================# #===========================================#
@ -41,9 +41,10 @@ import domain, langs, debug, post
# Domain must be valid to proceed # # Domain must be valid to proceed #
# Create user work domain directories # # Create user work domain directories #
#-------------------------------------------# #-------------------------------------------#
def manage(action, target): def manage(action, target):
# Load domain configuration (update it if needed), check if valid # Load domain configuration (update it if needed), check if valid
domain.cf_valid() or debug.out(105, domain.name, domain.cf_uri, True, 1, True) domain.cf_valid() or debug.out(105, domain.name, domain.cf_uri, True, 1, True)
target.endswith(".tyto") and post.is_article(target) target.endswith(".tyto") and post.is_article(target)
langs.load_website_lang() langs.load_website_lang()

View File

@ -82,6 +82,7 @@ def out(nbr, var, val, show, color, stop):
6 : langs.logs.err_no_dir, 6 : langs.logs.err_no_dir,
7 : langs.logs.err_cr_file, 7 : langs.logs.err_cr_file,
8 : langs.logs.err_lang, 8 : langs.logs.err_lang,
9 : langs.logs.err_ini_file,
20 : langs.logs.err_bad_uri, 20 : langs.logs.err_bad_uri,
21 : langs.logs.err_post_sep, 21 : langs.logs.err_post_sep,
22 : langs.logs.err_post_head, 22 : langs.logs.err_post_head,

View File

@ -73,7 +73,10 @@ def ult_cf_load():
ult_cf = False ult_cf = False
if not os.path.exists(ult_cf_uri): if not os.path.exists(ult_cf_uri):
debug.out(100, name, ult_cf_uri, True, 1, True) tools.create_file(ult_cf_uri, tyto.ini_domain_user)
if os.path.exists(cf_uri): cf_update_values()
else: debug.out(100, name, ult_cf_uri, True, 1, True)
ult_cf = configparser.ConfigParser() ult_cf = configparser.ConfigParser()
ult_cf.read(ult_cf_uri) ult_cf.read(ult_cf_uri)
@ -84,7 +87,11 @@ def ult_cf_load():
#-----------------------------------# #-----------------------------------#
def ult_dlf_load(): def ult_dlf_load():
global ult_dlf global ult_dlf
# User Domains list file
if not os.path.exists(ult_dlf_uri):
tools.create_file(ult_dlf_uri, tyto.ini_domains_list)
ult_dlf = False ult_dlf = False
ult_dlf = configparser.ConfigParser() ult_dlf = configparser.ConfigParser()
ult_dlf.read(ult_dlf_uri) ult_dlf.read(ult_dlf_uri)
@ -156,36 +163,63 @@ def cf_create():
tools.create_file(ult_dlf_uri, tyto.ini_domains_list) tools.create_file(ult_dlf_uri, tyto.ini_domains_list)
# Ask user for domain settings # Ask user for domain settings
forms.ask_domain_title() cf_load()
forms.ask_domain_date() forms.ask_domain_title(True)
forms.ask_domain_about() forms.ask_domain_date(True)
forms.ask_domain_mail() forms.ask_domain_about(True)
forms.ask_domain_tags() forms.ask_domain_mail(True)
forms.ask_domain_tags(True)
# Set default lang, from config file or system lang # Set default lang, from config file or system lang
forms.ask_domain_lang() forms.ask_domain_lang(True)
# Set server directory # Set server directory
forms.ask_domain_server() forms.ask_domain_server(True)
# Update Domain Configuration file
cf_update_values()
#===========================================# #===========================================#
# Set or Update domain configuration values # # Set or Update domain configuration values #
# Ask for some values if empty #
# Ensure to set correct values #
#-------------------------------------------# #-------------------------------------------#
def cf_update_values(srv): def cf_update_values():
# Prepare Domain Configuration File keys values # Prepare Domain Configuration File keys values
#----------------------------------------------- #-----------------------------------------------
cf_load() cf_load()
# Test server directory, and exit if not exists # Server
srv = srv or cf.get("SERVER", "root") # Set from db if unknown srv = cf.get("SERVER", "root") or \
cf.set("SERVER", "root", forms.ask_domain_server(False))
# Test registred website lang # Title
# change to default lang sys, or "en" if no translation file cf.get("DOMAIN", "title") or \
# Load website lang file cf.set("DOMAIN", "title", forms.ask_domain_title(False))
# Date
cf.get("DOMAIN", "date") or \
cf.set("DOMAIN", "date", forms.ask_domain_date(False))
# About
cf.get("DOMAIN", "about") or \
cf.set("DOMAIN", "about", forms.ask_domain_about(False))
# mail
cf.get("DOMAIN", "mail") or \
cf.set("DOMAIN", "mail", forms.ask_domain_mail(False))
# tags
cf.get("DOMAIN", "tags") or \
cf.set("DOMAIN", "tags", forms.ask_domain_tags(False))
# Lang
cf.get("WEBSITE", "lang") or \
cf.set("WEBSITE", "date", forms.ask_domain_lang(False))
langs.load_website_lang() langs.load_website_lang()
cf.set("WEBSITE", "lang", langs.site_lang)
# Set URIs from srv uri
srv_dom = os.path.join(srv, name + "/") srv_dom = os.path.join(srv, name + "/")
srv_wip = os.path.join(srv_dom, "wip/") srv_wip = os.path.join(srv_dom, "wip/")
srv_www = os.path.join(srv_dom, "www/") srv_www = os.path.join(srv_dom, "www/")
@ -315,7 +349,7 @@ def cf_update_values(srv):
cf.write(f) cf.write(f)
# Update User local domain configuration file # Update User local domain configuration file
#-------------------------------------------- #--------------------------------------------
ult_cf_load() ult_cf_load()
ult_cf.set("DOMAIN", "name", name) ult_cf.set("DOMAIN", "name", name)
ult_cf.set("DOMAIN", "hash", tools.get_filesum(cf_uri, True)) ult_cf.set("DOMAIN", "hash", tools.get_filesum(cf_uri, True))
@ -343,40 +377,26 @@ def cf_update_values(srv):
def cf_valid(): def cf_valid():
global active global active
# Check some values in ult_cf
cf_load() cf_load()
# - cf name must be config_name ult_cf_load()
if not tools.compare_ini_ft(cf_uri, tyto.ini_domain):
return
# - domain name must be cf_name
try: cf_name = cf.get("DOMAIN", "name") try: cf_name = cf.get("DOMAIN", "name")
except: debug.out(100, name, cf_uri, True, 2, True) except: debug.out(100, name, cf_uri, True, 2, True)
if cf_name != name: if cf_name != name:
debug.out(100, name, cf_uri, True, 2, True) cf_update_values()
# - root server must exists try: ult_cf_hash = ult_cf.get("DOMAIN", "hash")
try: cf_srv = cf.get("SERVER", "root") except: cf_update_values()
except: debug.out(100, "SERVER root", "?", True, 2, True)
if not cf_srv or not tools.dir_exists(cf_srv, True):
debug.out(100, "SERVER root", "? %s"%cf_srv, True, 2, True)
# Check some values in ult_cf
ult_cf_load()
try:
ult_cf_name = ult_cf.get("DOMAIN", "name")
ult_cf_hash = ult_cf.get("DOMAIN", "hash")
ult_cf_conf = ult_cf.get("DOMAIN", "conf")
ult_cf_root = ult_cf.get("DOMAIN", "root")
except:
debug.out(100, name, ult_cf_uri, True, 1, True)
# Compare values (exit if mismatch)
if ult_cf_name != name or \
ult_cf_conf != cf_uri or \
cf_name != ult_cf_name:
debug.out(100, name, "?", True, 1, True)
# Check if cf need to be updated # Check if cf need to be updated
now_cf_hash = tools.get_filesum(cf_uri, True) now_cf_hash = tools.get_filesum(cf_uri, True)
if now_cf_hash != ult_cf_hash: if now_cf_hash != ult_cf_hash:
cf_update_values("") cf_update_values()
active = is_active() active = is_active()
active and create_work_dirs() active and create_work_dirs()

View File

@ -78,7 +78,7 @@ def ask(q, yes_only, default):
#====================================# #====================================#
# Shorter value to show in questions # # Shorter value to show in questions #
# return value[0:12] # return value[0:12] #
#------------------------------------# #------------------------------------#
def shorter(value): def shorter(value):
if len(value) > 12: if len(value) > 12:
@ -95,29 +95,46 @@ def shorter(value):
def ask_domain_shortname(config_name): def ask_domain_shortname(config_name):
q = "> %s (%s)%s "%(langs.logs.configure_domain, config_name, langs.logs.q) q = "> %s (%s)%s "%(langs.logs.configure_domain, config_name, langs.logs.q)
ask(q, True, False) ask(q, True, False)
#======================# #=======================#
# Getting domain Title # # Getting domain Title #
#----------------------# # update #
def ask_domain_title(): # - True: domain file #
domain.cf_load() # - False: return value #
title = domain.cf.get("DOMAIN", "title") #-----------------------#
def ask_domain_title(update):
try: title = domain.cf.get("DOMAIN", "title")
except: title = ""
"""
if update:
domain.cf_load()
title = domain.cf.get("DOMAIN", "title")
"""
q = "> %s (%s)%s "%(langs.logs.domain_title, shorter(title), langs.logs.q) q = "> %s (%s)%s "%(langs.logs.domain_title, shorter(title), langs.logs.q)
answer = ask(q, False, title) answer = ask(q, False, title)
if answer != title:
tools.update_ini_file(domain.cf_uri, "DOMAIN", "title", answer) if update: tools.update_ini_file(domain.cf_uri, "DOMAIN", "title", answer)
else: return answer
#===========================# #===========================#
# Get domain creation date # # Get domain creation date #
# Check if date match regex # # Check if date match regex #
# update #
# - True: domain file #
# - False: return value #
#---------------------------# #---------------------------#
def ask_domain_date(): def ask_domain_date(update):
domain.cf_load() try: date = domain.cf.get("DOMAIN", "date")
date = domain.cf.get("DOMAIN", "date") except: date = "YYYY[-MM-DD]"
"""
if update:
domain.cf_load()
date = domain.cf.get("DOMAIN", "date")
"""
example = date or "YYYY[-MM-DD]" example = date or "YYYY[-MM-DD]"
q = "> %s (%s)%s "%(langs.logs.domain_date, example, langs.logs.q) q = "> %s (%s)%s "%(langs.logs.domain_date, example, langs.logs.q)
@ -140,65 +157,99 @@ def ask_domain_date():
if not test: if not test:
debug.out(50, "YYYY[-MM-DD]", answer, True, 2, True) debug.out(50, "YYYY[-MM-DD]", answer, True, 2, True)
if answer != date: if update: tools.update_ini_file(domain.cf_uri, "DOMAIN", "date", answer)
tools.update_ini_file(domain.cf_uri, "DOMAIN", "date", answer) else: return answer
#========================# #========================#
# Get domain description # # Get domain description #
# update #
# - True: domain file #
# - False: return value #
#------------------------# #------------------------#
def ask_domain_about(): def ask_domain_about(update):
domain.cf_load() try: about = domain.cf.get("DOMAIN", "about")
about = domain.cf.get("DOMAIN", "about") except: about = ""
"""
if update:
domain.cf_load()
about = domain.cf.get("DOMAIN", "about")
"""
q = "> %s (%s)%s "%(langs.logs.domain_about, shorter(about), langs.logs.q) q = "> %s (%s)%s "%(langs.logs.domain_about, shorter(about), langs.logs.q)
answer = ask(q, False, about) answer = ask(q, False, about)
if answer != about:
tools.update_ini_file(domain.cf_uri, "DOMAIN", "about", answer) if update: tools.update_ini_file(domain.cf_uri, "DOMAIN", "about", answer)
else: return answer
#=======================# #=======================#
# Get domain admin mail # # Get domain admin mail #
# update #
# - True: domain file #
# - False: return value #
#-----------------------# #-----------------------#
def ask_domain_mail(): def ask_domain_mail(update):
domain.cf_load() try: mail = domain.cf.get("DOMAIN", "mail")
mail = domain.cf.get("DOMAIN", "mail") except: mail = ""
"""
if update:
domain.cf_load()
mail = domain.cf.get("DOMAIN", "mail")
"""
q = "> %s (%s)%s "%(langs.logs.domain_mail, shorter(mail), langs.logs.q) q = "> %s (%s)%s "%(langs.logs.domain_mail, shorter(mail), langs.logs.q)
answer = ask(q, False, mail) answer = ask(q, False, mail)
if answer != mail:
tools.update_ini_file(domain.cf_uri, "DOMAIN", "mail", answer) if update: tools.update_ini_file(domain.cf_uri, "DOMAIN", "mail", answer)
else: return answer
#===============================================# #===============================================#
# Get domain tags (wil be used in all articles) # # Get domain tags (wil be used in all articles) #
# update #
# - True: domain file #
# - False: return value #
#-----------------------------------------------# #-----------------------------------------------#
def ask_domain_tags(): def ask_domain_tags(update):
domain.cf_load() try: tags = domain.cf.get("DOMAIN", "tags")
tags = domain.cf.get("DOMAIN", "tags") except: tags = ""
"""
if update:
domain.cf_load()
tags = domain.cf.get("DOMAIN", "tags")
"""
q = "> %s (%s)%s "%(langs.logs.domain_tags, shorter(tags), langs.logs.q) q = "> %s (%s)%s "%(langs.logs.domain_tags, shorter(tags), langs.logs.q)
answer = ask(q, False, tags) answer = ask(q, False, tags)
if answer != tags: # Remove useless spaces for HTML meta
# Remove useless spaces for HTML meta tuple_tags = answer.rsplit(",")
tuple_tags = answer.rsplit(",") answer = ""
answer = "" for i, tag in enumerate(tuple_tags):
for i, tag in enumerate(tuple_tags): answer = answer + tag.strip()
answer = answer + tag.strip() if i != len(tuple_tags) - 1:
if i != len(tuple_tags) - 1: answer = answer + ","
answer = answer + ","
tools.update_ini_file(domain.cf_uri, "DOMAIN", "tags", answer) if update: tools.update_ini_file(domain.cf_uri, "DOMAIN", "tags", answer)
else: return answer
#===================================# #===================================#
# Get domain lang # # Get domain lang #
# default en if no translation file # > !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! < TODO # default en if no translation file # > !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! < TODO
#-----------------------------------# #-----------------------------------#
def ask_domain_lang(): def ask_domain_lang(update):
langs.get_website_lang() try:
lang = langs.site_lang lang = domain.cf.get("WEBSITE", "lang") or langs.get_sys_lang()
except:
lang = ""
"""
if update:
domain.cf_load()
lang = domain.cf.get("WEBSITE", "lang")
"""
q = "> %s (%s)%s "%(langs.logs.domain_lang, lang, langs.logs.q) q = "> %s (%s)%s "%(langs.logs.domain_lang, lang, langs.logs.q)
answer = ask(q, False, lang).lower() answer = ask(q, False, lang).lower()
@ -211,19 +262,28 @@ def ask_domain_lang():
# Check if translation file exists # Check if translation file exists
if not langs.translation_exists("website", answer, False): if not langs.translation_exists("website", answer, False):
debug.out(103, "en", "%swebsite_en.py"%langs.trfs, True, 1, False) lang = lang.get_sys_lang()
debug.out(103, lang, "%swebsite_%s.py"%(langs.trfs, lang), True, 1, False)
answer = lang answer = lang
if answer != lang: if update: tools.update_ini_file(domain.cf_uri, "WEBSITE", "lang", answer)
tools.update_ini_file(domain.cf_uri, "WEBSITE", "lang", answer) else: return lang
#===================================# #===================================#
# Get domain server root # # Get domain server root #
#-----------------------------------# #-----------------------------------#
def ask_domain_server(): def ask_domain_server(update):
domain.cf_load() try:
srv = domain.cf.get("SERVER", "root") srv = domain.cf.get("SERVER", "root")
if not tools.dir_exists(srv, False):
srv = ""
except: srv = ""
"""
if update:
domain.cf_load()
srv = domain.cf.get("SERVER", "root")
"""
if srv and not tools.dir_exists(srv, False): if srv and not tools.dir_exists(srv, False):
srv = "" srv = ""
@ -233,9 +293,10 @@ def ask_domain_server():
# Check if directory exists # Check if directory exists
if not tools.dir_exists(answer, False): if not tools.dir_exists(answer, False):
answer = srv answer = ""
ask_domain_server() ask_domain_server(update)
return return
domain.cf_update_values(answer) if update: tools.update_ini_file(domain.cf_uri, "SERVER", "root", answer)
else: return srv

View File

@ -56,7 +56,7 @@ def translation_exists(module, lang, out):
tr_file = "%s%s_%s.py"%(trfs, module, lang) tr_file = "%s%s_%s.py"%(trfs, module, lang)
if not os.path.exists(tr_file): if not os.path.exists(tr_file):
debug.out(5, lang, tr_file, True, 2, out) debug.out(5, lang, tr_file, True, 2, False)
return False return False
return True return True
@ -126,10 +126,11 @@ def get_website_lang():
#----------------------------------# #----------------------------------#
def load_website_lang(): def load_website_lang():
global site, site_lang, set_site global site, site_lang, set_site
site = __import__("website_%s"%get_website_lang())
try: try:
set_site set_site
except: except:
site = __import__("website_%s"%get_website_lang())
debug.out(208, site_lang, tr_website_uri, False, 0, False) debug.out(208, site_lang, tr_website_uri, False, 0, False)
set_site = True set_site = True

View File

@ -33,8 +33,41 @@
#-------------------------- #--------------------------
from hashlib import blake2b from hashlib import blake2b
import os, configparser import os, configparser, datetime, time
import debug import debug, domain
#==============================#
# Set and return date and time #
# With local options from lang #
#------------------------------#
def nowdate(spec):
# Default
F_Int = "'%Y-%m-%d %I:%M:%S %p'" # Full International date
S_Int = "'%Y-%m-%d" # Short International date
# Get spec option for local date
# Get Used domain lang and set format date
locales = ("FLocal", "SLocal")
if spec in locales:
domain.cf_load()
lang = domain.cf.get("WEBSITE", "lang")
if lang == "fr":
S_Int = "'%d/%m/%Y'"
F_Int = "'%d/%m/%Y %H:%M:%S'"
now = datetime.datetime.now()
setdate = {
"FInt" : now.strftime(F_Int),
"SInt" : now.strftime(S_Int),
"FLocal" : now.strftime(F_Int),
"SLocal" : now.strftime(S_Int),
"Year" : now.strftime('%Y'),
"Epoch" : int(now.timestamp()),
}
return setdate[spec]
#========================# #========================#
@ -115,3 +148,26 @@ def update_ini_file(file_path, section, key, val):
config.set(section, key, val) config.set(section, key, val)
with open(file_path, "w") as f: with open(file_path, "w") as f:
config.write(f) config.write(f)
#==================================================#
# Compare database file with origin file template #
# Used for domain and article configuration file #
# Return True, if ini keys are same #
#--------------------------------------------------#
def compare_ini_ft(cf_uri, template):
with open(cf_uri, "r") as f:
ln = 0
lines = f.read()
lines = lines.rsplit("\n")
for key_t in template.rsplit("\n"):
ln += 1
key_t = key_t.rsplit("=")[0]
key_f = lines[ln -1].rsplit("=")[0]
if not key_t == key_f:
debug.out(9, "l=%s: %s != %s"%(ln, key_f, key_t), cf_uri, False, 2, False)
return False
return True

View File

@ -41,6 +41,7 @@ import langs, forms, domain
#------------------------------------# #------------------------------------#
def manage(action, target): def manage(action, target):
if action == "set": if action == "set":
domain.cf_load()
do = { do = {
"title" : forms.ask_domain_title, "title" : forms.ask_domain_title,
"date" : forms.ask_domain_date, "date" : forms.ask_domain_date,
@ -50,9 +51,8 @@ def manage(action, target):
"server" : forms.ask_domain_server, "server" : forms.ask_domain_server,
} }
do[target]() do[target](True)
elif action in ("start", "stop") \ elif action in ("start", "stop") and target == "domain":
and target == "domain":
domain.userset_status(action) domain.userset_status(action)

View File

@ -60,6 +60,7 @@ err_bad_uri = "URI non compatible"
err_post_sep = "Séparateur manquant" err_post_sep = "Séparateur manquant"
err_post_head = "Erreur dans l'Entête" err_post_head = "Erreur dans l'Entête"
err_post_empty = "Article vide" err_post_empty = "Article vide"
err_ini_file = "Configuration invalide"
# Warnings # Warnings
warn_no_dom = "Domaine non configuré" warn_no_dom = "Domaine non configuré"