Exemple #1
0
def main():
    cloud_ip = get_cloud_ip(TEAM)
    if not cloud_ip:
        print("msg: ERR, no vm slots precreated")
        return 1

    image_state = open("db/team%d/image_deploy_state" % TEAM).read().strip()

    log_progress("5%")

    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_CLOUD_OPTS +
                                   [file_from, file_to])
        if not ret:
            log_stderr("scp to CLOUD failed")
            return 1

        log_progress("25%")

        cmd = ["sudo", "/cloud/scripts/launch_vm.sh", str(TEAM)]
        ret = call_unitl_zero_exit(["ssh"] + SSH_CLOUD_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
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
Exemple #3
0
def main():
    if not re.fullmatch(r"[0-9a-zA-Z_]+", NAME):
        print("msg: ERR, name validation error")
        return 1

    image_state = open("db/team%d/image_deploy_state" % TEAM).read().strip()

    if image_state == "NOT_STARTED":
        print("msg: ERR, vm is not started")
        return 1

    if image_state == "RUNNING":
        cloud_ip = get_cloud_ip(TEAM)
        if not cloud_ip:
            log_stderr("no cloud ip, exiting")
            return 1

        cmd = ["sudo", "/cloud/scripts/take_snapshot.sh", str(TEAM), NAME]
        ret = call_unitl_zero_exit(["ssh"] + SSH_CLOUD_OPTS + [cloud_ip] + cmd,
                                   redirect_out_to_err=False,
                                   attempts=1)
        if not ret:
            log_stderr("take shapshot failed")
            return 1
    return 0
def main():
    team_state = open("db/team%d/team_state" % TEAM).read().strip()
    if team_state != "NOT_CLOUD":
        log_stderr("switch team to non cloud first")
        return 1

    image_state = open("db/team%d/image_deploy_state" % TEAM).read().strip()

    if image_state == "RUNNING":
        cloud_ip = get_cloud_ip(TEAM)
        if not cloud_ip:
            log_stderr("no cloud_ip ip, exiting")
            return 1

        cmd = ["sudo", "/cloud/scripts/remove_vm.sh", str(TEAM)]
        ret = call_unitl_zero_exit(["ssh"] + SSH_YA_OPTS + [cloud_ip] + cmd)
        if not ret:
            log_stderr("failed to remove team vm")
            return 1
        image_state = "NOT_STARTED"
        open("db/team%d/image_deploy_state" % TEAM, "w").write(image_state)

    if image_state == "NOT_STARTED":
        net_state = open("db/team%d/net_deploy_state" % TEAM).read().strip()
        if net_state == "NOT_STARTED":
            log_stderr("returning slot to cloud")
            untake_cloud_ip(TEAM)
        return 0
    return 1
Exemple #5
0
def main():
    vmname = get_vm_name_by_num(VMNUM)

    if not vmname:
        log_stderr("vm not found")
        return 1

    image_state = open("db/team%d/serv%d_image_deploy_state" % (TEAM, VMNUM)).read().strip()

    if image_state == "RUNNING":
        cloud_ip = get_cloud_ip(TEAM)
        if not cloud_ip:
            log_stderr("no cloud_ip ip, exiting")
            return 1

        cmd = ["sudo", "/cloud/scripts/remove_vm.sh", str(TEAM), str(VMNUM), str(vmname)]
        ret = call_unitl_zero_exit(["ssh"] + SSH_CLOUD_OPTS + [cloud_ip] + cmd)
        if not ret:
            log_stderr("failed to remove team vm")
            return 1
        image_state = "NOT_STARTED"
        open("db/team%d/serv%d_image_deploy_state" % (TEAM, VMNUM), "w").write(image_state)

    if image_state == "NOT_STARTED":
        return 0
    return 1
Exemple #6
0
def main():
    team_state = open("db/team%d/team_state" % TEAM).read().strip()

    if team_state == "NOT_CLOUD":
        cmd = ["sudo", "/root/cloud/open_network.sh", str(TEAM)]
        ret = call_unitl_zero_exit(["ssh"] + SSH_CLOUD_OPTS + [ROUTER_HOST] + cmd)
        if not ret:
            log_stderr("open_network")
            return 1
        team_state = "CLOUD"
        open("db/team%d/team_state" % TEAM, "w").write(team_state)
    
    if team_state == "CLOUD":
        print("msg: OK")
        return 0

    return 1
Exemple #7
0
def main():
    network_state = open("db/team%d/network_state" % TEAM).read().strip()

    if network_state == "OPEN":
        cmd = ["sudo", "/root/cloud/isolate_network.sh", str(TEAM)]
        ret = call_unitl_zero_exit(cmd)
        if not ret:
            log_stderr("isolate_network")
            return 1

        network_state = "ISOLATED"
        open("db/team%d/network_state" % TEAM, "w").write(network_state)

    if network_state == "ISOLATED":
        print("msg: OK")
        return 0
    return 1
Exemple #8
0
def main():
    image_state = open("db/team%d/image_deploy_state" % TEAM).read().strip()

    if image_state == "NOT_STARTED":
        print("msg: ERR, vm is not started")
        return 1

    if image_state == "RUNNING":
        cloud_ip = get_cloud_ip(TEAM)
        if not cloud_ip:
            log_stderr("no cloud ip, exiting")
            return 1

        cmd = ["sudo", "/cloud/scripts/reboot_vm.sh", str(TEAM)]
        ret = call_unitl_zero_exit(["ssh"] + SSH_CLOUD_OPTS + [cloud_ip] + cmd,
                                   redirect_out_to_err=False,
                                   attempts=1)
        if not ret:
            log_stderr("reboot vm failed")
            return 1
        return 0

    log_stderr("unknown state")
    return 1
Exemple #9
0
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
Exemple #10
0
def main():
    team_state = open("db/team%d/team_state" % TEAM).read().strip()
    if team_state != "NOT_CLOUD":
        log_stderr("switch team to non cloud first")
        return 1

    net_state = open("db/team%d/net_deploy_state" % TEAM).read().strip()

    droplet_id = None
    if net_state == "READY":
        cloud_ip = get_cloud_ip(TEAM)
        if not cloud_ip:
            log_stderr("no cloud ip, exiting")
            return 1

        cmd = ["sudo", "/cloud/scripts/remove_intra_vpn.sh", str(TEAM)]
        ret = call_unitl_zero_exit(["ssh"] + SSH_YA_OPTS +
                                   [cloud_ip] + cmd)
        if not ret:
            log_stderr("remove team intra vpn failed")
            return 1

        net_state = "DO_DEPLOYED"
        open("db/team%d/net_deploy_state" % TEAM, "w").write(net_state)

    if net_state == "DO_DEPLOYED":
        net_state = "DNS_REGISTERED"
        open("db/team%d/net_deploy_state" % TEAM, "w").write(net_state)

    if net_state == "DNS_REGISTERED":
        domain_ids = do_api.get_domain_ids_by_hostname(
            VM_NAME, DOMAIN, print_warning_on_fail=True)
        if domain_ids is None:
            log_stderr("failed to get domain ids, exiting")
            return 1

        for domain_id in domain_ids:
            if not do_api.delete_domain_record(domain_id, DOMAIN):
                log_stderr("failed to delete domain %d, exiting" % domain_id)
                return 1

        net_state = "DO_LAUNCHED"
        open("db/team%d/net_deploy_state" % TEAM, "w").write(net_state)

    if net_state == "DO_LAUNCHED":
        do_ids = do_api.get_ids_by_vmname(VM_NAME)

        if do_ids is None:
            log_stderr("failed to get vm ids, exiting")
            return 1

        if len(do_ids) > 1:
            log_stderr("warinig: more than 1 droplet to be deleted")

        for do_id in do_ids:
            if not do_api.delete_vm_by_id(do_id):
                log_stderr("failed to delete droplet %d, exiting" % do_id)
                return 1

        net_state = "NOT_STARTED"
        open("db/team%d/net_deploy_state" % TEAM, "w").write(net_state)

    if net_state == "NOT_STARTED":
        image_state = open("db/team%d/image_deploy_state" % TEAM).read().strip()
        if image_state == "NOT_STARTED":
            log_stderr("returning slot to cloud")
            untake_cloud_ip(TEAM)
        return 0
    return 1