[CalendarServer-changes] [10981] CalendarServer/trunk/calendarserver/tools/principals.py

source_changes at macosforge.org source_changes at macosforge.org
Tue Apr 2 18:26:07 PDT 2013


Revision: 10981
          http://trac.calendarserver.org//changeset/10981
Author:   sagen at apple.com
Date:     2013-04-02 18:26:07 -0700 (Tue, 02 Apr 2013)
Log Message:
-----------
manage principals tool has circular import problem with cmdline

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/tools/principals.py

Modified: CalendarServer/trunk/calendarserver/tools/principals.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/principals.py	2013-04-03 01:26:06 UTC (rev 10980)
+++ CalendarServer/trunk/calendarserver/tools/principals.py	2013-04-03 01:26:07 UTC (rev 10981)
@@ -23,25 +23,23 @@
 import signal
 from getopt import getopt, GetoptError
 from uuid import UUID
-from pwd import getpwnam
-from grp import getgrnam
 
-from twisted.python.util import switchUID
 from twisted.internet import reactor
 from twisted.internet.defer import inlineCallbacks, returnValue
 from txdav.xml import element as davxml
 
-from twext.python.log import clearLogLevels
-from twext.python.log import StandardIOObserver
-
 from txdav.xml.base import decodeXMLName, encodeXMLName
 
-from twistedcaldav.config import config, ConfigurationError
+from twistedcaldav.config import config
 from twistedcaldav.directory.directory import UnknownRecordTypeError, DirectoryError
 
-from calendarserver.tools.util import loadConfig, getDirectory, setupMemcached,  booleanArgument, checkDirectory
+from calendarserver.tools.util import booleanArgument 
 from twistedcaldav.directory.augment import allowedAutoScheduleModes
+from calendarserver.tools.cmdline import utilityMain
 
