--- loncom/apachereload 2006/01/28 00:52:27 1.6 +++ loncom/apachereload 2020/05/09 16:40:32 1.9 @@ -3,7 +3,7 @@ # # apachereload - setuid script that reloads the apache daemon. # -# $Id: apachereload,v 1.6 2006/01/28 00:52:27 albertel Exp $ +# $Id: apachereload,v 1.9 2020/05/09 16:40:32 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,29 +32,73 @@ use strict; # # This script is a setuid script that must be run as user www -# it effectively just executes /etc/init.d/httpd reload. -# causing the apache daemon to get HUP'd. The script is -# run by lond after re-initing it's host information. +# it effectively just executes one of the following five commands: +# /etc/init.d/httpd reload +# /etc/init.d/apache reload +# /etc/init.d/apache2 reload +# /bin/systemctl reload httpd.service +# /bin/systemctl reload apache2.service +# (depending on Linux distro) causing the apache daemon to get HUP'd. +# The script is run by lond after re-initing its host information. $ENV{'PATH'}='/bin:/usr/bin:/usr/local/sbin:/home/httpd/perl'; # Nullify path # information delete @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # nullify potential taints -my $command = "/etc/init.d/httpd reload"; - -use lib '/home/httpd/lib/perl/'; -use LONCAPA::Configuration; -my %perlvar= %{&LONCAPA::Configuration::read_conf('loncapa.conf')}; - -my ($execdir) = ($perlvar{'lonDaemons'} =~/(.*)/); -my $dist=`$execdir/distprobe`; -if ($dist =~ /^(suse|sles)/) { - $command = "/etc/init.d/apache reload"; +my $command; +my $checker_bin = '/sbin/chkconfig'; +my $sysctl_bin = '/bin/systemctl'; +my $sysv_bin = '/usr/sbin/sysv-rc-conf'; + +if (-x $sysctl_bin) { + if (open(PIPE,"$sysctl_bin list-unit-files --type=service 2>/dev/null |")) { + my @lines = ; + chomp(@lines); + close(PIPE); + if (grep(/^httpd\.service/,@lines)) { + $command = '/bin/systemctl reload httpd.service'; + } elsif (grep(/^apache2\.service/,@lines)) { + $command = '/bin/systemctl reload apache2.service'; + } + } +} +if (($command eq '') && (-x $checker_bin)) { + if (open(PIPE,"$checker_bin --list 2>/dev/null |")) { + my @lines = ; + chomp(@lines); + close(PIPE); + if (grep(/^httpd/,@lines)) { + $command = '/etc/init.d/httpd reload'; + } elsif (grep(/^apache2/,@lines)) { + $command = '/etc/init.d/apache2 reload'; + } elsif (grep(/^apache\s+/,@lines)) { + $command = '/etc/init.d/apache reload'; + } + } +} +if (($command eq '') && (-x $sysv_bin)) { + if (open(PIPE,"$checker_bin --list 2>/dev/null |")) { + my @lines = ; + chomp(@lines); + close(PIPE); + if (grep(/^apache2/,@lines)) { + $command = '/etc/init.d/apache2 reload'; + } elsif (grep(/^apache\s+/,@lines)) { + $command = '/etc/init.d/apache reload'; + } + } } + # Do not print error messages my $noprint=1; -print "In apachereload" unless $noprint; +if ($command eq '') { + print("Could not determine command to reload Apache.\n") + unless $noprint; + exit 1; +} else { + print "In apachereload" unless $noprint; +} # ----------------------------- Make sure this process is running from user=www my $wwwid=getpwnam('www'); @@ -68,14 +112,6 @@ if ($wwwid!=$>) { # ----------------------------------- Start running script with www permissions &disable_root_capability; -# --------------------------- Handle case of another apachereload process (locking) -unless (&try_to_lock('/tmp/lock_apachereload')) { - print "Error. Too many other simultaneous password change requests being ". - "made.\n" unless $noprint; - exit 4; -} - - &enable_root_capability; ($>,$<)=(0,0); @@ -83,14 +119,9 @@ unless (&try_to_lock('/tmp/lock_apachere # Now run the reload: # -system($command); - -# Remove the lock file. - - +system("$command > /dev/null 2>&1"); &disable_root_capability; -unlink('/tmp/lock_apachereload'); exit 0; # ---------------------------------------------- have setuid script run as root @@ -116,44 +147,6 @@ sub disable_root_capability { } } -# ----------------------- make sure that another apachereload process isn't running -sub try_to_lock { - my ($lockfile)=@_; - my $currentpid; - my $lastpid; - # Do not manipulate lock file as root - if ($>==0) { - return 0; - } - # Try to generate lock file. - # Wait 3 seconds. If same process id is in - # lock file, then assume lock file is stale, and - # go ahead. If process id's fluctuate, try - # for a maximum of 10 times. - for (0..10) { - if (-e $lockfile) { - open(LOCK,"<$lockfile"); - $currentpid=; - close LOCK; - if ($currentpid==$lastpid) { - last; - } - sleep 3; - $lastpid=$currentpid; - } - else { - last; - } - if ($_==10) { - return 0; - } - } - open(LOCK,">$lockfile"); - print LOCK $$; - close LOCK; - return 1; -} - =head1 NAME apachereload -setuid script to reload the apache web server.