#!/usr/local/bin/perl # debian-config v1.0 (c) 18.4.2011 by Andreas Ley (u) 19.4.2011 # Add or change entry in debconf config.dat $config='/var/cache/debconf/config.dat'; use Getopt::Std; sub usage { my $image = $0; $image =~ s!.*/!!; print STDERR "Usage: $image [-v] [-t template] [-o owner] [-f flags] name[=value] [...]\n"; exit(1); } getopts('Dhxvt:o:f:') or &usage; &usage if (defined($opt_h) || $#ARGV < 0); for (@ARGV) { if (/=/) { $tag{$`} = $'; $write = 1; } else { $tag{$_} = undef; } } for (keys %tag) { print $_,"\n"; print $tag{$_},"\n"; print exists($tag{$_}),"\n"; print defined($tag{$_}),"\n"; } open(CONFIG,$config) or die "Can't read $config: $!\n"; if (defined($write)) { my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($config) or die; $write = "$config.tmp"; open(WRITE,'>'.$write) or die "Can't write $write: $!\n"; chown($uid,$gid,$write) or die; chmod($mode,$write) or die; } while () { chomp; print STDERR "\"$_\"\n" if ($opt_D); if (/^\s*$/) { &entry; &handle; } elsif (/^\s+/) { $value .= "\n".$_; } elsif (/^(\S+):(\s*)/) { &entry; $tag = $1; $ws = $2; $value = $'; } else { warn "Can't parse line $.\n\"$_\"\n"; } } close(CONFIG); &handle; if (defined($write)) { for $tag (keys %tag) { if (defined($tag{$tag}) && !$seen{$tag}) { print WRITE "Name: ",$tag,"\n"; print WRITE "Template: ",$opt_t,"\n" if (defined($opt_t)); print WRITE "Value: ",$tag{$tag},"\n"; print WRITE "Owners: ",$opt_o,"\n" if (defined($opt_o)); print WRITE "Flags: ",$opt_f,"\n" if (defined($opt_f)); print WRITE "\n"; } } close(WRITE); rename($write,$config) or die; } sub entry { if (defined($tag)) { push(@entries,$tag); $entry{$tag} = $value; $ws{$tag} = $ws; } undef $tag; undef $ws; undef $value; } sub handle { if (defined(%entry)) { for $tag (keys %tag) { if ($tag eq $entry{'Name'}) { if (defined($tag{$tag})) { $entry{'Value'} = $tag{$tag}; $seen{$tag} = 1; } else { print "$tag = ",$entry{'Value'},"\n"; } } } if (defined($write)) { for $entry (@entries) { print WRITE $entry,":",$ws{$entry},$entry{$entry},"\n"; } print WRITE "\n"; } undef @entries; undef %entry; } }