131 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
| #!/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);
 | |
| }
 |