-# $Id$
-# $URL$
import random
import base64
import os
from PLC.InterfaceTags import InterfaceTag, InterfaceTags
from PLC.NodeTags import NodeTag, NodeTags
+from PLC.Debug import log
+
from PLC.Accessors.Accessors_standard import * # import node accessors
# could not define this in the class..
variants are used to run a different kernel on the bootCD
see kvariant.sh for how to create a variant
- 'no-hangcheck' - disable hangcheck
+ - 'systemd-debug' - turn on systemd debug in bootcd
Tags: the following tags are taken into account when attached to the node:
- 'serial', 'cramfs', 'kvariant', 'kargs', 'no-hangcheck'
+ 'serial', 'cramfs', 'kvariant', 'kargs', 'no-hangcheck', 'systemd-debug'
Security:
- Non-admins can only generate files for nodes at their sites.
node_id=node['node_id']
# no support for deployment-based BootCD's, use kvariants instead
- node_pldistro = GetNodePldistro (self.api).call(auth, node_id)
+ node_pldistro = GetNodePldistro (self.api,self.caller).call(auth, node_id)
if node_pldistro: pldistro = node_pldistro
- node_fcdistro = GetNodeFcdistro (self.api).call(auth, node_id)
+ node_fcdistro = GetNodeFcdistro (self.api,self.caller).call(auth, node_id)
if node_fcdistro: fcdistro = node_fcdistro
- node_arch = GetNodeArch (self.api).call(auth,node_id)
+ node_arch = GetNodeArch (self.api,self.caller).call(auth,node_id)
if node_arch: arch = node_arch
return (pldistro,fcdistro,arch)
def cleantrash (self):
for file in self.trash:
if self.DEBUG:
- print 'DEBUG -- preserving',file
+ print >> log, 'DEBUG -- preserving',file
else:
os.unlink(file)
raise PLCInvalidArgument, "File %s not under %s"%(filename,self.WORKDIR)
### output should not exist (concurrent runs ..)
+ # numerous reports of issues with this policy
+ # looks like people sometime suspend/cancel their download
+ # and this leads to the old file sitting in there forever
+ # so, if the file is older than 5 minutes, we just trash
+ grace=5
+ if os.path.exists(filename) and (time.time()-os.path.getmtime(filename)) >= (grace*60):
+ os.unlink(filename)
if os.path.exists(filename):
- raise PLCInvalidArgument, "Resulting file %s already exists"%filename
+ raise PLCInvalidArgument, "Resulting file %s already exists - please try again in %d minutes"%\
+ (filename,grace)
### we can now safely create the file,
### either we are admin or under a controlled location
log_file)
if self.DEBUG:
- print "The build command line is %s" % command
+ print >> log, "The build command line is %s" % command
return command
raise PLCInvalidArgument, "No such node %r"%node_id_or_hostname
node = nodes[0]
- if self.DEBUG: print "%s required on node %s. Node type is: %s" \
+ if self.DEBUG:
+ print >> log, "%s requested on node %s. Node type is: %s" \
% (action, node['node_id'], node['node_type'])
# check the required action against the node type
# check for node tag equivalents
tags = NodeTags(self.api,
{'node_id': node['node_id'],
- 'tagname': ['serial', 'cramfs', 'kvariant', 'kargs', 'no-hangcheck']},
+ 'tagname': ['serial', 'cramfs', 'kvariant', 'kargs',
+ 'no-hangcheck', 'systemd-debug' ]},
['tagname', 'value'])
if tags:
for tag in tags:
if tag['tagname'] == 'serial':
build_sh_spec['serial'] = tag['value']
- if tag['tagname'] == 'cramfs':
+ elif tag['tagname'] == 'cramfs':
build_sh_spec['cramfs'] = True
- if tag['tagname'] == 'kvariant':
+ elif tag['tagname'] == 'kvariant':
build_sh_spec['variant'] = tag['value']
- if tag['tagname'] == 'kargs':
+ elif tag['tagname'] == 'kargs':
build_sh_spec['kargs'] += tag['value'].split()
- if tag['tagname'] == 'no-hangcheck':
+ elif tag['tagname'] == 'no-hangcheck':
build_sh_spec['kargs'].append('hcheck_reboot0')
+ elif tag['tagname'] == 'systemd-debug':
+ build_sh_spec['kargs'].append('systemd.log_level=debug')
# then options can override tags
for option in options:
if option == "cramfs":
build_sh_spec['variant']=option.replace("variant:","")
elif option == "no-hangcheck":
build_sh_spec['kargs'].append('hcheck_reboot0')
+ elif option == "systemd-debug":
+ build_sh_spec['kargs'].append('systemd.log_level=debug')
else:
raise PLCInvalidArgument, "unknown option %s"%option
result = file(node_image).read()
self.trash.append(node_image)
self.cleantrash()
- return base64.b64encode(result)
+ print >> log, "GetBootMedium - done with build.sh"
+ encoded_result = base64.b64encode(result)
+ print >> log, "GetBootMedium - done with base64 encoding - lengths=%s - %s"\
+ %(len(result),len(encoded_result))
+ return encoded_result
except:
self.cleantrash()
raise