Skip to content
Snippets Groups Projects
Commit 18dc57e6 authored by Eric Vidal's avatar Eric Vidal :speech_balloon:
Browse files

Module dir is no longer mandatory, add 66 configuration variable on the...

Module dir is no longer mandatory, add 66 configuration variable on the envrionment at call of the configure script, merge configuration files for services inside the module, less redundant code,fix search of instantiated services source, implement all dependencies of service recursively, fix environment parse process
parent a274673f
No related branches found
No related tags found
No related merge requests found
...@@ -48,55 +48,72 @@ ...@@ -48,55 +48,72 @@
#define SS_MODULE_SERVICE_INSTANCE "/service@" #define SS_MODULE_SERVICE_INSTANCE "/service@"
#define SS_MODULE_SERVICE_INSTANCE_LEN (sizeof SS_MODULE_SERVICE_INSTANCE - 1) #define SS_MODULE_SERVICE_INSTANCE_LEN (sizeof SS_MODULE_SERVICE_INSTANCE - 1)
static int check_dir(char const *src,char const *dir,char const *dst) static int check_dir(char const *src,char const *dir)
{ {
int r ; int r ;
size_t srclen = strlen(src) ; size_t srclen = strlen(src) ;
size_t dirlen = strlen(dir) ; size_t dirlen = strlen(dir) ;
size_t dstlen = strlen(dst) ;
char tsrc[srclen + dirlen + 1] ; char tsrc[srclen + dirlen + 1] ;
auto_strings(tsrc,src,dir) ; auto_strings(tsrc,src,dir) ;
char tdst[dstlen + dirlen + 1] ;
auto_strings(tdst,dst,dir) ;
r = scan_mode(tsrc,S_IFDIR) ; r = scan_mode(tsrc,S_IFDIR) ;
if (r < 0) { errno = EEXIST ; log_warnusys_return(LOG_EXIT_ZERO,"conflicting format of: ",tsrc) ; } if (r < 0) { errno = EEXIST ; log_warnusys_return(LOG_EXIT_ZERO,"conflicting format of: ",tsrc) ; }
if (!r) if (!r)
{ {
if (!dir_create_parent(tdst,0755)) if (!dir_create_parent(tsrc,0755))
log_warnusys_return(LOG_EXIT_ZERO,"create directory: ",tdst) ; log_warnusys_return(LOG_EXIT_ZERO,"create directory: ",tsrc) ;
} }
return 1 ; return 1 ;
} }
/** return 1 if all good static int get_list(stralloc *list, stralloc *sdir,size_t len, char const *svname, mode_t mode)
* return 0 on crash {
sdir->len = len ;
if (!auto_stra(sdir,SS_MODULE_SERVICE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
if (!sastr_dir_get_recursive(list,sdir->s,"",mode))
log_warnusys_return(LOG_EXIT_ZERO,"get file(s) of module: ",svname) ;
sdir->len = len ;
if (!auto_stra(sdir,SS_MODULE_SERVICE_INSTANCE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
if (!sastr_dir_get_recursive(list,sdir->s,"",mode))
log_warnusys_return(LOG_EXIT_ZERO,"get file(s) of module: ",svname) ;
return 1 ;
}
/** return 1 on success
* return 0 on failure
* return 2 on already enabled * return 2 on already enabled
* @svname do not contents the path of the frontend file*/ * @svname do not contents the path of the frontend file*/
int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stralloc *tree_list, char const *svname,unsigned int *nbsv, stralloc *sasv,uint8_t force,uint8_t conf) int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stralloc *tree_list, char const *svname,unsigned int *nbsv, stralloc *sasv,uint8_t force,uint8_t conf)
{ {
log_trace("start parse process of module: ",svname) ; log_trace("start parse process of module: ",svname) ;
int r, err = 1, insta ; int r, err = 1, insta = -1, svtype = -1, from_ext_insta = 0 ;
size_t pos = 0, id, nid, newlen ; size_t pos = 0, id, nid, newlen, ndeps ;
stralloc sdir = STRALLOC_ZERO ; // service dir stralloc sdir = STRALLOC_ZERO ; // service dir
stralloc list = STRALLOC_ZERO ; stralloc list = STRALLOC_ZERO ;
stralloc tmp = STRALLOC_ZERO ; stralloc tmp = STRALLOC_ZERO ;
stralloc moduleinsta = STRALLOC_ZERO ; stralloc moduleinsta = STRALLOC_ZERO ;
stralloc addonsv = STRALLOC_ZERO ; stralloc addonsv = STRALLOC_ZERO ;
/** should be always right */ /** should be always right,
* be paranoid and check it */
insta = instance_check(svname) ; insta = instance_check(svname) ;
if (!instance_splitname(&moduleinsta,svname,insta,SS_INSTANCE_NAME)) if (insta <= 0)
log_warnu_return(LOG_EXIT_ZERO,"get instance name of: ",svname); log_warn_return(LOG_EXIT_ZERO,"invalid module instance name: ",svname);
if (!ss_resolve_module_path(&sdir,&tmp,svname,info->owner)) return 0 ; if (!ss_resolve_module_path(&sdir,&tmp,svname,info->owner)) return 0 ;
/** check mandatory directories: configure, service, service@ */ /** check mandatory directories:
if (!check_dir(tmp.s,SS_MODULE_CONFIG_DIR,sdir.s)) return 0 ; * module/module_name, module/module_name/{configure,service,service@} */
if (!check_dir(tmp.s,SS_MODULE_SERVICE,sdir.s)) return 0 ; if (!check_dir(tmp.s,"")) return 0 ;
if (!check_dir(tmp.s,SS_MODULE_SERVICE_INSTANCE,sdir.s)) return 0 ; if (!check_dir(tmp.s,SS_MODULE_CONFIG_DIR)) return 0 ;
if (!check_dir(tmp.s,SS_MODULE_SERVICE)) return 0 ;
if (!check_dir(tmp.s,SS_MODULE_SERVICE_INSTANCE)) return 0 ;
newlen = sdir.len ; newlen = sdir.len ;
...@@ -126,60 +143,25 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra ...@@ -126,60 +143,25 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra
if (!hiercopy(tmp.s,sdir.s)) if (!hiercopy(tmp.s,sdir.s))
log_warnusys_return(LOG_EXIT_ZERO,"copy: ",tmp.s," to: ",sdir.s) ; log_warnusys_return(LOG_EXIT_ZERO,"copy: ",tmp.s," to: ",sdir.s) ;
} }
/** This following is redundant, but the order here
* is important and cannot be mixed */
/** regex file content */ /** regex file content */
if (!auto_stra(&sdir,SS_MODULE_SERVICE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; list.len = 0 ;
if (!sastr_dir_get_recursive(&list,sdir.s,"",S_IFREG))
log_warnusys_return(LOG_EXIT_ZERO,"get file(s) of module: ",svname) ;
sdir.len = newlen ;
if (!auto_stra(&sdir,SS_MODULE_SERVICE_INSTANCE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
if (!sastr_dir_get_recursive(&list,sdir.s,"",S_IFREG))
log_warnusys_return(LOG_EXIT_ZERO,"get file(s) of module: ",svname) ;
if (!get_list(&list,&sdir,newlen,svname,S_IFREG)) return 0 ;
if (!regex_replace(&list,sv_before,svname)) return 0 ; if (!regex_replace(&list,sv_before,svname)) return 0 ;
/* regex directories name */ /* regex directories name */
sdir.len = newlen ; if (!get_list(&list,&sdir,newlen,svname,S_IFDIR)) return 0 ;
list.len = 0 ;
if (!auto_stra(&sdir,SS_MODULE_SERVICE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
if (!sastr_dir_get_recursive(&list,sdir.s,"",S_IFDIR))
log_warnusys_return(LOG_EXIT_ZERO,"get file(s) of module: ",svname) ;
sdir.len = newlen ;
if (!auto_stra(&sdir,SS_MODULE_SERVICE_INSTANCE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
if (!sastr_dir_get_recursive(&list,sdir.s,"",S_IFDIR))
log_warnusys_return(LOG_EXIT_ZERO,"get file(s) of module: ",svname) ;
if (!regex_rename(&list,sv_before->type.module.iddir,sv_before->type.module.ndir,sdir.s)) return 0 ; if (!regex_rename(&list,sv_before->type.module.iddir,sv_before->type.module.ndir,sdir.s)) return 0 ;
/* regex files name */ /* regex files name */
sdir.len = newlen ;
list.len = 0 ; list.len = 0 ;
if (!auto_stra(&sdir,SS_MODULE_SERVICE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; if (!get_list(&list,&sdir,newlen,svname,S_IFREG)) return 0 ;
if (!sastr_dir_get_recursive(&list,sdir.s,"",S_IFREG))
log_warnusys_return(LOG_EXIT_ZERO,"get file(s) of module: ",svname) ;
sdir.len = newlen ;
if (!auto_stra(&sdir,SS_MODULE_SERVICE_INSTANCE)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
if (!sastr_dir_get_recursive(&list,sdir.s,"",S_IFREG))
log_warnusys_return(LOG_EXIT_ZERO,"get file(s) of module: ",svname) ;
if (!regex_rename(&list,sv_before->type.module.idfiles,sv_before->type.module.nfiles,sdir.s)) return 0 ; if (!regex_rename(&list,sv_before->type.module.idfiles,sv_before->type.module.nfiles,sdir.s)) return 0 ;
/* launch configure script */ /* launch configure script */
if (!regex_configure(sv_before,permanent_sdir,svname,conf)) return 0 ; if (!regex_configure(sv_before,info,permanent_sdir,svname,conf)) return 0 ;
make_deps: make_deps:
/** get all services */ /** get all services */
...@@ -223,61 +205,51 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra ...@@ -223,61 +205,51 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra
/** parse all services of the modules */ /** parse all services of the modules */
for (pos = 0 ; pos < list.len ; pos += strlen(list.s + pos) + 1) for (pos = 0 ; pos < list.len ; pos += strlen(list.s + pos) + 1)
{ {
int svtype, insta ; insta = 0, svtype = -1 , from_ext_insta = 0 ;
char *sv = list.s + pos ; char *sv = list.s + pos ;
size_t len = strlen(sv) ; size_t len = strlen(sv) ;
char bname[len + 1] ; char bname[len + 1] ;
char *pbname = bname ; char *pbname = bname ;
ssize_t from_ext_insta = 0 ;
addonsv.len = 0 ; addonsv.len = 0 ;
if (!ob_basename(bname,sv)) if (!ob_basename(bname,sv))
log_warnu_return(LOG_EXIT_ZERO,"find basename of: ",sv) ; log_warnu_return(LOG_EXIT_ZERO,"find basename of: ",sv) ;
char bname_insta[len + moduleinsta.len + 1] ; insta = instance_check(bname) ;
insta = get_len_until(bname,'@') ; if (!insta) log_warn_return(LOG_EXIT_ZERO,"invalid instance name: ",sv) ;
if (insta > 0) if (insta > 0)
{ {
/** respect a complete instance name*/ /** we can't know the origin of the instance
if (instance_check(bname)) * search first at service@ directory, if it not found
* pass through the classic ss_resolve_src_path() function */
pbname = bname ;
int found = 0 ;
size_t len = strlen(permanent_sdir) ;
char tmp[len + SS_MODULE_SERVICE_INSTANCE_LEN + 2] ;
auto_strings(tmp,permanent_sdir,SS_MODULE_SERVICE_INSTANCE,"/") ;
r = ss_resolve_src(&addonsv,pbname,tmp,&found) ;
if (r == -1) log_warnusys_return(LOG_EXIT_ZERO,"parse source directory: ",tmp) ;
if (!r)
{ {
/** we can't know the origine of the instance if (ss_resolve_src_path(&addonsv,pbname,info->owner) < 1)
* search first at service@ directory, if it not found log_warnu_return(LOG_EXIT_ZERO,"resolve source path of: ",pbname) ;
* pass through the classic ss_resolve_src_path() function */
pbname = bname ;
int found = 0 ;
size_t len = strlen(permanent_sdir) ;
char tmp[len + SS_MODULE_SERVICE_INSTANCE_LEN + 1] ;
auto_strings(tmp,permanent_sdir,SS_MODULE_SERVICE_INSTANCE) ;
r = ss_resolve_src(&addonsv,sv,tmp,&found) ;
if (r == -1) log_warnusys_return(LOG_EXIT_ZERO,"parse source directory: ",tmp) ;
if (!r)
{
if (ss_resolve_src_path(&addonsv,pbname,info->owner) < 1)
log_warnu_return(LOG_EXIT_ZERO,"resolve source path of: ",pbname) ;
from_ext_insta = get_rlen_until(addonsv.s,'@',addonsv.len) + 1 ;
}
sv = addonsv.s ;
}
else
{
auto_strings(bname_insta,bname,moduleinsta.s) ;
pbname = bname_insta ;
if (!auto_stra(&addonsv,permanent_sdir,SS_MODULE_SERVICE_INSTANCE,"/",pbname))
log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
sv = addonsv.s ;
} }
from_ext_insta++ ;
sv = addonsv.s ;
len = strlen(sv) ; len = strlen(sv) ;
} }
/** merge configuration file from upstream for each service
if (!parse_service_before(info,parsed_list,tree_list,sv,nbsv,sasv,force,conf)) * inside the module*/
conf = 2 ;
if (!parse_service_before(info,parsed_list,tree_list,sv,nbsv,sasv,force,conf,0))
log_warnu_return(LOG_EXIT_ZERO,"parse: ",sv," from module: ",svname) ; log_warnu_return(LOG_EXIT_ZERO,"parse: ",sv," from module: ",svname) ;
char ext_insta[len + 1] ; char ext_insta[len + 1] ;
if (from_ext_insta) { if (from_ext_insta) {
size_t len = strlen(sv) ; size_t len = strlen(sv) ;
size_t newlen = len - (len - from_ext_insta) ; r = get_rlen_until(sv,'@',len) + 1 ;
size_t newlen = len - (len - r) ;
auto_strings(ext_insta,sv) ; auto_strings(ext_insta,sv) ;
ext_insta[newlen] = 0 ; ext_insta[newlen] = 0 ;
sv = ext_insta ; sv = ext_insta ;
...@@ -293,6 +265,21 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra ...@@ -293,6 +265,21 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra
if (!stralloc_catb(&tmp,pbname,strlen(pbname) + 1)) if (!stralloc_catb(&tmp,pbname,strlen(pbname) + 1))
log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
} }
/** we want all service contained into the module including
* the deps of the service */
for (ndeps = 0; ndeps < genalloc_len(sv_alltype,&gasv); ndeps++)
{
sv_alltype_ref service = &genalloc_s(sv_alltype,&gasv)[ndeps] ;
int id = service->cname.itype == TYPE_MODULE ? service->cname.idcontents : service->cname.idga ;
unsigned int nid = service->cname.itype == TYPE_MODULE ? service->cname.ncontents : service->cname.nga ;
for (;nid; id += strlen(deps.s + id) + 1, nid--)
{
if (sastr_cmp(&sdir,deps.s + id) == -1)
if (!stralloc_catb(&sdir,deps.s + id,strlen(deps.s + id) + 1))
log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
}
}
sv_before->cname.idga = deps.len ; sv_before->cname.idga = deps.len ;
sv_before->cname.nga = 0 ; sv_before->cname.nga = 0 ;
for (pos = 0 ;pos < tmp.len ; pos += strlen(tmp.s + pos) + 1) for (pos = 0 ;pos < tmp.len ; pos += strlen(tmp.s + pos) + 1)
...@@ -307,6 +294,7 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra ...@@ -307,6 +294,7 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra
stralloc_catb(&deps,sdir.s + pos,strlen(sdir.s + pos) + 1) ; stralloc_catb(&deps,sdir.s + pos,strlen(sdir.s + pos) + 1) ;
sv_before->cname.ncontents++ ; sv_before->cname.ncontents++ ;
} }
tmp.len = 0 ; tmp.len = 0 ;
if (!auto_stra(&tmp,permanent_sdir,SS_MODULE_CONFIG_DIR)) if (!auto_stra(&tmp,permanent_sdir,SS_MODULE_CONFIG_DIR))
log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ; log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
...@@ -472,7 +460,7 @@ int regex_rename(stralloc *list, int id, unsigned int nid, char const *sdir) ...@@ -472,7 +460,7 @@ int regex_rename(stralloc *list, int id, unsigned int nid, char const *sdir)
return 1 ; return 1 ;
} }
int regex_configure(sv_alltype *sv_before,char const *module_dir,char const *module_name,uint8_t conf) int regex_configure(sv_alltype *sv_before,ssexec_t *info, char const *module_dir,char const *module_name,uint8_t conf)
{ {
int wstat, r ; int wstat, r ;
pid_t pid ; pid_t pid ;
...@@ -493,6 +481,36 @@ int regex_configure(sv_alltype *sv_before,char const *module_dir,char const *mod ...@@ -493,6 +481,36 @@ int regex_configure(sv_alltype *sv_before,char const *module_dir,char const *mod
r = scan_mode(config_script,S_IFREG) ; r = scan_mode(config_script,S_IFREG) ;
if (r > 0) if (r > 0)
{ {
/** export ssexec_t info value on the environment */
{
char owner[UID_FMT];
owner[uid_fmt(owner,info->owner)] = 0 ;
oenv.len = 0 ;
char verbo[UINT_FMT];
verbo[uid_fmt(verbo,VERBOSITY)] = 0 ;
oenv.len = 0 ;
auto_stra(&env,"MOD_NAME=",module_name,"\n") ;
auto_stra(&env,"MOD_BASE=",info->base.s,"\n") ;
auto_stra(&env,"MOD_LIVE=",info->live.s,"\n") ;
auto_stra(&env,"MOD_TREE=",info->tree.s,"\n") ;
auto_stra(&env,"MOD_SCANDIR=",info->scandir.s,"\n") ;
auto_stra(&env,"MOD_TREENAME=",info->treename.s,"\n") ;
auto_stra(&env,"MOD_OWNER=",owner,"\n") ;
auto_stra(&env,"MOD_VERBOSITY=",verbo,"\n") ;
auto_stra(&env,"MOD_MODULE_DIR=",module_dir,"\n") ;
auto_stra(&env,"MOD_SKEL_DIR=",SS_SKEL_DIR,"\n") ;
auto_stra(&env,"MOD_SERVICE_SYSDIR=",SS_SERVICE_SYSDIR,"\n") ;
auto_stra(&env,"MOD_SERVICE_ADMDIR=",SS_SERVICE_ADMDIR,"\n") ;
auto_stra(&env,"MOD_SERVICE_ADMCONFDIR=",SS_SERVICE_ADMCONFDIR,"\n") ;
auto_stra(&env,"MOD_MODULE_SYSDIR=",SS_MODULE_SYSDIR,"\n") ;
auto_stra(&env,"MOD_MODULE_ADMDIR=",SS_MODULE_ADMDIR,"\n") ;
auto_stra(&env,"MOD_SCRIPT_SYSDIR=",SS_SCRIPT_SYSDIR,"\n") ;
auto_stra(&env,"MOD_USER_DIR=",SS_USER_DIR,"\n") ;
auto_stra(&env,"MOD_SERVICE_USERDIR=",SS_SERVICE_USERDIR,"\n") ;
auto_stra(&env,"MOD_SERVICE_USERCONFDIR=",SS_SERVICE_USERCONFDIR,"\n") ;
auto_stra(&env,"MOD_MODULE_USERDIR=",SS_MODULE_USERDIR,"\n") ;
auto_stra(&env,"MOD_SCRIPT_USERDIR=",SS_SCRIPT_USERDIR,"\n") ;
}
/** environment is not mandatory */ /** environment is not mandatory */
if (sv_before->opts[2] > 0) if (sv_before->opts[2] > 0)
{ {
...@@ -501,16 +519,18 @@ int regex_configure(sv_alltype *sv_before,char const *module_dir,char const *mod ...@@ -501,16 +519,18 @@ int regex_configure(sv_alltype *sv_before,char const *module_dir,char const *mod
* env_compute return 2 in case of need to write */ * env_compute return 2 in case of need to write */
r = env_compute(&oenv,sv_before,conf) ; r = env_compute(&oenv,sv_before,conf) ;
if (!r) log_warnu_return(LOG_EXIT_ZERO,"compute environment") ; if (!r) log_warnu_return(LOG_EXIT_ZERO,"compute environment") ;
if (!stralloc_0(&oenv)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
/** prepare for the environment merge */
if (!environ_clean_envfile(&env,&oenv))
log_warnu_return(LOG_EXIT_ZERO,"prepare environment") ;
if (!stralloc_0(&oenv)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
if (!sastr_split_string_in_nline(&env)) /** prepare for the environment merge */
log_warnu_return(LOG_EXIT_ZERO,"rebuild environment") ; if (oenv.len) {
if (!environ_clean_envfile(&env,&oenv))
log_warnu_return(LOG_EXIT_ZERO,"prepare environment") ;
if (!stralloc_0(&env)) log_warnsys_return(LOG_EXIT_ZERO,"stralloc") ;
env.len-- ;
}
} }
if (!sastr_split_string_in_nline(&env))
log_warnu_return(LOG_EXIT_ZERO,"rebuild environment") ;
n = env_len((const char *const *)environ) + 1 + byte_count(env.s,env.len,'\0') ; n = env_len((const char *const *)environ) + 1 + byte_count(env.s,env.len,'\0') ;
char const *newenv[n + 1] ; char const *newenv[n + 1] ;
if (!env_merge (newenv, n ,(const char *const *)environ,env_len((const char *const *)environ),env.s, env.len)) if (!env_merge (newenv, n ,(const char *const *)environ,env_len((const char *const *)environ),env.s, env.len))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment