#!/bin/python3 import yaml, os, sys, time, pathlib, unshare, socket, shutil STORAGE_PATH = os.path.join(os.getcwd(), '.minio-testnet') #STORAGE_PATH = os.path.join('/mnt/windows', '.minio-testnet') MINIO_PATH = '/srv' HOSTS_PATH = os.path.join(STORAGE_PATH, 'hosts.txt') UNIX_SOCK = os.path.join(STORAGE_PATH, 'deploy.sock') DATA_PATH = lambda nid: os.path.join(STORAGE_PATH, 'data'+str(nid)) def main(): unshare.unshare(unshare.CLONE_NEWNS) os.system("mount --make-rprivate /") # see https://stackoverflow.com/a/41580252 if int(os.environ['ID']) == 1: leader() else: follower() def leader(): shutil.rmtree(STORAGE_PATH, ignore_errors=True) os.makedirs(STORAGE_PATH) os.makedirs(MINIO_PATH, exist_ok=True) print(STORAGE_PATH) sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.bind(UNIX_SOCK) sock.listen() n_serv = n_servers() fl = [ co for co, addr in [ sock.accept() for i in range(n_serv - 1) ]] ips = [ co.makefile().readline().strip() for co in fl ] + [ os.environ['IP'] ] print(f"ips: {ips}") gen_hosts(ips) [ co.send(f"{n_serv}\n".encode()) for co in fl ] mount_hosts() mount_disk() run_minio(n_serv) def follower(): co = None while True: time.sleep(3) try: sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect(UNIX_SOCK) co = sock.makefile() break except Exception as err: print('conn failed, wait,', err) sock.send(f"{os.environ['IP']}\n".encode()) n_serv = int(co.readline()) mount_hosts() mount_disk() run_minio(n_serv) def run_minio(count): cmd = f"minio server --console-address ':9001' --address [{os.environ['IP']}]:9000" for i in range(1,count+1): cmd += f" http://minio{i}:9000{DATA_PATH(i)}" cmd += f" > {os.path.join(STORAGE_PATH, 'minio'+os.environ['ID']+'.log')} 2>&1" os.system(cmd) print("done: ", cmd) def gen_hosts(ips): with open(HOSTS_PATH, 'w') as f: for idx,ip in enumerate(ips): f.write(f"{ip} minio{idx+1}\n") def n_servers(): with open('.current_state.yml', 'r') as f: netw = yaml.safe_load(f) n_servers = len(netw['servers']) return n_servers def mount_disk(): data_path = DATA_PATH(os.environ['ID']) os.makedirs(data_path) def mount_hosts(): os.system(f"mount --bind {HOSTS_PATH} /etc/hosts") __name__ == '__main__' and main()