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