Skip to content

Mkmotd hostconfig #118

Merged
merged 3 commits into from
Feb 26, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
233 changes: 125 additions & 108 deletions mkmotd/mkmotd.pl
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
# Mutter: https://github.molgen.mpg.de/mariux64/mxtools/tree/master/mkmotd
#

my ($os_release)=`/bin/os-release`;chomp($os_release);
my ($os_release) = `/bin/os-release`;
chomp($os_release);

our $TEMPLATE;

if ($os_release eq 'mariux_x86_64' || $os_release eq 'mariux_i686') {
$TEMPLATE=<<'EOF';
if ( $os_release eq 'mariux_x86_64' || $os_release eq 'mariux_i686' ) {
$TEMPLATE = <<'EOF';

# # ### # # %HOST%
## ## ## ##### # # # # #
Expand All @@ -26,8 +27,9 @@
http://twiki.molgen.mpg.de/twiki/bin/view/Edv/MarIuXNews

EOF
} elsif ($os_release eq 'mariux64') {
$TEMPLATE=<<'EOF';
}
elsif ( $os_release eq 'mariux64' ) {
$TEMPLATE = <<'EOF';

# # ### # # %HOST%
## ## ## ##### # # # # # system %SYSTEM%
Expand All @@ -39,74 +41,90 @@

EOF

$TEMPLATE.=" / to bee or not to bee / ";
$TEMPLATE .= " / to bee or not to bee / ";

if ( -d '/node/tags' ) {
$_=`ls /node/tags`;s/\n/ /g;
$TEMPLATE.="tags: $_";
}
if ( -d '/node/tags' ) {
$_ = `ls /node/tags`;
s/\n/ /g;
$TEMPLATE .= "tags: $_";
}

$TEMPLATE.="\n";
$TEMPLATE .= "\n";

} else {
die "$os_release : unknown os_release\n";
}
else {
die "$os_release : unknown os_release\n";
}

sub readstr {
my $f = shift;
if ( -e $f ) {
open I,'<',$f or die "cannot readstr $f: $!";
my $str = <I>;
chomp ($str);
close I;
return $str;
}
return undef;
my $f = shift;
if ( -e $f ) {
open I, '<', $f or die "cannot readstr $f: $!";
my $str = <I>;
chomp($str);
close I;
return $str;
}
return undef;
}

sub policy { # policy('theinternet') --> ('zeile1,'zeile2',....)
my ($hostname)=@_;

open IN,'<','/etc/mxpolicy' or return ();
while (<IN>) {
if (/^\S/ && /\b$hostname\b/) {
my @out;
while (<IN>) {
/^\S/ and last;
/\s+\*\s*(.+)/ and push @out,$1;
if (/\s+\`\s*(.+)/) {
my $x = `$1`;chomp($x);
push @out,split(/\n/,$x);
}
}
return @out;
sub policy { # policy('theinternet') --> ('zeile1,'zeile2',....)
my ($hostname) = @_;
my @hostconfig=split(/ |\n/, `hostconfig`);
open IN, '<', '/etc/mxpolicy' or return ();
my @out;
while (<IN>) {
LOOP:
my ( $tag ) = /^\@(\S+)/;
if ( defined($tag) && grep { $tag eq $_ } @hostconfig ) {
while (<IN>) {
/^\S/ and goto LOOP;
/\s+\*\s*(.+)/ and push @out, $1;
if (/\s+\`\s*(.+)/) {
my $x = `$1`;
chomp($x);
push @out, split( /\n/, $x );
}
}
}

if ( /^\S/ && /\b$hostname\b/) {
while (<IN>) {
/^\S/ and goto LOOP;
/\s+\*\s*(.+)/ and push @out, $1;
if (/\s+\`\s*(.+)/) {
my $x = `$1`;
chomp($x);
push @out, split( /\n/, $x );
}
}
}
}
}
return ();
return @out;
}


my %T;

my @un = split(/ /,`uname -a`);
my @un = split( / /, `uname -a` );
chomp(@un);
$_=$un[1];s/\.molgen\.mpg\.de//;
$_ = $un[1];
s/\.molgen\.mpg\.de//;
$T{HOST} = $_;
$T{KERNEL} = "$un[2] $un[3]";
$T{BITS} = 32; # default (may change sometime...)
$T{ARCH} = 'i686';
if ($T{KERNEL} =~ /x86_64|mx64/) {
$T{BITS} = 64;
$T{ARCH} = 'x86_64';
$T{BITS} = 32; # default (may change sometime...)
$T{ARCH} = 'i686';
if ( $T{KERNEL} =~ /x86_64|mx64/ ) {
$T{BITS} = 64;
$T{ARCH} = 'x86_64';
}

$_ = `/lib/libc.so.6`;
/version (\d\S+)[\.,]/;
$T{GLIBC} = $1;

my @pc=`cat /proc/cpuinfo`;
my $mn='unknown CPU';
$T{NCPU} = grep {/model name/ and $mn = $_; /processor/} @pc;
my @pc = `cat /proc/cpuinfo`;
my $mn = 'unknown CPU';
$T{NCPU} = grep { /model name/ and $mn = $_; /processor/ } @pc;
$mn =~ s/\(.*?\)|\d+-Core Processor|xeon|Virtual|Athlon|model name\s*:|six.core|quad.core|dual.core|intel|Processor|cpu|core| with Radeon Vega Graphics//ig;
$mn =~ s/\s(E\d\-)\s/$1/;
$mn =~ s/\s\d\s\@/ \@/;
Expand All @@ -115,82 +133,81 @@ sub policy { # policy('theinternet') --> ('zeile1,'zeile2',....)
$mn =~ s/^\s+|\s+$//g;
$T{CPU} = $mn;

$T{SYSTEM}='';
$T{SYSTEM} = '';
{
my $sys = '';

# for i in /sys/devices/virtual/dmi/id/*_{name,vendor,version}; do echo -en "$i\t"; cat $i; done
# for i in /sys/devices/virtual/dmi/id/{product_{name,version},sys_vendor}; do echo -en "$i\t"; cat $i; done
my $sys = '';

# /sys/devices/virtual/dmi/id
# for i in /sys/devices/virtual/dmi/id/*_{name,vendor,version}; do echo -en "$i\t"; cat $i; done
# for i in /sys/devices/virtual/dmi/id/{product_{name,version},sys_vendor}; do echo -en "$i\t"; cat $i; done

my $pn = readstr('/sys/devices/virtual/dmi/id/product_name');
if ($pn =~ m/All Series|empty/) {
$pn = readstr('/sys/devices/virtual/dmi/id/board_name');
$pn =~ s/^TYAN Transport\s+//;
}
# /sys/devices/virtual/dmi/id

my $mf = readstr('/sys/devices/virtual/dmi/id/sys_vendor');
if ($mf =~ m/(empty|NVIDIA)/) {
$mf = readstr('/sys/devices/virtual/dmi/id/board_vendor');
}
my $pn = readstr('/sys/devices/virtual/dmi/id/product_name');
if ( $pn =~ m/All Series|empty/ ) {
$pn = readstr('/sys/devices/virtual/dmi/id/board_name');
$pn =~ s/^TYAN Transport\s+//;
}

($mf eq 'Supermicro') and $pn =~ s/^AS -//;
($mf =~ /^Gigabyte/) and $pn =~ s/^GA-//;
my $mf = readstr('/sys/devices/virtual/dmi/id/sys_vendor');
if ( $mf =~ m/(empty|NVIDIA)/ ) {
$mf = readstr('/sys/devices/virtual/dmi/id/board_vendor');
}

( $mf eq 'Supermicro' ) and $pn =~ s/^AS -//;
( $mf =~ /^Gigabyte/ ) and $pn =~ s/^GA-//;

$mf =~ s/( Inc.| Computer Corporation)//;
$mf =~ s/( Inc.| Computer Corporation)//;

my $vn = readstr('/sys/devices/virtual/dmi/id/product_version');
if ($vn =~ m/empty/) {
$vn = undef;
}
my $vn = readstr('/sys/devices/virtual/dmi/id/product_version');
if ( $vn =~ m/empty/ ) {
$vn = undef;
}

if ( defined($pn) and $pn eq 'CK8 ') {
$mf = $vn;
$pn = '';
}
($mf eq 'QEMU') and $pn='';
if ( defined($pn) and $pn eq 'CK8 ' ) {
$mf = $vn;
$pn = '';
}
( $mf eq 'QEMU' ) and $pn = '';

($pn ne '') and $pn = " $pn";
$T{SYSTEM} = "$mf$pn";
$T{SYSTEM} =~ s/_/ /g;
$T{SYSTEM} =~ s{(^HP | WorkStation| Transport| Tower|Hewlett-Packard |/S2932-E/S2932-SI| Thunder| Computer Corp|Technology Co., Ltd. | Standard PC)}{}i;
( $pn ne '' ) and $pn = " $pn";
$T{SYSTEM} = "$mf$pn";
$T{SYSTEM} =~ s/_/ /g;
$T{SYSTEM} =~ s{(^HP | WorkStation| Transport| Tower|Hewlett-Packard |/S2932-E/S2932-SI| Thunder| Computer Corp|Technology Co., Ltd. | Standard PC)}{}i;
}

my %BC = (
'bugblatterbeastoftraal' => 'TYAN VX50 B4985',
# 'crap03' => 'TYAN GT20-B2925/B2925-E',
'keineahnung' => 'FUJITSU ESPRIMO P756',
'furunkel' => 'HP Z200 Workstation',
'bugblatterbeastoftraal' => 'TYAN VX50 B4985',

# 'crap03' => 'TYAN GT20-B2925/B2925-E',
'keineahnung' => 'FUJITSU ESPRIMO P756',
'furunkel' => 'HP Z200 Workstation',
);
if (exists($BC{$T{HOST}}) and $BC{$T{HOST}} ne $T{SYSTEM}) {
system("banner WRONG");
die "$BC{$T{HOST}} ne $T{SYSTEM}";
if ( exists( $BC{ $T{HOST} } ) and $BC{ $T{HOST} } ne $T{SYSTEM} ) {
system("banner WRONG");
die "$BC{$T{HOST}} ne $T{SYSTEM}";
}
my @mem = `cat /proc/meminfo`;
my $mem = '??';
for (@mem) {
if (/MemTotal:\s+(\d+)/) {
my $mm = $1;
if ( int($mm / 1024 / 1000 ) >= 1 ) {
$mem = (int($mm / 1024 / 100)/10) + 0;
$mem .= ' GB';
}
elsif ( int($mm / 1000 ) >= 1 ) {
$mem = (int($mm / 100)/10) + 0;
$mem .= ' MB';
}
else {
$mem = "$mm kB";
}
last;
}
if (/MemTotal:\s+(\d+)/) {
my $mm = $1;
if ( int( $mm / 1024 / 1000 ) >= 1 ) {
$mem = ( int( $mm / 1024 / 100 ) / 10 ) + 0;
$mem .= ' GB';
}
elsif ( int( $mm / 1000 ) >= 1 ) {
$mem = ( int( $mm / 100 ) / 10 ) + 0;
$mem .= ' MB';
}
else {
$mem = "$mm kB";
}
last;
}
}
$T{MEM} = $mem;


$TEMPLATE=~s/%(\S+?)%/$T{$1}||$1/eg;
open O, '>','/etc/motd' or die "/etc/motd: $!\n";
print O $TEMPLATE, (join("\n",map (" ** $_ **",policy($T{HOST})))||" ** **"),"\n\n";
$TEMPLATE =~ s/%(\S+?)%/$T{$1}||$1/eg;
open O, '>', '/etc/motd' or die "/etc/motd: $!\n";
print O $TEMPLATE, ( join( "\n", map ( " ** $_ **", policy( $T{HOST} ) ) ) || " ** **" ), "\n\n";
close O;