/mandos/trunk

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

« back to all changes in this revision

Viewing changes to debian/mandos-client.postinst

  • Committer: Teddy Hogeborn
  • Date: 2008-08-02 10:48:24 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080802104824-fx0miwp9o4g9r31e
* plugbasedclient.c (struct process): New fields "eof", "completed",
                                      and "status".
  (handle_sigchld): New function.
  (main): Initialize "dir" to NULL to only closedir() it if necessary.
          Move "process_list" to be a global variable to be accessible
          by "handle_sigchld".  Make "handle_sigchld" handle SIGCHLD.
          Remove redundant check for NULL "dir".  Free "filename" when
          no longer used.  Block SIGCHLD around fork()/exec().
          Restore normal signals in child.  Only loop while running
          processes exist.  Print process buffer when the process is
          done and it has emitted EOF, not when it only emits EOF.
          Remove processes from list which exit non-cleanly.  In
          cleaning up, closedir() if necessary.  Bug fix: set next
          pointer correctly when freeing process list.

* plugins.d/passprompt.c (main): Do not ignore SIGQUIT.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/bin/sh
2
 
# This script can be called in the following ways:
3
 
#
4
 
# After the package was installed:
5
 
#       <postinst> configure <old-version>
6
 
#
7
 
#
8
 
# If prerm fails during upgrade or fails on failed upgrade:
9
 
#       <old-postinst> abort-upgrade <new-version>
10
 
#
11
 
# If prerm fails during deconfiguration of a package:
12
 
#       <postinst> abort-deconfigure in-favour <new-package> <version>
13
 
#                  removing <old-package> <version>
14
 
#
15
 
# If prerm fails during replacement due to conflict:
16
 
#       <postinst> abort-remove in-favour <new-package> <version>
17
 
 
18
 
. /usr/share/debconf/confmodule
19
 
 
20
 
set -e
21
 
 
22
 
# Update the initial RAM file system image
23
 
update_initramfs()
24
 
{
25
 
    if command -v update-initramfs >/dev/null; then
26
 
        update-initramfs -k all -u
27
 
    elif command -v dracut >/dev/null; then
28
 
        dracut_version="`dpkg-query --showformat='${Version}' --show dracut`"
29
 
        if dpkg --compare-versions "$dracut_version" lt 043-1 \
30
 
                && bash -c '. /etc/dracut.conf; . /etc/dracut.conf.d/*; [ "$hostonly" != yes ]'; then
31
 
            echo 'Dracut is not configured to use hostonly mode!' >&2
32
 
            return 1
33
 
        fi
34
 
        # Logic taken from dracut.postinst
35
 
        for kernel in /boot/vmlinu[xz]-*; do
36
 
            kversion="${kernel#/boot/vmlinu[xz]-}"
37
 
            # Dracut preserves old permissions of initramfs image
38
 
            # files, so we adjust permissions before creating new
39
 
            # initramfs image containing secret keys.
40
 
            chmod go-r /boot/initrd.img-"$kversion"
41
 
            if [ "$kversion" != "*" ]; then
42
 
                /etc/kernel/postinst.d/dracut "$kversion"
43
 
            fi
44
 
        done
45
 
    fi
46
 
    
47
 
    if dpkg --compare-versions "$2" lt-nl "1.0.10-1"; then
48
 
        # Make old initrd.img files unreadable too, in case they were
49
 
        # created with mandos-client 1.0.8 or older.
50
 
        find /boot -maxdepth 1 -type f -name "initrd.img-*.bak" \
51
 
            -print0 | xargs --null --no-run-if-empty chmod o-r
52
 
    fi
53
 
}
54
 
 
55
 
# Add user and group
56
 
add_mandos_user(){
57
 
    # Rename old "mandos" user and group
58
 
    if dpkg --compare-versions "$2" lt "1.0.3-1"; then
59
 
        case "`getent passwd mandos`" in
60
 
            *:Mandos\ password\ system,,,:/nonexistent:/bin/false)
61
 
                usermod --login _mandos mandos
62
 
                groupmod --new-name _mandos mandos
63
 
                return
64
 
                ;;
65
 
        esac
66
 
    fi
67
 
    # Create new user and group
68
 
    if ! getent passwd _mandos >/dev/null; then
69
 
        adduser --system --force-badname --quiet --home /nonexistent \
70
 
            --no-create-home --group --disabled-password \
71
 
            --gecos "Mandos password system" _mandos
72
 
    fi
73
 
}
74
 
 
75
 
# Create client key pairs
76
 
