Make sure that users' changes to the config files are preserved. Fixes #4440.tags/v0.99.2rc1
@@ -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 | |||||
mkdir -p "/etc/matrix-synapse/conf.d/" | |||||
db_get matrix-synapse/server-name | |||||
if [ "$RET" ]; then | |||||
echo "server_name: $RET" > $CONFIGFILE_SERVERNAME | |||||
# generate template config files if they don't exist | |||||
mkdir -p "/etc/matrix-synapse/conf.d/" | |||||
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. | |||||
# The domain name of the server, with optional explicit port. | |||||
# 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 [ "$RET" ]; then | |||||
echo "report_stats: $RET" > $CONFIGFILE_REPORTSTATS | |||||
if [ ! -e "$CONFIGFILE_REPORTSTATS" ]; then | |||||
cat > "$CONFIGFILE_REPORTSTATS" <<EOF | |||||
# 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 | ||||