bifrost/bifrost/views.py

58 lines
1.8 KiB
Python

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