mirror of https://github.com/watcha-fr/synapse
Debian: fix overwriting of config settings on upgrade (#4696)
Make sure that users' changes to the config files are preserved. Fixes #4440.pull/14/head
parent
e07384c4e1
commit
0969d688e3
@ -1 +1,2 @@ |
||||
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); |
||||
} |
Loading…
Reference in new issue