def rename_container(ssh, old_name, new_name): """Renames a Docker container""" remove_container(ssh, new_name) # to avoid conflicts command = "docker rename " + old_name + " " + new_name ssh_client.ssh_command(ssh, command, True) return
def remove_container(ssh, microservice): """Removes a Docker container""" print(colored("--- Removing pre-existing container...", 'yellow')) command = "docker rm -f " + microservice ssh_client.ssh_command(ssh, command, True) return
def restart_container(ssh, container_id): """Retarts a Docker container""" print(colored("--- Restarting container " + container_id, 'yellow')) command = "docker restart " + container_id ssh_client.ssh_command(ssh, command, True) return
def build_image(ssh, microservice): """Builds a docker image""" remote_dockerfile_path = globals.REMOTE_WORK_DIR + microservice microservice = microservice.lower() # to lowercase for Docker command = "cd " + remote_dockerfile_path + " && docker build -t " + microservice + ":latest ." # moving to Dockerfile dir and building ssh_client.ssh_command(ssh, command, True) return
def stop_container(ssh, microservice, container_id): """Stops a Docker container""" print( colored("--- Stopping previous version of " + microservice + "...", 'yellow')) container_id = container_id[0] # getting from list command = "docker stop " + container_id ssh_client.ssh_command(ssh, command, True) return
def get_container_id(ssh, microservice): """Gets a container's id from its name""" command = "docker ps -qf" + " 'name=" + microservice + "'" # id from name container_id = ssh_client.ssh_command(ssh, command, False) return (container_id)
def health_check(ssh, args): """Checks container's health and runs appropriate actions""" if (args.healthcheck): # healthcheck is optional microservices = args.microservice if ("all" in args.microservice): microservices = globals.APPS # "all" was previously removed for microservice in microservices: microservice = microservice.lower() # to lowercase for Docker print( colored("\n--- Checking health of " + microservice + "...", 'yellow')) command = "docker inspect " + microservice + " --format '{{.State.Health.Status}}'" health = ssh_client.ssh_command(ssh, command, False) health = str(health[0].rstrip().strip()) # parsing return if (health != "healthy" and health != "starting"): # container needs a restart print(colored("Container is " + health, 'red')) restart_container(ssh, microservice) else: print(colored("Container is " + health, 'green')) return
def install_or_update_docker(ssh, callback): """Installs or updates Docker""" local_path = globals.LOCAL_SCRIPT_PATH remote_path = globals.REMOTE_SCRIPT_PATH if (callback == "install"): # callback used to toggle function features message = "--- Installing Docker-ce " elif (callback == "update"): message = "\n--- Updating Docker to " message += globals.EXPECTED_DOCKER_VERSION + "..." print(colored(message, 'yellow')) ftp_client = ssh.open_sftp() ftp_client.put(local_path, remote_path) # sending install script to remote server command = "chmod 755 " + remote_path + "&& sh " + remote_path # running command_output = ssh_client.ssh_command(ssh, command, True) ftp_client.remove(remote_path) # cleaning up ftp_client.close() print(colored("Done\n", 'yellow')) return
def run_container(ssh, microservice): """Runs a Docker container""" print(colored("--- Running new version of service...", 'yellow')) command = "docker run -d --name " + microservice + " --network=host " + microservice + ":latest" # binding ports to host network run_output = ssh_client.ssh_command(ssh, command, True) return (run_output)
def get_docker_version(ssh): """Checks Docker version if any""" docker_version = "" command = "docker ps" command_output = ssh_client.ssh_command(ssh, command, False) if (command_output != []): # Docker version found command = "docker --version" command_output = ssh_client.ssh_command(ssh, command, False) for line in command_output: docker_version += line # retrieving version docker_version = docker_version.split(",")[0] # formatting output docker_version = docker_version.split("Docker version ")[1] # formatting output docker_version = docker_version.split(".")[0] + "." + docker_version.split(".")[1] # formatting output return(docker_version)
def main(): init_log() # load config from settings.py load_config() # init ssh_key and tag object ssh_key = init_ssh_key() tag = init_tag() # destroy all droplet if necessary destroy_all_droplet() # make sure all robot's droplet are destroyed time.sleep(3) manager = digitalocean.Manager(token=config.token) assert len(manager.get_all_droplets(tag_name=config.default_tag_name)) == 0 # create a new droplet droplet = create_new_droplet(ssh_key) # add the default tag to the droplet tag.add_droplets(droplet) # get the necessary information to access machine ip = get_machine_ip() # execute commands on the remote host ssh_connect(ip, 'root', config.public_key_file_path) logging.info('update system..... it takes some time') ssh_command('yum install wget git -y') ssh_command('wget https://raw.githubusercontent.com/zMingGit/general/master/tcp_nanqinlang-1.3.2.sh') ssh_command('chmod u+x tcp_nanqinlang-1.3.2.sh') ssh_command('./tcp_nanqinlang-1.3.2.sh install') ssh_command('reboot') ssh_connect(ip, 'root', config.public_key_file_path) logging.info('install tcp TCP congestion algorithm..... it takes some time') ssh_command('./tcp_nanqinlang-1.3.2.sh start') logging.info('install SSR...') ssh_command('yum install -y epel-release') ssh_command('yum install -y libsodium') ssh_command('git clone https://github.com/shadowsocksrr/shadowsocksr.git') ssh_command("echo '%s' > shadowsocksr/config.json" % config.ssr_config) ssh_command('python shadowsocksr/shadowsocks/server.py -c shadowsocksr/config.json -d start') logging.info('successfully installed')