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