1
2
3
4
5
6
7
8
9
10
11
12
13
14 __doc__ = """ReportLoader
15 Load Zope reports into the ZODB.
16 """
17
18 import os
19 import sys
20 import re
21 import transaction
22 import logging
23 import Globals
24
25 from Products.ZenUtils.ZCmdBase import ZCmdBase
26 from Products.ZenUtils.Utils import zenPath
27 from Products.ZenModel.Report import Report
28 from Products.Zuul.utils import CatalogLoggingFilter
29
30
32
34 ZCmdBase.buildOptions(self)
35 self.parser.add_option('-f', '--force', dest='force',
36 action='store_true', default=0,
37 help="Load all reports, overwriting any existing reports.")
38 self.parser.add_option('-d', '--dir', dest='dir',
39 default="reports",
40 help="Directory from which to load reports: default '%default'")
41 self.parser.add_option('-p', '--zenpack', dest='zenpack',
42 default='',
43 help="ZenPack from which to load reports")
44
45
48
50 """
51 Load reports from the directories into the ZODB
52 """
53 repdirs = [zenPath('Products/ZenReports', self.options.dir)]
54 if self.options.zenpack:
55 repdirs = self.getZenPackDirs(self.options.zenpack)
56
57 for repdir in repdirs:
58 if os.path.isdir(repdir):
59 self.loadDirectory(repdir)
60 transaction.commit()
61
74
76 def normalize(f):
77 return f.replace("_", " ")
78 def toOrg(path):
79 path = normalize(path).split("/")
80 path = path[path.index("reports") + 1:]
81 return "/" + "/".join(path)
82 return [(toOrg(p), normalize(f[:-4]), os.path.join(p, f))
83 for p, ds, fs in os.walk(directory)
84 for f in fs
85 if f.endswith(".rpt")]
86
99
101 self.log.info("Loading reports from %s", repdir)
102
103
104 logFilter = None
105 if not getattr(self.dmd.zport, '_zencatalog_completed', False):
106 logFilter = CatalogLoggingFilter()
107 logging.getLogger('Zope.ZCatalog').addFilter(logFilter)
108 try:
109 reproot = self.dmd.Reports
110 for orgpath, fid, fullname in self.reports(repdir):
111 rorg = reproot.createOrganizer(orgpath)
112 if getattr(rorg, fid, False):
113 if self.options.force:
114 rorg._delObject(fid)
115 else:
116 continue
117 self.log.info("loading: %s/%s", orgpath, fid)
118 self.loadFile(rorg, fid, fullname)
119 finally:
120
121 if logFilter is not None:
122 logging.getLogger('Zope.ZCatalog').removeFilter(logFilter)
123
124 - def loadFile(self, root, id, fullname):
129
130
131 if __name__ == "__main__":
132 rl = ReportLoader()
133 rl.loadAllReports()
134