diff options
author | Colin Watson <cjwatson@debian.org> | 2006-12-23 18:35:21 +0000 |
---|---|---|
committer | Colin Watson <cjwatson@debian.org> | 2006-12-23 18:35:21 +0000 |
commit | ae04de0cb0a8b65548e009b4c3a03ba7f882e95a (patch) | |
tree | 002b0415576f0581ef3f866261951ddb9fe2eb8b | |
parent | 309e8aeed9f3d4b7b5e9ad7089889533023b6e73 (diff) |
* It turns out that the people who told me that removing a conffile in the
preinst was sufficient to have dpkg replace it without prompting when
moving a conffile between packages were very much mistaken. As far as I
can tell, the only way to do this reliably is to write out the desired
new text of the conffile in the preinst. This is gross, and requires
shipping the text of all conffiles in the preinst too, but there's
nothing for it. Fortunately this nonsense is only required for smooth
upgrades from sarge.
-rw-r--r-- | debian/changelog | 8 | ||||
-rw-r--r-- | debian/openssh-client.preinst | 21 | ||||
-rw-r--r-- | debian/openssh-server.preinst | 25 | ||||
-rwxr-xr-x | debian/rules | 9 | ||||
-rw-r--r-- | debian/substitute-conffile.pl | 26 |
5 files changed, 84 insertions, 5 deletions
diff --git a/debian/changelog b/debian/changelog index 6a30e56f0..1a684c7fa 100644 --- a/debian/changelog +++ b/debian/changelog | |||
@@ -12,6 +12,14 @@ openssh (1:4.3p2-8) UNRELEASED; urgency=medium | |||
12 | GSSAPICleanupCredentials. Mark GSSUseSessionCCache and | 12 | GSSAPICleanupCredentials. Mark GSSUseSessionCCache and |
13 | GSSAPIUseSessionCredCache as known-but-unsupported options, and migrate | 13 | GSSAPIUseSessionCredCache as known-but-unsupported options, and migrate |
14 | away from them on upgrade. | 14 | away from them on upgrade. |
15 | * It turns out that the people who told me that removing a conffile in the | ||
16 | preinst was sufficient to have dpkg replace it without prompting when | ||
17 | moving a conffile between packages were very much mistaken. As far as I | ||
18 | can tell, the only way to do this reliably is to write out the desired | ||
19 | new text of the conffile in the preinst. This is gross, and requires | ||
20 | shipping the text of all conffiles in the preinst too, but there's | ||
21 | nothing for it. Fortunately this nonsense is only required for smooth | ||
22 | upgrades from sarge. | ||
15 | * debconf template translations: | 23 | * debconf template translations: |
16 | - Add Romanian (thanks, Stan Ioan-Eugen; closes: #403528). | 24 | - Add Romanian (thanks, Stan Ioan-Eugen; closes: #403528). |
17 | 25 | ||
diff --git a/debian/openssh-client.preinst b/debian/openssh-client.preinst index 0e200712e..9cf29dfba 100644 --- a/debian/openssh-client.preinst +++ b/debian/openssh-client.preinst | |||
@@ -1,17 +1,34 @@ | |||
1 | #! /bin/sh -e | 1 | #! /bin/sh -e |
2 | 2 | ||
3 | ETC_SSH_MODULI=@ETC_SSH_MODULI@ | ||
4 | |||
5 | ETC_SSH_SSH_CONFIG=@ETC_SSH_SSH_CONFIG@ | ||
6 | |||
3 | action="$1" | 7 | action="$1" |
4 | version="$2" | 8 | version="$2" |
5 | 9 | ||
6 | prepare_transfer_conffile () { | 10 | prepare_transfer_conffile () { |
7 | CONFFILE="$1" | 11 | CONFFILE="$1" |
12 | TEXT="$2" | ||
13 | MODE="$3" | ||
8 | [ -e "$CONFFILE" ] || return 0 | 14 | [ -e "$CONFFILE" ] || return 0 |
9 | 15 | ||
10 | md5sum="$(md5sum "$CONFFILE" |sed -e 's/ .*//')" | 16 | md5sum="$(md5sum "$CONFFILE" |sed -e 's/ .*//')" |
11 | old_md5sum="$(sed -n -e "/^Conffiles:/,/^[^ ]/{\\' $CONFFILE'{s/^ [^ ]* //;s/ .*//;p}}" /var/lib/dpkg/status)" | 17 | old_md5sum="$(sed -n -e "/^Conffiles:/,/^[^ ]/{\\' $CONFFILE'{s/^ [^ ]* //;s/ .*//;p}}" /var/lib/dpkg/status)" |
12 | if [ "$md5sum" = "$old_md5sum" ]; then | 18 | if [ "$md5sum" = "$old_md5sum" ]; then |
13 | echo >&2 "Transferring ownership of conffile $CONFFILE ..." | 19 | echo >&2 "Transferring ownership of conffile $CONFFILE ..." |
20 | # We have to write out the desired new text of the conffile, | ||
21 | # which is tricky in the preinst, hence the nasty way we | ||
22 | # have to hardcode the text here. Fortunately, this is only | ||
23 | # necessary with sarge's dpkg and older. | ||
24 | if echo "$TEXT" | head -n1 | grep -q '^@.*@$'; then | ||
25 | echo >&2 'Unsubstituted conffile text! Please report this bug.' | ||
26 | exit 1 | ||
27 | fi | ||
28 | printf '%s' "$TEXT" >"$CONFFILE.dpkg-new" | ||
29 | chmod "$MODE" "$CONFFILE.dpkg-new" | ||
14 | mv -f "$CONFFILE" "$CONFFILE.moved-by-preinst" | 30 | mv -f "$CONFFILE" "$CONFFILE.moved-by-preinst" |
31 | mv -f "$CONFFILE.dpkg-new" "$CONFFILE" | ||
15 | return 0 | 32 | return 0 |
16 | fi | 33 | fi |
17 | } | 34 | } |
@@ -19,8 +36,8 @@ prepare_transfer_conffile () { | |||
19 | case $action in | 36 | case $action in |
20 | install|upgrade) | 37 | install|upgrade) |
21 | if dpkg --compare-versions "$version" lt 0; then | 38 | if dpkg --compare-versions "$version" lt 0; then |
22 | prepare_transfer_conffile /etc/ssh/moduli | 39 | prepare_transfer_conffile /etc/ssh/moduli "$ETC_SSH_MODULI" 0644 |
23 | prepare_transfer_conffile /etc/ssh/ssh_config | 40 | prepare_transfer_conffile /etc/ssh/ssh_config "$ETC_SSH_SSH_CONFIG" 0644 |
24 | fi | 41 | fi |
25 | ;; | 42 | ;; |
26 | esac | 43 | esac |
diff --git a/debian/openssh-server.preinst b/debian/openssh-server.preinst index a5c507bd4..2c2e2687c 100644 --- a/debian/openssh-server.preinst +++ b/debian/openssh-server.preinst | |||
@@ -1,17 +1,36 @@ | |||
1 | #!/bin/sh -e | 1 | #!/bin/sh -e |
2 | 2 | ||
3 | ETC_DEFAULT_SSH=@ETC_DEFAULT_SSH@ | ||
4 | |||
5 | ETC_INIT_D_SSH=@ETC_INIT_D_SSH@ | ||
6 | |||
7 | ETC_PAM_D_SSH=@ETC_PAM_D_SSH@ | ||
8 | |||
3 | action=$1 | 9 | action=$1 |
4 | version=$2 | 10 | version=$2 |
5 | 11 | ||
6 | prepare_transfer_conffile () { | 12 | prepare_transfer_conffile () { |
7 | CONFFILE="$1" | 13 | CONFFILE="$1" |
14 | TEXT="$2" | ||
15 | MODE="$3" | ||
8 | [ -e "$CONFFILE" ] || return 0 | 16 | [ -e "$CONFFILE" ] || return 0 |
9 | 17 | ||
10 | md5sum="$(md5sum "$CONFFILE" |sed -e 's/ .*//')" | 18 | md5sum="$(md5sum "$CONFFILE" |sed -e 's/ .*//')" |
11 | old_md5sum="$(sed -n -e "/^Conffiles:/,/^[^ ]/{\\' $CONFFILE'{s/^ [^ ]* //;s/ .*//;p}}" /var/lib/dpkg/status)" | 19 | old_md5sum="$(sed -n -e "/^Conffiles:/,/^[^ ]/{\\' $CONFFILE'{s/^ [^ ]* //;s/ .*//;p}}" /var/lib/dpkg/status)" |
12 | if [ "$md5sum" = "$old_md5sum" ]; then | 20 | if [ "$md5sum" = "$old_md5sum" ]; then |
13 | echo >&2 "Transferring ownership of conffile $CONFFILE ..." | 21 | echo >&2 "Transferring ownership of conffile $CONFFILE ..." |
22 | # We have to write out the desired new text of the conffile, | ||
23 | # which is tricky in the preinst, hence the nasty way we | ||
24 | # have to hardcode the text here. Fortunately, this is only | ||
25 | # necessary with sarge's dpkg and older. | ||
26 | if echo "$TEXT" | head -n1 | grep -q '^@.*@$'; then | ||
27 | echo >&2 'Unsubstituted conffile text! Please report this bug.' | ||
28 | exit 1 | ||
29 | fi | ||
30 | printf '%s' "$TEXT" >"$CONFFILE.dpkg-new" | ||
31 | chmod "$MODE" "$CONFFILE.dpkg-new" | ||
14 | mv -f "$CONFFILE" "$CONFFILE.moved-by-preinst" | 32 | mv -f "$CONFFILE" "$CONFFILE.moved-by-preinst" |
33 | mv -f "$CONFFILE.dpkg-new" "$CONFFILE" | ||
15 | return 0 | 34 | return 0 |
16 | fi | 35 | fi |
17 | } | 36 | } |
@@ -92,9 +111,9 @@ EOF | |||
92 | fi | 111 | fi |
93 | 112 | ||
94 | if dpkg --compare-versions "$version" lt 0; then | 113 | if dpkg --compare-versions "$version" lt 0; then |
95 | prepare_transfer_conffile /etc/default/ssh | 114 | prepare_transfer_conffile /etc/default/ssh "$ETC_DEFAULT_SSH" 0644 |
96 | prepare_transfer_conffile /etc/init.d/ssh | 115 | prepare_transfer_conffile /etc/init.d/ssh "$ETC_INIT_D_SSH" 0755 |
97 | prepare_transfer_conffile /etc/pam.d/ssh | 116 | prepare_transfer_conffile /etc/pam.d/ssh "$ETC_PAM_D_SSH" 0644 |
98 | fi | 117 | fi |
99 | fi | 118 | fi |
100 | 119 | ||
diff --git a/debian/rules b/debian/rules index 4d9269666..fdef12dcf 100755 --- a/debian/rules +++ b/debian/rules | |||
@@ -195,6 +195,10 @@ binary-openssh-client: build install | |||
195 | dh_installdeb | 195 | dh_installdeb |
196 | test ! -e debian/ssh/etc/ssh/ssh_prng_cmds \ | 196 | test ! -e debian/ssh/etc/ssh/ssh_prng_cmds \ |
197 | || echo "/etc/ssh/ssh_prng_cmds" >> debian/openssh-client/DEBIAN/conffiles | 197 | || echo "/etc/ssh/ssh_prng_cmds" >> debian/openssh-client/DEBIAN/conffiles |
198 | perl -i debian/substitute-conffile.pl \ | ||
199 | ETC_SSH_MODULI debian/openssh-client/etc/ssh/moduli \ | ||
200 | ETC_SSH_SSH_CONFIG debian/openssh-client/etc/ssh/ssh_config \ | ||
201 | debian/openssh-client/DEBIAN/preinst | ||
198 | dh_shlibdeps | 202 | dh_shlibdeps |
199 | dh_gencontrol -- -V'debconf-depends=debconf (>= $(MINDEBCONFVER)) | debconf-2.0' | 203 | dh_gencontrol -- -V'debconf-depends=debconf (>= $(MINDEBCONFVER)) | debconf-2.0' |
200 | dh_md5sums | 204 | dh_md5sums |
@@ -229,6 +233,11 @@ endif | |||
229 | dh_compress | 233 | dh_compress |
230 | dh_fixperms | 234 | dh_fixperms |
231 | dh_installdeb | 235 | dh_installdeb |
236 | perl -i debian/substitute-conffile.pl \ | ||
237 | ETC_DEFAULT_SSH debian/openssh-server/etc/default/ssh \ | ||
238 | ETC_INIT_D_SSH debian/openssh-server/etc/init.d/ssh \ | ||
239 | ETC_PAM_D_SSH debian/openssh-server/etc/pam.d/ssh \ | ||
240 | debian/openssh-server/DEBIAN/preinst | ||
232 | dh_shlibdeps | 241 | dh_shlibdeps |
233 | dh_gencontrol -- -V'debconf-depends=debconf (>= $(MINDEBCONFVER)) | debconf-2.0' \ | 242 | dh_gencontrol -- -V'debconf-depends=debconf (>= $(MINDEBCONFVER)) | debconf-2.0' \ |
234 | -V'pam-depends=$(PAMDEP)' | 243 | -V'pam-depends=$(PAMDEP)' |
diff --git a/debian/substitute-conffile.pl b/debian/substitute-conffile.pl new file mode 100644 index 000000000..7dd23363e --- /dev/null +++ b/debian/substitute-conffile.pl | |||
@@ -0,0 +1,26 @@ | |||
1 | #! /usr/bin/perl -p | ||
2 | |||
3 | # This is needed for a nasty preinst hack to work around a bug in sarge's | ||
4 | # version of dpkg. It substitutes the literal text of conffiles into preinst | ||
5 | # scripts so that they can be used when moving conffiles between packages. | ||
6 | |||
7 | BEGIN { | ||
8 | %texts = (); | ||
9 | while (@ARGV > 1) { | ||
10 | my $name = $ARGV[0]; | ||
11 | shift; | ||
12 | local *FILE; | ||
13 | open FILE, '<', $ARGV[0]; | ||
14 | local $/ = undef; | ||
15 | my $text = <FILE>; | ||
16 | close FILE; | ||
17 | # Quote for the shell. | ||
18 | $text =~ s/'/'\\''/g; | ||
19 | shift; | ||
20 | $texts{$name} = $text; | ||
21 | } | ||
22 | } | ||
23 | |||
24 | for my $name (keys %texts) { | ||
25 | s/\@$name\@/'$texts{$name}'/g; | ||
26 | } | ||