initial project scaffolding
parent
51446bb00b
commit
428af26881
|
@ -0,0 +1,58 @@
|
|||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
env/
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
#lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.coverage
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# vim
|
||||
[._]*.s[a-w][a-z]
|
||||
[._]s[a-w][a-z]
|
|
@ -0,0 +1,10 @@
|
|||
# OneDNS
|
||||
Dyanmic DNS for OpenNebula
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
$ docker-compose -f one-dns.yaml up
|
||||
$ python setup.py install
|
||||
$ onedns --etcd-host=http://localhost:2379 --client-cert /path/to/ssl/cert
|
||||
```
|
|
@ -0,0 +1,29 @@
|
|||
import argparse
|
||||
|
||||
from onedns import monitor
|
||||
from onedns import logger
|
||||
|
||||
|
||||
def main():
|
||||
logger.configure_onedns_logging()
|
||||
parser = argparse.ArgumentParser(description='OneDNS - Dynamic DNS for OpenNebula')
|
||||
parser.add_argument('--one-address', required=False,
|
||||
help='ONE controller host address')
|
||||
parser.add_argument('--one-secret', required=False,
|
||||
help='ONE credentials to use (e.g. user:key)')
|
||||
parser.add_argument('--one-proxy', required=False,
|
||||
help='proxy host to use to connect to ONE controller')
|
||||
parser.add_argument('--etcd-host', required=False,
|
||||
help='etcd host to connect to')
|
||||
parser.add_argument('--etcd-port', required=False, type=int, default=4001,
|
||||
help='etcd port to connect to')
|
||||
parser.add_argument('--etcd-cert', required=False, type=int,
|
||||
help='path to etcd client ssl cert')
|
||||
args = parser.parse_args()
|
||||
args_dict = vars(args)
|
||||
one_args = dict((i.replace('one_', ''), args_dict[i]) for i in args_dict.keys() if
|
||||
i.startswith('one_'))
|
||||
etcd_args = dict((i.replace('etcd_', ''), args_dict[i]) for i in args_dict.keys() if
|
||||
i.startswith('etcd_'))
|
||||
mon = monitor.OneMonitor(one_kwargs=one_args, etcd_kwargs=etcd_args)
|
||||
mon.run()
|
|
@ -0,0 +1,24 @@
|
|||
import re
|
||||
import subprocess
|
||||
from collections import namedtuple
|
||||
|
||||
import oca
|
||||
|
||||
RE_VALIDNAME = re.compile('[^\w\d.-]')
|
||||
|
||||
|
||||
VM = namedtuple('VM', 'id, name, running, addr')
|
||||
|
||||
|
||||
class OneClient(object):
|
||||
"""
|
||||
OpenNebula Python client
|
||||
"""
|
||||
def __init__(self, secret=None, address=None, proxy=None):
|
||||
self._oca = oca.Client(secret=secret, address=address, proxy=proxy)
|
||||
self._vm_pool = oca.VirtualMachinePool(self._oca)
|
||||
|
||||
def vms(self):
|
||||
#self._vm_pool.info(filter=-1)
|
||||
self._vm_pool.info()
|
||||
return self._vm_pool
|
|
@ -0,0 +1,11 @@
|
|||
import etcd
|
||||
|
||||
from onedns.logger import log
|
||||
|
||||
|
||||
class SkyDNSClient(object):
|
||||
def __init__(self, etcd_kwargs={}):
|
||||
self._etcd = etcd.Client(**etcd_kwargs)
|
||||
|
||||
def register(self, vm):
|
||||
log.info("Registering VM: {vm}".format(vm=vm))
|
|
@ -0,0 +1,47 @@
|
|||
import os
|
||||
import logging
|
||||
import logging.handlers
|
||||
|
||||
|
||||
LOG_FORMAT = ("%(asctime)s %(filename)s:%(lineno)d - %(levelname)s - "
|
||||
"%(message)s")
|
||||
|
||||
|
||||
class NullHandler(logging.Handler):
|
||||
def emit(self, record):
|
||||
pass
|
||||
|
||||
|
||||
def get_onedns_logger():
|
||||
log = logging.getLogger('onedns')
|
||||
log.addHandler(NullHandler())
|
||||
return log
|
||||
|
||||
|
||||
log = get_onedns_logger()
|
||||
console = logging.StreamHandler()
|
||||
formatter = logging.Formatter(LOG_FORMAT)
|
||||
console.setFormatter(formatter)
|
||||
|
||||
|
||||
def configure_onedns_logging(use_syslog=False, syslog_device='/dev/log'):
|
||||
"""
|
||||
Configure logging for onedns *application* code
|
||||
|
||||
By default onedns's logger has no formatters and a NullHandler so that
|
||||
other developers using onedns as a library can configure logging as
|
||||
they see fit. This method is used in onedns's application code (i.e.
|
||||
the 'onedns' command) to toggle onedns's application specific
|
||||
formatters/handlers
|
||||
|
||||
use_syslog - enable logging all messages to syslog. currently only works if
|
||||
/dev/log exists on the system (standard for most Linux distros)
|
||||
"""
|
||||
log.setLevel(logging.DEBUG)
|
||||
console.setLevel(logging.INFO)
|
||||
log.addHandler(console)
|
||||
if use_syslog and os.path.exists(syslog_device):
|
||||
log.debug("Logging to %s" % syslog_device)
|
||||
syslog_handler = logging.handlers.SysLogHandler(address=syslog_device)
|
||||
syslog_handler.setLevel(logging.DEBUG)
|
||||
log.addHandler(syslog_handler)
|
|
@ -0,0 +1,24 @@
|
|||
import time
|
||||
|
||||
from onedns.clients import one
|
||||
from onedns.clients import skydns
|
||||
|
||||
|
||||
class OneMonitor(object):
|
||||
'''
|
||||
Reads events from OpenNebula and activates/deactivates VM domain names
|
||||
'''
|
||||
|
||||
def __init__(self, one_kwargs={}, etcd_kwargs={}):
|
||||
self._one = one.OneClient(**one_kwargs)
|
||||
self._skydns = skydns.SkyDNSClient(etcd_kwargs=etcd_kwargs)
|
||||
|
||||
def update(self):
|
||||
for vm in self._one.vms():
|
||||
if hasattr(vm.template, 'nics'):
|
||||
self._skydns.register(vm)
|
||||
|
||||
def run(self, interval=10):
|
||||
while True:
|
||||
self.update()
|
||||
time.sleep(interval)
|
|
@ -0,0 +1,2 @@
|
|||
oca==4.10.0
|
||||
python-etcd==0.4.3
|
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env python
|
||||
import os
|
||||
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
VERSION = 0.1
|
||||
version = os.path.join('onedns', '__init__.py')
|
||||
execfile(version)
|
||||
|
||||
README = open('README.md').read()
|
||||
|
||||
setup(
|
||||
name='onedns',
|
||||
version=VERSION,
|
||||
packages=find_packages(),
|
||||
author='Justin Riley',
|
||||
author_email='justin.t.riley@gmail.com',
|
||||
url="https://github.com/fasrc/onedns",
|
||||
description="Dynamic DNS for OpenNebula",
|
||||
long_description=README,
|
||||
install_requires=[
|
||||
"oca>=4.10.0",
|
||||
"python-etcd>=0.4.3",
|
||||
],
|
||||
entry_points=dict(console_scripts=['onedns = onedns.cli:main']),
|
||||
zip_safe=False
|
||||
)
|
Loading…
Reference in New Issue