|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) |
| 4 | + |
| 5 | +# shellcheck source=/dev/null |
| 6 | +source "${SCRIPT_DIR}/utils.sh" |
| 7 | +# shellcheck source=/dev/null |
| 8 | +source "${SCRIPT_DIR}/lib-dialog.sh" |
| 9 | + |
| 10 | +CONFIG_PATH="${CONFIG_PATH:-"/system.json"}" |
| 11 | +if [[ -n "${TEST:-}" ]]; then |
| 12 | + CONFIG_PATH="system.json" |
| 13 | +fi |
| 14 | + |
| 15 | + |
| 16 | +# Load initial config into a variable |
| 17 | +CONFIG_JSON="$(cat "$CONFIG_PATH" || echo '{}')" |
| 18 | +CONFIG_NEW="{}" |
| 19 | + |
| 20 | +# --- Validation functions --- |
| 21 | +is_valid_hostname() { |
| 22 | + [[ "$1" =~ ^[a-zA-Z][a-zA-Z0-9\.-]+$ ]] |
| 23 | +} |
| 24 | + |
| 25 | +is_valid_ip() { |
| 26 | + [[ "$1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] && \ |
| 27 | + for octet in $(echo "$1" | tr '.' ' '); do |
| 28 | + [[ "$octet" -ge 0 && "$octet" -le 255 ]] || return 1 |
| 29 | + done |
| 30 | +} |
| 31 | + |
| 32 | +is_valid_ips() { |
| 33 | + [[ -z "$1" ]] && return 1 |
| 34 | + for ip in $1; do |
| 35 | + is_valid_ip "${ip}" || return 1 |
| 36 | + done |
| 37 | + return 0 |
| 38 | +} |
| 39 | + |
| 40 | +is_valid_name_or_ip() { |
| 41 | + is_valid_hostname "$@" || is_valid_ip "$@" |
| 42 | +} |
| 43 | + |
| 44 | +edit() { |
| 45 | + local field="$1" |
| 46 | + local displayname="$2" |
| 47 | + local check_function="$3" |
| 48 | + |
| 49 | + local value |
| 50 | + value="$(echo "$CONFIG_JSON" | jq -r "${field} // \"\"")" |
| 51 | + while true; do |
| 52 | + if ! value="$(term cuos_dialog --inputbox "${displayname}:" 8 40 "${value}" 3>&1 1>&2 2>&3)"; then |
| 53 | + return 1 |
| 54 | + fi |
| 55 | + if [[ -z "${check_function}" ]] || "${check_function}" "${value}"; then |
| 56 | + CONFIG_NEW="$(echo "${CONFIG_NEW}" | jq --arg val "${value}" "${field}"' = $val')" |
| 57 | + CONFIG_JSON="$(echo "${CONFIG_JSON}" | jq --arg val "${value}" "${field}"' = $val')" |
| 58 | + return 0 |
| 59 | + fi |
| 60 | + term cuos_dialog --no-cancel --msgbox "Invalid format. Please try again." 8 40 |
| 61 | + done |
| 62 | +} |
| 63 | + |
| 64 | +question() { |
| 65 | + local field="$1" |
| 66 | + local displayname="$2" |
| 67 | + local default="${3:-''}" |
| 68 | + |
| 69 | + local value |
| 70 | + value="$(echo "$CONFIG_JSON" | jq -r "${field}")" |
| 71 | + if [[ "${value}" == "null" ]]; then |
| 72 | + value="${default}" |
| 73 | + fi |
| 74 | + local choise="--clear" # for nop |
| 75 | + if [[ "${value}" != "true" ]]; then |
| 76 | + choise="--defaultno" |
| 77 | + fi |
| 78 | + local newvalue=false |
| 79 | + if term cuos_dialog "${choise}" --yesno "${displayname}" 7 40; then |
| 80 | + newvalue=true |
| 81 | + fi |
| 82 | + CONFIG_NEW="$(echo "$CONFIG_NEW" | jq "${field} = ${newvalue}")" |
| 83 | + CONFIG_JSON="$(echo "$CONFIG_JSON" | jq "${field} = ${newvalue}")" |
| 84 | + |
| 85 | + [[ "${newvalue}" == "true" ]] |
| 86 | +} |
| 87 | + |
| 88 | +MODE="${1:-"all"}" |
| 89 | + |
| 90 | +mode_hostname() { |
| 91 | + [[ "${MODE}" == "all" || "${MODE}" == "hostname" ]] |
| 92 | +} |
| 93 | +mode_network() { |
| 94 | + [[ "${MODE}" == "all" || "${MODE}" == "network" ]] |
| 95 | +} |
| 96 | + |
| 97 | + |
| 98 | +if mode_hostname; then |
| 99 | + edit '.hostname' "Hostname" is_valid_hostname || exit 1 |
| 100 | +fi |
| 101 | + |
| 102 | + |
| 103 | + |
| 104 | +if mode_network; then |
| 105 | + # Number of interfaces |
| 106 | + NUM_IFACES=1 |
| 107 | + |
| 108 | + # Loop through interfaces |
| 109 | + for ((i=0; i<NUM_IFACES; i++)); do |
| 110 | + if ! question '.network['"$i"']["dhcp"]' "Configure network via DHCP?" true; then |
| 111 | + edit '.network['"$i"']["ip-address"]' "IP address" is_valid_ip || exit 1 |
| 112 | + edit '.network['"$i"']["network-mask"]' "Network mask" is_valid_ip || exit 1 |
| 113 | + edit '.network['"$i"']["gateway"]' "Gateway" is_valid_ip || exit 1 |
| 114 | + edit '.network['"$i"']["dns-server"]' "DNS server(s)" is_valid_ips || exit 1 |
| 115 | + edit '.network['"$i"']["ntp"]' "NTP server(s)" is_valid_name_or_ip || exit 1 |
| 116 | + fi |
| 117 | + done |
| 118 | + |
| 119 | + if ! term cuos_dialog --clear --yesno "Do you want to save and load the configuration?\n\n${CONFIG_NEW}" 25 50; then |
| 120 | + exit 1 |
| 121 | + fi |
| 122 | +fi |
| 123 | + |
| 124 | +# Save to new config |
| 125 | +echo "${CONFIG_JSON}" >"${CONFIG_PATH}" || exit 1 |
| 126 | + |
| 127 | +if [[ -n "${TEST:-}" ]]; then exit; fi |
| 128 | + |
| 129 | +if mode_hostname; then |
| 130 | + "${SCRIPT_DIR}/init.sh" --reinit set_hostname |
| 131 | +fi |
| 132 | +if mode_network; then |
| 133 | + "${SCRIPT_DIR}/init.sh" --reinit configure_network |
| 134 | +fi |
| 135 | + |
0 commit comments