add generic subroutine and functions for service management

This commit is contained in:
immarvin 2014-06-08 05:42:23 -07:00
parent 210239303c
commit b979de76b6
2 changed files with 665 additions and 2 deletions

View File

@ -16,7 +16,6 @@ if ($^O =~ /^aix/i) {
use lib "$::XCATROOT/lib/perl";
# do not put a use or require for xCAT::Table here. Add to each new routine
# needing it to avoid reprocessing of user tables ( ExtTab.pm) for each command call
#
use POSIX qw(ceil);
use File::Path;
use Socket;
@ -3426,10 +3425,11 @@ sub version_cmp {
string of the bin file name
Returns:
string of the full path name of the binary executable file
string of the bin file name in the argument if failed
Globals:
none
Error:
string of the bin file name in the argument
none
Example:
my $CHKCONFIG = xCAT::Utils->fullpathbin("chkconfig");
Comments:
@ -3517,4 +3517,463 @@ sub gettimezone
}
#--------------------------------------------------------------------------------
=head3 servicemap
returns the name of service unit(for systemd) or service daemon(for SYSVinit).
Arguments:
$svcname: the name of the service
$svcmgrtype: the service manager type:
0: SYSVinit
1: systemd
Returns:
the name of service unit or service daemon
undef on fail
Globals:
none
Error:
None
Example:
my $svc = xCAT::Utils->servicemap($svcname,1);
Comments:
none
=cut
#--------------------------------------------------------------------------------
sub servicemap{
my $svcname=shift;
if( $svcname =~ /xCAT::Utils/)
{
$svcname=shift;
}
my $svcmgrtype=shift;
#hash structure:
#"service name $svcname" =>{
#"service manager name(SYSVinit/systemd) $svcmgrtype"
#=> ["list of possible service file names for the specified $svcname under the specified $svcmgrtype "]
# }
my %svchash=(
"dhcp" => {
0=>["dhcpd","isc-dhcp-server"],
1=>["dhcpd.service"],
},
"nfs" => {
0=>["nfsserver","nfs","nfs-kernel-server"],
1=>["nfs-server.service"],
},
"named" => {
0=>["named","bind9"],
1=>["named.service"],
},
"syslog" => {
0=>["syslog","syslogd","rsyslog"],
1=>["rsyslog.service"],
},
"firewall" => {
0=>["iptables","firewalld","SuSEfirewall2_setup"],
1=>["firewalld.service"],
},
"http" => {
0=>["apache2","httpd"],
1=>["httpd.service"],
},
);
my $path=undef;
my $retdefault=$svcname;
if($svcmgrtype == 0){
$path="/etc/init.d/";
}elsif ($svcmgrtype == 1){
$path="/usr/lib/systemd/system/";
$retdefault=$svcname.".service";
}
my $ret=undef;
if($svchash{$svcname} and $svchash{$svcname}{$svcmgrtype}){
foreach my $file (@{$svchash{$svcname}{$svcmgrtype}}){
if(-e $path.$file ){
$ret=$file;
last;
}
}
}else{
if(-e $path.$retdefault){
$ret=$retdefault;
}
}
return $ret;
}
#--------------------------------------------------------------------------------
=head3 startservice
start a service
Arguments:
service name
Returns:
0 on success
nonzero otherwise
Globals:
none
Error:
none
Example:
xCAT::Utils->startservice("nfs");
Comments:
none
=cut
#--------------------------------------------------------------------------------
sub startservice{
my $svcname=shift;
if( $svcname =~ /xCAT::Utils/)
{
$svcname=shift;
}
my $cmd="";
my $svcunit=undef;
my $svcd=undef;
$svcunit=servicemap($svcname,1);
$svcd=servicemap($svcname,0);
if($svcunit)
{
$cmd="systemctl start $svcunit";
}
elsif( $svcd )
{
$cmd="service $svcd start";
}
print "$cmd\n";
if( $cmd eq "" )
{
return -1;
}
xCAT::Utils->runcmd($cmd, -1);
return $::RUNCMD_RC;
}
#--------------------------------------------------------------------------------
=head3 stopservice
stop a service
Arguments:
service name
Returns:
0 on success
nonzero otherwise
Globals:
none
Error:
none
Example:
xCAT::Utils->stopservice("nfs");
Comments:
none
=cut
#--------------------------------------------------------------------------------
sub stopservice{
my $svcname=shift;
if( $svcname =~ /xCAT::Utils/)
{
$svcname=shift;
}
my $cmd="";
my $svcunit=undef;
my $svcd=undef;
$svcunit=servicemap($svcname,1);
$svcd=servicemap($svcname,0);
if($svcunit)
{
$cmd="systemctl stop $svcunit";
}
elsif( $svcd )
{
$cmd="service $svcd stop";
}
print "$cmd\n";
if( $cmd eq "" )
{
return -1;
}
xCAT::Utils->runcmd($cmd, -1);
return $::RUNCMD_RC;
}
#--------------------------------------------------------------------------------
=head3 restartservice
restart a service
Arguments:
service name
Returns:
0 on success
nonzero otherwise
Globals:
none
Error:
none
Example:
xCAT::Utils->restartservice("nfs");
Comments:
none
=cut
#--------------------------------------------------------------------------------
sub restartservice{
my $svcname=shift;
if( $svcname =~ /xCAT::Utils/)
{
$svcname=shift;
}
my $cmd="";
my $svcunit=undef;
my $svcd=undef;
$svcunit=servicemap($svcname,1);
$svcd=servicemap($svcname,0);
if($svcunit)
{
$cmd="systemctl restart $svcunit";
}
elsif( $svcd )
{
$cmd="service $svcd restart";
}
print "$cmd\n";
if( $cmd eq "" )
{
return -1;
}
xCAT::Utils->runcmd($cmd, -1);
return $::RUNCMD_RC;
}
#--------------------------------------------------------------------------------
=head3 checkservicestatus
returns theservice status.
Arguments:
$svcname: the name of the service
$outputoption[optional]:
the output option
1: return a hashref with the keys:"retcode","retmsg"
otherwise: return retcode only
Returns:
undef on fail
a hashref if $outputoption is 1,the hash structure is:
{"retcode"=>(status code, 0 for running/active,1 for stopped/inactive,2 for failed)
"retmsg" =>(status string, running/active/stopped/inactive/failed)
}
the status code otherwise
Globals:
none
Error:
None
Example:
my $ret = xCAT::Utils-checkservicestatus($svcname,1);
my $retcode = xCAT::Utils-checkservicestatus($svcname);
Comments:
none
=cut
#--------------------------------------------------------------------------------
sub checkservicestatus{
my $svcname=shift;
if( $svcname =~ /xCAT::Utils/)
{
$svcname=shift;
}
my $outputoption=shift;
my $cmd="";
my $svcunit=undef;
my $svcd=undef;
my %ret;
$svcunit=servicemap($svcname,1);
$svcd=servicemap($svcname,0);
my $output=undef;
if($svcunit)
{
#for systemd, parse the output since it is formatted
$cmd="systemctl show --property=ActiveState $svcunit|awk -F '=' '{print \$2}'";
$output=xCAT::Utils->runcmd($cmd, -1);
if($output =~ /^active$/i){
$ret{retcode}=0;
print "xxx$output\n";
}elsif($output =~ /^failed$/i){
$ret{retcode}=2;
}elsif($output =~ /^inactive$/i){
$ret{retcode}=1;
}
}
elsif( $svcd )
{
#for SYSVinit, check the return value since the "service" command output is confused
$cmd="service $svcd status";
$output=xCAT::Utils->runcmd($cmd, -1);
$ret{retcode}=$::RUNCMD_RC;
# if($output =~ /stopped|not running/i){
# $ret{retcode}=1;
# }elsif($output =~ /running/i){
# $ret{retcode}=0;
# }
}
if($output)
{
$ret{retmsg}=$output;
}
if(defined $outputoption and $outputoption == 1 ){
return \%ret;
}elsif(exists $ret{retcode}){
return $ret{retcode};
}
return undef;
}
#--------------------------------------------------------------------------------
=head3 enableservice
enable a service to start it on the system bootup
Arguments:
service name
Returns:
0 on success
nonzero otherwise
Globals:
none
Error:
none
Example:
xCAT::Utils->enableservice("nfs");
Comments:
none
=cut
#--------------------------------------------------------------------------------
sub enableservice{
my $svcname=shift;
if( $svcname =~ /xCAT::Utils/)
{
$svcname=shift;
}
my $cmd="";
my $svcunit=undef;
my $svcd=undef;
$svcunit=servicemap($svcname,1);
$svcd=servicemap($svcname,0);
if($svcunit)
{
$cmd="systemctl enable $svcunit";
}
elsif( $svcd )
{
my $CHKCONFIG = xCAT::Utils->fullpathbin("chkconfig");
if($CHKCONFIG ne "chkconfig"){
$cmd="$CHKCONFIG $svcd on";
}else{
$CHKCONFIG = xCAT::Utils->fullpathbin("update-rc.d");
if($CHKCONFIG ne "update-rc.d"){
$cmd="$CHKCONFIG $svcd defaults";
}
}
}
print "$cmd\n";
if( $cmd eq "" )
{
return -1;
}
xCAT::Utils->runcmd($cmd, -1);
return $::RUNCMD_RC;
}
#--------------------------------------------------------------------------------
=head3 disableservice
disable a service to prevent it from starting on system bootup
Arguments:
service name
Returns:
0 on success
nonzero otherwise
Globals:
none
Error:
none
Example:
xCAT::Utils->disableservice("nfs");
Comments:
none
=cut
#--------------------------------------------------------------------------------
sub disableservice{
my $svcname=shift;
if( $svcname =~ /xCAT::Utils/)
{
$svcname=shift;
}
my $cmd="";
my $svcunit=undef;
my $svcd=undef;
$svcunit=servicemap($svcname,1);
$svcd=servicemap($svcname,0);
if($svcunit)
{
$cmd="systemctl disable $svcunit";
}
elsif( $svcd )
{
my $CHKCONFIG = xCAT::Utils->fullpathbin("chkconfig");
if($CHKCONFIG ne "chkconfig"){
$cmd="$CHKCONFIG $svcd off";
}else{
$CHKCONFIG = xCAT::Utils->fullpathbin("update-rc.d");
if($CHKCONFIG ne "update-rc.d"){
$cmd="$CHKCONFIG -f $svcd remove";
}
}
}
print "$cmd\n";
if( $cmd eq "" )
{
return -1;
}
xCAT::Utils->runcmd($cmd, -1);
return $::RUNCMD_RC;
}
1;

View File

@ -266,3 +266,207 @@ function v6calcnet(){
str_v6net=`echo $str_v6net | sed 's/.$//'`
echo "$str_v6net"
}
function servicemap {
local svcname=$1
local svcmgrtype=$2
local svclistname=
INIT_dhcp="dhcpd isc-dhcp-server";
SYSTEMD_dhcp="dhcpd.service";
INIT_nfs="nfsserver nfs nfs-kernel-server";
SYSTEMD_nfs="nfs-server.service";
INIT_named="named bind9";
SYSTEMD_named="named.service";
INIT_syslog="syslog syslogd rsyslog";
SYSTEMD_syslog="rsyslog.service";
INIT_firewall="iptables firewalld SuSEfirewall2_setup";
SYSTEMD_firewall="firewalld.service";
INIT_http="apache2 httpd";
SYSTEMD_http="httpd.service";
local path=
local retdefault=$svcname
local svcvar=${svcname//[-.]/_}
if [ "$svcmgrtype" = "0" ];then
svclistname=INIT_$svcvar
path="/etc/init.d/"
elif [ "$svcmgrtype" = "1" ];then
svclistname=SYSTEMD_$svcvar
retdefault=$svcname.service
path="/usr/lib/systemd/system/"
fi
local svclist=$(eval echo \$$svclistname)
if [ -z "$svclist" ];then
svclist="$retdefault"
fi
for name in `echo $svclist`
do
if [ -e "$path$name" ];then
echo $name
break
fi
done
}
function startservice {
local svcname=$1
local cmd=
local svcunit=`servicemap $svcname 1`
local svcd=`servicemap $svcname 0`
if [ -n "$svcunit" ];then
cmd="systemctl start $svcunit"
elif [ -n "$svcd" ];then
cmd="service $svcd start";
fi
if [ -z "$cmd" ];then
return 127
fi
eval $cmd
}
function stopservice {
local svcname=$1
local cmd=
local svcunit=`servicemap $svcname 1`
local svcd=`servicemap $svcname 0`
if [ -n "$svcunit" ];then
cmd="systemctl stop $svcunit"
elif [ -n "$svcd" ];then
cmd="service $svcd stop";
fi
if [ -z "$cmd" ];then
return 127
fi
eval $cmd
}
function restartservice {
local svcname=$1
local cmd=
local svcunit=`servicemap $svcname 1`
local svcd=`servicemap $svcname 0`
if [ -n "$svcunit" ];then
cmd="systemctl restart $svcunit"
elif [ -n "$svcd" ];then
cmd="service $svcd restart";
fi
if [ -z "$cmd" ];then
return 127
fi
eval $cmd
}
function checkservicestatus {
local svcname=$1
local svcunit=`servicemap $svcname 1`
local svcd=`servicemap $svcname 0`
local output=
local retcode=3
if [ -n "$svcunit" ];then
output=$(systemctl show --property=ActiveState $svcunit|awk -F '=' '{print $2}')
if echo $output|grep -E -i "^active$";then
retcode=0
elif echo $output|grep -E -i "^inactive$";then
retcode=1
elif echo $output|grep -E -i "^failed$";then
retcode=2
fi
elif [ -n "$svcd" ];then
output=$(service $svcd status)
retcode=$?
echo $output
# if echo $output|grep -E -i "(stopped|not running)";then
# retcode=1
# elif echo $output|grep -E -i "running";then
# retcode=0
# fi
else
retcode=127
fi
return $retcode
}
function enableservice {
local svcname=$1
local cmd=
local svcunit=`servicemap $svcname 1`
local svcd=`servicemap $svcname 0`
if [ -n "$svcunit" ];then
cmd="systemctl enable $svcunit"
elif [ -n "$svcd" ];then
command -v chkconfig >/dev/null 2>&1
if [ $? -eq 0 ];then
cmd="chkconfig $svcd on";
else
command -v update-rc.d >/dev/null 2>&1
if [ $? -eq 0 ];then
cmd="update-rc.d $svcd defaults"
fi
fi
fi
if [ -z "$cmd" ];then
return 127
fi
eval $cmd
}
function disableservice {
local svcname=$1
local cmd=
local svcunit=`servicemap $svcname 1`
local svcd=`servicemap $svcname 0`
if [ -n "$svcunit" ];then
cmd="systemctl disable $svcunit"
elif [ -n "$svcd" ];then
command -v chkconfig >/dev/null 2>&1
if [ $? -eq 0 ];then
cmd="chkconfig $svcd off";
else
command -v update-rc.d >/dev/null 2>&1
if [ $? -eq 0 ];then
cmd="update-rc.d -f $svcd remove"
fi
fi
fi
if [ -z "$cmd" ];then
return 127
fi
eval $cmd
}