#!/usr/bin/env perl # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html ##################################################### # # Generic xCAT post script for diskless nodes # ##################################################### use File::Path; # since we don't have syslog set up yet we'll # just save msgs in a local log file $logdir = "/var/log/xcat"; if (!-d $logdir) { mkpath($logdir); } $::sdate = `/bin/date`; chomp $sdate; my $logfile = $logdir . "/xcat.log"; # this log should not contain much so it might be ok to let it grow? # at least we'll have the errors preserved open(LOGFILE,">>",$logfile); $::LOG_FILE = \*LOGFILE; # get hostname $::shorthost = `hostname -s`; chomp $::shorthost; # get platform my $osname = `uname`; chomp $osname; # get the postscript tar file from the server and unwrap it if ($osname eq "Linux") { if (&getLinuxpostfile() != 0 ) { close($::LOG_FILE_HANDLE); exit 1; } } else { if (&getAIXpostfile() != 0 ) { close($::LOG_FILE_HANDLE); exit 1; } } # check & run the postscript my $scriptname = "/xcatpost/".$shorthost; if ($osname eq "Linux") { $scriptname = "/tmp/mypostscript"; } if (-f $scriptname) { my $rc = system("$scriptname"); if ($rc >> 8) { print $::LOG_FILE "$::sdate xcatdsklspost: Could not run $scriptname.\n"; } } else { print $::LOG_FILE "$::sdate xcatdsklspost: Could not find post script for $::shorthost.\n"; } close($::LOG_FILE_HANDLE); exit 0; ##################################################### # # getLinuxpostfile # Get the linux post scripts from the server # ##################################################### sub getLinuxpostfile { # look in the dhcp leases file for the name of the server my $dhclientfile="/var/lib/dhclient/dhclient-eth0.leases"; my @lines; if (open(DHCLIENT, "<$dhclientfile")) { @lines = ; close(DHCLIENT); } else { print $::LOG_FILE "$::sdate xcatdsklspost: Could not open $dhclientfile.\n"; return 1; } my $ip; # IP of server foreach my $l (@lines) { if ($l =~ /dhcp-server-identifier/) { my ($junk, $junk2, $s) = split(" ", $l); ($ip, $junk) = split("\;", $s); } } # get postscripts tar file from the server my $stunconf; mkpath "/etc/stunnel"; open($stunconf,">","/etc/stunnel/stunnel.conf"); print $stunconf "client=yes\n"; print $stunconf "foreground=no\n"; print $stunconf "output=/dev/null\n"; print $stunconf "verify=0\n"; print $stunconf "[xcatd]\n"; print $stunconf "accept=400\n"; print $stunconf "connect=$ip:3001\n"; close($stunconf); my $getcmd = "stunnel; sleep 1; mkdir -p /xcatpost; cd /xcatpost; wget -l inf -N -r --waitretry=10 --random-wait --retry-connrefused -t 0 -T 60 ftp://$ip/install/postscripts; mv $ip/install/postscripts/* .; chmod +x /xcatpost/*; /xcatpost/getpostscript.awk | sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /tmp/mypostscript; chmod +x /tmp/mypostscript"; if (&runcmd($getcmd) != 0) { print $::LOG_FILE "$::sdate xcatdsklspost: Could not get xcatpost.tar.gz.\n"; return 1; } return 0; } ##################################################### # # getAIXpostfile # Get the AIX post scripts from the server # ##################################################### sub getAIXpostfile { # get the name of my service node/NIM master from the /etc/niminfo file if (-f "/etc/niminfo") { my $cmd = "cat /etc/niminfo | grep 'NIM_NAME'"; &runcmd($cmd); my $hnline = $::outref; my $junk; ($junk, $::shorthost) = split(/=/, $hnline); $::shorthost =~ s/^\s*//; # delete leading white space chomp $::shorthost; $cmd = "cat /etc/niminfo | grep 'NIM_MASTER_HOSTNAME'"; &runcmd($cmd); my $SNline = $::outref; ($junk, $sn) = split(/=/, $SNline); $sn =~ s/^\s*//; # delete leading white space chomp $sn; } else { print $::LOG_FILE "$::sdate xcatdsklspost: Could not find /etc/niminfo file.\n"; return 1; } # use tftp to get the tar file my $getcmd="mkdir -p /xcatpost; cd /xcatpost; tftp -o xcatpost.tar.gz $sn /install/autoinst/xcatpost.tar.gz"; if (&runcmd($getcmd) != 0) { print $::LOG_FILE "$::sdate xcatdsklspost: Could not get xcatpost.tar.gz.\n"; return 1; } # unwrap the tar file my $uncmd = "cd /xcatpost; gunzip xcatpost.tar.gz; tar -xvf xcatpost.tar"; if (&runcmd($uncmd) != 0) { print $::LOG_FILE "$::sdate xcatdsklspost: Could not extract from /xcatpost/xcatpost.tar.gz.\n"; return 1; } return 0; } # # run the command # sub runcmd { my ($cmd) = @_; my $rc=0; $cmd .= ' 2>&1' ; $::outref = []; $::outref = `$cmd`; if ($?) { $rc = $? >> 8; if ($rc > 0) { print $::LOG_FILE "$::sdate xcatdsklspost: $::outref\n"; } } return $rc; }