diff options
Diffstat (limited to 'source4/scripting')
| -rw-r--r-- | source4/scripting/python/modules.c | 4 | ||||
| -rw-r--r-- | source4/scripting/python/pyrpc.h | 2 | ||||
| -rw-r--r-- | source4/scripting/python/samba/provision.py | 104 | ||||
| -rw-r--r-- | source4/scripting/python/samba/tests/dcerpc/rpcecho.py | 2 | ||||
| -rw-r--r-- | source4/scripting/python/samba/tests/dcerpc/unix.py | 36 | 
5 files changed, 107 insertions, 41 deletions
diff --git a/source4/scripting/python/modules.c b/source4/scripting/python/modules.c index 2ecad20b8e..6cd975c1a9 100644 --- a/source4/scripting/python/modules.c +++ b/source4/scripting/python/modules.c @@ -35,17 +35,21 @@ extern void init_events(void);  extern void inituuid(void);  extern void init_net(void);  extern void initecho(void); +extern void initdfs(void); +extern void initdrsuapi(void);  extern void initwinreg(void);  extern void initepmapper(void);  extern void initinitshutdown(void);  static void initdcerpc_misc(void) {}   extern void initmgmt(void); +extern void initnet(void);  extern void initatsvc(void);  extern void initsamr(void);  static void initdcerpc_security(void) {}  extern void initlsa(void);  extern void initsvcctl(void);  extern void initwkssvc(void); +extern void initunixinfo(void);  extern void init_libcli_nbt(void);  extern void init_libcli_smb(void); diff --git a/source4/scripting/python/pyrpc.h b/source4/scripting/python/pyrpc.h index 3a5d235cfc..f4d0f37c39 100644 --- a/source4/scripting/python/pyrpc.h +++ b/source4/scripting/python/pyrpc.h @@ -26,7 +26,7 @@  #define dom_sid2_Type dom_sid_Type  #define dom_sid28_Type dom_sid_Type  #define dom_sid2_Check dom_sid_Check -#define dom_sid28_Check dom_sid28_Check +#define dom_sid28_Check dom_sid_Check  /* This macro is only provided by Python >= 2.3 */  #ifndef PyAPI_DATA diff --git a/source4/scripting/python/samba/provision.py b/source4/scripting/python/samba/provision.py index 6917aa1a54..c9cdcdb768 100644 --- a/source4/scripting/python/samba/provision.py +++ b/source4/scripting/python/samba/provision.py @@ -264,8 +264,11 @@ def provision_paths_from_lp(lp, dnsdomain):      return paths +  def guess_names(lp=None, hostname=None, domain=None, dnsdomain=None, serverrole=None, -              rootdn=None, domaindn=None, configdn=None, schemadn=None, sitename=None): +                rootdn=None, domaindn=None, configdn=None, schemadn=None, serverdn=None,  +                sitename=None): +    """Guess configuration settings to use."""      if hostname is None:          hostname = socket.gethostname().split(".")[0].lower() @@ -287,7 +290,7 @@ def guess_names(lp=None, hostname=None, domain=None, dnsdomain=None, serverrole=      if lp.get("realm").upper() != realm:          raise Exception("realm '%s' in %s must match chosen realm '%s'" % -                        (lp.get("realm"), smbconf, realm)) +                        (lp.get("realm"), lp.configfile(), realm))      dnsdomain = dnsdomain.lower() @@ -332,6 +335,7 @@ def guess_names(lp=None, hostname=None, domain=None, dnsdomain=None, serverrole=      names.netbiosname = netbiosname      names.hostname = hostname      names.sitename = sitename +    names.serverdn = "CN=%s,CN=Servers,CN=%s,CN=Sites,%s" % (netbiosname, sitename, configdn)      return names @@ -398,6 +402,7 @@ def load_or_make_smbconf(smbconf, setup_path, hostname, domain, realm, serverrol      return lp +  def setup_name_mappings(samdb, idmap, sid, domaindn, root_uid, nobody_uid,                          users_gid, wheel_gid):      """setup reasonable name mappings for sam names to unix names. @@ -423,6 +428,7 @@ def setup_name_mappings(samdb, idmap, sid, domaindn, root_uid, nobody_uid,      idmap.setup_name_mapping(sid + "-500", idmap.TYPE_UID, root_uid)      idmap.setup_name_mapping(sid + "-513", idmap.TYPE_GID, users_gid) +  def setup_samdb_partitions(samdb_path, setup_path, message, lp, session_info,                              credentials, names,                             serverrole, ldap_backend=None,  @@ -543,9 +549,7 @@ def setup_samdb_partitions(samdb_path, setup_path, message, lp, session_info,          samdb.load_ldif_file_add(setup_path("provision_init.ldif"))          message("Setting up sam.ldb rootDSE") -        setup_samdb_rootdse(samdb, setup_path, names.schemadn, names.domaindn, names.hostname,  -                            names.dnsdomain, names.realm, names.rootdn, names.configdn, names.netbiosname, -                            names.sitename) +        setup_samdb_rootdse(samdb, setup_path, names)          if erase:              message("Erasing data from partitions") @@ -637,6 +641,7 @@ def setup_registry(path, setup_path, session_info, credentials, lp):      assert os.path.exists(provision_reg)      reg.diff_apply(provision_reg) +  def setup_idmapdb(path, setup_path, session_info, credentials, lp):      """Setup the idmap database. @@ -656,25 +661,23 @@ def setup_idmapdb(path, setup_path, session_info, credentials, lp):      idmap_ldb.load_ldif_file_add(setup_path("idmap_init.ldif"))      return idmap_ldb -def setup_samdb_rootdse(samdb, setup_path, schemadn, domaindn, hostname,  -                        dnsdomain, realm, rootdn, configdn, netbiosname, -                        sitename): + +def setup_samdb_rootdse(samdb, setup_path, names):      """Setup the SamDB rootdse.      :param samdb: Sam Database handle      :param setup_path: Obtain setup path      """      setup_add_ldif(samdb, setup_path("provision_rootdse_add.ldif"), { -        "SCHEMADN": schemadn,  -        "NETBIOSNAME": netbiosname, -        "DNSDOMAIN": dnsdomain, -        "DEFAULTSITE": sitename, -        "REALM": realm, -        "DNSNAME": "%s.%s" % (hostname, dnsdomain), -        "DOMAINDN": domaindn, -        "ROOTDN": rootdn, -        "CONFIGDN": configdn, -        "VERSION": samba.version(), +        "SCHEMADN": names.schemadn,  +        "NETBIOSNAME": names.netbiosname, +        "DNSDOMAIN": names.dnsdomain, +        "REALM": names.realm, +        "DNSNAME": "%s.%s" % (names.hostname, names.dnsdomain), +        "DOMAINDN": names.domaindn, +        "ROOTDN": names.rootdn, +        "CONFIGDN": names.configdn, +        "SERVERDN": names.serverdn,          }) @@ -879,7 +882,8 @@ FILL_DRS = "DRS"  def provision(setup_dir, message, session_info,                 credentials, smbconf=None, targetdir=None, samdb_fill=FILL_FULL, realm=None,  -              rootdn=None, domaindn=None, schemadn=None, configdn=None, +              rootdn=None, domaindn=None, schemadn=None, configdn=None,  +              serverdn=None,                domain=None, hostname=None, hostip=None, hostip6=None,                 domainsid=None, adminpass=None, krbtgtpass=None, domainguid=None,                 policyguid=None, invocationid=None, machinepass=None,  @@ -932,7 +936,8 @@ def provision(setup_dir, message, session_info,      names = guess_names(lp=lp, hostname=hostname, domain=domain,                           dnsdomain=realm, serverrole=serverrole, sitename=sitename, -                        rootdn=rootdn, domaindn=domaindn, configdn=configdn, schemadn=schemadn) +                        rootdn=rootdn, domaindn=domaindn, configdn=configdn, schemadn=schemadn, +                        serverdn=serverdn)      paths = provision_paths_from_lp(lp, names.dnsdomain) @@ -1046,8 +1051,8 @@ def provision(setup_dir, message, session_info,      message("Please install the phpLDAPadmin configuration located at %s into /etc/phpldapadmin/config.php" % paths.phpldapadminconfig) -    message("Once the above files are installed, your server will be ready to use") -    message("Server Type:    %s" % serverrole) +    message("Once the above files are installed, your Samba4 server will be ready to use") +    message("Server Role:    %s" % serverrole)      message("Hostname:       %s" % names.hostname)      message("NetBIOS Domain: %s" % names.domain)      message("DNS Domain:     %s" % names.dnsdomain) @@ -1061,15 +1066,17 @@ def provision(setup_dir, message, session_info,      result.samdb = samdb      return result +  def provision_become_dc(setup_dir=None,                          smbconf=None, targetdir=None, realm=None,                           rootdn=None, domaindn=None, schemadn=None, configdn=None, +                        serverdn=None,                          domain=None, hostname=None, domainsid=None,                           adminpass=None, krbtgtpass=None, domainguid=None,                           policyguid=None, invocationid=None, machinepass=None,                           dnspass=None, root=None, nobody=None, nogroup=None, users=None,                           wheel=None, backup=None, aci=None, serverrole=None,  -                        ldap_backend=None, ldap_backend_type=None, sitename=DEFAULTSITE): +                        ldap_backend=None, ldap_backend_type=None, sitename=None):      def message(text):  	"""print a message if quiet is not set.""" @@ -1077,11 +1084,15 @@ def provision_become_dc(setup_dir=None,      provision(setup_dir, message, system_session(), None,                smbconf=smbconf, targetdir=targetdir, samdb_fill=FILL_DRS, realm=realm,  -              rootdn=rootdn, domaindn=domaindn, schemadn=schemadn, configdn=configdn,  +              rootdn=rootdn, domaindn=domaindn, schemadn=schemadn, configdn=configdn, serverdn=serverdn,                domain=domain, hostname=hostname, hostip="127.0.0.1", domainsid=domainsid, machinepass=machinepass, serverrole="domain controller", sitename=sitename); -def setup_db_config(setup_path, file, dbdir): +def setup_db_config(setup_path, dbdir): +    """Setup a Berkeley database. +     +    :param setup_path: Setup path function. +    :param dbdir: Database directory."""      if not os.path.isdir(os.path.join(dbdir, "bdb-logs")):          os.makedirs(os.path.join(dbdir, "bdb-logs"), 0700);      if not os.path.isdir(os.path.join(dbdir, "tmp")): @@ -1096,7 +1107,7 @@ def provision_backend(setup_dir=None, message=None,                        smbconf=None, targetdir=None, realm=None,                         rootdn=None, domaindn=None, schemadn=None, configdn=None,                        domain=None, hostname=None, adminpass=None, root=None, serverrole=None,  -                      ldap_backend_type=None): +                      ldap_backend_type=None, ldap_backend_port=None):      def setup_path(file):          return os.path.join(setup_dir, file) @@ -1144,7 +1155,12 @@ def provision_backend(setup_dir=None, message=None,                     {"SCHEMADN": names.schemadn})      if ldap_backend_type == "fedora-ds": -        setup_file(setup_path("fedora-ds.inf"), paths.fedoradsinf,  +        if ldap_backend_port is not None: +            serverport = "ServerPort=%d" % ldap_backend_port +        else: +            serverport = "" + +        setup_file(setup_path("fedorads.inf"), paths.fedoradsinf,                      {"ROOT": root,                      "HOSTNAME": hostname,                      "DNSDOMAIN": names.dnsdomain, @@ -1152,19 +1168,18 @@ def provision_backend(setup_dir=None, message=None,                      "DOMAINDN": names.domaindn,                      "LDAPMANAGERDN": names.ldapmanagerdn,                      "LDAPMANAGERPASS": adminpass,  -                    "SERVERPORT": ""}) +                    "SERVERPORT": serverport}) -        setup_file(setup_path("fedora-partitions.ldif"), paths.fedoradspartitions,  +        setup_file(setup_path("fedorads-partitions.ldif"), paths.fedoradspartitions,                      {"CONFIGDN": names.configdn,                      "SCHEMADN": names.schemadn,                      }) -        setup_file(setup_path("fedora-partitions.ldif"), paths.fedoradspartitions,  -                   {"CONFIGDN": names.configdn, -                    "SCHEMADN": names.schemadn, -                    })          mapping = "schema-map-fedora-ds-1.0"          backend_schema = "99_ad.ldif" +         +        slapdcommand="Initailise Fedora DS with: setup-ds.pl --file=%s" % paths.fedoradsinf +             elif ldap_backend_type == "openldap":          attrs = ["linkID", "lDAPDisplayName"]  	res = schemadb.search(expression="(&(&(linkID=*)(!(linkID:1.2.840.113556.1.4.803:=1)))(objectclass=attributeSchema))", base=names.schemadn, scope=SCOPE_SUBTREE, attrs=attrs); @@ -1207,22 +1222,33 @@ refint_attributes""" + refint_attributes + "\n";          setup_file(setup_path("modules.conf"), paths.modulesconf,                     {"REALM": names.realm}) -        setup_db_config(setup_path, file, os.path.join(paths.ldapdir, "db", "user")) -        setup_db_config(setup_path, file, os.path.join(paths.ldapdir, "db", "config")) -        setup_db_config(setup_path, file, os.path.join(paths.ldapdir, "db", "schema")) +        setup_db_config(setup_path, file, os.path.join(paths.ldapdir, "user")) +        setup_db_config(setup_path, file, os.path.join(paths.ldapdir, "config")) +        setup_db_config(setup_path, file, os.path.join(paths.ldapdir, "schema"))          mapping = "schema-map-openldap-2.3"          backend_schema = "backend-schema.schema" -                  ldapi_uri = "ldapi://" + urllib.quote(os.path.join(paths.private_dir, "ldap", "ldapi"), safe="") -        message("Start slapd with: slapd -f " + paths.ldapdir + "/slapd.conf -h " + ldapi_uri) -                 +        if ldap_backend_port is not None: +            server_port_string = " -h ldap://0.0.0.0:%d" % ldap_backend_port +        else: +            server_port_string = "" +        slapdcommand="Start slapd with:    slapd -f " + paths.ldapdir + "/slapd.conf -h " + ldapi_uri + server_port_string      schema_command = "bin/ad2oLschema --option=convert:target=" + ldap_backend_type + " -I " + setup_path(mapping) + " -H tdb://" + schemadb_path + " -O " + os.path.join(paths.ldapdir, backend_schema);      os.system(schema_command) +    message("Your %s Backend for Samba4 is now configured, and is ready to be started" % ( ldap_backend_type) ) +    message("Server Role:         %s" % serverrole) +    message("Hostname:            %s" % names.hostname) +    message("DNS Domain:          %s" % names.dnsdomain) +    message("Base DN:             %s" % names.domaindn) +    message("LDAP admin DN:       %s" % names.ldapmanagerdn) +    message("LDAP admin password: %s" % adminpass) +    message(slapdcommand) +  def create_phpldapadmin_config(path, setup_path, ldapi_uri):      """Create a PHP LDAP admin configuration file. diff --git a/source4/scripting/python/samba/tests/dcerpc/rpcecho.py b/source4/scripting/python/samba/tests/dcerpc/rpcecho.py index 8c1a8bec71..484af9490c 100644 --- a/source4/scripting/python/samba/tests/dcerpc/rpcecho.py +++ b/source4/scripting/python/samba/tests/dcerpc/rpcecho.py @@ -30,7 +30,7 @@ class RpcEchoTests(unittest.TestCase):          self.assertEquals(2, self.conn.AddOne(1))      def test_echodata(self): -        self.assertEquals([1,2,3], self.conn.EchoData(3, [1, 2, 3])) +        self.assertEquals([1,2,3], self.conn.EchoData([1, 2, 3]))      def test_call(self):          self.assertEquals(u"foobar", self.conn.TestCall(u"foobar")) diff --git a/source4/scripting/python/samba/tests/dcerpc/unix.py b/source4/scripting/python/samba/tests/dcerpc/unix.py new file mode 100644 index 0000000000..b2577ec898 --- /dev/null +++ b/source4/scripting/python/samba/tests/dcerpc/unix.py @@ -0,0 +1,36 @@ +#!/usr/bin/python + +# Unix SMB/CIFS implementation. +# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 +#    +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +#    +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +#    +# You should have received a copy of the GNU General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. +# + +import unixinfo +import unittest +from samba.tests import get_loadparm + +class UnixinfoTests(unittest.TestCase): +    def setUp(self): +        self.conn = unixinfo.unixinfo("ncalrpc:", get_loadparm()) + +    def test_getpwuid(self): +        infos = self.conn.GetPWUid(range(512)) +        self.assertEquals(512, len(infos)) + +    def test_gidtosid(self): +        self.conn.GidToSid(1000) + +    def test_uidtosid(self): +        self.conn.UidToSid(1000)  | 
