summaryrefslogtreecommitdiffstats
path: root/src/lib/globals
blob: cf995755b65de7c9382e02b8d64b17c1850631a8 (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
NETCTL_VERSION="notpackaged"
PROFILE_DIR="/etc/netctl"
SUBR_DIR="/usr/lib/network"
STATE_DIR="/run/network"
STATE_FILE="${NETCTL_STATE_FILE:-/var/lib/netctl/netctl.state}"

umask 077


### Logging/Error reporting

report_notice() {
    echo "$*"
}

report_error() {
    local prefix="<3>" suffix=""
    if [[ -t 2 ]]; then
        prefix=$(tput bold; tput setaf 1)
        suffix=$(tput sgr0)
    fi
    echo "$prefix$*$suffix" >&2
}

report_debug() {
    is_yes "${NETCTL_DEBUG:-no}" && echo "DEBUG: $*" >&2
}

exit_error() {
    report_error "$@"
    exit 1
}


### Variable management

## Check if a variable occurs in an array
# $1: the variable to find
# $2...: the array elements
in_array() {
    local hay needle=$1
    shift
    for hay; do
        [[ $hay == "$needle" ]] && return 0
    done
    return 1
}

## Check if a variable denotes a positive truth value
# $1: the variable to check, use is_yes ${VAR:-yes} to set a default
is_yes() {
    case ${1,,} in
      yes|true|on|1)
        return 0
      ;;
      no|false|off|0)
        return 1
      ;;
      *)
        report_error "Not a valid truth value: '$1'"
        return 2
      ;;
    esac
}


### Control flow

## Show what we evaluate when debugging, but always evaluate
do_debug() {
    report_debug "${FUNCNAME[1]}:" "$@"
    "$@"
}

## Exit if we are not effectively root
# $1: program name (optional)
ensure_root() {
    (( EUID == 0 )) || exit_error "${1-$0} needs root privileges"
}

## Waits until a statement succeeds or a timeout occurs
# $1: timeout in seconds
# $2...: condition command
timeout_wait() {
    local timeout=$1
    (( timeout *= 5 ))
    shift
    until eval "$*"; do
        (( timeout-- > 0 )) || return 1
        sleep 0.2
    done
    return 0
}


### Profile management

## List all acceptable profiles names (assume they don't contain newlines)
list_profiles() {
    # JP: follow aliases with -L, also skip profiles that end with '.conf' (so
    #     profile.conf can be the wpa.conf file for profile)
    find -L "$PROFILE_DIR/" -maxdepth 1 -type f -not -name '.*' -not -name '*~' -not -name '*.action' -not -name '*.conf' -not -name '*.service' -printf "%f\n"
}

## Sources all hooks, a profile and any interface hook
# $1: profile name
load_profile() {
    local hook
    if [[ ! -r "$PROFILE_DIR/$1" ]]; then
        exit_error "Profile '$1' does not exist or is not readable"
    fi
    while read -r hook; do
        source "$hook"
    done < <(find -L "$PROFILE_DIR/hooks" -maxdepth 1 -type f -executable -not -name '.*' -not -name '*~' | sort -u)
    source "$PROFILE_DIR/$1"
    if [[ -z $Interface ]]; then
        exit_error "Profile '$1' does not specify an interface"
    fi
    if [[ ! -r "${Connection:+$SUBR_DIR/connections/$Connection}" ]]; then
        exit_error "Profile '$1' does not specify a valid connection"
    fi
    if [[ -x "$PROFILE_DIR/interfaces/$Interface" ]]; then
        source "$PROFILE_DIR/interfaces/$Interface"
    fi
    source "$SUBR_DIR/connections/$Connection"
}


# vim: ft=sh ts=4 et sw=4: