/mandos/release

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/release

« back to all changes in this revision

Viewing changes to network-hooks.d/wireless

  • Committer: Teddy Hogeborn
  • Date: 2019-08-02 22:16:53 UTC
  • mto: This revision was merged to the branch mainline in revision 386.
  • Revision ID: teddy@recompile.se-20190802221653-ic1iko9hbefzwsk7
Fix bug in server Debian package: Fails to start on first install

There has been a very long-standing bug where installation of the
server (the "mandos" Debian package) would fail to start the server
properly right after installation.  It would work on manual (re)start
after installation, or after reboot, and even after package purge and
reinstall, it would then work the first time.  The problem, it turns
out, is when the new "_mandos" user (and corresponding group) is
created, the D-Bus server is not reloaded, and is therefore not aware
of that user, and does not recognize the user and group name in the
/etc/dbus-1/system.d/mandos.conf file.  The Mandos server, when it
tries to start and access the D-Bus, is then not permitted to connect
to its D-Bus bus name, and disables D-Bus use as a fallback measure;
i.e. the server works, but it is not controllable via D-Bus commands
(via mandos-ctl or mandos-monitor).  The next time the D-Bus daemon is
reloaded for any reason, the new user & group would become visible to
the D-Bus daemon and after that, any restart of the Mandos server
would succeed and it would bind to its D-Bus name properly, and
thereby be visible and controllable by mandos-ctl & mandos-monitor.
This was mostly invisible when using sysvinit, but systemd makes the
problem visible since the systemd service file for the Mandos server
is configured to not consider the Mandos server "started" until the
D-Bus name has been bound; this makes the starting of the service wait
for 90 seconds and then fail with a timeout error.

Fixing this should also make the Debian CI autopkgtest tests work.

* debian/mandos.postinst (configure): After creating (or renaming)
                                      user & group, reload D-Bus
                                      daemon (if present).

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
# configuration file(s) should be copied into the
7
7
# /etc/mandos/network-hooks.d directory.
8
8
9
 
# Copyright © 2012 Teddy Hogeborn
10
 
# Copyright © 2012 Björn Påhlsson
 
9
# Copyright © 2012-2018 Teddy Hogeborn
 
10
# Copyright © 2012-2018 Björn Påhlsson
11
11
12
12
# Copying and distribution of this file, with or without modification,
13
13
# are permitted in any medium without royalty provided the copyright
35
35
    exit
36
36
fi
37
37
 
38
 
ifkeys=`env | sed -n -e 's/^ADDRESS_\([^=]*\)=.*/\1/p' "$CONFIG" \
39
 
    | sort -u`
 
38
ifkeys=`sed -n -e 's/^ADDRESS_\([^=]*\)=.*/\1/p' "$CONFIG" | sort -u`
40
39
 
41
40
# Exit if DEVICE is set and is not any of the wireless interfaces
42
41
if [ -n "$DEVICE" ]; then
44
43
        for KEY in $ifkeys; do
45
44
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
46
45
            INTERFACE=`addrtoif "$ADDRESS"`
47
 
            if [ "$INTERFACE" = "$DEVICE" ]; then
48
 
                break 2
49
 
            fi
 
46
            
 
47
            case "$DEVICE" in
 
48
                *,"$INTERFACE"|*,"$INTERFACE",*|"$INTERFACE",*|"$INTERFACE")
 
49
                    break 2;;
 
50
            esac
50
51
        done
51
52
        exit
52
53
    done
73
74
    WPAS_OPTIONS="-P$PIDFILE $WPAS_OPTIONS"
74
75
fi
75
76
 
76
 
case "${MODE:-$1}" in
77
 
    start)
78
 
        mkdir -m u=rwx,go= -p "$CTRLDIR"
79
 
        "$wpa_supplicant" -B -g "$CTRL" -p "$CTRLDIR" $WPAS_OPTIONS
80
 
        for KEY in $ifkeys; do
81
 
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
82
 
            INTERFACE=`addrtoif "$ADDRESS"`
83
 
            DRIVER=`eval 'echo "$WPA_DRIVER_'"$KEY"\"`
84
 
            IFDELAY=`eval 'echo "$DELAY_'"$KEY"\"`
85
 
            "$wpa_cli" -g "$CTRL" interface_add "$INTERFACE" "" \
86
 
                "${DRIVER:-wext}" "$CTRLDIR" > /dev/null \
87
 
                | sed -e '/^OK$/d'
88
 
            NETWORK=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" \
89
 
                add_network`
90
 
            eval wpa_interface_"$KEY"
91
 
            "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" enable_network \
92
 
                "$NETWORK" | sed -e '/^OK$/d'
93
 
            sleep "${IFDELAY:-$DELAY}" &
94
 
            sleep=$!
95
 
            while :; do
96
 
                kill -0 $sleep 2>/dev/null || break
97
 
                STATE=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" \
98
 
                    status | sed -n -e 's/^wpa_state=//p'`
99
 
                if [ "$STATE" = COMPLETED ]; then
100
 
                    while :; do
101
 
                        kill -0 $sleep 2>/dev/null || break 2
102
 
                        UP=`cat /sys/class/net/"$INTERFACE"/operstate`
103
 
                        if [ "$UP" = up ]; then
104
 
                            kill $sleep 2>/dev/null
