feat(homelab): start implementing route generation
This commit is contained in:
@@ -6,6 +6,7 @@ NAMESPACES=(
|
||||
"home"
|
||||
"longhorn-system"
|
||||
"pihole-system"
|
||||
"media"
|
||||
)
|
||||
|
||||
OUTPUT_FILE="kustomize/traefik/chains.yaml"
|
||||
|
||||
155
nix/homelab/scripts/generate-routes.sh
Executable file
155
nix/homelab/scripts/generate-routes.sh
Executable file
@@ -0,0 +1,155 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
# Route definitions: name:hostname:port:protocol:private
|
||||
# - name: service name (required)
|
||||
# - hostname: custom hostname, use '-' for default (name.lucalise.ca)
|
||||
# - port: service port (required)
|
||||
# - protocol: TCP (default) or UDP
|
||||
# - private: true/false (default false) - adds private-networks middleware
|
||||
ROUTES=(
|
||||
"sonarr:-:8989:TCP:true"
|
||||
"radarr:-:7878:TCP:true"
|
||||
"prowlarr:-:9696:TCP:true"
|
||||
"bazarr:-:6767:TCP:true"
|
||||
"jellyfin:media:8096:TCP:false"
|
||||
"home-assistant:-:8123:TCP:true"
|
||||
)
|
||||
|
||||
DOMAIN="lucalise.ca"
|
||||
OUTPUT_DIR="kustomize/routes"
|
||||
|
||||
generate_http_route() {
|
||||
local name="$1"
|
||||
local hostname="$2"
|
||||
local port="$3"
|
||||
local protocol="$4"
|
||||
local private="$5"
|
||||
|
||||
if [[ -z "$hostname" || "$hostname" == "-" ]]; then
|
||||
hostname="$name"
|
||||
fi
|
||||
|
||||
if [[ -z "$protocol" ]]; then
|
||||
protocol="TCP"
|
||||
fi
|
||||
|
||||
if [[ -z "$private" ]]; then
|
||||
private="false"
|
||||
fi
|
||||
|
||||
local fqdn="${hostname}.${DOMAIN}"
|
||||
|
||||
local filters_section=""
|
||||
if [[ "$private" == "true" ]]; then
|
||||
filters_section=" - filters:
|
||||
- type: ExtensionRef
|
||||
extensionRef:
|
||||
group: traefik.io
|
||||
kind: Middleware
|
||||
name: private-networks
|
||||
backendRefs:"
|
||||
else
|
||||
filters_section=" - backendRefs:"
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
apiVersion: gateway.networking.k8s.io/v1
|
||||
kind: HTTPRoute
|
||||
metadata:
|
||||
name: ${name}
|
||||
namespace: media
|
||||
spec:
|
||||
parentRefs:
|
||||
- name: traefik-gateway
|
||||
namespace: kube-system
|
||||
hostnames:
|
||||
- "${fqdn}"
|
||||
rules:
|
||||
${filters_section}
|
||||
- name: ${name}
|
||||
port: ${port}
|
||||
EOF
|
||||
}
|
||||
|
||||
write_kustomization() {
|
||||
local kustomization_file="${OUTPUT_DIR}/../kustomization.yaml"
|
||||
local temp_file=$(mktemp)
|
||||
|
||||
# Collect new route paths
|
||||
local route_paths=()
|
||||
for route in "${ROUTES[@]}"; do
|
||||
IFS=':' read -r name _ _ _ _ <<< "$route"
|
||||
route_paths+=(" - ./routes/${name}.yaml")
|
||||
done
|
||||
|
||||
local in_resources=false
|
||||
local resources_written=false
|
||||
|
||||
while IFS= read -r line; do
|
||||
# Detect resources section
|
||||
if [[ "$line" == "resources:" ]]; then
|
||||
in_resources=true
|
||||
echo "$line" >> "$temp_file"
|
||||
continue
|
||||
fi
|
||||
|
||||
# If in resources section
|
||||
if [[ "$in_resources" == true ]]; then
|
||||
# Check if line is a resource entry (starts with " - ")
|
||||
if [[ "$line" =~ ^[[:space:]]*-[[:space:]] ]]; then
|
||||
# Skip route entries, keep everything else
|
||||
if [[ "$line" =~ \./routes/ ]]; then
|
||||
continue
|
||||
else
|
||||
echo "$line" >> "$temp_file"
|
||||
fi
|
||||
else
|
||||
# End of resources section - write new routes before moving on
|
||||
if [[ "$resources_written" == false ]]; then
|
||||
for route_path in "${route_paths[@]}"; do
|
||||
echo "$route_path" >> "$temp_file"
|
||||
done
|
||||
resources_written=true
|
||||
fi
|
||||
in_resources=false
|
||||
echo "$line" >> "$temp_file"
|
||||
fi
|
||||
else
|
||||
echo "$line" >> "$temp_file"
|
||||
fi
|
||||
done < "$kustomization_file"
|
||||
|
||||
# If file ended while still in resources section, write routes now
|
||||
if [[ "$in_resources" == true && "$resources_written" == false ]]; then
|
||||
for route_path in "${route_paths[@]}"; do
|
||||
echo "$route_path" >> "$temp_file"
|
||||
done
|
||||
fi
|
||||
|
||||
mv "$temp_file" "$kustomization_file"
|
||||
echo "Updated ${kustomization_file} with ${#route_paths[@]} routes"
|
||||
}
|
||||
|
||||
main() {
|
||||
mkdir -p "${OUTPUT_DIR}"
|
||||
|
||||
for route in "${ROUTES[@]}"; do
|
||||
IFS=':' read -r name hostname port protocol private <<< "$route"
|
||||
|
||||
echo "Generating route for ${name}..."
|
||||
|
||||
output_file="${OUTPUT_DIR}/${name}.yaml"
|
||||
generate_http_route "$name" "$hostname" "$port" "$protocol" "$private" > "$output_file"
|
||||
|
||||
echo " -> ${output_file}"
|
||||
done
|
||||
|
||||
echo ""
|
||||
write_kustomization
|
||||
echo ""
|
||||
echo "Done! Generated ${#ROUTES[@]} routes."
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user