aboutsummaryrefslogtreecommitdiff
path: root/installer/lib/config.sh
blob: fefc838e805d31ca3be6739090236db9d786c2c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/env bash
# config.sh - Configuration and argument handling for archangel installer
# Source this file after common.sh

#############################
# Global Config Variables
#############################

CONFIG_FILE=""
UNATTENDED=false

# These get populated by config file or interactive prompts
FILESYSTEM=""           # "zfs" or "btrfs"
HOSTNAME=""
TIMEZONE=""
LOCALE=""
KEYMAP=""
SELECTED_DISKS=()
RAID_LEVEL=""
WIFI_SSID=""
WIFI_PASSWORD=""
ENCRYPTION_ENABLED=false
ZFS_PASSPHRASE=""
LUKS_PASSPHRASE=""
ROOT_PASSWORD=""
SSH_ENABLED=false
SSH_KEY=""

#############################
# Argument Parsing
#############################

parse_args() {
    while [[ $# -gt 0 ]]; do
        case "$1" in
            --config-file)
                if [[ -n "$2" && ! "$2" =~ ^- ]]; then
                    CONFIG_FILE="$2"
                    shift 2
                else
                    error "--config-file requires a path argument"
                fi
                ;;
            --color)
                enable_color
                shift
                ;;
            --help|-h)
                show_usage
                exit 0
                ;;
            *)
                error "Unknown option: $1 (use --help for usage)"
                ;;
        esac
    done
}

show_usage() {
    cat <<EOF
Usage: archangel [OPTIONS]

Arch Linux installer with ZFS/Btrfs support and snapshot management.

Options:
  --config-file PATH  Use config file for unattended installation
  --color             Enable colored output
  --help, -h          Show this help message

Without --config-file, runs in interactive mode.
See /root/archangel.conf.example for a config template.
EOF
}

#############################
# Config File Loading
#############################

load_config() {
    local config_path="$1"

    if [[ ! -f "$config_path" ]]; then
        error "Config file not found: $config_path"
    fi

    info "Loading config from: $config_path"

    # Source the config file (it's just key=value pairs)
    # shellcheck disable=SC1090
    source "$config_path"

    # Convert DISKS from comma-separated string to array
    if [[ -n "$DISKS" ]]; then
        IFS=',' read -ra SELECTED_DISKS <<< "$DISKS"
    fi

    UNATTENDED=true
    info "Running in unattended mode"
}

check_config() {
    # Only use config when explicitly specified with --config-file
    # This prevents accidental disk destruction from an unnoticed config file
    if [[ -n "$CONFIG_FILE" ]]; then
        load_config "$CONFIG_FILE"
    fi
}

#############################
# Config Validation
#############################

validate_config() {
    local errors=0

    [[ -z "$HOSTNAME" ]] && { warn "HOSTNAME not set"; ((errors++)); }
    [[ -z "$TIMEZONE" ]] && { warn "TIMEZONE not set"; ((errors++)); }
    [[ ${#SELECTED_DISKS[@]} -eq 0 ]] && { warn "No disks selected"; ((errors++)); }
    [[ -z "$ROOT_PASSWORD" ]] && { warn "ROOT_PASSWORD not set"; ((errors++)); }

    # Validate disks exist
    for disk in "${SELECTED_DISKS[@]}"; do
        [[ -b "$disk" ]] || { warn "Disk not found: $disk"; ((errors++)); }
    done

    # Validate timezone
    if [[ -n "$TIMEZONE" && ! -f "/usr/share/zoneinfo/$TIMEZONE" ]]; then
        warn "Invalid timezone: $TIMEZONE"
        ((errors++))
    fi

    if [[ $errors -gt 0 ]]; then
        error "Config validation failed with $errors error(s)"
    fi
    info "Config validation passed"
}