added nodetype target to core-manage to add/remove/check $HOME/.core/nodes.conf

(Boeing r1854)
This commit is contained in:
ahrenholz 2014-07-18 16:56:05 +00:00
parent e5a1788991
commit c95e240aa8
2 changed files with 59 additions and 14 deletions

View file

@ -7,34 +7,33 @@
# author: Jeff Ahrenholz <jeffrey.m.ahrenholz@boeing.com> # author: Jeff Ahrenholz <jeffrey.m.ahrenholz@boeing.com>
# #
''' '''
core-manage: Helper tool to add, remove, or check for services and models in core-manage: Helper tool to add, remove, or check for services, models, and
a CORE installation. node types in a CORE installation.
''' '''
import os import os
import sys import sys
import ast import ast
import optparse import optparse
import re
from core import pycore from core import pycore
from core.constants import CORE_CONF_DIR from core.constants import CORE_CONF_DIR
# core-manage add emane_model RfPipeNew
# core-manage add service MyService
class FileUpdater(object): class FileUpdater(object):
''' Helper class for changing configuration files. ''' Helper class for changing configuration files.
''' '''
actions = ("add", "remove", "check") actions = ("add", "remove", "check")
targets = ("service", "model") targets = ("service", "model", "nodetype")
def __init__(self, action, target, data, verbose=False): def __init__(self, action, target, data, options):
''' '''
''' '''
self.action = action self.action = action
self.target = target self.target = target
self.data = data self.data = data
self.verbose = verbose self.options = options
self.verbose = options.verbose
self.search, self.filename = self.get_filename(target) self.search, self.filename = self.get_filename(target)
def process(self): def process(self):
@ -50,6 +49,8 @@ class FileUpdater(object):
r = self.update_file(fn=self.update_services) r = self.update_file(fn=self.update_services)
elif self.target == "model": elif self.target == "model":
r = self.update_file(fn=self.update_emane_models) r = self.update_file(fn=self.update_emane_models)
elif self.target == "nodetype":
r = self.update_nodes_conf()
if self.verbose: if self.verbose:
txt = "" txt = ""
@ -113,8 +114,7 @@ class FileUpdater(object):
pass pass
return vals return vals
@staticmethod def get_filename(self, target):
def get_filename(target):
''' Return search string and filename based on target. ''' Return search string and filename based on target.
''' '''
if target == "service": if target == "service":
@ -124,6 +124,11 @@ class FileUpdater(object):
elif target == "model": elif target == "model":
filename = os.path.join(CORE_CONF_DIR, "core.conf") filename = os.path.join(CORE_CONF_DIR, "core.conf")
search = "emane_models =" search = "emane_models ="
elif target == "nodetype":
if self.options.userpath is None:
raise ValueError, "missing user path"
filename = os.path.join(self.options.userpath, "nodes.conf")
search = self.data
else: else:
raise ValueError, "unknown target" raise ValueError, "unknown target"
if not os.path.exists(filename): if not os.path.exists(filename):
@ -155,13 +160,45 @@ class FileUpdater(object):
return changed return changed
def update_nodes_conf(self):
''' Add/remove/check entries from nodes.conf. This file
contains a Tcl-formatted array of node types. The array index must be
properly set for new entries. Uses self.{action, filename, search,
data} variables as input and returns the same value as update_file().
'''
changed = False
output = "" # this accumulates output, assumes input is small
with open(self.filename, "r") as f:
for line in f:
# make sure data is not added twice
if line.find(self.search) >= 0:
if self.action == "check":
return True
elif self.action == "add":
return False
elif self.action == "remove":
changed = True
continue
else:
output += line
if self.action == "add":
index = int(re.match('^\d+', line).group(0))
output += str(index + 1) + ' ' + self.data + '\n'
changed = True
if changed:
with open(self.filename, "w") as f:
f.write(output)
return changed
def main(): def main():
usagestr = "usage: %prog [-h] [options] <action> <target> <string>\n" usagestr = "usage: %prog [-h] [options] <action> <target> <string>\n"
usagestr += "\nHelper tool to add, remove, or check for " usagestr += "\nHelper tool to add, remove, or check for "
usagestr += "services and models in a CORE\ninstallation.\n" usagestr += "services, models, and node types\nin a CORE installation.\n"
usagestr += "\nExamples:\n %prog add service newrouting" usagestr += "\nExamples:\n %prog add service newrouting"
usagestr += "\n %prog -v check model RfPipe\n" usagestr += "\n %prog -v check model RfPipe"
usagestr += "\n %prog --userpath=\"$HOME/.core\" add nodetype \"{ftp ftp.gif ftp.gif {DefaultRoute FTP} netns {FTP server} }\" \n"
usagestr += "\nArguments:\n <action> should be one of: %s" % \ usagestr += "\nArguments:\n <action> should be one of: %s" % \
', '.join(FileUpdater.actions) ', '.join(FileUpdater.actions)
usagestr += "\n <target> should be one of: %s" % \ usagestr += "\n <target> should be one of: %s" % \
@ -169,8 +206,11 @@ def main():
usagestr += "\n <string> is the text to %s" % \ usagestr += "\n <string> is the text to %s" % \
', '.join(FileUpdater.actions) ', '.join(FileUpdater.actions)
parser = optparse.OptionParser(usage = usagestr) parser = optparse.OptionParser(usage = usagestr)
parser.set_defaults(verbose = False,) parser.set_defaults(userpath = None, verbose = False,)
parser.add_option("--userpath", dest = "userpath", type = "string",
help = "use the specified user path (e.g. \"$HOME/.core" \
"\") to access nodes.conf")
parser.add_option("-v", "--verbose", dest = "verbose", action="store_true", parser.add_option("-v", "--verbose", dest = "verbose", action="store_true",
help = "be verbose when performing action") help = "be verbose when performing action")
@ -194,10 +234,13 @@ def main():
if target not in FileUpdater.targets: if target not in FileUpdater.targets:
usage("invalid target '%s'" % target, 1) usage("invalid target '%s'" % target, 1)
if target == "nodetype" and not options.userpath:
usage("user path option required for this target (%s)" % target)
data = args[2] data = args[2]
try: try:
up = FileUpdater(action, target, data, verbose=options.verbose) up = FileUpdater(action, target, data, options)
r = up.process() r = up.process()
except Exception, e: except Exception, e:
sys.stderr.write("Exception: %s\n" % e) sys.stderr.write("Exception: %s\n" % e)

View file

@ -24,5 +24,7 @@ be verbose when performing action
core\-manage add service newrouting core\-manage add service newrouting
.TP .TP
core\-manage \fB\-v\fR check model RfPipe core\-manage \fB\-v\fR check model RfPipe
.TP
core\-manage \fB\-\-userpath=\fR"$HOME/.core" add nodetype "{ftp ftp.gif ftp.gif {DefaultRoute FTP} netns {FTP server} }"
.SH "SEE ALSO" .SH "SEE ALSO"
.BR core-daemon(1) .BR core-daemon(1)