def main(): net_state = open("db/team%d/net_deploy_state" % TEAM).read().strip() droplet_id = None if net_state != "READY": log_stderr("the network state should be READY") return 1 team_state = open("db/team%d/team_state" % TEAM).read().strip() ip = None if team_state == "CLOUD": ip = do_api.get_ip_by_vmname(VM_NAME) if ip is None: log_stderr("no ip, exiting") return 1 cmd = ["systemctl stop openvpn@game_network_team%d" % TEAM] ret = call_unitl_zero_exit(["ssh"] + SSH_DO_OPTS + [ip] + cmd) if not ret: log_stderr("stop main game net tun") return 1 team_state = "MIDDLE_STATE" open("db/team%d/team_state" % TEAM, "w").write(team_state) if team_state == "MIDDLE_STATE": if ip is None: ip = do_api.get_ip_by_vmname(VM_NAME) if ip is None: log_stderr("no ip, exiting") return 1 cmd = [ "sudo", "/root/cloud/switch_team_to_not_cloud.sh", str(TEAM), ip ] ret = call_unitl_zero_exit(["ssh"] + SSH_YA_OPTS + [ROUTER_HOST] + cmd) if not ret: log_stderr("switch_team_to_not_cloud") return 1 team_state = "NOT_CLOUD" open("db/team%d/team_state" % TEAM, "w").write(team_state) if team_state == "NOT_CLOUD": print("msg: OK, now you can reconnect your game router to OpenVPN") return 0 return 1
def main(): net_state = open("db/team%d/net_deploy_state" % TEAM).read().strip() cloud_ip = get_cloud_ip(TEAM) if not cloud_ip: cloud_ip = take_cloud_ip(TEAM) if not cloud_ip: print("msg: ERR, no free vm slots remaining") return 1 log_progress("0%") droplet_id = None if net_state == "NOT_STARTED": exists = do_api.check_vm_exists(VM_NAME) if exists is None: log_stderr("failed to determine if vm exists, exiting") return 1 log_progress("5%") if not exists: droplet_id = do_api.create_vm(VM_NAME, image=DO_IMAGE, ssh_keys=DO_SSH_KEYS) if droplet_id is None: log_stderr("failed to create vm, exiting") return 1 net_state = "DO_LAUNCHED" open("db/team%d/net_deploy_state" % TEAM, "w").write(net_state) time.sleep(1) # this allows to make less requests (there is a limit) log_progress("10%") ip = None if net_state == "DO_LAUNCHED": if not droplet_id: ip = do_api.get_ip_by_vmname(VM_NAME) else: ip = do_api.get_ip_by_id(droplet_id) if ip is None: log_stderr("no ip, exiting") return 1 log_progress("15%") domain_ids = do_api.get_domain_ids_by_hostname(VM_NAME, DOMAIN) if domain_ids is None: log_stderr("failed to check if dns exists, exiting") return 1 if domain_ids: for domain_id in domain_ids: do_api.delete_domain_record(domain_id, DOMAIN) log_progress("17%") if do_api.create_domain_record(VM_NAME, ip, DOMAIN): net_state = "DNS_REGISTERED" open("db/team%d/net_deploy_state" % TEAM, "w").write(net_state) else: log_stderr("failed to create vm: dns register error") return 1 for i in range(20, 60): # just spinning for the sake of smooth progress log_progress("%d%%" % i) time.sleep(1) log_progress("60%") if net_state == "DNS_REGISTERED": if ip is None: ip = do_api.get_ip_by_vmname(VM_NAME) if ip is None: log_stderr("no ip, exiting") return 1 log_progress("65%") file_from = "db/team%d/server_outside.conf" % TEAM file_to = "%s:/etc/openvpn/server_outside_team%d.conf" % (ip, TEAM) ret = call_unitl_zero_exit(["scp"] + SSH_DO_OPTS + [file_from, file_to]) if not ret: log_stderr("scp to DO failed") return 1 log_progress("70%") file_from = "db/team%d/game_network.conf" % TEAM file_to = "%s:/etc/openvpn/game_network_team%d.conf" % (ip, TEAM) ret = call_unitl_zero_exit(["scp"] + SSH_DO_OPTS + [file_from, file_to]) if not ret: log_stderr("scp to DO failed") return 1 log_progress("72%") cmd = ["systemctl start openvpn@server_outside_team%d" % TEAM] ret = call_unitl_zero_exit(["ssh"] + SSH_DO_OPTS + [ip] + cmd) if not ret: log_stderr("start internal tun") return 1 # UNCOMMENT BEFORE THE GAME dest = "10.%d.%d.2" % (60 + TEAM // 256, TEAM % 256) cmd = [ "iptables -t nat -A PREROUTING -d %s -p tcp " % ip + "--dport 22 -j DNAT --to-destination %s:22" % dest ] ret = call_unitl_zero_exit(["ssh"] + SSH_DO_OPTS + [ip] + cmd) if not ret: log_stderr("unable to nat port 22") return 1 net_state = "DO_DEPLOYED" open("db/team%d/net_deploy_state" % TEAM, "w").write(net_state) log_progress("75%") if net_state == "DO_DEPLOYED": log_progress("77%") file_from = "db/team%d/client_intracloud.conf" % TEAM file_to = "%s:/home/cloud/client_intracloud_team%d.conf" % (cloud_ip, TEAM) ret = call_unitl_zero_exit(["scp"] + SSH_YA_OPTS + [file_from, file_to]) if not ret: log_stderr("scp to YA failed") return 1 log_progress("78%") cmd = ["sudo", "/cloud/scripts/launch_intra_vpn.sh", str(TEAM)] ret = call_unitl_zero_exit(["ssh"] + SSH_YA_OPTS + [cloud_ip] + cmd) if not ret: log_stderr("launch team intra vpn") return 1 net_state = "READY" open("db/team%d/net_deploy_state" % TEAM, "w").write(net_state) image_state = open("db/team%d/image_deploy_state" % TEAM).read().strip() log_progress("80%") if net_state == "READY": if image_state == "NOT_STARTED": file_from = "db/team%d/root_passwd_hash.txt" % TEAM file_to = "%s:/home/cloud/root_passwd_hash_team%d.txt" % (cloud_ip, TEAM) ret = call_unitl_zero_exit(["scp"] + SSH_YA_OPTS + [file_from, file_to]) if not ret: log_stderr("scp to YA failed") return 1 log_progress("85%") cmd = ["sudo", "/cloud/scripts/launch_vm.sh", str(TEAM)] ret = call_unitl_zero_exit(["ssh"] + SSH_YA_OPTS + [cloud_ip] + cmd) if not ret: log_stderr("launch team vm") return 1 image_state = "RUNNING" open("db/team%d/image_deploy_state" % TEAM, "w").write(image_state) log_progress("100%") return 0