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

be sure to associate a service to a tree at enable time

parent 14943cd8
No related branches found
No related tags found
No related merge requests found
......@@ -319,8 +319,8 @@ extern int service_resolve_read_cdb(cdb *c, resolve_service_t *res) ;
extern void service_resolve_write(resolve_service_t *res) ;
extern void service_resolve_write_remote(resolve_service_t *res, char const *dst, uint8_t force) ;
extern int service_resolve_write_cdb(cdbmaker *c, resolve_service_t *sres) ;
extern void service_enable_disable(graph_t *g, unsigned int idx, resolve_service_t *ares, unsigned int areslen, uint8_t action, unsigned int *visit, uint8_t propagate) ;
extern void service_switch_tree(resolve_service_t *res, char const *base, char const *totreename) ;
extern void service_enable_disable(graph_t *g, unsigned int idx, resolve_service_t *ares, unsigned int areslen, uint8_t action, unsigned int *visit, uint8_t propagate, ssexec_t *info) ;
extern void service_switch_tree(resolve_service_t *res, char const *base, char const *totreename, ssexec_t *info) ;
extern void service_db_migrate(resolve_service_t *old, resolve_service_t *new, char const *base, uint8_t requiredby) ;
/* avoid circular dependencies by prototyping the ss_state_t instead
* of calling the state.h header file*/
......
......@@ -188,7 +188,7 @@ extern int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres) ;
extern int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *data) ;
extern int tree_resolve_get_field_tosa(stralloc *sa, resolve_tree_t *tres, resolve_tree_enum_t field) ;
extern int tree_resolve_array_search(resolve_tree_t *ares, unsigned int areslen, char const *name) ;
extern void tree_service_add(char const *base, char const *treename, char const *service) ;
extern void tree_service_add(char const *treename, char const *service, ssexec_t *info) ;
extern void tree_service_remove(char const *base, char const *treename, char const *service) ;
/** Master */
extern int tree_resolve_master_read_cdb(cdb *c, resolve_tree_master_t *mres) ;
......
......@@ -106,7 +106,7 @@ int ssexec_disable(int argc, char const *const *argv, ssexec_t *info)
if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", argv[n], " not available -- did you parse it?") ;
service_enable_disable(&graph, aresid, ares, areslen, 0, visit, propagate) ;
service_enable_disable(&graph, aresid, ares, areslen, 0, visit, propagate, info) ;
if (!sastr_add_string(&sa, argv[n]))
log_dieu(LOG_EXIT_SYS, "add string") ;
......
......@@ -97,11 +97,11 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", argv[n], " not available -- did you parse it?") ;
service_enable_disable(&graph, aresid, ares, areslen, 1, visit, propagate) ;
service_enable_disable(&graph, aresid, ares, areslen, 1, visit, propagate, info) ;
if (info->opt_tree) {
service_switch_tree(&ares[aresid], info->base.s, info->treename.s) ;
service_switch_tree(&ares[aresid], info->base.s, info->treename.s, info) ;
if (ares[aresid].logger.want && ares[aresid].type == TYPE_CLASSIC) {
......@@ -109,14 +109,12 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
if (logid < 0)
log_die(LOG_EXIT_USER, "service: ", ares[aresid].sa.s + ares[aresid].logger.name, " not available -- please make a bug report") ;
service_switch_tree(&ares[logid], info->base.s, info->treename.s) ;
service_switch_tree(&ares[logid], info->base.s, info->treename.s, info) ;
}
}
if (!stack_add_g(&stk, argv[n]))
log_dieu(LOG_EXIT_SYS, "add string") ;
}
service_resolve_array_free(ares, areslen) ;
......
......@@ -177,7 +177,7 @@ void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf)
if (!ob_basename(main, sv))
log_dieu(LOG_EXIT_SYS, "get basename of: ", sv) ;
r = parse_frontend(sv, ares, &areslen, info, force, conf, 0, main, 0) ;
r = parse_frontend(sv, ares, &areslen, info, force, conf, 0, main, 0, 0) ;
if (r == 2)
/** already parsed */
return ;
......@@ -221,7 +221,7 @@ void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf)
if (!dir_rm_rf(sa.s))
log_warnu("remove temporary directory: ", sa.s) ;
tree_service_add(info->base.s, ares[pos].sa.s + ares[pos].treename, ares[pos].sa.s + ares[pos].name) ;
tree_service_add(ares[pos].sa.s + ares[pos].treename, ares[pos].sa.s + ares[pos].name, info) ;
if (!symlink_make(&ares[pos]))
log_dieusys(LOG_EXIT_SYS, "make service symlink") ;
......
......@@ -25,8 +25,9 @@
#include <66/graph.h>
#include <66/state.h>
#include <66/enum.h>
#include <66/ssexec.h>
static void service_enable_disable_deps(graph_t *g, unsigned int idx, resolve_service_t *ares, unsigned int areslen, uint8_t action, unsigned int *visit, uint8_t propagate)
static void service_enable_disable_deps(graph_t *g, unsigned int idx, resolve_service_t *ares, unsigned int areslen, uint8_t action, unsigned int *visit, uint8_t propagate, ssexec_t *info)
{
log_flow() ;
......@@ -47,7 +48,7 @@ static void service_enable_disable_deps(graph_t *g, unsigned int idx, resolve_se
log_die(LOG_EXIT_USER, "service: ", name, " not available -- did you parse it?") ;
if (!visit[aresid])
service_enable_disable(g, aresid, ares, areslen, action, visit, propagate) ;
service_enable_disable(g, aresid, ares, areslen, action, visit, propagate, info) ;
}
}
......@@ -56,7 +57,7 @@ static void service_enable_disable_deps(graph_t *g, unsigned int idx, resolve_se
/** @action -> 0 disable
* @action -> 1 enable */
void service_enable_disable(graph_t *g, unsigned int idx, resolve_service_t *ares, unsigned int areslen, uint8_t action, unsigned int *visit, uint8_t propagate)
void service_enable_disable(graph_t *g, unsigned int idx, resolve_service_t *ares, unsigned int areslen, uint8_t action, unsigned int *visit, uint8_t propagate, ssexec_t *info)
{
log_flow() ;
......@@ -65,6 +66,10 @@ void service_enable_disable(graph_t *g, unsigned int idx, resolve_service_t *are
resolve_service_t_ref res = &ares[idx] ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ;
/** resolve file may already exist. Be sure to add it to the contents field of the tree.*/
if (action)
tree_service_add(res->sa.s + (res->intree ? res->intree : res->treename), res->sa.s + res->name, info) ;
if (!service_resolve_modify_field(res, E_RESOLVE_SERVICE_ENABLED, !action ? "0" : "1"))
log_dieu(LOG_EXIT_SYS, "modify resolve file of: ", res->sa.s + res->name) ;
......@@ -72,7 +77,7 @@ void service_enable_disable(graph_t *g, unsigned int idx, resolve_service_t *are
log_dieu(LOG_EXIT_SYS, "write resolve file of: ", res->sa.s + res->name) ;
if (propagate)
service_enable_disable_deps(g, idx, ares, areslen, action, visit, propagate) ;
service_enable_disable_deps(g, idx, ares, areslen, action, visit, propagate, info) ;
/** the logger must be disabled to avoid to start it
* with the 66 tree start <tree> command */
......@@ -88,6 +93,9 @@ void service_enable_disable(graph_t *g, unsigned int idx, resolve_service_t *are
wres = resolve_set_struct(DATA_SERVICE, &ares[aresid]) ;
if (action)
tree_service_add(ares[aresid].sa.s + (ares[aresid].intree ? ares[aresid].intree : ares[aresid].treename), ares[aresid].sa.s + ares[aresid].name, info) ;
if (!service_resolve_modify_field(&ares[aresid], E_RESOLVE_SERVICE_ENABLED, !action ? "0" : "1"))
log_dieu(LOG_EXIT_SYS, "modify resolve file of: ", ares[aresid].sa.s + ares[aresid].name) ;
......@@ -121,13 +129,16 @@ void service_enable_disable(graph_t *g, unsigned int idx, resolve_service_t *are
wres = resolve_set_struct(DATA_SERVICE, &ares[aresid]) ;
if (action)
tree_service_add(ares[aresid].sa.s + (ares[aresid].intree ? ares[aresid].intree : ares[aresid].treename), ares[aresid].sa.s + ares[aresid].name, info) ;
if (!service_resolve_modify_field(&ares[aresid], E_RESOLVE_SERVICE_ENABLED, !action ? "0" : "1"))
log_dieu(LOG_EXIT_SYS, "modify resolve file of: ", ares[aresid].sa.s + ares[aresid].name) ;
if (!resolve_write_g(wres, ares[aresid].sa.s + ares[aresid].path.home, ares[aresid].sa.s + ares[aresid].name))
log_dieu(LOG_EXIT_SYS, "write resolve file of: ", ares[aresid].sa.s + ares[aresid].name) ;
service_enable_disable_deps(g, aresid, ares, areslen, action, visit, propagate) ;
service_enable_disable_deps(g, aresid, ares, areslen, action, visit, propagate, info) ;
visit[aresid] = 1 ;
......
......@@ -19,8 +19,9 @@
#include <66/service.h>
#include <66/resolve.h>
#include <66/tree.h>
#include <66/ssexec.h>
void service_switch_tree(resolve_service_t *res, char const *base, char const *totreename)
void service_switch_tree(resolve_service_t *res, char const *base, char const *totreename, ssexec_t *info)
{
log_flow() ;
......@@ -28,7 +29,7 @@ void service_switch_tree(resolve_service_t *res, char const *base, char const *t
tree_service_remove(base, res->sa.s + res->treename, res->sa.s + res->name) ;
tree_service_add(base, totreename, res->sa.s + res->name) ;
tree_service_add(totreename, res->sa.s + res->name, info) ;
if (!service_resolve_modify_field(res, E_RESOLVE_SERVICE_TREENAME, totreename))
log_dieu(LOG_EXIT_SYS, "modify resolve file of: ", res->sa.s + res->name) ;
......
......@@ -17,8 +17,9 @@
#include <66/resolve.h>
#include <66/tree.h>
#include <66/ssexec.h>
void tree_service_add(char const *base, char const *treename, char const *service)
void tree_service_add(char const *treename, char const *service, ssexec_t *info)
{
log_flow() ;
......@@ -28,7 +29,25 @@ void tree_service_add(char const *base, char const *treename, char const *servic
_init_stack_(stk, SS_MAX_SERVICE * SS_MAX_SERVICE_NAME + 1 + len + 1) ;
if (resolve_read_g(wres, base, treename) <= 0)
if (!tree_isvalid(info->base.s, treename)) {
int nargc = 3 ;
char const *newargv[nargc] ;
unsigned int m = 0 ;
newargv[m++] = "tree" ;
newargv[m++] = treename ;
newargv[m++] = 0 ;
char const *prog = PROG ;
PROG = "tree" ;
if (ssexec_tree_admin(nargc, newargv, info))
log_dieusys(LOG_EXIT_SYS, "create tree: ", treename) ;
PROG = prog ;
}
if (resolve_read_g(wres, info->base.s, treename) <= 0)
log_dieusys(LOG_EXIT_SYS, "read resolve file of tree: ", treename) ;
if (tres.ncontents) {
......@@ -61,7 +80,7 @@ void tree_service_add(char const *base, char const *treename, char const *servic
if (!resolve_modify_field(wres, E_RESOLVE_TREE_CONTENTS, stk.s))
log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ;
if (!resolve_write_g(wres, base, treename))
if (!resolve_write_g(wres, info->base.s, treename))
log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ;
resolve_free(wres) ;
......
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