lib: convert to directories per node

Signed-off-by: Lou Berger <lberger@labn.net>
This commit is contained in:
Lou Berger 2018-05-09 11:11:47 -04:00 committed by Donald Sharp
parent 068df8819b
commit e1dfa45e1b
2 changed files with 29 additions and 15 deletions

View File

@ -570,8 +570,15 @@ class TopoRouter(TopoGear):
# Propagate the router log directory # Propagate the router log directory
params['logdir'] = self.logdir params['logdir'] = self.logdir
#setup the per node directory
dir = '{}/{}'.format(self.logdir, self.name)
os.system('mkdir -p ' + dir)
os.system('chmod 775 ' + dir)
os.system('chgrp {} {}'.format(self.routertype, dir))
# Open router log file # Open router log file
logfile = '{}/{}.log'.format(self.logdir, name) logfile = '{0}/{1}.log'.format(dir, name)
self.logger = logger_config.get_logger(name=name, target=logfile) self.logger = logger_config.get_logger(name=name, target=logfile)
self.tgen.topo.addNode(self.name, cls=self.cls, **params) self.tgen.topo.addNode(self.name, cls=self.cls, **params)
@ -598,9 +605,9 @@ class TopoRouter(TopoGear):
os.chmod(self.logdir, 01777) os.chmod(self.logdir, 01777)
# Try to find relevant old logfiles in /tmp and delete them # Try to find relevant old logfiles in /tmp and delete them
map(os.remove, glob.glob('{}/*{}*.log'.format(self.logdir, self.name))) map(os.remove, glob.glob('{}/{}/*.log'.format(self.logdir, self.name)))
# Remove old core files # Remove old core files
map(os.remove, glob.glob('{}/{}*.dmp'.format(self.logdir, self.name))) map(os.remove, glob.glob('{}/{}/*.dmp'.format(self.logdir, self.name)))
def check_capability(self, daemon, param): def check_capability(self, daemon, param):
""" """
@ -647,7 +654,7 @@ class TopoRouter(TopoGear):
for daemon, enabled in nrouter.daemons.iteritems(): for daemon, enabled in nrouter.daemons.iteritems():
if enabled == 0: if enabled == 0:
continue continue
self.vtysh_cmd('configure terminal\nlog file {}/{}-{}.log'.format( self.vtysh_cmd('configure terminal\nlog file {}/{}/{}.log'.format(
self.logdir, self.name, daemon), daemon=daemon) self.logdir, self.name, daemon), daemon=daemon)
if result != '': if result != '':

View File

@ -518,8 +518,11 @@ class Router(Node):
assert_sysctl(self, 'net.ipv6.conf.all.forwarding', 1) assert_sysctl(self, 'net.ipv6.conf.all.forwarding', 1)
# Enable coredumps # Enable coredumps
assert_sysctl(self, 'kernel.core_uses_pid', 1) assert_sysctl(self, 'kernel.core_uses_pid', 1)
assert_sysctl(self, 'fs.suid_dumpable', 2) assert_sysctl(self, 'fs.suid_dumpable', 1)
corefile = '{}/{}_%e_core-sig_%s-pid_%p.dmp'.format(self.logdir, self.name) #this applies to the kernel not the namespace...
#original on ubuntu 17.x, but apport won't save as in namespace
# |/usr/share/apport/apport %p %s %c %d %P
corefile = '%e_core-sig_%s-pid_%p.dmp'
assert_sysctl(self, 'kernel.core_pattern', corefile) assert_sysctl(self, 'kernel.core_pattern', corefile)
self.cmd('ulimit -c unlimited') self.cmd('ulimit -c unlimited')
# Set ownership of config files # Set ownership of config files
@ -600,15 +603,16 @@ class Router(Node):
else: else:
logger.info('No daemon {} known'.format(daemon)) logger.info('No daemon {} known'.format(daemon))
# print "Daemons after:", self.daemons # print "Daemons after:", self.daemons
def startRouter(self, tgen=None): def startRouter(self, tgen=None):
# Disable integrated-vtysh-config # Disable integrated-vtysh-config
self.cmd('echo "no service integrated-vtysh-config" >> /etc/%s/vtysh.conf' % self.routertype) self.cmd('echo "no service integrated-vtysh-config" >> /etc/%s/vtysh.conf' % self.routertype)
self.cmd('chown %s:%svty /etc/%s/vtysh.conf' % (self.routertype, self.routertype, self.routertype)) self.cmd('chown %s:%svty /etc/%s/vtysh.conf' % (self.routertype, self.routertype, self.routertype))
# TODO remove the following lines after all tests are migrated to Topogen. # TODO remove the following lines after all tests are migrated to Topogen.
# Try to find relevant old logfiles in /tmp and delete them # Try to find relevant old logfiles in /tmp and delete them
map(os.remove, glob.glob("/tmp/*%s*.log" % self.name)) map(os.remove, glob.glob('{}/{}/*.log'.format(self.logdir, self.name)))
# Remove old core files # Remove old core files
map(os.remove, glob.glob("/tmp/%s*.dmp" % self.name)) map(os.remove, glob.glob('{}/{}/*.dmp'.format(self.logdir, self.name)))
# Remove IP addresses from OS first - we have them in zebra.conf # Remove IP addresses from OS first - we have them in zebra.conf
self.removeIPs() self.removeIPs()
# If ldp is used, check for LDP to be compiled and Linux Kernel to be 4.5 or higher # If ldp is used, check for LDP to be compiled and Linux Kernel to be 4.5 or higher
@ -648,13 +652,16 @@ class Router(Node):
self.restartRouter() self.restartRouter()
return "" return ""
def restartRouter(self): def restartRouter(self):
# Starts actuall daemons without init (ie restart) # Starts actual daemons without init (ie restart)
# cd to per node directory
self.cmd('cd {}/{}'.format(self.logdir, self.name))
# Start Zebra first # Start Zebra first
if self.daemons['zebra'] == 1: if self.daemons['zebra'] == 1:
zebra_path = os.path.join(self.daemondir, 'zebra') zebra_path = os.path.join(self.daemondir, 'zebra')
zebra_option = self.daemons_options['zebra'] zebra_option = self.daemons_options['zebra']
self.cmd('{0} {1} > {2}/{3}-zebra.out 2> {2}/{3}-zebra.err &'.format( self.cmd('{0} {1} > zebra.out 2> zebra.err &'.format(
zebra_path, zebra_option, self.logdir, self.name zebra_path, zebra_option, self.logdir, self.name
)) ))
self.waitOutput() self.waitOutput()
@ -670,7 +677,7 @@ class Router(Node):
continue continue
daemon_path = os.path.join(self.daemondir, daemon) daemon_path = os.path.join(self.daemondir, daemon)
self.cmd('{0} > {1}/{2}-{3}.out 2> {1}/{2}-{3}.err &'.format( self.cmd('{0} > {3}.out 2> {3}.err &'.format(
daemon_path, self.logdir, self.name, daemon daemon_path, self.logdir, self.name, daemon
)) ))
self.waitOutput() self.waitOutput()
@ -680,7 +687,7 @@ class Router(Node):
def getStdOut(self, daemon): def getStdOut(self, daemon):
return self.getLog('out', daemon) return self.getLog('out', daemon)
def getLog(self, log, daemon): def getLog(self, log, daemon):
return self.cmd('cat {}/{}-{}.{}'.format(self.logdir, self.name, daemon, log)) return self.cmd('cat {}/{}/{}.{}'.format(self.logdir, self.name, daemon, log))
def checkRouterRunning(self): def checkRouterRunning(self):
"Check if router daemons are running and collect crashinfo they don't run" "Check if router daemons are running and collect crashinfo they don't run"
@ -695,7 +702,7 @@ class Router(Node):
if (self.daemons[daemon] == 1) and not (daemon in daemonsRunning): if (self.daemons[daemon] == 1) and not (daemon in daemonsRunning):
sys.stderr.write("%s: Daemon %s not running\n" % (self.name, daemon)) sys.stderr.write("%s: Daemon %s not running\n" % (self.name, daemon))
# Look for core file # Look for core file
corefiles = glob.glob('{}/{}_{}_core*.dmp'.format( corefiles = glob.glob('{}/{}/{}_core*.dmp'.format(
self.logdir, self.name, daemon)) self.logdir, self.name, daemon))
if (len(corefiles) > 0): if (len(corefiles) > 0):
daemon_path = os.path.join(self.daemondir, daemon) daemon_path = os.path.join(self.daemondir, daemon)
@ -706,9 +713,9 @@ class Router(Node):
sys.stderr.write("%s\n" % backtrace) sys.stderr.write("%s\n" % backtrace)
else: else:
# No core found - If we find matching logfile in /tmp, then print last 20 lines from it. # No core found - If we find matching logfile in /tmp, then print last 20 lines from it.
if os.path.isfile('{}/{}-{}.log'.format(self.logdir, self.name, daemon)): if os.path.isfile('{}/{}/{}.log'.format(self.logdir, self.name, daemon)):
log_tail = subprocess.check_output([ log_tail = subprocess.check_output([
"tail -n20 {}/{}-{}.log 2> /dev/null".format( "tail -n20 {}/{}/{}.log 2> /dev/null".format(
self.logdir, self.name, daemon) self.logdir, self.name, daemon)
], shell=True) ], shell=True)
sys.stderr.write("\nFrom %s %s %s log file:\n" % (self.routertype, self.name, daemon)) sys.stderr.write("\nFrom %s %s %s log file:\n" % (self.routertype, self.name, daemon))