Index: ossp-pkg/snmpdx/00README RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/Attic/00README,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/Attic/00README,v' | diff -u - /dev/null -L'ossp-pkg/snmpdx/00README' 2>/dev/null --- ossp-pkg/snmpdx/00README +++ /dev/null 2024-05-13 18:22:11.000000000 +0200 @@ -1,47 +0,0 @@ - _ ___ ____ ____ ____ - |_|_ _ / _ \/ ___/ ___|| _ \ - _|_||_| | | | \___ \___ \| |_) | - |_||_|_| | |_| |___) |__) | __/ - |_|_|_| \___/|____/____/|_| - - OSSP snmpdx - SNMP Daemon Extension - Version 0.1.0 (30-Jan-2003) - - ABSTRACT - - OSSP snmpdx is ... - - COPYRIGHT AND LICENSE - - Copyright (c) 2003 Ralf S. Engelschall - Copyright (c) 2003 The OSSP Project - Copyright (c) 2003 Cable & Wireless Germany - - This file is part of OSSP snmpdx, ... - can be found at http://www.ossp.org/pkg/tool/snmpdx/. - - Permission to use, copy, modify, and distribute this software for - any purpose with or without fee is hereby granted, provided that - the above copyright notice and this permission notice appear in all - copies. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - HOME AND DOCUMENTATION - - The documentation and latest release can be found on - - o http://www.ossp.org/pkg/tool/snmpdx/ - o ftp://ftp.ossp.org/pkg/tool/snmpdx/ - Index: ossp-pkg/snmpdx/AUTHORS RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/AUTHORS,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/AUTHORS,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/AUTHORS' 2>/dev/null --- ossp-pkg/snmpdx/AUTHORS +++ - 2024-05-13 18:22:49.311218171 +0200 @@ -0,0 +1,19 @@ + _ ___ ____ ____ ____ + |_|_ _ / _ \/ ___/ ___|| _ \ + _|_||_| | | | \___ \___ \| |_) | + |_||_|_| | |_| |___) |__) | __/ + |_|_|_| \___/|____/____/|_| + + OSSP snmpdx - SNMP Daemon Extension + Version 0.2.0 (09-Sep-2003) + ____________________________________________________________________ + + AUTHORS + + This is a list of authors who have written or edited parts of + the OSSP snmpdx sources. + + o OSSP snmpdx (as a whole) + Written by: Ralf S. Engelschall + Thomas Lotterer + Index: ossp-pkg/snmpdx/COPYING RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/COPYING,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/COPYING,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/COPYING' 2>/dev/null --- ossp-pkg/snmpdx/COPYING +++ - 2024-05-13 18:22:49.313812715 +0200 @@ -0,0 +1,280 @@ + 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 Index: ossp-pkg/snmpdx/ChangeLog RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/ChangeLog,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/ChangeLog,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/ChangeLog' 2>/dev/null --- ossp-pkg/snmpdx/ChangeLog +++ - 2024-05-13 18:22:49.316510100 +0200 @@ -0,0 +1,23 @@ + _ ___ ____ ____ ____ + |_|_ _ / _ \/ ___/ ___|| _ \ + _|_||_| | | | \___ \___ \| |_) | + |_||_|_| | |_| |___) |__) | __/ + |_|_|_| \___/|____/____/|_| + + OSSP snmpdx - SNMP Daemon Extension + Version 0.2.0 (09-Sep-2003) + ____________________________________________________________________ + + ChangeLog + + Changes between 0.1.0 and 0.2.0 (9-Sep-2003): + *) Build environment, OpenPKG package + [Thomas Lotterer] + + Changes between *GENESIS* and 0.1.0 (Aug-2003 to 9-Sep-2003): + *) Framework and initial probes + [Ralf S. Engelschall] + + *) More probes + [Thomas Lotterer] + Index: ossp-pkg/snmpdx/INSTALL RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/INSTALL,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/INSTALL,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/INSTALL' 2>/dev/null --- ossp-pkg/snmpdx/INSTALL +++ - 2024-05-13 18:22:49.319093933 +0200 @@ -0,0 +1,14 @@ + _ ___ ____ ____ ____ + |_|_ _ / _ \/ ___/ ___|| _ \ + _|_||_| | | | \___ \___ \| |_) | + |_||_|_| | |_| |___) |__) | __/ + |_|_|_| \___/|____/____/|_| + + OSSP snmpdx - SNMP Daemon Extension + Version 0.2.0 (09-Sep-2003) + ____________________________________________________________________ + + INSTALLATION + + FIXME + Index: ossp-pkg/snmpdx/Makefile RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/Attic/Makefile,v co -q -kk -p'1.2' '/v/ossp/cvs/ossp-pkg/snmpdx/Attic/Makefile,v' | diff -u - /dev/null -L'ossp-pkg/snmpdx/Makefile' 2>/dev/null --- ossp-pkg/snmpdx/Makefile +++ /dev/null 2024-05-13 18:22:11.000000000 +0200 @@ -1,27 +0,0 @@ - -SRCDIR = `pwd` -OPENPKG = /cw -RC = $(OPENPKG)/etc/rc -SNMPGET = $(OPENPKG)/bin/snmpget -SNMPWALK = $(OPENPKG)/bin/snmpwalk -SNMPHOSTS = dv1 dv6 dv9 -SNMPMIBDIR = $(SRCDIR)/snmpdx.mib:$(OPENPKG)/share/snmp/mibs -SNMPMIBNAME = snmpdx - -restart: - @for host in $(SNMPHOSTS); do \ - echo "==== $$host ===="; \ - ssh -t root@$$host "$(RC) snmp stop start"; \ - $(SNMPGET) \ - -M $(SNMPMIBDIR) -cpublic -v2c -mALL \ - $$host $(SNMPMIBNAME)::swOsName; \ - done - -query: - @for host in $(SNMPHOSTS); do \ - echo "==== $$host ===="; \ - $(SNMPWALK) \ - -M $(SNMPMIBDIR) -cpublic -v2c -mALL \ - $$host $(SNMPMIBNAME); \ - done - Index: ossp-pkg/snmpdx/Makefile.in RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/Makefile.in,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/Makefile.in,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/Makefile.in' 2>/dev/null --- ossp-pkg/snmpdx/Makefile.in +++ - 2024-05-13 18:22:49.324287328 +0200 @@ -0,0 +1,75 @@ +## +## OSSP snmpdx - SNMP Daemon Extension +## +## Copyright (c) 2003 Ralf S. Engelschall +## Copyright (c) 2003 The OSSP Project +## Copyright (c) 2003 Cable & Wireless Germany +## +## This file is part of OSSP snmpd, a SNMP Daemon Extension which +## can be found at http://www.ossp.org/pkg/tool/snmpdx/. +## +## 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.0 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 file; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +## USA, or contact Ralf S. Engelschall . +## +## Makefile.in: build procedure source (syntax: make) +## + +@SET_MAKE@ + +SHELL = /bin/sh +SHTOOL = ./shtool +RM = rm -f +SED = sed +POD2MAN = pod2man +PERL = @PATH_PERL@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +mandir = @mandir@ + +DESTDIR = + +all: snmpdx snmpdx.1 + +snmpdx: snmpdx.pl + @$(SHTOOL) echo -e "%Bgenerating snmpdx%b" + $(SED) -e "s;#!\@PERL\@;#!$(PERL);" \ + snmpdx && \ + chmod a+x snmpdx + +snmpdx.1: snmpdx.pod + @$(SHTOOL) echo -e "%Bgenerating snmpdx.1%b" + V=`$(SHTOOL) version -l txt -d short VERSION`; \ + D=`$(SHTOOL) version -l txt -d long VERSION | $(SED) -e 's;.*(;;' -e 's;).*;;'`; \ + $(POD2MAN) --section=1 --center="SNMP Daemon Extension" \ + --release="$$D" --date="OSSP snmpdx $$V" snmpdx.pod >snmpdx.1 + +install: all + $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(bindir) + $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(libdir) + $(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(mandir)/man1 + $(SHTOOL) install -c -m 755 snmpdx $(DESTDIR)$(bindir)/snmpdx + $(SHTOOL) install -c -m 644 snmpdx.1 $(DESTDIR)$(mandir)/man1/snmpdx.1 + +clean: + $(RM) snmpdx snmpdx.1 + +distclean: clean + $(RM) config.cache config.status config.log + $(RM) Makefile config.h + Index: ossp-pkg/snmpdx/README RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/README,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/README,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/README' 2>/dev/null --- ossp-pkg/snmpdx/README +++ - 2024-05-13 18:22:49.326930244 +0200 @@ -0,0 +1,50 @@ + _ ___ ____ ____ ____ + |_|_ _ / _ \/ ___/ ___|| _ \ + _|_||_| | | | \___ \___ \| |_) | + |_||_|_| | |_| |___) |__) | __/ + |_|_|_| \___/|____/____/|_| + + OSSP snmpdx - SNMP Daemon Extension + Version 0.2.0 (09-Sep-2003) + + ABSTRACT + + OSSP snmpdx is a framework for easily hooking into net-snmp's snmpd(8) + and providing an own SNMP MIB and the OID implementing probes. It + is a Perl program which either can be configured as a pass (not + recommended) or pass_persist (recommended) program into snmpd.conf. + + COPYRIGHT AND LICENSE + + Copyright (c) 2003 Ralf S. Engelschall + Copyright (c) 2003 The OSSP Project + Copyright (c) 2003 Cable & Wireless Germany + + This file is part of OSSP snmpd, a SNMP Daemon Extension which + can be found at http://www.ossp.org/pkg/tool/snmpdx/. + + Permission to use, copy, modify, and distribute this software for + any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all + copies. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + HOME AND DOCUMENTATION + + The documentation and latest release can be found on + + o http://www.ossp.org/pkg/tool/snmpdx/ + o ftp://ftp.ossp.org/pkg/tool/snmpdx/ + Index: ossp-pkg/snmpdx/THANKS RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/THANKS,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/THANKS,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/THANKS' 2>/dev/null --- ossp-pkg/snmpdx/THANKS +++ - 2024-05-13 18:22:49.329526981 +0200 @@ -0,0 +1,19 @@ + _ ___ ____ ____ ____ + |_|_ _ / _ \/ ___/ ___|| _ \ + _|_||_| | | | \___ \___ \| |_) | + |_||_|_| | |_| |___) |__) | __/ + |_|_|_| \___/|____/____/|_| + + OSSP snmpdx - SNMP Daemon Extension + Version 0.2.0 (09-Sep-2003) + ____________________________________________________________________ + + THANKS + + Credit has to be given to the following people who contributed ideas, + stuff, bugfixes, hints etc. (in alphabetical order): + + o Christoph Schug + + ...and all other OSSP snmpd users who gave me feedback but I've forgot. + Index: ossp-pkg/snmpdx/VERSION RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/VERSION,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/VERSION,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/VERSION' 2>/dev/null --- ossp-pkg/snmpdx/VERSION +++ - 2024-05-13 18:22:49.332025605 +0200 @@ -0,0 +1,18 @@ +## +## VERSION -- Version Information for OSSP snmpdx (syntax: Perl) +## [automatically generated and maintained by GNU shtool] +## + +my $snmpdx_version = { + 'v_hex' => 0x002200, + 'v_short' => "0.2.0", + 'v_long' => "0.2.0 (09-Sep-2003)", + 'v_tex' => "This is OSSP snmpdx, Version 0.2.0 (09-Sep-2003)", + 'v_gnu' => "OSSP snmpdx 0.2.0 (09-Sep-2003)", + 'v_web' => "OSSP snmpdx/0.2.0", + 'v_sccs' => "@(#)OSSP snmpdx 0.2.0 (09-Sep-2003)", + 'v_rcs' => "\$Id$/" +}; + +1; + Index: ossp-pkg/snmpdx/config.h.in RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/config.h.in,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/config.h.in,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/config.h.in' 2>/dev/null --- ossp-pkg/snmpdx/config.h.in +++ - 2024-05-13 18:22:49.334594346 +0200 @@ -0,0 +1,16 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION Index: ossp-pkg/snmpdx/configure.ac RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/configure.ac,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/configure.ac,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/configure.ac' 2>/dev/null --- ossp-pkg/snmpdx/configure.ac +++ - 2024-05-13 18:22:49.337088186 +0200 @@ -0,0 +1,55 @@ +## +## OSSP snmpdx - SNMP Daemon Extension +## +## Copyright (c) 2003 Ralf S. Engelschall +## Copyright (c) 2003 The OSSP Project +## Copyright (c) 2003 Cable & Wireless Germany +## +## This file is part of OSSP snmpd, a SNMP Daemon Extension which +## can be found at http://www.ossp.org/pkg/tool/snmpdx/. +## +## 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.0 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 file; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +## USA, or contact Ralf S. Engelschall . +## +## configure.ac: auto-configuration source (syntax: Autoconf) +## + +AC_PREREQ(2.53) +AC_INIT + +V=`./shtool version -ltxt -dlong VERSION` +./shtool echo -e "Configuring %BOSSP snmpdx%b, Version %B${V}%b" +echo "Copyright (c) 2003 Ralf S. Engelschall " +echo "Copyright (c) 2003 The OSSP Project " +echo "Copyright (c) 2003 Cable & Wireless Germany " + +AC_MSG_CHECKING(for Perl program) +AC_ARG_WITH(perl,dnl +[ --with-perl=PATH force the use of a particular Perl program], +with_perl="$withval", +if test ".$with_perl" = .; then + with_perl=`./shtool path -m perl5 perl` +fi +)dnl +PATH_PERL="$with_perl" +AC_SUBST(PATH_PERL) +AC_MSG_RESULT($PATH_PERL) + +AC_SET_MAKE + +AC_CONFIG_HEADERS(config.h) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT + Index: ossp-pkg/snmpdx/devtool RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/devtool,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/devtool,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/devtool' 2>/dev/null --- ossp-pkg/snmpdx/devtool +++ - 2024-05-13 18:22:49.339711185 +0200 @@ -0,0 +1,47 @@ +#!/bin/sh +## +## devtool -- Development Tool +## Copyright (c) 2001 Ralf S. Engelschall +## + +if [ $# -eq 0 ]; then + echo "devtool:USAGE: devtool [ ...]" 1>&2 + exit 1 +fi + +cmd="$1" +shift + +devtoolfunc="./devtool.func" + +if [ ! -f devtool.conf ]; then + echo "devtool:ERROR: no devtool.conf in current directory" 1>&2 + exit 1 +fi + +cmdline=`grep "^%$cmd" devtool.conf` +if [ ".$cmdline" = . ]; then + echo "devtool:ERROR: command $cmd not found in devtool.conf" 1>&2 + exit 1 +fi + +if [ ".$TMPDIR" != . ]; then + tmpdir="$TMPDIR" +elif [ ".$TEMPDIR" != . ]; then + tmpdir="$TEMPDIR" +else + tmpdir="/tmp" +fi +tmpfile="$tmpdir/rc.$$.tmp" + +rm -f $tmpfile +touch $tmpfile +echo ". $devtoolfunc" >>$tmpfile +( sed >$tmpfile + +sh $tmpfile "$@" + +rm -f $tmpfile >/dev/null 2>&1 || true + Index: ossp-pkg/snmpdx/devtool.conf RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/devtool.conf,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/devtool.conf,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/devtool.conf' 2>/dev/null --- ossp-pkg/snmpdx/devtool.conf +++ - 2024-05-13 18:22:49.342245698 +0200 @@ -0,0 +1,66 @@ +## +## devtool.conf -- Development Tool Configuration +## + +%autogen + @autogen shtool 1.6.2 "1.6.*" all + @autogen autoconf 2.57 "2.5[4-9]*" + +%autoclean + @autoclean shtool + @autoclean libtool + @autoclean autoconf + +%configure + ./configure \ + --prefix=/tmp/snmpdx \ + "$@" + +%release + ./devtool version + ./devtool tag + ./devtool dist + ./devtool upload + +%version + ./shtool version -lperl -n "OSSP snmpdx" -p "snmpdx_" -e VERSION + V=`./shtool version -lperl -dlong VERSION` + for i in AUTHORS ChangeLog INSTALL README THANKS; do + sed -e "s/ Version .*/ Version $V/g" <$i >$i.n && mv $i.n $i + done + +%tag + V=`./shtool version -lc -dshort VERSION | sed -e 's;\.;_;g'` + echo "+++ tagging CVS sources as SNMPDX_${V}" + cvs commit -m 'flush pending changes before tagging' + cvs tag SNMPDX_${V} + +%dist + echo "+++ removing old tarballs" + rm -f snmpdx-*.tar.gz + echo "+++ generating" + ./devtool autoclean + ./devtool autogen + echo "+++ configuring" + ./devtool configure + echo "+++ building" + make clean all man + echo "+++ cleaning" + make distclean + echo "+++ fixing" + ./shtool fixperm -v . + echo "+++ rolling" + V=`./shtool version -lc -dshort VERSION` + ./shtool tarball -o snmpdx-${V}.tar.gz -d snmpdx-${V} -u ossp -g ossp \ + -e 'CVS,\.cvsignore,\.[ao]$,^\.,devtool*,*.tar.gz,^#.*,.*~$' -c 'gzip --best' . + ls -l snmpdx-${V}.tar.gz + echo "+++ testing" + gunzip /dev/null --- ossp-pkg/snmpdx/devtool.func +++ - 2024-05-13 18:22:49.344808983 +0200 @@ -0,0 +1,73 @@ +## +## devtool.func -- Development Tool Functions +## Copyright (c) 2001-2002 Ralf S. Engelschall +## + +devtool_require () { + t="$1"; o="$2"; p="$3"; e="$4"; a="$5" + v=`($t $o | head -1 | awk "{ print \\\$$p; }") 2>/dev/null` + if [ ".$v" = . ]; then + echo "devtool:ERROR: unable to determine version of $t" 1>&2 + exit 1 + fi + case "$v" in + $e ) + ;; + $a ) + echo "devtool:WARNING: $t version $v accepted, but expected $e." 1>&2 + ;; + * ) + echo "devtool:ERROR: $t version $v NOT acceptable, requires $e." 1>&2 + exit 1 + ;; + esac + echo "$v" +} + +devtool_autogen () { + tool=$1 + shift + case $tool in + autoconf ) + autoconf_version=`devtool_require autoconf --version 4 "$1" "$2"` + echo "generating (GNU Autoconf $autoconf_version): configure config.h.in" + autoconf + autoheader 2>&1 | grep -v "is unchanged" + rm -rf autom4te.cache >/dev/null 2>&1 + ;; + libtool ) + libtoolize_version=`devtool_require libtoolize --version 4 "$1" "$2"` + echo "generating (GNU Libtool $libtoolize_version): ltmain.sh, libtool.m4, config.guess, config.sub" + libtoolize --force --copy >/dev/null 2>&1 + cp `libtoolize --force --copy --dry-run | grep "add the contents of" |\ + sed -e 's;^[^\`]*\`;;' -e "s;'.*;;"` libtool.m4 + ;; + shtool ) + shtoolize_version=`devtool_require shtoolize -v 3 "$1" "$2"` + echo "generating (GNU Shtool $shtoolize_version): shtool" + shift + shift + shtoolize -q "$@" + ;; + esac +} + +devtool_autoclean () { + tool=$1 + shift + case $tool in + autoconf ) + echo "removing: configure config.h.in" + rm -f configure config.h.in + ;; + libtool ) + echo "removing: ltmain.sh libtool.m4 config.guess config.sub" + rm -f ltmain.sh libtool.m4 config.guess config.sub + ;; + shtool ) + echo "removing: shtool" + rm -f shtool + ;; + esac +} + Index: ossp-pkg/snmpdx/shtool RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/Attic/shtool,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/Attic/shtool,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/shtool' 2>/dev/null --- ossp-pkg/snmpdx/shtool +++ - 2024-05-13 18:22:49.347413502 +0200 @@ -0,0 +1,3506 @@ +#!/bin/sh +## +## GNU shtool -- The GNU Portable Shell Tool +## Copyright (c) 1994-2002 Ralf S. Engelschall +## +## See http://www.gnu.org/software/shtool/ for more information. +## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. +## +## Version: 1.6.2 (02-Nov-2002) +## Contents: all available modules +## + +## +## 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, or contact Ralf S. Engelschall . +## +## NOTICE: Given that you include this file verbatim into your own +## source tree, you are justified in saying that it remains separate +## from your package, and that this way you are simply just using GNU +## shtool. So, in this situation, there is no requirement that your +## package itself is licensed under the GNU General Public License in +## order to take advantage of GNU shtool. +## + +## +## Usage: shtool [] [ [] []] +## +## Available commands: +## echo Print string with optional construct expansion +## mdate Pretty-print modification time of a file or dir +## table Pretty-print a field-separated list as a table +## prop Display progress with a running propeller +## move Move files with simultaneous substitution +## install Install a program, script or datafile +## mkdir Make one or more directories +## mkln Make link with calculation of relative paths +## mkshadow Make a shadow tree through symbolic links +## fixperm Fix file permissions inside a source tree +## rotate Logfile rotation +## tarball Roll distribution tarballs +## subst Apply sed(1) substitution operations +## guessos Simple operating system guesser +## arx Extended archive command +## slo Separate linker options by library class +## scpp Sharing C Pre-Processor +## version Maintain a version information file +## path Deal with program paths +## + +if [ $# -eq 0 ]; then + echo "$0:Error: invalid command line" 1>&2 + echo "$0:Hint: run \`$0 -h' for usage" 1>&2 + exit 1 +fi +if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then + echo "This is GNU shtool, version 1.6.2 (02-Nov-2002)" + echo "Copyright (c) 1994-2002 Ralf S. Engelschall " + echo "Report bugs to " + echo '' + echo "Usage: shtool [] [ [] []]" + echo '' + echo 'Available global :' + echo ' -v, --version display shtool version information' + echo ' -h, --help display shtool usage help page (this one)' + echo ' -d, --debug display shell trace information' + echo ' -r, --recreate recreate this shtool script via shtoolize' + echo '' + echo 'Available [] []:' + echo ' echo [-n|--newline] [-e|--expand] [ ...]' + echo ' mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]' + echo ' [-f|--field-sep ] [-o|--order ] ' + echo ' table [-F|--field-sep ] [-w|--width ] [-c|--columns' + echo ' ] [-s|--strip ] ...' + echo ' prop [-p|--prefix ]' + echo ' move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]' + echo ' ' + echo ' install [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]' + echo ' [-C|--compare-copy] [-s|--strip] [-m|--mode ]' + echo ' [-o|--owner ] [-g|--group ] [-e|--exec' + echo ' ] [ ...] ' + echo ' mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode' + echo ' ] [-o|--owner ] [-g|--group ] ' + echo ' [ ...]' + echo ' mkln [-t|--trace] [-f|--force] [-s|--symbolic] ' + echo ' [ ...] ' + echo ' mkshadow [-v|--verbose] [-t|--trace] [-a|--all] ' + echo ' fixperm [-v|--verbose] [-t|--trace] [ ...]' + echo ' rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files' + echo ' ] [-s|--size ] [-c|--copy] [-r|--remove]' + echo ' [-a|--archive-dir ] [-z|--compress [:]]' + echo ' [-b|--background] [-d|--delay] [-p|--pad ] [-o|--owner' + echo ' ] [-g|--group ] [-m|--mode ] [-M|--migrate' + echo ' ] [-P|--prolog ] [-E|--epilog ] [...]' + echo ' tarball [-t|--trace] [-v|--verbose] [-o|--output ]' + echo ' [-c|--compress ] [-d|--directory ] [-u|--user' + echo ' ] [-g|--group ] [-e|--exclude ]' + echo ' [ ...]' + echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-s|--stealth]' + echo ' [-i|--interactive] [-b|--backup ] [-e|--exec ]' + echo ' [-f|--file ] [] [...]' + echo ' guessos ' + echo ' arx [-t|--trace] [-C|--command ] [' + echo ' ...]' + echo ' slo [-p|--prefix ] -- -L -l [-L -l' + echo ' ...]' + echo ' scpp [-v|--verbose] [-p|--preserve] [-f|--filter ]' + echo ' [-o|--output ] [-t|--template ] [-M|--mark' + echo ' ] [-D|--define ] [-C|--class ]' + echo ' [ ...]' + echo ' version [-l|--language ] [-n|--name ] [-p|--prefix' + echo ' ] [-s|--set ] [-e|--edit] [-i|--increase' + echo ' ] [-d|--display ] ' + echo ' path [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename]' + echo ' [-m|--magic] [-p|--path ] [ ...]' + echo '' + exit 0 +fi +if [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then + echo "GNU shtool 1.6.2 (02-Nov-2002)" + exit 0 +fi +if [ ".$1" = ".-r" -o ".$1" = ."--recreate" ]; then + shtoolize -oshtool all + exit 0 +fi +if [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then + shift + set -x +fi +name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` +case "$name" in + echo|mdate|table|prop|move|install|mkdir|mkln|mkshadow|fixperm|rotate|tarball|subst|guessos|arx|slo|scpp|version|path ) + # implicit tool command selection + tool="$name" + ;; + * ) + # explicit tool command selection + tool="$1" + shift + ;; +esac +arg_spec="" +opt_spec="" +gen_tmpfile=no + +## +## DISPATCH INTO SCRIPT PROLOG +## + +case $tool in + echo ) + str_tool="echo" + str_usage="[-n|--newline] [-e|--expand] [ ...]" + arg_spec="0+" + opt_spec="n.e." + opt_alias="n:newline,e:expand" + opt_n=no + opt_e=no + ;; + mdate ) + str_tool="mdate" + str_usage="[-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits] [-f|--field-sep ] [-o|--order ] " + arg_spec="1=" + opt_spec="n.z.s.d.f:o:" + opt_alias="n:newline,z:zero,s:shorten,d:digits,f:field-sep,o:order" + opt_n=no + opt_z=no + opt_s=no + opt_d=no + opt_f=" " + opt_o="dmy" + ;; + table ) + str_tool="table" + str_usage="[-F|--field-sep ] [-w|--width ] [-c|--columns ] [-s|--strip ] ..." + arg_spec="1+" + opt_spec="F:w:c:s:" + opt_alias="F:field-sep,w:width,c:columns,s:strip" + opt_F=":" + opt_w=15 + opt_c=3 + opt_s=79 + ;; + prop ) + str_tool="prop" + str_usage="[-p|--prefix ]" + arg_spec="0=" + opt_spec="p:" + opt_alias="p:prefix" + opt_p="" + ;; + move ) + str_tool="move" + str_usage="[-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve] " + arg_spec="2=" + opt_spec="v.t.e.p." + opt_alias="v:verbose,t:trace,e:expand,p:preserve" + opt_v=no + opt_t=no + opt_e=no + opt_p=no + ;; + install ) + str_tool="install" + str_usage="[-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode ] [-o|--owner ] [-g|--group ] [-e|--exec ] [ ...] " + arg_spec="1+" + opt_spec="v.t.d.c.C.s.m:o:g:e+" + opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec" + opt_v=no + opt_t=no + opt_d=no + opt_c=no + opt_C=no + opt_s=no + opt_m="0755" + opt_o="" + opt_g="" + opt_e="" + ;; + mkdir ) + str_tool="mkdir" + str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode ] [-o|--owner ] [-g|--group ] [ ...]" + arg_spec="1+" + opt_spec="t.f.p.m:o:g:" + opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group" + opt_t=no + opt_f=no + opt_p=no + opt_m="" + opt_o="" + opt_g="" + ;; + mkln ) + str_tool="mkln" + str_usage="[-t|--trace] [-f|--force] [-s|--symbolic] [ ...] " + arg_spec="2+" + opt_spec="t.f.s." + opt_alias="t:trace,f:force,s:symbolic" + opt_t=no + opt_f=no + opt_s=no + ;; + mkshadow ) + str_tool="mkshadow" + str_usage="[-v|--verbose] [-t|--trace] [-a|--all] " + arg_spec="2=" + opt_spec="v.t.a." + opt_alias="v:verbose,t:trace,a:all" + opt_v=no + opt_t=no + opt_a=no + ;; + fixperm ) + str_tool="fixperm" + str_usage="[-v|--verbose] [-t|--trace] [ ...]" + arg_spec="1+" + opt_spec="v.t." + opt_alias="v:verbose,t:trace" + opt_v=no + opt_t=no + ;; + rotate ) + str_tool="rotate" + str_usage="[-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files ] [-s|--size ] [-c|--copy] [-r|--remove] [-a|--archive-dir ] [-z|--compress [:]] [-b|--background] [-d|--delay] [-p|--pad ] [-o|--owner ] [-g|--group ] [-m|--mode ] [-M|--migrate ] [-P|--prolog ] [-E|--epilog ] [...]" + arg_spec="1+" + opt_spec="v.t.f.n:s:c.r.a:z:b.d.p:o:g:m:M:P:E:" + opt_alias="v:verbose,t:trace,f:force,n:num-files,s:size,c:copy,r:remove,a:archive-dir,z:compress,b:background,d:delay,p:pad,o:owner,g:group,m:mode,M:migrate,P:prolog,E:epilog" + opt_v=no + opt_t=no + opt_f=no + opt_n=10 + opt_s="" + opt_c=no + opt_r=no + opt_a="" + opt_z="" + opt_b=no + opt_d=no + opt_p=1 + opt_o="" + opt_g="" + opt_m="" + opt_M="" + opt_P="" + opt_E="" + ;; + tarball ) + str_tool="tarball" + str_usage="[-t|--trace] [-v|--verbose] [-o|--output ] [-c|--compress ] [-d|--directory ] [-u|--user ] [-g|--group ] [-e|--exclude ] [ ...]" + gen_tmpfile=yes + arg_spec="1+" + opt_spec="t.v.o:c:d:u:g:e:" + opt_alias="t:trace,v:verbose,o:output,c:compress,d:directory,u:user,g:group,e:exclude" + opt_t=no + opt_v=no + opt_o="" + opt_c="" + opt_d="" + opt_u="" + opt_g="" + opt_e="CVS,\\.cvsignore,\\.[oa]\$" + ;; + subst ) + str_tool="subst" + str_usage="[-v|--verbose] [-t|--trace] [-n|--nop] [-s|--stealth] [-i|--interactive] [-b|--backup ] [-e|--exec ] [-f|--file ] [] [...]" + gen_tmpfile=yes + arg_spec="0+" + opt_spec="v.t.n.s.i.b:e+f:" + opt_alias="v:verbose,t:trace,n:nop,s:stealth,i:interactive,b:backup,e:exec,f:file" + opt_v=no + opt_t=no + opt_n=no + opt_s=no + opt_i=no + opt_b="" + opt_e="" + opt_f="" + ;; + guessos ) + str_tool="guessos" + str_usage="" + arg_spec="0=" + opt_spec="" + opt_alias="" + ;; + arx ) + str_tool="arx" + str_usage="[-t|--trace] [-C|--command ] [ ...]" + arg_spec="2+" + opt_spec="t.C:" + opt_alias="t:trace,C:command" + opt_t=no + opt_C="ar" + ;; + slo ) + str_tool="slo" + str_usage="[-p|--prefix ] -- -L -l [-L -l ...]" + arg_spec="1+" + opt_spec="p:" + opt_alias="p:prefix" + opt_p="SLO_" + ;; + scpp ) + str_tool="scpp" + str_usage="[-v|--verbose] [-p|--preserve] [-f|--filter ] [-o|--output ] [-t|--template ] [-M|--mark ] [-D|--define ] [-C|--class ] [ ...]" + gen_tmpfile=yes + arg_spec="1+" + opt_spec="v.p.f+o:t:M:D:C:" + opt_alias="v:verbose,p:preserve,f:filter,o:output,t:template,M:mark,D:define,C:class" + opt_v=no + opt_p=no + opt_f="" + opt_o="lib.h" + opt_t="lib.h.in" + opt_M="%%MARK%%" + opt_D="cpp" + opt_C="intern" + ;; + version ) + str_tool="version" + str_usage="[-l|--language ] [-n|--name ] [-p|--prefix ] [-s|--set ] [-e|--edit] [-i|--increase ] [-d|--display ] " + arg_spec="1=" + opt_spec="l:n:p:s:i:e.d:" + opt_alias="l:language,n:name,p:prefix,s:set,e:edit,i:increase,d:display" + opt_l="txt" + opt_n="unknown" + opt_p="" + opt_s="" + opt_e="no" + opt_i="" + opt_d="short" + ;; + path ) + str_tool="path" + str_usage="[-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path ] [ ...]" + gen_tmpfile=yes + arg_spec="1+" + opt_spec="s.r.d.b.m.p:" + opt_alias="s:suppress,r:reverse,d:dirname,b:basename,m:magic,p:path" + opt_s=no + opt_r=no + opt_d=no + opt_b=no + opt_m=no + opt_p="$PATH" + ;; + -* ) + echo "$0:Error: unknown option \`$tool'" 2>&1 + echo "$0:Hint: run \`$0 -h' for usage" 2>&1 + exit 1 + ;; + * ) + echo "$0:Error: unknown command \`$tool'" 2>&1 + echo "$0:Hint: run \`$0 -h' for usage" 2>&1 + exit 1 + ;; +esac + +## +## COMMON UTILITY CODE +## + +# commonly used ASCII values +ASC_TAB=" " +ASC_NL=" +" + +# determine name of tool +if [ ".$tool" != . ]; then + # used inside shtool script + toolcmd="$0 $tool" + toolcmdhelp="shtool $tool" + msgprefix="shtool:$tool" +else + # used as standalone script + toolcmd="$0" + toolcmdhelp="sh $0" + msgprefix="$str_tool" +fi + +# parse argument specification string +eval `echo $arg_spec |\ + sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` + +# parse option specification string +eval `echo h.$opt_spec |\ + sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` + +# parse option alias string +eval `echo h:help,$opt_alias |\ + tr 'x-' 'x_' | sed -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` + +# interate over argument line +opt_PREV='' +while [ $# -gt 0 ]; do + # special option stops processing + if [ ".$1" = ".--" ]; then + shift + break + fi + + # determine option and argument + opt_ARG_OK=no + if [ ".$opt_PREV" != . ]; then + # merge previous seen option with argument + opt_OPT="$opt_PREV" + opt_ARG="$1" + opt_ARG_OK=yes + opt_PREV='' + else + # split argument into option and argument + case "$1" in + --[a-zA-Z0-9]*=*) + eval `echo "x$1" |\ + sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` + opt_STR=`echo $opt_OPT | tr 'x-' 'x_'` + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" + ;; + --[a-zA-Z0-9]*) + opt_OPT=`echo "x$1" | cut -c4-` + opt_STR=`echo $opt_OPT | tr 'x-' 'x_'` + eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" + opt_ARG='' + ;; + -[a-zA-Z0-9]*) + eval `echo "x$1" |\ + sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ + -e 's/";\(.*\)$/"; opt_ARG="\1"/'` + ;; + -[a-zA-Z0-9]) + opt_OPT=`echo "x$1" | cut -c3-` + opt_ARG='' + ;; + *) + break + ;; + esac + fi + + # eat up option + shift + + # determine whether option needs an argument + eval "opt_MODE=\$opt_MODE_${opt_OPT}" + if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then + if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then + opt_PREV="$opt_OPT" + continue + fi + fi + + # process option + case $opt_MODE in + '.' ) + # boolean option + eval "opt_${opt_OPT}=yes" + ;; + ':' ) + # option with argument (multiple occurances override) + eval "opt_${opt_OPT}=\"\$opt_ARG\"" + ;; + '+' ) + # option with argument (multiple occurances append) + eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\"" + ;; + * ) + echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 + exit 1 + ;; + esac +done +if [ ".$opt_PREV" != . ]; then + echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 + exit 1 +fi + +# process help option +if [ ".$opt_h" = .yes ]; then + echo "Usage: $toolcmdhelp $str_usage" + exit 0 +fi + +# complain about incorrect number of arguments +case $arg_MODE in + '=' ) + if [ $# -ne $arg_NUMS ]; then + echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 + exit 1 + fi + ;; + '+' ) + if [ $# -lt $arg_NUMS ]; then + echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 + exit 1 + fi + ;; +esac + +# establish a temporary file on request +if [ ".$gen_tmpfile" = .yes ]; then + if [ ".$TMPDIR" != . ]; then + tmpdir="$TMPDIR" + elif [ ".$TEMPDIR" != . ]; then + tmpdir="$TEMPDIR" + else + tmpdir="/tmp" + fi + tmpfile="$tmpdir/.shtool.$$" + rm -f $tmpfile >/dev/null 2>&1 + touch $tmpfile + chmod 600 $tmpfile +fi + +## +## DISPATCH INTO SCRIPT BODY +## + +case $tool in + +echo ) + ## + ## echo -- Print string with optional construct expansion + ## Copyright (c) 1998-2002 Ralf S. Engelschall + ## Originally written for WML as buildinfo + ## + + text="$*" + + # check for broken escape sequence expansion + seo='' + bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` + if [ ".$bytes" != .3 ]; then + bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'` + if [ ".$bytes" = .3 ]; then + seo='-E' + fi + fi + + # check for existing -n option (to suppress newline) + minusn='' + bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'` + if [ ".$bytes" = .3 ]; then + minusn='-n' + fi + + # determine terminal bold sequence + term_bold='' + term_norm='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[Bb]'`" != . ]; then + case $TERM in + # for the most important terminal types we directly know the sequences + xterm|xterm*|vt220|vt220*) + term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' /dev/null` + term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' /dev/null` + ;; + vt100|vt100*|cygwin) + term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' /dev/null` + term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' /dev/null` + ;; + # for all others, we try to use a possibly existing `tput' or `tcout' utility + * ) + paths=`echo $PATH | sed -e 's/:/ /g'` + for tool in tput tcout; do + for dir in $paths; do + if [ -r "$dir/$tool" ]; then + for seq in bold md smso; do # 'smso' is last + bold="`$dir/$tool $seq 2>/dev/null`" + if [ ".$bold" != . ]; then + term_bold="$bold" + break + fi + done + if [ ".$term_bold" != . ]; then + for seq in sgr0 me rmso init reset; do # 'reset' is last + norm="`$dir/$tool $seq 2>/dev/null`" + if [ ".$norm" != . ]; then + term_norm="$norm" + break + fi + done + fi + break + fi + done + if [ ".$term_bold" != . -a ".$term_norm" != . ]; then + break; + fi + done + ;; + esac + if [ ".$term_bold" = . -o ".$term_norm" = . ]; then + echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 + term_bold='' + term_norm='' + fi + fi + + # determine user name + username='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[uUgG]'`" != . ]; then + username="$LOGNAME" + if [ ".$username" = . ]; then + username="$USER" + if [ ".$username" = . ]; then + username="`(whoami) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$username" = . ]; then + username="`(who am i) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$username" = . ]; then + username='unknown' + fi + fi + fi + fi + fi + + # determine user id + userid='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%U'`" != . ]; then + userid="`(id -u) 2>/dev/null`" + if [ ".$userid" = . ]; then + str="`(id) 2>/dev/null`" + if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then + userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*//'` + fi + if [ ".$userid" = . ]; then + userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \ + sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$userid" = . ]; then + userid=`(ypcat passwd) 2>/dev/null | + egrep "^${username}:" | \ + sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$userid" = . ]; then + userid='?' + fi + fi + fi + fi + fi + + # determine (primary) group id + groupid='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[gG]'`" != . ]; then + groupid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \ + sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$groupid" = . ]; then + groupid=`(ypcat passwd) 2>/dev/null | egrep "^${username}:" | \ + sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$groupid" = . ]; then + groupid='?' + fi + fi + fi + + # determine (primary) group name + groupname='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%g'`" != . ]; then + groupname=`egrep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \ + sed -e 's/:.*$//'` + if [ ".$groupname" = . ]; then + groupname=`(ypcat group) 2>/dev/null | \ + egrep "^[^:]*:[^:]*:${groupid}:" | \ + sed -e 's/:.*$//'` + if [ ".$groupname" = . ]; then + groupname='?' + fi + fi + fi + + # determine host and domain name + hostname='' + domainname='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%h'`" != . ]; then + hostname="`(uname -n) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$hostname" = . ]; then + hostname="`(hostname) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$hostname" = . ]; then + hostname='unknown' + fi + fi + case $hostname in + *.* ) + domainname=".`echo $hostname | cut -d. -f2-`" + hostname="`echo $hostname | cut -d. -f1`" + ;; + esac + fi + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%d'`" != . ]; then + if [ ".$domainname" = . ]; then + if [ -f /etc/resolv.conf ]; then + domainname="`egrep '^[ ]*domain' /etc/resolv.conf | sed -e 'q' |\ + sed -e 's/.*domain//' \ + -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ + -e 's/^\.//' -e 's/^/./' |\ + awk '{ printf("%s", $1); }'`" + if [ ".$domainname" = . ]; then + domainname="`egrep '^[ ]*search' /etc/resolv.conf | sed -e 'q' |\ + sed -e 's/.*search//' \ + -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ + -e 's/ .*//' -e 's/ .*//' \ + -e 's/^\.//' -e 's/^/./' |\ + awk '{ printf("%s", $1); }'`" + fi + fi + fi + fi + + # determine current time + time_day='' + time_month='' + time_year='' + time_monthname='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then + time_day=`date '+%d'` + time_month=`date '+%m'` + time_year=`date '+%Y' 2>/dev/null` + if [ ".$time_year" = . ]; then + time_year=`date '+%y'` + case $time_year in + [5-9][0-9]) time_year="19$time_year" ;; + [0-4][0-9]) time_year="20$time_year" ;; + esac + fi + case $time_month in + 1|01) time_monthname='Jan' ;; + 2|02) time_monthname='Feb' ;; + 3|03) time_monthname='Mar' ;; + 4|04) time_monthname='Apr' ;; + 5|05) time_monthname='May' ;; + 6|06) time_monthname='Jun' ;; + 7|07) time_monthname='Jul' ;; + 8|08) time_monthname='Aug' ;; + 9|09) time_monthname='Sep' ;; + 10) time_monthname='Oct' ;; + 11) time_monthname='Nov' ;; + 12) time_monthname='Dec' ;; + esac + fi + + # expand special ``%x'' constructs + if [ ".$opt_e" = .yes ]; then + text=`echo $seo "$text" |\ + sed -e "s/%B/${term_bold}/g" \ + -e "s/%b/${term_norm}/g" \ + -e "s/%u/${username}/g" \ + -e "s/%U/${userid}/g" \ + -e "s/%g/${groupname}/g" \ + -e "s/%G/${groupid}/g" \ + -e "s/%h/${hostname}/g" \ + -e "s/%d/${domainname}/g" \ + -e "s/%D/${time_day}/g" \ + -e "s/%M/${time_month}/g" \ + -e "s/%Y/${time_year}/g" \ + -e "s/%m/${time_monthname}/g" 2>/dev/null` + fi + + # create output + if [ .$opt_n = .no ]; then + echo $seo "$text" + else + # the harder part: echo -n is best, because + # awk may complain about some \xx sequences. + if [ ".$minusn" != . ]; then + echo $seo $minusn "$text" + else + echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" + fi + fi + ;; + +mdate ) + ## + ## mdate -- Pretty-print modification time of a file or dir + ## Copyright (c) 1995-1997 Free Software Foundation, Inc. + ## Originally idea and basis code by Ulrich Drepper + ## Enhanced by Ralf S. Engelschall for shtool + ## + + fod="$1" + case "$opt_o" in + [dmy][dmy][dmy] ) + ;; + * ) echo "$msgprefix:Error: invalid argument to option \`-o': $opt_o" 1>&2 + exit 1 + ;; + esac + if [ ! -r "$fod" ]; then + echo "$msgprefix:Error: file or directory not found: $fod" 1>&2 + exit 1 + fi + + # prevent "date" giving response in another language + LANG=C; export LANG + LC_ALL=C; export LC_ALL + LC_TIME=C; export LC_TIME + + # get the extended ls output of the file or directory. + if ls -L /dev/null >/dev/null 2>&1; then + set - x`ls -L -l -d $fod` + else + set - x`ls -l -d $fod` + fi + + # The month is at least the fourth argument + # (3 shifts here, the next inside the loop). + shift; shift; shift + + # Find the month. Next argument is day, followed by the year or time. + month="" + while [ ".$month" = . ]; do + shift + case $1 in + Jan) month=January; nummonth=1 ;; + Feb) month=February; nummonth=2 ;; + Mar) month=March; nummonth=3 ;; + Apr) month=April; nummonth=4 ;; + May) month=May; nummonth=5 ;; + Jun) month=June; nummonth=6 ;; + Jul) month=July; nummonth=7 ;; + Aug) month=August; nummonth=8 ;; + Sep) month=September; nummonth=9 ;; + Oct) month=October; nummonth=10 ;; + Nov) month=November; nummonth=11 ;; + Dec) month=December; nummonth=12 ;; + esac + done + day="$2" + year="$3" + + # We finally have to deal with the problem that the "ls" output + # gives either the time of the day or the year. + case $year in + *:*) + this_year=`date '+%Y' 2>/dev/null` + if [ ".$this_year" = . ]; then + this_year=`date '+%y'` + case $this_year in + [5-9][0-9]) this_year="19$this_year" ;; + [0-4][0-9]) this_year="20$this_year" ;; + esac + fi + # for the following months of the last year the time notation + # is usually also used for files modified in the last year. + this_month=`date '+%m'` + if (expr $nummonth \> $this_month) >/dev/null; then + this_year=`expr $this_year - 1` + fi + year="$this_year" + ;; + esac + + # Optionally fill day and month with leeding zeros + if [ ".$opt_z" = .yes ]; then + case $day in + [0-9][0-9] ) ;; + [0-9] ) day="0$day" ;; + esac + case $nummonth in + [0-9][0-9] ) ;; + [0-9] ) nummonth="0$nummonth" ;; + esac + fi + + # Optionally use digits for month + if [ ".$opt_d" = .yes ]; then + month="$nummonth" + fi + + # Optionally shorten the month name to three characters + if [ ".$opt_s" = .yes ]; then + month=`echo $month | cut -c1-3` + fi + + # Output the resulting date string + echo dummy | awk '{ + for (i = 0; i < 3; i++) { + now = substr(order, 1, 1); + order = substr(order, 2); + if (now == "d") + out = day; + else if (now == "m") + out = month; + else if (now == "y") + out = year; + if (i < 2) + printf("%s%s", out, field); + else + printf("%s", out); + } + if (newline != "yes") + printf("\n"); + }' "day=$day" "month=$month" "year=$year" \ + "field=$opt_f" "order=$opt_o" "newline=$opt_n" + ;; + +table ) + ## + ## table -- Pretty-print a field-separated list as a table + ## Copyright (c) 1998-2002 Ralf S. Engelschall + ## Originally written for Apache + ## + + if [ $opt_c -gt 4 ]; then + echo "$msgprefix:Error: Invalid number of colums (1..4 allowed only)" 1>&2 + exit 1 + fi + case "x$opt_F" in + x? ) ;; + * ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; exit 1 ;; + esac + + # split the list into a table + list=` + IFS="$opt_F" + for entry in $*; do + if [ ".$entry" != . ]; then + echo "$entry" + fi + done |\ + awk " + BEGIN { list = \"\"; n = 0; } + { + list = list \\$1; + n = n + 1; + if (n < $opt_c) { + list = list \":\"; + } + if (n == $opt_c) { + list = list \"\\n\"; + n = 0; + } + } + END { print list; } + " + ` + + # format table cells and make sure table + # doesn't exceed maximum width + OIFS="$IFS" + IFS=' +' + for entry in $list; do + case $opt_c in + 1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s\\n\", \$1); }'" ;; + 2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s\\n\", \$1, \$2); }'" ;; + 3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3); }'" ;; + 4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3, \$4); }'" ;; + esac + done |\ + awk "{ + if (length(\$0) > $opt_s) { + printf(\"%s\\n\", substr(\$0, 0, $opt_s-1)); + } else { + print \$0; + } + }" + IFS="$OIFS" + ;; + +prop ) + ## + ## prop -- Display progress with a running propeller + ## Copyright (c) 1998-2002 Ralf S. Engelschall + ## Originally written for mod_ssl + ## + + perl='' + for dir in `echo $PATH | sed -e 's/:/ /g'` .; do + if [ -f "$dir/perl" ]; then + perl="$dir/perl" + break + fi + done + if [ ".$perl" != . ]; then + # Perl is preferred because writing to STDERR in + # Perl really writes immediately as one would expect + $perl -e ' + @p = ("|","/","-","\\"); + $i = 0; + while () { + printf(STDERR "\r%s...%s\b", $ARGV[0], $p[$i++]); + $i = 0 if ($i > 3); + } + printf(STDERR "\r%s \n", $ARGV[0]); + ' "$opt_p" + else + # But if Perl doesn't exists we use Awk even + # some Awk's buffer even the /dev/stderr writing :-( + awk ' + BEGIN { + split("|#/#-#\\", p, "#"); + i = 1; + } + { + printf("\r%s%c\b", prefix, p[i++]) > "/dev/stderr"; + if (i > 4) { i = 1; } + } + END { + printf("\r%s \n", prefix) > "/dev/stderr"; + } + ' "prefix=$opt_p" + fi + ;; + +move ) + ## + ## move -- Move files with simultaneous substitution + ## Copyright (c) 1999-2002 Ralf S. Engelschall + ## Originally written for shtool + ## + + src="$1" + dst="$2" + + # consistency checks + if [ ".$src" = . -o ".$dst" = . ]; then + echo "$msgprefix:Error: Invalid arguments" 1>&2 + exit 1 + fi + if [ ".$src" = ".$dst" ]; then + echo "$msgprefix:Error: Source and destination files are the same" 1>&2 + exit 1 + fi + expsrc="$src" + if [ ".$opt_e" = .yes ]; then + expsrc="`echo $expsrc`" + fi + if [ ".$opt_e" = .yes ]; then + if [ ".`echo "$src" | sed -e 's;^.*\\*.*$;;'`" = ".$src" ]; then + echo "$msgprefix:Error: Source doesn't contain wildcard ('*'): $dst" 1>&2 + exit 1 + fi + if [ ".`echo "$dst" | sed -e 's;^.*%[1-9].*$;;'`" = ".$dst" ]; then + echo "$msgprefix:Error: Destination doesn't contain substitution ('%N'): $dst" 1>&2 + exit 1 + fi + if [ ".$expsrc" = ".$src" ]; then + echo "$msgprefix:Error: Sources not found or no asterisk : $src" 1>&2 + exit 1 + fi + else + if [ ! -r "$src" ]; then + echo "$msgprefix:Error: Source not found: $src" 1>&2 + exit 1 + fi + fi + + # determine substitution patterns + if [ ".$opt_e" = .yes ]; then + srcpat=`echo "$src" | sed -e 's/\\./\\\\./g' -e 's/;/\\;/g' -e 's;\\*;\\\\(.*\\\\);g'` + dstpat=`echo "$dst" | sed -e 's;%\([1-9]\);\\\\\1;g'` + fi + + # iterate over source(s) + for onesrc in $expsrc; do + if [ .$opt_e = .yes ]; then + onedst=`echo $onesrc | sed -e "s;$srcpat;$dstpat;"` + else + onedst="$dst" + fi + errorstatus=0 + if [ ".$opt_v" = .yes ]; then + echo "$onesrc -> $onedst" + fi + if [ ".$opt_p" = .yes ]; then + if [ -r $onedst ]; then + if cmp -s $onesrc $onedst; then + if [ ".$opt_t" = .yes ]; then + echo "rm -f $onesrc" 1>&2 + fi + rm -f $onesrc || errorstatus=$? + else + if [ ".$opt_t" = .yes ]; then + echo "mv -f $onesrc $onedst" 1>&2 + fi + mv -f $onesrc $onedst || errorstatus=$? + fi + else + if [ ".$opt_t" = .yes ]; then + echo "mv -f $onesrc $onedst" 1>&2 + fi + mv -f $onesrc $onedst || errorstatus=$? + fi + else + if [ ".$opt_t" = .yes ]; then + echo "mv -f $onesrc $onedst" 1>&2 + fi + mv -f $onesrc $onedst || errorstatus=$? + fi + if [ $errorstatus -ne 0 ]; then + break; + fi + done + exit $errorstatus + ;; + +install ) + ## + ## install -- Install a program, script or datafile + ## Copyright (c) 1997-2002 Ralf S. Engelschall + ## Originally written for shtool + ## + + # special case: "shtool install -d [...]" internally + # maps to "shtool mkdir -f -p -m 755 [...]" + if [ "$opt_d" = yes ]; then + cmd="$0 mkdir -f -p -m 755" + if [ ".$opt_o" != . ]; then + cmd="$cmd -o '$opt_o'" + fi + if [ ".$opt_g" != . ]; then + cmd="$cmd -g '$opt_g'" + fi + if [ ".$opt_v" = .yes ]; then + cmd="$cmd -v" + fi + if [ ".$opt_t" = .yes ]; then + cmd="$cmd -t" + fi + for dir in "$@"; do + eval "$cmd $dir" || exit $? + done + exit 0 + fi + + # determine source(s) and destination + argc=$# + srcs="" + while [ $# -gt 1 ]; do + srcs="$srcs $1" + shift + done + dstpath="$1" + + # type check for destination + dstisdir=0 + if [ -d $dstpath ]; then + dstpath=`echo "$dstpath" | sed -e 's:/$::'` + dstisdir=1 + fi + + # consistency check for destination + if [ $argc -gt 2 -a $dstisdir = 0 ]; then + echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 + exit 1 + fi + + # iterate over all source(s) + for src in $srcs; do + dst=$dstpath + + # if destination is a directory, append the input filename + if [ $dstisdir = 1 ]; then + dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` + dst="$dst/$dstfile" + fi + + # check for correct arguments + if [ ".$src" = ".$dst" ]; then + echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 + continue + fi + if [ -d "$src" ]; then + echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 + continue + fi + + # make a temp file name in the destination directory + dsttmp=`echo $dst |\ + sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ + -e "s;\$;/#INST@$$#;"` + + # verbosity + if [ ".$opt_v" = .yes ]; then + echo "$src -> $dst" 1>&2 + fi + + # copy or move the file name to the temp name + # (because we might be not allowed to change the source) + if [ ".$opt_C" = .yes ]; then + opt_c=yes + fi + if [ ".$opt_c" = .yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "cp $src $dsttmp" 1>&2 + fi + cp $src $dsttmp || exit $? + else + if [ ".$opt_t" = .yes ]; then + echo "mv $src $dsttmp" 1>&2 + fi + mv $src $dsttmp || exit $? + fi + + # adjust the target file + if [ ".$opt_e" != . ]; then + sed='sed' + OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" + for e + do + sed="$sed -e '$e'" + done + cp $dsttmp $dsttmp.old + eval "$sed <$dsttmp.old >$dsttmp" || exit $? + rm -f $dsttmp.old + fi + if [ ".$opt_s" = .yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "strip $dsttmp" 1>&2 + fi + strip $dsttmp || exit $? + fi + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o $dsttmp" 1>&2 + fi + chown $opt_o $dsttmp || exit $? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g $dsttmp" 1>&2 + fi + chgrp $opt_g $dsttmp || exit $? + fi + if [ ".$opt_m" != ".-" ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m $dsttmp" 1>&2 + fi + chmod $opt_m $dsttmp || exit $? + fi + + # determine whether to do a quick install + # (has to be done _after_ the strip was already done) + quick=no + if [ ".$opt_C" = .yes ]; then + if [ -r $dst ]; then + if cmp -s $src $dst; then + quick=yes + fi + fi + fi + + # finally, install the file to the real destination + if [ $quick = yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "rm -f $dsttmp" 1>&2 + fi + rm -f $dsttmp + else + if [ ".$opt_t" = .yes ]; then + echo "rm -f $dst && mv $dsttmp $dst" 1>&2 + fi + rm -f $dst && mv $dsttmp $dst + fi + done + ;; + +mkdir ) + ## + ## mkdir -- Make one or more directories + ## Copyright (c) 1996-2002 Ralf S. Engelschall + ## Originally written for public domain by Noah Friedman + ## Cleaned up and enhanced for shtool + ## + + errstatus=0 + for p in ${1+"$@"}; do + # if the directory already exists... + if [ -d "$p" ]; then + if [ ".$opt_f" = .no -a ".$opt_p" = .no ]; then + echo "$msgprefix:Error: directory already exists: $p" 1>&2 + errstatus=1 + break + else + continue + fi + fi + # if the directory has to be created... + if [ ".$opt_p" = .no ]; then + if [ ".$opt_t" = .yes ]; then + echo "mkdir $p" 1>&2 + fi + mkdir $p || errstatus=$? + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o $p" 1>&2 + fi + chown $opt_o $p || errstatus=$? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g $p" 1>&2 + fi + chgrp $opt_g $p || errstatus=$? + fi + if [ ".$opt_m" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m $p" 1>&2 + fi + chmod $opt_m $p || errstatus=$? + fi + else + # the smart situation + set fnord `echo ":$p" |\ + sed -e 's/^:\//%/' \ + -e 's/^://' \ + -e 's/\// /g' \ + -e 's/^%/\//'` + shift + pathcomp='' + for d in ${1+"$@"}; do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp="./$pathcomp" ;; + esac + if [ ! -d "$pathcomp" ]; then + if [ ".$opt_t" = .yes ]; then + echo "mkdir $pathcomp" 1>&2 + fi + mkdir $pathcomp || errstatus=$? + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o $pathcomp" 1>&2 + fi + chown $opt_o $pathcomp || errstatus=$? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g $pathcomp" 1>&2 + fi + chgrp $opt_g $pathcomp || errstatus=$? + fi + if [ ".$opt_m" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m $pathcomp" 1>&2 + fi + chmod $opt_m $pathcomp || errstatus=$? + fi + fi + pathcomp="$pathcomp/" + done + fi + done + exit $errstatus + ;; + +mkln ) + ## + ## mkln -- Make link with calculation of relative paths + ## Copyright (c) 1999-2002 Ralf S. Engelschall + ## Originally written for shtool + ## + + args=$? + srcs="" + while [ $# -gt 1 ]; do + srcs="$srcs $1" + shift + done + dst="$1" + if [ ! -d $dst ]; then + if [ $args -gt 2 ]; then + echo "$msgprefix:Error: multiple sources not allowed when target isn't a directory" 1>&2 + exit 1 + fi + fi + + # determine link options + lnopt="" + if [ ".$opt_f" = .yes ]; then + lnopt="$lnopt -f" + fi + if [ ".$opt_s" = .yes ]; then + lnopt="$lnopt -s" + fi + + # iterate over sources + for src in $srcs; do + # determine if one of the paths is an absolute path, + # because then we _have_ to use an absolute symlink + oneisabs=0 + srcisabs=0 + dstisabs=0 + case $src in + /* ) oneisabs=1; srcisabs=1 ;; + esac + case $dst in + /* ) oneisabs=1; dstisabs=1 ;; + esac + + # split source and destination into dir and base name + if [ -d $src ]; then + srcdir=`echo $src | sed -e 's;/*$;;'` + srcbase="" + else + srcdir=`echo $src | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'` + srcbase=`echo $src | sed -e 's;.*/\([^/]*\)$;\1;'` + fi + if [ -d $dst ]; then + dstdir=`echo $dst | sed -e 's;/*$;;'` + dstbase="" + else + dstdir=`echo $dst | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'` + dstbase=`echo $dst | sed -e 's;.*/\([^/]*\)$;\1;'` + fi + + # consistency check + if [ ".$dstdir" != . ]; then + if [ ! -d $dstdir ]; then + echo "$msgprefix:Error: destination directory not found: $dstdir" 1>&2 + exit 1 + fi + fi + + # make sure the source is reachable from the destination + if [ $dstisabs = 1 ]; then + if [ $srcisabs = 0 ]; then + if [ -d $srcdir ]; then + srcdir="`cd $srcdir; pwd | sed -e 's;/*$;;'`" + srcisabs=1 + oneisabs=1 + fi + fi + fi + + # split away a common prefix + prefix="" + if [ ".$srcdir" = ".$dstdir" -a ".$srcdir" != . ]; then + prefix="$srcdir/" + srcdir="" + dstdir="" + else + while [ ".$srcdir" != . -a ".$dstdir" != . ]; do + presrc=`echo $srcdir | sed -e 's;^\([^/]*\)/.*;\1;'` + predst=`echo $dstdir | sed -e 's;^\([^/]*\)/.*;\1;'` + if [ ".$presrc" != ".$predst" ]; then + break + fi + prefix="$prefix$presrc/" + srcdir=`echo $srcdir | sed -e 's;^[^/]*/*;;'` + dstdir=`echo $dstdir | sed -e 's;^[^/]*/*;;'` + done + fi + + # destination prefix is just the common prefix + dstpre="$prefix" + + # determine source prefix which is the reverse directory + # step-up corresponding to the destination directory + srcpre="" + if [ $oneisabs = 0 ] || [ ".$prefix" != . -a ".$prefix" != ./ ]; then + pl="$dstdir/" + OIFS="$IFS"; IFS='/' + for pe in $pl; do + [ ".$pe" = . ] && continue + srcpre="../$srcpre" + done + IFS="$OIFS" + else + if [ $srcisabs = 1 ]; then + srcpre="$prefix" + fi + fi + + # determine destination symlink name + if [ ".$dstbase" = . ]; then + if [ ".$srcbase" != . ]; then + dstbase="$srcbase" + else + dstbase=`echo "$prefix$srcdir" | sed -e 's;/*$;;' -e 's;.*/\([^/]*\)$;\1;'` + fi + fi + + # now finalize source and destination directory paths + srcdir=`echo $srcdir | sed -e 's;\([^/]\)$;\1/;'` + dstdir=`echo $dstdir | sed -e 's;\([^/]\)$;\1/;'` + + # run the final link command + if [ ".$opt_t" = .yes ]; then + echo "ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase" + fi + eval ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase + done + ;; + +mkshadow ) + ## + ## mkshadow -- Make a shadow tree through symbolic links + ## Copyright (c) 1998-2002 Ralf S. Engelschall + ## Originally written for Apache + ## + + # source and destination directory + src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` + dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` + + # check whether source exists + if [ ! -d $src ]; then + echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2 + exit 1 + fi + + # determine if one of the paths is an absolute path, + # because then we have to use an absolute symlink + oneisabs=0 + case $src in + /* ) oneisabs=1 ;; + esac + case $dst in + /* ) oneisabs=1 ;; + esac + + # determine reverse directory for destination directory + dstrevdir='' + if [ $oneisabs = 0 ]; then + # derive reverse path from forward path + pwd=`pwd` + OIFS="$IFS"; IFS='/' + for pe in $dst; do + if [ "x$pe" = "x.." ]; then + OIFS2="$IFS"; IFS="$DIFS" + eval `echo "$pwd" |\ + sed -e 's:\([^/]*\)$:; dir="\1":' \ + -e 's:^\(.*\)/[^/]*;:pwd="\1";:'\ + -e 's:^;:pwd="";:'` + dstrevdir="$dir/$dstrevdir" + IFS="$OIFS2" + else + dstrevdir="../$dstrevdir" + fi + done + IFS="$OIFS" + else + src="`cd $src; pwd`"; + fi + + # create directory tree at destination + if [ ! -d $dst ]; then + if [ ".$opt_t" = .yes ]; then + echo "mkdir $dst" 1>&2 + fi + mkdir $dst + fi + if [ ".$opt_a" = .yes ]; then + DIRS=`cd $src; find . -type d -print |\ + sed -e '/^\.$/d' -e 's:^\./::'` + else + DIRS=`cd $src; find . -type d -print |\ + sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'` + fi + for dir in $DIRS; do + if [ ".$opt_t" = .yes ]; then + echo "mkdir $dst/$dir" 1>&2 + fi + mkdir $dst/$dir + done + + # fill directory tree with symlinks to files + if [ ".$opt_a" = .yes ]; then + FILES="`cd $src; find . -depth -print |\ + sed -e 's/^\.\///'`" + else + FILES="`cd $src; find . -depth -print |\ + sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \ + -e '/\.cvsignore$/d' -e '/\/CVS/d' \ + -e '/\/\.#/d' -e '/\.orig$/d' \ + -e 's/^\.\///'`" + fi + for file in $FILES; do + # don't use `-type f' above for find because of symlinks + if [ -d "$src/$file" ]; then + continue + fi + basename=`echo $file | sed -e 's:^.*/::'` + dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'` + from=`echo "$src/$file" | sed -e 's/^\.\///'` + to="$dst/$dir$basename" + if [ $oneisabs = 0 ]; then + if [ ".$dir" != . ]; then + subdir=`echo $dir | sed -e 's:/$::'` + # derive reverse path from forward path + revdir='' + OIFS="$IFS"; IFS='/' + for pe in $subdir; do + revdir="../$revdir" + done + IFS="$OIFS" + # finalize from + from="$revdir$from" + fi + from="$dstrevdir$from" + fi + if [ ".$opt_v" = .yes ]; then + echo " $to" 1>&2 + fi + if [ ".$opt_t" = .yes ]; then + echo "ln -s $from $to" 1>&2 + fi + ln -s $from $to + done + ;; + +fixperm ) + ## + ## fixperm -- Fix file permissions inside a source tree + ## Copyright (c) 1996-2002 Ralf S. Engelschall + ## Originally written for ePerl + ## + + paths="$*" + + # check whether the test command supports the -x option + if [ -x /bin/sh ] 2>/dev/null; then + minusx="-x" + else + minusx="-r" + fi + + # iterate over paths + for p in $paths; do + for file in `find $p -depth -print`; do + if [ -f $file ]; then + if [ $minusx $file ]; then + if [ ".$opt_v" = .yes ]; then + echo "-rwxrwxr-x $file" 2>&1 + fi + if [ ".$opt_t" = .yes ]; then + echo "chmod 775 $file" 2>&1 + fi + chmod 775 $file + else + if [ ".$opt_v" = .yes ]; then + echo "-rw-rw-r-- $file" 2>&1 + fi + if [ ".$opt_t" = .yes ]; then + echo "chmod 664 $file" 2>&1 + fi + chmod 664 $file + fi + continue + fi + if [ -d $file ]; then + if [ ".$opt_v" = .yes ]; then + echo "drwxrwxr-x $file" 2>&1 + fi + if [ ".$opt_t" = .yes ]; then + echo "chmod 775 $file" 2>&1 + fi + chmod 775 $file + continue + fi + if [ ".$opt_v" = .yes ]; then + echo "?????????? $file" 2>&1 + fi + done + done + ;; + +rotate ) + ## + ## rotate -- Logfile rotation + ## Copyright (c) 2001-2002 Ralf S. Engelschall + ## Originally written for use in OpenPKG + ## + + # make sure we have at least one file to rotate + if [ ".$opt_n" = .0 ]; then + echo "$msgprefix:Error: invalid argument \`$opt_n' to option -n." 1>&2 + exit 1 + fi + + # canonicalize -s option argument + if [ ".$opt_s" != . ]; then + if [ ".`expr $opt_s : '[0-9]*$'`" != .0 ]; then + : + elif [ ".`expr $opt_s : '[0-9]*[Kk]$'`" != .0 ]; then + opt_s=`expr $opt_s : '\([0-9]*\)[Kk]$'` + opt_s=`expr $opt_s \* 1024` + elif [ ".`expr $opt_s : '[0-9]*[Mm]$'`" != .0 ]; then + opt_s=`expr $opt_s : '\([0-9]*\)[Mm]$'` + opt_s=`expr $opt_s \* 1048576` # 1024*1024 + elif [ ".`expr $opt_s : '[0-9]*[Gg]$'`" != .0 ]; then + opt_s=`expr $opt_s : '\([0-9]*\)[Gg]$'` + opt_s=`expr $opt_s \* 1073741824` # 1024*1024*1024 + else + echo "$msgprefix:Error: invalid argument \`$opt_s' to option -s." 1>&2 + exit 1 + fi + fi + + # option -d/-z consistency + if [ ".$opt_d" = .yes -a ".$opt_z" = . ]; then + echo "$msgprefix:Error: option -d requires option -z." 1>&2 + exit 1 + fi + + # make sure target directory exists + if [ ".$opt_a" != . ]; then + if [ ! -d $opt_a ]; then + if [ ".$opt_f" = .no ]; then + echo "$msgprefix:Error: archive directory \`$opt_a' does not exist." 1>&2 + exit 1 + fi + mkdir $opt_a || exit $? + chmod 755 $opt_a + fi + if [ ! -w $opt_a ]; then + echo "$msgprefix:Error: archive directory \`$opt_a' not writable." 1>&2 + exit 1 + fi + fi + + # determine compression approach + if [ ".$opt_z" != . ]; then + comp_lvl="$opt_z" + comp_prg="" + case $comp_lvl in + *:* ) eval `echo $comp_lvl |\ + sed -e 's%^\(.*\):\(.*\)$%comp_prg="\1"; comp_lvl="\2"%'` ;; + esac + + # compression level consistency + case $comp_lvl in + [0-9] ) + ;; + * ) echo "$msgprefix:Error: invalid compression level \`$comp_lvl'" 1>&2 + exit 1 + ;; + esac + + # determine a suitable compression tool + if [ ".$comp_prg" = . ]; then + # check whether the test command supports the -x option + if [ -x /bin/sh ] 2>/dev/null; then + minusx="-x" + else + minusx="-r" + fi + # search for tools in $PATH + paths="`echo $PATH |\ + sed -e 's%/*:%:%g' -e 's%/*$%%' \ + -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ + -e 's/:/ /g'`" + for prg in bzip2 gzip compress; do + for path in $paths; do + if [ $minusx "$path/$prg" -a ! -d "$path/$prg" ]; then + comp_prg="$prg" + break + fi + done + if [ ".$comp_prg" != . ]; then + break + fi + done + if [ ".$comp_prg" = . ]; then + echo "$msgprefix:Error: no suitable compression tool found in \$PATH" 1>&2 + exit 1 + fi + fi + + # determine standard compression extension + # and make sure it is a known tool + case $comp_prg in + */bzip2 | bzip2 ) comp_ext="bz2" comp_lvl="-$comp_lvl" ;; + */gzip | gzip ) comp_ext="gz" comp_lvl="-$comp_lvl" ;; + */compress | compress ) comp_ext="Z"; comp_lvl="" ;; + * ) echo "$msgprefix:Error: tool \`$comp_prg' is not a known compression tool" 1>&2 + exit 1 + ;; + esac + comp_suf=".$comp_ext" + fi + + # iterate over all given logfile arguments + for file in $*; do + # make sure the logfile exists + if [ ! -f $file ]; then + if [ ".$opt_f" = .yes ]; then + continue + fi + echo "$msgprefix:Error: logfile \`$file' not found" 1>&2 + exit 1 + fi + + # determine log directory (where original logfile is placed) + ldir="." + case $file in + */* ) eval `echo $file | sed -e 's%^\(.*\)/\([^/]*\)$%ldir="\1"; file="\2";%'` ;; + esac + + # determine archive directory (where rotated logfiles are placed) + adir="$ldir" + if [ ".$opt_a" != . ]; then + case "$opt_a" in + /* | ./* ) adir="$opt_a" ;; + * ) adir="$ldir/$opt_a" ;; + esac + fi + + # optionally take logfile size into account + if [ ".$opt_s" != . ]; then + # determine size of logfile + set -- `ls -l $ldir/$file | sed -e 's; -> .*$;;' -e 's;[ ][ ]*; ;g'` + n=`expr $# - 4` + eval "size=\`echo \${$n}\`" + + # skip logfile if size is still too small + if [ $size -lt $opt_s ]; then + if [ ".$opt_v" = .yes ]; then + echo "$ldir/$file: still too small in size -- skipping" + fi + continue + fi + fi + + # verbosity + if [ ".$opt_v" = .yes ]; then + echo "rotating $ldir/$file" + fi + + # execute prolog + if [ ".$opt_P" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "$opt_P" + fi + eval $opt_P + [ $? -ne 0 ] && exit $? + fi + + # kick away out-rotated logfile + n=`expr $opt_n - 1` + n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n` + if [ -f "${adir}/${file}.${n}${comp_suf}" ]; then + # optionally migrate away the out-rotated logfile + if [ ".$opt_M" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "$opt_M ${adir}/${file}.${n}${comp_suf}" + fi + eval "$opt_M ${adir}/${file}.${n}${comp_suf}" + [ $? -ne 0 ] && exit $? + fi + # finally get rid of the out-rotated logfile + if [ ".$opt_t" = .yes ]; then + echo "rm -f ${adir}/${file}.${n}${comp_suf}" + fi + rm -f ${adir}/${file}.${n}${comp_suf} || exit $? + fi + + # rotate already archived logfiles + while [ $n -gt 0 ]; do + m=$n + n=`expr $n - 1` + n=`echo dummy | awk "{ printf(\"%0${opt_p}d\", n); }" n=$n` + if [ $n -eq 0 -a ".$opt_d" = .yes ]; then + # special case: first rotation file under delayed compression situation + if [ ! -f "${adir}/${file}.${n}" ]; then + continue + fi + + # compress file (delayed) + if [ ".$opt_b" = .yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "mv ${adir}/${file}.${n} ${adir}/${file}.${m}" + fi + mv ${adir}/${file}.${n} ${adir}/${file}.${m} || exit $? + if [ ".$opt_t" = .yes ]; then + echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${m} >${adir}/${file}.${m}${comp_suf}; rm -f ${adir}/${file}.${m}) &" + fi + ( ${comp_prg} ${comp_lvl} \ + <${adir}/${file}.${m} \ + >${adir}/${file}.${m}${comp_suf} || exit $? + rm -f ${adir}/${file}.${m} || exit $? + ) /dev/null 2>&1 & + else + if [ ".$opt_t" = .yes ]; then + echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${m}${comp_suf}" + fi + ${comp_prg} ${comp_lvl} \ + <${adir}/${file}.${n} \ + >${adir}/${file}.${m}${comp_suf} || exit $? + if [ ".$opt_t" = .yes ]; then + echo "rm -f ${adir}/${file}.${n}" + fi + rm -f ${adir}/${file}.${n} || exit $? + fi + + # fix file attributes + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o ${adir}/${file}.${m}${comp_suf}" + fi + chown $opt_o ${adir}/${file}.${m}${comp_suf} || exit $? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g ${adir}/${file}.${m}${comp_suf}" + fi + chgrp $opt_g ${adir}/${file}.${m}${comp_suf} || exit $? + fi + if [ ".$opt_m" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m ${adir}/${file}.${m}${comp_suf}" + fi + chmod $opt_m ${adir}/${file}.${m}${comp_suf} || exit $? + fi + else + # standard case: second and following rotation file + if [ ! -f "${adir}/${file}.${n}${comp_suf}" ]; then + continue + fi + if [ ".$opt_t" = .yes ]; then + echo "mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf}" + fi + mv ${adir}/${file}.${n}${comp_suf} ${adir}/${file}.${m}${comp_suf} || exit $? + fi + done + + # move away current logfile + if [ ".$opt_c" = .yes ]; then + # approach: copy[+truncate] + if [ ".$opt_t" = .yes ]; then + echo "cp -p ${ldir}/${file} ${adir}/${file}.${n}" + fi + cp -p ${ldir}/${file} ${adir}/${file}.${n} || exit $? + if [ ".$opt_r" = .no ]; then + if [ ".$opt_t" = .yes ]; then + echo "cp /dev/null ${ldir}/${file}" + fi + cp /dev/null ${ldir}/${file} || exit $? + fi + else + # approach: move[+touch] + if [ ".$opt_t" = .yes ]; then + echo "mv ${ldir}/${file} ${adir}/${file}.${n}" + fi + mv ${ldir}/${file} ${adir}/${file}.${n} || exit $? + if [ ".$opt_r" = .no ]; then + if [ ".$opt_t" = .yes ]; then + echo "touch ${ldir}/${file}" + fi + touch ${ldir}/${file} || exit $? + # fix file attributes + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o ${ldir}/${file}" + fi + chown $opt_o ${ldir}/${file} || exit $? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g ${ldir}/${file}" + fi + chgrp $opt_g ${ldir}/${file} || exit $? + fi + if [ ".$opt_m" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m ${ldir}/${file}" + fi + chmod $opt_m ${ldir}/${file} || exit $? + fi + fi + fi + + # regular compression step + if [ ".$opt_z" != . -a ".$opt_d" = .no ]; then + # compress file + if [ ".$opt_b" = .yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "(${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}; rm -f ${adir}/${file}.${n}) &" + fi + ( ${comp_prg} ${comp_lvl} \ + <${adir}/${file}.${n} \ + >${adir}/${file}.${n}${comp_suf} || exit $? + rm -f ${adir}/${file}.${n} || exit $? + ) /dev/null 2>&1 & + else + if [ ".$opt_t" = .yes ]; then + echo "${comp_prg} ${comp_lvl} <${adir}/${file}.${n} >${adir}/${file}.${n}${comp_suf}" + fi + ${comp_prg} ${comp_lvl} \ + <${adir}/${file}.${n} \ + >${adir}/${file}.${n}${comp_suf} || exit $? + if [ ".$opt_t" = .yes ]; then + echo "rm -f ${opt_a}${file}.${n}" + fi + rm -f ${adir}/${file}.${n} || exit $? + fi + + # fix file attributes + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o ${adir}/${file}.${n}${comp_suf}" + fi + chown $opt_o ${adir}/${file}.${n}${comp_suf} || exit $? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g ${adir}/${file}.${n}${comp_suf}" + fi + chgrp $opt_g ${adir}/${file}.${n}${comp_suf} || exit $? + fi + if [ ".$opt_m" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m ${adir}/${file}.${n}${comp_suf}" + fi + chmod $opt_m ${adir}/${file}.${n}${comp_suf} || exit $? + fi + fi + + # execute epilog + if [ ".$opt_E" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "$opt_E" + fi + eval $opt_E + [ $? -ne 0 ] && exit $? + fi + done + ;; + +tarball ) + ## + ## tarball -- Roll distribution tarballs + ## Copyright (c) 1999-2002 Ralf S. Engelschall + ## Originally written for shtool + ## + + srcs="$*" + + # check whether the test command supports the -x option + if [ -x /bin/sh ] 2>/dev/null; then + minusx="-x" + else + minusx="-r" + fi + + # find the tools + paths="`echo $PATH |\ + sed -e 's%/*:%:%g' -e 's%/*$%%' \ + -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ + -e 's/:/ /g'`" + for spec in find:gfind,find tar:gtar,tar tardy:tardy,tarcust; do + prg=`echo $spec | sed -e 's/:.*$//'` + tools=`echo $spec | sed -e 's/^.*://'` + eval "prg_${prg}=''" + # iterate over tools + for tool in `echo $tools | sed -e 's/,/ /g'`; do + # iterate over paths + for path in $paths; do + if [ $minusx "$path/$tool" -a ! -d "$path/$tool" ]; then + eval "prg_${prg}=\"$path/$tool\"" + break + fi + done + eval "val=\$prg_${prg}" + if [ ".$val" != . ]; then + break + fi + done + done + + # expand source paths + exclude='' + for pat in `echo $opt_e | sed 's/,/ /g'`; do + exclude="$exclude | grep -v '$pat'" + done + if [ ".$opt_t" = .yes ]; then + echo "cp /dev/null $tmpfile.lst" 1>&2 + fi + cp /dev/null $tmpfile.lst + for src in $srcs; do + if [ -d $src ]; then + if [ ".$opt_t" = .yes ]; then + echo "(cd $src && $prg_find . -type f -depth -print) | sed -e 's:^\\.\$::' -e 's:^\\./::' | cat $exclude >>$tmpfile.lst" 1>&2 + fi + (cd $src && $prg_find . -type f -depth -print) |\ + sed -e 's:^\.$::' -e 's:^\./::' | eval cat $exclude >>$tmpfile.lst + else + if [ ".$opt_t" = .yes ]; then + echo "echo $src >>$tmpfile.lst" 1>&2 + fi + echo $src >>$tmpfile.lst + fi + done + sort <$tmpfile.lst >$tmpfile.lst.n + mv $tmpfile.lst.n $tmpfile.lst + if [ ".$opt_v" = .yes ]; then + cat $tmpfile.lst | sed -e 's/^/ /' 1>&2 + fi + + # determine tarball file and directory name + if [ ".$opt_o" != . ]; then + tarfile="$opt_o" + if [ ".$opt_d" != . ]; then + tarname="$opt_d" + else + tarname=`echo $tarfile | sed -e 's/\.tar.*$//' -e 's;.*/\([^/]*\)$;\1;'` + fi + else + if [ ".$opt_d" != . ]; then + tarname="$opt_d" + elif [ -d "$from" ]; then + tarname=`echo $from | sed -e 's;.*/\([^/]*\)$;\1;'` + else + tarname="out" + fi + tarfile="$tarname.tar" + fi + + # roll the tarball + compress='' + if [ ".$opt_c" != . ]; then + compress="| $opt_c" + fi + if [ ".$prg_tardy" != . ]; then + # the elegant hackers way + tardy_opt="--prefix=$tarname" + tardy_opt="$tardy_opt --user_number=0 --group_number=0" # security! + if [ ".$opt_u" != . ]; then + tardy_opt="$tardy_opt --user_name=$opt_u" + fi + if [ ".$opt_g" != . ]; then + tardy_opt="$tardy_opt --group_name=$opt_g" + fi + if [ ".$opt_t" = .yes ]; then + echo "cat $tmpfile.lst | xargs $prg_tar cf - | $prg_tardy $tardy_opt | cat $compress >$tmpfile.out" 1>&2 + fi + cat $tmpfile.lst |\ + xargs $prg_tar cf - |\ + $prg_tardy $tardy_opt |\ + eval cat $compress >$tmpfile.out + if [ ".$opt_t" = .yes ]; then + echo "cp $tmpfile.out $tarfile" 1>&2 + fi + cp $tmpfile.out $tarfile + else + # the portable standard way + if [ ".$opt_t" = .yes ]; then + echo "mkdir $tmpdir/$tarname" 1>&2 + fi + mkdir $tmpdir/$tarname || exit 1 + if [ ".$opt_t" = .yes ]; then + echo "cat $tmpfile.lst | xargs $prg_tar cf - | (cd $tmpdir/$tarname && $prg_tar xf -)" 1>&2 + fi + cat $tmpfile.lst |\ + xargs $prg_tar cf - |\ + (cd $tmpdir/$tarname && $prg_tar xf -) + if [ ".$opt_u" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1" 2>&1 + fi + chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1 ||\ + echo "$msgprefix:Warning: cannot set user name \`$opt_u' (would require root priviledges)" + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1" 2>&1 + fi + chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1 ||\ + echo "$msgprefix:Warning: cannot set group name \`$opt_g' (would require root priviledges)" + fi + if [ ".$opt_t" = .yes ]; then + echo "(cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) | cat $compress >$tmpfile.out" 1>&2 + fi + (cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) |\ + eval cat $compress >$tmpfile.out + if [ ".$opt_t" = .yes ]; then + echo "cp $tmpfile.out $tarfile" 1>&2 + fi + cp $tmpfile.out $tarfile + if [ ".$opt_t" = .yes ]; then + echo "rm -rf $tmpdir/$tarname" 1>&2 + fi + rm -rf $tmpdir/$tarname + fi + + # cleanup + if [ ".$opt_t" = .yes ]; then + echo "rm -f $tmpfile.lst $tmpfile.out" 1>&2 + fi + rm -f $tmpfile.lst $tmpfile.out + ;; + +subst ) + ## + ## subst -- Apply sed(1) substitution operations + ## Copyright (c) 2001-2002 Ralf S. Engelschall + ## Originally written for OpenPKG's rpmtool + ## + + # remember optional list of file(s) + files="$*" + + # parameter consistency check + if [ $# -eq 0 -a ".$opt_b" != . ]; then + echo "$msgprefix:Error: option -b cannot be applied to stdin" 1>&2 + exit 1 + fi + if [ $# -eq 0 -a ".$opt_s" = .yes ]; then + echo "$msgprefix:Error: option -s cannot be applied to stdin" 1>&2 + exit 1 + fi + + # build underlying sed(1) command + sedcmd='sed' + if [ ".$opt_e" != . ]; then + OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" + for e + do + sedcmd="$sedcmd -e '$e'" + done + elif [ ".$opt_f" != . ]; then + if [ ! -f $opt_f ]; then + echo "$msgprefix:Error: command file \`$opt_f' not found or not a regular file" 1>&2 + exit 1 + fi + sedcmd="$sedcmd -f '$opt_f'" + else + echo "$msgprefix:Error: either -e option(s) or -f option required" 1>&2 + exit 1 + fi + + # determine extension for original file + orig=".orig" + if [ ".$opt_b" != . ]; then + orig="$opt_b" + fi + + # apply sed(1) operation(s) + if [ ".$files" != . ]; then + # apply operation(s) to files + for file in $files; do + test ".$file" = . && continue + if [ ! -f $file ]; then + echo "$msgprefix:Warning: file \`$file' not found or not a regular file" 1>&2 + continue + fi + + # handle interactive mode + if [ ".$opt_i" = .yes ]; then + eval "$sedcmd <$file >$file.new" + skip=no + if cmp $file $file.new >/dev/null 2>&1; then + rm -f $file.new + skip=yes + else + (diff -U1 $file $file.new >$tmpfile) 2>/dev/null + if [ ".`cat $tmpfile`" = . ]; then + (diff -C1 $file $file.new >$tmpfile) 2>/dev/null + if [ ".`cat $tmpfile`" = . ]; then + echo "$msgprefix:Warning: unable to show difference for file \`$file'" 1>&2 + cp /dev/null $tmpfile + fi + fi + rm -f $file.new + cat $tmpfile + echo dummy | awk '{ printf("%s", TEXT); }' TEXT=">>> Apply [Y/n]: " + read input + if [ ".$input" != .Y ] &&\ + [ ".$input" != .y ] &&\ + [ ".$input" != . ]; then + skip=yes + fi + fi + if [ ".$skip" = .yes ]; then + if [ ".$opt_v" = .yes ]; then + echo "file \`$file' -- skipped" 1>&2 + fi + continue + fi + fi + + # apply sed(1) operation(s) + if [ ".$opt_v" = .yes ]; then + echo "patching \`$file'" 1>&2 + fi + if [ ".$opt_t" = .yes ]; then + echo "\$ cp -p $file $file$orig" + echo "\$ $sedcmd <$file$orig >$file" + fi + if [ ".$opt_n" = .no ]; then + cp -p $file $file$orig + eval "$sedcmd <$file$orig >$file" + fi + + # optionally fix timestamp + if [ ".$opt_s" = .yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "\$ touch -r $file$orig $file" + fi + if [ ".$opt_n" = .no ]; then + touch -r $file$orig $file + fi + fi + + # optionally remove preserved original file + if [ ".$opt_b" = . ]; then + if [ ".$opt_t" = .yes ]; then + echo "\$ rm -f $file$orig" + fi + if [ ".$opt_n" = .no ]; then + rm -f $file$orig + fi + fi + done + else + # apply operation(s) to stdin/stdout + if [ ".$opt_v" = .yes ]; then + echo "patching " 1>&2 + fi + if [ ".$opt_t" = .yes ]; then + echo "\$ $sedcmd" + fi + if [ ".$opt_n" = .no ]; then + eval "$sedcmd" + fi + fi + ;; + +guessos ) + ## + ## guessos -- Simple operating system guesser + ## Copyright (c) 1996-1999 The Apache Group, http://www.apache.org/ + ## The Apache license applies (see http://www.apache.org/docs/LICENSE) + ## Originally written for Apache + ## + + MACHINE=`(uname -m) 2>/dev/null` || MACHINE=`(uname -p) 2>/dev/null` || MACHINE="unknown" + RELEASE=`(uname -r) 2>/dev/null` || RELEASE="unknown" + SYSTEM=`(uname -s) 2>/dev/null` || SYSTEM="unknown" + VERSION=`(uname -v) 2>/dev/null` || VERSION="unknown" + + XREL=`(uname -X) 2>/dev/null | grep "^Release" | awk '{print $3}'` + if [ "x$XREL" != "x" ]; then + if [ -f /etc/kconfig ]; then + case "$XREL" in + 4.0|4.1) echo "${MACHINE}-whatever-isc4"; exit 0 ;; + esac + else + case "$XREL" in + 3.2v4.2) + echo "whatever-whatever-sco3"; exit 0 + ;; + 3.2v5.0*) + echo "whatever-whatever-sco5"; exit 0 + ;; + 4.2MP) + if [ "x$VERSION" = "x2.1.1" ]; then + echo "${MACHINE}-whatever-unixware211"; exit 0 + elif [ "x$VERSION" = "x2.1.2" ]; then + echo "${MACHINE}-whatever-unixware212"; exit 0 + else + echo "${MACHINE}-whatever-unixware2"; exit 0 + fi + ;; + 4.2) + echo "whatever-whatever-unixware1"; exit 0 + ;; + 5) + case "$VERSION" in + 7*) echo "${MACHINE}-whatever-unixware7"; exit 0 ;; + esac + ;; + esac + fi + fi + case "${SYSTEM}:${RELEASE}:${VERSION}:${MACHINE}" in + MiNT:*) + echo "m68k-atari-mint"; exit 0 + ;; + A/UX:*) + echo "m68k-apple-aux3"; exit 0 + ;; + AIX:*) + MACH=`echo $MACHINE | sed -e 's;[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F];;'` + echo "${MACH}-ibm-aix${VERSION}.${RELEASE}"; exit 0 + ;; + dgux:*) + echo "${MACHINE}-dg-dgux"; exit 0 + ;; + HI-UX:*) + echo "${MACHINE}-hi-hiux"; exit 0 + ;; + HP-UX:*) + HPUXVER=`echo ${RELEASE}|sed -e 's/[^.]*.[0B]*//'` + MACHINE=`echo ${MACHINE}|sed -e 's:/:_:'` + echo "${MACHINE}-hp-hpux${HPUXVER}"; exit 0 + ;; + IRIX:*) + if [ -f /usr/lib32/mips4/libm.so ]; then + echo "${MACHINE}/32-sgi-irix${RELEASE}"; exit 0 + else + echo "${MACHINE}-sgi-irix${RELEASE}"; exit 0 + fi + ;; + IRIX64:*) + echo "${MACHINE}/64-sgi-irix${RELEASE}"; exit 0 + ;; + Linux:*) + V='whatever' + case "$MACHINE" in + i?86) V='pc' ;; + esac + R='' + case "$RELEASE" in + [1-9].*) R=`echo $RELEASE | cut -c1` ;; + esac + echo "${MACHINE}-${V}-linux-gnu${R}"; exit 0 + ;; + LynxOS:*) + echo "${MACHINE}-lynx-lynxos"; exit 0 + ;; + BSD/386|BSD/OS:3.*) + echo "${MACHINE}-whatever-bsdi3"; exit 0 + ;; + BSD/386:*:*:*486*|BSD/OS:*:*:*:*486*) + echo "i486-whatever-bsdi"; exit 0 + ;; + BSD/386:*|BSD/OS:*) + echo "${MACHINE}-whatever-bsdi"; exit 0 + ;; + FreeBSD:*) + VERS=`echo ${RELEASE} | sed -e 's/[-(].*//'` + MACH=`/sbin/sysctl -n hw.model` + ARCH='whatever' + case ${MACH} in + *386* ) MACH="i386" ;; + *486* ) MACH="i486" ;; + Pentium\ II*) MACH="i686" ;; + Pentium* ) MACH="i586" ;; + Alpha* ) MACH="alpha" ;; + * ) MACH="$MACHINE" ;; + esac + case ${MACH} in + i[0-9]86 ) ARCH="pc" ;; + esac + echo "${MACH}-${ARCH}-freebsd${VERS}"; exit 0 + ;; + NetBSD:*:*:*486*) + echo "i486-whatever-netbsd${RELEASE}"; exit 0 + ;; + NetBSD:*) + echo "${MACHINE}-whatever-netbsd${RELEASE}"; exit 0 + ;; + OpenBSD:*) + echo "${MACHINE}-whatever-openbsd"; exit 0 + ;; + OSF1:*:*:*alpha*) + VERS=`echo $RELEASE | sed -e 's;^V;;'` + echo "${MACHINE}-dec-osf${VERS}"; exit 0 + ;; + QNX:*) + if [ "$VERSION" -gt 422 ]; then + echo "${MACHINE}-qssl-qnx32" + else + echo "${MACHINE}-qssl-qnx" + fi + exit 0 + ;; + Paragon*:*:*:*) + echo "i860-intel-osf1"; exit 0 + ;; + SunOS:5.*) + VERSION=`echo $RELEASE | sed -e 's;^5\.;;'` + echo "${MACHINE}-sun-solaris2.${VERSION}"; exit 0 + ;; + SunOS:*) + echo "${MACHINE}-sun-sunos4"; exit 0 + ;; + UNIX_System_V:4.*:*) + echo "${MACHINE}-whatever-sysv4"; exit 0 + ;; + unix:3.0.9*:*:88k) + echo "${MACHINE}-encore-sysv4"; exit 0 + ;; + *:4*:R4*:m88k) + echo "${MACHINE}-whatever-sysv4"; exit 0 + ;; + UnixWare:5:99*:*) + # Gemini, beta release of next rev of unixware + echo "${MACHINE}-whatever-unixware212"; exit 0 + ;; + DYNIX/ptx:4*:*) + echo "${MACHINE}-whatever-sysv4"; exit 0 + ;; + *:4.0:3.0:[345][0-9]?? | *:4.0:3.0:3[34]??[/,]* | library:*) + echo "x86-ncr-sysv4"; exit 0 + ;; + ULTRIX:*) + echo "${MACHINE}-unknown-ultrix"; exit 0 + ;; + SINIX-?:* | ReliantUNIX-?:*) + echo "${MACHINE}-siemens-sysv4"; exit 0 + ;; + POSIX*BS2000) + echo "${MACHINE}-siemens-sysv4"; exit 0 + ;; + machten:*) + echo "${MACHINE}-tenon-${SYSTEM}"; exit 0; + ;; + ConvexOS:*:11.*:*) + echo "${MACHINE}-v11-${SYSTEM}"; exit 0; + ;; + UNIX_SV:*:*:maxion) + echo "${MACHINE}-ccur-sysv4"; exit 0; + ;; + PowerMAX_OS:*:*:Night_Hawk) + MACHINE=`uname -p` + echo "${MACHINE}-concurrent-powermax"; exit 0; + ;; + UNIX_SV:*) + if [ -d /usr/nec ];then + echo "mips-nec-sysv4"; exit 0; + fi + ;; + NonStop-UX:4.[02]*:[BC]*:*) + echo "${MACHINE}-tandem-sysv4"; exit 0; + ;; + Rhapsody:*:*:*) + case "${MACHINE}" in + "Power Macintosh") MACHINE=powerpc ;; + esac + echo "${MACHINE}-apple-rhapsody${RELEASE}"; exit 0 + ;; + Darwin:*:*:*) + MACHINE=`uname -p` + echo "${MACHINE}-apple-darwin${RELEASE}"; exit 0 + ;; + "Mac OS":*:*:*) + MACHINE=`uname -p` + echo "${MACHINE}-apple-macos${RELEASE}"; exit 0 + ;; + "RISC iX":*) + echo "arm-whatever-riscix"; exit 0; + ;; + *:4.0:2:*) + echo "whatever-unisys-sysv4"; exit 0; + ;; + *:*:dcosx:NILE*) + echo "pyramid-pyramid-svr4"; exit 0; + ;; + *:*:*:"DRS 6000") + echo "drs6000-whatever-whatever"; exit 0; + ;; + AmigaOS:*:*:* ) + echo "${MACHINE}-whatever-${SYSTEM}${RELEASE}"; exit 0 + ;; + esac + + # Now NeXT + ISNEXT=`(hostinfo) 2>/dev/null` + case "$ISNEXT" in + *NeXT*) + # Swiped from a friendly uname clone for NEXT/OPEN Step. + NEXTOSVER="`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'`" + if [ "$NEXTOSVER" -gt 3.3 ]; then + NEXTOS="openstep" + else + NEXTOS="nextstep" + fi + NEXTREL="`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'`" + NEXTARCH=`arch` + echo "${NEXTARCH}-next-${NEXTOS}${NEXTREL}" ; exit 0 + ;; + esac + + # Fallback + echo "${MACHINE}-unknown-${SYSTEM}/${RELEASE}/${VERSION}" + ;; + +arx ) + ## + ## arx -- Extended archive command + ## Copyright (c) 1999-2002 Ralf S. Engelschall + ## Originally written for shtool + ## + + ar_prg="$opt_C" + ar_cmd="$1"; shift + archive="$1"; shift + files="$*" + + # walk through the file list and expand archives members + tmpdir=`echo $archive | sed -e 's;[^/]*$;.arx;'` + nfiles='' + if [ ".$files" != . ]; then + for file in $files; do + if [ ! -f $file ]; then + echo "$msgprefix:Error: input file not found: $file" 1>&2 + exit 1 + fi + case $file in + *.a ) + if [ ! -d $tmpdir ]; then + if [ ".$opt_t" = .yes ]; then + echo "mkdir $tmpdir" 1>&2 + fi + mkdir $tmpdir + fi + case $tmpdir in + .arx ) + from="../$file" + ;; + * ) + dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'` + base=`echo $file | sed -e 's;.*/\([^/]*\)$;\1;'` + from="`cd $dir; pwd`/$base" + ;; + esac + if [ ".$opt_t" = .yes ]; then + echo "(cd $tmpdir && $ar_prg x $from)" 1>&2 + fi + (cd $tmpdir && eval $ar_prg x $from) + if [ $? -ne 0 ]; then + echo "$msgprefix:Error: member extraction failed for archive: $file" 1>&2 + exit 1 + fi + for member in - `eval $ar_prg t $file | sed -e '/_\.SYMDEF/d'`; do + [ ".$member" = .- ] && continue + nfiles="$nfiles $tmpdir/$member" + done + ;; + * ) + nfiles="$nfiles $file" + ;; + esac + done + fi + + # run the final archive command + if [ ".$opt_t" = .yes ]; then + echo "$ar_prg $ar_cmd $archive $nfiles" 1>&2 + fi + eval $ar_prg $ar_cmd $archive $nfiles + if [ $? -ne 0 ]; then + echo "$msgprefix:Error: archive command failed" 1>&2 + exit $? + fi + + # cleanup and die gracefully + if [ -d $tmpdir ]; then + if [ ".$opt_t" = .yes ]; then + echo "rm -rf $tmpdir" 1>&2 + fi + rm -rf $tmpdir + fi + ;; + +slo ) + ## + ## slo -- Separate linker options by library class + ## Copyright (c) 1998-2002 Ralf S. Engelschall + ## Originally written for Apache + ## + + DIFS="$IFS" + + # parse out -L and -l options from command line + DIRS='' + LIBS='' + ARGV='' + optprev='' + for opt + do + # concatenate with previous option if exists + if [ ".$optprev" != . ]; then + opt="${optprev}${opt}"; + optprev='' + fi + # remember options for arg if used stand-alone + if [ ".$opt" = ".-L" -o ".$opt" = ".-l" ]; then + optprev="$opt" + continue; + fi + # split argument into option plus option argument + arg="`echo $opt | cut -c3-`" + opt="`echo $opt | cut -c1-2`" + # store into containers + case $opt in + -L) DIRS="$DIRS:$arg" ;; + -l) LIBS="$LIBS:$arg" ;; + *) ARGV="$ARGV $opt" ;; + esac + done + + # set linker default directories + DIRS_DEFAULT='/lib:/usr/lib' + if [ ".$LD_LIBRARY_PATH" != . ]; then + DIRS_DEFAULT="$DIRS_DEFAULT:$LD_LIBRARY_PATH" + fi + + # sort options by class + DIRS_OBJ='' + LIBS_OBJ='' + DIRS_PIC='' + LIBS_PIC='' + DIRS_DSO='' + LIBS_DSO='' + + # for each library... + OIFS="$IFS"; IFS=':' + for lib in $LIBS; do + [ ".$lib" = . ] && continue + + found='no' + found_indefdir='no' + found_type='' + found_dir='' + + # for each directory... + OIFS2="$IFS"; IFS=":$DIFS" + for dir in ${DIRS} switch-to-defdirs ${DIRS_DEFAULT}; do + [ ".$dir" = . ] && continue + [ ".$dir" = .switch-to-defdirs ] && found_indefdir=yes + [ ! -d $dir ] && continue + + # search the file + OIFS3="$IFS"; IFS="$DIFS" + for file in '' `cd $dir && ls lib${lib}.* 2>/dev/null`; do + [ ".$file" = . ] && continue + case $file in + *.so|*.so.[0-9]*|*.sl|*.sl.[0-9]* ) + found=yes; + found_type=DSO; + break + ;; + *.lo|*.la ) + found=yes; + found_type=PIC + ;; + *.a ) + if [ ".$found_type" = . ]; then + found=yes + found_type=OBJ + fi + ;; + esac + done + IFS="$OIFS3" + if [ ".$found" = .yes ]; then + found_dir="$dir" + break + fi + done + IFS="$OIFS2" + + if [ ".$found" = .yes ]; then + if [ ".$found_indefdir" != .yes ]; then + eval "dirlist=\"\${DIRS_${found_type}}:\"" + if [ ".`echo \"$dirlist\" | fgrep :$found_dir:`" = . ]; then + eval "DIRS_${found_type}=\"\$DIRS_${found_type}:${found_dir}\"" + fi + eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\"" + else + eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\"" + fi + else + LIBS_OBJ="$LIBS_OBJ:$lib" + #dirlist="`echo $DIRS $DIRS_DEFAULT | sed -e 's/:/ /g'`" + #echo "slo:Warning: library \"$lib\" not found in any of the following dirs:" 2>&1 + #echo "slo:Warning: $dirlist" 1>&1 + fi + done + IFS="$OIFS" + + # also pass-through unused dirs even if it's useless + OIFS="$IFS"; IFS=':' + for dir in $DIRS; do + dirlist="${DIRS_OBJ}:${DIRS_PIC}:${DIRS_DSO}:" + if [ ".`echo \"$dirlist\" | fgrep :$dir:`" = . ]; then + DIRS_OBJ="$DIRS_OBJ:$dir" + fi + done + IFS="$OIFS" + + # reassemble the options but separated by type + for type in OBJ PIC DSO; do + OIFS="$IFS"; IFS=':' + eval "libs=\"\$LIBS_${type}\"" + opts='' + for lib in $libs; do + [ ".$lib" = . ] && continue + opts="$opts -l$lib" + done + eval "LIBS_${type}=\"$opts\"" + + eval "dirs=\"\$DIRS_${type}\"" + opts='' + for dir in $dirs; do + [ ".$dir" = . ] && continue + opts="$opts -L$dir" + done + eval "DIRS_${type}=\"$opts\"" + IFS="$OIFS" + done + + # give back results + for var in ARGV DIRS_OBJ LIBS_OBJ DIRS_PIC LIBS_PIC DIRS_DSO LIBS_DSO; do + eval "val=\"\$${var}\"" + val="`echo $val | sed -e 's/^ *//'`" + echo "${opt_p}${var}=\"${val}\"" + done + ;; + +scpp ) + ## + ## scpp -- Sharing C Pre-Processor + ## Copyright (c) 1999-2002 Ralf S. Engelschall + ## Originally written for GNU Pth + ## + + srcs="$*" + output="${opt_o}.n" + + # find a reasonable Awk + awk='' + paths=`echo $PATH |\ + sed -e 's%/*:%:%g' -e 's%/$%%' \ + -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ + -e 's/:/ /g'` + for name in gawk nawk awk; do + for path in $paths; do + if [ -r "$path/$name" ]; then + awk="$path/$name" + break + fi + done + if [ ".$awk" != . ]; then + break + fi + done + if [ ".$awk" = . ]; then + echo "$msgprefix:Error: cannot find a reasonable Awk" 1>&2 + exit 1 + fi + + # parse source file(s) + if [ ".$opt_v" = .yes ]; then + echo "Parsing:" | $awk '{ printf("%s", $0); }' 1>&2 + fi + for src in $srcs; do + if [ ".$opt_v" = .yes ]; then + echo $src | $awk '{ printf(" %s", $0); }' 1>&2 + fi + if [ ".$opt_f" != . ]; then + inputcmd="sed" + OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_f; IFS="$OIFS" + for e + do + inputcmd="$inputcmd -e '$e'" + done + inputcmd="$inputcmd '$src'" + else + inputcmd="cat '$src'" + fi + eval $inputcmd |\ + $awk ' + BEGIN { + ln = 0; + fln = 0; + level = 0; + mode = ""; + store = ""; + } + { + ln++; + } + /^#if.*/ { + level++; + } + /^#if [a-zA-Z_][a-zA-Z0-9_]* *$/ { + if ($2 == define) { + mode = "D"; + printf("D:#line %d \"%s\"\n", ln, src); + next; + } + } + /^#endif.*/ { + level--; + if (mode == "D" && level == 0) { + mode = ""; + next; + } + } + /^[a-zA-Z_][a-zA-Z0-9_].*;.*/ { + if ($1 == class) { + printf("V:#line %d \"%s\"\n", ln, src); + printf("V:%s\n", $0); + printf("J:%s\n", $0); + next; + } + } + /^[a-zA-Z_][a-zA-Z0-9_].*=.*/ { + if ($1 == class) { + printf("V:#line %d \"%s\"\n", ln, src); + printf("V:%s\n", $0); + printf("J:%s\n", $0); + next; + } + } + /^[a-zA-Z_][a-zA-Z0-9_]*/ { + if ($1 == class) { + fln = ln; + store = $0; + mode = "F"; + next; + } + } + /^\{ *$/ { + if (mode == "F") { + printf("F:#line %d \"%s\"\n", fln, src); + printf("F:%s;\n", store); + printf("I:%s;\n", store); + store = ""; + mode = ""; + next; + } + } + { + if (mode == "D") + printf("D:%s\n", $0); + else if (mode == "F") + store = store " " $0; + } + ' "src=$src" "define=$opt_D" "class=$opt_C" >>$tmpfile + done + if [ ".$opt_v" = .yes ]; then + echo "" 1>&2 + fi + + # start generating output header + echo "/* $opt_o -- autogenerated from $opt_t, DO NOT EDIT! */" >$output + echo "#line 1 \"$opt_t\"" >>$output + sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd' |\ + sed -e "/^${opt_M} *\$/d" >>$output + + # merge in the define blocks + grep '^D:' $tmpfile | sed -e 's/^D://' >>$output + + # generate standard prolog + echo "#line 1 \"_ON_THE_FLY_\"" >>$output + echo "" >>$output + echo "/* make sure the scpp source extensions are skipped */" >>$output + echo "#define $opt_D 0" >>$output + echo "#define $opt_C /**/" >>$output + + # generate namespace hiding for variables + echo "" >>$output + echo "/* move intern variables to hidden namespace */" >>$output + grep '^J:' $tmpfile | sed >>$output \ + -e 's/^J://' \ + -e 's/ */ /g' \ + -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\];.*$/#define \1 __\1/' \ + -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\] =.*$/#define \1 __\1/' \ + -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\);.*$/#define \1 __\1/' \ + -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\) =.*$/#define \1 __\1/' + + # generate namespace hiding for functions + echo "" >>$output + echo "/* move intern functions to hidden namespace */" >>$output + grep '^I:' $tmpfile | sed >>$output \ + -e 's/^I://' \ + -e 's/\([ (]\) */\1/g' \ + -e 's/ *\([),]\)/\1/g' \ + -e 's/^[^(]*[ *]\([a-zA-Z0-9_]*\)(.*$/#define \1 __\1/' + + # generate prototypes for variables + echo "" >>$output + echo "/* prototypes for intern variables */" >>$output + grep '^V:' $tmpfile | sed >>$output \ + -e 's/^V://' \ + -e 's/ */ /g' \ + -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\);.*$/\1;/' \ + -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\) =.*$/\1;/' \ + -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\);.*$/\1;/' \ + -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\) =.*$/\1;/' \ + -e 's/ ;/;/g' \ + -e "s/^$opt_C /extern /" + + # generate prototypes for functions + echo "" >>$output + echo "/* prototypes for intern functions */" >>$output + grep '^F:' $tmpfile | sed >>$output \ + -e 's/^F://' \ + -e 's/\([ (]\) */\1/g' \ + -e 's/ *\([),]\)/\1/g' \ + -e 's/\([* ]\)[a-zA-Z0-9_]*,/\1,/g' \ + -e 's/\([* ]\)[a-zA-Z0-9_]*);/\1);/g' \ + -e 's/(\*[a-zA-Z0-9_]*)(/(*)(/g' \ + -e 's/\([ (]\) */\1/g' \ + -e 's/ *\([),]\)/\1/g' \ + -e "s/^$opt_C /extern /" + + # finish generating output header + n=`(echo ''; sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd') |\ + wc -l | sed -e 's;^ *\([0-9]*\) *$;\1;'` + echo "#line $n \"$opt_t\"" >>$output + sed <$opt_t -e "/^${opt_M} *\$/,\$p" -e 'd' |\ + sed -e "/^${opt_M} *\$/d" >>$output + + # create final output file + if [ -f $opt_o ]; then + if [ ".$opt_p" = .yes ]; then + grep -v '^#line' $opt_o >$tmpfile.o + grep -v '^#line' $output >$tmpfile.n + out_old="$tmpfile.o" + out_new="$tmpfile.n" + else + out_old="$opt_o" + out_new="$output" + fi + if cmp -s $out_old $out_new; then + : + else + cp $output $opt_o + fi + else + cp $output $opt_o + fi + rm -f $output + rm -f $tmpfile $tmpfile.* >/dev/null 2>&1 + ;; + +version ) + ## + ## version -- Maintain a version information file + ## Copyright (c) 1994-2002 Ralf S. Engelschall + ## Originally written for ePerl, rewritten from scratch for shtool + ## + + file="$1" + + # determine prefix and name + name="$opt_n" + prefix="$opt_p" + + # determine current version + triple="$opt_s" + if [ ".$triple" != . ]; then + # use given triple + if [ ".`echo $triple | grep '[0-9]*.[0-9]*[sabp.][0-9]*'`" = . ]; then + echo "$msgprefix:Error: invalid argument to option \`-s': \`$opt_s'" 1>&2 + exit 1 + fi + eval `echo $triple |\ + sed -e 's%\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\).*%\ + ver="\1";rev="\2";typ="\3";lev="\4"%'` + tim=calc + elif [ -r $file ]; then + # determine triple from given file + eval `grep 'Version [0-9]*.[0-9]*[sabp.][0-9]* ([0-9]*-[a-zA-Z]*-[0-9]*)' $file |\ + sed -e 's%.*Version \([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\) (\([0-9]*-[a-zA-Z]*-[0-9]*\)).*%\ + ver="\1";rev="\2";typ="\3";lev="\4";tim="\5"%' -e 'q'` + else + # intialise to first version + ver=0 + rev=1 + typ=. + lev=0 + tim=calc + fi + + # determine new version in batch + if [ ".$opt_i" != . ]; then + case $opt_i in + v ) ver=`expr $ver + 1` + rev=0 + lev=0 + ;; + r ) rev=`expr $rev + 1` + lev=0 + ;; + l ) lev=`expr $lev + 1` + ;; + * ) echo "$msgprefix:Error: invalid argument to option \`-i': \`$opt_i'" 1>&2 + exit 1 + ;; + esac + tim=calc + fi + + # determine new version interactively + if [ ".$opt_e" = .yes ]; then + echo "old version: ${ver}.${rev}${typ}${lev}" + while [ 1 ]; do + echo dummy | awk '{ printf("new version: "); }' + read triple + case $triple in + [0-9]*.[0-9]*[sabp.][0-9]* ) + ;; + * ) echo "$msgprefix:Error: invalid version string entered: \`$triple'" 1>&2 + continue + ;; + esac + break + done + eval `echo $triple |\ + sed -e 's%^\([0-9]*\)\.\([0-9]*\)\([sabp.]\)\([0-9]*\)$%\ + ver="\1";rev="\2";typ="\3";lev="\4"%'` + tim=calc + fi + + # determine hexadecimal and libtool value of version + case $typ in + a ) typnum=0; levnum=$lev ;; + b ) typnum=1; levnum=$lev ;; + p | . ) typnum=2; levnum=$lev ;; + s ) typnum=15; levnum=255 ;; # snapshots are special + esac + hex=`echo "$ver:$rev:$typnum:$levnum" |\ + awk -F: '{ printf("0x%x%02x%1x%02x", $1, $2, $3, $4); }' |\ + tr 'abcdef' 'ABCDEF'` + ltv=`echo "$ver:$rev:$typnum:$levnum" |\ + awk -F: '{ printf("%d:%d", $1*10 + $2, $3*10 + $4); }'` + + # determine date + if [ ".$tim" = .calc ]; then + day=`date '+%d'` + month=`date '+%m'` + year=`date '+%Y' 2>/dev/null` + if [ ".$time_year" = . ]; then + year=`date '+%y'` + case $year in + [5-9][0-9]) year="19$year" ;; + [0-4][0-9]) year="20$year" ;; + esac + fi + case $month in + 1|01) month='Jan' ;; + 2|02) month='Feb' ;; + 3|03) month='Mar' ;; + 4|04) month='Apr' ;; + 5|05) month='May' ;; + 6|06) month='Jun' ;; + 7|07) month='Jul' ;; + 8|08) month='Aug' ;; + 9|09) month='Sep' ;; + 10) month='Oct' ;; + 11) month='Nov' ;; + 12) month='Dec' ;; + esac + tim="${day}-${month}-${year}" + fi + + # perform result actions + mode=show + if [ ".$opt_i" != . ]; then + mode=edit + elif [ ".$opt_e" = .yes ]; then + mode=edit + elif [ ".$opt_s" != . ]; then + mode=edit + fi + if [ ".$mode" = .show ]; then + # just display the current version + case $opt_d in + short ) + echo "${ver}.${rev}${typ}${lev}" + ;; + long ) + echo "${ver}.${rev}${typ}${lev} ($tim)" + ;; + libtool ) + echo "${ltv}" + ;; + hex ) + echo "${hex}" + ;; + * ) echo "$msgprefix:Error: invalid argument to option \`-d': \`$opt_d'" 1>&2 + exit 1 + ;; + esac + else + # update the version file + + # pre-generate various strings + triple="${ver}.${rev}${typ}${lev}" + vHex="$hex" + vShort="${triple}" + vLong="${triple} (${tim})" + vTeX="This is ${name}, Version ${triple} (${tim})" + vGNU="${name} ${triple} (${tim})" + vWeb="${name}/${triple}" + vSCCS="@(#)${name} ${triple} (${tim})" + vRCS="\$Id${name} ${triple} (${tim}) \$" + + # determine string out of filename + # (do NOT try to optimize this in any way because of portability) + filestr=`echo $file |\ + tr 'abcdefghijklmnopqrstuvwxyz./%+' \ + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ____' | sed -e 's/-/_/g'` + + # generate uppercase prefix + prefixupper=`echo $prefix |\ + tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + + # create the version file according the the selected language + echo "new version: ${vLong}" + + cp /dev/null $file + case $opt_l in + txt ) + echo >>$file "" + echo >>$file " ${file} -- Version Information for ${name} (syntax: Text)" + echo >>$file " [automatically generated and maintained by GNU shtool]" + echo >>$file "" + echo >>$file " $vTeX" + echo >>$file "" + ;; + c ) + echo >>$file "/*" + echo >>$file "** ${file} -- Version Information for ${name} (syntax: C/C++)" + echo >>$file "** [automatically generated and maintained by GNU shtool]" + echo >>$file "*/" + echo >>$file "" + echo >>$file "#ifdef _${filestr}_AS_HEADER_" + echo >>$file "" + echo >>$file "#ifndef _${filestr}_" + echo >>$file "#define _${filestr}_" + echo >>$file "" + echo >>$file "#define ${prefixupper}VERSION ${vHex}" + echo >>$file "" + echo >>$file "typedef struct {" + echo >>$file " const int v_hex;" + echo >>$file " const char *v_short;" + echo >>$file " const char *v_long;" + echo >>$file " const char *v_tex;" + echo >>$file " const char *v_gnu;" + echo >>$file " const char *v_web;" + echo >>$file " const char *v_sccs;" + echo >>$file " const char *v_rcs;" + echo >>$file "} ${prefix}version_t;" + echo >>$file "" + echo >>$file "extern ${prefix}version_t ${prefix}version;" + echo >>$file "" + echo >>$file "#endif /* _${filestr}_ */" + echo >>$file "" + echo >>$file "#else /* _${filestr}_AS_HEADER_ */" + echo >>$file "" + echo >>$file "#define _${filestr}_AS_HEADER_" + echo >>$file "#include \"${file}\"" + echo >>$file "#undef _${filestr}_AS_HEADER_" + echo >>$file "" + echo >>$file "${prefix}version_t ${prefix}version = {" + echo >>$file " ${vHex}," + echo >>$file " \"${vShort}\"," + echo >>$file " \"${vLong}\"," + echo >>$file " \"${vTeX}\"," + echo >>$file " \"${vGNU}\"," + echo >>$file " \"${vWeb}\"," + echo >>$file " \"${vSCCS}\"," + echo >>$file " \"${vRCS}\"" + echo >>$file "};" + echo >>$file "" + echo >>$file "#endif /* _${filestr}_AS_HEADER_ */" + echo >>$file "" + ;; + perl ) + echo >>$file "##" + echo >>$file "## ${file} -- Version Information for ${name} (syntax: Perl)" + echo >>$file "## [automatically generated and maintained by GNU shtool]" + echo >>$file "##" + echo >>$file "" + echo >>$file "my \$${prefix}version = {" + echo >>$file " 'v_hex' => ${vHex}," + echo >>$file " 'v_short' => \"${vShort}\"," + echo >>$file " 'v_long' => \"${vLong}\"," + echo >>$file " 'v_tex' => \"${vTeX}\"," + echo >>$file " 'v_gnu' => \"${vGNU}\"," + echo >>$file " 'v_web' => \"${vWeb}\"," + echo >>$file " 'v_sccs' => \"${vSCCS}\"," + echo >>$file " 'v_rcs' => \"\\${vRCS}/\"" + echo >>$file "};" + echo >>$file "" + echo >>$file "1;" + echo >>$file "" + ;; + python ) + echo >>$file "##" + echo >>$file "## ${file} -- Version Information for ${name} (syntax: Python)" + echo >>$file "## [automatically generated and maintained by GNU shtool]" + echo >>$file "##" + echo >>$file "" + echo >>$file "class ${prefix}version:" + echo >>$file " v_hex = ${vHex}" + echo >>$file " v_short = \"${vShort}\"" + echo >>$file " v_long = \"${vLong}\"" + echo >>$file " v_tex = \"${vTeX}\"" + echo >>$file " v_gnu = \"${vGNU}\"" + echo >>$file " v_web = \"${vWeb}\"" + echo >>$file " v_sccs = \"${vSCCS}\"" + echo >>$file " v_rcs = \"${vRCS}\"" + echo >>$file "" + ;; + * ) echo "$msgprefix:Error: invalid argument to option \`-l': \`$opt_l'" 1>&2 + exit 1 + ;; + esac + fi + ;; + +path ) + ## + ## path -- Deal with program paths + ## Copyright (c) 1998-2002 Ralf S. Engelschall + ## Originally written for Apache + ## + + namelist="$*" + + # check whether the test command supports the -x option + if [ -x /bin/sh ] 2>/dev/null; then + minusx="-x" + else + minusx="-r" + fi + + # split path string + paths="`echo $opt_p |\ + sed -e 's/^:/.:/' \ + -e 's/::/:.:/g' \ + -e 's/:$/:./' \ + -e 's/:/ /g'`" + + # SPECIAL REQUEST + # translate forward to reverse path + if [ ".$opt_r" = .yes ]; then + if [ "x$namelist" = "x." ]; then + rp='.' + else + rp='' + for pe in `IFS="$IFS/"; echo $namelist`; do + rp="../$rp" + done + fi + echo $rp | sed -e 's:/$::' + exit 0 + fi + + # SPECIAL REQUEST + # strip out directory or base name + if [ ".$opt_d" = .yes ]; then + echo "$namelist" |\ + sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' + exit 0 + fi + if [ ".$opt_b" = .yes ]; then + echo "$namelist" |\ + sed -e 's;.*/\([^/]*\)$;\1;' + exit 0 + fi + + # MAGIC SITUATION + # Perl Interpreter (perl) + if [ ".$opt_m" = .yes -a ".$namelist" = .perl ]; then + rm -f $tmpfile >/dev/null 2>&1 + touch $tmpfile + found=0 + pc=99 + for dir in $paths; do + dir=`echo $dir | sed -e 's;/*$;;'` + nc=99 + for name in perl perl5 miniperl; do + if [ $minusx "$dir/$name" -a ! -d "$dir/$name" ]; then + perl="$dir/$name" + pv=`$perl -e 'printf("%.3f", $]);'` + echo "$pv:$pc:$nc:$perl" >>$tmpfile + found=1 + fi + nc=`expr $nc - 1` + done + pc=`expr $pc - 1` + done + if [ $found = 1 ]; then + perl="`cat $tmpfile | sort -r -u | sed -e 'q' | cut -d: -f4`" + rm -f $tmpfile >/dev/null 2>&1 + echo "$perl" + exit 0 + fi + rm -f $tmpfile >/dev/null 2>&1 + exit 1 + fi + + # MAGIC SITUATION + # C pre-processor (cpp) + if [ ".$opt_m" = .yes -a ".$namelist" = .cpp ]; then + echo >$tmpfile.c "#include " + echo >>$tmpfile.c "Syntax Error" + # 1. try the standard cc -E approach + cpp="${CC-cc} -E" + (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out + my_error=`grep -v '^ *+' $tmpfile.out` + if [ ".$my_error" != . ]; then + # 2. try the cc -E approach and GCC's -traditional-ccp option + cpp="${CC-cc} -E -traditional-cpp" + (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out + my_error=`grep -v '^ *+' $tmpfile.out` + if [ ".$my_error" != . ]; then + # 3. try a standalone cpp command in path and lib dirs + for path in $paths /lib /usr/lib /usr/local/lib; do + path=`echo $path | sed -e 's;/*$;;'` + if [ $minusx "$path/cpp" -a ! -d "$path/cpp" ]; then + cpp="$path/cpp" + break + fi + done + if [ ".$cpp" != . ]; then + (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out + my_error=`grep -v '^ *+' $tmpfile.out` + if [ ".$my_error" != . ]; then + # ok, we gave up... + cpp='' + fi + fi + fi + fi + rm -f $tmpfile >/dev/null 2>&1 + rm -f $tmpfile.c $tmpfile.out >/dev/null 2>&1 + if [ ".$cpp" != . ]; then + echo "$cpp" + exit 0 + fi + exit 1 + fi + + # STANDARD SITUATION + # iterate over names + for name in $namelist; do + # iterate over paths + for path in $paths; do + path=`echo $path | sed -e 's;/*$;;'` + if [ $minusx "$path/$name" -a ! -d "$path/$name" ]; then + if [ ".$opt_s" != .yes ]; then + echo "$path/$name" + fi + exit 0 + fi + done + done + exit 1 + ;; + +esac + +exit 0 + +##EOF## Index: ossp-pkg/snmpdx/snmpdx RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/Attic/snmpdx,v co -q -kk -p'1.8' '/v/ossp/cvs/ossp-pkg/snmpdx/Attic/snmpdx,v' | diff -u - /dev/null -L'ossp-pkg/snmpdx/snmpdx' 2>/dev/null --- ossp-pkg/snmpdx/snmpdx +++ /dev/null 2024-05-13 18:22:11.000000000 +0200 @@ -1,929 +0,0 @@ -#!/cw/bin/perl -## -## OSSP snmpdx -- SNMP Daemon Extension -## Copyright (c) 2003 The OSSP Project -## Copyright (c) 2003 Ralf S. Engelschall -## Copyright (c) 2003 Cable & Wireless -## -## Permission to use, copy, modify, and distribute this software for -## any purpose with or without fee is hereby granted, provided that -## the above copyright notice and this permission notice appear in all -## copies. -## -## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR -## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -## SUCH DAMAGE. -## - -# requirements -require 5; -use strict; -use warnings; -use FindBin; -use Getopt::Long; -use IO; - -# program information -my $prg = { - 'name' => 'OSSP snmpdx', - 'version' => '0.1.0', - 'date' => '01-Sep-2003' -}; - -## _________________________________________________________________________ -## -## HELPER CLASS: LOGFILE WRITING -## _________________________________________________________________________ -## - -package My::Log; - -require Exporter; - -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(new destroy DESTROY write); - -sub new ($$) { - my $proto = shift @_; - my $class = ref $proto || $proto; - my $self = {}; - bless ($self, $class); - my $level = shift @_ || die "missing level argument"; - my $filename = shift @_ || die "missing filename argument"; - $self->{-level} = $level; - $self->{-io} = new IO::File ">>$filename" - or die "cannot open logfile \"$filename\" for writing"; - $self->{-io}->autoflush(1); - return $self; -} - -sub destroy ($) { - my ($self) = @_; - $self->{-io}->close() if (defined($self->{-io})); - return; -} - -sub DESTROY ($) { - my ($self) = @_; - $self->destroy; - return; -} - -sub printf ($;@) { - my $self = shift @_; - my $level = shift @_ || die "missing level argument"; - my $fmt = shift @_ || die "missing format argument"; - if ($self->{-level} >= $level) { - my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time()); - my $id = sprintf("[%04d-%02d-%02d/%02d:%02d:%02d@%05d] ", - $year+1900, $mon+1, $mday, $hour, $min, $sec, $$); - $self->{-io}->printf($id . $fmt . "\n", @_); - } - return; -} - -## _________________________________________________________________________ -## -## HELPER CLASS: VALUE CACHING -## _________________________________________________________________________ -## - -package My::Cache; - -require Exporter; - -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(new destroy DESTROY store fetch); - -sub new ($) { - my ($proto) = @_; - my $class = ref $proto || $proto; - my $self = {}; - bless ($self, $class); - $self->{-cache} = {}; - return $self; -} - -sub destroy ($) { - my ($self) = @_; - return; -} - -sub DESTROY ($) { - my ($self) = @_; - $self->destroy; - return; -} - -sub store ($$$$) { - my ($self, $id, $expires, $value) = @_; - - die "invalid id" if (not defined($id) or $id eq ''); - - if ($expires =~ m|^(\d+)[sS]?$|) { $expires = $1; } - elsif ($expires =~ m|^(\d+)[mM]$|) { $expires = $1 * 60; } - elsif ($expires =~ m|^(\d+)[hH]$|) { $expires = $1 * 60 * 60; } - elsif ($expires =~ m|^(\d+)[dD]$|) { $expires = $1 * 60 * 60 * 24; } - elsif ($expires =~ m|^(\d+)[wW]$|) { $expires = $1 * 60 * 60 * 24 * 7; } - elsif ($expires =~ m|^forever$|i) { $expires = 99999 * 365 * 24 * 60 * 60; } - else { die "invalid expire time"; } - - $expires = time() + $expires; - - $self->{-cache}->{$id} = { -expires => $expires, -value => $value }; - - return; -} - -sub fetch ($$) { - my ($self, $id) = @_; - - my $value = undef; - if (defined($self->{-cache}->{$id})) { - if ($self->{-cache}->{$id}->{-expires} > time()) { - $value = $self->{-cache}->{$id}->{-value}; - } - else { - undef $self->{-cache}->{$id}; - } - } - return $value; -} - -## _________________________________________________________________________ -## -## HELPER CLASS: RUNNING SYSTEM COMMANDS -## _________________________________________________________________________ -## - -package My::System; - -require Exporter; - -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(new destroy DESTROY run); - -sub new ($;$) { - my ($proto, $log, $cache) = @_; - my $class = ref $proto || $proto; - my $self = {}; - bless ($self, $class); - $self->{-log} = $log; - $self->{-cache} = (defined($cache) ? $cache : new My::Cache); - return $self; -} - -sub destroy ($) { - my ($self) = @_; - $self->{-cache}->destroy() if (defined($self->{-cache})); - return; -} - -sub DESTROY ($) { - my ($self) = @_; - $self->destroy; - return; -} - -sub run ($$;$) { - my ($self, $cmd, $expires) = @_; - - $expires = "1m" if (not defined($expires)); - my $result = $self->{-cache}->fetch($cmd); - if (defined($result)) { - $self->{-log}->printf(4, "system: run: \"$cmd\" ($expires) [CACHE HIT]"); - } - else { - $self->{-log}->printf(3, "system: run: \"$cmd\" ($expires) [CACHE MISS]"); - $self->{-log}->printf(5, "system: executing command: \"$cmd\""); - $result = { -stdout => '', -rv => 0 }; - $result->{-stdout} = `$cmd 2>/dev/null`; - $result->{-rv} = ($? >> 8); - $self->{-log}->printf(6, "system: return value: ". $result->{-rv}); - $self->{-cache}->store($cmd, $expires, $result); - } - return $result; -} - -## _________________________________________________________________________ -## -## HELPER CLASS: PLATFORM IDENTIFICATION -## _________________________________________________________________________ -## - -package My::Platform; - -require Exporter; - -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(new destroy DESTROY id); - -sub new ($) { - my ($proto) = @_; - my $class = ref $proto || $proto; - my $self = {}; - bless ($self, $class); - $self->{-machine} = `(uname -m) 2>/dev/null`; - $self->{-machine} = `(uname -p) 2>/dev/null` if ($self->{-machine} eq ''); - $self->{-machine} =~ s|^\s*(.+?)\s*$|$1|s; - $self->{-system} = `(uname -s) 2>/dev/null`; - $self->{-system} =~ s|^\s*(.+?)\s*$|$1|s; - $self->{-release} = `(uname -r) 2>/dev/null`; - $self->{-release} = `(uname -v) 2>/dev/null` if ($self->{-release} eq ''); - $self->{-release} =~ s|^\s*(.+?)\s*$|$1|s; - return $self; -} - -sub destroy ($) { - my ($self) = @_; - return; -} - -sub DESTROY ($) { - my ($self) = @_; - $self->destroy; - return; -} - -sub arch ($) { - my ($self) = @_; - return $self->{-machine}; -} - -sub os ($) { - my ($self) = @_; - return sprintf("%s%s", $self->{-system}, $self->{-release}); -} - -sub id ($) { - my ($self) = @_; - return sprintf("%s-%s%s", $self->{-machine}, $self->{-system}, $self->{-release}); -} - -## _________________________________________________________________________ -## -## HELPER CLASS: MIB OID/NAME MAPPING -## _________________________________________________________________________ -## - -package My::MIB; - -require Exporter; - -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(new destroy DESTROY oid2name name2oid oid2type); - -sub new ($$$) { - my ($proto, $bindir, $mibdir, $mib) = @_; - my $class = ref $proto || $proto; - my $self = {}; - bless ($self, $class); - $self->{-oid2name} = {}; - $self->{-name2oid} = {}; - my @entries = `$bindir/snmptranslate -M $mibdir -m $mib -Tl`; - foreach my $entry (@entries) { - $entry =~ s|\n$||s; - my $name = $entry; - my $oid = ''; - $name =~ s|\((\d+)\)|$oid .= ".$1", ''|sge; - my $out = `$bindir/snmptranslate -M $mibdir -m $mib -Td $oid`; - if ($out =~ m|\s+MAX-ACCESS\s+not-accessible\s*|si) { - next; - } - my $type; - if ($out =~ m|TEXTUAL\s+CONVENTION\s+(.+?)\n\s+SYNTAX|si) { - $type = $1; - } - elsif ($out =~ m|SYNTAX\s+(.+?)\s*\n|si) { - $type = $1; - $type =~ s|\s+\([^\)]+\)$||s; - } - else { - next; - } - if ($name =~ m|[^.]+TABLE\.[^.]+ENTRY\.[^.]+$|) { - $name .= ".#"; - $oid .= ".#"; - } - $self->{-oid2type}->{$oid} = $type; - $self->{-oid2name}->{$oid} = $name; - $self->{-name2oid}->{$name} = $oid; - } - return $self; -} - -sub destroy ($) { - my ($self) = @_; - return; -} - -sub DESTROY ($) { - my ($self) = @_; - $self->destroy; - return; -} - -sub oid2name ($$) { - my ($self, $oid) = @_; - return $self->{-oid2name}->{$oid}; -} - -sub name2oid ($$) { - my ($self, $name) = @_; - return $self->{-name2oid}->{$name}; -} - -sub oid2type ($$) { - my ($self, $oid) = @_; - return $self->{-oid2type}->{$oid}; -} - -sub oids ($;@) { - my ($self, @patterns) = @_; - my $oids = []; - foreach my $pattern (@patterns) { - $pattern = "*" if (not defined($pattern)); - $pattern =~ s/\./\\./sg; - $pattern =~ s/\*/.*/sg; - foreach my $name (keys(%{$self->{-name2oid}})) { - if ($name =~ m|^${pattern}$|si) { - push(@{$oids}, $self->{-name2oid}->{$name}); - } - } - } - return $oids; -} - -## _________________________________________________________________________ -## -## HELPER CLASS: PROBE (abstract only) -## _________________________________________________________________________ -## - -package My::Probe; - -require Exporter; - -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(new destroy DESTROY oids probe); - -sub new ($$) { - my ($proto, $ctx) = @_; - my $class = ref $proto || $proto; - my $self = {}; - bless ($self, $class); - $self->{-ctx} = $ctx; - return $self; -} - -sub destroy ($) { - my ($self) = @_; - return; -} - -sub DESTROY ($) { - my ($self) = @_; - $self->destroy; - return; -} - -sub oids ($) { - my ($self) = @_; - return []; -} - -sub probe ($$$) { - my ($self, $ctx, $oid) = @_; - return {}; -} - -## _________________________________________________________________________ -## -## HELPER CLASS: Encoding -## _________________________________________________________________________ -## - -package My::Enc; - -require Exporter; - -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(new destroy DESTROY dat_encode dat_decode octet_encode octet_decode); - -sub new ($$) { - my ($proto) = @_; - my $class = ref $proto || $proto; - my $self = {}; - bless ($self, $class); - return $self; -} - -sub destroy ($) { - my ($self) = @_; - return; -} - -sub DESTROY ($) { - my ($self) = @_; - $self->destroy; - return; -} - -# ASN.1 DateAndTime encoding/decoding -sub dat_encode ($$) { - my ($self, $asc) = @_; - my ($y, $m, $d, $H, $M, $S) = (0, 0, 0, 0, 0, 0); - if ($asc =~ m|^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$|) { - ($y, $m, $d, $H, $M, $S) = ($1, $2, $3, $4, $5, $6); - } - return pack("nCCCCCCCCC", $y, $m, $d, $H, $M, $S, 0, 0, 0, 0); -} -sub dat_decode ($$) { - my ($self, $bin) = @_; - my ($y, $m, $d, $H, $M, $S) = unpack("nCCCCCCCCC", $bin); - return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $y, $m, $d, $H, $M, $S); -} - -# snmpd(8) pass_persist protocol 'octet' encoding/decoding -sub octet_encode ($$) { - my ($self, $bin) = @_; - my $asc = ''; - $bin =~ s|(.)|$asc .= sprintf("%02x ", ord($1)), ''|sge; - return $asc; -} -sub octet_decode ($$) { - my ($self, $asc) = @_; - my $bin = ''; - $asc =~ s|([0-9a-zA-Z]{2})\s*|$bin .= chr(hex($1)), ''|sge; - return $bin; -} - -## _________________________________________________________________________ -## -## MAIN PROCEDURE -## _________________________________________________________________________ -## - -package main; - -# find path to ourself -my $myroot = "$FindBin::Bin"; - -# parameters (defaults) -my $opt = { - 'config' => "$myroot/snmpdx.cfg", - 'version' => 0, - 'help' => 0, - 'tmpdir' => ($ENV{TMPDIR} || $ENV{TEMPDIR} || "/tmp"), - 'get' => 0, - 'next' => 0, - 'set' => 0, - 'bindir' => "/cw/bin", - 'probedir' => "$myroot/snmpdx.d", - 'probename' => "*", - 'mibdir' => "$myroot/snmpdx.mib", - 'mibname' => "snmpdx", - 'logfile' => "$myroot/snmpdx.log", - 'loglevel' => 9, - 'strict' => 0, -}; - -# command line parsing -my %options = ( - 'c|config=s' => \$opt->{'config'}, - 'V|version' => \$opt->{'version'}, - 'h|help' => \$opt->{'help'}, - 't|tmpdir=s' => \$opt->{'tmpdir'}, - 'g|get' => \$opt->{'get'}, - 'n|next' => \$opt->{'next'}, - 's|set' => \$opt->{'set'}, - 'b|bindir=s' => \$opt->{'bindir'}, - 'P|probedir=s' => \$opt->{'probedir'}, - 'p|probename=s' => \$opt->{'probename'}, - 'M|mibdir=s' => \$opt->{'mibdir'}, - 'm|mibname=s' => \$opt->{'mibname'}, - 'l|logfile=s' => \$opt->{'logfile'}, - 'L|loglevel=i' => \$opt->{'loglevel'}, - 'S|strict' => \$opt->{'strict'}, -); -Getopt::Long::Configure("bundling"); -my $result = GetOptions(%options) || die "option parsing failed"; -if ($opt->{'help'}) { - print "Usage: $prg->{'name'} [options] [SPECFILE ...]\n" . - "Available options:\n" . - " -c,--config=PATH read command line options from configuration fil\n" . - " -V,--version print program version\n" . - " -h,--help print out this usage page\n" . - " -t,--tmpdir=PATH filesystem path to temporary directory\n" . - " -g,--get get value of this MIB OID\n" . - " -n,--next get value of next MIB OID\n" . - " -s,--set set value of next MIB OID (NOT IMPLEMENTED)\n" . - " -b,--bindir=PATH path to the net-snmp binaries\n" . - " -P,--probedir=PATH path to probe directory\n" . - " -p,--probename=NAME the pattern for probes to load\n" . - " -M,--mibdir=PATH path to MIB directory\n" . - " -m,--mibname=MIB the name of the MIB to act under\n" . - " -l,--logfile=PATH path to daemon logfile\n" . - " -L,--loglevel=NUM logging level (0...9)\n" . - " -S,--strict strict processing of unknown values\n"; - exit(0); -} -if ($opt->{'version'}) { - print "$prg->{'name'} $prg->{'version'} ($prg->{'date'})\n"; - exit(0); -} - -# support external configuration file -if (-f $opt->{'config'}) { - my $cfg = new IO::File "<$opt->{'config'}"; - my $line; - while (defined($line = $cfg->getline())) { - $line =~ s|\r?\n$||s; - next if ($line =~ m/^\s*(#.*)?$/s); - my ($option, $value) = ($line =~ m|^\s*(\S+)\s+(.+?)\s*$|s); - die "invalid configuration line \"$line\"" - if (not defined($option) or not defined($value)); - my ($var) = map { $options{$_} } - grep { $_ =~ m/^.\|\Q$option\E(=[si])?$/s } - keys(%options); - die "invalid configuration option \"$option\"" - if (not defined($var)); - ${$var} = $value; - } - $cfg->close; -} - -# create daemon run-time context -my $ctx = {}; -$ctx->{-prg} = $prg; -$ctx->{-opt} = $opt; -$ctx->{-log} = new My::Log ($opt->{'loglevel'}, $opt->{'logfile'}); -$ctx->{-cache} = new My::Cache; -$ctx->{-sys} = new My::System ($ctx->{-log}, $ctx->{-cache}); -$ctx->{-platform} = new My::Platform; -$ctx->{-mib} = new My::MIB ($opt->{'bindir'}, $opt->{'mibdir'}, $opt->{'mibname'}); -$ctx->{-enc} = new My::Enc; - -# startup information -$ctx->{-log}->printf(1, "startup %s %s (%s) on %s", - $prg->{'name'}, $prg->{'version'}, $prg->{'date'}, - $ctx->{-platform}->id()); - -# exception handling support -$SIG{__DIE__} = sub { - my ($err) = @_; - $err =~ s|\r?\n$||s; - $ctx->{-log}->printf(1, "ERROR: $err ". ($! ? "($!)" : "")); - undef $ctx; - exit(1); -}; -$SIG{__WARN__} = sub { - my ($err) = @_; - $err =~ s|\r?\n$||s; - $ctx->{-log}->printf(1, "WARNING: $err"); - return; -}; - -# PROTOCOL MIB MIB TYPE net-snmp API CONVERT TYPE -# ---------- ---------- ------------------- -------------- ------- ------ -# string SNMPv2-TC DisplayString ASN_OCTET_STR - char * -# integer ASN.1 Integer32 ASN_INTEGER strtol long -# unsigned SNMPv2-SMI Unsigned32 ASN_UNSIGNED strtoul long -# counter SNMPv2-SMI Counter32 ASN_COUNTER strtoul long -# octet ASN.1 OCTET STRING ASN_OCTET_STR asc2bin char * -# opaque SNMPv2-SMI Opaque ASN_OPAQUE asc2bin char * -# gauge SNMPv2-SMI Gauge32 ASN_GAUGE strtoul long -# objectid ASN.1 OBJECT IDENTIFIER ASN_OBJECT_ID - char * -# timetick SNMPv2-SMI TimeTicks ASN_TIMETICKS strtoul long -# ipaddress SNMPv2-SMI IpAddress ASN_IPADDRESS htonl long -# octet SNMPv2-TC DateAndTime ASN_OCTET_STR asc2bin char * - -# load probes and determine their handled OIDs -my $oidtable = []; -my $oidhandler = {}; -my $oidprobe = {}; -my $oidtype = { - 'DisplayString' => [ 'string', 'N.A.' ], - 'Integer32' => [ 'integer', '-1' ], - 'Unsigned32' => [ 'unsigned', '0' ], - 'Counter32' => [ 'counter', '-1' ], - 'OCTET STRING' => [ 'octet', 'N.A.' ], - 'Opaque' => [ 'opaque', 'N.A.' ], - 'Gauge32' => [ 'gauge', '-1' ], - 'OBJECT IDENTIFIER' => [ 'objectid', '.0' ], - 'TimeTicks' => [ 'timetick', '0' ], - 'IpAddress' => [ 'ipaddress', '0.0.0.0' ], - 'DateAndTime' => [ 'octet', $ctx->{-enc}->dat_encode("1970-01-01 01:02:03") ], -}; -$ctx->{-log}->printf(1, "MIB id: %s", $opt->{'mibname'}); -foreach my $probefile (glob($opt->{'probedir'}."/".$opt->{'probename'}.".pm")) { - my $probe = $probefile; - $probe =~ s|^.*/([^/]+)\.pm$|$1|sg; - my $p; - eval { - local $SIG{__DIE__} = 'DEFAULT'; - eval "require \"$probefile\";"; - die if ($@); - eval "\$p = new My::Probe::$probe (\$ctx);"; - die if ($@); - }; - if ($@) { - die "invalid probe \"$probe\": $@"; - } - $ctx->{-log}->printf(2, "Probe: \"%s\"", $probe); - foreach my $oid (sort(@{$p->oids()})) { - push(@{$oidtable}, $oid); - $oidhandler->{$oid} = $p; - $oidprobe->{$oid} = $probe; - $ctx->{-log}->printf(1, "MIB OID: %s [%s] ::= %s (%s)", - $oid, $ctx->{-mib}->oid2name($oid), - $ctx->{-mib}->oid2type($oid), - $oidtype->{$ctx->{-mib}->oid2type($oid)}->[0]); - } -} -@{$oidtable} = sort(@{$oidtable}); - -# determine run-time mode -my $mode = "pass_persist"; -if ($opt->{'get'} or $opt->{'next'} or $opt->{'set'}) { - $mode = "pass"; -} - -# connect I/O channels -my $stdin = new IO::Handle;; -$stdin->fdopen(fileno(STDIN), "r"); -$stdin->blocking(1); -my $stdout = new IO::Handle;; -$stdout->fdopen(fileno(STDOUT), "w"); -$stdout->autoflush(1); -open(STDERR, ">/dev/null"); - -# processing loop -while (1) { - # determine command - my $cmd; - if ($mode eq "pass_persist") { - # read next command from snmpd - $cmd = $stdin->getline; - if (not defined($cmd)) { - $ctx->{-log}->printf(4, "IO: EOF"); - last; - } - $cmd =~ s|\n?$||s; - $ctx->{-log}->printf(4, "IO: recv: << \"%s\\n\"", $cmd); - } - else { - $cmd = ($opt->{'get'} ? 'get' : - ($opt->{'next'} ? 'getnext' : - ($opt->{'set'} ? 'set' : 'unknown'))); - $ctx->{-log}->printf(4, "CMD: \"%s\\n\"", $cmd); - } - - # act upon command - if ($cmd =~ m/^PING$/i) { - # - # the PING/PONG protocol part - # - $ctx->{-log}->printf(4, "IO: send: >> \"PONG\\n\""); - $stdout->printf("PONG\n"); - } - - elsif ($cmd =~ m/^GET$/i or $cmd =~ m/^GETNEXT$/i) { - # - # the GET/GETNEXT protocol part - # - my $error = 1; - - # read requested OID - my $oid_request; - if ($mode eq "pass") { - $oid_request = $ARGV[0]; - } - else { - $oid_request = $stdin->getline; - if (not defined($oid_request)) { - $ctx->{-log}->printf(1, "ERROR: EOF instead of OID"); - goto ERROR; - } - $oid_request =~ s|\n?$||s; - } - $ctx->{-log}->printf(4, "IO: recv: << \"%s\\n\"", $oid_request); - if ($oid_request !~ m/^(\.\d+)+$/) { - $ctx->{-log}->printf(1, "ERROR: invalid query OID \"%s\"", $oid_request); - goto ERROR; - } - - # re-entry point for OID processing - my $oid_search = $oid_request; - RETRY: - - # determine acted/handled OID - my $oid_action = undef; - my $oid_handled = undef; - my $oid_handler = undef; - my $oid_next = undef; - if ($cmd =~ m/^GET$/i) { - # search for explicitly handled OID - for (my $i = 0; defined($oidtable->[$i]); $i++) { - if ($oidtable->[$i] eq $oid_search) { - $oid_action = $oidtable->[$i]; - $oid_handled = $oidtable->[$i]; - last; - } - } - # search for implicitly handled OID (sequence element) - if (not defined($oid_handled)) { - my $oid_parent = $oid_search; - $oid_parent =~ s|(\.\d+)$||s; - for (my $i = 0; defined($oidtable->[$i]); $i++) { - if ($oidtable->[$i] =~ m|^\Q$oid_parent\E\.#$|) { - $oid_action = $oid_search; - $oid_handled = $oidtable->[$i]; - last; - } - } - } - } - elsif ($cmd =~ m/^GETNEXT$/i) { - # search for explicitly handled OID - for (my $i = 0; defined($oidtable->[$i]); $i++) { - if ($oidtable->[$i] =~ m|^\Q$oid_search\E(\.\d+)+$|) { - # OID starts with requested OID prefix, so use this OID - $oid_action = $oidtable->[$i]; - $oid_handled = $oidtable->[$i]; - $oid_next = $oidtable->[$i+1]; - last; - } - elsif ($oidtable->[$i] eq $oid_search) { - # OID is the requested OID exactly, so use next OID - if (defined($oidtable->[$i+1])) { - $oid_action = $oidtable->[$i+1]; - $oid_action =~ s|\.#$|.1|s; - $oid_handled = $oidtable->[$i+1]; - $oid_next = $oidtable->[$i+2]; - last; - } - else { - goto ERROR; # end-of-MIB - } - } - } - # search for implicitly handled OID (sequence element) - if (not defined($oid_handled)) { - my $oid_parent = $oid_search; - $oid_parent =~ s|(\.\d+)$||s; - for (my $i = 0; defined($oidtable->[$i]); $i++) { - # search for implicitly handled OID (sequence element) - if ($oidtable->[$i] =~ m|^\Q$oid_search\E(\.\d+)*\.#$|) { - # OID start with requested OID prefix, so use first OID in sequence - $oid_action = $oidtable->[$i]; - $oid_action =~ s|\.#$|.1|s; - $oid_handled = $oidtable->[$i]; - $oid_next = $oidtable->[$i+1]; - last; - } - elsif ($oidtable->[$i] =~ m|^\Q$oid_parent\E\.#$|) { - # OID is the requested OID of a sequence exactly, so use next OID in sequence - $oid_action = $oid_search; - $oid_action =~ s|\.(\d+)$|".".($1+1)|se; - $oid_handled = $oidtable->[$i]; - $oid_next = $oidtable->[$i+1]; - last; - } - } - } - } - if (defined($oid_handled)) { - $oid_handler = $oidhandler->{$oid_handled}; - } - else { - $ctx->{-log}->printf(1, "ERROR: no handler found for OID \"%s\"", $oid_request); - goto ERROR; # end-of-MIB - } - - # prepare probe request object - my $obj = { - -oid => $oid_action, - -name => $ctx->{-mib}->oid2name($oid_handled), - -type => $ctx->{-mib}->oid2type($oid_handled), - -value => undef - }; - - # provide mixed name/OID for sequence index - if ($obj->{-name} =~ m|\.#$|) { - my ($idx) = ($obj->{-oid} =~ m|\.(\d+)$|); - $obj->{-name} =~ s|\.#$|.$idx|; - } - - # probe value of OID - $ctx->{-log}->printf(2, "probing \"%s\" for OID \"%s\"", $oidprobe->{$oid_handled}, $oid_action); - $oid_handler->probe($obj); - - # handle special "unknown OID value" situation - if (not defined($obj->{-value})) { - $ctx->{-log}->printf(1, "WARNING: handler was unable to provide probe value for OID \"%s\"", $oid_request); - if ($opt->{'strict'}) { - # strict processing: return ERROR on unknown value - # for GET request and skip unknown OIDs on GETNEXT. - if ($cmd =~ m/^GET$/i) { - goto ERROR; # no-value - } - else { # GETNEXT - if (defined($oid_next)) { - $oid_search = $oid_next; - $oid_search =~ s|\.#$||s; - goto RETRY; - } - else { - goto ERROR; # no-value - } - } - } - else { - # non-strict processing: return a reasonable default value - if ($oid_handled =~ m|\.#$|) { - if ($oid_action =~ m|\.1$|) { - $obj->{-value} = $oidtype->{$obj->{-type}}->[1]; - } - else { - if (defined($oid_next)) { - $oid_search = $oid_next; - $oid_search =~ s|\.#$||s; - goto RETRY; - } - else { - goto ERROR; # end-of-MIB - } - } - } - else { - $obj->{-value} = $oidtype->{$obj->{-type}}->[1]; - } - } - } - - # optionally encode value to conform to snmpd(8) protocol - if ($oidtype->{$obj->{-type}}->[0] =~ m/^(octet|opaque)$/) { - $obj->{-value} = $ctx->{-enc}->octet_encode($obj->{-value}); - } - - # return result - $ctx->{-log}->printf(1, "QUERY: %s [%s] ::= %s \"%s\"", - $obj->{-name}, $obj->{-oid}, $obj->{-type}, $obj->{-value}); - $stdout->printf("%s\n%s\n%s\n", - $obj->{-oid}, $oidtype->{$obj->{-type}}->[0], $obj->{-value}); - $ctx->{-log}->printf(4, "IO: send: >> \"%s\\n%s\\n%s\\n\"", - $obj->{-oid}, $oidtype->{$obj->{-type}}->[0], $obj->{-value}); - - # end-of-MIB or no-value handling - $error = 0; - if ($error) { - ERROR: - if ($mode eq "pass_persist") { - $ctx->{-log}->printf(4, "IO: send: >> \"NONE\\n\""); - $stdout->printf("NONE\n"); - } - } - } - elsif ($cmd =~ m/^SET$/i) { - # - # the SET protocol part - # - if ($mode eq "pass_persist") { - # read requested OID/TYPE/VALUE (and ignore) - my $oid = $stdin->getline; - my $oid_type = $stdin->getline; - my $oid_value = $stdin->getline; - $ctx->{-log}->printf(4, "IO: send: >> \"NONE\\n\""); - $stdout->printf("NONE\n"); - } - else { - $ctx->{-log}->printf(4, "IO: send: >> \"not-writable\\n\""); - $stdout->printf("not-writable\n"); - } - } - else { - # for anything else (not expected) just send at least - # "NONE" in case snmpd(8) expects something. - $ctx->{-log}->printf(4, "IO: send: >> \"NONE\\n\""); - $stdout->printf("NONE\n"); - } - - # stop processing on "pass" mode - last if ($mode eq "pass"); -} - -# shutdown gracefully -$ctx->{-log}->printf(1, "shutdown"); -undef $ctx; -exit(0); - Index: ossp-pkg/snmpdx/snmpdx.cfg RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/Attic/snmpdx.cfg,v rcsdiff -q -kk '-r1.1' '-r1.2' -u '/v/ossp/cvs/ossp-pkg/snmpdx/Attic/snmpdx.cfg,v' 2>/dev/null --- snmpdx.cfg 2003/09/02 12:12:55 1.1 +++ snmpdx.cfg 2003/09/09 09:24:28 1.2 @@ -2,7 +2,7 @@ ## snmpdx.cfg -- configuration file for SNMP Daemon Extension ## -mibdir /u/rse/wrk/ossp/snmpdx/snmpdx.mib:/cw/share/snmp/mibs -probedir /u/rse/wrk/ossp/snmpdx/snmpdx.d -logfile /tmp/snmpdx-rse.log +mibdir /u/thl/work/snmpdx/snmpdx.mib:/cw/share/snmp/mibs +probedir /u/thl/work/snmpdx/snmpdx.d +logfile /tmp/snmpdx-thl.log Index: ossp-pkg/snmpdx/snmpdx.pl RCS File: /v/ossp/cvs/ossp-pkg/snmpdx/snmpdx.pl,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/snmpdx/snmpdx.pl,v' | diff -u /dev/null - -L'ossp-pkg/snmpdx/snmpdx.pl' 2>/dev/null --- ossp-pkg/snmpdx/snmpdx.pl +++ - 2024-05-13 18:22:49.359303586 +0200 @@ -0,0 +1,929 @@ +#!@PERL@ -w +## +## OSSP snmpdx -- SNMP Daemon Extension +## Copyright (c) 2003 The OSSP Project +## Copyright (c) 2003 Ralf S. Engelschall +## Copyright (c) 2003 Cable & Wireless +## +## Permission to use, copy, modify, and distribute this software for +## any purpose with or without fee is hereby granted, provided that +## the above copyright notice and this permission notice appear in all +## copies. +## +## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR +## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +## SUCH DAMAGE. +## + +# requirements +require 5; +use strict; +use warnings; +use FindBin; +use Getopt::Long; +use IO; + +# program information +my $prg = { + 'name' => 'OSSP snmpdx', + 'version' => '0.2.0', + 'date' => '01-Sep-2003' +}; + +## _________________________________________________________________________ +## +## HELPER CLASS: LOGFILE WRITING +## _________________________________________________________________________ +## + +package My::Log; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(new destroy DESTROY write); + +sub new ($$) { + my $proto = shift @_; + my $class = ref $proto || $proto; + my $self = {}; + bless ($self, $class); + my $level = shift @_ || die "missing level argument"; + my $filename = shift @_ || die "missing filename argument"; + $self->{-level} = $level; + $self->{-io} = new IO::File ">>$filename" + or die "cannot open logfile \"$filename\" for writing"; + $self->{-io}->autoflush(1); + return $self; +} + +sub destroy ($) { + my ($self) = @_; + $self->{-io}->close() if (defined($self->{-io})); + return; +} + +sub DESTROY ($) { + my ($self) = @_; + $self->destroy; + return; +} + +sub printf ($;@) { + my $self = shift @_; + my $level = shift @_ || die "missing level argument"; + my $fmt = shift @_ || die "missing format argument"; + if ($self->{-level} >= $level) { + my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time()); + my $id = sprintf("[%04d-%02d-%02d/%02d:%02d:%02d@%05d] ", + $year+1900, $mon+1, $mday, $hour, $min, $sec, $$); + $self->{-io}->printf($id . $fmt . "\n", @_); + } + return; +} + +## _________________________________________________________________________ +## +## HELPER CLASS: VALUE CACHING +## _________________________________________________________________________ +## + +package My::Cache; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(new destroy DESTROY store fetch); + +sub new ($) { + my ($proto) = @_; + my $class = ref $proto || $proto; + my $self = {}; + bless ($self, $class); + $self->{-cache} = {}; + return $self; +} + +sub destroy ($) { + my ($self) = @_; + return; +} + +sub DESTROY ($) { + my ($self) = @_; + $self->destroy; + return; +} + +sub store ($$$$) { + my ($self, $id, $expires, $value) = @_; + + die "invalid id" if (not defined($id) or $id eq ''); + + if ($expires =~ m|^(\d+)[sS]?$|) { $expires = $1; } + elsif ($expires =~ m|^(\d+)[mM]$|) { $expires = $1 * 60; } + elsif ($expires =~ m|^(\d+)[hH]$|) { $expires = $1 * 60 * 60; } + elsif ($expires =~ m|^(\d+)[dD]$|) { $expires = $1 * 60 * 60 * 24; } + elsif ($expires =~ m|^(\d+)[wW]$|) { $expires = $1 * 60 * 60 * 24 * 7; } + elsif ($expires =~ m|^forever$|i) { $expires = 99999 * 365 * 24 * 60 * 60; } + else { die "invalid expire time"; } + + $expires = time() + $expires; + + $self->{-cache}->{$id} = { -expires => $expires, -value => $value }; + + return; +} + +sub fetch ($$) { + my ($self, $id) = @_; + + my $value = undef; + if (defined($self->{-cache}->{$id})) { + if ($self->{-cache}->{$id}->{-expires} > time()) { + $value = $self->{-cache}->{$id}->{-value}; + } + else { + undef $self->{-cache}->{$id}; + } + } + return $value; +} + +## _________________________________________________________________________ +## +## HELPER CLASS: RUNNING SYSTEM COMMANDS +## _________________________________________________________________________ +## + +package My::System; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(new destroy DESTROY run); + +sub new ($;$) { + my ($proto, $log, $cache) = @_; + my $class = ref $proto || $proto; + my $self = {}; + bless ($self, $class); + $self->{-log} = $log; + $self->{-cache} = (defined($cache) ? $cache : new My::Cache); + return $self; +} + +sub destroy ($) { + my ($self) = @_; + $self->{-cache}->destroy() if (defined($self->{-cache})); + return; +} + +sub DESTROY ($) { + my ($self) = @_; + $self->destroy; + return; +} + +sub run ($$;$) { + my ($self, $cmd, $expires) = @_; + + $expires = "1m" if (not defined($expires)); + my $result = $self->{-cache}->fetch($cmd); + if (defined($result)) { + $self->{-log}->printf(4, "system: run: \"$cmd\" ($expires) [CACHE HIT]"); + } + else { + $self->{-log}->printf(3, "system: run: \"$cmd\" ($expires) [CACHE MISS]"); + $self->{-log}->printf(5, "system: executing command: \"$cmd\""); + $result = { -stdout => '', -rv => 0 }; + $result->{-stdout} = `$cmd 2>/dev/null`; + $result->{-rv} = ($? >> 8); + $self->{-log}->printf(6, "system: return value: ". $result->{-rv}); + $self->{-cache}->store($cmd, $expires, $result); + } + return $result; +} + +## _________________________________________________________________________ +## +## HELPER CLASS: PLATFORM IDENTIFICATION +## _________________________________________________________________________ +## + +package My::Platform; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(new destroy DESTROY id); + +sub new ($) { + my ($proto) = @_; + my $class = ref $proto || $proto; + my $self = {}; + bless ($self, $class); + $self->{-machine} = `(uname -m) 2>/dev/null`; + $self->{-machine} = `(uname -p) 2>/dev/null` if ($self->{-machine} eq ''); + $self->{-machine} =~ s|^\s*(.+?)\s*$|$1|s; + $self->{-system} = `(uname -s) 2>/dev/null`; + $self->{-system} =~ s|^\s*(.+?)\s*$|$1|s; + $self->{-release} = `(uname -r) 2>/dev/null`; + $self->{-release} = `(uname -v) 2>/dev/null` if ($self->{-release} eq ''); + $self->{-release} =~ s|^\s*(.+?)\s*$|$1|s; + return $self; +} + +sub destroy ($) { + my ($self) = @_; + return; +} + +sub DESTROY ($) { + my ($self) = @_; + $self->destroy; + return; +} + +sub arch ($) { + my ($self) = @_; + return $self->{-machine}; +} + +sub os ($) { + my ($self) = @_; + return sprintf("%s%s", $self->{-system}, $self->{-release}); +} + +sub id ($) { + my ($self) = @_; + return sprintf("%s-%s%s", $self->{-machine}, $self->{-system}, $self->{-release}); +} + +## _________________________________________________________________________ +## +## HELPER CLASS: MIB OID/NAME MAPPING +## _________________________________________________________________________ +## + +package My::MIB; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(new destroy DESTROY oid2name name2oid oid2type); + +sub new ($$$) { + my ($proto, $bindir, $mibdir, $mib) = @_; + my $class = ref $proto || $proto; + my $self = {}; + bless ($self, $class); + $self->{-oid2name} = {}; + $self->{-name2oid} = {}; + my @entries = `$bindir/snmptranslate -M $mibdir -m $mib -Tl`; + foreach my $entry (@entries) { + $entry =~ s|\n$||s; + my $name = $entry; + my $oid = ''; + $name =~ s|\((\d+)\)|$oid .= ".$1", ''|sge; + my $out = `$bindir/snmptranslate -M $mibdir -m $mib -Td $oid`; + if ($out =~ m|\s+MAX-ACCESS\s+not-accessible\s*|si) { + next; + } + my $type; + if ($out =~ m|TEXTUAL\s+CONVENTION\s+(.+?)\n\s+SYNTAX|si) { + $type = $1; + } + elsif ($out =~ m|SYNTAX\s+(.+?)\s*\n|si) { + $type = $1; + $type =~ s|\s+\([^\)]+\)$||s; + } + else { + next; + } + if ($name =~ m|[^.]+TABLE\.[^.]+ENTRY\.[^.]+$|) { + $name .= ".#"; + $oid .= ".#"; + } + $self->{-oid2type}->{$oid} = $type; + $self->{-oid2name}->{$oid} = $name; + $self->{-name2oid}->{$name} = $oid; + } + return $self; +} + +sub destroy ($) { + my ($self) = @_; + return; +} + +sub DESTROY ($) { + my ($self) = @_; + $self->destroy; + return; +} + +sub oid2name ($$) { + my ($self, $oid) = @_; + return $self->{-oid2name}->{$oid}; +} + +sub name2oid ($$) { + my ($self, $name) = @_; + return $self->{-name2oid}->{$name}; +} + +sub oid2type ($$) { + my ($self, $oid) = @_; + return $self->{-oid2type}->{$oid}; +} + +sub oids ($;@) { + my ($self, @patterns) = @_; + my $oids = []; + foreach my $pattern (@patterns) { + $pattern = "*" if (not defined($pattern)); + $pattern =~ s/\./\\./sg; + $pattern =~ s/\*/.*/sg; + foreach my $name (keys(%{$self->{-name2oid}})) { + if ($name =~ m|^${pattern}$|si) { + push(@{$oids}, $self->{-name2oid}->{$name}); + } + } + } + return $oids; +} + +## _________________________________________________________________________ +## +## HELPER CLASS: PROBE (abstract only) +## _________________________________________________________________________ +## + +package My::Probe; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(new destroy DESTROY oids probe); + +sub new ($$) { + my ($proto, $ctx) = @_; + my $class = ref $proto || $proto; + my $self = {}; + bless ($self, $class); + $self->{-ctx} = $ctx; + return $self; +} + +sub destroy ($) { + my ($self) = @_; + return; +} + +sub DESTROY ($) { + my ($self) = @_; + $self->destroy; + return; +} + +sub oids ($) { + my ($self) = @_; + return []; +} + +sub probe ($$$) { + my ($self, $ctx, $oid) = @_; + return {}; +} + +## _________________________________________________________________________ +## +## HELPER CLASS: Encoding +## _________________________________________________________________________ +## + +package My::Enc; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(new destroy DESTROY dat_encode dat_decode octet_encode octet_decode); + +sub new ($$) { + my ($proto) = @_; + my $class = ref $proto || $proto; + my $self = {}; + bless ($self, $class); + return $self; +} + +sub destroy ($) { + my ($self) = @_; + return; +} + +sub DESTROY ($) { + my ($self) = @_; + $self->destroy; + return; +} + +# ASN.1 DateAndTime encoding/decoding +sub dat_encode ($$) { + my ($self, $asc) = @_; + my ($y, $m, $d, $H, $M, $S) = (0, 0, 0, 0, 0, 0); + if ($asc =~ m|^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$|) { + ($y, $m, $d, $H, $M, $S) = ($1, $2, $3, $4, $5, $6); + } + return pack("nCCCCCCCCC", $y, $m, $d, $H, $M, $S, 0, 0, 0, 0); +} +sub dat_decode ($$) { + my ($self, $bin) = @_; + my ($y, $m, $d, $H, $M, $S) = unpack("nCCCCCCCCC", $bin); + return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $y, $m, $d, $H, $M, $S); +} + +# snmpd(8) pass_persist protocol 'octet' encoding/decoding +sub octet_encode ($$) { + my ($self, $bin) = @_; + my $asc = ''; + $bin =~ s|(.)|$asc .= sprintf("%02x ", ord($1)), ''|sge; + return $asc; +} +sub octet_decode ($$) { + my ($self, $asc) = @_; + my $bin = ''; + $asc =~ s|([0-9a-zA-Z]{2})\s*|$bin .= chr(hex($1)), ''|sge; + return $bin; +} + +## _________________________________________________________________________ +## +## MAIN PROCEDURE +## _________________________________________________________________________ +## + +package main; + +# find path to ourself +my $myroot = "$FindBin::Bin"; + +# parameters (defaults) +my $opt = { + 'config' => "$myroot/snmpdx.cfg", + 'version' => 0, + 'help' => 0, + 'tmpdir' => ($ENV{TMPDIR} || $ENV{TEMPDIR} || "/tmp"), + 'get' => 0, + 'next' => 0, + 'set' => 0, + 'bindir' => "/cw/bin", + 'probedir' => "$myroot/snmpdx.d", + 'probename' => "*", + 'mibdir' => "$myroot/snmpdx.mib", + 'mibname' => "snmpdx", + 'logfile' => "$myroot/snmpdx.log", + 'loglevel' => 9, + 'strict' => 0, +}; + +# command line parsing +my %options = ( + 'c|config=s' => \$opt->{'config'}, + 'V|version' => \$opt->{'version'}, + 'h|help' => \$opt->{'help'}, + 't|tmpdir=s' => \$opt->{'tmpdir'}, + 'g|get' => \$opt->{'get'}, + 'n|next' => \$opt->{'next'}, + 's|set' => \$opt->{'set'}, + 'b|bindir=s' => \$opt->{'bindir'}, + 'P|probedir=s' => \$opt->{'probedir'}, + 'p|probename=s' => \$opt->{'probename'}, + 'M|mibdir=s' => \$opt->{'mibdir'}, + 'm|mibname=s' => \$opt->{'mibname'}, + 'l|logfile=s' => \$opt->{'logfile'}, + 'L|loglevel=i' => \$opt->{'loglevel'}, + 'S|strict' => \$opt->{'strict'}, +); +Getopt::Long::Configure("bundling"); +my $result = GetOptions(%options) || die "option parsing failed"; +if ($opt->{'help'}) { + print "Usage: $prg->{'name'} [options] [SPECFILE ...]\n" . + "Available options:\n" . + " -c,--config=PATH read command line options from configuration fil\n" . + " -V,--version print program version\n" . + " -h,--help print out this usage page\n" . + " -t,--tmpdir=PATH filesystem path to temporary directory\n" . + " -g,--get get value of this MIB OID\n" . + " -n,--next get value of next MIB OID\n" . + " -s,--set set value of next MIB OID (NOT IMPLEMENTED)\n" . + " -b,--bindir=PATH path to the net-snmp binaries\n" . + " -P,--probedir=PATH path to probe directory\n" . + " -p,--probename=NAME the pattern for probes to load\n" . + " -M,--mibdir=PATH path to MIB directory\n" . + " -m,--mibname=MIB the name of the MIB to act under\n" . + " -l,--logfile=PATH path to daemon logfile\n" . + " -L,--loglevel=NUM logging level (0...9)\n" . + " -S,--strict strict processing of unknown values\n"; + exit(0); +} +if ($opt->{'version'}) { + print "$prg->{'name'} $prg->{'version'} ($prg->{'date'})\n"; + exit(0); +} + +# support external configuration file +if (-f $opt->{'config'}) { + my $cfg = new IO::File "<$opt->{'config'}"; + my $line; + while (defined($line = $cfg->getline())) { + $line =~ s|\r?\n$||s; + next if ($line =~ m/^\s*(#.*)?$/s); + my ($option, $value) = ($line =~ m|^\s*(\S+)\s+(.+?)\s*$|s); + die "invalid configuration line \"$line\"" + if (not defined($option) or not defined($value)); + my ($var) = map { $options{$_} } + grep { $_ =~ m/^.\|\Q$option\E(=[si])?$/s } + keys(%options); + die "invalid configuration option \"$option\"" + if (not defined($var)); + ${$var} = $value; + } + $cfg->close; +} + +# create daemon run-time context +my $ctx = {}; +$ctx->{-prg} = $prg; +$ctx->{-opt} = $opt; +$ctx->{-log} = new My::Log ($opt->{'loglevel'}, $opt->{'logfile'}); +$ctx->{-cache} = new My::Cache; +$ctx->{-sys} = new My::System ($ctx->{-log}, $ctx->{-cache}); +$ctx->{-platform} = new My::Platform; +$ctx->{-mib} = new My::MIB ($opt->{'bindir'}, $opt->{'mibdir'}, $opt->{'mibname'}); +$ctx->{-enc} = new My::Enc; + +# startup information +$ctx->{-log}->printf(1, "startup %s %s (%s) on %s", + $prg->{'name'}, $prg->{'version'}, $prg->{'date'}, + $ctx->{-platform}->id()); + +# exception handling support +$SIG{__DIE__} = sub { + my ($err) = @_; + $err =~ s|\r?\n$||s; + $ctx->{-log}->printf(1, "ERROR: $err ". ($! ? "($!)" : "")); + undef $ctx; + exit(1); +}; +$SIG{__WARN__} = sub { + my ($err) = @_; + $err =~ s|\r?\n$||s; + $ctx->{-log}->printf(1, "WARNING: $err"); + return; +}; + +# PROTOCOL MIB MIB TYPE net-snmp API CONVERT TYPE +# ---------- ---------- ------------------- -------------- ------- ------ +# string SNMPv2-TC DisplayString ASN_OCTET_STR - char * +# integer ASN.1 Integer32 ASN_INTEGER strtol long +# unsigned SNMPv2-SMI Unsigned32 ASN_UNSIGNED strtoul long +# counter SNMPv2-SMI Counter32 ASN_COUNTER strtoul long +# octet ASN.1 OCTET STRING ASN_OCTET_STR asc2bin char * +# opaque SNMPv2-SMI Opaque ASN_OPAQUE asc2bin char * +# gauge SNMPv2-SMI Gauge32 ASN_GAUGE strtoul long +# objectid ASN.1 OBJECT IDENTIFIER ASN_OBJECT_ID - char * +# timetick SNMPv2-SMI TimeTicks ASN_TIMETICKS strtoul long +# ipaddress SNMPv2-SMI IpAddress ASN_IPADDRESS htonl long +# octet SNMPv2-TC DateAndTime ASN_OCTET_STR asc2bin char * + +# load probes and determine their handled OIDs +my $oidtable = []; +my $oidhandler = {}; +my $oidprobe = {}; +my $oidtype = { + 'DisplayString' => [ 'string', 'N.A.' ], + 'Integer32' => [ 'integer', '-1' ], + 'Unsigned32' => [ 'unsigned', '0' ], + 'Counter32' => [ 'counter', '-1' ], + 'OCTET STRING' => [ 'octet', 'N.A.' ], + 'Opaque' => [ 'opaque', 'N.A.' ], + 'Gauge32' => [ 'gauge', '-1' ], + 'OBJECT IDENTIFIER' => [ 'objectid', '.0' ], + 'TimeTicks' => [ 'timetick', '0' ], + 'IpAddress' => [ 'ipaddress', '0.0.0.0' ], + 'DateAndTime' => [ 'octet', $ctx->{-enc}->dat_encode("1970-01-01 01:02:03") ], +}; +$ctx->{-log}->printf(1, "MIB id: %s", $opt->{'mibname'}); +foreach my $probefile (glob($opt->{'probedir'}."/".$opt->{'probename'}.".pm")) { + my $probe = $probefile; + $probe =~ s|^.*/([^/]+)\.pm$|$1|sg; + my $p; + eval { + local $SIG{__DIE__} = 'DEFAULT'; + eval "require \"$probefile\";"; + die if ($@); + eval "\$p = new My::Probe::$probe (\$ctx);"; + die if ($@); + }; + if ($@) { + die "invalid probe \"$probe\": $@"; + } + $ctx->{-log}->printf(2, "Probe: \"%s\"", $probe); + foreach my $oid (sort(@{$p->oids()})) { + push(@{$oidtable}, $oid); + $oidhandler->{$oid} = $p; + $oidprobe->{$oid} = $probe; + $ctx->{-log}->printf(1, "MIB OID: %s [%s] ::= %s (%s)", + $oid, $ctx->{-mib}->oid2name($oid), + $ctx->{-mib}->oid2type($oid), + $oidtype->{$ctx->{-mib}->oid2type($oid)}->[0]); + } +} +@{$oidtable} = sort(@{$oidtable}); + +# determine run-time mode +my $mode = "pass_persist"; +if ($opt->{'get'} or $opt->{'next'} or $opt->{'set'}) { + $mode = "pass"; +} + +# connect I/O channels +my $stdin = new IO::Handle;; +$stdin->fdopen(fileno(STDIN), "r"); +$stdin->blocking(1); +my $stdout = new IO::Handle;; +$stdout->fdopen(fileno(STDOUT), "w"); +$stdout->autoflush(1); +open(STDERR, ">/dev/null"); + +# processing loop +while (1) { + # determine command + my $cmd; + if ($mode eq "pass_persist") { + # read next command from snmpd + $cmd = $stdin->getline; + if (not defined($cmd)) { + $ctx->{-log}->printf(4, "IO: EOF"); + last; + } + $cmd =~ s|\n?$||s; + $ctx->{-log}->printf(4, "IO: recv: << \"%s\\n\"", $cmd); + } + else { + $cmd = ($opt->{'get'} ? 'get' : + ($opt->{'next'} ? 'getnext' : + ($opt->{'set'} ? 'set' : 'unknown'))); + $ctx->{-log}->printf(4, "CMD: \"%s\\n\"", $cmd); + } + + # act upon command + if ($cmd =~ m/^PING$/i) { + # + # the PING/PONG protocol part + # + $ctx->{-log}->printf(4, "IO: send: >> \"PONG\\n\""); + $stdout->printf("PONG\n"); + } + + elsif ($cmd =~ m/^GET$/i or $cmd =~ m/^GETNEXT$/i) { + # + # the GET/GETNEXT protocol part + # + my $error = 1; + + # read requested OID + my $oid_request; + if ($mode eq "pass") { + $oid_request = $ARGV[0]; + } + else { + $oid_request = $stdin->getline; + if (not defined($oid_request)) { + $ctx->{-log}->printf(1, "ERROR: EOF instead of OID"); + goto ERROR; + } + $oid_request =~ s|\n?$||s; + } + $ctx->{-log}->printf(4, "IO: recv: << \"%s\\n\"", $oid_request); + if ($oid_request !~ m/^(\.\d+)+$/) { + $ctx->{-log}->printf(1, "ERROR: invalid query OID \"%s\"", $oid_request); + goto ERROR; + } + + # re-entry point for OID processing + my $oid_search = $oid_request; + RETRY: + + # determine acted/handled OID + my $oid_action = undef; + my $oid_handled = undef; + my $oid_handler = undef; + my $oid_next = undef; + if ($cmd =~ m/^GET$/i) { + # search for explicitly handled OID + for (my $i = 0; defined($oidtable->[$i]); $i++) { + if ($oidtable->[$i] eq $oid_search) { + $oid_action = $oidtable->[$i]; + $oid_handled = $oidtable->[$i]; + last; + } + } + # search for implicitly handled OID (sequence element) + if (not defined($oid_handled)) { + my $oid_parent = $oid_search; + $oid_parent =~ s|(\.\d+)$||s; + for (my $i = 0; defined($oidtable->[$i]); $i++) { + if ($oidtable->[$i] =~ m|^\Q$oid_parent\E\.#$|) { + $oid_action = $oid_search; + $oid_handled = $oidtable->[$i]; + last; + } + } + } + } + elsif ($cmd =~ m/^GETNEXT$/i) { + # search for explicitly handled OID + for (my $i = 0; defined($oidtable->[$i]); $i++) { + if ($oidtable->[$i] =~ m|^\Q$oid_search\E(\.\d+)+$|) { + # OID starts with requested OID prefix, so use this OID + $oid_action = $oidtable->[$i]; + $oid_handled = $oidtable->[$i]; + $oid_next = $oidtable->[$i+1]; + last; + } + elsif ($oidtable->[$i] eq $oid_search) { + # OID is the requested OID exactly, so use next OID + if (defined($oidtable->[$i+1])) { + $oid_action = $oidtable->[$i+1]; + $oid_action =~ s|\.#$|.1|s; + $oid_handled = $oidtable->[$i+1]; + $oid_next = $oidtable->[$i+2]; + last; + } + else { + goto ERROR; # end-of-MIB + } + } + } + # search for implicitly handled OID (sequence element) + if (not defined($oid_handled)) { + my $oid_parent = $oid_search; + $oid_parent =~ s|(\.\d+)$||s; + for (my $i = 0; defined($oidtable->[$i]); $i++) { + # search for implicitly handled OID (sequence element) + if ($oidtable->[$i] =~ m|^\Q$oid_search\E(\.\d+)*\.#$|) { + # OID start with requested OID prefix, so use first OID in sequence + $oid_action = $oidtable->[$i]; + $oid_action =~ s|\.#$|.1|s; + $oid_handled = $oidtable->[$i]; + $oid_next = $oidtable->[$i+1]; + last; + } + elsif ($oidtable->[$i] =~ m|^\Q$oid_parent\E\.#$|) { + # OID is the requested OID of a sequence exactly, so use next OID in sequence + $oid_action = $oid_search; + $oid_action =~ s|\.(\d+)$|".".($1+1)|se; + $oid_handled = $oidtable->[$i]; + $oid_next = $oidtable->[$i+1]; + last; + } + } + } + } + if (defined($oid_handled)) { + $oid_handler = $oidhandler->{$oid_handled}; + } + else { + $ctx->{-log}->printf(1, "ERROR: no handler found for OID \"%s\"", $oid_request); + goto ERROR; # end-of-MIB + } + + # prepare probe request object + my $obj = { + -oid => $oid_action, + -name => $ctx->{-mib}->oid2name($oid_handled), + -type => $ctx->{-mib}->oid2type($oid_handled), + -value => undef + }; + + # provide mixed name/OID for sequence index + if ($obj->{-name} =~ m|\.#$|) { + my ($idx) = ($obj->{-oid} =~ m|\.(\d+)$|); + $obj->{-name} =~ s|\.#$|.$idx|; + } + + # probe value of OID + $ctx->{-log}->printf(2, "probing \"%s\" for OID \"%s\"", $oidprobe->{$oid_handled}, $oid_action); + $oid_handler->probe($obj); + + # handle special "unknown OID value" situation + if (not defined($obj->{-value})) { + $ctx->{-log}->printf(1, "WARNING: handler was unable to provide probe value for OID \"%s\"", $oid_request); + if ($opt->{'strict'}) { + # strict processing: return ERROR on unknown value + # for GET request and skip unknown OIDs on GETNEXT. + if ($cmd =~ m/^GET$/i) { + goto ERROR; # no-value + } + else { # GETNEXT + if (defined($oid_next)) { + $oid_search = $oid_next; + $oid_search =~ s|\.#$||s; + goto RETRY; + } + else { + goto ERROR; # no-value + } + } + } + else { + # non-strict processing: return a reasonable default value + if ($oid_handled =~ m|\.#$|) { + if ($oid_action =~ m|\.1$|) { + $obj->{-value} = $oidtype->{$obj->{-type}}->[1]; + } + else { + if (defined($oid_next)) { + $oid_search = $oid_next; + $oid_search =~ s|\.#$||s; + goto RETRY; + } + else { + goto ERROR; # end-of-MIB + } + } + } + else { + $obj->{-value} = $oidtype->{$obj->{-type}}->[1]; + } + } + } + + # optionally encode value to conform to snmpd(8) protocol + if ($oidtype->{$obj->{-type}}->[0] =~ m/^(octet|opaque)$/) { + $obj->{-value} = $ctx->{-enc}->octet_encode($obj->{-value}); + } + + # return result + $ctx->{-log}->printf(1, "QUERY: %s [%s] ::= %s \"%s\"", + $obj->{-name}, $obj->{-oid}, $obj->{-type}, $obj->{-value}); + $stdout->printf("%s\n%s\n%s\n", + $obj->{-oid}, $oidtype->{$obj->{-type}}->[0], $obj->{-value}); + $ctx->{-log}->printf(4, "IO: send: >> \"%s\\n%s\\n%s\\n\"", + $obj->{-oid}, $oidtype->{$obj->{-type}}->[0], $obj->{-value}); + + # end-of-MIB or no-value handling + $error = 0; + if ($error) { + ERROR: + if ($mode eq "pass_persist") { + $ctx->{-log}->printf(4, "IO: send: >> \"NONE\\n\""); + $stdout->printf("NONE\n"); + } + } + } + elsif ($cmd =~ m/^SET$/i) { + # + # the SET protocol part + # + if ($mode eq "pass_persist") { + # read requested OID/TYPE/VALUE (and ignore) + my $oid = $stdin->getline; + my $oid_type = $stdin->getline; + my $oid_value = $stdin->getline; + $ctx->{-log}->printf(4, "IO: send: >> \"NONE\\n\""); + $stdout->printf("NONE\n"); + } + else { + $ctx->{-log}->printf(4, "IO: send: >> \"not-writable\\n\""); + $stdout->printf("not-writable\n"); + } + } + else { + # for anything else (not expected) just send at least + # "NONE" in case snmpd(8) expects something. + $ctx->{-log}->printf(4, "IO: send: >> \"NONE\\n\""); + $stdout->printf("NONE\n"); + } + + # stop processing on "pass" mode + last if ($mode eq "pass"); +} + +# shutdown gracefully +$ctx->{-log}->printf(1, "shutdown"); +undef $ctx; +exit(0); +