lib/SI/system.pm
changeset 28 7d7ca3f05f25
parent 26 39421a9700c5
child 29 4e40cf0eba95
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/SI/system.pm	Wed Jan 20 21:52:01 2010 +0100
@@ -0,0 +1,59 @@
+package SI::system;
+
+use strict;
+use warnings;
+use File::Temp qw(tempdir);
+use if $ENV{DEBUG} ~~ qw(system) => "Smart::Comments";
+use SI::tools;
+
+$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};
+    die "ERR: Can't get system identification (MAC address)\n";
+}
+
+sub hostname(\%) {
+    my $devs = shift;
+    my $mnt = tempdir(CLEANUP => 1);
+    my $h;
+
+    foreach my $fs (
+        grep {
+            exists $devs->{volume}{$_}{type}
+              and $devs->{volume}{$_}{type} =~ /^ext/i
+        } @{ $devs->{volumes} }
+      )
+    {
+        run("mount -r $fs $mnt");
+        if (-f "$mnt/etc/hostname") {
+            chomp($h = cat("$mnt/etc/hostname"));
+        }
+        run("umount $mnt");
+        return $h if defined $h;
+    }
+
+    return $h;
+}
+
+sub fsck(\%) {
+    my $devs = shift;
+
+    foreach
+      my $v (grep { exists $devs->{volume}{type} } keys %{ $devs->{volume} })
+    {
+        my $volume = $devs->{volume}{$v};
+        next if $volume->{type} !~ /^ext/i;
+
+        system("fsck -C0 $v");
+        die "ERR: fsck failed\n" if $? > 2;
+    }
+}
+
+1;
+
+# vim:sts=4 sw=4 aw ai si: