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

deal with new resolve format

parent f38336d7
No related branches found
No related tags found
No related merge requests found
......@@ -318,7 +318,7 @@ extern int service_resolve_get_field_tosa(stralloc *sa, resolve_service_t *res,
extern int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t field, char const *data) ;
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_tmp(resolve_service_t *res, char const *dst, uint8_t force) ;
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, visit_t *visit, uint8_t propagate) ;
extern void service_switch_tree(resolve_service_t *res, char const *base, char const *totreename) ;
......
......@@ -44,26 +44,11 @@ static void parse_it(char const *name, ssexec_t *info)
PROG = prog ;
}
static void service_resolve_array_write(char const *base, resolve_service_t *ares, uint32_t *indexes, uint32_t lindex)
{
log_flow() ;
uint32_t pos = 0 ;
for (; pos < lindex ; ++pos) {
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &ares[indexes[pos]]) ;
if (!resolve_write_g(wres, base, ares[indexes[pos]].sa.s + ares[indexes[pos]].name))
log_dieu(LOG_EXIT_SYS, "write resolve file of: ", ares[indexes[pos]].sa.s + ares[indexes[pos]].name) ;
}
}
int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
{
log_flow() ;
uint32_t flag = 0, indexes[SS_MAX_SERVICE + 1], lindex = 0 ;
uint32_t flag = 0 ;
uint8_t start = 0, propagate = 1 ;
int n = 0, e = 1 ;
size_t pos = 0 ;
......@@ -74,7 +59,6 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
visit_t visit[SS_MAX_SERVICE + 1] ;
visit_init(visit, SS_MAX_SERVICE) ;
visit_init(indexes, SS_MAX_SERVICE) ;
FLAGS_SET(flag, STATE_FLAGS_TOPROPAGATE|STATE_FLAGS_WANTUP) ;
......@@ -115,10 +99,8 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
_init_stack_(stk, argc * SS_MAX_TREENAME) ;
for(; n < argc ; n++) {
name_isvalid(argv[n]) ;
for(; n < argc ; n++)
parse_it(argv[n], info) ;
}
/** build the graph of the entire system */
graph_build_service(&graph, ares, &areslen, info, flag) ;
......@@ -138,8 +120,6 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
service_switch_tree(&ares[aresid], info->base.s, info->treename.s) ;
indexes[lindex++] = aresid ;
if (ares[aresid].logger.want && ares[aresid].type == TYPE_CLASSIC) {
int logid = service_resolve_array_search(ares, areslen, ares[aresid].sa.s + ares[aresid].logger.name) ;
......@@ -148,7 +128,6 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
service_switch_tree(&ares[logid], info->base.s, info->treename.s) ;
indexes[lindex++] = logid ;
}
}
......@@ -158,7 +137,6 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info)
log_info("Enabled successfully service: ", ares[aresid].sa.s + ares[aresid].name) ;
}
service_resolve_array_write(info->base.s, ares, indexes, lindex) ;
service_resolve_array_free(ares, areslen) ;
graph_free_all(&graph) ;
......
......@@ -37,21 +37,41 @@
#define FAKELEN strlen(run)
#endif
static uint32_t compute_servicedir(resolve_wrapper_t_ref wres, ssexec_t *info)
static uint32_t compute_src_servicedir(resolve_wrapper_t_ref wres, ssexec_t *info)
{
log_flow() ;
resolve_service_t_ref res = (resolve_service_t *)wres->obj ;
char *name = res->sa.s + res->name ;
size_t namelen = strlen(name) ;
char dir[info->base.len + SS_SYSTEM_LEN + SS_RESOLVE_LEN + SS_SERVICE_LEN + 1 + namelen + 1] ;
char dir[info->base.len + SS_SYSTEM_LEN + SS_SERVICE_LEN + SS_SVC_LEN + 1 + namelen + 1] ;
auto_strings(dir, info->base.s, SS_SYSTEM, SS_RESOLVE, SS_SERVICE, "/", name) ;
auto_strings(dir, info->base.s, SS_SYSTEM, SS_SERVICE, SS_SVC, "/", name) ;
return resolve_add_string(wres, dir) ;
}
static uint32_t compute_live_servicedir(resolve_wrapper_t_ref wres, ssexec_t *info)
{
log_flow() ;
resolve_service_t_ref res = (resolve_service_t *)wres->obj ;
char *name = res->sa.s + res->name ;
size_t namelen = strlen(name) ;
char dir[info->live.len + SS_STATE_LEN + 1 + info->ownerlen + 1 + namelen + 1] ;
auto_strings(dir, info->live.s, SS_STATE + 1, "/", info->ownerstr, "/", name) ;
return resolve_add_string(wres, dir) ;
}
static uint32_t compute_status(resolve_wrapper_t_ref wres, ssexec_t *info)
{
log_flow() ;
resolve_service_t_ref res = (resolve_service_t *)wres->obj ;
char *name = res->sa.s + res->name ;
size_t namelen = strlen(name) ;
......@@ -72,9 +92,9 @@ static uint32_t compute_scan_dir(resolve_wrapper_t_ref wres, ssexec_t *info)
char *name = res->sa.s + res->name ;
size_t namelen = strlen(name) ;
char dir[info->live.len + SS_STATE_LEN + 1 + info->ownerlen + 1 + namelen + 1 + SS_SCANDIR_LEN + 1 + namelen + 1] ;
char dir[info->live.len + SS_SCANDIR_LEN + 1 + info->ownerlen + 1 + namelen + 1] ;
auto_strings(dir, info->live.s, SS_STATE + 1, "/", info->ownerstr, "/", name, "/", SS_SCANDIR, "/", name) ;
auto_strings(dir, info->live.s, SS_SCANDIR, "/", info->ownerstr, "/", name) ;
return resolve_add_string(wres, dir) ;
}
......@@ -102,8 +122,8 @@ static uint32_t compute_pipe_service(resolve_wrapper_t_ref wres, ssexec_t *info,
size_t servicelen = strlen(service) ;
size_t namelen = strlen(name) ;
char tmp[info->live.len + SS_STATE_LEN + 1 + info->ownerlen + 1 + servicelen + 1 + SS_SCANDIR_LEN + 1 + namelen + 1] ;
auto_strings(tmp, info->live.s, SS_STATE + 1, "/", info->ownerstr, "/", service, "/", SS_SCANDIR, "/", name) ;
char tmp[info->live.len + SS_SCANDIR_LEN + 1 + info->ownerlen + 1 + namelen + 1] ;
auto_strings(tmp, info->live.s, SS_SCANDIR, "/", info->ownerstr, "/", name) ;
return resolve_add_string(wres, tmp) ;
......@@ -149,7 +169,7 @@ static void compute_wrapper_scripts(resolve_service_t *res, resolve_service_addo
{
log_flow() ;
int build = !strcmp(res->sa.s + scripts->build, "custom") ? 1 : 0 ;
int build = !strcmp(res->sa.s + scripts->build, "custom") ? BUILD_CUSTOM : BUILD_AUTO ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ;
char *shebang = "#!" SS_EXECLINE_SHEBANGPREFIX "execlineb -" ;
size_t shebanglen = strlen(shebang) ;
......@@ -210,7 +230,7 @@ static void compute_wrapper_scripts_user(resolve_service_t *res, resolve_service
char *shebang = scripts->shebang ? res->sa.s + scripts->shebang : SS_EXECLINE_SHEBANGPREFIX "execlineb -P\n" ;
size_t shebanglen = strlen(shebang) ;
size_t scriptlen = strlen(res->sa.s + scripts->run_user) ;
int build = !strcmp(res->sa.s + scripts->build, "custom") ? 1 : 0 ;
int build = !strcmp(res->sa.s + scripts->build, "custom") ? BUILD_CUSTOM : BUILD_AUTO ;
size_t execlen = !build ? (res->environ.envdir ? (strlen(res->sa.s + res->environ.envdir) + 14 + SS_SYM_VERSION_LEN + 1) : 0) : 0 ;
char run[shebanglen + execlen + scriptlen + 4 + 1] ;
......@@ -250,7 +270,7 @@ static void compute_log_script(resolve_service_t *res)
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ;
int build = !strcmp(res->sa.s + res->logger.execute.run.build, "custom") ? 1 : 0 ;
int build = !strcmp(res->sa.s + res->logger.execute.run.build, "custom") ? BUILD_CUSTOM : BUILD_AUTO ;
char *pmax = 0 ;
char *pback = 0 ;
......@@ -391,8 +411,7 @@ static void compute_log(resolve_service_t *res, resolve_service_t *ares, unsigne
lres.path.home = resolve_add_string(wres, str + res->path.home) ;
lres.path.frontend = resolve_add_string(wres, str + res->path.frontend) ;
lres.path.servicedir = compute_servicedir(wres, info) ;
lres.path.status = compute_status(wres, info) ;
lres.path.servicedir = compute_src_servicedir(wres, info) ;
lres.dependencies.requiredby = resolve_add_string(wres, str + res->name) ;
lres.dependencies.nrequiredby = 1 ;
......@@ -406,6 +425,8 @@ static void compute_log(resolve_service_t *res, resolve_service_t *ares, unsigne
lres.execute.downsignal = res->logger.execute.downsignal ;
lres.live.livedir = resolve_add_string(wres, info->live.s) ;
lres.live.status = compute_status(wres, info) ;
lres.live.servicedir = compute_live_servicedir(wres, info) ;
lres.live.scandir = compute_scan_dir(wres, info) ;
lres.live.statedir = compute_state_dir(wres, info, SS_STATE + 1) ;
lres.live.eventdir = compute_state_dir(wres, info, SS_EVENTDIR + 1) ;
......@@ -451,12 +472,17 @@ void parse_compute_resolve(unsigned int idx, resolve_service_t *ares, unsigned i
auto_strings(name, res->sa.s + res->name) ;
res->path.status = compute_status(wres, info) ;
res->path.servicedir = compute_servicedir(wres, info) ;
res->path.servicedir = compute_src_servicedir(wres, info) ;
/* live */
res->live.livedir = resolve_add_string(wres, info->live.s) ;
/* status */
res->live.status = compute_status(wres, info) ;
/* servicedir */
res->live.servicedir = compute_live_servicedir(wres, info) ;
/* scandir */
/**
*
......
......@@ -36,6 +36,7 @@
#include <66/tree.h>
#include <66/graph.h>
#include <66/sanitize.h>
#include <66/symlink.h>
parse_mill_t MILL_GET_SECTION_NAME = \
{ \
......@@ -76,16 +77,16 @@ void parse_cleanup(resolve_service_t *res, char const *tmpdir, uint8_t force)
}
}
static void parse_copy_online(char const *dst, char const *src, resolve_service_t *res, uint8_t force)
static void parse_copy_to_source(char const *dst, char const *src, resolve_service_t *res, uint8_t force)
{
log_flow() ;
size_t pos = 0 ;
stralloc sa = STRALLOC_ZERO ;
size_t srclen = strlen(src) ;
size_t pos = 0, srclen = strlen(src) ;
if (!access(dst, F_OK)) {
stralloc sa = STRALLOC_ZERO ;
char const *exclude[6] = { SS_EVENTDIR + 1, SS_SUPERVISEDIR + 1, SS_SCANDIR, SS_STATE + 1, SS_RESOLVE + 1, 0 } ;
if (!sastr_dir_get_recursive(&sa, dst, exclude, S_IFDIR|S_IFREG, 1)) {
parse_cleanup(res, src, force) ;
......@@ -115,16 +116,15 @@ static void parse_copy_online(char const *dst, char const *src, resolve_service_
}
}
}
}
stralloc_free(&sa) ;
stralloc_free(&sa) ;
}
if (access(dst, F_OK) < 0) {
log_trace("create directory: ", dst) ;
if (!dir_create_parent(dst, 0755)) {
parse_cleanup(res, src, force) ;
stralloc_free(&sa) ;
log_dieusys(LOG_EXIT_SYS, "create directory: ", dst) ;
}
}
......@@ -132,9 +132,16 @@ static void parse_copy_online(char const *dst, char const *src, resolve_service_
log_trace("copy:", src, " to: ", dst) ;
if (!hiercopy(src, dst)) {
parse_cleanup(res, src, force) ;
stralloc_free(&sa) ;
log_dieusys(LOG_EXIT_SYS, "copy: ", src, " to: ", dst) ;
}
/** be paranoid after the use of hiercopy and be sure
* to have dst in 0755 mode. If not the log cannot be
* executed with other permissions than root */
if (chmod(dst, 0755)< 0) {
parse_cleanup(res, src, force) ;
log_dieusys(LOG_EXIT_SYS,"chmod: ", dst) ;
}
}
static void parse_write_state(resolve_service_t *res, char const *dst, uint8_t force)
......@@ -156,7 +163,7 @@ static void parse_write_state(resolve_service_t *res, char const *dst, uint8_t f
state_set_flag(&sta, STATE_FLAGS_ISEARLIER, res->earlier ? STATE_FLAGS_TRUE : STATE_FLAGS_FALSE) ;
state_set_flag(&sta, STATE_FLAGS_ISDOWNFILE, res->execute.down ? STATE_FLAGS_TRUE : STATE_FLAGS_FALSE) ;
if (!state_write_tmp(&sta, dst)) {
if (!state_write_remote(&sta, dst)) {
parse_cleanup(res, dst, force) ;
log_dieu(LOG_EXIT_SYS, "write state file of: ", res->sa.s + res->name) ;
}
......@@ -211,9 +218,9 @@ void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf)
parse_write_state(&ares[pos], sa.s, rforce) ;
service_resolve_write_tmp(&ares[pos], sa.s, rforce) ;
service_resolve_write_remote(&ares[pos], sa.s, rforce) ;
parse_copy_online(servicedir, sa.s, &ares[pos], rforce) ;
parse_copy_to_source(servicedir, sa.s, &ares[pos], rforce) ;
/** do not die here, just warn the user */
log_trace("remove temporary directory: ", sa.s) ;
......@@ -222,7 +229,15 @@ void parse_service(char const *sv, ssexec_t *info, uint8_t force, uint8_t conf)
tree_service_add(info->base.s, ares[pos].sa.s + ares[pos].treename, ares[pos].sa.s + ares[pos].name) ;
write_make_symlink(&ares[pos]) ;
if (!symlink_make(&ares[pos]))
log_dieusys(LOG_EXIT_SYS, "make service symlink") ;
/** symlink may exist already, be sure to point to the correct location
* may not be necessary as long as the service must pass through sanitize_init at
* startup */
if (!symlink_switch(&ares[pos], SYMLINK_SOURCE))
log_dieusys(LOG_EXIT_SYS, "sanitize_symlink") ;
log_info("Parsed successfully: ", ares[pos].sa.s + ares[pos].name, " at tree: ", ares[pos].sa.s + ares[pos].treename) ;
}
......
......@@ -13,6 +13,7 @@
*/
#include <stdint.h>
#include <stdlib.h>
#include <oblibs/log.h>
#include <oblibs/graph.h>
......
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