forked from Deuxfleurs/mknet
79 lines
2.5 KiB
Python
Executable file
79 lines
2.5 KiB
Python
Executable file
#!/bin/python3
|
|
import yaml, os, sys, time, pathlib, unshare, socket, shutil
|
|
|
|
STORAGE_PATH = os.path.join(os.getcwd(), '.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 ]
|
|
|
|
os.system(f"mount --bind {HOSTS_PATH} /etc/hosts")
|
|
|
|
data_path = DATA_PATH(os.environ['ID'])
|
|
os.makedirs(data_path)
|
|
os.system(f"mount --bind {data_path} {MINIO_PATH}")
|
|
|
|
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())
|
|
|
|
os.system(f"mount --bind {HOSTS_PATH} /etc/hosts")
|
|
|
|
data_path = DATA_PATH(os.environ['ID'])
|
|
os.makedirs(data_path)
|
|
|
|
run_minio(n_serv)
|
|
|
|
def run_minio(count):
|
|
#print("minio server --console-address ':9001' --address [" + os.environ['IP'] + "]:9000 http://minio{1.."+str(count)+"}"+MINIO_PATH+" > "+ STORAGE_PATH + "/minio."+ os.environ['ID'] +".log 2>&1")
|
|
os.system("minio server --console-address ':9001' --address [" + os.environ['IP'] + "]:9000 http://minio{1.."+str(count)+"}"+MINIO_PATH+" > "+ STORAGE_PATH + "/minio."+ os.environ['ID'] +".log 2>&1")
|
|
|
|
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
|
|
|
|
__name__ == '__main__' and main()
|