The branch, master has been updated via ee50bdd s4-loadparm: fix the FLAG_DEFAULT settings on specially handled parameters via 21fe96e s4-provision: include command line provision options in the generated smb.conf via 60cb372 s4-devel: useful script for testing join with empty smb.conf via e908c26 s4-test: use IPC$ instead of ADMIN$ for srvsvc NetShareGetInfo test via 81c9b98 s4-join: use the command line loadparm in provision during a join via 1d7d09a s4-loadparm: fixed dumping of non-default parms with testparm via ed8ea4e s4-server: move the creation of the IPC$ share into ntvfs from 0afb299 Fix bug #7791 - gvfsd-smb (Gnome vfs) fails to copy files from a SMB share using SMB signing.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit ee50bdd42f01bfcebb2e75a923a01fa1d18e5694 Author: Andrew Tridgell <tri...@samba.org> Date: Thu Nov 11 13:56:44 2010 +1100 s4-loadparm: fix the FLAG_DEFAULT settings on specially handled parameters parameters with special handlers also need to clear the FLAG_DEFAULT flag when set Pair-Programmed-With: Andrew Bartlett <abart...@samba.org> Autobuild-User: Andrew Tridgell <tri...@samba.org> Autobuild-Date: Thu Nov 11 03:39:23 UTC 2010 on sn-devel-104 commit 21fe96e8f9e1f3f3d047ed893633228c2aef881c Author: Andrew Tridgell <tri...@samba.org> Date: Thu Nov 11 13:09:29 2010 +1100 s4-provision: include command line provision options in the generated smb.conf this saves the smb.conf using lp.dump_globals() to ensure that any command line options (for example directory overrides) are saved in the generated smb.conf Pair-Programmed-With: Andrew Bartlett <abart...@samba.org> commit 60cb372bd6c874af1050ff3d723bacee8c9cbf8e Author: Andrew Tridgell <tri...@samba.org> Date: Thu Nov 11 11:18:48 2010 +1100 s4-devel: useful script for testing join with empty smb.conf this sets up all the needed --options for a join with a prefix other than the one compiled in commit e908c263916c1e18468054d8a0416e5a1425c25d Author: Andrew Tridgell <tri...@samba.org> Date: Thu Nov 11 11:16:23 2010 +1100 s4-test: use IPC$ instead of ADMIN$ for srvsvc NetShareGetInfo test IPC$ is guaranteed to exist on servers that do RPC, whereas ADMIN$ isn't Pair-Programmed-With: Andrew Bartlett <abart...@samba.org> commit 81c9b98ecd6b0b4ec412ea7a0963002dc17f4f66 Author: Andrew Tridgell <tri...@samba.org> Date: Thu Nov 11 10:45:13 2010 +1100 s4-join: use the command line loadparm in provision during a join this allows a join with an empty smb.conf to override locations of files correctly with --option Pair-Programmed-With: Andrew Bartlett <abart...@samba.org> commit 1d7d09a8f72a9f7f888538b7f7c63969407e9c2d Author: Andrew Tridgell <tri...@samba.org> Date: Thu Nov 11 10:39:19 2010 +1100 s4-loadparm: fixed dumping of non-default parms with testparm when using testparm without -v we should only dump non-default parameters. This patch fixes up the handling of the FLAG_DEFAULT flag in loadparm to correctly mark parameters as default or not, including parametric options Pair-Programmed-With: Andrew Bartlett <abart...@samba.org> commit ed8ea4ed18f08bfc93190513f2a2e8e058655daf Author: Andrew Tridgell <tri...@samba.org> Date: Thu Nov 11 10:35:38 2010 +1100 s4-server: move the creation of the IPC$ share into ntvfs the IPC$ share is only used by the ntvfs backends, and doesn't need to be created on every load of smb.conf. This fixes a problem with testparm showing the ipc$ share when it isn't defined in smb.conf. This also removes the admin$ share, which really shouldn't be on by default. The admin$ share is used for remote software installation, and normally exposes the c:\windows directory on a windows server. That makes no sense on Samba. If for some reason a admin$ share is needed, then the admin can create one as usual. Exposing /tmp via admin$ by default seems like a bad idea. Pair-Programmed-With: Andrew Bartlett <abart...@samba.org> ----------------------------------------------------------------------- Summary of changes: source4/ntvfs/ntvfs_base.c | 26 ++++++++ source4/param/loadparm.c | 93 ++++++++++++--------------- source4/scripting/devel/config_base | 43 ++++++++++++ source4/scripting/python/samba/join.py | 2 +- source4/scripting/python/samba/provision.py | 43 ++++++++---- source4/torture/rpc/srvsvc.c | 6 +- 6 files changed, 143 insertions(+), 70 deletions(-) create mode 100755 source4/scripting/devel/config_base Changeset truncated at 500 lines: diff --git a/source4/ntvfs/ntvfs_base.c b/source4/ntvfs/ntvfs_base.c index d8d73e9..1b1a533 100644 --- a/source4/ntvfs/ntvfs_base.c +++ b/source4/ntvfs/ntvfs_base.c @@ -200,6 +200,30 @@ NTSTATUS ntvfs_init_connection(TALLOC_CTX *mem_ctx, struct share_config *scfg, e return NT_STATUS_OK; } +/* + adds the IPC$ share, needed for RPC calls + */ +static NTSTATUS ntvfs_add_ipc_share(struct loadparm_context *lp_ctx) +{ + struct loadparm_service *ipc; + + if (lpcfg_service(lp_ctx, "IPC$")) { + /* it has already been defined in smb.conf or elsewhere */ + return NT_STATUS_OK; + } + + ipc = lpcfg_add_service(lp_ctx, NULL, "IPC$"); + NT_STATUS_HAVE_NO_MEMORY(ipc); + + lpcfg_do_service_parameter(lp_ctx, ipc, "comment", "IPC Service"); + lpcfg_do_service_parameter(lp_ctx, ipc, "path", "/dev/null"); + lpcfg_do_service_parameter(lp_ctx, ipc, "ntvfs handler", "default"); + lpcfg_do_service_parameter(lp_ctx, ipc, "browseable", "No"); + lpcfg_do_service_parameter(lp_ctx, ipc, "fstype", "IPC"); + + return NT_STATUS_OK; +} + NTSTATUS ntvfs_init(struct loadparm_context *lp_ctx) { static bool initialized = false; @@ -217,6 +241,8 @@ NTSTATUS ntvfs_init(struct loadparm_context *lp_ctx) run_init_functions(shared_init); talloc_free(shared_init); + + ntvfs_add_ipc_share(lp_ctx); return NT_STATUS_OK; } diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c index 69dead7..09d4f39 100644 --- a/source4/param/loadparm.c +++ b/source4/param/loadparm.c @@ -1053,6 +1053,10 @@ struct loadparm_service *lpcfg_add_service(struct loadparm_context *lp_ctx, int num_to_alloc = lp_ctx->iNumServices + 1; struct parmlist_entry *data, *pdata; + if (pservice == NULL) { + pservice = lp_ctx->sDefault; + } + tservice = *pservice; /* it might already exist */ @@ -1143,39 +1147,6 @@ bool lpcfg_add_home(struct loadparm_context *lp_ctx, } /** - * Add the IPC service. - */ - -static bool lpcfg_add_hidden(struct loadparm_context *lp_ctx, const char *name, - const char *fstype) -{ - struct loadparm_service *service = lpcfg_add_service(lp_ctx, lp_ctx->sDefault, name); - - if (service == NULL) - return false; - - string_set(service, &service->szPath, tmpdir()); - - service->comment = talloc_asprintf(service, "%s Service (%s)", - fstype, lp_ctx->globals->szServerString); - string_set(service, &service->fstype, fstype); - service->iMaxConnections = -1; - service->bAvailable = true; - service->bRead_only = true; - service->bPrint_ok = false; - service->bBrowseable = false; - - if (strcasecmp(fstype, "IPC") == 0) { - lpcfg_do_service_parameter(lp_ctx, service, "ntvfs handler", - "default"); - } - - DEBUG(3, ("adding hidden service %s\n", name)); - - return true; -} - -/** * Add a new printer service, with defaults coming from service iFrom. */ @@ -1359,7 +1330,7 @@ static void copy_service(struct loadparm_service *pserviceDest, pdata = pdata->next; } if (not_added) { - paramo = talloc(pserviceDest, struct parmlist_entry); + paramo = talloc_zero(pserviceDest, struct parmlist_entry); if (paramo == NULL) smb_panic("OOM"); paramo->key = talloc_reference(paramo, data->key); @@ -1632,7 +1603,7 @@ static bool lp_do_parameter_parametric(struct loadparm_context *lp_ctx, } } - paramo = talloc(mem_ctx, struct parmlist_entry); + paramo = talloc_zero(mem_ctx, struct parmlist_entry); if (!paramo) smb_panic("OOM"); paramo->key = talloc_strdup(paramo, name); @@ -1651,14 +1622,18 @@ static bool lp_do_parameter_parametric(struct loadparm_context *lp_ctx, static bool set_variable(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr, const char *pszParmName, const char *pszParmValue, - struct loadparm_context *lp_ctx) + struct loadparm_context *lp_ctx, bool on_globals) { int i; /* if it is a special case then go ahead */ if (parm_table[parmnum].special) { - parm_table[parmnum].special(lp_ctx, pszParmValue, - (char **)parm_ptr); - return true; + bool ret; + ret = parm_table[parmnum].special(lp_ctx, pszParmValue, + (char **)parm_ptr); + if (!ret) { + return false; + } + goto mark_non_default; } /* now switch on the type of variable it is */ @@ -1730,7 +1705,8 @@ static bool set_variable(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr, break; } - if (lp_ctx->flags[parmnum] & FLAG_DEFAULT) { +mark_non_default: + if (on_globals && (lp_ctx->flags[parmnum] & FLAG_DEFAULT)) { lp_ctx->flags[parmnum] &= ~FLAG_DEFAULT; /* we have to also unset FLAG_DEFAULT on aliases */ for (i=parmnum-1;i>=0 && parm_table[i].offset == parm_table[parmnum].offset;i--) { @@ -1766,8 +1742,8 @@ bool lpcfg_do_global_parameter(struct loadparm_context *lp_ctx, parm_ptr = lpcfg_parm_ptr(lp_ctx, NULL, &parm_table[parmnum]); - return set_variable(lp_ctx, parmnum, parm_ptr, - pszParmName, pszParmValue, lp_ctx); + return set_variable(lp_ctx->globals, parmnum, parm_ptr, + pszParmName, pszParmValue, lp_ctx, true); } bool lpcfg_do_service_parameter(struct loadparm_context *lp_ctx, @@ -1811,7 +1787,7 @@ bool lpcfg_do_service_parameter(struct loadparm_context *lp_ctx, service->copymap[i] = false; return set_variable(service, parmnum, parm_ptr, pszParmName, - pszParmValue, lp_ctx); + pszParmValue, lp_ctx, false); } /** @@ -2114,6 +2090,9 @@ static void dump_globals(struct loadparm_context *lp_ctx, FILE *f, if (lp_ctx->globals->param_opt != NULL) { for (data = lp_ctx->globals->param_opt; data; data = data->next) { + if (!show_defaults && (data->priority & FLAG_DEFAULT)) { + continue; + } fprintf(f, "\t%s = %s\n", data->key, data->value); } } @@ -2124,7 +2103,8 @@ static void dump_globals(struct loadparm_context *lp_ctx, FILE *f, * Display the contents of a single services record. */ -static void dump_a_service(struct loadparm_service * pService, struct loadparm_service *sDefault, FILE * f) +static void dump_a_service(struct loadparm_service * pService, struct loadparm_service *sDefault, FILE * f, + unsigned int *flags) { int i; struct parmlist_entry *data; @@ -2139,8 +2119,14 @@ static void dump_a_service(struct loadparm_service * pService, struct loadparm_s (i == 0 || (parm_table[i].offset != parm_table[i - 1].offset))) { if (pService == sDefault) { - if (defaults_saved && is_default(sDefault, i)) + if (flags && (flags[i] & FLAG_DEFAULT)) { continue; + } + if (defaults_saved) { + if (is_default(sDefault, i)) { + continue; + } + } } else { if (equal_parameter(parm_table[i].type, ((char *)pService) + @@ -2290,6 +2276,7 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx) int i; char *myname; struct loadparm_context *lp_ctx; + struct parmlist_entry *parm; lp_ctx = talloc_zero(mem_ctx, struct loadparm_context); if (lp_ctx == NULL) @@ -2477,6 +2464,12 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx) } } + for (parm=lp_ctx->globals->param_opt; parm; parm=parm->next) { + if (!(parm->priority & FLAG_CMDLINE)) { + parm->priority |= FLAG_DEFAULT; + } + } + return lp_ctx; } @@ -2501,9 +2494,6 @@ static bool lpcfg_update(struct loadparm_context *lp_ctx) { lpcfg_add_auto_services(lp_ctx, lpcfg_auto_services(lp_ctx)); - lpcfg_add_hidden(lp_ctx, "IPC$", "IPC"); - lpcfg_add_hidden(lp_ctx, "ADMIN$", "DISK"); - if (!lp_ctx->globals->szWINSservers && lp_ctx->globals->bWINSsupport) { lpcfg_do_global_parameter(lp_ctx, "wins server", "127.0.0.1"); } @@ -2613,12 +2603,11 @@ void lpcfg_dump(struct loadparm_context *lp_ctx, FILE *f, bool show_defaults, { int iService; - if (show_defaults) - defaults_saved = false; + defaults_saved = !show_defaults; dump_globals(lp_ctx, f, show_defaults); - dump_a_service(lp_ctx->sDefault, lp_ctx->sDefault, f); + dump_a_service(lp_ctx->sDefault, lp_ctx->sDefault, f, lp_ctx->flags); for (iService = 0; iService < maxtoprint; iService++) lpcfg_dump_one(f, show_defaults, lp_ctx->services[iService], lp_ctx->sDefault); @@ -2632,7 +2621,7 @@ void lpcfg_dump_one(FILE *f, bool show_defaults, struct loadparm_service *servic if (service != NULL) { if (service->szService[0] == '\0') return; - dump_a_service(service, sDefault, f); + dump_a_service(service, sDefault, f, NULL); } } diff --git a/source4/scripting/devel/config_base b/source4/scripting/devel/config_base new file mode 100755 index 0000000..2536065 --- /dev/null +++ b/source4/scripting/devel/config_base @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# this is useful for running samba tools with a different prefix + +# for example: +# samba-tool $(scripting/devel/config_base /tmp/testprefix) join ..... + +import sys, os + +vars = { + "dns update command" : "${PREFIX}/bin/samba_dnsupdate", + "spn update command" : "${PREFIX}/bin/samba_spnupdate", + "ncalrpc dir" : "${PREFIX}/var/ncalrpc", + "private dir" : "${PREFIX}/private", + "lock dir" : "${PREFIX}/var/locks", + "pid directory" : "${PREFIX}/var/run", + "winbindd socket directory" : "${PREFIX}/var/run/winbindd", + "winbindd privileged socket directory" : "${PREFIX}/var/lib/winbindd_privileged", + "ntp signd socket directory" : "${PREFIX}/var/run/ntp_signd" +} + +if len(sys.argv) != 2: + print("Usage: config_base BASEDIRECTORY") + sys.exit(1) + +prefix = sys.argv[1] + +config_dir = prefix + "/etc" +config_file = config_dir + "/smb.conf" + +if not os.path.isdir(config_dir): + os.makedirs(config_dir, mode=0755) +if not os.path.isfile(config_file): + open(config_file, mode='w').close() + +options = " --configfile=${PREFIX}/etc/smb.conf" + +for v in vars: + options += " --option=%s=%s" % (v.replace(" ",""), vars[v]) + +options = options.replace("${PREFIX}", prefix) + +print options diff --git a/source4/scripting/python/samba/join.py b/source4/scripting/python/samba/join.py index 571b822..bdd63db 100644 --- a/source4/scripting/python/samba/join.py +++ b/source4/scripting/python/samba/join.py @@ -412,7 +412,7 @@ class dc_join: serverdn=ctx.server_dn, domain=ctx.domain_name, hostname=ctx.myname, domainsid=ctx.domsid, machinepass=ctx.acct_pass, serverrole="domain controller", - sitename=ctx.site) + sitename=ctx.site, lp=ctx.lp) print "Provision OK for domain DN %s" % presult.domaindn ctx.local_samdb = presult.samdb ctx.lp = presult.lp diff --git a/source4/scripting/python/samba/provision.py b/source4/scripting/python/samba/provision.py index 85d883f..42c0345 100644 --- a/source4/scripting/python/samba/provision.py +++ b/source4/scripting/python/samba/provision.py @@ -83,13 +83,13 @@ def find_setup_dir(): if in_source_tree(): # In source tree dirname = os.path.dirname(__file__) - return os.path.join(dirname, "../../../setup") + return os.path.normpath(os.path.join(dirname, "../../../setup")) else: import sys for prefix in [sys.prefix, os.path.join(os.path.dirname(__file__), "../../../..")]: for suffix in ["share/setup", "share/samba/setup", "setup"]: - ret = os.path.join(prefix, suffix) + ret = os.path.normpath(os.path.join(prefix, suffix)) if os.path.isdir(ret): return ret raise Exception("Unable to find setup directory.") @@ -548,7 +548,7 @@ def guess_names(lp=None, hostname=None, domain=None, dnsdomain=None, def make_smbconf(smbconf, setup_path, hostname, domain, realm, serverrole, - targetdir, sid_generator="internal", eadb=False): + targetdir, sid_generator="internal", eadb=False, lp=None): """Create a new smb.conf file based on a couple of basic settings. """ assert smbconf is not None @@ -585,15 +585,16 @@ def make_smbconf(smbconf, setup_path, hostname, domain, realm, serverrole, assert realm is not None realm = realm.upper() - default_lp = samba.param.LoadParm() + if lp is None: + lp = samba.param.LoadParm() #Load non-existant file if os.path.exists(smbconf): - default_lp.load(smbconf) + lp.load(smbconf) if eadb: if targetdir is not None: privdir = os.path.join(targetdir, "private") else: - privdir = default_lp.get("private dir") + privdir = lp.get("private dir") posixeadb_line = "posix:eadb = " + os.path.abspath(os.path.join(privdir, "eadb.tdb")) else: posixeadb_line = "" @@ -602,7 +603,7 @@ def make_smbconf(smbconf, setup_path, hostname, domain, realm, serverrole, privatedir_line = "private dir = " + os.path.abspath(os.path.join(targetdir, "private")) lockdir_line = "lock dir = " + os.path.abspath(targetdir) - default_lp.set("lock dir", os.path.abspath(targetdir)) + lp.set("lock dir", os.path.abspath(targetdir)) else: privatedir_line = "" lockdir_line = "" @@ -613,13 +614,13 @@ def make_smbconf(smbconf, setup_path, hostname, domain, realm, serverrole, sid_generator_line = "sid generator = " + sid_generator used_setup_dir = setup_path("") - default_setup_dir = default_lp.get("setup directory") + default_setup_dir = lp.get("setup directory") setupdir_line = "" if used_setup_dir != default_setup_dir: setupdir_line = "setup directory = %s" % used_setup_dir - default_lp.set("setup directory", used_setup_dir) + lp.set("setup directory", used_setup_dir) - sysvol = os.path.join(default_lp.get("lock dir"), "sysvol") + sysvol = os.path.join(lp.get("lock dir"), "sysvol") netlogon = os.path.join(sysvol, realm.lower(), "scripts") setup_file(setup_path("provision.smb.conf.%s" % smbconfsuffix), @@ -637,6 +638,17 @@ def make_smbconf(smbconf, setup_path, hostname, domain, realm, serverrole, "POSIXEADB_LINE": posixeadb_line }) + # reload the smb.conf + lp.load(smbconf) + + # and dump it without any values that are the default + # this ensures that any smb.conf parameters that were set + # on the provision/join command line are set in the resulting smb.conf + f = open(smbconf, mode='w') + lp.dump(f, False) + f.close() + + def setup_name_mappings(samdb, idmap, sid, domaindn, root_uid, nobody_uid, users_gid, wheel_gid): @@ -1374,7 +1386,8 @@ def provision(setup_dir, logger, session_info, sitename=None, ol_mmr_urls=None, ol_olc=None, setup_ds_path=None, slapd_path=None, nosync=False, - ldap_dryrun_mode=False, useeadb=False, am_rodc=False): + ldap_dryrun_mode=False, useeadb=False, am_rodc=False, + lp=None): """Provision samba4 :note: caution, this wipes all existing data! @@ -1446,12 +1459,14 @@ def provision(setup_dir, logger, session_info, data = data.lstrip() if data is None or data == "": make_smbconf(smbconf, setup_path, hostname, domain, realm, - serverrole, targetdir, sid_generator, useeadb) + serverrole, targetdir, sid_generator, useeadb, + lp=lp) else: make_smbconf(smbconf, setup_path, hostname, domain, realm, serverrole, - targetdir, sid_generator, useeadb) + targetdir, sid_generator, useeadb, lp=lp) - lp = samba.param.LoadParm() + if lp is None: + lp = samba.param.LoadParm() lp.load(smbconf) names = guess_names(lp=lp, hostname=hostname, domain=domain, dnsdomain=realm, serverrole=serverrole, diff --git a/source4/torture/rpc/srvsvc.c b/source4/torture/rpc/srvsvc.c index 4137052..16f2673 100644 --- a/source4/torture/rpc/srvsvc.c +++ b/source4/torture/rpc/srvsvc.c @@ -306,7 +306,7 @@ static bool test_NetConnEnum(struct torture_context *tctx, ZERO_STRUCT(info_ctr); r.in.server_unc = talloc_asprintf(tctx,"\\\\%s",dcerpc_server_name(p)); - r.in.path = talloc_asprintf(tctx,"%s","ADMIN$"); + r.in.path = talloc_asprintf(tctx,"%s","IPC$"); r.in.info_ctr = &info_ctr; r.in.max_buffer = (uint32_t)-1; r.in.resume_handle = NULL; @@ -534,13 +534,13 @@ static bool test_NetShareGetInfo(struct torture_context *tctx, static bool test_NetShareGetInfoAdminFull(struct torture_context *tctx, struct dcerpc_pipe *p) { - return test_NetShareGetInfo(tctx, p, "ADMIN$", true); + return test_NetShareGetInfo(tctx, p, "IPC$", true); } static bool test_NetShareGetInfoAdminAnon(struct torture_context *tctx, struct dcerpc_pipe *p) { - return test_NetShareGetInfo(tctx, p, "ADMIN$", false); + return test_NetShareGetInfo(tctx, p, "IPC$", false); } static bool test_NetShareAddSetDel(struct torture_context *tctx, -- Samba Shared Repository