1
2
3
4 '''
5
6 webflib
7 =======
8
9 WebFaction XML-RPC API library
10
11 '''
12
13 import sys
14 import xmlrpclib
15 import logging
16 import os.path
17
18 from configobj import ConfigObj
19
20
21 API_URL = 'https://api.webfaction.com/'
22 CONF = os.path.expanduser('~/.webfrc')
23
25
26 '''WebFaction XML-RPC server proxy class'''
27
29 self.log = logging.getLogger('webf')
30 self.session_id = None
31 self.server = None
32 if login:
33 self.login()
34
36 '''Get configuration file from user's directory'''
37 if not os.path.exists(CONF):
38 self.log.error("Set your username/password in %s" % CONF)
39 self.log.error("The format is:")
40 self.log.error(" username=<username>")
41 self.log.error(" password=<password>")
42 sys.exit(1)
43 config = ConfigObj(CONF)
44 username = config['username']
45 password = config['password']
46 return (username, password)
47
49 '''Login to WebFaction and get a session_id'''
50 try:
51 http_proxy = os.environ['http_proxy']
52 except KeyError:
53 http_proxy = None
54 username, password = self.get_config()
55 self.server = xmlrpclib.Server(API_URL, transport=http_proxy)
56 self.session_id, account = self.server.login(username, password)
57 self.log.debug("self.session_id %s account %s" % (self.session_id,
58 account))
59
60 - def create_app(self, app_name, app_type, autostart, extra_info):
61 '''Create new application'''
62 if autostart.lower() == 'true':
63 autostart = True
64 else:
65 autostart = False
66 if extra_info.lower() == 'none':
67 extra_info = ''
68 try:
69 result = self.server.create_app(
70 self.session_id,
71 app_name,
72 app_type,
73 autostart,
74 extra_info
75 )
76 self.log.debug(result)
77 except xmlrpclib.Fault, errmsg:
78 self.log.error(errmsg)
79 return 1
80
82 '''Create new application'''
83 try:
84 result = self.server.delete_app(
85 self.session_id,
86 app_name
87 )
88 self.log.debug(result)
89 except xmlrpclib.Fault, errmsg:
90 self.log.error(errmsg)
91 return 1
92
94 '''
95 Delete database
96
97 @param name: name of database
98 @type name: string
99
100 @param db_type: mysql or postgres
101 @type db_type: string
102 '''
103
104 try:
105 result = self.server.delete_db(
106 self.session_id,
107 name,
108 db_type
109 )
110 self.log.debug(result)
111 except xmlrpclib.Fault, errmsg:
112 self.log.error(errmsg)
113 return 1
114
115 - def create_db(self, name, db_type, password):
116 '''
117 Create database
118
119 @param name: name of database
120 @type name: string
121
122 @param db_type: mysql or postgres
123 @type db_type: string
124
125 @param password: password
126 @type password: string
127
128 @returns: Nothing
129 @rtype: None on success or 1 on failure
130
131 '''
132
133
134 try:
135 result = self.server.create_db(
136 self.session_id,
137 name,
138 db_type,
139 password
140 )
141 self.log.debug(result)
142 except xmlrpclib.Fault, errmsg:
143 self.log.error(errmsg)
144 return 1
145
147 '''
148 Create a cronjob
149
150 @param line: A line you want in your cronjob
151 @type line: string
152
153 @returns: Nothing
154 @rtype: None on success or 1 on failure
155
156 '''
157 try:
158 result = self.server.create_cronjob(
159 self.session_id,
160 line
161 )
162 self.log.debug(result)
163 except xmlrpclib.Fault, errmsg:
164 self.log.error(errmsg)
165 return 1
166
168 '''
169 Delete a cronjob
170
171 @param line: A line you want removed from your cronjob
172 @type line: string
173
174 @returns: Nothing
175 @rtype: None on success or 1 on failure
176
177 '''
178 try:
179 result = self.server.delete_cronjob(
180 self.session_id,
181 line
182 )
183 self.log.debug(result)
184 except xmlrpclib.Fault, errmsg:
185 self.log.error(errmsg)
186 return 1
187
188
189 - def create_website(self, website_name, ip, https, subdomains, site_apps):
190 '''
191 Create a website
192
193 @param website_name: Name of website
194 @type website_name: string
195
196 @param ip: IP Address
197 @type ip: string
198
199 @param https: Use https protocol
200 @type https: boolean
201
202 @param subdomains: List of subdomains for this website
203 @type subdomains: list
204
205 @param site_apps:
206 @type site_apps: list
207
208 @returns: Nothing
209 @rtype: None on success or 1 on failure
210
211 '''
212 if https.lower() == 'true':
213 https = True
214 else:
215 https = False
216 subdomains = subdomains.split(',')
217 print subdomains
218
219 site_apps = site_apps.split(',')
220 print site_apps
221 try:
222 result = self.server.create_website(
223 self.session_id,
224 website_name,
225 ip,
226 https,
227 subdomains,
228 site_apps
229 )
230 self.log.debug(result)
231 except xmlrpclib.Fault, errmsg:
232 self.log.error(errmsg)
233 return 1
234
235 - def create_email(self, email_address, targets, autoresponder_on=False,
236 autoresponder_subject='', autoresponder_message='',
237 autoresponder_from=''):
238 '''
239 Create an email address for a mailbox
240
241 @param email_address:
242 @type email_address: string
243
244 @param targets: mailbox names
245 @type targets: string
246
247 @returns: Success code
248 @rtype: None on success or 1 on failure
249
250 '''
251 if autoresponder_on.lower() == 'true':
252 autoresponder_on = True
253 else:
254 autoresponder_on = False
255 if autoresponder_subject.lower() == 'none':
256 autoresponder_subject = ''
257 if autoresponder_message.lower() == 'none':
258 autoresponder_message = ''
259 if autoresponder_from.lower() == 'none':
260 autoresponder_from = ''
261 try:
262 result = self.server.create_email(
263 self.session_id,
264 email_address,
265 targets,
266 autoresponder_on,
267 autoresponder_subject,
268 autoresponder_message,
269 autoresponder_from,
270 )
271 self.log.debug(result)
272 except xmlrpclib.Fault, errmsg:
273 self.log.error(errmsg)
274 return 1
275
277 '''
278 Delete an email address
279
280 @param email_address: An email address you want removed from a mailbox
281 @type email_address: string
282
283 @returns: Success code
284 @rtype: None on success or 1 on failure
285
286 '''
287 try:
288 result = self.server.delete_email(
289 self.session_id,
290 email_address
291 )
292 self.log.debug(result)
293 except xmlrpclib.Fault, errmsg:
294 self.log.error(errmsg)
295 return 1
296
297 - def create_mailbox(self, mailbox, enable_spam_protection=True, share=False,
298 spam_to_learn_folder='spam_to_learn',
299 ham_to_learn_folder='ham_to_learn'):
300 '''
301 Delete a mailbox
302
303 @param mailbox: Mailbox name you want to create
304 @type mailbox: string
305
306 @param enable_spam_protection: Use WebFaction's spam filtering
307 @type enable_spam_protection: boolean
308
309 @param share: Unknown
310 @type share: boolean
311
312 @returns: Success code
313 @rtype: None on success or 1 on failure
314
315 '''
316 if enable_spam_protection.lower() == 'true':
317 enable_spam_protection = True
318 elif enable_spam_protection.lower() == 'false':
319 enable_spam_protection = False
320 else:
321 self.log.error(\
322 "Error: enable_spam_protection must be True or False")
323 return 1
324 try:
325 result = self.server.create_mailbox(
326 self.session_id,
327 mailbox,
328 enable_spam_protection,
329 share,
330 spam_to_learn_folder,
331 ham_to_learn_folder
332 )
333 self.log.debug(result)
334 print "Password for the new mailbox is: %s" % result['password']
335 except xmlrpclib.Fault, errmsg:
336 self.log.error(errmsg)
337 return 1
338
340 '''
341 Delete a mailbox
342
343 @param mailbox: A mailbox name you wanted deleted
344 @type mailbox: string
345
346 @returns: Success code
347 @rtype: None on success or 1 on failure
348
349 '''
350 try:
351 result = self.server.delete_mailbox(
352 self.session_id,
353 mailbox
354 )
355 self.log.debug(result)
356 except xmlrpclib.Fault, errmsg:
357 self.log.error(errmsg)
358 return 1
359
361 '''
362 Set Apache ACL
363
364 @param paths:
365 @type paths: string
366
367 @param permission: Unix file permissions
368 @type permission: string
369
370 @param recursive: Recurse sub-directories
371 @type recursive: boolean
372
373 @returns: Success code
374 @rtype: None on success or 1 on failure
375
376 '''
377 try:
378 result = self.server.set_apache_acl(
379 self.session_id,
380 paths,
381 permission,
382 recursive,
383 )
384 self.log.debug(result)
385 except xmlrpclib.Fault, errmsg:
386 self.log.error(errmsg)
387 return 1
388
390 '''
391 Runs a Linux command in your homedir and prints the result
392
393 @param cmd: Command you want to run
394 @type cmd: string
395
396 @returns: Success code
397 @rtype: None on success or 1 on failure
398
399 '''
400 try:
401 result = self.server.system(
402 self.session_id,
403 cmd
404 )
405 print result
406 except xmlrpclib.Fault, errmsg:
407 self.log.error(errmsg)
408 return 1
409