[CalendarServer-changes] [9162] CalendarServer/trunk/calendarserver/tools/calverify.py
source_changes at macosforge.org
source_changes at macosforge.org
Fri Apr 20 11:53:35 PDT 2012
Revision: 9162
http://trac.macosforge.org/projects/calendarserver/changeset/9162
Author: cdaboo at apple.com
Date: 2012-04-20 11:53:34 -0700 (Fri, 20 Apr 2012)
Log Message:
-----------
Improve reporting.
Modified Paths:
--------------
CalendarServer/trunk/calendarserver/tools/calverify.py
Modified: CalendarServer/trunk/calendarserver/tools/calverify.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/calverify.py 2012-04-20 18:46:53 UTC (rev 9161)
+++ CalendarServer/trunk/calendarserver/tools/calverify.py 2012-04-20 18:53:34 UTC (rev 9162)
@@ -87,6 +87,11 @@
)
)
+
+def safePercent(x, y, multiplier=100.0):
+ return ((multiplier * x) / y) if y else 0
+
+
class CalVerifyOptions(Options):
"""
Command-line options for 'calendarserver_verify_data'
@@ -154,6 +159,8 @@
self.validForCalendaringUUIDs = {}
self.results = {}
+ self.summary = []
+ self.total = 0
def startService(self):
@@ -176,6 +183,8 @@
if self.options["mismatch"] or self.options["ical"]:
yield self.doScan(self.options["ical"], self.options["mismatch"], self.options["fix"])
+ self.printSummary()
+
self.output.close()
except:
log.err()
@@ -202,14 +211,16 @@
disabled = []
uids_len = len(uids)
uids_div = 1 if uids_len < 100 else uids_len / 100
+ self.addToSummary("Total Homes", uids_len)
for ctr, uid in enumerate(uids):
if self.options["verbose"] and divmod(ctr, uids_div)[1] == 0:
- self.output.write("%d of %d (%d%%)\n" % (
+ self.output.write(("\r%d of %d (%d%%)" % (
ctr+1,
uids_len,
((ctr+1) * 100 / uids_len),
- ))
+ )).ljust(80))
+ self.output.flush()
record = self.directoryService().recordWithGUID(uid)
if record is None:
@@ -229,7 +240,9 @@
yield self.txn.commit()
self.txn = None
-
+ if self.options["verbose"]:
+ self.output.write("\r".ljust(80) + "\n")
+
# Print table of results
table = tables.Table()
table.addHeader(("Owner UID", "Calendar Objects"))
@@ -242,32 +255,37 @@
self.output.write("\n")
self.output.write("Homes without a matching directory record (total=%d):\n" % (len(missing),))
table.printTable(os=self.output)
+ self.addToSummary("Homes without a matching directory record", len(missing), uids_len)
# Print table of results
table = tables.Table()
table.addHeader(("Owner UID", "Calendar Objects"))
for uid, count in sorted(wrong_server, key=lambda x:x[0]):
+ record = self.directoryService().recordWithGUID(uid)
table.addRow((
- uid,
+ "%s/%s (%s)" % (record.recordType if record else "-", record.shortNames[0] if record else "-", uid,),
count,
))
self.output.write("\n")
self.output.write("Homes not hosted on this server (total=%d):\n" % (len(wrong_server),))
table.printTable(os=self.output)
+ self.addToSummary("Homes not hosted on this server", len(wrong_server), uids_len)
# Print table of results
table = tables.Table()
table.addHeader(("Owner UID", "Calendar Objects"))
for uid, count in sorted(disabled, key=lambda x:x[0]):
+ record = self.directoryService().recordWithGUID(uid)
table.addRow((
- uid,
+ "%s/%s (%s)" % (record.recordType if record else "-", record.shortNames[0] if record else "-", uid,),
count,
))
self.output.write("\n")
self.output.write("Homes without an enabled directory record (total=%d):\n" % (len(disabled),))
table.printTable(os=self.output)
+ self.addToSummary("Homes without an enabled directory record", len(disabled), uids_len)
@inlineCallbacks
@@ -333,8 +351,11 @@
if self.options["verbose"]:
self.output.write("%s time: %.1fs\n" % (descriptor, time.time() - t,))
+
+ self.total = len(rows)
self.output.write("Number of events to process: %s\n" % (len(rows,)))
self.results["Number of events to process"] = len(rows)
+ self.addToSummary("Number of events to process", self.total)
# Split into organizer events and attendee events
self.organized = []
@@ -368,6 +389,9 @@
self.results["Number of organizer events to process"] = len(self.organized)
self.results["Number of attendee events to process"] = len(self.attended)
self.results["Number of skipped events"] = skipped
+ self.addToSummary("Number of organizer events to process", len(self.organized), self.total)
+ self.addToSummary("Number of attendee events to process", len(self.attended), self.total)
+ self.addToSummary("Number of skipped events", skipped, self.total)
if ical:
yield self.calendarDataCheck(rows)
@@ -516,6 +540,7 @@
count = 0
total = len(rows)
badlen = 0
+ rjust = 10
for owner, resid, uid, _ignore_md5, _ignore_organizer, _ignore_created, _ignore_modified in rows:
result, message = yield self.validCalendarData(resid)
if not result:
@@ -524,9 +549,16 @@
count += 1
if self.options["verbose"]:
if count == 1:
- self.output.write("Bad/Current/Total\n")
+ self.output.write("Bad".rjust(rjust) + "Current".rjust(rjust) + "Total".rjust(rjust) + "Complete".rjust(rjust) + "\n")
if divmod(count, 100)[1] == 0:
- self.output.write("%s/%s/%s\n" % (badlen, count, total,))
+ self.output.write((
+ "\r" +
+ ("%s" % badlen).rjust(rjust) +
+ ("%s" % count).rjust(rjust) +
+ ("%s" % total).rjust(rjust) +
+ ("%d%%" % safePercent(count, total)).rjust(rjust)
+ ).ljust(80))
+ self.output.flush()
# To avoid holding locks on all the rows scanned, commit every 100 resources
if divmod(count, 100)[1] == 0:
@@ -535,6 +567,14 @@
yield self.txn.commit()
self.txn = None
+ if self.options["verbose"]:
+ self.output.write((
+ "\r" +
+ ("%s" % badlen).rjust(rjust) +
+ ("%s" % count).rjust(rjust) +
+ ("%s" % total).rjust(rjust) +
+ ("%d%%" % safePercent(count, total)).rjust(rjust)
+ ).ljust(80) + "\n")
# Print table of results
table = tables.Table()
@@ -554,6 +594,7 @@
table.printTable(os=self.output)
self.results["Bad iCalendar data"] = results_bad
+ self.addToSummary("Bad iCalendar data", len(results_bad), total)
if self.options["verbose"]:
diff_time = time.time() - t
@@ -687,13 +728,14 @@
for ctr, organizerEvent in enumerate(self.organized):
if self.options["verbose"] and divmod(ctr, organizer_div)[1] == 0:
- self.output.write("%d of %d (%d%%) Missing: %d Mismatched: %s\n" % (
+ self.output.write(("\r%d of %d (%d%%) Missing: %d Mismatched: %s" % (
ctr+1,
organized_len,
((ctr+1) * 100 / organized_len),
len(results_missing),
len(results_mismatch),
- ))
+ )).ljust(80))
+ self.output.flush()
# To avoid holding locks on all the rows scanned, commit every 10 seconds
if time.time() - t > 10:
@@ -783,7 +825,9 @@
yield self.txn.commit()
self.txn = None
-
+ if self.options["verbose"]:
+ self.output.write("\r".ljust(80) + "\n")
+
# Print table of results
table = tables.Table()
table.addHeader(("Organizer", "Attendee", "Event UID", "Organizer RID", "Created", "Modified",))
@@ -804,7 +848,8 @@
self.output.write("\n")
self.output.write("Events missing from Attendee's calendars (total=%d):\n" % (len(results_missing),))
table.printTable(os=self.output)
-
+ self.addToSummary("Events missing from Attendee's calendars", len(results_missing), self.total)
+
# Print table of results
table = tables.Table()
table.addHeader(("Organizer", "Attendee", "Event UID", "Organizer RID", "Created", "Modified", "Attendee RID", "Created", "Modified",))
@@ -828,6 +873,7 @@
self.output.write("\n")
self.output.write("Events mismatched between Organizer's and Attendee's calendars (total=%d):\n" % (len(results_mismatch),))
table.printTable(os=self.output)
+ self.addToSummary("Events mismatched between Organizer's and Attendee's calendars", len(results_mismatch), self.total)
@inlineCallbacks
@@ -849,13 +895,14 @@
for ctr, attendeeEvent in enumerate(self.attended):
if self.options["verbose"] and divmod(ctr, attended_div)[1] == 0:
- self.output.write("%d of %d (%d%%) Missing: %d Mismatched: %s\n" % (
+ self.output.write(("\r%d of %d (%d%%) Missing: %d Mismatched: %s" % (
ctr+1,
attended_len,
((ctr+1) * 100 / attended_len),
len(missing),
len(mismatched),
- ))
+ )).ljust(80))
+ self.output.flush()
# To avoid holding locks on all the rows scanned, commit every 10 seconds
if time.time() - t > 10:
@@ -907,6 +954,8 @@
yield self.txn.commit()
self.txn = None
+ if self.options["verbose"]:
+ self.output.write("\r".ljust(80) + "\n")
# Print table of results
table = tables.Table()
@@ -932,6 +981,7 @@
self.output.write("\n")
self.output.write("Attendee events missing in Organizer's calendar (total=%d, unique=%d):\n" % (len(missing), len(unique_set),))
table.printTable(os=self.output)
+ self.addToSummary("Attendee events missing in Organizer's calendar", len(missing), self.total)
# Print table of results
table = tables.Table()
@@ -958,8 +1008,41 @@
self.output.write("\n")
self.output.write("Attendee events mismatched in Organizer's calendar (total=%d):\n" % (len(mismatched),))
table.printTable(os=self.output)
+ self.addToSummary("Attendee events mismatched in Organizer's calendar", len(mismatched), self.total)
+ def addToSummary(self, title, count, total=None):
+ if total is not None:
+ percent = safePercent(count, total),
+ else:
+ percent = ""
+ self.summary.append((title, count, percent))
+
+
+ def printSummary(self):
+ # Print summary of results
+ table = tables.Table()
+ table.addHeader(("Item", "Count", "%"))
+ table.setDefaultColumnFormats(
+ (
+ tables.Table.ColumnFormat("%s", tables.Table.ColumnFormat.LEFT_JUSTIFY),
+ tables.Table.ColumnFormat("%d", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+ tables.Table.ColumnFormat("%.1f%%", tables.Table.ColumnFormat.RIGHT_JUSTIFY),
+ )
+ )
+ for item in self.summary:
+ title, result, percent = item
+ table.addRow((
+ title,
+ result,
+ percent,
+ ))
+
+ self.output.write("\n")
+ self.output.write("Overall Summary:\n")
+ table.printTable(os=self.output)
+
+
@inlineCallbacks
def getCalendar(self, resid):
co = schema.CALENDAR_OBJECT
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120420/3122c86a/attachment-0001.html>
More information about the calendarserver-changes
mailing list