1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 __doc__='''ZenBackupBase
17
18 Common code for zenbackup.py and zenrestore.py
19 '''
20 import tempfile
21 from subprocess import Popen, PIPE
22
23 from CmdBase import CmdBase
24
25
26 BACKUP_DIR = 'zenbackup'
27 CONFIG_FILE = 'backup.settings'
28 CONFIG_SECTION = 'zenbackup'
29
31 doesLogging = False
32
33
36
38 '''
39 If --verbose then send msg to stdout
40 '''
41 if self.options.verbose:
42 print(msg)
43
44
46 """
47 Command-line options setup
48 """
49 CmdBase.buildOptions(self)
50 self.parser.add_option('-v', '--verbose',
51 dest="verbose",
52 default=False,
53 action='store_true',
54 help='Send progress messages to stdout.')
55 self.parser.add_option('--temp-dir',
56 dest="tempDir",
57 default=None,
58 help='Directory to use for temporary storage.')
59 self.parser.add_option('--host',
60 dest="host",default="localhost",
61 help="hostname of MySQL object store")
62 self.parser.add_option('--port',
63 dest="port", default='3306',
64 help="port of MySQL object store")
65 self.parser.add_option('--mysqluser', dest='mysqluser', default='zenoss',
66 help='username for MySQL object store')
67 self.parser.add_option('--mysqlpasswd', dest='mysqlpasswd', default='zenoss',
68 help='passwd for MySQL object store')
69 self.parser.add_option('--mysqldb', dest='mysqldb', default='zodb',
70 help='Name of database for MySQL object store')
71 self.parser.add_option('--cacheservers', dest='cacheservers',
72 help='memcached servers to use for object cache (eg. 127.0.0.1:11211)')
73 self.parser.add_option('--zepdbname',
74 dest='zepdbname',
75 default='zenoss_zep',
76 help='ZEP database name.'
77 ' By default this will be fetched from Zenoss'
78 ' unless --dont-fetch-args is set.'),
79 self.parser.add_option('--zepdbuser',
80 dest='zepdbuser',
81 default='zenoss',
82 help='ZEP database username.'
83 ' By default this will be fetched from Zenoss'
84 ' unless --dont-fetch-args is set.'),
85 self.parser.add_option('--zepdbpass',
86 dest='zepdbpass',
87 default='zenoss',
88 help='ZEP database password.'
89 ' By default this will be fetched from Zenoss'
90 ' unless --dont-fetch-args is set.'),
91 self.parser.add_option('--zepdbhost',
92 dest='zepdbhost',
93 default='localhost',
94 help='ZEP database server host.'
95 ' By default this will be fetched from Zenoss'
96 ' unless --dont-fetch-args is set.'),
97 self.parser.add_option('--zepdbport',
98 dest='zepdbport',
99 default='3306',
100 help='ZEP database server port number.'
101 ' By default this will be fetched from Zenoss'
102 ' unless --dont-fetch-args is set.'),
103 self.parser.add_option('--compress-transport',
104 dest="compressTransport",
105 default=True,
106 help='Compress transport for MySQL backup/restore.'
107 ' True by default, set to False to disable over'
108 ' fast links that do not benefit from compression.')
109
110
112 """
113 Return string to be used as the -p (including the "-p")
114 to MySQL commands.
115
116 @return: password and flag
117 @rtype: string
118 """
119 password = getattr(self.options, optname, None)
120 if not password:
121 return []
122 return ['-p%s' % password]
123
124
126 """
127 Return directory to be used for temporary storage
128 during backup or restore.
129
130 @return: directory name
131 @rtype: string
132 """
133 if self.options.tempDir:
134 dir = tempfile.mkdtemp('', '', self.options.tempDir)
135 else:
136 dir = tempfile.mkdtemp()
137 return dir
138
139
140 - def runCommand(self, cmd=[], obfuscated_cmd=None):
141 """
142 Execute a command and return the results, displaying pre and
143 post messages.
144
145 @parameter cmd: command to run
146 @type cmd: list
147 @return: results of the command (output, warnings, returncode)
148 """
149 if obfuscated_cmd:
150 self.log.debug(' '.join(obfuscated_cmd))
151 else:
152 self.log.debug(' '.join(cmd))
153 proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
154 output, warnings = proc.communicate()
155 if proc.returncode:
156 self.log.warn(warnings)
157 self.log.debug(output or 'No output from command')
158 return (output, warnings, proc.returncode)
159
161 """
162 Run a command that executes SQL statements in MySQL.
163 Return true if the command was able to complete, otherwise
164 (eg permissions or login error), return false.
165
166 @parameter sql: an executable SQL statement
167 @type sql: string
168 @parameter switchDB: use -D options.dbname to switch to a database?
169 @type switchDB: boolean
170 @return: boolean
171 @rtype: boolean
172 """
173 cmd = ['mysql', '-u', self.options.dbuser]
174
175 obfuscatedCmd = None
176 if self.options.dbpass:
177 cmd.append('--password=%s' % self.options.dbpass)
178
179 if self.options.dbhost and self.options.dbhost != 'localhost':
180 cmd.append('--host=%s' % self.options.dbhost)
181 if self.options.dbport and self.options.dbport != '3306':
182 cmd.append('--port=%s' % self.options.dbport)
183
184 if switchDB:
185 cmd.extend(['-D', self.options.dbname])
186
187 cmd.extend(['-e', sql])
188
189 if self.options.dbpass:
190 obfuscatedCmd = cmd[:]
191 obfuscatedCmd[3] = '--pasword=%s' % ('*' * 8)
192
193 result = self.runCommand(cmd, obfuscated_cmd=obfuscatedCmd)
194 if result[2]:
195 return False
196 return True
197