tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pkgsrc RC scripts



On Mon, 5 Oct 2009, Steven Drake wrote:

> On Sat, 3 Oct 2009, Joerg Sonnenberger wrote:
> 
> > (1) Install pkgsrc RC scripts by default into /etc/rc.pkg.d, not
> > /etc/rc.d and adjust the default value for rc_directories accordingly.
> > This keeps the logical separation between base and pkgsrc RC scripts
> > and still allows /usr (or /usr/pkg) to be on a separate filesystem.
> 
> Sounds like your talking about changeing the default value 
> of RCD_SCRIPTS_DIR. 
> 
> Personaly I would like config variables that are used by the 
> +INSTALL +DEINSTALL script set in pkg_install.conf and passed to the scripts 
> when thay get run. I know this would mean writing extra code in pkg_install 
> but it would mean that the +INSTALL +DEINSTALL behaviour is defined when 
> a binary package is installed not built.  
> 

So heres the code. The first patch to pkg_install passes anything that 
looks like a variable in pkg_install.conf to the environment of any 
sub processes.  

I've noted that some of the script templates in pkgsrc/mk/pkginstall are 
already setup to use varialbles passed to them, i.e.:
PKG_CREATE_USERGROUP, PKG_CONFIG, PKG_CONFIG_PERMS, PKG_RCD_SCRIPTS,
PKG_UPDATE_FONTS_DB, FONTS_VERBOSE, INFO_FILES_VERBOSE, PKG_REGISTER_SHELLS.

The second patch to files in pkgsrc/mk/ adds RCD_SCRIPTS_DIR and RC_SUBR_DIR to
the variables the +FILES script uses as well as code to modify the rcd scripts
when they are installed to RCD_SCRIPTS_DIR.

The RC_SUBR_DIR variable is brand new and gives the location of the 
rc.subr and rc.conf files.

-- 
Steven
I'm such a prick!  --- The Bastard Operator from Hell
--- mk/pkginstall/bsd.pkginstall.mk     2008/03/04 06:51:41     1.1.1.1
+++ mk/pkginstall/bsd.pkginstall.mk     2009/10/13 10:15:21
@@ -952,10 +952,13 @@ PKG_CONFIG_PERMS?=        NO
 PKG_RCD_SCRIPTS?=      NO
 PKG_REGISTER_SHELLS?=  YES
 PKG_UPDATE_FONTS_DB?=  YES
+RC_SUBR_DIR?=          /etc
 FILES_SUBST+=          PKG_CREATE_USERGROUP=${PKG_CREATE_USERGROUP:Q}
 FILES_SUBST+=          PKG_CONFIG=${PKG_CONFIG:Q}
 FILES_SUBST+=          PKG_CONFIG_PERMS=${PKG_CONFIG_PERMS:Q}
 FILES_SUBST+=          PKG_RCD_SCRIPTS=${PKG_RCD_SCRIPTS:Q}
+FILES_SUBST+=          RCD_SCRIPTS_DIR=${RCD_SCRIPTS_DIR:Q}
+FILES_SUBST+=          RC_SUBR_DIR=${RC_SUBR_DIR:Q}
 FILES_SUBST+=          PKG_REGISTER_SHELLS=${PKG_REGISTER_SHELLS:Q}
 FILES_SUBST+=          PKG_UPDATE_FONTS_DB=${PKG_UPDATE_FONTS_DB:Q}
 
@@ -1024,6 +1027,9 @@ FILES_SUBST+=             USERADD=${USERADD:Q}
 FILES_SUBST+=          XARGS=${XARGS:Q}
 
 FILES_SUBST_SED=       ${FILES_SUBST:S/=/@!/:S/$/!g/:S/^/ -e s!@/}
+FILES_SUBST_SED+=     -e s!/etc/rc\.d!${RCD_SCRIPTS_DIR:Q}!
+FILES_SUBST_SED+=     -e s!/etc/rc\.subr!${RC_SUBR_DIR:Q}/rc.subr!
+FILES_SUBST_SED+=     -e s!/etc/rc\.conf!${RC_SUBR_DIR:Q}/rc.conf!
 
 PKG_REFCOUNT_DBDIR?=   ${PKG_DBDIR}.refcount
 
--- mk/pkginstall/files 2008/09/25 14:01:46     1.1.1.1
+++ mk/pkginstall/files 2009/10/13 10:14:53
@@ -98,6 +98,11 @@ case "${PKG_RCD_SCRIPTS:-@PKG_RCD_SCRIPT
        ;;
 esac
 
+: ${RCD_SCRIPTS_DIR:=@RCD_SCRIPTS_DIR@}
+: ${RC_SUBR_DIR:=@RC_SUBR_DIR@}
+RC_SCRIPT_SUBST=" s!@RCD_SCRIPTS_DIR@!${RCD_SCRIPTS_DIR}!g; 
s!@RC_SUBR_DIR@/rc\.subr!${RC_SUBR_DIR}/rc\.subr!g; 
s!@RC_SUBR_DIR@/rc\.conf!${RC_SUBR_DIR}/rc\.conf!g;"
+
+
 case $ACTION in
 VIEW-REMOVE)
        DEPOTDIR="$2"
@@ -123,6 +128,11 @@ ADD)
                "")     continue ;;
                [!/]*)  file="${PKG_PREFIX}/$file" ;;
                esac
+               case "$f_flags" in
+               *r*)
+                       file="${RCD_SCRIPTS_DIR}/${file##*/}"
+                       ;;
+               esac
                case $f_flags in
                *c*)    ;;
                *)      continue ;;
