Fix cloud-init Python syntax for Python < 2.6

The loguserdata.py file gets uploaded to the servers created by Heat to run
under cloud-init. Since the default versions of Python installed on the
user's server may be very old (e.g. RHEL 5 defaults to Python 2.4), avoid
using the octal syntax introduced for Python 3.0 and backported only as far
as Python 2.6. (Also avoid the old syntax, which will break on Python 3.x.)

Also remove use of the "with" statement from loguserdata.py and
part-handler.py. This statement is only available from Python 2.6 on (or in
Python 2.5 via "from __future__ import with_statement").

Finally, remove use of the "except ExceptionType as value" syntax for
catching exceptions. Again, this was only backported to Python 2.6.

Change-Id: I89e86d00993d51e2514b1e589503c6d966909403
Partial-Bug: #1375864
This commit is contained in:
Zane Bitter 2014-10-01 15:16:45 -04:00
parent eac6cfa857
commit 95ec13c572
2 changed files with 26 additions and 10 deletions

View File

@ -35,7 +35,7 @@ def init_logging():
LOG.setLevel(logging.INFO) LOG.setLevel(logging.INFO)
LOG.addHandler(logging.StreamHandler()) LOG.addHandler(logging.StreamHandler())
fh = logging.FileHandler("/var/log/heat-provision.log") fh = logging.FileHandler("/var/log/heat-provision.log")
os.chmod(fh.baseFilename, 0o600) os.chmod(fh.baseFilename, int("600", 8))
LOG.addHandler(fh) LOG.addHandler(fh)
@ -55,14 +55,16 @@ def call(args):
if data: if data:
for x in data: for x in data:
ls.write(x) ls.write(x)
except OSError as ex: except OSError:
ex_type, ex, tb = sys.exc_info()
if ex.errno == errno.ENOEXEC: if ex.errno == errno.ENOEXEC:
LOG.error('Userdata empty or not executable: %s', ex) LOG.error('Userdata empty or not executable: %s', ex)
return os.EX_OK return os.EX_OK
else: else:
LOG.error('OS error running userdata: %s', ex) LOG.error('OS error running userdata: %s', ex)
return os.EX_OSERR return os.EX_OSERR
except Exception as ex: except Exception:
ex_type, ex, tb = sys.exc_info()
LOG.error('Unknown error running userdata: %s', ex) LOG.error('Unknown error running userdata: %s', ex)
return os.EX_SOFTWARE return os.EX_SOFTWARE
return p.returncode return p.returncode
@ -77,7 +79,7 @@ def main():
return -1 return -1
userdata_path = os.path.join(VAR_PATH, 'cfn-userdata') userdata_path = os.path.join(VAR_PATH, 'cfn-userdata')
os.chmod(userdata_path, 0o700) os.chmod(userdata_path, int("700", 8))
LOG.info('Provision began: %s', datetime.datetime.now()) LOG.info('Provision began: %s', datetime.datetime.now())
returncode = call([userdata_path]) returncode = call([userdata_path])
@ -96,5 +98,8 @@ if __name__ == '__main__':
provision_log = os.path.join(VAR_PATH, 'provision-finished') provision_log = os.path.join(VAR_PATH, 'provision-finished')
# touch the file so it is timestamped with when finished # touch the file so it is timestamped with when finished
with file(provision_log, 'a'): pl = file(provision_log, 'a')
try:
os.utime(provision_log, None) os.utime(provision_log, None)
finally:
pl.close()

View File

@ -15,6 +15,7 @@
import datetime import datetime
import errno import errno
import os import os
import sys
def list_types(): def list_types():
@ -24,8 +25,9 @@ def list_types():
def handle_part(data, ctype, filename, payload): def handle_part(data, ctype, filename, payload):
if ctype == "__begin__": if ctype == "__begin__":
try: try:
os.makedirs('/var/lib/heat-cfntools', 0o700) os.makedirs('/var/lib/heat-cfntools', int("700", 8))
except OSError as e: except OSError:
ex_type, e, tb = sys.exc_info()
if e.errno != errno.EEXIST: if e.errno != errno.EEXIST:
raise raise
return return
@ -33,14 +35,23 @@ def handle_part(data, ctype, filename, payload):
if ctype == "__end__": if ctype == "__end__":
return return
with open('/var/log/part-handler.log', 'a') as log: log = open('/var/log/part-handler.log', 'a')
try:
timestamp = datetime.datetime.now() timestamp = datetime.datetime.now()
log.write('%s filename:%s, ctype:%s\n' % (timestamp, filename, ctype)) log.write('%s filename:%s, ctype:%s\n' % (timestamp, filename, ctype))
finally:
log.close()
if ctype == 'text/x-cfninitdata': if ctype == 'text/x-cfninitdata':
with open('/var/lib/heat-cfntools/%s' % filename, 'w') as f: f = open('/var/lib/heat-cfntools/%s' % filename, 'w')
try:
f.write(payload) f.write(payload)
finally:
f.close()
# TODO(sdake) hopefully temporary until users move to heat-cfntools-1.3 # TODO(sdake) hopefully temporary until users move to heat-cfntools-1.3
with open('/var/lib/cloud/data/%s' % filename, 'w') as f: f = open('/var/lib/cloud/data/%s' % filename, 'w')
try:
f.write(payload) f.write(payload)
finally:
f.close()