import hmac
import string
import sha
+import cPickle
+import utils
from Exceptions import *
+stash = None
def create_auth_structure( vars, call_params ):
"""
If the call fails, a BootManagerException is raised.
"""
-
+ global stash
+
try:
api_server= vars['API_SERVER_INST']
except KeyError, e:
raise BootManagerException, "No connection to the API server exists."
+ if api_server is None:
+ if not stash:
+ load(vars)
+ for i in stash:
+ if i[0] == function and i[1] == user_params:
+ return i[2]
+ raise BootManagerException, \
+ "Disconnected operation failed, insufficient stash."
+
auth= create_auth_structure(vars,user_params)
if auth is None:
raise BootManagerException, \
try:
exec( "rc= api_server.%s(*params)" % function )
+ if stash is None:
+ stash = []
+ stash += [ [ function, user_params, rc ] ]
return rc
except xmlrpclib.Fault, fault:
raise BootManagerException, "API Fault: %s" % fault
raise BootManagerException,"XML RPC protocol error: %s" % err
except xml.parsers.expat.ExpatError, err:
raise BootManagerException,"XML parsing error: %s" % err
+
+
+class Stash(file):
+ mntpnt = '/tmp/stash'
+ def __init__(self, vars, mode):
+ utils.makedirs(self.mntpnt)
+ try:
+ utils.sysexec('mount -t auto -U %s %s' % (vars['DISCONNECTED_OPERATION'], self.mntpnt))
+ # make sure it's not read-only
+ f = file('%s/api.cache' % self.mntpnt, 'a')
+ f.close()
+ file.__init__(self, '%s/api.cache' % self.mntpnt, mode)
+ except:
+ utils.sysexec_noerr('umount %s' % self.mntpnt)
+ raise BootManagerException, "Couldn't find API-cache for disconnected operation"
+
+ def close(self):
+ file.close(self)
+ utils.sysexec_noerr('umount %s' % self.mntpnt)
+
+def load(vars):
+ global stash
+ s = Stash(vars, 'r')
+ stash = cPickle.load(s)
+ s.close()
+
+def save(vars):
+ global stash
+ if vars['DISCONNECTED_OPERATION']:
+ s = Stash(vars, 'w')
+ cPickle.dump(stash, s)
+ s.close()
utils.sysexec( "cp %s/boot/kernel-boot%s /tmp/kernel" % (SYSIMG_PATH,option), log )
utils.sysexec( "cp %s/boot/initrd-boot%s /tmp/initrd" % (SYSIMG_PATH,option), log )
+ BootAPI.save(vars)
+
log.write( "Unmounting disks.\n" )
try:
# backwards compat, though, we should never hit this case post PL 3.2
# problems during chain boot, such as USB host
# controller drivers (HCDs) (PL6577).
# if int(parts[2]) == 0:
- if re.search('_hcd$', parts[0]):
+ if False and re.search('_hcd$', parts[0]):
if usb_usage > 0:
log.write( "NOT unloading %s since USB may be in use\n" % parts[0] )
else:
vars['WAS_NODE_ID_IN_CONF']= 0
vars['WAS_NODE_KEY_IN_CONF']= 0
+ vars['DISCONNECTED_OPERATION']= ''
+
# for any devices that need to be mounted to get the configuration
# file, mount them here.
mount_point= "/tmp/conffilemount"
if name == "NET_DEVICE":
NETWORK_SETTINGS['mac']= string.upper(value)
-
+
+ if name == "DISCONNECTED_OPERATION":
+ vars['DISCONNECTED_OPERATION']= value.strip()
+
except IndexError, e:
log.write( "Unable to parse configuration file\n" )
vars["NETWORK_SETTINGS"]= NETWORK_SETTINGS
- if not hostname_resolve_ok:
+ if not hostname_resolve_ok and not vars['DISCONNECTED_OPERATION']:
log.write( "Hostname does not resolve correctly, will not continue.\n" )
if can_make_api_call: