Annotation of loncom/build/CHECKRPMS, revision 1.9
1.1 raeburn 1: #!/usr/bin/perl -w
2: #
3: # The LearningOnline Network with CAPA
4: # Checks status of RPM packages on system.
5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: #
26: # http://www.lon-capa.org/
27: #
28:
29: =pod
30:
31: =head1 NAME
32:
33: B<CHECKRPMS> - automated status report about RPMs on a system.
34:
35: =head1 DESCRIPTION
36:
37: This file automates the process of checking for available updates
38: to LON-CAPA systems. distprobe is used to determine the Linux distribution.
39:
40: The utility which is used to complete the check depends on the distro:
41:
1.8 raeburn 42: fedora, rhel 5/5+, centos, scientific - yum
1.1 raeburn 43: suse 9.X and sles9 - you
1.9 ! raeburn 44: suse 10.2,10.3 - zypper
! 45: sles10,suse10.1 - rug
1.1 raeburn 46: rhel 4 - up2date
47: others - check-rpms
48:
49: Created by amalgamating previous distribution-specific CHECKRPMS.dist files (where dist was one of: fedora, rhel, suse, sles10, default).
50:
51: Must be run as root or www.
52:
53: =cut
54:
55: use strict;
56: use lib '/home/httpd/lib/perl/';
57: use LONCAPA::Configuration;
58:
59: my $tmpfile = '/tmp/CHECKRPMS.'.$$;
60: my $perlvar= LONCAPA::Configuration::read_conf('loncapa.conf');
61:
62: # Determine who we email
63: my $emailto = "$perlvar->{'lonAdmEMail'}";
64: my $subj = $perlvar->{'lonHostID'};
65:
66: # Get Linux distro
67: open(PIPE, "$perlvar->{'lonDaemons'}/distprobe |");
68: my $distro = <PIPE>;
69: close(PIPE);
70:
71: undef($perlvar);
72:
73: my $hostname = `hostname`;
74: chomp($hostname);
75: open(TMPFILE,">$tmpfile");
76: print TMPFILE localtime(time).' '.$hostname."\n";
77: close(TMPFILE);
78:
79: my ($cmd,$send,$addsubj);
80: if ($distro =~ /^fedora\d+$/) {
81: $cmd = 'yum update';
82: &prepare_msg($tmpfile,$cmd);
83: ($send,$addsubj) = &check_with_yum($tmpfile);
1.6 albertel 84: } elsif ($distro =~ /^(suse|sles)9\.?\d?$/) {
1.1 raeburn 85: $cmd = 'you';
86: &prepare_msg($tmpfile,$cmd);
87: ($send,$addsubj) = &check_with_you($tmpfile);
1.9 ! raeburn 88: } elsif ($distro =~ /^suse10\.(\d)$/) {
! 89: my $version =$1;
! 90: if ($version > 1) {
! 91: $cmd = 'zypper up';
! 92: &prepare_msg($tmpfile,$cmd);
! 93: ($send,$addsubj) = &check_with_zypper($tmpfile);
! 94: } else {
! 95: $cmd = 'rug up';
! 96: &prepare_msg($tmpfile,$cmd);
! 97: ($send,$addsubj) = &check_with_rug($tmpfile);
! 98: }
! 99: } elsif ($distro =~ /^sles10$/) {
1.1 raeburn 100: $cmd = 'rug up';
101: &prepare_msg($tmpfile,$cmd);
102: ($send,$addsubj) = &check_with_rug($tmpfile);
1.7 raeburn 103: } elsif ($distro =~ /^rhes(\d+)$/) {
104: my $version = $1;
105: if ($version == 4) {
106: $cmd ='up2date -u --nox';
107: &prepare_msg($tmpfile,$cmd);
108: ($send,$addsubj) = &check_with_up2date($tmpfile);
109: } elsif ($version > 4) {
110: $cmd = 'yum update';
111: &prepare_msg($tmpfile,$cmd);
112: ($send,$addsubj) = &check_with_yum($tmpfile);
113: }
1.8 raeburn 114: } elsif ($distro =~ /^centos\d+$/) {
115: $cmd = 'yum update';
116: &prepare_msg($tmpfile,$cmd);
117: ($send,$addsubj) = &check_with_yum($tmpfile);
118: } elsif ($distro =~ /^scientific\d+\.\d$/) {
119: $cmd = 'yum update';
120: &prepare_msg($tmpfile,$cmd);
121: ($send,$addsubj) = &check_with_yum($tmpfile);
1.1 raeburn 122: } else {
123: $cmd = '/usr/local/bin/check-rpms --update';
124: ($send,$addsubj) = &check_with_checkrpms($tmpfile);
125: }
126: if ($send) {
127: $subj .= $addsubj;
128: system(qq{mail -s '$subj' $emailto < $tmpfile});
129: }
130:
131: sub prepare_msg {
132: my ($tmpfile,$cmd) = @_;
133: #
134: # Put some nice text in $tmpfile
135: open(TMPFILE,">>$tmpfile");
136: print TMPFILE <<ENDHEADER;
137: Your system needs to be updated. Please execute (as root)
138:
139: $cmd
140:
141: to bring it up to date.
142:
1.5 raeburn 143: This is very important for the security of your server. The packages which need to be updated are listed below.
1.1 raeburn 144:
145: ENDHEADER
146: close(TMPFILE);
147: return;
148: }
149:
150: sub check_with_you {
151: my ($tmpfile) =@_;
152: my $you = '/usr/bin/online_update';
153: my $sendflag = 0;
154: my $append_to_subj;
155:
1.5 raeburn 156: if (open (PIPE, "$you -k -len 2>&1 |")) {
1.1 raeburn 157: my $output=<PIPE>;
158: close(PIPE);
159: chomp $output;
160: unless ($output eq 'No updates available.') {
1.5 raeburn 161: if (open (PIPE, "$you -s -d -len |grep ^INSTALL |")) {
162: my @updates = <PIPE>;
163: close(PIPE);
164: my $allpackages;
165: foreach my $line (@updates) {
166: my $package = substr($line,rindex($line,'/')+1);
167: if ($package ne '') {
168: $allpackages .= $package;
169: }
170: }
171: if ($allpackages ne '') {
172: open(TMPFILE,">>$tmpfile");
173: print TMPFILE $allpackages;
174: close(TMPFILE);
175: $sendflag = 1;
176: $append_to_subj = ' RPMS to upgrade';
177: }
178: } else {
179: $sendflag = 1;
180: $append_to_subj = ' Error running RPM update script';
181: }
1.1 raeburn 182: }
183: } else {
184: $sendflag = 1;
185: $append_to_subj = ' Error running RPM update script';
186: }
187: return ($sendflag,$append_to_subj);
188: }
189:
190: sub check_with_yum {
191: my ($tmpfile) = @_;
192: my $yum = '/usr/bin/yum';
193: my $sendflag = 0;
194: my $append_to_subj;
195:
196: #
197: # Execute yum command
198: my $command = $yum.' check-update '.'>>'.$tmpfile;
199: system($command);
200:
201: my $returnvalue = $?>>8;
202:
203: #
204: # Determine status of yum run
205: if (100 == $returnvalue) {
206: $sendflag = 1;
207: $append_to_subj = ' RPMS to upgrade';
208: } elsif (0 != $returnvalue) {
209: $sendflag = 1;
210: $append_to_subj = ' Error running RPM update script';
211: } else {
212: # yum returned 0, so everything is up to date.
213: }
214: return ($sendflag,$append_to_subj);
215: }
216:
217: sub check_with_up2date {
218: my ($tmpfile) = @_;
219: my $up2date = '/usr/bin/up2date-nox';
220: my $sendflag = 0;
221: my $append_to_subj;
222: #
223: # Execute online_update command to check for updates
224: my $up2date_error = 1;
225: if (open (PIPE, "$up2date -l 2>&1 |")) {
226: my @result=<PIPE>;
227: close(PIPE);
1.4 raeburn 228: my $output;
229: foreach my $line (@result) {
230: if ($line =~ /^The following Packages were marked to be skipped by your configuration:/) {
231: last;
232: } else {
233: $output .= $line;
234: }
235: }
1.1 raeburn 236: if (@result > 0) {
237: if ($output =~ /Fetching Obsoletes list/) {
238: $up2date_error = 0;
239: if ($output =~ /Name\s+Version\s+Rel\s+[\n\r\f]+\-+[\n\r\f]+(.+)/s) {
240: my $packagelist = $1;
1.4 raeburn 241: if ($packagelist ne '' && $packagelist !~ /^[\s\n\r\f]+$/) {
1.1 raeburn 242: open(TMPFILE,">>$tmpfile");
243: print TMPFILE $packagelist;
244: close(TMPFILE);
245: $append_to_subj = ' RPMS to upgrade';
246: $sendflag = 1;
247: }
248: }
249: }
250: }
251: }
252: if ($up2date_error) {
253: $append_to_subj = ' Error running RPM update script';
254: $sendflag = 1;
255: }
256: return ($sendflag,$append_to_subj);
257: }
258:
259: sub check_with_rug {
260: my ($tmpfile) = @_;
261: my $rug = '/usr/bin/rug';
262: my $sendflag = 0;
263: my $append_to_subj;
264: #
265: # Execute rug command to check for updates
266: if (open (PIPE, "$rug up -N 2>&1 |")) {
267: my @output=<PIPE>;
268: close(PIPE);
269: chomp(@output);
270: my @clean_output;
271: foreach my $line (@output) {
1.3 raeburn 272: if ($line =~ /^Waking\sup\sZMD\.\.\./) {
1.1 raeburn 273: next;
1.2 raeburn 274: } elsif ($line eq 'Done') {
275: next;
276: } elsif ($line eq '') {
277: next;
278: } elsif ($line eq 'The following packages will be installed:') {
279: next;
280: } elsif ($line eq 'Resolving Dependencies...') {
281: next;
282: } elsif ($line eq 'Transaction...') {
283: last;
284: } elsif ($line eq 'No updates are available.') {
1.1 raeburn 285: last;
1.5 raeburn 286: } elsif ($line eq 'Downloading Packages...') {
287: last;
1.1 raeburn 288: } else {
289: push(@clean_output,$line);
290: }
291: }
292: if (@clean_output > 0) {
293: open(TMPFILE,">>$tmpfile");
294: print TMPFILE join("\n",@clean_output);
295: close(TMPFILE);
296: $append_to_subj= ' RPMS to upgrade';
297: $sendflag = 1;
298: }
299: } else {
300: $append_to_subj = ' Error running RPM update check';
301: $sendflag = 1;
302: }
303: return ($sendflag,$append_to_subj);
304: }
305:
1.9 ! raeburn 306: sub check_with_zypper {
! 307: my ($tmpfile) = @_;
! 308: my $zypper = '/usr/bin/zypper';
! 309: my $sendflag = 0;
! 310: my $append_to_subj;
! 311: my $header;
! 312: #
! 313: # Execute zypper command to check for updates
! 314: if (open (PIPE, "$zypper lu 2>&1 |")) {
! 315: my @output=<PIPE>;
! 316: close(PIPE);
! 317: chomp(@output);
! 318: my @clean_output;
! 319: foreach my $line (@output) {
! 320: if ($line eq 'Restoring system sources...') {
! 321: next;
! 322: } elsif ($line =~ /^Parsing\smetadata\sfor\s/) {
! 323: next;
! 324: } elsif ($line eq 'Parsing RPM database...') {
! 325: next;
! 326: } elsif ($line =~ /^Catalog\s+\|\s+Name\s+\|\s+Version\s+\|\s+Category\s+\|\s+Status$/) {
! 327: $header = $line."\n";
! 328: next;
! 329: } elsif ($line =~ /^[-+]+$/) {
! 330: $header .= $line."\n";
! 331: next;
! 332: } elsif ($line eq 'WARNING: These are only the updates affecting the updater itself.') {
! 333: next;
! 334: } elsif ($line eq 'There are others available too.') {
! 335: next;
! 336: } else {
! 337: push(@clean_output,$line);
! 338: }
! 339: }
! 340: if (@clean_output > 0) {
! 341: open(TMPFILE,">>$tmpfile");
! 342: my $message = join("\n",@clean_output);
! 343: print TMPFILE $header.$message;
! 344: close(TMPFILE);
! 345: $append_to_subj= ' RPMS to upgrade';
! 346: $sendflag = 1;
! 347: }
! 348: } else {
! 349: $append_to_subj = ' Error running RPM update check';
! 350: $sendflag = 1;
! 351: }
! 352: return ($sendflag,$append_to_subj);
! 353: }
! 354:
1.1 raeburn 355: sub check_with_checkrpms {
356: my ($tmpfile,$perlvar) = @_;
357: my $checkrpms = '/usr/local/bin/check-rpms';
358: my $sendflag = 0;
359: my $append_to_subj;
360:
361: # Run Martin Seigert's checkrpms script. See
362: # See http://www.sfu.ca/acs/security/linux/check-rpms.html
363: # for more information.
364:
365: #
366: # Check that checkrpms is installed and is the proper version...
367: if (! -e $checkrpms) {
368: open(TMPFILE,">>$tmpfile");
369: print TMPFILE <<END;
370:
371: Unable to locate check-rpms on your system. Please go to
372: http://www.sfu.ca/acs/security/linux/check-rpms.html, download and
373: install check-rpms on this system.
374:
375: END
376: $append_to_subj = ' Error running RPM update check';
377: $sendflag = 1;
378: } else {
379: #
380: # Run check-rpms and capture its output
381: if (open (PIPE, "$checkrpms 2>&1 |")) {
382: my $output=<PIPE>;
383: close(PIPE);
384: if ($output ne '') {
385: $output = <<"END";
386:
387: checkrpms checked the status of the packages on your system and
388: produced the following output:
389: -------------------------------------------------------
390: $output
391: -------------------------------------------------------
392: If there are rpms which need to be installed, please log into
393: $perlvar->{'lonHostID'} and run the following command
394:
395: $checkrpms --update
396:
397: If there are kernel packages to be installed, use
398:
399: $checkrpms --update --install-kernel
400:
401: Keeping your system up to date is very important.
402: Ensuring you are using up to date software is a prerequisite for a
403: secure system.
404:
405: END
406: open(TMPFILE,">>$tmpfile");
407: print TMPFILE $output;
408: close(TMPFILE);
409: $append_to_subj = ' RPMS to upgrade';
410: $sendflag = 1;
411: }
412: }
413: }
414: return ($sendflag,$append_to_subj);
415: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>