105
 
                            break 2
106
 
                        fi
107
 
                        sleep 1
108
 
                    done
109
 
                fi
110
 
                sleep 1
111
 
            done &
112
 
            wait $sleep || :
113
 
            IPADDRS=`eval 'echo "$IPADDRS_'"$KEY"\"`
114
 
            if [ -n "$IPADDRS" ]; then
115
 
                if [ "$IPADDRS" = dhcp ]; then
116
 
                    ipconfig -c dhcp -d "$INTERFACE" || :
117
 
                    #dhclient "$INTERFACE"
118
 
                else
119
 
                    for ipaddr in $IPADDRS; do
120
 
                        "$ip" addr add "$ipaddr" dev "$INTERFACE"
121
 
                    done
122
 
                fi
123
 
            fi
124
 
            ROUTES=`eval 'echo "$ROUTES_'"$KEY"\"`
125
 
            if [ -n "$ROUTES" ]; then
126
 
                for route in $ROUTES; do
127
 
                    "$ip" route add "$route" dev "$BRIDGE"
128
 
                done
129
 
            fi
130
 
        done
131
 
        ;;
132
 
    stop)
133
 
        "$wpa_cli" -g "$CTRL" terminate 2>&1 | sed -e '/^OK$/d'
134
 
        for KEY in $ifkeys; do
135
 
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
136
 
            INTERFACE=`addrtoif "$ADDRESS"`
137
 
            "$ip" addr show scope global permanent dev "$INTERFACE" \
138
 
                | while read type addr rest; do
 
77
do_start(){
 
78
    mkdir -m u=rwx,go= -p "$CTRLDIR"
 
79
    "$wpa_supplicant" -B -g "$CTRL" -p "$CTRLDIR" $WPAS_OPTIONS
 
80
    for KEY in $ifkeys; do
 
81
        ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
 
82
        INTERFACE=`addrtoif "$ADDRESS"`
 
83
        DRIVER=`eval 'echo "$WPA_DRIVER_'"$KEY"\"`
 
84
        IFDELAY=`eval 'echo "$DELAY_'"$KEY"\"`
 
85
        "$wpa_cli" -g "$CTRL" interface_add "$INTERFACE" "" \
 
86
            "${DRIVER:-wext}" "$CTRLDIR" > /dev/null \
 
87
            | sed -e '/^OK$/d'
 
88
        NETWORK=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" add_network`
 
89
        eval wpa_interface_"$KEY"
 
90
        "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" enable_network \
 
91
            "$NETWORK" | sed -e '/^OK$/d'
 
92
        sleep "${IFDELAY:-$DELAY}" &
 
93
        sleep=$!
 
94
        while :; do
 
95
            kill -0 $sleep 2>/dev/null || break
 
96
            STATE=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" status \
 
97
                | sed -n -e 's/^wpa_state=//p'`
 
98
            if [ "$STATE" = COMPLETED ]; then
 
99
                while :; do
 
100
                    kill -0 $sleep 2>/dev/null || break 2
 
101
                    UP=`cat /sys/class/net/"$INTERFACE"/operstate`
 
102
                    if [ "$UP" = up ]; then
 
103
                        kill $sleep 2>/dev/null
 
104
                        break 2
 
105
                    fi
 
106
                    sleep 1
 
107
                done
 
108
            fi
 
109
            sleep 1
 
110
        done &
 
111
        wait $sleep || :
 
112
        IPADDRS=`eval 'echo "$IPADDRS_'"$KEY"\"`
 
113
        if [ -n "$IPADDRS" ]; then
 
114
            if [ "$IPADDRS" = dhcp ]; then
 
115
                ipconfig -c dhcp -d "$INTERFACE" || :
 
116
                #dhclient "$INTERFACE"
 
117
            else
 
118
                for ipaddr in $IPADDRS; do
 
119
                    "$ip" addr add "$ipaddr" dev "$INTERFACE"
 
120
                done
 
121
            fi
 
122
        fi
 
123
        ROUTES=`eval 'echo "$ROUTES_'"$KEY"\"`
 
124
        if [ -n "$ROUTES" ]; then
 
125
            for route in $ROUTES; do
 
126
                "$ip" route add "$route" dev "$INTERFACE"
 
127
            done
 
128
        fi
 
129
    done
 
130
}
 
131
 
 
132
do_stop(){
 
133
    "$wpa_cli" -g "$CTRL" terminate 2>&1 | sed -e '/^OK$/d'
 
134
    for KEY in $ifkeys; do
 
135
        ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
 
136
        INTERFACE=`addrtoif "$ADDRESS"`
 
137
        "$ip" addr show scope global permanent dev "$INTERFACE" \
 
138
            | while read type addr rest; do
139
139
                case "$type" in
140
140
                    inet|inet6)
141
141
                        "$ip" addr del "$addr" dev "$INTERFACE"
142
142
                        ;;
143
143
                esac
144
144
            done
145
 
            "$ip" link set dev "$INTERFACE" down
146
 
        done
 
145
        "$ip" link set dev "$INTERFACE" down
 
146
    done
 
147
}
 
148
 
 
149
case "${MODE:-$1}" in
 
150
    start|stop)
 
151
        do_"${MODE:-$1}"
147
152
        ;;
148
153
    files)
149
154
        echo "$wpa_supplicant"