aboutsummaryrefslogtreecommitdiff
path: root/portal-gui/rpkigui/myrpki/glue.py
blob: bd234c26f67d6e6733e7279c400590de74686760 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# $Id$

from __future__ import with_statement

import os
import os.path
import csv

from django.conf import settings
from django.db.models import F

import rpki
import rpki.config

from rpkigui.myrpki import models

#def form_to_conf(data):
#    """Write out a myrpki.conf based on the given form data."""
#    handle = data['handle']
#    confdir = settings.MYRPKI_DATA_DIR + '/' + handle
#    if os.path.exists(confdir):
#        raise RuntimeError, '%s: directory already exists!' % (confdir, )
#    os.makedirs(confdir)
#    template = open(settings.MYRPKI_DATA_DIR + '/examples/myrpki.conf', 'r').read()
#    # stuff the appropriate output directory into the dict
#    data['MYRPKI_DATA_DIR'] = confdir
#    with open(confdir + '/myrpki.conf', 'w') as conf:
#        print >>conf, template % data
#    invoke_rpki(handle, ['initialize'])

def invoke_rpki(handle, args):
    """Invoke the myrpki cli for the specified configuration."""
    config = settings.MYRPKI_DATA_DIR + '/' + handle + '/myrpki.conf'
    # default myrpki.conf uses relative paths, so chdir() to the repo first
    os.chdir(settings.MYRPKI_DATA_DIR + '/' + handle)
    cmd = 'python ' + settings.MYRPKI_PATH + ' '.join(['--config=' + config] + args)
    print 'invoking', cmd
    os.system(cmd)

def read_identity(handle):
    fname = settings.MYRPKI_DATA_DIR + '/' + handle + '/entitydb/identity.xml'
    with open(fname, 'r') as fp:
        data = fp.read()
    return data

def read_child_response(handle, child):
    fname = '%s/%s/entitydb/children/%s.xml' % (settings.MYRPKI_DATA_DIR, handle, child)
    with open(fname, 'r') as fp:
        data = fp.read()
    return data

# FIXME - remove this once rpki.myrpki.csv_writer is an object with a
# .file field
def csv_writer(f):
  return csv.writer(f, dialect = csv.get_dialect("excel-tab"))

def output_asns(path, handle):
    '''Write out csv file containing asns delegated to my children.'''
    qs = models.Asn.objects.filter(lo=F('hi'), allocated__in=handle.children.all())
    with open(path, 'w') as f:
        w = csv_writer(f)
        w.writerows([asn.allocated.handle, asn.lo] for asn in qs)

def output_prefixes(path, handle):
    '''Write out csv file containing prefixes delegated to my children.'''
    qs = models.AddressRange.objects.filter(allocated__in=handle.children.all())
    with open(path, 'w') as f:
        w = csv_writer(f)
        w.writerows([p.allocated.handle, p.as_resource_range()] for p in qs)

def output_roas(path, handle):
    '''Write out csv file containing my roas.'''
    qs = models.RoaRequest.objects.filter(roa__in=handle.roas.all())
    with open(path, 'w') as f:
        w = csv_writer(f)
        w.writerows([req.as_roa_prefix(), req.roa.asn,
            '%s-group-%d' % (handle.handle, req.roa.pk)] for req in qs)

def configure_resources(handle):
    '''Write out the csv files and invoke the myrpki.py command line tool.'''
    # chdir to the repo dir since the default myrpki.conf uses relative
    # pathnames..
    os.chdir(settings.MYRPKI_DATA_DIR + '/' + handle.handle)
    cfg = rpki.config.parser('myrpki.conf', 'myrpki')
    output_asns(cfg.get('asn_csv'), handle)
    output_prefixes(cfg.get('prefix_csv'), handle)
    output_roas(cfg.get('roa_csv'), handle)
    run_rpkid = cfg.getboolean('run_rpkid')
    cmd = 'daemons' if run_rpkid else 'resources'
    invoke_rpki(handle.handle, ['configure_' + cmd])
    # handle the hosted case where some communication between rpkid operator
    # and resource holder is required
    if not run_rpkid:
        xml_path = cfg.get('xml_filename')
        if xml_path[0] != '/':
            # convert to full path
            xml_path = '%s/%s/%s' % (settings.MYRPKI_DATA_DIR, handle.handle, xml_path)
        # send the myrpki.xml to the rpkid hosting me
        invoke_rpki(handle.parents.all()[0].handle, ['configure_daemons', xml_path])
        # process the response
        invoke_rpki(handle.handle, ['configure_resources'])

# vim:sw=4 ts=8 expandtab