Compare commits
No commits in common. "6b54f0bc42980b0a502b01ba8d87366e19c263b7" and "22e5ffb4b42e491b724e99c769710a1ad13ac88a" have entirely different histories.
6b54f0bc42
...
22e5ffb4b4
1 changed files with 14 additions and 63 deletions
|
@ -1,19 +1,16 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
import ipaddress
|
import ipaddress
|
||||||
import time
|
|
||||||
|
|
||||||
from subprocess import check_output
|
from subprocess import check_output
|
||||||
|
|
||||||
|
|
||||||
def _get_available_machines() -> list:
|
def _get_available_machines() -> list:
|
||||||
output = check_output(["nix", "flake", "show", "--json"])
|
output = check_output(['nix', 'flake', 'show', '--json'])
|
||||||
parsed_output = json.loads(output)
|
parsed_output = json.loads(output)
|
||||||
machines = parsed_output.get("nixosConfigurations", dict()).keys()
|
machines = parsed_output.get('nixosConfigurations', dict()).keys()
|
||||||
return list(machines)
|
return list(machines)
|
||||||
|
|
||||||
|
|
||||||
def _validate_ip(ip: str) -> bool:
|
def _validate_ip(ip: str) -> bool:
|
||||||
try:
|
try:
|
||||||
ipaddress.ip_address(ip)
|
ipaddress.ip_address(ip)
|
||||||
|
@ -21,85 +18,39 @@ def _validate_ip(ip: str) -> bool:
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return False
|
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:
|
def get_machine_config(machine_name: str) -> dict:
|
||||||
output = check_output(
|
output = check_output(['nix', 'eval', '--json', f'.#nixosConfigurations.{machine_name}.config.kropcloud'])
|
||||||
[
|
|
||||||
"nix",
|
|
||||||
"eval",
|
|
||||||
"--json",
|
|
||||||
f".#nixosConfigurations.{machine_name}.config.kropcloud",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
return json.loads(output)
|
return json.loads(output)
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
def main() -> int:
|
||||||
parser = argparse.ArgumentParser(description="Install a machine")
|
parser = argparse.ArgumentParser(description='Install a machine')
|
||||||
parser.add_argument(
|
parser.add_argument('machine_name', type=str, help='The name of the machine to install')
|
||||||
"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.add_argument("machine_ip", type=str, help="The ip of the machine to install")
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
machine_name = args.machine_name
|
machine_name = args.machine_name
|
||||||
if machine_name not in _get_available_machines():
|
if not machine_name in _get_available_machines():
|
||||||
raise ValueError(
|
raise ValueError(f'Machine {machine_name} not found, available machines are: {_get_available_machines()}')
|
||||||
f"Machine {machine_name} not found, available machines are: {_get_available_machines()}"
|
|
||||||
)
|
|
||||||
|
|
||||||
if _validate_ip(args.machine_ip):
|
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)
|
machine_config = get_machine_config(machine_name)
|
||||||
print(machine_config)
|
print(machine_config)
|
||||||
# We are bootstraping the machine first because we need their ssh keys
|
# We are bootstraping the machine first because we need their ssh keys
|
||||||
bootstrap_machine()
|
bootstrap_machine()
|
||||||
|
|
||||||
while not _check_ssh_connection():
|
# while not check_ssh_connection():
|
||||||
time.sleep(5)
|
# time.sleep(5)
|
||||||
|
|
||||||
# # connect and get ssh keys
|
# # connect and get ssh keys
|
||||||
|
|
||||||
# ssh_key = get_ssh_key()
|
# ssh_key = get_ssh_key()
|
||||||
|
|
||||||
# Add the ssh key to keys in secrets/secrets.nix
|
|
||||||
# and rekey the secrets
|
|
||||||
|
|
||||||
# install_machine()
|
# install_machine()
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
if __name__ == "__main__":
|
raise SystemExit(main())
|
||||||
raise SystemExit(main())
|
|
Loading…
Reference in a new issue