diff options
68 files changed, 7213 insertions, 0 deletions
diff --git a/sitesummary/COPYING b/sitesummary/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/sitesummary/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/sitesummary/Makefile b/sitesummary/Makefile new file mode 100644 index 0000000..ee9aa3c --- /dev/null +++ b/sitesummary/Makefile @@ -0,0 +1,94 @@ +DESTDIR = + +prefix = /usr +sbindir = $(prefix)/sbin +datadir = $(prefix)/share +libdir = $(prefix)/lib +cgibindir = $(libdir)/cgi-bin +pkgdatadir = $(datadir)/sitesummary +pkgdir = $(libdir)/sitesummary +collectordir = $(pkgdir)/collect.d +perldir = $(datadir)/perl5 +pkgvardir = /var/lib/sitesummary +nagiosplugdir= $(pkgdir)/nagios-plugins + +INSTALL = install +INSTALL_DATA = $(INSTALL) -m 644 + +COLLECTORS = \ + collect.d/debian \ + collect.d/debian-edu \ + collect.d/nagios \ + collect.d/system \ + collect.d/siteinfo + +SUMMARYSCRIPTS = \ + agesinceseen-summary \ + site-summary \ + hardware-model-summary \ + hostclass-summary \ + kernelversion-summary \ + debian_edu-summary + +all: + +install: install-server install-client + +install-server: + $(INSTALL) -d $(DESTDIR)$(cgibindir) + $(INSTALL) sitesummary-collector.cgi $(DESTDIR)$(cgibindir) + + $(INSTALL) -d $(DESTDIR)$(sbindir) + for f in sitesummary-makewebreport sitesummary-nodes sitesummary-update-munin sitesummary-update-nagios ; do \ + $(INSTALL) $$f $(DESTDIR)$(sbindir) ; \ + done + + $(INSTALL) -d $(DESTDIR)$(perldir) + $(INSTALL) -d $(DESTDIR)$(pkgdir) + $(INSTALL_DATA) SiteSummary.pm $(DESTDIR)$(perldir) + $(INSTALL) $(SUMMARYSCRIPTS) $(DESTDIR)$(pkgdir)/ + + $(INSTALL) expire-entry $(DESTDIR)$(pkgdir)/ + + $(INSTALL) -d $(DESTDIR)/etc/apache2/conf.d + $(INSTALL_DATA) apache.conf $(DESTDIR)/etc/apache2/conf.d/sitesummary + + $(INSTALL) -o www-data -d $(DESTDIR)$(pkgvardir)/entries + $(INSTALL) -o www-data -d $(DESTDIR)$(pkgvardir)/tmpstorage + $(INSTALL) -d $(DESTDIR)$(pkgvardir)/www + + $(INSTALL) -d $(DESTDIR)/usr/share/munin/plugins/. + $(INSTALL) munin-plugin $(DESTDIR)/usr/share/munin/plugins/sitesummary_sites + $(INSTALL) munin-plugin-agesinceseen \ + $(DESTDIR)/usr/share/munin/plugins/sitesummary_agesinceseen + + $(INSTALL) -d $(DESTDIR)/etc/nagios3 + $(INSTALL_DATA) nagios.cfg \ + $(DESTDIR)/etc/nagios3/sitesummary.cfg + $(INSTALL_DATA) nagios-templates.cfg \ + $(DESTDIR)/etc/nagios3/sitesummary-templates.cfg + $(INSTALL_DATA) nagios-template-contacts.cfg \ + $(DESTDIR)/etc/nagios3/sitesummary-template-contacts.cfg + $(INSTALL) -d $(DESTDIR)/etc/nagios + $(INSTALL_DATA) nagios-nrpe-commands.cfg \ + $(DESTDIR)/etc/nagios/sitesummary-nrpe-commands.cfg + +install-client: + $(INSTALL) -d $(DESTDIR)$(sbindir) + $(INSTALL) sitesummary-client sitesummary-upload $(DESTDIR)$(sbindir) + $(INSTALL) -d $(DESTDIR)$(pkgdatadir) + $(INSTALL_DATA) sitesummary-client.conf $(DESTDIR)$(pkgdatadir)/ + + $(INSTALL) -d $(DESTDIR)$(collectordir) + for collector in $(COLLECTORS) ; do \ + $(INSTALL) $$collector $(DESTDIR)$(collectordir); \ + done + + $(INSTALL) -d $(DESTDIR)$(nagiosplugdir) + for plugin in nagios-plugins/* ; do \ + $(INSTALL) $$plugin $(DESTDIR)$(nagiosplugdir); \ + done + +clean: + $(RM) *~ */*~ +distclean: clean diff --git a/sitesummary/README b/sitesummary/README new file mode 100644 index 0000000..dfafdb4 --- /dev/null +++ b/sitesummary/README @@ -0,0 +1,138 @@ +sitesummary +=========== + +More information is available from +<URL: http://wiki.debian.org/DebianEdu/HowTo/SiteSummary >. + +Sitesummary generated Munin configuraiton +----------------------------------------- + +Sitesummary can be used to generate Munin configuration to collect +statistics from all sitesummary clients with the Munin packages +installed. To enable it, install the munin package and make sure +/etc/sitesummary/collector.cfg include 'MUNINDIR=/etc/munin' to get +sitesummary to replace the default munin configuration with the +generated one. Running these commands as root normally does the +trick. + + aptitude install munin munin-node + echo MUNINDIR=/etc/munin >> /etc/sitesummary/collector.cfg + sitesummary-client + /etc/cron.daily/sitesummary + +These steps can be preseeded during installation, here is an example +to enable Munin autoconfig on the sitesummary collector + + sitesummary sitesummary/replace-munin-config boolean true + +Sitesummary generated Nagios configuration +------------------------------------------ + +Since version 0.0.51, there is experimental code in sitesummary to +generate Nagios configuration based on the collected information. To +enable this, install nagios3 and nagios-plugins-standard, edit +/etc/default/nagios3 to include +'NAGIOSCFG=/etc/nagios3/sitesummary.cfg' and run the sitesummary cron +job. Running these commands as root normally does the trick. + + aptitude install nagios3 nagios-plugins-standard + echo 'NAGIOSCFG="/etc/nagios3/sitesummary.cfg"' >> /etc/default/nagios3 + sitesummary-client + /etc/cron.daily/sitesummary + /etc/init.d/nagios3 restart + +The current version of the code run all Nagios checks locally, so it +only work on a single machine. The plan is to change this to use NRPE +to work with a network of machines. + +On the client side, add +'include=/etc/nagios/sitesummary-nrpe-commands.cfg' and +'dont_blame_nrpe=1' in /etc/nagios/nrpe_local.cfg to enable the +sitesummary checks. To make sure the nagios server can contact nrpe, +it might be required to list the server address using the +allowed_hosts option. Running these commands as root normally does +the trick. + + aptitude install nagios-nrpe-server nagios-plugins-standard + cat > /etc/nagios/nrpe.d/sitesummary-nrpe.cfg <<EOF +allowed_hosts=myserver +dont_blame_nrpe=1 +include=/etc/nagios/sitesummary-nrpe-commands.cfg +EOF + sitesummary-client + +These steps can be preseeded during installation, here is an example +to enable Nagios autoconfig on the sitesummary collector and allow it +to query Nagios NRPE on the clients. + + sitesummary sitesummary/enable-nagios-config boolean true + + sitesummary-client sitesummary-client/nagios-server string sitesummary + sitesummary-client sitesummary-client/enable-nagios-nrpe-config boolean true + +Design draft +------------ +system to collect key info about all the machines on a site, to help +the sysadmin keep track of a lot of hosts. + +Should be capable of handling both thin clients and "real machines" + + - two package, one server sitesummary and one client sitesummary-client + + - the client submits information to the server using HTTP put. It + include the list of files it intend to submit, to detect deleted + files. + + - the HTTP connection is either using SSL, or the file(s) transfered + are GPG encrypted. (figure out key exchange system) + + - the client submit a set of files and output from commands with hw + information etc (need plugin system to make it submit more files) + + - lspci + - lsusb + - dmidecode + - uname -s / -m / -r / -v / -o + - ifconfig -a + + - public ssh host key + - /etc/debian_version + - dpkg -l + - /etc/apt/sources.list + - /etc/fstab + - /proc/cpuinfo + - /proc/meminfo + + - the server track changes done to the files (some version control + system like rcs?) on each host, and make summary report on the + number of individual machines reporting to the server + + - how do we identify machines? MAC address could work (ip -s -f link + maddr - which when several interfaces?). IP addess will not work + for thin clients on private networks behind two different servers. + the linux hostid command is only using IP address and is useless. + Can not generate random key stored on the file system, as this + would give all thin clients on a server the same ID. dmidecode + serial number might work for some models, but others have the same + serial number on several machines. + + - ideas for use of this info + + - machine count, grouped by os/kernel/etc + + - can generate a list of host keys for distribution to the clients + + - can generate dhcp MAC<->IP mapping + + - can generate lts.conf files for the LTSP clients + +The server can either be a CGI script, or listen on some port on its +own. + +The client should be a platform independent script with as few +dependencies as possible, to make it lightweight and easy to install +on all machines. (perl, python, /bin/sh?) + +Should the client know which files to report, or should the server be +able to affect it? Can cfengine, nagios or munin be used for this +instead? diff --git a/sitesummary/SiteSummary.pm b/sitesummary/SiteSummary.pm new file mode 100644 index 0000000..8320aa0 --- /dev/null +++ b/sitesummary/SiteSummary.pm @@ -0,0 +1,394 @@ +# +# Support library for scripts parsing the sitesummary files. +# + +package SiteSummary; +require Exporter; + +our $VERSION = 0.01; +our @ISA = qw(Exporter); +our @EXPORT = qw( + for_all_hosts + get_age_group + get_age_groups + get_debian_edu_profile + get_debian_edu_ver + get_debian_ver + get_default_route + get_dns_address + get_filepath_current + get_hardware_info + get_hostclass + get_hostname + get_linux_kernel_ver + get_macaddresses + get_primary_ip_address + get_primary_macaddress + get_site + get_sitegroup + is_laptop + is_pkg_installed + ); + +my $pwd = "/var/lib/sitesummary/entries"; # Path to the entries + +# File for debian-edu configuration +my $debian_edu_config = "/debian-edu/config"; + +sub get_filepath_current { + my ($hostid, $file) = @_; + return "$pwd/$hostid$file"; +} + +# +# Return the value string from a file, ignoring comments +# +sub get_file_string { + my ($hostid, $filename) = @_; + my $path = get_filepath_current($hostid, $filename); + my $string; + if (open (FILE, $path)) { + while(<FILE>) { + chomp; + s/\#.+$//; + next if (/^\s*$/); + $string = $_; + } + close(FILE); + return $string; + } else { + return undef; + } +} + +# +# Return the site string +# +sub get_site { + my $hostid = shift; + return get_file_string($hostid, "/siteinfo/site"); +} + +# +# Return the sitegroup string +# +sub get_sitegroup { + my $hostid = shift; + return get_file_string($hostid, "/siteinfo/sitegroup"); +} + +# +# Return the hostclass string +# +sub get_hostclass { + my $hostid = shift; + return get_file_string($hostid, "/siteinfo/hostclass"); +} + +# +# Return the IP address on the primary network interface +# +sub get_primary_ip_address { + my $hostid = shift; + my $path = get_filepath_current($hostid, "/system/ifconfig-a"); + # XXX Not properly implemented, just pick the first IP + my $ip; + if (open (FILE, $path)) { + while(<FILE>) { + chomp; + if (m/inet addr:(\S+)\s+/) { + $ip = $1; + last; + } + } + close(FILE); + return $ip; + } else { + return undef; + } +} + +# +# Return all MAC addresses +sub get_macaddresses { + my $hostid = shift; + my $path = get_filepath_current($hostid, "/system/ifconfig-a"); + if (open (FILE, $path)) { + my @macs; + while(<FILE>) { + chomp; + if (m/Link encap:Ethernet\s+HWaddr (\S+)\s+/) { + push(@macs, $1); + } + } + close(FILE); + return @macs; + } else { + return undef; + } +} + +# Return current default route used on host +sub get_default_route { + my $hostid = shift; + my $path = get_filepath_current($hostid, "/system/route-n"); + if (open(my $fh, $path)) { + while (<$fh>) { + if (m/^0.0.0.0\s+(\S+)\s+/) { + close($fh); + return $1; + } + } + close($fh); + } + return undef; +} + +# +# Return the IP address on the primary network interface +# +sub get_primary_macaddress { + my $hostid = shift; + my $path = get_filepath_current($hostid, "/system/ifconfig-a"); + # XXX Not properly implemented, just pick the first MAC after + # sorting alphabetically. + if (open (FILE, $path)) { + my @macs; + while(<FILE>) { + chomp; + if (m/Link encap:Ethernet\s+HWaddr (\S+)\s+/) { + push(@macs, $1); + } + } + close(FILE); + return (sort @macs)[0]; + } else { + return undef; + } +} + +# +# Return the hostname string +# +sub get_hostname { + my $hostid = shift; + return get_file_string($hostid, "/system/hostname"); +} + +# +# Return an address that can be used to contact the host. Prefer DNS, +# but fall back to the IP address if the IP address do not resolve in +# DNS. +# +sub in_dns { + my $hostname = shift; + my $packed_ip = gethostbyname($hostname); + return defined $packed_ip; +} +sub get_dns_address { + my $hostid = shift; + my $hostname = get_hostname($hostid); + # Use IP address as hostname if the provided hostname is bogus or + # missing in DNS. + $hostname = get_primary_ip_address($hostid) + if (! in_dns($hostname) || "localhost" eq $hostname); + return $hostname; +} + +# +# Return Linux kernel version for the machines using Linux. +# +sub get_linux_kernel_ver { + my $hostid = shift; + my $path = get_filepath_current($hostid, "/system/uname-smr"); + my $kver; + if (open (FILE, $path)) { + while(<FILE>) { + chomp; + s/\#.+$//; + next if (/^\s*$/); + my @f = (split(/\s+/, $_)); + $kver = $f[1] if ("Linux" eq $f[0]); + } + close(FILE); + return $kver; + } else { + return undef; + } +} + +sub get_debian_edu_profile { + my $hostid = shift; + my $path = get_filepath_current($hostid, $debian_edu_config); + if ( ! -e $path ) { + return undef; + } + if (open (FILE, $path)) { + while (<FILE>) { + chomp; + s/\#.+$//; + next if not (/PROFILE/); + s/^PROFILE=//; + return $_; + } + } + close(FILE); +} + +sub get_debian_edu_ver { + my $hostid = shift; + my $path = get_filepath_current($hostid, $debian_edu_config); + if ( ! -e $path ) { + return undef; + } + if (open (FILE, $path)) { + while (<FILE>) { + chomp; + s/\#.+$//; + next if not (/VERSION/); + s/^VERSION=//; + return $_; + } + } +} + +sub get_debian_ver { + my $hostid = shift; + my $path = get_filepath_current($hostid, "/debian/debian_version"); + if (open (my $fh, $path)) { + my $version = <$fh>; + chomp $version; + close($fh); + return $version; + } else { + return undef; + } +} + +sub get_hardware_info { + my $hostid = shift; + my $path = get_filepath_current($hostid, "/system/dmidecode"); + if (open(FILE, "<", $path)) { + my $sysinfo = 0; + my ($vendor, $model, $version, $serial); + while (<FILE>) { + chomp; + next unless ($sysinfo || m/^System Information/); + $sysinfo = 1; + $vendor = $1 if (m/Manufacturer: (.+\S)\s*$/); + $model = $1 if (m/Product Name: (.+\S)\s*$/); + $version = $1 if (m/Version: (.+\S)\s*$/); + $serial = $1 if (m/Serial Number: (.+\S)\s*$/); + last if (m/^Handle /); + } + close(FILE); + + # Avoid returning bogus vendor and model + undef $vendor if (defined $vendor && + ( + "Not Specified" eq $vendor + || "System Manufaturer" eq $vendor + || "System manufaturer" eq $vendor + || "To Be Filled By O.E.M. by More String" eq $vendor + )); + undef $model if (defined $model && + ( + "Not Specified" eq $model + || "System Name" eq $model + || "System Product Name" eq $model + || "To Be Filled By O.E.M. To Be Filled By O.E.M." eq $model + )); + + # Append version string to get for example the thinkpad model + # name, but ignore bogus entries. + $model = "$model $version" if ($version + && $version ne "Not Specified" + && $version ne "Not Available" + && $version ne "System Version" + && $version ne "None"); + + return ($vendor, $model, $serial); + } else { + return undef; + } +} + +sub is_pkg_installed { + my ($hostid, $pkgname) = @_; + # Check debian/dpkg-l for 'ii *pkgname ' + my $path = get_filepath_current($hostid, "/debian/dpkg-l"); + if (open (my $fh, $path)) { + while(<$fh>) { + if (m/^ii *$pkgname /) { + close($fh); + return 1 + } + } + close($fh); + } + return undef; +} + +sub is_laptop { + my $hostid = shift; + my $path = get_filepath_current($hostid, "/system/laptop"); + return -e $path; +} + +sub for_all_hosts { + my $callback = shift; + + if ( ! -d $pwd ) { + print STDERR "error: Missing $pwd directory.\n"; + return undef; + } + opendir(DIR, $pwd) or die "$!: $pwd\nDied"; + my $count = 0; + foreach (readdir(DIR)) { + chomp; + next if m/^$/ || m/^.$/ || m/^..$/; + my $hostid = $_; + if ( -d "$pwd/$hostid" ) { + $count ++ if ($callback->($hostid)); + } else { + print STDERR "warning: Junk in filelog: $pwd/$hostid\n"; + } + } + closedir(DIR); + return $count; +} + +sub get_age_groups { + return ( + 0 => '>0 days', + 3 => '>3 days', + 7 => '>one week', + 14 => '>14 days', + 30 => '>30 days', + 90 => '>90 days', + 120 => '>120 days', + 180 => '>180 days', + ); +} +sub get_age_group { + my $hostid = shift; + my %agegroups = get_age_groups(); + my $topdir = get_filepath_current($hostid, "/"); + my $age = (time() - (stat($topdir))[9]) / (60 * 60 * 24); + + my $thisgroup; + for my $group (sort { $a <=> $b; } keys %agegroups) { + if ($age > $group) { + $thisgroup = $group; + } + } + return $thisgroup; +} + +1; + +######################################################################## +# Local Variables: +# mode: perl +# End: +######################################################################## diff --git a/sitesummary/TODO b/sitesummary/TODO new file mode 100644 index 0000000..e5dea60 --- /dev/null +++ b/sitesummary/TODO @@ -0,0 +1,3 @@ +- include version number in protocol exchange +- implement encryption of submissions +- generate more elegant web pages (with support for templates) diff --git a/sitesummary/agesinceseen-summary b/sitesummary/agesinceseen-summary new file mode 100644 index 0000000..ddfd7ff --- /dev/null +++ b/sitesummary/agesinceseen-summary @@ -0,0 +1,54 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use SiteSummary; +use Getopt::Std; + +my %agedist; +my %opts; + +sub usage { + my $retval = shift; + print <<EOF; +Usage: $0 [-l] + -l list hosts with the given age +EOF + exit $retval; +} + +getopt("l", \%opts) || usage(1); + +for_all_hosts(\&handle_host); + +print_summary(); + +sub handle_host { + my $hostid = shift; + my $thisgroup = get_age_group($hostid); + if (defined $thisgroup) { + if (exists $agedist{$thisgroup}) { + push @{$agedist{$thisgroup}}, $hostid ; + } else { + $agedist{$thisgroup} = [$hostid]; + } + } +} + +sub print_summary { + printf(" %-20s %5s\n", "age", "count"); + my %agegroups = get_age_groups(); + for my $group (sort { $a <=> $b; } keys %agedist) { + printf(" %-20s %5d\n", $agegroups{$group}, scalar @{$agedist{$group}}); + if (exists $opts{l}) { + for my $hostid (sort @{$agedist{$group}}) { + my $hostname = get_hostname($hostid); + my $site = get_site($hostid) || ""; + my $sitegroup = get_sitegroup($hostid) || ""; + printf " %s %s/%s %s\n", $hostname, $site, $sitegroup, $hostid; + } + print "\n"; + } + } +} diff --git a/sitesummary/apache.conf b/sitesummary/apache.conf new file mode 100644 index 0000000..4938b51 --- /dev/null +++ b/sitesummary/apache.conf @@ -0,0 +1,17 @@ +# +# New URL http://<host>/sitesummary/ listing the current statistics, and +# http://<host>/cgi-bin/sitesummary-collector.cgi to receive submissions. +# + +Alias /sitesummary /var/lib/sitesummary/www +ScriptAlias /cgi-bin/sitesummary-collector.cgi /usr/lib/cgi-bin/sitesummary-collector.cgi + +<Directory /var/lib/sitesummary/www> + AllowOverride None + Options +SymLinksIfOwnerMatch -MultiViews + + # everyone have access + Order deny,allow + Deny from none + Allow from all +</Directory> diff --git a/sitesummary/collect.d/debian b/sitesummary/collect.d/debian new file mode 100644 index 0000000..fd8cbe6 --- /dev/null +++ b/sitesummary/collect.d/debian @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e + +mkdir debian && cd debian +for filename in debian_version ; do + file=/etc/$filename + if [ -f $file ] ; then + cp $file $filename + fi +done + +dpkg -l > dpkg-l diff --git a/sitesummary/collect.d/debian-edu b/sitesummary/collect.d/debian-edu new file mode 100644 index 0000000..8c054ff --- /dev/null +++ b/sitesummary/collect.d/debian-edu @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +mkdir debian-edu && cd debian-edu +for filename in config ; do + file=/etc/debian-edu/$filename + if [ -f $file ] ; then + cp $file $filename + fi +done diff --git a/sitesummary/collect.d/nagios b/sitesummary/collect.d/nagios new file mode 100755 index 0000000..caf83d0 --- /dev/null +++ b/sitesummary/collect.d/nagios @@ -0,0 +1,14 @@ +#!/bin/sh + +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin + +mkdir nagios && cd nagios + +for file in /etc/nagios/nrpe.cfg \ + /etc/nagios/nrpe_local.cfg \ + /etc/nagios/nrpe.d/sitesummary-nrpe.cfg \ + ; do + if [ -e $file ] ; then + cp $file $(basename $file) + fi +done diff --git a/sitesummary/collect.d/siteinfo b/sitesummary/collect.d/siteinfo new file mode 100755 index 0000000..73ad428 --- /dev/null +++ b/sitesummary/collect.d/siteinfo @@ -0,0 +1,13 @@ +#!/bin/sh + +# site = location +# sitegroup = sublocation +# hostclass = type of host (server, workstation, laptop, etc) + +mkdir siteinfo && cd siteinfo +for filename in site sitegroup hostclass ; do + file=/etc/sitesummary/$filename + if [ -f $file ] ; then + cp $file $filename + fi +done diff --git a/sitesummary/collect.d/system b/sitesummary/collect.d/system new file mode 100644 index 0000000..53485ae --- /dev/null +++ b/sitesummary/collect.d/system @@ -0,0 +1,83 @@ +#!/bin/sh + +PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin + +# Keep going even if one of the programs report an error code +# set -e + +mkdir system && cd system + +if type dmidecode >/dev/null 2>&1; then + # Throw away error messages. It will print "/dev/mem: mmap: Bad address" + # in Xen machines. + dmidecode > dmidecode 2> /dev/null +fi + +if type lspci >/dev/null 2>&1; then + lspci > lspci + lspci -n > lspci-n +fi + +if type lsusb >/dev/null 2>&1; then + lsusb > lsusb +fi + +if type lsscsi >/dev/null 2>&1; then + lsscsi > lsscsi +fi + +if type lsmod >/dev/null 2>&1; then + lsmod > lsmod +fi + +uname -smr > uname-smr +uname -n > hostname +ifconfig -a > ifconfig-a +route -n > route-n +cat /proc/cpuinfo > cpuinfo +cat /proc/meminfo > meminfo + +# Collect software RAID status +if [ -f /proc/mdstat ] ; then + cat /proc/mdstat > mdstat +fi + +# Collect mount points, for nagios configuration +cp /etc/fstab fstab +cat /proc/mounts > procmounts + +# Document current runlevel, useful to differenciate LTSP +# thin clients from diskless workstations. +runlevel > runlevel + +# Throw away error message from laptop-detect using dmidecode in Xen +# domUs. See #438693 for more info. +if [ -x /usr/sbin/laptop-detect ] && /usr/sbin/laptop-detect 2>/dev/null; then + touch laptop +fi + +for f in /etc/ssh/ssh_host*.pub ; do + cp $f . +done + +if [ -f /etc/X11/xorg.conf ]; then + cp /etc/X11/xorg.conf . +fi + +if [ -f /etc/X11/fs/config ]; then + cp /etc/X11/fs/config x11-fs-config +fi + +# Collect Cisco Discover Protocol information from all interfaces, in +# parallell. +if type cdpr >/dev/null 2>&1; then + childs="" + for if in $(ip link show up|awk '/^[0-9]+:/ {print $2}' | cut -d: -f1) ; do + if [ lo = "$if" ] ; then continue; fi + cdpr -d $if -t 61 > cdpr.$if & + childs="$childs $!" + done + for pid in $childs ; do + wait $pid + done +fi diff --git a/sitesummary/debian/changelog b/sitesummary/debian/changelog new file mode 100644 index 0000000..aedf729 --- /dev/null +++ b/sitesummary/debian/changelog @@ -0,0 +1,781 @@ +sitesummary (0.0.64) unstable; urgency=low + + [ Philipp Huebner ] + * Fix typo in init.d script message. + + [ Petter Reinholdtsen ] + * Documentation now answer more questions than it asks + (Closes: #444622). + * Stop shipping files in /etc/apache/ (Closes: #578239). + * Add Spanish translation from Camaleón (Closes: #583540). + + -- Petter Reinholdtsen <pere@debian.org> Wed, 02 Jun 2010 08:48:47 +0200 + +sitesummary (0.0.63) unstable; urgency=low + + * Save some time when collecting cdp information by skipping the + loopback interface. It is unlikely to be connected to a Cisco + switch. + * Add service definition to dummy nagios configuration generated at + install time to make sure the dummy entry work with Nagios 3.2 + too. + * Add homepage link in control file. + * Update standards-version from 3.8.3 to 3.8.4. No changes needed. + + -- Petter Reinholdtsen <pere@debian.org> Tue, 06 Apr 2010 15:40:03 +0200 + +sitesummary (0.0.62) unstable; urgency=low + + * Upload to unstable with correct dist. The last upload + went only to the Lenny based Debian Edu archive. + + -- Petter Reinholdtsen <pere@debian.org> Tue, 02 Mar 2010 07:47:18 +0100 + +sitesummary (0.0.61) lenny; urgency=low + + * Do not check anon_inodefs, bdev, cgroup, cifs, cpuset, debugfs, + hugetlbfs, inotifyfs, mqueue, nfs4, oprofilefs, pipefs, proc, + ramfs, securityfs, smb and sockfs file systems in Nagios. + * Improve hardware list by avoiding bogus vendor and model settings. + * Check cups using the check_cups_queue Nagios module from + http://exchange.nagios.org/directory/Plugins/Printing/check_cups_queue/details + * Make client recommend iproute, to make sure the ip command is + available when the cdpr collecting code needs it. + * Add 'status' handling to init.d script. + + -- Petter Reinholdtsen <pere@debian.org> Mon, 01 Mar 2010 20:45:21 +0100 + +sitesummary (0.0.60) unstable; urgency=low + + * Remove files in /var/lib/sitesummary/ when sitesummary package is + purged. Thanks to piuparts and Holger Levsen for discovering the + left behind files. + + -- Petter Reinholdtsen <pere@debian.org> Thu, 18 Feb 2010 11:29:31 +0100 + +sitesummary (0.0.59) unstable; urgency=low + + * Restructure cron job, move munin and nagios updating code to + separate scripts to make it possible to update them individually. + * Change cron job to remove entries before munin and nagios + configuration is updated, to avoid monitoring removed hosts a day + after they are removed. + * New function get_debian_ver() reporting /etc/debian_release content + in SiteSummary perl module. + * Create Nagios hostclass using the result from get_debian_ver(). + * New munin plugin drawing graph based on agesinceseen values donated + by Sverre Jensen. Rewritten to use the SiteSummary perl module by + Petter Reinholdtsen. + * Introduce new agesinceseen group 120-180 to have one limit that + match the default removal limit (120 days). + * Adjust munin plugin reporting site count to use original site as + label and only remove illegal characters for the munin key. + * Adjust sitesummary postinst to only try to enable nagios + autoconfig if /etc/default/nagios3 exist. + * Change munin configuration to use /var/cache/munin/www/ if the + directory exist, to work out of the box with munin 1.4.0 (Closes: + #567168). + * Add new nagios pluing check_kernel_status to report the need for a + reboot to activate a new kernel. Written by Toni Van Remortel and + found at <URL: http://www.monitoringexchange.org >. + * Do not generate Nagios check for file systems with the fuse.ltspfs + type, to avoid checking users usb disks on a thin client server. + * Add three Nagios checks to detect bugs in /etc/resolv.conf, + /etc/hosts and a shutdown in progress, all written by Petter + Reinholdtsen and used by the University of Oslo. + * Move cdpr from recommends to suggests, to avoid installing it by + default as should only be installed on system connected to Cisco + switches. + + -- Petter Reinholdtsen <pere@debian.org> Thu, 04 Feb 2010 10:53:25 +0100 + +sitesummary (0.0.58) unstable; urgency=low + + * Ignore entries from host failing to report MAC address, and log this + to syslog, to avoid getting bogus entries. + * Fix brown paper back typo in collection of xfs config file. + * Provide host-notify-by-email Nagios command as well. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 24 Jan 2010 09:09:52 +0100 + +sitesummary (0.0.57) unstable; urgency=low + + * Allow numbers in Nagios host class names. + * Create Nagios hostclass for sitesummary hostclass, Debian Edu + profile and version settings. + * Collect switch port information using CPD when cdpr is installed. + Recommend cdpr from the client to increase the chance of finding + cdpr. + * Correct name of cups package when generating Nagios check for + cups. + * Add SMTP check to Nagios configuration if the exim4-daemon-heavy + or exim4-daemon-light packages are installed. + * Correct Nagios documentation in the README. + * Use switch information collected using cdpr to specify Nagios + host parent relationships. + * Mention ignored laptops in generated Nagios config to make it + easier to figure out why a machine is not monitored. + * Collect /etc/X11/fs/config to make it possible to figure out of + xfs should listen on TCP or not. + * Only generate TCP port check for xfs if /etc/X11/fs/config state + that it is listening on TCP. + * Add Vcs-Browser and Vcs-Svn entries in control file. + + -- Petter Reinholdtsen <pere@debian.org> Sat, 23 Jan 2010 20:53:18 +0100 + +sitesummary (0.0.56) unstable; urgency=low + + * Replace Nagios main config file with one based on the current one + from Nagios v3 instead of the old one which was based on + debian-edu-config. + * Provide more time periods (workhours, nonworkhours, never) for the + Nagios configuration. + * Make sure to create a dummy Nagios configuration during + installation when Nagios autoconfiguration is enabled, to make + sure Nagios start on first boot when sitesummary is installed from + debian-installer. + * Make sure cron job do not replace the existing generated nagios + config with a empty file if no entries have been submitted. + * Generate Nagios host groups for the site and sitegroup provided + from each client. + + -- Petter Reinholdtsen <pere@debian.org> Thu, 21 Jan 2010 11:26:58 +0100 + +sitesummary (0.0.55) unstable; urgency=low + + * Update documetation on how to enable NRPE configuration on the + clients. + * Make sure a Nagios ping check is generated for each hosts default route. + * Check ftp from Nagios if proftpd is installed. + * Move nagios contact information to separate file, to avoid + conffile questions during upgrades if the contacts are changed and + only the commands change. + * Drop Nagios dhcp check, as it do not seem to work. + * Provide debconf preseeding support (using hidden questions) for + activating Nagios NRPE configuration on clients and Nagios + autoconfiguration on the server. + * Automatically detect if remote NRPE commands can be used for + Nagios checks, and if arguments can be passed or not. + + -- Petter Reinholdtsen <pere@debian.org> Mon, 18 Jan 2010 18:59:13 +0100 + +sitesummary (0.0.54) unstable; urgency=low + + * Rewrite how nagios configuration is generated to use a function to + generate each service check. + * Do not generate from cron the nagios checks that need nrpe + configuration by default. + * Add checks for running cron and working dhcp to Nagios + configuration. + * Collect /etc/nagios/nrpe.cfg and /etc/nagios/nrpe_local.cfg. + * Provide NRPE configuration on the clients in + /etc/nagios/sitesummary-nrpe-commands.cfg + + -- Petter Reinholdtsen <pere@debian.org> Sat, 16 Jan 2010 19:31:25 +0100 + +sitesummary (0.0.53) unstable; urgency=low + + * Collect software raid status from /proc/mdstat if it exist. + * Generate Nagios checks for number of users, software raid, + processes, zombie processes, apt upgrades, swap, dns, imaps, nfs + and squid too. Rename Nagios services to use lower case + characters. + * Only reload Nagios in cron job if the generated configuration + changed. + * Quiet down first invocation of the cron job. + * Make sure entry IDs are lower case, independend of what the client + submitted. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 10 Jan 2010 11:16:58 +0100 + +sitesummary (0.0.52) unstable; urgency=low + + * Change cron job to only reload nagios when the sitesummary generated + nagios configuration is the active one. + * Document in the README how to enable the Munin autoconfiguration. + * Document in the README how to enable the Nagios autoconfiguration. + * Suggest the munin and nagios packages needed for autoconfiguration + to work. + + -- Petter Reinholdtsen <pere@debian.org> Thu, 07 Jan 2010 19:40:14 +0100 + +sitesummary (0.0.51) unstable; urgency=low + + [ Finn-Arne Johansen ] + * Make sure to collect /proc/meminfo. + * Add Japanese translation from Hideki Yamane (Closes: #555692). + + [ Petter Reinholdtsen ] + * Ignore kernel file system type fusectl when generating Nagios + checks. + * Make sure the generated Nagios host entries uses a template. + * Make sure cron job exit imediately and without an error code if + the sitesummary package is removed but not purged (Closes: #563066). + * Implement draft Nagios autoconfiguration. + * Implement support for calling hooks when a sitesummary entry is + expired (Closes: #491918). + + -- Petter Reinholdtsen <pere@debian.org> Wed, 06 Jan 2010 21:00:16 +0100 + +sitesummary (0.0.50) unstable; urgency=low + + * Change build rules to make sure update-rc.d arguments matches the + LSB header. + * Add missing perl-modules dependency for sitesummary. Thanks to + piuparts for discovering. + * Changed Standards-Version from 3.8.0 to 3.8.3. No change needed. + * Make sure sitesummary-client postinst fail on first error. + * Move to debhelper 5. + + -- Petter Reinholdtsen <pere@debian.org> Wed, 16 Sep 2009 23:38:15 +0200 + +sitesummary (0.0.49) unstable; urgency=low + + * Add $syslog as init.d script dependency, to document that this + package might log to syslog. + * Updated Czech translation from Michal Simunek (Closes: #532230). + * Add Slovak translation from Ivan Masár (Closes: #532967). + * Add Russian translation from Yuri Kozlov (Closes: #544256). + + -- Petter Reinholdtsen <pere@debian.org> Sun, 30 Aug 2009 13:22:36 +0200 + +sitesummary (0.0.48) unstable; urgency=low + + [ Holger Levsen] + * Add depends for net-tools to sitesummary-client. + + [ Petter Reinholdtsen ] + * Get rid of error messages from laptop-detect when collecting system + information. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 3 Apr 2009 08:29:12 +0200 + +sitesummary (0.0.47) unstable; urgency=low + + * Fix bug in collector hook handling. Now it uses the correct + 'update' argument when calling hook scripts on updates. + * Make sure to export the get_primary_ip_address function in the + SiteSummary perl module. + * Add perl function get_macaddress() to return all ethernet + MAC addresses. + * Add Swedish translation from Martin Ågren (Closes: #492067). + + -- Petter Reinholdtsen <pere@debian.org> Sat, 9 Aug 2008 19:19:38 +0200 + +sitesummary (0.0.46) unstable; urgency=low + + * Ignore bogus hardware version 'System Version' when reporting + hardware statistic. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 27 Jul 2008 13:05:23 +0200 + +sitesummary (0.0.45) unstable; urgency=low + + * Add new script hardware-model-summary to list the different + hardware vendor and models. + * Report the hardware models in the default web page. + * Rewrite get_primary_macaddress() to return the same MAC address + independently from the interface ordering returned by ifconfig -a. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 25 Jul 2008 20:00:45 +0200 + +sitesummary (0.0.44) unstable; urgency=low + + * Undo fix for slow propagation of information on first time + install, because it fail when both client and server are installed + at the same time using d-i. + * Updated standards-version from 3.7.3 to 3.8.0. No changes needed. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 25 Jul 2008 00:50:51 +0200 + +sitesummary (0.0.43) unstable; urgency=low + + * Fix the code running collector handlers, to get it working when + the perl script is in tained mode. + * Collect the current route table, if the host is a laptop, the + public ssh host keys and the xorg.conf file. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 4 Jul 2008 09:53:18 +0200 + +sitesummary (0.0.42) unstable; urgency=low + + * Make sure to read /etc/environment in init.d/sitesummary-client + script, to activate the common http proxy settings. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 13 Jun 2008 21:40:49 +0200 + +sitesummary (0.0.41) unstable; urgency=low + + * Accept nagios3 clients as nagios clients. + * New argument -w to sitesummary-nodes, to list DNS name and MAC address, + for use with wakeonlan packages. + * Fix slow propagation of information on first time install, by + making sure the server cron job calls sitesummary-client before + processing all entries. + * Add usage information to sitesummary-nodes. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 13 Jun 2008 10:48:04 +0200 + +sitesummary (0.0.40) unstable; urgency=low + + * Updated sitesummary-nodes: + - Ignore nfs file systems when generating nagis configuration. + * Fix typo in munin plugin. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 8 Jun 2008 12:08:17 +0200 + +sitesummary (0.0.39) unstable; urgency=low + + * Rename munin plugin file name to get it working with munin. + + -- Petter Reinholdtsen <pere@debian.org> Sat, 7 Jun 2008 12:50:17 +0200 + +sitesummary (0.0.38) unstable; urgency=low + + [ Petter Reinholdtsen ] + * Updated sitesummary-nodes: + - Use IP address as hostname if the provided hostname is bogus + or missing in DNS. + - Use the IP address from ifconfig, not the sitesummary peer address, + when generating nagios configuration, to avoid using the web proxy IP + address. + - Ignore filesystem types autofs, binfmt_misc, iso9660, nfsd and usbfs + when generating nagios checks. + - More automatically configured Nagios checks based on the + old Debian Edu configuration. + * Add munin plugin to graph sites based on an idea from Narvik. + + -- Petter Reinholdtsen <pere@debian.org> Sat, 7 Jun 2008 12:22:23 +0200 + +sitesummary (0.0.37) unstable; urgency=low + + [ Morten Werner Forsbring ] + * Add DOCTYPE declaration in the html output. + * Use more html in the sitesummary-makewebreport. + * Bumped Standards-Version to 3.7.3 (no changes). + * Changed my lastname. + + [ Patrick Winnertz ] + * Fix lintian warning. ${misc:Depends} is always extended to the same + values, so a listing in Depends and Recommends makes no sense. + + [ Petter Reinholdtsen ] + * Collect current runlevel in the system directory. + * Fix typo in agesinceseen-summary header. + * Link to documentation wiki page in the README. + + -- Petter Reinholdtsen <pere@debian.org> Sat, 31 May 2008 17:17:57 +0200 + +sitesummary (0.0.36) unstable; urgency=low + + [ Holger Levsen ] + * Fix minor html error in html output. + + [ Petter Reinholdtsen ] + * Fix typo in handling of munin.conf.post. + + -- Petter Reinholdtsen <pere@debian.org> Tue, 11 Dec 2007 11:15:44 +0100 + +sitesummary (0.0.35) unstable; urgency=low + + [ Petter Reinholdtsen ] + * Recognice nagios2 as a nagios client/server indicator. + + [ Daniel Hess ] + * Make get_peerinfo of sitesummary-collector.cgi return the + dotted decimal representation of the remote IP address even + with webservers that don't set REMOTE_ADDR but passes the + filedescriptor of the TCP socket. + + -- Petter Reinholdtsen <pere@debian.org> Mon, 3 Dec 2007 21:25:29 +0100 + +sitesummary (0.0.34) unstable; urgency=low + + * Prefer REMOTE_ADDR over the output from gethostbyaddr() in + get_peerinfo(), to avoid "Bad arg length" problem. Rewrite + get_peerinfo() to look ip REMOTE_ADDR in DNS when creating + peerinfo. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 2 Dec 2007 19:25:51 +0100 + +sitesummary (0.0.33) unstable; urgency=low + + * Collect loaded kernel modules, to ease nagios autoconfiguration. + * Add >180 days to the agesinceseen-summary list, for really old entries. + + -- Petter Reinholdtsen <pere@debian.org> Sat, 1 Dec 2007 14:13:16 +0100 + +sitesummary (0.0.32) unstable; urgency=low + + * Collect /proc/mounts and /etc/fstab in system, for use when + generating nagios checks for the file systems. + * Start on experimental code to generate nagios configuration from + the collected sitesummary information. + * Fix peername code in the collector. + * Set the locale to C when collecting data, to make sure the output + format is well known. (Closes: #452899) + * Minor cleanup in output. + + -- Petter Reinholdtsen <pere@debian.org> Mon, 26 Nov 2007 09:52:33 +0100 + +sitesummary (0.0.31) unstable; urgency=low + + * Add -l option to kernelversion-summary and site-summary, to get it + to list the individual hosts with the given kernel version and + site/sitegroup setting. + * New script agesinceseen-summary, listing the hosts that have + failed to submit a report in the last few days. It support -l to + list the individual hosts. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 23 Nov 2007 22:28:14 +0100 + +sitesummary (0.0.30) unstable; urgency=low + + * Change default apache setup to allow everyone read access to + /sitesummary/ instead of only localhost, as the default report do + not include very sensible information. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 4 Nov 2007 13:41:11 +0100 + +sitesummary (0.0.29) unstable; urgency=low + + * Add get_hostclass() to the SiteSummary perl module API. + * Add host class summary to the default list of web reports. + * Fix typo in server cron job. Can't use nice on a shell function. + + -- Petter Reinholdtsen <pere@debian.org> Sat, 13 Oct 2007 10:02:44 +0200 + +sitesummary (0.0.28) unstable; urgency=low + + [ Luk Claes ] + * Removed myself from uploaders. + + [ Petter Reinholdtsen ] + * Make sure the server cron job do not report error when the package + is removed but not purged. (Closes: #445604) + * Move random sleep from the report script and into the cron script, + to make it possible to report imediately from a client. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 12 Oct 2007 19:10:09 +0200 + +sitesummary (0.0.27) unstable; urgency=low + + * Modify the client code to sleep for a random number of seconds + between 0 and 3600 to make sure all clients do not overload the + server, based on code from cron-apt. + * Only list clients in sitesummary-nodes with the munin-node package + installed when generating munin configuration file. + * Let sitesummary depend on ${misc:Depends} to get the required + debconf dependency. + + -- Petter Reinholdtsen <pere@debian.org> Tue, 3 Jul 2007 09:46:29 +0200 + +sitesummary (0.0.26) unstable; urgency=low + + * Add code in the server cronjob to generate a replacement + munin.conf, and make it possible to activate it in munin by + setting MUNINDIR=/etc/munin/ in collector.cfg. + * Add preseedable hidden boolean debconf question + sitesummary/replace-munin-config to make it possible to enable + this feature at install time. + * Update the postinst script to make sure the install time code is + only executed during configure. + + -- Petter Reinholdtsen <pere@debian.org> Thu, 31 May 2007 15:56:16 +0200 + +sitesummary (0.0.25) unstable; urgency=low + + [ Petter Reinholdtsen ] + * New perl function get_hostname() available from the SiteSummary + perl module. + * Add script sitesummary-nodes to list all reporting nodes. Use -m + to list them in the format expected in /etc/munin/munin.conf. + + -- Petter Reinholdtsen <pere@debian.org> Mon, 21 May 2007 08:21:40 +0200 + +sitesummary (0.0.24) unstable; urgency=low + + [ Bart Cornelis (cobaco) ] + * Updated templates file as it was out of date + * Added Dutch translation + + [ Petter Reinholdtsen ] + * Run cron job just after installation, to get the web page generated. + (Closes: #423256) + + -- Petter Reinholdtsen <pere@debian.org> Fri, 18 May 2007 09:24:23 +0200 + +sitesummary (0.0.23) unstable; urgency=medium + + * Added German debconf translation. Thanks to Helge Kreutzmann. + (Closes: #411569) + + -- Morten Werner Olsen <werner@debian.org> Wed, 7 Mar 2007 15:35:47 +0100 + +sitesummary (0.0.22) unstable; urgency=medium + + * Include first protuguese debconf translation for sitesummary + (Closes: #409406) Thanks to Carlos Lisboa + + -- Steffen Joeris <white@debian.org> Mon, 12 Feb 2007 15:35:24 +1100 + +sitesummary (0.0.21) unstable; urgency=low + + [ Holger Levsen ] + * Removed myself from uploaders + + [ Luk Claes ] + * Updated French debconf translation, thanks to Cyril Brulebois + (Closes: #403444). + + [ Steffen Joeris ] + * Add myself to uploaders + + -- Steffen Joeris <white@debian.org> Sun, 14 Jan 2007 12:07:28 +0100 + +sitesummary (0.0.20) unstable; urgency=low + + * Fix regex used to extract eth0 MAC address, to avoid matching peth0 + on a vmware box. + * Improve template text to include the example URL. to make it + easier to come up with URLs usable from external machines. + * Add perl-modules as dependency for sitesummary-client, to make + sure Getopt::Std is available for sitesummary-upload. + * Add new collect.d/debian to collect debian specific stuff. Now + collects /etc/debian_version and the output from dpkg -l. + * Change the collector to use the mac address from eth1 or eth2 if + eth0 isn't usable. + * Throw away error messages from dmidecode when collecting info, to + avoid daily cron mails from Xen machines. + * Only use a2dissite to disable the site if it is enabled. + + -- Petter Reinholdtsen <pere@debian.org> Sat, 9 Dec 2006 15:28:23 +0100 + +sitesummary (0.0.19) unstable; urgency=low + + [ Luk Claes ] + * Added myself to uploaders. + + [ Petter Reinholdtsen ] + * Collect /proc/cpuinfo using collect.d/system. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 19 Nov 2006 20:47:51 +0100 + +sitesummary (0.0.18) unstable; urgency=low + + [ Petter Reinholdtsen ] + * Do not recommend sitesummary from sitesummary-client, to make it + easier to install the client with aptitude without pulling in the + server. + * Include Czech translation by Jakub Kasparec. (Closes: #396717) + + -- Petter Reinholdtsen <pere@debian.org> Thu, 2 Nov 2006 20:04:12 +0100 + +sitesummary (0.0.17) unstable; urgency=low + + [ Steffen Joeris ] + * Include french debconf translations (Closes: #392887) + Thanks to Cyril Brulebois + + -- Petter Reinholdtsen <pere@debian.org> Sat, 21 Oct 2006 12:03:48 +0200 + +sitesummary (0.0.16) unstable; urgency=low + + * Fix typo in get_debian_edu_ver() making it fail to + find the version name. + * Add sitesummary-client.postrm file to remove the + generated configuration files during purge. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 8 Oct 2006 13:14:16 +0200 + +sitesummary (0.0.15) unstable; urgency=low + + [ Steffen Joeris ] + * Remove code to set the debconf value explicitely in the + sitesummary-client.config script to avoid possible conflict + (Closes: #391593) + + [ Petter Reinholdtsen ] + * Make sure the debconf value only is set in sitesummary-client.config + when local configuration exist. + + -- Petter Reinholdtsen <pere@debian.org> Sat, 7 Oct 2006 20:27:01 +0200 + +sitesummary (0.0.14) unstable; urgency=low + + [ Petter Reinholdtsen ] + * Correct typo in recommends list for sitesummary-client; + dmidecide->dmidecode. (Closes: #391255) + * Add symlink from /etc/apache/conf.d/sitesummary to + /etc/apache2/conf.d/sitesummary, to work with both apache and + apache2. Adjust dependency accordingly, and rewrite postinst to + continue working when apache2-common isn't installed. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 6 Oct 2006 19:21:18 +0200 + +sitesummary (0.0.13) unstable; urgency=low + + * Change server cron job to remove entries after 120 days. + * Make it possible to override server config using + /etc/sitesummary/collector.cfg. + * Include a timestamp in the simple web report, to document when the + web page was last updated. + + -- Petter Reinholdtsen <pere@debian.org> Thu, 5 Oct 2006 09:04:47 +0200 + +sitesummary (0.0.12) unstable; urgency=low + + * Modify the system info collector script to ignore non-true exit + codes from the programs. This make sure it work on systems + without usb support, among other things. + * Modify client script to ignore non-true exit codes from the + collector fragments. + * Modify the sitesummary postinst script to make sure + /var/lib/sitesummary/tmpstorage and /var/lib/sitesummary/entries + are owned by user www-data. This give the cgi-script write access + to the storage area. + * Switch the client from cron.d to cron.daily. + * Add collector for debian-edu configuration. Correct server + summary part to use the collected file. + + -- Petter Reinholdtsen <pere@debian.org> Wed, 4 Oct 2006 10:39:18 +0200 + +sitesummary (0.0.11) unstable; urgency=low + + * Fix minor typo in debian_edu-summary. + * Quiet down debian_edu-summary runs for machines without the + Debian Edu config file. + + -- Petter Reinholdtsen <pere@debian.org> Fri, 22 Sep 2006 08:33:39 +0200 + +sitesummary (0.0.10) unstable; urgency=low + + * Fix typo in sitesummary postinst, breaking upgrades. + + -- Petter Reinholdtsen <pere@debian.org> Wed, 20 Sep 2006 21:24:01 +0200 + +sitesummary (0.0.9) unstable; urgency=low + + * Initial upload into Debian. + * Improve template text. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 17 Sep 2006 20:17:48 +0200 + +sitesummary (0.0.8) terra; urgency=low + + [ Steffen Joeris ] + * Add missing dependency for sitesummary against apache2-common + which is needed for a2dissite in the postinst script + * Write subroutine for debian_edu_profile which is needed for the + debian-edu report to reflect the profile + * Add debian_edu-summary script and adjust Makefile and the + sitesummary-makewebreport script + * Write subroutine for debian_edu_vers to reflect the current + debian-edu-version + + -- Steffen Joeris <steffen.joeris@skolelinux.de> Tue, 5 Sep 2006 21:21:24 +1000 + +sitesummary (0.0.7) terra; urgency=low + + [ Petter Reinholdtsen ] + * Add daily cron job to update web pages once a day. + * Remove old /etc/apache2/sites-available/sitesummary if it exist, to + cope with the new apache config structure introduced version 0.0.6. + + [ Holger Levsen ] + * because debhelper.mk is used, the dependency on debhelper needs to + be >=4.1.0 + * moved the build-depends-indep back to to build-depends, as build-depends + on cdbs and debhelper must not be arch independent build depends. + * updated fsf address in copyright + + -- Holger Levsen <debian@layer-acht.org> Fri, 1 Sep 2006 16:12:33 +0200 + +sitesummary (0.0.6) terra; urgency=low + + [ Petter Reinholdtsen ] + * Let the client recommend cron, as it need it to call + in after the initial submission after boot. + * Add trivial sitesummary-makewebreport to make a web page with the summary + results. + * Let the collector store the IP peer info about each entry. Not + yet working, as the getpeername() code is broken. + * Extend package descriptions and make them more useful. + * Improve copyright file. + * Change build-depend to build-depend-indep, as this package + currently is architecture neutral. + + [ Morten Werner Olsen ] + * Rewrite Apache example config and place it in /etc/apache2/conf.d/ + as /etc/apache2/sites-available/ is ment for new virtualhosts (which + is not what we want). + * Add myself as uploader. + + -- Petter Reinholdtsen <pere@debian.org> Thu, 31 Aug 2006 08:34:30 +0200 + +sitesummary (0.0.5) terra; urgency=low + + [ Petter Reinholdtsen ] + * Add debconf question for sitegroup and host class. + * Collect output from lsusb and lsscsi if they are present. + * Drop wget as dependency for sitesummary-client. It is no longer used. + * Include apache2 example configuration. + * Try to create the directories in /var/lib/sitesummary/ with www-data + as the owner, to allow the cgi script to write into them. + * Remove sitecontact references. I'm not sure it is the right place + for it, and we can reintroduce it if it proves to be a good idea. + + [ Steffen Joeris ] + * Update debian/copyright file + + -- Petter Reinholdtsen <pere@debian.org> Mon, 28 Aug 2006 18:26:01 +0200 + +sitesummary (0.0.4) terra; urgency=low + + [ Petter Reinholdtsen ] + * Reduce code duplication in SiteSummary.pm. Add new function + get_sitegroup(). + * Extend site-summary script to also entries per sitegroup within a + site. + + [ Steffen Joeris ] + * Add cdbs to build-depends + * Change build-depends-indep to build-depends as programs are needed + for the clean target + * Clean up control file and fix Recommends to make sure lintian is + happy + * Update debconf templates to fix a lintian warning + + [ Petter Reinholdtsen ] + * Reduce compat level to 4 as #337664 is not affecting this package + after I modified it to not start the init.d script when the + package is installed. This make the source buildable in sarge. + + -- Petter Reinholdtsen <pere@debian.org> Mon, 28 Aug 2006 08:05:55 +0200 + +sitesummary (0.0.3) terra; urgency=low + + * Remove temp file when it is processed by the collector. + * Include the directories in /var/lib/sitesummary/ used by the + collector in the sitesummary package. + * Make it easier to configure the time delay from the boot until a + report is submitted. + * Change the sitesummary-client postinst to not submit information + when the package is installed. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 27 Aug 2006 22:13:06 +0200 + +sitesummary (0.0.2) terra; urgency=low + + * Make temp file name more unique by adding process id to it, while + I wait for a working getpeername call. + * Add debconf question for collector URLs and site. + + -- Petter Reinholdtsen <pere@debian.org> Sun, 27 Aug 2006 13:58:13 +0200 + +sitesummary (0.0.1) terra; urgency=low + + * Initial release. + + -- Petter Reinholdtsen <pere@debian.org> Sat, 26 Aug 2006 12:04:28 +0200 + diff --git a/sitesummary/debian/compat b/sitesummary/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/sitesummary/debian/compat @@ -0,0 +1 @@ +5 diff --git a/sitesummary/debian/control b/sitesummary/debian/control new file mode 100644 index 0000000..3fdfac6 --- /dev/null +++ b/sitesummary/debian/control @@ -0,0 +1,39 @@ +Source: sitesummary +Section: misc +Priority: optional +Maintainer: Debian Edu Developers <debian-edu@lists.debian.org> +Uploaders: Petter Reinholdtsen <pere@debian.org>, Morten Werner Forsbring <werner@debian.org>, Steffen Joeris <white@debian.org>, Patrick Winnertz <winnie@debian.org> +Build-Depends: debhelper (>= 5), cdbs +Standards-Version: 3.8.4 +Homepage: http://wiki.debian.org/DebianEdu/HowTo/SiteSummary +Vcs-Browser: http://svn.debian.org/wsvn/debian-edu/trunk/src/sitesummary/?rev=0&sc=0 +Vcs-Svn: svn://svn.debian.org/debian-edu/trunk/src/sitesummary/ + +Package: sitesummary +Architecture: all +Depends: ${misc:Depends}, gnupg, net-tools, perl-modules +Recommends: apache2-mpm-worker | httpd, sitesummary-client +Suggests: munin, munin-node, nagios3, nagios-plugins-standard +Description: Generate site summary of submitting hosts (server part) + The sitesummary system makes it easier to keep track of a lot of + machines, by allowing each machine to report their existence once a + day to a central collector, and using this collector to make summary + reports about the hosts. + . + This package is the server part, with the collector and report + scripts. + +Package: sitesummary-client +Architecture: all +Depends: ${misc:Depends}, gnupg, perl-modules +Recommends: cron, dmidecode, pciutils, usbutils, lsscsi, iproute +Suggests: sitesummary, munin-node, nagios-nrpe-server, nagios-plugins-standard, cdpr +Description: Generate site summary of submitting hosts (client part) + The sitesummary system makes it easier to keep track of a lot of + machines, by allowing each machine to report their existence once a + day to a central collector, and using this collector to make summary + reports about the hosts. + . + This package is the client part, reporting in to the server after + boot and once a day. + diff --git a/sitesummary/debian/copyright b/sitesummary/debian/copyright new file mode 100644 index 0000000..40a1853 --- /dev/null +++ b/sitesummary/debian/copyright @@ -0,0 +1,35 @@ +This package was debianized by Petter Reinholdtsen on +Thu Aug 24 10:02:05 CEST 2006 +0200. + +The current Debian maintainer is Petter Reinholdtsen + +It was downloaded from: + http://svn.debian.org/wsvn/debian-edu/trunk/src/sitesummary/ + +Created by Petter Reinholdtsen, upstream authors are the debian-edu + team <debian-edu@lists.debian.org> + +Copyright: 2006 Petter Reinholdtsen + + 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; version 2 of the License. + + 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 for more details. + + You should have received a copy of the GNU General Public License with + the Debian GNU/Linux distribution in file /usr/share/common-licenses/GPL; + if not, write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the GNU General Public +License, version 2, can be found in /usr/share/common-licenses/GPL-2. + +The file sitesummary-upload is placed in the public domain and was +written by Bill Allombert and modified by Petter Reinholdtsen. + +The Debian packaging is copyright 2006 by Petter Reinholdtsen and +licensed under the terms of the GNU General Public License version 2. diff --git a/sitesummary/debian/po/POTFILES.in b/sitesummary/debian/po/POTFILES.in new file mode 100644 index 0000000..e8c6bc0 --- /dev/null +++ b/sitesummary/debian/po/POTFILES.in @@ -0,0 +1 @@ +[type: gettext/rfc822deb] sitesummary-client.templates diff --git a/sitesummary/debian/po/cs.po b/sitesummary/debian/po/cs.po new file mode 100644 index 0000000..d441486 --- /dev/null +++ b/sitesummary/debian/po/cs.po @@ -0,0 +1,81 @@ +# Czech debconf template translation of sitesummary +# Copyright (C) 2009 Michal Simunek <michal.simunek@gmail.com> +# This file is distributed under the same license as the sitesummary package. +# +msgid "" +msgstr "" +"Project-Id-Version: sitesummary 0.0.48\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: 2009-06-07 14:13+0200\n" +"Last-Translator: Michal Simunek <michal.simunek@gmail.com>\n" +"Language-Team: Czech <debian-l10n-czech@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "URL:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "" +"Insert the URL to the sitesummary collector, where should the sitesummary " +"information be submitted. Several URLs can be specified separated by space." +msgstr "" +"Zadejte URL ke kolektoru sitesummary, kam by měly být odesílány " +"informace sitesummary. Můžete zadat několik URL adres oddělených mezerou." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "Výchozí URL je http://localhost/cgi-bin/sitesummary-collector.cgi" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "Stránka:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "Zadejte řetězec identifikující stránku s umístěním tohoto stroje." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "Skupina stránek:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "" +"Insert a string identifying the subgroup within the site where this machine " +"is located." +msgstr "" +"Zadejte řetězec identifikující podskupinu ze stránky kde je umístěn tento " +"stroj." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "Třída hostitele:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "" +"Insert string identifying the host class, like workstation, server, laptop, " +"thin client etc." +msgstr "" +"Zadejte řetězec identifikující třídu hostitele, jako pracovní stanice, " +"server, laptop, tenký klient atd." diff --git a/sitesummary/debian/po/de.po b/sitesummary/debian/po/de.po new file mode 100644 index 0000000..e5b7c80 --- /dev/null +++ b/sitesummary/debian/po/de.po @@ -0,0 +1,84 @@ +# Translation of sitesummary debconf templates to German +# Copyright (C) Helge Kreutzmann <debian@helgefjell.de>, 2007. +# This file is distributed under the same license as the sitesummary package. +# +msgid "" +msgstr "" +"Project-Id-Version: sitesummary 0.0.22\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: 2007-02-19 21:54+0100\n" +"Last-Translator: Helge Kreutzmann <debian@helgefjell.de>\n" +"Language-Team: German <debian-l10n-german@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "URL:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "" +"Insert the URL to the sitesummary collector, where should the sitesummary " +"information be submitted. Several URLs can be specified separated by space." +msgstr "" +"Geben Sie die URL für den Sitesummary-Sammler ein, wo die Sitesummary-" +"Informationen eingereicht werden sollen. Mehrere, durch Leerzeichen " +"getrennte URLs können angegeben werden." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "" +"Die Standard-URL ist http://localhost/cgi-bin/sitesummary-collector.cgi" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "Standort:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "" +"Geben Sie eine Zeichenkette an, die den Standort dieser Maschine angibt." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "Standortgruppe:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "" +"Insert a string identifying the subgroup within the site where this machine " +"is located." +msgstr "" +"Geben Sie eine Zeichenkette an, die die Untergruppe innerhalb des Standorts " +"dieser Maschine angibt." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "Rechnerklasse:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "" +"Insert string identifying the host class, like workstation, server, laptop, " +"thin client etc." +msgstr "" +"Geben Sie eine Zeichenkette an, die die Rechnerklasse (wie Workstation, " +"Server, Laptop, Terminal, usw.) angibt." diff --git a/sitesummary/debian/po/es.po b/sitesummary/debian/po/es.po new file mode 100644 index 0000000..9b99235 --- /dev/null +++ b/sitesummary/debian/po/es.po @@ -0,0 +1,95 @@ +# sitesummary po-debconf translation to Spanish +# Copyright (C) 2010 Software in the Public Interest +# This file is distributed under the same license as the sitesummary package. +# +# Changes: +# - Initial translation +# Camaleón <noelamac@gmail.com>, 2010 +# +# - Updates +# +# +# Traductores, si no conocen el formato PO, merece la pena leer la +# documentación de gettext, especialmente las secciones dedicadas a este +# formato, por ejemplo ejecutando: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Equipo de traducción al español, por favor lean antes de traducir +# los siguientes documentos: +# +# - El proyecto de traducción de Debian al español +# http://www.debian.org/intl/spanish/ +# especialmente las notas y normas de traducción en +# http://www.debian.org/intl/spanish/notas +# +# - La guía de traducción de po's de debconf: +# /usr/share/doc/po-debconf/README-trans +# o http://www.debian.org/intl/l10n/po-debconf/README-trans +# +msgid "" +msgstr "" +"Project-Id-Version: sitesummary 0.0.63\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: 2010-05-17 12:26+0100\n" +"Last-Translator: Camaleón <noelamac@gmail.com>\n" +"Language-Team: Debian Spanish <debian-l10n-spanish@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "URL:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "Insert the URL to the sitesummary collector, where should the sitesummary information be submitted. Several URLs can be specified separated by space." +msgstr "Introduzca la URL al colector de «sitesummary» donde se enviará la información. Puede especificar varias direcciones URL separadas por un espacio." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "La URL predeterminada es «http://localhost/cgi-bin/sitesummary-collector.cgi»" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "Sitio:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "Introduzca un texto para identificar el sitio donde se encuentra este equipo." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "Grupo de sitios:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Insert a string identifying the subgroup within the site where this machine is located." +msgstr "Introduzca un texto para identificar un subgrupo dentro del sitio donde se encuentra este equipo." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "Tipo de equipo:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Insert string identifying the host class, like workstation, server, laptop, thin client etc." +msgstr "Introduzca un texto para identificar el tipo de equipo, por ejemplo: estación de trabajo, servidor, equipo portátil, cliente ligero, etc." + diff --git a/sitesummary/debian/po/fr.po b/sitesummary/debian/po/fr.po new file mode 100644 index 0000000..567c53e --- /dev/null +++ b/sitesummary/debian/po/fr.po @@ -0,0 +1,85 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the sitesummary package. +# Cyril Brulebois <cyril.brulebois@enst-bretagne.fr>, 2006 +# +msgid "" +msgstr "" +"Project-Id-Version: sitesummary 0.0.11\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: 2006-10-03 20:40+0200\n" +"Last-Translator: Cyril Brulebois <cyril.brulebois@enst-bretagne.fr>\n" +"Language-Team: French <debian-l10n-french@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "URL :" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "" +"Insert the URL to the sitesummary collector, where should the sitesummary " +"information be submitted. Several URLs can be specified separated by space." +msgstr "" +"Veuillez indiquer l'adresse du collecteur sitesummary, à laquelle les " +"informations doivent être envoyées. Plusieurs adresses peuvent être " +"mentionnées, séparées par des espaces." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "" +"L'adresse par défaut est « http://localhost/cgi-bin/sitesummary-collector." +"cgi »." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "Site :" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "Veuillez indiquer l'adresse du site dont fait partie ce serveur." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "Sous-partie du site :" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "" +"Insert a string identifying the subgroup within the site where this machine " +"is located." +msgstr "" +"Veuillez indiquer l'identifiant de la partie du site (« sitegroup ») où " +"cette machine est située." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "Type de machine :" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "" +"Insert string identifying the host class, like workstation, server, laptop, " +"thin client etc." +msgstr "" +"Veuillez indiquer le type de machine, par exemple : station de travail, " +"serveur, portable, client léger, etc." diff --git a/sitesummary/debian/po/ja.po b/sitesummary/debian/po/ja.po new file mode 100644 index 0000000..ff166c7 --- /dev/null +++ b/sitesummary/debian/po/ja.po @@ -0,0 +1,82 @@ +# Copyright (C) 2009 Debian Edu Developers <debian-edu@lists.debian.org>
+# as sitesummary Debian package's copyright holder.
+# This file is distributed under the same license as sitesummary package.
+# Hideki Yamane (Debian-JP) <henrich@debian.or.jp>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sitesummary 0.0.48\n"
+"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n"
+"POT-Creation-Date: 2007-04-29 00:52+0200\n"
+"PO-Revision-Date: 2009-04-05 08:26+0900\n"
+"Last-Translator: Hideki Yamane (Debian-JP) <henrich@debian.or.jp>\n"
+"Language-Team: Japanese <debian-japanese@lists.debian.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: string
+#. Description
+#: ../sitesummary-client.templates:1001
+msgid "URL:"
+msgstr "URL:"
+
+#. Type: string
+#. Description
+#: ../sitesummary-client.templates:1001
+msgid ""
+"Insert the URL to the sitesummary collector, where should the sitesummary "
+"information be submitted. Several URLs can be specified separated by space."
+msgstr ""
+"sitesummary の情報が報告される sitesummary collector の URL を入力してください。"
+"複数の URL の場合は空白で区切ることができます。"
+
+#. Type: string
+#. Description
+#: ../sitesummary-client.templates:1001
+msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi"
+msgstr "デフォルトの URL は http://localhost/cgi-bin/sitesummary-collector.cgi です。"
+
+#. Type: string
+#. Description
+#: ../sitesummary-client.templates:2001
+msgid "Site:"
+msgstr "サイト:"
+
+#. Type: string
+#. Description
+#: ../sitesummary-client.templates:2001
+msgid "Insert a string identifying the site where this machine is located."
+msgstr "このマシンが配置されているサイトを識別するための文字列を入力してください。"
+
+#. Type: string
+#. Description
+#: ../sitesummary-client.templates:3001
+msgid "Sitegroup:"
+msgstr "サイトグループ:"
+
+#. Type: string
+#. Description
+#: ../sitesummary-client.templates:3001
+msgid ""
+"Insert a string identifying the subgroup within the site where this machine "
+"is located."
+msgstr ""
+"このマシンが配置されているサイト内のサブグループを識別する文字列を挿入してください。"
+
+#. Type: string
+#. Description
+#: ../sitesummary-client.templates:4001
+msgid "Host class:"
+msgstr "ホストクラス:"
+
+#. Type: string
+#. Description
+#: ../sitesummary-client.templates:4001
+msgid ""
+"Insert string identifying the host class, like workstation, server, laptop, "
+"thin client etc."
+msgstr ""
+"ワークステーション、サーバ、ラップトップ、シンクライアントなどのホストクラスを"
+"識別する文字列を入力してください。"
+
diff --git a/sitesummary/debian/po/nl.po b/sitesummary/debian/po/nl.po new file mode 100644 index 0000000..033f3a8 --- /dev/null +++ b/sitesummary/debian/po/nl.po @@ -0,0 +1,72 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: sitesummary\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: 2007-04-29 15:03+0100\n" +"Last-Translator: Bart Cornelis <cobaco@skolelinux.no>\n" +"Language-Team: debian-l10n-dutch <debian-l10n-dutch@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Dutch\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "URL:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "Insert the URL to the sitesummary collector, where should the sitesummary information be submitted. Several URLs can be specified separated by space." +msgstr "Wat is de URL waar de sitesummary-collector de sitesummary-informatie moet naar toe sturen? U kunt meerder URL's opgeven gescheiden door spaties." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "De standaard-URL is http://localhost/cgi-bin/sitesummary-collector.cgi" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "Locatie:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "Voer hier een string in die de locatie identificeert waar deze machine zich bevindt. " + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "Locatiegroep:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Insert a string identifying the subgroup within the site where this machine is located." +msgstr "Voer hier een string in de de subgroep van de lokatie identificeert waar deze machine zich bevindt. " + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "Computerklasse:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Insert string identifying the host class, like workstation, server, laptop, thin client etc." +msgstr "Voer hier een string in die de computerklasse identificeert (bv. werkstation, server, laptop, thin-client, ...)." + diff --git a/sitesummary/debian/po/output b/sitesummary/debian/po/output new file mode 100644 index 0000000..8a91a1e --- /dev/null +++ b/sitesummary/debian/po/output @@ -0,0 +1 @@ +2 utf8 diff --git a/sitesummary/debian/po/pt.po b/sitesummary/debian/po/pt.po new file mode 100644 index 0000000..40166c5 --- /dev/null +++ b/sitesummary/debian/po/pt.po @@ -0,0 +1,84 @@ +# Portuguese translation of sitesummary debconf messages. +# Copyright (C) 2007 Carlos Lisboa +# This file is distributed under the same license as the sitesummary package. +# Carlos Lisboa <carloslisboa@gmail.com>, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: sitesummary\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: 2007-02-02 18:18+0000\n" +"Last-Translator: Carlos Lisboa <carloslisboa@gmail.com>\n" +"Language-Team: Portuguese <traduz@debianpt.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "URL:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "" +"Insert the URL to the sitesummary collector, where should the sitesummary " +"information be submitted. Several URLs can be specified separated by space." +msgstr "" +"Introduza o URL do colector do sitesummary onde deverá ser submetida a " +"informação do sitesummary. Diversos URL podem ser especificados, separados " +"por um espaço." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "O URL por omissão é http://localhost/cgi-bin/sitesummary-collector.cgi" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "Site:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "" +"Insira a 'string' que identifica o site onde está localizada a máquina." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "Grupo de site:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "" +"Insert a string identifying the subgroup within the site where this machine " +"is located." +msgstr "" +"Insira a 'string' que identifica o sub-grupo dentro do site onde esta " +"máquina está localizada." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "Classe de Hospedeiro:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "" +"Insert string identifying the host class, like workstation, server, laptop, " +"thin client etc." +msgstr "" +"Insira a frase que identifica a classe do hospedeiro, como 'workstation', " +"'server', 'laptop', 'thin client', etc." diff --git a/sitesummary/debian/po/ru.po b/sitesummary/debian/po/ru.po new file mode 100644 index 0000000..423b1ea --- /dev/null +++ b/sitesummary/debian/po/ru.po @@ -0,0 +1,85 @@ +# translation of sitesummary_0.0.48_ru.po to Russian +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Yuri Kozlov <yuray@komyakino.ru>, 2009. +msgid "" +msgstr "" +"Project-Id-Version: sitesummary 0.0.48\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: 2009-08-16 09:24+0400\n" +"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n" +"Language-Team: Russian <debian-l10n-russian@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "URL:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "" +"Insert the URL to the sitesummary collector, where should the sitesummary " +"information be submitted. Several URLs can be specified separated by space." +msgstr "" +"Введите URL сборщика информации sitesummary, на который нужно " +"отправлять информацию. Можно указать несколько URL через пробел." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "URL по умолчанию: http://localhost/cgi-bin/sitesummary-collector.cgi" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "Рабочее место:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "Введите строку, обозначающую место, где расположена эта машина." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "Группа рабочего места:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "" +"Insert a string identifying the subgroup within the site where this machine " +"is located." +msgstr "" +"Введите строку, обозначающую подгруппу места, " +"где расположена эта машина." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "Тип машины:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "" +"Insert string identifying the host class, like workstation, server, laptop, " +"thin client etc." +msgstr "" +"Введите строку, обозначающую тип машины, например: рабочая " +"станция, сервер, ноутбук, тонкий клиент и т.д." + diff --git a/sitesummary/debian/po/sk.po b/sitesummary/debian/po/sk.po new file mode 100644 index 0000000..eff2812 --- /dev/null +++ b/sitesummary/debian/po/sk.po @@ -0,0 +1,71 @@ +# Slovak translation of tzdata debconf template. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the udev package. +# Ivan Masár <helix84@centrum.sk>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: sitesummary\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: 2009-06-13 11:38+0100\n" +"Last-Translator: Ivan Masár <helix84@centrum.sk>\n" +"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "URL:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "Insert the URL to the sitesummary collector, where should the sitesummary information be submitted. Several URLs can be specified separated by space." +msgstr "Zadajte URL zberača sitesummary, kam sa majú zasielať informácie sitesummary. Je možné uviesť niekoľko URL oddelených medzerou." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "Predvolené URL je http://localhost/cgi-bin/sitesummary-collector.cgi" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "Lokalita:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "Zadajte reťazec identifikujúci lokalitu stroja." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "Skupina lokalít:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Insert a string identifying the subgroup within the site where this machine is located." +msgstr "Zadajte reťazec identifikujúci podskupinu v rámci lokality, kde sa stroj nachádza." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "Trieda hostiteľa:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Insert string identifying the host class, like workstation, server, laptop, thin client etc." +msgstr "Zadajte reťazec identifijujúci triedu hostiteľa ako pracovná stanica, server, notebook, tenký klient atď." + diff --git a/sitesummary/debian/po/sv.po b/sitesummary/debian/po/sv.po new file mode 100644 index 0000000..759af09 --- /dev/null +++ b/sitesummary/debian/po/sv.po @@ -0,0 +1,80 @@ +# translation of sitesummary_0.0.43_sv.po to Swedish +# sitesummary. +# Copyright (C) 2008 +# This file is distributed under the same license as the sitesummary package. +# +# Martin Ågren <martin.agren@gmail.com>, 2008. +msgid "" +msgstr "" +"Project-Id-Version: sitesummary_0.0.43_sv\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: 2008-07-23 18:04+0200\n" +"Last-Translator: Martin Ågren <martin.agren@gmail.com>\n" +"Language-Team: Swedish <debian-l10n-swedish@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "URL:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "" +"Insert the URL to the sitesummary collector, where should the sitesummary " +"information be submitted. Several URLs can be specified separated by space." +msgstr "Ange URL:en till sitesummarys insamlare där sitesummary-information ska postas. Flera URL:er kan anges separerade med blanksteg." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "Standard-URL:en är http://localhost/cgi-bin/sitesummary-collector.cgi" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "Plats:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "Ange en sträng som identifierar den plats där maskinen är belägen." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "Platsgrupp:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "" +"Insert a string identifying the subgroup within the site where this machine " +"is located." +msgstr "Ange en sträng som identifierar den undergrupp inom platsen där den här maskinen är benägen." + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "Värdklass:" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "" +"Insert string identifying the host class, like workstation, server, laptop, " +"thin client etc." +msgstr "Ange en sträng som identifierar värdklassen, som exempelvis arbetsstation, server, bärbar, tunn klient etc." + diff --git a/sitesummary/debian/po/templates.pot b/sitesummary/debian/po/templates.pot new file mode 100644 index 0000000..6036f99 --- /dev/null +++ b/sitesummary/debian/po/templates.pot @@ -0,0 +1,77 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: debian-edu@lists.debian.org\n" +"POT-Creation-Date: 2007-04-29 00:52+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "URL:" +msgstr "" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "" +"Insert the URL to the sitesummary collector, where should the sitesummary " +"information be submitted. Several URLs can be specified separated by space." +msgstr "" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:1001 +msgid "The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi" +msgstr "" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Site:" +msgstr "" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:2001 +msgid "Insert a string identifying the site where this machine is located." +msgstr "" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "Sitegroup:" +msgstr "" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:3001 +msgid "" +"Insert a string identifying the subgroup within the site where this machine " +"is located." +msgstr "" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "Host class:" +msgstr "" + +#. Type: string +#. Description +#: ../sitesummary-client.templates:4001 +msgid "" +"Insert string identifying the host class, like workstation, server, laptop, " +"thin client etc." +msgstr "" diff --git a/sitesummary/debian/rules b/sitesummary/debian/rules new file mode 100755 index 0000000..0b7d1a3 --- /dev/null +++ b/sitesummary/debian/rules @@ -0,0 +1,14 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/class/makefile.mk +include /usr/share/cdbs/1/rules/debhelper.mk + +MAKE = make +DEB_DESTDIR = debian/tmp + +# No need to submit information when the package is installed +DEB_DH_INSTALLINIT_ARGS=--no-start +DEB_UPDATE_RCD_PARAMS_sitesummary-client=start 20 2 3 4 5 . + +common-install-indep:: + $(MAKE) install DESTDIR=$(DEB_DESTDIR) diff --git a/sitesummary/debian/sitesummary-client.config b/sitesummary/debian/sitesummary-client.config new file mode 100644 index 0000000..57ae90b --- /dev/null +++ b/sitesummary/debian/sitesummary-client.config @@ -0,0 +1,52 @@ +#!/bin/sh + +set -e + +# if we do not have debconf, we just skip this +. /usr/share/debconf/confmodule || exit 0 + +# Read the package default, need to match the code in sitesummary-client +[ -f /usr/share/sitesummary/sitesummary-client.conf ] && \ + . /usr/share/sitesummary/sitesummary-client.conf + +db_get sitesummary-client/collector_url +[ "$RET" ] && serverurls="$RET" + +for confdir in \ + /usr/share/sitesummary/config.d \ + /etc/sitesummary/config.d +do + [ -d $confdir ] || continue + for config in $confdir/* ; do + if [ -f $config ] ;then + . $config + updatedebconf=yes + fi + done +done + +db_set sitesummary-client/collector_url "$serverurls" + +db_input medium sitesummary-client/collector_url || true +db_go || true + +if [ -f /etc/sitesummary/site ] ; then + SITE="`cat /etc/sitesummary/site`" + db_set sitesummary-client/site "$SITE" +fi +db_input medium sitesummary-client/site || true +db_go || true + +if [ -f /etc/sitesummary/sitegroup ] ; then + SITEGROUP="`cat /etc/sitesummary/sitegroup`" + db_set sitesummary-client/sitegroup "$SITEGROUP" +fi +db_input medium sitesummary-client/sitegroup || true +db_go || true + +if [ -f /etc/sitesummary/hostclass ] ; then + HOSTCLASS="`cat /etc/sitesummary/hostclass`" + db_set sitesummary-client/hostclass "$HOSTCLASS" +fi +db_input medium sitesummary-client/hostclass || true +db_go || true diff --git a/sitesummary/debian/sitesummary-client.cron.daily b/sitesummary/debian/sitesummary-client.cron.daily new file mode 100644 index 0000000..5a94bed --- /dev/null +++ b/sitesummary/debian/sitesummary-client.cron.daily @@ -0,0 +1,36 @@ +#!/bin/sh +# +# Author: Petter Reinholdtsen + +[ -x /usr/sbin/sitesummary-client ] || exit 0 + +# Read the package default. Make sure this is identical to the code +# in sitesummar-client +[ -f /usr/share/sitesummary/sitesummary-client.conf ] && \ + . /usr/share/sitesummary/sitesummary-client.conf +for confdir in \ + /usr/share/sitesummary/config.d \ + /etc/sitesummary/config.d +do + [ -d $confdir ] || continue + for config in $confdir/* ; do + [ -f $config ] && . $config + done +done + +# Sleep a random number of seconds to avoid all clients connecting to +# the server at the same time. Based on code from the cron-apt +# package. +if [ -n "$runsleep" ] ; then + if [ $runsleep -gt 0 ] ; then + if [ -z "$RANDOM" ] ; then + # A fix for shells that do not have this bash feature. + RANDOM=$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -c"1-5") + fi + TIME=$(($RANDOM % $runsleep)) + sleep $TIME + fi +fi + +# Run once a day to report the whereabouts of the machine +nice /usr/sbin/sitesummary-client diff --git a/sitesummary/debian/sitesummary-client.dirs b/sitesummary/debian/sitesummary-client.dirs new file mode 100644 index 0000000..4000afd --- /dev/null +++ b/sitesummary/debian/sitesummary-client.dirs @@ -0,0 +1 @@ +/etc/sitesummary diff --git a/sitesummary/debian/sitesummary-client.init b/sitesummary/debian/sitesummary-client.init new file mode 100644 index 0000000..4c87558 --- /dev/null +++ b/sitesummary/debian/sitesummary-client.init @@ -0,0 +1,42 @@ +#!/bin/sh +### BEGIN INIT INFO +# provides: sitesummary-client +# required-start: $network $remote_fs $syslog +# required-stop: +# Default-Start: 2 3 4 5 +# Default-Stop: +# Short-Description: Report status to sitesummary server after boot +# Description: Report to sitesummary server 5 minutes +# after the machine boots normally (not in single user) +### END INIT INFO + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +CLIENT=/usr/sbin/sitesummary-client +REPORTDELAY=300 + +# Use proxy setting if present +if [ -f /etc/environment ] ; then + . /etc/environment + export http_proxy +fi + +[ -f /etc/default/sitesummary-client ] && . /etc/default/sitesummary-client + +test -x $CLIENT || exit 0 + +case "$1" in + start) + ( sleep $REPORTDELAY ; nice $CLIENT ) < /dev/null > /dev/null 2>&1 & + ;; + stop|reload|force-reload|restart) + ;; + status) + exit 3 # Not really a service, so it is not running + ;; + *) + echo "Usage: /etc/init.d/sitesummary-client {start|stop|restart|force-reload|reload|status}" + exit 1 + ;; +esac + +exit 0 diff --git a/sitesummary/debian/sitesummary-client.install b/sitesummary/debian/sitesummary-client.install new file mode 100644 index 0000000..aa51d89 --- /dev/null +++ b/sitesummary/debian/sitesummary-client.install @@ -0,0 +1,6 @@ +debian/tmp/etc/nagios +debian/tmp/usr/lib/sitesummary/collect.d +debian/tmp/usr/lib/sitesummary/nagios-plugins +debian/tmp/usr/sbin/sitesummary-client +debian/tmp/usr/sbin/sitesummary-upload +debian/tmp/usr/share/sitesummary/sitesummary-client.conf diff --git a/sitesummary/debian/sitesummary-client.postinst b/sitesummary/debian/sitesummary-client.postinst new file mode 100644 index 0000000..0ad7cc0 --- /dev/null +++ b/sitesummary/debian/sitesummary-client.postinst @@ -0,0 +1,107 @@ +#!/bin/sh + +set -e + +. /usr/share/debconf/confmodule + +case "$1" in + configure) + PREV_VER=$2 + ;; + abort-upgrade|abort-remove|abort-deconfigure) + exit 0 + ;; +esac + +# Read the package default, need to match the code in sitesummary-client +[ -f /usr/share/sitesummary/sitesummary-client.conf ] && \ + . /usr/share/sitesummary/sitesummary-client.conf +for confdir in \ + /usr/share/sitesummary/config.d \ + /etc/sitesummary/config.d +do + [ -d $confdir ] || continue + for config in $confdir/* ; do + [ -f $config ] && . $config + done +done + +db_get sitesummary-client/collector_url +URL="$RET" + +# Only update the URLs if it is different from the current value +if [ "$URL" != "$serverurls" ] ; then + if [ -f /etc/sitesummary/config.d/00debconf ] ; then + if grep -q '^serverurls=' /etc/sitesummary/config.d/00debconf ; then + sed "s%^serverurls=.*\$%serverurls=\"$URL\"%" < /etc/sitesummary/config.d/00debconf > /etc/sitesummary/config.d/00debconf.new && mv /etc/sitesummary/config.d/00debconf.new /etc/sitesummary/config.d/00debconf + else + echo "serverurls=\"$URL\"/" >> /etc/sitesummary/config.d/00debconf + fi + else + mkdir -p /etc/sitesummary/config.d + echo "serverurls=\"$URL\"" > /etc/sitesummary/config.d/00debconf + fi +fi + +db_get sitesummary-client/site +SITE="$RET" +# Only replace the site file if the content changed +if [ -f /etc/sitesummary/site ] ; then + OLDSITE="`cat /etc/sitesummary/site`" + if [ "$SITE" != "$OLDSITE" ] ; then + echo "$SITE" > /etc/sitesummary/site + fi +else + echo "$SITE" > /etc/sitesummary/site +fi + +db_get sitesummary-client/sitegroup +SITEGROUP="$RET" +# Only replace the sitegroup file if the content changed +if [ -f /etc/sitesummary/sitegroup ] ; then + OLDSITEGROUP="`cat /etc/sitesummary/sitegroup`" + if [ "$SITEGROUP" != "$OLDSITEGROUP" ] ; then + echo "$SITEGROUP" > /etc/sitesummary/sitegroup + fi +else + echo "$SITEGROUP" > /etc/sitesummary/sitegroup +fi + +db_get sitesummary-client/hostclass +HOSTCLASS="$RET" +# Only replace the hostclass file if the content changed +if [ -f /etc/sitesummary/hostclass ] ; then + OLDHOSTCLASS="`cat /etc/sitesummary/hostclass`" + if [ "$HOSTCLASS" != "$OLDHOSTCLASS" ] ; then + echo "$HOSTCLASS" > /etc/sitesummary/hostclass + fi +else + echo "$HOSTCLASS" > /etc/sitesummary/hostclass +fi + +config=/etc/nagios/nrpe.d/sitesummary-nrpe.cfg +if [ ! -f $config ] ; then + db_get sitesummary-client/enable-nagios-nrpe-config + if [ true = "$RET" ] ; then + mkdir -p $(dirname $config) + cat > $config <<EOF +dont_blame_nrpe=1 +include=/etc/nagios/sitesummary-nrpe-commands.cfg +EOF + db_get sitesummary-client/nagios-server + if [ "$RET" ] ; then + echo "allowed_hosts=$RET" >> $config + fi + fi +fi + +db_stop + +# Switched from cron.d to cron.daily script in version 0.0.12 +if dpkg --compare-versions "$PREV_VER" lt "0.0.12" && \ + [ -f /etc/cron.d/sitesummary-client ] +then + rm -f /etc/cron.d/sitesummary-client +fi + +#DEBHELPER# diff --git a/sitesummary/debian/sitesummary-client.postrm b/sitesummary/debian/sitesummary-client.postrm new file mode 100644 index 0000000..5961b73 --- /dev/null +++ b/sitesummary/debian/sitesummary-client.postrm @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +if [ "$1" = "purge" ] ; then + ( + cd /etc/sitesummary + rm -f config.d/00debconf + rm -f hostclass site sitecontact sitegroup + rmdir config.d 2>/dev/null || true + ) +fi + +#DEBHELPER# diff --git a/sitesummary/debian/sitesummary-client.templates b/sitesummary/debian/sitesummary-client.templates new file mode 100644 index 0000000..92099ba --- /dev/null +++ b/sitesummary/debian/sitesummary-client.templates @@ -0,0 +1,37 @@ +Template: sitesummary-client/collector_url +Type: string +_Description: URL: + Insert the URL to the sitesummary collector, where should the + sitesummary information be submitted. Several URLs can be specified + separated by space. + . + The default URL is http://localhost/cgi-bin/sitesummary-collector.cgi + +Template: sitesummary-client/site +Type: string +_Description: Site: + Insert a string identifying the site where this machine is located. + +Template: sitesummary-client/sitegroup +Type: string +_Description: Sitegroup: + Insert a string identifying the subgroup within the site where this + machine is located. + +Template: sitesummary-client/hostclass +Type: string +_Description: Host class: + Insert string identifying the host class, like workstation, server, + laptop, thin client etc. + +Template: sitesummary-client/enable-nagios-nrpe-config +Type: boolean +Default: false +Description: Activate the Nagios NRPE config feature? + This is an internal (hidden) debconf question. It should not be translated. + +Template: db_get sitesummary-client/nagios-server +Type: string +Description: Host name of nagios server allowed to contact NRPE: + This is an internal (hidden) debconf question. It should not be translated. + diff --git a/sitesummary/debian/sitesummary.cron.daily b/sitesummary/debian/sitesummary.cron.daily new file mode 100755 index 0000000..ee63ac9 --- /dev/null +++ b/sitesummary/debian/sitesummary.cron.daily @@ -0,0 +1,39 @@ +#!/bin/sh +# +# Author: Petter Reinholdtsen + +set -e + +daylimit=120 +makewebreport=/usr/sbin/sitesummary-makewebreport +nodes=/usr/sbin/sitesummary-nodes + +[ -f /etc/sitesummary/collector.cfg ] && . /etc/sitesummary/collector.cfg + +# Exit imediately if the package is removed but nor purged +if [ ! -x $nodes ] ; then + exit 0 +fi + +# The storage area is not configurable, because too many scripts have +# it hardcoded +entriesdir=/var/lib/sitesummary/entries + +remove_old_entries() { + find $entriesdir/. -mindepth 1 -maxdepth 1 -type d \ + -daystart -mtime +$daylimit \ + -exec /usr/lib/sitesummary/expire-entry '{}' \; +} + +[ -d $entriesdir ] && remove_old_entries + +if [ -x /usr/sbin/sitesummary-update-nagios ] ; then + /usr/sbin/sitesummary-update-nagios +fi + +if [ -x /usr/sbin/sitesummary-update-munin ] ; then + /usr/sbin/sitesummary-update-munin +fi + +# Update the web report once a day +[ -x $makewebreport ] && nice $makewebreport diff --git a/sitesummary/debian/sitesummary.install b/sitesummary/debian/sitesummary.install new file mode 100644 index 0000000..71c26e3 --- /dev/null +++ b/sitesummary/debian/sitesummary.install @@ -0,0 +1,12 @@ +debian/tmp/etc/apache2 +debian/tmp/etc/nagios3 +debian/tmp/usr/lib/cgi-bin +debian/tmp/usr/lib/sitesummary/*-summary +debian/tmp/usr/lib/sitesummary/expire-entry +debian/tmp/usr/sbin/sitesummary-makewebreport +debian/tmp/usr/sbin/sitesummary-nodes +debian/tmp/usr/sbin/sitesummary-update-munin +debian/tmp/usr/sbin/sitesummary-update-nagios +debian/tmp/usr/share/munin/plugins +debian/tmp/usr/share/perl5 +debian/tmp/var/lib/sitesummary diff --git a/sitesummary/debian/sitesummary.postinst b/sitesummary/debian/sitesummary.postinst new file mode 100644 index 0000000..c1c82b9 --- /dev/null +++ b/sitesummary/debian/sitesummary.postinst @@ -0,0 +1,96 @@ +#!/bin/sh + +set -e + +# Source debconf library. +. /usr/share/debconf/confmodule + +test_nagios() { + if grep -q '^NAGIOSCFG="/etc/nagios3/sitesummary.cfg"$' "$config"; then + : + else + db_get sitesummary/enable-nagios-config + if [ true = "$RET" ] ; then + mkdir -p $(dirname $config) + echo 'NAGIOSCFG="/etc/nagios3/sitesummary.cfg"' \ + >> /etc/default/nagios3 + if [ ! -f /var/lib/sitesummary/nagios-generated.cfg ] ; then + # Create dummy file to make sure nagios will start + # on first boot if sitesummary is installed using + # debian-installer + cat > /var/lib/sitesummary/nagios-generated.cfg <<EOF +define host { + use server-host + host_name localhost + address localhost +} + +define service { + use server-service + host_name localhost + service_description ping + check_command check_ping!100.0,20%!500.0,60% +} +EOF + fi + fi + fi +} + +case "$1" in + configure) + + # Adjust to the new config location, in + # /etc/apache2/conf.d/sitesummary + if [ -f /etc/apache2/sites-available/sitesummary ] ; then + if [ -f /etc/apache2/sites-enabled//sitesummary ] && + [ -x /usr/sbin/a2dissite ] ; then + a2dissite sitesummary + fi + rm /etc/apache2/sites-available/sitesummary + fi + + # Make sure the cgi script can write to the storage area + chown www-data /var/lib/sitesummary/tmpstorage \ + /var/lib/sitesummary/entries + + # If the config file is missing, check debconf to see if the + # munin configuration feature should be enabled. This hidden + # debconf question allow preseeding during installation. + config=/etc/sitesummary/collector.cfg + if [ ! -f $config ] ; then + db_get sitesummary/replace-munin-config + if [ true = "$RET" ] ; then + echo 'MUNINDIR=/etc/munin' > $config + fi + fi + + config=/etc/default/nagios3 + if [ -f "$config" ] ; then + test_nagios + fi + + # Generate the web page at install time + [ -f /var/lib/sitesummary/www/index.html ] || \ + /etc/cron.daily/sitesummary + + # Get rid of incorrect runlevel settings during upgrades + if dpkg --compare-versions "$2" lt "0.0.50"; then + update-rc.d -f sitesummary-client remove >/dev/null 2>&1 || : + fi + + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +#DEBHELPER# + +exit 0 diff --git a/sitesummary/debian/sitesummary.postrm b/sitesummary/debian/sitesummary.postrm new file mode 100755 index 0000000..ec8b491 --- /dev/null +++ b/sitesummary/debian/sitesummary.postrm @@ -0,0 +1,12 @@ +#!/bin/sh + +set -e + +if [ "$1" = "purge" ] ; then + cd /var/lib/sitesummary + rm -rf entries tmpstorage www + rm -f munin.conf munin.conf.pre munin.conf.post + rm -f nagios-generated.cfg +fi + +#DEBHELPER# diff --git a/sitesummary/debian/sitesummary.templates b/sitesummary/debian/sitesummary.templates new file mode 100644 index 0000000..aa279d7 --- /dev/null +++ b/sitesummary/debian/sitesummary.templates @@ -0,0 +1,12 @@ +Template: sitesummary/replace-munin-config +Type: boolean +Default: false +Description: Activate the munin config replacement feature? + This is an internal (hidden) debconf question. It should not be translated. + +Template: sitesummary/enable-nagios-config +Type: boolean +Default: false +Description: Activate the Nagios autoconfig feature? + This is an internal (hidden) debconf question. It should not be translated. + diff --git a/sitesummary/debian_edu-summary b/sitesummary/debian_edu-summary new file mode 100755 index 0000000..10e55d6 --- /dev/null +++ b/sitesummary/debian_edu-summary @@ -0,0 +1,32 @@ +#!/usr/bin/perl -w + +use strict; + +use SiteSummary; +my %profiles; +my %versions; + +for_all_hosts(\&handle_host); + +print_summary(); + +exit 0; + +sub handle_host { + my $hostid = shift; + my $profile = get_debian_edu_profile($hostid); + my $version = get_debian_edu_ver($hostid); + $profiles{$profile}++ if (defined $profile); + $versions{$version}++ if (defined $version); +} + +sub print_summary { + printf(" %-30s %5s\n", "debian-edu-profile", "count"); + foreach ( keys %profiles ) { + printf(" %30s %5s\n", $_ || "n/a", $profiles{$_}); + } + printf(" %-30s %5s\n", "debian-edu-version", "count"); + foreach ( keys %versions ) { + printf(" %30s %5s\n", $_ || "n/a", $versions{$_}); + } +} diff --git a/sitesummary/expire-entry b/sitesummary/expire-entry new file mode 100755 index 0000000..6548ed7 --- /dev/null +++ b/sitesummary/expire-entry @@ -0,0 +1,17 @@ +#!/bin/sh +# +# Expire an sitesummary entry, calling the expire hooks first and then +# remove the entry. + +set -e + +entrydir="$1" + +logger -t sitesummary "Expiring sitesummary entry in $entrydir" + +expiredir=/usr/lib/sitesummary/expire.d +if [ -d "$expiredir" ] ; then + run-parts --arg="$entrydir" $expiredir +fi + +rm -rf "$entrydir" diff --git a/sitesummary/hardware-model-summary b/sitesummary/hardware-model-summary new file mode 100755 index 0000000..383ac29 --- /dev/null +++ b/sitesummary/hardware-model-summary @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use SiteSummary; +use Getopt::Std; + +my %vendors; +my %models; +my %hostmap; +my %modelmap; +my %opts; + +sub usage { + my $retval = shift; + print <<EOF; +Usage: $0 [-l] + -l list hosts with the given vendor/model +EOF + exit $retval; +} + +getopt("l", \%opts) || usage(1); + +for_all_hosts(\&handle_host); + +print_summary(); + +sub handle_host { + my $hostid = shift; + #print "$hostid\n"; + my ($vendor, $model, undef) = get_hardware_info($hostid); + $vendor = "[no-dmi-info]" unless defined $vendor; + $vendors{$vendor}++; + if ($model) { + $models{$vendor}{$model}++; + if (exists $modelmap{$vendor} && exists $modelmap{$vendor}{$model}) { + push @{$modelmap{$vendor}{$model}}, $hostid ; + } else { + $modelmap{$vendor}{$model} = [$hostid]; + } + } else { + if (exists $hostmap{$vendor}) { + push @{$hostmap{$vendor}}, $hostid ; + } else { + $hostmap{$vendor} = [$hostid]; + } + } +} + +sub print_summary { + printf(" %-25s %5s\n", "vendor", "count"); + for my $vendor (sort keys %vendors) { + printf(" %-25s %5d\n", $vendor, $vendors{$vendor}); + if (exists $opts{l}) { + if (exists $hostmap{$vendor}) { + for my $hostid (sort @{$hostmap{$vendor}}) { + my $hostname = get_hostname($hostid); + my ($vendor, $model, undef) = get_hardware_info($hostid); + $vendor = "[unknown]" unless defined $vendor; + $model = "" unless defined $model; + printf " %s %s/%s %s\n", $hostname, $vendor, $model, $hostid; + } + } + } + for my $model (sort keys %{$models{$vendor}}) { + printf(" %-23s %5d\n", $model, $models{$vendor}{$model}); + if (exists $opts{l}) { + for my $hostid (sort @{$modelmap{$vendor}{$model}}) { + my $hostname = get_hostname($hostid); + my ($vendor, $model, undef) = get_hardware_info($hostid); + printf " %s %s/%s %s\n", $hostname, $vendor, $model, $hostid; + } + } + } + } +} diff --git a/sitesummary/hostclass-summary b/sitesummary/hostclass-summary new file mode 100755 index 0000000..c62615c --- /dev/null +++ b/sitesummary/hostclass-summary @@ -0,0 +1,28 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use SiteSummary; + +my %hostclasses; + +for_all_hosts(\&handle_host); + +print_summary(); + +sub handle_host { + my $hostid = shift; + #print "$hostid\n"; + for my $hostclass (get_hostclass($hostid)) { + $hostclass = "" unless defined $hostclass; + $hostclasses{$hostclass}++; + } +} + +sub print_summary { + printf(" %-20s %5s\n", "hostclass", "count"); + for my $hostclass (sort keys %hostclasses) { + printf(" %-20s %5d\n", $hostclass, $hostclasses{$hostclass}); + } +} diff --git a/sitesummary/kernelversion-summary b/sitesummary/kernelversion-summary new file mode 100755 index 0000000..71e7870 --- /dev/null +++ b/sitesummary/kernelversion-summary @@ -0,0 +1,53 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use SiteSummary; +use Getopt::Std; + +my %kernelvers; +my %opts; + +sub usage { + my $retval = shift; + print <<EOF; +Usage: $0 [-l] + -l list hosts using the given kernel versions +EOF + exit $retval; +} + +getopt("l", \%opts) || usage(1); + +for_all_hosts(\&handle_host); + +print_summary(); + +sub handle_host { + my $hostid = shift; + #print "$hostid\n"; + for my $kver (get_linux_kernel_ver($hostid)) { + $kver = "" unless defined $kver; + if (exists $kernelvers{$kver}) { + push @{$kernelvers{$kver}}, $hostid ; + } else { + $kernelvers{$kver} = [$hostid]; + } + } +} + +sub print_summary { + printf(" %-20s %5s\n", "kernel", "count"); + for my $kver (sort keys %kernelvers) { + printf(" %-20s %5d\n", $kver, scalar @{$kernelvers{$kver}}); + if (exists $opts{l}) { + for my $hostid (sort @{$kernelvers{$kver}}) { + my $hostname = get_hostname($hostid); + my $site = get_site($hostid) || ""; + my $sitegroup = get_sitegroup($hostid) || ""; + printf " %s %s/%s %s\n", $hostname, $site, $sitegroup, $hostid; + } + } + } +} diff --git a/sitesummary/munin-plugin b/sitesummary/munin-plugin new file mode 100755 index 0000000..a0899db --- /dev/null +++ b/sitesummary/munin-plugin @@ -0,0 +1,66 @@ +#!/usr/bin/perl +# +# Graph site counts from SiteSummary +# +# Magick markers (optional): +#%# family=auto +#%# capabilities=autoconf + +use strict; +use warnings; + +use SiteSummary; + +my %sitelabels; + +if (!$ARGV[0]) { + for_all_hosts(\&handle_host); + # List values in the opposit order of the configuration order, to + # try to get the same order on the graphs and the values. + for my $sitelabel (sort { $b cmp $a } keys %sitelabels) { + my $key = label2key($sitelabel); + print "$key.value ", $sitelabels{$sitelabel}, "\n"; + } +} elsif ($ARGV[0] eq "config") { + for_all_hosts(\&handle_host); + print "graph_title SiteSummary History\n"; + print "graph_order " . join(" ", sort keys %sitelabels), "\n"; + print "graph_vlabel count\n"; + print "graph_scale yes\n"; + print "graph_height 400\n"; + print "graph_category SiteSummary\n"; + + my $first = 1; + for my $sitelabel (sort keys %sitelabels) { + my $key = label2key($sitelabel); + print "$key.label $sitelabel\n"; + if ($first) { + print "$key.draw AREA\n"; + } else { + print "$key.draw STACK\n"; + } + $first = 0; + } +} elsif ($ARGV[0] eq "autoconf") { + # This module is only available when the sitesummary collector is + # installed too, thus we always answer yes. + print "yes\n"; + exit 0; +} + +sub label2key { + my $label = shift; + $label =~ s/[^a-zA-Z0-9_]+/_/g; + $label =~ s/^_+//; + return $label; +} + +sub handle_host { + my $hostid = shift; + for my $site (get_site($hostid)) { + $site = "SiteMissing" unless defined $site; + $sitelabels{$site}++; + } +} + +exit 0; diff --git a/sitesummary/munin-plugin-agesinceseen b/sitesummary/munin-plugin-agesinceseen new file mode 100755 index 0000000..0d83291 --- /dev/null +++ b/sitesummary/munin-plugin-agesinceseen @@ -0,0 +1,72 @@ +#!/usr/bin/perl +# +# Graph agesinceseen range counts from SiteSummary +# +# Based on bourne shell module written by Snorre Jensen. Rewritten to +# perl to be able to use the SiteSummary perl module by Petter +# Reinholdtsen. +# License: GNU General Public License +# +# Magick markers (optional): +#%# family=auto +#%# capabilities=autoconf + +use strict; +use warnings; + +use SiteSummary; + +my %counts; + +my %agegroups = get_age_groups(); +my @order = map { $agegroups{$_}; } sort { $a <=> $b } keys %agegroups; + +sub label2key { + my $label = shift; + $label =~ s/[^a-zA-Z0-9_]+/_/g; + $label =~ s/^_+//; + return $label; +} + +if (!$ARGV[0]) { + for_all_hosts(\&handle_host); + + for my $label (@order) { + my $key = label2key($label); + print "$key.value ", defined $counts{$label} ? $counts{$label} : 0 , "\n"; + } +} elsif ($ARGV[0] eq "config") { + print "graph_title SiteSummary AgeSinceSeen\n"; + print "graph_order ", join(" ", map { label2key($_); } @order), "\n"; + print "graph_vlabel count\n"; + print "graph_scale yes\n"; + print "graph_args --base 1000 -l 0\n"; + print "graph_height 400\n"; + print "graph_category SiteSummary\n"; + + my $first = 1; + for my $label (@order) { + my $key = label2key($label); + if ($first) { + print "$key.draw AREA\n"; + $first = 0; + } else { + print "$key.draw STACK\n"; + } + print "$key.label $label\n"; + } +} elsif ($ARGV[0] eq "autoconf") { + # This module is only available when the sitesummary collector is + # installed too, thus we always answer yes. + print "yes\n"; + exit 0; +} + +sub handle_host { + my $hostid = shift; + my %agegroups = get_age_groups(); + my $agegroup = get_age_group($hostid); + $counts{$agegroups{$agegroup}}++; +} + +exit 0; diff --git a/sitesummary/nagios-nrpe-commands.cfg b/sitesummary/nagios-nrpe-commands.cfg new file mode 100644 index 0000000..11e5ccf --- /dev/null +++ b/sitesummary/nagios-nrpe-commands.cfg @@ -0,0 +1,19 @@ +# +# NRPE commands used by sitesummary generated Nagios checks. +# +command[check_apt]=/usr/lib/nagios/plugins/check_apt +command[check_dhcp]=/usr/lib/nagios/plugins/check_dhcp +command[check_disk]=/usr/lib/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$ +command[check_etc_hosts]=/usr/lib/sitesummary/nagios-plugins/check_etc_hosts +command[check_etc_resolv]=/usr/lib/sitesummary/nagios-plugins/check_etc_resolv +command[check_ftp]=/usr/lib/nagios/plugins/check_ftp -H localhost +command[check_kernel_status]=/usr/lib/sitesummary/nagios-plugins/check_kernel_status +command[check_linux_raid]=/usr/lib/nagios/plugins/check_linux_raid +command[check_nfs]=/usr/lib/nagios/plugins/check_rpc -H localhost -C nfs -c2,3 +command[check_ntp]=/usr/lib/nagios/plugins/check_ntp -H localhost +command[check_procs]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ +command[check_procs_cron]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -C cron +command[check_procs_zombie]=/usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -s Z +command[check_shutdown]=/usr/lib/sitesummary/nagios-plugins/check_shutdown +command[check_smtp]=/usr/lib/nagios/plugins/check_smtp -H localhost +command[check_swap]=/usr/lib/nagios/plugins/check_swap -w $ARG1 -c $ARG2$ diff --git a/sitesummary/nagios-plugins/check_cups_queue b/sitesummary/nagios-plugins/check_cups_queue new file mode 100755 index 0000000..859a10a --- /dev/null +++ b/sitesummary/nagios-plugins/check_cups_queue @@ -0,0 +1,195 @@ +#!/bin/bash +# CUPS print queue plugin for Nagios +# Written by John E. Vincent (nagios-plugs@lusis.org) +# Last Modified: 06-27-2006 +# License: GNU General Public License, according to +# <c841561b1002182124g7ca4e8fbme6574b3a558acc80@mail.gmail.com> +# on debian-edu@lists.debian.org +# +# Description: +# +# This plugin will check the status of a remote CUPS +# print queue. It will provide the size of the queue +# and optionally the age of the queue +# + +# Location of the lpstat command (if not in path) +LPSTAT="/usr/bin/lpstat" + + + + +# Don't change anything below here + +# Nagios return codes +STATE_OK=0 +STATE_WARNING=1 +STATE_CRITICAL=2 +STATE_UNKNOWN=3 +STATE_DEPENDENT=4 + +if [ ! -x "$LPSTAT" ] +then + echo "UNKNOWN: $LPSTAT not found or is not executable by the nagios user" + exitstatus=$STATE_UNKNOWN + exit $exitstatus +fi + +PROGNAME=`basename $0` + +print_usage() { + echo "Usage: $PROGNAME -H <hostname> -T <s|b> -w <size warning level> -c <size critical level> -a <max age>" + echo "" + echo "Notes:" + echo "-H: Hostname - Can be a hostname or IP address" + echo "-T: Type of check - Can be queue size (s) or both queu size and queue age (b)" + echo "-w: WARNING level for queue size" + echo "-c: CRITICAL level for queue size" + echo "-a: Max age of queue. Returns CRITICAL if jobs exists older than <max age> days" + echo "" +} + +print_help() { + print_usage + echo "" + echo "This plugin will check the CUPS print queue on a remote (or local with -H localhost) CUPS server." + echo "It can check both the size of the queue and the age of the oldest print job in the queue." + echo "-w and -c are for reporting warning and critical levels of the queue size." + echo "-a is optional for specifying the max age of a job in the print queue. Anything older thatn <max age>" + echo "will return a CRITICAL" + echo "" + exit 0 +} + +check_queue_size() +{ + if [ "$JOBCOUNT" -ge "$critlevel" ] + then + MESSAGE="CRITICAL: CUPS queue size - $JOBCOUNT| $PERFDATA" + exitstatus=$STATE_CRITICAL + elif [ "$JOBCOUNT" -ge "$warnlevel" ] + then + MESSAGE="WARNING: CUPS queue size - $JOBCOUNT| $PERFDATA" + exitstatus=$STATE_WARNING + else + MESSAGE="OK: CUPS queue size - $JOBCOUNT| $PERFDATA" + exitstatus=$STATE_OK + fi +} + +if [ $# -lt 4 ]; then + print_usage + exit $STATE_UNKNOWN +fi + +exitstatus=$STATE_UNKNOWN #default + +while test -n "$1"; do + case "$1" in + --help) + print_help + exit $STATE_OK + ;; + -h) + print_help + exit $STATE_OK + ;; + -H) + hostname=$2 + shift + ;; + -T) + testtype=$2 + shift + ;; + -w) + warnlevel=$2 + shift + ;; + -c) + critlevel=$2 + shift + ;; + -a) + maxage=$2 + shift + ;; + esac + shift +done + +# Check arguments for validity +if [ -z $hostname ] +then + echo "You must specify a hostname (or localhost to test the local system)" + print_usage + exitstatus=$STATE_UNKNOWN + exit $exitstatus +fi + +if [[ -z $critlevel || -z $warnlevel ]] # Did we get warn and crit values? +then + echo "You must specify a warning and critical level" + print_usage + exitstatus=$STATE_UNKNOWN + exit $exitstatus +elif [ $critlevel -lt $warnlevel ] # Do the warn/crit values make sense? +then + echo "CRITICAL value of $critlevel is less than WARNING level of $warnlevel" + print_usage + exitstatus=$STATE_UNKNOWN + exit $exitstatus +fi + +if [ -z $testtype ] # We require a test type +then + echo "You must specify a test type" + print_usage + exitstatus=$STATE_UNKNOWN + exit $exitstatus +elif [[ "$testtype" = [b]* && -z $maxage ]] +then + echo "You must specify <max age> when using a test type of 'b'" + print_usage + exitstatus=$STATE_UNKNOWN + exit $exitstatus +else + + JOBTMP=`mktemp -t lpstat.XXXXXX` # Create a tmpfile to store the lpstat results + STALEJOBCOUNT=0 # default number of old jobs + CURDATETS=`date +%s` # Get the current date as unixtime + $LPSTAT -h $hostname -o > $JOBTMP # run the lpstat command against the host. + if [ $? -ne 0 ] + then + rm -rf $JOBTMP + echo "UNKNOWN: lpstat command returned an error. Please test this script manually." + exitstatus=$STATE_UNKNOWN + exit $exitstatus + fi + JOBCOUNT=`wc -l < $JOBTMP` # populate the jobcount + PERFDATA="print_jobs=$JOBCOUNT;$warnlevel;$critlevel;0" + if [[ "$JOBCOUNT" -gt 0 && $maxage ]] + then + MAXAGETS=`echo "86400 * $maxage" | bc` # 86400 seconds in a day * maxage + exec<$JOBTMP # read the file to determine job age + while read PRINTJOB + do + JOBDATE=`echo $PRINTJOB | awk '{ print $4, $5, $6, $7, $8 }'` # Grab the job date from the job listing + JOBDATETS=`date --date="$JOBDATE" +%s` # Convert the job date to unixtime + DATEDIFF=`echo "($CURDATETS - $JOBDATETS)" | bc` + if [ $DATEDIFF -gt $MAXAGETS ] + then + MESSAGE="CRITICAL: Some CUPS jobs are older than $maxage days| $PERFDATA" + exitstatus=$STATE_CRITICAL + else + check_queue_size + fi + done + else + check_queue_size + fi + rm -rf $JOBTMP +fi + +echo $MESSAGE +exit $exitstatus diff --git a/sitesummary/nagios-plugins/check_etc_hosts b/sitesummary/nagios-plugins/check_etc_hosts new file mode 100755 index 0000000..b7f7268 --- /dev/null +++ b/sitesummary/nagios-plugins/check_etc_hosts @@ -0,0 +1,247 @@ +#!/usr/bin/perl -w +# +# Author: Petter Reinholdtsen <pere@hungry.com> +# Date: 2002-07-08 +# +# Check /etc/hosts, and make sure the content matches the information +# in DNS. Lookup IP, and check if the names listed in /etc/hosts +# maches the one in DNS. + +use vars qw($use_perl_resolver $debug $returnvalue $nagiosmsg); + +$debug = 0; +$returnvalue = 0; # all ok +$nagiosmsg = ""; + +# Report missing reverse lookup. This will ignore CNAME entries +# pointing to the IP address, and report error in these cases. +$use_reverse = 0; + +# Report missing forward-lookup. This will complain on private +# network IP addresses using the same name as a DNS entry. +$use_forward = 1; + +eval 'use Net::DNS;'; +if ($@) { + print "Using /etc/hosts\n" if $debug; + $use_perl_resolver = 0; +} else { + print "Using Net::DNS\n" if $debug; + $use_perl_resolver = 1; +} + +$host = '/usr/bin/host'; + +# Look up ip address, and return ($error status, @DNS names, @DNS addresses) +sub dns_lookup_ext { + local $address = shift; + + # Stupid Tru64 Unix give me two copies of the error messages from + # host. Throw away one of them. + close(STDERR); + + print "Looking up $address using $host\n" if $debug; + + my @names = (); + my @addresses = (); + + my $lookup = ""; + # Some versions need -i to make sure it uses reverse DNS lookup, + # and not /etc/hosts. + # This option will confuse 'host' on Irix and HP/UX, and make the + # program loop forever. Avoiding it for now [pere 2002-08-06] + for $options ("") { + open(HOST, "$host $options $address 2>&1 |") + || die "Unable to execute host"; + while (<HOST>) { + $lookup .= $_; + chomp; + print "host: $_\n" if $debug; + + push(@names, lc($1)) if (/^Name: (.+)$/); + push(@names, lc($1)) if (/^Aliases: (.+)$/); + + # 10.6.240.129.in-addr.arpa PTR perleporten.uio.no + push(@names, lc($1)) if (/\s+PTR\s+(.+)$/); + + # spheniscus.uio.no has address 129.240.148.19 + if (/^\S+ has address (\S+)$/) { + print "Match addr $1\n" if $debug; + push(@addresses, lc($1)) + } + + # 10.6.240.129.IN-ADDR.ARPA domain name pointer perleporten.uio.no + if (/IN-ADDR.ARPA domain name pointer\s+(.+)$/) { + print "Match name $1\n" if $debug; + push(@names, lc($1)) + } + + push(@addresses, $1) if (/^Address: (.+)$/); + push(@addresses, $1) if (/\s+A\s+(\d+.+)$/) + } + close(HOST); + if ($lookup =~ /Usage: /) { + # Probably unknown parameter, try again without -i + $lookup = ""; + } else { + last; + } + } + return ("no/bad reply from DNS server", undef, undef) + if ($lookup !~ /domain name pointer/ + && $lookup !~ /\shas address\s/ + && $lookup !~ /\sPTR\s/ + && $lookup !~ /Name:/); + + if ( $address =~ m/^\d+\.\d+\.\d+\.\d+/ + && ! grep /$address/, @addresses ) { + print "Adding $address to list of addresses\n" if $debug; + unshift(@addresses, $address) ; + } + + return (undef, \@names, \@addresses); +} + +sub dns_lookup_int { + my $address = shift; + + print "Looking up $address using Net::DNS\n" if $debug; + + my @names = (); + my @addresses = (); + + my $res = new Net::DNS::Resolver; + my $query; + if ($address =~ m/\d+\.\d+\.\d+\.\d+/) { + $query = $res->query($address); + } else { + $query = $res->search($address); + } + if ($query) { + foreach $rr ($query->answer) { + print "Type: $rr->type\n" if $debug; + if ($rr->type eq "A") { + print $rr->address, " - A\n" if $debug; + push(@addresses, $rr->address); + } + if ($rr->type eq "CNAME") { + print $rr->cname, " - CNAME\n" if $debug; + push(@addresses, $rr->cname); + } + if ($rr->type eq "PTR") { + print $rr->ptrdname, " - PTR\n" if $debug; + push(@names, lc($rr->ptrdname)); + } + } + return (undef, \@names, \@addresses); + } + else { + print "query failed: ", $res->errorstring, "\n" if $debug; + return ($res->errorstring, (), ()); + } +} + +sub dns_lookup { + my $entry = shift; + + if ($use_perl_resolver) { + return dns_lookup_int($entry); + } else { + return dns_lookup_ext($entry); + } +} + +sub error { + local ($level, $error) = @_; + + $returnvalue = 1 if ($level =~ /^W$/ && $returnvalue <= 1); + $returnvalue = 2 if ($level =~ /^C$/); + + $nagiosmsg = $nagiosmsg . "<br>" unless ($nagiosmsg =~ /^$/); + $nagiosmsg = $nagiosmsg . "$error"; +} + +sub is_ip_private { + my $ip = shift; + + return 1 if ($ip =~ m/^10\./); + return 1 if ($ip =~ m/^192\.168\./); + + return 0; +} + +sub is_names_ip_matching { + local ($ip, @names) = @_; + + my $level = "W"; + + # Ignore IPv6 addresses for now. + return if ($ip =~ m/:/); + + # Ignore private network + return if (is_ip_private($ip)); + + my $name; + for $name (sort @names) { + if ($use_reverse) { + # Check reverse + my ($retval, $revnames) = dns_lookup($ip); + + return if ( $retval ); # Ignore unknown IP addresses + + if ( ! $retval && ! grep /$name/, @{$revnames} ) { + error $level, "Incorrect /etc/hosts for $ip: ". + "$name not in reverse DNS list"; + } + } + + if ($use_forward) { + # Check forward + my ($retval, $revnames, $forwip); + + ($retval, $revnames) = dns_lookup($ip); + ($retval, undef, $forwip) = dns_lookup($name); + + print "Forward DNS $name/$ip: ", join(" ", @{$forwip}), "\n" + if $debug; + + # Ignore entry if both IP and hostname fail to resolve in DNS + return if ( ! defined $revnames && ! defined $forwip ); + + if ( ! grep /$ip/, @{$forwip} ) { + error $level, "Incorrect /etc/hosts for $ip: ". + "IP not in forward DNS list for '$name'"; + } + } + } +} + +sub check_etc_hosts { + open(HOSTS, "< /etc/hosts") || die "Unable to open /etc/hosts"; + while (<HOSTS>) { + chomp; + s/\#.+//; # Skip comments + next if (/^\s*$/); # Skip empty lines + + print "Testing $_\n" if $debug; + + $_ = lc($_); + + local ($ip, @names) = split(/\s+/); + + # Skip localhost, it is different on some platforms. + next if ($ip eq '127.0.0.1'); + + is_names_ip_matching($ip, @names); + } + close(HOSTS); +} + +check_etc_hosts() if ( -f "/etc/hosts" ); + +if ($nagiosmsg =~ /^$/) { + print "/etc/hosts OK\n"; +} else { + print $nagiosmsg . "\n"; +} +exit $returnvalue; diff --git a/sitesummary/nagios-plugins/check_etc_resolv b/sitesummary/nagios-plugins/check_etc_resolv new file mode 100755 index 0000000..18ac87d --- /dev/null +++ b/sitesummary/nagios-plugins/check_etc_resolv @@ -0,0 +1,134 @@ +#!/usr/bin/perl -w +# +# Author: Petter Reinholdtsen <pere@hungry.com> +# Date: 2001-11-09 +# +# Check /etc/resolv.conf, and make sure the name servers listed are working. + +use Socket; + +use vars qw($host $debug $mincount $trycount $testhost $retval $nagiosmsg); + +$retval = 0; +$nagiosmsg = ""; + +$host = '/usr/bin/host'; + +$debug = 0; + +# There should be at least this many servers in the list +$mincount = 1; + +# Try to call host this many times before reporting any bugs +$trycount = 3; + +# Which DNS name to look up +$testhost = "www.uio.no"; + +# Stolen from Logwatch.pm +sub canonical_ipv6_address { + my @a = split /:/, shift; + my @b = qw(0 0 0 0 0 0 0 0); + my $i = 0; + # comparison is numeric, so we use hex function + while (defined $a[0] and $a[0] ne '') {$b[$i++] = hex(shift @a);} + @a = reverse @a; + $i = 7; + while (defined $a[0] and $a[0] ne '') {$b[$i--] = hex(shift @a);} + @b; +} + +sub error_with_dns { + local ($count, $ip, $error) = @_; + + # Count 1 = Error + # Count 2 = Problem + # Count 3-> = Warning + if (1 == $count) { + $retval = 2; + } elsif (2 == $count) { + $retval = 1 unless ($retval > 0); + } + + $nagiosmsg .= "<br>" unless ($nagiosmsg =~ /^$/); + $nagiosmsg .= "/etc/resolv.conf: nameserver #$count $ip: $error"; +} + +# Check if there is a DNS server running on the given IP address +sub test_dns_server { + local ($ip) = @_; + local ($name) = ""; + + print "Checking $1\n" if $debug; + + # there are other module functions that do this more gracefully + # (such as inet_pton), but we can't guarantee that they are available + # in every system, so we use the built-in gethostbyaddr. + if ($ip =~ /^[\d\.]*$/) { + $PackedAddr = pack('C4', split /\./,$ip); + $name = gethostbyaddr($PackedAddr,AF_INET()); + } elsif ($ip =~ /^[0-9a-zA-Z:]*/) { + $PackedAddr = pack('n8', canonical_ipv6_address($ip)); + $name = gethostbyaddr($PackedAddr, AF_INET6()); + } + + return "missing in DNS" if ( ! defined $name ); + + my $try = $trycount; + my $delay = 1; # Exponensial backoff + for ($try = $trycount; $try; --$try) { + print "Running '$host $testhost $ip 2>/dev/null'\n" if $debug; + local $lookup = `$host $testhost $ip 2>/dev/null`; + + print "Reply from host (try=$try):\n $lookup\n" if $debug; + + if ($lookup =~ /\sA\s+\d/ || $lookup =~ /has address/ || + $lookup =~ /domain name pointer/ || $lookup =~ /Name: /) { + return undef; # true + } + print "Sleeping $delay\n" if $debug; + sleep $delay; + $delay += $delay; + } + + return "no/bad reply from DNS server"; +} + +sub check_etc_resolv_conf { + open(RESOLV, "< /etc/resolv.conf") || die "Unable to open /etc/resolv.conf"; + local $count = 0; + while (<RESOLV>) { + chomp; + s/\#.+//; # Skip comments + next if (/^\s*$/); # Skip empty lines + if (/^nameserver\s+(\S+)/) { + $count++; + local ($error) = test_dns_server($1); + if ( defined $error ) { + error_with_dns($count, $1, $error); + } + } + } + close(RESOLV); + + if ($count < $mincount) { + $retval = 1 unless $retval > 0; + $nagiosmsg .= "<br>" unless ($nagiosmsg =~ /^$/); + $nagiosmsg .= "/etc/resolv.conf: Only $count nameservers in " . + "/etc/resolv.conf (low-limit is $mincount)"; + } +} + +check_etc_resolv_conf() if ( -f "/etc/resolv.conf" && -x $host ); + +unless ( -x $host ) { + $nagiosmsg .= "$host is missing or not executable, please fix.."; + $retval = 1; +} + +if ($nagiosmsg =~ /^$/) { + print "/etc/resolv.conf OK\n"; +} else { + print $nagiosmsg . "\n"; +} +exit $retval; diff --git a/sitesummary/nagios-plugins/check_kernel_status b/sitesummary/nagios-plugins/check_kernel_status new file mode 100755 index 0000000..b7faff6 --- /dev/null +++ b/sitesummary/nagios-plugins/check_kernel_status @@ -0,0 +1,120 @@ +#!/usr/bin/perl +# check_kernel_status : check if the running kernel is the latest installed +# By Toni Van Remortel [toni.van.remortel@p-ops.be] +# 2008-07-28 +# GPLv2 +# Downloaded from +# http://www.monitoringexchange.org/attachment/download/Check-Plugins/Operating-Systems/Linux/Running-kernel-compared-to-installed-kernel-version/check_kernel_status + +$OK = 0; +$WARN = 1; +$CRIT = 2; +$UNKN = 3; + +# First, find the current running kernel version +if ( -e '/proc/version_signature' ) +{ + # Likely Ubuntu + $sig = `cat /proc/version_signature`; + if ( $sig =~ /.* (\d+)\.(\d+)\.(\d+)-(\d+)\.(\d+)-[generic|server]/ ) + { + @running_version = ($1, $2, $3, $4, $5); + } + else + { + print "UNKNOWN - Cannot find running Ubuntu kernel version\n"; + exit $UNKN; + } +} +elsif ( -e '/proc/version' ) +{ + # Likely Debian + $sig = `cat /proc/version`; + if ( $sig =~ /\(Debian (\d+)\.(\d+)\.(\d+)\.dfsg\.(\d+)-(\d+)\)/ + || $sig =~ /\(Debian (\d+)\.(\d+)\.(\d+)\.dfsg\.(\d+)-(\d+)\w+(\d+)\)/ + || $sig =~ /\(Debian (\d+)\.(\d+)\.(\d+)-(\d+).+?(\d+).+?(\d+)\)/ + || $sig =~ /\(Debian (\d+)\.(\d+)\.(\d+)-(\d+)lenny(\d+)\)/ + ) + { + @running_version = ($1, $2, $3, $4, $5, $6); + } + else + { + print "UNKNOWN - Cannot find running Debian kernel version\n"; + exit $UNKN; + } +} +else +{ + print "UNKNOWN - Cannot extract running kernel info\n"; + exit $UNKN; +} + +# Next, find the installed kernel version +# Yes, as you can see, it is limited to 2.6 kernels here. +# But I assume that you don't need reboots anymore when this major version has passed. +$dpkg_list = `dpkg -l | grep linux-image-2.6`; +chomp($dpkg_list); +@dpkg_lines = split("\n", $dpkg_list); +$dpkg = pop(@dpkg_lines); + +# Now, which OS is it, and which footprint do they use? +if ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)-(\d+)\.(\d+)/ ) +{ + # Ubuntu + @installed_version = ($1, $2, $3, $4, $5, 0); +} +elsif ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)\.dfsg\.(\d+)-(\d+)\w+(\d+)/ ) +{ + # Debian Etch and older + @installed_version = ($1, $2, $3, $4, $5, $6); +} +elsif ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)\.dfsg\.(\d+)-(\d+) / ) +{ + # Debian Etch and older + @installed_version = ($1, $2, $3, $4, $5, 0); +} +elsif ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)-(\d+)\~.+?(\d+).+?(\d+)/ ) +{ + # Debian Etch and older + @installed_version = ($1, $2, $3, $4, $5, $6); +} +elsif ( $dpkg =~ /Debian (\d+)\.(\d+)\.(\d+)\+(\d+)\+lenny(\d+)/ ) +{ + # Debian Lenny + @installed_version = ($1, $2, $3, $4, $5, 0); +} +elsif ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)-(\d+)lenny(\d+)/ ) +{ + # Debian Lenny + @installed_version = ($1, $2, $3, $4, $5, 0); +} +elsif ( $dpkg =~ / (\d+)\.(\d+)\.(\d+)-(\d+)/ ) +{ + # Debian Lenny + @installed_version = ($1, $2, $3, $4, 0, 0); +} +else +{ + print "UNKNOWN - Could not determine installed version.\n"; + exit $UNKN; +} + +# Calculate sums for easy comparison +$running_version_sum = sprintf("%02d%02d%02d%02d%02d%02d", @running_version); +$installed_version_sum = sprintf("%02d%02d%02d%02d%02d%02d", @installed_version); +# And some readable format +$print_running_version = sprintf("%d.%d.%d-%d.%d.%d", @running_version); +$print_installed_version = sprintf("%d.%d.%d-%d.%d.%d", @installed_version); + +# Do we need a reboot? +if ( $running_version_sum < $installed_version_sum ) +{ + print "WARNING - Reboot required : running kernel = $print_running_version, installed kernel = $print_installed_version\n"; + exit $WARN; +} +else +{ + print "OK - running kernel = $print_running_version, installed kernel = $print_installed_version\n"; + exit $OK; +} diff --git a/sitesummary/nagios-plugins/check_shutdown b/sitesummary/nagios-plugins/check_shutdown new file mode 100755 index 0000000..d0b6afe --- /dev/null +++ b/sitesummary/nagios-plugins/check_shutdown @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Report when a reboot is in progress. Useful to detect if +# reboot-when-idle have been used on a server. + +set -e + +PATH=/bin:/sbin:/usr/sbin:/usr/bin + +shutdownpid="`pgrep '^shutdown$'|head -1`" + +if [ "$shutdownpid" ] ; then + case "`uname -s`" in + Linux) + cmd="`ps --no-headers --pid $shutdownpid -o command`" + echo "REBOOT IN PROGRESS: $cmd" + ;; + *) + echo "REBOOT IN PROGRESS" + ;; + esac + exit 1 +fi + +echo "OK - no shutdown running" +exit 0 diff --git a/sitesummary/nagios-template-contacts.cfg b/sitesummary/nagios-template-contacts.cfg new file mode 100644 index 0000000..e4924c9 --- /dev/null +++ b/sitesummary/nagios-template-contacts.cfg @@ -0,0 +1,17 @@ +define contact { + contact_name root + alias Root + host_notification_period 24x7 + service_notification_period 24x7 + host_notification_options d,r + service_notification_options w,u,c,r + host_notification_commands notify-by-nothing + service_notification_commands notify-by-nothing + email root@postoffice +} + +define contactgroup{ + contactgroup_name admins + alias Nagios Administrators + members root +} diff --git a/sitesummary/nagios-templates.cfg b/sitesummary/nagios-templates.cfg new file mode 100644 index 0000000..36f59d6 --- /dev/null +++ b/sitesummary/nagios-templates.cfg @@ -0,0 +1,249 @@ +define timeperiod { + timeperiod_name 24x7 + alias 24 Hours A Day, 7 Days A Week + sunday 00:00-24:00 + monday 00:00-24:00 + tuesday 00:00-24:00 + wednesday 00:00-24:00 + thursday 00:00-24:00 + friday 00:00-24:00 + saturday 00:00-24:00 +} + +define timeperiod { + timeperiod_name workhours + alias Standard Work Hours + monday 09:00-17:00 + tuesday 09:00-17:00 + wednesday 09:00-17:00 + thursday 09:00-17:00 + friday 09:00-17:00 +} + +define timeperiod { + timeperiod_name nonworkhours + alias Non-Work Hours + sunday 00:00-24:00 + monday 00:00-09:00,17:00-24:00 + tuesday 00:00-09:00,17:00-24:00 + wednesday 00:00-09:00,17:00-24:00 + thursday 00:00-09:00,17:00-24:00 + friday 00:00-09:00,17:00-24:00 + saturday 00:00-24:00 +} + +define timeperiod { + timeperiod_name never + alias Never +} + + +define command { + command_name notify-by-nothing + command_line /bin/true +} + +define command { + command_name host-notify-by-email + command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTALIAS$\nState: $HOSTSTATE$ for $HOSTDURATION$\nAddress: $HOSTADDRESS$\nInfo:\n\n$HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n\nACK by: $HOSTACKAUTHOR$\nComment: $HOSTACKCOMMENT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ alert $NOTIFICATIONNUMBER$ - $HOSTALIAS$ host is $HOSTSTATE$ **" $CONTACTEMAIL$ +} + +define command{ + command_name notify-by-email + command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nState: $SERVICESTATE$ for $SERVICEDURATION$\nAddress: $HOSTADDRESS$\n\nInfo:\n\n$SERVICEOUTPUT$\n\nDate/Time: $LONGDATETIME$\n\nACK by: $SERVICEACKAUTHOR$\nComment: $SERVICEACKCOMMENT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ alert $NOTIFICATIONNUMBER$ - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$ +} + +define host { + name server-host + check_command check-host-alive + max_check_attempts 10 + event_handler_enabled 1 + flap_detection_enabled 1 + process_perf_data 1 + retain_status_information 1 + retain_nonstatus_information 1 + notification_interval 0 + notification_period 24x7 + notifications_enabled 1 + failure_prediction_enabled 1 + register 0 + notification_options d,u,r + contact_groups admins +} + +define host { + use server-host + name switch-host + check_command check-host-none +} + +define service { + name server-service + is_volatile 0 + max_check_attempts 4 + normal_check_interval 5 + retry_check_interval 1 + active_checks_enabled 1 + passive_checks_enabled 1 + check_period 24x7 + parallelize_check 1 + obsess_over_service 1 + check_freshness 0 + event_handler_enabled 1 + flap_detection_enabled 1 + process_perf_data 1 + retain_status_information 1 + retain_nonstatus_information 1 + notification_interval 0 + notification_period 24x7 + notifications_enabled 1 + failure_prediction_enabled 1 + register 0 + notification_options w,u,c,r + contact_groups admins +} + +define command{ + command_name check_disk + command_line /usr/lib/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$ +} + +define command { + command_name check_etc_hosts + command_line /usr/bin/perl /usr/lib/sitesummary/nagios-plugins/check_etc_hosts +} + +define command { + command_name check_etc_resolv + command_line /usr/bin/perl /usr/lib/sitesummary/nagios-plugins/check_etc_resolv +} + +define command{ + command_name check_http + command_line /usr/lib/nagios/plugins/check_http -H $HOSTADDRESS$ -I $HOSTADDRESS$ +} + +define command{ + command_name check_load + command_line /usr/lib/nagios/plugins/check_load --warning=$ARG2$ --critical=$ARG2$ +} + +define command{ + command_name check_ping + command_line /usr/lib/nagios/plugins/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ +} + +define command { + command_name check_shutdown + command_line /usr/lib/sitesummary/nagios-plugins/check_shutdown +} + +define command{ + command_name check_ssh + command_line /usr/lib/nagios/plugins/check_ssh $HOSTADDRESS$ +} + +define command{ + command_name check_dhcp + command_line /usr/lib/nagios/plugins/check_dhcp +} + +define command{ + command_name check_ftp + command_line /usr/lib/nagios/plugins/check_ftp -H localhost +} + +define command{ + command_name check_ntp + command_line /usr/lib/nagios/plugins/check_ntp -H $HOSTADDRESS$ +} + +define command{ + command_name check_tcp + command_line /usr/lib/nagios/plugins/check_tcp -H $HOSTADDRESS$ -p $ARG1$ +} + +define command{ + command_name check_dns + command_line /usr/lib/nagios/plugins/check_dns -H $HOSTADDRESS$ -s $HOSTADDRESS$ +} + +define command{ + command_name check_imaps + command_line /usr/lib/nagios/plugins/check_imap -p 993 -H $HOSTADDRESS$ -S +} + +define command{ + command_name check_nfs + command_line /usr/lib/nagios/plugins/check_rpc -H $HOSTADDRESS$ -C nfs -c2,3 +} + +define command{ + command_name check_smtp + command_line /usr/lib/nagios/plugins/check_smtp -H localhost +} + +define command{ + command_name check_squid + command_line /usr/lib/nagios/plugins/check_http -H $HOSTADDRESS$ -p $ARG1$ -u $ARG2$ -e 'HTTP/1.0 200 OK' +} + +define command{ + command_name check_swap + command_line /usr/lib/nagios/plugins/check_swap -w $ARG1 -c $ARG2$ +} + +define command{ + command_name check_procs + command_line /usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ +} + +define command{ + command_name check_procs_zombie + command_line /usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -s Z +} + +define command{ + command_name check_procs_cron + command_line /usr/lib/nagios/plugins/check_procs -w $ARG1$ -c $ARG2$ -C cron +} + +define command{ + command_name check_linux_raid + command_line /usr/lib/nagios/plugins/check_linux_raid +} + +define command{ + command_name check_users + command_line /usr/lib/nagios/plugins/check_users -w $ARG1$ -c $ARG2$ +} + +define command{ + command_name check_apt + command_line /usr/lib/nagios/plugins/check_apt +} + +define command{ + command_name check_kernel_status + command_line /usr/bin/perl /usr/lib/sitesummary/nagios-plugins/check_kernel_status +} + +define command{ + command_name check_cups_queue + command_line /usr/lib/sitesummary/nagios-plugins/check_cups_queue -H $HOSTADDRESS$ -T b -w 10 -c 50 -a 1 +} + +define command{ + command_name check-host-alive + command_line /usr/lib/nagios/plugins/check_ping -H $HOSTADDRESS$ -w 5000,100% -c 5000,100% -p 1 +} + +define command{ + command_name check-host-none + command_line /bin/echo Switch hosts are not checked +} + +define command{ + command_name check_nrpe + command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ +} diff --git a/sitesummary/nagios.cfg b/sitesummary/nagios.cfg new file mode 100644 index 0000000..4ade448 --- /dev/null +++ b/sitesummary/nagios.cfg @@ -0,0 +1,1301 @@ +# Nagios configuration file for use with the sitesummary generated +# host and service list. + +# LOG FILE +# This is the main log file where service and host events are logged +# for historical purposes. This should be the first option specified +# in the config file!!! + +log_file=/var/log/nagios3/nagios.log + +cfg_file=/etc/nagios3/sitesummary-templates.cfg +cfg_file=/etc/nagios3/sitesummary-template-contacts.cfg +cfg_file=/var/lib/sitesummary/nagios-generated.cfg + + +# Commands definitions +#cfg_file=/etc/nagios3/commands.cfg + +# Debian also defaults to using the check commands defined by the debian +# nagios-plugins package +#cfg_dir=/etc/nagios-plugins/config + +# Debian uses by default a configuration directory where nagios3-common, +# other packages and the local admin can dump or link configuration +# files into. +#cfg_dir=/etc/nagios3/conf.d + +# OBJECT CONFIGURATION FILE(S) +# These are the object configuration files in which you define hosts, +# host groups, contacts, contact groups, services, etc. +# You can split your object definitions across several config files +# if you wish (as shown below), or keep them all in a single config file. + +# You can specify individual object config files as shown below: +#cfg_file=/etc/nagios3/objects/commands.cfg +#cfg_file=/etc/nagios3/objects/contacts.cfg +#cfg_file=/etc/nagios3/objects/timeperiods.cfg +#cfg_file=/etc/nagios3/objects/templates.cfg + +# Definitions for monitoring a Windows machine +#cfg_file=/etc/nagios3/objects/windows.cfg + +# Definitions for monitoring a router/switch +#cfg_file=/etc/nagios3/objects/switch.cfg + +# Definitions for monitoring a network printer +#cfg_file=/etc/nagios3/objects/printer.cfg + + +# You can also tell Nagios to process all config files (with a .cfg +# extension) in a particular directory by using the cfg_dir +# directive as shown below: + +#cfg_dir=/etc/nagios3/servers +#cfg_dir=/etc/nagios3/printers +#cfg_dir=/etc/nagios3/switches +#cfg_dir=/etc/nagios3/routers + + + + +# OBJECT CACHE FILE +# This option determines where object definitions are cached when +# Nagios starts/restarts. The CGIs read object definitions from +# this cache file (rather than looking at the object config files +# directly) in order to prevent inconsistencies that can occur +# when the config files are modified after Nagios starts. + +object_cache_file=/var/cache/nagios3/objects.cache + + + +# PRE-CACHED OBJECT FILE +# This options determines the location of the precached object file. +# If you run Nagios with the -p command line option, it will preprocess +# your object configuration file(s) and write the cached config to this +# file. You can then start Nagios with the -u option to have it read +# object definitions from this precached file, rather than the standard +# object configuration files (see the cfg_file and cfg_dir options above). +# Using a precached object file can speed up the time needed to (re)start +# the Nagios process if you've got a large and/or complex configuration. +# Read the documentation section on optimizing Nagios to find our more +# about how this feature works. + +precached_object_file=/var/lib/nagios3/objects.precache + + + +# RESOURCE FILE +# This is an optional resource file that contains $USERx$ macro +# definitions. Multiple resource files can be specified by using +# multiple resource_file definitions. The CGIs will not attempt to +# read the contents of resource files, so information that is +# considered to be sensitive (usernames, passwords, etc) can be +# defined as macros in this file and restrictive permissions (600) +# can be placed on this file. + +resource_file=/etc/nagios3/resource.cfg + + + +# STATUS FILE +# This is where the current status of all monitored services and +# hosts is stored. Its contents are read and processed by the CGIs. +# The contents of the status file are deleted every time Nagios +# restarts. + +status_file=/var/cache/nagios3/status.dat + + + +# STATUS FILE UPDATE INTERVAL +# This option determines the frequency (in seconds) that +# Nagios will periodically dump program, host, and +# service status data. + +status_update_interval=10 + + + +# NAGIOS USER +# This determines the effective user that Nagios should run as. +# You can either supply a username or a UID. + +nagios_user=nagios + + + +# NAGIOS GROUP +# This determines the effective group that Nagios should run as. +# You can either supply a group name or a GID. + +nagios_group=nagios + + + +# EXTERNAL COMMAND OPTION +# This option allows you to specify whether or not Nagios should check +# for external commands (in the command file defined below). By default +# Nagios will *not* check for external commands, just to be on the +# cautious side. If you want to be able to use the CGI command interface +# you will have to enable this. +# Values: 0 = disable commands, 1 = enable commands + +check_external_commands=0 + + + +# EXTERNAL COMMAND CHECK INTERVAL +# This is the interval at which Nagios should check for external commands. +# This value works of the interval_length you specify later. If you leave +# that at its default value of 60 (seconds), a value of 1 here will cause +# Nagios to check for external commands every minute. If you specify a +# number followed by an "s" (i.e. 15s), this will be interpreted to mean +# actual seconds rather than a multiple of the interval_length variable. +# Note: In addition to reading the external command file at regularly +# scheduled intervals, Nagios will also check for external commands after +# event handlers are executed. +# NOTE: Setting this value to -1 causes Nagios to check the external +# command file as often as possible. + +#command_check_interval=15s +command_check_interval=-1 + + + +# EXTERNAL COMMAND FILE +# This is the file that Nagios checks for external command requests. +# It is also where the command CGI will write commands that are submitted +# by users, so it must be writeable by the user that the web server +# is running as (usually 'nobody'). Permissions should be set at the +# directory level instead of on the file, as the file is deleted every +# time its contents are processed. +# Debian Users: In case you didn't read README.Debian yet, _NOW_ is the +# time to do it. + +command_file=/var/lib/nagios3/rw/nagios.cmd + + + +# EXTERNAL COMMAND BUFFER SLOTS +# This settings is used to tweak the number of items or "slots" that +# the Nagios daemon should allocate to the buffer that holds incoming +# external commands before they are processed. As external commands +# are processed by the daemon, they are removed from the buffer. + +external_command_buffer_slots=4096 + + + +# LOCK FILE +# This is the lockfile that Nagios will use to store its PID number +# in when it is running in daemon mode. + +lock_file=/var/run/nagios3/nagios3.pid + + + +# TEMP FILE +# This is a temporary file that is used as scratch space when Nagios +# updates the status log, cleans the comment file, etc. This file +# is created, used, and deleted throughout the time that Nagios is +# running. + +temp_file=/var/cache/nagios3/nagios.tmp + + + +# TEMP PATH +# This is path where Nagios can create temp files for service and +# host check results, etc. + +temp_path=/tmp + + + +# EVENT BROKER OPTIONS +# Controls what (if any) data gets sent to the event broker. +# Values: 0 = Broker nothing +# -1 = Broker everything +# <other> = See documentation + +event_broker_options=-1 + + + +# EVENT BROKER MODULE(S) +# This directive is used to specify an event broker module that should +# by loaded by Nagios at startup. Use multiple directives if you want +# to load more than one module. Arguments that should be passed to +# the module at startup are seperated from the module path by a space. +# +#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING +#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +# Do NOT overwrite modules while they are being used by Nagios or Nagios +# will crash in a fiery display of SEGFAULT glory. This is a bug/limitation +# either in dlopen(), the kernel, and/or the filesystem. And maybe Nagios... +# +# The correct/safe way of updating a module is by using one of these methods: +# 1. Shutdown Nagios, replace the module file, restart Nagios +# 2. Delete the original module file, move the new module file into place, restart Nagios +# +# Example: +# +# broker_module=<modulepath> [moduleargs] + +#broker_module=/somewhere/module1.o +#broker_module=/somewhere/module2.o arg1 arg2=3 debug=0 + + + +# LOG ROTATION METHOD +# This is the log rotation method that Nagios should use to rotate +# the main log file. Values are as follows.. +# n = None - don't rotate the log +# h = Hourly rotation (top of the hour) +# d = Daily rotation (midnight every day) +# w = Weekly rotation (midnight on Saturday evening) +# m = Monthly rotation (midnight last day of month) + +log_rotation_method=d + + + +# LOG ARCHIVE PATH +# This is the directory where archived (rotated) log files should be +# placed (assuming you've chosen to do log rotation). + +log_archive_path=/var/log/nagios3/archives + + + +# LOGGING OPTIONS +# If you want messages logged to the syslog facility, as well as the +# Nagios log file set this option to 1. If not, set it to 0. + +use_syslog=1 + + + +# NOTIFICATION LOGGING OPTION +# If you don't want notifications to be logged, set this value to 0. +# If notifications should be logged, set the value to 1. + +log_notifications=1 + + + +# SERVICE RETRY LOGGING OPTION +# If you don't want service check retries to be logged, set this value +# to 0. If retries should be logged, set the value to 1. + +log_service_retries=1 + + + +# HOST RETRY LOGGING OPTION +# If you don't want host check retries to be logged, set this value to +# 0. If retries should be logged, set the value to 1. + +log_host_retries=1 + + + +# EVENT HANDLER LOGGING OPTION +# If you don't want host and service event handlers to be logged, set +# this value to 0. If event handlers should be logged, set the value +# to 1. + +log_event_handlers=1 + + + +# INITIAL STATES LOGGING OPTION +# If you want Nagios to log all initial host and service states to +# the main log file (the first time the service or host is checked) +# you can enable this option by setting this value to 1. If you +# are not using an external application that does long term state +# statistics reporting, you do not need to enable this option. In +# this case, set the value to 0. + +log_initial_states=0 + + + +# EXTERNAL COMMANDS LOGGING OPTION +# If you don't want Nagios to log external commands, set this value +# to 0. If external commands should be logged, set this value to 1. +# Note: This option does not include logging of passive service +# checks - see the option below for controlling whether or not +# passive checks are logged. + +log_external_commands=1 + + + +# PASSIVE CHECKS LOGGING OPTION +# If you don't want Nagios to log passive host and service checks, set +# this value to 0. If passive checks should be logged, set +# this value to 1. + +log_passive_checks=1 + + + +# GLOBAL HOST AND SERVICE EVENT HANDLERS +# These options allow you to specify a host and service event handler +# command that is to be run for every host or service state change. +# The global event handler is executed immediately prior to the event +# handler that you have optionally specified in each host or +# service definition. The command argument is the short name of a +# command definition that you define in your host configuration file. +# Read the HTML docs for more information. + +#global_host_event_handler=somecommand +#global_service_event_handler=somecommand + + + +# SERVICE INTER-CHECK DELAY METHOD +# This is the method that Nagios should use when initially +# "spreading out" service checks when it starts monitoring. The +# default is to use smart delay calculation, which will try to +# space all service checks out evenly to minimize CPU load. +# Using the dumb setting will cause all checks to be scheduled +# at the same time (with no delay between them)! This is not a +# good thing for production, but is useful when testing the +# parallelization functionality. +# n = None - don't use any delay between checks +# d = Use a "dumb" delay of 1 second between checks +# s = Use "smart" inter-check delay calculation +# x.xx = Use an inter-check delay of x.xx seconds + +service_inter_check_delay_method=s + + + +# MAXIMUM SERVICE CHECK SPREAD +# This variable determines the timeframe (in minutes) from the +# program start time that an initial check of all services should +# be completed. Default is 30 minutes. + +max_service_check_spread=30 + + + +# SERVICE CHECK INTERLEAVE FACTOR +# This variable determines how service checks are interleaved. +# Interleaving the service checks allows for a more even +# distribution of service checks and reduced load on remote +# hosts. Setting this value to 1 is equivalent to how versions +# of Nagios previous to 0.0.5 did service checks. Set this +# value to s (smart) for automatic calculation of the interleave +# factor unless you have a specific reason to change it. +# s = Use "smart" interleave factor calculation +# x = Use an interleave factor of x, where x is a +# number greater than or equal to 1. + +service_interleave_factor=s + + + +# HOST INTER-CHECK DELAY METHOD +# This is the method that Nagios should use when initially +# "spreading out" host checks when it starts monitoring. The +# default is to use smart delay calculation, which will try to +# space all host checks out evenly to minimize CPU load. +# Using the dumb setting will cause all checks to be scheduled +# at the same time (with no delay between them)! +# n = None - don't use any delay between checks +# d = Use a "dumb" delay of 1 second between checks +# s = Use "smart" inter-check delay calculation +# x.xx = Use an inter-check delay of x.xx seconds + +host_inter_check_delay_method=s + + + +# MAXIMUM HOST CHECK SPREAD +# This variable determines the timeframe (in minutes) from the +# program start time that an initial check of all hosts should +# be completed. Default is 30 minutes. + +max_host_check_spread=30 + + + +# MAXIMUM CONCURRENT SERVICE CHECKS +# This option allows you to specify the maximum number of +# service checks that can be run in parallel at any given time. +# Specifying a value of 1 for this variable essentially prevents +# any service checks from being parallelized. A value of 0 +# will not restrict the number of concurrent checks that are +# being executed. + +max_concurrent_checks=0 + + + +# HOST AND SERVICE CHECK REAPER FREQUENCY +# This is the frequency (in seconds!) that Nagios will process +# the results of host and service checks. + +check_result_reaper_frequency=10 + + + + +# MAX CHECK RESULT REAPER TIME +# This is the max amount of time (in seconds) that a single +# check result reaper event will be allowed to run before +# returning control back to Nagios so it can perform other +# duties. + +max_check_result_reaper_time=30 + + + + +# CHECK RESULT PATH +# This is directory where Nagios stores the results of host and +# service checks that have not yet been processed. +# +# Note: Make sure that only one instance of Nagios has access +# to this directory! + +check_result_path=/var/lib/nagios3/spool/checkresults + + + + +# MAX CHECK RESULT FILE AGE +# This option determines the maximum age (in seconds) which check +# result files are considered to be valid. Files older than this +# threshold will be mercilessly deleted without further processing. + +max_check_result_file_age=3600 + + + + +# CACHED HOST CHECK HORIZON +# This option determines the maximum amount of time (in seconds) +# that the state of a previous host check is considered current. +# Cached host states (from host checks that were performed more +# recently that the timeframe specified by this value) can immensely +# improve performance in regards to the host check logic. +# Too high of a value for this option may result in inaccurate host +# states being used by Nagios, while a lower value may result in a +# performance hit for host checks. Use a value of 0 to disable host +# check caching. + +cached_host_check_horizon=15 + + + +# CACHED SERVICE CHECK HORIZON +# This option determines the maximum amount of time (in seconds) +# that the state of a previous service check is considered current. +# Cached service states (from service checks that were performed more +# recently that the timeframe specified by this value) can immensely +# improve performance in regards to predictive dependency checks. +# Use a value of 0 to disable service check caching. + +cached_service_check_horizon=15 + + + +# ENABLE PREDICTIVE HOST DEPENDENCY CHECKS +# This option determines whether or not Nagios will attempt to execute +# checks of hosts when it predicts that future dependency logic test +# may be needed. These predictive checks can help ensure that your +# host dependency logic works well. +# Values: +# 0 = Disable predictive checks +# 1 = Enable predictive checks (default) + +enable_predictive_host_dependency_checks=1 + + + +# ENABLE PREDICTIVE SERVICE DEPENDENCY CHECKS +# This option determines whether or not Nagios will attempt to execute +# checks of service when it predicts that future dependency logic test +# may be needed. These predictive checks can help ensure that your +# service dependency logic works well. +# Values: +# 0 = Disable predictive checks +# 1 = Enable predictive checks (default) + +enable_predictive_service_dependency_checks=1 + + + +# SOFT STATE DEPENDENCIES +# This option determines whether or not Nagios will use soft state +# information when checking host and service dependencies. Normally +# Nagios will only use the latest hard host or service state when +# checking dependencies. If you want it to use the latest state (regardless +# of whether its a soft or hard state type), enable this option. +# Values: +# 0 = Don't use soft state dependencies (default) +# 1 = Use soft state dependencies + +soft_state_dependencies=0 + + + +# TIME CHANGE ADJUSTMENT THRESHOLDS +# These options determine when Nagios will react to detected changes +# in system time (either forward or backwards). + +#time_change_threshold=900 + + + +# AUTO-RESCHEDULING OPTION +# This option determines whether or not Nagios will attempt to +# automatically reschedule active host and service checks to +# "smooth" them out over time. This can help balance the load on +# the monitoring server. +# WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE +# PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY + +auto_reschedule_checks=0 + + + +# AUTO-RESCHEDULING INTERVAL +# This option determines how often (in seconds) Nagios will +# attempt to automatically reschedule checks. This option only +# has an effect if the auto_reschedule_checks option is enabled. +# Default is 30 seconds. +# WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE +# PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY + +auto_rescheduling_interval=30 + + + +# AUTO-RESCHEDULING WINDOW +# This option determines the "window" of time (in seconds) that +# Nagios will look at when automatically rescheduling checks. +# Only host and service checks that occur in the next X seconds +# (determined by this variable) will be rescheduled. This option +# only has an effect if the auto_reschedule_checks option is +# enabled. Default is 180 seconds (3 minutes). +# WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE +# PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY + +auto_rescheduling_window=180 + + + +# SLEEP TIME +# This is the number of seconds to sleep between checking for system +# events and service checks that need to be run. + +sleep_time=0.25 + + + +# TIMEOUT VALUES +# These options control how much time Nagios will allow various +# types of commands to execute before killing them off. Options +# are available for controlling maximum time allotted for +# service checks, host checks, event handlers, notifications, the +# ocsp command, and performance data commands. All values are in +# seconds. + +service_check_timeout=60 +host_check_timeout=30 +event_handler_timeout=30 +notification_timeout=30 +ocsp_timeout=5 +perfdata_timeout=5 + + + +# RETAIN STATE INFORMATION +# This setting determines whether or not Nagios will save state +# information for services and hosts before it shuts down. Upon +# startup Nagios will reload all saved service and host state +# information before starting to monitor. This is useful for +# maintaining long-term data on state statistics, etc, but will +# slow Nagios down a bit when it (re)starts. Since its only +# a one-time penalty, I think its well worth the additional +# startup delay. + +retain_state_information=1 + + + +# STATE RETENTION FILE +# This is the file that Nagios should use to store host and +# service state information before it shuts down. The state +# information in this file is also read immediately prior to +# starting to monitor the network when Nagios is restarted. +# This file is used only if the preserve_state_information +# variable is set to 1. + +state_retention_file=/var/lib/nagios3/retention.dat + + + +# RETENTION DATA UPDATE INTERVAL +# This setting determines how often (in minutes) that Nagios +# will automatically save retention data during normal operation. +# If you set this value to 0, Nagios will not save retention +# data at regular interval, but it will still save retention +# data before shutting down or restarting. If you have disabled +# state retention, this option has no effect. + +retention_update_interval=60 + + + +# USE RETAINED PROGRAM STATE +# This setting determines whether or not Nagios will set +# program status variables based on the values saved in the +# retention file. If you want to use retained program status +# information, set this value to 1. If not, set this value +# to 0. + +use_retained_program_state=1 + + + +# USE RETAINED SCHEDULING INFO +# This setting determines whether or not Nagios will retain +# the scheduling info (next check time) for hosts and services +# based on the values saved in the retention file. If you +# If you want to use retained scheduling info, set this +# value to 1. If not, set this value to 0. + +use_retained_scheduling_info=1 + + + +# RETAINED ATTRIBUTE MASKS (ADVANCED FEATURE) +# The following variables are used to specify specific host and +# service attributes that should *not* be retained by Nagios during +# program restarts. +# +# The values of the masks are bitwise ANDs of values specified +# by the "MODATTR_" definitions found in include/common.h. +# For example, if you do not want the current enabled/disabled state +# of flap detection and event handlers for hosts to be retained, you +# would use a value of 24 for the host attribute mask... +# MODATTR_EVENT_HANDLER_ENABLED (8) + MODATTR_FLAP_DETECTION_ENABLED (16) = 24 + +# This mask determines what host attributes are not retained +retained_host_attribute_mask=0 + +# This mask determines what service attributes are not retained +retained_service_attribute_mask=0 + +# These two masks determine what process attributes are not retained. +# There are two masks, because some process attributes have host and service +# options. For example, you can disable active host checks, but leave active +# service checks enabled. +retained_process_host_attribute_mask=0 +retained_process_service_attribute_mask=0 + +# These two masks determine what contact attributes are not retained. +# There are two masks, because some contact attributes have host and +# service options. For example, you can disable host notifications for +# a contact, but leave service notifications enabled for them. +retained_contact_host_attribute_mask=0 +retained_contact_service_attribute_mask=0 + + + +# INTERVAL LENGTH +# This is the seconds per unit interval as used in the +# host/contact/service configuration files. Setting this to 60 means +# that each interval is one minute long (60 seconds). Other settings +# have not been tested much, so your mileage is likely to vary... + +interval_length=60 + + + +# AGGRESSIVE HOST CHECKING OPTION +# If you don't want to turn on aggressive host checking features, set +# this value to 0 (the default). Otherwise set this value to 1 to +# enable the aggressive check option. Read the docs for more info +# on what aggressive host check is or check out the source code in +# base/checks.c + +use_aggressive_host_checking=0 + + + +# SERVICE CHECK EXECUTION OPTION +# This determines whether or not Nagios will actively execute +# service checks when it initially starts. If this option is +# disabled, checks are not actively made, but Nagios can still +# receive and process passive check results that come in. Unless +# you're implementing redundant hosts or have a special need for +# disabling the execution of service checks, leave this enabled! +# Values: 1 = enable checks, 0 = disable checks + +execute_service_checks=1 + + + +# PASSIVE SERVICE CHECK ACCEPTANCE OPTION +# This determines whether or not Nagios will accept passive +# service checks results when it initially (re)starts. +# Values: 1 = accept passive checks, 0 = reject passive checks + +accept_passive_service_checks=1 + + + +# HOST CHECK EXECUTION OPTION +# This determines whether or not Nagios will actively execute +# host checks when it initially starts. If this option is +# disabled, checks are not actively made, but Nagios can still +# receive and process passive check results that come in. Unless +# you're implementing redundant hosts or have a special need for +# disabling the execution of host checks, leave this enabled! +# Values: 1 = enable checks, 0 = disable checks + +execute_host_checks=1 + + + +# PASSIVE HOST CHECK ACCEPTANCE OPTION +# This determines whether or not Nagios will accept passive +# host checks results when it initially (re)starts. +# Values: 1 = accept passive checks, 0 = reject passive checks + +accept_passive_host_checks=1 + + + +# NOTIFICATIONS OPTION +# This determines whether or not Nagios will sent out any host or +# service notifications when it is initially (re)started. +# Values: 1 = enable notifications, 0 = disable notifications + +enable_notifications=1 + + + +# EVENT HANDLER USE OPTION +# This determines whether or not Nagios will run any host or +# service event handlers when it is initially (re)started. Unless +# you're implementing redundant hosts, leave this option enabled. +# Values: 1 = enable event handlers, 0 = disable event handlers + +enable_event_handlers=1 + + + +# PROCESS PERFORMANCE DATA OPTION +# This determines whether or not Nagios will process performance +# data returned from service and host checks. If this option is +# enabled, host performance data will be processed using the +# host_perfdata_command (defined below) and service performance +# data will be processed using the service_perfdata_command (also +# defined below). Read the HTML docs for more information on +# performance data. +# Values: 1 = process performance data, 0 = do not process performance data + +process_performance_data=0 + + + +# HOST AND SERVICE PERFORMANCE DATA PROCESSING COMMANDS +# These commands are run after every host and service check is +# performed. These commands are executed only if the +# enable_performance_data option (above) is set to 1. The command +# argument is the short name of a command definition that you +# define in your host configuration file. Read the HTML docs for +# more information on performance data. + +#host_perfdata_command=process-host-perfdata +#service_perfdata_command=process-service-perfdata + + + +# HOST AND SERVICE PERFORMANCE DATA FILES +# These files are used to store host and service performance data. +# Performance data is only written to these files if the +# enable_performance_data option (above) is set to 1. + +#host_perfdata_file=/tmp/host-perfdata +#service_perfdata_file=/tmp/service-perfdata + + + +# HOST AND SERVICE PERFORMANCE DATA FILE TEMPLATES +# These options determine what data is written (and how) to the +# performance data files. The templates may contain macros, special +# characters (\t for tab, \r for carriage return, \n for newline) +# and plain text. A newline is automatically added after each write +# to the performance data file. Some examples of what you can do are +# shown below. + +#host_perfdata_file_template=[HOSTPERFDATA]\t$TIMET$\t$HOSTNAME$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$ +#service_perfdata_file_template=[SERVICEPERFDATA]\t$TIMET$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$ + + + +# HOST AND SERVICE PERFORMANCE DATA FILE MODES +# This option determines whether or not the host and service +# performance data files are opened in write ("w") or append ("a") +# mode. If you want to use named pipes, you should use the special +# pipe ("p") mode which avoid blocking at startup, otherwise you will +# likely want the defult append ("a") mode. + +#host_perfdata_file_mode=a +#service_perfdata_file_mode=a + + + +# HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING INTERVAL +# These options determine how often (in seconds) the host and service +# performance data files are processed using the commands defined +# below. A value of 0 indicates the files should not be periodically +# processed. + +#host_perfdata_file_processing_interval=0 +#service_perfdata_file_processing_interval=0 + + + +# HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING COMMANDS +# These commands are used to periodically process the host and +# service performance data files. The interval at which the +# processing occurs is determined by the options above. + +#host_perfdata_file_processing_command=process-host-perfdata-file +#service_perfdata_file_processing_command=process-service-perfdata-file + + + +# OBSESS OVER SERVICE CHECKS OPTION +# This determines whether or not Nagios will obsess over service +# checks and run the ocsp_command defined below. Unless you're +# planning on implementing distributed monitoring, do not enable +# this option. Read the HTML docs for more information on +# implementing distributed monitoring. +# Values: 1 = obsess over services, 0 = do not obsess (default) + +obsess_over_services=0 + + + +# OBSESSIVE COMPULSIVE SERVICE PROCESSOR COMMAND +# This is the command that is run for every service check that is +# processed by Nagios. This command is executed only if the +# obsess_over_services option (above) is set to 1. The command +# argument is the short name of a command definition that you +# define in your host configuration file. Read the HTML docs for +# more information on implementing distributed monitoring. + +#ocsp_command=somecommand + + + +# OBSESS OVER HOST CHECKS OPTION +# This determines whether or not Nagios will obsess over host +# checks and run the ochp_command defined below. Unless you're +# planning on implementing distributed monitoring, do not enable +# this option. Read the HTML docs for more information on +# implementing distributed monitoring. +# Values: 1 = obsess over hosts, 0 = do not obsess (default) + +obsess_over_hosts=0 + + + +# OBSESSIVE COMPULSIVE HOST PROCESSOR COMMAND +# This is the command that is run for every host check that is +# processed by Nagios. This command is executed only if the +# obsess_over_hosts option (above) is set to 1. The command +# argument is the short name of a command definition that you +# define in your host configuration file. Read the HTML docs for +# more information on implementing distributed monitoring. + +#ochp_command=somecommand + + + +# TRANSLATE PASSIVE HOST CHECKS OPTION +# This determines whether or not Nagios will translate +# DOWN/UNREACHABLE passive host check results into their proper +# state for this instance of Nagios. This option is useful +# if you have distributed or failover monitoring setup. In +# these cases your other Nagios servers probably have a different +# "view" of the network, with regards to the parent/child relationship +# of hosts. If a distributed monitoring server thinks a host +# is DOWN, it may actually be UNREACHABLE from the point of +# this Nagios instance. Enabling this option will tell Nagios +# to translate any DOWN or UNREACHABLE host states it receives +# passively into the correct state from the view of this server. +# Values: 1 = perform translation, 0 = do not translate (default) + +translate_passive_host_checks=0 + + + +# PASSIVE HOST CHECKS ARE SOFT OPTION +# This determines whether or not Nagios will treat passive host +# checks as being HARD or SOFT. By default, a passive host check +# result will put a host into a HARD state type. This can be changed +# by enabling this option. +# Values: 0 = passive checks are HARD, 1 = passive checks are SOFT + +passive_host_checks_are_soft=0 + + + +# ORPHANED HOST/SERVICE CHECK OPTIONS +# These options determine whether or not Nagios will periodically +# check for orphaned host service checks. Since service checks are +# not rescheduled until the results of their previous execution +# instance are processed, there exists a possibility that some +# checks may never get rescheduled. A similar situation exists for +# host checks, although the exact scheduling details differ a bit +# from service checks. Orphaned checks seem to be a rare +# problem and should not happen under normal circumstances. +# If you have problems with service checks never getting +# rescheduled, make sure you have orphaned service checks enabled. +# Values: 1 = enable checks, 0 = disable checks + +check_for_orphaned_services=1 +check_for_orphaned_hosts=1 + + + +# SERVICE FRESHNESS CHECK OPTION +# This option determines whether or not Nagios will periodically +# check the "freshness" of service results. Enabling this option +# is useful for ensuring passive checks are received in a timely +# manner. +# Values: 1 = enabled freshness checking, 0 = disable freshness checking + +check_service_freshness=1 + + + +# SERVICE FRESHNESS CHECK INTERVAL +# This setting determines how often (in seconds) Nagios will +# check the "freshness" of service check results. If you have +# disabled service freshness checking, this option has no effect. + +service_freshness_check_interval=60 + + + +# HOST FRESHNESS CHECK OPTION +# This option determines whether or not Nagios will periodically +# check the "freshness" of host results. Enabling this option +# is useful for ensuring passive checks are received in a timely +# manner. +# Values: 1 = enabled freshness checking, 0 = disable freshness checking + +check_host_freshness=0 + + + +# HOST FRESHNESS CHECK INTERVAL +# This setting determines how often (in seconds) Nagios will +# check the "freshness" of host check results. If you have +# disabled host freshness checking, this option has no effect. + +host_freshness_check_interval=60 + + + + +# ADDITIONAL FRESHNESS THRESHOLD LATENCY +# This setting determines the number of seconds that Nagios +# will add to any host and service freshness thresholds that +# it calculates (those not explicitly specified by the user). + +additional_freshness_latency=15 + + + + +# FLAP DETECTION OPTION +# This option determines whether or not Nagios will try +# and detect hosts and services that are "flapping". +# Flapping occurs when a host or service changes between +# states too frequently. When Nagios detects that a +# host or service is flapping, it will temporarily suppress +# notifications for that host/service until it stops +# flapping. Flap detection is very experimental, so read +# the HTML documentation before enabling this feature! +# Values: 1 = enable flap detection +# 0 = disable flap detection (default) + +enable_flap_detection=1 + + + +# FLAP DETECTION THRESHOLDS FOR HOSTS AND SERVICES +# Read the HTML documentation on flap detection for +# an explanation of what this option does. This option +# has no effect if flap detection is disabled. + +low_service_flap_threshold=5.0 +high_service_flap_threshold=20.0 +low_host_flap_threshold=5.0 +high_host_flap_threshold=20.0 + + + +# DATE FORMAT OPTION +# This option determines how short dates are displayed. Valid options +# include: +# us (MM-DD-YYYY HH:MM:SS) +# euro (DD-MM-YYYY HH:MM:SS) +# iso8601 (YYYY-MM-DD HH:MM:SS) +# strict-iso8601 (YYYY-MM-DDTHH:MM:SS) +# + +date_format=iso8601 + + + + +# TIMEZONE OFFSET +# This option is used to override the default timezone that this +# instance of Nagios runs in. If not specified, Nagios will use +# the system configured timezone. +# +# NOTE: In order to display the correct timezone in the CGIs, you +# will also need to alter the Apache directives for the CGI path +# to include your timezone. Example: +# +# <Directory "/usr/local/nagios/sbin/"> +# SetEnv TZ "Australia/Brisbane" +# ... +# </Directory> + +#use_timezone=US/Mountain +#use_timezone=Australia/Brisbane + + + + +# P1.PL FILE LOCATION +# This value determines where the p1.pl perl script (used by the +# embedded Perl interpreter) is located. If you didn't compile +# Nagios with embedded Perl support, this option has no effect. + +p1_file=/usr/lib/nagios3/p1.pl + + + +# EMBEDDED PERL INTERPRETER OPTION +# This option determines whether or not the embedded Perl interpreter +# will be enabled during runtime. This option has no effect if Nagios +# has not been compiled with support for embedded Perl. +# Values: 0 = disable interpreter, 1 = enable interpreter + +enable_embedded_perl=1 + + + +# EMBEDDED PERL USAGE OPTION +# This option determines whether or not Nagios will process Perl plugins +# and scripts with the embedded Perl interpreter if the plugins/scripts +# do not explicitly indicate whether or not it is okay to do so. Read +# the HTML documentation on the embedded Perl interpreter for more +# information on how this option works. + +use_embedded_perl_implicitly=1 + + + +# ILLEGAL OBJECT NAME CHARACTERS +# This option allows you to specify illegal characters that cannot +# be used in host names, service descriptions, or names of other +# object types. + +illegal_object_name_chars=`~!$%^&*|'"<>?,()= + + + +# ILLEGAL MACRO OUTPUT CHARACTERS +# This option allows you to specify illegal characters that are +# stripped from macros before being used in notifications, event +# handlers, etc. This DOES NOT affect macros used in service or +# host check commands. +# The following macros are stripped of the characters you specify: +# $HOSTOUTPUT$ +# $HOSTPERFDATA$ +# $HOSTACKAUTHOR$ +# $HOSTACKCOMMENT$ +# $SERVICEOUTPUT$ +# $SERVICEPERFDATA$ +# $SERVICEACKAUTHOR$ +# $SERVICEACKCOMMENT$ + +illegal_macro_output_chars=`~$&|'"<> + + + +# REGULAR EXPRESSION MATCHING +# This option controls whether or not regular expression matching +# takes place in the object config files. Regular expression +# matching is used to match host, hostgroup, service, and service +# group names/descriptions in some fields of various object types. +# Values: 1 = enable regexp matching, 0 = disable regexp matching + +use_regexp_matching=0 + + + +# "TRUE" REGULAR EXPRESSION MATCHING +# This option controls whether or not "true" regular expression +# matching takes place in the object config files. This option +# only has an effect if regular expression matching is enabled +# (see above). If this option is DISABLED, regular expression +# matching only occurs if a string contains wildcard characters +# (* and ?). If the option is ENABLED, regexp matching occurs +# all the time (which can be annoying). +# Values: 1 = enable true matching, 0 = disable true matching + +use_true_regexp_matching=0 + + + +# ADMINISTRATOR EMAIL/PAGER ADDRESSES +# The email and pager address of a global administrator (likely you). +# Nagios never uses these values itself, but you can access them by +# using the $ADMINEMAIL$ and $ADMINPAGER$ macros in your notification +# commands. + +admin_email=root@localhost +admin_pager=pageroot@localhost + + + +# DAEMON CORE DUMP OPTION +# This option determines whether or not Nagios is allowed to create +# a core dump when it runs as a daemon. Note that it is generally +# considered bad form to allow this, but it may be useful for +# debugging purposes. Enabling this option doesn't guarantee that +# a core file will be produced, but that's just life... +# Values: 1 - Allow core dumps +# 0 - Do not allow core dumps (default) + +daemon_dumps_core=0 + + + +# LARGE INSTALLATION TWEAKS OPTION +# This option determines whether or not Nagios will take some shortcuts +# which can save on memory and CPU usage in large Nagios installations. +# Read the documentation for more information on the benefits/tradeoffs +# of enabling this option. +# Values: 1 - Enabled tweaks +# 0 - Disable tweaks (default) + +use_large_installation_tweaks=0 + + + +# ENABLE ENVIRONMENT MACROS +# This option determines whether or not Nagios will make all standard +# macros available as environment variables when host/service checks +# and system commands (event handlers, notifications, etc.) are +# executed. Enabling this option can cause performance issues in +# large installations, as it will consume a bit more memory and (more +# importantly) consume more CPU. +# Values: 1 - Enable environment variable macros (default) +# 0 - Disable environment variable macros + +enable_environment_macros=1 + + + +# CHILD PROCESS MEMORY OPTION +# This option determines whether or not Nagios will free memory in +# child processes (processed used to execute system commands and host/ +# service checks). If you specify a value here, it will override +# program defaults. +# Value: 1 - Free memory in child processes +# 0 - Do not free memory in child processes + +#free_child_process_memory=1 + + + +# CHILD PROCESS FORKING BEHAVIOR +# This option determines how Nagios will fork child processes +# (used to execute system commands and host/service checks). Normally +# child processes are fork()ed twice, which provides a very high level +# of isolation from problems. Fork()ing once is probably enough and will +# save a great deal on CPU usage (in large installs), so you might +# want to consider using this. If you specify a value here, it will +# program defaults. +# Value: 1 - Child processes fork() twice +# 0 - Child processes fork() just once + +#child_processes_fork_twice=1 + + + +# DEBUG LEVEL +# This option determines how much (if any) debugging information will +# be written to the debug file. OR values together to log multiple +# types of information. +# Values: +# -1 = Everything +# 0 = Nothing +# 1 = Functions +# 2 = Configuration +# 4 = Process information +# 8 = Scheduled events +# 16 = Host/service checks +# 32 = Notifications +# 64 = Event broker +# 128 = External commands +# 256 = Commands +# 512 = Scheduled downtime +# 1024 = Comments +# 2048 = Macros + +debug_level=0 + + + +# DEBUG VERBOSITY +# This option determines how verbose the debug log out will be. +# Values: 0 = Brief output +# 1 = More detailed +# 2 = Very detailed + +debug_verbosity=1 + + + +# DEBUG FILE +# This option determines where Nagios should write debugging information. + +debug_file=/var/lib/nagios3/nagios.debug + + + +# MAX DEBUG FILE SIZE +# This option determines the maximum size (in bytes) of the debug file. If +# the file grows larger than this size, it will be renamed with a .old +# extension. If a file already exists with a .old extension it will +# automatically be deleted. This helps ensure your disk space usage doesn't +# get out of control when debugging Nagios. + +max_debug_file_size=1000000 + + diff --git a/sitesummary/site-summary b/sitesummary/site-summary new file mode 100755 index 0000000..61b5dc9 --- /dev/null +++ b/sitesummary/site-summary @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use SiteSummary; +use Getopt::Std; + +my %sites; +my %sitegroups; +my %hostmap; +my %sitegroupmap; +my %opts; + +sub usage { + my $retval = shift; + print <<EOF; +Usage: $0 [-l] + -l list hosts with the given site/sitegroup +EOF + exit $retval; +} + +getopt("l", \%opts) || usage(1); + +for_all_hosts(\&handle_host); + +print_summary(); + +sub handle_host { + my $hostid = shift; + #print "$hostid\n"; + for my $site (get_site($hostid)) { + $site = "" unless defined $site; + $sites{$site}++; + my $sitegroup = get_sitegroup($hostid); + if ($sitegroup) { + $sitegroups{$site}{$sitegroup}++; + if (exists $sitegroupmap{$site} && exists $sitegroupmap{$site}{$sitegroup}) { + push @{$sitegroupmap{$site}{$sitegroup}}, $hostid ; + } else { + $sitegroupmap{$site}{$sitegroup} = [$hostid]; + } + } else { + if (exists $hostmap{$site}) { + push @{$hostmap{$site}}, $hostid ; + } else { + $hostmap{$site} = [$hostid]; + } + } + } +} + +sub print_summary { + printf(" %-20s %5s\n", "site", "count"); + for my $site (sort keys %sites) { + printf(" %-20s %5d\n", $site, $sites{$site}); + if (exists $opts{l}) { + for my $hostid (sort @{$hostmap{$site}}) { + my $hostname = get_hostname($hostid); + my $site = get_site($hostid) || ""; + my $sitegroup = get_sitegroup($hostid) || ""; + printf " %s %s/%s %s\n", $hostname, $site, $sitegroup, $hostid; + } + } + for my $sitegroup (sort keys %{$sitegroups{$site}}) { + printf(" %-18s %5d\n", $sitegroup, $sitegroups{$site}{$sitegroup}); + if (exists $opts{l}) { + for my $hostid (sort @{$sitegroupmap{$site}{$sitegroup}}) { + my $hostname = get_hostname($hostid); + my $site = get_site($hostid) || ""; + my $sitegroup = get_sitegroup($hostid) || ""; + printf " %s %s/%s %s\n", $hostname, $site, $sitegroup, $hostid; + } + } + } + } +} diff --git a/sitesummary/sitesummary-client b/sitesummary/sitesummary-client new file mode 100644 index 0000000..317ad4f --- /dev/null +++ b/sitesummary/sitesummary-client @@ -0,0 +1,93 @@ +#!/bin/sh +# +# Collect sytem information and pass it on to the sitesummary server +# using HTTP put. + +# https://svn.revolutionlinux.com/MILLE/XTERM/trunk/mille-xterm-getltscfg/src/getltscfg.script + +set -e + +PATH=/sbin:/usr/sbin:/bin:/usr/bin +export PATH + +# Make sure the output from programs is well known. +LC_ALL=C +export LC_ALL + +# Make sure to store files in a ramfs backed +# storage area on diskless clients, so use /tmp/. +tmpdir=/tmp/sitesummary-$$ + +log() { + msg="$@" + echo "$msg" + logger -p user.info -t sitesummary-client "$msg" +} + +error() { + msg="$@" + log "error: $msg" +} + +# Check or get GPG key, return false if it is unavailable +get_gpg_key_if_missing() { + url="$1" + true +} +gpg_encrypt_for_url() { + url="$1" + infile="$2" + outfile="$2" + + return + + GPGOPTS="--no-default-keyring --keyring $urlkeyring" + gpg $GPGOPTS -e $infile > $outfile +} + +# Read the package default +[ -f /usr/share/sitesummary/sitesummary-client.conf ] && \ + . /usr/share/sitesummary/sitesummary-client.conf +for confdir in \ + /usr/share/sitesummary/config.d \ + /etc/sitesummary/config.d +do + [ -d $confdir ] || continue + for config in $confdir/* ; do + [ -f $config ] && . $config + done +done + +mkdir $tmpdir && cd $tmpdir + +for fragdir in $fragdirs ; do + [ -d $fragdir ] || continue + for frag in $fragdir/*; do + [ -x $frag ] && $frag || true + done +done + +# Wrap up the package +hostsummaryfile=$tmpdir.tar.gz +tar zcf $hostsummaryfile . + +for url in $serverurls ; do + if [ "$gpgencrypt" != false ] ; then + if get_gpg_key_if_missing $url ; then + error "gpg key for '$url' is unavailable. refusing to submit." + continue + fi + gpg_encrypt_for_url $url "$hostsummaryfile" "$hostsummaryfile.gpg" + hostsummaryfile="$hostsummaryfile.gpg" + fi + + #WGETOPTS="--no-check-certificate" + if sitesummary-upload -u $url -f $hostsummaryfile -d; then + : + else + error "unable to submit to '$url'" + fi +done + +rm $hostsummaryfile +rm -r $tmpdir diff --git a/sitesummary/sitesummary-client.conf b/sitesummary/sitesummary-client.conf new file mode 100644 index 0000000..563bf6d --- /dev/null +++ b/sitesummary/sitesummary-client.conf @@ -0,0 +1,9 @@ +serverurls="http://localhost/cgi-bin/sitesummary-collector.cgi" + +fragdirs="/usr/lib/sitesummary/collect.d /etc/sitesummary/collect.d" + +gpgencrypt=false + +# Random sleep between 0 and $runsleep seconds before running. 3600 +# is one hour. +runsleep="3600" diff --git a/sitesummary/sitesummary-collector.cgi b/sitesummary/sitesummary-collector.cgi new file mode 100644 index 0000000..06acf4c --- /dev/null +++ b/sitesummary/sitesummary-collector.cgi @@ -0,0 +1,178 @@ +#!/usr/bin/perl -wT +# +# Receive HTTP post request with a file upload and process it as a +# sitesummary submission. +# +# Handle three different submission methods +# - mime-encoded upload with sitesummary report in compressed form + +use strict; +use CGI; +use POSIX qw(strftime); +use Socket; +use Sys::Syslog; + +my $basedir = "/var/lib/sitesummary"; +my $handlerdir = "/usr/lib/sitesummary/handler.d"; + +$ENV{PATH} = "/bin:/usr/bin"; + +print "Content-Type: text/plain\n\n"; + +my ($peeripaddr, $peername) = get_peerinfo(\*STDIN); + +if (exists $ENV{REQUEST_METHOD} && $ENV{REQUEST_METHOD} ne "POST") +{ + print "Sitesummary HTTP-POST submission URL\n"; + print "Visit http://debian-edu.alioth.debian.org/ for more info.\n"; + exit 0; +} + +# Extract post data, handle both simple and multipart way +my @entry; +my $filename = "unknown"; +if (exists $ENV{CONTENT_TYPE} && $ENV{CONTENT_TYPE} =~ m%multipart/form-data%){ + my $query = new CGI; + my $fh = $query->upload("sitesummary"); + if ($fh) { + $filename = $query->param("sitesummary"); + my $type = $query->uploadInfo($filename)->{'Content-Type'}; + if ("application/octet-stream" ne $type) { + print "Only 'application/octet-stream' is supported (not $type)!"; + die; + } else { + my $encoding = $query->uploadInfo($filename)->{'Content-Encoding'}; + if ("x-gzip" eq $encoding || "gzip" eq $encoding) { + # Uncompress + print "Compressed ($encoding) encoding detected.\n"; + my $data; + # $data = join("", <$fh>); + my $len = (stat($fh))[7]; + read $fh, $data, $len; + $data = Compress::Zlib::memGunzip($data); + @entry = ($data); + } else { # Pass throught + #print STDERR "Identity encoding detected.\n"; + @entry = <$fh>; + } + } + } else { + print $query->cgi_error; + die; + } +} else { + print <<EOF; +Unsupported submission method. +EOF +} + +my $timestamp = strftime("%Y-%m-%dT%H:%M:%S", gmtime()); + +if ($filename =~ m/.tar.gz$/) { + $filename = "sitesummary.tar.gz"; +} elsif ($filename =~ m/.tar.gz.gpg$/) { + $filename = "sitesummary.tar.gz.gpg"; +} else { + die "Unhandled file type '$filename'" +} + +# XXX Come up with some unique file name. +my $savefile = "$basedir/tmpstorage/$peeripaddr-$timestamp-$$-$filename"; + +open(SITESUMMARY, ">", $savefile) or die "Unable to write to $savefile"; +print SITESUMMARY @entry; +close SITESUMMARY; + +print "Thanks for your submission to site-summary!\n"; +print "SITESUMMARY HTTP-POST OK\n"; + +process_entry($peeripaddr, $peername, $savefile); + +unlink $savefile; + +exit 0; + +sub extract_unique_id { + my $eth0mac; + my $eth1mac; + my $eth2mac; + open(IFCONFIG, "system/ifconfig-a") || die "Unable to read ifconfig-a"; + while (<IFCONFIG>) { + chomp; + $eth0mac = $1 if (m/^eth0\s+Link encap:Ethernet HWaddr (\S+)/); + $eth1mac = $1 if (m/^eth1\s+Link encap:Ethernet HWaddr (\S+)/); + $eth2mac = $1 if (m/^eth2\s+Link encap:Ethernet HWaddr (\S+)/); + } + close (IFCONFIG); + #print STDERR "MAC: $eth0mac\n"; + my $mac = $eth0mac || $eth1mac || $eth2mac || "unknown"; + return lc("ether-$mac"); +} + +sub process_entry { + my ($peeripaddr, $peername, $filename) = @_; + my $dirname; + if ($filename =~ m/(.+).tar.gz$/) { + $dirname = $1; + mkdir $dirname; + chdir $dirname; + `tar zxf $filename`; + } else { + die "Unhandled file format '$filename'"; + } + + open(PEERINFO, ">peerinfo") || die; + print PEERINFO "$peeripaddr $peername\n"; + close(PEERINFO) || die; + + my $id = extract_unique_id($dirname); + if ("ether-unknown" eq $id) { + syslog('warning', "%s", "ignoring client without MAC address connected from \[$peeripaddr\]"); + chdir ".."; + `rm -r $dirname`; + return; + } + my $newdir = "$basedir/entries/$id"; + + my $status = "new"; + if ( -d $newdir ) { + `rm -r $newdir`; + $status = "update"; + } + + rename $dirname, $newdir || die; + + $ENV{"PATH"} = ""; + for my $handler (<$handlerdir/*>) { + # Untaint script path + $handler =~ m/^([^;]*)$/; $handler = $1; + system("$handler", "$newdir", "$status"); + } +} + +sub get_peerinfo { + my $sockethandle = shift; + my ($peeripstr, $peername) = ("", ""); + + if ($ENV{'REMOTE_ADDR'}) { # CGI variable + $peeripstr = $ENV{'REMOTE_ADDR'}; + $peeripstr =~ m/(\d+).(\d+).(\d+).(\d+)/; # Untaint + $peeripstr = "$1.$2.$3.$4"; + $peeripaddr = inet_aton($peeripstr); + $peername = gethostbyaddr($peeripaddr, AF_INET); + } elsif (my $sockaddr = getpeername($sockethandle)) { + my $peerport; + ($peerport, $peeripaddr) = sockaddr_in($sockaddr); + $peername = gethostbyaddr($peeripaddr, AF_INET); + $peeripstr = inet_ntoa($peeripaddr); + } else { + # Running on the command line, use test host + $peeripstr = "127.0.0.1"; + $peername = "localhost"; + } + if ("" eq $peername) { + syslog('warning', "%s", "client without DNS entry connected from \[$peeripstr\]"); + $peername = "$peeripstr"; + } + return ($peeripstr, $peername); +} diff --git a/sitesummary/sitesummary-makewebreport b/sitesummary/sitesummary-makewebreport new file mode 100755 index 0000000..bedad22 --- /dev/null +++ b/sitesummary/sitesummary-makewebreport @@ -0,0 +1,44 @@ +#!/bin/sh +# +# Make simple web page with summary information. This should be rewritten +# to use some template system and be more flexible. +# + +( +cat <<EOF +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> +<head> +<title>sitesummary report</title> +</head> +<body> +<h1>sitesummary report</h1> +EOF + +for f in site-summary \ + hostclass-summary \ + kernelversion-summary \ + agesinceseen-summary \ + hardware-model-summary \ + debian_edu-summary ; do + echo "<h2>$f</h2>" + echo "<pre>" + /usr/lib/sitesummary/$f + echo "</pre>" + echo +done + +# Add last updated string +echo "<hr>" +echo -n "<p><b>Last updated</b>: " +date +echo "</p>" + +cat <<EOF +</body> +</html> +EOF +) > /var/lib/sitesummary/www/index.html + +exit 0 diff --git a/sitesummary/sitesummary-nodes b/sitesummary/sitesummary-nodes new file mode 100755 index 0000000..4eaeb65 --- /dev/null +++ b/sitesummary/sitesummary-nodes @@ -0,0 +1,511 @@ +#!/usr/bin/perl +# +# Generate list of nodes to load from /etc/munin/munin.conf to check +# all the machines reporting to sitesummary. + +use strict; +use warnings; + +use SiteSummary; +use Getopt::Std; +use Socket; + +sub usage { + print <<EOF; +Usage: $0 [-hmnw] + + -h Show usage information + -m Generate munin configuration for all munin clients + -n Generate nagios configuration for all nagios clients + -w List all client DNS/IP-addresses and MAC addresses +EOF +} + +# Idea for way to provide overrides for the functions in this script +#eval 'require "/etc/sitesummary/sitesummary-nodes-override"'; +#if ($@ && $@ !~ qr{^Can't locate /etc/sitesummary/sitesummary-nodes-override}) { +# die $@; +#}; + +my %opts; +getopts("hmnw", \%opts) || (usage(), exit(1)); + +my %hostnames; + +for_all_hosts(\&handle_host); + +if ($opts{'h'}) { + usage(); + exit 0; +} elsif ($opts{'m'}) { + print_munin_list(); +} elsif ($opts{'w'}) { + print_ip_hw_list(); +} elsif ($opts{'n'}) { + generate_nagios_config(); +} else { + print_list(); +} +exit 0; + +sub handle_host { + my $hostid = shift; + my $address = get_dns_address($hostid); + $hostnames{$address} = $hostid; +} + +sub print_list { + for my $hostname (sort keys %hostnames) { + print "$hostname\n"; + } +} + +# Get an IP address, try to resolve it in DNS , and return the IP +# address if no DNS reverse entry was found. +sub get_dnsnameorip { + my $ipaddr = shift; + my $resolved; + $resolved = gethostbyaddr(inet_aton($ipaddr), AF_INET); + return $resolved || $ipaddr; +} + +sub is_munin_client { + my $hostid = shift; + return is_pkg_installed($hostid, "munin-node"); +} + +sub is_nagios_client { + my $hostid = shift; + return is_pkg_installed($hostid, "nagios-nrpe-server") || + is_pkg_installed($hostid, "nagios-text") || + is_pkg_installed($hostid, "nagios2") || + is_pkg_installed($hostid, "nagios3"); +} + +sub print_munin_list { + for my $hostname (sort keys %hostnames) { + next unless (is_munin_client($hostnames{$hostname})); + + # Using hostname as address, to avoid hardcoding IP addresses in + # the file. Might be an idea to fetch the IP address from + # system/ifconfig-a + print <<EOF; +[$hostname] + address $hostname + use_node_name yes + +EOF + } +} + +sub print_ip_hw_list { + for my $hostname (sort keys %hostnames) { + my $macaddress = get_primary_macaddress($hostnames{$hostname}); + print "$hostname $macaddress\n"; + } +} + +sub is_remote_nagios_client { + my $hostid = shift; + return is_pkg_installed($hostid, "nagios-nrpe-server") && ! + (is_pkg_installed($hostid, "nagios-text") || + is_pkg_installed($hostid, "nagios2") || + is_pkg_installed($hostid, "nagios3")); +} + +# Return information about the switches connected to a given host, as +# reported by cdpr (and perhaps lldp in the future?) +sub get_switch_info { + my $hostid = shift; + my %switch = (); + for my $if (qw(eth0 eth1)) { + my $path = get_filepath_current($hostid, "/system/cdpr.$if"); + my ($id, $addr); + if (open(my $fh, $path)) { + while (<$fh>) { + chomp; + if (m/^Device ID$/) { + $id = <$fh>; + chomp $id; + $id =~ s/^\s+value:\s+(\S)\s*/$1/; + } + if (m/^Addresses$/) { + $addr = <$fh>; + chomp $addr; + $addr =~ s/^\s+value:\s+(\S)\s*/$1/; + $switch{$addr} = $id; + } + } + close($fh); + } + } + return %switch ? %switch : (); +} + + +sub is_remote_nrpe_config_active { + my $hostid = shift; + + my $path = get_filepath_current($hostid, "/nagios/sitesummary-nrpe.cfg"); + if (open(my $fh, $path)) { + while (<$fh>) { + if (m/^dont_blame_nrpe=1$/) { + close($fh); + return "args"; + } + } + close($fh); + return "noargs"; + } + return undef; +} + + +sub print_nagios_service_check { + my ($remote, $hostname, $description, $check, $check_args) = @_; + my $template = "server-service"; + my $cmd; + if ($remote) { + $cmd = "check_nrpe!$check"; + if (defined $check_args) { + $check_args =~ s/!/ /g; + $cmd .= " -a $check_args"; + } + } else { + $cmd = "$check"; + $cmd .= "!$check_args" if defined $check_args; + } + print <<EOF; +define service { + use $template; + host_name $hostname + service_description $description + check_command $cmd +} +EOF +} + +sub nagios_hostgroup_namewash { + my $name = shift; + $name =~ s/[^0-9a-zA-Z_-]+/-/g; # Avoid illegal characteres + return $name; +} + +sub print_nagios_hostgroup { + my ($name, $alias) = @_; + + print <<EOF; +define hostgroup { + hostgroup_name $name +EOF + print " alias $alias\n" if $alias; + print "}\n"; +} + +sub print_nagios_host_check { + my ($template, $hostname, $address, $parent, @hostgroups) = @_; + $template = $template || "server-host"; + print <<EOF; +##################### $hostname ####################### +define host { + use $template + host_name $hostname + address $address +EOF + print " parents $parent\n" if ($parent); + if (@hostgroups) { + print " hostgroups " . join(",", @hostgroups), "\n"; + } + print "}\n"; +} + +sub generate_nagios_config { + my %hosts; + my %hostgroup; + for my $hostname (sort keys %hostnames) { + my @groups = (); + my $hostid = $hostnames{$hostname}; + + my $address = get_dns_address($hostid); + + my $redirect = ""; + my $nagiosclient = is_nagios_client($hostid); + my $remote = is_remote_nagios_client($hostid); + my $nrpestatus = is_remote_nrpe_config_active($hostid); + + # Only check laptops that have the nagios tools installed + if (is_laptop($hostid) && ! $remote && ! $nagiosclient) { + print "# Skipping laptop $hostname\n"; + next; + } + + my $site = get_site($hostid) || "none"; + my $sitegroup = get_sitegroup($hostid); + my $debversion = get_debian_ver($hostid); + my $eduprofile = get_debian_edu_profile($hostid); + my $eduversion = get_debian_edu_ver($hostid); + push(@groups, nagios_hostgroup_namewash("site-$site")); + if ($sitegroup) { + push(@groups, nagios_hostgroup_namewash("site-$site-$sitegroup")); + } + push(@groups, nagios_hostgroup_namewash("debian-version-$debversion")) + if defined $debversion; + if ($eduprofile) { + $eduprofile =~ s/^"|"$//g; # Remove "" around the values + for my $profile (split(/,\s*/, $eduprofile)) { + push(@groups, + nagios_hostgroup_namewash("edu-profile-$profile")); + } + } + if ($eduversion) { + $eduversion =~ s/^"|"$//g; # Remove "" around the values + push(@groups, nagios_hostgroup_namewash("edu-version-$eduversion")); + } + + my $hostclass = get_hostclass($hostid) || "none"; + push(@groups, nagios_hostgroup_namewash("hostclass-$hostclass")); + + for my $group ( @groups ) { + $hostgroup{$group} = 1; + } + + my $defaultroute = get_dnsnameorip(get_default_route($hostid)); + + # Also check default route host + if (defined $defaultroute && !exists $hosts{$defaultroute}) { + print_nagios_host_check(undef, $defaultroute, $defaultroute, + undef, "router"); + $hosts{$defaultroute} = $defaultroute; + $hostgroup{"router"} = 1; + print_nagios_service_check(0, $defaultroute, "ping", + "check_ping", "100.0,20%!500.0,60%"); + } + + my %switch = get_switch_info($hostid); + my @parents = (); + for my $addr (keys %switch) { + $hostgroup{"switch"} = 1; + print_nagios_host_check("switch-host", $switch{$addr}, $addr, + undef, "switch") + unless (exists $hosts{$switch{$addr}}); + $hosts{$switch{$addr}} = $addr; + push(@parents, $switch{$addr}) if $remote; + } + + print_nagios_host_check(undef, $hostname, $address, + join(",", @parents), @groups) + unless (exists $hosts{$hostname}); + $hosts{$hostname} = $address; + + # first, check ping to see if the other checks should be performed + print_nagios_service_check(0, $hostname, "ping", + "check_ping", "100.0,20%!500.0,60%"); + + my %tcpservices = + ( + 139 => { name => 'samba', package => 'samba' }, + 389 => { name => 'ldap', package => 'slapd' }, + 4949 => { name => 'munin', package => 'munin-node' }, + ); + + for my $port (sort { $a <=> $b } keys %tcpservices) { + next if (exists $tcpservices{$port}->{package} && ! + is_pkg_installed($hostid, + $tcpservices{$port}->{package})); + my $servicename = $tcpservices{$port}->{name}; + print_nagios_service_check(0, $hostname, $servicename, + "check_tcp", $port); + } + + # Check SSH server + print_nagios_service_check(0, $hostname, "ssh", + "check_ssh") + if is_pkg_installed($hostid, "openssh-server"); + + print_nagios_service_check(0, $hostname, "http", + "check_http") + if (is_pkg_installed($hostid, "apache") || + is_pkg_installed($hostid, "apache2")); + + # Check XFS port only if we can see that it is listening on TCP + if (is_pkg_installed($hostid, "xfs")) { + my $path = get_filepath_current($hostid, "/system/x11-fs-config"); + if ( -e $path ) { + my $tcp = 1; + open (my $fh, "<", $path) || die "unable to read from $path"; + while (<$fh>) { + chomp; + s/\#.+$//; + $tcp = 0 if m/^no-listen\s*=\s*tcp\s*$/; + } + close($fh); + print_nagios_service_check(0, $hostname, "xfs", + "check_tcp", 7100) + if ($tcp); + } + } + + print_nagios_service_check(0, $hostname, "cups queue", + "check_cups_queue") + if (is_pkg_installed($hostid, "cups")); + + # The rest of the checks only work if NRPE is installed and configured + next unless ((!$remote && $nagiosclient) + || ($remote && defined $nrpestatus)); + + # These work without any argument passing. + + # Check for APT upgrades + print_nagios_service_check($remote, $hostname, "apt-updates", + "check_apt"); + + # Check if a kernel reboot is needed + print_nagios_service_check($remote, $hostname, "kernel status", + "check_kernel_status"); + + # Detect bad DNS servers + print_nagios_service_check($remote, $hostname, "/etc/resolv.conf", + "check_etc_resolv"); + + # Detect hosts entries not matching DNS entries + print_nagios_service_check($remote, $hostname, "/etc/hosts", + "check_etc_hosts"); + + # Detect a shutdown in progress + print_nagios_service_check($remote, $hostname, "shutdown status", + "check_shutdown"); + + +# print_nagios_service_check($remote, $hostname, "dhcp", +# "check_dhcp") +# if is_pkg_installed($hostid, "dhcp3-server"); + + # Check DNS server + print_nagios_service_check($remote, $hostname, "dns", + "check_dns") + if is_pkg_installed($hostid, "pdns-server"); + + # Check FTP server + print_nagios_service_check($remote, $hostname, "ftp", + "check_ftp") + if is_pkg_installed($hostid, "proftpd"); + + # Check IMAPS server + print_nagios_service_check($remote, $hostname, "imaps", + "check_imaps") + if is_pkg_installed($hostid, "courier-imap-ssl"); + + # check software raid status + if ( -e get_filepath_current($hostid, "/system/mdstat") ) { + print_nagios_service_check($remote, $hostname, "sw-raid", + "check_linux_raid"); + } + + # Check NFS server + print_nagios_service_check($remote, $hostname, "nfs", + "check_nfs") + if is_pkg_installed($hostid, "nfs-kernel-server"); + + print_nagios_service_check($remote, $hostname, "smtp", + "check_smtp") + if (is_pkg_installed($hostid, "exim4-daemon-heavy") || + is_pkg_installed($hostid, "exim4-daemon-light")); + + # These need argument passing (as in dont_blame_nrpe=1) + next unless ((!$remote && $nagiosclient) + || ($remote && "args" eq $nrpestatus)); + + print_nagios_service_check($remote, $hostname, "swap", + "check_swap", "10%!5%"); + print_nagios_service_check($remote, $hostname, "current users", + "check_users", "20!50"); + print_nagios_service_check($remote, $hostname, "processes total", + "check_procs", "500!1000"); + print_nagios_service_check($remote, $hostname, "processes zombie", + "check_procs_zombie", "20!100"); + # Check unix load + print_nagios_service_check($remote, $hostname, "load as in top", + "check_load", "75,75,75!90,90,90"); + + # check disk free space + my $path = get_filepath_current($hostid, "/system/procmounts"); + if ( -e $path ) { + open (F, "<", $path) || die "unable to read from $path"; + my %checked; + while (<F>) { + chomp; + my ($device, $partition, $fs, $opts) = split; + next if (exists $checked{$device}); + # Avoid system file systems and non-local file systems. + next if ($fs eq "devpts" || + $fs eq "anon_inodefs" || + $fs eq "autofs" || + $fs eq "bdev" || + $fs eq "binfmt_misc" || + $fs eq "cgroup" || + $fs eq "cifs" || + $fs eq "cpuset" || + $fs eq "debugfs" || + $fs eq "fuse.ltspfs" || + $fs eq "fusectl" || + $fs eq "hugetlbfs" || + $fs eq "inotifyfs" || + $fs eq "iso9660" || + $fs eq "mqueue" || + $fs eq "nfs" || + $fs eq "nfs4" || + $fs eq "nfsd" || + $fs eq "oprofilefs" || + $fs eq "pipefs" || + $fs eq "proc" || + $fs eq "ramfs" || + $fs eq "rootfs" || + $fs eq "rpc_pipefs" || + $fs eq "securityfs" || + $fs eq "smb" || + $fs eq "sockfs" || + $fs eq "sysfs" || + $fs eq "tmpfs" || + $fs eq "usbfs"); + + $checked{$device} = 1; + my $warn = 10; + my $crit = 5; + print_nagios_service_check($remote, $hostname, + "disk $partition", + "check_disk", + "$warn%!$crit%!$partition"); + } + } + + # check munin if munin-node is installed + # check hw raid status + # check hardware status + + # check LDAP and LDAPS using the protocol + + # Check Squid web proxy + print_nagios_service_check($remote, $hostname, "squid", + "check_squid", "3128!http://www") + if is_pkg_installed($hostid, "squid"); + + print_nagios_service_check($remote, $hostname, "ntp time server", + "check_ntp", "-H!localhost") + if (is_pkg_installed($hostid, "ntp") || + is_pkg_installed($hostid, "ntp-server")); + + # Detect if cron no longer is running + print_nagios_service_check($remote, $hostname, "process - cron", + "check_procs_cron", "1:15!1:25") + if (is_pkg_installed($hostid, "cron")); + } + + if (%hostgroup) { + print <<EOF; +##################### host groups ####################### +EOF + for my $name (sort keys %hostgroup) { + print_nagios_hostgroup($name); + } + } +} diff --git a/sitesummary/sitesummary-update-munin b/sitesummary/sitesummary-update-munin new file mode 100755 index 0000000..d69c713 --- /dev/null +++ b/sitesummary/sitesummary-update-munin @@ -0,0 +1,71 @@ +#!/bin/sh +# +# Author: Petter Reinholdtsen + +set -e + +nodes=/usr/sbin/sitesummary-nodes +muninopts="" + +# Modify this in collector.cfg to /etc/munin/ to automatically replace +# the default munin configuration. +MUNINDIR=/var/lib/sitesummary + +if [ -d /var/cache/munin/www ] ; then + # Used since munin version 1.4.0-1 + muninhtmldir="/var/cache/munin/www" +else + muninhtmldir="/var/www/munin" +fi +# Based on of active config from munin version 1.2.5-1 +munindbdir=/var/lib/munin +muninlogdir=/var/log/munin +muninrundir=/var/run/munin +munintmpldir=/etc/munin/templates + +[ -f /etc/sitesummary/collector.cfg ] && . /etc/sitesummary/collector.cfg + +# The storage area is not configurable, because too many scripts have +# it hardcoded +entriesdir=/var/lib/sitesummary/entries + +generate_munin_config() { + # Generate munin config. Edit /etc/cron.d/munin to enable it. + # Add -c /var/lib/sitesummary/sitesummary-munin.conf to the calls + # to the munin scripts, or change MUNINDIR above. + ( + if [ -f $MUNINDIR/munin.conf.pre ] ; then + cat $MUNINDIR/munin.conf.pre + else + cat <<EOF +# Munin server configuration generated from cron using sitesummary +# data by $0 +# Do not edit, it will be overwritten. +# Edit $MUNINDIR/munin.conf.pre and +# $MUNINDIR/munin.conf.post instead. + +dbdir $munindbdir +htmldir $muninhtmldir +logdir $muninlogdir +rundir $muninrundir +tmpldir $munintmpldir + +EOF + fi + + $nodes -m $muninopts + + [ -f $MUNINDIR/munin.conf.post ] && cat $MUNINDIR/munin.conf.post + + # Make sure the subshell return true to trigger the mv below. + true + ) > $MUNINDIR/munin.conf.new && \ + chown root:root $MUNINDIR/munin.conf.new && \ + chmod a+r $MUNINDIR/munin.conf.new && \ + mv $MUNINDIR/munin.conf.new $MUNINDIR/munin.conf +} + +# Only enable if munin and sitesummary is installed. +if [ -f /etc/munin/munin.conf ] && [ -x /usr/sbin/sitesummary-nodes ]; then + generate_munin_config +fi diff --git a/sitesummary/sitesummary-update-nagios b/sitesummary/sitesummary-update-nagios new file mode 100755 index 0000000..96db4ee --- /dev/null +++ b/sitesummary/sitesummary-update-nagios @@ -0,0 +1,65 @@ +#!/bin/sh +# +# Author: Petter Reinholdtsen + +set -e + +nodes=/usr/sbin/sitesummary-nodes +nagiosopts="" + +# Specifies where to save the automatically generated nagios +# configuration. Add NAGIOSCFG="/etc/nagios3/sitesummary.cfg" to +# /etc/default/nagios3 to get Nagios to use this automatically +# generated configuration +NAGIOSDIR=/var/lib/sitesummary + +if [ -f /etc/sitesummary/collector.cfg ] ; then + . /etc/sitesummary/collector.cfg +fi + +# The storage area is not configurable, because too many scripts have +# it hardcoded +entriesdir=/var/lib/sitesummary/entries + +generate_nagios_config() { + ( + $nodes -n $nagiosopts + + if [ -f $NAGIOSDIR/nagios-generated.cfg.post ] ; then + cat $NAGIOSDIR/nagios-generated.cfg.post + fi + + true + ) > $NAGIOSDIR/nagios-generated.cfg.new && \ + chmod a+r $NAGIOSDIR/nagios-generated.cfg.new + if [ ! -s $NAGIOSDIR/nagios-generated.cfg.new ] || \ + cmp -s $NAGIOSDIR/nagios-generated.cfg.new \ + $NAGIOSDIR/nagios-generated.cfg + then + rm $NAGIOSDIR/nagios-generated.cfg.new + false + else + mv $NAGIOSDIR/nagios-generated.cfg.new $NAGIOSDIR/nagios-generated.cfg + true + fi +} + +# Only enable if nagios v3 and sitesummary is installed. +if [ -f /etc/init.d/nagios3 ] && [ -x $nodes ]; then + # Only reload nagios if the configuration changed + if generate_nagios_config ; then + # subshell to avoid passing all variables from + # /etc/default/nagios3 to other parts of this script + ( + if [ -r /etc/default/nagios3 ] ; then + . /etc/default/nagios3 + fi + # Only reload nagios if the sitesummary config is the active + # one and nagios3 is currently running. + if [ /etc/nagios3/sitesummary.cfg = "$NAGIOSCFG" ] && \ + invoke-rc.d nagios3 status >/dev/null ; then + invoke-rc.d nagios3 reload >/dev/null + fi + ) + fi +fi diff --git a/sitesummary/sitesummary-upload b/sitesummary/sitesummary-upload new file mode 100755 index 0000000..6e5504c --- /dev/null +++ b/sitesummary/sitesummary-upload @@ -0,0 +1,102 @@ +#!/usr/bin/perl -w +# Written by Bill Allombert for the Debian popularity-contest project. +# This file is placed in the public domain. +# Rewritten for sitesummary by Petter Reinholdtsen + +use strict; +use IO::Socket; +use Getopt::Std; +use File::Basename; + +my %opts; +getopts("du:f:", \%opts); + +sub usage { + print <<"EOF"; +Usage: $0 [-Cd] [-u <url>] [-f <file>] + -d enable debugging + -u <url> submit to the given URL (default localhost) + -f <file> read popcon report from file (default stdin) +EOF +} + +my ($submiturl) = $opts{'u'} || "http://localhost/cgi-bin/sitesummary-collector.cgi"; +my ($file) = $opts{'f'} || "-"; + +my ($host) = $submiturl =~ m%http://([^/]+)%; + +print "Unable to parse url\n" if ($opts{'d'} && ! $host); + +# Configure the proxy: +my ($http_proxy,$proxy,$port,$remote); + +$http_proxy=$ENV{'http_proxy'}; +if (defined($http_proxy)) +{ + $http_proxy =~ m{http://([^:]*)(?::([0-9]+))?} + or die ("unrecognized http_proxy"); + $proxy=$1; $port=$2; +} + +$proxy=$host unless (defined($proxy)); +$port=80 unless (defined($port)); + +# Compress the report: +my ($str,$len); +my $encoding; +open FILE, "< $file" or die "reading from '$file'"; +$encoding = "identity"; +$str .= $_ while(<FILE>); +close(FILE); +$len = length($str); + +# 30 second timeout on http connections +$SIG{ALRM} = sub { die "timeout in sitesummary-upload\n" }; +alarm(30); + +# Connect to server +$remote = IO::Socket::INET->new(Proto => "tcp", PeerAddr => $proxy, + PeerPort => $port); +unless ($remote) { die "cannot connect to $proxy:$port" } + +my $boundary = "----------ThIs_Is_tHe_bouNdaRY_\$"; + +my $basefile = basename($file); + +#Content-Length: $len +# text/plain; charset=utf-8 +my $ORS = "\r\n"; # Use DOS line endings to make HTTP happy +my $form; +$form .= "--${boundary}$ORS"; +$form .= "Content-Disposition: form-data; name=\"sitesummary\"; filename=\"$basefile\"$ORS"; +$form .= "Content-Encoding: $encoding$ORS"; +$form .= "Content-Type: application/octet-stream$ORS$ORS"; +$form .= "$str$ORS"; +$form .= "--${boundary}--$ORS"; +$form .= "$ORS"; + +my $formlen = length($form); + +#Send data +print $remote <<"EOF"; +POST $submiturl HTTP/1.1 +User-Agent: sitesummary-upload +Host: $host +content-type: multipart/form-data; boundary=$boundary +content-length: $formlen + +$form +EOF + +#Get answer +my($answer)=""; +while(<$remote>) +{ + $answer.=$_; + m/SITESUMMARY HTTP-POST OK/ and last; +} +close ($remote); +#Check answer +my $status = ($answer =~ m/SITESUMMARY HTTP-POST OK/) ? 0 : 1; +print "Failed to upload, answer '$answer'\n" if $status && $opts{'d'}; +exit $status; |