pam_mount/convert_keyhash.pl

185 lines
4.5 KiB
Perl

#!/usr/bin/perl -w
#
# convert tool for pam_mount.conf.xml
#
# Copyright (c) 2009 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file is under the same license as pam_mount itself.
#
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
use Data::Dumper;
use Getopt::Long;
use IO::File;
use XML::Writer;
use XML::Parser;
use File::Temp qw/ tempfile /;
use File::Copy;
use strict;
my $OLD_CONF = "/etc/security/pam_mount.conf.xml";
my ($TMPFH, $TEMPNAME) = tempfile("pam_mount_conf.XXXXXXXX", DIR => "/tmp/", UNLINK => 1);
my $BAK = "";
my $debug = 0;
my $hasChanges = 0;
my $node = {};
$node->{element} = "";
$node->{attrs} = {};
$node->{chars} = "";
$node->{isEmpty} = 1;
Getopt::Long::Configure(qw(bundling));
GetOptions(
"i=s" => \$OLD_CONF,
"d" => \$debug,
);
if( ! -e "$OLD_CONF" )
{
print STDERR "$OLD_CONF: file not found.\n";
exit 1;
}
$BAK = "$OLD_CONF";
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon += 1;
$year += 1900;
$BAK .= ".$year-$mon-$mday";
sub handle_decl_tag
{
my $wrt = shift;
my( $expat, $version, $encoding, $standalone ) = @_;
$wrt->xmlDecl($encoding, $standalone);
$wrt->raw("\n\n");
print "write xmlDecl with $encoding\n" if($debug);
}
sub handle_start_tag
{
my $wrt = shift;
my( $expat, $element, %attrs ) = @_;
if($node->{element} ne "" && !$node->{drop})
{
# subnode write the old one first
$wrt->startTag($node->{element}, %{$node->{attrs}});
print "write starttag of $node->{element}\n" if($debug);
if($node->{chars} ne "")
{
$wrt->characters($node->{chars});
print "write characters\n" if($debug);
}
$wrt->raw("\n");
$node->{element} = "";
$node->{attrs} = {};
$node->{chars} = "";
$node->{isEmpty} = 1;
}
if(lc($element) eq "volume" && ! exists $attrs{fskeyhash})
{
print "!!! set fskeyhash to MD5\n" if($debug);
$attrs{fskeyhash} = "md5";
$hasChanges = 1;
}
if(lc($element) eq "volume" ||
lc($element) eq "pam_mount" ||
lc($element) eq "debug" ||
lc($element) eq "luserconf" ||
lc($element) eq "mntoptions" ||
lc($element) eq "path" ||
lc($element) eq "logout" ||
lc($element) eq "mkmountpoint"
)
{
$node->{drop} = 0;
}
else
{
$node->{drop} = 1;
}
$node->{element} = $element;
$node->{attrs} = \%attrs;
$node->{chars} = "";
$node->{isEmpty} = 1;
}
sub handle_char_tag
{
my $wrt = shift;
my( $expat, $string ) = @_;
$node->{chars} .= $string;
$node->{isEmpty} = 0;
}
sub handle_end_tag
{
my $wrt = shift;
my( $expat, $element ) = @_;
if(!$node->{drop} && $element eq $node->{element})
{
if($node->{isEmpty})
{
$wrt->emptyTag($node->{element}, %{$node->{attrs}});
$wrt->raw("\n");
print "write emptytag of $node->{element}\n" if($debug);
}
else
{
$wrt->startTag($node->{element}, %{$node->{attrs}});
print "write starttag of $node->{element}\n" if($debug);
if($node->{chars} ne "")
{
$wrt->characters($node->{chars});
print "write characters\n" if($debug);
}
$wrt->endTag($node->{element});
$wrt->raw("\n");
print "write endtag of $node->{element}\n" if($debug);
}
}
elsif($element ne $node->{element})
{
$wrt->endTag($element);
print "write endtag of $element\n" if($debug);
}
$node->{element} = "";
$node->{attrs} = {};
$node->{chars} = "";
$node->{isEmpty} = 1;
}
my $writer = new XML::Writer(OUTPUT => $TMPFH, UNSAFE => 1);
my $parser = XML::Parser->new( Handlers =>
{ XMLDecl => sub { handle_decl_tag($writer, @_) },
Start => sub { handle_start_tag($writer, @_) },
Char => sub { handle_char_tag($writer, @_) },
End => sub { handle_end_tag($writer, @_) },
});
$parser->parsefile( $OLD_CONF );
$TMPFH->close();
if($hasChanges)
{
print "Changes made. $OLD_CONF => $BAK\n" if($debug);
copy( $OLD_CONF, $BAK );
print "$TEMPNAME => $OLD_CONF \n" if($debug);
copy( $TEMPNAME, $OLD_CONF );
}
else
{
print "No changes made. Keeping $OLD_CONF.\n" if($debug);
}
exit 0;