khuedoan-homelab/scripts/configure
2024-04-20 02:38:11 +07:00

114 lines
3.0 KiB
Python
Executable File

#!/usr/bin/env python
# WIP
# TODO clean this up
"""
Basic configure script for new users
"""
import fileinput
import subprocess
import sys
from rich.prompt import Confirm, Prompt
upstream_config = {
"seed_repo": "https://github.com/khuedoan/homelab",
"domain": "khuedoan.com",
"timezone": "Asia/Ho_Chi_Minh",
"terraform_workspace": "khuedoan",
"loadbalancer_ip_range": "192.168.1.224/27",
}
def check_python_version(required_version: str) -> None:
if sys.version_info < tuple(map(int, required_version.split('.'))):
raise Exception(f"Must be using Python >= {required_version}")
def find_and_replace(pattern: str, replacement: str, paths: list[str]) -> None:
files_with_matches = subprocess.run(
["git", "grep", "--files-with-matches", pattern, "--"] + paths,
capture_output=True,
text=True
).stdout.splitlines()
for file_with_maches in files_with_matches:
with fileinput.FileInput(file_with_maches, inplace=True) as file:
for line in file:
print(line.replace(pattern, replacement), end='')
def main() -> None:
check_python_version(
required_version='3.10.0'
)
editor = Prompt.ask("Select text editor", default='nvim')
domain = Prompt.ask("Enter your domain", default=upstream_config['domain'])
seed_repo = Prompt.ask("Enter seed repo", default=upstream_config['seed_repo'])
timezone = Prompt.ask("Enter time zone", default=upstream_config['timezone'])
loadbalancer_ip_range = Prompt.ask("Enter IP range for load balancer", default=upstream_config['loadbalancer_ip_range'])
find_and_replace(
pattern=upstream_config['domain'],
replacement=domain,
paths=[
".ci",
"apps",
"platform",
"system",
"external"
]
)
find_and_replace(
pattern=upstream_config['seed_repo'],
replacement=seed_repo,
paths=[
"system",
"platform"
]
)
find_and_replace(
pattern=upstream_config['timezone'],
replacement=timezone,
paths=[
"apps",
"system",
"metal"
]
)
find_and_replace(
pattern=upstream_config['loadbalancer_ip_range'],
replacement=loadbalancer_ip_range,
paths=[
"metal/inventories/prod.yml",
"apps/tailscale/values.yaml",
]
)
if Confirm.ask("Update server list?", default=True):
subprocess.run(
[editor, 'metal/inventories/prod.yml']
)
if Confirm.ask("Do you want to use managed services?"):
terraform_workspace = Prompt.ask("Enter Terraform Workspace", default=upstream_config['terraform_workspace'])
find_and_replace(
pattern=upstream_config['terraform_workspace'],
replacement=terraform_workspace,
paths=[
"external/versions.tf"
]
)
if __name__ == '__main__':
main()