aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/rpki/irdb/zookeeper.py21
-rw-r--r--rpkid/rpki/rpkic.py15
-rw-r--r--rpkid/tests/smoketest.1.yaml10
-rw-r--r--rpkid/tests/smoketest.6.yaml19
-rw-r--r--rpkid/tests/yamltest.py25
5 files changed, 90 insertions, 0 deletions
diff --git a/rpkid/rpki/irdb/zookeeper.py b/rpkid/rpki/irdb/zookeeper.py
index bd32caf1..6b72a8a8 100644
--- a/rpkid/rpki/irdb/zookeeper.py
+++ b/rpkid/rpki/irdb/zookeeper.py
@@ -918,6 +918,27 @@ class Zookeeper(object):
max_prefixlen = int(p.max_prefixlen))
+ @django.db.transaction.commit_on_success
+ def load_ghostbuster_requests(self, filename, parent = None):
+ """
+ Whack IRDB to match ghostbusters.vcard.
+
+ This accepts one or more vCards from a file.
+ """
+
+ self.resource_ca.ghostbuster_requests.filter(parent = parent).delete()
+
+ vcard = []
+
+ for line in open(filename, "r"):
+ if not vcard and not line.upper().startswith("BEGIN:VCARD"):
+ continue
+ vcard.append(line)
+ if line.upper().startswith("END:VCARD"):
+ self.resource_ca.ghostbuster_requests.create(vcard = "".join(vcard), parent = parent)
+ vcard = []
+
+
def call_rpkid(self, *pdus):
"""
Issue a call to rpkid, return result.
diff --git a/rpkid/rpki/rpkic.py b/rpkid/rpki/rpkic.py
index 342ed339..c5a9a919 100644
--- a/rpkid/rpki/rpkic.py
+++ b/rpkid/rpki/rpkic.py
@@ -617,6 +617,21 @@ class main(Cmd):
self.zoo.run_rpkid_now()
+ def do_load_ghostbuster_requests(self, arg):
+ """
+ Load Ghostbuster requests into IRDB from file.
+ """
+
+ argv = arg.split()
+
+ if len(argv) != 1:
+ raise BadCommandSyntax("Expecting filename of Ghostbuster vCard(s)")
+
+ self.zoo.load_ghostbuster_requests(argv[0])
+ if self.autosync:
+ self.zoo.run_rpkid_now()
+
+
def do_synchronize(self, arg):
"""
Whack daemons to match IRDB.
diff --git a/rpkid/tests/smoketest.1.yaml b/rpkid/tests/smoketest.1.yaml
index 2a498997..36c0a43c 100644
--- a/rpkid/tests/smoketest.1.yaml
+++ b/rpkid/tests/smoketest.1.yaml
@@ -34,6 +34,16 @@ regen_margin: 2m
valid_for: 2d
kids:
- name: R0
+ ghostbuster: |
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:R0
+ ORG:Organizational Entity
+ ADR;TYPE=WORK:;;42 Twisty Passage;Deep Cavern;WA;98666;U.S.A.
+ TEL;TYPE=VOICE,TEXT,WORK;VALUE=uri:tel:+1-666-555-1212
+ TEL;TYPE=FAX,WORK;VALUE=uri:tel:+1-666-555-1213
+ EMAIL:human@example.com
+ END:VCARD
kids:
- name: Alice
ipv4: 192.0.2.1-192.0.2.33
diff --git a/rpkid/tests/smoketest.6.yaml b/rpkid/tests/smoketest.6.yaml
index dbcc06e3..72bded44 100644
--- a/rpkid/tests/smoketest.6.yaml
+++ b/rpkid/tests/smoketest.6.yaml
@@ -22,6 +22,12 @@ kids:
kids:
- name: Betty
hosted_by: RIR
+ ghostbuster: |
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:Carol Clever
+ EMAIL:carol@example.org
+ END:VCARD
kids:
- name: Carol
hosted_by: RIR
@@ -40,6 +46,19 @@ kids:
roa_request:
- asn: 64533
ipv6: 2001:db8::80/121
+ ghostbusters:
+ - |
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:Fiona Fearless
+ EMAIL:fiona@example.org
+ END:VCARD
+ - |
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:Frank Fearless
+ EMAIL:frank@example.org
+ END:VCARD
---
- name: Fiona
add_as: 33
diff --git a/rpkid/tests/yamltest.py b/rpkid/tests/yamltest.py
index 1e9256e3..6c950645 100644
--- a/rpkid/tests/yamltest.py
+++ b/rpkid/tests/yamltest.py
@@ -215,6 +215,12 @@ class allocation(object):
if "regen_margin" in yaml:
self.regen_margin = rpki.sundial.timedelta.parse(yaml["regen_margin"]).convert_to_seconds()
self.roa_requests = [roa_request.parse(y) for y in yaml.get("roa_request", yaml.get("route_origin", ()))]
+ if "ghostbusters" in yaml:
+ self.ghostbusters = yaml.get("ghostbusters")
+ elif "ghostbuster" in yaml:
+ self.ghostbusters = [yaml.get("ghostbuster")]
+ else:
+ self.ghostbusters = []
for r in self.roa_requests:
if r.v4:
self.base.v4 |= r.v4.to_resource_set()
@@ -349,6 +355,24 @@ class allocation(object):
if not stop_after_config:
self.run_rpkic("load_roa_requests", fn)
+ def dump_ghostbusters(self):
+ """
+ Write Ghostbusters vCard file.
+ """
+ if self.ghostbusters:
+ fn = "%s.ghostbusters.vcard" % d.name
+ if not skip_config:
+ path = self.path(fn)
+ print "Writing", path
+ f = open(path, "w")
+ for i, g in enumerate(self.ghostbusters):
+ if i:
+ f.write("\n")
+ f.write(g)
+ f.close()
+ if not stop_after_config:
+ self.run_rpkic("load_ghostbuster_requests", fn)
+
@property
def pubd(self):
"""
@@ -759,6 +783,7 @@ try:
d.dump_asns()
d.dump_prefixes()
d.dump_roas()
+ d.dump_ghostbusters()
# Wait until something terminates.