123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #!/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);
- }
|