[CalendarServer-changes] [9258] CalendarServer/trunk/calendarserver/tools/dbinspect.py
source_changes at macosforge.org
source_changes at macosforge.org
Mon May 21 05:26:40 PDT 2012
Revision: 9258
http://trac.macosforge.org/projects/calendarserver/changeset/9258
Author: cdaboo at apple.com
Date: 2012-05-21 05:26:40 -0700 (Mon, 21 May 2012)
Log Message:
-----------
Added more commands for listing specific users home contents and listing a specific calendar. Also added the
ability to target users by short name as well as GUID.
Modified Paths:
--------------
CalendarServer/trunk/calendarserver/tools/dbinspect.py
Modified: CalendarServer/trunk/calendarserver/tools/dbinspect.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/dbinspect.py 2012-05-18 22:39:24 UTC (rev 9257)
+++ CalendarServer/trunk/calendarserver/tools/dbinspect.py 2012-05-21 12:26:40 UTC (rev 9258)
@@ -21,6 +21,8 @@
of simple commands.
"""
+from caldavclientlibrary.admin.xmlaccounts.recordtypes import recordType_users,\
+ recordType_locations, recordType_resources, recordType_groups
from calendarserver.tap.util import directoryFromConfig
from calendarserver.tools import tables
from calendarserver.tools.cmdline import utilityMain
@@ -40,6 +42,7 @@
from twistedcaldav.query import calendarqueryfilter
from twistedcaldav.stdconfig import DEFAULT_CONFIG_FILE
from txdav.common.datastore.sql_tables import schema, _BIND_MODE_OWN
+from uuid import UUID
import os
import sys
import traceback
@@ -61,7 +64,7 @@
description = '\n'.join(
wordWrap(
"""
- Usage: calendarserver_calverify [options] [input specifiers]\n
+ Usage: calendarserver_dbinspect [options] [input specifiers]\n
""",
int(os.environ.get('COLUMNS', '80'))
)
@@ -91,6 +94,21 @@
record = txn._directory.recordWithGUID(uid)
return record.shortNames[0] if record else "(%s)" % (uid,)
+def UIDFromInput(txn, value):
+ try:
+ return str(UUID(value)).upper()
+ except (ValueError, TypeError):
+ pass
+
+ record = txn._directory.recordWithShortName(recordType_users, value)
+ if record is None:
+ record = txn._directory.recordWithShortName(recordType_locations, value)
+ if record is None:
+ record = txn._directory.recordWithShortName(recordType_resources, value)
+ if record is None:
+ record = txn._directory.recordWithShortName(recordType_groups, value)
+ return record.guid if record else None
+
class Cmd(object):
_name = None
@@ -283,6 +301,60 @@
returnValue(tuple(rows))
+class CalendarsByOwner(Cmd):
+
+ _name = "List Calendars for Owner UID/Short Name"
+
+ @inlineCallbacks
+ def doIt(self, txn):
+
+ uid = raw_input("Owner UID/Name: ")
+ uid = UIDFromInput(txn, uid)
+ uids = yield self.getCalendars(txn, uid)
+
+ # Print table of results
+ table = tables.Table()
+ table.addHeader(("Owner UID", "Short Name", "Calendars", "ID", "Resources"))
+ totals = [0, 0,]
+ for uid, calname, resid, count in sorted(uids, key=lambda x:x[1]):
+ shortname = UserNameFromUID(txn, uid)
+ table.addRow((
+ uid if totals[0] == 0 else "",
+ shortname if totals[0] == 0 else "",
+ calname,
+ resid,
+ count,
+ ))
+ totals[0] += 1
+ totals[1] += count
+ table.addFooter(("Total", "", totals[0], "", totals[1]))
+
+ print "\n"
+ print "Calendars with resource count (total=%d):\n" % (len(uids),)
+ table.printTable()
+
+ @inlineCallbacks
+ def getCalendars(self, txn, uid):
+ ch = schema.CALENDAR_HOME
+ cb = schema.CALENDAR_BIND
+ co = schema.CALENDAR_OBJECT
+ rows = (yield Select(
+ [
+ ch.OWNER_UID,
+ cb.CALENDAR_RESOURCE_NAME,
+ co.CALENDAR_RESOURCE_ID,
+ Count(co.RESOURCE_ID),
+ ],
+ From=ch.join(
+ cb, type="inner", on=(ch.RESOURCE_ID == cb.CALENDAR_HOME_RESOURCE_ID).And(
+ cb.BIND_MODE == _BIND_MODE_OWN)).join(
+ co, type="left", on=(cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID)),
+ Where=(ch.OWNER_UID == Parameter("UID")),
+ GroupBy=(ch.OWNER_UID, cb.CALENDAR_RESOURCE_NAME, co.CALENDAR_RESOURCE_ID)
+ ).on(txn, **{"UID":uid}))
+ returnValue(tuple(rows))
+
+
class Events(Cmd):
_name = "List Events"
@@ -330,6 +402,56 @@
).on(txn))
returnValue(tuple(rows))
+class EventsByCalendar(Cmd):
+
+ _name = "List Events for a specific calendar"
+
+ @inlineCallbacks
+ def doIt(self, txn):
+
+ rid = raw_input("Resource-ID: ")
+ try:
+ int(rid)
+ except ValueError:
+ print 'Resource ID must be an integer'
+ returnValue(None)
+ uids = yield self.getEvents(txn, rid)
+
+ # Print table of results
+ table = tables.Table()
+ table.addHeader(("Type", "UID", "Resource Name", "Resource ID",))
+ for caltype, caluid, rname, rid in sorted(uids, key=lambda x:x[1]):
+ table.addRow((
+ caltype,
+ caluid,
+ rname,
+ rid,
+ ))
+
+ print "\n"
+ print "Calendar events (total=%d):\n" % (len(uids),)
+ table.printTable()
+
+ @inlineCallbacks
+ def getEvents(self, txn, rid):
+ ch = schema.CALENDAR_HOME
+ cb = schema.CALENDAR_BIND
+ co = schema.CALENDAR_OBJECT
+ rows = (yield Select(
+ [
+ co.ICALENDAR_TYPE,
+ co.ICALENDAR_UID,
+ co.RESOURCE_NAME,
+ co.RESOURCE_ID,
+ ],
+ From=ch.join(
+ cb, type="inner", on=(ch.RESOURCE_ID == cb.CALENDAR_HOME_RESOURCE_ID).And(
+ cb.BIND_MODE == _BIND_MODE_OWN)).join(
+ co, type="inner", on=(cb.CALENDAR_RESOURCE_ID == co.CALENDAR_RESOURCE_ID)),
+ Where=(co.CALENDAR_RESOURCE_ID == Parameter("RID")),
+ ).on(txn, **{"RID":rid}))
+ returnValue(tuple(rows))
+
class EventDetails(Cmd):
"""
Base class for common event details commands.
@@ -441,13 +563,14 @@
class EventsByOwner(EventDetails):
- _name = "Get Event Data by Owner UID"
+ _name = "Get Event Data by Owner UID/Short Name"
@inlineCallbacks
def doIt(self, txn):
- uid = raw_input("Owner UID: ")
+ uid = raw_input("Owner UID/Name: ")
+ uid = UIDFromInput(txn, uid)
rows = yield self.getData(txn, uid)
if rows:
for result in rows:
@@ -462,13 +585,14 @@
class EventsByOwnerCalendar(EventDetails):
- _name = "Get Event Data by Owner UID and calendar name"
+ _name = "Get Event Data by Owner UID/Short Name and calendar name"
@inlineCallbacks
def doIt(self, txn):
- uid = raw_input("Owner UID: ")
+ uid = raw_input("Owner UID/Name: ")
+ uid = UIDFromInput(txn, uid)
name = raw_input("Calendar resource name: ")
rows = yield self.getData(txn, uid, name)
if rows:
@@ -550,7 +674,7 @@
def doIt(self, txn):
- uid = raw_input("Owner UID: ")
+ uid = raw_input("Owner UID/Name: ")
start = raw_input("Start Time (UTC YYYYMMDDTHHMMSSZ or YYYYMMDD): ")
if len(start) == 8:
start += "T000000Z"
@@ -721,7 +845,9 @@
self.registerCommand(CalendarHomes)
self.registerCommand(CalendarHomesSummary)
self.registerCommand(Calendars)
+ self.registerCommand(CalendarsByOwner)
self.registerCommand(Events)
+ self.registerCommand(EventsByCalendar)
self.registerCommand(Event)
self.registerCommand(EventsByUID)
self.registerCommand(EventsByName)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120521/68679596/attachment.html>
More information about the calendarserver-changes
mailing list