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.