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:
|