create_keys(){
77
 
    # If the OpenPGP key files do not exist, generate all keys using
78
 
    # mandos-keygen
79
 
    if ! [ -r /etc/keys/mandos/pubkey.txt \
80
 
              -a -r /etc/keys/mandos/seckey.txt ]; then
81
 
        mandos-keygen
82
 
        gpg-connect-agent KILLAGENT /bye || :
83
 
        return 0
84
 
    fi
85
 
 
86
 
    # Remove any bad TLS keys by 1.8.0-1
87
 
    if dpkg --compare-versions "$2" eq "1.8.0-1" \
88
 
       || dpkg --compare-versions "$2" eq "1.8.0-1~bpo9+1"; then
89
 
        # Is the key bad?
90
 
        if ! certtool --password='' \
91
 
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
92
 
             --outfile=/dev/null --pubkey-info --no-text \
93
 
             2>/dev/null; then
94
 
            shred --remove -- /etc/keys/mandos/tls-privkey.pem \
95
 
                  2>/dev/null || :
96
 
            rm --force -- /etc/keys/mandos/tls-pubkey.pem
97
 
        fi
98
 
    fi
99
 
 
100
 
    # If the TLS keys already exists, do nothing
101
 
    if [ -r /etc/keys/mandos/tls-privkey.pem \
102
 
            -a -r /etc/keys/mandos/tls-pubkey.pem ]; then
103
 
        return 0
104
 
    fi
105
 
 
106
 
    # Try to create the TLS keys
107
 
 
108
 
    TLS_PRIVKEYTMP="`mktemp -t mandos-client-privkey.XXXXXXXXXX`"
109
 
 
110
 
    if certtool --generate-privkey --password='' \
111
 
                --outfile "$TLS_PRIVKEYTMP" --sec-param ultra \
112
 
                --key-type=ed25519 --pkcs8 --no-text 2>/dev/null; then
113
 
 
114
 
        local umask=$(umask)
115
 
        umask 077
116
 
        cp --archive "$TLS_PRIVKEYTMP" /etc/keys/mandos/tls-privkey.pem
117
 
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
118
 
 
119
 
        # First try certtool from GnuTLS
120
 
        if ! certtool --password='' \
121
 
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
122
 
             --outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
123
 
             --no-text 2>/dev/null; then
124
 
            # Otherwise try OpenSSL
125
 
            if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
126
 
                 -out /etc/keys/mandos/tls-pubkey.pem -pubout; then
127
 
                rm --force /etc/keys/mandos/tls-pubkey.pem
128
 
                # None of the commands succeded; give up
129
 
                umask $umask
130
 
                return 1
131
 
            fi
132
 
        fi
133
 
        umask $umask
134
 
 
135
 
        key_id=$(mandos-keygen --passfile=/dev/null \
136
 
                     | grep --regexp="^key_id[ =]")
137
 
 
138
 
        db_version 2.0
139
 
        db_fset mandos-client/key_id seen false
140
 
        db_reset mandos-client/key_id
141
 
        db_subst mandos-client/key_id key_id $key_id
142
 
        db_input critical mandos-client/key_id || true
143
 
        db_go
144
 
        db_stop
145
 
    else
146
 
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
147
 
    fi
148
 
}
149
 
 
150
 
create_dh_params(){
151
 
    if [ -r /etc/keys/mandos/dhparams.pem ]; then
152
 
        return 0
153
 
    fi
154
 
    # Create a Diffe-Hellman parameters file
155
 
    DHFILE="`mktemp -t mandos-client-dh-parameters.XXXXXXXXXX.pem`"
156
 
    # First try certtool from GnuTLS
157
 
    if ! certtool --generate-dh-params --sec-param high \
158
 
         --outfile "$DHFILE"; then
159
 
        # Otherwise try OpenSSL
160
 
        if ! openssl genpkey -genparam -algorithm DH -out "$DHFILE" \
161
 
             -pkeyopt dh_paramgen_prime_len:3072; then
162
 
            # None of the commands succeded; give up
163
 
            rm -- "$DHFILE"
164
 
            return 1
165
 
        fi
166
 
    fi
167
 
    sed --in-place --expression='0,/^-----BEGIN DH PARAMETERS-----$/d' \
168
 
        "$DHFILE"
169
 
    sed --in-place --expression='1i-----BEGIN DH PARAMETERS-----' \
170
 
            "$DHFILE"
171
 
    cp --archive "$DHFILE" /etc/keys/mandos/dhparams.pem
172
 
    rm -- "$DHFILE"
173
 
}
174
 
 
175
 
case "$1" in
176
 
    configure)
177
 
        add_mandos_user "$@"
178
 
        create_keys "$@"
179
 
        create_dh_params "$@" || :
180
 
        update_initramfs "$@"
181
 
        if dpkg --compare-versions "$2" lt-nl "1.7.10-1"; then
182
 
            PLUGINHELPERDIR=/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null)/mandos/plugin-helpers
183
 
            if ! dpkg-statoverride --list "$PLUGINHELPERDIR" \
184
 
                 >/dev/null 2>&1; then
185
 
                chmod u=rwx,go= -- "$PLUGINHELPERDIR"
186
 
            fi
187
 
            if ! dpkg-statoverride --list /etc/mandos/plugin-helpers \
188
 
                 >/dev/null 2>&1; then
189
 
                chmod u=rwx,go= -- /etc/mandos/plugin-helpers
190
 
            fi
191
 
        fi
192
 
        ;;
193
 
    abort-upgrade|abort-deconfigure|abort-remove)
194
 
        ;;
195
 
 
196
 
    *)
197
 
        echo "$0 called with unknown argument '$1'" 1>&2
198
 
        exit 1
199
 
        ;;
200
 
esac
201
 
 
202
 
#DEBHELPER#
203
 
 
204
 
exit 0