1
2
3
4
5
6
7
8
9
10
11
12
13
14 __doc__="""ZenScriptBase
15 """
16
17 from AccessControl.SecurityManagement import newSecurityManager
18 from AccessControl.SecurityManagement import noSecurityManager
19 from transaction import commit
20 from Utils import getObjByPath, zenPath, set_context
21 from Products.ZenUtils.CmdBase import CmdBase
22 from Products.ZenUtils.ZCmdBase import ZCmdBase
23
24 from Products.Five import zcml
25
26 from Products.ZenRelations.ZenPropertyManager import setDescriptors
27 from Exceptions import ZentinelException
28
29 defaultCacheDir = zenPath('var')
30
32
34
35 - def __init__(self, noopts=0, app=None, connect=False):
36 import Products.ZenossStartup
37 zcml.load_site()
38 CmdBase.__init__(self, noopts)
39 self.dataroot = None
40 self.app = app
41 self.db = None
42 if connect:
43 self.connect()
44
46 if not self.app:
47 self.options.port = self.options.port or 3306
48 from relstorage.storage import RelStorage
49 from relstorage.adapters.mysql import MySQLAdapter
50 connectionParams = {
51 'host' : self.options.host,
52 'port' : self.options.port,
53 'user' : self.options.mysqluser,
54 'passwd' : self.options.mysqlpasswd,
55 'db' : self.options.mysqldb,
56 }
57 if getattr(self.options, 'mysqlsocket', None) and self.options.mysqlsocket != 'None':
58 connectionParams['unix_socket'] = self.options.mysqlsocket
59
60 kwargs = {
61 'cache_module_name':'memcache',
62 'keep_history': False,
63 }
64 from relstorage.options import Options
65 adapter = MySQLAdapter(options=Options(**kwargs), **connectionParams)
66
67 if self.options.cacheservers:
68 kwargs['cache_servers'] = self.options.cacheservers
69 self.storage = RelStorage(adapter, **kwargs)
70 from ZODB import DB
71 self.db = DB(self.storage, cache_size=self.options.cachesize)
72 self.getDataRoot()
73 self.login()
74 if getattr(self.dmd, 'propertyTransformers', None) is None:
75 self.dmd.propertyTransformers = {}
76 commit()
77 setDescriptors(self.dmd.propertyTransformers)
78
79
80 - def login(self, name='admin', userfolder=None):
81 '''Logs in.'''
82 if userfolder is None:
83 userfolder = self.app.acl_users
84 user = userfolder.getUserById(name)
85 if user is None: return
86 if not hasattr(user, 'aq_base'):
87 user = user.__of__(userfolder)
88 newSecurityManager(None, user)
89
90
92 '''Logs out.'''
93 noSecurityManager()
94
95
97 """Return a wrapped app connection from the connection pool.
98 """
99 if not self.db:
100 raise ZentinelException(
101 "running inside zope can't open connections.")
102 with self.poollock:
103 connection=self.db.open()
104 root=connection.root()
105 app=root['Application']
106 app = set_context(app)
107 app._p_jar.sync()
108 return app
109
110
112 """Close all connections in both free an inuse pools.
113 """
114 self.db.close()
115
116
118 if self.app: return
119 self.connection=self.db.open()
120 root=self.connection.root()
121 app = root['Application']
122 self.app = set_context(app)
123 self.app._p_jar.sync()
124
125
127 self.connection.sync()
128
129
131 self.connection.close()
132
133 self.app = None
134 self.dataroot = None
135 self.dmd = None
136
137
139 if not self.app: self.opendb()
140 if not self.dataroot:
141 self.dataroot = getObjByPath(self.app, self.options.dataroot)
142 self.dmd = self.dataroot
143
144
146 """return an object based on a path starting from the dmd"""
147 return getObjByPath(self.app, self.options.dataroot+path)
148
149
151 """return a device based on its FQDN"""
152 devices = self.dataroot.getDmdRoot("Devices")
153 return devices.findDevice(name)
154
155
157 """basic options setup sub classes can add more options here"""
158 CmdBase.buildOptions(self)
159 self.parser.add_option('-R', '--dataroot',
160 dest="dataroot",
161 default="/zport/dmd",
162 help="root object for data load (i.e. /zport/dmd)")
163 self.parser.add_option('--cachesize',
164 dest="cachesize",default=1000, type='int',
165 help="in memory cachesize default: 1000")
166 self.parser.add_option('--host',
167 dest="host",default="localhost",
168 help="hostname of MySQL object store")
169 self.parser.add_option('--port',
170 dest="port", type="int", default=3306,
171 help="port of MySQL object store")
172 self.parser.add_option('--mysqluser', dest='mysqluser', default='zenoss',
173 help='username for MySQL object store')
174 self.parser.add_option('--mysqlpasswd', dest='mysqlpasswd', default='zenoss',
175 help='passwd for MySQL object store')
176 self.parser.add_option('--mysqldb', dest='mysqldb', default='zodb',
177 help='Name of database for MySQL object store')
178 self.parser.add_option('--mysqlsocket', dest='mysqlsocket', default=None,
179 help='Name of socket file for MySQL server connection')
180 self.parser.add_option('--cacheservers', dest='cacheservers', default="",
181 help='memcached servers to use for object cache (eg. 127.0.0.1:11211)')
182