Compare commits
	
		
			2 commits
		
	
	
		
			22e5ffb4b4
			...
			6b54f0bc42
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6b54f0bc42 | |||
| be8f8fbbf9 | 
					 1 changed files with 63 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -1,16 +1,19 @@
 | 
			
		|||
#!/usr/bin/env python3
 | 
			
		||||
import argparse
 | 
			
		||||
import json
 | 
			
		||||
import ipaddress 
 | 
			
		||||
import ipaddress
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
from subprocess import check_output
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _get_available_machines() -> list:
 | 
			
		||||
    output = check_output(['nix', 'flake', 'show', '--json'])
 | 
			
		||||
    output = check_output(["nix", "flake", "show", "--json"])
 | 
			
		||||
    parsed_output = json.loads(output)
 | 
			
		||||
    machines = parsed_output.get('nixosConfigurations', dict()).keys()
 | 
			
		||||
    machines = parsed_output.get("nixosConfigurations", dict()).keys()
 | 
			
		||||
    return list(machines)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _validate_ip(ip: str) -> bool:
 | 
			
		||||
    try:
 | 
			
		||||
        ipaddress.ip_address(ip)
 | 
			
		||||
| 
						 | 
				
			
			@ -18,39 +21,85 @@ def _validate_ip(ip: str) -> bool:
 | 
			
		|||
    except ValueError:
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _check_ssh_connection(ip: str) -> bool:
 | 
			
		||||
    try:
 | 
			
		||||
        check_output(["ssh", f"root@{ip}", "echo", "Connected"])
 | 
			
		||||
        return True
 | 
			
		||||
    except Exception:
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def bootstrap_machine(ip: str):
 | 
			
		||||
    check_output(
 | 
			
		||||
        [
 | 
			
		||||
            "nix",
 | 
			
		||||
            "run",
 | 
			
		||||
            "github:nix-community/nixos-anywhere",
 | 
			
		||||
            "--",
 | 
			
		||||
            "--flake",
 | 
			
		||||
            '".#bootstrap"',
 | 
			
		||||
            "--target-host",
 | 
			
		||||
            f"root@{ip}",
 | 
			
		||||
            "--build-on-remote",
 | 
			
		||||
        ]
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_ssh_key(ip: str) -> str:
 | 
			
		||||
    """
 | 
			
		||||
    This function uses machines ssh-keyscan to get the ssh key and then get the ed25519 key
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_machine_config(machine_name: str) -> dict:
 | 
			
		||||
    output = check_output(['nix', 'eval', '--json', f'.#nixosConfigurations.{machine_name}.config.kropcloud'])
 | 
			
		||||
    output = check_output(
 | 
			
		||||
        [
 | 
			
		||||
            "nix",
 | 
			
		||||
            "eval",
 | 
			
		||||
            "--json",
 | 
			
		||||
            f".#nixosConfigurations.{machine_name}.config.kropcloud",
 | 
			
		||||
        ]
 | 
			
		||||
    )
 | 
			
		||||
    return json.loads(output)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main() -> int:
 | 
			
		||||
    parser = argparse.ArgumentParser(description='Install a machine')
 | 
			
		||||
    parser.add_argument('machine_name', type=str, help='The name of the machine to install')
 | 
			
		||||
    parser.add_argument('machine_ip', type=str, help='The ip of the machine to install')
 | 
			
		||||
    parser = argparse.ArgumentParser(description="Install a machine")
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        "machine_name", type=str, help="The name of the machine to install"
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument("machine_ip", type=str, help="The ip of the machine to install")
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
    machine_name = args.machine_name
 | 
			
		||||
    if not machine_name in _get_available_machines():
 | 
			
		||||
        raise ValueError(f'Machine {machine_name} not found, available machines are: {_get_available_machines()}')
 | 
			
		||||
    if machine_name not in _get_available_machines():
 | 
			
		||||
        raise ValueError(
 | 
			
		||||
            f"Machine {machine_name} not found, available machines are: {_get_available_machines()}"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    if _validate_ip(args.machine_ip):
 | 
			
		||||
        raise ValueError(f'Invalid IP address {args.machine_ip}')
 | 
			
		||||
        raise ValueError(f"Invalid IP address {args.machine_ip}")
 | 
			
		||||
 | 
			
		||||
    machine_config = get_machine_config(machine_name)
 | 
			
		||||
    print(machine_config)
 | 
			
		||||
    # We are bootstraping the machine first because we need their ssh keys
 | 
			
		||||
    bootstrap_machine()
 | 
			
		||||
 | 
			
		||||
    # while not check_ssh_connection():
 | 
			
		||||
    #     time.sleep(5)
 | 
			
		||||
    while not _check_ssh_connection():
 | 
			
		||||
        time.sleep(5)
 | 
			
		||||
 | 
			
		||||
    # # connect and get ssh keys
 | 
			
		||||
 | 
			
		||||
    # ssh_key = get_ssh_key()
 | 
			
		||||
 | 
			
		||||
    # Add the ssh key to keys in secrets/secrets.nix
 | 
			
		||||
    # and rekey the secrets
 | 
			
		||||
 | 
			
		||||
    # install_machine()
 | 
			
		||||
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    raise SystemExit(main())
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    raise SystemExit(main())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue