Nicolas Williams
2000-Jan-28 17:43 UTC
PATCH: 'source environment' param and % token subs for 'netbios name'
Attached please find unified diffs against Samba 2.0.6. I'm hoping that others will find it useful and that it may even find its way into Samba 2.0.7 This patch does two things: - Modifies the handling of the 'netbios name' parameter so that standard_sub_basic() is run on its value when the 'netbios name' parameter is processed. This has to be done this way because the netbios name is accessed via the global_myname variable throughout Samba and not via lp_netbios_name(). - Adds a new parameter called 'source environment' which takes a path or a pipe command whose last character is '|' and does just what you would expect: calls putenv() on each line read from the given file/pipe. Rationale: - Where I work we like to have a centrally distributed standard set of Samba configuration files with certain parameters' values being set from environment variables (netbios name is set with the -n command line argument to nmbd). So far we've used shell scripts to start/stop Samba with the necessary environment set. This approach makes it easier to prevent newbies from configuring Samba servers as PDCs. - The patch for netbios name handling will simplify these scripts and make Samba configuration more consistent. - Using %$() token substitution for configuring the most important paramters related to a server's identity simplifies sever configuration by allowing us to have a simple /etc/smb.conf.env file that all sysadmins can easily understand. [On our Sun w/ Veritas HA servers the configuration lives in /opt/VRTSfw/env/ha.env and the personality-specific variables are prefixed with 'PRIMARY_' or 'TAKEOVER_' and the Veritas startup script for Samba (which we wrote) takes care of the rest.] - The source environment patch will simplify our scripts trememndously. - Also, on our HA servers it's possible to have two Samba personalities running at the same time (one system fails and the other takes over -- we setup our home dir and applications file servers to do HA backup for each other -- we use the interfaces paramters to do this). Since Samba's config file path is statically compiled in we have to either really on the -s command-line option or %$() token substitution. We prefer the latter approach. With this patch we can have a simple /etc/smb.conf.env on our standalone Samba fileservers and a simple /etc/smb.conf.sh script on our HA servers (the latter will use a single environment variable to select a personality to configure). Nico This message contains confidential information and is intended only for the individual named. If you are not the named addressee you should not disseminate, distribute or copy this e-mail. Please notify the sender immediately by e-mail if you have received this e-mail by mistake and delete this e-mail from your system. E-mail transmission cannot be guaranteed to be secure or error-free as information could be intercepted, corrupted, lost, destroyed, arrive late or incomplete, or contain viruses. The sender therefore does not accept liability for any errors or omissions in the contents of this message which arise as a result of e-mail transmission. If verification is required please request a hard-copy version. This message is provided for informational purposes and should not be construed as a solicitation or offer to buy or sell any securities or related financial instruments.
Nicolas Williams
2000-Jan-28 17:54 UTC
PATCH: 'source environment' param and % token subs for 'netbios name'
Ooops, forgot to attach the diff... Sorry. Oh, and, my apologies for that nasty, silly disclaimer that the gateways here append to outgoing e-mails. Nico -DISCLAIMER: an automatically appended disclaimer may follow. By posting- -to a public e-mail mailing list I hereby grant permission to distribute- -and copy this message.- -------------- next part -------------- diff -u -r samba.2.0.6.orig/docs/manpages/smb.conf.5 samba-sourceenv/docs/manpages/smb.conf.5 --- samba.2.0.6.orig/docs/manpages/smb.conf.5 Fri Jan 28 12:03:10 2000 +++ samba-sourceenv/docs/manpages/smb.conf.5 Fri Jan 28 12:41:12 2000 @@ -829,6 +829,9 @@ \fBsocket options\fP .IP .IP o +\fBsource environment\fP +.IP +.IP o \fBssl\fP .IP .IP o @@ -5776,6 +5779,27 @@ \fBExample:\fP \f(CW socket options = IPTOS_LOWDELAY\fP .IP +.IP "\fBsource environment (G)\fP" +.IP +This parameter causes Samba to set environment variables as per the +content of the file named. +.IP +If the value of this parameter ends with a "|" character then Samba will +treat that value as a pipe command to open and will set the environment +variables from the oput of the pipe. +.IP +The contents of the file or the output of the pipe should be formatted +as the output of the standard Unix env(1) command. +.IP +\fBExample:\fP +\f(CW source environment = /etc/smb.conf.env\fP +.IP +\fBExample:\fP +\f(CW source environment = /etc/smb.conf.sh|\fP +.IP +\fBExample environment entry:\fP +\f(CWSAMBA_NETBIOS_NAME=myhostname\fP +.IP .IP "\fBssl (G)\fP" .IP This variable is part of SSL-enabled Samba\&. This is only available if diff -u -r samba.2.0.6.orig/source/param/loadparm.c samba-sourceenv/source/param/loadparm.c --- samba.2.0.6.orig/source/param/loadparm.c Fri Jan 28 12:03:16 2000 +++ samba-sourceenv/source/param/loadparm.c Fri Jan 28 11:57:59 2000 @@ -158,6 +158,7 @@ char *szAddUserScript; char *szDelUserScript; char *szWINSHook; + char *szSourceEnv; int max_log_size; int mangled_stack; int max_xmit; @@ -472,6 +473,8 @@ static BOOL handle_character_set(char *pszParmValue,char **ptr); static BOOL handle_coding_system(char *pszParmValue,char **ptr); static BOOL handle_client_code_page(char *pszParmValue,char **ptr); +static BOOL handle_source_env(char *pszParmValue,char **ptr); +static BOOL handle_netbios_name(char *pszParmValue,char **ptr); static void set_default_server_announce_type(void); @@ -538,7 +541,7 @@ {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC|FLAG_SHARE|FLAG_PRINT|FLAG_DOS_STRING}, {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_DOS_STRING}, {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC|FLAG_DOS_STRING}, - {"netbios name", P_UGSTRING,P_GLOBAL, global_myname, NULL, NULL, FLAG_BASIC|FLAG_DOS_STRING}, + {"netbios name", P_UGSTRING,P_GLOBAL, global_myname, handle_netbios_name, NULL, FLAG_BASIC|FLAG_DOS_STRING}, {"netbios aliases", P_STRING, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_DOS_STRING}, {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC|FLAG_DOS_STRING}, {"interfaces", P_STRING, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC}, @@ -820,6 +823,7 @@ {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE}, {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE}, {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE}, + {"source environment", P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env, NULL, 0}, {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL}, {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL}, {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE}, @@ -1171,6 +1175,7 @@ FN_GLOBAL_STRING(lp_printcapname,&Globals.szPrintcapname) FN_GLOBAL_STRING(lp_lockdir,&Globals.szLockDir) FN_GLOBAL_STRING(lp_rootdir,&Globals.szRootdir) +FN_GLOBAL_STRING(lp_sourceenv,&Globals.szSourceEnv) FN_GLOBAL_STRING(lp_defaultservice,&Globals.szDefaultService) FN_GLOBAL_STRING(lp_msg_command,&Globals.szMsgCommand) FN_GLOBAL_STRING(lp_hosts_equiv,&Globals.szHostsEquiv) @@ -1936,6 +1941,121 @@ add_char_string(pszParmValue); return(True); } + +/*************************************************************************** +run standard_sub_basic on netbios name... needed because global_myname +is not accessed through any lp_ macro. +***************************************************************************/ + +static BOOL handle_netbios_name(char *pszParmValue,char **ptr) +{ + pstring netbios_name; + + pstrcpy(netbios_name,pszParmValue); + + standard_sub_basic(netbios_name); + strupper(netbios_name); + string_set(ptr,netbios_name); + + pstrcpy(global_myname,netbios_name); + + DEBUG(4,("handle_netbios_name: set global_myname to: %s\n", global_myname)); + + return(True); +} + +/*************************************************************************** +do the work of sourcing in environment variable/value pairs +***************************************************************************/ +static BOOL source_env(FILE *fenv) +{ + pstring line; + char *varval; + int len; + char *p; + + while (!feof(fenv)) + { + if (fgets(line, sizeof(line), fenv) == NULL) + break; + + len=strlen(line); + if (line[len - 1] == '\n') + line[--len] = '\0'; + if ((varval=malloc(len+1)) == NULL) + { + DEBUG(0,("source_env: Not enough memory!\n")); + return(False); + } + + DEBUG(4,("source_env: Adding to environment: %s\n", line)); + strncpy(varval, line, len); + varval[len] = '\0'; + if (putenv(varval)) + return(False); + + p=strchr(line, (int) '='); + if (p == NULL) + { + DEBUG(4,("source_env: OOPS: %s\n", line)); + continue; + } + + *p='\0';p++; + DEBUG(4,("source_env: var %s = %s\n", line, getenv(line))); + } + + DEBUG(4,("source_env: returning successfully\n")); + return(True); +} + + +/*************************************************************************** +handle the source environment operation +***************************************************************************/ +static BOOL handle_source_env(char *pszParmValue,char **ptr) +{ + pstring fname; + FILE *env; + BOOL result; + int pexit; + + pstrcpy(fname,pszParmValue); + + standard_sub_basic(fname); + + string_set(ptr,pszParmValue); + + DEBUG(4, ("handle_source_env: checking env type\n")); + + if (fname[strlen(fname) - 1] == '|') + { + DEBUG(4, ("handle_source_env: source env from pipe\n")); + fname[strlen(fname) - 1]='\0'; + DEBUG(4, ("handle_source_env: opening pipe\n")); + if ((env=popen(fname, "r")) == NULL) + return(False); + DEBUG(4, ("handle_source_env: calling source_env()\n")); + result=source_env(env); + pexit=pclose(env); + } + else + { + DEBUG(4, ("handle_source_env: source env from file\n")); + /*add_to_file_list(fname);*/ + if (file_exist(fname,NULL)) + { + DEBUG(4, ("handle_source_env: opening env file %s\n", fname)); + if ((env=fopen(fname, "r")) == NULL) + return(False); + DEBUG(4, ("handle_source_env: calling source_env()\n")); + result=source_env(env); + fclose(env); + } + } + return(result); +} + /*************************************************************************** handle the include operation -------------- next part -------------- This message contains confidential information and is intended only for the individual named. If you are not the named addressee you should not disseminate, distribute or copy this e-mail. Please notify the sender immediately by e-mail if you have received this e-mail by mistake and delete this e-mail from your system. E-mail transmission cannot be guaranteed to be secure or error-free as information could be intercepted, corrupted, lost, destroyed, arrive late or incomplete, or contain viruses. The sender therefore does not accept liability for any errors or omissions in the contents of this message which arise as a result of e-mail transmission. If verification is required please request a hard-copy version. This message is provided for informational purposes and should not be construed as a solicitation or offer to buy or sell any securities or related financial instruments.