--- a/SI/blkid.pm Tue Jan 19 23:45:54 2010 +0100
+++ b/SI/blkid.pm Tue Jan 19 23:48:10 2010 +0100
@@ -9,11 +9,10 @@
use SI::tools;
-
sub ids($\%) {
my ($file, $devs) = @_;
- my @volumes = sort keys %{$devs->{volume}};
+ my @volumes = sort keys %{ $devs->{volume} };
verbose("reading blkids: @volumes");
foreach (`blkid -c /dev/null @volumes`) {
my $dev = (split /:/)[0];
@@ -22,35 +21,36 @@
my ($type) = /\sTYPE=.(.*?).\s/;
my ($label) = /\sLABEL=.(.*?).\s/;
- if (exists $devs->{volume}{$dev}) {
+ if (exists $devs->{volume}{$dev}) {
$devs->{volume}{$dev}{uuid} = $uuid;
$devs->{volume}{$dev}{type} = $type;
$devs->{volume}{$dev}{label} = $label;
- my ($of, $oh);
- if (defined $uuid) {
- $of = sprintf $file, "uuid." . basename $dev;
- $oh = new IO::File ">$of" or die "ERR: Can't open $of: $!\n";
- $oh->print("$uuid\n");
- }
+ my ($of, $oh);
+ if (defined $uuid) {
+ $of = sprintf $file, "uuid." . basename $dev;
+ $oh = new IO::File ">$of" or die "ERR: Can't open $of: $!\n";
+ $oh->print("$uuid\n");
+ }
- if (defined $label) {
- $of = sprintf $file, "label." . basename $dev;
- $oh = new IO::File ">$of" or die "ERR: Can't open $of: $!\n";
- $oh->print("$label\n");
- }
+ if (defined $label) {
+ $of = sprintf $file, "label." . basename $dev;
+ $oh = new IO::File ">$of" or die "ERR: Can't open $of: $!\n";
+ $oh->print("$label\n");
+ }
- if (defined $type) {
- $of = sprintf $file, "type." . basename $dev;
- $oh = new IO::File ">$of" or die "ERR: Can't open $of: $!\n";
- $oh->print("$type\n");
- }
+ if (defined $type) {
+ $of = sprintf $file, "type." . basename $dev;
+ $oh = new IO::File ">$of" or die "ERR: Can't open $of: $!\n";
+ $oh->print("$type\n");
+ }
- }
+ }
}
verbose("\n");
}
1;
+
# vim:sts=4 sw=4 aw ai si:
--- a/SI/dumper.pm Tue Jan 19 23:45:54 2010 +0100
+++ b/SI/dumper.pm Tue Jan 19 23:48:10 2010 +0100
@@ -9,17 +9,19 @@
sub dump($\%) {
my ($file, $devs) = @_;
- foreach my $volume ( map { { name => $_, %{$devs->{volume}{$_}}}} keys %{$devs->{volume}}) {
- next if !defined $volume->{type} or $volume->{type} !~ /^ext/i;
-
- system("fsck -f -C0 $volume->{name}");
- die "ERR: fsck failed\n" if $? > 2;
+ foreach my $volume (map { { name => $_, %{ $devs->{volume}{$_} } } }
+ keys %{ $devs->{volume} })
+ {
+ next if !defined $volume->{type} or $volume->{type} !~ /^ext/i;
- verbose("dumping volume $volume->{name}");
- my $dumpdev = $volume->{name};
- my $of = sprintf $file, basename($volume->{name});
- run("dump -0 -z -f $of $dumpdev");
- verbose("\n");
+ system("fsck -f -C0 $volume->{name}");
+ die "ERR: fsck failed\n" if $? > 2;
+
+ verbose("dumping volume $volume->{name}");
+ my $dumpdev = $volume->{name};
+ my $of = sprintf $file, basename($volume->{name});
+ run("dump -0 -z -f $of $dumpdev");
+ verbose("\n");
}
}
--- a/SI/lvm.pm Tue Jan 19 23:45:54 2010 +0100
+++ b/SI/lvm.pm Tue Jan 19 23:48:10 2010 +0100
@@ -18,9 +18,10 @@
my $devs = shift;
# find the physical volumes we've already recognised as „non-removable“
- my @known = keys %{$devs->{volume}}, keys %{$devs->{disk}};
+ my @known = keys %{ $devs->{volume} }, keys %{ $devs->{disk} };
- my @pvs = grep { $_ ~~ @known } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
+ my @pvs =
+ grep { $_ ~~ @known } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
@volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`;
run("vgchange -ay @volumegroups 2>&1 >/dev/null");
return @volumegroups;
@@ -33,12 +34,12 @@
# physical devices known to lvm, not just the non-removable
my @vgs = _vgs(%$devs);
- my @lvs =
- map { abs_path ((dirname $_) . "/" . readlink) }
- map { s/^\s*//; (split /:/)[0] }
- grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
+ my @lvs =
+ map { abs_path((dirname $_) . "/" . readlink) }
+ map { s/^\s*//; (split /:/)[0] }
+ grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
foreach (@lvs) {
- $devs->{volume}{$_} = { origin => "lvm" };
+ $devs->{volume}{$_} = { origin => "lvm" };
}
}
@@ -47,9 +48,10 @@
# we save it vg by vg to have the restore more easy
my @vgs = _vgs(%$devs);
- foreach ( map { s/^\s*(.*)/$1/; $_ = (split /:/)[0] } `vgs --noheadings --separator : @vgs`)
+ foreach (map { s/^\s*(.*)/$1/; $_ = (split /:/)[0] }
+ `vgs --noheadings --separator : @vgs`)
{
- verbose("saving vg $_\n");
+ verbose("saving vg $_\n");
my $file = sprintf $file, $_;
run("vgcfgbackup -f '$file' '$_' >/dev/null");
}
@@ -61,4 +63,5 @@
}
1;
+
# vim:sts=4 sw=4 aw ai si:
--- a/SI/mbr.pm Tue Jan 19 23:45:54 2010 +0100
+++ b/SI/mbr.pm Tue Jan 19 23:48:10 2010 +0100
@@ -9,17 +9,17 @@
use SI::tools;
sub save($\%) {
- my ($file, $devs) = @_;
-
+ my ($file, $devs) = @_;
- foreach my $disk (keys %{$devs->{disk}}) {
- verbose("saving mbr of $disk\n");
- open((my $o), $_ = sprintf(">$file", basename($disk))) or die "Can't open $_: $!\n";
+ foreach my $disk (keys %{ $devs->{disk} }) {
+ verbose("saving mbr of $disk\n");
+ open((my $o), $_ = sprintf(">$file", basename($disk)))
+ or die "Can't open $_: $!\n";
- local $/ = \512;
- my $in = new IO::File $disk or die "Can't open $disk: $!\n";
- print $o $_ = <$in>;
- }
+ local $/ = \512;
+ my $in = new IO::File $disk or die "Can't open $disk: $!\n";
+ print $o $_ = <$in>;
+ }
}
1;
--- a/SI/ptable.pm Tue Jan 19 23:45:54 2010 +0100
+++ b/SI/ptable.pm Tue Jan 19 23:48:10 2010 +0100
@@ -18,48 +18,50 @@
# non-removable block devices (this may include
# LVs (used as disk itself) too)
foreach (glob("/sys/block/*")) {
- my $name = basename($_);
- my $dev = "/dev/$name";
+ my $name = basename($_);
+ my $dev = "/dev/$name";
- next if !-e "$_/device";
- next if (grep { /ATTR{removable}/ } `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./;
- next if (stat $dev)[0] == (stat $0)[0];
+ next if !-e "$_/device";
+ next
+ if (grep { /ATTR{removable}/ }
+ `udevadm info --attribute-walk --name $name`)[0] !~ /==.0./;
+ next if (stat $dev)[0] == (stat $0)[0];
- # exclude the device (stick) we're part of - this HACK is
- # only useful on KVM - the usb stick doesn't appear as a removeable
- # device
- next if (stat $0)[0] ~~ [map { (stat)[6] } map { "/dev/" . basename(dirname $_) } glob("$_/*/partition")];
-
+ # exclude the device (stick) we're part of - this HACK is
+ # only useful on KVM - the usb stick doesn't appear as a removeable
+ # device
+ next
+ if (stat $0)[0] ~~ [map { (stat)[6] }
+ map { "/dev/" . basename(dirname $_) } glob("$_/*/partition")];
- verbose("\n");
- verbose("device $dev\n");
-
- die "ERR: $dev does not exist. (should not happen): $!"
- if !-b $dev;
+ verbose("\n");
+ verbose("device $dev\n");
- # now the physical disk -- let's ask for the partition table
+ die "ERR: $dev does not exist. (should not happen): $!"
+ if !-b $dev;
- my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`;
+ # now the physical disk -- let's ask for the partition table
- my $of = sprintf $file, $name;
- my $oh = new IO::File ">$of" or die "Can't open >$of: $!\n";
- print $oh @sfdisk;
+ my @sfdisk = `sfdisk -d /dev/$name 2>/dev/null`;
+
+ my $of = sprintf $file, $name;
+ my $oh = new IO::File ">$of" or die "Can't open >$of: $!\n";
+ print $oh @sfdisk;
- $devs->{disk}{"/dev/$name"} = {
- pt => \@sfdisk
- };
+ $devs->{disk}{"/dev/$name"} = { pt => \@sfdisk };
- # and let's prepare the volume entries
- foreach (@sfdisk) {
- /^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next;
- $devs->{volume}{$1} = {
- origin => "ptable",
- ptable_type => $2,
- };
- }
+ # and let's prepare the volume entries
+ foreach (@sfdisk) {
+ /^(\S+)\s*:.*Id=\s*([[:xdigit:]]+)/ or next;
+ $devs->{volume}{$1} = {
+ origin => "ptable",
+ ptable_type => $2,
+ };
+ }
}
return;
}
1;
+
# vim:sts=4 sw=4 aw ai si:
--- a/SI/system.pm Tue Jan 19 23:45:54 2010 +0100
+++ b/SI/system.pm Tue Jan 19 23:48:10 2010 +0100
@@ -9,31 +9,36 @@
$ENV{LC_ALL} = "C";
sub id() {
+
# hope it's eth* or wlan*
local $_ = (sort grep { /^(eth|wlan)/ } `ifconfig -a`)[0];
/^(?<dev>\S+)\s.*HWaddr\s+(?<mac>[\da-f:]+)\s*$/i
- and return $+{mac};
+ and return $+{mac};
die "ERR: Can't get system identification (MAC address)\n";
}
sub hostname(\%) {
- my $devs = shift;
- my $mnt = tempdir(CLEANUP => 1);
- my $r;
+ my $devs = shift;
+ my $mnt = tempdir(CLEANUP => 1);
+ my $r;
- foreach my $fs (grep { $devs->{volume}{$_}{type} =~ /^ext/i }
- grep { exists $devs->{volume}{$_}{type} }
- keys %{$devs->{volume}}) {
- run("mount -r $fs $mnt");
- if (-f "$mnt/etc/hostname") {
- die "ERR: found 2nd hostname" if defined $r;
- chomp($r = cat("$mnt/etc/hostname"));
- }
- run("umount $mnt");
- }
+ foreach my $fs (
+ grep { $devs->{volume}{$_}{type} =~ /^ext/i }
+ grep { exists $devs->{volume}{$_}{type} }
+ keys %{ $devs->{volume} }
+ )
+ {
+ run("mount -r $fs $mnt");
+ if (-f "$mnt/etc/hostname") {
+ die "ERR: found 2nd hostname" if defined $r;
+ chomp($r = cat("$mnt/etc/hostname"));
+ }
+ run("umount $mnt");
+ }
- return $r;
+ return $r;
}
1;
+
# vim:sts=4 sw=4 aw ai si:
--- a/SI/tools.pm Tue Jan 19 23:45:54 2010 +0100
+++ b/SI/tools.pm Tue Jan 19 23:48:10 2010 +0100
@@ -11,27 +11,28 @@
our @EXPORT = qw(&run &verbose &find_by_devid &cat &barf);
sub run(@) {
- system(@_);
- die "$_[0] failed with exit code " . ($? >> 8) . "\n"
- if $?;
+ system(@_);
+ die "$_[0] failed with exit code " . ($? >> 8) . "\n"
+ if $?;
}
-sub barf(@) { die Dumper @_ }
+sub barf(@) { die Dumper @_ }
sub cat($) {
- my $fh = new IO::File $_[0]
- or die "Can't open $_[0]: $!\n";
- return(<$fh>) if wantarray;
+ my $fh = new IO::File $_[0]
+ or die "Can't open $_[0]: $!\n";
+ return (<$fh>) if wantarray;
return join "", <$fh>;
}
my $last = "\n";
-sub verbose(@) {
+
+sub verbose(@) {
print $last eq "\n" ? "" : " "
- if not(@_ == 1 and length($_[0]) == 1);
+ if not(@_ == 1 and length($_[0]) == 1);
print @_;
$last = substr($_[-1], -1, 1);
-};
+}
sub find_by_devid($$) {
my ($dir, $id) = @_;
@@ -48,6 +49,6 @@
return $found[0];
}
+1;
-1;
# vim:sts=4 sw=4 aw ai si:
--- a/si Tue Jan 19 23:45:54 2010 +0100
+++ b/si Tue Jan 19 23:48:10 2010 +0100
@@ -22,24 +22,25 @@
use SI::system;
my $opt_exit = "";
-my $opt_dir = "";
+my $opt_dir = "";
MAIN: {
- GetOptions("exit=s" => \$opt_exit,
- "dir=s" => \$opt_dir)
- or die "Bad usage\n";
+ GetOptions(
+ "exit=s" => \$opt_exit,
+ "dir=s" => \$opt_dir
+ ) or die "Bad usage\n";
- my %devices; # the overall data collector
+ my %devices; # the overall data collector
my $dir;
-
+
if ($opt_dir ne "") {
- $dir = $opt_dir;
- }
+ $dir = $opt_dir;
+ }
else {
- $dir = dirname($0) . "/../image-" . SI::system::id();
- remove_tree($dir);
- -d $dir or mkdir($dir, 0700) or die "Can't mkdir $dir: $!\n";
+ $dir = dirname($0) . "/../image-" . SI::system::id();
+ remove_tree($dir);
+ -d $dir or mkdir($dir, 0700) or die "Can't mkdir $dir: $!\n";
}
make_path(map { "$dir/$_" } qw(ptable lvm blkid mbr dump));
@@ -61,7 +62,7 @@
SI::dumper::dump("$dir/dump/%s", %devices);
my $o = new IO::File ">$dir/devices"
- or die "ERR: Can't open $dir/devices: $!\n";
+ or die "ERR: Can't open $dir/devices: $!\n";
$o->print(Dumper \%devices);
# we wait until now, since now it's sure that
@@ -70,9 +71,8 @@
my $hostname = SI::system::hostname(%devices);
symlink(basename($dir), "../image-$hostname");
-
exit;
- }
+}
# vim:sts=4 sw=4 aw ai si: