--- loncom/apachereload 2005/07/07 22:26:52 1.2 +++ loncom/apachereload 2020/01/25 21:09:17 1.8 @@ -3,46 +3,102 @@ # # apachereload - setuid script that reloads the apache daemon. # +# $Id: apachereload,v 1.8 2020/01/25 21:09:17 raeburn Exp $ # -# $Id +# Copyright Michigan State University Board of Trustees # -# Change log: -# $Log: apachereload,v $ -# Revision 1.2 2005/07/07 22:26:52 albertel -# - suse has apache not httpd +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). # -# Revision 1.1 2003/09/30 10:06:48 foxr -# This is a setuid script that allows the www user to issue -# /etc/init.d/httpd reload +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. # -# This functionality is required by lond and lonc when they have been asked to -# reinitialize themselves. +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# Initial undebugged version. +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ # -### 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"; -my $dist=`$perlvar{'lonDaemons'}/distprobe`; -if ($dist =~ /^(suse|sles)/) { - $command = "/etc/init.d/httpd 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'); @@ -56,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); @@ -71,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 @@ -104,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.