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