summaryrefslogtreecommitdiff
path: root/extensions/ssh-rsync.check
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/ssh-rsync.check')
-rwxr-xr-xextensions/ssh-rsync.check84
1 files changed, 84 insertions, 0 deletions
diff --git a/extensions/ssh-rsync.check b/extensions/ssh-rsync.check
new file mode 100755
index 00000000..fc9bf62d
--- /dev/null
+++ b/extensions/ssh-rsync.check
@@ -0,0 +1,84 @@
+#!/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 <http://www.gnu.org/licenses/>.
+
+'''Preparatory checks for Morph 'ssh-rsync' write extension'''
+
+
+import os
+import json
+import logging
+
+import writeexts
+
+
+class SshRsyncCheckExtension(writeexts.WriteExtension):
+ def process_args(self, args):
+ if len(args) != 1:
+ raise writeexts.ExtensionError(
+ 'Wrong number of command line args')
+
+ upgrade = self.get_environment_boolean('UPGRADE')
+ if not upgrade:
+ raise writeexts.ExtensionError(
+ 'The ssh-rsync write is for upgrading existing remote '
+ 'Baserock machines. It cannot be used for an initial '
+ 'deployment.')
+
+ if os.environ.get('VERSION_LABEL', '') == '':
+ raise writeexts.ExtensionError(
+ 'A VERSION_LABEL must be set when deploying an upgrade.')
+
+ location = args[0]
+ self.check_ssh_connectivity(location)
+
+ self.check_version_label(location, os.environ['VERSION_LABEL'])
+ self.check_is_baserock_system(location)
+
+ # The new system that being deployed as an upgrade must contain
+ # baserock-system-config-sync and system-version-manager. However, the
+ # old system simply needs to have SSH and rsync.
+ self.check_command_exists(location, 'rsync')
+
+ def check_is_baserock_system(self, location):
+ output = writeexts.ssh_runcmd(
+ location,
+ ['sh', '-c', 'test -d /baserock || echo -n dirnotfound'])
+ if output == 'dirnotfound':
+ raise writeexts.ExtensionError('%s is not a baserock system'
+ % location)
+
+ def check_command_exists(self, location, command):
+ test = 'type %s > /dev/null 2>&1 || echo -n cmdnotfound' % command
+ output = writeexts.ssh_runcmd(location, ['sh', '-c', test])
+ if output == 'cmdnotfound':
+ raise writeexts.ExtensionError(
+ "%s does not have %s" % (location, command))
+
+ def check_version_label(self, location, version_label):
+ args = ['system-version-manager', 'list', '--json']
+
+ try:
+ output = writeexts.ssh_runcmd(location, args)
+ except writeexts.ExtensionError:
+ msg = ("Couldn't get system list from system-version-manager, "
+ "skipping version label check")
+ logging.exception(msg)
+ return
+
+ if version_label in json.loads(output):
+ raise writeexts.ExtensionError(
+ "There is already a system called `%s'" % version_label)
+
+SshRsyncCheckExtension().run()