+# FIXME: Move WorkerService to a util module?
+from calendarserver.tools.purge import WorkerService
+
 __all__ = [
     "principalForPrincipalID", "proxySubprincipal", "addProxy", "removeProxy",
     "ProxyError", "ProxyWarning", "updateRecord"
@@ -99,6 +97,22 @@
     else:
         sys.exit(0)
 
+
+class PrincipalService(WorkerService):
+    """
+    """
+
+    params = []
+
+    @inlineCallbacks
+    def doWork(self):
+        """
+        """
+        rootResource = self.rootResource()
+        directory = rootResource.getDirectory()
+        yield self.command(rootResource, directory, self._store, *self.params) 
+
+
 def main():
     try:
         (optargs, args) = getopt(
@@ -243,54 +257,7 @@
         else:
             raise NotImplementedError(opt)
 
-    #
-    # Get configuration
-    #
-    try:
-        loadConfig(configFileName)
 
-        # Do this first, because modifying the config object will cause
-        # some logging activity at whatever log level the plist says
-        clearLogLevels()
-
-
-        config.DefaultLogLevel = "debug" if verbose else "error"
-
-        #
-        # Send logging output to stdout
-        #
-        observer = StandardIOObserver()
-        observer.start()
-
-        # Create the DataRoot directory before shedding privileges
-        if config.DataRoot.startswith(config.ServerRoot + os.sep):
-            checkDirectory(
-                config.DataRoot,
-                "Data root",
-                access=os.W_OK,
-                create=(0750, config.UserName, config.GroupName),
-            )
-
-        # Shed privileges
-        if config.UserName and config.GroupName and os.getuid() == 0:
-            uid = getpwnam(config.UserName).pw_uid
-            gid = getgrnam(config.GroupName).gr_gid
-            switchUID(uid, uid, gid)
-
-        os.umask(config.umask)
-
-        # Configure memcached client settings prior to setting up resource
-        # hierarchy (in getDirectory)
-        setupMemcached(config)
-
-        try:
-            config.directory = getDirectory()
-        except DirectoryError, e:
-            abort(e)
-
-    except ConfigurationError, e:
-        abort(e)
-
     #
     # List principals
     #
@@ -366,16 +333,13 @@
 
         params = (runPrincipalActions, args, principalActions)
 
-    #
-    # Start the reactor
-    #
-    reactor.callLater(0, *params)
-    reactor.run()
 
+    PrincipalService.params = params
+    utilityMain(configFileName, PrincipalService, verbose=verbose)
 
 
 @inlineCallbacks
-def runPrincipalActions(principalIDs, actions):
+def runPrincipalActions(rootResource, directory, store, principalIDs, actions):
     try:
         for principalID in principalIDs:
             # Resolve the given principal IDs to principals
@@ -390,7 +354,8 @@
 
             # Performs requested actions
             for action in actions:
-                (yield action[0](principal, *action[1:]))
+                (yield action[0](rootResource, directory, store, principal,
+                    *action[1:]))
                 print("")
 
     finally:
@@ -400,14 +365,14 @@
         reactor.stop()
 
 @inlineCallbacks
-def runSearch(searchTerm):
+def runSearch(rootResource, directory, store, searchTerm):
 
     try:
         fields = []
         for fieldName in ("fullName", "firstName", "lastName", "emailAddresses"):
             fields.append((fieldName, searchTerm, True, "contains"))
 
-        records = list((yield config.directory.recordsMatchingTokens(searchTerm.strip().split())))
+        records = list((yield directory.recordsMatchingTokens(searchTerm.strip().split())))
         if records:
             records.sort(key=operator.attrgetter('fullName'))
             print("%d matches found:" % (len(records),))
@@ -517,25 +482,25 @@
 def proxySubprincipal(principal, proxyType):
     return principal.getChild("calendar-proxy-" + proxyType)
 
-def action_removePrincipal(principal):
+def action_removePrincipal(rootResource, directory, store, principal):
     record = principal.record
     fullName = record.fullName
     shortName = record.shortNames[0]
     guid = record.guid
 
-    config.directory.destroyRecord(record.recordType, guid=guid)
+    directory.destroyRecord(record.recordType, guid=guid)
     print("Removed '%s' %s %s" % (fullName, shortName, guid))
 
 
 @inlineCallbacks
-def action_readProperty(resource, qname):
+def action_readProperty(rootResource, directory, store, resource, qname):
     property = (yield resource.readProperty(qname, None))
     print("%r on %s:" % (encodeXMLName(*qname), resource))
     print("")
     print(property.toxml())
 
 @inlineCallbacks
-def action_listProxies(principal, *proxyTypes):
+def action_listProxies(rootResource, directory, store, principal, *proxyTypes):
     for proxyType in proxyTypes:
         subPrincipal = proxySubprincipal(principal, proxyType)
         if subPrincipal is None:
@@ -553,7 +518,7 @@
             records = []
             for member in membersProperty.children:
                 proxyPrincipal = principalForPrincipalID(str(member),
-                    directory=config.directory)
+                    directory=directory)
                 records.append(proxyPrincipal.record)
 
             printRecordList(records)
@@ -563,7 +528,7 @@
                 prettyPrincipal(principal)))
 
 @inlineCallbacks
-def action_addProxy(principal, proxyType, *proxyIDs):
+def action_addProxy(rootResource, directory, store, principal, proxyType, *proxyIDs):
     for proxyID in proxyIDs:
         proxyPrincipal = principalForPrincipalID(proxyID)
         if proxyPrincipal is None:
@@ -572,7 +537,7 @@
             (yield action_addProxyPrincipal(principal, proxyType, proxyPrincipal))
 
 @inlineCallbacks
-def action_addProxyPrincipal(principal, proxyType, proxyPrincipal):
+def action_addProxyPrincipal(rootResource, directory, store, principal, proxyType, proxyPrincipal):
     try:
         (yield addProxy(principal, proxyType, proxyPrincipal))
         print("Added %s as a %s proxy for %s" % (
@@ -668,7 +633,7 @@
 
 
 @inlineCallbacks
-def action_removeProxy(principal, *proxyIDs, **kwargs):
+def action_removeProxy(rootResource, directory, store, principal, *proxyIDs, **kwargs):
     for proxyID in proxyIDs:
         proxyPrincipal = principalForPrincipalID(proxyID)
         if proxyPrincipal is None:
@@ -677,7 +642,7 @@
             (yield action_removeProxyPrincipal(principal, proxyPrincipal, **kwargs))
 
 @inlineCallbacks
-def action_removeProxyPrincipal(principal, proxyPrincipal, **kwargs):
+def action_removeProxyPrincipal(rootResource, directory, store, principal, proxyPrincipal, **kwargs):
     try:
         removed = (yield removeProxy(principal, proxyPrincipal, **kwargs))
         if removed:
@@ -724,7 +689,7 @@
 
 
 @inlineCallbacks
-def action_setAutoSchedule(principal, autoSchedule):
+def action_setAutoSchedule(rootResource, directory, store, principal, autoSchedule):
     if principal.record.recordType == "groups":
         print("Enabling auto-schedule for %s is not allowed." % (principal,))
 
@@ -737,7 +702,7 @@
             prettyPrincipal(principal),
         ))
 
-        (yield updateRecord(False, config.directory,
+        (yield updateRecord(False, directory,
             principal.record.recordType,
             guid=principal.record.guid,
             shortNames=principal.record.shortNames,
@@ -746,7 +711,7 @@
             **principal.record.extras
         ))
 
-def action_getAutoSchedule(principal):
+def action_getAutoSchedule(rootResource, directory, store, principal):
     autoSchedule = principal.getAutoSchedule()
     print("Auto-schedule for %s is %s" % (
         prettyPrincipal(principal),
@@ -754,7 +719,7 @@
     ))
 
 @inlineCallbacks
-def action_setAutoScheduleMode(principal, autoScheduleMode):
+def action_setAutoScheduleMode(rootResource, directory, store, principal, autoScheduleMode):
     if principal.record.recordType == "groups":
         print("Setting auto-schedule mode for %s is not allowed." % (principal,))
 
@@ -767,7 +732,7 @@
             prettyPrincipal(principal),
         ))
 
-        (yield updateRecord(False, config.directory,
+        (yield updateRecord(False, directory,
             principal.record.recordType,
             guid=principal.record.guid,
             shortNames=principal.record.shortNames,
@@ -776,7 +741,7 @@
             **principal.record.extras
         ))
 
-def action_getAutoScheduleMode(principal):
+def action_getAutoScheduleMode(rootResource, directory, store, principal):
     autoScheduleMode = principal.getAutoScheduleMode()
     if not autoScheduleMode:
         autoScheduleMode = "automatic"
@@ -786,7 +751,7 @@
     ))
 
 @inlineCallbacks
-def action_setAutoAcceptGroup(principal, autoAcceptGroup):
+def action_setAutoAcceptGroup(rootResource, directory, store, principal, autoAcceptGroup):
     if principal.record.recordType == "groups":
         print("Setting auto-accept-group for %s is not allowed." % (principal,))
 
@@ -803,7 +768,7 @@
                 prettyPrincipal(principal),
             ))
 
-            (yield updateRecord(False, config.directory,
+            (yield updateRecord(False, directory,
                 principal.record.recordType,
                 guid=principal.record.guid,
                 shortNames=principal.record.shortNames,
@@ -812,12 +777,12 @@
                 **principal.record.extras
             ))
 
-def action_getAutoAcceptGroup(principal):
+def action_getAutoAcceptGroup(rootResource, directory, store, principal):
     autoAcceptGroup = principal.getAutoAcceptGroup()
     if autoAcceptGroup:
-        record = config.directory.recordWithGUID(autoAcceptGroup)
+        record = directory.recordWithGUID(autoAcceptGroup)
         if record is not None:
-            groupPrincipal = config.directory.principalCollection.principalForUID(record.uid)
+            groupPrincipal = directory.principalCollection.principalForUID(record.uid)
             if groupPrincipal is not None:
                 print("Auto-accept-group for %s is %s" % (
                     prettyPrincipal(principal),
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130402/e50f6bf8/attachment-0001.html>


More information about the calendarserver-changes mailing list