#!/usr/bin/python # Copyright (C) 2014-2015 Codethink Limited # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . '''Preparatory checks for Morph 'nfsboot' write extension''' import cliapp import os import morphlib.writeexts class NFSBootCheckExtension(morphlib.writeexts.WriteExtension): _nfsboot_root = '/srv/nfsboot' def process_args(self, args): if len(args) != 1: raise cliapp.AppException('Wrong number of command line args') location = args[0] upgrade = self.get_environment_boolean('UPGRADE') if upgrade: raise cliapp.AppException( 'Upgrading is not currently supported for NFS deployments.') hostname = os.environ.get('HOSTNAME', None) if hostname is None: raise cliapp.AppException('You must specify a HOSTNAME.') if hostname == 'baserock': raise cliapp.AppException('It is forbidden to nfsboot a system ' 'with hostname "%s"' % hostname) self.test_good_server(location) version_label = os.getenv('VERSION_LABEL', 'factory') versioned_root = os.path.join(self._nfsboot_root, hostname, 'systems', version_label) if self.version_exists(versioned_root, location): raise cliapp.AppException( 'Root file system for host %s (version %s) already exists on ' 'the NFS server %s. Deployment aborted.' % (hostname, version_label, location)) def test_good_server(self, server): self.check_ssh_connectivity(server) # Is an NFS server try: cliapp.ssh_runcmd( 'root@%s' % server, ['test', '-e', '/etc/exports']) except cliapp.AppException: raise cliapp.AppException('server %s is not an nfs server' % server) try: cliapp.ssh_runcmd( 'root@%s' % server, ['systemctl', 'is-enabled', 'nfs-server.service']) except cliapp.AppException: raise cliapp.AppException('server %s does not control its ' 'nfs server by systemd' % server) # TFTP server exports /srv/nfsboot/tftp tftp_root = os.path.join(self._nfsboot_root, 'tftp') try: cliapp.ssh_runcmd( 'root@%s' % server, ['test' , '-d', tftp_root]) except cliapp.AppException: raise cliapp.AppException('server %s does not export %s' % (tftp_root, server)) def version_exists(self, versioned_root, location): try: cliapp.ssh_runcmd('root@%s' % location, ['test', '-d', versioned_root]) except cliapp.AppException: return False return True NFSBootCheckExtension().run()