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

unexport variable using '!' at the begin of a value intead of the begin of the key

parent 416b891d
No related branches found
No related tags found
No related merge requests found
...@@ -182,15 +182,6 @@ install-man: ...@@ -182,15 +182,6 @@ install-man:
install -m755 -d $(DESTDIR)$(mandir)/man$$i; \ install -m755 -d $(DESTDIR)$(mandir)/man$$i; \
install -m644 man/*.$$i $(DESTDIR)$(mandir)/man$$i/ ; \ install -m644 man/*.$$i $(DESTDIR)$(mandir)/man$$i/ ; \
done done
# %.1: %.1.scd
# scdoc < $@.scd > $@
# %.5: %.5.scd
# scdoc < $@.scd > $@
# %.8: %.8.scd
# scdoc < $@.scd > $@
.PHONY: it all clean distclean tgz strip install install-dynlib install-bin install-lib install-include man install-man .PHONY: it all clean distclean tgz strip install install-dynlib install-bin install-lib install-include man install-man
......
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
<tt><b>-L</b></tt> : list defined environment variables for <em>service</em>. <tt><b>-L</b></tt> : list defined environment variables for <em>service</em>.
</li> </li>
<li> <li>
<tt><b>-r&nbsp;<em>key=value</em></b></tt> : override an existing <em>key=value</em> pair with the given one. The <em>key=value</em> needs to be double-quoted in case of multiple arguments. Backslash '\' should be used to properly parse a double-quoted element. <tt><b>-r&nbsp;<em>key=value</em></b></tt> : override an existing <em>key=value</em> pair with the given one. The <em>key=value</em> needs to be double-quoted or single quoted in case of multiple arguments. In case of double quote backslash '\' should be used to properly parse a double-quoted element.
</li> </li>
</ul> </ul>
...@@ -81,24 +81,17 @@ ...@@ -81,24 +81,17 @@
<ul> <ul>
<pre>66-env -L ntpd</pre> <pre>66-env -L ntpd</pre>
<pre>66-env -r CMD_ARGS=-d </pre> <pre>66-env -r CMD_ARGS=-d </pre>
<pre>66-env -r "CMD_ARGS=-c /etc/nginx/nginx.conf -g \"daemon off;\""</pre> <pre>66-env -r CMD_ARGS='-c /etc/nginx/nginx.conf -g "daemon off;"'</pre>
</ul> </ul>
<h2>Notes</h2> <h2>Notes</h2>
<p> <p>
Keys which are preceded by an exclamation mark "!" in the configuration <em>service</em> file can be accessed as if they had none. For example, a <tt>key=value</tt> corresponding to: Unexport a <em>key</em> from the environment can be handled by using an exclamation mark "!" at the begin of the <em>value</em>. For example, :
</p> </p>
<ul> <ul>
<pre>!CMD_ARGS=--print-pid=4</pre> <pre>66-env -r CMD_ARGS='!-c /etc/nginx/nginx.conf -g "daemon off;"'</pre>
</ul> </ul>
<p>can be replaced by the command:</p>
<ul>
<pre>66-env -r CMD_ARGS=--print-pid=3</pre>
</ul>
<p>
In this case the operator will be kept even if it was not included in the overwriting command.
</p>
</ul> </ul>
</body> </body>
</html> </html>
...@@ -24,11 +24,11 @@ ...@@ -24,11 +24,11 @@
<h2>Interface</h2> <h2>Interface</h2>
<pre> <pre>
execl-envfile [ -h ] [ -f <em>file</em> ] [ -l ] <em>conf</em> <em>prog</em> execl-envfile [ -h ] [ -f <em>file</em> ] [ -l ] <em>src</em> <em>prog</em>
</pre> </pre>
<p> <p>
This tool expects to find a regular file or a directory in <em>conf</em> containing one or multiple <tt>key=value</tt> pair(s). It will parse that file, import the <tt>key=value</tt> and then exec the given <em>prog</em> with the modified environment. In case of directory for each file found it apply the same process. This tool expects to find a regular file or a directory in <em>src</em> containing one or multiple <tt>key=value</tt> pair(s). It will parse that file, import the <tt>key=value</tt> and then exec the given <em>prog</em> with the modified environment. In case of directory for each file found it apply the same process.
</p> </p>
<ul> <ul>
...@@ -65,18 +65,18 @@ ...@@ -65,18 +65,18 @@
</li> </li>
<li> <li>
<tt><b>-f <em>file</em></b></tt> : only parse <em>file</em> found in <em>conf</em>. <b>deprecated option</b> <tt><b>-f <em>file</em></b></tt> : only parse <em>file</em> found in <em>src</em>. <b>deprecated option</b>
</li> </li>
<li> <li>
<tt><b>-l</b></tt> : loose; do nothing and execute <em>prog</em> directly if <em>conf</em> does not contain any regular file(s) or <em>conf</em> does not exist. <tt><b>-l</b></tt> : loose; do nothing and execute <em>prog</em> directly if <em>src</em> does not contain any regular file(s) or <em>src</em> does not exist.
</li> </li>
</ul> </ul>
<h2>File syntax</h2> <h2>File syntax</h2>
<p> <p>
<em>conf</em> is a text file or a directory containing lines of pairs with the syntax being:<br><tt>key = value</tt><br>Whitespace is permitted before and after <em>key</em>, and before or after <em>value</em>. Quoting is also possible. <em>src</em> is a text file or a directory containing lines of pairs with the syntax being:<br><tt>key = value</tt><br>Whitespace is permitted before and after <em>key</em>, and before or after <em>value</em>. Quoting is also possible.
</p> </p>
<p> <p>
...@@ -88,7 +88,7 @@ ...@@ -88,7 +88,7 @@
</p> </p>
<p> <p>
If <tt>key</tt> begin by a <tt>'!'</tt> character: <tt>!key=value</tt> the <tt>key</tt> will be removed from the environment after the substitution. If <tt>val</tt> begin by a <tt>'!'</tt> character: <tt>key=!value</tt> the <tt>key</tt> will be removed from the environment after the substitution.
</p> </p>
<h2>Example of use</h2> <h2>Example of use</h2>
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
<h2>Limits</h2> <h2>Limits</h2>
<p> <p>
<em>conf</em> can not exceed more than 100 files. Each file can not contain more than 4095 bytes or more than 50 <em>key=value</em> pairs. <em>src</em> can not exceed more than 100 files. Each file can not contain more than 4095 bytes or more than 50 <em>key=value</em> pairs.
</p> </p>
</body> </body>
......
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
# NAME # NAME
66-env - List or replace an environment variables of a service 66-env - List or replaces an environment variables of a service depending
on the options passed.
# SYNOPSIS # SYNOPSIS
...@@ -39,7 +40,8 @@ It display the contain of the file or replace a _key=value_ pair if requested. ...@@ -39,7 +40,8 @@ It display the contain of the file or replace a _key=value_ pair if requested.
*-r* _key=value_ *-r* _key=value_
Override an existing _key=value_ pair with the given one. The Override an existing _key=value_ pair with the given one. The
_key=value_ needs to be double-quoted in case of multiple arguments. _key=value_ needs to be double-quoted in case of multiple arguments.
Backslash *\\* should be used to properly parse a double-quoted element. In case of double quote backslash *\\* should be used to properly
parse a double-quoted element.
# EXIT STATUS # EXIT STATUS
...@@ -52,20 +54,12 @@ It display the contain of the file or replace a _key=value_ pair if requested. ...@@ -52,20 +54,12 @@ It display the contain of the file or replace a _key=value_ pair if requested.
``` ```
66-env -L ntpd 66-env -L ntpd
66-env -r CMD_ARGS=-d 66-env -r CMD_ARGS=-d
66-env -r "CMD_ARGS=-c /etc/nginx/nginx.conf -g \"daemon off;\"" 66-env -r CMD_ARGS='-c /etc/nginx/nginx.conf -g "daemon off;"'
``` ```
# NOTES # NOTES
Keys which are preceded by an exclamation mark *!* in the configuration Unexport a _key_ from the environment can be handled by using an exclamation
_service_ file can be accessed as if they had none. For example, a _key=value_ mark *!* at the begin of the _value_. For example:
corresponding to:
!CMD_ARGS=--print-pid=4 66-env -r CMD_ARGS='!-c /etc/nginx/nginx.conf -g "daemon off;"'
can be replaced by the command:
66-env -r CMD_ARGS=--print-pid=3
In this case the operator will be kept even if it was not included in the
overwriting command.
...@@ -6,17 +6,17 @@ execl-envfile - A blend of *s6-envdir* and *importas* program. ...@@ -6,17 +6,17 @@ execl-envfile - A blend of *s6-envdir* and *importas* program.
# SYNOPSIS # SYNOPSIS
execl-envfile [ *-h* ] [ *-l* ] _dir_ _prog_ execl-envfile [ *-h* ] [ *-l* ] _src_ _prog_
# DESCRIPTION # DESCRIPTION
It reads files containing variable assignments on the given directory, adds the It reads files containing variable assignments on the given file/directory, adds the
variables to the environment, then executes a program. variables to the environment, then executes a program.
This tool expects to find one or more regular file(s) in _dir_ containing This tool expects to find a regular file or a directory in _src_ containing
one or multiple _key=value_ pair. For each file found: it will parse the file, one or multiple _key=value_ pair(s). It will parse that file,
import the _key=value_ and then exec the given _prog_ with the modified import the _key=value_ and then exec the given _prog_ with the modified
environment. environment. In case of directory for each file found it apply the same process.
- It opens and reads the file. - It opens and reads the file.
- It parses the file. - It parses the file.
...@@ -31,18 +31,18 @@ environment. ...@@ -31,18 +31,18 @@ environment.
Prints this help. Prints this help.
*-f* _file_ *-f* _file_
Only parses the _file_ found in _dir_. Only parses the _file_ found in _src_. *deprecated option*
*-l* *-l*
Loose. Do nothing and executes _prog_ directly if _dir_ does not contain Loose. Do nothing and executes _prog_ directly if _src_ does not contain
any regular file(s) or _dir_ doesn't exist. any regular file(s) or _src_ doesn't exist.
# EXAMPLE # EXAMPLE
``` ```
#!/usr/bin/execlineb -P #!/usr/bin/execlineb -P
fdmove -c 2 1 fdmove -c 2 1
execl-envfile -f ntpd /etc/66/conf execl-envfile /etc/66/conf/ntpd
foreground { mkdir -p -m 0755 ${RUNDIR} } foreground { mkdir -p -m 0755 ${RUNDIR} }
execl-cmdline -s { ntpd ${CMD_ARGS} } execl-cmdline -s { ntpd ${CMD_ARGS} }
``` ```
......
...@@ -23,8 +23,8 @@ key = value # comment not valid ...@@ -23,8 +23,8 @@ key = value # comment not valid
``` ```
Empty _value_ is *not* permitted. Empty _value_ is *not* permitted.
If _key_ begin by a *!* character: If _val_ begin by a *!* character:
*!*_key=value_ _key=*!*value_
the _key_ will be removed from the environment after the substitution. the _key_ will be removed from the environment after the substitution.
# LIMITS # LIMITS
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <66/parser.h> #include <66/parser.h>
#include <66/environ.h> #include <66/environ.h>
#include <66/constants.h>
static stralloc SAENV = STRALLOC_ZERO ; static stralloc SAENV = STRALLOC_ZERO ;
static genalloc GAENV = GENALLOC_ZERO ; //diuint32, pos in senv static genalloc GAENV = GENALLOC_ZERO ; //diuint32, pos in senv
...@@ -193,7 +194,7 @@ int main (int argc, char const *const *argv, char const *const *envp) ...@@ -193,7 +194,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
stralloc_free(&src) ; stralloc_free(&src) ;
/** be able to freed the stralloc before existing */ /** be able to freed the stralloc before existing */
char tmp[modifs.len] ; char tmp[modifs.len+1] ;
memcpy(tmp,modifs.s,modifs.len) ; memcpy(tmp,modifs.s,modifs.len) ;
tmp[modifs.len] = 0 ; tmp[modifs.len] = 0 ;
...@@ -207,9 +208,9 @@ int main (int argc, char const *const *argv, char const *const *envp) ...@@ -207,9 +208,9 @@ int main (int argc, char const *const *argv, char const *const *envp)
unexport = 0 ; unexport = 0 ;
int key = genalloc_s(diuint32,&GAENV)[i].left ; int key = genalloc_s(diuint32,&GAENV)[i].left ;
int val = genalloc_s(diuint32,&GAENV)[i].right ; int val = genalloc_s(diuint32,&GAENV)[i].right ;
if ((SAENV.s+key)[0] == '!') if ((SAENV.s+val)[0] == SS_VAR_UNEXPORT)
{ {
key++ ; val++ ;
unexport = 1 ; unexport = 1 ;
} }
if(!loop_stra(&info.vars,SAENV.s + key)) if(!loop_stra(&info.vars,SAENV.s + key))
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#define SS_NOTIFICATION_LEN (sizeof SS_NOTIFICATION - 1) #define SS_NOTIFICATION_LEN (sizeof SS_NOTIFICATION - 1)
#define SS_MAXDEATHTALLY "max-death-tally" #define SS_MAXDEATHTALLY "max-death-tally"
#define SS_MAXDEATHTALLY_LEN (sizeof SS_MAXDEATHTALLY - 1) #define SS_MAXDEATHTALLY_LEN (sizeof SS_MAXDEATHTALLY - 1)
/**tree dir*/ /**tree dir*/
#define SS_RULES "/rules" #define SS_RULES "/rules"
#define SS_RULES_LEN (sizeof SS_RULES - 1) #define SS_RULES_LEN (sizeof SS_RULES - 1)
...@@ -85,6 +86,7 @@ ...@@ -85,6 +86,7 @@
#define SS_STATE "/state" #define SS_STATE "/state"
#define SS_STATE_LEN (sizeof SS_STATE - 1) #define SS_STATE_LEN (sizeof SS_STATE - 1)
#define SS_VAR_UNEXPORT '!'
/** boot */ /** boot */
#define SS_BOOT_CONF "init.conf" #define SS_BOOT_CONF "init.conf"
#define SS_BOOT_CONF_LEN (sizeof SS_BOOT_CONF - 1) #define SS_BOOT_CONF_LEN (sizeof SS_BOOT_CONF - 1)
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <66/parser.h> #include <66/parser.h>
#include <66/environ.h> #include <66/environ.h>
#include <66/utils.h> #include <66/utils.h>
#include <66/constants.h>
#include <execline/execline.h> #include <execline/execline.h>
/* @Return 1 on success /* @Return 1 on success
...@@ -175,10 +176,16 @@ int env_parsenclean(stralloc *modifs,stralloc *src) ...@@ -175,10 +176,16 @@ int env_parsenclean(stralloc *modifs,stralloc *src)
if (!parse_env(&tmp,&pos)) goto err ; if (!parse_env(&tmp,&pos)) goto err ;
if (!env_clean(&tmp)) goto err ; if (!env_clean(&tmp)) goto err ;
tmp.len--;//remove '0' tmp.len--;//remove '0'
int u = 0 ; int r = get_len_until(tmp.s,'=') ;
if (tmp.s[0] == '!') u++ ; if (tmp.s[r+1] == SS_VAR_UNEXPORT){
if (!stralloc_catb(modifs,tmp.s + u ,(tmp.len - u) + 1)) goto err ;// || r++ ;
// !stralloc_0(modifs)) goto err ; char t[tmp.len+1] ;
memcpy(t,tmp.s,r) ;
memcpy(t+r,tmp.s+r+1,tmp.len-(r+1)) ;
tmp.len--;
t[tmp.len] = 0 ;
if (!stralloc_catb(modifs,t,tmp.len + 1)) goto err ;
}else if (!stralloc_catb(modifs,tmp.s,tmp.len + 1)) goto err ;// ||
} }
genalloc_deepfree(stralist,&gatmp,stra_free) ; genalloc_deepfree(stralist,&gatmp,stra_free) ;
...@@ -225,13 +232,13 @@ int env_substitute(char const *key, char const *val,exlsn_t *info, char const *c ...@@ -225,13 +232,13 @@ int env_substitute(char const *key, char const *val,exlsn_t *info, char const *c
blah.var = info->vars.len ; blah.var = info->vars.len ;
blah.value = info->values.len ; blah.value = info->values.len ;
if (el_vardupl(key, info->vars.s, info->vars.len)) { strerr_warnw1x("bad substitution key") ; goto err ; } if (el_vardupl(key, info->vars.s, info->vars.len)) { strerr_warnwu1x("el_vardupl") ; goto err ; }
if (!stralloc_catb(&info->vars,key, strlen(key) + 1)) { strerr_warnw1x("env_substitute") ; goto err ; } if (!stralloc_catb(&info->vars,key, strlen(key) + 1)) { strerr_warnwu1x("append stralloc of env_substitute") ; goto err ; }
x = env_get2(envp, key) ; x = env_get2(envp, key) ;
if (!x) if (!x)
{ {
if (insist) { strerr_warnw2x(val,": is not set") ; goto err ; } if (insist) { strerr_warnw2x(key,": is not set") ; goto err ; }
x = defaultval ; x = defaultval ;
} }
else if (unexport) else if (unexport)
......
...@@ -83,9 +83,11 @@ int ssexec_env(int argc, char const *const *argv,char const *const *envp,ssexec_ ...@@ -83,9 +83,11 @@ int ssexec_env(int argc, char const *const *argv,char const *const *envp,ssexec_
else if (replace) else if (replace)
{ {
stralloc newlist = STRALLOC_ZERO ; stralloc newlist = STRALLOC_ZERO ;
genalloc mga = GENALLOC_ZERO ; // key=value from cmdline
genalloc mga = GENALLOC_ZERO ;// diuint32
stralloc msa = STRALLOC_ZERO ; stralloc msa = STRALLOC_ZERO ;
genalloc ga = GENALLOC_ZERO ; // key=value from file
genalloc ga = GENALLOC_ZERO ;// diuint32
stralloc sa = STRALLOC_ZERO ; stralloc sa = STRALLOC_ZERO ;
char *key, *val, *mkey, *mval ; char *key, *val, *mkey, *mval ;
if (!env_clean(&var)) strerr_diefu1x(111,"clean key=value pair") ; if (!env_clean(&var)) strerr_diefu1x(111,"clean key=value pair") ;
...@@ -100,7 +102,7 @@ int ssexec_env(int argc, char const *const *argv,char const *const *envp,ssexec_ ...@@ -100,7 +102,7 @@ int ssexec_env(int argc, char const *const *argv,char const *const *envp,ssexec_
if (!stralloc_cats(&newlist,key) || if (!stralloc_cats(&newlist,key) ||
!stralloc_cats(&newlist,"=")) retstralloc(111,"replace") ; !stralloc_cats(&newlist,"=")) retstralloc(111,"replace") ;
if (obstr_equal((key[0] == '!') ? key+1:key,mkey)) { if (obstr_equal(key,mkey)) {
if (!stralloc_cats(&newlist,mval)) retstralloc(111,"replace") ; if (!stralloc_cats(&newlist,mval)) retstralloc(111,"replace") ;
}else if (!stralloc_cats(&newlist,val)) retstralloc(111,"replace") ; }else if (!stralloc_cats(&newlist,val)) retstralloc(111,"replace") ;
if (!stralloc_cats(&newlist,"\n")) retstralloc(111,"replace") ; if (!stralloc_cats(&newlist,"\n")) retstralloc(111,"replace") ;
......
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