67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
import logging
|
|
import os
|
|
import re
|
|
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:
|
|
if 'X-Forwarded-For' in request.headers:
|
|
current_ip = request.headers['X-Forwarded-For']
|
|
else:
|
|
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}'.format(domain, current_ip))
|
|
else:
|
|
log.info('{0} not updated'.format(domain))
|
|
return {}
|
|
|
|
|
|
def load(file):
|
|
exp = re.compile(r"^([a-z.]+):([0-9]{1,3}(?:\.[0-9]{1,3}){3})$", re.I)
|
|
if not os.path.isfile(file):
|
|
return {}
|
|
|
|
current = {}
|
|
with open(file) as f:
|
|
for line in f:
|
|
match = exp.match(line)
|
|
if match:
|
|
domain, ip = match.groups()
|
|
current[domain] = ip
|
|
return current
|
|
|
|
|
|
def update(file, db):
|
|
with open(file, 'w') as f:
|
|
f.writelines(['{0}:{1}\n'.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
|