Source code for cloudmesh_client.cloud.sync

from __future__ import print_function

import os
import platform
from cloudmesh_client.shell.console import Console
from cloudmesh_client.common.ConfigDict import Config
from cloudmesh_client.common.ConfigDict import ConfigDict
from cloudmesh_client.common.Shell import Shell


[docs]class Sync(object):
[docs] @classmethod def sync(cls, cloudname, localdir, remotedir, operation=None): """ Syncs a local directory with a remote directory. Either from local to remote OR vice-versa :param cloudname: :param localdir: :param remotedir: :param operation: get/put :return: """ # Get the operating system os_type = cls.operating_system() # fix the local dir path localdirpath = Config.path_expand(localdir) # check if local directory exists if not os.path.exists(localdirpath): if operation == "put": Console.error("The local directory [{}] does not exist." .format(localdirpath)) return None elif operation == "get": # for receiving, create local dir os.mkdir(localdirpath) Console.msg("Created local directory [{}] for sync." .format(localdirpath)) """ rsync now works on windows machines as well. we install rsync (v5.4.1.20150827) on windows via chocolatey $ choco install rsync """ host = cls.get_host(cloudname) if host is None: Console.error("Cloud [{}] not found in cloudmesh.yaml file." .format(cloudname)) return None else: args = None if operation == "put": args = [ "-r", localdir, host + ":" + remotedir ] elif operation == "get": args = [ "-r", host + ":" + remotedir, localdir ] # call rsync return Shell.rsync(*args)
[docs] @classmethod def operating_system(cls): return platform.system().lower()
[docs] @classmethod def get_host(cls, cloudname): """ Method to get host for cloud from the cloudmesh.yaml file :param cloudname: :return: """ # Get the remote host details # search based on cloudname config = ConfigDict("cloudmesh.yaml") clouds = config["cloudmesh"]["clouds"] # check if cloud exists in yaml if clouds[cloudname] is not None: # get the host for cloud hostname = clouds[cloudname]["cm_host"] return hostname else: return None
[docs] @classmethod def get_hostname(cls, host): """ Method to return hostname for a host in ssh config :param host: :return: """ filename = Config.path_expand("~/.ssh/config") with open(filename, 'r') as f: lines = f.read().split("\n") found = False for line in lines: # search for host if "Host " in line: _host = line.strip().replace("Host ", "", 1).replace(" ", "") # if host found in ssh config if _host == host: found = True pass # search for hostname if "Hostname " in line and found is True: # return corresponding hostname hostname = line.strip().replace("Hostname ", "", 1).replace(" ", "") return hostname
[docs] @classmethod def get_hostuser(cls, host): """ Method to return user login for a host in ssh config :param host: :return: """ filename = Config.path_expand("~/.ssh/config") with open(filename, 'r') as f: lines = f.read().split("\n") found = False for line in lines: # search for host if "Host " in line: _host = line.strip().replace("Host ", "", 1).replace(" ", "") # if host found in ssh config if _host == host: found = True pass # search for user if "User " in line and found is True: # return corresponding user username = line.strip().replace("User ", "", 1).replace(" ", "") return username