Package webf :: Module webflib
[hide private]
[frames] | no frames]

Source Code for Module webf.webflib

  1   
  2  # pylint: disable-msg=R0913,W0511,E1103 
  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   
24 -class WebFactionXmlRpc(object):
25 26 '''WebFaction XML-RPC server proxy class''' 27
28 - def __init__(self, login=True):
29 self.log = logging.getLogger('webf') 30 self.session_id = None 31 self.server = None 32 if login: 33 self.login()
34
35 - def get_config(self):
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
48 - def login(self):
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
81 - def delete_app(self, app_name):
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
93 - def delete_db(self, name, db_type):
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 #XXX: Validate db_type 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 #XXX: Validate db_type 133 #XXX: Use interactive method to get password? 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
146 - def create_cronjob(self, line):
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
167 - def delete_cronjob(self, line):
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 # pylint: disable-msg=C0103
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 #XXX: Limitation of only one site_app 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
276 - def delete_email(self, email_address):
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
339 - def delete_mailbox(self, mailbox):
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
360 - def set_apache_acl(self, paths, permission='rwx', recursive=False):
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
389 - def system(self, cmd):
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