diff options
Diffstat (limited to 'machine-update')
-rwxr-xr-x | machine-update | 1108 |
1 files changed, 0 insertions, 1108 deletions
diff --git a/machine-update b/machine-update deleted file mode 100755 index 6d37b5e..0000000 --- a/machine-update +++ /dev/null @@ -1,1108 +0,0 @@ -#!/usr/bin/perl -w -# For Emacs: -*- mode:cperl; mode:folding; -*- -# -# Get a machine's critical features, And mail/http them to the Linux Counter -# -# (c) 1999 - Harald Tveit Alvestrand, the Linux Counter Project -# 2003 - PetaMem Group (www.petamem.com) -# License: GNU Copyleft - see bottom of file. -# Changelog: see even more bottom of the file -# -# As a matter of courtesy, if you change this file on your own, -# make sure it does NOT mail to the counter! -# -use strict; -use POSIX; - -our $VERSION = '0.31'; -our $CVS_VERSION = '$Revision: 1.9 $ $Date: 2008/01/05 15:03:50 $ $Author: patrick $'; -our $IsInTestHarness; -use vars qw(%values %oldvalues $errordata $debugdata %files); # data that is sent -use vars qw($progname %option $mailprogram); -use vars qw(%is_sys_account %is_user %is_account); - -# stuff that controls defaults for passwdscan & accounts subroutines -my ($UID_MIN, $UID_MAX, $got_defs) = (100, 65533, ''); - -# Make sure nothing happens, so that the script's routines -# can be debugged from another file -return 1 if($IsInTestHarness); - -&preparation; -&options; - -&readfile; -&checkconfig; - -if ($option{ask}) { - &askquestions; -} - -&writefile; -&sendfile; - -# {{{ preparation - -# -sub preparation { - die "No HOME environment variable\n" if (!$ENV{HOME}); - die "No home diretory\n" if ! -d $ENV{HOME}; - # Kill some internationalization - $ENV{LANG} = 'C'; - delete $ENV{LC_CTYPE}; - delete $ENV{LC_NUMERIC}; - delete $ENV{LC_NAME}; - delete $ENV{LC_TIME}; - delete $ENV{LC_MESSAGES}; - delete $ENV{LC_COLLATE}; - delete $ENV{LC_MONETARY}; - - my $infodir = "$ENV{HOME}/.linuxcounter"; - if (! -d $infodir) { - mkdir($infodir, 0766) || die "Unable to make $infodir\n"; - } - # Keep track of where I am; need it to install crontab entry - # progname is a global. - $progname = $0; - if ($progname !~ /^\//) { - my $progdir = `pwd`; - chop $progdir; - $progname = "$progdir/$progname"; - $progname =~ s!/./!/!; - } - chdir($infodir) || die "Unable to change to $infodir\n"; - my ($sysname, $nodename, $release, $version, $machine ) = POSIX::uname(); - if (! -f $nodename) { - print STDERR "Machine-update $VERSION. Use $0 -l to display license.\n"; - print STDERR "Creating the infofile for your computer.\n"; - # Create the infodir - open(INFO, ">$nodename"); - print INFO "uniqueid: ", randomnumber(), "\n"; - close INFO; - } - - srand time % $$; # do some seed "randomization" - - # Find out what mail program to use !! Terrible kludge !! - $mailprogram = "/usr/bin/mail"; - if (! -x "$mailprogram") { - if (-x "/bin/mail") { - $mailprogram = "/bin/mail"; - } else { - if (-x "/bin/mailx") { - $mailprogram = "/bin/mailx"; - } else { - if (-x "/usr/sbin/sendmail") { - $mailprogram = "/usr/sbin/sendmail"; - } else { - if (-x "/usr/lib/sendmail") { - $mailprogram = "/usr/lib/sendmail"; - } else { - if (-x "/usr/bin/mutt") { - $mailprogram = "/usr/bin/mutt"; - } else { - if (-x "/usr/sbin/exim4") { - $mailprogram = "/usr/sbin/exim4"; - } else { - if (-x "/usr/bin/elm") { - $mailprogram = "/usr/bin/elm"; - } else { - die "Cannot find a mail program to use"; - } - } - } - } - } - } - } - } -} - -# }}} -# {{{ options - -# -sub options { - my $opt; - - while (defined($ARGV[0]) && $ARGV[0] =~ /^-/) { - $opt = shift @ARGV; - $opt =~ /c/ && &installcrontab; - $opt =~ /d/ && $option{DEBUG}++ && print STDERR "Debug is $option{DEBUG}\n"; - $opt =~ /h/ && &help; - $opt =~ /i/ && ($option{ask} = 1); - $opt =~ /l/ && &license; - $opt =~ /m/ && ($option{mail} = 1); - $opt =~ /t/ && ($option{mail} = 0); - $opt =~ /u/ && &uninstallcrontab; - $opt =~ /v/ && die "\n\t Linux Counter machine-update version $VERSION\n" - . "\tCVS version $CVS_VERSION\n"; - $opt =~ /x/ && ($option{info} = 1); - } -} - -# }}} - -# {{{ askquestions - -# -sub askquestions { - return if ! -t STDIN || ! -t STDOUT; - $| = 1; - print "Here you can specify some info that the script can't know for itself\n"; - $values{owner} = askone("Your Linux Counter reg#, if any", $values{owner}); - $values{key} = askone("Your machine's counter reg#, if any", $values{key}); -} - -# }}} -# {{{ askone -# -sub askone { - my $prompt = shift; - my $default = shift; - - print $prompt; - if (defined($default)) { - print " [$default]"; - } - print ':'; - - my $ans = <STDIN>; - - chop $ans; - &Debug("Answer was $ans\n"); - $ans = $default if (!length($ans)); - - return $ans; -} -# }}} - -# {{{ readfile - -# -sub readfile { - my ($sysname, $nodename, $release, $version, $machine ) = POSIX::uname(); - open(INFO, $nodename) || die "Did not find infofile $nodename\n"; - while (<INFO>) { - chop; - s/#.*//; - if (/^(\S+): *(.+)/) { - my $key = $1; - my $value = $2; - if ($1 !~ /^(owner|key|uniqueid)$/) { - next; - } - &Debug("Read $key: $value\n"); - $values{$key} = $value; - } else { - print STDERR "Unparsed info line: $_ - discarded\n"; - } - } - close INFO; - %oldvalues = %values; -} - -# }}} -# {{{ writefile - -# -sub writefile { - my ($sysname, $nodename, $release, $version, $machine ) = POSIX::uname(); - - open(INFO, ">$nodename.new"); - for my $val (sort keys(%values)) { - &Debug("Saving $val: $values{$val}\n"); - print INFO "$val: $values{$val}\n"; - } - close INFO; - rename("$nodename.new", $nodename) || die "Rename failed\n"; -} - -# }}} -# {{{ sendfile - -# -sub sendfile { - if ($option{mail}) { - open(MAIL, "|$mailprogram machine-registration\@counter.li.org") - || die "Unable to open $mailprogram\n"; - } else { - warn "--------------------------------------------------------\n"; - warn "This is what will be sent to the Linux Counter if you\n"; - warn "run the program with the -m switch. Now, NOTHING IS SENT\n"; - warn "--------------------------------------------------------\n"; - open(MAIL, ">&STDOUT"); - } - # note that $ENV{USER} isn't (always) set in a cron job... - my $user = (getpwuid($<))[0]; - $user = "unknown-id-$<" if !$user; - print MAIL <<EOF -From: $user -To: machine-registration\@counter.li.org -Subject: machine-update for $values{name} - -Mail program that sent this email: $mailprogram -Perl version used to run machine-update: $] - -//MACHINE -EOF - ; - for my $val (sort keys(%values)) { - print MAIL "$val: $values{$val}\n" - if length($values{$val}) > 0; - } - print MAIL "//END\n"; - # Attach files - for my $file (keys(%files)) { - print MAIL "//FILE $file\n"; - print MAIL $files{$file}; - print MAIL "//EOF\n"; - } - - - # Attach possible other info - if ($errordata) { - print MAIL "----- Problem info gathered during probing -----\n"; - print MAIL $errordata; - } - $option{info} && do { - print MAIL "----- Debug data for the script maintainer's aid -----\n"; - print MAIL $debugdata; - }; - close MAIL; -} - -# }}} - -# {{{ randomnumber -# -sub randomnumber { - return int(rand(1_000_000_000)); -} -# }}} - -# {{{ checkconfig - -# -sub checkconfig { - my ($sysname, $nodename, $release, $version, $machine ) = POSIX::uname(); - - warn "This is not Linux, but $sysname!\n" if($sysname ne 'Linux'); - $values{method} = "machine-update version $VERSION"; - $values{os} = $sysname; - $values{kernel} = $release; - $values{cpu_uname} = $machine; - $values{name} = $nodename; # First order guess - - # Credit for some of the code below goes to - # Denis Havlik: <havlik@ap.univie.ac.at> - # Blame is, of course, all mine - HTA - - # Note - there are numerous problems with df, including: - # - early versions don't support the -l option - # - at least some include SAMBA filesystems in the -l option - # 1: Snarf a df -T - my $dfbin = &xbin("df"); - $files{"df -T"} = `$dfbin -T -x nfs`; - - $values{accounts} = &accounts; - $values{users} = &active_users; - - my $uptime = &xbin('uptime'); - if($uptime) { - $uptime = `$uptime`; - $values{uptime_1} = $uptime; # preserve raw version - $values{uptime_1} =~ s/\n.*//; - } - my $lastprog = xbin('last'); - if ($lastprog && -r "/var/run/utmp") { - $values{uptime_2} = `$lastprog -xf /var/run/utmp runlevel`; - $values{uptime_2} =~ s/\n.*$//s; - } else { - DebugInfo("Can't do last to find uptime"); - } - # Not sure this is a Right Thing...so not saving it for the moment - # This section based on a patch from Mark-Jason Dominus <mjd@plover.com> - # try to guess mailer based on content of /usr/lib/sendmail link - if (-l '/usr/lib/sendmail') { - my $realsendmail = readlink('/usr/lib/sendmail'); - if ($realsendmail eq '../sbin/sendmail') { - $realsendmail = '/usr/sbin/sendmail'; - if (-l $realsendmail) { - $realsendmail = readlink($realsendmail); - } - } - if ($realsendmail =~ m{^/var/qmail}) { - $values{mailer} = "qmail"; - } else { - &DebugInfo("Found sendmail as a link to $realsendmail\n"); - } - } - # Link method did not work. Try to guess based on presence of - # config files. (this is more susceptible to the old-junk problem) - if (!$values{mailer}) { - if ( -d '/var/qmail') { - $values{mailer} = 'qmail'; - } elsif ( -f '/etc/sendmail.cf' || -f '/etc/mail/sendmail.cf') { - # TMDG claims recent Fedora Core has it in /etc/mail/sendmail.cf - $values{mailer} = 'sendmail'; - } elsif ( -d '/etc/postfix') { - $values{mailer} = 'postfix'; - } - } - - $values{kcoresize} = -s "/proc/kcore" || 0; - addonefileforsending("/proc/meminfo"); - addonefileforsending("/proc/cpuinfo"); - addonefileforsending("/proc/version"); - # info on what devices are in use on the system - addonefileforsending("/proc/pci"); - addonefileforsending("/proc/bus/usb/devices"); - # Both Mandrake and Red Hat use this file.... - addonefileforsending("/etc/redhat-release"); -} - -# }}} - -# {{{ accounts - -# -sub accounts { - my $s; - my $niss; - my $ypcatbin; # will hold path to the ypcat binary (if any) - - open (TMP,"</etc/passwd"); - $s += &passwdscan; - &DebugErr("Found $s accounts total\n"); - &Debug("Switching to NIS passwords\n"); - - $ypcatbin = &xbin('ypcat'); # get path to ypcat binary (empty if none) - if($ypcatbin) { # test whether ypcat was found - open TMP, "$ypcatbin passwd 2> /dev/null|" - || ($errordata .= "ypcat failed: $!\n"); - $niss = &passwdscan; - $s += $niss; - close TMP; - &Debug("Status of ypcat: $?\n"); - &DebugErr("Found $niss accounts in ypcat passwd\n"); - } - - &DebugErr('Sysaccounts: ', join(' ', keys(%is_sys_account)), "\n"); - &DebugErr("Found $s accounts total\n"); - - return $s; -} - -# }}} -# {{{ passwdscan - -# -sub passwdscan { - # Code for reading login.defs courtesy of Vassilii Khachaturov - # <vassilii@tarunz.org> - local (*DEFS); - # Try importing UID_MIN and UID_MAX from /etc/login.defs, if possible - # else just assume the above defaults for min and max non-system UID - if (!$got_defs && open (DEFS, '/etc/login.defs')) { - while (<DEFS>) { - if (/^\s*(UID_(?:MIN|MAX))\s+(\d+)/) { - # elegant, but not compatible with "strict refs": - #${ $1 } = $2; - if ($1 eq "UID_MIN") { - $UID_MIN = $2; - } else { - $UID_MAX = $2; - } - &Debug("DEFS match: $1 = $2\n"); - } - } - close (DEFS); - $got_defs = 1; - } - &Debug("UID_MIN = $UID_MIN, UID_MAX = $UID_MAX\n"); - # I suppose this is as good as it gets - - # Usually user accounts have UID > 100 and - # "system accounts" have UID < 100, but there is no guarantee - # that - # this will hold for pseudo-users like "postgress" etc. - # Also nobody is usually 99 on linux, but -1 on "standard" unices. - # RedHat places the dividing line at 500. Others use 400... - my @line; - my $s = 0; - - while (<TMP>) { - @line = split ':'; - if ($line[2] >= $UID_MIN && $line[2] <= $UID_MAX - && !($line[0] eq 'nobody')) { - $s++; - $is_account{$line[0]} = 1; - } else { - $is_sys_account{$line[0]} = 1; - } - } - - return $s; -} - -# }}} -# {{{ active_users - -# -# This is kind of alpha, but please test it. -# It calculates the number of "active" users based on the "wtmp" entries -# unfortunately at least Mandrake 8 and 9 ship with non-world-read wtmp -# and non-set-uid last, so this does not work any more... -# -# RJ: Actually I think the best thing to do is to bury this code and be silent about it. -# -sub active_users { - my $userslisted; - - for (qw(reboot wtmp runlevel)) { # This sysaccounts shouldn't be counted. Who else? - $is_sys_account{$_} = 1; - } - open( TMP, "/usr/bin/last 2>&1|"); - while (<TMP>) { - chop; - if (m!/var/log/wtmp: Permission denied!) { # RJ: ***Boom*** on every non-EN system - &ErrorInfo("/usr/bin/last failed because /var/log/wtmp isn't readable\n"); - last; - } - last if(!$_); # RJ: quick hack to safe bad code from harm - my @tmp = split; - my $name = $tmp[0]; - if ($is_sys_account{$name}) { - # do nothing - } elsif (defined $is_account{$name}) { - $is_user{$name} = 1; - } elsif (/^\s*$/) { # blank line - do nothing - } elsif ($#tmp == 9) { # OK line, but unknown user - $option{DEBUG} && do { - if (!$userslisted) { - print STDERR 'Know users are: ', - join(' ', keys(%is_account)), "\n"; - $userslisted = 1; - } - print STDERR "Unknown user: $name\n"; - } - } else { - &DebugErr("Strange line: $_\n"); - } - } - close TMP; - my $i = 0; - for (sort keys %is_user) { - $option{DEBUG} && printf "Active user %3d: %s\n", ++$i, $_; - } - &Debug("$i active users found.\n"); - - return $i; -} - -# }}} - -# {{{ installcrontab - -# -sub installcrontab { - my $hour = int(rand(24)); - my $min = int(rand(60)); - my $day = int(rand(7)); # Weekday. This version runs once a week. - my $cron = ""; - - warn "Installing start of script into your crontab\n"; - if (open(CRON, "crontab -l |")) { - &Debug("Checking crontab for machine-update\n"); - &Debug("Want to install as $progname\n"); - while (<CRON>) { - if (/machine-update/) { - if (/ $progname -m/) { - die "Crontab entry already installed: $_\n"; - } else { - die "Another entry with machine-update: $_\n"; - } - } - $cron .= $_; - } - close CRON; - &Debug("Result from crontab -l: ", $? / 256, "\n"); - if ($? == 0) { - &Debug("Crontab successfully read\n"); - } elsif ($? == 256) { - warn "You don't seem to have a crontab. I will create one.\n"; - } else { - die "Failed to read your crontab. Please report this as a bug: $?\n"; - } - } else { - &Debug("Result from crontab open(): $?\n"); - die "Unable to execute crontab command. Please check your system\n"; - } - open(CRON, "|crontab -"); - print CRON $cron; - print CRON "$min $hour * * $day $progname -m\n"; - close CRON; - &Debug("Result from crontab: $?\n"); - if ($?) { - die(<<EoF); -Installing new crontab failed. -YOUR CRONTAB MAY BE DAMAGED - use crontab -l to check it. -Here's its former content (if any): - -$cron - -EoF - } - print "Crontab entry successfully installed.\nWill run on day $day of every week, at $hour:$min\n"; - - exit 0; -} - -# }}} -# {{{ uninstallcrontab - -# -sub uninstallcrontab { - my $found = 0; - my $cron; - - print STDERR "Removing $progname from your crontab\n"; - open(CRON, "crontab -l |"); - &Debug("Checking crontab for machine-update\n"); - &Debug("Want to uninstall as $progname\n"); - while (<CRON>) { - if (/^#/ && $. <= 3) { # initial comment - &Debug("Skipping comment: $_"); - next; - } - if (/machine-update/) { - if (/ $progname -m/) { - print STDERR "Crontab entry found and removed\n"; - $found = 1; - next; # skip stuff at end.... - } else { - die "Another entry with machine-update: $_\nUninstall manually?\n"; - } - } - $cron .= $_; - } - close CRON; - &Debug("Result from crontab -l: $?\n"); - if ($?) { - die "Failed to read your crontab. You may not have one?\n"; - } - if ($found) { - open(CRON, "|crontab -"); - print CRON $cron; - close CRON; - &Debug("Result from crontab: $?\n"); - if ($?) { - die(<<EoF); -Installing new crontab failed. -YOUR CRONTAB MAY BE DAMAGED - use crontab -l to check it. -Here's its former content (if any): - -$cron - -EoF - } - } else { - print STDERR "No instance of $progname found in your crontab\n"; - } - - exit 0; -} - -# }}} - -# {{{ xbin execute a linux binary - -# -# This sub is to execute a linux binary robustly. i.e. testing -# whether it is present, where it is present, whether it is executable -# -sub xbin { - my $bin = shift; # get name of binary to execute - - $bin = `which $bin 2>/dev/null`; # determine binarys full path - chomp $bin; - return $bin if(-x $bin); # if there and executable: all is well - return it - - if(!$bin) { # if not there - &Debug("No $bin found\n"); # state so - } else { # there but not executable - &Debug("$bin found, but not executable\n"); - } - - return ''; # so return an empty string (binary will not exec) -} - -# }}} -# {{{ getval_from_file get value from system file @ row,col - -# -sub getval_from_file { - my $file = shift; - my $row = shift; - my $col = shift; - my @file; - my @cols; - - if (!(-r $file)) { - &DebugErr("File $file not readable\n"); - return ''; - } - sysopen(FH,$file, O_RDONLY); - @file = <FH>; # read whole file to array - close FH; - - @cols = split /\s+/, $file[$row]; # get the right row - - return $cols[$col]; # return the right column -} - -# }}} - -sub addonefileforsending { - my $file = shift; - my @file; - - if (!(-r $file)) { - &DebugErr("File $file not readable\n"); - return ''; - } - sysopen(FH,$file, O_RDONLY); - @file = <FH>; # read whole file to array - close FH; - $files{$file} = join('', @file); - -} - -# {{{ Debug print debug information if flag is set - -# -sub Debug { - $option{DEBUG} && print @_; -} - -# }}} -# {{{ DebugErr print debug on STDERR if flag is set - -# -sub DebugErr { - $option{DEBUG} && print STDERR @_; -} - -# }}} -# {{{ ErrorInfo -sub ErrorInfo { - $errordata .= join('', @_); -} -# }}} -# {{{ DebugInfo - -sub DebugInfo { - $option{info} && ($debugdata .= join('', @_)); -} - -# }}} - -# {{{ help print help & exit - -# -sub help { - my $host = `uname -n`; - - print <<EoF; -machine-update version $VERSION -Send machine information to the Linux Counter - -USE: machine-update [-i] [-(t|d|l|m|v|x|c|u|h)] - -SWITCHES: - -i = interactive - -t = test (do not send e-mail, just print it ot STDOUT - default) - -d = debug (test, and print additional debug informations) - -l = display license - -m = mail results to linux-counter - -v = print version and exit - -x = send extra info to server (Debug) - -c = install crontab entry - -u = uninstall crontab entry - -h = print usage information and exit -If called with the "-i" option, will ask some questions and store the -answers in $ENV{HOME}/.linuxcounter/$host - -EoF - -exit 0; -} - -# }}} -# {{{ license print license & exit - -# -sub license { - print <<EoF; - - Linux Counter Machine Update version $VERSION - - Copyright (C) 1999-2005 Harald Tveit Alvestrand - 2003 PetaMem Group (www.petamem.com) - - This program 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 program 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 below for more details. - - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - -EoF - - exit 0; -} - -# }}} - -# Changelog for 0.2 -# - indentation and folding marks -# - made script work with -w and use strict -# - removed some localization traps -# - marked some BUGS - but they`re still there (mostly localization) -# - more robust binary calls -# - getval_from_file data acquisition method -# - fixed df (shmfs) - but only temporarily (quick hack) -# - various code optimizations & cleanup (removed unneded vars) -# - Memory size detection now robst and >960MB capable -# - slightly better randomness -# - -# Changelog 0.21 -# - added attaching of files -# - added fetching of uptime_1 and uptime_2 -# -# Changelog 0.22 -# - removed "manual" copying of entries -# - added suppressing error messages from "xbin" calling "which" -# - suppressed NFS from "df -T" listing -# -# Changelog 0.23 -# - added sending /proc/pci -# - removed client-side parsing of DF output and uptime -# -# Changelog 0.24 -# - added sending /proc/version (inspired by klive) -# - changed fetching of old data from "all" to "needed" -# - removed CPU-parsing code -# - fixed warning (harmless) from crontab creation -# - added sending /proc/bus/usb/devices -# -# Changelog 0.25 -# - added sending size of /proc/kcore -# - removed computation of memory client-side -# -# Changelog 0.26 -# - adding cron entry no longer removes comments from crontab. -# Crontab is not ours, so hands off. -# -# Changelog 0.27 -# - When /proc/kcore does not exist on a system, its size is now zero -# -# Changelog 0.28 -# - Added a terrible way to find out what email program can be used to send out the mail -# -# Changelog 0.29 -# - Extended the hardcoded list of programs that can be used to send the -# machine-update email -# -# Changelog 0.30 -# - The script now sends us the version of perl used to run the script -# We need this to solve some problems due to changes in between perl -# versions -# -#vim:ts=8:sw=4:sts=4 - |