blob: 51acb0d8996048b715ff682dad2aeec875df4e9f (
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
|
PROFILE_DIR="/etc/network.d"
SUBR_DIR="/usr/lib/network"
CONN_DIR="$SUBR_DIR/connections"
STATE_DIR="/run/network"
STATE_FILE="${NETCTL_STATE_FILE:-/var/lib/netctl/netctl.state}"
### Logging/Error reporting
report_notice() {
echo "$*"
}
report_error() {
echo "$*"
}
report_debug() {
is_yes "${NETCTL_DEBUG:-no}" && echo "DEBUG: $*" >&2
}
exit_error() {
report_error "$@" >&2
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 1
;;
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
while ! 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 '*.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 "$CONN_DIR/${Connection:-/dev/null/nonexistent}" ]]; 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
}
# vim: ft=sh ts=4 et sw=4:
|