1
2
3
4
5
6
7
8
9
10
11
12 __doc__="""zenbuild
13
14 Build the zentinel portal object and the dmd database
15
16 $Id: DmdBuilder.py,v 1.11 2004/04/06 22:33:07 edahl Exp $"""
17
18 __version__ = "$Revision: 1.11 $"[11:-2]
19
20 import os
21 import Globals
22 import transaction
23 import subprocess
24 import sys
25
26 from Products.ZenUtils.Utils import zenPath
27
28 from Products.ZenUtils import Security
29 from Products.ZenUtils.CmdBase import CmdBase
30 from Products.PluggableAuthService import plugins
31
33
34 sitename = "zport"
35
37 zopeconf = zenPath("etc","zope.conf")
38 import Zope2
39 Zope2.configure(zopeconf)
40 self.app = Zope2.app()
41
43 CmdBase.buildOptions(self)
44 self.parser.add_option('--xml', dest="fromXml",
45 action='store_true', default=False,
46 help="Load data from XML files instead of SQL")
47 self.parser.add_option('-s','--evthost', dest="evthost",
48 default="127.0.0.1", help="events database hostname")
49 self.parser.add_option('-u','--evtuser', dest="evtuser", default="root",
50 help="username used to connect to the events database")
51 self.parser.add_option('-p','--evtpass', dest="evtpass", default="",
52 help="password used to connect to the events database")
53 self.parser.add_option('-d','--evtdb', dest="evtdb", default="events",
54 help="name of events database")
55 self.parser.add_option('-t','--evtport', dest="evtport",
56 type='int', default=3306,
57 help="port used to connect to the events database")
58 self.parser.add_option('--smtphost', dest="smtphost", default="localhost",
59 help="smtp host")
60 self.parser.add_option('--smtpport', dest="smtpport", default=25,
61 type='int', help="smtp port")
62
63 self.parser.add_option('--pagecommand', dest="pagecommand", default="$ZENHOME/bin/zensnpp localhost 444 $RECIPIENT",
64 help="page command")
65
66 self.parser.add_option('--amqphost', dest="amqphost", default="localhost",
67 help="AMQP Host Location")
68 self.parser.add_option('--amqpport', dest="amqpport", default=5672,
69 type='int', help="AMQP Server Port")
70 self.parser.add_option('--amqpvhost', dest="amqpvhost", default="/zenoss",
71 help="Default Virtual Host")
72 self.parser.add_option('--amqpuser', dest="amqpuser", default="zenoss",
73 help="AMQP User Name")
74 self.parser.add_option('--amqppassword', dest="amqppassword", default="zenoss",
75 help="AMQP Password")
76
77 from zope.component import getUtility
78 from Products.ZenUtils.ZodbFactory import IZodbFactoryLookup
79 connectionFactory = getUtility(IZodbFactoryLookup).get()
80 connectionFactory.buildOptions(self.parser)
81 self.connectionFactory = connectionFactory
82
83
85 """
86 Used to connect to ZODB (without going through the entire ZOPE
87 initialization process. This allows us to get a lightweight
88 connection to the database to test to see if the database is already
89 initialized.
90 """
91 from zope.component import getUtility
92 from Products.ZenUtils.ZodbFactory import IZodbFactoryLookup
93 connectionFactory = getUtility(IZodbFactoryLookup).get()
94 self.db, self.storage = connectionFactory.getConnection(**self.options.__dict__)
95
97 self.db = None
98 self.storage = None
99
100 conn = None
101 try:
102 self.zodbConnect()
103 conn = self.db.open()
104 root = conn.root()
105 app = root.get('Application')
106 if app and getattr(app, self.sitename, None) is not None:
107 print "zport portal object exists; exiting."
108 return
109 except self.connectionFactory.exceptions.OperationalError as e:
110 print "zenbuild: Database does not exists."
111 sys.exit(1)
112 finally:
113 if conn:
114 conn.close()
115 if self.db:
116 self.db.close()
117 self.db = None
118 if self.storage:
119 self.storage.close()
120 self.storage = None
121
122
123 if self.options.fromXml:
124 self.connect()
125 from Products.ZenModel.ZentinelPortal import manage_addZentinelPortal
126 manage_addZentinelPortal(self.app, self.sitename)
127 site = self.app._getOb(self.sitename)
128
129
130 if self.app.hasObject('index_html'):
131 self.app._delObject('index_html')
132 from Products.PythonScripts.PythonScript import manage_addPythonScript
133 manage_addPythonScript(self.app, 'index_html')
134 newIndexHtml = self.app._getOb('index_html')
135 text = 'container.REQUEST.RESPONSE.redirect("/zport/dmd/")\n'
136 newIndexHtml.ZPythonScript_edit('', text)
137
138
139 if self.app.hasObject('standard_error_message'):
140 self.app._delObject('standard_error_message')
141 file = open(zenPath('Products/ZenModel/dtml/standard_error_message.dtml'))
142 try:
143 text = file.read()
144 finally:
145 file.close()
146 import OFS.DTMLMethod
147 OFS.DTMLMethod.addDTMLMethod(self.app, id='standard_error_message',
148 file=text)
149
150
151
152 Security.replaceACLWithPAS(self.app, deleteBackup=True)
153
154
155 acl = site.acl_users
156 if not hasattr(acl, 'groupManager'):
157 plugins.ZODBGroupManager.addZODBGroupManager(acl, 'groupManager')
158 acl.groupManager.manage_activateInterfaces(['IGroupsPlugin',])
159
160 trans = transaction.get()
161 trans.note("Initial ZentinelPortal load by zenbuild.py")
162 trans.commit()
163 print "ZentinelPortal loaded at %s" % self.sitename
164
165
166 from Products.ZenModel.DmdBuilder import DmdBuilder
167 dmdBuilder = DmdBuilder(site,
168 self.options.evthost,
169 self.options.evtuser,
170 self.options.evtpass,
171 self.options.evtdb,
172 self.options.evtport,
173 self.options.smtphost,
174 self.options.smtpport,
175 self.options.pagecommand)
176 dmdBuilder.build()
177 transaction.commit()
178
179
180 from Products.ZenModel.XmlDataLoader import XmlDataLoader
181 dl = XmlDataLoader(noopts=True, app=self.app)
182 dl.loadDatabase()
183
184 else:
185
186 cmd = "gunzip -c %s | %s --usedb=zodb" % (
187 zenPath("Products/ZenModel/data/zodb.sql.gz"),
188 zenPath("Products/ZenUtils/ZenDB.py"),
189 )
190 returncode = os.system(cmd)
191 if returncode:
192 print >> sys.stderr, "There was a problem creating the database from the sql dump."
193 sys.exit(1)
194
195
196
197
198
199 if self.options.zodb_cacheservers:
200 self.flush_memcached(self.options.zodb_cacheservers.split())
201
202 self.connect()
203
204
205 site = getattr(self.app, self.sitename, None)
206 site.dmd.smtpHost = self.options.smtphost
207 site.dmd.smtpPort = self.options.smtpport
208 site.dmd.pageCommand = self.options.pagecommand
209 site.dmd.uuid = None
210 site.dmd._rq = False
211 for evmgr in (site.dmd.ZenEventManager, site.dmd.ZenEventHistory):
212 evmgr.username = self.options.evtuser
213 evmgr.password = self.options.evtpass
214 evmgr.database = self.options.evtdb
215 evmgr.host = self.options.evthost
216 evmgr.port = self.options.evtport
217 transaction.commit()
218
219
220 from Products.ZenReports.ReportLoader import ReportLoader
221 rl = ReportLoader(noopts=True, app=self.app)
222 rl.loadDatabase()
223
225 import memcache
226 mc = memcache.Client(cacheservers, debug=0)
227 mc.flush_all()
228 mc.disconnect_all()
229
230 if __name__ == "__main__":
231 zb = zenbuild(args=sys.argv)
232 zb.build()
233