Debian: fix overwriting of config settings on upgrade (#4696)
Make sure that users' changes to the config files are preserved. Fixes #4440.pull/4719/head
parent
e07384c4e1
commit
0969d688e3
|
@ -1,3 +1,9 @@
|
||||||
|
matrix-synapse-py3 (0.99.2) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* Fix overwriting of config settings on upgrade.
|
||||||
|
|
||||||
|
-- Synapse Packaging team <packages@matrix.org> Wed, 20 Feb 2019 17:11:25 +0000
|
||||||
|
|
||||||
matrix-synapse-py3 (0.99.1.1) stable; urgency=medium
|
matrix-synapse-py3 (0.99.1.1) stable; urgency=medium
|
||||||
|
|
||||||
* New synapse release 0.99.1.1
|
* New synapse release 0.99.1.1
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
debian/log.yaml etc/matrix-synapse
|
debian/log.yaml etc/matrix-synapse
|
||||||
|
debian/manage_debconf.pl /opt/venvs/matrix-synapse/lib/
|
||||||
|
|
|
@ -0,0 +1,130 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# Interface between our config files and the debconf database.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
#
|
||||||
|
# manage_debconf.pl <action>
|
||||||
|
#
|
||||||
|
# where <action> can be:
|
||||||
|
#
|
||||||
|
# read: read the configuration from the yaml into debconf
|
||||||
|
# update: update the yaml config according to the debconf database
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Debconf::Client::ConfModule (qw/get set/);
|
||||||
|
|
||||||
|
# map from the name of a setting in our .yaml file to the relevant debconf
|
||||||
|
# setting.
|
||||||
|
my %MAPPINGS=(
|
||||||
|
server_name => 'matrix-synapse/server-name',
|
||||||
|
report_stats => 'matrix-synapse/report-stats',
|
||||||
|
);
|
||||||
|
|
||||||
|
# enable debug if dpkg --debug
|
||||||
|
my $DEBUG = $ENV{DPKG_MAINTSCRIPT_DEBUG};
|
||||||
|
|
||||||
|
sub read_config {
|
||||||
|
my @files = @_;
|
||||||
|
|
||||||
|
foreach my $file (@files) {
|
||||||
|
print STDERR "reading $file\n" if $DEBUG;
|
||||||
|
|
||||||
|
open my $FH, "<", $file or next;
|
||||||
|
|
||||||
|
# rudimentary parsing which (a) avoids having to depend on a yaml library,
|
||||||
|
# and (b) is tolerant of yaml errors
|
||||||
|
while($_ = <$FH>) {
|
||||||
|
while (my ($setting, $debconf) = each %MAPPINGS) {
|
||||||
|
$setting = quotemeta $setting;
|
||||||
|
if(/^${setting}\s*:(.*)$/) {
|
||||||
|
my $val = $1;
|
||||||
|
|
||||||
|
# remove leading/trailing whitespace
|
||||||
|
$val =~ s/^\s*//;
|
||||||
|
$val =~ s/\s*$//;
|
||||||
|
|
||||||
|
# remove surrounding quotes
|
||||||
|
if ($val =~ /^"(.*)"$/ || $val =~ /^'(.*)'$/) {
|
||||||
|
$val = $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print STDERR ">> $debconf = $val\n" if $DEBUG;
|
||||||
|
set($debconf, $val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close $FH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub update_config {
|
||||||
|
my @files = @_;
|
||||||
|
|
||||||
|
my %substs = ();
|
||||||
|
while (my ($setting, $debconf) = each %MAPPINGS) {
|
||||||
|
my @res = get($debconf);
|
||||||
|
$substs{$setting} = $res[1] if $res[0] == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $file (@files) {
|
||||||
|
print STDERR "checking $file\n" if $DEBUG;
|
||||||
|
|
||||||
|
open my $FH, "<", $file or next;
|
||||||
|
|
||||||
|
my $updated = 0;
|
||||||
|
|
||||||
|
# read the whole file into memory
|
||||||
|
my @lines = <$FH>;
|
||||||
|
|
||||||
|
while (my ($setting, $val) = each %substs) {
|
||||||
|
$setting = quotemeta $setting;
|
||||||
|
|
||||||
|
map {
|
||||||
|
if (/^${setting}\s*:\s*(.*)\s*$/) {
|
||||||
|
my $current = $1;
|
||||||
|
if ($val ne $current) {
|
||||||
|
$_ = "${setting}: $val\n";
|
||||||
|
$updated = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} @lines;
|
||||||
|
}
|
||||||
|
close $FH;
|
||||||
|
|
||||||
|
next unless $updated;
|
||||||
|
|
||||||
|
print STDERR "updating $file\n" if $DEBUG;
|
||||||
|
open $FH, ">", $file or die "unable to update $file";
|
||||||
|
print $FH @lines;
|
||||||
|
close $FH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
my $cmd = $ARGV[0];
|
||||||
|
|
||||||
|
my $read = 0;
|
||||||
|
my $update = 0;
|
||||||
|
|
||||||
|
if (not $cmd) {
|
||||||
|
die "must specify a command to perform\n";
|
||||||
|
} elsif ($cmd eq 'read') {
|
||||||
|
$read = 1;
|
||||||
|
} elsif ($cmd eq 'update') {
|
||||||
|
$update = 1;
|
||||||
|
} else {
|
||||||
|
die "unknown command '$cmd'\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
my @files = (
|
||||||
|
"/etc/matrix-synapse/homeserver.yaml",
|
||||||
|
glob("/etc/matrix-synapse/conf.d/*.yaml"),
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($read) {
|
||||||
|
read_config(@files);
|
||||||
|
} elsif ($update) {
|
||||||
|
update_config(@files);
|
||||||
|
}
|
|
@ -4,6 +4,9 @@ set -e
|
||||||
|
|
||||||
. /usr/share/debconf/confmodule
|
. /usr/share/debconf/confmodule
|
||||||
|
|
||||||
|
# try to update the debconf db according to whatever is in the config files
|
||||||
|
/opt/venvs/matrix-synapse/lib/manage_debconf.pl read || true
|
||||||
|
|
||||||
db_input high matrix-synapse/server-name || true
|
db_input high matrix-synapse/server-name || true
|
||||||
db_input high matrix-synapse/report-stats || true
|
db_input high matrix-synapse/report-stats || true
|
||||||
db_go
|
db_go
|
|
@ -8,19 +8,36 @@ USER="matrix-synapse"
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
configure|reconfigure)
|
configure|reconfigure)
|
||||||
# Set server name in config file
|
|
||||||
|
# generate template config files if they don't exist
|
||||||
mkdir -p "/etc/matrix-synapse/conf.d/"
|
mkdir -p "/etc/matrix-synapse/conf.d/"
|
||||||
db_get matrix-synapse/server-name
|
if [ ! -e "$CONFIGFILE_SERVERNAME" ]; then
|
||||||
|
cat > "$CONFIGFILE_SERVERNAME" <<EOF
|
||||||
|
# This file is autogenerated, and will be recreated on upgrade if it is deleted.
|
||||||
|
# Any changes you make will be preserved.
|
||||||
|
|
||||||
if [ "$RET" ]; then
|
# The domain name of the server, with optional explicit port.
|
||||||
echo "server_name: $RET" > $CONFIGFILE_SERVERNAME
|
# This is used by remote servers to connect to this server,
|
||||||
|
# e.g. matrix.org, localhost:8080, etc.
|
||||||
|
# This is also the last part of your UserID.
|
||||||
|
#
|
||||||
|
server_name: ''
|
||||||
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
db_get matrix-synapse/report-stats
|
if [ ! -e "$CONFIGFILE_REPORTSTATS" ]; then
|
||||||
if [ "$RET" ]; then
|
cat > "$CONFIGFILE_REPORTSTATS" <<EOF
|
||||||
echo "report_stats: $RET" > $CONFIGFILE_REPORTSTATS
|
# This file is autogenerated, and will be recreated on upgrade if it is deleted.
|
||||||
|
# Any changes you make will be preserved.
|
||||||
|
|
||||||
|
# Whether to report anonymized homeserver usage statistics.
|
||||||
|
report_stats: false
|
||||||
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# update the config files according to whatever is in the debconf database
|
||||||
|
/opt/venvs/matrix-synapse/lib/manage_debconf.pl update
|
||||||
|
|
||||||
if ! getent passwd $USER >/dev/null; then
|
if ! getent passwd $USER >/dev/null; then
|
||||||
adduser --quiet --system --no-create-home --home /var/lib/matrix-synapse $USER
|
adduser --quiet --system --no-create-home --home /var/lib/matrix-synapse $USER
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Reference in New Issue