aboutsummaryrefslogtreecommitdiff
path: root/ca/rpkigui-import-routes
diff options
context:
space:
mode:
Diffstat (limited to 'ca/rpkigui-import-routes')
-rwxr-xr-xca/rpkigui-import-routes115
1 files changed, 115 insertions, 0 deletions
diff --git a/ca/rpkigui-import-routes b/ca/rpkigui-import-routes
new file mode 100755
index 00000000..234a865b
--- /dev/null
+++ b/ca/rpkigui-import-routes
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+
+# Copyright (C) 2012, 2013 SPARTA, Inc. a Parsons Company
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND SPARTA DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL SPARTA BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+
+__version__ = '$Id$'
+
+import optparse
+import logging
+import time
+import random
+import signal
+import errno
+import atexit
+import fcntl
+import sys
+import os
+
+# configure django ORM
+from rpki.gui.script_util import setup
+setup()
+
+from rpki.gui.routeview.util import import_routeviews_dump
+
+
+class BadArgument(Exception):
+ pass
+
+
+def timed_out(*ignored):
+ logging.info('timed out')
+ sys.exit(1)
+
+
+if __name__ == '__main__':
+ parser = optparse.OptionParser(
+ usage='%prog [options] [PATH]',
+ description="""This tool is used to import the IPv4/6 BGP table dumps
+from routeviews.org into the RPKI Web Portal database. If the
+input file is a bzip2 compressed file, it will be decompressed
+automatically.""")
+ parser.add_option('-t', '--type', dest='filetype', metavar='TYPE',
+ help='Specify the input file type (auto, text, mrt) [Default: %default]')
+ parser.add_option('-l', '--level', dest='log_level', default='ERROR',
+ help='Set logging level [Default: %default]')
+ parser.add_option('-u', '--bunzip2', dest='bunzip', metavar='PROG',
+ help='Specify bunzip2 program to use')
+ parser.add_option('-b', '--bgpdump', dest='bgpdump', metavar='PROG',
+ help='Specify path to bgdump binary')
+ parser.add_option('-j', '--jitter', dest='jitter', type='int',
+ help='Specify upper bound of startup delay, in seconds [Default: %default]')
+ parser.add_option('--lockfile', dest='lockfile',
+ help='Set name of lock file; empty string disables locking [Default: %default]')
+ parser.add_option('--timeout', dest='timeout', type='int',
+ help='Specify timeout for download and import, in seconds [Default: %default]')
+ parser.set_defaults(debug=False, verbose=False, filetype='auto', jitter=0,
+ lockfile='/tmp/rpkigui-import-routes.lock', timeout=90*60)
+ options, args = parser.parse_args()
+
+ v = getattr(logging, options.log_level.upper())
+ logging.basicConfig(level=v)
+ atexit.register(logging.shutdown)
+ logging.info('logging level set to ' + logging.getLevelName(v))
+
+ if options.bgpdump:
+ BGPDUMP = os.path.expanduser(options.bgpdump)
+
+ if options.jitter > 0:
+ try:
+ delay = random.SystemRandom().randint(0, options.jitter)
+ except NotImplementedError:
+ delay = random.randint(0, options.jitter)
+ logging.info('jitter active, delaying startup for %d seconds' % delay)
+ time.sleep(delay)
+
+ if options.lockfile:
+ try:
+ lock = os.open(options.lockfile, os.O_RDONLY | os.O_CREAT | os.O_NONBLOCK, 0666)
+ fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
+ except (IOError, OSError), e:
+ if e.errno == errno.EAGAIN:
+ logging.info('lock held by another process')
+ sys.exit(0)
+ else:
+ logging.exception(e)
+ sys.exit(1)
+
+ try:
+ if len(args) > 1:
+ raise BadArgument('more than one filename specified')
+
+ if options.timeout > 0:
+ signal.signal(signal.SIGALRM, timed_out)
+ signal.setitimer(signal.ITIMER_REAL, options.timeout)
+
+ import_routeviews_dump(*args)
+
+ if options.timeout > 0:
+ signal.setitimer(signal.ITIMER_REAL, 0)
+
+ except Exception as e:
+ logging.exception(e)
+ sys.exit(1)
+