diff options
Diffstat (limited to 'support/dktools/prmonsnmp.ctr')
-rw-r--r-- | support/dktools/prmonsnmp.ctr | 1942 |
1 files changed, 0 insertions, 1942 deletions
diff --git a/support/dktools/prmonsnmp.ctr b/support/dktools/prmonsnmp.ctr deleted file mode 100644 index bdf92f2b9a..0000000000 --- a/support/dktools/prmonsnmp.ctr +++ /dev/null @@ -1,1942 +0,0 @@ -%% options - -copyright owner = Dirk Krause -copyright year = 2016-xxxx -SPDX-License-Identifier: BSD-3-Clause - - - -%% module - -#include "dk4conf.h" -#include "dk4types.h" - - -#if DK4_HAVE_STDLIB_H -#ifndef STDLIB_H_INCLUDED -#include <stdlib.h> -#define STDLIB_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_UNISTD_H -#ifndef UNISTD_H_INCLUDED -#include <unistd.h> -#define UNISTD_H_INCLUDED 1 -#endif -#endif - -#if DK4_HAVE_PROCESS_H -#ifndef PROCESS_H_INCLUDED -#include <process.h> -#define PROCESS_H_INCLUDED 1 -#endif -#endif - - - -/** Constant text fragments used by the program, not localized. -*/ -static const char * const prmonsnmp_kw[] = { -$!string-table -# -# 0 Newline -# -\n -# -# 1 Space -# - -# -# 2 Program name -# -prmonsnmp -# -# 3 Default SNMP community name -# -public -# -# 4 ... 9 Device status -# -unreachable -unknown -running -warning -testing -down -# -# 10 ... 15 Printer status -# -unreachable -other -unknown -idle -printing -warmup -# -# 16 Default condition set -# -XXXX-XXXX-XXXX-XXXX -# -# 17 Separator -# - / -# -# 18 3 spaces -# - -# -# 19 ... 33 Error conditions -# -W: Low paper.\n -E: No paper!\n -W: Low toner.\n -E: No toner!\n -E: Door open!\n -E: Jammed!\n -E: Offline!\n -W: Service requested.\n -E: Input tray missing!\n -E: Output tray missing!\n -E: Marker supply missing!\n -W: Output near full.\n -E: Output full!\n -W: Input tray empty.\n -W: Overdue preventive maintenance.\n -# -# 34 Comment marker before timestamp -# -\# -# -# 35 Error: Unreachable -# -UNREACHABLE!\n -# -# 36 ERROR: Failed to create request PDU -# -: ERROR: Failed to create SNMP request PDU!\n -# -# 37 Warning: SNMP version configured multiple times -# -: Warning: SNMP version configured multiple times!\n -# -# 38 39 ERROR: Illegal SNMP version -# -: ERROR: Illegal SNMP version: " -"!\n -# -# 40 -# -: Warning: SNMP community configured multiple times!\n -# -# 41 -# -: Warning: Host name configured multiple times!\n -# -# 42 -# -: ERROR: Missing host name!\n -# -# 43 -# -: ERROR: Failed to open SNMP session!\n -# -# 44 -# -: ERROR: Failed to restore signal handlers!\n -# -# 45 -# -: ERROR: Failed to set up signal handlers!\n -$!end -}; - - - -#if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) - -#include <net-snmp/net-snmp-config.h> -#include <net-snmp/net-snmp-includes.h> -#include <net-snmp/utilities.h> -#include <net-snmp/library/snmp_logging.h> - -#include "dk4mem.h" -#include "dk4str8.h" -#include "dk4mai8dus.h" -#include "dk4time.h" -#include "dk4time08.h" -#include "dk4sock.h" -#include "dk4maasz.h" -#include "dk4mai8dii.h" -#include "dk4mai8ddu.h" -#include "dk4mao8d.h" -#include "dk4mao8h.h" -#include "dk4enc.h" -#include "dk4loc.h" -#include "dk4vers.h" -#include "dk4unused.h" - - - -$!trace-include - - - -/** Status text from SNMP response. -*/ -static char statext[1024]; - - - -/** Previous status text. -*/ -static char ostatext[sizeof(statext)]; - - - -/** Long option names. -*/ -static const char * const long_options[] = { -$!string-table -help -version -license -$!end -}; - - - -/** OID for device status. -*/ -static const oid prmonsnmp_oid_ds[] = { - (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, - (oid)25, (oid)3, (oid)2, (oid)1, (oid)5, (oid)1 -}; - -/** Size of device status OID (number of elements). -*/ -static size_t const pjsnmp_sz_oid_ds = sizeof(prmonsnmp_oid_ds)/sizeof(oid); - - -/** OID for printer status. -*/ -static const oid prmonsnmp_oid_ps[] = { - (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, - (oid)25, (oid)3, (oid)5, (oid)1, (oid)1, (oid)1 -}; - -/** Size of printer status OID (number of elements). -*/ -static size_t const pjsnmp_sz_oid_ps = sizeof(prmonsnmp_oid_ps)/sizeof(oid); - - -/** OID for pagecount value. -*/ -static const oid prmonsnmp_oid_pc[] = { - (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, - (oid)43, (oid)10, (oid)2, (oid)1, (oid)4, (oid)1, (oid)1 -}; - -/** Size of page counter OID (number of elements). -*/ -static size_t const pjsnmp_sz_oid_pc = sizeof(prmonsnmp_oid_pc)/sizeof(oid); - - -/** Printer error OID. -*/ -static const oid prmonsnmp_oid_pe[] = { - (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, - (oid)25, (oid)3, (oid)5, (oid)1, (oid)2, (oid)1 -}; - -/** Size of printer error OID (number of elements). -*/ -static size_t const pjsnmp_sz_oid_pe = sizeof(prmonsnmp_oid_pe)/sizeof(oid); - -/** Status text OID. -*/ -static const oid prmonsnmp_oid_st[] = { - (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, - (oid)43, (oid)16, (oid)5, (oid)1, (oid)2, (oid)1, (oid)1 -}; - -/** Size of printer error OID (number of elements). -*/ -static size_t const pjsnmp_sz_oid_st = sizeof(prmonsnmp_oid_st)/sizeof(oid); - - -/** Help text. -*/ -static const char * const help_text[] = { -$!text - -Monitor printers - -prmonsnmp [-v version] [-c community] [-t seconds] [-n] host - -Options: --v version SNMP version: 1, 2c, 2 (same as 2c), 3, default: 1. --c community SNMP community name, default: public. --t seconds Duration for monitoring, default: 0 (endless). --n No 250 ms grace period between requests. - ---help Show this help text. ---version Show version number. ---license Show license information. - -$!end -}; - - - -/** License conditions text. -*/ -static const char * const license_text[] = { -$!text preprocessor - -This software uses code from the following projects, either directly or as -a library: - -dktools Dirk Krause's tools and libraries. - See http://sourceforge.net/p/dktools/wiki/Home/ - for more information. -#if DK4_HAVE_LIBNETSNMP -Net-SNMP SNMP access library. - See http://net-snmp.sourceforge.net/ for more information. -#endif -#if DK4_HAVE_ZLIB_H - -zlib Data compression library. - See http://www.zlib.net/ for more information. -#endif -#if DK4_HAVE_OPENSSL_MD5_H && DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_OPENSSL_RIPEMD_H - -OpenSSL Cryptographic toolkit, used to build file checksums here. - See http://www.openssl.org/ for more information. - -This product includes software developed by the OpenSSL Project for use in -the OpenSSL Toolkit (http://www.openssl.org/). -This product includes cryptographic software written by -Eric Young (eay@cryptsoft.com). -This product includes software written by Tim Hudson (tjh@cryptsoft.com). -#endif - -All the licenses below apply to the program. -Licenses for used libraries are shown as found on my Scientific Linux 6.x -computer in the /usr/share/doc directory on 2015-04-01. Check the project -homepages of the used libraries for additional information and/or updated -license terms. - - -DK tools and libraries license -============================== -Copyright (c) 2015-2016, Dirk Krause -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS 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 COPYRIGHT HOLDER OR 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. -#if DK4_HAVE_LIBNETSNMP - - -Net-SNMP license -================ -Various copyrights apply to this package, listed in various separate parts -below. Please make sure that you read all the parts. Up until 2001, -the project was based at UC Davis, and the first part covers all code -written during this time. From 2001 onwards, the project has been -based at SourceForge, and Networks Associates Technology, Inc hold the -copyright on behalf of the wider Net-SNMP community, covering all -derivative work done since then. An additional copyright section has -been added as Part 3 below also under a BSD license for the work -contributed by Cambridge Broadband Ltd. to the project since 2001. -An additional copyright section has been added as Part 4 below also -under a BSD license for the work contributed by Sun Microsystems, Inc. -to the project since 2003. - -Code has been contributed to this project by many people over -the years it has been in development, and a full list of contributors -can be found in the README file under the THANKS section. - - ----- Part 1: CMU/UCD copyright notice: (BSD like) ----- - - - Copyright 1989, 1991, 1992 by Carnegie Mellon University - - Derivative Work - 1996, 1998-2000 -Copyright 1996, 1998-2000 The Regents of the University of California - - All Rights Reserved - -Permission to use, copy, modify and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appears in all copies and -that both that copyright notice and this permission notice appear in -supporting documentation, and that the name of CMU and The Regents of -the University of California not be used in advertising or publicity -pertaining to distribution of the software without specific written -permission. - -CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA DISCLAIM ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CMU OR -THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING -FROM THE LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF -CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ----- Part 2: Networks Associates Technology, Inc copyright notice (BSD) ----- - -Copyright (c) 2001-2003, Networks Associates Technology, Inc -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of the Networks Associates Technology, Inc nor the - names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS -IS'' AND ANY EXPRESS 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 COPYRIGHT HOLDERS OR -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. - ----- Part 3: Cambridge Broadband Ltd. copyright notice (BSD) ----- - -Portions of this code are copyright (c) 2001-2003, Cambridge Broadband Ltd. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* The name of Cambridge Broadband Ltd. may not be used to endorse or - promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY -EXPRESS 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 COPYRIGHT HOLDER 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. - - ----- Part 4: Sun Microsystems, Inc. copyright notice (BSD) ----- - -Copyright © 2003 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -California 95054, U.S.A. All rights reserved. - -Use is subject to license terms below. - -This distribution may include materials developed by third parties. - -Sun, Sun Microsystems, the Sun logo and Solaris are trademarks or registered -trademarks of Sun Microsystems, Inc. in the U.S. and other countries. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of the Sun Microsystems, Inc. nor the - names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS -IS'' AND ANY EXPRESS 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 COPYRIGHT HOLDERS OR -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. - ----- Part 5: Sparta, Inc copyright notice (BSD) ----- - -Copyright (c) 2003-2006, Sparta, Inc -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of Sparta, Inc nor the names of its contributors may - be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS -IS'' AND ANY EXPRESS 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 COPYRIGHT HOLDERS OR -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. - ----- Part 6: Cisco/BUPTNIC copyright notice (BSD) ----- - -Copyright (c) 2004, Cisco, Inc and Information Network -Center of Beijing University of Posts and Telecommunications. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of Cisco, Inc, Beijing University of Posts and - Telecommunications, nor the names of their contributors may - be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS -IS'' AND ANY EXPRESS 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 COPYRIGHT HOLDERS OR -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. - ----- Part 7: Fabasoft R&D Software GmbH & Co KG copyright notice (BSD) ----- - -Copyright (c) Fabasoft R&D Software GmbH & Co KG, 2003 -oss@fabasoft.com -Author: Bernhard Penz <bernhard.penz@fabasoft.com> - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* The name of Fabasoft R&D Software GmbH & Co KG or any of its subsidiaries, - brand or product names may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY -EXPRESS 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 COPYRIGHT HOLDER 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. -#endif -#if DK4_HAVE_ZLIB_H - - -Zlib license -============ -(C) 1995-2004 Jean-loup Gailly and Mark Adler - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - -Jean-loup Gailly Mark Adler -jloup@gzip.org madler@alumni.caltech.edu -#endif -#if DK4_HAVE_BZLIB_H - - -Bzip2 and libbzip2 library license -================================== -This program, "bzip2", the associated library "libbzip2", and all -documentation, are copyright (C) 1996-2007 Julian R Seward. All -rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - -4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -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 AUTHOR 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. - -Julian Seward, jseward@bzip.org -bzip2/libbzip2 version 1.0.5 of 10 December 2007 -#endif -#if DK4_HAVE_OPENSSL_MD5_H && DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_OPENSSL_RIPEMD_H - - -OpenSSL license -=============== - -LICENSE ISSUES --------------- - -The OpenSSL toolkit stays under a dual license, i.e. both the conditions of -the OpenSSL License and the original SSLeay license apply to the toolkit. -See below for the actual license texts. Actually both licenses are BSD-style -Open Source licenses. In case of any license issues related to OpenSSL -please contact openssl-core@openssl.org. - -OpenSSL License ---------------- - -Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -3. All advertising materials mentioning features or use of this - software must display the following acknowledgment: - "This product includes software developed by the OpenSSL Project - for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - -4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - endorse or promote products derived from this software without - prior written permission. For written permission, please contact - openssl-core@openssl.org. - -5. Products derived from this software may not be called "OpenSSL" - nor may "OpenSSL" appear in their names without prior written - permission of the OpenSSL Project. - -6. Redistributions of any form whatsoever must retain the following - acknowledgment: - "This product includes software developed by the OpenSSL Project - for use in the OpenSSL Toolkit (http://www.openssl.org/)" - -THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``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 OpenSSL PROJECT OR -ITS 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. - -This product includes cryptographic software written by Eric Young -(eay@cryptsoft.com). This product includes software written by Tim -Hudson (tjh@cryptsoft.com). - - -Original SSLeay License ------------------------ - -Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) -All rights reserved. - -This package is an SSL implementation written -by Eric Young (eay@cryptsoft.com). -The implementation was written so as to conform with Netscapes SSL. - -This library is free for commercial and non-commercial use as long as -the following conditions are aheared to. The following conditions -apply to all code found in this distribution, be it the RC4, RSA, -lhash, DES, etc., code; not just the SSL code. The SSL documentation -included with this distribution is covered by the same copyright terms -except that the holder is Tim Hudson (tjh@cryptsoft.com). - -Copyright remains Eric Young's, and as such any Copyright notices in -the code are not to be removed. -If this package is used in a product, Eric Young should be given attribution -as the author of the parts of the library used. -This can be in the form of a textual message at program startup or -in documentation (online or textual) provided with the package. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. All advertising materials mentioning features or use of this software - must display the following acknowledgement: - "This product includes cryptographic software written by - Eric Young (eay@cryptsoft.com)" - The word 'cryptographic' can be left out if the rouines from the library - being used are not cryptographic related :-). -4. If you include any Windows specific code (or a derivative thereof) from - the apps directory (application code) you must include an acknowledgement: - "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - -THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND -ANY EXPRESS 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 AUTHOR OR 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. - -The licence and distribution terms for any publically available version or -derivative of this code cannot be changed. i.e. this code cannot simply be -copied and put under another distribution licence -[including the GNU Public Licence.] - -#endif - -$!end -}; - - - -/** Version information. -*/ -static const char version_text[] = { DKT_VERSION_C8 }; - - - -/** Accepted SNMP version names. -*/ -static const char * const snmp_version_names[] = { -$!string-table -1 -2 -2c -3 -$!end -}; - - -/** Host name (or IP address) of printer. -*/ -static char *host_name = NULL; - -/** SNMP community name. -*/ -static char *snmp_comm = NULL; - - -/** SNMP session. -*/ -static struct snmp_session *snmp_sess = NULL; - - -/** Timeout in seconds. -*/ -static dk4_um_t timeout = (dk4_um_t)0UL; - - -/** Previous log timestamp. -*/ -static dk4_time_t previous_log = (dk4_time_t)0UL; - - -/** SNMP version. -*/ -static long snmp_vers = SNMP_VERSION_1; - -/** Flag: Had a previous log. -*/ -static int have_time = 0; - - -/** Flag: Behave gracefully, max 4 SNMP requests per second. -*/ -static int grace = 1; - - -#ifdef SIGPIPE -/** Indicator: SIGPIPE signal received. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t sig_had_pipe = 0; -#endif - - -/** Indicator: SIGINT signal received. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t sig_had_int = 0; - - -/** Indicator: SIGTERM signal received. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t sig_had_term = 0; - -static int encoding = DK4_ENCODING_PLAIN; -#endif - -/** Exit status code. -*/ -static int exval = EXIT_FAILURE; - - - -#if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) - - - -/** Help (1), version (2), license (4). -*/ -static int hvl = 0; - - - -/** Pass volatile pointer. - @param ptr Pointer to pass through. - @return The original pointer. -*/ -static -DK4_VOLATILE -dk4_sig_atomic_t * -sig_pass_pointer(DK4_VOLATILE dk4_sig_atomic_t *ptr) -{ - return ptr; -} - - -#ifdef SIGPIPE -/** Handler for SIGPIPE signal. - @param signo Signal number (always SIGPIPE, ignored). -*/ -static -void -sig_handler_pipe(int DK4_ARG_UNUSED(signo) ) -{ - DK4_UNUSED_ARG(signo) - *sig_pass_pointer(&sig_had_pipe) = 1; -} -#endif - - -/** Handler for SIGINT signal. - @param signo Signal number (always SIGINT, ignored). -*/ -static -void -sig_handler_int(int DK4_ARG_UNUSED(signo) ) -{ - DK4_UNUSED_ARG(signo) - *sig_pass_pointer(&sig_had_int) = 1; -} - - -/** Handler for SIGTERM signal. - @param signo Signal number (always SIGTERM, ignored). -*/ -static -void -sig_handler_term(int DK4_ARG_UNUSED(signo) ) -{ - DK4_UNUSED_ARG(signo) - *sig_pass_pointer(&sig_had_term) = 1; -} - - -/** Read value from volatile atomic type. - This function is necessary as some compilers mis-optimize - direct access to volatile variables (at least if you believe - one of the coding standards). - @param ap Pointer to volatile atomic variable. - @return Contents of the variable. -*/ -static -dk4_sig_atomic_t -sig_read_atomic(DK4_VOLATILE dk4_sig_atomic_t *ap) -{ - return (*ap); -} - - -/** Check whether we can continue or must abort due to signal. - @param dopipe Flag: Check for SIGPIPE too. - @return 1 if we can continue, 0 otherwise. -*/ -static -int -can_continue(int dopipe) -{ - int back = 1; - if (0 != sig_read_atomic(&sig_had_term)) { back = 0; } - if (0 != sig_read_atomic(&sig_had_int)) { back = 0; } -#ifdef SIGPIPE - if (0 != dopipe) { - if (0 != sig_read_atomic(&sig_had_pipe)) { back = 0; } - } -#endif - return back; -} - - - -/** Check two OIDs for equality. - @param pl Left OID. - @param szl Left OID size. - @param pr Right OID. - @param szr Right OID size. - @return 1 for equal OIDs, 0 otherwise. -*/ -static -int -oids_equal(const oid *pl, size_t szl, const oid *pr, size_t szr) -{ -#if VERSION_BEFORE_20160206 - size_t i; -#endif - int back = 0; - - if (szl == szr) { -#if VERSION_BEFORE_20160206 - back = 1; - for (i = 0; ((i < szl) && (1 == back)); i++) { - if (pl[i] != pr[i]) { - back = 0; - } - } -#else - if (0 == dk4mem_cmp(pl, pr, (szl * sizeof(oid)), NULL)) { - back = 1; - } -#endif - } - return back; -} - - -/** Find OID index. - @param oid Pointer to OID to check. - @param sz OID size. - @return 0 for hrDeviceStatus, 1 for hrPrinterStatus, - 2 for page counter, 3 for hrPrinterDetectedErrorState, - 4 for prtMarkerLifeCount, -1 otherwise. -*/ -static -int -oid_index(oid *p, size_t sz) -{ - int back = -1; - if (0 != oids_equal(p, sz, prmonsnmp_oid_ds, pjsnmp_sz_oid_ds)) { - back = 0; - } else { - if (0 != oids_equal(p, sz, prmonsnmp_oid_ps, pjsnmp_sz_oid_ps)) { - back = 1; - } else { - if (0 != oids_equal(p, sz, prmonsnmp_oid_pe, pjsnmp_sz_oid_pe)) { - back = 2; - } else { - if (0 != oids_equal(p, sz, prmonsnmp_oid_st, pjsnmp_sz_oid_st)) { - back = 3; - } else { - if (0 != oids_equal(p, sz, prmonsnmp_oid_pc, pjsnmp_sz_oid_pc)) { - back = 4; - } - } - } - } - } - return back; -} - - -/** Retrieve integer value from variable list. - @param iptr Address of variable to set. - @param var SNMP variable containing the value. - @return 1 on success, 0 on error. -*/ -static -int -get_int(int *iptr, struct variable_list *var) -{ - char bu[64]; /* Buffer for text data copy */ - const char *endptr = NULL; /* End of used data in numeric conversion */ - long l; /* Long value from SNMP response */ - int i; /* Text to number conversion result */ - int back = 0; - $? "+ get_int" - switch (var->type) { - case ASN_OCTET_STR : { $? ". from string" - if ((var->val_len > 0) && (var->val_len < sizeof(bu))) { - dk4mem_cpy(bu, (void *)((var->val).string), var->val_len, NULL); - bu[var->val_len] = '\0'; - if (0 != dk4ma_input_c8_dec_int(&i, bu, &endptr, 1, NULL)) { - *iptr = i; - back = 1; - } - } - } break; - case ASN_TIMETICKS : - case ASN_GAUGE : - case ASN_COUNTER : - case ASN_INTEGER : { $? ". from integer" - l = *((var->val).integer); - *iptr = (int)l; - back = 1; - } break; - } - $? "- get_int %d", back - return back; -} - - -/** Retrieve unsigned long value from variable list. - @param ulptr Address of variable to set. - @param var SNMP variable containing the value. - @return 1 on success, 0 on error. -*/ -static -int -get_ul(unsigned long *ulptr, struct variable_list *var) -{ - unsigned long ul = 0UL; /* Conversion result */ - long l; /* Long result from SNMP response */ - int back = 0; - $? "+ get_ul" - switch (var->type) { - case ASN_OCTET_STR : { $? ". from byte array" - if (0 < var->val_len) { - ul |= - ((((unsigned long)(((var->val).string)[0])) << 24) & 0xFF000000UL); - back = 1; - } - if (1 < var->val_len) { - ul |= - ((((unsigned long)(((var->val).string)[1])) << 16) & 0x00FF0000UL); - } - if (2 < var->val_len) { - ul |= - ((((unsigned long)(((var->val).string)[2])) << 8) & 0x0000FF00UL); - } - if (3 < var->val_len) { - ul |= - ((((unsigned long)(((var->val).string)[3])) ) & 0x000000FFUL); - } - if (0 != back) { - *ulptr = ul; - } - } break; - case ASN_TIMETICKS : - case ASN_GAUGE : - case ASN_COUNTER : - case ASN_INTEGER : { $? ". from integer" - l = *((var->val).integer); - if (0L <= l) { - *ulptr = (unsigned long)l; - back = 1; - } - } break; - } - $? "- get_ul %d", back - return back; -} - - - -/** Check whether a text buffer contains non-ASCII bytes. - @param ptr Buffer start address. - @param i Buffer size. - @return 1 if non-ASCII found, 0 for ASCII only. -*/ -static -int -contains_non_ascii(const unsigned char *ptr, size_t i) -{ - int back = 0; - while ((0 == back) && (0 < i)) { - if (0x7F < *(ptr++)) { - back = 1; - } - i--; - } - return back; -} - - - -/** Log current timestamp. -*/ -static -void -log_timestamp(void) -{ - char buf[64]; /* Text representation of timestamp */ - dk4_time_t current; /* Current time */ - int res; /* Conversion operation result */ - - dk4time_get(¤t); - if ((0 == have_time) || (current != previous_log)) { - res = dk4time_as_text_c8(buf, sizeof(buf), ¤t, NULL); - if (0 != res) { - if (0 != have_time) { - fputc('\n', stdout); - } - fputs(prmonsnmp_kw[34], stdout); - fputs(buf, stdout); - fputc('\n', stdout); - } - } else { - if (0 != have_time) { - fputc('\n', stdout); - } - } - have_time = 1; - previous_log = current; -} - - - -/** Show text, convert non-ASCII to question marks. - @param str String to show. - @param sz Text length. -*/ -static -void -show_as_ascii(const unsigned char *str, size_t sz) -{ - while (0 < sz--) { - if (0x7F < *str) { - fputc('?', stdout); - } else { - fputc(*str, stdout); - } - str++; - } -} - - - -/** The main loop sending SNMP requests and printing - responses to standard output. -*/ -static -void -run_main_loop(void) -{ - char nb[64]; /* Buffer for hex representation */ - struct timeval to; /* Timeout for select */ - struct snmp_pdu *rq; /* Request */ - struct snmp_pdu *rs; /* Response */ - struct variable_list *vars; /* Current variable to process */ - unsigned char *uptr; /* Traverse text */ - dk4_time_t start_time; /* Start time */ - dk4_time_t timeout_time; /* First timeout seen */ - dk4_time_t current_time; /* Current time */ - unsigned long cond = 0UL; /* Printer detected error */ - unsigned long ocond = 0UL; /* Previous printer det err */ - unsigned long tcond = 0UL; /* Current conditions */ - unsigned long opcnt = 0UL; /* Previous page count */ - unsigned long ul; /* unsigned long from current var */ - unsigned long pcnt; /* Page count */ - size_t lst; /* Status text length */ - size_t olst; /* Previous status text length */ - int i; /* Traverse bits in pr det err st */ - int found; /* Summary: Which information found */ - int must_show; /* Must show changed values */ - int must_flush; /* Must flush standard output */ - int status; /* SNMP response status */ - int res; /* Operation result */ - int cc = 1; /* Flag: Can continue */ - int devst = 0; /* Device status */ - int prist = 0; /* Printer status */ - int unreach = 0; /* Flag: Unreachable */ - int odevst = 0; /* Previous device status */ - int oprist = 0; /* Previous printer status */ - int ounreach = 0; /* Previous unreach flag */ - - dk4time_get(&start_time); - timeout_time = (dk4_time_t)0UL; - if ((dk4_um_t)0UL < timeout) { - timeout_time = start_time + (dk4_time_t)timeout; - } - cc = 1; - statext[0] = '\0'; - ostatext[0] = '\0'; - olst = 0; - do { - pcnt = 0UL; - unreach = 1; - devst = 0; - prist = 0; - found = 0; - cond = 0UL; - statext[0] = '\0'; - rs = NULL; - lst = 0; - must_show = 0; $? ". must_show = 0" - must_flush = 0; - if (0 != can_continue(0)) { - rq = snmp_pdu_create(SNMP_MSG_GET); - if (NULL != rq) { - snmp_add_null_var(rq, prmonsnmp_oid_ds, pjsnmp_sz_oid_ds); - snmp_add_null_var(rq, prmonsnmp_oid_ps, pjsnmp_sz_oid_ps); - snmp_add_null_var(rq, prmonsnmp_oid_pe, pjsnmp_sz_oid_pe); - snmp_add_null_var(rq, prmonsnmp_oid_st, pjsnmp_sz_oid_st); - snmp_add_null_var(rq, prmonsnmp_oid_pc, pjsnmp_sz_oid_pc); - status = snmp_synch_response(snmp_sess, rq, &rs); - if (STAT_SUCCESS == status) { - if (NULL != rs) { - if (SNMP_ERR_NOERROR == rs->errstat) { - unreach = 0; - vars = rs->variables; - while (NULL != vars) { - switch (oid_index(vars->name, vars->name_length)) { - case 0: { - i = 0; - if (0 != get_int(&i, vars)) { - devst = i; - found |= 1; - } - } break; - case 1: { - i = 0; - if (0 != get_int(&i, vars)) { - prist = i; - found |= 2; - } - } break; - case 2: { - ul = 0UL; - if (0 != get_ul(&ul, vars)) { - cond = ul; - found |= 4; - } - } break; - case 3: { - if ((0 < vars->val_len)&&(sizeof(statext) > vars->val_len)) - { - dk4mem_cpy(statext,(vars->val).string,vars->val_len,NULL); - statext[vars->val_len] = '\0'; - lst = vars->val_len; - found |= 8; - } - } break; - case 4: { - ul = 0UL; - if (0 != get_ul(&ul, vars)) { - pcnt = ul; - found |= 16; - } - } break; - } - vars = vars->next_variable; - } - if (0 != (1 & found)) { - if (devst != odevst) { $? ". must_show = 1" - must_show = 1; - } - } - if (0 != (2 & found)) { - if (prist != oprist) { $? ". must_show = 1" - must_show = 1; - } - } - if (0 != (4 & found)) { - if (cond != ocond) { $? ". must_show = 1" - must_show = 1; - } - } - if (0 != (8 & found)) { - if (lst != olst) { $? ". must_show = 1" - must_show = 1; - } - if (0 != dk4mem_cmp(statext, ostatext, lst, NULL)) { - $? ". must_show = 1" - must_show = 1; - } - } - if (0 != (16 & found)) { - if (pcnt != opcnt) { - must_show = 1; - } - } - if (0 != must_show) { - log_timestamp(); - must_flush = 1; - if ((0 != (1 & found)) && (0 <= devst) && (5 >= devst)) { - fputs(prmonsnmp_kw[4 + devst], stdout); - } - if ((0 != (2 & found)) && (0 <= prist) && (5 >= prist)) { - fputs(prmonsnmp_kw[17], stdout); - fputs(prmonsnmp_kw[10 + prist], stdout); - } - if (0 != (4 & found)) { - fputs(prmonsnmp_kw[18], stdout); - tcond = 0x80000000UL; - for (i = 0; i < 16; i++) { - if ((0 < i) && (0 == (i % 4))) { - fputc('-', stdout); - } - fputc(((0UL != (tcond & cond)) ? '1' : '0'), stdout); - tcond = tcond / 2UL; - } - } - if (0 != (16 & found)) { - res = dk4ma_write_c8_decimal_unsigned( - nb, sizeof(nb), (dk4_um_t)pcnt, 0, NULL - ); - if (0 != res) { - fputs(prmonsnmp_kw[18], stdout); - fputs(nb, stdout); - } - } - fputc('\n', stdout); - if (0 != (4 & found)) { - tcond = 0x80000000UL; - for (i = 0; i < 15; i++) { - if (0UL != (cond & tcond)) { - fputs(prmonsnmp_kw[19 + i], stdout); - } - tcond = tcond / 2UL; - } - } - if (0 != (8 & found)) { - if (0 < lst) { - uptr = (unsigned char *)statext; - for (i = 0; (size_t)i < lst; i++) { - if (0 < i) { - if (0 == (i % 24)) { - fputc('\n', stdout); - } else { - fputc(' ', stdout); - } - } - res = dk4ma_write_c8_hex_unsigned( - nb, sizeof(nb), (dk4_um_t)(*(uptr++)), 2, NULL - ); - if (0 != res) { - fputs(nb, stdout); - } - } - fputc('\n', stdout); - fputc('"', stdout); - if (0 == contains_non_ascii((unsigned char *)statext,lst)) { - fwrite(statext, 1, lst, stdout); - } else { - show_as_ascii((unsigned char *)statext, lst); - } - fputc('"', stdout); - fputc('\n', stdout); - } - } - } - } - } - } - if (NULL != rs) { - snmp_free_pdu(rs); - } - if (unreach != ounreach) { - log_timestamp(); - fputs(prmonsnmp_kw[35], stdout); - must_flush = 1; - } - ounreach = unreach; - odevst = devst; - oprist = prist; - ocond = cond; - olst = lst; - opcnt = pcnt; - strcpy(ostatext, statext); - } else { - cc = -1; - exval = EXIT_FAILURE; - /* ERROR: Failed to create request PDU */ - fputs(prmonsnmp_kw[2], stderr); - fputs(prmonsnmp_kw[36], stderr); - fflush(stderr); - } - if (0 != must_flush) { - fflush(stdout); - } - } else { - cc = -1; - } - if (1 == cc) { - if ((dk4_time_t)0UL < timeout_time) { - dk4time_get(¤t_time); - if (current_time > timeout_time) { - cc = 0; - } - } - } - if (1 == cc) { - if (0 != grace) { - to.tv_sec = 0L; - to.tv_usec = 250000L; - select(0, NULL, NULL, NULL, &to); - } - } - } while (1 == cc); -} - - - -/** Set SNMP version. - @param name SNMP version name as text. - @return 1 on success, 0 on error. -*/ -static -int -set_snmp_version(const char *name) -{ - int back = 0; - switch (dk4str8_array_index(snmp_version_names, name, 0)) { - case 0: { - back = 1; - snmp_vers = SNMP_VERSION_1; - } break; - case 1: case 2: { - back = 1; - snmp_vers = SNMP_VERSION_2c; - } break; - case 3: { - back = 1; - snmp_vers = SNMP_VERSION_3; - } break; - } - return back; -} - - - -/** Process command line arguments. - @param argc Number of command line arguments. - @param argv Command line arguments array. - @return 1 on success, 0 on error. -*/ -static -int -process_command_line_arguments(int argc, char *argv[]) -{ - char **lfdarg; /* Traverse cmd line arguments */ - char *curarg; /* Current cmd line argument */ - const char *ep; /* End of used data in conversion */ - dk4_um_t um; /* Conversion result */ - int i; /* Cmd line args still remaining */ - int have_vers = 0; /* Flag: Have SNMP version */ - int back = 1; /* Function result */ - int res; /* Conversion result */ - - lfdarg = argv; i = argc; - lfdarg++; i--; - while (0 < i) { - curarg = *lfdarg; - if ('-' == *curarg) { - curarg++; - switch (*curarg) { - case '-' : { - curarg++; - switch ( dk4str8_array_index(long_options, curarg, 0) ) { - case 0: { - hvl |= 1; - } break; - case 1: { - hvl |= 2; - } break; - case 2: { - hvl |= 4; - } break; - } - } break; - case 'n' : { - grace = 0; - } break; - case 'v' : { - if (0 != have_vers) { - /* WARNING: Version redefined */ - fputs(prmonsnmp_kw[2], stderr); - fputs(prmonsnmp_kw[37], stderr); - fflush(stderr); - } - have_vers = 1; - curarg++; curarg = dk4str8_start(curarg, NULL); - if (NULL == curarg) { - lfdarg++; i--; - if (0 < i) { curarg = *lfdarg; } - } - if (NULL != curarg) { - if (0 == set_snmp_version(curarg)) { - /* WARNING: Illegal SNMP version */ - fputs(prmonsnmp_kw[2], stderr); - fputs(prmonsnmp_kw[38], stderr); - fputs(curarg, stderr); - fputs(prmonsnmp_kw[39], stderr); - fflush(stderr); - back = 0; - } - } else { - back = 0; - } - } break; - case 'c' : { - curarg++; curarg = dk4str8_start(curarg, NULL); - if (NULL == curarg) { - lfdarg++; i--; - if (0 < i) { curarg = *lfdarg; } - } - if (NULL != curarg) { - if (NULL != snmp_comm) { - /* WARNING: Community redefined */ - fputs(prmonsnmp_kw[2], stderr); - fputs(prmonsnmp_kw[40], stderr); - fflush(stderr); - } - snmp_comm = curarg; - } else { - back = 0; - } - } break; - case 't' : { - curarg++; curarg = dk4str8_start(curarg, NULL); - if (NULL == curarg) { - lfdarg++; i--; - if (0 < i) { curarg = *lfdarg; } - } - if (NULL != curarg) { - ep = NULL; - res = dk4ma_input_c8_dec_dk4_um_t(&um, curarg, &ep, 1, NULL); - if (0 != res) { - timeout = um; - } else { - back = 0; - } - } else { - back = 0; - } - } break; - } - } else { - if (NULL != host_name) { - /* WARNING: Host name redefined */ - fputs(prmonsnmp_kw[2], stderr); - fputs(prmonsnmp_kw[41], stderr); - fflush(stderr); - } - host_name = curarg; - } - if (0 < i) { lfdarg++; i--; } - } - if ((0 == hvl) && (NULL == host_name)) { - /* ERROR: Missing host name */ - fputs(prmonsnmp_kw[2], stderr); - fputs(prmonsnmp_kw[42], stderr); - fflush(stderr); - back = 0; - } - return back; -} - - -/** Show a text paragraph on standard output. - @param txt Text to show. -*/ -static -void -show_text(const char * const *txt) -{ - if (NULL != txt) { - while (NULL != *txt) { - fputs(*(txt++), stdout); - fputc('\n', stdout); - } - fflush(stdout); - } -} - - - -/** Handle --help, --version, --license options. -*/ -static -void -run_hvl(void) -{ - $? "+ run_hvl" - if (0 != (1 & hvl)) { - show_text(help_text); - } - if (0 != (2 & hvl)) { - fputs(version_text, stdout); - fputc('\n', stdout); - fflush(stdout); - } - if (0 != (4 & hvl)) { - show_text(license_text); - } - exval = EXIT_SUCCESS; - $? "- run_hvl" -} - - - -#endif - -/** Main function. - @param argc Number of command line arguments. - @param argv Command line arguments array. - @return 0 on success, all other values indicate errors. -*/ -int main(int argc, char *argv[]) -{ -#if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) - - /* +++++ Required libraries available */ - dkChar blang[32]; - dkChar breg[32]; - struct snmp_session sesstemp; -#if DK4_HAVE_SIGACTION -#ifdef SIGPIPE - struct sigaction opipe; - struct sigaction npipe; -#endif - struct sigaction oint; - struct sigaction nint; - struct sigaction oterm; - struct sigaction nterm; -#else -#ifdef SIGPIPE - dk4_sig_handler_t *opipe = NULL; -#endif - dk4_sig_handler_t *oterm = NULL; - dk4_sig_handler_t *oint = NULL; -#endif - const size_t szblang = DK4_SIZEOF(blang,dkChar); - const size_t szbreg = DK4_SIZEOF(breg,dkChar); -#if DK4_HAVE_SIGACTION - int pipe_set = 0; - int term_set = 0; - int int_set = 0; - int sig_i_f = 0; - int sig_r_f = 0; -#endif - $!trace-init prmonsnmp.deb - $? "+ main" - - /* Set signal handlers. - -------------------- - */ -#if DK4_HAVE_SIGACTION -#ifdef SIGPIPE - DK4_MEMRES(&npipe, sizeof(npipe)); - npipe.sa_handler = sig_handler_pipe; - npipe.sa_flags = 0; - if (0 != sigemptyset(&npipe.sa_mask)) { - /* ERROR: Failed to set up masked signal set for SIGPIPE */ - sig_i_f = 1; - goto finished; - } - if (0 != sigaddset(&npipe.sa_mask, SIGPIPE)) { - /* ERROR: Failed to set up masked signal set for SIGPIPE */ - sig_i_f = 1; - goto finished; - } - if (0 != sigaction(SIGPIPE, &npipe, &opipe)) { - /* ERROR: Failed to set up signal handler for SIGPIPE */ - sig_i_f = 1; - goto finished; - } - pipe_set = 1; -#endif - DK4_MEMRES(&nterm, sizeof(nterm)); - nterm.sa_handler = sig_handler_term; - nterm.sa_flags = 0; - if (0 != sigemptyset(&nterm.sa_mask)) { - /* ERROR: Failed to set up masked signal set for SIGTERM */ - sig_i_f = 1; - goto finished; - } - if (0 != sigaddset(&nterm.sa_mask, SIGTERM)) { - /* ERROR: Failed to set up masked signal set for SIGTERM */ - sig_i_f = 1; - goto finished; - } - if (0 != sigaction(SIGTERM, &nterm, &oterm)) { - /* ERROR: Failed to set up signal handler for SIGTERM */ - sig_i_f = 1; - goto finished; - } - term_set = 1; - DK4_MEMRES(&nint, sizeof(nint)); - nint.sa_handler = sig_handler_int; - nint.sa_flags = 0; - if (0 != sigemptyset(&nint.sa_mask)) { - /* ERROR: Failed to set up masked signal set for SIGINT */ - sig_i_f = 1; - goto finished; - } - if (0 != sigaddset(&nint.sa_mask, SIGINT)) { - /* ERROR: Failed to set up masked signal set for SIGINT */ - sig_i_f = 1; - goto finished; - } - if (0 != sigaction(SIGINT, &nint, &oint)) { - /* ERROR: Failed to set up signal handler for SIGINT */ - sig_i_f = 1; - goto finished; - } - int_set = 1; -#else -#ifdef SIGPIPE - opipe = sigset(SIGPIPE, sig_handler_pipe); -#endif - oint = sigset(SIGINT, sig_handler_int); - oterm = sigset(SIGTERM, sig_handler_term); -#endif - - /* - Retrieve encoding. - ------------------ - */ - if (0 == dk4loc_get_settings(blang, szblang, breg, szbreg, &encoding, NULL)) { - encoding = DK4_ENCODING_PLAIN; - } - /* Process command line arguments. - ------------------------------- - */ - if (0 == process_command_line_arguments(argc, argv)) { - goto finished; - } - - if (0 != hvl) { - run_hvl(); - goto finished; - } - - /* Set up SNMP and create session. - ------------------------------- - */ -#if DK4_HAVE_SNMP_DISABLE_SYSLOG - $? ". disable syslog" - snmp_disable_syslog(); -#endif -#if DK4_HAVE_SNMP_DISABLE_FILELOG - $? ". disable filelog" - snmp_disable_filelog(); -#endif -#if DK4_HAVE_SNMP_DISABLE_STDERRLOG - $? ". disable stderrlog" - snmp_disable_stderrlog(); -#endif - init_snmp(prmonsnmp_kw[2]); - DK4_MEMRES(&sesstemp, sizeof(sesstemp)); - snmp_sess_init(&sesstemp); - sesstemp.version = snmp_vers; - sesstemp.peername = host_name; - sesstemp.community = (unsigned char *)snmp_comm; - if (NULL == snmp_comm) { - sesstemp.community = (unsigned char *)(prmonsnmp_kw[3]); - } - sesstemp.community_len = strlen((char *)(sesstemp.community)); - snmp_sess = snmp_open(&sesstemp); - if (NULL == snmp_sess) { - /* ERROR: Failed to open session */ - fputs(prmonsnmp_kw[2], stderr); - fputs(prmonsnmp_kw[43], stderr); - fflush(stderr); - goto finished; - } - - /* Run main loop. - -------------- - */ - exval = EXIT_SUCCESS; - run_main_loop(); - - /* - Cleanup. - -------- - */ - finished: - /* - Close SNMP session, if any. - */ - /* - Restore signal handlers - */ -#if DK4_HAVE_SIGACTION - if (0 != sig_i_f) { - fputs(prmonsnmp_kw[2], stderr); - fputs(prmonsnmp_kw[45], stderr); - fflush(stderr); - } - if (0 != int_set) { - if (0 != sigaction(SIGINT, &oint, NULL)) { - /* ERROR */ - sig_r_f = 1; - } - } - if (0 != term_set) { - if (0 != sigaction(SIGTERM, &oterm, NULL)) { - /* ERROR */ - sig_r_f = 1; - } - } -#ifdef SIGPIPE - if (0 != pipe_set) { - if (0 != sigaction(SIGPIPE, &opipe, NULL)) { - /* ERROR */ - sig_r_f = 1; - } - } -#endif - if (0 != sig_r_f) { - fputs(prmonsnmp_kw[2], stderr); - fputs(prmonsnmp_kw[44], stderr); - fflush(stderr); - } -#else - if (NULL != oterm) { sigset(SIGTERM, oterm); } - if (NULL != oint ) { sigset(SIGINT, oint ); } -#ifdef SIGPIPE - if (NULL != opipe) { sigset(SIGPIPE, opipe); } -#endif -#endif - - $? "- main %d", exval - $!trace-end - /* ----- Required libraries available */ - -#else -/* if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) */ - fputs(prmonsnmp_kw[2], stderr); - fputs(": ERROR: Required features missing!\n", stderr); -#if !DK4_HAVE_LIBNETSNMP - fputs("Support for Net-SNMP required!\n", stderr); - fputs("http://sourceforge.net/projects/net-snmp\n", stderr); -#endif -#if !((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) - fputs("Support for sigaction() or sigset() required but not found!\n",stderr); -#endif - fflush(stderr); -#endif -/* if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) */ - exit(exval); return exval; -} - - |