summaryrefslogtreecommitdiffstats
path: root/src/lib/globals
blob: 42ac17725950bcfe743e5795c87266b5b63e830c (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
137
138
139
140
141
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}"


### 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]}:" "$@"
    "$@"
}

## Evaluate with a permissive umask
do_readable() {
    local result
    umask 022
    "$@"
    result=$?
    umask 077
    return $result
}

## 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"
}


# Set a restrictive umask
do_readable :


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