import yaml def str_presenter(dumper, data): if '\n' in data: return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|') return dumper.represent_scalar('tag:yaml.org,2002:str', data) yaml.add_representer(str, str_presenter) yaml.representer.SafeRepresenter.add_representer(str, str_presenter) with open('homelab-gitops-repo/manifests/spaceport/homepage/homepage.yaml', 'r', encoding='utf-8') as f: text = f.read() docs = list(yaml.safe_load_all(text)) cm = docs[2] services_yaml = """- Critical Services: - Authentik: icon: authentik.png href: https://authentik.snarfnet.net description: SSO & Identity Management - PeaNUT UPS: icon: peanut.png href: https://portal.snarfnet.net description: UPS Power & Battery Monitor - Unifi Controller: icon: unifi.png href: https://unifi.ui.com widget: type: unifi url: https://140.44.44.1 username: Snarf password: Katzir476!!! - GitOps & Automation: - Gitea: icon: gitea.png href: https://git.snarfnet.net description: Git Repositories widget: type: gitea url: https://git.snarfnet.net key: f19e772cf54e40ceb2befe452e2bc24dd81fdb71 - ArgoCD: icon: argocd.png href: https://argo.snarfnet.net description: Declarative GitOps Reconciler widget: type: argocd url: https://argo.snarfnet.net key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJob21lcGFnZTphcGlLZXkiLCJuYmYiOjE3OTQ1MDIwNzgsImlhdCI6MTc5NDUwMjA3OCwianRpIjoiZjQ2NzU0NjMtODRhOS00MjI0LWI3ODItNmY5ODQxYWEwY2UxIn0.aHhrny2RBG-vAJAyXMvan0jw65jkP3bguqEduaG78O0 - AWX Automation: icon: awx.png href: https://awx.snarfnet.net description: Ansible Automation Controller - Semaphore: icon: semaphore.png href: https://semaphore.snarfnet.net description: Playbook Execution Engine - Storage & Clusters: - Longhorn Aerodrome: icon: longhorn.png href: https://longhorn.aerodrome.snarfnet.net description: Aerodrome Distributed Flash Storage - Longhorn Spaceport: icon: longhorn.png href: https://longhorn.spaceport.snarfnet.net description: Spaceport Distributed Block Storage - Rancher (Aerodrome): icon: rancher.png href: https://aerodrome.snarfnet.net description: Kubernetes Management Console widget: type: customapi url: https://aerodrome.snarfnet.net/v3/clusters/local headers: Authorization: "Bearer kubeconfig-u-aqzkufonck4hmbd:bw22b96nv8844k8w5r8lzpz8gnk22tjwj95j6nkzr7hd5dhm4bs6z7" mappings: - field: capacity.cpu label: CPU Cores - field: capacity.pods label: Max Pods - field: state label: Cluster State - Harvester HCI (Spacedock): icon: harvester.png href: https://harvester.spacedock.snarfnet.net description: HCI Virtualization Hypervisors widget: type: customapi url: https://aerodrome.snarfnet.net/v3/clusters/c-cclnt headers: Authorization: "Bearer kubeconfig-u-aqzkufonck4hmbd:bw22b96nv8844k8w5r8lzpz8gnk22tjwj95j6nkzr7hd5dhm4bs6z7" mappings: - field: capacity.cpu label: CPU Cores - field: capacity.pods label: Max Pods - field: state label: HCI State - Portainer Swarm: icon: portainer.png href: https://shipyard.snarfnet.net description: Docker Swarm Container Fleet widget: type: portainer url: https://140.44.4.71:9443 env: 3 key: ptr_TCVm8ujeB4zT0oRejyMCwKw5enaPG/uKj1KuF0uOWX8= - Infrastructure & Observability: - NGINX Proxy Manager: icon: nginx-proxy-manager href: https://nginx.snarfnet.net description: Reverse Proxy & SSL Certificates - Uptime Kuma: icon: uptime-kuma href: https://uptime.snarfnet.net description: Multi-Endpoint Availability Probes widget: type: uptimekuma url: http://140.44.4.28:448 slug: default - Zabbix: icon: zabbix.png href: https://zabbix.snarfnet.net description: Infrastructure Metrics & Alarms - Grafana: icon: grafana.png href: https://grafana.snarfnet.net description: Real-Time Metrics & AI Dashboards widget: type: grafana url: https://grafana.snarfnet.net username: admin password: Katzir476!!! - Core Node Glances: icon: glances.png href: http://140.44.4.11:61208 description: Host Resource Monitor - Environment & Weather: - Tempest Weather Station: icon: weather.png href: https://snarfhome.snarfnet.net description: Backyard Weather Telemetry widget: type: homeassistant url: http://14.4.4.20:8123 key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIzZWUyNTE1MDk0NGU0ZjRjYmJkMGM1MWI5MThmY2EzYiIsImlhdCI6MTc0NjgxMDM3NSwiZXhwIjoyMDYyMTcwMzc1fQ.Le6M7WL63nxtLTxccFacQR5GVUY5C-a_zGtmXT_uaz4 custom: - template: "{{ states('sensor.st_00158555_temperature') | float(0) | round(1) }} °F" label: Outdoor Temp - template: "{{ states('sensor.st_00158555_feels_like') | float(0) | round(1) }} °F" label: Feels Like - template: "{{ states('sensor.st_00158555_humidity') | float(0) | round(1) }} %" label: Humidity - template: "{{ states('sensor.st_00158555_wind_speed') | float(0) | round(1) }} mph" label: Wind Speed """ settings_yaml = """title: SnarfNet Operations & Telemetry headerStyle: boxed color: slate theme: dark statusStyle: badge background: image: https://i.imgur.com/hOzzkCY.jpeg blur: sm opacity: 50 brightness: 50 cardBlur: sm quicklaunch: searchDescriptions: true hideInternetSearch: true hideVisitURL: true hideVersion: true layout: Critical Services: icon: mdi-shield-check style: row columns: 3 GitOps & Automation: icon: mdi-git style: row columns: 4 Storage & Clusters: icon: mdi-server-network style: row columns: 3 Infrastructure & Observability: icon: mdi-chart-timeline-variant style: row columns: 3 Environment & Weather: icon: mdi-weather-partly-cloudy style: row columns: 1 showStats: true providers: longhorn: url: http://longhorn-backend.longhorn-system.svc.cluster.local:9500 """ widgets_yaml = """- kubernetes: cluster: show: true cpu: true memory: true show_names: true nodes: show: false - longhorn: total: true nodes: false - resources: label: System backend: resources cpu: true expanded: true memory: true disk: / - search: provider: duckduckgo target: _blank """ bookmarks_yaml = """- Quick Links: - GitHub: - abbr: GH href: https://github.com/ - UniFi Site Manager: - abbr: UI href: https://unifi.ui.com/ - Cloudflare: - abbr: CF href: https://dash.cloudflare.com/ """ cm['data']['services.yaml'] = services_yaml cm['data']['settings.yaml'] = settings_yaml cm['data']['widgets.yaml'] = widgets_yaml cm['data']['bookmarks.yaml'] = bookmarks_yaml cm['data']['kubernetes.yaml'] = "mode: cluster\n" with open('homelab-gitops-repo/manifests/spaceport/homepage/homepage.yaml', 'w', encoding='utf-8') as f: yaml.dump_all(docs, f, sort_keys=False, default_flow_style=False, allow_unicode=True) print("Saved clean homelab-gitops-repo/manifests/spaceport/homepage/homepage.yaml successfully!")