import logging import os import xmlrpc.client from pyramid.httpexceptions import HTTPUnauthorized from pyramid.security import forget, Authenticated from pyramid.view import view_config, forbidden_view_config log = logging.getLogger('bifrost.updater') @view_config(route_name='update', request_param='domain', renderer='json', permission=Authenticated) def update_view(request): file = request.registry.settings['biforst.file'] username = request.registry.settings['webfaction.username'] password = request.registry.settings['webfaction.password'] current_ip = request.GET.get('ip',None) if current_ip is None: current_ip = request.remote_addr domain = request.GET['domain'] db = load(file) if domain in db and db[domain] != current_ip: server = xmlrpc.client.ServerProxy('https://api.webfaction.com/') session_id, account = server.login(username, password) server.delete_dns_override(session_id, domain) server.create_dns_override(session_id, domain, current_ip, '', '', '', '') db[domain] = current_ip update(file, db) log.info('{0} updated to {1} at {3}'.format(domain, current_ip)) else: log.info('{0} not updated'.format(domain)) return {} def load(file): if not os.path.isfile(file): return {} current = {} with open(file) as f: for line in f: domain, ip = line.split(':') current[domain] = ip.rstrip('\n') return current def update(file, db): with open(file, 'w') as f: f.writelines(['{0}:{1}'.format(key, value) for key, value in db.items()]) @forbidden_view_config() def basic_challenge(request): response = HTTPUnauthorized() response.headers.update(forget(request)) return response