blob: 29657d094d76148f62b0d46ab65ba07e864ae59c [file] [log] [blame]
#!/usr/bin/python
from ConfigParser import ConfigParser, NoOptionError, NoSectionError
from datetime import datetime
from md5 import md5
from os import path
import sys
from socket import gethostname
KEY_FILE = path.join("c:\\", "program files", "opsi.org", "preloginloader",
"cfg", "locked.cfg")
LOG_FILE = path.join("c:\\", "tmp", "key-generator.log")
REF_PLATFORMS = {'build': 'win2k3-ref-img',
'build-ix': 'win32-ix-ref',
'talos-xp': 'talos-r3-xp-ref',
'talos-win7': 'talos-r3-w7-ref'}
def generate_hash(str):
return md5(str).hexdigest()
def get_ref_platform_key(hostname):
if 'talos' in hostname:
if 'xp' in hostname:
return generate_hash(REF_PLATFORMS['talos-xp'])
elif 'w7' in hostname:
return generate_hash(REF_PLATFORMS['talos-win7'])
else:
return None
else:
if 'ix' in hostname:
return generate_hash(REF_PLATFORMS['build-ix'])
else:
return generate_hash(REF_PLATFORMS['build'])
def write_new_key(host, cp, keyfile):
newKey = generate_hash(host)
if not cp.has_section('shareinfo'):
cp.add_section('shareinfo')
try:
cp.set('shareinfo', 'pckey', newKey)
f = open(keyfile, 'w')
cp.write(f)
f.close()
except IOError, e:
raise IOError("Error when writing key to %s: \n%s" % (keyfile, e))
def log(msg):
print '%s - %s' % (datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M"), msg)
if __name__ == '__main__':
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-k", "--key-file", action="store", dest="keyfile",
default=KEY_FILE)
parser.add_option("-l", "--log-file", action="store", dest="logfile",
default=LOG_FILE)
(options, args) = parser.parse_args()
# Set up logging
try:
sys.stdout = open(options.logfile, "a")
except IOError:
log("WARN: Couldn't open %s, logging to STDOUT instead" %
options.logfile)
# Gather information before evaluating what to do
hostname = gethostname()
refKey = get_ref_platform_key(hostname)
currentKey = None
cp = ConfigParser()
try:
cp.read(options.keyfile)
currentKey = cp.get('shareinfo', 'pckey')
except (IOError, NoSectionError, NoOptionError):
pass
# Don't do anything for ref platforms
if hostname in REF_PLATFORMS:
log("WARN: %s is a ref platform, not doing anything..." % hostname)
sys.exit(0)
# If the currentKey doesn't match a ref platform key we assume the slave
# isn't a ref platform and is already working correctly with OSPI.
if currentKey and currentKey != refKey:
# Don't log here because this process runs at every boot.
sys.exit(0)
# If we haven't hit any of the above conditions we assume a key needs to be
# generated. Generally, this means the slave is freshly cloned from the
# ref platform.
log("Writing new key")
try:
write_new_key(hostname, cp, options.keyfile)
log("New key written to %s" % options.keyfile)
except IOError, e:
log("Encountered error when writing new key: %s" % e)