From 65d882b9901f6b4346a610c05c6c68b847fc6bee Mon Sep 17 00:00:00 2001 From: immarvin Date: Wed, 24 May 2017 04:40:43 -0400 Subject: [PATCH] add cumulus discover script --- perl-xCAT/xCAT/GlobalDef.pm | 4 + perl-xCAT/xCAT/data/switchinfo.pm | 45 ++++++ xCAT-server/lib/xcat/plugins/nodediscover.pm | 26 +++- .../lib/xcat/plugins/switchdiscover.pm | 49 +----- xCAT/postscripts/configinterface | 5 + xCAT/postscripts/cumulusztp | 145 ++++++++++++++++-- xCAT/postscripts/documulusdiscovery | 132 ++++++++++++++++ xCAT/postscripts/enablesnmp | 5 + xCAT/postscripts/getmypostscript.cumulus | 58 +++++++ 9 files changed, 410 insertions(+), 59 deletions(-) create mode 100644 perl-xCAT/xCAT/data/switchinfo.pm create mode 100755 xCAT/postscripts/documulusdiscovery create mode 100755 xCAT/postscripts/getmypostscript.cumulus diff --git a/perl-xCAT/xCAT/GlobalDef.pm b/perl-xCAT/xCAT/GlobalDef.pm index b953a5168..b9b99ea20 100644 --- a/perl-xCAT/xCAT/GlobalDef.pm +++ b/perl-xCAT/xCAT/GlobalDef.pm @@ -51,7 +51,9 @@ $::STATUS_BOOTED = "booted"; $::STATUS_POWERING_ON = "powering-on"; $::STATUS_POWERING_OFF = "powering-off"; $::STATUS_DISCOVERING = "discovering"; +$::STATUS_DISCOVERED = "discovered"; $::STATUS_CONFIGURING = "configuring"; +$::STATUS_CONFIGURED = "configured"; $::STATUS_STANDING_BY = "standingby"; $::STATUS_SHELL = "shell"; $::STATUS_DEFINED = "defined"; @@ -69,7 +71,9 @@ $::STATUS_BMCREADY = "bmcready"; $::STATUS_POWERING_ON => 1, $::STATUS_POWERING_OFF => 1, $::STATUS_DISCOVERING => 1, + $::STATUS_DISCOVERED => 1, $::STATUS_CONFIGURING => 1, + $::STATUS_CONFIGURED => 1, $::STATUS_STANDING_BY => 1, $::STATUS_SHELL => 1, $::STATUS_DEFINED => 1, diff --git a/perl-xCAT/xCAT/data/switchinfo.pm b/perl-xCAT/xCAT/data/switchinfo.pm new file mode 100644 index 000000000..79c36abfa --- /dev/null +++ b/perl-xCAT/xCAT/data/switchinfo.pm @@ -0,0 +1,45 @@ +# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html + +#This module includes some glocal table to look up the switch type via mac and vendor + +package xCAT::data::switchinfo; + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(); +@EXPORT_OK = qw(global_mac_identity global_switch_type); + +use strict; + +#the hash to look up switch type with MAC +our %global_mac_identity = ( + "a8:97:dc" => "BNT G8052 switch", + "6c:ae:8b" => "BNT G8264-T switch", + "fc:cf:62" => "BNT G8124 switch", + "7c:fe:90" => "Mellanox IB switch", + "cc:37:ab" => "Edgecore Networks Switch", + "8c:ea:1b" => "Edgecore Networks Switch" +); + +#the hash to lookup switch type with vendor +our %global_switch_type = ( + Juniper => "Juniper", + juniper => "Juniper", + Cisco => "Cisco", + cisco => "Cisco", + BNT => "BNT", + Blade => "BNT", + G8052 => "BNT", + RackSwitch => "BNT", + Mellanox => "Mellanox", + mellanox => "Mellanox", + MLNX => "Mellanox", + MELLAN => "Mellanox", + Cumulus => "onie", + cumulus => "onie", + Edgecore => "onie" +); + + + +1; diff --git a/xCAT-server/lib/xcat/plugins/nodediscover.pm b/xCAT-server/lib/xcat/plugins/nodediscover.pm index d9b9ada43..7188d8cc2 100644 --- a/xCAT-server/lib/xcat/plugins/nodediscover.pm +++ b/xCAT-server/lib/xcat/plugins/nodediscover.pm @@ -4,10 +4,8 @@ package xCAT_plugin::nodediscover; use xCAT::Table; use IO::Socket; use strict; - use XML::Simple; $XML::Simple::PREFERRED_PARSER = 'XML::Parser'; -use Data::Dumper; use POSIX "WNOHANG"; use Storable qw(freeze thaw); use IO::Select; @@ -15,7 +13,7 @@ use IO::Handle; use xCAT::Utils; use Sys::Syslog; use Text::Balanced qw(extract_bracketed); - +use xCAT::data::switchinfo; use xCAT::DiscoveryUtils; @@ -175,6 +173,7 @@ sub process_request { } } + # save inventory info into the hwinv table if (defined($request->{cpucount}) or defined($request->{cputype}) or defined($request->{memory}) or defined($request->{disksize})) { my $basicdata; @@ -232,15 +231,32 @@ sub process_request { if ($rent and $rent->{'netboot'}) { $currboot = $rent->{'netboot'}; } + if ($request->{arch}->[0] =~ /x86/ and $currboot !~ /pxe/ and $currboot !~ /xnba/) { $nrtab->setNodeAttribs($node, { netboot => 'xnba' }); } elsif ($request->{arch}->[0] =~ /ppc/ and $request->{platform}->[0] =~ /PowerNV/) { $nrtab->setNodeAttribs($node, { netboot => 'petitboot' }); } elsif ($request->{arch}->[0] =~ /ppc/ and $currboot !~ /yaboot/) { $nrtab->setNodeAttribs($node, { netboot => 'yaboot' }); + } elsif($request->{arch}->[0] =~ /armv7l/ and $currboot !~ /onie/) { + #for onie switch, the netboot should be "onie" + $nrtab->setNodeAttribs($node, { netboot => 'onie' }); } } + if(defined $request->{nodetype} and $request->{nodetype}->[0] = 'switch' and $request->{_xcat_clientmac}->[0]){ + #for onie switch, lookup and set the switchtype via mac of mgt interface + my $switchestab = xCAT::Table->new('switches'); + if ($switchestab) { + my $switchtype=$xCAT::data::switchinfo::global_mac_identity{substr(lc($request->{_xcat_clientmac}->[0]),0,8)}; + if(defined $switchtype){ + $switchestab->setNodeAttribs($node,{ switchtype => $switchtype }); + } + $switchestab->close(); + } + } + + my $macstring = ""; if (defined($request->{mac})) { my $mactab = xCAT::Table->new("mac", -create => 1); @@ -252,9 +268,11 @@ sub process_request { my $forcenic = 0; #-1 is force skip, 0 is use default behavior, 1 is force to be declared even if hosttag is skipped to do so foreach (@{ $request->{mac} }) { @ifinfo = split /\|/; + if ($ifinfo[1] eq 'usb0') { #skip usb nic next; } + $bydriverindex{ $ifinfo[0] } += 1; if (scalar @discoverynics) { $forcenic = -1; #$forcenic defaults to explicitly skip nic @@ -295,7 +313,7 @@ sub process_request { push @hostnames_to_update, $hosttag; } } - print Dumper($hosttag) . "\n"; + #print Dumper($hosttag) . "\n"; if ($hosttag) { $usednames{$hosttag} = 1; unless ($usednames_for_net{$netn}) { diff --git a/xCAT-server/lib/xcat/plugins/switchdiscover.pm b/xCAT-server/lib/xcat/plugins/switchdiscover.pm index 168cf6ea8..70970480d 100644 --- a/xCAT-server/lib/xcat/plugins/switchdiscover.pm +++ b/xCAT-server/lib/xcat/plugins/switchdiscover.pm @@ -21,6 +21,7 @@ no strict; use Data::Dumper; use Socket; use Expect; +use xCAT::data::switchinfo; #global variables for this module my $community; @@ -33,42 +34,6 @@ my %global_scan_type = ( snmp => "snmp_scan" ); -my %global_mac_identity = ( - "a8:97:dc" => "BNT G8052 switch", - "6c:ae:8b" => "BNT G8264-T switch", - "fc:cf:62" => "BNT G8124 switch", - "7c:fe:90" => "Mellanox switch", - "e4:1d:2d" => "Mellanox switch", - "24:8a:07" => "Mellanox switch", - "00:25:8b" => "Mellanox switch", - "00:02:c9" => "Mellanox switch", - "f4:52:14" => "Mellanox switch", - "ec:0d:9a" => "Mellanox switch", - "cc:37:ab" => "Edgecore Networks Switch", - "a8:2b:b5" => "Edgecore Networks Switch", - "70:72:cf" => "Edgecore Networks Switch", - "8c:ea:1b" => "Edgecore Networks Switch" -); - -my %global_switch_type = ( - Juniper => "Juniper", - juniper => "Juniper", - Cisco => "Cisco", - cisco => "Cisco", - BNT => "BNT", - Blade => "BNT", - G8052 => "BNT", - RackSwitch => "BNT", - Mellanox => "Mellanox", - mellanox => "Mellanox", - MLNX => "Mellanox", - MELLAN => "Mellanox", - Cumulus => "onie", - cumulus => "onie", - Edgecore => "onie" -); - - #------------------------------------------------------------------------------- =head1 xCAT_plugin:switchdiscover @@ -748,16 +713,16 @@ sub nmap_scan { } my $vendor = $addr->{vendor}; if ($vendor) { - my $search_string = join '|', keys(%global_switch_type); + my $search_string = join '|', keys(%xCAT::data::switchinfo::global_switch_type); if ($vendor =~ /($search_string)/) { $found = 1; } } if ( ($found == 0) && ($type eq "mac") ) { - my $search_string = join '|', keys(%global_mac_identity); + my $search_string = join '|', keys(%xCAT::data::switchinfo::global_mac_identity); if ($mac =~ /($search_string)/i) { my $key = $1; - $vendor = $global_mac_identity{lc $key}; + $vendor = $xCAT::data::switchinfo::global_mac_identity{lc $key}; $found = 1; } @@ -851,7 +816,7 @@ sub nmap_osguess { last; } } - my $search_string = join '|', keys(%global_switch_type); + my $search_string = join '|', keys(%xCAT::data::switchinfo::global_switch_type); if ($line =~ /Running/) { if ($line =~ /($search_string)/){ $vendor = $1; @@ -1180,10 +1145,10 @@ sub get_switchtype { my $vendor = shift; my $key = "Not support"; - my $search_string = join '|', keys(%global_switch_type); + my $search_string = join '|', keys(%xCAT::data::switchinfo::global_switch_type); if ($vendor =~ /($search_string)/) { $key = $1; - return $global_switch_type{$key}; + return $xCAT::data::switchinfo::global_switch_type{$key}; } else { return $key; } diff --git a/xCAT/postscripts/configinterface b/xCAT/postscripts/configinterface index 40deeb269..53d9c720a 100755 --- a/xCAT/postscripts/configinterface +++ b/xCAT/postscripts/configinterface @@ -9,6 +9,11 @@ fi xcat_intf="/etc/network/interfaces.d/xCAT.intf" +if [ -f $xcat_intf ] && grep -w '#This is sample interface file provided by xCAT' $xcat_intf ; then + echo "The switch data ports and default brige have been configured. Do nothing..." + exit 0 +fi + echo "#This is sample interface file provided by xCAT" > $xcat_intf echo "# bridge-vlan-aware: set to yes to indicate that the bridge is VLAN-aware. " >> $xcat_intf echo "# bridge-access: declares the access port. " >> $xcat_intf diff --git a/xCAT/postscripts/cumulusztp b/xCAT/postscripts/cumulusztp index 311cdfdf1..d1403edeb 100755 --- a/xCAT/postscripts/cumulusztp +++ b/xCAT/postscripts/cumulusztp @@ -1,4 +1,7 @@ #!/bin/bash +#this script will be invoked by ZTP(zero touch provision) process in the onie switch +#this script finish the discovery and configuration after the switch is pluged in the cluster and powered on + function error() { echo -e "\e[0;33mERROR: The Zero Touch Provisioning script failed while running the command $BASH_COMMAND at line $BASH_LINENO.\e[0m" >&2 exit 1 @@ -7,28 +10,144 @@ function error() { # Log all output from this script exec >/var/log/autoprovision 2>&1 -trap error ERR +#trap error ERR #Add Debian Repositories -echo "deb http://http.us.debian.org/debian jessie main" >> /etc/apt/sources.list -echo "deb http://security.debian.org/ jessie/updates main" >> /etc/apt/sources.list +#since in most cases, the switch has no internet access, skip this step +#echo "deb http://http.us.debian.org/debian jessie main" >> /etc/apt/sources.list +#echo "deb http://security.debian.org/ jessie/updates main" >> /etc/apt/sources.list #get ip address for server node server_ip=`grep cumulus-provision-url /var/lib/dhcp/dhclient.eth0.leases | tail -1 | awk -F/ '{print $3}'` - + +#download /install/postscripts from MN +max_retries=5 +retry=0 +rc=1 # this is a fail return +downloaded=0 +while [ 0 -eq 0 ]; do + + if [ -e "/xcatpost" ]; then + rm -rf "/xcatpost" + fi + + export LANG=C; wget -l inf -nH -N -r --waitretry=10 --random-wait -e robots=off -T 60 -nH --cut-dirs=2 --reject "index.html*" --no-parent http://$server_ip/install/postscripts/ -P /xcatpost 2> /tmp/wget.log + rc=$? + if [ $rc -eq 0 ]; then + # return from wget was 0 but some OS do not return errors, so we + # have additional checks for + # failed: Connection httpd not running + # 404: Not Found - if directory does not exist + grep -i -E "... failed: Connection refused.$" /tmp/wget.log + rc1=$? + grep -i -E "ERROR 404: Not Found.$" /tmp/wget.log + rc2=$? + # check to see no errors at all, grep returns 1 + if [ $rc1 -eq 1 ] && [ $rc2 -eq 1 ]; then + logger -s -t "xcat.cumulusztp" -p local4.info "download_postscripts return successfully " + downloaded=1 + break + fi + fi + + retry=$(($retry+1)) + logger -s -t "xcat.cumulusztp" -p local4.info "download_postscripts retry $retry" + if [ $retry -eq $max_retries ]; then + + break + fi + + SLI=$(awk 'BEGIN{srand(); printf("%d\n",rand()*20)}') + sleep $SLI +done + +if [ "$downloaded" = "0" ];then + logger -s -t "xcat.cumulusztp" -p local4.err "download_postscripts failed" + ztp -R + exit 1 +fi + +chmod -R +x `find /xcatpost/ -maxdepth 1 -print | grep -E -v '^(/xcatpost/|/xcatpost/_xcat|/xcatpost/_ssh|/xcatpost/ca|/xcatpost/hostkeys)$'` + +cd /xcatpost +rc=0 + +./documulusdiscovery +rc=$? +if [ "$rc" != "0" ];then + ztp -R + exit 1 +fi + +logger -s -t "xcat.cumulusztp" -p local4.info "switch discovered!" + +#restart mgt interface to apply the specified IP address +ifdown eth0;ifup eth0 + +retry=0 +while true; do + #check whether the network access between MN/CN and the node is ready + ping $server_ip -c 1 >/dev/null && break + retry=$[ $retry + 1 ] + if [ $retry -eq 90 ];then + #timeout, complain and exit + logger -s -t "xcat.cumulusztp" -p local4.err " the network between the node and $server_ip is not ready, please check[retry=$retry]..." "/var/log/xcat/xcat.log" + ztp -R + exit 1 + fi + + #sleep sometime before the next scan + sleep 2 +done + #push root ssh keys, config passwordless -echo "CumulusLinux!" | sudo -S mkdir -p /root/.ssh -echo "CumulusLinux!" | sudo -S /usr/bin/wget -O /root/.ssh/authorized_keys http://$server_ip/install/postscripts/_ssh/authorized_keys - +mkdir -p /root/.ssh +mv _ssh/authorized_keys /root/.ssh/authorized_keys + #enable and config snmpd -echo "CumulusLinux!" | sudo -S /usr/bin/wget -O /home/cumulus/enablesnmp http://$server_ip/install/postscripts/enablesnmp -sudo chmod +x /home/cumulus/enablesnmp -sudo /home/cumulus/enablesnmp +./enablesnmp +rc=$? +if [ "$rc" != "0" ];then + logger -s -t "xcat.cumulusztp" -p local4.err "enablesnmp: failed to enable SNMP" + echo "enablesnmp: failed to enable SNMP" +else + logger -s -t "xcat.cumulusztp" -p local4.info "SNMP enabled!" +fi #config base interface -echo "CumulusLinux!" | sudo -S /usr/bin/wget -O /home/cumulus/configinterface http://$server_ip/install/postscripts/configinterface -sudo chmod +x /home/cumulus/configinterface -sudo /home/cumulus/configinterface +./configinterface +rc=$? +if [ "$rc" != "0" ];then + echo "configinterface: failed to config switch data ports" +else + logger -s -t "xcat.cumulusztp" -p local4.info "data ports enabled!" +fi + +#obtain myposctscript from MN +./getmypostscript.cumulus $server_ip:3001 +rc=$? +if [ "$rc" != "0" ]; then + logger -s -t "xcat.cumulusztp" -p local4.info "failed to get mypostscript" + echo "failed to get mypostscript" + ztp -R + exit 1 +fi + +#config static ip address for mgt interface +echo './confignics -s' >> ./mypostscript +chmod +x ./mypostscript +./mypostscript +rc=$? +if [ "$rc" != "0" ]; then + logger -s -t "xcat.cumulusztp" -p local4.info "failed to set static ip address for mgt interface" + echo "failed to set static ip address for mgt interface" + ztp -R + exit 1 +fi + + +#report status +echo "installstatus configured" | socat STDIN TCP:$server_ip:3002,sourceport=301,reuseaddr,retry=5 # CUMULUS-AUTOPROVISIONING exit 0 diff --git a/xCAT/postscripts/documulusdiscovery b/xCAT/postscripts/documulusdiscovery new file mode 100755 index 000000000..a6f8bae60 --- /dev/null +++ b/xCAT/postscripts/documulusdiscovery @@ -0,0 +1,132 @@ +#!/bin/bash +#this script grabs the switch information, then composes a "findme" request and sends it to MN +#so that the switch can be discovered + +# TODO: Figure out the master based on the DHCP packet +XCATMASTER=$(cat /var/lib/dhcp/dhclient.eth0.leases |grep cumulus-provision-url|tail -1|awk -F/ '{print $3}') +XCATPORT=3001 +log_label="xcat.documulusdiscovery" + +#helper script for socat, write the received message to /tmp/helper.socat.sh +cat > /tmp/helper.socat.sh << 'EOF' +read strin +echo $strin > /tmp/result.socat.out +EOF + +[ -f "/tmp/helper.socat.sh" ] && chmod 777 /tmp/helper.socat.sh + +#listen to the 3001 port for any response from xcatd on MN +#the message in the response will be written to /tmp/result.socat.out +socat TCP4-LISTEN:3001,reuseaddr EXEC:"/tmp/helper.socat.sh" & + +#generate key pairs for the SSL connection between switch and xcatd on MN +mkdir -p /etc/xcat +mkdir -p /etc/pki/tls + +if [ ! -f /etc/xcat/privkey.pem ]; then +echo "[ req ] +distinguished_name = nodedn + +[ nodedn ]" > /etc/pki/tls/openssl.cnf + logger -s -t $log_label -p local4.info "Generating private key..." + openssl genrsa -out /etc/xcat/privkey.pem 1024 >& /dev/null + logger -s -t $log_label -p local4.info "Done" +fi + +PUBKEY=`openssl rsa -in /etc/xcat/privkey.pem -pubout 2> /dev/null|grep -v "PUBLIC KEY"` +PUBKEY=`echo $PUBKEY|sed -e 's/ //g'` +export PUBKEY + +logger -s -t $log_label -p local4.info "Beginning switch discovery process..." + +#grab the switch information +dmidweinfo=$(/usr/sbin/dmidecode 2>/dev/null) +PRODUCTNAME=$(echo "$dmidweinfo"|grep "Product Name"|cut -d: -f2|sed -e 's/^\s*//' -e 's/\s*$//') +MTM=$PRODUCTNAME +ARCH=$(uname -m) +SERIAL=$(echo "$dmidweinfo"|grep "Serial Number"|cut -d: -f2|sed -e 's/^\s*//' -e 's/\s*$//') + +#compose the findme request +echo '' > /tmp/discopacket +echo "findme" >> /tmp/discopacket +echo "1" >> /tmp/discopacket +echo "switch" >> /tmp/discopacket +echo "$ARCH" >> /tmp/discopacket +#echo "$MTM" >> /tmp/discopacket +echo "$MTM" >> /tmp/discopacket +echo "$SERIAL" >> /tmp/discopacket + +MAC_OF_FIRST_UP_NIC=$(ip addr show eth0|grep "link/ether"|awk -F' ' '{print $2}') +MAC=$MAC_OF_FIRST_UP_NIC +ADDRESS=$(ip address show dev eth0|grep "inet "|grep global|awk '{print $2}') +DRIVER=$(grep DRIVER /sys/class/net/eth0/device/uevent|awk -F= '{print $2}') +echo "$DRIVER|eth0|$MAC|$ADDRESS" >> /tmp/discopacket + +UUID=`echo $MTM-$SERIAL-$MAC_OF_FIRST_UP_NIC| tr /A-Z/ /a-z/` +echo "$UUID" >> /tmp/discopacket + +echo "$PUBKEY" >> /tmp/discopacket +echo "" >> /tmp/discopacket +echo "" >> /tmp/discopacket +echo "" >> /tmp/discopacket +openssl dgst -sha512 -out /tmp/discopacket.sha512 -sign /etc/xcat/privkey.pem /tmp/discopacket +openssl enc -e -a -in /tmp/discopacket.sha512 > /tmp/discopacket.b64sig +cat /tmp/discopacket |while read line; do + if [ "$line" = "" ]; then + cat /tmp/discopacket.b64sig >> /tmp/discopacket.new + fi + echo $line >> /tmp/discopacket.new +done +mv /tmp/discopacket.new /tmp/discopacket +logger -s -t $log_label -p local4.info "Discovery packet file is ready." +rm -f /tmp/discopacket.gz +gzip -9 /tmp/discopacket + + + +if [ -z "$XCATMASTER" ] || [ -z "$XCATPORT" ]; then + logger -s -t $log_label -p local4.err "Failed to get xcatd connection information, exit..." + rm -rf /tmp/result.socat.out + rm -rf /tmp/helper.socat.sh + exit 1 +fi + + +#send the find me request ot xcatd on MN +MAX_RETRY=10 +RETRY=0 +DISCOVERED=0 + +while [ $RETRY -lt $MAX_RETRY ]; do + logger -s -t $log_label -p local4.info "Sending the discovery packet to xCAT ($XCATMASTER:$XCATPORT) [ RETRY= $RETRY ] ..." + (cat /tmp/discopacket.gz | socat STDIN UDP:$XCATMASTER:$XCATPORT,sourceport=301 ) & + + WAITRETRY=0 + while [ $WAITRETRY -lt 100 ]; do + if [ -f "/tmp/result.socat.out" ] && grep "restart" /tmp/result.socat.out; then + DISCOVERED=1 + break; + fi + sleep 1 + ((WAITRETRY=WAITRETRY+1)) + done + + if [ "$DISCOVERED" = "1" ]; then + break + fi + + sleep 2 + ((RETRY=RETRY+1)) +done + +rm -rf /tmp/result.socat.out +rm -rf /tmp/helper.socat.sh + +if [ "$DISCOVERED" = "0" ] ; then + logger -s -t $log_label -p local4.info "Failed to discover me, exit..." + exit 1 +elif [ "$DISCOVERED" = "1" ]; then + echo "installstatus discovered" | socat STDIN TCP:$XCATMASTER:3002,sourceport=301,reuseaddr,retry=5 +fi + +exit 0 diff --git a/xCAT/postscripts/enablesnmp b/xCAT/postscripts/enablesnmp index 2d4f2fd96..6f5661346 100755 --- a/xCAT/postscripts/enablesnmp +++ b/xCAT/postscripts/enablesnmp @@ -6,7 +6,12 @@ if ! cat /etc/os-release |grep -i '^NAME=[ "]*Cumulus Linux[ "]*$' >/dev/null 2 echo "This script is only supported on Cumulus OS in ONIE switch" exit 2 fi + snmp_conf="/etc/snmp/snmpd.conf" +if [ -f "$snmp_conf" ] && grep -w '#xCAT customized snmpd configuration' $snmp_conf;then + echo "The snmp has already been configured. Do nothing..." + exit 0 +fi [ -f "$snmp_conf" ] || exit -1 diff --git a/xCAT/postscripts/getmypostscript.cumulus b/xCAT/postscripts/getmypostscript.cumulus new file mode 100755 index 000000000..54a54d1d0 --- /dev/null +++ b/xCAT/postscripts/getmypostscript.cumulus @@ -0,0 +1,58 @@ +#!/bin/bash +#this script send getpostscript request to xcatd on MN and generate /xcatpost/mypostscript +#which includes the glocal environment variables to run postscripts + +if [ -z "$XCATDEST" ]; then + XCATDEST=$1 +fi + +#compose getpostscript request +echo " +getpostscript +" > /tmp/req.xml + + + +if [ -f /tmp/resp.xml ]; then + #remove any existing response file + rm /tmp/resp.xml; +fi + + +#communicate with xcatd on MN with getpostscript request +#the response will be saved in /tmp/resp.xml +while [ ! -f /tmp/resp.xml ] || grep error /tmp/resp.xml; do + if [ -f /tmp/resp.xml ]; then + timer=60 + while [ $timer -gt 0 ]; do + echo -en "Retrying in $timer seconds \r" >&2 + sleep 1 + timer=$(($timer-1)); + done + fi + #echo " " >&2 + if [ -f /etc/xcat/cert.pem -a -f /etc/xcat/certkey.pem ]; then #use client cert if available + cat /tmp/req.xml | /usr/bin/openssl s_client -key /etc/xcat/certkey.pem -cert /etc/xcat/cert.pem -connect $XCATDEST -quiet 2> /dev/null > /tmp/resp.xml + else + cat /tmp/req.xml | /usr/bin/openssl s_client -connect $XCATDEST -quiet 2>/dev/null > /tmp/resp.xml + fi +done + +if [ -f /tmp/resp.xml ] && grep '' /tmp/resp.xml >/dev/null 2>&1 ;then + echo "Success to obtain mypostscript!" +else + echo "Failed to obtain mypostscript!" + exit 1 +fi + +#parse the script from the xml-formated resposne +cat /tmp/resp.xml | egrep '' | sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' | sed -e 's/<//g' -e 's/&/\&/g' -e 's/"/"/g' -e "s/'/'/g" > /xcatpost/mypostscript + +#the script specified in the "postscripts" and "postbootscripts" are currently not supported +#will be supported if there is requrement on this +sed -i -e "/# postscripts-start-here/,$ d" /xcatpost/mypostscript + +rm -f /tmp/req.xml +rm -f /tmp/resp.xml +exit 0 +