#!/usr/bin/python3 # -*- encoding: utf-8 -*- # # vim: tabstop=4 shiftwidth=4 softtabstop=4 # # Copyright (c) 2023-2024 Wind River Systems, Inc. # # SPDX-License-Identifier: Apache-2.0 # """ Run feed synchronization between controllers """ import logging as LOG import os import socket import subprocess import sys import upgrade_utils CONTROLLER_0_HOSTNAME = "controller-0" CONTROLLER_1_HOSTNAME = "controller-1" SYSTEM_MODE_SIMPLEX = "simplex" def sync_controllers(feed): controller = socket.gethostname() controller = CONTROLLER_1_HOSTNAME if \ controller == CONTROLLER_0_HOSTNAME else CONTROLLER_0_HOSTNAME LOG.info(f"Synchronizing feed with {controller}...") cmd = [ "rsync", "-ac", "--delete", "--exclude", "tmp", feed, f"rsync://{controller}/feed" ] subprocess.run(cmd, check=True, text=True, capture_output=True) def print_usage(sys_argv): script_name = sys_argv[0] print("Usage: %s --feed=" % script_name) def get_system_mode(): system_mode=None with open(os.devnull, "w") as fnull: cmd = "bash -c 'grep system_mode /etc/platform/platform.conf'" process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, executable='/bin/bash') stdout, stderr = process.communicate() output = stdout.decode("utf-8").strip() error_output = stderr.decode("utf-8").strip() if process.returncode == 0: system_mode = output.split('=')[1] else: LOG.error(f"Error: {error_output}") return system_mode def main(sys_argv): args = upgrade_utils.parse_arguments(sys_argv) try: feed = args["feed"] system_mode = get_system_mode() if system_mode is None: LOG.error("Unable to get the system mode.") return 1 elif system_mode == SYSTEM_MODE_SIMPLEX: LOG.info("System mode is simplex. Skipping sync controllers feed.") return 0 sync_controllers(feed) LOG.info("Feed synchronized between controllers.") except KeyError as e: msg = "%s is not provided" % str(e) LOG.error(msg) print(msg) print_usage(sys_argv) return 1 except subprocess.CalledProcessError as e: LOG.exception("Feed synchronization command failed. Error: %s", e.stderr) return 1 except Exception as e: LOG.exception("Feed synchronization failed. Error: %s", e) return 1 if __name__ == "__main__": upgrade_utils.configure_logging('/var/log/software.log', log_level=LOG.INFO) sys.exit(main(sys.argv))