[Samba] Samba4 Patch: newuseradv and newgroupadv scripts for net cmd utlity
Michael Wood
esiotrot at gmail.com
Thu May 27 02:53:06 MDT 2010
Hi
On 27 May 2010 00:06, Lukasz Zalewski <lukas at dcs.qmul.ac.uk> wrote:
> Hi all,
> As per Jelmer's request - in response to bug #7455 attached diff file.
> Please let me know what you think and if any modificationes need to be
> performed
>
>
> Regards
>
> Luk
I think samba-technical is a better place to post this.
--
Michael Wood <esiotrot at gmail.com>
-------------- next part --------------
--- samba/netcmd/__init__.py.org 2010-05-25 17:28:00.000000000 +0100
+++ samba/netcmd/__init__.py 2010-05-26 11:43:16.000000000 +0100
@@ -160,3 +160,7 @@
commands["vampire"] = cmd_vampire()
from samba.netcmd.machinepw import cmd_machinepw
commands["machinepw"] = cmd_machinepw()
+from samba.netcmd.newuseradv import cmd_newuseradv
+commands["newuseradv"] = cmd_newuseradv()
+from samba.netcmd.newgroupadv import cmd_newgroupadv
+commands["newgroupadv"] = cmd_newgroupadv()
--- samba/samdb.py.org 2010-05-25 13:12:16.000000000 +0100
+++ samba/samdb.py 2010-05-26 21:34:11.000000000 +0100
@@ -140,6 +140,158 @@
else:
self.transaction_commit()
+ def newgroupadv(self, groupname, groupou=None, grouptype=None,
+ description=None, mailaddress=None, notes=None):
+ """Adds a new group with additional parameters
+
+ :param groupname: Name of the new group
+ :param grouptype: Type of the new group
+ :param description: Description of the new group
+ :param mailaddress: Email address of the new group
+ :param notes: Notes of the new group
+ """
+
+ self.transaction_start()
+ try:
+ group_dn = "CN=%s,%s,%s" % (groupname, (groupou or "CN=Users"), self.domain_dn())
+
+ # The new user record. Note the reliance on the SAMLDB module which
+ # fills in the default informations
+ ldbmessage = {"dn": group_dn,
+ "sAMAccountName": groupname,
+ "objectClass": "group"}
+
+ if grouptype is not None:
+ ldbmessage["groupType"] = "%d" % ((grouptype)-2**32)
+
+ if description is not None:
+ ldbmessage["description"] = description
+
+ if mailaddress is not None:
+ ldbmessage["mail"] = mailaddress
+
+ if notes is not None:
+ ldbmessage["info"] = notes
+
+ self.add(ldbmessage)
+
+ except:
+ self.transaction_cancel()
+ raise
+ else:
+ self.transaction_commit()
+
+ def newuseradv(self, username, password,
+ force_password_change_at_next_login_req=False,
+ userou=None, surname=None, givenname=None, initials=None,
+ profilepath=None, scriptpath=None, homedrive=None, homedirectory=None,
+ jobtitle=None, department=None, company=None, description=None,
+ mailaddress=None, internetaddress=None, telephonenumber=None,
+ physicaldeliveryoffice=None):
+ """Adds a new user with additional parameters
+
+ :param username: Name of the new user
+ :param password: Password for the new user
+ :param force_password_change_at_next_login_req: Force password change
+ :param userou: Object container (without domainDN postfix) for new user
+ :param surname: Surname of the new user
+ :param givenname: First name of the new user
+ :param initials: Initials of the new user
+ :param profilepath: Profile path of the new user
+ :param scriptpath: Logon script path of the new user
+ :param homedrive: Home drive of the new user
+ :param homedirectory: Home directory of the new user
+ :param jobtitle: Job title of the new user
+ :param department: Department of the new user
+ :param company: Company of the new user
+ :param description: of the new user
+ :param mailaddress: Email address of the new user
+ :param internetaddress: Home page of the new user
+ :param telephonenumber: Phone number of the new user
+ :param physicaldeliveryoffice: Office location of the new user
+ """
+
+ displayName = "";
+ if givenname is not None:
+ displayName += givenname
+
+ if initials is not None:
+ displayName += ' %s.' % initials
+
+ if surname is not None:
+ displayName += ' %s' % surname
+
+ self.transaction_start()
+ try:
+ user_dn = "CN=%s,%s,%s" % (username, (userou or "CN=Users"), self.domain_dn())
+
+ # The new user record. Note the reliance on the SAMLDB module which
+ # fills in the default informations
+ ldbmessage = {"dn": user_dn,
+ "sAMAccountName": username,
+ "objectClass": "user"}
+
+ if surname is not None:
+ ldbmessage["sn"] = surname
+
+ if givenname is not None:
+ ldbmessage["givenName"] = givenname
+
+ if displayName is not "":
+ ldbmessage["displayName"] = displayName
+ ldbmessage["name"] = displayName
+
+ if initials is not None:
+ ldbmessage["initials"] = '%s.' % initials
+
+ if profilepath is not None:
+ ldbmessage["profilePath"] = profilepath
+
+ if scriptpath is not None:
+ ldbmessage["scriptPath"] = scriptpath
+
+ if homedrive is not None:
+ ldbmessage["homeDrive"] = homedrive
+
+ if homedirectory is not None:
+ ldbmessage["homeDirectory"] = homedirectory
+
+ if jobtitle is not None:
+ ldbmessage["title"] = jobtitle
+
+ if department is not None:
+ ldbmessage["department"] = department
+
+ if company is not None:
+ ldbmessage["company"] = company
+
+ if description is not None:
+ ldbmessage["description"] = description
+
+ if mailaddress is not None:
+ ldbmessage["mail"] = mailaddress
+
+ if internetaddress is not None:
+ ldbmessage["wWWHomePage"] = internetaddress
+
+ if telephonenumber is not None:
+ ldbmessage["telephoneNumber"] = telephonenumber
+
+ if physicaldeliveryoffice is not None:
+ ldbmessage["physicalDeliveryOfficeName"] = physicaldeliveryoffice
+
+ self.add(ldbmessage)
+
+ # Sets the password for it
+ self.setpassword("(dn=" + user_dn + ")", password,
+ force_password_change_at_next_login_req)
+
+ except:
+ self.transaction_cancel()
+ raise
+ else:
+ self.transaction_commit()
+
def setpassword(self, filter, password,
force_change_at_next_login=False,
username=None):
--- samba/netcmd/newuseradv.py 2010-05-26 21:50:33.000000000 +0100
+++ samba/netcmd/newuseradv.py.org 2010-05-26 21:27:15.000000000 +0100
@@ -0,0 +1,94 @@
+#!/usr/bin/python
+#
+# Adds a new user to a Samba4 server
+# Copyright Jelmer Vernooij 2008
+#
+# Based on the original in EJS:
+# Copyright Andrew Tridgell 2005
+#
+# 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 samba.getopt as options
+from samba.netcmd import Command, CommandError, Option
+import ldb
+
+from getpass import getpass
+from samba.auth import system_session
+from samba.samdb import SamDB
+
+class cmd_newuseradv(Command):
+ """Creates a new user with additional options"""
+
+ synopsis = "newuseradv [options] <username> [<password>]"
+
+ takes_optiongroups = {
+ "sambaopts": options.SambaOptions,
+ "versionopts": options.VersionOptions,
+ "credopts": options.CredentialsOptions,
+ }
+
+ takes_options = [
+ Option("-H", help="LDB URL for database or target server", type=str),
+ Option("--must-change-at-next-login",
+ help="Force password to be changed on next login",
+ action="store_true"),
+ Option("--userou",
+ help="Alternative location (without domainDN counterpart) to default CN=Users in which new user object will be created",
+ type=str),
+ Option("--surname", help="User's surname", type=str),
+ Option("--given-name", help="User's given name", type=str),
+ Option("--initials", help="User's initials", type=str),
+ Option("--profile-path", help="User's profile path", type=str),
+ Option("--script-path", help="User's logon script path", type=str),
+ Option("--home-drive", help="User's home drive letter", type=str),
+ Option("--home-directory", help="User's home directory path", type=str),
+ Option("--job-title", help="User's job title", type=str),
+ Option("--department", help="User's department", type=str),
+ Option("--company", help="User's company", type=str),
+ Option("--description", help="User's description", type=str),
+ Option("--mail-address", help="User's email address", type=str),
+ Option("--internet-address", help="User's home page", type=str),
+ Option("--telephone-number", help="User's phone number", type=str),
+ Option("--physical-delivery-office", help="User's office location", type=str),
+ ]
+
+ takes_args = ["username", "password?"]
+
+ def run(self, username, password=None, credopts=None, sambaopts=None,
+ versionopts=None, H=None, must_change_at_next_login=None,
+ userou=None, surname=None, given_name=None, initials=None,
+ profile_path=None, script_path=None, home_drive=None, home_directory=None,
+ job_title=None, department=None, company=None, description=None,
+ mail_address=None, internet_address=None, telephone_number=None, physical_delivery_office=None):
+
+ if password is None:
+ password = getpass("New Password: ")
+
+ lp = sambaopts.get_loadparm()
+ creds = credopts.get_credentials(lp)
+
+ try:
+ samdb = SamDB(url=H, session_info=system_session(),
+ credentials=creds, lp=lp)
+ samdb.newuseradv(username, password,
+ force_password_change_at_next_login_req=must_change_at_next_login,
+ userou=userou, surname=surname, givenname=given_name, initials=initials,
+ profilepath=profile_path, homedrive=home_drive, scriptpath=script_path, homedirectory=home_directory,
+ jobtitle=job_title, department=department, company=company, description=description,
+ mailaddress=mail_address, internetaddress=internet_address,
+ telephonenumber=telephone_number, physicaldeliveryoffice=physical_delivery_office)
+ except ldb.LdbError, (num, msg):
+ raise CommandError('Failed to create user "%s" : %s' % (
+ username, msg))
+
--- samba/netcmd/newgroupadv.py 2010-05-26 21:50:46.000000000 +0100
+++ samba/netcmd/newgroupadv.py.org 2010-05-26 21:27:03.000000000 +0100
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+#
+# Adds a new user to a Samba4 server
+# Copyright Jelmer Vernooij 2008
+#
+# Based on the original in EJS:
+# Copyright Andrew Tridgell 2005
+#
+# 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 samba.getopt as options
+from samba.netcmd import Command, CommandError, Option
+import ldb
+
+from getpass import getpass
+from samba.auth import system_session
+from samba.samdb import SamDB
+from samba.dsdb import (
+ GTYPE_SECURITY_DOMAIN_LOCAL_GROUP,
+ GTYPE_SECURITY_GLOBAL_GROUP,
+ GTYPE_SECURITY_UNIVERSAL_GROUP,
+ GTYPE_DISTRIBUTION_DOMAIN_LOCAL_GROUP,
+ GTYPE_DISTRIBUTION_GLOBAL_GROUP,
+ GTYPE_DISTRIBUTION_UNIVERSAL_GROUP,
+)
+
+securityGroup = dict({"Domain local": GTYPE_SECURITY_DOMAIN_LOCAL_GROUP, "Global": GTYPE_SECURITY_GLOBAL_GROUP, "Universal": GTYPE_SECURITY_UNIVERSAL_GROUP})
+distributionGroup = {"Domain local": GTYPE_DISTRIBUTION_DOMAIN_LOCAL_GROUP, "Global": GTYPE_DISTRIBUTION_GLOBAL_GROUP, "Universal": GTYPE_DISTRIBUTION_UNIVERSAL_GROUP}
+
+
+class cmd_newgroupadv(Command):
+ """Creates a new group with additional options"""
+
+ synopsis = "newgroupadv [options] <groupname>"
+
+ takes_optiongroups = {
+ "sambaopts": options.SambaOptions,
+ "versionopts": options.VersionOptions,
+ "credopts": options.CredentialsOptions,
+ }
+
+ takes_options = [
+ Option("-H", help="LDB URL for database or target server", type=str),
+ Option("--groupou",
+ help="Alternative location (without domainDN counterpart) to default CN=Users in which new user object will be created",
+ type=str),
+ Option("--group-scope", type="choice", choices=["Domain local", "Global", "Universal"],
+ help="Group scope (Domain local | Global | Universal)"),
+ Option("--group-type", type="choice", choices=["Security", "Distribution"],
+ help="Group type (Security | Distribution)"),
+ Option("--description", help="Group's description", type=str),
+ Option("--mail-address", help="Group's email address", type=str),
+ Option("--notes", help="Groups's notes", type=str),
+ ]
+
+ takes_args = ["groupname"]
+
+ def run(self, groupname, credopts=None, sambaopts=None,
+ versionopts=None, H=None, groupou=None, group_scope=None,
+ group_type=None, description=None, mail_address=None, notes=None):
+
+ if cmp((groupType or "Security"), "Security") == 0:
+ gType = securityGroup.get(groupScope, GTYPE_SECURITY_GLOBAL_GROUP)
+ else:
+ gType = distributionGroup.get(groupScope, GTYPE_DISTRIBUTION_GLOBAL_GROUP)
+
+ lp = sambaopts.get_loadparm()
+ creds = credopts.get_credentials(lp)
+
+ try:
+ samdb = SamDB(url=H, session_info=system_session(),
+ credentials=creds, lp=lp)
+ samdb.newgroupadv(groupname, groupou=groupou, grouptype = gType,
+ description=description, mailaddress=mail_address, notes=notes)
+ except ldb.LdbError, (num, msg):
+ raise CommandError('Failed to create user "%s" : %s' % (
+ username, msg))
+
More information about the samba
mailing list