@@ -160,8 +170,16 @@ ADD)
                                if ${TEST} -f "$file"; then
                                        ${ECHO} "${PKGNAME}: $file already 
exists"
                                elif ${TEST} -f "$f_eg" -o -c "$f_eg"; then
-                                       ${ECHO} "${PKGNAME}: copying $f_eg to 
$file"
-                                       ${CP} $f_eg $file
+                                       case "$f_flags" in
+                                       *r*)
+                                               ${ECHO} "${PKGNAME}: Modifing 
$f_eg and copying to $file"
+                                               ${SED} -e "${RC_SCRIPT_SUBST}" 
$f_eg >$file
+                                               ;;
+                                       *)
+                                               ${ECHO} "${PKGNAME}: copying 
$f_eg to $file"
+                                               ${CP} $f_eg $file
+                                               ;;
+                                       esac
                                        case $f_user in
                                        "")     ;;
                                        *)      ${CHOWN} $f_user $file ;;
@@ -188,6 +206,11 @@ REMOVE)
                "")     continue ;;
                [!/]*)  file="${PKG_PREFIX}/$file" ;;
                esac
+               case "$f_flags" in
+               *r*)
+                       file="${RCD_SCRIPTS_DIR}/${file##*/}"
+                       ;;
+               esac
                case $f_flags in
                *c*)    ;;
                *)      continue ;;
@@ -209,13 +232,24 @@ REMOVE)
                        "")
                                if ${TEST} -f "$preexist"; then
                                        :
-                               elif ${TEST} -f "$file" -a \( -f "$f_eg" -o -c 
"$f_eg" \) && \
-                                    ${CMP} -s "$file" "$f_eg"; then
-                                       case 
"$f_flags:$_PKG_CONFIG:$_PKG_RCD_SCRIPTS" in
-                                       
*f*:*:*|[!r]:yes:*|[!r][!r]:yes:*|[!r][!r][!r]:yes:*|*r*:yes:yes)
-                                               ${RM} -f "$file"
+                               elif ${TEST} -f "$file" -a \( -f "$f_eg" -o -c 
"$f_eg" \); then
+                                       case "$f_flags" in
+                                       *r*)
+                                               ${SED} -e ${RC_SCRIPT_SUBST} 
"$f_eg" | ${CMP} -s "-" "$f_eg"
+                                               ret=$?
+                                               ;;
+                                       *)
+                                               ${CMP} -s "$file" "$f_eg" 
+                                               ret=$?
                                                ;;
                                        esac
+                                       if ${TEST} "$ret" = "0" ;then
+                                               case 
"$f_flags:$_PKG_CONFIG:$_PKG_RCD_SCRIPTS" in
+                                               
*f*:*:*|[!r]:yes:*|[!r][!r]:yes:*|[!r][!r][!r]:yes:*|*r*:yes:yes)
+                                                       ${RM} -f "$file"
+                                                       ;;
+                                               esac
+                                       fi
                                fi
                                ${RM} -f $perms $preexist $token $token.tmp.*
                                ${RMDIR} -p $shadow_dir 2>/dev/null || ${TRUE}
--- pkgtools/pkg_install/files/lib/parse-config.c.orig  2009-10-14 
00:45:23.000000000 +1300
+++ pkgtools/pkg_install/files/lib/parse-config.c
@@ -107,7 +107,7 @@ parse_pkg_install_conf(void)
 {
        struct config_variable *var;
        FILE *fp;
-       char *line, *value;
+       char *line, *value, *buf;
        size_t len, var_len, i;
 
        fp = fopen(config_file, "r");
@@ -119,24 +119,49 @@ parse_pkg_install_conf(void)
 
        while ((line = fgetln(fp, &len)) != (char *) NULL) {
                if (line[len - 1] == '\n')
-                       --len;
+                       line[--len] = '\0';
+               else {
+                       if ((buf = (char *)malloc(len + 1)) == NULL)
+                               err(1, NULL);
+                       memcpy(buf, line, len);
+                       buf[len] = '\0';
+                       line = buf;
+               }
+
+               value=strchr(line, '=');
+               if (value == NULL || *value != '=')
+                       goto freebuf;
+
+               *value='\0';
+               value++;
+
+#define ENV_ACCEPT "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+               if (strspn(line, ENV_ACCEPT) != strlen(line))
+                       goto freebuf;
+
+               /* handle "VAR= value" lines! */
+               if (*value == ' ')
+                       value++;
+
+               setenv(line, value, 1);
+
                for (i = 0; (var = &config_variables[i])->name != NULL; ++i) {
-                       var_len = strlen(var->name);
-                       if (strncmp(var->name, line, var_len) != 0)
-                               continue;
-                       if (line[var_len] != '=')
+                       if (strcmp(var->name, line) != 0)
                                continue;
-                       line += var_len + 1;
-                       len -= var_len + 1;
                        if (config_tmp_variables[i])
-                               value = xasprintf("%s\n%.*s",
-                                   config_tmp_variables[i], (int)len, line);
+                               value = xasprintf("%s\n%s",
+                                   config_tmp_variables[i], value);
                        else
-                               value = xasprintf("%.*s", (int)len, line);
+                               value = xasprintf("%s", value);
                        free(config_tmp_variables[i]);
                        config_tmp_variables[i] = value;
                        break;
                }
+freebuf:
+               if (buf != NULL) {
+                       free(buf);
+                       buf = NULL;
+               }
        }
 
        for (i = 0; (var = &config_variables[i])->name != NULL; ++i) {


Home | Main Index | Thread Index | Old Index