Source code for slam_core.producer.utils

"""
This module provide some useful tools for GitPython
"""
# As we use django model that provide objects method which is not visible by pylint, we must
# disable no-member error from pylint
# pylint: disable=E1101
from datetime import datetime
import git
from paramiko import SSHClient, AutoAddPolicy

from slam_network.models import Network
from slam_domain.models import Domain
from slam_host.models import Host
from slam_core.producer.bind import BindReverse, Bind
from slam_core.producer.isc_dhcp import IscDhcp
from slam_core.producer.freeradius import FreeRadius

PRODUCER_DIRECTORY = './build'
PRODUCER_SSH_DIR = './ssh'


[docs]def commit(): """ This method trig a git commit for DNS/DHCP and freeradius :return: """ domains = Domain.objects.all() hosts = Host.objects.all() networks = Network.objects.all() print('#### DOMAINS ####') for domain in domains: print('{} BEGIN {}'.format(domain.name, datetime.now())) domain_bind = Bind(domain, PRODUCER_DIRECTORY + '/bind') domain_bind.save() print('{} END {}'.format(domain.name, datetime.now())) for network in networks: print('#### NETWORK BIND ####') print('{} BEGIN {}'.format(network.name, datetime.now())) network_bind = BindReverse(network, PRODUCER_DIRECTORY + '/bind') network_bind.produce() print('{} END {}'.format(network.name, datetime.now())) print('#### NETWORK DHCP ####') print('{} BEGIN {}'.format(network.name, datetime.now())) network_isc_dhcp = IscDhcp(network, hosts, PRODUCER_DIRECTORY + '/isc-dhcp') network_isc_dhcp.save() print('{} END {}'.format(network.name, datetime.now())) print('#### FREERADIUS ####') print(' BEGIN {}'.format(datetime.now())) freeradius = FreeRadius(hosts, PRODUCER_DIRECTORY + '/freeradius') freeradius.save() print(' BEGIN {}'.format(datetime.now())) build_repo = git.Repo(PRODUCER_DIRECTORY) result = { 'data': build_repo.git.diff() } return result
[docs]def diff(): """ This function trig a git diff command to let user see differences before pushing data :return: """ build_repo = git.Repo(PRODUCER_DIRECTORY) result = { 'data': build_repo.git.diff() } return result
[docs]def publish(message='This is the default comment'): """ This function trig a git push command to make data available for production :return: """ servers = [] result = '' domains = Domain.objects.all() networks = Network.objects.all() for domain in domains: # We get DNS servers if domain.dns_master is not None and\ domain.dns_master not in servers: servers.append(domain.dns_master) for network in networks: # We get DNS, DHCP servers if network.dns_master is not None and\ network.dns_master not in servers: servers.append(network.dns_master) if network.dhcp is not None and\ network.dhcp not in servers: servers.append(network.dhcp) if network.radius is not None and\ network.radius not in servers: servers.append(network.radius) # We commit & push data build_repo = git.Repo(PRODUCER_DIRECTORY) build_repo.git.add('.') try: # If there are no modification, PythonGit raise a exception. build_repo.git.commit(m=message) except git.GitCommandError: pass build_repo.git.push() # We create a ssh client objects client = SSHClient() client.load_system_host_keys() client.set_missing_host_key_policy(AutoAddPolicy()) for server in servers: # And we start SLAM sync. scripts for each domains client.connect(hostname=server, username='root', key_filename='ssh/id_rsa') _, stdout, stderr = client.exec_command('/usr/local/bin/slam-agent') result += 'Reload config. on {}'.format(server) for line in stdout.readlines(): result += '{}\n'.format(line) result += 'stderr on {}'.format(server) for line in stderr.readlines(): result += '{}\n'.format(line) client.close() result_json = { 'data': result } return result_json