from image_creator import util
from image_creator.disk import Disk
from image_creator.util import get_command, FatalError, MD5
-from image_creator.output import Output, Output_wth_progress, Silent, \
- Silent_wth_colors, error
-from image_creator.os_type import get_os_class
-from image_creator.kamaki_wrapper import Kamaki
+from image_creator.output.cli import SilentOutput, SimpleOutput, \
+ OutputWthProgress
+from image_creator.os_type import os_cls
+from image_creator.kamaki_wrapper import Kamaki, ClientError
import sys
import os
import optparse
"must be set")
if options.silent:
- out = Silent_wth_colors() if sys.stdout.isatty() else Silent()
+ out = SilentOutput()
else:
- out = Output_wth_progress() if sys.stdout.isatty() else Output()
+ out = OutputWthProgress(True) if sys.stderr.isatty() else \
+ SimpleOutput(False)
title = 'snf-image-creator %s' % version
out.output(title)
snapshot = disk.snapshot()
dev = disk.get_device(snapshot)
- dev.mount()
- osclass = get_os_class(dev.distro, dev.ostype)
- image_os = osclass(dev.root, dev.g, out)
+ # If no customization is to be applied, the image should be mounted ro
+ readonly = not (options.sysprep or options.shrink)
+ dev.mount(readonly)
+
+ cls = os_cls(dev.distro, dev.ostype)
+ image_os = cls(dev.root, dev.g, out)
out.output()
for sysprep in options.disabled_syspreps:
- image_os.disable_sysprep(sysprep)
+ image_os.disable_sysprep(image_os.get_sysprep_by_name(sysprep))
for sysprep in options.enabled_syspreps:
- image_os.enable_sysprep(sysprep)
+ image_os.enable_sysprep(image_os.get_sysprep_by_name(sysprep))
if options.print_sysprep:
image_os.print_syspreps()
disk.destroy_device(dev)
out.output()
-
- uploaded_obj = ""
- if options.upload:
- out.output("Uploading image to pithos:")
- kamaki = Kamaki(options.account, options.token, out)
- with open(snapshot) as f:
- uploaded_obj = kamaki.upload(f, size, options.upload,
- "(1/4) Calculating block hashes",
- "(2/4) Uploading missing blocks")
-
- out.output("(3/4) Uploading metadata file...", False)
- kamaki.upload(StringIO.StringIO(metastring), size=len(metastring),
- remote_path="%s.%s" % (options.upload, 'meta'))
- out.success('done')
- out.output("(4/4) Uploading md5sum file...", False)
- md5sumstr = '%s %s\n' % (
- checksum, os.path.basename(options.upload))
- kamaki.upload(StringIO.StringIO(md5sumstr), size=len(md5sumstr),
- remote_path="%s.%s" % (options.upload, 'md5sum'))
- out.success('done')
- out.output()
-
- if options.register:
- out.output('Registring image to ~okeanos...', False)
- kamaki.register(options.register, uploaded_obj, metadata)
- out.success('done')
- out.output()
+ try:
+ uploaded_obj = ""
+ if options.upload:
+ out.output("Uploading image to pithos:")
+ kamaki = Kamaki(options.account, options.token, out)
+ with open(snapshot, 'rb') as f:
+ uploaded_obj = kamaki.upload(f, size, options.upload,
+ "(1/4) Calculating block hashes",
+ "(2/4) Uploading missing blocks")
+
+ out.output("(3/4) Uploading metadata file...", False)
+ kamaki.upload(StringIO.StringIO(metastring),
+ size=len(metastring),
+ remote_path="%s.%s" % (options.upload, 'meta'))
+ out.success('done')
+ out.output("(4/4) Uploading md5sum file...", False)
+ md5sumstr = '%s %s\n' % (
+ checksum, os.path.basename(options.upload))
+ kamaki.upload(StringIO.StringIO(md5sumstr),
+ size=len(md5sumstr),
+ remote_path="%s.%s" % (options.upload, 'md5sum'))
+ out.success('done')
+ out.output()
+
+ if options.register:
+ out.output('Registring image to ~okeanos...', False)
+ kamaki.register(options.register, uploaded_obj, metadata)
+ out.success('done')
+ out.output()
+ except ClientError as e:
+ raise FatalError("Pithos client: %d %s" % (e.status, e.message))
finally:
out.output('cleaning up...')
ret = image_creator()
sys.exit(ret)
except FatalError as e:
- if sys.stdout.isatty():
- error(e)
- else:
- error(e, True, False)
+ colored = sys.stderr.isatty()
+ SimpleOutput(colored).error(e)
sys.exit(1)
-
if __name__ == '__main__':
main()