Browse Source

Debian: fix overwriting of config settings on upgrade (#4696)

Make sure that users' changes to the config files are preserved.

Fixes #4440.
tags/v0.99.2rc1
Richard van der Hoff 5 years ago
committed by GitHub
parent
commit
0969d688e3
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 165 additions and 8 deletions
  1. +6
    -0
      debian/changelog
  2. +1
    -0
      debian/install
  3. +130
    -0
      debian/manage_debconf.pl
  4. +3
    -0
      debian/matrix-synapse-py3.config
  5. +25
    -8
      debian/matrix-synapse-py3.postinst

+ 6
- 0
debian/changelog View File

@@ -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

* New synapse release 0.99.1.1


+ 1
- 0
debian/install View File

@@ -1 +1,2 @@
debian/log.yaml etc/matrix-synapse
debian/manage_debconf.pl /opt/venvs/matrix-synapse/lib/

+ 130
- 0
debian/manage_debconf.pl View File

@@ -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);
}

debian/config → debian/matrix-synapse-py3.config View File

@@ -4,6 +4,9 @@ set -e

. /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/report-stats || true
db_go

+ 25
- 8
debian/matrix-synapse-py3.postinst View File

@@ -8,19 +8,36 @@ USER="matrix-synapse"

case "$1" in
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

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

# 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
adduser --quiet --system --no-create-home --home /var/lib/matrix-synapse $USER
fi


Loading…
Cancel
Save