X-Git-Url: https://code.grnet.gr/git/snf-image-creator/blobdiff_plain/71b0ab283eeef37c3d3ecd98fbafa6eaa50b58d8..8e58e69976b0d79f9b7758347c7bfce1ba9f6d8a:/image_creator/os_type/freebsd.py diff --git a/image_creator/os_type/freebsd.py b/image_creator/os_type/freebsd.py index 28d58bd..02bd8dc 100644 --- a/image_creator/os_type/freebsd.py +++ b/image_creator/os_type/freebsd.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- +# # Copyright 2012 GRNET S.A. All rights reserved. # # Redistribution and use in source and binary forms, with or @@ -31,6 +33,8 @@ # interpreted as representing official policies, either expressed # or implied, of GRNET S.A. +"""This module hosts OS-specific code for FreeBSD.""" + from image_creator.os_type.unix import Unix, sysprep import re @@ -41,8 +45,36 @@ class Freebsd(Unix): def __init__(self, rootdev, ghandler, output): super(Freebsd, self).__init__(rootdev, ghandler, output) - def _do_collect_metadata(self): + @sysprep() + def cleanup_password(self, print_header=True): + """Remove all passwords and lock all user accounts""" + + if print_header: + self.out.output("Cleaning up passwords & locking all user " + "accounts") + + master_passwd = [] + + for line in self.g.cat('/etc/master.passwd').splitlines(): + + # Check for empty or comment lines + if len(line.split('#')[0]) == 0: + master_passwd.append(line) + continue + + fields = line.split(':') + if fields[1] not in ('*', '!'): + fields[1] = '!' + + master_passwd.append(":".join(fields)) + + self.g.write('/etc/master.passwd', "\n".join(master_passwd) + '\n') + + # Make sure no one can login on the system + self.g.rm_rf('/etc/spwd.db') + def _do_collect_metadata(self): + """Collect metadata about the OS""" super(Freebsd, self)._do_collect_metadata() self.meta["USERS"] = " ".join(self._get_passworded_users()) @@ -56,6 +88,7 @@ class Freebsd(Unix): del self.meta['USERS'] def _get_passworded_users(self): + """Returns a list of non-locked user accounts""" users = [] regexp = re.compile( '^([^:]+):((?:![^:]+)|(?:[^!*][^:]+)|):(?:[^:]*:){7}(?:[^:]*)' @@ -80,18 +113,18 @@ class Freebsd(Unix): critical_mpoints = ('/', '/etc', '/root', '/home', '/var') - # libguestfs can't handle correct freebsd partitions on GUID - # Partition Table. We have to do the translation to linux - # device names ourselves + # libguestfs can't handle correct freebsd partitions on a GUID + # Partition Table. We have to do the translation to linux device names + # ourselves guid_device = re.compile('^/dev/((?:ada)|(?:vtbd))(\d+)p(\d+)$') mopts = "ufstype=ufs2,%s" % ('ro' if readonly else 'rw') for mp, dev in self._mountpoints(): match = guid_device.match(dev) if match: - m2 = int(match.group(2)) - m3 = int(match.group(3)) - dev = '/dev/sd%c%d' % (chr(ord('a') + m2), m3) + group2 = int(match.group(2)) + group3 = int(match.group(3)) + dev = '/dev/sd%c%d' % (chr(ord('a') + group2), group3) try: self.g.mount_vfs(mopts, 'ufs', dev, mp) except RuntimeError as msg: @@ -103,32 +136,4 @@ class Freebsd(Unix): return True - @sysprep() - def cleanup_password(self, print_header=True): - """Remove all passwords and lock all user accounts""" - - if print_header: - self.out.output("Cleaning up passwords & locking all user " - "accounts") - - master_passwd = [] - - for line in self.g.cat('/etc/master.passwd').splitlines(): - - # Check for empty or comment lines - if len(line.split('#')[0]) == 0: - master_passwd.append(line) - continue - - fields = line.split(':') - if fields[1] not in ('*', '!'): - fields[1] = '!' - - master_passwd.append(":".join(fields)) - - self.g.write('/etc/master.passwd', "\n".join(master_passwd) + '\n') - - # Make sure no one can login on the system - self.g.rm_rf('/etc/spwd.db') - # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :