forked from nexcess/python-r1soft
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcdp-enable-db-plugin.py
More file actions
122 lines (109 loc) · 4.84 KB
/
cdp-enable-db-plugin.py
File metadata and controls
122 lines (109 loc) · 4.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env
#!/usr/bin/env python
import suds.client
import logging
logger = logging.getLogger('cdp-add-agent')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.INFO)
logger.propagate = False
class MetaClient(object):
def __init__(self, url_base, **kwargs):
self.__url_base = url_base
self.__init_args = kwargs
self.__clients = dict()
def __getattr__(self, name):
c = self.__clients.get(name, None)
logger.debug('Accessing SOAP client: %s' % name)
if c is None:
logger.debug('Client doesn\'t exist, creating: %s' % name)
c = suds.client.Client(self.__url_base % name, **self.__init_args)
self.__clients[name] = c
return c
def get_wsdl_url(hostname, namespace, use_ssl=True, port_override=None):
if use_ssl:
proto = 'https'
else:
proto = 'http'
if port_override is None:
if use_ssl:
port = 9443
else:
port = 9080
else:
port = port_override
url = '%s://%s:%d/%s?wsdl' % (proto, hostname, port, namespace)
logging.debug('Creating WSDL URL: %s' % url)
return url
if __name__ == '__main__':
import sys
import re
try:
cdphost = sys.argv[1]
cdpuser, cdppass = sys.argv[2].split(':')
sqluser, sqlpass = sys.argv[3].split(':')
except IndexError:
logger.error('Usage: %s <r1soft host> <CDP user>:<CDP pass> <MySQL user>:<MySQL pass>')
sys.exit(1)
logger.info('Using CDP host: %s', cdphost)
logger.info('Using CDP credentials: %s / %s', cdpuser, cdppass)
logger.info('Using SQL credentials: %s / %s', sqluser, sqlpass)
client = MetaClient(get_wsdl_url(cdphost, '%s'),
username=cdpuser, password=cdppass)
db_cand_pattern = re.compile('(?:mce\d+|[\w\d]{2,3})-db|(?:obp|sip)(?:uk)?[456]-\d+|sip4[a-z]-db')
logger.info('Getting list of agents')
agents = client.Agent.service.getAgents()
logger.info('Getting list of disk safes')
disksafes = client.DiskSafe.service.getDiskSafes()
logger.info('Getting list of policies')
policies = client.Policy2.service.getPolicies()
for agent in agents:
logger.info('> Considering agent %s (%s)', agent.hostname, agent.description)
if db_cand_pattern.match(agent.hostname) or \
db_cand_pattern.match(agent.description):
logger.info('=> Agent looks like a good candidate for db plugin: %s',
agent.hostname)
if agent.databaseAddOnEnabled:
logger.info('==> Agent already has db plugin enabled')
else:
logger.info('==> Enabling db plugin for agent')
agent.databaseAddOnEnabled = True
try:
client.Agent.service.updateAgent(agent)
except suds.WebFault as e:
logger.error('Caught error from web service: %s', e.message)
logger.debug('*** Enabled db plugin ***')
logger.debug('=> Finding disksafes for agent')
agent_ds = [d for d in disksafes if d.agentID == agent.id]
logger.debug('=> Found %d disksafe(s)', len(agent_ds))
logger.debug('=> Finding policy for agent')
try:
policy = [p for p in policies if hasattr(p, 'diskSafeID') and p.diskSafeID in [d.id for d in agent_ds]][0]
except IndexError as e:
logger.error('=> Couldn\'t determine policy for disk safe')
continue
logger.debug('=> Found policy %s (%s)', policy.name, policy.id)
try:
dbi_count = len(policy.databaseInstanceList)
except AttributeError as e:
#logger.warn('!! Does not look like agent has db plugin enabled: %s !!', e)
dbi_count = 0
if dbi_count > 0:
logger.info('==> Policy already has %d database instances',
len(policy.databaseInstanceList))
else:
logger.info('==> Policy has no database instances, creating one')
dbi = client.Policy2.factory.create('databaseInstance')
dbi.dataBaseType = client.Policy2.factory.create('dataBaseType').MYSQL
dbi.enabled = True
dbi.hostName = '127.0.0.1'
dbi.name = 'default'
dbi.username = sqluser
dbi.password = sqlpass
dbi.portNumber = 3306
dbi.useAlternateDataDirectory = False
dbi.useAlternateHostname = True
dbi.useAlternateInstallDirectory = False
policy.databaseInstanceList = [dbi]
logger.debug('==> Adding database instance to policy')
client.Policy2.service.updatePolicy(policy=policy)
logger.debug('*** Added database instance to policy ***')