Compare commits
132 commits
debian-jes
...
nll-2.8.0
Author | SHA1 | Date | |
---|---|---|---|
|
ba45b20c34 | ||
|
0b5b61097a | ||
|
ab3256f51e | ||
|
b2b0c9995a | ||
|
fc7f4b43c1 | ||
|
a9054f1936 | ||
|
9830c31430 | ||
|
d0e2223474 | ||
|
889a404ef5 | ||
|
c3b8fd580f | ||
|
2cbeab144c | ||
|
57937877b1 | ||
|
82a1e36d60 | ||
|
9f7a21edb3 | ||
|
7e3876e1c6 | ||
|
b0cb2b77bb | ||
|
f308b5c62d | ||
|
dcb5203681 | ||
|
5c60ced7db | ||
|
0d0ddec735 | ||
|
f1c2ba9882 | ||
|
a4d3d4fb1e | ||
|
64f3199582 | ||
|
daac55b6a9 | ||
|
866682d442 | ||
|
6d1061719e | ||
|
034bb3e28f | ||
|
e878bd34ba | ||
|
c4835ea1a1 | ||
|
1d0f417e29 | ||
|
f421c8ecc7 | ||
|
2a297829ee | ||
|
c71fa5912e | ||
|
d07de5b2ba | ||
|
e15be88231 | ||
|
ed73672c7c | ||
|
e8aa8ec3ff | ||
|
247c516a79 | ||
|
34f0448c77 | ||
|
50d4a418ef | ||
|
bda57ab3dc | ||
|
9efb9cdb3c | ||
|
59582e793c | ||
|
3115b529b2 | ||
|
9aba586fa8 | ||
|
1f4f8540a3 | ||
|
c1e987a09c | ||
|
3ecd26d7cc | ||
|
57fac761d2 | ||
|
0808410404 | ||
|
714bfb0ea4 | ||
|
c714f33799 | ||
|
b2c9649823 | ||
|
b11ef489f7 | ||
|
b493284ac5 | ||
|
4e84429b69 | ||
|
963a7372d2 | ||
|
5772786c65 | ||
|
35532f2132 | ||
|
aea535dcba | ||
|
c4e9d7ecff | ||
|
68880dfdfd | ||
|
6169fe541f | ||
|
2ac85b39ea | ||
|
14ba36ebf2 | ||
|
df751bd197 | ||
|
e437c6972c | ||
|
08288b6a7f | ||
|
740190eb6a | ||
|
3aa359a7dd | ||
|
4bcbcd8fde | ||
|
ac21d98f99 | ||
|
b6aa79cc73 | ||
|
42af1644dc | ||
|
81a8df71f8 | ||
|
02aecd43d3 | ||
|
cbd94344af | ||
|
7ccca60883 | ||
|
c4bec2820e | ||
|
68231aaa9a | ||
|
6c18e2ba35 | ||
|
1b2fe33bfd | ||
|
3cf6fe4225 | ||
|
2ae8cfe7da | ||
|
82f4838526 | ||
|
e3cc4871ce | ||
|
4a1eddd34b | ||
|
165febf8fc | ||
|
849ad1a39e | ||
|
f1c7249233 | ||
|
76e6e1d4e5 | ||
|
32c3d8aac0 | ||
|
5f612a9a0f | ||
|
08d39e662c | ||
|
d31c6dcb9b | ||
|
21b0ce7971 | ||
|
627b1dd6ea | ||
|
8d6492f968 | ||
|
bd298ee052 | ||
|
75c8125f8a | ||
|
0549a71851 | ||
|
10dfed1de3 | ||
|
1476985c4c | ||
|
5b5df2aac1 | ||
|
e01f1100e2 | ||
|
ba41628644 | ||
|
d755c8b023 | ||
|
f9eefb910b | ||
|
3780d53734 | ||
|
d4195945c0 | ||
|
4ffde4deaa | ||
|
6cee8926ae | ||
|
8c5af82247 | ||
|
0512813b41 | ||
|
c9cb2187ee | ||
|
237be91ad9 | ||
|
b0b61548a4 | ||
|
1a30e36c57 | ||
|
38537675ba | ||
|
79b4afb095 | ||
|
b762a3580e | ||
|
e948707093 | ||
|
85836f6836 | ||
|
f07d79cd65 | ||
|
f5439265c8 | ||
|
cf7db8a9f1 | ||
|
c2a1ac8f1f | ||
|
7ca12c8e25 | ||
|
a980444360 | ||
|
fd413a3168 | ||
|
c57ad7e897 | ||
|
165791ea2a |
939 changed files with 158207 additions and 36243 deletions
38
.drone.yml
Normal file
38
.drone.yml
Normal file
|
@ -0,0 +1,38 @@
|
|||
kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: Build Bullseye
|
||||
image: debian:bullseye
|
||||
volumes:
|
||||
- name: finished_files
|
||||
path: /deb_files
|
||||
commands:
|
||||
- apt update
|
||||
- apt -y upgrade
|
||||
- apt -y install --no-install-recommends build-essential equivs devscripts git rename
|
||||
- git clean -f -d -x
|
||||
- mk-build-deps --install --tool='apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends --yes' debian/control
|
||||
- dpkg-buildpackage -b -uc
|
||||
- rename 's/\.deb/_bullseye\.deb/' ../*.deb
|
||||
- mkdir -p /deb_files/bullseye/
|
||||
- cp ../*.deb /deb_files/bullseye/
|
||||
- find /deb_files/
|
||||
|
||||
- name: gitea_release
|
||||
image: plugins/gitea-release
|
||||
volumes:
|
||||
- name: finished_files
|
||||
path: /deb_files
|
||||
settings:
|
||||
api_key:
|
||||
from_secret: GITEA_KEY
|
||||
base_url: https://git.neulandlabor.de/
|
||||
files:
|
||||
- /deb_files/bullseye/*
|
||||
when:
|
||||
event: tag
|
||||
|
||||
volumes:
|
||||
- name: finished_files
|
||||
temp: {}
|
4
AUTHORS
4
AUTHORS
|
@ -170,3 +170,7 @@ D: pwmib support for snmp-ups
|
|||
N: Kjell Claesson
|
||||
E: Kjell.claesson@epost.tidanet.se
|
||||
D: Author of bcmxcp driver, 3-phase work.
|
||||
|
||||
N: Giuseppe Corbelli
|
||||
E: giuseppe.corbelli@copanitalia.com
|
||||
D: Author of asem driver
|
||||
|
|
320
INSTALL
320
INSTALL
|
@ -1,8 +1,8 @@
|
|||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
|
||||
Inc.
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
|
@ -12,97 +12,96 @@ without warranty of any kind.
|
|||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
Briefly, the shell command './configure && make && make install'
|
||||
should configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the 'README' file for
|
||||
instructions specific to this package. Some packages provide this
|
||||
`INSTALL' file but do not implement all of the features documented
|
||||
'INSTALL' file but do not implement all of the features documented
|
||||
below. The lack of an optional feature in a given package is not
|
||||
necessarily a bug. More recommendations for GNU packages can be found
|
||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
The 'configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
those values to create a 'Makefile' in each directory of the package.
|
||||
It may also create one or more '.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script 'config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
file 'config.log' containing compiler output (useful mainly for
|
||||
debugging 'configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
It can also use an optional file (typically called 'config.cache' and
|
||||
enabled with '--cache-file=config.cache' or simply '-C') that saves the
|
||||
results of its tests to speed up reconfiguring. Caching is disabled by
|
||||
default to prevent problems with accidental use of stale cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
to figure out how 'configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the 'README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
some point 'config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
The file 'configure.ac' (or 'configure.in') is used to create
|
||||
'configure' by a program called 'autoconf'. You need 'configure.ac' if
|
||||
you want to change it or regenerate 'configure' using a newer version of
|
||||
'autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
1. 'cd' to the directory containing the package's source code and type
|
||||
'./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
Running 'configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
2. Type 'make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
3. Optionally, type 'make check' to run any self-tests that come with
|
||||
the package, generally using the just-built uninstalled binaries.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
4. Type 'make install' to install the programs and any data files and
|
||||
documentation. When installing into a prefix owned by root, it is
|
||||
recommended that the package be configured and built as a regular
|
||||
user, and only the `make install' phase executed with root
|
||||
user, and only the 'make install' phase executed with root
|
||||
privileges.
|
||||
|
||||
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||
5. Optionally, type 'make installcheck' to repeat any self-tests, but
|
||||
this time using the binaries in their final installed location.
|
||||
This target does not install anything. Running this target as a
|
||||
regular user, particularly if the prior `make install' required
|
||||
regular user, particularly if the prior 'make install' required
|
||||
root privileges, verifies that the installation completed
|
||||
correctly.
|
||||
|
||||
6. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
source code directory by typing 'make clean'. To also remove the
|
||||
files that 'configure' created (so you can compile the package for
|
||||
a different kind of computer), type 'make distclean'. There is
|
||||
also a 'make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
7. Often, you can also type `make uninstall' to remove the installed
|
||||
7. Often, you can also type 'make uninstall' to remove the installed
|
||||
files again. In practice, not all packages have tested that
|
||||
uninstallation works correctly, even though it is required by the
|
||||
GNU Coding Standards.
|
||||
|
||||
8. Some packages, particularly those that use Automake, provide `make
|
||||
8. Some packages, particularly those that use Automake, provide 'make
|
||||
distcheck', which can by used by developers to test that all other
|
||||
targets like `make install' and `make uninstall' work correctly.
|
||||
targets like 'make install' and 'make uninstall' work correctly.
|
||||
This target is generally not run by end users.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
the 'configure' script does not know about. Run './configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
You can give 'configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here is
|
||||
an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
|
@ -113,21 +112,21 @@ Compiling For Multiple Architectures
|
|||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
own directory. To do this, you can use GNU 'make'. 'cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'. This
|
||||
is known as a "VPATH" build.
|
||||
the 'configure' script. 'configure' automatically checks for the source
|
||||
code in the directory that 'configure' is in and in '..'. This is known
|
||||
as a "VPATH" build.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
With a non-GNU 'make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
installed the package for one architecture, use 'make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and
|
||||
executables that work on multiple system types--known as "fat" or
|
||||
"universal" binaries--by specifying multiple `-arch' options to the
|
||||
compiler but only a single `-arch' option to the preprocessor. Like
|
||||
"universal" binaries--by specifying multiple '-arch' options to the
|
||||
compiler but only a single '-arch' option to the preprocessor. Like
|
||||
this:
|
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
|
@ -136,105 +135,104 @@ this:
|
|||
|
||||
This is not guaranteed to produce working output in all cases, you
|
||||
may have to build one architecture at a time and combine the results
|
||||
using the `lipo' tool if you have problems.
|
||||
using the 'lipo' tool if you have problems.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||
By default, 'make install' installs the package's commands under
|
||||
'/usr/local/bin', include files under '/usr/local/include', etc. You
|
||||
can specify an installation prefix other than '/usr/local' by giving
|
||||
'configure' the option '--prefix=PREFIX', where PREFIX must be an
|
||||
absolute file name.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the
|
||||
default for these options is expressed in terms of `${prefix}', so that
|
||||
specifying just `--prefix' will affect all of the other directory
|
||||
options like '--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run 'configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the default
|
||||
for these options is expressed in terms of '${prefix}', so that
|
||||
specifying just '--prefix' will affect all of the other directory
|
||||
specifications that were not explicitly provided.
|
||||
|
||||
The most portable way to affect installation locations is to pass the
|
||||
correct locations to `configure'; however, many packages provide one or
|
||||
correct locations to 'configure'; however, many packages provide one or
|
||||
both of the following shortcuts of passing variable assignments to the
|
||||
`make install' command line to change installation locations without
|
||||
'make install' command line to change installation locations without
|
||||
having to reconfigure or recompile.
|
||||
|
||||
The first method involves providing an override variable for each
|
||||
affected directory. For example, `make install
|
||||
affected directory. For example, 'make install
|
||||
prefix=/alternate/directory' will choose an alternate location for all
|
||||
directory configuration variables that were expressed in terms of
|
||||
`${prefix}'. Any directories that were specified during `configure',
|
||||
but not in terms of `${prefix}', must each be overridden at install
|
||||
time for the entire installation to be relocated. The approach of
|
||||
makefile variable overrides for each directory variable is required by
|
||||
the GNU Coding Standards, and ideally causes no recompilation.
|
||||
However, some platforms have known limitations with the semantics of
|
||||
shared libraries that end up requiring recompilation when using this
|
||||
method, particularly noticeable in packages that use GNU Libtool.
|
||||
'${prefix}'. Any directories that were specified during 'configure',
|
||||
but not in terms of '${prefix}', must each be overridden at install time
|
||||
for the entire installation to be relocated. The approach of makefile
|
||||
variable overrides for each directory variable is required by the GNU
|
||||
Coding Standards, and ideally causes no recompilation. However, some
|
||||
platforms have known limitations with the semantics of shared libraries
|
||||
that end up requiring recompilation when using this method, particularly
|
||||
noticeable in packages that use GNU Libtool.
|
||||
|
||||
The second method involves providing the `DESTDIR' variable. For
|
||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||
`/alternate/directory' before all installation names. The approach of
|
||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
The second method involves providing the 'DESTDIR' variable. For
|
||||
example, 'make install DESTDIR=/alternate/directory' will prepend
|
||||
'/alternate/directory' before all installation names. The approach of
|
||||
'DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
does not work on platforms that have drive letters. On the other hand,
|
||||
it does better at avoiding recompilation issues, and works well even
|
||||
when some directory options were not specified in terms of `${prefix}'
|
||||
at `configure' time.
|
||||
when some directory options were not specified in terms of '${prefix}'
|
||||
at 'configure' time.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
with an extra prefix or suffix on their names by giving 'configure' the
|
||||
option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
Some packages pay attention to '--enable-FEATURE' options to
|
||||
'configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to '--with-PACKAGE' options, where PACKAGE
|
||||
is something like 'gnu-as' or 'x' (for the X Window System). The
|
||||
'README' should mention any '--enable-' and '--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
For packages that use the X Window System, 'configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
you can use the 'configure' options '--x-includes=DIR' and
|
||||
'--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Some packages offer the ability to configure how verbose the
|
||||
execution of `make' will be. For these packages, running `./configure
|
||||
execution of 'make' will be. For these packages, running './configure
|
||||
--enable-silent-rules' sets the default to minimal output, which can be
|
||||
overridden with `make V=1'; while running `./configure
|
||||
overridden with 'make V=1'; while running './configure
|
||||
--disable-silent-rules' sets the default to verbose, which can be
|
||||
overridden with `make V=0'.
|
||||
overridden with 'make V=0'.
|
||||
|
||||
Particular systems
|
||||
==================
|
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||
CC is not installed, it is recommended to use the following options in
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC
|
||||
is not installed, it is recommended to use the following options in
|
||||
order to use an ANSI C compiler:
|
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
HP-UX `make' updates targets which have the same time stamps as
|
||||
their prerequisites, which makes it generally unusable when shipped
|
||||
generated files such as `configure' are involved. Use GNU `make'
|
||||
instead.
|
||||
HP-UX 'make' updates targets which have the same time stamps as their
|
||||
prerequisites, which makes it generally unusable when shipped generated
|
||||
files such as 'configure' are involved. Use GNU 'make' instead.
|
||||
|
||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||
to try
|
||||
parse its '<wchar.h>' header file. The option '-nodtk' can be used as a
|
||||
workaround. If GNU CC is not installed, it is therefore recommended to
|
||||
try
|
||||
|
||||
./configure CC="cc"
|
||||
|
||||
|
@ -242,26 +240,26 @@ and if that doesn't work, try
|
|||
|
||||
./configure CC="cc -nodtk"
|
||||
|
||||
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||
On Solaris, don't put '/usr/ucb' early in your 'PATH'. This
|
||||
directory contains several dysfunctional programs; working variants of
|
||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||
in your `PATH', put it _after_ `/usr/bin'.
|
||||
these programs are available in '/usr/bin'. So, if you need '/usr/ucb'
|
||||
in your 'PATH', put it _after_ '/usr/bin'.
|
||||
|
||||
On Haiku, software installed for all users goes in `/boot/common',
|
||||
not `/usr/local'. It is recommended to use the following options:
|
||||
On Haiku, software installed for all users goes in '/boot/common',
|
||||
not '/usr/local'. It is recommended to use the following options:
|
||||
|
||||
./configure --prefix=/boot/common
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out
|
||||
There may be some features 'configure' cannot figure out
|
||||
automatically, but needs to determine by the type of machine the package
|
||||
will run on. Usually, assuming the package is built to be run on the
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
_same_ architectures, 'configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
'--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as 'sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
|
@ -270,101 +268,101 @@ where SYSTEM can have one of these forms:
|
|||
OS
|
||||
KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
See the file 'config.sub' for the possible values of each field. If
|
||||
'config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
use the option '--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
eventually be run) with '--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
If you want to set default values for 'configure' scripts to share,
|
||||
you can create a site shell script called 'config.site' that gives
|
||||
default values for variables like 'CC', 'cache_file', and 'prefix'.
|
||||
'configure' looks for 'PREFIX/share/config.site' if it exists, then
|
||||
'PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
'CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all 'configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
environment passed to 'configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
them in the 'configure' command line, using 'VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
causes the specified 'gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||
Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
|
||||
Autoconf limitation. Until the limitation is lifted, you can use this
|
||||
workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
'configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
'configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of all of the options to `configure', and exit.
|
||||
'--help'
|
||||
'-h'
|
||||
Print a summary of all of the options to 'configure', and exit.
|
||||
|
||||
`--help=short'
|
||||
`--help=recursive'
|
||||
'--help=short'
|
||||
'--help=recursive'
|
||||
Print a summary of the options unique to this package's
|
||||
`configure', and exit. The `short' variant lists options used
|
||||
only in the top level, while the `recursive' variant lists options
|
||||
also present in any nested packages.
|
||||
'configure', and exit. The 'short' variant lists options used only
|
||||
in the top level, while the 'recursive' variant lists options also
|
||||
present in any nested packages.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
'--version'
|
||||
'-V'
|
||||
Print the version of Autoconf used to generate the 'configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
'--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
traditionally 'config.cache'. FILE defaults to '/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
'--config-cache'
|
||||
'-C'
|
||||
Alias for '--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
'--quiet'
|
||||
'--silent'
|
||||
'-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
suppress all normal output, redirect it to '/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
'--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
'configure' can determine that directory automatically.
|
||||
|
||||
`--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names::
|
||||
for more details, including other options available for fine-tuning
|
||||
the installation locations.
|
||||
'--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names:: for
|
||||
more details, including other options available for fine-tuning the
|
||||
installation locations.
|
||||
|
||||
`--no-create'
|
||||
`-n'
|
||||
'--no-create'
|
||||
'-n'
|
||||
Run the configure checks, but stop before creating any output
|
||||
files.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
||||
'configure' also accepts some other, not widely useful, options. Run
|
||||
'configure --help' for more details.
|
||||
|
|
81
INSTALL.nut
81
INSTALL.nut
|
@ -1,11 +1,13 @@
|
|||
Installation instructions
|
||||
=========================
|
||||
|
||||
This chapter describe the various methods for installing Network UPS Tools.
|
||||
This chapter describes the various methods for installing Network UPS Tools.
|
||||
|
||||
Whenever it is possible, prefer <<Installing_packages, installing from packages>>.
|
||||
Packagers have done an excellent and hard work at improving NUT integration into
|
||||
their system.
|
||||
their system. On the other hand, distributions and appliances tend to package
|
||||
"official releases" of projects such as NUT, and so do not deliver latest and
|
||||
greatest fixes, new drivers, bugs and other features.
|
||||
|
||||
[[Installing_source]]
|
||||
Installing from source
|
||||
|
@ -16,6 +18,13 @@ These are the essential steps for compiling and installing this software.
|
|||
The NUT linkdoc:packager-guide[Packager Guide], which presents the best
|
||||
practices for installing and integrating NUT, is also a good reading.
|
||||
|
||||
The link:config-prereqs.txt[Prerequisites for building NUT on different OSes]
|
||||
document suggests prerequisite packages with tools and dependencies
|
||||
available and needed to build and test as much as possible of NUT on
|
||||
numerous platforms, written from perspective of CI testing (if you
|
||||
are interested in getting updated drivers for a particular device,
|
||||
you might select a sub-set of those suggestions).
|
||||
|
||||
[NOTE]
|
||||
.Keep in mind that...
|
||||
================================================================================
|
||||
|
@ -141,7 +150,7 @@ State path creation
|
|||
|
||||
Create the state path directory for the driver(s) and server to use
|
||||
for storing UPS status data and other auxiliary files, and make it
|
||||
owned by the user you created.
|
||||
group-writable by the group of the system user you created.
|
||||
|
||||
mkdir -p /var/state/ups
|
||||
chmod 0770 /var/state/ups
|
||||
|
@ -183,7 +192,7 @@ drivers; this should allow you to follow the below
|
|||
instructions. However, don't forget to set up the correct
|
||||
permissions later!).
|
||||
|
||||
NOTE: if you are using something like devfs or udev, make sure
|
||||
NOTE: if you are using something like udev or devd, make sure
|
||||
these permissions stay set across a reboot. If they revert to the
|
||||
old values, your drivers may fail to start.
|
||||
|
||||
|
@ -207,8 +216,8 @@ Debian, Ubuntu and other derivatives
|
|||
NOTE: NUT is packaged and well maintained in these systems.
|
||||
The official Debian packager is part of the NUT Team.
|
||||
|
||||
Using your prefered method (apt-get, aptitude, Synaptic, ...), install
|
||||
the 'nut' package, and optionaly the following:
|
||||
Using your preferred method (apt-get, aptitude, Synaptic, ...), install
|
||||
the 'nut' package, and optionally the following:
|
||||
|
||||
- 'nut-cgi', if you need the CGI (HTML) option,
|
||||
- 'nut-snmp', if you need the snmp-ups driver,
|
||||
|
@ -233,32 +242,32 @@ Mandriva
|
|||
NOTE: NUT is packaged and well maintained in these systems.
|
||||
The official Mandriva packager is part of the NUT Team.
|
||||
|
||||
Using your prefered method (urpmi, RPMdrake, ...), install one of the two below
|
||||
Using your preferred method (urpmi, RPMdrake, ...), install one of the two below
|
||||
packages:
|
||||
|
||||
- 'nut-server' if you have a 'standalone' or 'netserver' installation,
|
||||
- 'nut' if you have a 'netclient' installation.
|
||||
|
||||
Optionaly, you can also install the following:
|
||||
Optionally, you can also install the following:
|
||||
|
||||
- 'nut-cgi', if you need the CGI (HTML) option,
|
||||
- 'nut-devel', if you need the development files.
|
||||
|
||||
|
||||
[[Suse]]
|
||||
Suse / Opensuse
|
||||
[[SUSE]]
|
||||
SUSE / openSUSE
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
NOTE: NUT is packaged and well maintained in these systems.
|
||||
The official Suse packager is part of the NUT Team.
|
||||
The official SUSE packager is part of the NUT Team.
|
||||
|
||||
Install the 'nut-classic' package, and optionaly the following:
|
||||
Install the 'nut-classic' package, and optionally the following:
|
||||
|
||||
- 'nut-drivers-net', if you need the snmp-ups or the netxml-ups drivers,
|
||||
- 'nut-cgi', if you need the CGI (HTML) option,
|
||||
- 'nut-devel', if you need the development files,
|
||||
|
||||
NOTE: Suse and Opensuse users can use the
|
||||
NOTE: SUSE and openSUSE users can use the
|
||||
link:http://software.opensuse.org/search?baseproject=ALL&p=1&q=nut[one-click install method]
|
||||
to install NUT.
|
||||
|
||||
|
@ -270,13 +279,13 @@ Red Hat, Fedora and CentOS
|
|||
NOTE: NUT is packaged and well maintained in these systems.
|
||||
The official Red Hat packager is part of the NUT Team.
|
||||
|
||||
Using your prefered method (yum, Add/Remove Software, ...), install one of the
|
||||
Using your preferred method (yum, Add/Remove Software, ...), install one of the
|
||||
two below packages:
|
||||
|
||||
- 'nut' if you have a 'standalone' or 'netserver' installation,
|
||||
- 'nut-client' if you have a 'netclient' installation.
|
||||
|
||||
Optionaly, you can also install the following:
|
||||
Optionally, you can also install the following:
|
||||
|
||||
- 'nut-cgi', if you need the CGI (HTML) option,
|
||||
- 'nut-xml', if you need the netxml-ups driver,
|
||||
|
@ -292,25 +301,47 @@ You can either install NUT as a binary package or as a port.
|
|||
Binary package
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
To install the main component, use the following command:
|
||||
To install NUT as a package execute:
|
||||
|
||||
# pkg_add -r nut
|
||||
# pkg install nut
|
||||
|
||||
Port
|
||||
^^^^
|
||||
|
||||
The port is located under /usr/ports/sysutils/nut.
|
||||
To install it, use the following command:
|
||||
The port is located under +sysutils/nut+.
|
||||
Use +make config+ to select configuration options, e.g. to build the optional CGI scripts.
|
||||
To install it, use:
|
||||
|
||||
# cd /usr/ports/sysutils/nut/ && make install clean
|
||||
# make install clean
|
||||
|
||||
You have to define WITH_NUT_CGI to build the optional CGI scripts.
|
||||
USB UPS on FreeBSD
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Optionaly, you can also install the following ports:
|
||||
For USB UPS devices the NUT package/port installs devd rules in +/usr/local/etc/devd/nut-usb.conf+ to set USB device permissions. 'devd' needs to be restarted for these rules to apply:
|
||||
|
||||
- sysutils/nut-snmp, for the SNMP driver,
|
||||
- sysutils/nut-usb, for the USB drivers,
|
||||
- sysutils/nut-libupsclient, for the upsclient library.
|
||||
# service devd restart
|
||||
|
||||
(Re-)connect the device after restarting 'devd' and check that the USB device has the proper
|
||||
permissions. Check the last entries of the system message buffer. You should
|
||||
find an entry like
|
||||
|
||||
# dmesg | tail
|
||||
[...]
|
||||
ugen0.2: <INNO TECH USB to Serial> at usbus0
|
||||
|
||||
The device file must be owned by group +uucp+ and must be group
|
||||
read-/writable. In the example from above this would be
|
||||
|
||||
# ls -Ll /dev/ugen0.2
|
||||
crw-rw---- 1 root uucp 0xa5 Mar 12 10:33 /dev/ugen0.2
|
||||
|
||||
If the permissions are not correct, verify that your device is registered in
|
||||
+/usr/local/etc/devd/nut-usb.conf+. The vendor and product id can be found
|
||||
using:
|
||||
|
||||
# usbconfig -u 0 -a 2 dump_device_desc
|
||||
|
||||
where +-u+ specifies the USB bus number and +-a+ specifies the USB device index.
|
||||
|
||||
|
||||
You are now ready to configure NUT, and start testing and using it.
|
||||
|
|
|
@ -38,7 +38,7 @@ S: Maintained: apcsmart, belkin, bestups, cyberpower, dummycons,
|
|||
P: Arnaud Quette
|
||||
M: aquette.dev@gmail.com
|
||||
M: ArnaudQuette@eaton.com
|
||||
S: Maintained or Supported: dummy-ups, usbhid-ups, mge-shut, newmge-shut
|
||||
S: Maintained or Supported: dummy-ups, usbhid-ups, mge-shut
|
||||
mge-utalk, snmp-ups, ...
|
||||
|
||||
P: Fabio Di Niro
|
||||
|
|
276
Makefile.am
276
Makefile.am
|
@ -5,22 +5,33 @@ ACLOCAL_AMFLAGS = -I m4
|
|||
|
||||
# subdirectories to build and distribute. The order matters, as
|
||||
# several subdirectories depend on stuff in "common" or tools being built first
|
||||
SUBDIRS = include common clients conf data tools docs drivers \
|
||||
SUBDIRS = include common clients conf data docs drivers tools \
|
||||
lib scripts server tests
|
||||
|
||||
# Automatically update the libtool script if it becomes out-of-date
|
||||
# See https://www.gnu.org/software/libtool/manual/html_node/LT_005fINIT.html
|
||||
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||
libtool: $(LIBTOOL_DEPS)
|
||||
$(SHELL) ./config.status libtool
|
||||
|
||||
# COPYING is included automatically.
|
||||
EXTRA_DIST = INSTALL.nut LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# flags to pass to ./configure when calling "make distcheck" and "make
|
||||
# distcheck-light". Try to check as many features as possible! Also
|
||||
# need to give hotplug-dir and udev-dir, so that staged install does
|
||||
# not fail.
|
||||
# need to give augeas-lenses-dir, hotplug-dir and udev-dir, so that
|
||||
# staged install does not fail.
|
||||
|
||||
DISTCHECK_FLAGS = --with-all --with-ssl --with-doc=auto
|
||||
DISTCHECK_LIGHT_FLAGS = --with-all=auto --with-ssl=auto --with-doc=auto
|
||||
DISTCHECK_VALGRIND_FLAGS = --with-all=auto --with-ssl=auto --with-doc=skip --with-valgrind CXXFLAGS='$(CXXFLAGS) -g' CFLAGS='$(CFLAGS) -g'
|
||||
|
||||
DISTCHECK_CONFIGURE_FLAGS = ${DISTCHECK_FLAGS} \
|
||||
--with-systemdsystemunitdir='$${prefix}/lib/systemd/system' \
|
||||
--with-systemdshutdowndir='$${prefix}/lib/systemd/system-shutdown' \
|
||||
--with-systemdtmpfilesdir='$${prefix}/usr/lib/tmpfiles.d' \
|
||||
--with-augeas-lenses-dir='$${prefix}/usr/share/augeas/lenses' \
|
||||
--with-hotplug-dir='$${prefix}/etc/hotplug' \
|
||||
--with-udev-dir='$${prefix}/etc/udev' \
|
||||
--with-devd-dir='$${prefix}/etc/devd'
|
||||
|
@ -28,6 +39,10 @@ DISTCHECK_CONFIGURE_FLAGS = ${DISTCHECK_FLAGS} \
|
|||
distcheck-light:
|
||||
$(MAKE) $(AM_MAKEFLAGS) DISTCHECK_FLAGS="$(DISTCHECK_LIGHT_FLAGS)" distcheck
|
||||
|
||||
# Make a distcheck (and check in particular) with enabled valgrind and debug info
|
||||
memcheck distcheck-valgrind:
|
||||
$(MAKE) $(AM_MAKEFLAGS) DISTCHECK_FLAGS="$(DISTCHECK_VALGRIND_FLAGS)" distcheck
|
||||
|
||||
# workaround the dist generated files that are also part of the distribution
|
||||
# Note that distcleancheck is disabled for now, while waiting for a proper
|
||||
# solution, that do not break older unix systems
|
||||
|
@ -36,20 +51,182 @@ distcheck-light:
|
|||
distcleancheck:
|
||||
@:
|
||||
|
||||
# Quick alias for root dir recipe:
|
||||
realclean: maintainer-clean
|
||||
|
||||
# Files made by our targets:
|
||||
CLEANFILES = *-spellchecked cppcheck*.xml
|
||||
DISTCLEANFILES = ChangeLog
|
||||
|
||||
# Most of the files generated by custom rules in the configure script
|
||||
# or by autogen.sh are cleaned by the Makefile.am in their directories.
|
||||
# Files below are re-created by running `configure` script and may be
|
||||
# wiped by a `make distclean`:
|
||||
DISTCLEANFILES += config.log configure~
|
||||
#???# configure.ac~
|
||||
DISTCLEANFILES += include/config.h.in~
|
||||
|
||||
# Files made by autotools and common rituals of the configure script,
|
||||
# these are needed to run the configure script itself so are not wiped
|
||||
# by a mere `make distclean`; most of these are copied by autotools
|
||||
# from their installation, or made by `automake` etc. on the system
|
||||
# which generates `configure`; rebuilding NUT after deleting these
|
||||
# requires `autogen.sh` script to be re-run (and tools available):
|
||||
MAINTAINERCLEANFILES = INSTALL
|
||||
MAINTAINERCLEANFILES += aclocal.m4 config.guess config.sub
|
||||
MAINTAINERCLEANFILES += configure
|
||||
MAINTAINERCLEANFILES += depcomp install-sh ltmain.sh test-driver
|
||||
MAINTAINERCLEANFILES += m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4
|
||||
MAINTAINERCLEANFILES += Makefile.in .dirstamp include/config.h.in
|
||||
|
||||
# Executed after default rules
|
||||
maintainer-clean-local:
|
||||
rm -f missing || true
|
||||
|
||||
# Do not let $SUBDIRS/Makefile rules delete their local .deps because
|
||||
# this breaks our ability to clean up (e.g. some common/.../*.Plo files
|
||||
# are included by generated Makefiles from other subdirectories, so they
|
||||
# should be available during their clean-up). Just in case, we make sure
|
||||
# here that their sub-distcleans complete first.
|
||||
distclean-local:
|
||||
@for DIR in $(SUBDIRS) ; do \
|
||||
if test -f "$${DIR}/Makefile" ; then \
|
||||
echo " DISTCLEAN in $${DIR}" >&2 ; \
|
||||
( cd "$${DIR}" && $(MAKE) -s distclean ) || exit ; \
|
||||
fi ; \
|
||||
done
|
||||
rm -rf .inst tmp autom4te.cache
|
||||
find "$(builddir)" -type d -name '.deps' | while read DIR ; do rm -rf "$${DIR}" ; done
|
||||
|
||||
# Hook the documentation building and validating recipes
|
||||
# Note: these are optionally available (as determined during configure runs)
|
||||
spellcheck spellcheck-interactive:
|
||||
@RES=0; \
|
||||
(cd $(builddir)/docs && $(MAKE) -s $@) || RES=$$? ; \
|
||||
(cd $(builddir)/docs/man && $(MAKE) -s $@) || RES=$$? ; \
|
||||
(cd $(builddir)/conf && $(MAKE) -s $@) || RES=$$? ; \
|
||||
(cd $(builddir)/data && $(MAKE) -s $@) || RES=$$? ; \
|
||||
exit $$RES
|
||||
|
||||
# Note: the "all-docs" and "check-docs" targets may require tools not
|
||||
# found by `configure` script (and so avoided by conventional recipes)
|
||||
# such as PDF generators, so it should only be called at developer's
|
||||
# discretion, choice and risk. The "check-man" targets covers source
|
||||
# texts, man pages and HTML rendering of man pages, as enabled by tools.
|
||||
doc spellcheck-sortdict \
|
||||
all-docs check-docs \
|
||||
man all-man man-man check-man man-html all-html:
|
||||
cd $(builddir)/docs && $(MAKE) $@
|
||||
|
||||
check-NIT check-NIT-devel:
|
||||
cd $(builddir)/tests/NIT && $(MAKE) $@
|
||||
|
||||
# This target adds syntax-checking for committed shell script files,
|
||||
# to avoid surprises and delays in finding fatal typos after packaging
|
||||
###
|
||||
### Note: currently, shellcheck target calls check-scripts-syntax
|
||||
### so when both are invoked at once, in the end the check is only
|
||||
### executed once. Later it is anticipated that shellcheck would
|
||||
### be implemented by requiring, configuring and calling the tool
|
||||
### named "shellcheck" for even more code inspection and details.
|
||||
### Still, there remains value in also checking the script syntax
|
||||
### by the very version of the shell interpreter that would run
|
||||
### these scripts in production usage of the resulting packages.
|
||||
###
|
||||
check-scripts-syntax:
|
||||
@echo 'NOTE: modern bash complains about scripts using backticks (warning not error), which we ignore in NUT codebase for portability reasons: `...` obsolete, use $$(...)'
|
||||
@RUNBASH=bash; if [ -x /bin/bash ]; then RUNBASH=/bin/bash ; else if [ -x /usr/bin/env ] ; then RUNBASH="/usr/bin/env bash"; fi; fi ; \
|
||||
for F in `git ls-files || find . -type f` ; do \
|
||||
case "`file "$$F"`" in \
|
||||
*"Bourne-Again shell script"*) ( set -x ; $$RUNBASH -n "$$F" ; ) ;; \
|
||||
*"POSIX shell script"*|*"shell script"*) ( set -x ; /bin/sh -n "$$F" ; ) ;; \
|
||||
esac || { RES=$$? ; echo "ERROR: Syntax check failed for script file: $$F" >&2 ; exit $$RES ; } ; \
|
||||
done
|
||||
@echo 'SUCCESS: Shell scripts syntax is acceptable, no fatal issues were found'
|
||||
|
||||
shellcheck-disclaimer:
|
||||
@echo "==============================================================================="
|
||||
@echo "NOTICE: 'make shellcheck' is currently an alias for 'make check-scripts-syntax'"
|
||||
@echo "Later it may become a call to the real shellcheck tool (if available on the"
|
||||
@echo "build system during the configure phase)"
|
||||
@echo "==============================================================================="
|
||||
|
||||
# Note: currently not part of shellcheck target, because the script below
|
||||
# can test the logic with numerous SHELL_PROGS in a CI setting, and because
|
||||
# check-scripts-syntax probably has checked the basic syntax above already.
|
||||
shellcheck-nde:
|
||||
cd $(srcdir)/tests && SERVICE_FRAMEWORK="selftest" ./nut-driver-enumerator-test.sh
|
||||
|
||||
shellcheck: shellcheck-disclaimer check-scripts-syntax
|
||||
|
||||
CPPCHECK = @CPPCHECK@
|
||||
if HAVE_CPPCHECK
|
||||
cppcheck: cppcheck-cxx11.xml cppcheck-c99.xml
|
||||
|
||||
# Let the analysis get regenerated due to any change in source;
|
||||
# but note that with our different make implementations to support,
|
||||
# we can not either $(shell find ...) nor blindly say e.g. *.cpp
|
||||
# for each FS structure layer because e.g. there are no ./*.cpp
|
||||
# in the root dir of the codebase (and so make complains there is
|
||||
# `No rule to make target `*.cpp', needed by `cppcheck-cxx11.xml'`)
|
||||
#
|
||||
# Note that the actual `cppcheck` scan finds all files it likes
|
||||
# (so if CPPCHECK_SRC_* misses something, it just won't trigger
|
||||
# automagically a rebuild of the XML in developer working cycles).
|
||||
CPPCHECK_SRC_H = $(top_srcdir)/*/*.h $(top_srcdir)/*/*/*.h
|
||||
# CPPCHECK_SRC_H += $(top_srcdir)/*.h
|
||||
|
||||
CPPCHECK_SRC_C = $(top_srcdir)/*/*.c $(top_srcdir)/*/*/*.c
|
||||
# CPPCHECK_SRC_C += $(top_srcdir)/*.cpp
|
||||
|
||||
CPPCHECK_SRC_CXX = $(top_srcdir)/*/*.cpp
|
||||
# CPPCHECK_SRC_CXX += $(top_srcdir)/*.cpp $(top_srcdir)/*/*/*.cpp
|
||||
|
||||
cppcheck-cxx11.xml: $(CPPCHECK_SRC_CXX) $(CPPCHECK_SRC_H)
|
||||
$(CPPCHECK) --std=c++11 --enable=all --inconclusive --xml --xml-version=2 . 2>$@
|
||||
|
||||
cppcheck-c99.xml: $(CPPCHECK_SRC_C) $(CPPCHECK_SRC_H)
|
||||
$(CPPCHECK) --std=c99 --enable=all --inconclusive --xml --xml-version=2 . 2>$@
|
||||
else !HAVE_CPPCHECK
|
||||
cppcheck:
|
||||
@echo "CPPCHECK analysis not available since 'cppcheck' was not found."
|
||||
endif !HAVE_CPPCHECK
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Automatically generate the ChangeLog from Git logs:
|
||||
MAINTAINERCLEAN_FILES = ChangeLog
|
||||
MAINTAINERCLEANFILES += ChangeLog
|
||||
|
||||
# Older boundary of the ChangeLog commits range
|
||||
# It can be a tag ('v2.2.0'), a commit hash, a date, ...
|
||||
# See gitrevisions for more information on specifying ranges
|
||||
GITLOG_START_POINT=v2.6.0
|
||||
|
||||
# Force ChangeLog regeneration upon make dist (due to nonexistant 'dummy-stamp'),
|
||||
# in case it has already been generated previously
|
||||
# Note that the script is hard-coded to generate "ChangeLog" in the current dir
|
||||
dummy-stamp:
|
||||
ChangeLog: tools/gitlog2changelog.py dummy-stamp
|
||||
$(top_srcdir)/tools/gitlog2changelog.py v2.6.0 || \
|
||||
echo "gitlog2changelog.py failed to generate the ChangeLog. See https://github.com/networkupstools/nut/commits/master" > $@
|
||||
cd $(top_builddir) && \
|
||||
./tools/gitlog2changelog.py $(GITLOG_START_POINT) || \
|
||||
{ echo "gitlog2changelog.py failed to generate the ChangeLog. See https://github.com/networkupstools/nut/commits/master" > $@ ; }
|
||||
|
||||
nut_version.h include/nut_version.h:
|
||||
cd $(abs_top_builddir)/include && $(MAKE) nut_version.h
|
||||
|
||||
tools/gitlog2changelog.py: tools/gitlog2changelog.py.in
|
||||
cd $(@D) && $(MAKE) -s $(@F)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Maintainers targets: distribution signature and hashes
|
||||
dist-sig:
|
||||
nut-@PACKAGE_VERSION@.tar.gz: dist
|
||||
nut-@PACKAGE_VERSION@.tar.gz.sig: dist-sig
|
||||
nut-@PACKAGE_VERSION@.tar.gz.md5 nut-@PACKAGE_VERSION@.tar.gz.sha256: dist-hash
|
||||
|
||||
dist-sig: nut-@PACKAGE_VERSION@.tar.gz
|
||||
rm -f nut-@PACKAGE_VERSION@.tar.gz.sig
|
||||
gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz
|
||||
|
||||
dist-hash:
|
||||
dist-hash: nut-@PACKAGE_VERSION@.tar.gz
|
||||
md5sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.md5
|
||||
sha256sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.sha256
|
||||
|
||||
|
@ -91,14 +268,14 @@ install-dirs:
|
|||
@echo "Warning: 'make install-dirs' is deprecated."
|
||||
@echo "Use 'make installdirs' instead."
|
||||
@echo $(WARN)
|
||||
make installdirs
|
||||
$(MAKE) installdirs
|
||||
cgi build-cgi install-cgi install-cgi-dir install-cgi-bin \
|
||||
install-cgi-man install-cgi-conf install-cgi-html:
|
||||
@echo "Error: 'make $@' no longer exists."
|
||||
@echo "Use './configure --with-cgi' instead."
|
||||
install-lib:
|
||||
@echo "Error: 'make $@' no longer exists."
|
||||
@echo "Use './configure --with-lib' instead."
|
||||
@echo "Use './configure --with-dev' instead."
|
||||
usb build-usb install-usb:
|
||||
@echo "Error: 'make $@' no longer exists."
|
||||
@echo "Use './configure --with-usb' instead."
|
||||
|
@ -107,20 +284,65 @@ snmp build-snmp install-snmp install-snmp-mgr install-snmp-man:
|
|||
@echo "Use './configure --with-snmp' instead."
|
||||
setver:
|
||||
@echo "Error: 'make setver' no longer exists."
|
||||
@echo "Edit configure.in to set version number."
|
||||
package:
|
||||
if test `uname -s` = "HP-UX"; then \
|
||||
cd scripts/HP-UX; \
|
||||
make package; \
|
||||
mv NUT_HPUX_package.depot NUT_HPUX_package@PACKAGE_VERSION@.depot; \
|
||||
else \
|
||||
if test `uname -s` = "SunOS"; then \
|
||||
make; \
|
||||
rm -rf @prefix@; \
|
||||
make install; \
|
||||
cd scripts/Solaris; \
|
||||
make package; \
|
||||
make uninstall; \
|
||||
rm -rf @prefix@; \
|
||||
fi; \
|
||||
fi;
|
||||
@echo "Edit configure.ac to set version number."
|
||||
|
||||
# Clean the dist tarball and packages
|
||||
MAINTAINERCLEANFILES_DISTBALL = nut-*.tar.gz
|
||||
# HP-UX:
|
||||
MAINTAINERCLEANFILES_PACKAGES = NUT_HPUX_package@PACKAGE_VERSION@.depot
|
||||
# AIX as below, and RedHat-compatible (cover binary and source packages):
|
||||
MAINTAINERCLEANFILES_PACKAGES += nut*rpm
|
||||
# Debian-compatible (cover binary and source packages):
|
||||
MAINTAINERCLEANFILES_PACKAGES += nut*deb
|
||||
# Solaris SVR4 package archives:
|
||||
MAINTAINERCLEANFILES_PACKAGES += NUT_solaris_*_package@PACKAGE_VERSION@.local.gz
|
||||
# Newer Solaris IPS (aka "pkg(5)" format archives)
|
||||
MAINTAINERCLEANFILES_PACKAGES += *.p5p
|
||||
|
||||
MAINTAINERCLEANFILES += $(MAINTAINERCLEANFILES_DISTBALL)
|
||||
MAINTAINERCLEANFILES += $(MAINTAINERCLEANFILES_PACKAGES)
|
||||
|
||||
package: dist
|
||||
DESTDIR="$(abs_builddir)/_install_pkgprotodir" ; export DESTDIR; \
|
||||
rm -rf "$$DESTDIR"; \
|
||||
case "`uname -s`" in \
|
||||
"HP-UX") \
|
||||
( cd scripts/HP-UX && \
|
||||
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" package && \
|
||||
mv NUT_HPUX_package.depot $(abs_top_builddir)/NUT_HPUX_package@PACKAGE_VERSION@.depot ) ;; \
|
||||
"SunOS") \
|
||||
$(MAKE) $(AM_MAKEFLAGS) && \
|
||||
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" install && \
|
||||
( cd scripts/Solaris && \
|
||||
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" package ) && \
|
||||
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" uninstall && \
|
||||
rm -rf "$$DESTDIR" || \
|
||||
{ echo "FAILED to produce SunOS packages, inspect '$$DESTDIR' for clues" >&2 ; exit 1; } ;; \
|
||||
"AIX") \
|
||||
if test -d /usr/src/packages/SPECS -a -w /usr/src/packages/SPECS ; then : ; else echo "Can not write to /usr/src/packages/SPECS" >&2 ; exit 1; fi ; \
|
||||
if test -d /usr/src/packages/SOURCES -a -w /usr/src/packages/SOURCES ; then : ; else echo "Can not write to /usr/src/packages/SOURCES" >&2 ; exit 1; fi ; \
|
||||
$(MAKE) $(AM_MAKEFLAGS) dist && \
|
||||
cp scripts/Aix/nut-aix.spec /usr/src/packages/SPECS && \
|
||||
cp scripts/Aix/nut.init nut-@PACKAGE_VERSION@.tar.gz /usr/src/packages/SOURCES && \
|
||||
rpm -ba /usr/src/packages/SPECS/nut-aix.spec && \
|
||||
mv /usr/src/packages/RPMS/nut*rpm $(abs_top_builddir)/ ;; \
|
||||
*) echo "Unsupported OS for 'make $@' (no recipe bound)" >&2; exit 1;; \
|
||||
esac
|
||||
|
||||
print-MAINTAINERCLEANFILES print-REALCLEANFILES:
|
||||
@echo $(MAINTAINERCLEANFILES)
|
||||
|
||||
print-DISTCLEANFILES:
|
||||
@echo $(DISTCLEANFILES)
|
||||
|
||||
# TODO: Recursive mode to consider patterns defined in sub-dir makefiles
|
||||
git-realclean-check:
|
||||
@if test -e .git && (command -v git); then \
|
||||
git status --ignored || while read F ; do \
|
||||
for P in $(MAINTAINERCLEANFILES) ; do \
|
||||
case "$$F" in \
|
||||
*/$$P) exit 1 ;; \
|
||||
esac ; \
|
||||
done; \
|
||||
done ; \
|
||||
fi
|
||||
|
|
723
Makefile.in
723
Makefile.in
File diff suppressed because it is too large
Load diff
642
NEWS
642
NEWS
|
@ -1,7 +1,601 @@
|
|||
If you're upgrading from an earlier version, see the UPGRADING file.
|
||||
|
||||
For a complete and more detailed list of changes, please refer to the
|
||||
ChangeLog file.
|
||||
ChangeLog file (generated for release archives), or to the Git version
|
||||
control history for "live" codebase.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Release notes for NUT 2.8.0 - what's new since 2.7.4:
|
||||
|
||||
NOTE: Earlier discussions (mailing list threads, GitHub issues, etc.) could
|
||||
refer to this change set (too long in the making) as NUT 2.7.5.
|
||||
|
||||
- New (optional) keywords for configuration files were added,
|
||||
so existing NUT 2.7.x builds would not accept them if some
|
||||
deployments switch versions back and forth -- due to this,
|
||||
semantically the version was bumped to NUT 2.8.x.
|
||||
|
||||
- Add support for openssl-1.1.0 (Arjen de Korte)
|
||||
|
||||
- libusb-1.0 API support in addition to libusb-0.1 API [#300]
|
||||
|
||||
- Add support for `DISABLE_WEAK_SSL=true` in upsd.conf to disable older/weaker
|
||||
SSL/TLS protocols and ciphers: when NUT is built against relatively recent
|
||||
versions of OpenSSL or NSS it will be restricted to TLSv1.2 or better.
|
||||
For least-surprise, currently defaults to `false` and complains in log
|
||||
[PR #1043]
|
||||
|
||||
- Add support for `ALLOW_NO_DEVICE=true` (as an upsd.conf flag or environment
|
||||
variable passed from caller of the program), to allow starting the data
|
||||
server initially without any device configurations and reloading it later
|
||||
to apply config changes on the fly [PR #766]
|
||||
|
||||
- Add support for `debug_min=NUM` setting (ups.conf, upsd.conf, upsmon.conf)
|
||||
to specify the minimum debug verbosity for daemons. This allows "in-vivo"
|
||||
troubleshooting of service daemons without editing init scripts or service
|
||||
unit definitions.
|
||||
|
||||
- Improve support for upsdrvctl for managing of numerous device configs,
|
||||
including default "maxretry=3" and a "nowait" option to complete the
|
||||
"start of everything" mode after triggering the drivers and not waiting
|
||||
for them to complete initializing. This matters on systems that monitor
|
||||
from dozens to hundreds of devices.
|
||||
|
||||
- Drivers support a new value for `synchronous` setting, which is the
|
||||
new default now: `auto`. Initially after driver start-up this mode
|
||||
acts as the older default `off`, but would fall back to `on` in case
|
||||
the driver fails to send reports to `upsd` by overflowing the socket
|
||||
buffer in async mode -- so the next connections of this driver uptime
|
||||
would be synchronized (potentially slower, but safer -- blocking on
|
||||
writes to the data server). This adaptation would primarily impact
|
||||
and benefit devices with many (hundreds of) data points, such as
|
||||
ePDUs and daisy chains. [issue #1309, PR #1315]
|
||||
|
||||
- Daemons such as upsd, upsmon, upslog, and device drivers previously
|
||||
implied that enabled debugging (or upslog to stdout) means foreground
|
||||
running, otherwise the daemon was always sent to the background.
|
||||
Now there are explicit options for this (`-F`/`-B`), although default
|
||||
behavior is retained. This change is used for simplified service unit
|
||||
definitions.
|
||||
|
||||
- Improvements for device discovery or driver "lock-picking", including
|
||||
general support for:
|
||||
* "Standalone" mode (`-s` option), to monitor a device which is not
|
||||
detailed or mentioned in ups.conf
|
||||
* `NUT_ALTPIDPATH` and `NUT_STATEPATH` environment variables to override
|
||||
the paths built into the driver binary [PR #473 and #507]
|
||||
* "Driver data dump" mode (`-d` option), to poll a device for one or
|
||||
few ('update_count' ) loops, report discovered values (dump the data
|
||||
tree in upsc-like format), and exit. This complements the `nut-scanner`
|
||||
for finding and identifying devices.
|
||||
|
||||
- support for new devices:
|
||||
* IBM 6000 VA LCD 4U Rack UPS; 5396-1Kx (USB)
|
||||
* Phoenix Contact QUINT-UPS model 2320461 (Modbus)
|
||||
* Tripp-Lite SU3000LCD2UHV (USB; protocol 1330)
|
||||
* Emerson Avocent PM3000 PDU (SNMP)
|
||||
* HPE ePDU (SNMP)
|
||||
|
||||
- nutdrv_qx: enhanced estimation of remaining battery runtime based
|
||||
on speed of voltage drop, which varies as they age [PR #1027]
|
||||
|
||||
- nutdrv_qx: several subdrivers added or improved, including:
|
||||
* "snr" subdriver with USB connection, for SNR-UPS-LID-XXXX [PR #1008].
|
||||
Note that end-users should reference explicitly the `snr` subdriver
|
||||
in their `ups.conf` settings because of USB chip using the same
|
||||
values of VendorID/ProductID as fabula_subdriver, fuji_subdriver,
|
||||
and krauler_subdriver.
|
||||
* "hunnox" subdriver, as a dialect of earlier "fabula" [PR #638]
|
||||
adds support for Hunnox HNX-850 with USB connection and reported to work
|
||||
for Powercool, Iron Guardian, ARES devices and possibly many others from
|
||||
discussions linking to the pull request which introduced the driver.
|
||||
* "phoenixtec" subdriver for Masterguard A and E series, device series
|
||||
A700/1000/2000/3000(-19) and E40/60/100(-19). [PR #975]
|
||||
* "ablerex" subdriver provided by the OEM vendor, note that it replaces
|
||||
"krauler_subdriver" as default handler for VID:PID 0xffff:0x0000
|
||||
[PR #1135]
|
||||
* Legrand HID defined and handled by "krauler_subdriver" by default
|
||||
[PR #1075, issue #616]
|
||||
* add new "armac" subdriver, tested with Armac R/2000I/PSW, but should
|
||||
support other UPSes that work with "PowerManagerII" software from
|
||||
Richcomm Technologies from around 2004-2005 [PR #1239, issue #1238]
|
||||
|
||||
- microsol-apc (starting at version 0.68 as derived from solis 0.67):
|
||||
adding support for newer APC Back-UPS BR hardware, such as
|
||||
APC Back-UPS BZ1500, BZ2200BI and BZ2200I [PR #994]
|
||||
|
||||
- pijuice: added new i2c bus driver for PiJuice HAT, a battery UPS module
|
||||
for the Raspberry Pi systems [PR #730]
|
||||
|
||||
- huawei-ups2000: added new driver for USB (Linux 5.12+ so far) and Serial
|
||||
RS-232 Modbus device support of Huawei UPS2000/2000A (1kVA-3kVA) series,
|
||||
and possibly some related FSP UPS models. [PR #954]
|
||||
|
||||
- socomec_jbus: added new driver for modbus-based JBUS protocol over serial
|
||||
RS-232 for Socomec UPS (tested with a DIGYS 3/3 15kVA model, working
|
||||
on Linux x86-64 and Raspberry Pi 3 ARM). [PR #1313]
|
||||
|
||||
- adelsystem_cbi: added new driver for ADELSYSTEM CBI2801224A, an all-in-one
|
||||
12/24Vdc DC-UPS, which supports the modbus RTU communication protocol
|
||||
[PR #1282]
|
||||
|
||||
- generic_modbus: added new driver for TCP and Serial Modbus device support.
|
||||
The driver has been tested against PULS UPS (model UB40.241) via
|
||||
MOXA ioLogikR1212 (RS485) and ioLogikE1212 (TCP/IP), and configuration
|
||||
allows to map custom registers and addresses to NUT events [PR #1052]
|
||||
|
||||
- genericups: added support for FTTx battery backup devices, and new signal
|
||||
type mappings for the contact closure pins interpretation (RB for replace
|
||||
battery, BYPASS for disconnected battery, and "none" or NULL for signals
|
||||
to ignore) [PR #1061]
|
||||
|
||||
- add devices to HCL/DDL:
|
||||
* APC Back-UPS CS (USB)
|
||||
* CPS CP1500EPFCLCD (USB)
|
||||
* CPS EC350G, EC750G (USB)
|
||||
* CPS PR2200LCDRT2U (SNMP)
|
||||
* Eaton ATS 16 and 30 (SNMP)
|
||||
* Eaton 5E2200VA (USB)
|
||||
* Eaton 9PX Split Phase 6/8/10 kVA (XML/USB/SHUT)
|
||||
* Eaton 9PX (XML/USB/SHUT)
|
||||
* Eaton Ellipse PRO 650 VA (USB)
|
||||
* Ippon Back Comfo Pro II 650/850/1050 (USB)
|
||||
* Numeric Digital 800 (USB)
|
||||
* Opti-UPS PS1500E (USB)
|
||||
* Powercool 350VA to 1600VA (USB)
|
||||
|
||||
- C++11 support in nutclient library and cppunit tests
|
||||
|
||||
- Added C++ testing mock for TcpClient class (nutclientmem/MemClientStub:
|
||||
data stored in local memory) [PR #1034]
|
||||
|
||||
- Dual Python 2 and 3 compatibility in development scripts; ability to
|
||||
run build activities and resulting built NUT programs on systems that
|
||||
do not have a binary named "python" [PR #1115 and some before it]
|
||||
|
||||
- Added Russian translation for NUT-Monitor GUI client [PR #806]
|
||||
|
||||
- Separated NUT-Monitor UI into two applications, NUT-Monitor-py2gtk2 and
|
||||
NUT-Monitor-py3qt5, suitable for two generations of Python ecosystem
|
||||
with their great differences; `NUT-Monitor` name is retained for wrapper
|
||||
script which calls one of these, such that the current system can execute
|
||||
[PRs #1310, #1354]
|
||||
|
||||
- Various USB driver families: expanded device-matching with "device" in
|
||||
addition to "bus" and generic USB fields. This is needed to support
|
||||
multiple attached devices that seem identical by other fields (e.g.
|
||||
same vendor, same model, same USB bus, and no serial number) [PR #974]
|
||||
|
||||
- Various USB driver families: Improved HID parsing for byte-stream to
|
||||
number conversions on different CPU architectures [PR #1024]
|
||||
|
||||
- Various USB HID driver families: added support for composite devices
|
||||
utilizing interface greater than 0 for the UPS interface [PR #1044]
|
||||
|
||||
- usbhid-ups:
|
||||
* added generic framework for fixing Report Descriptors which can be
|
||||
used for different manufacturers by adding code to the appropriate
|
||||
subdriver rather than polluting the main code with UPS specific
|
||||
exceptions, and applied fixes for known mistakes in (some releases
|
||||
of firmware for) CyberPower CPS*EPFCLCD [issue #439, PR #1245]
|
||||
* added `onlinedischarge` option for UPSes that report `OL+DISCHRG`
|
||||
when wall power is lost [PR #811]
|
||||
* changed detection of VendorID 0x06da handling of which is claimed
|
||||
by Liebert/Phoenixtec HID historically, and MGE HID (for AEG PROTECT
|
||||
NAS UPSes) since NUT 2.7.4, so that the higher-priority MGE subdriver
|
||||
would not grab each and all of the devices exposing that ID [PR #1357]
|
||||
* CPS HID: add input.frequency and output.frequency
|
||||
* OpenUPS2: only check OEM Information string once (fewer log messages)
|
||||
* Liebert GXT4 USB VID:PID [10AF:0000]
|
||||
* add battery voltage and input/output transfer voltage and frequency
|
||||
in Liebert/Phoenixtec HID mapping, to support PowerWalker VFI 2000 TGS
|
||||
better [PR #564, issue #560]
|
||||
* add a little delay between multicommands [PR #1228]
|
||||
* fix Eaton/MGE mapping for beeper handling
|
||||
* add IBM USB VID
|
||||
* add deep battery test for CyberPower OL3000RMXL2U
|
||||
* report the libusb version used
|
||||
* fixed CPU architecture dependent bitmask math issues, causing wrong
|
||||
numbers interpreted from wire protocol data in Big-Endian LP64 builds
|
||||
(SPARC64, s390x, etc.) [issue #1023, PRs #1024, #1040, #1055, #1226]
|
||||
* add Delta UPS Amplon R Series, tested on R1K and R3K model [PR #987]
|
||||
* add Delta Minuteman UPS VID/PID [PR #1230, issues #555 and #1227]
|
||||
* add AMETEK Powervar UPM [PR #733]
|
||||
* add Tripplite AVR750U (ProductID 0x3024) [PR #963]
|
||||
* add Arduino HID device support with new arduino-hid subdriver [PR #1044]
|
||||
* add new salicru-hid subdriver, tested with Salicru SPS Home 850 VA
|
||||
[PR #1199, issue #732]
|
||||
* add new ever-hid subdriver to support EVER UPS devices (Sinline RT Series,
|
||||
Sinline RT XL Series, ECO PRO AVR CDS Series) [PR #431]
|
||||
* add ability to set `battery.mfr.date` for APC HID UPS [PR #1318]
|
||||
|
||||
- usbhid-ups / mge-shut: compute a realpower output load approximation for
|
||||
Eaton UPS when the needed data is not present
|
||||
|
||||
- snmp-ups:
|
||||
* APC ePDU MIB support
|
||||
* add `input.phase.shift` variable
|
||||
* add configurable write-able `ondelay` (`ups.delay.start`) and `offdelay`
|
||||
(`ups.delay.shutdown`) as timeticks support [PR #276]
|
||||
* outlet groups
|
||||
* fix the rounding / truncation of some values
|
||||
* add outlet.N.name for Eaton ePDU
|
||||
* add input.bypass.frequency for Eaton 3ph
|
||||
* fix support for Eaton 2-phase ("split phase") UPS
|
||||
* add flag to list currently loaded MIB-to-NUT mappings
|
||||
* fix input.L2.voltage on Eaton G2/G3 PDU
|
||||
* update Eaton Aphel Revelation MIB
|
||||
* support Raritan Dominion PX2 PDU
|
||||
* support Emerson Avocent PM3000 PDU
|
||||
* improve ALARM flag handling
|
||||
* add firmware version for new HPE Network card
|
||||
* add ups.load, battery.charge, input.{voltage,frequency} and output.voltage
|
||||
for CyberPower, as well as shutdown and other instant commands
|
||||
* several rounds of updates for Eaton devices, including new ATS and ePDU
|
||||
hardware families
|
||||
* fixed bit mask values for flags to surely use different numbers behind
|
||||
logical items (inevitably changing some of those macro symbols) [PR #1180]
|
||||
|
||||
- snmp-ups and nut-scanner should now support more SNMPv3 Auth and Priv
|
||||
protocols, as available at NUT build time [PRs #1165, #1172]
|
||||
|
||||
- nut-scanner: various improvements, including:
|
||||
* detection of libraries at runtime
|
||||
* tracing information
|
||||
* limiting parallelism (thread count) [PRs #1158, #1164]
|
||||
|
||||
- nut-ipmipsu: improve FreeIPMI support to build cleanly against older and
|
||||
newer FreeIPMI versions [PR #1179]
|
||||
|
||||
- the powerpanel driver now also supports CyberPower OR1500LCDRTXL2U with
|
||||
serial cable [PR #538]
|
||||
|
||||
- powercom driver: implement `nobt` config parameter to skip battery check
|
||||
on initialization/startup [PR #1256]
|
||||
|
||||
- netxml-ups:
|
||||
* Report calibration status
|
||||
* Fix for erroneous battery info (MGEXML/0.30) [PR #1069]
|
||||
|
||||
- solis: various improvements and fixes
|
||||
|
||||
- liebert-esp2: Correct battery V scaling, update docs, implement split-phase
|
||||
unit support [PR #412]
|
||||
|
||||
- tripplite: the "Tripp-Lite SmartUPS driver" as tested with SMART2200NET
|
||||
learned to discover the firmware generation and some device features,
|
||||
and in particular to manage power separately on one or two outlet groups
|
||||
[PR #1048]
|
||||
|
||||
- tripplite_usb: updated to recognize the "3005" protocol [PR #584]
|
||||
|
||||
- libnutclient: introduce getDevicesVariableValues() to improve performances
|
||||
when querying many devices (up to 15 times faster)
|
||||
|
||||
- nut-driver-enumerator: introduced a script for Linux systemd and
|
||||
Solaris/illumos SMF to inspect current NUT configuration in ups.conf
|
||||
file and generate service management instances for each currently
|
||||
tracked power device. Also introduced services to monitor the NUT
|
||||
configuration and react to editions of this file, mostly intended
|
||||
for deployments that do massive monitoring of dynamically changing
|
||||
farms of power devices.
|
||||
|
||||
- Fix File descriptors leaks by upsmon and upssched (SELinux errors)
|
||||
|
||||
- systemd support improvements:
|
||||
* POWEROFF_WAIT
|
||||
* reload support for upsd
|
||||
* Deliver systemd-tmpfiles config to pre-create runtime locations
|
||||
[PR #1037 for Issue #1030]
|
||||
* Update units with SyslogIdentifier=%N for better logging [PR #1054]
|
||||
|
||||
- upsrw: display the variable type beside ENUM / RANGE
|
||||
|
||||
- Added `PROTVER` as alias to `NETVER` to report the protocol version in use.
|
||||
Note that NUT codebase itself does not use this value and handles commands
|
||||
and reported errors individually [issue #1347]
|
||||
|
||||
- Implement status tracking for instant commands (instcmd) and variables
|
||||
settings (setvar): this allows to get the actual execution status from the
|
||||
driver, and is available in libraries and upscmd / upsrw [PR #659]
|
||||
|
||||
- Add support for extra parameter for instant commands, both in library and
|
||||
in upscmd
|
||||
|
||||
- dummy-ups can now specify `mode` as a driver argument, and separates the
|
||||
notion of `dummy-once` (new default for `*.dev` files that do not change)
|
||||
vs. `dummy-loop` (legacy default for `*.seq` and others) [issue #1385]
|
||||
|
||||
- new protocol variables:
|
||||
* `input.phase.shift`
|
||||
* `outlet.N.name`
|
||||
* `outlet.N.type`
|
||||
* `battery.voltage.cell.max`, `battery.voltage.cell.min`
|
||||
* `battery.temperature.cell.max`, `battery.temperature.cell.min`
|
||||
* `battery.status`
|
||||
* `battery.capacity.nominal`
|
||||
* `battery.date.maintenance` (and clarified purpose of `battery.date`)
|
||||
* `battery.packs.external` (and clarified purpose of `battery.packs`)
|
||||
* `experimental.*` namespace introduced [PR #1046] to facilitate
|
||||
introduction of NUT drivers and their data points for which we do
|
||||
not yet have concepts, or which the original driver contributors
|
||||
did not map well per suitable NUT standards: this allows to balance
|
||||
having those drivers available in the project vs. least surprise
|
||||
for when the explicitly experimental names are changed to something
|
||||
stable and standardized.
|
||||
* Proposed to track Date and Time values (still as "opaque strings")
|
||||
preferably in representations compatible to ISO-8601/RFC-3339 [PR #1076]
|
||||
(standards update; changes to actual codebase to be applied in the future)
|
||||
** New routine to convert a US formatted date string "MM/DD/YYYY" to an
|
||||
ISO 8601 Calendar date "YYYY-MM-DD" was added to snmp-ups.c [PR #1078]
|
||||
|
||||
- Master/Slave terminology was deprecated in favor of Primary/Secondary
|
||||
modes of `upsmon` client:
|
||||
* Respective keywords in the configuration files (`upsd.users` and
|
||||
`upsmon.conf`) are supported as backwards-compatible settings,
|
||||
but the obsoleted values are no longer documented.
|
||||
* Protocol keyword support was similarly updated, with `upsmon` now
|
||||
first trying to elevate privileges with `PRIMARY <ups>` request,
|
||||
and falling back to `MASTER <ups>` just in case it talks to an
|
||||
older build of an `upsd` server.
|
||||
* For the principle of least surprise, NUT codebase still exposes the
|
||||
`net_master()` (as handler for `MASTER` net command) in header and
|
||||
C code for the sake of existing linked binaries, and returns the
|
||||
`OK MASTER-GRANTED` line to the older client that invoked it.
|
||||
* Newly introduced `net_primary()` (as handler for `PRIMARY` net command)
|
||||
calls the exact same application logic, but returns `OK PRIMARY-GRANTED`
|
||||
line to the client.
|
||||
* Python binding updated to handle both cases, as the only found in-tree
|
||||
protocol consumer of the full-line text.
|
||||
* For more details see issue #840 and several pull requests referenced
|
||||
from it, and discussions on NUT mailing lists.
|
||||
|
||||
- Build fixes:
|
||||
* In general, numerous fixes were applied to ensure portability and avoid
|
||||
warnings (fixing a number of real bugs that caused them); CI was extended
|
||||
to keep the codebase free of those types of warnings which we have got
|
||||
rid of, requiring builds to succeed cleanly in several dozen combinations
|
||||
of compiler versions, C standard revisions (C99 upwards, though on many
|
||||
OSes with GNU99+ extensions), operating systems and CPU architectures.
|
||||
* Public CI introduced to automatically test every contribution (PR) and
|
||||
resulting increment of main NUT codebase, including Travis CI and LGTM.com
|
||||
services, and a Jenkins farm on virtual hardware donated by Fosshost.org;
|
||||
this augments testing earlier provided for some branches by Buildbot.
|
||||
* Added cppunit testing with valgrind for the C++ client library
|
||||
* Make targets added for shell script syntax checks for helper and service
|
||||
scripts
|
||||
* Make targets added for spellcheck and for maintenance of the dictionary,
|
||||
including incremental spellcheck to only parse recently edited text files
|
||||
* The AsciiDoc detection has been reworked to allow NUT to be built from
|
||||
source without requiring asciidoc/a2x (using pre-built man pages from
|
||||
the distribution tarball, for instance)
|
||||
* Makefile contents rearranged for more resilient out-of-tree and in-tree
|
||||
builds beside those made from the root workspace directory
|
||||
* Makefiles are tested with GNU Make and BSD Make to ensure portable recipes
|
||||
* More use of `pkg-config` to detect dependencies at configure time, as
|
||||
well as fail-safe detection of presence of pkg-config (and its macros)
|
||||
to survive and build without it too
|
||||
* "slibtool" pedantic nuances now supported, allowing an alternative to
|
||||
GNU libtool
|
||||
* Build scripts updated to remove obsoleted calls to cleanly work with
|
||||
autoconf-2.70 releases in 2020 (also works with 2.69 which was the
|
||||
earlier release since 2012)
|
||||
* Dynamic library loading used in certain programs and use-cases improved,
|
||||
especially for 64-bit vs 32-bit builds on multiple-bitness OSes
|
||||
* Logging routines like `upsdebugx()` were refactored as macros so there
|
||||
is slightly less overhead when logging is disabled [PRs #685 and #1100]
|
||||
* Numerous classes of compilation warnings eradicated, many of those being
|
||||
potential issues with implicit data type conversions and varied numeric
|
||||
type width, signedness, string buffer size, uninitialized variables or
|
||||
structure fields; some more in progress
|
||||
* Several logical errors found and fixed during this walk over codebase.
|
||||
* Cases where compilers were overly zealous and particular code was written
|
||||
the way wit was intentionally, including some comparisons that help with
|
||||
different-bitness builds but indeed seem superfluous in a certain single
|
||||
bitness, were commented and encased in pragmas to disable the warnings
|
||||
* Basic coding style (indentations, lack of trailing white space) applied
|
||||
per developer guide, but not automatically enforced/checked yet.
|
||||
|
||||
- Due to changes needed to resolve build warnings, mostly about mismatching
|
||||
data types for some variables, some structure definitions and API signatures
|
||||
of several routines had to be changed for argument types, return types,
|
||||
or both. Primarily this change concerns internal implementation details
|
||||
(may impact update of NUT forks with custom drivers using those), but a
|
||||
few changes also happened in header files installed for builds configured
|
||||
`--with-dev` and so may impact `upsclient` and `nutclient` (C++) consumers.
|
||||
At the very least, binaries for those consumers should be rebuilt to remain
|
||||
stable with NUT 2.8.0 and not mismatch int-type sizes and other arguments.
|
||||
|
||||
- As usual, more bugfixes, cleanup and improvements, on both source code
|
||||
and documentation.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Release notes for NUT 2.7.4 - what's new since 2.7.3:
|
||||
|
||||
- New class of device supported: ATS - Automatic Transfer Switch are now
|
||||
supported in NUT. Eaton ATS are supported, and APC ones should be too. Users
|
||||
are welcomed to test and provide feedback
|
||||
|
||||
- NUT command and variable naming scheme:
|
||||
* Document battery.charger.status, which will in time replace the historic
|
||||
CHRG and DISCHRG flags published in ups.status
|
||||
* Many extensions to support outlets groups, thresholds / alarms (ambient,
|
||||
input, output, outlet and outlet.group)
|
||||
|
||||
- support for new devices:
|
||||
AEG PROTECT B / NAS
|
||||
APC ATS AP7724 (should be supported)
|
||||
Asium P700
|
||||
Eaton ATS
|
||||
Eaton 5E 1100iUSB
|
||||
Eaton E Series DX UPS 1-20 kVA
|
||||
Eaton Powerware 9125-5000g
|
||||
Electrys UPS 2500
|
||||
Fideltronic INIGO Viper 1200
|
||||
Legrand Keor Multiplug
|
||||
LYONN CTB-800V
|
||||
Micropower LCD 1000
|
||||
NHS Laser Senoidal 5000VA
|
||||
Sweex model P220
|
||||
TS Shara
|
||||
Various APCUPSD-controlled APC devices
|
||||
|
||||
- snmp-ups:
|
||||
* Improve automatic detection algorithm
|
||||
* Provide access to Net-SNMP timeout and retries
|
||||
* Proper handling of integer RW variables
|
||||
* Implement support for alarms, through ups.alarm and outlet.n.alarm
|
||||
* Improve log/debug output trace
|
||||
* Fix loss of precision when setting values, using upsrw
|
||||
* Support for outlets group management
|
||||
* Many improvements and simplification
|
||||
* Add support for Tripplite units using IETF mib
|
||||
* Improve communication staleness detection and recovery
|
||||
* Add devices MAC address publication
|
||||
* Register values enumerations, when available
|
||||
* Many improvements and fixes to the SNMP subdriver creation script
|
||||
|
||||
- Eaton:
|
||||
* 3ph SNMP:
|
||||
Many improvements to Powerware / XUPS MIB, for data and commands
|
||||
Add support for Eaton Power Xpert Gateway UPS Card
|
||||
Improve support for temperature and humidity, including low / high values
|
||||
Alarms handling
|
||||
* ePDU (G2 and G3):
|
||||
Improve support for ambient sensor, including thresholds and dry contacts
|
||||
Outlet groups handling, including data, thresholds, settings and commands
|
||||
Alarms handling
|
||||
* XML/PDC (netxml-ups):
|
||||
Fix Eaton XML published data
|
||||
Add some settings (R/W flags) on ambient thresholds
|
||||
|
||||
- bcmxcp_usb: improvements for device claiming and multi-packets responses
|
||||
|
||||
- dummy-ups: allow any variable to be modified
|
||||
|
||||
- libnutclient: Fix for reads when the socket was closed by NUT server
|
||||
|
||||
- macosx-ups:
|
||||
* fix for 10.10 (Yosemite), v1.1
|
||||
* gracefully handle disconnection of UPS (return "data stale")
|
||||
|
||||
- nutdrv_atcl_usb: point to nutdrv_qx (fuji) for 0001:0000
|
||||
|
||||
- nutdrv_qx:
|
||||
* Add new 'sgs' USB subdriver to support TS Shara units
|
||||
* various improvements and simplification, to the code and documentation
|
||||
|
||||
- nut-ipmipsu: improve FreeIPMI support
|
||||
|
||||
- nut-scanner:
|
||||
* Don't depend on development libraries, by looking at some known paths,
|
||||
including the one provided through --libdir, to find the correct libraries
|
||||
* Fix a crash on a 2nd call to libnutscan with SNMP method
|
||||
|
||||
- powercom: fix the processing of input and output voltage for KIN units
|
||||
|
||||
- solis:
|
||||
* many improvements and cleanup
|
||||
* resync with end-of-packet character
|
||||
* fixes for Microsol Back-Ups BZ1200-BR
|
||||
|
||||
- tripplitesu: Fix initialization when tripplite firmware is buggy (for
|
||||
Tripplite SU1000RT2U and possibly more)
|
||||
|
||||
- usbhid-ups:
|
||||
* various minor improvements
|
||||
* support for Eaton UPS with dual HID report descriptor in HID Parser
|
||||
* handle missing USB strings in APC code
|
||||
|
||||
- SSL support through Mozilla NSS: Rework the NSS tests to ensure that NSS is
|
||||
actually installed and usable for enabling SSL support in NUT
|
||||
|
||||
- Augeas support: Augeas lens for ups.conf was updated to add various missing
|
||||
global directives and ups fields
|
||||
|
||||
- scripts/systemd/nut-server.service.in: Restore systemd relationship since it
|
||||
was preventing upsd from starting whenever one or more drivers, among several,
|
||||
was failing to start
|
||||
|
||||
- Fix UPower device matching for recent kernels, since hiddev* devices now have
|
||||
class "usbmisc", rather than "usb"
|
||||
|
||||
- Network protocol information: default to type NUMBER for variables that are
|
||||
not flagged as STRING . This point is subject to improvements or change in
|
||||
the next release 2.7.5. Refer to docs/net-protocol.txt for more information
|
||||
|
||||
- As usual, more bugfixes, cleanup and improvements, on both source code
|
||||
and documentation.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Release notes for NUT 2.7.3 - what's new since 2.7.2:
|
||||
|
||||
- reverted POWERDOWNFLAG to /etc/killpower as in 2.6.5 (packagers may want to
|
||||
put this in another filesystem, though)
|
||||
|
||||
- configure/make fixes for ${systemdsystemunitdir}
|
||||
|
||||
- apcsmart: fix command set parsing for protocol version 4 (e.g. Smart-UPS
|
||||
RT 10000 XL)
|
||||
|
||||
- upslog: SIGUSR1 forces an immediate log entry
|
||||
|
||||
- riello_usb/_ser: USB interface claim fix; improved error handling
|
||||
|
||||
- usbhid-ups: add support for OpenUPS2 (PID: D005), Liebert GXT3 (PID: 0008)
|
||||
APC AP9584 Serial->USB kit (PID: 0000), and some Powercom models
|
||||
(PID: 0001). Fixed scaling for Cyberpower 0764:0501.
|
||||
|
||||
- USB core: do not call usb_set_altinterface(0) by default
|
||||
|
||||
- nutdrv_qx: added fabula, fuji USB and Voltronic-QS-HEX subdrivers; add
|
||||
bestups subdriver to supersede the old standalone bestups driver
|
||||
|
||||
- NUT Monitor: added FreeDesktop AppData file (including screenshots)
|
||||
|
||||
- renamed udev rules file to 62-nut-usbups.rules (permissions fix)
|
||||
|
||||
- added AIX packaging
|
||||
|
||||
- asem: added a driver for the UPS in ASEM PB1300 embedded PCs
|
||||
|
||||
- solis: updated to support APC Microsol units sold in Brazil
|
||||
|
||||
- tripplite_usb: updated to use dv/dq charge calculation for all models (also
|
||||
exposes battery_min and battery max as configuration variables); added
|
||||
binary 3005 protocol support (such as for SMART500RT1U)
|
||||
|
||||
- genericups: better debugging while parsing the cable description flags
|
||||
|
||||
- all drivers: a new 'synchronous' driver flag is available for very verbose
|
||||
units, such as some ePDUs
|
||||
|
||||
- Eaton:
|
||||
* Add support for EnergySaving features for Eaton UPSs (HID USB/SHUT and
|
||||
XCP USB/serial)
|
||||
* Fix and complete Eaton ePDUs G2/G3 support
|
||||
* ABM (Advanced Battery Monitoring) support through battery.charger.status
|
||||
in HID (USB and SHUT), XCP (USB and serial) and SNMP (Powerware XUPS
|
||||
MIB)
|
||||
|
||||
- support for new devices:
|
||||
APC Back-UPS 1200BR and Back-UPS BZ2200BI-BR (Microsol)
|
||||
ASEM SPA PB1300 UPS
|
||||
Belkin Regulator PRO-USB
|
||||
Cyber Power Systems Value 1500ELCD-RU
|
||||
EUROCASE EA200N 2000VA
|
||||
Fideltronik LUPUS 500
|
||||
Flight Technic & International (FTUPS) FT-1000BS and FT-1000BS(T)
|
||||
Grafenthal PR-3000-HS
|
||||
JAWAN JW-UPSLC02
|
||||
Lacerda New Orion 800VA
|
||||
Mecer ME-1000-WTU
|
||||
NHS Sistemas de Energia Expert C Online 6000/8000/10000
|
||||
NHS Sistemas de Energia Expert S Online 6000/8000/10000
|
||||
Powercom BNT-xxxAP (USB product id: 0001)
|
||||
Rucelf UPOII-3000-96-EL
|
||||
Tripp Lite OMNIVSINT800
|
||||
Voltronic Power Apex 1KVA and Imperial 1KVA
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Release notes for NUT 2.7.2 - what's new since 2.7.1:
|
||||
|
@ -186,7 +780,7 @@ Release notes for NUT 2.6.4 - what's new since 2.6.3:
|
|||
especially from the network. Non printable characters were missed
|
||||
from strings operation (such as strlen), but still copied to the
|
||||
buffer, causing an overflow.
|
||||
Thus, fix NUT parser, to only allow the subset Ascii charset from
|
||||
Thus, fix NUT parser, to only allow the subset of ASCII charset from
|
||||
Space to ~
|
||||
(Reported by Sebastian Pohle, Alioth bug #313636, CVE-2012-2944)
|
||||
|
||||
|
@ -248,12 +842,12 @@ Release notes for NUT 2.6.4 - what's new since 2.6.3:
|
|||
- blazer_ser and blazer_usb now try to automatically estimate high and low
|
||||
voltages, to be able to calculate battery charge ; support for online
|
||||
Innova UPS (T, RT and 3/1 T) has been added ; Best UPS support has been
|
||||
improved, to prepare for superseeding bestups driver
|
||||
improved, to prepare for superseding bestups driver
|
||||
|
||||
- bestups has also received some care, though users are encouraged to switch
|
||||
to blazer_ser, since bestups will soon be deprecated.
|
||||
|
||||
- newmge-shut has been heavilly improved. However, replacement of the
|
||||
- newmge-shut has been heavily improved. However, replacement of the
|
||||
current mge-shut has been postponed to the next release, due to the CVE
|
||||
issue.
|
||||
|
||||
|
@ -339,7 +933,7 @@ Release notes for NUT 2.6.3 - what's new since 2.6.2:
|
|||
- Base files for HPUX packaging have been added. This is still a work in
|
||||
progress.
|
||||
|
||||
- Compilation on IBM Aix has been fixed (namespace conflict with ctypes).
|
||||
- Compilation on IBM AIX has been fixed (namespace conflict with ctypes).
|
||||
|
||||
- more bugfixes, cleanup and improvements, on both source code and
|
||||
documentation.
|
||||
|
@ -377,7 +971,7 @@ Release notes for NUT 2.6.2 - what's new since 2.6.1:
|
|||
along with Java archives (.jar) in the Download section.
|
||||
|
||||
- support for new devices: Eaton 3S ; Cyber Power Systems CP1000AVRLCD ;
|
||||
various APC models equiped with APC AP9618 management card, including APC
|
||||
various APC models equipped with APC AP9618 management card, including APC
|
||||
Smart-UPS RT XL ; Orvaldi 750 / 900SP ; POWEREX VI 1000 LED ; PowerWalker
|
||||
VI 850 LCD ; SVEN Power Pro+ series (USB ID ffff:0000).
|
||||
|
||||
|
@ -402,9 +996,9 @@ Release notes for NUT 2.6.2 - what's new since 2.6.1:
|
|||
the default 3 seconds.
|
||||
|
||||
- snmp-ups.c has a new initialization method, that uses sysObjectID, which is
|
||||
a pointer to the prefered MIB of the device, to detect supported devices.
|
||||
a pointer to the preferred MIB of the device, to detect supported devices.
|
||||
This speeds up even more init stage and should render void the use of 'mib'
|
||||
option. SNMP v3 session initialisation has also been fixed, and Eaton PDU
|
||||
option. SNMP v3 session initialization has also been fixed, and Eaton PDU
|
||||
support has been completed.
|
||||
|
||||
- Initial support has been added for systemd, the System and Service Manager
|
||||
|
@ -447,9 +1041,9 @@ Release notes for NUT 2.6.1 - what's new since 2.6.0:
|
|||
|
||||
- usbhid-ups has completed a bit supported variables for APC and Eaton / MGE.
|
||||
|
||||
- on the quality assurance side, Eaton has worked on fixing a few non
|
||||
conformances, like C++ style comments and warnings, using a newly developed
|
||||
verification tool (Prachi Gandhi).
|
||||
- on the quality assurance side, Eaton has worked on fixing a few
|
||||
non-conformance issues, like C++ style comments and warnings, using
|
||||
a newly developed verification tool (Prachi Gandhi).
|
||||
|
||||
- fix remaining references to LIBSSL_LDFLAGS, instead of LIBSSL_LIBS,
|
||||
which cause unresolved symbol on libupsclient users (Fabrice Coutadeur).
|
||||
|
@ -508,7 +1102,7 @@ Release notes for NUT 2.6.0 - what's new since 2.4.3:
|
|||
|
||||
- improve configure time dependencies checking and processing.
|
||||
|
||||
- improve older Unix systems support (HP-UX, Aix, ...) for missing functions.
|
||||
- improve older Unix systems support (HP-UX, AIX, ...) for missing functions.
|
||||
|
||||
- refresh and improve USB helper files (udev and UPower).
|
||||
|
||||
|
@ -579,7 +1173,7 @@ Release notes for NUT 2.4.1 - what's new since 2.4.0:
|
|||
version 1.1.
|
||||
|
||||
- the situation of the build toolchain has been fixed, with regard to the
|
||||
"make clean" target and the wrongly removed generated USB files. This brokes
|
||||
"make clean" target and the wrongly removed generated USB files. This broke
|
||||
further configure call.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
@ -622,7 +1216,7 @@ Release notes for NUT 2.4.0 - what's new since 2.2.2:
|
|||
- NUT now ships a bash completion function for 'upsc' command
|
||||
(scripts/misc/nut.bash_completion). Simply copy it to /etc/bash_completion.d
|
||||
|
||||
- many internal changes to improve maintenability, while lowering the
|
||||
- many internal changes to improve maintainability, while lowering the
|
||||
maintenance cost (thus allowing developers to focus on what matters: the
|
||||
code!). Examples of this are:
|
||||
- the USB information automatic extraction to generate the various USB helper
|
||||
|
@ -738,7 +1332,7 @@ Release notes for NUT 2.0.5 - what's new since 2.0.4:
|
|||
|
||||
This release is a backport of the development version. Many changes
|
||||
have already been backported previously. Thus it is more a
|
||||
synchronisation release, though it includes many bugfixes and support
|
||||
synchronization release, though it includes many bugfixes and support
|
||||
for new models.
|
||||
|
||||
- support for new devices: APC Smart-UPS with 6TI firmware; Belkin
|
||||
|
@ -772,12 +1366,12 @@ Release notes for NUT 2.0.5 - what's new since 2.0.4:
|
|||
Release notes for NUT 2.0.4 - what's new since 2.0.3:
|
||||
|
||||
- The newhidups critical bug (segmentation fault) has been fixed. It has
|
||||
also received some more care, like buxfixes and new models support and
|
||||
also received some more care, like bugfixes and new models support and
|
||||
enhancement for Solaris.
|
||||
[Peter Selinger and Arnaud Quette]
|
||||
|
||||
- A bug has been fixed in NUT core to support resuming from suspend-to-disk.
|
||||
This should also fix other similar issues, like time synchronisation
|
||||
This should also fix other similar issues, like time synchronization
|
||||
through the NTP - Network Time Protocol.
|
||||
[Arjen de Korte]
|
||||
|
||||
|
@ -800,7 +1394,7 @@ Release notes for NUT 2.0.4 - what's new since 2.0.3:
|
|||
[Carlos Rodrigues]
|
||||
|
||||
- The new rhino driver was added to support Microsol Rhino UPS hardware
|
||||
The solis has also been improved for solaris compatibility, and
|
||||
The solis has also been improved for Solaris compatibility, and
|
||||
internal / external shutdown programming. solis can now save external
|
||||
shutdown programming to ups, and support new cables for solis 3
|
||||
[Silvino B. Magalhães]
|
||||
|
@ -840,7 +1434,7 @@ Release notes for NUT 2.0.3 - what's new since 2.0.2:
|
|||
ups.model retrieval for some specific case (release 0.65)
|
||||
|
||||
- The drivers don't change to the "statepath" directory anymore at
|
||||
initialisation time if called using -k. This avoid unneeded
|
||||
initialization time if called using -k. This avoid unneeded
|
||||
failure to poweroff the UPS if /var is already unmounted.
|
||||
[Gaspar Bakos]
|
||||
|
||||
|
@ -860,7 +1454,7 @@ Release notes for NUT 2.0.3 - what's new since 2.0.2:
|
|||
- The packaging files for Red Hat have received various fixes
|
||||
[Thomas Jarosch]
|
||||
|
||||
- The solis driver has been fixed to avoid a naming colision and
|
||||
- The solis driver has been fixed to avoid a naming collision and
|
||||
compile on Solaris
|
||||
[Paweł Kierdelewicz]
|
||||
|
||||
|
@ -902,7 +1496,7 @@ Release notes for NUT 2.0.2 - what's new since 2.0.1:
|
|||
[Thanos Chatziathanassiou, Olli Salvia]
|
||||
|
||||
- The bcmxcp driver is back with support for Powerware UPSs.
|
||||
[Tore Øpetveit, Kjell Claesson]
|
||||
[Tore Ørpetveit, Kjell Claesson]
|
||||
|
||||
- The cyberpower driver now supports CyberPower 1000AVR.
|
||||
[Dave Huang]
|
||||
|
@ -913,7 +1507,7 @@ Release notes for NUT 2.0.2 - what's new since 2.0.1:
|
|||
|
||||
- The apcsmart driver has fixed APC600 support.
|
||||
|
||||
- The etapro driver fixes brokeness due to ser_get_line use
|
||||
- The etapro driver fixes brokenness due to ser_get_line use
|
||||
[Marek Michalkiewicz]
|
||||
|
||||
- The new upscode2 driver supports Fiskars, Compaq and Powerware
|
||||
|
@ -965,7 +1559,7 @@ Release notes for NUT 2.0.1 - what's new since 2.0.0:
|
|||
and bypass control.
|
||||
[Gert Lynge]
|
||||
|
||||
- The tripplite driver has recieved a major overhaul to bring it up to
|
||||
- The tripplite driver has received a major overhaul to bring it up to
|
||||
working condition for the 2.0 tree, including code cleanups, several
|
||||
new variables, commands, and user-definable parameters. See
|
||||
ChangeLog for more.
|
||||
|
@ -1124,7 +1718,7 @@ Release notes for NUT 2.0.0 - what's new since 1.4.x:
|
|||
instcmds.
|
||||
|
||||
- Effekta MT 2000 RM hardware is now supported by the fentonups driver.
|
||||
[christoph moar]
|
||||
[Christoph Moar]
|
||||
|
||||
- The new safenet driver supports UPS hardware that uses the protocol
|
||||
of the same name. This includes models from many manufacturers,
|
||||
|
|
76
README
76
README
|
@ -120,8 +120,9 @@ The entry in `ups.conf` looks like this:
|
|||
driver = apcsmart
|
||||
port = /dev/ttyS1
|
||||
|
||||
To start and stop drivers, use upsdrvctl. By default, it will start or
|
||||
stop every UPS in the config file:
|
||||
To start and stop drivers, use upsdrvctl of upsdrvsvcctl (installed on
|
||||
operating systems with a service management framework supported by NUT).
|
||||
By default, it will start or stop every UPS in the config file:
|
||||
|
||||
/usr/local/ups/sbin/upsdrvctl start
|
||||
/usr/local/ups/sbin/upsdrvctl stop
|
||||
|
@ -131,6 +132,17 @@ However, you can also just start or stop one by adding its name:
|
|||
/usr/local/ups/sbin/upsdrvctl start sparky
|
||||
/usr/local/ups/sbin/upsdrvctl stop sparky
|
||||
|
||||
On operating systems with a supported service management framework,
|
||||
you might wrap your NUT drivers into individual services instances
|
||||
with:
|
||||
|
||||
/usr/local/ups/sbin/upsdrvsvcctl resync
|
||||
|
||||
and then manage those service instances with commands like:
|
||||
|
||||
/usr/local/ups/sbin/upsdrvsvcctl start sparky
|
||||
/usr/local/ups/sbin/upsdrvsvcctl stop sparky
|
||||
|
||||
To find the driver name for your device, refer to the section below
|
||||
called "HARDWARE SUPPORT TABLE".
|
||||
|
||||
|
@ -236,7 +248,7 @@ Power distribution unit management
|
|||
|
||||
NUT also provides an advanced support for power distribution units.
|
||||
|
||||
You should read the <<Outlets_PDU_notes,Configuring automatic UPS shutdowns>>
|
||||
You should read the <<outlet_management,NUT outlets management and PDU notes>>
|
||||
chapter to learn more about when to use this feature.
|
||||
|
||||
Network Server
|
||||
|
@ -261,32 +273,52 @@ separate section in the documentation since it is so important.
|
|||
|
||||
You configure it by telling it about UPSes that you want to monitor in
|
||||
upsmon.conf. Each UPS can be defined as one of two possible types:
|
||||
a "primary" or "secondary".
|
||||
|
||||
Master
|
||||
~~~~~~
|
||||
Primary
|
||||
~~~~~~~
|
||||
|
||||
This UPS supplies power to the system running `upsmon`, and this system is also
|
||||
responsible for shutting it down when the battery is depleted. This occurs
|
||||
after any slave systems have disconnected safely.
|
||||
The monitored UPS possibly supplies power to this system running `upsmon`,
|
||||
but more importantly -- this system can manage the UPS (typically, this
|
||||
instance of `upsmon` runs on the same system as the `upsd` and driver(s)):
|
||||
it is capable and responsible for shutting it down when the battery is
|
||||
depleted (or in another approach, lingering to deplete it or to tell the
|
||||
UPS to reboot its load after too much time has elapsed and this system
|
||||
is still alive -- meaning wall power returned at a "wrong" moment).
|
||||
|
||||
If your UPS is plugged directly into a system's serial port, the `upsmon`
|
||||
process on that system should define that UPS as a master.
|
||||
The shutdown of this (primary) system itself, as well as eventually an
|
||||
UPS shutdown, occurs after any secondary systems ordered to shut down
|
||||
first have disconnected, or a critical urgency threshold was passed.
|
||||
|
||||
If your UPS is plugged directly into a system's serial or USB port, the
|
||||
`upsmon` process on that system should define its relation to that UPS
|
||||
as a primary. It may be more complicated for higher-end UPSes with a
|
||||
shared network management capability (typically via SNMP) or several
|
||||
serial/USB ports that can be used simultaneously, and depends on what
|
||||
vendors and drivers implement. Setups with several competing primaries
|
||||
(for redundancy) are technically possible, if each one runs its own
|
||||
full stack of NUT, but results can be random (currently NUT does not
|
||||
provide a way to coordinate several entities managing the same device).
|
||||
|
||||
For a typical home user, there's one computer connected to one UPS.
|
||||
That means you run a driver, `upsd`, and `upsmon` in master mode.
|
||||
That means you would run on the same computer the whole NUT stack --
|
||||
a suitable driver, `upsd`, and `upsmon` in primary mode.
|
||||
|
||||
Slave
|
||||
~~~~~
|
||||
Secondary
|
||||
~~~~~~~~~
|
||||
|
||||
This UPS may supply power to the system running `upsmon`, but this system can't
|
||||
shut it down directly.
|
||||
The monitored UPS may supply power to the system running `upsmon` (or
|
||||
alternatively, it may be a monitoring station with zero PSUs fed by
|
||||
that UPS), but more importantly, this system can't manage the UPS --
|
||||
e.g. shut it down directly (through a locally running NUT driver).
|
||||
|
||||
Use this mode when you run multiple computers on the same UPS. Obviously, only
|
||||
one can be connected to the serial port on the UPS, and that system is the
|
||||
master. Everything else is a slave.
|
||||
Use this mode when you run multiple computers on the same UPS.
|
||||
Obviously, only one can be connected to the serial or USB port
|
||||
on a typical UPS, and that system is the primary. Everything
|
||||
else is a secondary.
|
||||
|
||||
For a typical home user, there's one computer connected to one UPS.
|
||||
That means you run a driver, upsd, and upsmon in master mode.
|
||||
That means you run a driver, `upsd`, and `upsmon` in primary mode.
|
||||
|
||||
Additional Information
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -476,7 +508,11 @@ The past stable trees were 1.0, 1.2, 1.4, 2.0, 2.2 and 2.4, with the
|
|||
latest stable tree designated 2.6. The development trees were 1.1, 1.3,
|
||||
1.5, 2.1 and 2.3. As of the 2.4 release, there is no real development
|
||||
branch anymore since the code is available through a revision control
|
||||
system (namely Subversion) and snapshots.
|
||||
system (namely Subversion) and snapshots. Since 2.7 line of releases,
|
||||
sources are tracked in Git revision control system, with the project
|
||||
ecosystem being hosted on GitHub, and improvements or other contributions
|
||||
merged through common pull request approach and custom NUT CI testing
|
||||
on multiple platforms.
|
||||
|
||||
Major release jumps are mostly due to large changes to the features
|
||||
list. There have also been a number of architectural changes which
|
||||
|
|
4
TODO
4
TODO
|
@ -13,7 +13,7 @@ Roadmap
|
|||
^^^
|
||||
|
||||
This release is focused on the website and documentation rewrite, using
|
||||
the excellent link:http://www.methods.co.nz/asciidoc[AsciiDoc].
|
||||
the excellent link:https://asciidoc.org/[AsciiDoc].
|
||||
|
||||
2.8
|
||||
^^^
|
||||
|
@ -113,6 +113,6 @@ and https://alioth.debian.org/tracker/?atid=411545&group_id=30602&func=browse[fe
|
|||
solar panel driver, and the powerman internal approach of a generic engine with
|
||||
a scripting interface is a cool idea.
|
||||
Ref http://powerman.svn.sourceforge.net/viewvc/powerman/trunk/etc/apcpdu.dev?revision=969&view=markup
|
||||
- integrate the (future) new powerman LUA engine (maybe/mustbe used for the driver above?)
|
||||
- integrate the (future) new powerman LUA engine (maybe/must-be used for the driver above?)
|
||||
for native PDU support
|
||||
- see how we can help and collaborate with DeviceKit-power
|
||||
|
|
172
UPGRADING
172
UPGRADING
|
@ -7,6 +7,172 @@ This file lists changes that affect users who installed older versions
|
|||
of this software. When upgrading from an older version, be sure to
|
||||
check this file to see if you need to make changes to your system.
|
||||
|
||||
Changes from 2.7.4 to 2.8.0
|
||||
---------------------------
|
||||
|
||||
- Note to distribution packagers: this version hopefully learns from many
|
||||
past mistakes, so many custom patches may be no longer needed. If some
|
||||
remain, please consider making pull requests for upstream NUT codebase
|
||||
to share the fixes consistently across the ecosystem. Also note that
|
||||
some new types of drivers (so package groups with unique dependencies)
|
||||
could have appeared since your packaging was written (e.g. with modbus),
|
||||
as well as new features in systemd integration (`nut-driver@instances`
|
||||
and the `nut-driver-enumerator` to manage their population), as well as
|
||||
updated Python 2 and Python 3 support (again, maybe dictating different
|
||||
package groups) as detailed below.
|
||||
|
||||
- Due to changes needed to resolve build warnings, mostly about mismatching
|
||||
data types for some variables, some structure definitions and API signatures
|
||||
of several routines had to be changed for argument types, return types,
|
||||
or both. Primarily this change concerns internal implementation details
|
||||
(may impact update of NUT forks with custom drivers using those), but a
|
||||
few changes also happened in header files installed for builds configured
|
||||
`--with-dev` and so may impact `upsclient` and `nutclient` (C++) consumers.
|
||||
At the very least, binaries for those consumers should be rebuilt to remain
|
||||
stable with NUT 2.8.0 and not mismatch int-type sizes and other arguments.
|
||||
|
||||
- libusb-1.0: NUT now defaults to building against libusb-1.0 API version
|
||||
if the configure script finds the development headers, falling back to
|
||||
libusb-0.1 if not. Please report any regressions.
|
||||
|
||||
- apcupsd-ups: When monitoring a remote apcupsd server, interpret "SHUTTING
|
||||
DOWN" as a NUT "LB" status. If you were relying on the previous behavior
|
||||
(for instance, in a monitor-only situation), please adjust your upsmon
|
||||
settings. Reference: https://github.com/networkupstools/nut/issues/460
|
||||
|
||||
- Packagers: the AsciiDoc detection has been reworked to allow NUT to be built
|
||||
from source without requiring asciidoc/a2x (using pre-built man pages from
|
||||
the distribution tarball, for instance). Please double-check that we did not
|
||||
break anything (see docs/configure.txt for options).
|
||||
|
||||
- Driver core: options added for standalone mode (scanning for devices without
|
||||
requiring ups.conf) - see docs/man/nutupsdrv.txt for details.
|
||||
|
||||
- oldmge-shut has been removed, and replaced by mge-shut.
|
||||
|
||||
- New drivers for devices with "Qx" (also known as "Megatec Q*") family of
|
||||
protocols should be developed as sub-drivers in the `nutdrv_qx` framework
|
||||
for USB and Serial connected devices, not as updates/clones of older e.g.
|
||||
`blazer` family and `bestups`. Sources, man pages and start-up messages
|
||||
of such older drivers were marked with "OBSOLETION WARNING".
|
||||
|
||||
- liebert-esp2: some multi-phase variable names have been updated to match the
|
||||
rest of NUT.
|
||||
|
||||
- netxml-ups: if you have old firmware, or were relying on values being off by
|
||||
a factor of 10, consider the `do_convert_deci` flag. See
|
||||
docs/man/netxml-ups.txt for details.
|
||||
|
||||
- snmp-ups: detection of Net-SNMP has been updated to use `pkg-config` by
|
||||
default (if present), rather than `net-snmp-config(-32|-64)` script(s) as
|
||||
the only option available previously. The scripts tend to specify a lot
|
||||
of options (sometimes platform-specific) in suggested `CFLAGS` and `LIBS`
|
||||
compared to the packaged `pkg-config` information which also works and is
|
||||
more portable. If this change bites your distribution, please bring it up
|
||||
in https://github.com/networkupstools/nut/issues or better yet, post a PR.
|
||||
Also note that `./configure --with-netsnmp-config(=yes)` should set up the
|
||||
preference of the detected script over `pkg-config` information, if both
|
||||
are available, and `--with-netsnmp-config=/path/name` would as well.
|
||||
|
||||
- snmp-ups: bit mask values for flags in earlier codebase were defined in a
|
||||
way that caused logically different items to have same numeric values.
|
||||
This was fixed to surely use different definitions (so changing numbers
|
||||
behind some of those macro symbols), and testing with UPS, ePDU and ATS
|
||||
hardware which was available did not expose any practical differences.
|
||||
|
||||
- usbhid-ups: numeric data conversion from wire protocol to CPU representation
|
||||
in GetValue() was completely reworked, aiming to be correct on all CPU types.
|
||||
That said, regressions are possible and feedback is welcome.
|
||||
|
||||
- nut-scanner: Packagers, take note of the changes to the library
|
||||
search code in common/common.c. Please file an issue if this does not work
|
||||
with your platform.
|
||||
|
||||
- dummy-ups can now specify `mode` as a driver argument, and separates the
|
||||
notion of `dummy-once` (new default for `*.dev` files that do not change)
|
||||
vs. `dummy-loop` (legacy default for `*.seq` and others) [issue #1385]
|
||||
|
||||
* Note this can break third-party test scripts which expected `*.dev`
|
||||
files to work as a looping sequence with a `TIMER` keywords to change
|
||||
values slowly; now such files should get processed to the end once.
|
||||
Specify `mode=dummy-loop` driver option or rename the data file used
|
||||
in the `port` option for legacy behavior.
|
||||
Use/Test-cases which modified such files content externally should
|
||||
not be impacted.
|
||||
|
||||
- Python: scripts have been updated to work with Python 3 as well as 2.
|
||||
|
||||
* PyNUT module (protocol binding) supports both Python generations.
|
||||
|
||||
* NUT-Monitor (desktop UI client) got separated into two projects:
|
||||
one with support for Python2 and GTK2, and another for Python3 and Qt5.
|
||||
On operating systems that serve both environments, either of these
|
||||
implementation should be usable. For distributions that deprecated
|
||||
and removed Python2 support, it is a point to consider in NUT packages
|
||||
and their build-time and installation dependencies.
|
||||
The historic filenames for desktop integration (`NUT-Monitor` script
|
||||
and `nut-monitor.desktop`) are still delivered, but now cover a wrapper
|
||||
script which detects the environment capabilities and launches the best
|
||||
suitable UI implementation (if both are available).
|
||||
|
||||
- apcsmart: updates to CS "hack" (see docs/man/apcsmart.txt for details)
|
||||
|
||||
- upsdebugx(): added `[D#]` prefix to log entries with level > 0
|
||||
so if any scripts or other tools relied on parsing those messages
|
||||
making some assumptions, they should be updated
|
||||
|
||||
- upsdebugx() and related methods are now macros, optionally calling similarly
|
||||
named implementations like s_upsdebugx() as a slight optimization; this may
|
||||
show up in linking of binaries for some customized build scenarios
|
||||
|
||||
- libraries, tools and protocol now support a `TRACKING` ID to be used with
|
||||
an `INSTCMD` or `SET VAR` requests; for details see docs/net-protocol.txt
|
||||
and docs/sock-protocol.txt
|
||||
|
||||
- upsrw: display the variable type beside ENUM / RANGE
|
||||
|
||||
- Augeas: new `--with-augeas-lenses-dir` configure option.
|
||||
|
||||
Changes from 2.7.3 to 2.7.4
|
||||
---------------------------
|
||||
|
||||
- scripts/systemd/nut-server.service.in: Restore systemd relationship since it
|
||||
was preventing upsd from starting whenever one or more drivers, among several,
|
||||
was failing to start
|
||||
|
||||
- Fix UPower device matching for recent kernels, since hiddev* devices now have
|
||||
class "usbmisc", rather than "usb"
|
||||
|
||||
- macosx-ups: the "port" driver option no longer has any effect
|
||||
|
||||
- Network protocol information: default to type NUMBER for variables that are
|
||||
not flagged as STRING . This point is subject to improvements or change in
|
||||
the next release 2.7.5. Refer to docs/net-protocol.txt for more information
|
||||
|
||||
Changes from 2.7.2 to 2.7.3
|
||||
---------------------------
|
||||
|
||||
- The linkman:nutdrv_qx[8] driver will eventually supersede linkman:bestups[8].
|
||||
It has been tested on a U-series Patriot Pro II. Please test the new driver
|
||||
on your hardware during your next maintenance window, and report any bugs.
|
||||
|
||||
- If you are upgrading from a new install of 2.7.1 or 2.7.2, double-check the
|
||||
value of POWERDOWNFLAG in $prefix/etc/upsmon.conf - it has been restored to
|
||||
/etc/killpower as in 2.6.5 and earlier.
|
||||
|
||||
- If you use upslog with a large sleep value, you may be interested in adding
|
||||
`killall -SIGUSR1 upslog` to any OB/OL script actions. This will force
|
||||
upslog to write a log entry to catch short power transients.
|
||||
|
||||
- Be sure that your SSL keys are readable by the NUT system user. The SSL
|
||||
subsystem is now initialized after `upsd` forks, to work around issues in the
|
||||
NSS library.
|
||||
|
||||
- The systemd nut-server.service does not Require nut-driver to be started
|
||||
successfully. This was previously preventing upsd startup, even for just
|
||||
one driver failure among many. This also matches the behavior of sysV
|
||||
initscripts.
|
||||
|
||||
Changes from 2.7.1 to 2.7.2
|
||||
---------------------------
|
||||
|
||||
|
@ -131,7 +297,7 @@ Changes from 2.2.1 to 2.2.2
|
|||
This enable the additional build and distribution of the static
|
||||
version of libupsclient, along with the pkg-config helper and manual
|
||||
pages. The default configure option is to distribute only the shared
|
||||
version of libupsclient. This can be overriden by using the
|
||||
version of libupsclient. This can be overridden by using the
|
||||
"--disable-shared" configure option (distribute static only binaries).
|
||||
- The UPS poweroff handling of the usbhid-ups driver has been reworked.
|
||||
Though regression is not expected, users of this driver are
|
||||
|
@ -142,7 +308,7 @@ Changes from 2.2.0 to 2.2.1
|
|||
---------------------------
|
||||
|
||||
- nothing that affects upgraded systems.
|
||||
(The below message is repetead due to previous omission)
|
||||
(The below message is repeated due to previous omission)
|
||||
- Developers of external client application using libupsclient are
|
||||
encouraged to rename their "UPSCONN" client structure to "UPSCONN_t"
|
||||
since the former will disappear by the release of NUT 2.4.
|
||||
|
@ -167,7 +333,7 @@ automake). Refer to packaging/debian/ for an example of migration.
|
|||
ie not using upsdrvctl.
|
||||
- Developers of external client application using libupsclient are
|
||||
encouraged to rename the "UPSCONN" client structure to "UPSCONN_t"
|
||||
since the former will disapear by the release of NUT 2.4.
|
||||
since the former will disappear by the release of NUT 2.4.
|
||||
|
||||
Changes from 2.0.4 to 2.0.5
|
||||
---------------------------
|
||||
|
|
1087
aclocal.m4
vendored
1087
aclocal.m4
vendored
File diff suppressed because it is too large
Load diff
|
@ -1,7 +1,19 @@
|
|||
# Network UPS Tools: clients
|
||||
EXTRA_DIST =
|
||||
|
||||
# nutclient.cpp for some legacy reason (maybe initial detached development?)
|
||||
# optionally includes "common.h" with the NUT build setup - and this option
|
||||
# was never triggered in fact, not until pushed through command line like this:
|
||||
AM_CXXFLAGS = -DHAVE_NUTCOMMON=1 -I$(top_srcdir)/include
|
||||
|
||||
# Make sure out-of-dir dependencies exist (especially when dev-building parts):
|
||||
$(top_builddir)/common/libcommon.la \
|
||||
$(top_builddir)/common/libcommonclient.la \
|
||||
$(top_builddir)/common/libparseconf.la: dummy
|
||||
@cd $(@D) && $(MAKE) $(AM_MAKEFLAGS) $(@F)
|
||||
|
||||
# by default, link programs in this directory with libcommon.a
|
||||
LDADD = ../common/libcommon.la libupsclient.la $(NETLIBS)
|
||||
LDADD = $(top_builddir)/common/libcommon.la libupsclient.la $(NETLIBS)
|
||||
if WITH_SSL
|
||||
LDADD += $(LIBSSL_LIBS)
|
||||
endif
|
||||
|
@ -20,9 +32,13 @@ endif
|
|||
bin_PROGRAMS = upsc upslog upsrw upscmd
|
||||
dist_bin_SCRIPTS = upssched-cmd
|
||||
sbin_PROGRAMS = upsmon upssched
|
||||
lib_LTLIBRARIES = libupsclient.la libnutclient.la
|
||||
lib_LTLIBRARIES = libupsclient.la
|
||||
if HAVE_CXX11
|
||||
lib_LTLIBRARIES += libnutclient.la
|
||||
lib_LTLIBRARIES += libnutclientstub.la
|
||||
endif
|
||||
if WITH_DEV
|
||||
include_HEADERS = upsclient.h ../include/parseconf.h nutclient.h
|
||||
include_HEADERS = upsclient.h ../include/parseconf.h nutclient.h nutclientmem.h
|
||||
endif
|
||||
if WITH_CGI
|
||||
cgiexec_PROGRAMS = upsstats.cgi upsimage.cgi upsset.cgi
|
||||
|
@ -35,7 +51,7 @@ upslog_SOURCES = upslog.c upsclient.h upslog.h
|
|||
upsmon_SOURCES = upsmon.c upsmon.h upsclient.h
|
||||
|
||||
upssched_SOURCES = upssched.c upssched.h
|
||||
upssched_LDADD = ../common/libcommon.la ../common/libparseconf.la $(NETLIBS)
|
||||
upssched_LDADD = $(top_builddir)/common/libcommon.la $(top_builddir)/common/libparseconf.la $(NETLIBS)
|
||||
|
||||
upsimage_cgi_SOURCES = upsimage.c upsclient.h upsimagearg.h cgilib.c cgilib.h
|
||||
upsimage_cgi_LDADD = $(LDADD) $(LIBGD_LDFLAGS)
|
||||
|
@ -46,15 +62,44 @@ upsstats_cgi_SOURCES = upsstats.c upsclient.h status.h upsstats.h \
|
|||
|
||||
# not LDADD.
|
||||
libupsclient_la_SOURCES = upsclient.c upsclient.h
|
||||
libupsclient_la_LIBADD = ../common/libcommonclient.la
|
||||
libupsclient_la_LIBADD = $(top_builddir)/common/libcommonclient.la
|
||||
if WITH_SSL
|
||||
libupsclient_la_LIBADD += $(LIBSSL_LIBS)
|
||||
endif
|
||||
|
||||
# libupsclient version information
|
||||
# Below we set API versions of public libraries
|
||||
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
||||
libupsclient_la_LDFLAGS = -version-info 4:0:0
|
||||
# Note that changes here may have to be reflected in packaging (the shared
|
||||
# object .so names would differ)
|
||||
|
||||
# libupsclient version information
|
||||
libupsclient_la_LDFLAGS = -version-info 6:0:0 -export-symbols-regex ^upscli_
|
||||
|
||||
if HAVE_CXX11
|
||||
# libnutclient version information and build
|
||||
libnutclient_la_SOURCES = nutclient.h nutclient.cpp
|
||||
libnutclient_la_LDFLAGS = -version-info 0:0:0
|
||||
libnutclient_la_LDFLAGS = -version-info 2:0:0
|
||||
# Needed in not-standalone builds with -DHAVE_NUTCOMMON=1
|
||||
# which is defined for in-tree CXX builds above:
|
||||
libnutclient_la_LIBADD = $(top_builddir)/common/libcommonclient.la
|
||||
else
|
||||
EXTRA_DIST += nutclient.h nutclient.cpp
|
||||
endif
|
||||
|
||||
if HAVE_CXX11
|
||||
# libnutclientstub version information and build
|
||||
libnutclientstub_la_SOURCES = nutclientmem.h nutclientmem.cpp
|
||||
libnutclientstub_la_LDFLAGS = -version-info 1:0:0
|
||||
libnutclientstub_la_LIBADD = libnutclient.la
|
||||
else
|
||||
EXTRA_DIST += nutclientmem.h nutclientmem.cpp
|
||||
endif
|
||||
|
||||
dummy:
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||
|
||||
# NOTE: Do not clean ".deps" in SUBDIRS of the main project,
|
||||
# the root Makefile.am takes care of that!
|
||||
#clean-local:
|
||||
# rm -rf $(builddir)/.deps
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -46,9 +46,12 @@ static char *unescape(char *buf)
|
|||
hex[1] = buf[++i];
|
||||
hex[2] = '\0';
|
||||
if (!isxdigit((unsigned char) hex[0])
|
||||
|| !isxdigit((unsigned char) hex[0]))
|
||||
|| !isxdigit((unsigned char) hex[1]))
|
||||
fatalx(EXIT_FAILURE, "bad escape char");
|
||||
ch = strtol(hex, NULL, 16);
|
||||
long l = strtol(hex, NULL, 16);
|
||||
assert(l>=0);
|
||||
assert(l<=255);
|
||||
ch = (char)l; /* FIXME: Loophole about non-ASCII symbols in top 128 values, or negatives for signed char... */
|
||||
|
||||
if ((ch == 10) || (ch == 13))
|
||||
ch = ' ';
|
||||
|
|
|
@ -17,6 +17,9 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef NUT_CGILIB_H_SEEN
|
||||
#define NUT_CGILIB_H_SEEN 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* *INDENT-OFF* */
|
||||
extern "C" {
|
||||
|
@ -41,3 +44,4 @@ int checkhost(const char *host, char **desc);
|
|||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
#endif /* NUT_CGILIB_H_SEEN */
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -28,6 +28,13 @@
|
|||
#include <map>
|
||||
#include <set>
|
||||
#include <exception>
|
||||
#include <cstdint>
|
||||
#include <ctime>
|
||||
|
||||
/* See include/common.h for details behind this */
|
||||
#ifndef NUT_UNUSED_VARIABLE
|
||||
#define NUT_UNUSED_VARIABLE(x) (void)(x)
|
||||
#endif
|
||||
|
||||
namespace nut
|
||||
{
|
||||
|
@ -51,9 +58,11 @@ class NutException : public std::exception
|
|||
{
|
||||
public:
|
||||
NutException(const std::string& msg):_msg(msg){}
|
||||
virtual ~NutException() throw() {}
|
||||
virtual const char * what() const throw() {return this->_msg.c_str();}
|
||||
virtual std::string str() const throw() {return this->_msg;}
|
||||
NutException(const NutException&) = default;
|
||||
NutException& operator=(NutException& rhs) = default;
|
||||
virtual ~NutException() override;
|
||||
virtual const char * what() const noexcept override {return this->_msg.c_str();}
|
||||
virtual std::string str() const noexcept {return this->_msg;}
|
||||
private:
|
||||
std::string _msg;
|
||||
};
|
||||
|
@ -65,7 +74,9 @@ class SystemException : public NutException
|
|||
{
|
||||
public:
|
||||
SystemException();
|
||||
virtual ~SystemException() throw() {}
|
||||
SystemException(const SystemException&) = default;
|
||||
SystemException& operator=(SystemException& rhs) = default;
|
||||
virtual ~SystemException() override;
|
||||
private:
|
||||
static std::string err();
|
||||
};
|
||||
|
@ -78,7 +89,9 @@ class IOException : public NutException
|
|||
{
|
||||
public:
|
||||
IOException(const std::string& msg):NutException(msg){}
|
||||
virtual ~IOException() throw() {}
|
||||
IOException(const IOException&) = default;
|
||||
IOException& operator=(IOException& rhs) = default;
|
||||
virtual ~IOException() override;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -88,7 +101,9 @@ class UnknownHostException : public IOException
|
|||
{
|
||||
public:
|
||||
UnknownHostException():IOException("Unknown host"){}
|
||||
virtual ~UnknownHostException() throw() {}
|
||||
UnknownHostException(const UnknownHostException&) = default;
|
||||
UnknownHostException& operator=(UnknownHostException& rhs) = default;
|
||||
virtual ~UnknownHostException() override;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -98,7 +113,9 @@ class NotConnectedException : public IOException
|
|||
{
|
||||
public:
|
||||
NotConnectedException():IOException("Not connected"){}
|
||||
virtual ~NotConnectedException() throw() {}
|
||||
NotConnectedException(const NotConnectedException&) = default;
|
||||
NotConnectedException& operator=(NotConnectedException& rhs) = default;
|
||||
virtual ~NotConnectedException() override;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -108,9 +125,30 @@ class TimeoutException : public IOException
|
|||
{
|
||||
public:
|
||||
TimeoutException():IOException("Timeout"){}
|
||||
virtual ~TimeoutException() throw() {}
|
||||
TimeoutException(const TimeoutException&) = default;
|
||||
TimeoutException& operator=(TimeoutException& rhs) = default;
|
||||
virtual ~TimeoutException() override;
|
||||
};
|
||||
|
||||
/**
|
||||
* Cookie given when performing async action, used to redeem result at a later date.
|
||||
*/
|
||||
typedef std::string TrackingID;
|
||||
|
||||
/**
|
||||
* Result of an async action.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
UNKNOWN,
|
||||
PENDING,
|
||||
SUCCESS,
|
||||
INVALID_ARGUMENT,
|
||||
FAILURE,
|
||||
} TrackingResult;
|
||||
|
||||
typedef std::string Feature;
|
||||
|
||||
/**
|
||||
* A nut client is the starting point to dialog to NUTD.
|
||||
* It can connect to an NUTD then retrieve its device list.
|
||||
|
@ -122,7 +160,7 @@ class Client
|
|||
friend class Variable;
|
||||
friend class Command;
|
||||
public:
|
||||
~Client();
|
||||
virtual ~Client();
|
||||
|
||||
/**
|
||||
* Intend to authenticate to a NUTD server.
|
||||
|
@ -132,13 +170,13 @@ public:
|
|||
* \todo Is his method is global to all connection protocol or is it specific to TCP ?
|
||||
* \note Actually, authentication fails only if already set, not if bad values are sent.
|
||||
*/
|
||||
virtual void authenticate(const std::string& user, const std::string& passwd)throw(NutException)=0;
|
||||
virtual void authenticate(const std::string& user, const std::string& passwd) = 0;
|
||||
|
||||
/**
|
||||
* Disconnect from the NUTD server.
|
||||
* \todo Is his method is global to all connection protocol or is it specific to TCP ?
|
||||
*/
|
||||
virtual void logout()throw(NutException)=0;
|
||||
virtual void logout() = 0;
|
||||
|
||||
/**
|
||||
* Device manipulations.
|
||||
|
@ -151,29 +189,29 @@ public:
|
|||
* \param name Name of the device.
|
||||
* \return The device.
|
||||
*/
|
||||
virtual Device getDevice(const std::string& name)throw(NutException);
|
||||
virtual Device getDevice(const std::string& name);
|
||||
/**
|
||||
* Retrieve the list of all devices supported by UPSD server.
|
||||
* \return The set of supported devices.
|
||||
*/
|
||||
virtual std::set<Device> getDevices()throw(NutException);
|
||||
virtual std::set<Device> getDevices();
|
||||
/**
|
||||
* Test if a device is supported by the NUTD server.
|
||||
* \param dev Device name.
|
||||
* \return true if supported, false otherwise.
|
||||
*/
|
||||
virtual bool hasDevice(const std::string& dev)throw(NutException);
|
||||
virtual bool hasDevice(const std::string& dev);
|
||||
/**
|
||||
* Retrieve names of devices supported by NUTD server.
|
||||
* \return The set of names of supported devices.
|
||||
*/
|
||||
virtual std::set<std::string> getDeviceNames()throw(NutException)=0;
|
||||
virtual std::set<std::string> getDeviceNames() = 0;
|
||||
/**
|
||||
* Retrieve the description of a device.
|
||||
* \param name Device name.
|
||||
* \return Device description.
|
||||
*/
|
||||
virtual std::string getDeviceDescription(const std::string& name)throw(NutException)=0;
|
||||
virtual std::string getDeviceDescription(const std::string& name) = 0;
|
||||
/** \} */
|
||||
|
||||
/**
|
||||
|
@ -186,54 +224,60 @@ public:
|
|||
* \param dev Device name
|
||||
* \return Variable names
|
||||
*/
|
||||
virtual std::set<std::string> getDeviceVariableNames(const std::string& dev)throw(NutException)=0;
|
||||
virtual std::set<std::string> getDeviceVariableNames(const std::string& dev) = 0;
|
||||
/**
|
||||
* Retrieve names of read/write variables supported by a device.
|
||||
* \param dev Device name
|
||||
* \return RW variable names
|
||||
*/
|
||||
virtual std::set<std::string> getDeviceRWVariableNames(const std::string& dev)throw(NutException)=0;
|
||||
virtual std::set<std::string> getDeviceRWVariableNames(const std::string& dev) = 0;
|
||||
/**
|
||||
* Test if a variable is supported by a device.
|
||||
* \param dev Device name
|
||||
* \param name Variable name
|
||||
* \return true if the variable is supported.
|
||||
*/
|
||||
virtual bool hasDeviceVariable(const std::string& dev, const std::string& name)throw(NutException);
|
||||
virtual bool hasDeviceVariable(const std::string& dev, const std::string& name);
|
||||
/**
|
||||
* Retrieve the description of a variable.
|
||||
* \param dev Device name
|
||||
* \param name Variable name
|
||||
* \return Variable description if provided.
|
||||
*/
|
||||
virtual std::string getDeviceVariableDescription(const std::string& dev, const std::string& name)throw(NutException)=0;
|
||||
virtual std::string getDeviceVariableDescription(const std::string& dev, const std::string& name) = 0;
|
||||
/**
|
||||
* Retrieve values of a variable.
|
||||
* \param dev Device name
|
||||
* \param name Variable name
|
||||
* \return Variable values (usually one) if available.
|
||||
*/
|
||||
virtual std::vector<std::string> getDeviceVariableValue(const std::string& dev, const std::string& name)throw(NutException)=0;
|
||||
virtual std::vector<std::string> getDeviceVariableValue(const std::string& dev, const std::string& name) = 0;
|
||||
/**
|
||||
* Retrieve values of all variables of a device.
|
||||
* \param dev Device name
|
||||
* \return Variable values indexed by variable names.
|
||||
*/
|
||||
virtual std::map<std::string,std::vector<std::string> > getDeviceVariableValues(const std::string& dev)throw(NutException);
|
||||
virtual std::map<std::string,std::vector<std::string> > getDeviceVariableValues(const std::string& dev);
|
||||
/**
|
||||
* Retrieve values of all variables of a set of devices.
|
||||
* \param devs Device names
|
||||
* \return Variable values indexed by variable names, indexed by device names.
|
||||
*/
|
||||
virtual std::map<std::string,std::map<std::string,std::vector<std::string> > > getDevicesVariableValues(const std::set<std::string>& devs);
|
||||
/**
|
||||
* Intend to set the value of a variable.
|
||||
* \param dev Device name
|
||||
* \param name Variable name
|
||||
* \param value Variable value
|
||||
*/
|
||||
virtual void setDeviceVariable(const std::string& dev, const std::string& name, const std::string& value)throw(NutException)=0;
|
||||
virtual TrackingID setDeviceVariable(const std::string& dev, const std::string& name, const std::string& value) = 0;
|
||||
/**
|
||||
* Intend to set the value of a variable.
|
||||
* \param dev Device name
|
||||
* \param name Variable name
|
||||
* \param value Variable value
|
||||
* \param values Vector of variable values
|
||||
*/
|
||||
virtual void setDeviceVariable(const std::string& dev, const std::string& name, const std::vector<std::string>& values)throw(NutException)=0;
|
||||
virtual TrackingID setDeviceVariable(const std::string& dev, const std::string& name, const std::vector<std::string>& values) = 0;
|
||||
/** \} */
|
||||
|
||||
/**
|
||||
|
@ -246,27 +290,28 @@ public:
|
|||
* \param dev Device name
|
||||
* \return Command names
|
||||
*/
|
||||
virtual std::set<std::string> getDeviceCommandNames(const std::string& dev)throw(NutException)=0;
|
||||
virtual std::set<std::string> getDeviceCommandNames(const std::string& dev) = 0;
|
||||
/**
|
||||
* Test if a command is supported by a device.
|
||||
* \param dev Device name
|
||||
* \param name Command name
|
||||
* \return true if the command is supported.
|
||||
*/
|
||||
virtual bool hasDeviceCommand(const std::string& dev, const std::string& name)throw(NutException);
|
||||
virtual bool hasDeviceCommand(const std::string& dev, const std::string& name);
|
||||
/**
|
||||
* Retrieve the description of a command.
|
||||
* \param dev Device name
|
||||
* \param name Command name
|
||||
* \return Command description if provided.
|
||||
*/
|
||||
virtual std::string getDeviceCommandDescription(const std::string& dev, const std::string& name)throw(NutException)=0;
|
||||
virtual std::string getDeviceCommandDescription(const std::string& dev, const std::string& name) = 0;
|
||||
/**
|
||||
* Intend to execute a command.
|
||||
* \param dev Device name
|
||||
* \param name Command name
|
||||
* \param param Additional command parameter
|
||||
*/
|
||||
virtual void executeDeviceCommand(const std::string& dev, const std::string& name)throw(NutException)=0;
|
||||
virtual TrackingID executeDeviceCommand(const std::string& dev, const std::string& name, const std::string& param="") = 0;
|
||||
/** \} */
|
||||
|
||||
/**
|
||||
|
@ -277,15 +322,33 @@ public:
|
|||
* Log the current user (if authenticated) for a device.
|
||||
* \param dev Device name.
|
||||
*/
|
||||
virtual void deviceLogin(const std::string& dev)throw(NutException)=0;
|
||||
virtual void deviceLogin(const std::string& dev) = 0;
|
||||
/**
|
||||
* Retrieve the number of user longged in the specified device.
|
||||
* Retrieve the number of user logged-in for the specified device.
|
||||
* \param dev Device name.
|
||||
* \return Number of logged-in users.
|
||||
*/
|
||||
virtual int deviceGetNumLogins(const std::string& dev)throw(NutException)=0;
|
||||
virtual void deviceMaster(const std::string& dev)throw(NutException)=0;
|
||||
virtual void deviceForcedShutdown(const std::string& dev)throw(NutException)=0;
|
||||
virtual int deviceGetNumLogins(const std::string& dev) = 0;
|
||||
/* NOTE: "master" is deprecated since NUT v2.8.0 in favor of "primary".
|
||||
* For the sake of old/new server/client interoperability,
|
||||
* practical implementations should try to use one and fall
|
||||
* back to the other, and only fail if both return "ERR".
|
||||
*/
|
||||
virtual void deviceMaster(const std::string& dev) = 0;
|
||||
virtual void devicePrimary(const std::string& dev) = 0;
|
||||
virtual void deviceForcedShutdown(const std::string& dev) = 0;
|
||||
|
||||
/**
|
||||
* Retrieve the result of a tracking ID.
|
||||
* \param id Tracking ID.
|
||||
*/
|
||||
virtual TrackingResult getTrackingResult(const TrackingID& id) = 0;
|
||||
|
||||
virtual bool hasFeature(const Feature& feature);
|
||||
virtual bool isFeatureEnabled(const Feature& feature) = 0;
|
||||
virtual void setFeature(const Feature& feature, bool status) = 0;
|
||||
|
||||
static const Feature TRACKING;
|
||||
|
||||
protected:
|
||||
Client();
|
||||
|
@ -297,6 +360,11 @@ protected:
|
|||
*/
|
||||
class TcpClient : public Client
|
||||
{
|
||||
/* We have a number of direct-call methods we do not expose
|
||||
* generally, but still want covered with integration tests
|
||||
*/
|
||||
friend class NutActiveClientTest;
|
||||
|
||||
public:
|
||||
/**
|
||||
* Construct a nut TcpClient object.
|
||||
|
@ -309,21 +377,21 @@ public:
|
|||
* \param host Server host name.
|
||||
* \param port Server port.
|
||||
*/
|
||||
TcpClient(const std::string& host, int port = 3493)throw(nut::IOException);
|
||||
~TcpClient();
|
||||
TcpClient(const std::string& host, uint16_t port = 3493);
|
||||
~TcpClient() override;
|
||||
|
||||
/**
|
||||
* Connect it to the specified server.
|
||||
* \param host Server host name.
|
||||
* \param port Server port.
|
||||
*/
|
||||
void connect(const std::string& host, int port = 3493)throw(nut::IOException);
|
||||
void connect(const std::string& host, uint16_t port = 3493);
|
||||
|
||||
/**
|
||||
* Connect to the server.
|
||||
* Host name and ports must have already set (usefull for reconnection).
|
||||
*/
|
||||
void connect()throw(nut::IOException);
|
||||
void connect();
|
||||
|
||||
/**
|
||||
* Test if the connection is active.
|
||||
|
@ -339,13 +407,13 @@ public:
|
|||
* Set the timeout in seconds.
|
||||
* \param timeout Timeout n seconds, negative to block operations.
|
||||
*/
|
||||
void setTimeout(long timeout);
|
||||
void setTimeout(time_t timeout);
|
||||
|
||||
/**
|
||||
* Retrieve the timeout.
|
||||
* \returns Current timeout in seconds.
|
||||
*/
|
||||
long getTimeout()const;
|
||||
time_t getTimeout()const;
|
||||
|
||||
/**
|
||||
* Retriueve the host name of the server the client is connected to.
|
||||
|
@ -356,53 +424,64 @@ public:
|
|||
* Retriueve the port of host of the server the client is connected to.
|
||||
* \return Server port
|
||||
*/
|
||||
int getPort()const;
|
||||
uint16_t getPort()const;
|
||||
|
||||
virtual void authenticate(const std::string& user, const std::string& passwd)throw(NutException);
|
||||
virtual void logout()throw(NutException);
|
||||
virtual void authenticate(const std::string& user, const std::string& passwd) override;
|
||||
virtual void logout() override;
|
||||
|
||||
virtual Device getDevice(const std::string& name)throw(NutException);
|
||||
virtual std::set<std::string> getDeviceNames()throw(NutException);
|
||||
virtual std::string getDeviceDescription(const std::string& name)throw(NutException);
|
||||
virtual Device getDevice(const std::string& name) override;
|
||||
virtual std::set<std::string> getDeviceNames() override;
|
||||
virtual std::string getDeviceDescription(const std::string& name) override;
|
||||
|
||||
virtual std::set<std::string> getDeviceVariableNames(const std::string& dev)throw(NutException);
|
||||
virtual std::set<std::string> getDeviceRWVariableNames(const std::string& dev)throw(NutException);
|
||||
virtual std::string getDeviceVariableDescription(const std::string& dev, const std::string& name)throw(NutException);
|
||||
virtual std::vector<std::string> getDeviceVariableValue(const std::string& dev, const std::string& name)throw(NutException);
|
||||
virtual std::map<std::string,std::vector<std::string> > getDeviceVariableValues(const std::string& dev)throw(NutException);
|
||||
virtual void setDeviceVariable(const std::string& dev, const std::string& name, const std::string& value)throw(NutException);
|
||||
virtual void setDeviceVariable(const std::string& dev, const std::string& name, const std::vector<std::string>& values)throw(NutException);
|
||||
virtual std::set<std::string> getDeviceVariableNames(const std::string& dev) override;
|
||||
virtual std::set<std::string> getDeviceRWVariableNames(const std::string& dev) override;
|
||||
virtual std::string getDeviceVariableDescription(const std::string& dev, const std::string& name) override;
|
||||
virtual std::vector<std::string> getDeviceVariableValue(const std::string& dev, const std::string& name) override;
|
||||
virtual std::map<std::string,std::vector<std::string> > getDeviceVariableValues(const std::string& dev) override;
|
||||
virtual std::map<std::string,std::map<std::string,std::vector<std::string> > > getDevicesVariableValues(const std::set<std::string>& devs) override;
|
||||
virtual TrackingID setDeviceVariable(const std::string& dev, const std::string& name, const std::string& value) override;
|
||||
virtual TrackingID setDeviceVariable(const std::string& dev, const std::string& name, const std::vector<std::string>& values) override;
|
||||
|
||||
virtual std::set<std::string> getDeviceCommandNames(const std::string& dev)throw(NutException);
|
||||
virtual std::string getDeviceCommandDescription(const std::string& dev, const std::string& name)throw(NutException);
|
||||
virtual void executeDeviceCommand(const std::string& dev, const std::string& name)throw(NutException);
|
||||
virtual std::set<std::string> getDeviceCommandNames(const std::string& dev) override;
|
||||
virtual std::string getDeviceCommandDescription(const std::string& dev, const std::string& name) override;
|
||||
virtual TrackingID executeDeviceCommand(const std::string& dev, const std::string& name, const std::string& param="") override;
|
||||
|
||||
virtual void deviceLogin(const std::string& dev)throw(NutException);
|
||||
virtual void deviceMaster(const std::string& dev)throw(NutException);
|
||||
virtual void deviceForcedShutdown(const std::string& dev)throw(NutException);
|
||||
virtual int deviceGetNumLogins(const std::string& dev)throw(NutException);
|
||||
virtual void deviceLogin(const std::string& dev) override;
|
||||
/* FIXME: Protocol update needed to handle master/primary alias
|
||||
* and probably an API bump also, to rename/alias the routine.
|
||||
*/
|
||||
virtual void deviceMaster(const std::string& dev) override;
|
||||
virtual void devicePrimary(const std::string& dev) override;
|
||||
virtual void deviceForcedShutdown(const std::string& dev) override;
|
||||
virtual int deviceGetNumLogins(const std::string& dev) override;
|
||||
|
||||
virtual TrackingResult getTrackingResult(const TrackingID& id) override;
|
||||
|
||||
virtual bool isFeatureEnabled(const Feature& feature) override;
|
||||
virtual void setFeature(const Feature& feature, bool status) override;
|
||||
|
||||
protected:
|
||||
std::string sendQuery(const std::string& req)throw(nut::IOException);
|
||||
static void detectError(const std::string& req)throw(nut::NutException);
|
||||
std::string sendQuery(const std::string& req);
|
||||
void sendAsyncQueries(const std::vector<std::string>& req);
|
||||
static void detectError(const std::string& req);
|
||||
TrackingID sendTrackingQuery(const std::string& req);
|
||||
|
||||
std::vector<std::string> get(const std::string& subcmd, const std::string& params = "")
|
||||
throw(nut::NutException);
|
||||
std::vector<std::string> get(const std::string& subcmd, const std::string& params = "");
|
||||
|
||||
std::vector<std::vector<std::string> > list(const std::string& subcmd, const std::string& params = "")
|
||||
throw(nut::NutException);
|
||||
std::vector<std::vector<std::string> > list(const std::string& subcmd, const std::string& params = "");
|
||||
|
||||
std::vector<std::vector<std::string> > parseList(const std::string& req);
|
||||
|
||||
static std::vector<std::string> explode(const std::string& str, size_t begin=0);
|
||||
static std::string escape(const std::string& str);
|
||||
|
||||
private:
|
||||
std::string _host;
|
||||
int _port;
|
||||
long _timeout;
|
||||
uint16_t _port;
|
||||
time_t _timeout;
|
||||
internal::Socket* _socket;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Device attached to a client.
|
||||
* Device is a lightweight class which can be copied easily.
|
||||
|
@ -411,9 +490,14 @@ class Device
|
|||
{
|
||||
friend class Client;
|
||||
friend class TcpClient;
|
||||
friend class TcpClientMock;
|
||||
#ifdef _NUTCLIENTTEST_BUILD
|
||||
friend class NutClientTest;
|
||||
#endif
|
||||
public:
|
||||
~Device();
|
||||
Device(const Device& dev);
|
||||
Device& operator=(const Device& dev);
|
||||
|
||||
/**
|
||||
* Retrieve the name of the device.
|
||||
|
@ -455,92 +539,97 @@ public:
|
|||
/**
|
||||
* Retrieve the description of the devce if specified.
|
||||
*/
|
||||
std::string getDescription()throw(NutException);
|
||||
std::string getDescription();
|
||||
|
||||
/**
|
||||
* Intend to retrieve the value of a variable of the device.
|
||||
* \param name Name of the variable to get.
|
||||
* \return Value of the variable, if available.
|
||||
*/
|
||||
std::vector<std::string> getVariableValue(const std::string& name)throw(NutException);
|
||||
std::vector<std::string> getVariableValue(const std::string& name);
|
||||
/**
|
||||
* Intend to retrieve values of all variables of the devices.
|
||||
* \return Map of all variables values indexed by their names.
|
||||
*/
|
||||
std::map<std::string,std::vector<std::string> > getVariableValues()throw(NutException);
|
||||
std::map<std::string,std::vector<std::string> > getVariableValues();
|
||||
/**
|
||||
* Retrieve all variables names supported by the device.
|
||||
* \return Set of available variable names.
|
||||
*/
|
||||
std::set<std::string> getVariableNames()throw(NutException);
|
||||
std::set<std::string> getVariableNames();
|
||||
/**
|
||||
* Retrieve all Read/Write variables names supported by the device.
|
||||
* \return Set of available Read/Write variable names.
|
||||
*/
|
||||
std::set<std::string> getRWVariableNames()throw(NutException);
|
||||
std::set<std::string> getRWVariableNames();
|
||||
/**
|
||||
* Intend to set the value of a variable of the device.
|
||||
* \param name Variable name.
|
||||
* \param value New variable value.
|
||||
*/
|
||||
void setVariable(const std::string& name, const std::string& value)throw(NutException);
|
||||
void setVariable(const std::string& name, const std::string& value);
|
||||
/**
|
||||
* Intend to set values of a variable of the device.
|
||||
* \param name Variable name.
|
||||
* \param value New variable values.
|
||||
* \param values Vector of new variable values.
|
||||
*/
|
||||
void setVariable(const std::string& name, const std::vector<std::string>& values)throw(NutException);
|
||||
void setVariable(const std::string& name, const std::vector<std::string>& values);
|
||||
|
||||
/**
|
||||
* Retrieve a Variable object representing the specified variable.
|
||||
* \param name Variable name.
|
||||
* \return Variable object.
|
||||
*/
|
||||
Variable getVariable(const std::string& name)throw(NutException);
|
||||
Variable getVariable(const std::string& name);
|
||||
/**
|
||||
* Retrieve Variable objects representing all variables available for the device.
|
||||
* \return Set of Variable objects.
|
||||
*/
|
||||
std::set<Variable> getVariables()throw(NutException);
|
||||
std::set<Variable> getVariables();
|
||||
/**
|
||||
* Retrieve Variable objects representing all Read/Write variables available for the device.
|
||||
* \return Set of Variable objects.
|
||||
*/
|
||||
std::set<Variable> getRWVariables()throw(NutException);
|
||||
std::set<Variable> getRWVariables();
|
||||
|
||||
/**
|
||||
* Retrieve names of all commands supported by the device.
|
||||
* \return Set of available command names.
|
||||
*/
|
||||
std::set<std::string> getCommandNames()throw(NutException);
|
||||
std::set<std::string> getCommandNames();
|
||||
/**
|
||||
* Retrieve objects for all commands supported by the device.
|
||||
* \return Set of available Command objects.
|
||||
*/
|
||||
std::set<Command> getCommands()throw(NutException);
|
||||
std::set<Command> getCommands();
|
||||
/**
|
||||
* Retrieve an object representing a command of the device.
|
||||
* \param name Command name.
|
||||
* \return Command object.
|
||||
*/
|
||||
Command getCommand(const std::string& name)throw(NutException);
|
||||
Command getCommand(const std::string& name);
|
||||
/**
|
||||
* Intend to execute a command on the device.
|
||||
* \param name Command name.
|
||||
* \param param Additional command parameter
|
||||
*/
|
||||
void executeCommand(const std::string& name)throw(NutException);
|
||||
TrackingID executeCommand(const std::string& name, const std::string& param="");
|
||||
|
||||
/**
|
||||
* Login current client's user for the device.
|
||||
*/
|
||||
void login()throw(NutException);
|
||||
void master()throw(NutException);
|
||||
void forcedShutdown()throw(NutException);
|
||||
void login();
|
||||
/* FIXME: Protocol update needed to handle master/primary alias
|
||||
* and probably an API bump also, to rename/alias the routine.
|
||||
*/
|
||||
void master();
|
||||
void primary();
|
||||
void forcedShutdown();
|
||||
/**
|
||||
* Retrieve the number of logged user for the device.
|
||||
* \return Number of users.
|
||||
*/
|
||||
int getNumLogins()throw(NutException);
|
||||
int getNumLogins();
|
||||
|
||||
protected:
|
||||
Device(Client* client, const std::string& name);
|
||||
|
@ -558,10 +647,15 @@ class Variable
|
|||
{
|
||||
friend class Device;
|
||||
friend class TcpClient;
|
||||
friend class TcpClientMock;
|
||||
#ifdef _NUTCLIENTTEST_BUILD
|
||||
friend class NutClientTest;
|
||||
#endif
|
||||
public:
|
||||
~Variable();
|
||||
|
||||
Variable(const Variable& var);
|
||||
Variable& operator=(const Variable& var);
|
||||
|
||||
/**
|
||||
* Retrieve variable name.
|
||||
|
@ -603,23 +697,23 @@ public:
|
|||
* Intend to retrieve variable value.
|
||||
* \return Value of the variable.
|
||||
*/
|
||||
std::vector<std::string> getValue()throw(NutException);
|
||||
std::vector<std::string> getValue();
|
||||
/**
|
||||
* Intend to retireve variable description.
|
||||
* \return Variable description if provided.
|
||||
*/
|
||||
std::string getDescription()throw(NutException);
|
||||
std::string getDescription();
|
||||
|
||||
/**
|
||||
* Intend to set a value to the variable.
|
||||
* \param value New variable value.
|
||||
*/
|
||||
void setValue(const std::string& value)throw(NutException);
|
||||
void setValue(const std::string& value);
|
||||
/**
|
||||
* Intend to set (multiple) values to the variable.
|
||||
* \param value New variable values.
|
||||
* \param values Vector of new variable values.
|
||||
*/
|
||||
void setValues(const std::vector<std::string>& values)throw(NutException);
|
||||
void setValues(const std::vector<std::string>& values);
|
||||
|
||||
protected:
|
||||
Variable(Device* dev, const std::string& name);
|
||||
|
@ -637,10 +731,15 @@ class Command
|
|||
{
|
||||
friend class Device;
|
||||
friend class TcpClient;
|
||||
friend class TcpClientMock;
|
||||
#ifdef _NUTCLIENTTEST_BUILD
|
||||
friend class NutClientTest;
|
||||
#endif
|
||||
public:
|
||||
~Command();
|
||||
|
||||
Command(const Command& cmd);
|
||||
Command& operator=(const Command& cmd);
|
||||
|
||||
/**
|
||||
* Retrieve command name.
|
||||
|
@ -683,13 +782,13 @@ public:
|
|||
* Intend to retireve command description.
|
||||
* \return Command description if provided.
|
||||
*/
|
||||
std::string getDescription()throw(NutException);
|
||||
std::string getDescription();
|
||||
|
||||
/**
|
||||
* Intend to retrieve command description.
|
||||
* \return Command description if provided.
|
||||
* Intend to execute the instant command on device.
|
||||
* \param param Optional additional command parameter
|
||||
*/
|
||||
void execute()throw(NutException);
|
||||
void execute(const std::string& param="");
|
||||
|
||||
protected:
|
||||
Command(Device* dev, const std::string& name);
|
||||
|
@ -722,13 +821,19 @@ typedef char** strarr;
|
|||
/**
|
||||
* Alloc an array of string.
|
||||
*/
|
||||
strarr strarr_alloc(unsigned short count);
|
||||
strarr strarr_alloc(size_t count);
|
||||
|
||||
/**
|
||||
* Free an array of string.
|
||||
*/
|
||||
void strarr_free(strarr arr);
|
||||
|
||||
/**
|
||||
* Convert C++ types into an array of string.
|
||||
*/
|
||||
strarr stringvector_to_strarr(const std::vector<std::string>& strset);
|
||||
strarr stringset_to_strarr(const std::set<std::string>& strset);
|
||||
|
||||
|
||||
/**
|
||||
* Nut general client types and functions.
|
||||
|
@ -776,7 +881,11 @@ int nutclient_get_device_num_logins(NUTCLIENT_t client, const char* dev);
|
|||
* \param client Nut client handle.
|
||||
* \param dev Device name to test.
|
||||
*/
|
||||
/* FIXME: Protocol update needed to handle master/primary alias
|
||||
* and probably an API bump also, to rename/alias the routine.
|
||||
*/
|
||||
void nutclient_device_master(NUTCLIENT_t client, const char* dev);
|
||||
void nutclient_device_primary(NUTCLIENT_t client, const char* dev);
|
||||
|
||||
/**
|
||||
* Set the FSD flag for the device.
|
||||
|
@ -901,7 +1010,7 @@ char* nutclient_get_device_command_description(NUTCLIENT_t client, const char* d
|
|||
* \param dev Device name.
|
||||
* \param cmd Command name.
|
||||
*/
|
||||
void nutclient_execute_device_command(NUTCLIENT_t client, const char* dev, const char* cmd);
|
||||
void nutclient_execute_device_command(NUTCLIENT_t client, const char* dev, const char* cmd, const char* param="");
|
||||
|
||||
/** \} */
|
||||
|
||||
|
@ -920,9 +1029,9 @@ typedef NUTCLIENT_t NUTCLIENT_TCP_t;
|
|||
* Create a client to NUTD using a TCP connection.
|
||||
* \param host Host name to connect to.
|
||||
* \param port Host port.
|
||||
* \return New client or NULL if failed.
|
||||
* \return New client or nullptr if failed.
|
||||
*/
|
||||
NUTCLIENT_TCP_t nutclient_tcp_create_client(const char* host, unsigned short port);
|
||||
NUTCLIENT_TCP_t nutclient_tcp_create_client(const char* host, uint16_t port);
|
||||
/**
|
||||
* Test if a nut TCP client is connected.
|
||||
* \param client Nut TCP client handle.
|
||||
|
@ -945,12 +1054,12 @@ int nutclient_tcp_reconnect(NUTCLIENT_TCP_t client);
|
|||
* Set the timeout value for the TCP connection.
|
||||
* \param timeout Timeout in seconds, negative for blocking.
|
||||
*/
|
||||
void nutclient_tcp_set_timeout(NUTCLIENT_TCP_t client, long timeout);
|
||||
void nutclient_tcp_set_timeout(NUTCLIENT_TCP_t client, time_t timeout);
|
||||
/**
|
||||
* Retrieve the timeout value for the TCP connection.
|
||||
* \return Timeout value in seconds.
|
||||
*/
|
||||
long nutclient_tcp_get_timeout(NUTCLIENT_TCP_t client);
|
||||
time_t nutclient_tcp_get_timeout(NUTCLIENT_TCP_t client);
|
||||
|
||||
/** \} */
|
||||
|
||||
|
|
252
clients/nutclientmem.cpp
Normal file
252
clients/nutclientmem.cpp
Normal file
|
@ -0,0 +1,252 @@
|
|||
/* nutclientmem.cpp - nutclientmem C++ library implementation
|
||||
|
||||
Copyright (C) 2021 Eric Clappier <ericclappier@eaton.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License 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
|
||||
*/
|
||||
|
||||
#include "nutclientmem.h"
|
||||
#include <common.h>
|
||||
|
||||
namespace nut
|
||||
{
|
||||
|
||||
/*
|
||||
*
|
||||
* Memory Client stub implementation
|
||||
*
|
||||
*/
|
||||
|
||||
Device MemClientStub::getDevice(const std::string& name)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(name);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
std::set<std::string> MemClientStub::getDeviceNames()
|
||||
{
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
std::string MemClientStub::getDeviceDescription(const std::string& name)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(name);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
std::set<std::string> MemClientStub::getDeviceVariableNames(const std::string& dev)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
std::set<std::string> MemClientStub::getDeviceRWVariableNames(const std::string& dev)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
std::string MemClientStub::getDeviceVariableDescription(const std::string& dev, const std::string& name)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
NUT_UNUSED_VARIABLE(name);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
ListValue MemClientStub::getDeviceVariableValue(const std::string& dev, const std::string& name)
|
||||
{
|
||||
ListValue res;
|
||||
auto it_dev = _values.find(dev);
|
||||
if (it_dev != _values.end())
|
||||
{
|
||||
auto map = it_dev->second;
|
||||
auto it_map = map.find(name);
|
||||
if (it_map != map.end())
|
||||
{
|
||||
res = it_map->second;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
ListObject MemClientStub::getDeviceVariableValues(const std::string& dev)
|
||||
{
|
||||
ListObject res;
|
||||
auto it_dev = _values.find(dev);
|
||||
if (it_dev != _values.end())
|
||||
{
|
||||
res = it_dev->second;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
ListDevice MemClientStub::getDevicesVariableValues(const std::set<std::string>& devs)
|
||||
{
|
||||
ListDevice res;
|
||||
for (auto itr = devs.begin(); itr != devs.end(); itr++)
|
||||
{
|
||||
std::string dev = *itr;
|
||||
auto it_dev = _values.find(dev);
|
||||
if (it_dev != _values.end())
|
||||
{
|
||||
res.insert(std::pair<std::string, ListObject>(dev, it_dev->second));
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
TrackingID MemClientStub::setDeviceVariable(const std::string& dev, const std::string& name, const std::string& value)
|
||||
{
|
||||
auto it_dev = _values.find(dev);
|
||||
if (it_dev == _values.end())
|
||||
{
|
||||
ListObject list;
|
||||
_values.emplace(dev, list);
|
||||
it_dev = _values.find(dev);
|
||||
}
|
||||
if (it_dev != _values.end())
|
||||
{
|
||||
auto map = &(it_dev->second);
|
||||
auto it_map = map->find(name);
|
||||
if (it_map != map->end())
|
||||
{
|
||||
it_map->second[0] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
ListValue list_value;
|
||||
list_value.push_back(value);
|
||||
map->emplace(name, list_value);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
TrackingID MemClientStub::setDeviceVariable(const std::string& dev, const std::string& name, const ListValue& values)
|
||||
{
|
||||
auto it_dev = _values.find(dev);
|
||||
if (it_dev != _values.end())
|
||||
{
|
||||
auto map = &(it_dev->second);
|
||||
auto it_map = map->find(name);
|
||||
if (it_map != map->end())
|
||||
{
|
||||
it_map->second = values;
|
||||
}
|
||||
else
|
||||
{
|
||||
map->emplace(name, values);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::set<std::string> MemClientStub::getDeviceCommandNames(const std::string& dev)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
std::string MemClientStub::getDeviceCommandDescription(const std::string& dev, const std::string& name)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
NUT_UNUSED_VARIABLE(name);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
TrackingID MemClientStub::executeDeviceCommand(const std::string& dev, const std::string& name, const std::string& param)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
NUT_UNUSED_VARIABLE(name);
|
||||
NUT_UNUSED_VARIABLE(param);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
void MemClientStub::deviceLogin(const std::string& dev)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
/* Note: "master" is deprecated, but supported
|
||||
* for mixing old/new client/server combos: */
|
||||
void MemClientStub::deviceMaster(const std::string& dev)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
void MemClientStub::devicePrimary(const std::string& dev)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
void MemClientStub::deviceForcedShutdown(const std::string& dev)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
int MemClientStub::deviceGetNumLogins(const std::string& dev)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(dev);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
TrackingResult MemClientStub::getTrackingResult(const TrackingID& id)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(id);
|
||||
throw NutException("Not implemented");
|
||||
//return TrackingResult::SUCCESS;
|
||||
}
|
||||
|
||||
bool MemClientStub::isFeatureEnabled(const Feature& feature)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(feature);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
void MemClientStub::setFeature(const Feature& feature, bool status)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(feature);
|
||||
NUT_UNUSED_VARIABLE(status);
|
||||
throw NutException("Not implemented");
|
||||
}
|
||||
|
||||
} /* namespace nut */
|
||||
|
||||
/**
|
||||
* C nutclient API.
|
||||
*/
|
||||
extern "C" {
|
||||
|
||||
NUTCLIENT_MEM_t nutclient_mem_create_client()
|
||||
{
|
||||
nut::MemClientStub* client = new nut::MemClientStub;
|
||||
try
|
||||
{
|
||||
return static_cast<NUTCLIENT_MEM_t>(client);
|
||||
}
|
||||
catch(nut::NutException& ex)
|
||||
{
|
||||
// TODO really catch it
|
||||
NUT_UNUSED_VARIABLE(ex);
|
||||
delete client;
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
} /* extern "C" */
|
118
clients/nutclientmem.h
Normal file
118
clients/nutclientmem.h
Normal file
|
@ -0,0 +1,118 @@
|
|||
/* nutclientmem.h - definitions for nutclientmem C/C++ library
|
||||
|
||||
Copyright (C) 2021 Eric Clappier <ericclappier@eaton.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License 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
|
||||
*/
|
||||
|
||||
#ifndef NUTCLIENTMEM_HPP_SEEN
|
||||
#define NUTCLIENTMEM_HPP_SEEN
|
||||
|
||||
/* Begin of C++ nutclient library declaration */
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include "nutclient.h"
|
||||
|
||||
namespace nut
|
||||
{
|
||||
|
||||
typedef std::vector<std::string> ListValue;
|
||||
typedef std::map<std::string, ListValue> ListObject;
|
||||
typedef std::map<std::string, ListObject> ListDevice;
|
||||
|
||||
/**
|
||||
* Memory client stub.
|
||||
* Class to stub TCPClient for test (data store in local memory).
|
||||
*/
|
||||
class MemClientStub : public Client
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Construct a nut MemClientStub object.
|
||||
*/
|
||||
MemClientStub() {}
|
||||
~MemClientStub() override {}
|
||||
|
||||
virtual void authenticate(const std::string& user, const std::string& passwd) override {
|
||||
NUT_UNUSED_VARIABLE(user);
|
||||
NUT_UNUSED_VARIABLE(passwd);
|
||||
}
|
||||
virtual void logout() override {}
|
||||
|
||||
virtual Device getDevice(const std::string& name) override;
|
||||
virtual std::set<std::string> getDeviceNames() override;
|
||||
virtual std::string getDeviceDescription(const std::string& name) override;
|
||||
|
||||
virtual std::set<std::string> getDeviceVariableNames(const std::string& dev) override;
|
||||
virtual std::set<std::string> getDeviceRWVariableNames(const std::string& dev) override;
|
||||
virtual std::string getDeviceVariableDescription(const std::string& dev, const std::string& name) override;
|
||||
virtual ListValue getDeviceVariableValue(const std::string& dev, const std::string& name) override;
|
||||
virtual ListObject getDeviceVariableValues(const std::string& dev) override;
|
||||
virtual ListDevice getDevicesVariableValues(const std::set<std::string>& devs) override;
|
||||
virtual TrackingID setDeviceVariable(const std::string& dev, const std::string& name, const std::string& value) override;
|
||||
virtual TrackingID setDeviceVariable(const std::string& dev, const std::string& name, const ListValue& values) override;
|
||||
|
||||
virtual std::set<std::string> getDeviceCommandNames(const std::string& dev) override;
|
||||
virtual std::string getDeviceCommandDescription(const std::string& dev, const std::string& name) override;
|
||||
virtual TrackingID executeDeviceCommand(const std::string& dev, const std::string& name, const std::string& param="") override;
|
||||
|
||||
virtual void deviceLogin(const std::string& dev) override;
|
||||
/* Note: "master" is deprecated, but supported
|
||||
* for mixing old/new client/server combos: */
|
||||
virtual void deviceMaster(const std::string& dev) override;
|
||||
virtual void devicePrimary(const std::string& dev) override;
|
||||
virtual void deviceForcedShutdown(const std::string& dev) override;
|
||||
virtual int deviceGetNumLogins(const std::string& dev) override;
|
||||
|
||||
virtual TrackingResult getTrackingResult(const TrackingID& id) override;
|
||||
|
||||
virtual bool isFeatureEnabled(const Feature& feature) override;
|
||||
virtual void setFeature(const Feature& feature, bool status) override;
|
||||
|
||||
private:
|
||||
ListDevice _values;
|
||||
};
|
||||
|
||||
} /* namespace nut */
|
||||
|
||||
#endif /* __cplusplus */
|
||||
/* End of C++ nutclient library declaration */
|
||||
|
||||
/* Begin of C nutclient library declaration */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/**
|
||||
* Nut MEM client dedicated types and functions
|
||||
*/
|
||||
/**
|
||||
* Hidden structure representing a MEM connection.
|
||||
* NUTCLIENT_MEM_t is back compatible to NUTCLIENT_t.
|
||||
*/
|
||||
typedef NUTCLIENT_t NUTCLIENT_MEM_t;
|
||||
|
||||
/**
|
||||
* Create a client to NUTD using memory.
|
||||
* \return New client or nullptr if failed.
|
||||
*/
|
||||
NUTCLIENT_MEM_t nutclient_mem_create_client();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
/* End of C nutclient library declaration */
|
||||
|
||||
#endif /* NUTCLIENTMOCK_HPP_SEEN */
|
|
@ -17,13 +17,19 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef NUT_STATUS_H_SEEN
|
||||
#define NUT_STATUS_H_SEEN 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* *INDENT-OFF* */
|
||||
extern "C" {
|
||||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
struct {
|
||||
/* This is only used in upsstats.c, but might it also have external consumers?..
|
||||
* To move or not to move?..
|
||||
*/
|
||||
static struct {
|
||||
char *name;
|
||||
char *desc;
|
||||
int severity;
|
||||
|
@ -48,3 +54,4 @@ struct {
|
|||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
#endif /* NUT_STATUS_H_SEEN */
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "nut_stdint.h"
|
||||
#include "upsclient.h"
|
||||
|
||||
static char *upsname = NULL, *hostname = NULL;
|
||||
|
@ -58,7 +59,7 @@ static void usage(const char *prog)
|
|||
static void printvar(const char *var)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -86,7 +87,7 @@ static void printvar(const char *var)
|
|||
}
|
||||
|
||||
if (numa < numq) {
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least %d)", numa, numq);
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %zu args, need at least %zu)", numa, numq);
|
||||
}
|
||||
|
||||
printf("%s\n", answer[3]);
|
||||
|
@ -95,7 +96,7 @@ static void printvar(const char *var)
|
|||
static void list_vars(void)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -119,7 +120,7 @@ static void list_vars(void)
|
|||
|
||||
/* VAR <upsname> <varname> <val> */
|
||||
if (numa < 4) {
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 4)", numa);
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %zu args, need at least 4)", numa);
|
||||
}
|
||||
|
||||
printf("%s: %s\n", answer[2], answer[3]);
|
||||
|
@ -129,7 +130,7 @@ static void list_vars(void)
|
|||
static void list_upses(int verbose)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -151,7 +152,7 @@ static void list_upses(int verbose)
|
|||
|
||||
/* UPS <upsname> <description> */
|
||||
if (numa < 3) {
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 3)", numa);
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %zu args, need at least 3)", numa);
|
||||
}
|
||||
|
||||
if(verbose) {
|
||||
|
@ -165,7 +166,7 @@ static void list_upses(int verbose)
|
|||
static void list_clients(const char *devname)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -188,7 +189,7 @@ static void list_clients(const char *devname)
|
|||
|
||||
/* CLIENT <upsname> <address> */
|
||||
if (numa < 3) {
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 3)", numa);
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %zu args, need at least 3)", numa);
|
||||
}
|
||||
|
||||
printf("%s\n", answer[2]);
|
||||
|
@ -208,7 +209,8 @@ static void clean_exit(void)
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i, port;
|
||||
int i;
|
||||
uint16_t port;
|
||||
int varlist = 0, clientlist = 0, verbose = 0;
|
||||
const char *prog = xbasename(argv[0]);
|
||||
|
||||
|
@ -218,7 +220,9 @@ int main(int argc, char **argv)
|
|||
{
|
||||
case 'L':
|
||||
verbose = 1;
|
||||
goto fallthrough_case_l;
|
||||
case 'l':
|
||||
fallthrough_case_l:
|
||||
varlist = 1;
|
||||
break;
|
||||
case 'c':
|
||||
|
@ -227,6 +231,9 @@ int main(int argc, char **argv)
|
|||
|
||||
case 'V':
|
||||
fatalx(EXIT_SUCCESS, "Network UPS Tools upscmd %s", UPS_VERSION);
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
exit(EXIT_SUCCESS); /* Should not get here in practice, but compiler is afraid we can fall through */
|
||||
#endif
|
||||
|
||||
case 'h':
|
||||
default:
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
*/
|
||||
|
||||
#include "config.h" /* safe because it doesn't contain prototypes */
|
||||
#include "nut_platform.h"
|
||||
|
||||
#ifdef HAVE_PTHREAD
|
||||
/* this include is needed on AIX to have errno stored in thread local storage */
|
||||
|
@ -37,9 +38,24 @@
|
|||
#include <arpa/inet.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "upsclient.h"
|
||||
#include "common.h"
|
||||
#include "nut_stdint.h"
|
||||
#include "timehead.h"
|
||||
#include "upsclient.h"
|
||||
|
||||
/* WA for Solaris/i386 bug: non-blocking connect sets errno to ENOENT */
|
||||
#if (defined NUT_PLATFORM_SOLARIS)
|
||||
#define SOLARIS_i386_NBCONNECT_ENOENT(status) ( (!strcmp("i386", CPU_TYPE)) ? (ENOENT == (status)) : 0 )
|
||||
#else
|
||||
#define SOLARIS_i386_NBCONNECT_ENOENT(status) (0)
|
||||
#endif /* end of Solaris/i386 WA for non-blocking connect */
|
||||
|
||||
/* WA for AIX bug: non-blocking connect sets errno to 0 */
|
||||
#if (defined NUT_PLATFORM_AIX)
|
||||
#define AIX_NBCONNECT_0(status) (0 == (status))
|
||||
#else
|
||||
#define AIX_NBCONNECT_0(status) (0)
|
||||
#endif /* end of AIX WA for non-blocking connect */
|
||||
|
||||
#ifdef WITH_NSS
|
||||
#include <prerror.h>
|
||||
|
@ -60,7 +76,7 @@
|
|||
#define shutdown_how 2
|
||||
#endif
|
||||
|
||||
struct {
|
||||
static struct {
|
||||
int flags;
|
||||
const char *str;
|
||||
} upscli_errlist[] =
|
||||
|
@ -138,7 +154,7 @@ static char* nsscertpasswd = NULL;
|
|||
|
||||
static void ssl_debug(void)
|
||||
{
|
||||
int e;
|
||||
unsigned long e;
|
||||
char errmsg[SMALLBUF];
|
||||
|
||||
while ((e = ERR_get_error()) != 0) {
|
||||
|
@ -147,32 +163,36 @@ static void ssl_debug(void)
|
|||
}
|
||||
}
|
||||
|
||||
static int ssl_error(SSL *ssl, int ret)
|
||||
static int ssl_error(SSL *ssl, ssize_t ret)
|
||||
{
|
||||
int e;
|
||||
|
||||
e = SSL_get_error(ssl, ret);
|
||||
if (ret >= INT_MAX) {
|
||||
upslogx(LOG_ERR, "ssl_error() ret=%zd would not fit in an int", ret);
|
||||
return -1;
|
||||
}
|
||||
e = SSL_get_error(ssl, (int)ret);
|
||||
|
||||
switch (e)
|
||||
{
|
||||
case SSL_ERROR_WANT_READ:
|
||||
upslogx(LOG_ERR, "ssl_error() ret=%d SSL_ERROR_WANT_READ", ret);
|
||||
upslogx(LOG_ERR, "ssl_error() ret=%zd SSL_ERROR_WANT_READ", ret);
|
||||
break;
|
||||
|
||||
case SSL_ERROR_WANT_WRITE:
|
||||
upslogx(LOG_ERR, "ssl_error() ret=%d SSL_ERROR_WANT_WRITE", ret);
|
||||
upslogx(LOG_ERR, "ssl_error() ret=%zd SSL_ERROR_WANT_WRITE", ret);
|
||||
break;
|
||||
|
||||
case SSL_ERROR_SYSCALL:
|
||||
if (ret == 0 && ERR_peek_error() == 0) {
|
||||
upslogx(LOG_ERR, "ssl_error() EOF from client");
|
||||
} else {
|
||||
upslogx(LOG_ERR, "ssl_error() ret=%d SSL_ERROR_SYSCALL", ret);
|
||||
upslogx(LOG_ERR, "ssl_error() ret=%zd SSL_ERROR_SYSCALL", ret);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
upslogx(LOG_ERR, "ssl_error() ret=%d SSL_ERROR %d", ret, e);
|
||||
upslogx(LOG_ERR, "ssl_error() ret=%zd SSL_ERROR %d", ret, e);
|
||||
ssl_debug();
|
||||
}
|
||||
|
||||
|
@ -184,6 +204,9 @@ static int ssl_error(SSL *ssl, int ret)
|
|||
static char *nss_password_callback(PK11SlotInfo *slot, PRBool retry,
|
||||
void *arg)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(retry);
|
||||
NUT_UNUSED_VARIABLE(arg);
|
||||
|
||||
upslogx(LOG_INFO, "Intend to retrieve password for %s / %s: password %sconfigured",
|
||||
PK11_GetSlotName(slot), PK11_GetTokenName(slot), nsscertpasswd?"":"not ");
|
||||
return nsscertpasswd ? PL_strdup(nsscertpasswd) : NULL;
|
||||
|
@ -218,6 +241,10 @@ static SECStatus AuthCertificateDontVerify(CERTCertDBHandle *arg, PRFileDesc *fd
|
|||
PRBool checksig, PRBool isServer)
|
||||
{
|
||||
UPSCONN_t *ups = (UPSCONN_t *)SSL_RevealPinArg(fd);
|
||||
NUT_UNUSED_VARIABLE(arg);
|
||||
NUT_UNUSED_VARIABLE(checksig);
|
||||
NUT_UNUSED_VARIABLE(isServer);
|
||||
|
||||
upslogx(LOG_INFO, "Do not intend to authenticate server %s",
|
||||
ups?ups->host:"<unnamed>");
|
||||
return SECSuccess;
|
||||
|
@ -226,6 +253,8 @@ static SECStatus AuthCertificateDontVerify(CERTCertDBHandle *arg, PRFileDesc *fd
|
|||
static SECStatus BadCertHandler(UPSCONN_t *arg, PRFileDesc *fd)
|
||||
{
|
||||
HOST_CERT_t* cert;
|
||||
NUT_UNUSED_VARIABLE(fd);
|
||||
|
||||
upslogx(LOG_WARNING, "Certificate validation failed for %s",
|
||||
(arg&&arg->host)?arg->host:"<unnamed>");
|
||||
/* BadCertHandler is called when the NSS certificate validation is failed.
|
||||
|
@ -273,6 +302,8 @@ static SECStatus GetClientAuthData(UPSCONN_t *arg, PRFileDesc *fd,
|
|||
|
||||
static void HandshakeCallback(PRFileDesc *fd, UPSCONN_t *client_data)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(fd);
|
||||
|
||||
upslogx(LOG_INFO, "SSL handshake done successfully with server %s",
|
||||
client_data->host);
|
||||
}
|
||||
|
@ -283,17 +314,19 @@ int upscli_init(int certverify, const char *certpath,
|
|||
const char *certname, const char *certpasswd)
|
||||
{
|
||||
#ifdef WITH_OPENSSL
|
||||
int ret, ssl_mode = SSL_VERIFY_NONE;
|
||||
#if OPENSSL_VERSION_NUMBER >= 0x10000000L
|
||||
const SSL_METHOD *ssl_method;
|
||||
#else
|
||||
SSL_METHOD *ssl_method;
|
||||
#endif
|
||||
long ret;
|
||||
int ssl_mode = SSL_VERIFY_NONE;
|
||||
NUT_UNUSED_VARIABLE(certname);
|
||||
NUT_UNUSED_VARIABLE(certpasswd);
|
||||
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
||||
SECStatus status;
|
||||
#else
|
||||
NUT_UNUSED_VARIABLE(certverify);
|
||||
NUT_UNUSED_VARIABLE(certpath);
|
||||
NUT_UNUSED_VARIABLE(certname);
|
||||
NUT_UNUSED_VARIABLE(certpasswd);
|
||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||
|
||||
|
||||
if (upscli_initialized == 1) {
|
||||
upslogx(LOG_WARNING, "upscli already initialized");
|
||||
return -1;
|
||||
|
@ -301,21 +334,31 @@ int upscli_init(int certverify, const char *certpath,
|
|||
|
||||
#ifdef WITH_OPENSSL
|
||||
|
||||
SSL_library_init();
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
SSL_load_error_strings();
|
||||
SSL_library_init();
|
||||
|
||||
ssl_method = TLSv1_client_method();
|
||||
ssl_ctx = SSL_CTX_new(SSLv23_client_method());
|
||||
#else
|
||||
ssl_ctx = SSL_CTX_new(TLS_client_method());
|
||||
#endif
|
||||
|
||||
if (!ssl_method) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssl_ctx = SSL_CTX_new(ssl_method);
|
||||
if (!ssl_ctx) {
|
||||
upslogx(LOG_ERR, "Can not initialize SSL context");
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
/* set minimum protocol TLSv1 */
|
||||
SSL_CTX_set_options(ssl_ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
|
||||
#else
|
||||
ret = SSL_CTX_set_min_proto_version(ssl_ctx, TLS1_VERSION);
|
||||
if (ret != 1) {
|
||||
upslogx(LOG_ERR, "Can not set minimum protocol to TLSv1");
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!certpath) {
|
||||
if (certverify == 1) {
|
||||
upslogx(LOG_ERR, "Can not verify certificate if any is specified");
|
||||
|
@ -392,6 +435,11 @@ int upscli_init(int certverify, const char *certpath,
|
|||
nsscertpasswd = xstrdup(certpasswd);
|
||||
}
|
||||
verify_certificate = certverify;
|
||||
#else
|
||||
/* Note: historically we do not return with error here,
|
||||
* just fall through to below and treat as initialized.
|
||||
*/
|
||||
upslogx(LOG_ERR, "upscli_init called but SSL wasn't compiled in");
|
||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||
|
||||
upscli_initialized = 1;
|
||||
|
@ -408,6 +456,11 @@ void upscli_add_host_cert(const char* hostname, const char* certname, int certve
|
|||
cert->certverify = certverify;
|
||||
cert->forcessl = forcessl;
|
||||
first_host_cert = cert;
|
||||
#else
|
||||
NUT_UNUSED_VARIABLE(hostname);
|
||||
NUT_UNUSED_VARIABLE(certname);
|
||||
NUT_UNUSED_VARIABLE(certverify);
|
||||
NUT_UNUSED_VARIABLE(forcessl);
|
||||
#endif /* WITH_NSS */
|
||||
}
|
||||
|
||||
|
@ -423,11 +476,13 @@ static HOST_CERT_t* upscli_find_host_cert(const char* hostname)
|
|||
cert = cert->next;
|
||||
}
|
||||
}
|
||||
#else
|
||||
NUT_UNUSED_VARIABLE(hostname);
|
||||
#endif /* WITH_NSS */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int upscli_cleanup()
|
||||
int upscli_cleanup(void)
|
||||
{
|
||||
#ifdef WITH_OPENSSL
|
||||
if (ssl_ctx) {
|
||||
|
@ -462,6 +517,16 @@ const char *upscli_strerror(UPSCONN_t *ups)
|
|||
char sslbuf[UPSCLI_ERRBUF_LEN];
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
|
||||
if (!ups) {
|
||||
return upscli_errlist[UPSCLI_ERR_INVALIDARG].str;
|
||||
}
|
||||
|
@ -519,6 +584,10 @@ const char *upscli_strerror(UPSCONN_t *ups)
|
|||
return ups->errbuf;
|
||||
}
|
||||
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
/* fallthrough */
|
||||
|
||||
snprintf(ups->errbuf, UPSCLI_ERRBUF_LEN, "Unknown error flag %d",
|
||||
|
@ -530,9 +599,9 @@ const char *upscli_strerror(UPSCONN_t *ups)
|
|||
/* Read up to buflen bytes from fd and return the number of bytes
|
||||
read. If no data is available within d_sec + d_usec, return 0.
|
||||
On error, a value < 0 is returned (errno indicates error). */
|
||||
static int upscli_select_read(const int fd, void *buf, const size_t buflen, const long d_sec, const long d_usec)
|
||||
static ssize_t upscli_select_read(const int fd, void *buf, const size_t buflen, const time_t d_sec, const suseconds_t d_usec)
|
||||
{
|
||||
int ret;
|
||||
ssize_t ret;
|
||||
fd_set fds;
|
||||
struct timeval tv;
|
||||
|
||||
|
@ -551,17 +620,37 @@ static int upscli_select_read(const int fd, void *buf, const size_t buflen, cons
|
|||
return read(fd, buf, buflen);
|
||||
}
|
||||
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_BESIDEFUNC) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC) )
|
||||
# pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC
|
||||
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC
|
||||
# pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
|
||||
#endif
|
||||
/* internal: abstract the SSL calls for the other functions */
|
||||
static int net_read(UPSCONN_t *ups, char *buf, size_t buflen)
|
||||
static ssize_t net_read(UPSCONN_t *ups, char *buf, size_t buflen, const time_t timeout)
|
||||
{
|
||||
int ret;
|
||||
ssize_t ret = -1;
|
||||
|
||||
#ifdef WITH_SSL
|
||||
if (ups->ssl) {
|
||||
#ifdef WITH_OPENSSL
|
||||
ret = SSL_read(ups->ssl, buf, buflen);
|
||||
/* SSL_* routines deal with int type for return and buflen
|
||||
* We might need to window our I/O if we exceed 2GB (in
|
||||
* 32-bit builds)... Not likely to exceed in 64-bit builds,
|
||||
* but smaller systems with 16-bits might be endangered :)
|
||||
*/
|
||||
assert(buflen <= INT_MAX);
|
||||
int iret = SSL_read(ups->ssl, buf, (int)buflen);
|
||||
assert(iret <= SSIZE_MAX);
|
||||
ret = (ssize_t)iret;
|
||||
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
||||
ret = PR_Read(ups->ssl, buf, buflen);
|
||||
/* PR_* routines deal in PRInt32 type
|
||||
* We might need to window our I/O if we exceed 2GB :) */
|
||||
assert(buflen <= PR_INT32_MAX);
|
||||
ret = PR_Read(ups->ssl, buf, (PRInt32)buflen);
|
||||
#endif /* WITH_OPENSSL | WITH_NSS*/
|
||||
|
||||
if (ret < 1) {
|
||||
|
@ -572,7 +661,7 @@ static int net_read(UPSCONN_t *ups, char *buf, size_t buflen)
|
|||
}
|
||||
#endif
|
||||
|
||||
ret = upscli_select_read(ups->fd, buf, buflen, 5, 0);
|
||||
ret = upscli_select_read(ups->fd, buf, buflen, timeout, 0);
|
||||
|
||||
/* error reading data, server disconnected? */
|
||||
if (ret < 0) {
|
||||
|
@ -587,13 +676,16 @@ static int net_read(UPSCONN_t *ups, char *buf, size_t buflen)
|
|||
|
||||
return ret;
|
||||
}
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_BESIDEFUNC) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC) )
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
/* Write up to buflen bytes to fd and return the number of bytes
|
||||
written. If no data is available within d_sec + d_usec, return 0.
|
||||
On error, a value < 0 is returned (errno indicates error). */
|
||||
static int upscli_select_write(const int fd, const void *buf, const size_t buflen, const long d_sec, const long d_usec)
|
||||
static ssize_t upscli_select_write(const int fd, const void *buf, const size_t buflen, const time_t d_sec, const suseconds_t d_usec)
|
||||
{
|
||||
int ret;
|
||||
ssize_t ret;
|
||||
fd_set fds;
|
||||
struct timeval tv;
|
||||
|
||||
|
@ -612,17 +704,37 @@ static int upscli_select_write(const int fd, const void *buf, const size_t bufle
|
|||
return write(fd, buf, buflen);
|
||||
}
|
||||
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_BESIDEFUNC) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC) )
|
||||
# pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC
|
||||
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC
|
||||
# pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
|
||||
#endif
|
||||
/* internal: abstract the SSL calls for the other functions */
|
||||
static int net_write(UPSCONN_t *ups, const char *buf, size_t buflen)
|
||||
static ssize_t net_write(UPSCONN_t *ups, const char *buf, size_t buflen, const time_t timeout)
|
||||
{
|
||||
int ret;
|
||||
ssize_t ret = -1;
|
||||
|
||||
#ifdef WITH_SSL
|
||||
if (ups->ssl) {
|
||||
#ifdef WITH_OPENSSL
|
||||
ret = SSL_write(ups->ssl, buf, buflen);
|
||||
/* SSL_* routines deal with int type for return and buflen
|
||||
* We might need to window our I/O if we exceed 2GB (in
|
||||
* 32-bit builds)... Not likely to exceed in 64-bit builds,
|
||||
* but smaller systems with 16-bits might be endangered :)
|
||||
*/
|
||||
assert(buflen <= INT_MAX);
|
||||
int iret = SSL_write(ups->ssl, buf, (int)buflen);
|
||||
assert(iret <= SSIZE_MAX);
|
||||
ret = (ssize_t)iret;
|
||||
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
||||
ret = PR_Write(ups->ssl, buf, buflen);
|
||||
/* PR_* routines deal in PRInt32 type
|
||||
* We might need to window our I/O if we exceed 2GB :) */
|
||||
assert(buflen <= PR_INT32_MAX);
|
||||
ret = PR_Write(ups->ssl, buf, (PRInt32)buflen);
|
||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||
|
||||
if (ret < 1) {
|
||||
|
@ -633,7 +745,7 @@ static int net_write(UPSCONN_t *ups, const char *buf, size_t buflen)
|
|||
}
|
||||
#endif
|
||||
|
||||
ret = upscli_select_write(ups->fd, buf, buflen, 0, 0);
|
||||
ret = upscli_select_write(ups->fd, buf, buflen, timeout, 0);
|
||||
|
||||
/* error writing data, server disconnected? */
|
||||
if (ret < 0) {
|
||||
|
@ -648,6 +760,9 @@ static int net_write(UPSCONN_t *ups, const char *buf, size_t buflen)
|
|||
|
||||
return ret;
|
||||
}
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_BESIDEFUNC) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC) )
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WITH_SSL
|
||||
|
@ -722,7 +837,7 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
|||
switch(res)
|
||||
{
|
||||
case 1:
|
||||
upsdebugx(3, "SSL connected");
|
||||
upsdebugx(3, "SSL connected (%s)", SSL_get_version(ups->ssl));
|
||||
break;
|
||||
case 0:
|
||||
upslog_with_errno(1, "SSL_connect do not accept handshake.");
|
||||
|
@ -825,12 +940,15 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
|||
|
||||
static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(ups);
|
||||
NUT_UNUSED_VARIABLE(verifycert);
|
||||
|
||||
return 0; /* not supported */
|
||||
}
|
||||
|
||||
#endif /* WITH_SSL */
|
||||
|
||||
int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags,struct timeval * timeout)
|
||||
int upscli_tryconnect(UPSCONN_t *ups, const char *host, uint16_t port, int flags, struct timeval * timeout)
|
||||
{
|
||||
int sock_fd;
|
||||
struct addrinfo hints, *res, *ai;
|
||||
|
@ -856,7 +974,7 @@ int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags,stru
|
|||
return -1;
|
||||
}
|
||||
|
||||
snprintf(sport, sizeof(sport), "%hu", (unsigned short int)port);
|
||||
snprintf(sport, sizeof(sport), "%ju", (uintmax_t)port);
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
|
||||
|
@ -916,7 +1034,7 @@ int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags,stru
|
|||
}
|
||||
|
||||
while ((v = connect(sock_fd, ai->ai_addr, ai->ai_addrlen)) < 0) {
|
||||
if(errno == EINPROGRESS) {
|
||||
if(errno == EINPROGRESS || SOLARIS_i386_NBCONNECT_ENOENT(errno) || AIX_NBCONNECT_0(errno)) {
|
||||
FD_ZERO(&wfds);
|
||||
FD_SET(sock_fd, &wfds);
|
||||
select(sock_fd+1,NULL,&wfds,NULL,
|
||||
|
@ -1004,24 +1122,24 @@ int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags,stru
|
|||
if (tryssl || forcessl) {
|
||||
ret = upscli_sslinit(ups, certverify);
|
||||
if (forcessl && ret != 1) {
|
||||
upslogx(LOG_ERR, "Can not connect to %s in SSL, disconnect", host);
|
||||
upslogx(LOG_ERR, "Can not connect to NUT server %s in SSL, disconnect", host);
|
||||
ups->upserror = UPSCLI_ERR_SSLFAIL;
|
||||
upscli_disconnect(ups);
|
||||
return -1;
|
||||
} else if (tryssl && ret == -1) {
|
||||
upslogx(LOG_NOTICE, "Error while connecting to %s, disconnect", host);
|
||||
upslogx(LOG_NOTICE, "Error while connecting to NUT server %s, disconnect", host);
|
||||
upscli_disconnect(ups);
|
||||
return -1;
|
||||
} else if (tryssl && ret == 0) {
|
||||
if (certverify != 0) {
|
||||
upslogx(LOG_NOTICE, "Can not connect to %s in SSL and "
|
||||
upslogx(LOG_NOTICE, "Can not connect to NUT server %s in SSL and "
|
||||
"certificate is needed, disconnect", host);
|
||||
upscli_disconnect(ups);
|
||||
return -1;
|
||||
}
|
||||
upsdebugx(3, "Can not connect to %s in SSL, continue uncrypted", host);
|
||||
upsdebugx(3, "Can not connect to NUT server %s in SSL, continue unencrypted", host);
|
||||
} else {
|
||||
upslogx(LOG_INFO, "Connected to %s in SSL", host);
|
||||
upslogx(LOG_INFO, "Connected to NUT server %s in SSL", host);
|
||||
if (certverify == 0) {
|
||||
/* you REALLY should set CERTVERIFY to 1 if using SSL... */
|
||||
upslogx(LOG_WARNING, "Certificate verification is disabled");
|
||||
|
@ -1032,7 +1150,7 @@ int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags,stru
|
|||
return 0;
|
||||
}
|
||||
|
||||
int upscli_connect(UPSCONN_t *ups, const char *host, int port, int flags)
|
||||
int upscli_connect(UPSCONN_t *ups, const char *host, uint16_t port, int flags)
|
||||
{
|
||||
return upscli_tryconnect(ups,host,port,flags,NULL);
|
||||
}
|
||||
|
@ -1105,9 +1223,9 @@ static int upscli_errcheck(UPSCONN_t *ups, char *buf)
|
|||
}
|
||||
|
||||
static void build_cmd(char *buf, size_t bufsize, const char *cmdname,
|
||||
int numarg, const char **arg)
|
||||
size_t numarg, const char **arg)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
size_t len;
|
||||
char enc[UPSCLI_NETBUF_LEN];
|
||||
const char *format;
|
||||
|
@ -1127,8 +1245,20 @@ static void build_cmd(char *buf, size_t bufsize, const char *cmdname,
|
|||
/* snprintfcat would tie us to common */
|
||||
|
||||
len = strlen(buf);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
snprintf(buf + len, bufsize - len, format,
|
||||
pconf_encode(arg[i], enc, sizeof(enc)));
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
}
|
||||
|
||||
len = strlen(buf);
|
||||
|
@ -1136,9 +1266,9 @@ static void build_cmd(char *buf, size_t bufsize, const char *cmdname,
|
|||
}
|
||||
|
||||
/* make sure upsd is giving us what we asked for */
|
||||
static int verify_resp(int num, const char **q, char **a)
|
||||
static int verify_resp(size_t num, const char **q, char **a)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
if (strcasecmp(q[i], a[i]) != 0) {
|
||||
|
@ -1151,8 +1281,8 @@ static int verify_resp(int num, const char **q, char **a)
|
|||
return 1; /* OK */
|
||||
}
|
||||
|
||||
int upscli_get(UPSCONN_t *ups, unsigned int numq, const char **query,
|
||||
unsigned int *numa, char ***answer)
|
||||
int upscli_get(UPSCONN_t *ups, size_t numq, const char **query,
|
||||
size_t *numa, char ***answer)
|
||||
{
|
||||
char cmd[UPSCLI_NETBUF_LEN], tmp[UPSCLI_NETBUF_LEN];
|
||||
|
||||
|
@ -1204,7 +1334,7 @@ int upscli_get(UPSCONN_t *ups, unsigned int numq, const char **query,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int upscli_list_start(UPSCONN_t *ups, unsigned int numq, const char **query)
|
||||
int upscli_list_start(UPSCONN_t *ups, size_t numq, const char **query)
|
||||
{
|
||||
char cmd[UPSCLI_NETBUF_LEN], tmp[UPSCLI_NETBUF_LEN];
|
||||
|
||||
|
@ -1262,8 +1392,8 @@ int upscli_list_start(UPSCONN_t *ups, unsigned int numq, const char **query)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int upscli_list_next(UPSCONN_t *ups, unsigned int numq, const char **query,
|
||||
unsigned int *numa, char ***answer)
|
||||
int upscli_list_next(UPSCONN_t *ups, size_t numq, const char **query,
|
||||
size_t *numa, char ***answer)
|
||||
{
|
||||
char tmp[UPSCLI_NETBUF_LEN];
|
||||
|
||||
|
@ -1311,9 +1441,9 @@ int upscli_list_next(UPSCONN_t *ups, unsigned int numq, const char **query,
|
|||
return 1;
|
||||
}
|
||||
|
||||
int upscli_sendline(UPSCONN_t *ups, const char *buf, size_t buflen)
|
||||
ssize_t upscli_sendline_timeout(UPSCONN_t *ups, const char *buf, size_t buflen, const time_t timeout)
|
||||
{
|
||||
int ret;
|
||||
ssize_t ret;
|
||||
|
||||
if (!ups) {
|
||||
return -1;
|
||||
|
@ -1334,7 +1464,7 @@ int upscli_sendline(UPSCONN_t *ups, const char *buf, size_t buflen)
|
|||
return -1;
|
||||
}
|
||||
|
||||
ret = net_write(ups, buf, buflen);
|
||||
ret = net_write(ups, buf, buflen, timeout);
|
||||
|
||||
if (ret < 1) {
|
||||
upscli_disconnect(ups);
|
||||
|
@ -1344,9 +1474,14 @@ int upscli_sendline(UPSCONN_t *ups, const char *buf, size_t buflen)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int upscli_readline(UPSCONN_t *ups, char *buf, size_t buflen)
|
||||
ssize_t upscli_sendline(UPSCONN_t *ups, const char *buf, size_t buflen)
|
||||
{
|
||||
int ret;
|
||||
return upscli_sendline_timeout(ups, buf, buflen, 0);
|
||||
}
|
||||
|
||||
ssize_t upscli_readline_timeout(UPSCONN_t *ups, char *buf, size_t buflen, const time_t timeout)
|
||||
{
|
||||
ssize_t ret;
|
||||
size_t recv;
|
||||
|
||||
if (!ups) {
|
||||
|
@ -1372,14 +1507,17 @@ int upscli_readline(UPSCONN_t *ups, char *buf, size_t buflen)
|
|||
|
||||
if (ups->readidx == ups->readlen) {
|
||||
|
||||
ret = net_read(ups, ups->readbuf, sizeof(ups->readbuf));
|
||||
ret = net_read(ups, ups->readbuf, sizeof(ups->readbuf), timeout);
|
||||
|
||||
if (ret < 1) {
|
||||
upscli_disconnect(ups);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ups->readlen = ret;
|
||||
/* Here ret is safe to cast since it is >=1 and certainly
|
||||
* fits under SIZE_MAX being it signed sibling
|
||||
*/
|
||||
ups->readlen = (size_t)ret;
|
||||
ups->readidx = 0;
|
||||
}
|
||||
|
||||
|
@ -1394,8 +1532,13 @@ int upscli_readline(UPSCONN_t *ups, char *buf, size_t buflen)
|
|||
return 0;
|
||||
}
|
||||
|
||||
ssize_t upscli_readline(UPSCONN_t *ups, char *buf, size_t buflen)
|
||||
{
|
||||
return upscli_readline_timeout(ups, buf, buflen, DEFAULT_NETWORK_TIMEOUT);
|
||||
}
|
||||
|
||||
/* split upsname[@hostname[:port]] into separate components */
|
||||
int upscli_splitname(const char *buf, char **upsname, char **hostname, int *port)
|
||||
int upscli_splitname(const char *buf, char **upsname, char **hostname, uint16_t *port)
|
||||
{
|
||||
char *s, tmp[SMALLBUF], *last = NULL;
|
||||
|
||||
|
@ -1431,9 +1574,10 @@ int upscli_splitname(const char *buf, char **upsname, char **hostname, int *port
|
|||
}
|
||||
|
||||
/* split hostname[:port] into separate components */
|
||||
int upscli_splitaddr(const char *buf, char **hostname, int *port)
|
||||
int upscli_splitaddr(const char *buf, char **hostname, uint16_t *port)
|
||||
{
|
||||
char *s, tmp[SMALLBUF], *last = NULL;
|
||||
long l;
|
||||
|
||||
/* paranoia */
|
||||
if ((!buf) || (!hostname) || (!port)) {
|
||||
|
@ -1476,10 +1620,13 @@ int upscli_splitaddr(const char *buf, char **hostname, int *port)
|
|||
}
|
||||
}
|
||||
|
||||
if ((*(++s) == '\0') || ((*port = strtol(s, NULL, 10)) < 1 )) {
|
||||
/* Check that "long" port fits in an "uint16_t" so is in IP range
|
||||
* (under 65536) */
|
||||
if ((*(++s) == '\0') || ((l = strtol(s, NULL, 10)) < 1 ) || (l > 65535)) {
|
||||
fprintf(stderr, "upscli_splitaddr: no port specified after ':' separator\n");
|
||||
return -1;
|
||||
}
|
||||
*port = (uint16_t)l;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1503,7 +1650,7 @@ int upscli_disconnect(UPSCONN_t *ups)
|
|||
return 0;
|
||||
}
|
||||
|
||||
net_write(ups, "LOGOUT\n", 7);
|
||||
net_write(ups, "LOGOUT\n", 7, 0);
|
||||
|
||||
#ifdef WITH_OPENSSL
|
||||
if (ups->ssl) {
|
||||
|
|
|
@ -28,6 +28,19 @@
|
|||
#include <ssl.h>
|
||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||
|
||||
/* Not including nut_stdint.h because this is part of end-user API */
|
||||
#if defined HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
|
||||
#if defined HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
#if defined HAVE_LIMITS_H
|
||||
#include <limits.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* *INDENT-OFF* */
|
||||
extern "C" {
|
||||
|
@ -41,7 +54,7 @@ extern "C" {
|
|||
|
||||
typedef struct {
|
||||
char *host;
|
||||
int port;
|
||||
uint16_t port;
|
||||
int fd;
|
||||
int flags;
|
||||
int upserror;
|
||||
|
@ -69,31 +82,33 @@ typedef struct {
|
|||
const char *upscli_strerror(UPSCONN_t *ups);
|
||||
|
||||
int upscli_init(int certverify, const char *certpath, const char *certname, const char *certpasswd);
|
||||
int upscli_cleanup();
|
||||
int upscli_cleanup(void);
|
||||
|
||||
int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags, struct timeval *tv);
|
||||
int upscli_connect(UPSCONN_t *ups, const char *host, int port, int flags);
|
||||
int upscli_tryconnect(UPSCONN_t *ups, const char *host, uint16_t port, int flags, struct timeval *tv);
|
||||
int upscli_connect(UPSCONN_t *ups, const char *host, uint16_t port, int flags);
|
||||
|
||||
void upscli_add_host_cert(const char* hostname, const char* certname, int certverify, int forcessl);
|
||||
|
||||
/* --- functions that only use the new names --- */
|
||||
|
||||
int upscli_get(UPSCONN_t *ups, unsigned int numq, const char **query,
|
||||
unsigned int *numa, char ***answer);
|
||||
int upscli_get(UPSCONN_t *ups, size_t numq, const char **query,
|
||||
size_t *numa, char ***answer);
|
||||
|
||||
int upscli_list_start(UPSCONN_t *ups, unsigned int numq, const char **query);
|
||||
int upscli_list_start(UPSCONN_t *ups, size_t numq, const char **query);
|
||||
|
||||
int upscli_list_next(UPSCONN_t *ups, unsigned int numq, const char **query,
|
||||
unsigned int *numa, char ***answer);
|
||||
int upscli_list_next(UPSCONN_t *ups, size_t numq, const char **query,
|
||||
size_t *numa, char ***answer);
|
||||
|
||||
int upscli_sendline(UPSCONN_t *ups, const char *buf, size_t buflen);
|
||||
ssize_t upscli_sendline_timeout(UPSCONN_t *ups, const char *buf, size_t buflen, const time_t timeout);
|
||||
ssize_t upscli_sendline(UPSCONN_t *ups, const char *buf, size_t buflen);
|
||||
|
||||
int upscli_readline(UPSCONN_t *ups, char *buf, size_t buflen);
|
||||
ssize_t upscli_readline_timeout(UPSCONN_t *ups, char *buf, size_t buflen, const time_t timeout);
|
||||
ssize_t upscli_readline(UPSCONN_t *ups, char *buf, size_t buflen);
|
||||
|
||||
int upscli_splitname(const char *buf, char **upsname, char **hostname,
|
||||
int *port);
|
||||
uint16_t *port);
|
||||
|
||||
int upscli_splitaddr(const char *buf, char **hostname, int *port);
|
||||
int upscli_splitaddr(const char *buf, char **hostname, uint16_t *port);
|
||||
|
||||
int upscli_disconnect(UPSCONN_t *ups);
|
||||
|
||||
|
|
146
clients/upscmd.c
146
clients/upscmd.c
|
@ -1,6 +1,8 @@
|
|||
/* upscmd - simple "client" to test instant commands via upsd
|
||||
|
||||
Copyright (C) 2000 Russell Kroll <rkroll@exploits.org>
|
||||
Copyright (C)
|
||||
2000 Russell Kroll <rkroll@exploits.org>
|
||||
2019 EATON (author: Arnaud Quette <ArnaudQuette@eaton.com>)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,10 +28,13 @@
|
|||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "nut_stdint.h"
|
||||
#include "upsclient.h"
|
||||
|
||||
static char *upsname = NULL, *hostname = NULL;
|
||||
static UPSCONN_t *ups = NULL;
|
||||
static int tracking_enabled = 0;
|
||||
static unsigned int timeout = DEFAULT_TRACKING_TIMEOUT;
|
||||
|
||||
struct list_t {
|
||||
char *name;
|
||||
|
@ -41,13 +46,16 @@ static void usage(const char *prog)
|
|||
printf("Network UPS Tools upscmd %s\n\n", UPS_VERSION);
|
||||
printf("usage: %s [-h]\n", prog);
|
||||
printf(" %s [-l <ups>]\n", prog);
|
||||
printf(" %s [-u <username>] [-p <password>] <ups> <command> [<value>]\n\n", prog);
|
||||
printf(" %s [-u <username>] [-p <password>] [-w] [-t <timeout>] <ups> <command> [<value>]\n\n", prog);
|
||||
printf("Administration program to initiate instant commands on UPS hardware.\n");
|
||||
printf("\n");
|
||||
printf(" -h display this help text\n");
|
||||
printf(" -l <ups> show available commands on UPS <ups>\n");
|
||||
printf(" -u <username> set username for command authentication\n");
|
||||
printf(" -p <password> set password for command authentication\n");
|
||||
printf(" -w wait for the completion of command by the driver\n");
|
||||
printf(" and return its actual result from the device\n");
|
||||
printf(" -t <timeout> set a timeout when using -w (in seconds, default: %u)\n", DEFAULT_TRACKING_TIMEOUT);
|
||||
printf("\n");
|
||||
printf(" <ups> UPS identifier - <upsname>[@<hostname>[:<port>]]\n");
|
||||
printf(" <command> Valid instant command - test.panel.start, etc.\n");
|
||||
|
@ -57,7 +65,7 @@ static void usage(const char *prog)
|
|||
static void print_cmd(char *cmdname)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -80,7 +88,7 @@ static void print_cmd(char *cmdname)
|
|||
static void listcmds(void)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
struct list_t *lhead = NULL, *llast = NULL, *ltmp, *lnext;
|
||||
|
@ -105,7 +113,7 @@ static void listcmds(void)
|
|||
|
||||
/* CMD <upsname> <cmdname> */
|
||||
if (numa < 3) {
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 3)", numa);
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %zu args, need at least 3)", numa);
|
||||
}
|
||||
|
||||
/* we must first read the entire list of commands,
|
||||
|
@ -136,9 +144,21 @@ static void listcmds(void)
|
|||
}
|
||||
}
|
||||
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_BESIDEFUNC) && (!defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_INSIDEFUNC) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC) )
|
||||
# pragma GCC diagnostic push
|
||||
#endif
|
||||
#if (!defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_INSIDEFUNC) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC)
|
||||
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||
#endif
|
||||
#if (!defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_INSIDEFUNC) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC)
|
||||
# pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
|
||||
#endif
|
||||
static void do_cmd(char **argv, const int argc)
|
||||
{
|
||||
int cmd_complete = 0;
|
||||
char buf[SMALLBUF];
|
||||
char tracking_id[UUID4_LEN];
|
||||
time_t start, now;
|
||||
|
||||
if (argc > 1) {
|
||||
snprintf(buf, sizeof(buf), "INSTCMD %s %s %s\n", upsname, argv[0], argv[1]);
|
||||
|
@ -154,13 +174,88 @@ static void do_cmd(char **argv, const int argc)
|
|||
fatalx(EXIT_FAILURE, "Instant command failed: %s", upscli_strerror(ups));
|
||||
}
|
||||
|
||||
/* FUTURE: status cookies will tie in here */
|
||||
/* verify answer */
|
||||
if (strncmp(buf, "OK", 2) != 0) {
|
||||
fatalx(EXIT_FAILURE, "Unexpected response from upsd: %s", buf);
|
||||
}
|
||||
|
||||
/* check for status tracking id */
|
||||
if (
|
||||
!tracking_enabled ||
|
||||
/* sanity check on the size: "OK TRACKING " + UUID4_LEN */
|
||||
strlen(buf) != (UUID4_LEN - 1 + strlen("OK TRACKING "))
|
||||
) {
|
||||
/* reply as usual */
|
||||
fprintf(stderr, "%s\n", buf);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_TRUNCATION
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_TRUNCATION
|
||||
#pragma GCC diagnostic ignored "-Wformat-truncation"
|
||||
#endif
|
||||
/* From the check above, we know that we have exactly UUID4_LEN chars
|
||||
* (aka sizeof(tracking_id)) in the buf after "OK TRACKING " prefix,
|
||||
* plus the null-byte.
|
||||
*/
|
||||
assert (UUID4_LEN == 1 + snprintf(tracking_id, sizeof(tracking_id), "%s", buf + strlen("OK TRACKING ")));
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_TRUNCATION
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
time(&start);
|
||||
|
||||
/* send status tracking request, looping if status is PENDING */
|
||||
while (!cmd_complete) {
|
||||
|
||||
/* check for timeout */
|
||||
time(&now);
|
||||
if (difftime(now, start) >= timeout)
|
||||
fatalx(EXIT_FAILURE, "Can't receive status tracking information: timeout");
|
||||
|
||||
snprintf(buf, sizeof(buf), "GET TRACKING %s\n", tracking_id);
|
||||
|
||||
if (upscli_sendline(ups, buf, strlen(buf)) < 0)
|
||||
fatalx(EXIT_FAILURE, "Can't send status tracking request: %s", upscli_strerror(ups));
|
||||
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE) )
|
||||
/* Note for gating macros above: unsuffixed HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP
|
||||
* means support of contexts both inside and outside function body, so the push
|
||||
* above and pop below (outside this finction) are not used.
|
||||
*/
|
||||
# pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS
|
||||
/* Note that the individual warning pragmas for use inside function bodies
|
||||
* are named without a _INSIDEFUNC suffix, for simplicity and legacy reasons
|
||||
*/
|
||||
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE
|
||||
# pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
|
||||
#endif
|
||||
/* and get status tracking reply */
|
||||
assert(timeout < LONG_MAX);
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE) )
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
if (upscli_readline_timeout(ups, buf, sizeof(buf), (long)timeout) < 0)
|
||||
fatalx(EXIT_FAILURE, "Can't receive status tracking information: %s", upscli_strerror(ups));
|
||||
|
||||
if (strncmp(buf, "PENDING", 7))
|
||||
cmd_complete = 1;
|
||||
else
|
||||
/* wait a second before retrying */
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s\n", buf);
|
||||
}
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_BESIDEFUNC) && (!defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_INSIDEFUNC) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC) )
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
static void clean_exit(void)
|
||||
{
|
||||
|
@ -175,12 +270,14 @@ static void clean_exit(void)
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i, ret, port;
|
||||
int i;
|
||||
uint16_t port;
|
||||
ssize_t ret;
|
||||
int have_un = 0, have_pw = 0, cmdlist = 0;
|
||||
char buf[SMALLBUF], username[SMALLBUF], password[SMALLBUF];
|
||||
char buf[SMALLBUF * 2], username[SMALLBUF], password[SMALLBUF];
|
||||
const char *prog = xbasename(argv[0]);
|
||||
|
||||
while ((i = getopt(argc, argv, "+lhu:p:V")) != -1) {
|
||||
while ((i = getopt(argc, argv, "+lhu:p:t:wV")) != -1) {
|
||||
|
||||
switch (i)
|
||||
{
|
||||
|
@ -198,8 +295,20 @@ int main(int argc, char **argv)
|
|||
have_pw = 1;
|
||||
break;
|
||||
|
||||
case 't':
|
||||
if (!str_to_uint(optarg, &timeout, 10))
|
||||
fatal_with_errno(EXIT_FAILURE, "Could not convert the provided value for timeout ('-t' option) to unsigned int");
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
tracking_enabled = 1;
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
fatalx(EXIT_SUCCESS, "Network UPS Tools upscmd %s", UPS_VERSION);
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
exit(EXIT_SUCCESS); /* Should not get here in practice, but compiler is afraid we can fall through */
|
||||
#endif
|
||||
|
||||
case 'h':
|
||||
default:
|
||||
|
@ -313,6 +422,25 @@ int main(int argc, char **argv)
|
|||
fatalx(EXIT_FAILURE, "Set password failed: %s", upscli_strerror(ups));
|
||||
}
|
||||
|
||||
/* enable status tracking ID */
|
||||
if (tracking_enabled) {
|
||||
|
||||
snprintf(buf, sizeof(buf), "SET TRACKING ON\n");
|
||||
|
||||
if (upscli_sendline(ups, buf, strlen(buf)) < 0) {
|
||||
fatalx(EXIT_FAILURE, "Can't enable command status tracking: %s", upscli_strerror(ups));
|
||||
}
|
||||
|
||||
if (upscli_readline(ups, buf, sizeof(buf)) < 0) {
|
||||
fatalx(EXIT_FAILURE, "Enabling command status tracking failed: %s", upscli_strerror(ups));
|
||||
}
|
||||
|
||||
/* Verify the result */
|
||||
if (strncmp(buf, "OK", 2) != 0) {
|
||||
fatalx(EXIT_FAILURE, "Enabling command status tracking failed. upsd answered: %s", buf);
|
||||
}
|
||||
}
|
||||
|
||||
do_cmd(&argv[1], argc - 1);
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "nut_stdint.h"
|
||||
#include "upsclient.h"
|
||||
#include "cgilib.h"
|
||||
#include <stdlib.h>
|
||||
|
@ -49,7 +50,7 @@
|
|||
|
||||
static char *monhost = NULL, *cmd = NULL;
|
||||
|
||||
static int port;
|
||||
static uint16_t port;
|
||||
static char *upsname, *hostname;
|
||||
static UPSCONN_t ups;
|
||||
|
||||
|
@ -60,7 +61,7 @@ static UPSCONN_t ups;
|
|||
|
||||
void parsearg(char *var, char *value)
|
||||
{
|
||||
int i, v;
|
||||
long long i, v; /* Be big enough to fit all expected inputs; truncate later */
|
||||
|
||||
/* avoid bogus junk from evil people */
|
||||
if ((strlen(var) > MAX_CGI_STRLEN) || (strlen(value) > MAX_CGI_STRLEN))
|
||||
|
@ -82,17 +83,20 @@ void parsearg(char *var, char *value)
|
|||
for (i = 0; imgarg[i].name != NULL; i++) {
|
||||
if (!strcmp(imgarg[i].name, var)) {
|
||||
if (!strncmp(value, "0x", 2))
|
||||
v = strtoul(value + 2, (char **)NULL, 16);
|
||||
v = (long long)strtoul(value + 2, (char **)NULL, 16);
|
||||
else
|
||||
v = atoi(value);
|
||||
v = (long long)atoi(value);
|
||||
|
||||
/* avoid false numbers from bad people */
|
||||
if (v < imgarg[i].min)
|
||||
imgarg[i].val = imgarg[i].min;
|
||||
else if (v > imgarg[i].max)
|
||||
imgarg[i].val = imgarg[i].max;
|
||||
else
|
||||
imgarg[i].val = v;
|
||||
else {
|
||||
assert (v < INT_MAX);
|
||||
assert (v > INT_MIN);
|
||||
imgarg[i].val = (int)v;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -111,6 +115,9 @@ static int get_imgarg(const char *name)
|
|||
}
|
||||
|
||||
/* write the HTML header then have gd dump the image */
|
||||
static void drawimage(gdImagePtr im)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void drawimage(gdImagePtr im)
|
||||
{
|
||||
printf("Pragma: no-cache\n");
|
||||
|
@ -200,13 +207,25 @@ static void drawscale(
|
|||
if (level % step10 == 0) {
|
||||
y = scale_height * (lvlhi - level) / range;
|
||||
snprintf(lbltxt, sizeof(lbltxt), "%d", level);
|
||||
gdImageString(im, gdFontMediumBold, width - strlen(lbltxt)*gdFontMediumBold->w, y,
|
||||
(unsigned char *) lbltxt, scale_num_color);
|
||||
gdImageString(im, gdFontMediumBold,
|
||||
width - (int)(strlen(lbltxt)) * gdFontMediumBold->w,
|
||||
y, (unsigned char *) lbltxt, scale_num_color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* draws the bar style indicator */
|
||||
static void drawbar(
|
||||
int lvllo, int lvlhi, /* min and max numbers on the scale */
|
||||
int step, int step5, int step10, /* steps for minor, submajor and major dashes */
|
||||
int redlo1, int redhi1, /* first red zone start and end */
|
||||
int redlo2, int redhi2, /* second red zone start and end */
|
||||
int grnlo, int grnhi, /* green zone start and end */
|
||||
double value, /* UPS variable value to draw */
|
||||
const char *format /* printf style format to be used when rendering summary text */
|
||||
)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void drawbar(
|
||||
int lvllo, int lvlhi, /* min and max numbers on the scale */
|
||||
int step, int step5, int step10, /* steps for minor, submajor and major dashes */
|
||||
|
@ -240,7 +259,7 @@ static void drawbar(
|
|||
summary_color = color_alloc(im, get_imgarg("summary_col"));
|
||||
|
||||
/* rescale UPS value to fit in the scale */
|
||||
bar_y = (1 - (value - lvllo) / (lvlhi - lvllo)) * scale_height;
|
||||
bar_y = (int)((1.0 - (value - lvllo) / (lvlhi - lvllo)) * scale_height);
|
||||
|
||||
/* sanity checks: */
|
||||
|
||||
|
@ -257,9 +276,21 @@ static void drawbar(
|
|||
bar_color);
|
||||
|
||||
/* stick the text version of the value at the bottom center */
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
snprintf(text, sizeof(text), format, value);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
gdImageString(im, gdFontMediumBold,
|
||||
(width - strlen(text)*gdFontMediumBold->w)/2,
|
||||
(width - (int)(strlen(text))*gdFontMediumBold->w)/2,
|
||||
height - gdFontMediumBold->h,
|
||||
(unsigned char *) text, summary_color);
|
||||
|
||||
|
@ -269,6 +300,9 @@ static void drawbar(
|
|||
}
|
||||
|
||||
/* draws the error image */
|
||||
static void noimage(const char *fmt, ...)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void noimage(const char *fmt, ...)
|
||||
{
|
||||
gdImagePtr im;
|
||||
|
@ -278,7 +312,19 @@ static void noimage(const char *fmt, ...)
|
|||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vsnprintf(msg, sizeof(msg), fmt, ap);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(ap);
|
||||
|
||||
width = get_imgarg("width");
|
||||
|
@ -293,17 +339,23 @@ static void noimage(const char *fmt, ...)
|
|||
|
||||
if (width > height)
|
||||
gdImageString(im, gdFontMediumBold,
|
||||
(width - strlen(msg)*gdFontMediumBold->w)/2,
|
||||
(width - (int)(strlen(msg))*gdFontMediumBold->w)/2,
|
||||
(height - gdFontMediumBold->h)/2,
|
||||
(unsigned char *) msg, summary_color);
|
||||
else
|
||||
gdImageStringUp(im, gdFontMediumBold,
|
||||
(width - gdFontMediumBold->h)/2,
|
||||
(height + strlen(msg)*gdFontMediumBold->w)/2,
|
||||
(height + (int)(strlen(msg))*gdFontMediumBold->w)/2,
|
||||
(unsigned char *) msg, summary_color);
|
||||
|
||||
drawimage(im);
|
||||
|
||||
/* NOTE: Earlier code called noimage() and then exit(EXIT_FAILURE);
|
||||
* to signal an error via process exit code. Now that drawimage()
|
||||
* always ends with exit(EXIT_SUCCESS) - which might make webserver
|
||||
* feel good - the command-line use if any suffers no error returns.
|
||||
*/
|
||||
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
|
@ -311,6 +363,10 @@ static void noimage(const char *fmt, ...)
|
|||
UPS variable can be determined.
|
||||
deviation < 0 means that values below nom should be grey instead of
|
||||
green */
|
||||
static void drawgeneralbar(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void drawgeneralbar(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
{
|
||||
|
@ -370,6 +426,10 @@ static void drawgeneralbar(double var, int min, int nom, int max,
|
|||
}
|
||||
|
||||
/* draws input and output voltage bar style indicators */
|
||||
static void draw_utility(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void draw_utility(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
{
|
||||
|
@ -405,7 +465,7 @@ static void draw_utility(double var, int min, int nom, int max,
|
|||
|
||||
/* Acceptable range of voltage is 85%-110% of nominal voltage
|
||||
* in EU at least. Be conservative and say +-10% */
|
||||
deviation = nom*0.1;
|
||||
deviation = (int)(nom * 0.1);
|
||||
|
||||
drawgeneralbar(var, min, nom, max, deviation, format);
|
||||
|
||||
|
@ -413,9 +473,17 @@ static void draw_utility(double var, int min, int nom, int max,
|
|||
}
|
||||
|
||||
/* draws battery.percent bar style indicator */
|
||||
static void draw_battpct(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
static void draw_battpct(double var, int min, int nom,
|
||||
int max, int deviation, const char *format)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void draw_battpct(double var, int min, int nom,
|
||||
int max, int deviation, const char *format)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(nom);
|
||||
NUT_UNUSED_VARIABLE(max);
|
||||
NUT_UNUSED_VARIABLE(deviation);
|
||||
|
||||
if (min < 0) {
|
||||
min = 50;
|
||||
}
|
||||
|
@ -424,6 +492,10 @@ static void draw_battpct(double var, int min, int nom, int max,
|
|||
}
|
||||
|
||||
/* draws battery.voltage bar style indicator */
|
||||
static void draw_battvolt(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void draw_battvolt(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
{
|
||||
|
@ -450,18 +522,17 @@ static void draw_battvolt(double var, int min, int nom, int max,
|
|||
}
|
||||
|
||||
if(min == -1) {
|
||||
min = nom/2*1.6+1; /* Assume a 2V cell is dead at 1.6V */
|
||||
min = (int)(nom/2*1.6+1); /* Assume a 2V cell is dead at 1.6V */
|
||||
}
|
||||
|
||||
if(max == -1) {
|
||||
max = nom/2*2.3+1; /* Assume 2.3V float charge voltage */
|
||||
max = (int)(nom/2*2.3+1); /* Assume 2.3V float charge voltage */
|
||||
}
|
||||
|
||||
if (nom < min || nom > max)
|
||||
nom = -1;
|
||||
|
||||
|
||||
deviation = -(nom*0.05); /* 5% deviation from nominal voltage */
|
||||
deviation = (int)(-nom*0.05); /* 5% deviation from nominal voltage */
|
||||
if(deviation==0) {
|
||||
deviation = -1;
|
||||
}
|
||||
|
@ -470,33 +541,57 @@ static void draw_battvolt(double var, int min, int nom, int max,
|
|||
}
|
||||
|
||||
/* draws ups.load bar style indicator */
|
||||
static void draw_upsload(double var, int min, int nom, int max,
|
||||
static void draw_upsload(double var, int min,
|
||||
int nom, int max,
|
||||
int deviation, const char *format)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void draw_upsload(double var, int min,
|
||||
int nom, int max,
|
||||
int deviation, const char *format)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(min);
|
||||
NUT_UNUSED_VARIABLE(nom);
|
||||
NUT_UNUSED_VARIABLE(max);
|
||||
NUT_UNUSED_VARIABLE(deviation);
|
||||
|
||||
drawbar(0, 125, 5, 5, 25, 100, 125, -1, -1, 0, 50, var, format);
|
||||
}
|
||||
|
||||
/* draws temperature bar style indicator */
|
||||
static void draw_temperature(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void draw_temperature(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
{
|
||||
int hi = get_imgarg("tempmax");
|
||||
int lo = get_imgarg("tempmin");
|
||||
NUT_UNUSED_VARIABLE(nom);
|
||||
NUT_UNUSED_VARIABLE(deviation);
|
||||
|
||||
drawbar(lo, hi, 1, 5, 10, lo, min, max, hi, -1, -1, var, format);
|
||||
}
|
||||
|
||||
/* draws humidity bar style indicator */
|
||||
static void draw_humidity(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void draw_humidity(double var, int min, int nom, int max,
|
||||
int deviation, const char *format)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(nom);
|
||||
NUT_UNUSED_VARIABLE(deviation);
|
||||
|
||||
drawbar(0, 100, 2, 10, 20, 0, min, max, 100, -1, -1, var, format);
|
||||
}
|
||||
|
||||
static int get_var(const char *var, char *buf, size_t buflen)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -523,6 +618,8 @@ int main(int argc, char **argv)
|
|||
char str[SMALLBUF];
|
||||
int i, min, nom, max;
|
||||
double var = 0;
|
||||
NUT_UNUSED_VARIABLE(argc);
|
||||
NUT_UNUSED_VARIABLE(argv);
|
||||
|
||||
extractcgiargs();
|
||||
|
||||
|
@ -537,13 +634,17 @@ int main(int argc, char **argv)
|
|||
|
||||
if (upscli_splitname(monhost, &upsname, &hostname, &port) != 0) {
|
||||
noimage("Invalid UPS definition (upsname[@hostname[:port]])\n");
|
||||
exit(EXIT_FAILURE);
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */
|
||||
#endif
|
||||
}
|
||||
|
||||
if (upscli_connect(&ups, hostname, port, 0) < 0) {
|
||||
noimage("Can't connect to server:\n%s\n",
|
||||
upscli_strerror(&ups));
|
||||
exit(EXIT_FAILURE);
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */
|
||||
#endif
|
||||
}
|
||||
|
||||
for (i = 0; imgvar[i].name; i++)
|
||||
|
@ -553,7 +654,9 @@ int main(int argc, char **argv)
|
|||
registered with this variable */
|
||||
if (!imgvar[i].drawfunc) {
|
||||
noimage("Draw function N/A");
|
||||
exit(EXIT_FAILURE);
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */
|
||||
#endif
|
||||
}
|
||||
|
||||
/* get the variable value */
|
||||
|
@ -564,7 +667,9 @@ int main(int argc, char **argv)
|
|||
snprintf(str, sizeof(str), "%s N/A",
|
||||
imgvar[i].name);
|
||||
noimage(str);
|
||||
exit(EXIT_FAILURE);
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
exit(EXIT_FAILURE); /* Should not get here in practice, but compiler is afraid we can fall through */
|
||||
#endif
|
||||
}
|
||||
|
||||
/* when getting minimum, nominal and maximum values,
|
||||
|
@ -617,7 +722,9 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
noimage("Unknown display");
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
exit(EXIT_FAILURE);
|
||||
#endif
|
||||
}
|
||||
|
||||
imgvar_t imgvar[] = {
|
||||
|
|
|
@ -17,13 +17,20 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef NUT_UPSIMAGEARG_H_SEEN
|
||||
#define NUT_UPSIMAGEARG_H_SEEN 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* *INDENT-OFF* */
|
||||
extern "C" {
|
||||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
struct {
|
||||
/* This is used in upsstats.c and in upsimage.c, but compiler complains about
|
||||
* non-extern definition if this is not "static". To move or not to move?..
|
||||
* Do we have cases of building binaries refering to only one of those objects?
|
||||
*/
|
||||
static struct {
|
||||
char *name;
|
||||
int val; /* hex digits, ala HTML */
|
||||
int min; /* minimum reasonable value */
|
||||
|
@ -71,3 +78,4 @@ extern imgvar_t imgvar[];
|
|||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
#endif /* NUT_UPSIMAGEARG_H_SEEN */
|
||||
|
|
|
@ -37,9 +37,11 @@
|
|||
|
||||
#include "config.h"
|
||||
#include "timehead.h"
|
||||
#include "nut_stdint.h"
|
||||
#include "upslog.h"
|
||||
|
||||
static int port, reopen_flag = 0, exit_flag = 0;
|
||||
static int reopen_flag = 0, exit_flag = 0;
|
||||
static uint16_t port;
|
||||
static char *upsname, *hostname;
|
||||
static UPSCONN_t ups;
|
||||
|
||||
|
@ -77,6 +79,13 @@ static void set_exit_flag(int sig)
|
|||
exit_flag = sig;
|
||||
}
|
||||
|
||||
static void set_print_now_flag(int sig)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(sig);
|
||||
|
||||
/* no need to do anything, the signal will cause sleep to be interrupted */
|
||||
}
|
||||
|
||||
/* handlers: reload on HUP, exit on INT/QUIT/TERM */
|
||||
static void setup_signals(void)
|
||||
{
|
||||
|
@ -97,8 +106,15 @@ static void setup_signals(void)
|
|||
fatal_with_errno(EXIT_FAILURE, "Can't install SIGQUIT handler");
|
||||
if (sigaction(SIGTERM, &sa, NULL) < 0)
|
||||
fatal_with_errno(EXIT_FAILURE, "Can't install SIGTERM handler");
|
||||
|
||||
sa.sa_handler = set_print_now_flag;
|
||||
if (sigaction(SIGUSR1, &sa, NULL) < 0)
|
||||
fatal_with_errno(EXIT_FAILURE, "Can't install SIGUSR1 handler");
|
||||
}
|
||||
|
||||
static void help(const char *prog)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void help(const char *prog)
|
||||
{
|
||||
printf("UPS status logger.\n");
|
||||
|
@ -109,7 +125,9 @@ static void help(const char *prog)
|
|||
printf(" -f <format> - Log format. See below for details.\n");
|
||||
printf(" - Use -f \"<format>\" so your shell doesn't break it up.\n");
|
||||
printf(" -i <interval> - Time between updates, in seconds\n");
|
||||
printf(" -l <logfile> - Log file name, or - for stdout\n");
|
||||
printf(" -l <logfile> - Log file name, or - for stdout (foreground by default)\n");
|
||||
printf(" -F - stay foregrounded even if logging into a file\n");
|
||||
printf(" -B - stay backgrounded even if logging to stdout\n");
|
||||
printf(" -p <pidbase> - Base name for PID file (defaults to \"%s\")\n", prog);
|
||||
printf(" -s <ups> - Monitor UPS <ups> - <upsname>@<host>[:<port>]\n");
|
||||
printf(" - Example: -s myups@server\n");
|
||||
|
@ -137,6 +155,7 @@ static void do_host(const char *arg)
|
|||
{
|
||||
int ret;
|
||||
char hn[LARGEBUF];
|
||||
NUT_UNUSED_VARIABLE(arg);
|
||||
|
||||
ret = gethostname(hn, sizeof(hn));
|
||||
|
||||
|
@ -150,11 +169,15 @@ static void do_host(const char *arg)
|
|||
|
||||
static void do_upshost(const char *arg)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(arg);
|
||||
|
||||
snprintfcat(logbuffer, sizeof(logbuffer), "%s", monhost);
|
||||
}
|
||||
|
||||
static void do_pid(const char *arg)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(arg);
|
||||
|
||||
snprintfcat(logbuffer, sizeof(logbuffer), "%ld", (long)getpid());
|
||||
}
|
||||
|
||||
|
@ -163,6 +186,7 @@ static void do_time(const char *arg)
|
|||
unsigned int i;
|
||||
char timebuf[SMALLBUF], *format;
|
||||
time_t tod;
|
||||
struct tm tmbuf;
|
||||
|
||||
format = xstrdup(arg);
|
||||
|
||||
|
@ -172,7 +196,7 @@ static void do_time(const char *arg)
|
|||
format[i] = '%';
|
||||
|
||||
time(&tod);
|
||||
strftime(timebuf, sizeof(timebuf), format, localtime(&tod));
|
||||
strftime(timebuf, sizeof(timebuf), format, localtime_r(&tod, &tmbuf));
|
||||
|
||||
snprintfcat(logbuffer, sizeof(logbuffer), "%s", timebuf);
|
||||
|
||||
|
@ -182,7 +206,7 @@ static void do_time(const char *arg)
|
|||
static void getvar(const char *var)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -226,6 +250,7 @@ static void do_var(const char *arg)
|
|||
static void do_etime(const char *arg)
|
||||
{
|
||||
time_t tod;
|
||||
NUT_UNUSED_VARIABLE(arg);
|
||||
|
||||
time(&tod);
|
||||
snprintfcat(logbuffer, sizeof(logbuffer), "%ld", (unsigned long) tod);
|
||||
|
@ -268,8 +293,9 @@ static void add_call(void (*fptr)(const char *arg), const char *arg)
|
|||
/* turn the format string into a list of function calls with args */
|
||||
static void compile_format(void)
|
||||
{
|
||||
unsigned int i;
|
||||
int j, found, ofs;
|
||||
size_t i;
|
||||
int j, found;
|
||||
size_t ofs;
|
||||
char *cmd, *arg, *ptr;
|
||||
|
||||
for (i = 0; i < strlen(logformat); i++) {
|
||||
|
@ -369,7 +395,7 @@ static void run_flist(void)
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int interval = 30, i;
|
||||
int interval = 30, i, foreground = -1;
|
||||
const char *prog = xbasename(argv[0]);
|
||||
time_t now, nextpoll = 0;
|
||||
const char *user = NULL;
|
||||
|
@ -381,11 +407,13 @@ int main(int argc, char **argv)
|
|||
|
||||
printf("Network UPS Tools %s %s\n", prog, UPS_VERSION);
|
||||
|
||||
while ((i = getopt(argc, argv, "+hs:l:i:f:u:Vp:")) != -1) {
|
||||
while ((i = getopt(argc, argv, "+hs:l:i:f:u:Vp:FB")) != -1) {
|
||||
switch(i) {
|
||||
case 'h':
|
||||
help(prog);
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 's':
|
||||
monhost = optarg;
|
||||
|
@ -413,6 +441,14 @@ int main(int argc, char **argv)
|
|||
case 'p':
|
||||
pidfilebase = optarg;
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
foreground = 1;
|
||||
break;
|
||||
|
||||
case 'B':
|
||||
foreground = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -477,8 +513,17 @@ int main(int argc, char **argv)
|
|||
|
||||
open_syslog(prog);
|
||||
|
||||
if (logfile != stdout)
|
||||
if (foreground < 0) {
|
||||
if (logfile == stdout) {
|
||||
foreground = 1;
|
||||
} else {
|
||||
foreground = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!foreground) {
|
||||
background();
|
||||
}
|
||||
|
||||
setup_signals();
|
||||
|
||||
|
@ -493,7 +538,7 @@ int main(int argc, char **argv)
|
|||
|
||||
if (nextpoll > now) {
|
||||
/* there is still time left, so sleep it off */
|
||||
sleep(difftime(nextpoll, now));
|
||||
sleep((unsigned int)(difftime(nextpoll, now)));
|
||||
nextpoll += interval;
|
||||
} else {
|
||||
/* we spent more time in polling than the interval allows */
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
/* upslog.h - table of functions for handling various logging functions */
|
||||
|
||||
#ifndef NUT_UPSLOG_H_SEEN
|
||||
#define NUT_UPSLOG_H_SEEN 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* *INDENT-OFF* */
|
||||
extern "C" {
|
||||
|
@ -20,7 +23,10 @@ static void do_time(const char *arg);
|
|||
static void do_var(const char *arg);
|
||||
static void do_etime(const char *arg);
|
||||
|
||||
struct {
|
||||
/* This is only used in upslog.c, but refers to routines declared here...
|
||||
* To move or not to move?..
|
||||
*/
|
||||
static struct {
|
||||
const char *name;
|
||||
void (*func)(const char *arg);
|
||||
} logcmds[] =
|
||||
|
@ -31,7 +37,7 @@ struct {
|
|||
{ "TIME", do_time },
|
||||
{ "VAR", do_var },
|
||||
{ "ETIME", do_etime },
|
||||
{ NULL, (void(*)())(NULL) }
|
||||
{ NULL, (void(*)(const char*))(NULL) }
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -40,3 +46,4 @@ struct {
|
|||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
#endif /* NUT_UPSLOG_H_SEEN */
|
||||
|
|
505
clients/upsmon.c
505
clients/upsmon.c
|
@ -24,7 +24,10 @@
|
|||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "nut_stdint.h"
|
||||
#include "upsclient.h"
|
||||
#include "upsmon.h"
|
||||
#include "parseconf.h"
|
||||
|
@ -37,16 +40,19 @@
|
|||
static char *shutdowncmd = NULL, *notifycmd = NULL;
|
||||
static char *powerdownflag = NULL, *configfile = NULL;
|
||||
|
||||
static int minsupplies = 1, sleepval = 5, deadtime = 15;
|
||||
|
||||
/* default polling interval = 5 sec */
|
||||
static int pollfreq = 5, pollfreqalert = 5;
|
||||
|
||||
/* slave hosts are given 15 sec by default to logout from upsd */
|
||||
static int hostsync = 15;
|
||||
static unsigned int minsupplies = 1, sleepval = 5;
|
||||
|
||||
/* sum of all power values from config file */
|
||||
static int totalpv = 0;
|
||||
static unsigned int totalpv = 0;
|
||||
|
||||
/* default TTL of a device gone AWOL, 3 x polling interval = 15 sec */
|
||||
static int deadtime = 15;
|
||||
|
||||
/* default polling interval = 5 sec */
|
||||
static unsigned int pollfreq = 5, pollfreqalert = 5;
|
||||
|
||||
/* secondary hosts are given 15 sec by default to logout from upsd */
|
||||
static int hostsync = 15;
|
||||
|
||||
/* default replace battery warning interval (seconds) */
|
||||
static int rbwarntime = 43200;
|
||||
|
@ -55,7 +61,7 @@ static int rbwarntime = 43200;
|
|||
static int nocommwarntime = 300;
|
||||
|
||||
/* default interval between the shutdown warning and the shutdown */
|
||||
static int finaldelay = 5;
|
||||
static unsigned int finaldelay = 5;
|
||||
|
||||
/* set by SIGHUP handler, cleared after reload finishes */
|
||||
static int reload_flag = 0;
|
||||
|
@ -83,6 +89,14 @@ static int opt_af = AF_UNSPEC;
|
|||
static struct sigaction sa;
|
||||
static sigset_t nut_upsmon_sigmask;
|
||||
|
||||
/* Users can pass a -D[...] option to enable debugging.
|
||||
* For the service tracing purposes, also the upsmon.conf
|
||||
* can define a debug_min value in the global section,
|
||||
* to set the minimal debug level (CLI provided value less
|
||||
* than that would not have effect, can only have more).
|
||||
*/
|
||||
static int nut_debug_level_global = -1;
|
||||
|
||||
static void setflag(int *val, int flag)
|
||||
{
|
||||
*val |= flag;
|
||||
|
@ -173,8 +187,21 @@ static void do_notify(const utype_t *ups, int ntype)
|
|||
if (notifylist[i].type == ntype) {
|
||||
upsdebugx(2, "%s: ntype 0x%04x (%s)", __func__, ntype,
|
||||
notifylist[i].name);
|
||||
snprintf(msg, sizeof(msg), notifylist[i].msg ? notifylist[i].msg : notifylist[i].stockmsg,
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
snprintf(msg, sizeof(msg),
|
||||
notifylist[i].msg ? notifylist[i].msg : notifylist[i].stockmsg,
|
||||
ups ? ups->sys : "");
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
notify(msg, notifylist[i].flags, notifylist[i].name,
|
||||
upsname);
|
||||
return;
|
||||
|
@ -184,26 +211,40 @@ static void do_notify(const utype_t *ups, int ntype)
|
|||
/* not found ?! */
|
||||
}
|
||||
|
||||
/* check for master permissions on the server for this ups */
|
||||
static int checkmaster(utype_t *ups)
|
||||
/* check if we need "primary" mode (managerial permissions)
|
||||
* on the server for this ups, and apply for them then.
|
||||
* Returns 0 in case of error, 1 otherwise (including when
|
||||
* we do not need to try becoming a primary). This currently
|
||||
* propagates further as the return value of do_upsd_auth().
|
||||
*/
|
||||
/* TODO: Includes API change in NUT 2.8.0 to replace deprecated
|
||||
* keywords "MASTER" with "PRIMARY", and "SLAVE" with "SECONDARY",
|
||||
* (and backwards-compatible alias handling)
|
||||
*/
|
||||
static int apply_for_primary(utype_t *ups)
|
||||
{
|
||||
char buf[SMALLBUF];
|
||||
char upscli_readraw_error;
|
||||
|
||||
/* don't bother if we're not configured as a master for this ups */
|
||||
if (!flag_isset(ups->status, ST_MASTER))
|
||||
/* don't bother if we're not configured as a primary for this ups */
|
||||
if (!flag_isset(ups->status, ST_PRIMARY))
|
||||
return 1;
|
||||
|
||||
/* this shouldn't happen (LOGIN checks it earlier) */
|
||||
if ((ups->upsname == NULL) || (strlen(ups->upsname) == 0)) {
|
||||
upslogx(LOG_ERR, "Set master on UPS [%s] failed: empty upsname",
|
||||
upslogx(LOG_ERR, "Set primary managerial mode on UPS [%s] failed: empty upsname",
|
||||
ups->sys);
|
||||
return 0;
|
||||
}
|
||||
|
||||
snprintf(buf, sizeof(buf), "MASTER %s\n", ups->upsname);
|
||||
/* Use PRIMARY first but if talking to older server, retry with MASTER */
|
||||
snprintf(buf, sizeof(buf), "PRIMARY %s\n", ups->upsname);
|
||||
|
||||
if (upscli_sendline(&ups->conn, buf, strlen(buf)) < 0) {
|
||||
upslogx(LOG_ALERT, "Can't set master mode on UPS [%s] - %s",
|
||||
/* File descriptor not suitable, net_write() errors, etc.
|
||||
* Not connected to issues with PRIMARY vs. MASTER keyword.
|
||||
*/
|
||||
upslogx(LOG_ALERT, "Can't set primary managerial mode on UPS [%s] - %s",
|
||||
ups->sys, upscli_strerror(&ups->conn));
|
||||
return 0;
|
||||
}
|
||||
|
@ -212,14 +253,41 @@ static int checkmaster(utype_t *ups)
|
|||
if (!strncmp(buf, "OK", 2))
|
||||
return 1;
|
||||
|
||||
/* not ERR, but not caught by readline either? */
|
||||
/* Try the older keyword */
|
||||
upsdebugx(3,
|
||||
"%s: Server did not grant PRIMARY mode on UPS [%s], "
|
||||
"retry with older MASTER keyword",
|
||||
__func__, ups->upsname);
|
||||
snprintf(buf, sizeof(buf), "MASTER %s\n", ups->upsname);
|
||||
|
||||
upslogx(LOG_ALERT, "Master privileges unavailable on UPS [%s]",
|
||||
if (upscli_sendline(&ups->conn, buf, strlen(buf)) < 0) {
|
||||
upslogx(LOG_ALERT, "Can't set primary managerial mode on UPS [%s] - %s",
|
||||
ups->sys, upscli_strerror(&ups->conn));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (upscli_readline(&ups->conn, buf, sizeof(buf)) == 0) {
|
||||
if (!strncmp(buf, "OK", 2))
|
||||
return 1;
|
||||
|
||||
upscli_readraw_error = 0;
|
||||
}
|
||||
else {
|
||||
upscli_readraw_error = 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
upscli_readraw_error = 1;
|
||||
}
|
||||
|
||||
if (upscli_readraw_error == 0) {
|
||||
/* not ERR, but not caught by readline either? */
|
||||
upslogx(LOG_ALERT, "Primary managerial privileges unavailable on UPS [%s]",
|
||||
ups->sys);
|
||||
upslogx(LOG_ALERT, "Response: [%s]", buf);
|
||||
}
|
||||
else { /* something caught by readraw's parsing call */
|
||||
upslogx(LOG_ALERT, "Master privileges unavailable on UPS [%s]",
|
||||
upslogx(LOG_ALERT, "Primary managerial privileges unavailable on UPS [%s]",
|
||||
ups->sys);
|
||||
upslogx(LOG_ALERT, "Reason: %s", upscli_strerror(&ups->conn));
|
||||
}
|
||||
|
@ -305,8 +373,8 @@ static int do_upsd_auth(utype_t *ups)
|
|||
upsdebugx(1, "Logged into UPS %s", ups->sys);
|
||||
setflag(&ups->status, ST_LOGIN);
|
||||
|
||||
/* now see if we also need to test master permissions */
|
||||
return checkmaster(ups);
|
||||
/* now see if we also need to test primary managerial-mode permissions */
|
||||
return apply_for_primary(ups);
|
||||
}
|
||||
|
||||
/* set flags and make announcements when a UPS has been checked successfully */
|
||||
|
@ -417,9 +485,10 @@ static void set_pdflag(void)
|
|||
|
||||
/* the actual shutdown procedure */
|
||||
static void doshutdown(void)
|
||||
{
|
||||
int ret;
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void doshutdown(void)
|
||||
{
|
||||
/* this should probably go away at some point */
|
||||
upslogx(LOG_CRIT, "Executing automatic power-fail shutdown");
|
||||
wall("Executing automatic power-fail shutdown\n");
|
||||
|
@ -431,20 +500,25 @@ static void doshutdown(void)
|
|||
/* in the pipe model, we let the parent do this for us */
|
||||
if (use_pipe) {
|
||||
char ch;
|
||||
ssize_t wret;
|
||||
|
||||
ch = 1;
|
||||
ret = write(pipefd[1], &ch, 1);
|
||||
wret = write(pipefd[1], &ch, 1);
|
||||
|
||||
if (wret < 1)
|
||||
upslogx(LOG_ERR, "Unable to call parent pipe for shutdown");
|
||||
} else {
|
||||
/* one process model = we do all the work here */
|
||||
int sret;
|
||||
|
||||
if (geteuid() != 0)
|
||||
upslogx(LOG_WARNING, "Not root, shutdown may fail");
|
||||
|
||||
set_pdflag();
|
||||
|
||||
ret = system(shutdowncmd);
|
||||
sret = system(shutdowncmd);
|
||||
|
||||
if (ret != 0)
|
||||
if (sret != 0)
|
||||
upslogx(LOG_ERR, "Unable to call shutdown command: %s",
|
||||
shutdowncmd);
|
||||
}
|
||||
|
@ -456,7 +530,7 @@ static void doshutdown(void)
|
|||
static void setfsd(utype_t *ups)
|
||||
{
|
||||
char buf[SMALLBUF];
|
||||
int ret;
|
||||
ssize_t ret;
|
||||
|
||||
/* this shouldn't happen */
|
||||
if (!ups->upsname) {
|
||||
|
@ -499,14 +573,21 @@ static void set_alarm(void)
|
|||
|
||||
static void clear_alarm(void)
|
||||
{
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_STRICT_PROTOTYPES)
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Wstrict-prototypes"
|
||||
#endif
|
||||
signal(SIGALRM, SIG_IGN);
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_STRICT_PROTOTYPES)
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
alarm(0);
|
||||
}
|
||||
|
||||
static int get_var(utype_t *ups, const char *var, char *buf, size_t bufsize)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -557,7 +638,7 @@ static int get_var(utype_t *ups, const char *var, char *buf, size_t bufsize)
|
|||
|
||||
if (numa < numq) {
|
||||
upslogx(LOG_ERR, "%s: Error: insufficient data "
|
||||
"(got %d args, need at least %d)",
|
||||
"(got %zu args, need at least %zu)",
|
||||
var, numa, numq);
|
||||
return -1;
|
||||
}
|
||||
|
@ -566,12 +647,16 @@ static int get_var(utype_t *ups, const char *var, char *buf, size_t bufsize)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void slavesync(void)
|
||||
/* Called by upsmon which is the primary on some UPS(es) to wait
|
||||
* until all secondaries log out from it on the shared upsd server
|
||||
* or the HOSTSYNC timeout expires
|
||||
*/
|
||||
static void sync_secondaries(void)
|
||||
{
|
||||
utype_t *ups;
|
||||
char temp[SMALLBUF];
|
||||
time_t start, now;
|
||||
int maxlogins, logins;
|
||||
long maxlogins, logins;
|
||||
|
||||
time(&start);
|
||||
|
||||
|
@ -580,8 +665,8 @@ static void slavesync(void)
|
|||
|
||||
for (ups = firstups; ups != NULL; ups = ups->next) {
|
||||
|
||||
/* only check login count on our master(s) */
|
||||
if (!flag_isset(ups->status, ST_MASTER))
|
||||
/* only check login count on devices we are the primary for */
|
||||
if (!flag_isset(ups->status, ST_PRIMARY))
|
||||
continue;
|
||||
|
||||
set_alarm();
|
||||
|
@ -596,11 +681,15 @@ static void slavesync(void)
|
|||
clear_alarm();
|
||||
}
|
||||
|
||||
/* if no UPS has more than 1 login (us), then slaves are gone */
|
||||
/* if no UPS has more than 1 login (that would be us),
|
||||
* then secondaries are all gone */
|
||||
/* TO THINK: how about redundant setups with several primary-mode
|
||||
* clients managing an UPS, or possibly differend UPSes, with the
|
||||
* same upsd? */
|
||||
if (maxlogins <= 1)
|
||||
return;
|
||||
|
||||
/* after HOSTSYNC seconds, assume slaves are stuck and bail */
|
||||
/* after HOSTSYNC seconds, assume secondaries are stuck - and bail */
|
||||
time(&now);
|
||||
|
||||
if ((now - start) > hostsync) {
|
||||
|
@ -612,31 +701,34 @@ static void slavesync(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void forceshutdown(void)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void forceshutdown(void)
|
||||
{
|
||||
utype_t *ups;
|
||||
int isamaster = 0;
|
||||
int isaprimary = 0;
|
||||
|
||||
upsdebugx(1, "Shutting down any UPSes in MASTER mode...");
|
||||
upsdebugx(1, "Shutting down any UPSes in PRIMARY mode...");
|
||||
|
||||
/* set FSD on any "master" UPS entries (forced shutdown in progress) */
|
||||
/* set FSD on any "primary" UPS entries (forced shutdown in progress) */
|
||||
for (ups = firstups; ups != NULL; ups = ups->next)
|
||||
if (flag_isset(ups->status, ST_MASTER)) {
|
||||
isamaster = 1;
|
||||
if (flag_isset(ups->status, ST_PRIMARY)) {
|
||||
isaprimary = 1;
|
||||
setfsd(ups);
|
||||
}
|
||||
|
||||
/* if we're not a master on anything, we should shut down now */
|
||||
if (!isamaster)
|
||||
/* if we're not a primary on anything, we should shut down now */
|
||||
if (!isaprimary)
|
||||
doshutdown();
|
||||
|
||||
/* must be the master now */
|
||||
upsdebugx(1, "This system is a master... waiting for slave logout...");
|
||||
/* we must be the primary now */
|
||||
upsdebugx(1, "This system is a primary... waiting for secondaries to logout...");
|
||||
|
||||
/* wait up to HOSTSYNC seconds for slaves to logout */
|
||||
slavesync();
|
||||
/* wait up to HOSTSYNC seconds for secondaries to logout */
|
||||
sync_secondaries();
|
||||
|
||||
/* time expired or all the slaves are gone, so shutdown */
|
||||
/* time expired or all the secondaries are gone, so shutdown */
|
||||
doshutdown();
|
||||
}
|
||||
|
||||
|
@ -644,7 +736,10 @@ static int is_ups_critical(utype_t *ups)
|
|||
{
|
||||
time_t now;
|
||||
|
||||
/* FSD = the master is forcing a shutdown */
|
||||
/* FSD = the primary is forcing a shutdown, or a driver forwarded the flag
|
||||
* from a smarter UPS depending on vendor protocol, ability and settings
|
||||
* (e.g. is charging but battery too low to guarantee safety to the load)
|
||||
*/
|
||||
if (flag_isset(ups->status, ST_FSD))
|
||||
return 1;
|
||||
|
||||
|
@ -655,24 +750,37 @@ static int is_ups_critical(utype_t *ups)
|
|||
|
||||
/* must be OB+LB now */
|
||||
|
||||
/* if we're a master, declare it critical so we set FSD on it */
|
||||
if (flag_isset(ups->status, ST_MASTER))
|
||||
/* if UPS is calibrating, don't declare it critical */
|
||||
/* FIXME: Consider UPSes where we can know if they have other power
|
||||
* circuits (bypass, etc.) and whether those do currently provide
|
||||
* wall power to the host - and that we do not have both calibration
|
||||
* and a real outage, when we still should shut down right now.
|
||||
*/
|
||||
if (flag_isset(ups->status, ST_CAL)) {
|
||||
upslogx(LOG_WARNING, "%s: seems that UPS [%s] is OB+LB now, but "
|
||||
"it is also calibrating - not declaring a critical state",
|
||||
__func__, ups->upsname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if we're a primary, declare it critical so we set FSD on it */
|
||||
if (flag_isset(ups->status, ST_PRIMARY))
|
||||
return 1;
|
||||
|
||||
/* must be a slave now */
|
||||
/* must be a secondary now */
|
||||
|
||||
/* FSD isn't set, so the master hasn't seen it yet */
|
||||
/* FSD isn't set, so the primary hasn't seen it yet */
|
||||
|
||||
time(&now);
|
||||
|
||||
/* give the master up to HOSTSYNC seconds before shutting down */
|
||||
/* give the primary up to HOSTSYNC seconds before shutting down */
|
||||
if ((now - ups->lastnoncrit) > hostsync) {
|
||||
upslogx(LOG_WARNING, "Giving up on the master for UPS [%s]",
|
||||
upslogx(LOG_WARNING, "Giving up on the primary for UPS [%s]",
|
||||
ups->sys);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* there's still time left */
|
||||
/* there's still time left, maybe OB+LB will go away next time we look? */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -680,7 +788,7 @@ static int is_ups_critical(utype_t *ups)
|
|||
static void recalc(void)
|
||||
{
|
||||
utype_t *ups;
|
||||
int val_ol = 0;
|
||||
unsigned int val_ol = 0;
|
||||
time_t now;
|
||||
|
||||
time(&now);
|
||||
|
@ -707,8 +815,8 @@ static void recalc(void)
|
|||
ups = ups->next;
|
||||
}
|
||||
|
||||
upsdebugx(3, "Current power value: %d", val_ol);
|
||||
upsdebugx(3, "Minimum power value: %d", minsupplies);
|
||||
upsdebugx(3, "Current power value: %u", val_ol);
|
||||
upsdebugx(3, "Minimum power value: %u", minsupplies);
|
||||
|
||||
if (val_ol < minsupplies)
|
||||
forceshutdown();
|
||||
|
@ -741,6 +849,21 @@ static void upsreplbatt(utype_t *ups)
|
|||
}
|
||||
}
|
||||
|
||||
static void ups_cal(utype_t *ups)
|
||||
{
|
||||
if (flag_isset(ups->status, ST_CAL)) { /* no change */
|
||||
upsdebugx(4, "%s: %s (no change)", __func__, ups->sys);
|
||||
return;
|
||||
}
|
||||
|
||||
upsdebugx(3, "%s: %s (first time)", __func__, ups->sys);
|
||||
|
||||
/* must have changed from !CAL to CAL, so notify */
|
||||
|
||||
do_notify(ups, NOTIFY_CAL);
|
||||
setflag(&ups->status, ST_CAL);
|
||||
}
|
||||
|
||||
static void ups_fsd(utype_t *ups)
|
||||
{
|
||||
if (flag_isset(ups->status, ST_FSD)) { /* no change */
|
||||
|
@ -770,8 +893,8 @@ static void drop_connection(utype_t *ups)
|
|||
}
|
||||
|
||||
/* change some UPS parameters during reloading */
|
||||
static void redefine_ups(utype_t *ups, int pv, const char *un,
|
||||
const char *pw, const char *master)
|
||||
static void redefine_ups(utype_t *ups, unsigned int pv, const char *un,
|
||||
const char *pw, const char *managerialOption)
|
||||
{
|
||||
ups->retain = 1;
|
||||
|
||||
|
@ -849,45 +972,75 @@ static void redefine_ups(utype_t *ups, int pv, const char *un,
|
|||
}
|
||||
}
|
||||
|
||||
/* slave -> master */
|
||||
if ((!strcasecmp(master, "master")) && (!flag_isset(ups->status, ST_MASTER))) {
|
||||
upslogx(LOG_INFO, "UPS [%s]: redefined as master", ups->sys);
|
||||
setflag(&ups->status, ST_MASTER);
|
||||
/* secondary|slave -> primary|master */
|
||||
if ( ( (!strcasecmp(managerialOption, "primary"))
|
||||
|| (!strcasecmp(managerialOption, "master")) )
|
||||
&& (!flag_isset(ups->status, ST_PRIMARY)) ) {
|
||||
upslogx(LOG_INFO, "UPS [%s]: redefined as a primary", ups->sys);
|
||||
setflag(&ups->status, ST_PRIMARY);
|
||||
|
||||
/* reset connection to ensure master mode gets checked */
|
||||
/* reset connection to ensure primary mode gets checked */
|
||||
drop_connection(ups);
|
||||
return;
|
||||
}
|
||||
|
||||
/* master -> slave */
|
||||
if ((!strcasecmp(master, "slave")) && (flag_isset(ups->status, ST_MASTER))) {
|
||||
upslogx(LOG_INFO, "UPS [%s]: redefined as slave", ups->sys);
|
||||
clearflag(&ups->status, ST_MASTER);
|
||||
/* primary|master -> secondary|slave */
|
||||
if ( ( (!strcasecmp(managerialOption, "secondary"))
|
||||
|| (!strcasecmp(managerialOption, "slave")) )
|
||||
&& (flag_isset(ups->status, ST_PRIMARY)) ) {
|
||||
upslogx(LOG_INFO, "UPS [%s]: redefined as a secondary", ups->sys);
|
||||
clearflag(&ups->status, ST_PRIMARY);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void addups(int reloading, const char *sys, const char *pvs,
|
||||
const char *un, const char *pw, const char *master)
|
||||
const char *un, const char *pw, const char *managerialOption)
|
||||
{
|
||||
int pv;
|
||||
unsigned int pv;
|
||||
utype_t *tmp, *last;
|
||||
|
||||
/* the username is now required - no more host-based auth */
|
||||
|
||||
if ((!sys) || (!pvs) || (!pw) || (!master) || (!un)) {
|
||||
if ((!sys) || (!pvs) || (!pw) || (!managerialOption) || (!un)) {
|
||||
upslogx(LOG_WARNING, "Ignoring invalid MONITOR line in %s!", configfile);
|
||||
upslogx(LOG_WARNING, "MONITOR configuration directives require five arguments.");
|
||||
return;
|
||||
}
|
||||
|
||||
pv = strtol(pvs, (char **) NULL, 10);
|
||||
long lpv = strtol(pvs, (char **) NULL, 10);
|
||||
|
||||
if (pv < 0) {
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE) )
|
||||
# pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE
|
||||
# pragma GCC diagnostic ignored "-Wunreachable-code"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS
|
||||
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE
|
||||
# pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic push
|
||||
# pragma clang diagnostic ignored "-Wunreachable-code"
|
||||
# pragma clang diagnostic ignored "-Wtautological-compare"
|
||||
# pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
|
||||
#endif
|
||||
/* Different platforms, different sizes, none fits all... */
|
||||
if (lpv < 0 || (sizeof(long) > sizeof(unsigned int) && lpv > (long)UINT_MAX)) {
|
||||
#ifdef __clang__
|
||||
# pragma clang diagnostic pop
|
||||
#endif
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE) )
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
upslogx(LOG_WARNING, "UPS [%s]: ignoring invalid power value [%s]",
|
||||
sys, pvs);
|
||||
return;
|
||||
}
|
||||
pv = (unsigned int)lpv;
|
||||
|
||||
last = tmp = firstups;
|
||||
|
||||
|
@ -897,7 +1050,7 @@ static void addups(int reloading, const char *sys, const char *pvs,
|
|||
/* check for duplicates */
|
||||
if (!strcmp(tmp->sys, sys)) {
|
||||
if (reloading)
|
||||
redefine_ups(tmp, pv, un, pw, master);
|
||||
redefine_ups(tmp, pv, un, pw, managerialOption);
|
||||
else
|
||||
upslogx(LOG_WARNING, "Warning: ignoring duplicate"
|
||||
" UPS [%s]", sys);
|
||||
|
@ -914,10 +1067,7 @@ static void addups(int reloading, const char *sys, const char *pvs,
|
|||
/* build this up so the user doesn't run with bad settings */
|
||||
totalpv += tmp->pv;
|
||||
|
||||
if (un)
|
||||
tmp->un = xstrdup(un);
|
||||
else
|
||||
tmp->un = NULL;
|
||||
|
||||
tmp->pw = xstrdup(pw);
|
||||
tmp->status = 0;
|
||||
|
@ -932,8 +1082,10 @@ static void addups(int reloading, const char *sys, const char *pvs,
|
|||
tmp->lastrbwarn = 0;
|
||||
tmp->lastncwarn = 0;
|
||||
|
||||
if (!strcasecmp(master, "master"))
|
||||
setflag(&tmp->status, ST_MASTER);
|
||||
if ( (!strcasecmp(managerialOption, "primary"))
|
||||
|| (!strcasecmp(managerialOption, "master")) ) {
|
||||
setflag(&tmp->status, ST_PRIMARY);
|
||||
}
|
||||
|
||||
tmp->next = NULL;
|
||||
|
||||
|
@ -944,7 +1096,7 @@ static void addups(int reloading, const char *sys, const char *pvs,
|
|||
|
||||
if (tmp->pv)
|
||||
upslogx(LOG_INFO, "UPS: %s (%s) (power value %d)", tmp->sys,
|
||||
flag_isset(tmp->status, ST_MASTER) ? "master" : "slave",
|
||||
flag_isset(tmp->status, ST_PRIMARY) ? "primary" : "secondary",
|
||||
tmp->pv);
|
||||
else
|
||||
upslogx(LOG_INFO, "UPS: %s (monitoring only)", tmp->sys);
|
||||
|
@ -1054,7 +1206,7 @@ static void checkmode(char *cfgentry, char *oldvalue, char *newvalue,
|
|||
}
|
||||
|
||||
/* returns 1 if used, 0 if not, so we can complain about bogus configs */
|
||||
static int parse_conf_arg(int numargs, char **arg)
|
||||
static int parse_conf_arg(size_t numargs, char **arg)
|
||||
{
|
||||
/* using up to arg[1] below */
|
||||
if (numargs < 2)
|
||||
|
@ -1092,13 +1244,23 @@ static int parse_conf_arg(int numargs, char **arg)
|
|||
|
||||
/* POLLFREQ <num> */
|
||||
if (!strcmp(arg[0], "POLLFREQ")) {
|
||||
pollfreq = atoi(arg[1]);
|
||||
int ipollfreq = atoi(arg[1]);
|
||||
if (ipollfreq < 0) {
|
||||
upsdebugx(0, "Ignoring invalid POLLFREQ value: %d", ipollfreq);
|
||||
} else {
|
||||
pollfreq = (unsigned int)ipollfreq;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* POLLFREQALERT <num> */
|
||||
if (!strcmp(arg[0], "POLLFREQALERT")) {
|
||||
pollfreqalert = atoi(arg[1]);
|
||||
int ipollfreqalert = atoi(arg[1]);
|
||||
if (ipollfreqalert < 0) {
|
||||
upsdebugx(0, "Ignoring invalid POLLFREQALERT value: %d", ipollfreqalert);
|
||||
} else {
|
||||
pollfreqalert = (unsigned int)ipollfreqalert;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1116,7 +1278,12 @@ static int parse_conf_arg(int numargs, char **arg)
|
|||
|
||||
/* MINSUPPLIES <num> */
|
||||
if (!strcmp(arg[0], "MINSUPPLIES")) {
|
||||
minsupplies = atoi(arg[1]);
|
||||
int iminsupplies = atoi(arg[1]);
|
||||
if (iminsupplies < 0) {
|
||||
upsdebugx(0, "Ignoring invalid MINSUPPLIES value: %d", iminsupplies);
|
||||
} else {
|
||||
minsupplies = (unsigned int)iminsupplies;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1134,7 +1301,12 @@ static int parse_conf_arg(int numargs, char **arg)
|
|||
|
||||
/* FINALDELAY <num> */
|
||||
if (!strcmp(arg[0], "FINALDELAY")) {
|
||||
finaldelay = atoi(arg[1]);
|
||||
int ifinaldelay = atoi(arg[1]);
|
||||
if (ifinaldelay < 0) {
|
||||
upsdebugx(0, "Ignoring invalid FINALDELAY value: %d", ifinaldelay);
|
||||
} else {
|
||||
finaldelay = (unsigned int)ifinaldelay;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1164,6 +1336,18 @@ static int parse_conf_arg(int numargs, char **arg)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* DEBUG_MIN (NUM) */
|
||||
/* debug_min (NUM) also acceptable, to be on par with ups.conf */
|
||||
if (!strcasecmp(arg[0], "DEBUG_MIN")) {
|
||||
int lvl = -1; // typeof common/common.c: int nut_debug_level
|
||||
if ( str_to_int (arg[1], &lvl, 10) && lvl >= 0 ) {
|
||||
nut_debug_level_global = lvl;
|
||||
} else {
|
||||
upslogx(LOG_INFO, "WARNING : Invalid DEBUG_MIN value found in upsmon.conf global settings");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* using up to arg[2] below */
|
||||
if (numargs < 3)
|
||||
return 0;
|
||||
|
@ -1209,7 +1393,7 @@ static int parse_conf_arg(int numargs, char **arg)
|
|||
fatalx(EXIT_FAILURE, "Fatal error: unusable configuration");
|
||||
}
|
||||
|
||||
/* <sys> <pwrval> <user> <pw> ("master" | "slave") */
|
||||
/* <sys> <pwrval> <user> <pw> ("primary"|"master" | "secondary"|"slave") */
|
||||
addups(reload_flag, arg[1], arg[2], arg[3], arg[4], arg[5]);
|
||||
return 1;
|
||||
}
|
||||
|
@ -1241,6 +1425,13 @@ static void loadconfig(void)
|
|||
fatalx(EXIT_FAILURE, "%s", ctx.errmsg);
|
||||
}
|
||||
|
||||
if (reload_flag == 1) {
|
||||
/* if upsmon.conf added or changed
|
||||
* (or commented away) the debug_min
|
||||
* setting, detect that */
|
||||
nut_debug_level_global = -1;
|
||||
}
|
||||
|
||||
while (pconf_file_next(&ctx)) {
|
||||
if (pconf_parse_error(&ctx)) {
|
||||
upslogx(LOG_ERR, "Parse error: %s:%d: %s",
|
||||
|
@ -1267,13 +1458,22 @@ static void loadconfig(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (reload_flag == 1) {
|
||||
if (nut_debug_level_global > -1) {
|
||||
upslogx(LOG_INFO,
|
||||
"Applying debug_min=%d from upsmon.conf",
|
||||
nut_debug_level_global);
|
||||
nut_debug_level = nut_debug_level_global;
|
||||
}
|
||||
}
|
||||
|
||||
pconf_finish(&ctx);
|
||||
}
|
||||
|
||||
/* SIGPIPE handler */
|
||||
static void sigpipe(int sig)
|
||||
{
|
||||
upsdebugx(1, "SIGPIPE: dazed and confused, but continuing...");
|
||||
upsdebugx(1, "SIGPIPE: dazed and confused, but continuing after signal %i...", sig);
|
||||
}
|
||||
|
||||
/* SIGQUIT, SIGTERM handler */
|
||||
|
@ -1329,12 +1529,16 @@ static void user_fsd(int sig)
|
|||
|
||||
static void set_reload_flag(int sig)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(sig);
|
||||
|
||||
reload_flag = 1;
|
||||
}
|
||||
|
||||
/* handler for alarm when getupsvarfd times out */
|
||||
static void read_timeout(int sig)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(sig);
|
||||
|
||||
/* don't do anything here, just return */
|
||||
}
|
||||
|
||||
|
@ -1370,9 +1574,10 @@ static void setup_signals(void)
|
|||
/* remember the last time the ups was not critical (OB + LB) */
|
||||
static void update_crittimer(utype_t *ups)
|
||||
{
|
||||
/* if !OB or !LB, then it's not critical, so log the time */
|
||||
/* if !OB, !LB, or CAL, then it's not critical, so log the time */
|
||||
if ((!flag_isset(ups->status, ST_ONBATT)) ||
|
||||
(!flag_isset(ups->status, ST_LOWBATT))) {
|
||||
(!flag_isset(ups->status, ST_LOWBATT)) ||
|
||||
(flag_isset(ups->status, ST_CAL))) {
|
||||
|
||||
time(&ups->lastnoncrit);
|
||||
return;
|
||||
|
@ -1432,6 +1637,9 @@ static int try_connect(utype_t *ups)
|
|||
/* we're definitely connected now */
|
||||
setflag(&ups->status, ST_CONNECTED);
|
||||
|
||||
/* prevent connection leaking to NOTIFYCMD */
|
||||
fcntl(upscli_fd(&ups->conn), F_SETFD, FD_CLOEXEC);
|
||||
|
||||
/* now try to authenticate to upsd */
|
||||
|
||||
ret = do_upsd_auth(ups);
|
||||
|
@ -1456,7 +1664,7 @@ static void parse_status(utype_t *ups, char *status)
|
|||
upsdebugx(2, "%s: [%s]", __func__, status);
|
||||
|
||||
/* empty response is the same as a dead ups */
|
||||
if (!strcmp(status, "")) {
|
||||
if (status == NULL || status[0] == '\0') {
|
||||
ups_is_gone(ups);
|
||||
return;
|
||||
}
|
||||
|
@ -1487,6 +1695,8 @@ static void parse_status(utype_t *ups, char *status)
|
|||
ups_low_batt(ups);
|
||||
if (!strcasecmp(statword, "RB"))
|
||||
upsreplbatt(ups);
|
||||
if (!strcasecmp(statword, "CAL"))
|
||||
ups_cal(ups);
|
||||
|
||||
/* do it last to override any possible OL */
|
||||
if (!strcasecmp(statword, "FSD"))
|
||||
|
@ -1634,17 +1844,23 @@ static int check_pdflag(void)
|
|||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
static void help(const char *progname)
|
||||
static void help(const char *arg_progname)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void help(const char *arg_progname)
|
||||
{
|
||||
printf("Monitors UPS servers and may initiate shutdown if necessary.\n\n");
|
||||
|
||||
printf("usage: %s [OPTIONS]\n\n", progname);
|
||||
printf("usage: %s [OPTIONS]\n\n", arg_progname);
|
||||
printf(" -c <cmd> send command to running process\n");
|
||||
printf(" commands:\n");
|
||||
printf(" - fsd: shutdown all master UPSes (use with caution)\n");
|
||||
printf(" - fsd: shutdown all primary-mode UPSes (use with caution)\n");
|
||||
printf(" - reload: reread configuration\n");
|
||||
printf(" - stop: stop monitoring and exit\n");
|
||||
printf(" -D raise debugging level\n");
|
||||
printf(" -P <pid> send the signal above to specified PID (bypassing PID file)\n");
|
||||
printf(" -D raise debugging level (and stay foreground by default)\n");
|
||||
printf(" -F stay foregrounded even if no debugging is enabled\n");
|
||||
printf(" -B stay backgrounded even if debugging is bumped\n");
|
||||
printf(" -h display this help\n");
|
||||
printf(" -K checks POWERDOWNFLAG, sets exit code to 0 if set\n");
|
||||
printf(" -p always run privileged (disable privileged parent)\n");
|
||||
|
@ -1655,15 +1871,26 @@ static void help(const char *progname)
|
|||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
static void runparent(int fd)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void runparent(int fd)
|
||||
{
|
||||
int ret;
|
||||
ssize_t ret;
|
||||
int sret;
|
||||
char ch;
|
||||
|
||||
/* handling signals is the child's job */
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_STRICT_PROTOTYPES)
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Wstrict-prototypes"
|
||||
#endif
|
||||
signal(SIGHUP, SIG_IGN);
|
||||
signal(SIGUSR1, SIG_IGN);
|
||||
signal(SIGUSR2, SIG_IGN);
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_STRICT_PROTOTYPES)
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
ret = read(fd, &ch, 1);
|
||||
|
||||
|
@ -1680,9 +1907,9 @@ static void runparent(int fd)
|
|||
/* have to do this here - child is unprivileged */
|
||||
set_pdflag();
|
||||
|
||||
ret = system(shutdowncmd);
|
||||
sret = system(shutdowncmd);
|
||||
|
||||
if (ret != 0)
|
||||
if (sret != 0)
|
||||
upslogx(LOG_ERR, "parent: Unable to call shutdown command: %s",
|
||||
shutdowncmd);
|
||||
|
||||
|
@ -1710,10 +1937,15 @@ static void start_pipe(void)
|
|||
close(pipefd[1]);
|
||||
runparent(pipefd[0]);
|
||||
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
exit(EXIT_FAILURE); /* NOTREACHED */
|
||||
#endif
|
||||
}
|
||||
|
||||
close(pipefd[0]);
|
||||
|
||||
/* prevent pipe leaking to NOTIFYCMD */
|
||||
fcntl(pipefd[1], F_SETFD, FD_CLOEXEC);
|
||||
}
|
||||
|
||||
static void delete_ups(utype_t *target)
|
||||
|
@ -1814,7 +2046,7 @@ static void reload_conf(void)
|
|||
upslogx(LOG_CRIT, "Fatal error: total power value (%d) less "
|
||||
"than MINSUPPLIES (%d)", totalpv, minsupplies);
|
||||
|
||||
fatalx(EXIT_FAILURE, "Impossible power configuation, unable to continue");
|
||||
fatalx(EXIT_FAILURE, "Impossible power configuration, unable to continue");
|
||||
}
|
||||
|
||||
/* finally clear the flag */
|
||||
|
@ -1859,7 +2091,8 @@ static void check_parent(void)
|
|||
int main(int argc, char *argv[])
|
||||
{
|
||||
const char *prog = xbasename(argv[0]);
|
||||
int i, cmd = 0, checking_flag = 0;
|
||||
int i, cmd = 0, cmdret = -1, checking_flag = 0, foreground = -1;
|
||||
pid_t oldpid = -1;
|
||||
|
||||
printf("Network UPS Tools %s %s\n", prog, UPS_VERSION);
|
||||
|
||||
|
@ -1870,7 +2103,7 @@ int main(int argc, char *argv[])
|
|||
|
||||
run_as_user = xstrdup(RUN_AS_USER);
|
||||
|
||||
while ((i = getopt(argc, argv, "+Dhic:f:pu:VK46")) != -1) {
|
||||
while ((i = getopt(argc, argv, "+DFBhic:P:f:pu:VK46")) != -1) {
|
||||
switch (i) {
|
||||
case 'c':
|
||||
if (!strncmp(optarg, "fsd", strlen(optarg)))
|
||||
|
@ -1884,16 +2117,30 @@ int main(int argc, char *argv[])
|
|||
if (cmd == 0)
|
||||
help(argv[0]);
|
||||
break;
|
||||
|
||||
case 'P':
|
||||
if ((oldpid = parsepid(optarg)) < 0)
|
||||
help(argv[0]);
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
nut_debug_level++;
|
||||
break;
|
||||
case 'F':
|
||||
foreground = 1;
|
||||
break;
|
||||
case 'B':
|
||||
foreground = 0;
|
||||
break;
|
||||
case 'f':
|
||||
free(configfile);
|
||||
configfile = xstrdup(optarg);
|
||||
break;
|
||||
case 'h':
|
||||
help(argv[0]);
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
break;
|
||||
#endif
|
||||
case 'K':
|
||||
checking_flag = 1;
|
||||
break;
|
||||
|
@ -1915,22 +2162,56 @@ int main(int argc, char *argv[])
|
|||
break;
|
||||
default:
|
||||
help(argv[0]);
|
||||
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (foreground < 0) {
|
||||
if (nut_debug_level > 0) {
|
||||
foreground = 1;
|
||||
} else {
|
||||
foreground = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (cmd) {
|
||||
sendsignal(prog, cmd);
|
||||
exit(EXIT_SUCCESS);
|
||||
if (oldpid < 0) {
|
||||
cmdret = sendsignal(prog, cmd);
|
||||
} else {
|
||||
cmdret = sendsignalpid(oldpid, cmd);
|
||||
}
|
||||
/* exit(EXIT_SUCCESS); */
|
||||
exit((cmdret == 0)?EXIT_SUCCESS:EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* otherwise, we are being asked to start.
|
||||
* so check if a previous instance is running by sending signal '0'
|
||||
* (Ie 'kill <pid> 0') */
|
||||
if (sendsignal(prog, 0) == 0) {
|
||||
if (oldpid < 0) {
|
||||
cmdret = sendsignal(prog, 0);
|
||||
} else {
|
||||
cmdret = sendsignalpid(oldpid, 0);
|
||||
}
|
||||
switch (cmdret) {
|
||||
case 0:
|
||||
printf("Fatal error: A previous upsmon instance is already running!\n");
|
||||
printf("Either stop the previous instance first, or use the 'reload' command.\n");
|
||||
exit(EXIT_FAILURE);
|
||||
|
||||
case -3:
|
||||
case -2:
|
||||
upslogx(LOG_WARNING, "Could not %s PID file "
|
||||
"to see if previous upsmon instance is "
|
||||
"already running!\n",
|
||||
(cmdret == -3 ? "find" : "parse"));
|
||||
break;
|
||||
|
||||
case -1:
|
||||
default:
|
||||
/* Just failed to send signal, no competitor running */
|
||||
break;
|
||||
}
|
||||
|
||||
argc -= optind;
|
||||
|
@ -1940,6 +2221,14 @@ int main(int argc, char *argv[])
|
|||
|
||||
loadconfig();
|
||||
|
||||
/* CLI debug level can not be smaller than debug_min specified
|
||||
* in upsmon.conf. Note that non-zero debug_min does not impact
|
||||
* foreground running mode.
|
||||
*/
|
||||
if (nut_debug_level_global > nut_debug_level)
|
||||
nut_debug_level = nut_debug_level_global;
|
||||
upsdebugx(1, "debug level is '%d'", nut_debug_level);
|
||||
|
||||
if (checking_flag)
|
||||
exit(check_pdflag());
|
||||
|
||||
|
@ -1962,9 +2251,11 @@ int main(int argc, char *argv[])
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (nut_debug_level < 1) {
|
||||
if (!foreground) {
|
||||
background();
|
||||
} else {
|
||||
}
|
||||
|
||||
if (nut_debug_level >= 1) {
|
||||
upsdebugx(1, "debug level is '%d'", nut_debug_level);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,15 +17,20 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef NUT_UPSMON_H_SEEN
|
||||
#define NUT_UPSMON_H_SEEN 1
|
||||
|
||||
/* flags for ups->status */
|
||||
|
||||
#define ST_ONLINE (1 << 0) /* UPS is on line (OL) */
|
||||
#define ST_ONBATT (1 << 1) /* UPS is on battery (OB) */
|
||||
#define ST_LOWBATT (1 << 2) /* UPS has a low battery (LB) */
|
||||
#define ST_FSD (1 << 3) /* master has set forced shutdown flag */
|
||||
#define ST_MASTER (1 << 4) /* we are the master on this UPS */
|
||||
#define ST_FSD (1 << 3) /* primary has set forced shutdown flag */
|
||||
#define ST_PRIMARY (1 << 4) /* we are the primary (manager) of this UPS */
|
||||
#define ST_MASTER ST_PRIMARY /* legacy alias */
|
||||
#define ST_LOGIN (1 << 5) /* we are logged into this UPS */
|
||||
#define ST_CONNECTED (1 << 6) /* upscli_connect returned OK */
|
||||
#define ST_CAL (1 << 7) /* UPS calibration in progress (CAL) */
|
||||
|
||||
/* required contents of flag file */
|
||||
#define SDMAGIC "upsmon-shutdown-file"
|
||||
|
@ -44,9 +49,9 @@ typedef struct {
|
|||
char *sys; /* raw system name from .conf */
|
||||
char *upsname; /* just upsname */
|
||||
char *hostname; /* just hostname */
|
||||
int port; /* just the port */
|
||||
uint16_t port; /* just the port */
|
||||
|
||||
int pv; /* power value from conf */
|
||||
unsigned int pv; /* power value from conf */
|
||||
char *un; /* username (optional for now) */
|
||||
char *pw; /* password from conf */
|
||||
int status; /* status (see flags above) */
|
||||
|
@ -68,13 +73,14 @@ typedef struct {
|
|||
#define NOTIFY_ONLINE 0 /* UPS went on-line */
|
||||
#define NOTIFY_ONBATT 1 /* UPS went on battery */
|
||||
#define NOTIFY_LOWBATT 2 /* UPS went to low battery */
|
||||
#define NOTIFY_FSD 3 /* Master upsmon set FSD flag */
|
||||
#define NOTIFY_FSD 3 /* Primary upsmon set FSD flag */
|
||||
#define NOTIFY_COMMOK 4 /* Communication established */
|
||||
#define NOTIFY_COMMBAD 5 /* Communication lost */
|
||||
#define NOTIFY_SHUTDOWN 6 /* System shutdown in progress */
|
||||
#define NOTIFY_REPLBATT 7 /* UPS battery needs to be replaced */
|
||||
#define NOTIFY_NOCOMM 8 /* UPS hasn't been contacted in a while */
|
||||
#define NOTIFY_NOPARENT 9 /* privileged parent process died */
|
||||
#define NOTIFY_CAL 10 /* UPS is performing calibration */
|
||||
|
||||
/* notify flag values */
|
||||
|
||||
|
@ -86,7 +92,10 @@ typedef struct {
|
|||
/* flags are set to NOTIFY_SYSLOG | NOTIFY_WALL at program init */
|
||||
/* the user can override with NOTIFYFLAGS in the upsmon.conf */
|
||||
|
||||
struct {
|
||||
/* This is only used in upsmon.c, but might it also have external consumers?..
|
||||
* To move or not to move?..
|
||||
*/
|
||||
static struct {
|
||||
int type;
|
||||
const char *name;
|
||||
char *msg; /* NULL until overridden */
|
||||
|
@ -104,6 +113,7 @@ struct {
|
|||
{ NOTIFY_REPLBATT, "REPLBATT", NULL, "UPS %s battery needs to be replaced", NOTIFY_SYSLOG | NOTIFY_WALL },
|
||||
{ NOTIFY_NOCOMM, "NOCOMM", NULL, "UPS %s is unavailable", NOTIFY_SYSLOG | NOTIFY_WALL },
|
||||
{ NOTIFY_NOPARENT, "NOPARENT", NULL, "upsmon parent process died - shutdown impossible", NOTIFY_SYSLOG | NOTIFY_WALL },
|
||||
{ NOTIFY_CAL, "CAL", NULL, "UPS %s: calibration in progress", NOTIFY_SYSLOG },
|
||||
{ 0, NULL, NULL, NULL, 0 }
|
||||
};
|
||||
|
||||
|
@ -122,3 +132,5 @@ struct {
|
|||
}
|
||||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
#endif /* NUT_UPSMON_H_SEEN */
|
||||
|
|
220
clients/upsrw.c
220
clients/upsrw.c
|
@ -1,6 +1,8 @@
|
|||
/* upsrw - simple client for read/write variable access (formerly upsct2)
|
||||
|
||||
Copyright (C) 1999 Russell Kroll <rkroll@exploits.org>
|
||||
Copyright (C)
|
||||
1999 Russell Kroll <rkroll@exploits.org>
|
||||
2019 EATON (author: Arnaud Quette <ArnaudQuette@eaton.com>)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -25,10 +27,14 @@
|
|||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "nut_stdint.h"
|
||||
#include "upsclient.h"
|
||||
#include "extstate.h"
|
||||
|
||||
static char *upsname = NULL, *hostname = NULL;
|
||||
static UPSCONN_t *ups = NULL;
|
||||
static int tracking_enabled = 0;
|
||||
static unsigned int timeout = DEFAULT_TRACKING_TIMEOUT;
|
||||
|
||||
struct list_t {
|
||||
char *name;
|
||||
|
@ -39,18 +45,22 @@ static void usage(const char *prog)
|
|||
{
|
||||
printf("Network UPS Tools %s %s\n\n", prog, UPS_VERSION);
|
||||
printf("usage: %s [-h]\n", prog);
|
||||
printf(" %s [-s <variable>] [-u <username>] [-p <password>] <ups>\n\n", prog);
|
||||
printf(" %s [-s <variable>] [-u <username>] [-p <password>] [-w] [-t <timeout>] <ups>\n\n", prog);
|
||||
printf("Demo program to set variables within UPS hardware.\n");
|
||||
printf("\n");
|
||||
printf(" -h display this help text\n");
|
||||
printf(" -s <variable> specify variable to be changed\n");
|
||||
printf(" use -s VAR=VALUE to avoid prompting for value\n");
|
||||
printf(" -l show all possible read/write variables.\n");
|
||||
printf(" -u <username> set username for command authentication\n");
|
||||
printf(" -p <password> set password for command authentication\n");
|
||||
printf(" -w wait for the completion of setting by the driver\n");
|
||||
printf(" and return its actual result from the device\n");
|
||||
printf(" -t <timeout> set a timeout when using -w (in seconds, default: %u)\n", DEFAULT_TRACKING_TIMEOUT);
|
||||
printf("\n");
|
||||
printf(" <ups> UPS identifier - <upsname>[@<hostname>[:<port>]]\n");
|
||||
printf("\n");
|
||||
printf("Call without -s to show all possible read/write variables.\n");
|
||||
printf("Call without -s to show all possible read/write variables (same as -l).\n");
|
||||
}
|
||||
|
||||
static void clean_exit(void)
|
||||
|
@ -64,9 +74,21 @@ static void clean_exit(void)
|
|||
free(ups);
|
||||
}
|
||||
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_BESIDEFUNC) && (!defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_INSIDEFUNC) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC) )
|
||||
# pragma GCC diagnostic push
|
||||
#endif
|
||||
#if (!defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_INSIDEFUNC) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC)
|
||||
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||
#endif
|
||||
#if (!defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_INSIDEFUNC) && (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC)
|
||||
# pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
|
||||
#endif
|
||||
static void do_set(const char *varname, const char *newval)
|
||||
{
|
||||
int cmd_complete = 0;
|
||||
char buf[SMALLBUF], enc[SMALLBUF];
|
||||
char tracking_id[UUID4_LEN];
|
||||
time_t start, now;
|
||||
|
||||
snprintf(buf, sizeof(buf), "SET VAR %s %s \"%s\"\n", upsname, varname, pconf_encode(newval, enc, sizeof(enc)));
|
||||
|
||||
|
@ -78,17 +100,92 @@ static void do_set(const char *varname, const char *newval)
|
|||
fatalx(EXIT_FAILURE, "Set variable failed: %s", upscli_strerror(ups));
|
||||
}
|
||||
|
||||
/* FUTURE: status cookies will tie in here */
|
||||
/* verify answer */
|
||||
if (strncmp(buf, "OK", 2) != 0) {
|
||||
fatalx(EXIT_FAILURE, "Unexpected response from upsd: %s", buf);
|
||||
}
|
||||
|
||||
/* check for status tracking id */
|
||||
if (
|
||||
!tracking_enabled ||
|
||||
/* sanity check on the size: "OK TRACKING " + UUID4_LEN */
|
||||
strlen(buf) != (UUID4_LEN - 1 + strlen("OK TRACKING "))
|
||||
) {
|
||||
/* reply as usual */
|
||||
fprintf(stderr, "%s\n", buf);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_TRUNCATION
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_TRUNCATION
|
||||
#pragma GCC diagnostic ignored "-Wformat-truncation"
|
||||
#endif
|
||||
/* From the check above, we know that we have exactly UUID4_LEN chars
|
||||
* (aka sizeof(tracking_id)) in the buf after "OK TRACKING " prefix,
|
||||
* plus the null-byte.
|
||||
*/
|
||||
assert (UUID4_LEN == 1 + snprintf(tracking_id, sizeof(tracking_id), "%s", buf + strlen("OK TRACKING ")));
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_TRUNCATION
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
time(&start);
|
||||
|
||||
/* send status tracking request, looping if status is PENDING */
|
||||
while (!cmd_complete) {
|
||||
|
||||
/* check for timeout */
|
||||
time(&now);
|
||||
if (difftime(now, start) >= timeout)
|
||||
fatalx(EXIT_FAILURE, "Can't receive status tracking information: timeout");
|
||||
|
||||
snprintf(buf, sizeof(buf), "GET TRACKING %s\n", tracking_id);
|
||||
|
||||
if (upscli_sendline(ups, buf, strlen(buf)) < 0)
|
||||
fatalx(EXIT_FAILURE, "Can't send status tracking request: %s", upscli_strerror(ups));
|
||||
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE) )
|
||||
/* Note for gating macros above: unsuffixed HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP
|
||||
* means support of contexts both inside and outside function body, so the push
|
||||
* above and pop below (outside this finction) are not used.
|
||||
*/
|
||||
# pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS
|
||||
/* Note that the individual warning pragmas for use inside function bodies
|
||||
* are named without a _INSIDEFUNC suffix, for simplicity and legacy reasons
|
||||
*/
|
||||
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE
|
||||
# pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
|
||||
#endif
|
||||
/* and get status tracking reply */
|
||||
assert(timeout < LONG_MAX);
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE) )
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
if (upscli_readline_timeout(ups, buf, sizeof(buf), (long)timeout) < 0)
|
||||
fatalx(EXIT_FAILURE, "Can't receive status tracking information: %s", upscli_strerror(ups));
|
||||
|
||||
if (strncmp(buf, "PENDING", 7))
|
||||
cmd_complete = 1;
|
||||
else
|
||||
/* wait a second before retrying */
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s\n", buf);
|
||||
}
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_BESIDEFUNC) && (!defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP_INSIDEFUNC) && ( (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TYPE_LIMITS_BESIDEFUNC) || (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE_BESIDEFUNC) )
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
static void do_setvar(const char *varname, char *uin, const char *pass)
|
||||
{
|
||||
char newval[SMALLBUF], temp[SMALLBUF], user[SMALLBUF], *ptr;
|
||||
char newval[SMALLBUF], temp[SMALLBUF * 2], user[SMALLBUF], *ptr;
|
||||
struct passwd *pw;
|
||||
|
||||
if (uin) {
|
||||
|
@ -177,13 +274,32 @@ static void do_setvar(const char *varname, char *uin, const char *pass)
|
|||
fatalx(EXIT_FAILURE, "Error: old variable names are not supported");
|
||||
}
|
||||
|
||||
/* enable status tracking ID */
|
||||
if (tracking_enabled) {
|
||||
|
||||
snprintf(temp, sizeof(temp), "SET TRACKING ON\n");
|
||||
|
||||
if (upscli_sendline(ups, temp, strlen(temp)) < 0) {
|
||||
fatalx(EXIT_FAILURE, "Can't enable set variable status tracking: %s", upscli_strerror(ups));
|
||||
}
|
||||
|
||||
if (upscli_readline(ups, temp, sizeof(temp)) < 0) {
|
||||
fatalx(EXIT_FAILURE, "Enabling set variable status tracking failed: %s", upscli_strerror(ups));
|
||||
}
|
||||
|
||||
/* Verify the result */
|
||||
if (strncmp(temp, "OK", 2) != 0) {
|
||||
fatalx(EXIT_FAILURE, "Enabling set variable status tracking failed. upsd answered: %s", temp);
|
||||
}
|
||||
}
|
||||
|
||||
do_set(varname, newval);
|
||||
}
|
||||
|
||||
static const char *get_data(const char *type, const char *varname)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
char **answer;
|
||||
const char *query[4];
|
||||
|
||||
|
@ -203,7 +319,7 @@ static const char *get_data(const char *type, const char *varname)
|
|||
return answer[3];
|
||||
}
|
||||
|
||||
static void do_string(const char *varname, const int len)
|
||||
static void do_string(const char *varname, const long len)
|
||||
{
|
||||
const char *val;
|
||||
|
||||
|
@ -214,14 +330,34 @@ static void do_string(const char *varname, const int len)
|
|||
}
|
||||
|
||||
printf("Type: STRING\n");
|
||||
printf("Maximum length: %d\n", len);
|
||||
printf("Maximum length: %ld\n", len);
|
||||
printf("Value: %s\n", val);
|
||||
}
|
||||
|
||||
static void do_enum(const char *varname)
|
||||
static void do_number(const char *varname)
|
||||
{
|
||||
const char *val;
|
||||
|
||||
val = get_data("VAR", varname);
|
||||
|
||||
if (!val) {
|
||||
fatalx(EXIT_FAILURE, "do_number: can't get current value of %s", varname);
|
||||
}
|
||||
|
||||
printf("Type: NUMBER\n");
|
||||
printf("Value: %s\n", val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display ENUM information
|
||||
* @param varname the name of the NUT variable
|
||||
* @param vartype the type of the NUT variable (ST_FLAG_STRING, ST_FLAG_NUMBER
|
||||
* @param len the length of the NUT variable, if type == ST_FLAG_STRING
|
||||
*/
|
||||
static void do_enum(const char *varname, const int vartype, const long len)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
char **answer, buf[SMALLBUF];
|
||||
const char *query[4], *val;
|
||||
|
||||
|
@ -247,14 +383,21 @@ static void do_enum(const char *varname)
|
|||
|
||||
ret = upscli_list_next(ups, numq, query, &numa, &answer);
|
||||
|
||||
/* Fallback for older upsd versions */
|
||||
if (vartype != ST_FLAG_NONE)
|
||||
printf("Type: ENUM %s\n", (vartype == ST_FLAG_STRING)?"STRING":"NUMBER");
|
||||
else
|
||||
printf("Type: ENUM\n");
|
||||
|
||||
if (vartype == ST_FLAG_STRING)
|
||||
printf("Maximum length: %ld\n", len);
|
||||
|
||||
while (ret == 1) {
|
||||
|
||||
/* ENUM <upsname> <varname> <value> */
|
||||
|
||||
if (numa < 4) {
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 4)", numa);
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %zu args, need at least 4)", numa);
|
||||
}
|
||||
|
||||
printf("Option: \"%s\"", answer[3]);
|
||||
|
@ -272,7 +415,7 @@ static void do_enum(const char *varname)
|
|||
static void do_range(const char *varname)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
char **answer;
|
||||
const char *query[4], *val;
|
||||
int ival, min, max;
|
||||
|
@ -299,14 +442,15 @@ static void do_range(const char *varname)
|
|||
|
||||
ret = upscli_list_next(ups, numq, query, &numa, &answer);
|
||||
|
||||
printf("Type: RANGE\n");
|
||||
/* Ranges implies a type "NUMBER" */
|
||||
printf("Type: RANGE NUMBER\n");
|
||||
|
||||
while (ret == 1) {
|
||||
|
||||
/* RANGE <upsname> <varname> <min> <max> */
|
||||
|
||||
if (numa < 5) {
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 4)", numa);
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %zu args, need at least 4)", numa);
|
||||
}
|
||||
|
||||
min = atoi(answer[3]);
|
||||
|
@ -327,7 +471,8 @@ static void do_range(const char *varname)
|
|||
static void do_type(const char *varname)
|
||||
{
|
||||
int ret;
|
||||
unsigned int i, numq, numa;
|
||||
int is_enum = 0; /* 1 if ENUM; FIXME: add a boolean type in common.h */
|
||||
size_t i, numq, numa;
|
||||
char **answer;
|
||||
const char *query[4];
|
||||
|
||||
|
@ -346,9 +491,11 @@ static void do_type(const char *varname)
|
|||
/* TYPE <upsname> <varname> <type>... */
|
||||
for (i = 3; i < numa; i++) {
|
||||
|
||||
/* ENUM can be NUMBER or STRING
|
||||
* just flag it for latter processing */
|
||||
if (!strcasecmp(answer[i], "ENUM")) {
|
||||
do_enum(varname);
|
||||
return;
|
||||
is_enum = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strcasecmp(answer[i], "RANGE")) {
|
||||
|
@ -359,13 +506,24 @@ static void do_type(const char *varname)
|
|||
if (!strncasecmp(answer[i], "STRING:", 7)) {
|
||||
|
||||
char *len = answer[i] + 7;
|
||||
int length = strtol(len, NULL, 10);
|
||||
long length = strtol(len, NULL, 10);
|
||||
|
||||
if (is_enum == 1)
|
||||
do_enum(varname, ST_FLAG_STRING, length);
|
||||
else
|
||||
do_string(varname, length);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
if (!strcasecmp(answer[i], "NUMBER")) {
|
||||
if (is_enum == 1)
|
||||
do_enum(varname, ST_FLAG_NUMBER, 0);
|
||||
else
|
||||
do_number(varname);
|
||||
return;
|
||||
}
|
||||
|
||||
/* ignore this one */
|
||||
if (!strcasecmp(answer[i], "RW")) {
|
||||
continue;
|
||||
|
@ -373,6 +531,10 @@ static void do_type(const char *varname)
|
|||
|
||||
printf("Type: %s (unrecognized)\n", answer[i]);
|
||||
}
|
||||
/* Fallback for older upsd versions, where STRING|NUMBER is not
|
||||
* appended to ENUM */
|
||||
if (is_enum == 1)
|
||||
do_enum(varname, ST_FLAG_NONE, 0);
|
||||
}
|
||||
|
||||
static void print_rw(const char *varname)
|
||||
|
@ -397,7 +559,7 @@ static void print_rw(const char *varname)
|
|||
static void print_rwlist(void)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[2];
|
||||
char **answer;
|
||||
struct list_t *lhead, *llast, *ltmp, *lnext;
|
||||
|
@ -431,7 +593,7 @@ static void print_rwlist(void)
|
|||
|
||||
/* RW <upsname> <varname> <value> */
|
||||
if (numa < 4) {
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 4)", numa);
|
||||
fatalx(EXIT_FAILURE, "Error: insufficient data (got %zu args, need at least 4)", numa);
|
||||
}
|
||||
|
||||
/* sock this entry away for later */
|
||||
|
@ -468,22 +630,36 @@ static void print_rwlist(void)
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i, port;
|
||||
int i;
|
||||
uint16_t port;
|
||||
const char *prog = xbasename(argv[0]);
|
||||
char *password = NULL, *username = NULL, *setvar = NULL;
|
||||
|
||||
while ((i = getopt(argc, argv, "+hs:p:u:V")) != -1) {
|
||||
while ((i = getopt(argc, argv, "+hls:p:t:u:wV")) != -1) {
|
||||
switch (i)
|
||||
{
|
||||
case 's':
|
||||
setvar = optarg;
|
||||
break;
|
||||
case 'l':
|
||||
if (setvar) {
|
||||
upslogx(LOG_WARNING, "Listing mode requested, overriding setvar specified earlier!");
|
||||
setvar = NULL;
|
||||
}
|
||||
break;
|
||||
case 'p':
|
||||
password = optarg;
|
||||
break;
|
||||
case 't':
|
||||
if (!str_to_uint(optarg, &timeout, 10))
|
||||
fatal_with_errno(EXIT_FAILURE, "Could not convert the provided value for timeout ('-t' option) to unsigned int");
|
||||
break;
|
||||
case 'u':
|
||||
username = optarg;
|
||||
break;
|
||||
case 'w':
|
||||
tracking_enabled = 1;
|
||||
break;
|
||||
case 'V':
|
||||
printf("Network UPS Tools %s %s\n", prog, UPS_VERSION);
|
||||
exit(EXIT_SUCCESS);
|
||||
|
|
|
@ -11,8 +11,19 @@
|
|||
# from your AT lines.
|
||||
|
||||
case $1 in
|
||||
onbattwarn)
|
||||
# Send a notification mail
|
||||
echo "The UPS has been on battery for awhile" \
|
||||
| mail -s"UPS monitor" bofh@pager.example.com
|
||||
# Create a flag-file on the filesystem, for your own processing
|
||||
/usr/bin/touch /some/path/ups-on-battery
|
||||
;;
|
||||
ups-back-on-power)
|
||||
# Delete the flag-file on the filesystem
|
||||
/bin/rm -f /some/path/ups-on-battery
|
||||
;;
|
||||
upsgone)
|
||||
logger -t upssched-cmd "The UPS has been gone for awhile"
|
||||
logger -t upssched-cmd "The communication with UPS has been gone for awhile"
|
||||
;;
|
||||
*)
|
||||
logger -t upssched-cmd "Unrecognized command: $1"
|
||||
|
|
|
@ -46,9 +46,12 @@
|
|||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <netinet/in.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "upssched.h"
|
||||
#include "timehead.h"
|
||||
#include "nut_stdint.h"
|
||||
|
||||
typedef struct ttype_s {
|
||||
char *name;
|
||||
|
@ -56,14 +59,13 @@ typedef struct ttype_s {
|
|||
struct ttype_s *next;
|
||||
} ttype_t;
|
||||
|
||||
ttype_t *thead = NULL;
|
||||
static ttype_t *thead = NULL;
|
||||
static conn_t *connhead = NULL;
|
||||
char *cmdscript = NULL, *pipefn = NULL, *lockfn = NULL;
|
||||
int verbose = 0; /* use for debugging */
|
||||
|
||||
static char *cmdscript = NULL, *pipefn = NULL, *lockfn = NULL;
|
||||
static int verbose = 0; /* use for debugging */
|
||||
|
||||
/* ups name and notify type (string) as received from upsmon */
|
||||
const char *upsname, *notify_type;
|
||||
static const char *upsname, *notify_type;
|
||||
|
||||
#define PARENT_STARTED -2
|
||||
#define PARENT_UNNECESSARY -3
|
||||
|
@ -179,7 +181,7 @@ static void checktimers(void)
|
|||
static void start_timer(const char *name, const char *ofsstr)
|
||||
{
|
||||
time_t now;
|
||||
int ofs;
|
||||
long ofs;
|
||||
ttype_t *tmp, *last;
|
||||
|
||||
/* get the time */
|
||||
|
@ -194,7 +196,7 @@ static void start_timer(const char *name, const char *ofsstr)
|
|||
}
|
||||
|
||||
if (verbose)
|
||||
upslogx(LOG_INFO, "New timer: %s (%d seconds)", name, ofs);
|
||||
upslogx(LOG_INFO, "New timer: %s (%ld seconds)", name, ofs);
|
||||
|
||||
/* now add to the queue */
|
||||
tmp = last = thead;
|
||||
|
@ -240,7 +242,7 @@ static void cancel_timer(const char *name, const char *cname)
|
|||
static void us_serialize(int op)
|
||||
{
|
||||
static int pipefd[2];
|
||||
int ret;
|
||||
ssize_t ret;
|
||||
char ch;
|
||||
|
||||
switch(op) {
|
||||
|
@ -270,6 +272,7 @@ static int open_sock(void)
|
|||
int ret, fd;
|
||||
struct sockaddr_un ssaddr;
|
||||
|
||||
check_unix_socket_filename(pipefn);
|
||||
fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
|
||||
if (fd < 0)
|
||||
|
@ -297,6 +300,9 @@ static int open_sock(void)
|
|||
if (ret < 0)
|
||||
fatal_with_errno(EXIT_FAILURE, "listen(%d, %d) failed", fd, US_LISTEN_BACKLOG);
|
||||
|
||||
/* don't leak socket to CMDSCRIPT */
|
||||
fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
@ -329,17 +335,40 @@ static void conn_del(conn_t *target)
|
|||
|
||||
static int send_to_one(conn_t *conn, const char *fmt, ...)
|
||||
{
|
||||
int ret;
|
||||
ssize_t ret;
|
||||
size_t buflen;
|
||||
va_list ap;
|
||||
char buf[US_SOCK_BUF_LEN];
|
||||
|
||||
va_start(ap, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(ap);
|
||||
|
||||
ret = write(conn->fd, buf, strlen(buf));
|
||||
buflen = strlen(buf);
|
||||
if (buflen >= SSIZE_MAX) {
|
||||
/* Can't compare buflen to ret */
|
||||
upsdebugx(2, "send_to_one(): buffered message too large");
|
||||
|
||||
if ((ret < 1) || (ret != (int) strlen(buf))) {
|
||||
close(conn->fd);
|
||||
conn_del(conn);
|
||||
|
||||
return 0; /* failed */
|
||||
}
|
||||
ret = write(conn->fd, buf, buflen);
|
||||
|
||||
if ((ret < 1) || (ret != (ssize_t) buflen)) {
|
||||
upsdebugx(2, "write to fd %d failed", conn->fd);
|
||||
|
||||
close(conn->fd);
|
||||
|
@ -370,6 +399,9 @@ static void conn_add(int sockfd)
|
|||
return;
|
||||
}
|
||||
|
||||
/* don't leak connection to CMDSCRIPT */
|
||||
fcntl(acc, F_SETFD, FD_CLOEXEC);
|
||||
|
||||
/* enable nonblocking I/O */
|
||||
|
||||
ret = fcntl(acc, F_GETFL, 0);
|
||||
|
@ -440,19 +472,20 @@ static int sock_arg(conn_t *conn)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void log_unknown(int numarg, char **arg)
|
||||
static void log_unknown(size_t numarg, char **arg)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
upslogx(LOG_INFO, "Unknown command on socket: ");
|
||||
|
||||
for (i = 0; i < numarg; i++)
|
||||
upslogx(LOG_INFO, "arg %d: %s", i, arg[i]);
|
||||
upslogx(LOG_INFO, "arg %zu: %s", i, arg[i]);
|
||||
}
|
||||
|
||||
static int sock_read(conn_t *conn)
|
||||
{
|
||||
int i, ret;
|
||||
int i;
|
||||
ssize_t ret;
|
||||
char ch;
|
||||
|
||||
for (i = 0; i < US_MAX_READ; i++) {
|
||||
|
@ -465,6 +498,12 @@ static int sock_read(conn_t *conn)
|
|||
if ((ret == -1) && (errno == EAGAIN))
|
||||
return 0;
|
||||
|
||||
/* O_NDELAY with zero bytes means nothing to read but
|
||||
* since read() follows a succesful select() with
|
||||
* ready file descriptor, ret shouldn't be 0. */
|
||||
if (ret == 0)
|
||||
continue;
|
||||
|
||||
/* some other problem */
|
||||
return -1; /* error */
|
||||
}
|
||||
|
@ -594,6 +633,8 @@ static int try_connect(void)
|
|||
int pipefd, ret;
|
||||
struct sockaddr_un saddr;
|
||||
|
||||
check_unix_socket_filename(pipefn);
|
||||
|
||||
memset(&saddr, '\0', sizeof(saddr));
|
||||
saddr.sun_family = AF_UNIX;
|
||||
snprintf(saddr.sun_path, sizeof(saddr.sun_path), "%s", pipefn);
|
||||
|
@ -659,28 +700,15 @@ static int check_parent(const char *cmd, const char *arg2)
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
static void read_timeout(int sig)
|
||||
{
|
||||
/* ignore this */
|
||||
return;
|
||||
}
|
||||
|
||||
static void setup_sigalrm(void)
|
||||
{
|
||||
struct sigaction sa;
|
||||
sigset_t nut_upssched_sigmask;
|
||||
|
||||
sigemptyset(&nut_upssched_sigmask);
|
||||
sa.sa_mask = nut_upssched_sigmask;
|
||||
sa.sa_flags = 0;
|
||||
sa.sa_handler = read_timeout;
|
||||
sigaction(SIGALRM, &sa, NULL);
|
||||
}
|
||||
|
||||
static void sendcmd(const char *cmd, const char *arg1, const char *arg2)
|
||||
{
|
||||
int i, pipefd, ret;
|
||||
char buf[SMALLBUF], enc[SMALLBUF];
|
||||
int i, pipefd;
|
||||
ssize_t ret;
|
||||
size_t enclen, buflen;
|
||||
char buf[SMALLBUF], enc[SMALLBUF + 8];
|
||||
int ret_s;
|
||||
struct timeval tv;
|
||||
fd_set fdread;
|
||||
|
||||
/* insanity */
|
||||
if (!arg1)
|
||||
|
@ -696,6 +724,14 @@ static void sendcmd(const char *cmd, const char *arg1, const char *arg2)
|
|||
|
||||
snprintf(enc, sizeof(enc), "%s\n", buf);
|
||||
|
||||
/* Sanity checks, for static analyzers to sleep well */
|
||||
enclen = strlen(enc);
|
||||
buflen = strlen(buf);
|
||||
if (enclen >= SSIZE_MAX || buflen >= SSIZE_MAX) {
|
||||
/* Can't compare enclen to ret below */
|
||||
fatalx(EXIT_FAILURE, "Unable to connect to daemon: buffered message too large");
|
||||
}
|
||||
|
||||
/* see if the parent needs to be started (and maybe start it) */
|
||||
|
||||
for (i = 0; i < MAX_TRIES; i++) {
|
||||
|
@ -703,7 +739,6 @@ static void sendcmd(const char *cmd, const char *arg1, const char *arg2)
|
|||
pipefd = check_parent(cmd, arg2);
|
||||
|
||||
if (pipefd == PARENT_STARTED) {
|
||||
|
||||
/* loop back and try to connect now */
|
||||
usleep(250000);
|
||||
continue;
|
||||
|
@ -715,23 +750,41 @@ static void sendcmd(const char *cmd, const char *arg1, const char *arg2)
|
|||
|
||||
/* we're connected now */
|
||||
|
||||
ret = write(pipefd, enc, strlen(enc));
|
||||
ret = write(pipefd, enc, enclen);
|
||||
|
||||
/* if we can't send the whole thing, loop back and try again */
|
||||
if ((ret < 1) || (ret != (int) strlen(enc))) {
|
||||
if ((ret < 1) || (ret != (ssize_t)enclen)) {
|
||||
upslogx(LOG_ERR, "write failed, trying again");
|
||||
close(pipefd);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* ugh - probably should use select here... */
|
||||
setup_sigalrm();
|
||||
/* select on child's pipe fd */
|
||||
do {
|
||||
/* set timeout every time before call select() */
|
||||
tv.tv_sec = 1;
|
||||
tv.tv_usec = 0;
|
||||
|
||||
alarm(2);
|
||||
FD_ZERO(&fdread);
|
||||
FD_SET(pipefd, &fdread);
|
||||
|
||||
ret_s = select(pipefd + 1, &fdread, NULL, NULL, &tv);
|
||||
switch(ret_s) {
|
||||
/* select error */
|
||||
case -1:
|
||||
upslogx(LOG_DEBUG, "parent select error: %s", strerror(errno));
|
||||
break;
|
||||
|
||||
/* nothing to read */
|
||||
case 0:
|
||||
break;
|
||||
|
||||
/* available data to read */
|
||||
default:
|
||||
ret = read(pipefd, buf, sizeof(buf));
|
||||
alarm(0);
|
||||
|
||||
signal(SIGALRM, SIG_IGN);
|
||||
break;
|
||||
}
|
||||
} while (ret_s <= 0);
|
||||
|
||||
close(pipefd);
|
||||
|
||||
|
@ -747,7 +800,7 @@ static void sendcmd(const char *cmd, const char *arg1, const char *arg2)
|
|||
upslogx(LOG_ERR, "read confirmation got [%s]", buf);
|
||||
|
||||
/* try again ... */
|
||||
}
|
||||
} /* loop until MAX_TRIES if no success above */
|
||||
|
||||
fatalx(EXIT_FAILURE, "Unable to connect to daemon and unable to start daemon");
|
||||
}
|
||||
|
@ -794,7 +847,7 @@ static void parse_at(const char *ntype, const char *un, const char *cmd,
|
|||
}
|
||||
|
||||
if (!strcmp(cmd, "EXECUTE")) {
|
||||
if (ca1 == '\0') {
|
||||
if (ca1[0] == '\0') {
|
||||
upslogx(LOG_ERR, "Empty EXECUTE command argument");
|
||||
return;
|
||||
}
|
||||
|
@ -809,7 +862,7 @@ static void parse_at(const char *ntype, const char *un, const char *cmd,
|
|||
upslogx(LOG_ERR, "Invalid command: %s", cmd);
|
||||
}
|
||||
|
||||
static int conf_arg(int numargs, char **arg)
|
||||
static int conf_arg(size_t numargs, char **arg)
|
||||
{
|
||||
if (numargs < 2)
|
||||
return 0;
|
||||
|
@ -900,9 +953,15 @@ static void checkconf(void)
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *prog = xbasename(argv[0]);
|
||||
const char *prog = NULL;
|
||||
/* More a use for argc to avoid warnings than a real need: */
|
||||
if (argc > 0) {
|
||||
xbasename(argv[0]);
|
||||
} else {
|
||||
xbasename("upssched");
|
||||
}
|
||||
|
||||
verbose = 1; /* TODO: remove when done testing */
|
||||
verbose = 1; /* TODO: remove when done testing, or add -D */
|
||||
|
||||
/* normally we don't have stderr, so get this going to syslog early */
|
||||
open_syslog(prog);
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
/* upssched.h - supporting structures */
|
||||
|
||||
#ifndef NUT_UPSSCHED_H_SEEN
|
||||
#define NUT_UPSSCHED_H_SEEN 1
|
||||
|
||||
#include <parseconf.h>
|
||||
|
||||
#define SERIALIZE_INIT 1
|
||||
|
@ -25,3 +28,4 @@ typedef struct conn_s {
|
|||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
#endif /* NUT_UPSSCHED_H_SEEN */
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "nut_stdint.h"
|
||||
#include "upsclient.h"
|
||||
#include "cgilib.h"
|
||||
#include "parseconf.h"
|
||||
|
@ -39,12 +40,12 @@ struct list_t {
|
|||
#define HARD_UPSVAR_LIMIT_NUM 64
|
||||
#define HARD_UPSVAR_LIMIT_LEN 256
|
||||
|
||||
char *monups, *username, *password, *function, *upscommand;
|
||||
static char *monups, *username, *password, *function, *upscommand;
|
||||
|
||||
/* set once the MAGIC_ENABLE_STRING is found in the upsset.conf */
|
||||
int magic_string_set = 0;
|
||||
static int magic_string_set = 0;
|
||||
|
||||
static int port;
|
||||
static uint16_t port;
|
||||
static char *upsname, *hostname;
|
||||
static UPSCONN_t ups;
|
||||
|
||||
|
@ -54,7 +55,7 @@ typedef struct {
|
|||
void *next;
|
||||
} uvtype_t;
|
||||
|
||||
uvtype_t *firstuv = NULL;
|
||||
static uvtype_t *firstuv = NULL;
|
||||
|
||||
void parsearg(char *var, char *value)
|
||||
{
|
||||
|
@ -163,7 +164,7 @@ static void do_hidden(const char *next)
|
|||
}
|
||||
|
||||
/* generate SELECT chooser from hosts.conf entries */
|
||||
static void upslist_arg(int numargs, char **arg)
|
||||
static void upslist_arg(size_t numargs, char **arg)
|
||||
{
|
||||
if (numargs < 3)
|
||||
return;
|
||||
|
@ -253,6 +254,10 @@ static void do_pickups(const char *currfunc)
|
|||
printf("</FORM>\n");
|
||||
}
|
||||
|
||||
static void error_page(const char *next, const char *title,
|
||||
const char *fmt, ...)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void error_page(const char *next, const char *title,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
|
@ -260,7 +265,19 @@ static void error_page(const char *next, const char *title,
|
|||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vsnprintf(msg, sizeof(msg), fmt, ap);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(ap);
|
||||
|
||||
do_header(title);
|
||||
|
@ -282,6 +299,9 @@ static void error_page(const char *next, const char *title,
|
|||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
static void loginscreen(void)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void loginscreen(void)
|
||||
{
|
||||
do_header("Login");
|
||||
|
@ -331,7 +351,7 @@ static void upsd_connect(void)
|
|||
static void print_cmd(const char *cmd)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
char **answer;
|
||||
const char *query[4];
|
||||
|
||||
|
@ -354,7 +374,7 @@ static void print_cmd(const char *cmd)
|
|||
static void showcmds(void)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[2];
|
||||
char **answer;
|
||||
struct list_t *lhead, *llast, *ltmp, *lnext;
|
||||
|
@ -391,7 +411,7 @@ static void showcmds(void)
|
|||
/* CMD upsname cmdname */
|
||||
if (numa < 3) {
|
||||
fprintf(stderr, "Error: insufficient data "
|
||||
"(got %d args, need at least 3)\n", numa);
|
||||
"(got %zu args, need at least 3)\n", numa);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -506,6 +526,9 @@ static void send_auth(const char *next)
|
|||
"Password set failed: %s", upscli_strerror(&ups));
|
||||
}
|
||||
|
||||
static void docmd(void)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void docmd(void)
|
||||
{
|
||||
char buf[SMALLBUF], *desc;
|
||||
|
@ -595,7 +618,7 @@ static void docmd(void)
|
|||
static const char *get_data(const char *type, const char *varname)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
char **answer;
|
||||
const char *query[4];
|
||||
|
||||
|
@ -633,7 +656,7 @@ static void do_string(const char *varname, int maxlen)
|
|||
static void do_enum(const char *varname)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
char **answer, *val;
|
||||
const char *query[4], *tmp;
|
||||
|
||||
|
@ -661,6 +684,7 @@ static void do_enum(const char *varname)
|
|||
printf("Unavailable\n");
|
||||
fprintf(stderr, "Error doing ENUM %s %s: %s\n",
|
||||
upsname, varname, upscli_strerror(&ups));
|
||||
free(val);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -674,7 +698,7 @@ static void do_enum(const char *varname)
|
|||
|
||||
if (numa < 4) {
|
||||
fprintf(stderr, "Error: insufficient data "
|
||||
"(got %d args, need at least 4)\n", numa);
|
||||
"(got %zu args, need at least 4)\n", numa);
|
||||
|
||||
free(val);
|
||||
return;
|
||||
|
@ -697,7 +721,7 @@ static void do_enum(const char *varname)
|
|||
static void do_type(const char *varname)
|
||||
{
|
||||
int ret;
|
||||
unsigned int i, numq, numa;
|
||||
size_t i, numq, numa;
|
||||
char **answer;
|
||||
const char *query[4];
|
||||
|
||||
|
@ -727,7 +751,9 @@ static void do_type(const char *varname)
|
|||
/* split out the :<len> data */
|
||||
ptr = strchr(answer[i], ':');
|
||||
*ptr++ = '\0';
|
||||
len = strtol(ptr, (char **) NULL, 10);
|
||||
long l = strtol(ptr, (char **) NULL, 10);
|
||||
assert(l <= 127); /* FIXME: Loophole about longer numbers? Why are we limited to char at all here? */
|
||||
len = (char)l;
|
||||
|
||||
do_string(varname, len);
|
||||
return;
|
||||
|
@ -741,10 +767,12 @@ static void do_type(const char *varname)
|
|||
}
|
||||
}
|
||||
|
||||
static void print_rw(const char *upsname, const char *varname)
|
||||
static void print_rw(const char *arg_upsname, const char *varname)
|
||||
{
|
||||
const char *tmp;
|
||||
|
||||
printf("<!-- <TR><TD>Device</TD><TD>%s</TD></TR> -->\n", arg_upsname);
|
||||
|
||||
printf("<TR BGCOLOR=\"#60B0B0\" ALIGN=\"CENTER\">\n");
|
||||
|
||||
printf("<TD>");
|
||||
|
@ -765,10 +793,13 @@ static void print_rw(const char *upsname, const char *varname)
|
|||
printf("</TR>\n");
|
||||
}
|
||||
|
||||
static void showsettings(void)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void showsettings(void)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[2];
|
||||
char **answer, *desc = NULL;
|
||||
struct list_t *lhead, *llast, *ltmp, *lnext;
|
||||
|
@ -907,6 +938,9 @@ static int setvar(const char *var, const char *val)
|
|||
}
|
||||
|
||||
/* turn a form submission of settings into SET commands for upsd */
|
||||
static void savesettings(void)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void savesettings(void)
|
||||
{
|
||||
int changed = 0;
|
||||
|
@ -953,6 +987,9 @@ static void savesettings(void)
|
|||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
static void initial_pickups(void)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void initial_pickups(void)
|
||||
{
|
||||
do_header("Select a UPS");
|
||||
|
@ -1031,6 +1068,8 @@ static void check_conf(void)
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(argc);
|
||||
NUT_UNUSED_VARIABLE(argv);
|
||||
username = password = function = monups = NULL;
|
||||
|
||||
printf("Content-type: text/html\n\n");
|
||||
|
@ -1047,6 +1086,7 @@ int main(int argc, char **argv)
|
|||
FD_SET(STDIN_FILENO, &fds);
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 250000; /* wait for up to 250ms for a POST response */
|
||||
|
||||
if ((select(STDIN_FILENO+1, &fds, 0, 0, &tv)) > 0)
|
||||
extractpostargs();
|
||||
}
|
||||
|
|
|
@ -19,11 +19,12 @@
|
|||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "nut_stdint.h"
|
||||
#include "timehead.h"
|
||||
#include "upsclient.h"
|
||||
#include "status.h"
|
||||
#include "cgilib.h"
|
||||
#include "parseconf.h"
|
||||
#include "timehead.h"
|
||||
#include "upsstats.h"
|
||||
#include "upsimagearg.h"
|
||||
|
||||
|
@ -36,7 +37,7 @@ static int use_celsius = 1, refreshdelay = -1, treemode = 0;
|
|||
/* from cgilib's checkhost() */
|
||||
static char *monhostdesc = NULL;
|
||||
|
||||
static int port;
|
||||
static uint16_t port;
|
||||
static char *upsname, *hostname;
|
||||
static char *upsimgpath="upsimage.cgi", *upsstatpath="upsstats.cgi";
|
||||
static UPSCONN_t ups;
|
||||
|
@ -103,7 +104,7 @@ static int check_ups_fd(int do_report)
|
|||
static int get_var(const char *var, char *buf, size_t buflen, int verbose)
|
||||
{
|
||||
int ret;
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -195,9 +196,10 @@ static int do_date(const char *buf)
|
|||
{
|
||||
char datebuf[SMALLBUF];
|
||||
time_t tod;
|
||||
struct tm tmbuf;
|
||||
|
||||
time(&tod);
|
||||
if (strftime(datebuf, sizeof(datebuf), buf, localtime(&tod))) {
|
||||
if (strftime(datebuf, sizeof(datebuf), buf, localtime_r(&tod, &tmbuf))) {
|
||||
printf("%s", datebuf);
|
||||
return 1;
|
||||
}
|
||||
|
@ -349,7 +351,7 @@ static void ups_connect(void)
|
|||
{
|
||||
static ulist_t *lastups = NULL;
|
||||
char *newups, *newhost;
|
||||
int newport;
|
||||
uint16_t newport;
|
||||
|
||||
/* try to minimize reconnects */
|
||||
if (lastups) {
|
||||
|
@ -564,7 +566,7 @@ static void do_upsimgpath(const char *s) {
|
|||
static void do_temp(const char *var)
|
||||
{
|
||||
char tempc[SMALLBUF];
|
||||
float tempf;
|
||||
double tempf;
|
||||
|
||||
if (!get_var(var, tempc, sizeof(tempc), 1))
|
||||
return;
|
||||
|
@ -807,7 +809,8 @@ static int do_command(char *cmd)
|
|||
static void parse_line(const char *buf)
|
||||
{
|
||||
char cmd[SMALLBUF];
|
||||
int i, len, do_cmd = 0;
|
||||
size_t i, len;
|
||||
char do_cmd = 0;
|
||||
|
||||
for (i = 0; buf[i]; i += len) {
|
||||
|
||||
|
@ -824,9 +827,10 @@ static void parse_line(const char *buf)
|
|||
i++; /* skip over the '@' character */
|
||||
continue;
|
||||
}
|
||||
assert (len < INT_MAX);
|
||||
|
||||
if (do_cmd) {
|
||||
snprintf(cmd, sizeof(cmd), "%.*s", len, &buf[i]);
|
||||
snprintf(cmd, sizeof(cmd), "%.*s", (int)len, &buf[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -836,7 +840,7 @@ static void parse_line(const char *buf)
|
|||
}
|
||||
|
||||
/* pass it trough */
|
||||
printf("%.*s", len, &buf[i]);
|
||||
printf("%.*s", (int)len, &buf[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -865,7 +869,7 @@ static void display_template(const char *tfn)
|
|||
|
||||
static void display_tree(int verbose)
|
||||
{
|
||||
unsigned int numq, numa;
|
||||
size_t numq, numa;
|
||||
const char *query[4];
|
||||
char **answer;
|
||||
|
||||
|
@ -1041,6 +1045,9 @@ static void display_single(void)
|
|||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
NUT_UNUSED_VARIABLE(argc);
|
||||
NUT_UNUSED_VARIABLE(argv);
|
||||
|
||||
extractcgiargs();
|
||||
|
||||
printf("Content-type: text/html\n");
|
||||
|
|
|
@ -17,6 +17,9 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef NUT_UPSSTATS_H_SEEN
|
||||
#define NUT_UPSSTATS_H_SEEN 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* *INDENT-OFF* */
|
||||
extern "C" {
|
||||
|
@ -35,3 +38,4 @@ typedef struct {
|
|||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
#endif /* NUT_UPSSTATS_H_SEEN */
|
||||
|
|
|
@ -8,10 +8,42 @@ libparseconf_la_SOURCES = parseconf.c
|
|||
# do not hard depend on '../include/nut_version.h', since it blocks
|
||||
# 'dist', and is only required for actual build, in which case
|
||||
# BUILT_SOURCES (in ../include) will ensure nut_version.h will
|
||||
# be built before anything else
|
||||
libcommon_la_SOURCES = common.c state.c upsconf.c
|
||||
libcommonclient_la_SOURCES = common.c state.c
|
||||
# be built before anything else... but do depend on its build area:
|
||||
if BUILDING_IN_TREE
|
||||
# No need for symlink hack
|
||||
common.c: $(top_builddir)/include/nut_version.h
|
||||
else
|
||||
# Surprisingly, for some "make" implementations this dependency means
|
||||
# that the "common.c" required for builds below will be seeked in the
|
||||
# current directory. So for out-of-tree builds like distcheck, we have
|
||||
# to symlink the "real" source to build area:
|
||||
common.c: $(top_builddir)/include/nut_version.h $(srcdir)/common.c
|
||||
test -s "$@" || ln -s -f "$(top_srcdir)/common/common.c" "$@"
|
||||
endif
|
||||
|
||||
$(top_builddir)/include/nut_version.h:
|
||||
@cd $(@D) && $(MAKE) $(AM_MAKEFLAGS) $(@F)
|
||||
|
||||
libcommon_la_SOURCES = state.c str.c upsconf.c
|
||||
libcommonclient_la_SOURCES = state.c str.c
|
||||
if BUILDING_IN_TREE
|
||||
libcommon_la_SOURCES += common.c
|
||||
libcommonclient_la_SOURCES += common.c
|
||||
else
|
||||
nodist_libcommon_la_SOURCES = common.c
|
||||
nodist_libcommonclient_la_SOURCES = common.c
|
||||
CLEANFILES = $(top_builddir)/common/common.c
|
||||
BUILT_SOURCES = common.c
|
||||
endif
|
||||
|
||||
# ensure inclusion of local implementation of missing systems functions
|
||||
# using LTLIBOBJS. Refer to configure.in -> AC_REPLACE_FUNCS
|
||||
# using LTLIBOBJS. Refer to configure.in/.ac -> AC_REPLACE_FUNCS
|
||||
libcommon_la_LIBADD = libparseconf.la @LTLIBOBJS@
|
||||
libcommonclient_la_LIBADD = libparseconf.la @LTLIBOBJS@
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||
|
||||
# NOTE: Do not clean ".deps" in SUBDIRS of the main project,
|
||||
# the root Makefile.am takes care of that!
|
||||
#clean-local:
|
||||
# rm -rf $(builddir)/.deps
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
# Makefile.in generated by automake 1.11.6 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
|
||||
# Foundation, Inc.
|
||||
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
@ -18,23 +17,61 @@
|
|||
# Network UPS Tools: common
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__make_dryrun = \
|
||||
{ \
|
||||
am__dry=no; \
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||
*) \
|
||||
for am__flg in $$MAKEFLAGS; do \
|
||||
case $$am__flg in \
|
||||
*=*|--*) ;; \
|
||||
*n*) am__dry=yes; break;; \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
done;; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
test $$am__dry = yes; \
|
||||
}
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
|
@ -54,20 +91,27 @@ POST_UNINSTALL = :
|
|||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
@BUILDING_IN_TREE_TRUE@am__append_1 = common.c
|
||||
@BUILDING_IN_TREE_TRUE@am__append_2 = common.c
|
||||
subdir = common
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in atexit.c \
|
||||
setenv.c snprintf.c strerror.c
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \
|
||||
$(top_srcdir)/m4/ax_c_pragmas.m4 \
|
||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
||||
$(top_srcdir)/m4/ax_compare_version.m4 \
|
||||
$(top_srcdir)/m4/ax_run_or_link_ifelse.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||
$(top_srcdir)/m4/nut_check_asciidoc.m4 \
|
||||
$(top_srcdir)/m4/nut_check_cppcheck.m4 \
|
||||
$(top_srcdir)/m4/nut_check_headers_windows.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libavahi.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libltdl.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libmodbus.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libneon.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||
|
@ -76,56 +120,123 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
|||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||
$(top_srcdir)/m4/nut_check_os.m4 \
|
||||
$(top_srcdir)/m4/nut_check_pkgconfig.m4 \
|
||||
$(top_srcdir)/m4/nut_check_python.m4 \
|
||||
$(top_srcdir)/m4/nut_compiler_family.m4 \
|
||||
$(top_srcdir)/m4/nut_func_getnameinfo_argtypes.m4 \
|
||||
$(top_srcdir)/m4/nut_report_feature.m4 \
|
||||
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
||||
libcommon_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@
|
||||
am_libcommon_la_OBJECTS = common.lo state.lo upsconf.lo
|
||||
libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS)
|
||||
am__libcommon_la_SOURCES_DIST = state.c str.c upsconf.c common.c
|
||||
@BUILDING_IN_TREE_TRUE@am__objects_1 = common.lo
|
||||
am_libcommon_la_OBJECTS = state.lo str.lo upsconf.lo $(am__objects_1)
|
||||
@BUILDING_IN_TREE_FALSE@nodist_libcommon_la_OBJECTS = common.lo
|
||||
libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS) \
|
||||
$(nodist_libcommon_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
am__v_lt_1 =
|
||||
libcommonclient_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@
|
||||
am_libcommonclient_la_OBJECTS = common.lo state.lo
|
||||
libcommonclient_la_OBJECTS = $(am_libcommonclient_la_OBJECTS)
|
||||
am__libcommonclient_la_SOURCES_DIST = state.c str.c common.c
|
||||
am_libcommonclient_la_OBJECTS = state.lo str.lo $(am__objects_1)
|
||||
@BUILDING_IN_TREE_FALSE@nodist_libcommonclient_la_OBJECTS = common.lo
|
||||
libcommonclient_la_OBJECTS = $(am_libcommonclient_la_OBJECTS) \
|
||||
$(nodist_libcommonclient_la_OBJECTS)
|
||||
libparseconf_la_LIBADD =
|
||||
am_libparseconf_la_OBJECTS = parseconf.lo
|
||||
libparseconf_la_OBJECTS = $(am_libparseconf_la_OBJECTS)
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include
|
||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__maybe_remake_depfiles = depfiles
|
||||
am__depfiles_remade = $(DEPDIR)/atexit.Plo $(DEPDIR)/setenv.Plo \
|
||||
$(DEPDIR)/snprintf.Plo $(DEPDIR)/strerror.Plo \
|
||||
./$(DEPDIR)/common.Plo ./$(DEPDIR)/parseconf.Plo \
|
||||
./$(DEPDIR)/state.Plo ./$(DEPDIR)/str.Plo \
|
||||
./$(DEPDIR)/upsconf.Plo
|
||||
am__mv = mv -f
|
||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
|
||||
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||
$(AM_CFLAGS) $(CFLAGS)
|
||||
AM_V_CC = $(am__v_CC_@AM_V@)
|
||||
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
|
||||
am__v_CC_0 = @echo " CC " $@;
|
||||
am__v_CC_1 =
|
||||
CCLD = $(CC)
|
||||
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
||||
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
||||
$(LDFLAGS) -o $@
|
||||
SOURCES = $(libcommon_la_SOURCES) $(libcommonclient_la_SOURCES) \
|
||||
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
||||
$(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
am__v_CCLD_1 =
|
||||
SOURCES = $(libcommon_la_SOURCES) $(nodist_libcommon_la_SOURCES) \
|
||||
$(libcommonclient_la_SOURCES) \
|
||||
$(nodist_libcommonclient_la_SOURCES) \
|
||||
$(libparseconf_la_SOURCES)
|
||||
DIST_SOURCES = $(libcommon_la_SOURCES) $(libcommonclient_la_SOURCES) \
|
||||
DIST_SOURCES = $(am__libcommon_la_SOURCES_DIST) \
|
||||
$(am__libcommonclient_la_SOURCES_DIST) \
|
||||
$(libparseconf_la_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp atexit.c \
|
||||
setenv.c snprintf.c strerror.c
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
A2X = @A2X@
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
ASCIIDOC = @ASCIIDOC@
|
||||
ASPELL = @ASPELL@
|
||||
AUGPARSE = @AUGPARSE@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
|
@ -136,6 +247,7 @@ CCDEPMODE = @CCDEPMODE@
|
|||
CFLAGS = @CFLAGS@
|
||||
CONFPATH = @CONFPATH@
|
||||
CPP = @CPP@
|
||||
CPPCHECK = @CPPCHECK@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||
|
@ -149,6 +261,7 @@ DEFS = @DEFS@
|
|||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||
|
@ -161,6 +274,7 @@ ECHO_T = @ECHO_T@
|
|||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
FGREP = @FGREP@
|
||||
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
@ -171,12 +285,15 @@ LD = @LD@
|
|||
LDFLAGS = @LDFLAGS@
|
||||
LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@
|
||||
LIBAVAHI_LIBS = @LIBAVAHI_LIBS@
|
||||
LIBDIR = @LIBDIR@
|
||||
LIBGD_CFLAGS = @LIBGD_CFLAGS@
|
||||
LIBGD_LDFLAGS = @LIBGD_LDFLAGS@
|
||||
LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||
|
@ -187,21 +304,29 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
|||
LIBS = @LIBS@
|
||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LN_S_R = @LN_S_R@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NETLIBS = @NETLIBS@
|
||||
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
NUT_DATADIR = @NUT_DATADIR@
|
||||
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||
NUT_NETVERSION = @NUT_NETVERSION@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
|
@ -221,6 +346,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
|||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
PORT = @PORT@
|
||||
PYTHON = @PYTHON@
|
||||
PYTHON2 = @PYTHON2@
|
||||
PYTHON3 = @PYTHON3@
|
||||
RANLIB = @RANLIB@
|
||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||
RUN_AS_USER = @RUN_AS_USER@
|
||||
|
@ -229,12 +357,16 @@ SED = @SED@
|
|||
SERLIBS = @SERLIBS@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@
|
||||
STATEPATH = @STATEPATH@
|
||||
STRIP = @STRIP@
|
||||
SUN_LIBUSB = @SUN_LIBUSB@
|
||||
TREE_VERSION = @TREE_VERSION@
|
||||
VALGRIND = @VALGRIND@
|
||||
VERSION = @VERSION@
|
||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||
XMLLINT = @XMLLINT@
|
||||
XSLTPROC = @XSLTPROC@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
|
@ -248,6 +380,7 @@ am__leading_dot = @am__leading_dot@
|
|||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
auglensdir = @auglensdir@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
|
@ -261,6 +394,9 @@ datarootdir = @datarootdir@
|
|||
devddir = @devddir@
|
||||
docdir = @docdir@
|
||||
driverexecdir = @driverexecdir@
|
||||
dummy_PKG_CONFIG = @dummy_PKG_CONFIG@
|
||||
dummy_PKG_CONFIG_CFLAGS = @dummy_PKG_CONFIG_CFLAGS@
|
||||
dummy_PKG_CONFIG_LIBS = @dummy_PKG_CONFIG_LIBS@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
|
@ -279,18 +415,21 @@ localedir = @localedir@
|
|||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
now = @now@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
pkgconfigdir = @pkgconfigdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
||||
systemdshutdowndir = @systemdshutdowndir@
|
||||
systemdsystemunitdir = @systemdsystemunitdir@
|
||||
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
|
@ -303,18 +442,20 @@ udevdir = @udevdir@
|
|||
AM_CFLAGS = -I$(top_srcdir)/include
|
||||
noinst_LTLIBRARIES = libparseconf.la libcommon.la libcommonclient.la
|
||||
libparseconf_la_SOURCES = parseconf.c
|
||||
libcommon_la_SOURCES = state.c str.c upsconf.c $(am__append_1)
|
||||
libcommonclient_la_SOURCES = state.c str.c $(am__append_2)
|
||||
@BUILDING_IN_TREE_FALSE@nodist_libcommon_la_SOURCES = common.c
|
||||
@BUILDING_IN_TREE_FALSE@nodist_libcommonclient_la_SOURCES = common.c
|
||||
@BUILDING_IN_TREE_FALSE@CLEANFILES = $(top_builddir)/common/common.c
|
||||
@BUILDING_IN_TREE_FALSE@BUILT_SOURCES = common.c
|
||||
|
||||
# do not hard depend on '../include/nut_version.h', since it blocks
|
||||
# 'dist', and is only required for actual build, in which case
|
||||
# BUILT_SOURCES (in ../include) will ensure nut_version.h will
|
||||
# be built before anything else
|
||||
libcommon_la_SOURCES = common.c state.c upsconf.c
|
||||
libcommonclient_la_SOURCES = common.c state.c
|
||||
# ensure inclusion of local implementation of missing systems functions
|
||||
# using LTLIBOBJS. Refer to configure.in -> AC_REPLACE_FUNCS
|
||||
# using LTLIBOBJS. Refer to configure.in/.ac -> AC_REPLACE_FUNCS
|
||||
libcommon_la_LIBADD = libparseconf.la @LTLIBOBJS@
|
||||
libcommonclient_la_LIBADD = libparseconf.la @LTLIBOBJS@
|
||||
all: all-am
|
||||
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||
all: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .lo .o .obj
|
||||
|
@ -330,14 +471,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
|||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu common/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu common/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
|
@ -351,18 +491,23 @@ $(am__aclocal_m4_deps):
|
|||
|
||||
clean-noinstLTLIBRARIES:
|
||||
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
||||
@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
|
||||
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
|
||||
test "$$dir" != "$$p" || dir=.; \
|
||||
echo "rm -f \"$${dir}/so_locations\""; \
|
||||
rm -f "$${dir}/so_locations"; \
|
||||
done
|
||||
@list='$(noinst_LTLIBRARIES)'; \
|
||||
locs=`for p in $$list; do echo $$p; done | \
|
||||
sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||
sort -u`; \
|
||||
test -z "$$locs" || { \
|
||||
echo rm -f $${locs}; \
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
libcommon.la: $(libcommon_la_OBJECTS) $(libcommon_la_DEPENDENCIES) $(EXTRA_libcommon_la_DEPENDENCIES)
|
||||
$(LINK) $(libcommon_la_OBJECTS) $(libcommon_la_LIBADD) $(LIBS)
|
||||
$(AM_V_CCLD)$(LINK) $(libcommon_la_OBJECTS) $(libcommon_la_LIBADD) $(LIBS)
|
||||
|
||||
libcommonclient.la: $(libcommonclient_la_OBJECTS) $(libcommonclient_la_DEPENDENCIES) $(EXTRA_libcommonclient_la_DEPENDENCIES)
|
||||
$(LINK) $(libcommonclient_la_OBJECTS) $(libcommonclient_la_LIBADD) $(LIBS)
|
||||
$(AM_V_CCLD)$(LINK) $(libcommonclient_la_OBJECTS) $(libcommonclient_la_LIBADD) $(LIBS)
|
||||
|
||||
libparseconf.la: $(libparseconf_la_OBJECTS) $(libparseconf_la_DEPENDENCIES) $(EXTRA_libparseconf_la_DEPENDENCIES)
|
||||
$(LINK) $(libparseconf_la_OBJECTS) $(libparseconf_la_LIBADD) $(LIBS)
|
||||
$(AM_V_CCLD)$(LINK) $(libparseconf_la_OBJECTS) $(libparseconf_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
@ -370,35 +515,45 @@ mostlyclean-compile:
|
|||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/atexit.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/setenv.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/snprintf.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strerror.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseconf.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsconf.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/atexit.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/setenv.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/snprintf.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strerror.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseconf.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str.Plo@am__quote@ # am--include-marker
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsconf.Plo@am__quote@ # am--include-marker
|
||||
|
||||
$(am__depfiles_remade):
|
||||
@$(MKDIR_P) $(@D)
|
||||
@echo '# dummy' >$@-t && $(am__mv) $@-t $@
|
||||
|
||||
am--depfiles: $(am__depfiles_remade)
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
|
||||
|
||||
.c.obj:
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
|
||||
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
|
||||
@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
@ -406,26 +561,15 @@ mostlyclean-libtool:
|
|||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
mkid -fID $$unique
|
||||
tags: TAGS
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-am
|
||||
TAGS: tags
|
||||
|
||||
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
|
@ -437,15 +581,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: CTAGS
|
||||
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
ctags: ctags-am
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
@ -454,11 +594,29 @@ GTAGS:
|
|||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscopelist: cscopelist-am
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
distdir-am: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
|
@ -489,11 +647,14 @@ distdir: $(DISTFILES)
|
|||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
check: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) check-am
|
||||
all-am: Makefile $(LTLIBRARIES)
|
||||
installdirs:
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) install-am
|
||||
install-exec: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
|
@ -514,6 +675,7 @@ install-strip:
|
|||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
@ -522,13 +684,23 @@ distclean-generic:
|
|||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -rf $(DEPDIR) ./$(DEPDIR)
|
||||
-rm -f $(DEPDIR)/atexit.Plo
|
||||
-rm -f $(DEPDIR)/setenv.Plo
|
||||
-rm -f $(DEPDIR)/snprintf.Plo
|
||||
-rm -f $(DEPDIR)/strerror.Plo
|
||||
-rm -f ./$(DEPDIR)/common.Plo
|
||||
-rm -f ./$(DEPDIR)/parseconf.Plo
|
||||
-rm -f ./$(DEPDIR)/state.Plo
|
||||
-rm -f ./$(DEPDIR)/str.Plo
|
||||
-rm -f ./$(DEPDIR)/upsconf.Plo
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-tags
|
||||
|
@ -574,7 +746,15 @@ install-ps-am:
|
|||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -rf $(DEPDIR) ./$(DEPDIR)
|
||||
-rm -f $(DEPDIR)/atexit.Plo
|
||||
-rm -f $(DEPDIR)/setenv.Plo
|
||||
-rm -f $(DEPDIR)/snprintf.Plo
|
||||
-rm -f $(DEPDIR)/strerror.Plo
|
||||
-rm -f ./$(DEPDIR)/common.Plo
|
||||
-rm -f ./$(DEPDIR)/parseconf.Plo
|
||||
-rm -f ./$(DEPDIR)/state.Plo
|
||||
-rm -f ./$(DEPDIR)/str.Plo
|
||||
-rm -f ./$(DEPDIR)/upsconf.Plo
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
|
@ -593,21 +773,45 @@ ps-am:
|
|||
|
||||
uninstall-am:
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
.MAKE: all check install install-am install-exec install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
|
||||
clean-libtool clean-noinstLTLIBRARIES ctags distclean \
|
||||
distclean-compile distclean-generic distclean-libtool \
|
||||
distclean-tags distdir dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am install-dvi \
|
||||
install-dvi-am install-exec install-exec-am install-html \
|
||||
install-html-am install-info install-info-am install-man \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||
mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
|
||||
pdf pdf-am ps ps-am tags uninstall uninstall-am
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
|
||||
clean-generic clean-libtool clean-noinstLTLIBRARIES \
|
||||
cscopelist-am ctags ctags-am distclean distclean-compile \
|
||||
distclean-generic distclean-libtool distclean-tags distdir dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-info install-info-am install-man install-pdf \
|
||||
install-pdf-am install-ps install-ps-am install-strip \
|
||||
installcheck installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||
tags tags-am uninstall uninstall-am
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
# do not hard depend on '../include/nut_version.h', since it blocks
|
||||
# 'dist', and is only required for actual build, in which case
|
||||
# BUILT_SOURCES (in ../include) will ensure nut_version.h will
|
||||
# be built before anything else... but do depend on its build area:
|
||||
# No need for symlink hack
|
||||
@BUILDING_IN_TREE_TRUE@common.c: $(top_builddir)/include/nut_version.h
|
||||
# Surprisingly, for some "make" implementations this dependency means
|
||||
# that the "common.c" required for builds below will be seeked in the
|
||||
# current directory. So for out-of-tree builds like distcheck, we have
|
||||
# to symlink the "real" source to build area:
|
||||
@BUILDING_IN_TREE_FALSE@common.c: $(top_builddir)/include/nut_version.h $(srcdir)/common.c
|
||||
@BUILDING_IN_TREE_FALSE@ test -s "$@" || ln -s -f "$(top_srcdir)/common/common.c" "$@"
|
||||
|
||||
$(top_builddir)/include/nut_version.h:
|
||||
@cd $(@D) && $(MAKE) $(AM_MAKEFLAGS) $(@F)
|
||||
|
||||
# NOTE: Do not clean ".deps" in SUBDIRS of the main project,
|
||||
# the root Makefile.am takes care of that!
|
||||
#clean-local:
|
||||
# rm -rf $(builddir)/.deps
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
|
|
578
common/common.c
578
common/common.c
|
@ -1,6 +1,7 @@
|
|||
/* common.c - common useful functions
|
||||
|
||||
Copyright (C) 2000 Russell Kroll <rkroll@exploits.org>
|
||||
Copyright (C) 2021-2022 Jim Klimov <jimklimov+nut@gmail.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -21,8 +22,11 @@
|
|||
|
||||
#include <ctype.h>
|
||||
#include <syslog.h>
|
||||
#include <errno.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
/* the reason we define UPS_VERSION as a static string, rather than a
|
||||
macro, is to make dependency tracking easier (only common.o depends
|
||||
|
@ -32,6 +36,52 @@
|
|||
#include "nut_version.h"
|
||||
const char *UPS_VERSION = NUT_VERSION_MACRO;
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Know which bitness we were built for,
|
||||
* to adjust the search paths for get_libname() */
|
||||
#include "nut_stdint.h"
|
||||
#if UINTPTR_MAX == 0xffffffffffffffffULL
|
||||
# define BUILD_64 1
|
||||
#else
|
||||
# ifdef BUILD_64
|
||||
# undef BUILD_64
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* https://stackoverflow.com/a/12844426/4715872 */
|
||||
#include <sys/types.h>
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
pid_t get_max_pid_t()
|
||||
{
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE
|
||||
#pragma GCC diagnostic ignored "-Wunreachable-code"
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wunreachable-code"
|
||||
#endif
|
||||
if (sizeof(pid_t) == sizeof(short)) return (pid_t)SHRT_MAX;
|
||||
if (sizeof(pid_t) == sizeof(int)) return (pid_t)INT_MAX;
|
||||
if (sizeof(pid_t) == sizeof(long)) return (pid_t)LONG_MAX;
|
||||
#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || (defined _STDC_C99) || (defined __C99FEATURES__) /* C99+ build mode */
|
||||
# if defined(LLONG_MAX) /* since C99 */
|
||||
if (sizeof(pid_t) == sizeof(long long)) return (pid_t)LLONG_MAX;
|
||||
# endif
|
||||
#endif
|
||||
abort();
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
}
|
||||
|
||||
int nut_debug_level = 0;
|
||||
int nut_log_level = 0;
|
||||
static int upslog_flags = UPSLOG_STDERR;
|
||||
|
@ -164,7 +214,31 @@ struct passwd *get_user_pwent(const char *name)
|
|||
else
|
||||
fatal_with_errno(EXIT_FAILURE, "getpwnam(%s)", name);
|
||||
|
||||
return NULL; /* to make the compiler happy */
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && ( (defined HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE) || (defined HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE_RETURN) )
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE
|
||||
#pragma GCC diagnostic ignored "-Wunreachable-code"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE_RETURN
|
||||
#pragma GCC diagnostic ignored "-Wunreachable-code-return"
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wunreachable-code"
|
||||
# ifdef HAVE_PRAGMA_CLANG_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE_RETURN
|
||||
# pragma clang diagnostic ignored "-Wunreachable-code-return"
|
||||
# endif
|
||||
#endif
|
||||
/* Oh joy, adding unreachable "return" to make one compiler happy,
|
||||
* and pragmas around to make other compilers happy, all at once! */
|
||||
return NULL;
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
#if (defined HAVE_PRAGMA_GCC_DIAGNOSTIC_PUSH_POP) && ( (defined HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE) || (defined HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE_RETURN) )
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
}
|
||||
|
||||
/* change to the user defined in the struct */
|
||||
|
@ -208,7 +282,7 @@ void writepid(const char *name)
|
|||
{
|
||||
char fn[SMALLBUF];
|
||||
FILE *pidf;
|
||||
int mask;
|
||||
mode_t mask;
|
||||
|
||||
/* use full path if present, else build filename in PIDPATH */
|
||||
if (*name == '/')
|
||||
|
@ -220,7 +294,9 @@ void writepid(const char *name)
|
|||
pidf = fopen(fn, "w");
|
||||
|
||||
if (pidf) {
|
||||
fprintf(pidf, "%d\n", (int) getpid());
|
||||
intmax_t pid = (intmax_t)getpid();
|
||||
upsdebugx(1, "Saving PID %jd into %s", pid, fn);
|
||||
fprintf(pidf, "%jd\n", pid);
|
||||
fclose(pidf);
|
||||
} else {
|
||||
upslog_with_errno(LOG_NOTICE, "writepid: fopen %s", fn);
|
||||
|
@ -229,30 +305,17 @@ void writepid(const char *name)
|
|||
umask(mask);
|
||||
}
|
||||
|
||||
/* open pidfn, get the pid, then send it sig */
|
||||
int sendsignalfn(const char *pidfn, int sig)
|
||||
/* send sig to pid, returns -1 for error, or
|
||||
* zero for a successfully sent signal
|
||||
*/
|
||||
int sendsignalpid(pid_t pid, int sig)
|
||||
{
|
||||
char buf[SMALLBUF];
|
||||
FILE *pidf;
|
||||
int pid, ret;
|
||||
int ret;
|
||||
|
||||
pidf = fopen(pidfn, "r");
|
||||
if (!pidf) {
|
||||
upslog_with_errno(LOG_NOTICE, "fopen %s", pidfn);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fgets(buf, sizeof(buf), pidf) == NULL) {
|
||||
upslogx(LOG_NOTICE, "Failed to read pid from %s", pidfn);
|
||||
fclose(pidf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pid = strtol(buf, (char **)NULL, 10);
|
||||
|
||||
if (pid < 2) {
|
||||
upslogx(LOG_NOTICE, "Ignoring invalid pid number %d", pid);
|
||||
fclose(pidf);
|
||||
if (pid < 2 || pid > get_max_pid_t()) {
|
||||
upslogx(LOG_NOTICE,
|
||||
"Ignoring invalid pid number %" PRIdMAX,
|
||||
(intmax_t) pid);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -261,21 +324,78 @@ int sendsignalfn(const char *pidfn, int sig)
|
|||
|
||||
if (ret < 0) {
|
||||
perror("kill");
|
||||
fclose(pidf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sig != 0) {
|
||||
/* now actually send it */
|
||||
ret = kill(pid, sig);
|
||||
|
||||
if (ret < 0) {
|
||||
perror("kill");
|
||||
fclose(pidf);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* parses string buffer into a pid_t if it passes
|
||||
* a few sanity checks; returns -1 on error
|
||||
*/
|
||||
pid_t parsepid(const char *buf)
|
||||
{
|
||||
pid_t pid = -1;
|
||||
|
||||
/* assuming 10 digits for a long */
|
||||
intmax_t _pid = strtol(buf, (char **)NULL, 10);
|
||||
if (_pid <= get_max_pid_t()) {
|
||||
pid = (pid_t)_pid;
|
||||
} else {
|
||||
upslogx(LOG_NOTICE, "Received a pid number too big for a pid_t: %" PRIdMAX, _pid);
|
||||
}
|
||||
|
||||
return pid;
|
||||
}
|
||||
|
||||
/* open pidfn, get the pid, then send it sig
|
||||
* returns negative codes for errors, or
|
||||
* zero for a successfully sent signal
|
||||
*/
|
||||
int sendsignalfn(const char *pidfn, int sig)
|
||||
{
|
||||
char buf[SMALLBUF];
|
||||
FILE *pidf;
|
||||
pid_t pid = -1;
|
||||
int ret = -1;
|
||||
|
||||
pidf = fopen(pidfn, "r");
|
||||
if (!pidf) {
|
||||
upslog_with_errno(LOG_NOTICE, "fopen %s", pidfn);
|
||||
return -3;
|
||||
}
|
||||
|
||||
if (fgets(buf, sizeof(buf), pidf) == NULL) {
|
||||
upslogx(LOG_NOTICE, "Failed to read pid from %s", pidfn);
|
||||
fclose(pidf);
|
||||
return -2;
|
||||
}
|
||||
/* TOTHINK: Original code only closed pidf before
|
||||
* exiting the method, on error or "normally".
|
||||
* Why not here? Do we want an (exclusive?) hold
|
||||
* on it while being active in the method?
|
||||
*/
|
||||
|
||||
/* this method actively reports errors, if any */
|
||||
pid = parsepid(buf);
|
||||
|
||||
if (pid >= 0) {
|
||||
/* this method actively reports errors, if any */
|
||||
ret = sendsignalpid(pid, sig);
|
||||
}
|
||||
|
||||
fclose(pidf);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int snprintfcat(char *dst, size_t size, const char *fmt, ...)
|
||||
|
@ -285,14 +405,46 @@ int snprintfcat(char *dst, size_t size, const char *fmt, ...)
|
|||
int ret;
|
||||
|
||||
size--;
|
||||
assert(len <= size);
|
||||
if (len > size) {
|
||||
/* Do not truncate existing string */
|
||||
errno = ERANGE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
va_start(ap, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
/* Note: this code intentionally uses a caller-provided format string */
|
||||
ret = vsnprintf(dst + len, size - len, fmt, ap);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(ap);
|
||||
|
||||
dst[size] = '\0';
|
||||
return len + ret;
|
||||
|
||||
/* Note: there is a standards loophole here: strlen() must return size_t
|
||||
* and printf() family returns a signed int with negatives for errors.
|
||||
* In theory it can overflow a 64-vs-32 bit range, or signed-vs-unsigned.
|
||||
* In practice we hope to not have gigabytes-long config strings.
|
||||
*/
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
#ifdef INT_MAX
|
||||
if ( ( (unsigned long long)len + (unsigned long long)ret ) >= (unsigned long long)INT_MAX ) {
|
||||
errno = ERANGE;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
return (int)len + ret;
|
||||
}
|
||||
|
||||
/* lazy way to send a signal if the program uses the PIDPATH */
|
||||
|
@ -319,7 +471,27 @@ static void vupslog(int priority, const char *fmt, va_list va, int use_strerror)
|
|||
int ret;
|
||||
char buf[LARGEBUF];
|
||||
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wformat-nonliteral"
|
||||
#pragma clang diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
ret = vsnprintf(buf, sizeof(buf), fmt, va);
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
if ((ret < 0) || (ret >= (int) sizeof(buf)))
|
||||
syslog(LOG_WARNING, "vupslog: vsnprintf needed more than %d bytes",
|
||||
|
@ -329,7 +501,7 @@ static void vupslog(int priority, const char *fmt, va_list va, int use_strerror)
|
|||
snprintfcat(buf, sizeof(buf), ": %s", strerror(errno));
|
||||
|
||||
if (nut_debug_level > 0) {
|
||||
static struct timeval start = { 0 };
|
||||
static struct timeval start = { 0, 0 };
|
||||
struct timeval now;
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
|
@ -368,29 +540,78 @@ const char * dflt_statepath(void)
|
|||
{
|
||||
const char * path;
|
||||
|
||||
if ((path = getenv("NUT_STATEPATH")) == NULL)
|
||||
path = getenv("NUT_STATEPATH");
|
||||
if ( (path == NULL) || (*path == '\0') )
|
||||
path = STATEPATH;
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
/* Return the alternate path for pid files */
|
||||
/* Return the alternate path for pid files, for processes running as non-root
|
||||
* Per documentation and configure script, the fallback value is the
|
||||
* state-file path as the daemon and drivers can write there too.
|
||||
* Note that this differs from PIDPATH that higher-privileged daemons, such
|
||||
* as upsmon, tend to use.
|
||||
*/
|
||||
const char * altpidpath(void)
|
||||
{
|
||||
const char * path;
|
||||
|
||||
path = getenv("NUT_ALTPIDPATH");
|
||||
if ( (path == NULL) || (*path == '\0') )
|
||||
path = getenv("NUT_STATEPATH");
|
||||
|
||||
if ( (path != NULL) && (*path != '\0') )
|
||||
return path;
|
||||
|
||||
#ifdef ALTPIDPATH
|
||||
return ALTPIDPATH;
|
||||
#else
|
||||
return dflt_statepath();
|
||||
/* We assume, here and elsewhere, that at least STATEPATH is always defined */
|
||||
return STATEPATH;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Die with a standard message if socket filename is too long */
|
||||
void check_unix_socket_filename(const char *fn) {
|
||||
struct sockaddr_un ssaddr;
|
||||
if (strlen(fn) < sizeof(ssaddr.sun_path))
|
||||
return;
|
||||
|
||||
/* Avoid useless truncated pathnames that
|
||||
* other driver instances would conflict
|
||||
* with, and upsd can not discover.
|
||||
* Note this is quite short on many OSes
|
||||
* varying 104-108 bytes (UNIX_PATH_MAX)
|
||||
* as opposed to PATH_MAX or MAXPATHLEN
|
||||
* typically of a kilobyte range.
|
||||
*/
|
||||
fatalx(EXIT_FAILURE,
|
||||
"Can't create a unix domain socket: pathname '%s' "
|
||||
"is too long (%zu) for 'struct sockaddr_un->sun_path' "
|
||||
"on this system (%zu)",
|
||||
fn, strlen(fn), sizeof(ssaddr.sun_path));
|
||||
}
|
||||
|
||||
/* logs the formatted string to any configured logging devices + the output of strerror(errno) */
|
||||
void upslog_with_errno(int priority, const char *fmt, ...)
|
||||
{
|
||||
va_list va;
|
||||
|
||||
va_start(va, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vupslog(priority, fmt, va, 1);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
|
@ -400,44 +621,115 @@ void upslogx(int priority, const char *fmt, ...)
|
|||
va_list va;
|
||||
|
||||
va_start(va, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vupslog(priority, fmt, va, 0);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
void upsdebug_with_errno(int level, const char *fmt, ...)
|
||||
void s_upsdebug_with_errno(int level, const char *fmt, ...)
|
||||
{
|
||||
va_list va;
|
||||
char fmt2[LARGEBUF];
|
||||
|
||||
/* Note: Thanks to macro wrapping, we do not quite need this
|
||||
* test now, but we still need the "level" value to report
|
||||
* below - when it is not zero.
|
||||
*/
|
||||
if (nut_debug_level < level)
|
||||
return;
|
||||
|
||||
/* For debugging output, we want to prepend the debug level so the user can
|
||||
* e.g. lower the level (less -D's on command line) to retain just the amount
|
||||
* of logging info he needs to see at the moment. Using '-DDDDD' all the time
|
||||
* is too brutal and needed high-level overview can be lost. This [D#] prefix
|
||||
* can help limit this debug stream quicker, than experimentally picking ;) */
|
||||
if (level > 0) {
|
||||
int ret;
|
||||
ret = snprintf(fmt2, sizeof(fmt2), "[D%d] %s", level, fmt);
|
||||
if ((ret < 0) || (ret >= (int) sizeof(fmt2))) {
|
||||
syslog(LOG_WARNING, "upsdebug_with_errno: snprintf needed more than %d bytes",
|
||||
LARGEBUF);
|
||||
} else {
|
||||
fmt = (const char *)fmt2;
|
||||
}
|
||||
}
|
||||
|
||||
va_start(va, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vupslog(LOG_DEBUG, fmt, va, 1);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
void upsdebugx(int level, const char *fmt, ...)
|
||||
void s_upsdebugx(int level, const char *fmt, ...)
|
||||
{
|
||||
va_list va;
|
||||
char fmt2[LARGEBUF];
|
||||
|
||||
if (nut_debug_level < level)
|
||||
return;
|
||||
|
||||
/* See comments above in upsdebug_with_errno() - they apply here too. */
|
||||
if (level > 0) {
|
||||
int ret;
|
||||
ret = snprintf(fmt2, sizeof(fmt2), "[D%d] %s", level, fmt);
|
||||
if ((ret < 0) || (ret >= (int) sizeof(fmt2))) {
|
||||
syslog(LOG_WARNING, "upsdebugx: snprintf needed more than %d bytes",
|
||||
LARGEBUF);
|
||||
} else {
|
||||
fmt = (const char *)fmt2;
|
||||
}
|
||||
}
|
||||
|
||||
va_start(va, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vupslog(LOG_DEBUG, fmt, va, 0);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
/* dump message msg and len bytes from buf to upsdebugx(level) in
|
||||
hexadecimal. (This function replaces Philippe Marzouk's original
|
||||
dump_hex() function) */
|
||||
void upsdebug_hex(int level, const char *msg, const void *buf, int len)
|
||||
void s_upsdebug_hex(int level, const char *msg, const void *buf, size_t len)
|
||||
{
|
||||
char line[100];
|
||||
int n; /* number of characters currently in line */
|
||||
int i; /* number of bytes output from buffer */
|
||||
size_t i; /* number of bytes output from buffer */
|
||||
|
||||
n = snprintf(line, sizeof(line), "%s: (%d bytes) =>", msg, len);
|
||||
n = snprintf(line, sizeof(line), "%s: (%zu bytes) =>", msg, len);
|
||||
if (n < 0) goto failed;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
|
||||
|
@ -447,9 +739,16 @@ void upsdebug_hex(int level, const char *msg, const void *buf, int len)
|
|||
}
|
||||
|
||||
n = snprintfcat(line, sizeof(line), n ? " %02x" : "%02x",
|
||||
((unsigned char *)buf)[i]);
|
||||
((const unsigned char *)buf)[i]);
|
||||
|
||||
if (n < 0) goto failed;
|
||||
}
|
||||
upsdebugx(level, "%s", line);
|
||||
|
||||
s_upsdebugx(level, "%s", line);
|
||||
return;
|
||||
|
||||
failed:
|
||||
s_upsdebugx(level, "%s", "Failed to print a hex dump for debug");
|
||||
}
|
||||
|
||||
/* taken from www.asciitable.com */
|
||||
|
@ -489,29 +788,37 @@ static const char* ascii_symb[] = {
|
|||
};
|
||||
|
||||
/* dump message msg and len bytes from buf to upsdebugx(level) in ascii. */
|
||||
void upsdebug_ascii(int level, const char *msg, const void *buf, int len)
|
||||
void s_upsdebug_ascii(int level, const char *msg, const void *buf, size_t len)
|
||||
{
|
||||
char line[256];
|
||||
int i;
|
||||
int n; /* number of characters currently in line */
|
||||
size_t i; /* number of bytes output from buffer */
|
||||
unsigned char ch;
|
||||
|
||||
if (nut_debug_level < level)
|
||||
return; /* save cpu cycles */
|
||||
|
||||
snprintf(line, sizeof(line), "%s", msg);
|
||||
n = snprintf(line, sizeof(line), "%s", msg);
|
||||
if (n < 0) goto failed;
|
||||
|
||||
for (i=0; i<len; ++i) {
|
||||
ch = ((unsigned char *)buf)[i];
|
||||
ch = ((const unsigned char *)buf)[i];
|
||||
|
||||
if (ch < 0x20)
|
||||
snprintfcat(line, sizeof(line), "%3s ", ascii_symb[ch]);
|
||||
n = snprintfcat(line, sizeof(line), "%3s ", ascii_symb[ch]);
|
||||
else if (ch >= 0x80)
|
||||
snprintfcat(line, sizeof(line), "%02Xh ", ch);
|
||||
n = snprintfcat(line, sizeof(line), "%02Xh ", ch);
|
||||
else
|
||||
snprintfcat(line, sizeof(line), "'%c' ", ch);
|
||||
n = snprintfcat(line, sizeof(line), "'%c' ", ch);
|
||||
|
||||
if (n < 0) goto failed;
|
||||
}
|
||||
|
||||
upsdebugx(level, "%s", line);
|
||||
s_upsdebugx(level, "%s", line);
|
||||
return;
|
||||
|
||||
failed:
|
||||
s_upsdebugx(level, "%s", "Failed to print an ASCII data dump for debug");
|
||||
}
|
||||
|
||||
static void vfatal(const char *fmt, va_list va, int use_strerror)
|
||||
|
@ -521,7 +828,19 @@ static void vfatal(const char *fmt, va_list va, int use_strerror)
|
|||
if (xbit_test(upslog_flags, UPSLOG_SYSLOG_ON_FATAL))
|
||||
xbit_set(&upslog_flags, UPSLOG_SYSLOG);
|
||||
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vupslog(LOG_ERR, fmt, va, use_strerror);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
}
|
||||
|
||||
void fatal_with_errno(int status, const char *fmt, ...)
|
||||
|
@ -529,7 +848,19 @@ void fatal_with_errno(int status, const char *fmt, ...)
|
|||
va_list va;
|
||||
|
||||
va_start(va, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vfatal(fmt, va, (errno > 0) ? 1 : 0);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(va);
|
||||
|
||||
exit(status);
|
||||
|
@ -540,7 +871,19 @@ void fatalx(int status, const char *fmt, ...)
|
|||
va_list va;
|
||||
|
||||
va_start(va, fmt);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_FORMAT_SECURITY
|
||||
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||
#endif
|
||||
vfatal(fmt, va, 0);
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
va_end(va);
|
||||
|
||||
exit(status);
|
||||
|
@ -584,40 +927,10 @@ char *xstrdup(const char *string)
|
|||
return p;
|
||||
}
|
||||
|
||||
/* modify in - strip all trailing instances of <sep> */
|
||||
char *rtrim(char *in, const char sep)
|
||||
{
|
||||
char *p;
|
||||
|
||||
if (in) {
|
||||
p = &in[strlen(in) - 1];
|
||||
|
||||
while ((p >= in) && (*p == sep))
|
||||
*p-- = '\0';
|
||||
}
|
||||
return in;
|
||||
}
|
||||
|
||||
/* modify in - strip all leading instances of <sep> */
|
||||
char* ltrim(char *in, const char sep)
|
||||
{
|
||||
char *p;
|
||||
|
||||
if (in) {
|
||||
p = in;
|
||||
|
||||
while ((*p != '\0') && (*p == sep))
|
||||
*p++ = *in++;
|
||||
|
||||
p = '\0';
|
||||
}
|
||||
return in;
|
||||
}
|
||||
|
||||
/* Read up to buflen bytes from fd and return the number of bytes
|
||||
read. If no data is available within d_sec + d_usec, return 0.
|
||||
On error, a value < 0 is returned (errno indicates error). */
|
||||
int select_read(const int fd, void *buf, const size_t buflen, const long d_sec, const long d_usec)
|
||||
ssize_t select_read(const int fd, void *buf, const size_t buflen, const time_t d_sec, const suseconds_t d_usec)
|
||||
{
|
||||
int ret;
|
||||
fd_set fds;
|
||||
|
@ -641,7 +954,7 @@ int select_read(const int fd, void *buf, const size_t buflen, const long d_sec,
|
|||
/* Write up to buflen bytes to fd and return the number of bytes
|
||||
written. If no data is available within d_sec + d_usec, return 0.
|
||||
On error, a value < 0 is returned (errno indicates error). */
|
||||
int select_write(const int fd, const void *buf, const size_t buflen, const long d_sec, const long d_usec)
|
||||
ssize_t select_write(const int fd, const void *buf, const size_t buflen, const time_t d_sec, const suseconds_t d_usec)
|
||||
{
|
||||
int ret;
|
||||
fd_set fds;
|
||||
|
@ -661,3 +974,106 @@ int select_write(const int fd, const void *buf, const size_t buflen, const long
|
|||
|
||||
return write(fd, buf, buflen);
|
||||
}
|
||||
|
||||
|
||||
/* FIXME: would be good to get more from /etc/ld.so.conf[.d] and/or
|
||||
* LD_LIBRARY_PATH and a smarter dependency on build bitness; also
|
||||
* note that different OSes can have their pathnames set up differently
|
||||
* with regard to default/preferred bitness (maybe a "32" in the name
|
||||
* should also be searched explicitly - again, IFF our build is 32-bit).
|
||||
*
|
||||
* General premise for this solution is that some parts of NUT (e.g. the
|
||||
* nut-scanner tool, or DMF feature code) must be pre-built and distributed
|
||||
* in binary packages, but only at run-time it gets to know which third-party
|
||||
* libraries it should use for particular operations. This differs from e.g.
|
||||
* distribution packages which group NUT driver binaries explicitly dynamically
|
||||
* linked against certain OS-provided libraries for accessing this or that
|
||||
* communications media and/or vendor protocol.
|
||||
*/
|
||||
static const char * search_paths[] = {
|
||||
/* Use the library path (and bitness) provided during ./configure first */
|
||||
LIBDIR,
|
||||
"/usr"LIBDIR,
|
||||
"/usr/local"LIBDIR,
|
||||
#ifdef BUILD_64
|
||||
/* Fall back to explicit preference of 64-bit paths as named on some OSes */
|
||||
"/usr/lib/64",
|
||||
"/usr/lib64",
|
||||
#endif
|
||||
"/usr/lib",
|
||||
#ifdef BUILD_64
|
||||
"/lib/64",
|
||||
"/lib64",
|
||||
#endif
|
||||
"/lib",
|
||||
#ifdef BUILD_64
|
||||
"/usr/local/lib/64",
|
||||
"/usr/local/lib64",
|
||||
#endif
|
||||
"/usr/local/lib",
|
||||
#ifdef AUTOTOOLS_TARGET_SHORT_ALIAS
|
||||
"/usr/lib/" AUTOTOOLS_TARGET_SHORT_ALIAS,
|
||||
"/usr/lib/gcc/" AUTOTOOLS_TARGET_SHORT_ALIAS,
|
||||
#else
|
||||
# ifdef AUTOTOOLS_HOST_SHORT_ALIAS
|
||||
"/usr/lib/" AUTOTOOLS_HOST_SHORT_ALIAS,
|
||||
"/usr/lib/gcc/" AUTOTOOLS_HOST_SHORT_ALIAS,
|
||||
# else
|
||||
# ifdef AUTOTOOLS_BUILD_SHORT_ALIAS
|
||||
"/usr/lib/" AUTOTOOLS_BUILD_SHORT_ALIAS,
|
||||
"/usr/lib/gcc/" AUTOTOOLS_BUILD_SHORT_ALIAS,
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#ifdef AUTOTOOLS_TARGET_ALIAS
|
||||
"/usr/lib/" AUTOTOOLS_TARGET_ALIAS,
|
||||
"/usr/lib/gcc/" AUTOTOOLS_TARGET_ALIAS,
|
||||
#else
|
||||
# ifdef AUTOTOOLS_HOST_ALIAS
|
||||
"/usr/lib/" AUTOTOOLS_HOST_ALIAS,
|
||||
"/usr/lib/gcc/" AUTOTOOLS_HOST_ALIAS,
|
||||
# else
|
||||
# ifdef AUTOTOOLS_BUILD_ALIAS
|
||||
"/usr/lib/" AUTOTOOLS_BUILD_ALIAS,
|
||||
"/usr/lib/gcc/" AUTOTOOLS_BUILD_ALIAS,
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
char * get_libname(const char* base_libname)
|
||||
{
|
||||
DIR *dp;
|
||||
struct dirent *dirp;
|
||||
int index = 0;
|
||||
char *libname_path = NULL;
|
||||
char current_test_path[LARGEBUF];
|
||||
size_t base_libname_length = strlen(base_libname);
|
||||
|
||||
for(index = 0 ; (search_paths[index] != NULL) && (libname_path == NULL) ; index++)
|
||||
{
|
||||
memset(current_test_path, 0, LARGEBUF);
|
||||
|
||||
if ((dp = opendir(search_paths[index])) == NULL)
|
||||
continue;
|
||||
|
||||
upsdebugx(2,"Looking for lib %s in directory #%d : %s", base_libname, index, search_paths[index]);
|
||||
while ((dirp = readdir(dp)) != NULL)
|
||||
{
|
||||
upsdebugx(5,"Comparing lib %s with dirpath %s", base_libname, dirp->d_name);
|
||||
int compres = strncmp(dirp->d_name, base_libname, base_libname_length);
|
||||
if(compres == 0) {
|
||||
snprintf(current_test_path, LARGEBUF, "%s/%s", search_paths[index], dirp->d_name);
|
||||
libname_path = realpath(current_test_path, NULL);
|
||||
upsdebugx(2,"Candidate path for lib %s is %s (realpath %s)", base_libname, current_test_path, (libname_path!=NULL)?libname_path:"NULL");
|
||||
if (libname_path != NULL)
|
||||
break;
|
||||
}
|
||||
}
|
||||
closedir(dp);
|
||||
}
|
||||
|
||||
upsdebugx(1,"Looking for lib %s, found %s", base_libname, (libname_path!=NULL)?libname_path:"NULL");
|
||||
return libname_path;
|
||||
}
|
||||
|
|
|
@ -76,6 +76,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
@ -83,8 +85,11 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "parseconf.h"
|
||||
#include "attribute.h"
|
||||
#include "nut_stdint.h"
|
||||
|
||||
/* possible states */
|
||||
|
||||
|
@ -97,6 +102,9 @@
|
|||
#define STATE_ENDOFLINE 7
|
||||
#define STATE_PARSEERR 8
|
||||
|
||||
static void pconf_fatal(PCONF_CTX_t *ctx, const char *errtxt)
|
||||
__attribute__((noreturn));
|
||||
|
||||
static void pconf_fatal(PCONF_CTX_t *ctx, const char *errtxt)
|
||||
{
|
||||
if (ctx->errhandler)
|
||||
|
@ -109,7 +117,7 @@ static void pconf_fatal(PCONF_CTX_t *ctx, const char *errtxt)
|
|||
|
||||
static void add_arg_word(PCONF_CTX_t *ctx)
|
||||
{
|
||||
int argpos;
|
||||
size_t argpos;
|
||||
size_t wbuflen;
|
||||
|
||||
/* this is where the new value goes */
|
||||
|
@ -171,7 +179,7 @@ static void addchar(PCONF_CTX_t *ctx)
|
|||
|
||||
wbuflen = strlen(ctx->wordbuf);
|
||||
|
||||
/* CVE-2012-2944: only allow the subset Ascii charset from Space to ~ */
|
||||
/* CVE-2012-2944: only allow the subset of ASCII charset from Space to ~ */
|
||||
if ((ctx->ch < 0x20) || (ctx->ch > 0x7f)) {
|
||||
fprintf(stderr, "addchar: discarding invalid character (0x%02x)!\n",
|
||||
ctx->ch);
|
||||
|
@ -199,7 +207,7 @@ static void addchar(PCONF_CTX_t *ctx)
|
|||
ctx->wordptr = &ctx->wordbuf[wbuflen];
|
||||
}
|
||||
|
||||
*ctx->wordptr++ = ctx->ch;
|
||||
*ctx->wordptr++ = (char)ctx->ch;
|
||||
*ctx->wordptr = '\0';
|
||||
}
|
||||
|
||||
|
@ -234,7 +242,7 @@ static int findwordstart(PCONF_CTX_t *ctx)
|
|||
return STATE_FINDEOL;
|
||||
|
||||
/* space = not in a word yet, so loop back */
|
||||
if (isspace(ctx->ch))
|
||||
if (isspace((size_t)ctx->ch))
|
||||
return STATE_FINDWORDSTART;
|
||||
|
||||
/* \ = literal = accept the next char blindly */
|
||||
|
@ -334,7 +342,7 @@ static int collect(PCONF_CTX_t *ctx)
|
|||
}
|
||||
|
||||
/* space means the word is done */
|
||||
if (isspace(ctx->ch)) {
|
||||
if (isspace((size_t)ctx->ch)) {
|
||||
endofword(ctx);
|
||||
|
||||
return STATE_FINDWORDSTART;
|
||||
|
@ -443,6 +451,9 @@ int pconf_file_begin(PCONF_CTX_t *ctx, const char *fn)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* prevent fd leaking to child processes */
|
||||
fcntl(fileno(ctx->f), F_SETFD, FD_CLOEXEC);
|
||||
|
||||
return 1; /* OK */
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ int nut_setenv(const char *name, const char *value, int overwrite)
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
buffer = xmalloc(strlen(value) + strlen(name) + 2);
|
||||
strcpy(buffer, name);
|
||||
strcat(buffer, "=");
|
||||
|
|
|
@ -137,10 +137,26 @@ static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c );
|
|||
|
||||
/* Conversion Flags */
|
||||
#define DP_C_SHORT 1
|
||||
/* Note: Originally DP_C_SHORT converted to "short int" types, but modernish
|
||||
* (C99+ or even earlier) standards require that the minimal type passed
|
||||
* through variadic args '...' is an int, and smaller types are padded up
|
||||
* to it - so value shifts in memory and erroneous access crashes can occur
|
||||
* if smaller data is accessed blindly. Code below has been fixed to not pass
|
||||
* "short int" anymore - it just casts the int to desired smaller type (and
|
||||
* so drops the padding bits). */
|
||||
#define DP_C_LONG 2
|
||||
#define DP_C_LDOUBLE 3
|
||||
#define DP_C_LLONG 4
|
||||
|
||||
#ifdef C89PLUS
|
||||
#undef C89PLUS
|
||||
#endif
|
||||
|
||||
#if defined(__STDC__) || defined(__STDC_VERSION__)
|
||||
/* C89+ and C90+ code respectively */
|
||||
#define C89PLUS 1
|
||||
#endif
|
||||
|
||||
#define char_to_int(p) ((p)- '0')
|
||||
#define MAX(p,q) (((p) >= (q)) ? (p) : (q))
|
||||
|
||||
|
@ -275,7 +291,11 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
|||
case 'd':
|
||||
case 'i':
|
||||
if (cflags == DP_C_SHORT)
|
||||
#ifdef C89PLUS
|
||||
value = (short int)va_arg (args, int);
|
||||
#else
|
||||
value = va_arg (args, short int);
|
||||
#endif
|
||||
else if (cflags == DP_C_LONG)
|
||||
value = va_arg (args, long int);
|
||||
else if (cflags == DP_C_LLONG)
|
||||
|
@ -287,7 +307,11 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
|||
case 'o':
|
||||
flags |= DP_F_UNSIGNED;
|
||||
if (cflags == DP_C_SHORT)
|
||||
#ifdef C89PLUS
|
||||
value = (unsigned short int)va_arg (args, unsigned int);
|
||||
#else
|
||||
value = va_arg (args, unsigned short int);
|
||||
#endif
|
||||
else if (cflags == DP_C_LONG)
|
||||
value = (long)va_arg (args, unsigned long int);
|
||||
else if (cflags == DP_C_LLONG)
|
||||
|
@ -299,7 +323,11 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
|||
case 'u':
|
||||
flags |= DP_F_UNSIGNED;
|
||||
if (cflags == DP_C_SHORT)
|
||||
#ifdef C89PLUS
|
||||
value = (unsigned short int)va_arg (args, unsigned int);
|
||||
#else
|
||||
value = va_arg (args, unsigned short int);
|
||||
#endif
|
||||
else if (cflags == DP_C_LONG)
|
||||
value = (long)va_arg (args, unsigned long int);
|
||||
else if (cflags == DP_C_LLONG)
|
||||
|
@ -310,10 +338,16 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
|||
break;
|
||||
case 'X':
|
||||
flags |= DP_F_UP;
|
||||
goto fallthrough_case_x;
|
||||
case 'x':
|
||||
fallthrough_case_x:
|
||||
flags |= DP_F_UNSIGNED;
|
||||
if (cflags == DP_C_SHORT)
|
||||
#ifdef C89PLUS
|
||||
value = (unsigned short int)va_arg (args, unsigned int);
|
||||
#else
|
||||
value = va_arg (args, unsigned short int);
|
||||
#endif
|
||||
else if (cflags == DP_C_LONG)
|
||||
value = (long)va_arg (args, unsigned long int);
|
||||
else if (cflags == DP_C_LLONG)
|
||||
|
@ -332,7 +366,9 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
|||
break;
|
||||
case 'E':
|
||||
flags |= DP_F_UP;
|
||||
goto fallthrough_case_e;
|
||||
case 'e':
|
||||
fallthrough_case_e:
|
||||
if (cflags == DP_C_LDOUBLE)
|
||||
fvalue = va_arg (args, LDOUBLE);
|
||||
else
|
||||
|
@ -340,7 +376,9 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
|||
break;
|
||||
case 'G':
|
||||
flags |= DP_F_UP;
|
||||
goto fallthrough_case_g;
|
||||
case 'g':
|
||||
fallthrough_case_g:
|
||||
if (cflags == DP_C_LDOUBLE)
|
||||
fvalue = va_arg (args, LDOUBLE);
|
||||
else
|
||||
|
@ -543,6 +581,7 @@ static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
|||
}
|
||||
}
|
||||
|
||||
#ifndef HAVE_ABS_VAL
|
||||
static LDOUBLE abs_val (LDOUBLE value)
|
||||
{
|
||||
LDOUBLE result = value;
|
||||
|
@ -552,7 +591,13 @@ static LDOUBLE abs_val (LDOUBLE value)
|
|||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FCVT
|
||||
/* The two routines that may get defined below are only used if we also don't
|
||||
* have a fcvt() in the system. Defining and not using the routines may be a
|
||||
* warning (fatal with -Werror), so we hide them here. */
|
||||
# ifndef HAVE_POW10
|
||||
static LDOUBLE pow10 (int exp)
|
||||
{
|
||||
LDOUBLE result = 1;
|
||||
|
@ -565,7 +610,9 @@ static LDOUBLE pow10 (int exp)
|
|||
|
||||
return result;
|
||||
}
|
||||
# endif
|
||||
|
||||
# ifndef HAVE_ROUND
|
||||
static long round (LDOUBLE value)
|
||||
{
|
||||
long intpart;
|
||||
|
@ -577,6 +624,8 @@ static long round (LDOUBLE value)
|
|||
|
||||
return intpart;
|
||||
}
|
||||
# endif
|
||||
#endif /* HAVE_FCVT */
|
||||
|
||||
static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||
LDOUBLE fvalue, int min, int max, int flags)
|
||||
|
@ -602,9 +651,11 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
|||
int fplace = 0;
|
||||
int padlen = 0; /* amount to pad */
|
||||
int zpadlen = 0;
|
||||
#ifndef HAVE_FCVT
|
||||
int caps = 0;
|
||||
long intpart;
|
||||
long fracpart;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* AIX manpage says the default is 0, but Solaris says the default
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "config.h" /* must be first */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/stat.h>
|
||||
|
@ -124,7 +126,10 @@ static void st_tree_node_add(st_tree_t **nptr, st_tree_t *sptr)
|
|||
*nptr = sptr;
|
||||
}
|
||||
|
||||
/* remove a variable from a tree */
|
||||
/* remove a variable from a tree
|
||||
* except for variables with ST_FLAG_IMMUTABLE
|
||||
* (for override.* to survive) per issue #737
|
||||
*/
|
||||
int state_delinfo(st_tree_t **nptr, const char *var)
|
||||
{
|
||||
while (*nptr) {
|
||||
|
@ -141,6 +146,11 @@ int state_delinfo(st_tree_t **nptr, const char *var)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (node->flags & ST_FLAG_IMMUTABLE) {
|
||||
upsdebugx(6, "%s: not deleting immutable variable [%s]", __func__, var);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* whatever is on the left, hang it off current right */
|
||||
st_tree_node_add(&node->right, node->left);
|
||||
|
||||
|
@ -303,7 +313,7 @@ int state_addrange(st_tree_t *root, const char *var, const int min, const int ma
|
|||
int state_setaux(st_tree_t *root, const char *var, const char *auxs)
|
||||
{
|
||||
st_tree_t *sttmp;
|
||||
int aux;
|
||||
long aux;
|
||||
|
||||
/* find the tree node for var */
|
||||
sttmp = state_tree_find(root, var);
|
||||
|
@ -354,7 +364,7 @@ int state_getflags(st_tree_t *root, const char *var)
|
|||
return sttmp->flags;
|
||||
}
|
||||
|
||||
int state_getaux(st_tree_t *root, const char *var)
|
||||
long state_getaux(st_tree_t *root, const char *var)
|
||||
{
|
||||
st_tree_t *sttmp;
|
||||
|
||||
|
@ -396,9 +406,9 @@ const range_t *state_getrangelist(st_tree_t *root, const char *var)
|
|||
return sttmp->range_list;
|
||||
}
|
||||
|
||||
void state_setflags(st_tree_t *root, const char *var, int numflags, char **flag)
|
||||
void state_setflags(st_tree_t *root, const char *var, size_t numflags, char **flag)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
st_tree_t *sttmp;
|
||||
|
||||
/* find the tree node for var */
|
||||
|
@ -424,6 +434,11 @@ void state_setflags(st_tree_t *root, const char *var, int numflags, char **flag)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (!strcasecmp(flag[i], "NUMBER")) {
|
||||
sttmp->flags |= ST_FLAG_NUMBER;
|
||||
continue;
|
||||
}
|
||||
|
||||
upsdebugx(2, "Unrecognized flag [%s]", flag[i]);
|
||||
}
|
||||
}
|
||||
|
|
629
common/str.c
Normal file
629
common/str.c
Normal file
|
@ -0,0 +1,629 @@
|
|||
/* str.c - Common string-related functions
|
||||
*
|
||||
* Copyright (C)
|
||||
* 2000 Russell Kroll <rkroll@exploits.org>
|
||||
* 2015 Daniele Pezzini <hyouko@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License 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
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h" /* must be first */
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h> /* for strdup() and many others */
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h> /* for strncasecmp() and strcasecmp() */
|
||||
#endif
|
||||
|
||||
#include "nut_stdint.h"
|
||||
#include "str.h"
|
||||
|
||||
char *str_trim(char *string, const char character)
|
||||
{
|
||||
return str_rtrim(str_ltrim(string, character), character);
|
||||
}
|
||||
|
||||
char *str_trim_m(char *string, const char *characters)
|
||||
{
|
||||
return str_rtrim_m(str_ltrim_m(string, characters), characters);
|
||||
}
|
||||
|
||||
char *str_ltrim(char *string, const char character)
|
||||
{
|
||||
char characters[2] = { character, '\0' };
|
||||
|
||||
return str_ltrim_m(string, characters);
|
||||
}
|
||||
|
||||
char *str_ltrim_m(char *string, const char *characters)
|
||||
{
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0' ||
|
||||
characters == NULL ||
|
||||
*characters == '\0'
|
||||
)
|
||||
return string;
|
||||
|
||||
while (
|
||||
*string != '\0' &&
|
||||
strchr(characters, *string) != NULL
|
||||
)
|
||||
memmove(string, string + 1, strlen(string));
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
char *str_rtrim(char *string, const char character)
|
||||
{
|
||||
char characters[2] = { character, '\0' };
|
||||
|
||||
return str_rtrim_m(string, characters);
|
||||
}
|
||||
|
||||
char *str_rtrim_m(char *string, const char *characters)
|
||||
{
|
||||
char *ptr;
|
||||
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0' ||
|
||||
characters == NULL ||
|
||||
*characters == '\0'
|
||||
)
|
||||
return string;
|
||||
|
||||
ptr = &string[strlen(string) - 1];
|
||||
|
||||
while (
|
||||
ptr >= string &&
|
||||
strchr(characters, *ptr) != NULL
|
||||
)
|
||||
*ptr-- = '\0';
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
char *str_trim_space(char *string)
|
||||
{
|
||||
return str_rtrim_space(str_ltrim_space(string));
|
||||
}
|
||||
|
||||
char *str_ltrim_space(char *string)
|
||||
{
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0'
|
||||
)
|
||||
return string;
|
||||
|
||||
while (
|
||||
*string != '\0' &&
|
||||
isspace((size_t)*string)
|
||||
)
|
||||
memmove(string, string + 1, strlen(string));
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
char *str_rtrim_space(char *string)
|
||||
{
|
||||
char *ptr;
|
||||
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0'
|
||||
)
|
||||
return string;
|
||||
|
||||
ptr = &string[strlen(string) - 1];
|
||||
|
||||
while (
|
||||
ptr >= string &&
|
||||
isspace((size_t)*ptr)
|
||||
)
|
||||
*ptr-- = '\0';
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
int str_is_short(const char *string, const int base)
|
||||
{
|
||||
short number;
|
||||
|
||||
return str_to_short(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_short_strict(const char *string, const int base)
|
||||
{
|
||||
short number;
|
||||
|
||||
return str_to_short_strict(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_ushort(const char *string, const int base)
|
||||
{
|
||||
unsigned short number;
|
||||
|
||||
return str_to_ushort(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_ushort_strict(const char *string, const int base)
|
||||
{
|
||||
unsigned short number;
|
||||
|
||||
return str_to_ushort_strict(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_int(const char *string, const int base)
|
||||
{
|
||||
int number;
|
||||
|
||||
return str_to_int(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_int_strict(const char *string, const int base)
|
||||
{
|
||||
int number;
|
||||
|
||||
return str_to_int_strict(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_uint(const char *string, const int base)
|
||||
{
|
||||
unsigned int number;
|
||||
|
||||
return str_to_uint(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_uint_strict(const char *string, const int base)
|
||||
{
|
||||
unsigned int number;
|
||||
|
||||
return str_to_uint_strict(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_long(const char *string, const int base)
|
||||
{
|
||||
long number;
|
||||
|
||||
return str_to_long(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_long_strict(const char *string, const int base)
|
||||
{
|
||||
long number;
|
||||
|
||||
return str_to_long_strict(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_ulong(const char *string, const int base)
|
||||
{
|
||||
unsigned long number;
|
||||
|
||||
return str_to_ulong(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_ulong_strict(const char *string, const int base)
|
||||
{
|
||||
unsigned long number;
|
||||
|
||||
return str_to_ulong_strict(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_double(const char *string, const int base)
|
||||
{
|
||||
double number;
|
||||
|
||||
return str_to_double(string, &number, base);
|
||||
}
|
||||
|
||||
int str_is_double_strict(const char *string, const int base)
|
||||
{
|
||||
double number;
|
||||
|
||||
return str_to_double_strict(string, &number, base);
|
||||
}
|
||||
|
||||
int str_to_short(const char *string, short *number, const int base)
|
||||
{
|
||||
long num;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (!str_to_long(string, &num, base))
|
||||
return 0;
|
||||
|
||||
if (
|
||||
num < SHRT_MIN ||
|
||||
num > SHRT_MAX
|
||||
) {
|
||||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*number = (short)num;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_short_strict(const char *string, short *number, const int base)
|
||||
{
|
||||
long num;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (!str_to_long_strict(string, &num, base))
|
||||
return 0;
|
||||
|
||||
if (
|
||||
num < SHRT_MIN ||
|
||||
num > SHRT_MAX
|
||||
) {
|
||||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*number = (short)num;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_ushort(const char *string, unsigned short *number, const int base)
|
||||
{
|
||||
unsigned long num;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (!str_to_ulong(string, &num, base))
|
||||
return 0;
|
||||
|
||||
if (num > USHRT_MAX) {
|
||||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*number = (unsigned short)num;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_ushort_strict(const char *string, unsigned short *number, const int base)
|
||||
{
|
||||
unsigned long num;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (!str_to_ulong_strict(string, &num, base))
|
||||
return 0;
|
||||
|
||||
if (num > USHRT_MAX) {
|
||||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*number = (unsigned short)num;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_int(const char *string, int *number, const int base)
|
||||
{
|
||||
long num; /* long >= int, make sure we fit well */
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (!str_to_long(string, &num, base))
|
||||
return 0;
|
||||
|
||||
if (
|
||||
num < INT_MIN ||
|
||||
num > INT_MAX
|
||||
) {
|
||||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*number = (int)num;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_int_strict(const char *string, int *number, const int base)
|
||||
{
|
||||
long num; /* long >= int, make sure we fit well */
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (!str_to_long_strict(string, &num, base))
|
||||
return 0;
|
||||
|
||||
if (
|
||||
num < INT_MIN ||
|
||||
num > INT_MAX
|
||||
) {
|
||||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*number = (int)num;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_uint(const char *string, unsigned int *number, const int base)
|
||||
{
|
||||
unsigned long num; /* long >= int, make sure we fit well */
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (!str_to_ulong(string, &num, base))
|
||||
return 0;
|
||||
|
||||
if (num > UINT_MAX) {
|
||||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*number = (unsigned int)num;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_uint_strict(const char *string, unsigned int *number, const int base)
|
||||
{
|
||||
unsigned long num; /* long >= int, make sure we fit well */
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (!str_to_ulong_strict(string, &num, base))
|
||||
return 0;
|
||||
|
||||
if (num > UINT_MAX) {
|
||||
errno = ERANGE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*number = (unsigned int)num;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_long(const char *string, long *number, const int base)
|
||||
{
|
||||
char *str;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0'
|
||||
) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
str = strdup(string);
|
||||
if (str == NULL)
|
||||
return 0;
|
||||
|
||||
str_trim_space(str);
|
||||
|
||||
if (!str_to_long_strict(str, number, base)) {
|
||||
free(str);
|
||||
return 0;
|
||||
}
|
||||
|
||||
free(str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_long_strict(const char *string, long *number, const int base)
|
||||
{
|
||||
char *ptr = NULL;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0' ||
|
||||
isspace((size_t)*string)
|
||||
) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
*number = strtol(string, &ptr, base);
|
||||
|
||||
if (
|
||||
errno == EINVAL ||
|
||||
*ptr != '\0'
|
||||
) {
|
||||
*number = 0;
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (errno == ERANGE) {
|
||||
*number = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_ulong(const char *string, unsigned long *number, const int base)
|
||||
{
|
||||
char *str;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0'
|
||||
) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
str = strdup(string);
|
||||
if (str == NULL)
|
||||
return 0;
|
||||
|
||||
str_trim_space(str);
|
||||
|
||||
if (!str_to_ulong_strict(str, number, base)) {
|
||||
free(str);
|
||||
return 0;
|
||||
}
|
||||
|
||||
free(str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_ulong_strict(const char *string, unsigned long *number, const int base)
|
||||
{
|
||||
char *ptr = NULL;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0' ||
|
||||
*string == '+' ||
|
||||
*string == '-' ||
|
||||
isspace((size_t)*string)
|
||||
) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
*number = strtoul(string, &ptr, base);
|
||||
|
||||
if (
|
||||
errno == EINVAL ||
|
||||
*ptr != '\0'
|
||||
) {
|
||||
*number = 0;
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (errno == ERANGE) {
|
||||
*number = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_double(const char *string, double *number, const int base)
|
||||
{
|
||||
char *str;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0'
|
||||
) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
str = strdup(string);
|
||||
if (str == NULL)
|
||||
return 0;
|
||||
|
||||
str_trim_space(str);
|
||||
|
||||
if (!str_to_double_strict(str, number, base)) {
|
||||
free(str);
|
||||
return 0;
|
||||
}
|
||||
|
||||
free(str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_to_double_strict(const char *string, double *number, const int base)
|
||||
{
|
||||
char *ptr = NULL;
|
||||
|
||||
*number = 0;
|
||||
|
||||
if (
|
||||
string == NULL ||
|
||||
*string == '\0' ||
|
||||
isspace((size_t)*string)
|
||||
) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (base)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 10:
|
||||
if (strlen(string) != strspn(string, "-+.0123456789Ee")) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case 16:
|
||||
if (strlen(string) != strspn(string, "-+.0123456789ABCDEFabcdefXxPp")) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
*number = strtod(string, &ptr);
|
||||
|
||||
if (
|
||||
errno == EINVAL ||
|
||||
*ptr != '\0'
|
||||
) {
|
||||
*number = 0;
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (errno == ERANGE) {
|
||||
*number = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int str_ends_with(const char *s, const char *suff) {
|
||||
size_t slen;
|
||||
size_t sufflen;
|
||||
|
||||
if (!s) return 0; /* null string does not end with anything */
|
||||
if (!suff) return 1; /* null suffix tails anything */
|
||||
|
||||
slen = strlen(s);
|
||||
sufflen = strlen(suff);
|
||||
|
||||
return (slen >= sufflen) && (!memcmp(s + slen - sufflen, suff, sufflen));
|
||||
}
|
|
@ -11,6 +11,16 @@ char *strerror(int errnum)
|
|||
{
|
||||
static char buf[32];
|
||||
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE_BREAK
|
||||
#pragma GCC diagnostic ignored "-Wunreachable-code-break"
|
||||
#endif
|
||||
#ifdef HAVE_PRAGMA_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE
|
||||
#pragma GCC diagnostic ignored "-Wunreachable-code"
|
||||
#endif
|
||||
|
||||
switch (errnum) {
|
||||
#if defined (EPERM)
|
||||
case EPERM:
|
||||
|
@ -498,6 +508,11 @@ char *strerror(int errnum)
|
|||
/* Fallback: just print the error number */
|
||||
snprintf(buf, sizeof(buf), "Error %d", errnum);
|
||||
return buf;
|
||||
|
||||
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#endif /* HAVE_STRERROR */
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "config.h" /* must be the first header */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -29,7 +31,7 @@
|
|||
static char *ups_section;
|
||||
|
||||
/* handle arguments separated by parseconf */
|
||||
static void conf_args(int numargs, char **arg)
|
||||
static void conf_args(size_t numargs, char **arg)
|
||||
{
|
||||
if (numargs < 1)
|
||||
return;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
INSTALL_0600 = $(INSTALL) -m 0600
|
||||
|
||||
SECFILES = upsmon.conf.sample upsd.conf.sample upsd.users.sample
|
||||
SECFILES = upsd.conf.sample upsd.users.sample
|
||||
PUBFILES = nut.conf.sample ups.conf.sample
|
||||
CGIPUB = hosts.conf.sample upsset.conf.sample upsstats.html.sample \
|
||||
upsstats-single.html.sample
|
||||
|
@ -15,3 +15,27 @@ endif
|
|||
|
||||
dist_sysconf_DATA = $(SECFILES) $(PUBFILES) $(CGI_INSTALL)
|
||||
nodist_sysconf_DATA = upssched.conf.sample upsmon.conf.sample
|
||||
|
||||
SPELLCHECK_SRC = $(dist_sysconf_DATA) \
|
||||
upssched.conf.sample.in upsmon.conf.sample.in
|
||||
|
||||
# NOTE: Due to portability, we do not use a GNU percent-wildcard extension:
|
||||
#%-spellchecked: % Makefile.am $(top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
|
||||
# $(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
# NOTE: Portable suffix rules do not allow prerequisites, so we shim them here
|
||||
# by a wildcard target in case the make implementation can put the two together.
|
||||
*-spellchecked: Makefile.am $(top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
|
||||
|
||||
.sample.sample-spellchecked:
|
||||
$(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
.in.in-spellchecked:
|
||||
$(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
spellcheck spellcheck-interactive spellcheck-sortdict:
|
||||
$(MAKE) -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC="$(SPELLCHECK_SRC)" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||
CLEANFILES = *.pdf *.html *-spellchecked
|
||||
|
|
213
conf/Makefile.in
213
conf/Makefile.in
|
@ -1,9 +1,8 @@
|
|||
# Makefile.in generated by automake 1.11.6 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
|
||||
# Foundation, Inc.
|
||||
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
@ -18,23 +17,61 @@
|
|||
# Network UPS Tools: conf
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__make_dryrun = \
|
||||
{ \
|
||||
am__dry=no; \
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||
*) \
|
||||
for am__flg in $$MAKEFLAGS; do \
|
||||
case $$am__flg in \
|
||||
*=*|--*) ;; \
|
||||
*n*) am__dry=yes; break;; \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
done;; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
test $$am__dry = yes; \
|
||||
}
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
|
@ -55,20 +92,24 @@ build_triplet = @build@
|
|||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
subdir = conf
|
||||
DIST_COMMON = $(am__dist_sysconf_DATA_DIST) $(srcdir)/Makefile.am \
|
||||
$(srcdir)/Makefile.in $(srcdir)/upsmon.conf.sample.in \
|
||||
$(srcdir)/upssched.conf.sample.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \
|
||||
$(top_srcdir)/m4/ax_c_pragmas.m4 \
|
||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
||||
$(top_srcdir)/m4/ax_compare_version.m4 \
|
||||
$(top_srcdir)/m4/ax_run_or_link_ifelse.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||
$(top_srcdir)/m4/nut_check_asciidoc.m4 \
|
||||
$(top_srcdir)/m4/nut_check_cppcheck.m4 \
|
||||
$(top_srcdir)/m4/nut_check_headers_windows.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libavahi.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libltdl.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libmodbus.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libneon.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||
|
@ -77,15 +118,34 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
|||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||
$(top_srcdir)/m4/nut_check_os.m4 \
|
||||
$(top_srcdir)/m4/nut_check_pkgconfig.m4 \
|
||||
$(top_srcdir)/m4/nut_check_python.m4 \
|
||||
$(top_srcdir)/m4/nut_compiler_family.m4 \
|
||||
$(top_srcdir)/m4/nut_func_getnameinfo_argtypes.m4 \
|
||||
$(top_srcdir)/m4/nut_report_feature.m4 \
|
||||
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_sysconf_DATA_DIST) \
|
||||
$(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||
CONFIG_CLEAN_FILES = upsmon.conf.sample upssched.conf.sample
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
am__can_run_installinfo = \
|
||||
|
@ -93,9 +153,9 @@ am__can_run_installinfo = \
|
|||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
am__dist_sysconf_DATA_DIST = upsmon.conf.sample upsd.conf.sample \
|
||||
upsd.users.sample nut.conf.sample ups.conf.sample \
|
||||
hosts.conf.sample upsset.conf.sample upsstats.html.sample \
|
||||
am__dist_sysconf_DATA_DIST = upsd.conf.sample upsd.users.sample \
|
||||
nut.conf.sample ups.conf.sample hosts.conf.sample \
|
||||
upsset.conf.sample upsstats.html.sample \
|
||||
upsstats-single.html.sample
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
|
@ -126,13 +186,19 @@ am__uninstall_files_from_dir = { \
|
|||
}
|
||||
am__installdirs = "$(DESTDIR)$(sysconfdir)" "$(DESTDIR)$(sysconfdir)"
|
||||
DATA = $(dist_sysconf_DATA) $(nodist_sysconf_DATA)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in \
|
||||
$(srcdir)/upsmon.conf.sample.in \
|
||||
$(srcdir)/upssched.conf.sample.in
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
A2X = @A2X@
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
ASCIIDOC = @ASCIIDOC@
|
||||
ASPELL = @ASPELL@
|
||||
AUGPARSE = @AUGPARSE@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
|
@ -143,6 +209,7 @@ CCDEPMODE = @CCDEPMODE@
|
|||
CFLAGS = @CFLAGS@
|
||||
CONFPATH = @CONFPATH@
|
||||
CPP = @CPP@
|
||||
CPPCHECK = @CPPCHECK@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||
|
@ -156,6 +223,7 @@ DEFS = @DEFS@
|
|||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||
|
@ -168,6 +236,7 @@ ECHO_T = @ECHO_T@
|
|||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
FGREP = @FGREP@
|
||||
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
@ -178,12 +247,15 @@ LD = @LD@
|
|||
LDFLAGS = @LDFLAGS@
|
||||
LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@
|
||||
LIBAVAHI_LIBS = @LIBAVAHI_LIBS@
|
||||
LIBDIR = @LIBDIR@
|
||||
LIBGD_CFLAGS = @LIBGD_CFLAGS@
|
||||
LIBGD_LDFLAGS = @LIBGD_LDFLAGS@
|
||||
LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||
|
@ -194,21 +266,29 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
|||
LIBS = @LIBS@
|
||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LN_S_R = @LN_S_R@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NETLIBS = @NETLIBS@
|
||||
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
NUT_DATADIR = @NUT_DATADIR@
|
||||
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||
NUT_NETVERSION = @NUT_NETVERSION@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
|
@ -228,6 +308,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
|||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
PORT = @PORT@
|
||||
PYTHON = @PYTHON@
|
||||
PYTHON2 = @PYTHON2@
|
||||
PYTHON3 = @PYTHON3@
|
||||
RANLIB = @RANLIB@
|
||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||
RUN_AS_USER = @RUN_AS_USER@
|
||||
|
@ -236,12 +319,16 @@ SED = @SED@
|
|||
SERLIBS = @SERLIBS@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@
|
||||
STATEPATH = @STATEPATH@
|
||||
STRIP = @STRIP@
|
||||
SUN_LIBUSB = @SUN_LIBUSB@
|
||||
TREE_VERSION = @TREE_VERSION@
|
||||
VALGRIND = @VALGRIND@
|
||||
VERSION = @VERSION@
|
||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||
XMLLINT = @XMLLINT@
|
||||
XSLTPROC = @XSLTPROC@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
|
@ -255,6 +342,7 @@ am__leading_dot = @am__leading_dot@
|
|||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
auglensdir = @auglensdir@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
|
@ -268,6 +356,9 @@ datarootdir = @datarootdir@
|
|||
devddir = @devddir@
|
||||
docdir = @docdir@
|
||||
driverexecdir = @driverexecdir@
|
||||
dummy_PKG_CONFIG = @dummy_PKG_CONFIG@
|
||||
dummy_PKG_CONFIG_CFLAGS = @dummy_PKG_CONFIG_CFLAGS@
|
||||
dummy_PKG_CONFIG_LIBS = @dummy_PKG_CONFIG_LIBS@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
|
@ -286,18 +377,21 @@ localedir = @localedir@
|
|||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
now = @now@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
pkgconfigdir = @pkgconfigdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
||||
systemdshutdowndir = @systemdshutdowndir@
|
||||
systemdsystemunitdir = @systemdsystemunitdir@
|
||||
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
|
@ -308,7 +402,7 @@ top_builddir = @top_builddir@
|
|||
top_srcdir = @top_srcdir@
|
||||
udevdir = @udevdir@
|
||||
INSTALL_0600 = $(INSTALL) -m 0600
|
||||
SECFILES = upsmon.conf.sample upsd.conf.sample upsd.users.sample
|
||||
SECFILES = upsd.conf.sample upsd.users.sample
|
||||
PUBFILES = nut.conf.sample ups.conf.sample
|
||||
CGIPUB = hosts.conf.sample upsset.conf.sample upsstats.html.sample \
|
||||
upsstats-single.html.sample
|
||||
|
@ -317,9 +411,15 @@ CGIPUB = hosts.conf.sample upsset.conf.sample upsstats.html.sample \
|
|||
@WITH_CGI_TRUE@CGI_INSTALL = $(CGIPUB)
|
||||
dist_sysconf_DATA = $(SECFILES) $(PUBFILES) $(CGI_INSTALL)
|
||||
nodist_sysconf_DATA = upssched.conf.sample upsmon.conf.sample
|
||||
SPELLCHECK_SRC = $(dist_sysconf_DATA) \
|
||||
upssched.conf.sample.in upsmon.conf.sample.in
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||
CLEANFILES = *.pdf *.html *-spellchecked
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .in .in-spellchecked .sample .sample-spellchecked
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
|
@ -332,14 +432,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
|||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu conf/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu conf/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
|
@ -402,14 +501,17 @@ uninstall-nodist_sysconfDATA:
|
|||
@list='$(nodist_sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(sysconfdir)'; $(am__uninstall_files_from_dir)
|
||||
tags: TAGS
|
||||
TAGS:
|
||||
tags TAGS:
|
||||
|
||||
ctags: CTAGS
|
||||
CTAGS:
|
||||
ctags CTAGS:
|
||||
|
||||
cscope cscopelist:
|
||||
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
distdir-am: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
|
@ -468,6 +570,7 @@ install-strip:
|
|||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
@ -476,6 +579,7 @@ distclean-generic:
|
|||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||
|
@ -545,18 +649,39 @@ uninstall-am: uninstall-dist_sysconfDATA uninstall-nodist_sysconfDATA
|
|||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
|
||||
distclean distclean-generic distclean-libtool distdir dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-dist_sysconfDATA \
|
||||
install-dvi install-dvi-am install-exec install-exec-am \
|
||||
install-html install-html-am install-info install-info-am \
|
||||
install-man install-nodist_sysconfDATA install-pdf \
|
||||
install-pdf-am install-ps install-ps-am install-strip \
|
||||
installcheck installcheck-am installdirs maintainer-clean \
|
||||
cscopelist-am ctags-am distclean distclean-generic \
|
||||
distclean-libtool distdir dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am \
|
||||
install-dist_sysconfDATA install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-info install-info-am install-man \
|
||||
install-nodist_sysconfDATA install-pdf install-pdf-am \
|
||||
install-ps install-ps-am install-strip installcheck \
|
||||
installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
||||
mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
|
||||
uninstall-dist_sysconfDATA uninstall-nodist_sysconfDATA
|
||||
mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
|
||||
uninstall-am uninstall-dist_sysconfDATA \
|
||||
uninstall-nodist_sysconfDATA
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
# NOTE: Due to portability, we do not use a GNU percent-wildcard extension:
|
||||
#%-spellchecked: % Makefile.am $(top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
|
||||
# $(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
# NOTE: Portable suffix rules do not allow prerequisites, so we shim them here
|
||||
# by a wildcard target in case the make implementation can put the two together.
|
||||
*-spellchecked: Makefile.am $(top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
|
||||
|
||||
.sample.sample-spellchecked:
|
||||
$(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
.in.in-spellchecked:
|
||||
$(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
spellcheck spellcheck-interactive spellcheck-sortdict:
|
||||
$(MAKE) -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC="$(SPELLCHECK_SRC)" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
|
|
|
@ -26,7 +26,14 @@
|
|||
# - netclient: this mode only requires upsmon.
|
||||
#
|
||||
# IMPORTANT NOTE:
|
||||
# This file is intended to be sourced by shell scripts.
|
||||
# This file is intended to be sourced by standard POSIX shell scripts (so
|
||||
# there is no guaranteed `export VAR=VAL` syntax) and by systemd on Linux.
|
||||
# You MUST NOT use spaces around the equal sign!
|
||||
|
||||
MODE=none
|
||||
|
||||
# Uncomment this to allow starting the service even if ups.conf has no device
|
||||
# sections at the moment. This environment variable overrides the built-in
|
||||
# "false" and an optional same-named default flag that can be set in upsd.conf:
|
||||
#ALLOW_NO_DEVICE=true
|
||||
#export ALLOW_NO_DEVICE
|
||||
|
|
|
@ -30,17 +30,97 @@
|
|||
#
|
||||
# If you have a UPS called snoopy, your section header would be "[snoopy]".
|
||||
# On a system called "doghouse", the line in your upsmon.conf to monitor
|
||||
# it would look something like this:
|
||||
# and manage it would look something like this:
|
||||
#
|
||||
# MONITOR snoopy@doghouse 1 upsmonuser mypassword master
|
||||
# MONITOR snoopy@doghouse 1 upsmonuser mypassword primary
|
||||
#
|
||||
# It might look like this if monitoring in slave mode:
|
||||
# It might look like this if monitoring in "secondary" mode (without any
|
||||
# ability to directly manage the UPS) from a different system:
|
||||
#
|
||||
# MONITOR snoopy@doghouse 1 upsmonuser mypassword slave
|
||||
# MONITOR snoopy@doghouse 1 upsmonuser mypassword secondary
|
||||
#
|
||||
# Configuration directives
|
||||
# ------------------------
|
||||
#
|
||||
# These directives are used by upsdrvctl only and should be specified outside
|
||||
# of a driver definition:
|
||||
#
|
||||
# maxretry: OPTIONAL. Specify the number of attempts to start the driver(s),
|
||||
# in case of failure, before giving up. A delay of 'retrydelay' is
|
||||
# inserted between each attempt. Caution should be taken when using
|
||||
# this option, since it can impact the time taken by your system to
|
||||
# start.
|
||||
#
|
||||
# The built-in default is 1 attempt.
|
||||
#
|
||||
# retrydelay: OPTIONAL. Specify the delay between each restart attempt of the
|
||||
# driver(s), as specified by 'maxretry'. Caution should be taken
|
||||
# when using this option, since it can impact the time taken by your
|
||||
# system to start.
|
||||
#
|
||||
# The default is 5 seconds.
|
||||
#
|
||||
# chroot: OPTIONAL. Used for securing. See man page for details.
|
||||
#
|
||||
# driverpath: OPTIONAL. Used for custom setups. See man page for details.
|
||||
#
|
||||
# nowait: OPTIONAL. Tell upsdrvctl to not wait at all for the driver(s)
|
||||
# to execute the requested command. Fire and forget.
|
||||
#
|
||||
# pollinterval: OPTIONAL. The status of the UPS will be refreshed after a
|
||||
# maximum delay which is controlled by this setting (default
|
||||
# 2 seconds). This may be useful if the driver is creating too
|
||||
# much of a load on your system or network.
|
||||
# Note that some drivers also have an option called *pollfreq*
|
||||
# which controls how frequently some of the less critical
|
||||
# parameters are polled. See respective driver man pages.
|
||||
#
|
||||
|
||||
# Set maxretry to 3 by default, this should mitigate race with slow devices:
|
||||
maxretry = 3
|
||||
|
||||
# These directives can be set outside and inside a driver definition, with
|
||||
# slightly different meanings per context:
|
||||
#
|
||||
# maxstartdelay: OPTIONAL. This can be set as a global variable
|
||||
# above your first UPS definition and it can also be
|
||||
# set in a UPS section. This value controls how long
|
||||
# upsdrvctl will wait for the driver to finish starting.
|
||||
# This keeps your system from getting stuck due to a
|
||||
# broken driver or UPS.
|
||||
# The default is 45 seconds.
|
||||
#
|
||||
# debug_min: OPTIONAL. Specify a minimum debug level for all driver daemons
|
||||
# (when specified at global level), or for this driver daemon
|
||||
# (when specified in a driver section), e.g. for troubleshooting
|
||||
# a deployment. This does not directly impact the foreground or
|
||||
# background running mode. If both the global and driver level
|
||||
# `debug_min` are set, the driver-level setting takes precedence.
|
||||
# Command-line option `-D` can only increase this verbosity level.
|
||||
#
|
||||
# user, group: OPTIONAL. Overrides the compiled-in (also global-section,
|
||||
# when used in driver section) default unprivileged user/group
|
||||
# name for NUT device driver. Impacts access rights used for
|
||||
# the socket file access (group) and communication ports (user).
|
||||
#
|
||||
# synchronous: OPTIONAL. The driver work by default in asynchronous
|
||||
# mode (like *no*) with fallback to synchronous if sending
|
||||
# fails (i.e *synchronous=auto*). This means that all data
|
||||
# are pushed by the driver on the communication socket to
|
||||
# upsd (Unix socket on Unix, Named pipe on Windows) without
|
||||
# waiting for these data to be actually consumed. With
|
||||
# some HW, such as ePDUs, that can produce a lot of data,
|
||||
# asynchronous mode may cause some congestion, resulting in
|
||||
# the socket to be full, and the driver to appear as not
|
||||
# connected. By enabling the 'synchronous' flag
|
||||
# (value = 'yes'), the driver will wait for data to be
|
||||
# consumed by upsd, prior to publishing more. This can be
|
||||
# enabled either globally or per driver.
|
||||
#
|
||||
# The default is 'no' (i.e. asynchronous mode) for backward
|
||||
# compatibility of the driver behavior.
|
||||
#
|
||||
|
||||
# These directives are common to all drivers that support ups.conf:
|
||||
#
|
||||
# driver: REQUIRED. Specify the program to run to talk to this UPS.
|
||||
|
@ -49,13 +129,15 @@
|
|||
# port: REQUIRED. The serial port where your UPS is connected.
|
||||
# /dev/ttyS0 is usually the first port on Linux boxes, for example.
|
||||
#
|
||||
# sdorder: optional. When you have multiple UPSes on your system, you
|
||||
# sdorder: OPTIONAL. When you have multiple UPSes on your system, you
|
||||
# usually need to turn them off in a certain order. upsdrvctl
|
||||
# shuts down all the 0s, then the 1s, 2s, and so on. To exclude
|
||||
# a UPS from the shutdown sequence, set this to -1.
|
||||
#
|
||||
# The default value for this parameter is 0.
|
||||
#
|
||||
# desc: optional, to keep a note of the UPS purpose, location, etc.
|
||||
#
|
||||
# nolock: optional, and not recommended for use in this file.
|
||||
#
|
||||
# If you put nolock in here, the driver will not lock the
|
||||
|
@ -66,15 +148,31 @@
|
|||
# This is only intended to be used on systems where locking
|
||||
# absolutely must be disabled for the software to work.
|
||||
#
|
||||
# maxstartdelay: optional. This can be set as a global variable
|
||||
# above your first UPS definition and it can also be
|
||||
# set in a UPS section. This value controls how long
|
||||
# upsdrvctl will wait for the driver to finish starting.
|
||||
# This keeps your system from getting stuck due to a
|
||||
# broken driver or UPS.
|
||||
# ignorelb: OPTIONAL. Ignore low battery condition reported by device,
|
||||
# and evaluate remaining battery charge or runtime instead.
|
||||
# See man page for details.
|
||||
#
|
||||
# The default is 45 seconds.
|
||||
# usb_set_altinterface(=num): OPTIONAL. Require that NUT calls this method
|
||||
# to set the interface, even if 0 (default). Some devices require
|
||||
# the call to initialize; others however can get stuck due to it -
|
||||
# so it is not called by default. Yet others can be composite
|
||||
# devices which use a non-zero interface to represent the UPS.
|
||||
#
|
||||
# default.<variable>: OPTIONAL. Set a default value for <variable> which is
|
||||
# used in case the UPS doesn't provide a value, but which will be
|
||||
# overwritten if a value is available from the UPS, e.g.:
|
||||
# default.input.voltage.nominal = 230
|
||||
# will report the nominal input voltage to be 230, unless the UPS
|
||||
# eventually tells us differently.
|
||||
#
|
||||
# override.<variable>: OPTIONAL. Set a value for <value> that overrides
|
||||
# (for NUT) any value that may be read from the UPS.
|
||||
# Used for overriding values from the UPS that are clearly wrong
|
||||
# (e.g. some devices report wrong values for battery voltage):
|
||||
# override.battery.voltage.nominal = 12
|
||||
# Use with caution! This will only change the appearance of the
|
||||
# variable to the outside world (and NUT calculations), internally
|
||||
# in the UPS the original value is used.
|
||||
#
|
||||
# Anything else is passed through to the hardware-specific part of
|
||||
# the driver.
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
# It should only be readable by the user that upsd becomes. See the FAQ.
|
||||
#
|
||||
# Each entry below provides usage and default value.
|
||||
#
|
||||
# For more information, refer to upsd.conf manual page.
|
||||
|
||||
# =======================================================================
|
||||
# MAXAGE <seconds>
|
||||
|
@ -19,6 +21,29 @@
|
|||
# the data fresh within the normal 15 second interval. Watch the syslog
|
||||
# for notifications from upsd about staleness.
|
||||
|
||||
# =======================================================================
|
||||
# TRACKINGDELAY <seconds>
|
||||
# TRACKINGDELAY 3600
|
||||
#
|
||||
# This defaults to 1 hour. When instant commands and variables setting status
|
||||
# tracking is enabled, status execution information are kept during this
|
||||
# amount of time, and then cleaned up.
|
||||
|
||||
# =======================================================================
|
||||
# ALLOW_NO_DEVICE <Boolean>
|
||||
# ALLOW_NO_DEVICE true
|
||||
#
|
||||
# Normally upsd requires that at least one device section is defined in ups.conf
|
||||
# when the daemon starts, to serve its data. For automatically managed services
|
||||
# it may be preferred to have upsd always running, and reload the configuration
|
||||
# when power devices become defined.
|
||||
#
|
||||
# Boolean values 'true', 'yes', 'on' and '1' mean that the server would not
|
||||
# refuse to start with zero device sections found in ups.conf.
|
||||
#
|
||||
# Boolean values 'false', 'no', 'off' and '0' mean that the server should refuse
|
||||
# to start if zero device sections were found in ups.conf. This is the default.
|
||||
|
||||
# =======================================================================
|
||||
# STATEPATH <path>
|
||||
# STATEPATH /var/run/nut
|
||||
|
@ -27,15 +52,17 @@
|
|||
# than the default that was compiled into the program.
|
||||
|
||||
# =======================================================================
|
||||
# LISTEN <address> [<port>]
|
||||
# LISTEN <IP address or name> [<port>]
|
||||
# LISTEN 127.0.0.1 3493
|
||||
# LISTEN ::1 3493
|
||||
# LISTEN myhostname 83493
|
||||
# LISTEN myhostname.mydomain
|
||||
#
|
||||
# This defaults to the localhost listening addresses and port 3493.
|
||||
# In case of IP v4 or v6 disabled kernel, only the available one will be used.
|
||||
#
|
||||
# You may specify each interface you want upsd to listen on for connections,
|
||||
# optionally with a port number.
|
||||
# You may specify each interface IP address or name that you want upsd to
|
||||
# listen on for connections, optionally with a port number.
|
||||
#
|
||||
# You may need this if you have multiple interfaces on your machine and
|
||||
# you don't want upsd to listen to all interfaces (for instance on a
|
||||
|
@ -74,7 +101,7 @@
|
|||
#
|
||||
# When compiled with SSL support with NSS backend,
|
||||
# you can enter the certificate path here.
|
||||
# Certificates are stored in a dedicated database (splitted in 3 files).
|
||||
# Certificates are stored in a dedicated database (split into 3 files).
|
||||
# Specify the path of the database directory.
|
||||
#
|
||||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||
|
@ -107,3 +134,35 @@
|
|||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||
# for more information on the SSL support in NUT.
|
||||
|
||||
# =======================================================================
|
||||
# DISABLE_WEAK_SSL <Boolean>
|
||||
# DISABLE_WEAK_SSL true
|
||||
#
|
||||
# Tell upsd to disable older/weak SSL/TLS protocols and ciphers.
|
||||
#
|
||||
# With relatively recent versions of OpenSSL or NSS it will be restricted
|
||||
# to TLSv1.2 or better.
|
||||
#
|
||||
# Unless you have really ancient clients, you probably want to enable this.
|
||||
# Currently disabled by default to ensure compatibility with existing setups.
|
||||
|
||||
# =======================================================================
|
||||
# DEBUG_MIN <Integer>
|
||||
# DEBUG_MIN 2
|
||||
#
|
||||
# Optionally specify a minimum debug level for `upsd` data daemon, e.g. for
|
||||
# troubleshooting a deployment, without impacting foreground or background
|
||||
# running mode directly, and without need to edit init-scripts or service
|
||||
# unit definitions. Note that command-line option `-D` can only increase
|
||||
# this verbosity level.
|
||||
#
|
||||
# NOTE: if the running daemon receives a `reload` command, presence of the
|
||||
# `DEBUG_MIN NUMBER` value in the configuration file can be used to tune
|
||||
# debugging verbosity in the running service daemon (it is recommended to
|
||||
# comment it away or set the minimum to explicit zero when done, to avoid
|
||||
# huge journals and I/O system abuse). Keep in mind that for this run-time
|
||||
# tuning, the `DEBUG_MIN` value *present* in *reloaded* configuration files
|
||||
# is applied instantly and overrides any previously set value, from file
|
||||
# or CLI options, regardless of older logging level being higher or lower
|
||||
# than the newly found number; a missing (or commented away) value however
|
||||
# does not change the previously active logging verbosity.
|
||||
|
|
|
@ -63,10 +63,13 @@
|
|||
#
|
||||
# [upsmon]
|
||||
# password = pass
|
||||
# upsmon master
|
||||
# upsmon primary
|
||||
# or
|
||||
# upsmon slave
|
||||
# upsmon secondary
|
||||
#
|
||||
# The matching MONITOR line in your upsmon.conf would look like this:
|
||||
#
|
||||
# MONITOR myups@localhost 1 upsmon pass master (or slave)
|
||||
# MONITOR myups@localhost 1 upsmon pass primary (or secondary)
|
||||
#
|
||||
# See comments in the upsmon.conf(.sample) file for details about this
|
||||
# keyword and the difference of NUT secondary and primary systems.
|
||||
|
|
|
@ -1,377 +0,0 @@
|
|||
# Network UPS Tools: example upsmon configuration
|
||||
#
|
||||
# This file contains passwords, so keep it secure.
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# RUN_AS_USER <userid>
|
||||
#
|
||||
# By default, upsmon splits into two processes. One stays as root and
|
||||
# waits to run the SHUTDOWNCMD. The other one switches to another userid
|
||||
# and does everything else.
|
||||
#
|
||||
# The default nonprivileged user is set at compile-time with
|
||||
# 'configure --with-user=...'.
|
||||
#
|
||||
# You can override it with '-u <user>' when starting upsmon, or just
|
||||
# define it here for convenience.
|
||||
#
|
||||
# Note: if you plan to use the reload feature, this file (upsmon.conf)
|
||||
# must be readable by this user! Since it contains passwords, DO NOT
|
||||
# make it world-readable. Also, do not make it writable by the upsmon
|
||||
# user, since it creates an opportunity for an attack by changing the
|
||||
# SHUTDOWNCMD to something malicious.
|
||||
#
|
||||
# For best results, you should create a new normal user like "nutmon",
|
||||
# and make it a member of a "nut" group or similar. Then specify it
|
||||
# here and grant read access to the upsmon.conf for that group.
|
||||
#
|
||||
# This user should not have write access to upsmon.conf.
|
||||
#
|
||||
# RUN_AS_USER nut
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# MONITOR <system> <powervalue> <username> <password> ("master"|"slave")
|
||||
#
|
||||
# List systems you want to monitor. Not all of these may supply power
|
||||
# to the system running upsmon, but if you want to watch it, it has to
|
||||
# be in this section.
|
||||
#
|
||||
# You must have at least one of these declared.
|
||||
#
|
||||
# <system> is a UPS identifier in the form <upsname>@<hostname>[:<port>]
|
||||
# like ups@localhost, su700@mybox, etc.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# - "su700@mybox" means a UPS called "su700" on a system called "mybox"
|
||||
#
|
||||
# - "fenton@bigbox:5678" is a UPS called "fenton" on a system called
|
||||
# "bigbox" which runs upsd on port "5678".
|
||||
#
|
||||
# The UPS names like "su700" and "fenton" are set in your ups.conf
|
||||
# in [brackets] which identify a section for a particular driver.
|
||||
#
|
||||
# If the ups.conf on host "doghouse" has a section called "snoopy", the
|
||||
# identifier for it would be "snoopy@doghouse".
|
||||
#
|
||||
# <powervalue> is an integer - the number of power supplies that this UPS
|
||||
# feeds on this system. Most computers only have one power supply, so this
|
||||
# is normally set to 1. You need a pretty big or special box to have any
|
||||
# other value here.
|
||||
#
|
||||
# You can also set this to 0 for a system that doesn't supply any power,
|
||||
# but you still want to monitor. Use this when you want to hear about
|
||||
# changes for a given UPS without shutting down when it goes critical,
|
||||
# unless <powervalue> is 0.
|
||||
#
|
||||
# <username> and <password> must match an entry in that system's
|
||||
# upsd.users. If your username is "monmaster" and your password is
|
||||
# "blah", the upsd.users would look like this:
|
||||
#
|
||||
# [monmaster]
|
||||
# password = blah
|
||||
# upsmon master (or slave)
|
||||
#
|
||||
# "master" means this system will shutdown last, allowing the slaves
|
||||
# time to shutdown first.
|
||||
#
|
||||
# "slave" means this system shuts down immediately when power goes critical.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# MONITOR myups@bigserver 1 monmaster blah master
|
||||
# MONITOR su700@server.example.com 1 upsmon secretpass slave
|
||||
# MONITOR myups@localhost 1 upsmon pass master (or slave)
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# MINSUPPLIES <num>
|
||||
#
|
||||
# Give the number of power supplies that must be receiving power to keep
|
||||
# this system running. Most systems have one power supply, so you would
|
||||
# put "1" in this field.
|
||||
#
|
||||
# Large/expensive server type systems usually have more, and can run with
|
||||
# a few missing. The HP NetServer LH4 can run with 2 out of 4, for example,
|
||||
# so you'd set that to 2. The idea is to keep the box running as long
|
||||
# as possible, right?
|
||||
#
|
||||
# Obviously you have to put the redundant supplies on different UPS circuits
|
||||
# for this to make sense! See big-servers.txt in the docs subdirectory
|
||||
# for more information and ideas on how to use this feature.
|
||||
|
||||
MINSUPPLIES 1
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# SHUTDOWNCMD "<command>"
|
||||
#
|
||||
# upsmon runs this command when the system needs to be brought down.
|
||||
#
|
||||
# This should work just about everywhere ... if it doesn't, well, change it.
|
||||
|
||||
SHUTDOWNCMD "/sbin/shutdown -h +0"
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# NOTIFYCMD <command>
|
||||
#
|
||||
# upsmon calls this to send messages when things happen
|
||||
#
|
||||
# This command is called with the full text of the message as one argument.
|
||||
# The environment string NOTIFYTYPE will contain the type string of
|
||||
# whatever caused this event to happen.
|
||||
#
|
||||
# Note that this is only called for NOTIFY events that have EXEC set with
|
||||
# NOTIFYFLAG. See NOTIFYFLAG below for more details.
|
||||
#
|
||||
# Making this some sort of shell script might not be a bad idea. For more
|
||||
# information and ideas, see docs/scheduling.txt
|
||||
#
|
||||
# Example:
|
||||
# NOTIFYCMD /usr/local/ups/bin/notifyme
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# POLLFREQ <n>
|
||||
#
|
||||
# Polling frequency for normal activities, measured in seconds.
|
||||
#
|
||||
# Adjust this to keep upsmon from flooding your network, but don't make
|
||||
# it too high or it may miss certain short-lived power events.
|
||||
|
||||
POLLFREQ 5
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# POLLFREQALERT <n>
|
||||
#
|
||||
# Polling frequency in seconds while UPS on battery.
|
||||
#
|
||||
# You can make this number lower than POLLFREQ, which will make updates
|
||||
# faster when any UPS is running on battery. This is a good way to tune
|
||||
# network load if you have a lot of these things running.
|
||||
#
|
||||
# The default is 5 seconds for both this and POLLFREQ.
|
||||
|
||||
POLLFREQALERT 5
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# HOSTSYNC - How long upsmon will wait before giving up on another upsmon
|
||||
#
|
||||
# The master upsmon process uses this number when waiting for slaves to
|
||||
# disconnect once it has set the forced shutdown (FSD) flag. If they
|
||||
# don't disconnect after this many seconds, it goes on without them.
|
||||
#
|
||||
# Similarly, upsmon slave processes wait up to this interval for the
|
||||
# master upsmon to set FSD when a UPS they are monitoring goes critical -
|
||||
# that is, on battery and low battery. If the master doesn't do its job,
|
||||
# the slaves will shut down anyway to avoid damage to the file systems.
|
||||
#
|
||||
# This "wait for FSD" is done to avoid races where the status changes
|
||||
# to critical and back between polls by the master.
|
||||
|
||||
HOSTSYNC 15
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# DEADTIME - Interval to wait before declaring a stale ups "dead"
|
||||
#
|
||||
# upsmon requires a UPS to provide status information every few seconds
|
||||
# (see POLLFREQ and POLLFREQALERT) to keep things updated. If the status
|
||||
# fetch fails, the UPS is marked stale. If it stays stale for more than
|
||||
# DEADTIME seconds, the UPS is marked dead.
|
||||
#
|
||||
# A dead UPS that was last known to be on battery is assumed to have gone
|
||||
# to a low battery condition. This may force a shutdown if it is providing
|
||||
# a critical amount of power to your system.
|
||||
#
|
||||
# Note: DEADTIME should be a multiple of POLLFREQ and POLLFREQALERT.
|
||||
# Otherwise you'll have "dead" UPSes simply because upsmon isn't polling
|
||||
# them quickly enough. Rule of thumb: take the larger of the two
|
||||
# POLLFREQ values, and multiply by 3.
|
||||
|
||||
DEADTIME 15
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# POWERDOWNFLAG - Flag file for forcing UPS shutdown on the master system
|
||||
#
|
||||
# upsmon will create a file with this name in master mode when it's time
|
||||
# to shut down the load. You should check for this file's existence in
|
||||
# your shutdown scripts and run 'upsdrvctl shutdown' if it exists.
|
||||
#
|
||||
# See the shutdown.txt file in the docs subdirectory for more information.
|
||||
|
||||
POWERDOWNFLAG /etc/nut/killpower
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# NOTIFYMSG - change messages sent by upsmon when certain events occur
|
||||
#
|
||||
# You can change the default messages to something else if you like.
|
||||
#
|
||||
# NOTIFYMSG <notify type> "message"
|
||||
#
|
||||
# NOTIFYMSG ONLINE "UPS %s on line power"
|
||||
# NOTIFYMSG ONBATT "UPS %s on battery"
|
||||
# NOTIFYMSG LOWBATT "UPS %s battery is low"
|
||||
# NOTIFYMSG FSD "UPS %s: forced shutdown in progress"
|
||||
# NOTIFYMSG COMMOK "Communications with UPS %s established"
|
||||
# NOTIFYMSG COMMBAD "Communications with UPS %s lost"
|
||||
# NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding"
|
||||
# NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced"
|
||||
# NOTIFYMSG NOCOMM "UPS %s is unavailable"
|
||||
# NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible"
|
||||
#
|
||||
# Note that %s is replaced with the identifier of the UPS in question.
|
||||
#
|
||||
# Possible values for <notify type>:
|
||||
#
|
||||
# ONLINE : UPS is back online
|
||||
# ONBATT : UPS is on battery
|
||||
# LOWBATT : UPS has a low battery (if also on battery, it's "critical")
|
||||
# FSD : UPS is being shutdown by the master (FSD = "Forced Shutdown")
|
||||
# COMMOK : Communications established with the UPS
|
||||
# COMMBAD : Communications lost to the UPS
|
||||
# SHUTDOWN : The system is being shutdown
|
||||
# REPLBATT : The UPS battery is bad and needs to be replaced
|
||||
# NOCOMM : A UPS is unavailable (can't be contacted for monitoring)
|
||||
# NOPARENT : The process that shuts down the system has died (shutdown impossible)
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# NOTIFYFLAG - change behavior of upsmon when NOTIFY events occur
|
||||
#
|
||||
# By default, upsmon sends walls (global messages to all logged in users)
|
||||
# and writes to the syslog when things happen. You can change this.
|
||||
#
|
||||
# NOTIFYFLAG <notify type> <flag>[+<flag>][+<flag>] ...
|
||||
#
|
||||
# NOTIFYFLAG ONLINE SYSLOG+WALL
|
||||
# NOTIFYFLAG ONBATT SYSLOG+WALL
|
||||
# NOTIFYFLAG LOWBATT SYSLOG+WALL
|
||||
# NOTIFYFLAG FSD SYSLOG+WALL
|
||||
# NOTIFYFLAG COMMOK SYSLOG+WALL
|
||||
# NOTIFYFLAG COMMBAD SYSLOG+WALL
|
||||
# NOTIFYFLAG SHUTDOWN SYSLOG+WALL
|
||||
# NOTIFYFLAG REPLBATT SYSLOG+WALL
|
||||
# NOTIFYFLAG NOCOMM SYSLOG+WALL
|
||||
# NOTIFYFLAG NOPARENT SYSLOG+WALL
|
||||
#
|
||||
# Possible values for the flags:
|
||||
#
|
||||
# SYSLOG - Write the message in the syslog
|
||||
# WALL - Write the message to all users on the system
|
||||
# EXEC - Execute NOTIFYCMD (see above) with the message
|
||||
# IGNORE - Don't do anything
|
||||
#
|
||||
# If you use IGNORE, don't use any other flags on the same line.
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# RBWARNTIME - replace battery warning time in seconds
|
||||
#
|
||||
# upsmon will normally warn you about a battery that needs to be replaced
|
||||
# every 43200 seconds, which is 12 hours. It does this by triggering a
|
||||
# NOTIFY_REPLBATT which is then handled by the usual notify structure
|
||||
# you've defined above.
|
||||
#
|
||||
# If this number is not to your liking, override it here.
|
||||
|
||||
RBWARNTIME 43200
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# NOCOMMWARNTIME - no communications warning time in seconds
|
||||
#
|
||||
# upsmon will let you know through the usual notify system if it can't
|
||||
# talk to any of the UPS entries that are defined in this file. It will
|
||||
# trigger a NOTIFY_NOCOMM by default every 300 seconds unless you
|
||||
# change the interval with this directive.
|
||||
|
||||
NOCOMMWARNTIME 300
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# FINALDELAY - last sleep interval before shutting down the system
|
||||
#
|
||||
# On a master, upsmon will wait this long after sending the NOTIFY_SHUTDOWN
|
||||
# before executing your SHUTDOWNCMD. If you need to do something in between
|
||||
# those events, increase this number. Remember, at this point your UPS is
|
||||
# almost depleted, so don't make this too high.
|
||||
#
|
||||
# Alternatively, you can set this very low so you don't wait around when
|
||||
# it's time to shut down. Some UPSes don't give much warning for low
|
||||
# battery and will require a value of 0 here for a safe shutdown.
|
||||
#
|
||||
# Note: If FINALDELAY on the slave is greater than HOSTSYNC on the master,
|
||||
# the master will give up waiting for the slave to disconnect.
|
||||
|
||||
FINALDELAY 5
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# CERTPATH - path to certificates (database directory or directory with CA's)
|
||||
#
|
||||
# When compiled with SSL support, you can enter the certificate path here.
|
||||
#
|
||||
# With NSS:
|
||||
# Certificates are stored in a dedicated database (splitted in 3 files).
|
||||
# Specify the path of the database directory.
|
||||
#
|
||||
# CERTPATH /etc/nut/cert/upsmon
|
||||
#
|
||||
# With OpenSSL:
|
||||
# Directory containing CA certificates in PEM format, used to verify
|
||||
# the server certificate presented by the upsd server. The files each
|
||||
# contain one CA certificate. The files are looked up by the CA subject
|
||||
# name hash value, which must hence be available.
|
||||
#
|
||||
# CERTPATH /usr/ssl/certs
|
||||
#
|
||||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||
# for more information on the SSL support in NUT.
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# CERTIDENT - self certificate name and database password
|
||||
# CERTIDENT <certificate name> <database password>
|
||||
#
|
||||
# When compiled with SSL support with NSS, you can specify the certificate
|
||||
# name to retrieve from database to authenticate itself and the password
|
||||
# required to access certificate related private key.
|
||||
#
|
||||
# CERTIDENT "my nut monitor" "MyPasSw0rD"
|
||||
#
|
||||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||
# for more information on the SSL support in NUT.
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# CERTHOST - security properties for an host
|
||||
# CERTHOST <hostname> <certificate name> <certverify> <forcessl>
|
||||
#
|
||||
# When compiled with SSL support with NSS, you can specify security directive
|
||||
# for each server you can contact.
|
||||
# Each entry maps server name with the expected certificate name and flags
|
||||
# indicating if the server certificate is verified and if the connection
|
||||
# must be secure.
|
||||
#
|
||||
# CERTHOST localhost "My nut server" 1 1
|
||||
#
|
||||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||
# for more information on the SSL support in NUT.
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# CERTVERIFY - make upsmon verify all connections with certificates
|
||||
# CERTVERIFY 1
|
||||
#
|
||||
# When compiled with SSL support, make upsmon verify all connections with
|
||||
# certificates.
|
||||
# Without this, there is no guarantee that the upsd is the right host.
|
||||
# Enabling this greatly reduces the risk of man in the middle attacks.
|
||||
# This effectively forces the use of SSL, so don't use this unless
|
||||
# all of your upsd hosts are ready for SSL and have their certificates
|
||||
# in order.
|
||||
# When compiled with NSS support of SSL, can be overriden for host
|
||||
# specified with a CERTHOST directive.
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# FORCESSL - force upsmon to use SSL
|
||||
# FORCESSL 1
|
||||
#
|
||||
# When compiled with SSL, specify that a secured connection must be used
|
||||
# to communicate with upsd.
|
||||
# If you don't use 'CERTVERIFY 1', then this will at least make sure
|
||||
# that nobody can sniff your sessions without a large effort. Setting
|
||||
# this will make upsmon drop connections if the remote upsd doesn't
|
||||
# support SSL, so don't use it unless all of them have it running.
|
||||
# When compiled with NSS support of SSL, can be overriden for host
|
||||
# specified with a CERTHOST directive.
|
|
@ -9,8 +9,8 @@
|
|||
# waits to run the SHUTDOWNCMD. The other one switches to another userid
|
||||
# and does everything else.
|
||||
#
|
||||
# The default nonprivileged user is set at compile-time with
|
||||
# 'configure --with-user=...'.
|
||||
# The default unprivileged user is set at compile-time with the option
|
||||
# 'configure --with-user=...'
|
||||
#
|
||||
# You can override it with '-u <user>' when starting upsmon, or just
|
||||
# define it here for convenience.
|
||||
|
@ -30,7 +30,7 @@
|
|||
# RUN_AS_USER @RUN_AS_USER@
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# MONITOR <system> <powervalue> <username> <password> ("master"|"slave")
|
||||
# MONITOR <system> <powervalue> <username> <password> ("primary"|"secondary")
|
||||
#
|
||||
# List systems you want to monitor. Not all of these may supply power
|
||||
# to the system running upsmon, but if you want to watch it, it has to
|
||||
|
@ -55,33 +55,66 @@
|
|||
# identifier for it would be "snoopy@doghouse".
|
||||
#
|
||||
# <powervalue> is an integer - the number of power supplies that this UPS
|
||||
# feeds on this system. Most computers only have one power supply, so this
|
||||
# is normally set to 1. You need a pretty big or special box to have any
|
||||
# other value here.
|
||||
# feeds on this system. Most personal computers only have one power supply,
|
||||
# so this value is normally set to 1, while most modern servers have at least
|
||||
# two. You need a pretty big or special box to have any other value here.
|
||||
#
|
||||
# You can also set this to 0 for a system that doesn't supply any power,
|
||||
# but you still want to monitor. Use this when you want to hear about
|
||||
# changes for a given UPS without shutting down when it goes critical,
|
||||
# unless <powervalue> is 0.
|
||||
# You can also set this to 0 for a system that doesn't take any power
|
||||
# from the MONITORed supply, which you still want to monitor (e.g. for an
|
||||
# administrative workstation fed from a different circuit than the datacenter
|
||||
# servers it monitors). Use <powervalue> if 0 when you want to hear about
|
||||
# changes for a given UPS without shutting down when it goes critical.
|
||||
#
|
||||
# <username> and <password> must match an entry in that system's
|
||||
# upsd.users. If your username is "monmaster" and your password is
|
||||
# upsd.users. If your username is "upsmon" and your password is
|
||||
# "blah", the upsd.users would look like this:
|
||||
#
|
||||
# [monmaster]
|
||||
# [upsmon]
|
||||
# password = blah
|
||||
# upsmon master (or slave)
|
||||
# upsmon primary # (or secondary)
|
||||
#
|
||||
# "master" means this system will shutdown last, allowing the slaves
|
||||
# time to shutdown first.
|
||||
# "primary" means this system will shutdown last, allowing the secondary
|
||||
# systems time to shutdown first.
|
||||
#
|
||||
# "slave" means this system shuts down immediately when power goes critical.
|
||||
# "secondary" means this system shuts down immediately when power goes
|
||||
# critical and less than MINSUPPLIES power sources have reliable input feeds.
|
||||
#
|
||||
# The general assumption is that the "primary" system is the one with direct
|
||||
# connection to an UPS (such as serial or USB cable), so the primary system
|
||||
# runs the NUT driver and 'upsd' server locally and can manage the device,
|
||||
# and it would often tell the UPS to completely power itself off as a step
|
||||
# in power-race avoidance (see POWERDOWNFLAG for details).
|
||||
#
|
||||
# Also, since the primary system stays up the longest, it suffers higher risks
|
||||
# of ungraceful shutdown if the estimation of remaining runtime (or of the
|
||||
# time it takes to shut down this system) was guessed wrong. By consequence,
|
||||
# the "secondary" systems typically monitor the power environment state
|
||||
# through the 'upsd' processes running on the remote (often "primary") systems
|
||||
# and do not directly interact with an UPS (no local NUT drivers are running
|
||||
# on the secondary systems). As such, secondaries typically shut down as
|
||||
# soon as there is a sufficiently long power outage, or a low-battery alert
|
||||
# from the UPS, or a loss of connection to the primary while the power was
|
||||
# last known to be missing.
|
||||
#
|
||||
# This assumption and configuration can also make sense for networked UPSes,
|
||||
# where a rack full of servers might overload the communications capacity
|
||||
# of the networked management card on the UPS - in this case you might either
|
||||
# reduce the 'snmp-ups' or 'netxml-ups' driver polling rate, or dedicate a
|
||||
# "primary" server and set up the rest as "secondary" systems.
|
||||
#
|
||||
# In case of such large setups as mentioned above, beware also that shutdown
|
||||
# times of the rack done all at once can substantially differ from smaller
|
||||
# scale experiments with single-server shutdowns, since systems can compete
|
||||
# for shared storage and other limited resources as they go down (and also
|
||||
# not everyone may safely shut down simultaneously - e.g. a NAS or DB server
|
||||
# would better go down after all its clients). You would be well served by
|
||||
# higher-end UPSes with manageable thresholds to declare a critical state.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# MONITOR myups@bigserver 1 monmaster blah master
|
||||
# MONITOR su700@server.example.com 1 upsmon secretpass slave
|
||||
# MONITOR myups@localhost 1 upsmon pass master (or slave)
|
||||
# MONITOR myups@bigserver 1 upswired blah primary
|
||||
# MONITOR su700@server.example.com 1 upsmon secretpass secondary
|
||||
# MONITOR myups@localhost 1 upsmon pass primary # (or secondary)
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# MINSUPPLIES <num>
|
||||
|
@ -91,7 +124,7 @@
|
|||
# put "1" in this field.
|
||||
#
|
||||
# Large/expensive server type systems usually have more, and can run with
|
||||
# a few missing. The HP NetServer LH4 can run with 2 out of 4, for example,
|
||||
# a few missing. Some of these can run with 2 out of 4, for example,
|
||||
# so you'd set that to 2. The idea is to keep the box running as long
|
||||
# as possible, right?
|
||||
#
|
||||
|
@ -106,7 +139,15 @@ MINSUPPLIES 1
|
|||
#
|
||||
# upsmon runs this command when the system needs to be brought down.
|
||||
#
|
||||
# This should work just about everywhere ... if it doesn't, well, change it.
|
||||
# This should work just about everywhere ... if it doesn't, well, change it,
|
||||
# perhaps to a more complicated custom script.
|
||||
#
|
||||
# Note that while you experiment with the initial setup and want to test how
|
||||
# your configuration reacts to power state changes and ultimately when power
|
||||
# is reported to go critical, but do not want your system to actually turn
|
||||
# off, consider setting the SHUTDOWNCMD temporarily to do something benign -
|
||||
# such as posting a message with 'logger' or 'wall' or 'mailx'. Do be careful
|
||||
# to plug the UPS back into the wall in a timely fashion.
|
||||
|
||||
SHUTDOWNCMD "/sbin/shutdown -h +0"
|
||||
|
||||
|
@ -115,15 +156,22 @@ SHUTDOWNCMD "/sbin/shutdown -h +0"
|
|||
#
|
||||
# upsmon calls this to send messages when things happen
|
||||
#
|
||||
# This command is called with the full text of the message as one argument.
|
||||
# This command is called with the full text of the message (from NOTIFYMSG)
|
||||
# as one argument.
|
||||
#
|
||||
# The environment string NOTIFYTYPE will contain the type string of
|
||||
# whatever caused this event to happen.
|
||||
#
|
||||
# The environment string UPSNAME will contain the name of the system/device
|
||||
# that generated the change.
|
||||
#
|
||||
# Note that this is only called for NOTIFY events that have EXEC set with
|
||||
# NOTIFYFLAG. See NOTIFYFLAG below for more details.
|
||||
#
|
||||
# Making this some sort of shell script might not be a bad idea. For more
|
||||
# information and ideas, see docs/scheduling.txt
|
||||
# Making this some sort of shell script might not be a bad idea.
|
||||
# Alternately you can use the upssched program as your NOTIFYCMD for some
|
||||
# more complex setups (e.g. to ease handling of notification storms).
|
||||
# For more information and ideas, see docs/scheduling.txt
|
||||
#
|
||||
# Example:
|
||||
# NOTIFYCMD @BINDIR@/notifyme
|
||||
|
@ -154,17 +202,17 @@ POLLFREQALERT 5
|
|||
# --------------------------------------------------------------------------
|
||||
# HOSTSYNC - How long upsmon will wait before giving up on another upsmon
|
||||
#
|
||||
# The master upsmon process uses this number when waiting for slaves to
|
||||
# disconnect once it has set the forced shutdown (FSD) flag. If they
|
||||
# don't disconnect after this many seconds, it goes on without them.
|
||||
# The primary upsmon process uses this number when waiting for secondary
|
||||
# systems to disconnect once it has set the forced shutdown (FSD) flag.
|
||||
# If they don't disconnect after this many seconds, it goes on without them.
|
||||
#
|
||||
# Similarly, upsmon slave processes wait up to this interval for the
|
||||
# master upsmon to set FSD when a UPS they are monitoring goes critical -
|
||||
# that is, on battery and low battery. If the master doesn't do its job,
|
||||
# the slaves will shut down anyway to avoid damage to the file systems.
|
||||
# Similarly, upsmon secondary processes wait up to this interval for the
|
||||
# primary upsmon to set FSD when an UPS they are monitoring goes critical -
|
||||
# that is, on battery and low battery. If the primary doesn't do its job,
|
||||
# the secondaries will shut down anyway to avoid damage to the file systems.
|
||||
#
|
||||
# This "wait for FSD" is done to avoid races where the status changes
|
||||
# to critical and back between polls by the master.
|
||||
# to critical and back between polls by the primary.
|
||||
|
||||
HOSTSYNC 15
|
||||
|
||||
|
@ -188,15 +236,19 @@ HOSTSYNC 15
|
|||
DEADTIME 15
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# POWERDOWNFLAG - Flag file for forcing UPS shutdown on the master system
|
||||
# POWERDOWNFLAG - Flag file for forcing UPS shutdown on the primary system
|
||||
#
|
||||
# upsmon will create a file with this name in master mode when it's time
|
||||
# upsmon will create a file with this name in primary mode when it's time
|
||||
# to shut down the load. You should check for this file's existence in
|
||||
# your shutdown scripts and run 'upsdrvctl shutdown' if it exists.
|
||||
# your shutdown scripts and run 'upsdrvctl shutdown' if it exists, to tell
|
||||
# the UPS(es) to power off.
|
||||
#
|
||||
# See the shutdown.txt file in the docs subdirectory for more information.
|
||||
# See the config-notes.txt file in the docs subdirectory for more information.
|
||||
# Refer to the section:
|
||||
# [[UPS_shutdown]] "Configuring automatic shutdowns for low battery events"
|
||||
# or refer to the online version.
|
||||
|
||||
POWERDOWNFLAG @CONFPATH@/killpower
|
||||
POWERDOWNFLAG /etc/killpower
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# NOTIFYMSG - change messages sent by upsmon when certain events occur
|
||||
|
@ -223,7 +275,7 @@ POWERDOWNFLAG @CONFPATH@/killpower
|
|||
# ONLINE : UPS is back online
|
||||
# ONBATT : UPS is on battery
|
||||
# LOWBATT : UPS has a low battery (if also on battery, it's "critical")
|
||||
# FSD : UPS is being shutdown by the master (FSD = "Forced Shutdown")
|
||||
# FSD : UPS is being shutdown by the primary (FSD = "Forced Shutdown")
|
||||
# COMMOK : Communications established with the UPS
|
||||
# COMMBAD : Communications lost to the UPS
|
||||
# SHUTDOWN : The system is being shutdown
|
||||
|
@ -284,17 +336,20 @@ NOCOMMWARNTIME 300
|
|||
# --------------------------------------------------------------------------
|
||||
# FINALDELAY - last sleep interval before shutting down the system
|
||||
#
|
||||
# On a master, upsmon will wait this long after sending the NOTIFY_SHUTDOWN
|
||||
# On a primary, upsmon will wait this long after sending the NOTIFY_SHUTDOWN
|
||||
# before executing your SHUTDOWNCMD. If you need to do something in between
|
||||
# those events, increase this number. Remember, at this point your UPS is
|
||||
# almost depleted, so don't make this too high.
|
||||
# almost depleted, so don't make this too high. If needed, on high-end UPS
|
||||
# devices you can usually configure when the low-battery state is announced
|
||||
# based on estimated remaining run-time or on charge level of the batteries.
|
||||
#
|
||||
# Alternatively, you can set this very low so you don't wait around when
|
||||
# it's time to shut down. Some UPSes don't give much warning for low
|
||||
# battery and will require a value of 0 here for a safe shutdown.
|
||||
#
|
||||
# Note: If FINALDELAY on the slave is greater than HOSTSYNC on the master,
|
||||
# the master will give up waiting for the slave to disconnect.
|
||||
# Note: If FINALDELAY on the secondary is greater than HOSTSYNC on the
|
||||
# primary, the primary will give up waiting for that secondary system
|
||||
# to disconnect.
|
||||
|
||||
FINALDELAY 5
|
||||
|
||||
|
@ -304,7 +359,7 @@ FINALDELAY 5
|
|||
# When compiled with SSL support, you can enter the certificate path here.
|
||||
#
|
||||
# With NSS:
|
||||
# Certificates are stored in a dedicated database (splitted in 3 files).
|
||||
# Certificates are stored in a dedicated database (split into 3 files).
|
||||
# Specify the path of the database directory.
|
||||
#
|
||||
# CERTPATH @CONFPATH@/cert/upsmon
|
||||
|
@ -359,7 +414,7 @@ FINALDELAY 5
|
|||
# This effectively forces the use of SSL, so don't use this unless
|
||||
# all of your upsd hosts are ready for SSL and have their certificates
|
||||
# in order.
|
||||
# When compiled with NSS support of SSL, can be overriden for host
|
||||
# When compiled with NSS support of SSL, can be overridden for host
|
||||
# specified with a CERTHOST directive.
|
||||
|
||||
|
||||
|
@ -373,5 +428,26 @@ FINALDELAY 5
|
|||
# that nobody can sniff your sessions without a large effort. Setting
|
||||
# this will make upsmon drop connections if the remote upsd doesn't
|
||||
# support SSL, so don't use it unless all of them have it running.
|
||||
# When compiled with NSS support of SSL, can be overriden for host
|
||||
# When compiled with NSS support of SSL, can be overridden for host
|
||||
# specified with a CERTHOST directive.
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# DEBUG_MIN - specify minimal debugging level for upsmon daemon
|
||||
# e.g. DEBUG_MIN 6
|
||||
#
|
||||
# Optionally specify a minimum debug level for `upsmon` daemon, e.g. for
|
||||
# troubleshooting a deployment, without impacting foreground or background
|
||||
# running mode directly, and without need to edit init-scripts or service
|
||||
# unit definitions. Note that command-line option `-D` can only increase
|
||||
# this verbosity level.
|
||||
#
|
||||
# NOTE: if the running daemon receives a `reload` command, presence of the
|
||||
# `DEBUG_MIN NUMBER` value in the configuration file can be used to tune
|
||||
# debugging verbosity in the running service daemon (it is recommended to
|
||||
# comment it away or set the minimum to explicit zero when done, to avoid
|
||||
# huge journals and I/O system abuse). Keep in mind that for this run-time
|
||||
# tuning, the `DEBUG_MIN` value *present* in *reloaded* configuration files
|
||||
# is applied instantly and overrides any previously set value, from file
|
||||
# or CLI options, regardless of older logging level being higher or lower
|
||||
# than the newly found number; a missing (or commented away) value however
|
||||
# does not change the previously active logging verbosity.
|
||||
|
|
|
@ -83,9 +83,15 @@ CMDSCRIPT @BINDIR@/upssched-cmd
|
|||
# argument.
|
||||
#
|
||||
# Example:
|
||||
# Start a timer that'll execute when any UPS (*) has been gone 10 seconds
|
||||
# 1) Start a timer that will execute when communication with any UPS (*) has
|
||||
# been gone for 10 seconds
|
||||
#
|
||||
# AT COMMBAD * START-TIMER upsgone 10
|
||||
#
|
||||
# 2) Start a timer that will execute when any UPS (*) has been running
|
||||
# on battery for 30 seconds
|
||||
#
|
||||
# AT ONBATT * START-TIMER onbattwarn 30
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
#
|
||||
|
@ -95,10 +101,15 @@ CMDSCRIPT @BINDIR@/upssched-cmd
|
|||
# has passed then pass the optional argument <cmd> to CMDSCRIPT.
|
||||
#
|
||||
# Example:
|
||||
# If a specific UPS (myups@localhost) comes back online, then stop the
|
||||
# timer before it triggers
|
||||
# 1) If a specific UPS (myups@localhost) communication is restored, then stop
|
||||
# the timer before it triggers
|
||||
#
|
||||
# AT COMMOK myups@localhost CANCEL-TIMER upsgone
|
||||
#
|
||||
# 2) If any UPS (*) reverts to utility power, then stop the timer before it
|
||||
# triggers
|
||||
#
|
||||
# AT ONLINE * CANCEL-TIMER onbattwarn
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
#
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
@UPSSTATSPATH upsstats.cgi@
|
||||
@UPSIMAGEPATH upsimage.cgi@
|
||||
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
@ -26,10 +26,16 @@
|
|||
@REFRESH@
|
||||
<title>@HOSTDESC@ : @VAR ups.model@ on @HOST@</title>
|
||||
<!-- LINK REL="stylesheet" TYPE="text/css" HREF="http://localhost/nut/nut.css" / -->
|
||||
<style type="text/css">
|
||||
body{color:#00fc00; background:#808080; font-family:"Times New Roman", Times, serif;}
|
||||
a:link{color:#00e;}
|
||||
a:visited{color:#551a8b;}
|
||||
table{background:#000;}
|
||||
</style>
|
||||
</head>
|
||||
<body BGCOLOR="#808080" TEXT="#00FC00" LINK="#0000EE" VLINK="#551A8B">
|
||||
<body>
|
||||
|
||||
<table BORDER="1" ALIGN="CENTER" CELLSPACING="0" CELLPADDING="10" BGCOLOR="#000000">
|
||||
<table style="margin:auto" BORDER="1" CELLSPACING="0" CELLPADDING="10">
|
||||
|
||||
<tr>
|
||||
<th COLSPAN="20">Network UPS Tools upsstats @VERSION@ - @HOSTDESC@ - @VAR ups.model@ on @HOST@</th>
|
||||
|
@ -51,7 +57,7 @@
|
|||
|
||||
<tr>
|
||||
|
||||
<td BGCOLOR="#000000" VALIGN="TOP">
|
||||
<td VALIGN="TOP">
|
||||
|
||||
<table BORDER="0"> <!-- table 2 -->
|
||||
|
||||
|
@ -195,7 +201,7 @@
|
|||
|
||||
@IFSUPP ambient.temperature@
|
||||
@IFSUPP ambient.humidity@
|
||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
||||
<td ALIGN="CENTER" VALIGN="TOP">
|
||||
<table BORDER="0"><tr>
|
||||
<td ALIGN="CENTER">Temperature<br>@IMG ambient.temperature tempmin=0 tempmax=50 width=90@</td>
|
||||
<td ALIGN="CENTER">Humidity<br>@IMG ambient.humidity width=90@</td>
|
||||
|
@ -203,21 +209,21 @@
|
|||
</td>
|
||||
@ELSE@
|
||||
@IFSUPP ambient.temperature@
|
||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
||||
<td ALIGN="CENTER" VALIGN="TOP">
|
||||
<table BORDER="0"><tr>
|
||||
<td ALIGN="CENTER">Temperature<br>@IMG ambient.temperature tempmin=0 tempmax=50@</td>
|
||||
</tr></table>
|
||||
</td>
|
||||
@ELSE@
|
||||
@IFSUPP ambient.humidity@
|
||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
||||
<td ALIGN="CENTER" VALIGN="TOP">
|
||||
<table BORDER="0"><tr>
|
||||
<td ALIGN="CENTER">Humidity<br>@IMG ambient.humidity@</td>
|
||||
</tr></table>
|
||||
</td>
|
||||
@ENDIF@
|
||||
|
||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
||||
<td ALIGN="CENTER" VALIGN="TOP">
|
||||
<table BORDER="0"><tr>
|
||||
@IFSUPP battery.charge@
|
||||
@IFSUPP battery.voltage@
|
||||
|
@ -232,7 +238,7 @@
|
|||
</tr></table>
|
||||
</td>
|
||||
|
||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
||||
<td ALIGN="CENTER" VALIGN="TOP">
|
||||
<table BORDER="0"><tr>
|
||||
@IFSUPP input.L2-L3.voltage@
|
||||
<td ALIGN="CENTER">L1-L2<br>@IMG input.L1-L2.voltage width=68@</td>
|
||||
|
@ -249,7 +255,7 @@
|
|||
</tr></table>
|
||||
</td>
|
||||
|
||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
||||
<td ALIGN="CENTER" VALIGN="TOP">
|
||||
<table BORDER="0"><tr>
|
||||
@IFSUPP output.L2-L3.voltage@
|
||||
<td ALIGN="CENTER">L1-L2<br>@IMG output.L1-L2.voltage width=68@</td>
|
||||
|
@ -266,7 +272,7 @@
|
|||
</tr></table>
|
||||
</td>
|
||||
|
||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
||||
<td ALIGN="CENTER" VALIGN="TOP">
|
||||
<table BORDER="0"><tr>
|
||||
@IFSUPP output.L2.power.percent@
|
||||
<td ALIGN="CENTER">L1<br>@IMG output.L1.power.percent width=68@</td>
|
||||
|
@ -286,9 +292,12 @@
|
|||
</tr>
|
||||
|
||||
</table>
|
||||
<a href="http://validator.w3.org/check?uri=referer"><img style="float:right"
|
||||
src="http://www.w3.org/Icons/valid-html40"
|
||||
alt="Valid HTML 4.0 Transitional" height="31" width="88"></a>
|
||||
|
||||
<div><a href="https://jigsaw.w3.org/css-validator/check/referer"><img
|
||||
style="float:right" src="https://jigsaw.w3.org/css-validator/images/vcss"
|
||||
alt="Valid CSS" title="Valid CSS" height="31" width="88"></a>
|
||||
<a href="https://validator.w3.org/check?uri=referer"><img
|
||||
style="float:right" src="https://www.w3.org/Icons/valid-html401"
|
||||
alt="Valid HTML 4.01 Strict" title="Valid HTML 4.01 Strict"
|
||||
height="31" width="88"></a></div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
@UPSSTATSPATH upsstats.cgi@
|
||||
@UPSIMAGEPATH upsimage.cgi@
|
||||
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
@ -28,21 +28,29 @@ Network UPS Tools upsstats
|
|||
@VERSION@
|
||||
: UPS Status
|
||||
</title>
|
||||
<style type="text/css">
|
||||
body{font-family:"Times New Roman", Times, serif;}
|
||||
a:link{color:#00e;}
|
||||
a:visited{color:#551a8b;}
|
||||
th, td{padding:0.5ex;}
|
||||
.t1{background:#0ff;}
|
||||
.t2{background:#0f0;}
|
||||
</style>
|
||||
<!-- link rel="stylesheet" type="text/css" href="nut.css" / -->
|
||||
@REFRESH@
|
||||
</head>
|
||||
<body BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000EE" VLINK="#551A8B">
|
||||
<body>
|
||||
|
||||
<table BGCOLOR="#50A0A0" ALIGN="CENTER">
|
||||
<table style="margin:auto; background:#50A0A0; text-align:center;">
|
||||
<tr><td>
|
||||
|
||||
<table CELLPADDING="5">
|
||||
<table>
|
||||
<tr>
|
||||
<th COLSPAN="10" BGCOLOR="#60B0B0">
|
||||
<th COLSPAN="10" style="background:#60B0B0;">
|
||||
|
||||
<font SIZE="+2">Network UPS Tools upsstats
|
||||
<span style="font-size:1.5em">Network UPS Tools upsstats
|
||||
@VERSION@
|
||||
</font>
|
||||
</span>
|
||||
|
||||
<br>
|
||||
@DATE %a %b %d %X %Z %Y@
|
||||
|
@ -50,7 +58,7 @@ Network UPS Tools upsstats
|
|||
|
||||
</tr>
|
||||
|
||||
<tr BGCOLOR="#60B0B0">
|
||||
<tr style="background:#60B0B0;">
|
||||
<th COLSPAN="1">System</th>
|
||||
<th COLSPAN="1">Model</th>
|
||||
<th COLSPAN="1">Status</th>
|
||||
|
@ -65,20 +73,20 @@ Network UPS Tools upsstats
|
|||
|
||||
@FOREACHUPS@
|
||||
|
||||
<tr ALIGN=CENTER>
|
||||
<td BGCOLOR="#00FFFF">
|
||||
<tr>
|
||||
<td class="t1">
|
||||
@HOSTLINK@
|
||||
</td>
|
||||
|
||||
<td BGCOLOR="#00FFFF">
|
||||
<td class="t1">
|
||||
@VAR ups.model@
|
||||
</td>
|
||||
|
||||
<td BGCOLOR="@STATUSCOLOR@">
|
||||
<td style="background:@STATUSCOLOR@">
|
||||
@STATUS@
|
||||
</td>
|
||||
|
||||
<td BGCOLOR="#00FF00">
|
||||
<td class="t2">
|
||||
@IFSUPP battery.charge@
|
||||
@VAR battery.charge@
|
||||
%
|
||||
|
@ -89,18 +97,18 @@ Network UPS Tools upsstats
|
|||
@IFBETWEEN input.transfer.low input.transfer.high input.L1-L2.voltage@
|
||||
@IFBETWEEN input.transfer.low input.transfer.high input.L2-L3.voltage@
|
||||
@IFBETWEEN input.transfer.low input.transfer.high input.L3-L1.voltage@
|
||||
<td BGCOLOR="#00FF00">
|
||||
<td class="t2">
|
||||
@ELSE@
|
||||
@IFSUPP input.L2-N.voltage@
|
||||
@IFBETWEEN input.transfer.low input.transfer.high input.L1-N.voltage@
|
||||
@IFBETWEEN input.transfer.low input.transfer.high input.L2-N.voltage@
|
||||
@IFBETWEEN input.transfer.low input.transfer.high input.L3-N.voltage@
|
||||
<td BGCOLOR="#00FF00">
|
||||
<td class="t2">
|
||||
@ELSE@
|
||||
@IFBETWEEN input.transfer.low input.transfer.high input.voltage@
|
||||
<td BGCOLOR="#00FF00">
|
||||
<td class="t2">
|
||||
@ELSE@
|
||||
<td BGCOLOR="#FF0000">
|
||||
<td style="background:red;">
|
||||
@ENDIF@
|
||||
|
||||
@IFSUPP input.L2-L3.voltage@
|
||||
|
@ -118,7 +126,7 @@ Network UPS Tools upsstats
|
|||
@ENDIF@
|
||||
</td>
|
||||
|
||||
<td BGCOLOR="#00FF00">
|
||||
<td class="t2">
|
||||
@IFSUPP output.L2-L3.voltage@
|
||||
@VAR output.L1-L2.voltage@
|
||||
@VAR output.L2-L3.voltage@
|
||||
|
@ -134,7 +142,7 @@ Network UPS Tools upsstats
|
|||
@ENDIF@
|
||||
</td>
|
||||
|
||||
<td BGCOLOR="#00FF00">
|
||||
<td class="t2">
|
||||
@IFSUPP output.L2.power.percent@
|
||||
@VAR output.L1.power.percent@
|
||||
@VAR output.L2.power.percent@
|
||||
|
@ -151,7 +159,7 @@ Network UPS Tools upsstats
|
|||
@ENDIF@
|
||||
</td>
|
||||
|
||||
<td BGCOLOR="#00FF00">
|
||||
<td class="t2">
|
||||
@IFSUPP ups.temperature@
|
||||
@UPSTEMP@
|
||||
@DEGREES@
|
||||
|
@ -162,13 +170,13 @@ Network UPS Tools upsstats
|
|||
@ENDIF@
|
||||
</td>
|
||||
|
||||
<td BGCOLOR="#00FF00">
|
||||
<td class="t2">
|
||||
@IFSUPP battery.runtime@
|
||||
@RUNTIME@
|
||||
@ENDIF@
|
||||
</td>
|
||||
|
||||
<td BGCOLOR="#00FF00">
|
||||
<td class="t2">
|
||||
@TREELINK@
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -180,11 +188,9 @@ Network UPS Tools upsstats
|
|||
</td></tr>
|
||||
</table>
|
||||
|
||||
<hr /><div><small>
|
||||
<a href="http://jigsaw.w3.org/css-validator/check/referer"><img style="float:right" src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" height="31" width="88"/></a>
|
||||
<a href="http://validator.w3.org/check?uri=referer"><img style="float:right"
|
||||
src="http://www.w3.org/Icons/valid-html40"
|
||||
alt="Valid HTML 4.0 Transitional" height="31" width="88"></a>
|
||||
<hr><div><small>
|
||||
<a href="https://jigsaw.w3.org/css-validator/check/referer"><img style="float:right" src="https://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" height="31" width="88"></a>
|
||||
<a href="https://validator.w3.org/check?uri=referer"><img style="float:right" src="https://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Strict" height="31" width="88"></a>
|
||||
</small></div>
|
||||
|
||||
</body></html>
|
||||
|
|
902
config.guess
vendored
902
config.guess
vendored
File diff suppressed because it is too large
Load diff
401
config.sub
vendored
401
config.sub
vendored
|
@ -1,36 +1,31 @@
|
|||
#! /bin/sh
|
||||
# Configuration validation subroutine script.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||
# 2011, 2012 Free Software Foundation, Inc.
|
||||
# Copyright 1992-2018 Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2012-04-18'
|
||||
timestamp='2018-02-22'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
# can handle that machine. It does not imply ALL GNU software can.
|
||||
#
|
||||
# This file 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
|
||||
# This file 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 3 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.
|
||||
# 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, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program; if not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
# the same distribution terms that you use for the rest of that
|
||||
# program. This Exception is an additional permission under section 7
|
||||
# of the GNU General Public License, version 3 ("GPLv3").
|
||||
|
||||
|
||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
||||
# diff and a properly formatted GNU ChangeLog entry.
|
||||
# Please send patches to <config-patches@gnu.org>.
|
||||
#
|
||||
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||
# Supply the specified configuration type as an argument.
|
||||
|
@ -38,7 +33,7 @@ timestamp='2012-04-18'
|
|||
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||
|
||||
# You can get the latest version of this script from:
|
||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
|
||||
# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
|
||||
|
||||
# This file is supposed to be the same for all GNU packages
|
||||
# and recognize all the CPU types, system types and aliases
|
||||
|
@ -58,12 +53,11 @@ timestamp='2012-04-18'
|
|||
me=`echo "$0" | sed -e 's,.*/,,'`
|
||||
|
||||
usage="\
|
||||
Usage: $0 [OPTION] CPU-MFR-OPSYS
|
||||
$0 [OPTION] ALIAS
|
||||
Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
|
||||
|
||||
Canonicalize a configuration name.
|
||||
|
||||
Operation modes:
|
||||
Options:
|
||||
-h, --help print this help, then exit
|
||||
-t, --time-stamp print date of last modification, then exit
|
||||
-v, --version print version number, then exit
|
||||
|
@ -73,9 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
|
|||
version="\
|
||||
GNU config.sub ($timestamp)
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
Free Software Foundation, Inc.
|
||||
Copyright 1992-2018 Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
|
@ -102,7 +94,7 @@ while test $# -gt 0 ; do
|
|||
|
||||
*local*)
|
||||
# First pass through any local machine types.
|
||||
echo $1
|
||||
echo "$1"
|
||||
exit ;;
|
||||
|
||||
* )
|
||||
|
@ -120,24 +112,24 @@ esac
|
|||
|
||||
# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
|
||||
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
case $maybe_os in
|
||||
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
|
||||
linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
||||
knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
kopensolaris*-gnu* | \
|
||||
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
||||
knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
|
||||
kopensolaris*-gnu* | cloudabi*-eabi* | \
|
||||
storm-chaos* | os2-emx* | rtmk-nova*)
|
||||
os=-$maybe_os
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
;;
|
||||
android-linux)
|
||||
os=-linux-android
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
|
||||
basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
|
||||
;;
|
||||
*)
|
||||
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||
if [ $basic_machine != $1 ]
|
||||
then os=`echo $1 | sed 's/.*-/-/'`
|
||||
basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
|
||||
if [ "$basic_machine" != "$1" ]
|
||||
then os=`echo "$1" | sed 's/.*-/-/'`
|
||||
else os=; fi
|
||||
;;
|
||||
esac
|
||||
|
@ -156,7 +148,7 @@ case $os in
|
|||
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||
-apple | -axis | -knuth | -cray | -microblaze)
|
||||
-apple | -axis | -knuth | -cray | -microblaze*)
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
|
@ -186,44 +178,44 @@ case $os in
|
|||
;;
|
||||
-sco6)
|
||||
os=-sco5v6
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco5)
|
||||
os=-sco3.2v5
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco4)
|
||||
os=-sco3.2v4
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco3.2.[4-9]*)
|
||||
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco3.2v[4-9]*)
|
||||
# Don't forget version if it is 3.2v4 or newer.
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco5v6*)
|
||||
# Don't forget version if it is 3.2v4 or newer.
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-sco*)
|
||||
os=-sco3.2v2
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-udk*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-isc)
|
||||
os=-isc2.2
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-clix*)
|
||||
basic_machine=clipper-intergraph
|
||||
;;
|
||||
-isc*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-lynx*178)
|
||||
os=-lynxos178
|
||||
|
@ -235,10 +227,7 @@ case $os in
|
|||
os=-lynxos
|
||||
;;
|
||||
-ptx*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
|
||||
;;
|
||||
-windowsnt*)
|
||||
os=`echo $os | sed -e 's/windowsnt/winnt/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'`
|
||||
;;
|
||||
-psos*)
|
||||
os=-psos
|
||||
|
@ -259,21 +248,25 @@ case $basic_machine in
|
|||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
||||
| am33_2.0 \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
|
||||
| arc | arceb \
|
||||
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
|
||||
| avr | avr32 \
|
||||
| ba \
|
||||
| be32 | be64 \
|
||||
| bfin \
|
||||
| c4x | clipper \
|
||||
| c4x | c8051 | clipper \
|
||||
| d10v | d30v | dlx | dsp16xx \
|
||||
| epiphany \
|
||||
| fido | fr30 | frv \
|
||||
| e2k | epiphany \
|
||||
| fido | fr30 | frv | ft32 \
|
||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||
| hexagon \
|
||||
| i370 | i860 | i960 | ia64 \
|
||||
| i370 | i860 | i960 | ia16 | ia64 \
|
||||
| ip2k | iq2000 \
|
||||
| k1om \
|
||||
| le32 | le64 \
|
||||
| lm32 \
|
||||
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
||||
| maxq | mb | microblaze | mcore | mep | metag \
|
||||
| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
|
||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
||||
| mips16 \
|
||||
| mips64 | mips64el \
|
||||
|
@ -287,26 +280,30 @@ case $basic_machine in
|
|||
| mips64vr5900 | mips64vr5900el \
|
||||
| mipsisa32 | mipsisa32el \
|
||||
| mipsisa32r2 | mipsisa32r2el \
|
||||
| mipsisa32r6 | mipsisa32r6el \
|
||||
| mipsisa64 | mipsisa64el \
|
||||
| mipsisa64r2 | mipsisa64r2el \
|
||||
| mipsisa64r6 | mipsisa64r6el \
|
||||
| mipsisa64sb1 | mipsisa64sb1el \
|
||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
||||
| mipsr5900 | mipsr5900el \
|
||||
| mipstx39 | mipstx39el \
|
||||
| mn10200 | mn10300 \
|
||||
| moxie \
|
||||
| mt \
|
||||
| msp430 \
|
||||
| nds32 | nds32le | nds32be \
|
||||
| nios | nios2 \
|
||||
| nios | nios2 | nios2eb | nios2el \
|
||||
| ns16k | ns32k \
|
||||
| open8 \
|
||||
| or32 \
|
||||
| pdp10 | pdp11 | pj | pjl \
|
||||
| open8 | or1k | or1knd | or32 \
|
||||
| pdp10 | pj | pjl \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
||||
| pru \
|
||||
| pyramid \
|
||||
| riscv32 | riscv64 \
|
||||
| rl78 | rx \
|
||||
| score \
|
||||
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh64 | sh64le \
|
||||
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
||||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||
|
@ -314,7 +311,8 @@ case $basic_machine in
|
|||
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
||||
| ubicom32 \
|
||||
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
||||
| we32k \
|
||||
| visium \
|
||||
| wasm32 \
|
||||
| x86 | xc16x | xstormy16 | xtensa \
|
||||
| z8k | z80)
|
||||
basic_machine=$basic_machine-unknown
|
||||
|
@ -328,11 +326,14 @@ case $basic_machine in
|
|||
c6x)
|
||||
basic_machine=tic6x-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
|
||||
leon|leon[3-9])
|
||||
basic_machine=sparc-$basic_machine
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
|
||||
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)
|
||||
;;
|
||||
ms1)
|
||||
basic_machine=mt-unknown
|
||||
|
@ -361,7 +362,7 @@ case $basic_machine in
|
|||
;;
|
||||
# Object if more than one company name word.
|
||||
*-*-*)
|
||||
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
|
||||
echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
|
||||
exit 1
|
||||
;;
|
||||
# Recognize the basic CPU types with company name.
|
||||
|
@ -370,26 +371,29 @@ case $basic_machine in
|
|||
| aarch64-* | aarch64_be-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
|
||||
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
||||
| avr-* | avr32-* \
|
||||
| ba-* \
|
||||
| be32-* | be64-* \
|
||||
| bfin-* | bs2000-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* \
|
||||
| clipper-* | craynv-* | cydra-* \
|
||||
| c8051-* | clipper-* | craynv-* | cydra-* \
|
||||
| d10v-* | d30v-* | dlx-* \
|
||||
| elxsi-* \
|
||||
| e2k-* | elxsi-* \
|
||||
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
||||
| h8300-* | h8500-* \
|
||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||
| hexagon-* \
|
||||
| i*86-* | i860-* | i960-* | ia64-* \
|
||||
| i*86-* | i860-* | i960-* | ia16-* | ia64-* \
|
||||
| ip2k-* | iq2000-* \
|
||||
| k1om-* \
|
||||
| le32-* | le64-* \
|
||||
| lm32-* \
|
||||
| m32c-* | m32r-* | m32rle-* \
|
||||
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
|
||||
| microblaze-* | microblazeel-* \
|
||||
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
||||
| mips16-* \
|
||||
| mips64-* | mips64el-* \
|
||||
|
@ -403,28 +407,34 @@ case $basic_machine in
|
|||
| mips64vr5900-* | mips64vr5900el-* \
|
||||
| mipsisa32-* | mipsisa32el-* \
|
||||
| mipsisa32r2-* | mipsisa32r2el-* \
|
||||
| mipsisa32r6-* | mipsisa32r6el-* \
|
||||
| mipsisa64-* | mipsisa64el-* \
|
||||
| mipsisa64r2-* | mipsisa64r2el-* \
|
||||
| mipsisa64r6-* | mipsisa64r6el-* \
|
||||
| mipsisa64sb1-* | mipsisa64sb1el-* \
|
||||
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
|
||||
| mipsr5900-* | mipsr5900el-* \
|
||||
| mipstx39-* | mipstx39el-* \
|
||||
| mmix-* \
|
||||
| mt-* \
|
||||
| msp430-* \
|
||||
| nds32-* | nds32le-* | nds32be-* \
|
||||
| nios-* | nios2-* \
|
||||
| nios-* | nios2-* | nios2eb-* | nios2el-* \
|
||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||
| open8-* \
|
||||
| or1k*-* \
|
||||
| orion-* \
|
||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
||||
| pru-* \
|
||||
| pyramid-* \
|
||||
| riscv32-* | riscv64-* \
|
||||
| rl78-* | romp-* | rs6000-* | rx-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||
| sparclite-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
|
||||
| tahoe-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||
| tile*-* \
|
||||
|
@ -432,6 +442,8 @@ case $basic_machine in
|
|||
| ubicom32-* \
|
||||
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
||||
| vax-* \
|
||||
| visium-* \
|
||||
| wasm32-* \
|
||||
| we32k-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
||||
| xstormy16-* | xtensa*-* \
|
||||
|
@ -445,7 +457,7 @@ case $basic_machine in
|
|||
# Recognize the various machine names and aliases which stand
|
||||
# for a CPU type and a company and sometimes even an OS.
|
||||
386bsd)
|
||||
basic_machine=i386-unknown
|
||||
basic_machine=i386-pc
|
||||
os=-bsd
|
||||
;;
|
||||
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
|
||||
|
@ -479,7 +491,7 @@ case $basic_machine in
|
|||
basic_machine=x86_64-pc
|
||||
;;
|
||||
amd64-*)
|
||||
basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
amdahl)
|
||||
basic_machine=580-amdahl
|
||||
|
@ -508,6 +520,9 @@ case $basic_machine in
|
|||
basic_machine=i386-pc
|
||||
os=-aros
|
||||
;;
|
||||
asmjs)
|
||||
basic_machine=asmjs-unknown
|
||||
;;
|
||||
aux)
|
||||
basic_machine=m68k-apple
|
||||
os=-aux
|
||||
|
@ -521,7 +536,7 @@ case $basic_machine in
|
|||
os=-linux
|
||||
;;
|
||||
blackfin-*)
|
||||
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
bluegene*)
|
||||
|
@ -529,13 +544,13 @@ case $basic_machine in
|
|||
os=-cnk
|
||||
;;
|
||||
c54x-*)
|
||||
basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c55x-*)
|
||||
basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c6x-*)
|
||||
basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c90)
|
||||
basic_machine=c90-cray
|
||||
|
@ -624,10 +639,18 @@ case $basic_machine in
|
|||
basic_machine=rs6000-bull
|
||||
os=-bosx
|
||||
;;
|
||||
dpx2* | dpx2*-bull)
|
||||
dpx2*)
|
||||
basic_machine=m68k-bull
|
||||
os=-sysv3
|
||||
;;
|
||||
e500v[12])
|
||||
basic_machine=powerpc-unknown
|
||||
os=$os"spe"
|
||||
;;
|
||||
e500v[12]-*)
|
||||
basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
os=$os"spe"
|
||||
;;
|
||||
ebmon29k)
|
||||
basic_machine=a29k-amd
|
||||
os=-ebmon
|
||||
|
@ -717,9 +740,6 @@ case $basic_machine in
|
|||
hp9k8[0-9][0-9] | hp8[0-9][0-9])
|
||||
basic_machine=hppa1.0-hp
|
||||
;;
|
||||
hppa-next)
|
||||
os=-nextstep3
|
||||
;;
|
||||
hppaosf)
|
||||
basic_machine=hppa1.1-hp
|
||||
os=-osf
|
||||
|
@ -732,26 +752,26 @@ case $basic_machine in
|
|||
basic_machine=i370-ibm
|
||||
;;
|
||||
i*86v32)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv32
|
||||
;;
|
||||
i*86v4*)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv4
|
||||
;;
|
||||
i*86v)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv
|
||||
;;
|
||||
i*86sol2)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
|
||||
os=-solaris2
|
||||
;;
|
||||
i386mach)
|
||||
basic_machine=i386-mach
|
||||
os=-mach
|
||||
;;
|
||||
i386-vsta | vsta)
|
||||
vsta)
|
||||
basic_machine=i386-unknown
|
||||
os=-vsta
|
||||
;;
|
||||
|
@ -769,17 +789,17 @@ case $basic_machine in
|
|||
basic_machine=m68k-isi
|
||||
os=-sysv
|
||||
;;
|
||||
leon-*|leon[3-9]-*)
|
||||
basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'`
|
||||
;;
|
||||
m68knommu)
|
||||
basic_machine=m68k-unknown
|
||||
os=-linux
|
||||
;;
|
||||
m68knommu-*)
|
||||
basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
m88k-omron*)
|
||||
basic_machine=m88k-omron
|
||||
;;
|
||||
magnum | m3230)
|
||||
basic_machine=mips-mips
|
||||
os=-sysv
|
||||
|
@ -788,11 +808,15 @@ case $basic_machine in
|
|||
basic_machine=ns32k-utek
|
||||
os=-sysv
|
||||
;;
|
||||
microblaze)
|
||||
microblaze*)
|
||||
basic_machine=microblaze-xilinx
|
||||
;;
|
||||
mingw64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-mingw64
|
||||
;;
|
||||
mingw32)
|
||||
basic_machine=i386-pc
|
||||
basic_machine=i686-pc
|
||||
os=-mingw32
|
||||
;;
|
||||
mingw32ce)
|
||||
|
@ -807,10 +831,10 @@ case $basic_machine in
|
|||
os=-mint
|
||||
;;
|
||||
mips3*-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
|
||||
basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`
|
||||
;;
|
||||
mips3*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
|
||||
basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown
|
||||
;;
|
||||
monitor)
|
||||
basic_machine=m68k-rom68k
|
||||
|
@ -820,15 +844,19 @@ case $basic_machine in
|
|||
basic_machine=powerpc-unknown
|
||||
os=-morphos
|
||||
;;
|
||||
moxiebox)
|
||||
basic_machine=moxie-unknown
|
||||
os=-moxiebox
|
||||
;;
|
||||
msdos)
|
||||
basic_machine=i386-pc
|
||||
os=-msdos
|
||||
;;
|
||||
ms1-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
||||
basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'`
|
||||
;;
|
||||
msys)
|
||||
basic_machine=i386-pc
|
||||
basic_machine=i686-pc
|
||||
os=-msys
|
||||
;;
|
||||
mvs)
|
||||
|
@ -912,6 +940,12 @@ case $basic_machine in
|
|||
nsr-tandem)
|
||||
basic_machine=nsr-tandem
|
||||
;;
|
||||
nsv-tandem)
|
||||
basic_machine=nsv-tandem
|
||||
;;
|
||||
nsx-tandem)
|
||||
basic_machine=nsx-tandem
|
||||
;;
|
||||
op50n-* | op60c-*)
|
||||
basic_machine=hppa1.1-oki
|
||||
os=-proelf
|
||||
|
@ -944,7 +978,7 @@ case $basic_machine in
|
|||
os=-linux
|
||||
;;
|
||||
parisc-*)
|
||||
basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
pbd)
|
||||
|
@ -960,7 +994,7 @@ case $basic_machine in
|
|||
basic_machine=i386-pc
|
||||
;;
|
||||
pc98-*)
|
||||
basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
pentium | p5 | k5 | k6 | nexgen | viac3)
|
||||
basic_machine=i586-pc
|
||||
|
@ -975,16 +1009,16 @@ case $basic_machine in
|
|||
basic_machine=i786-pc
|
||||
;;
|
||||
pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
|
||||
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
pentiumpro-* | p6-* | 6x86-* | athlon-*)
|
||||
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
|
||||
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
pentium4-*)
|
||||
basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
pn)
|
||||
basic_machine=pn-gould
|
||||
|
@ -994,23 +1028,23 @@ case $basic_machine in
|
|||
ppc | ppcbe) basic_machine=powerpc-unknown
|
||||
;;
|
||||
ppc-* | ppcbe-*)
|
||||
basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||
ppcle | powerpclittle)
|
||||
basic_machine=powerpcle-unknown
|
||||
;;
|
||||
ppcle-* | powerpclittle-*)
|
||||
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppc64) basic_machine=powerpc64-unknown
|
||||
;;
|
||||
ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppc64le | powerpc64little | ppc64-le | powerpc64-little)
|
||||
ppc64le | powerpc64little)
|
||||
basic_machine=powerpc64le-unknown
|
||||
;;
|
||||
ppc64le-* | powerpc64little-*)
|
||||
basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ps2)
|
||||
basic_machine=i386-ibm
|
||||
|
@ -1019,7 +1053,11 @@ case $basic_machine in
|
|||
basic_machine=i586-unknown
|
||||
os=-pw32
|
||||
;;
|
||||
rdos)
|
||||
rdos | rdos64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-rdos
|
||||
;;
|
||||
rdos32)
|
||||
basic_machine=i386-pc
|
||||
os=-rdos
|
||||
;;
|
||||
|
@ -1060,17 +1098,10 @@ case $basic_machine in
|
|||
sequent)
|
||||
basic_machine=i386-sequent
|
||||
;;
|
||||
sh)
|
||||
basic_machine=sh-hitachi
|
||||
os=-hms
|
||||
;;
|
||||
sh5el)
|
||||
basic_machine=sh5le-unknown
|
||||
;;
|
||||
sh64)
|
||||
basic_machine=sh64-unknown
|
||||
;;
|
||||
sparclite-wrs | simso-wrs)
|
||||
simso-wrs)
|
||||
basic_machine=sparclite-wrs
|
||||
os=-vxworks
|
||||
;;
|
||||
|
@ -1089,7 +1120,7 @@ case $basic_machine in
|
|||
os=-sysv4
|
||||
;;
|
||||
strongarm-* | thumb-*)
|
||||
basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
sun2)
|
||||
basic_machine=m68000-sun
|
||||
|
@ -1211,6 +1242,9 @@ case $basic_machine in
|
|||
basic_machine=hppa1.1-winbond
|
||||
os=-proelf
|
||||
;;
|
||||
x64)
|
||||
basic_machine=x86_64-pc
|
||||
;;
|
||||
xbox)
|
||||
basic_machine=i686-pc
|
||||
os=-mingw32
|
||||
|
@ -1219,20 +1253,12 @@ case $basic_machine in
|
|||
basic_machine=xps100-honeywell
|
||||
;;
|
||||
xscale-* | xscalee[bl]-*)
|
||||
basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
|
||||
basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`
|
||||
;;
|
||||
ymp)
|
||||
basic_machine=ymp-cray
|
||||
os=-unicos
|
||||
;;
|
||||
z8k-*-coff)
|
||||
basic_machine=z8k-unknown
|
||||
os=-sim
|
||||
;;
|
||||
z80-*-coff)
|
||||
basic_machine=z80-unknown
|
||||
os=-sim
|
||||
;;
|
||||
none)
|
||||
basic_machine=none-none
|
||||
os=-none
|
||||
|
@ -1261,10 +1287,6 @@ case $basic_machine in
|
|||
vax)
|
||||
basic_machine=vax-dec
|
||||
;;
|
||||
pdp10)
|
||||
# there are many clones, so DEC is not a safe bet
|
||||
basic_machine=pdp10-unknown
|
||||
;;
|
||||
pdp11)
|
||||
basic_machine=pdp11-dec
|
||||
;;
|
||||
|
@ -1274,9 +1296,6 @@ case $basic_machine in
|
|||
sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
basic_machine=sh-unknown
|
||||
;;
|
||||
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
|
||||
basic_machine=sparc-sun
|
||||
;;
|
||||
cydra)
|
||||
basic_machine=cydra-cydrome
|
||||
;;
|
||||
|
@ -1296,7 +1315,7 @@ case $basic_machine in
|
|||
# Make sure to match an already-canonicalized machine name.
|
||||
;;
|
||||
*)
|
||||
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
|
||||
echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
@ -1304,10 +1323,10 @@ esac
|
|||
# Here we canonicalize certain aliases for manufacturers.
|
||||
case $basic_machine in
|
||||
*-digital*)
|
||||
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
|
||||
basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`
|
||||
;;
|
||||
*-commodore*)
|
||||
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
|
||||
basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
|
@ -1318,8 +1337,8 @@ esac
|
|||
if [ x"$os" != x"" ]
|
||||
then
|
||||
case $os in
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# First match some system type aliases that might get confused
|
||||
# with valid system types.
|
||||
# -solaris* is a basic system type, with this one exception.
|
||||
-auroraux)
|
||||
os=-auroraux
|
||||
|
@ -1330,45 +1349,48 @@ case $os in
|
|||
-solaris)
|
||||
os=-solaris2
|
||||
;;
|
||||
-svr4*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-unixware*)
|
||||
os=-sysv4.2uw
|
||||
;;
|
||||
-gnu/linux*)
|
||||
os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
|
||||
;;
|
||||
# First accept the basic system types.
|
||||
# es1800 is here to avoid being matched by es* (a different OS)
|
||||
-es1800*)
|
||||
os=-ose
|
||||
;;
|
||||
# Now accept the basic system types.
|
||||
# The portable systems comes first.
|
||||
# Each alternative MUST END IN A *, to match a version number.
|
||||
# Each alternative MUST end in a * to match a version number.
|
||||
# -sysv* is not here because it comes later, after sysvr4.
|
||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
||||
| -sym* | -kopensolaris* \
|
||||
| -sym* | -kopensolaris* | -plan9* \
|
||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||
| -aos* | -aros* \
|
||||
| -aos* | -aros* | -cloudabi* | -sortix* \
|
||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||
| -openbsd* | -solidbsd* \
|
||||
| -hiux* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||
| -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
|
||||
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -chorusos* | -chorusrdb* | -cegcc* \
|
||||
| -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
|
||||
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -linux-android* \
|
||||
| -linux-newlib* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
||||
| -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
||||
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
|
||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \
|
||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
||||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
||||
| -morphos* | -superux* | -rtmk* | -windiss* \
|
||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
|
||||
| -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \
|
||||
| -midnightbsd*)
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-qnx*)
|
||||
|
@ -1385,12 +1407,12 @@ case $os in
|
|||
-nto*)
|
||||
os=`echo $os | sed -e 's|nto|nto-qnx|'`
|
||||
;;
|
||||
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
|
||||
| -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
|
||||
-sim | -xray | -os68k* | -v88r* \
|
||||
| -windows* | -osx | -abug | -netware* | -os9* \
|
||||
| -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
|
||||
;;
|
||||
-mac*)
|
||||
os=`echo $os | sed -e 's|mac|macos|'`
|
||||
os=`echo "$os" | sed -e 's|mac|macos|'`
|
||||
;;
|
||||
-linux-dietlibc)
|
||||
os=-linux-dietlibc
|
||||
|
@ -1399,10 +1421,10 @@ case $os in
|
|||
os=`echo $os | sed -e 's|linux|linux-gnu|'`
|
||||
;;
|
||||
-sunos5*)
|
||||
os=`echo $os | sed -e 's|sunos5|solaris2|'`
|
||||
os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
|
||||
;;
|
||||
-sunos6*)
|
||||
os=`echo $os | sed -e 's|sunos6|solaris3|'`
|
||||
os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
|
||||
;;
|
||||
-opened*)
|
||||
os=-openedition
|
||||
|
@ -1413,12 +1435,6 @@ case $os in
|
|||
-wince*)
|
||||
os=-wince
|
||||
;;
|
||||
-osfrose*)
|
||||
os=-osfrose
|
||||
;;
|
||||
-osf*)
|
||||
os=-osf
|
||||
;;
|
||||
-utek*)
|
||||
os=-bsd
|
||||
;;
|
||||
|
@ -1465,7 +1481,7 @@ case $os in
|
|||
-oss*)
|
||||
os=-sysv3
|
||||
;;
|
||||
-svr4)
|
||||
-svr4*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-svr3)
|
||||
|
@ -1480,35 +1496,38 @@ case $os in
|
|||
-ose*)
|
||||
os=-ose
|
||||
;;
|
||||
-es1800*)
|
||||
os=-ose
|
||||
;;
|
||||
-xenix)
|
||||
os=-xenix
|
||||
;;
|
||||
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
|
||||
os=-mint
|
||||
;;
|
||||
-aros*)
|
||||
os=-aros
|
||||
;;
|
||||
-kaos*)
|
||||
os=-kaos
|
||||
;;
|
||||
-zvmoe)
|
||||
os=-zvmoe
|
||||
;;
|
||||
-dicos*)
|
||||
os=-dicos
|
||||
;;
|
||||
-pikeos*)
|
||||
# Until real need of OS specific support for
|
||||
# particular features comes up, bare metal
|
||||
# configurations are quite functional.
|
||||
case $basic_machine in
|
||||
arm*)
|
||||
os=-eabi
|
||||
;;
|
||||
*)
|
||||
os=-elf
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
-nacl*)
|
||||
;;
|
||||
-ios)
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
# Get rid of the `-' at the beginning of $os.
|
||||
os=`echo $os | sed 's/[^-]*-//'`
|
||||
echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
|
||||
echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
@ -1543,6 +1562,9 @@ case $basic_machine in
|
|||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
c8051-*)
|
||||
os=-elf
|
||||
;;
|
||||
hexagon-*)
|
||||
os=-elf
|
||||
;;
|
||||
|
@ -1595,12 +1617,12 @@ case $basic_machine in
|
|||
sparc-* | *-sun)
|
||||
os=-sunos4.1.1
|
||||
;;
|
||||
pru-*)
|
||||
os=-elf
|
||||
;;
|
||||
*-be)
|
||||
os=-beos
|
||||
;;
|
||||
*-haiku)
|
||||
os=-haiku
|
||||
;;
|
||||
*-ibm)
|
||||
os=-aix
|
||||
;;
|
||||
|
@ -1655,9 +1677,6 @@ case $basic_machine in
|
|||
i370-*)
|
||||
os=-mvs
|
||||
;;
|
||||
*-next)
|
||||
os=-nextstep3
|
||||
;;
|
||||
*-gould)
|
||||
os=-sysv
|
||||
;;
|
||||
|
@ -1767,15 +1786,15 @@ case $basic_machine in
|
|||
vendor=stratus
|
||||
;;
|
||||
esac
|
||||
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
|
||||
basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"`
|
||||
;;
|
||||
esac
|
||||
|
||||
echo $basic_machine$os
|
||||
echo "$basic_machine$os"
|
||||
exit
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# eval: (add-hook 'write-file-functions 'time-stamp)
|
||||
# time-stamp-start: "timestamp='"
|
||||
# time-stamp-format: "%:y-%02m-%02d"
|
||||
# time-stamp-end: "'"
|
||||
|
|
2180
configure.ac
2180
configure.ac
File diff suppressed because it is too large
Load diff
|
@ -5,3 +5,16 @@ SUBDIRS = html
|
|||
dist_data_DATA = cmdvartab
|
||||
nodist_data_DATA = driver.list
|
||||
EXTRA_DIST = evolution500.seq epdu-managed.dev
|
||||
|
||||
# NOTE: Due to portability, we do not use a GNU percent-wildcard extension:
|
||||
#%-spellchecked: % Makefile.am $(top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
|
||||
# $(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
cmdvartab-spellchecked: cmdvartab Makefile.am $(top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
|
||||
$(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
spellcheck spellcheck-interactive spellcheck-sortdict:
|
||||
$(MAKE) -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC="cmdvartab" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||
CLEANFILES = *.pdf *.html *-spellchecked
|
||||
|
|
355
data/Makefile.in
355
data/Makefile.in
|
@ -1,9 +1,8 @@
|
|||
# Makefile.in generated by automake 1.11.6 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
|
||||
# Foundation, Inc.
|
||||
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
@ -18,23 +17,61 @@
|
|||
# Network UPS Tools: data
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__make_dryrun = \
|
||||
{ \
|
||||
am__dry=no; \
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||
*) \
|
||||
for am__flg in $$MAKEFLAGS; do \
|
||||
case $$am__flg in \
|
||||
*=*|--*) ;; \
|
||||
*n*) am__dry=yes; break;; \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
done;; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
test $$am__dry = yes; \
|
||||
}
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
|
@ -55,19 +92,24 @@ build_triplet = @build@
|
|||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
subdir = data
|
||||
DIST_COMMON = $(dist_data_DATA) $(srcdir)/Makefile.am \
|
||||
$(srcdir)/Makefile.in $(srcdir)/driver.list.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \
|
||||
$(top_srcdir)/m4/ax_c_pragmas.m4 \
|
||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
||||
$(top_srcdir)/m4/ax_compare_version.m4 \
|
||||
$(top_srcdir)/m4/ax_run_or_link_ifelse.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||
$(top_srcdir)/m4/nut_check_asciidoc.m4 \
|
||||
$(top_srcdir)/m4/nut_check_cppcheck.m4 \
|
||||
$(top_srcdir)/m4/nut_check_headers_windows.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libavahi.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libltdl.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libmodbus.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libneon.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||
|
@ -76,24 +118,44 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
|||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||
$(top_srcdir)/m4/nut_check_os.m4 \
|
||||
$(top_srcdir)/m4/nut_check_pkgconfig.m4 \
|
||||
$(top_srcdir)/m4/nut_check_python.m4 \
|
||||
$(top_srcdir)/m4/nut_compiler_family.m4 \
|
||||
$(top_srcdir)/m4/nut_func_getnameinfo_argtypes.m4 \
|
||||
$(top_srcdir)/m4/nut_report_feature.m4 \
|
||||
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(dist_data_DATA) \
|
||||
$(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||
CONFIG_CLEAN_FILES = driver.list
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
|
||||
html-recursive info-recursive install-data-recursive \
|
||||
install-dvi-recursive install-exec-recursive \
|
||||
install-html-recursive install-info-recursive \
|
||||
install-pdf-recursive install-ps-recursive install-recursive \
|
||||
installcheck-recursive installdirs-recursive pdf-recursive \
|
||||
ps-recursive uninstall-recursive
|
||||
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||
ctags-recursive dvi-recursive html-recursive info-recursive \
|
||||
install-data-recursive install-dvi-recursive \
|
||||
install-exec-recursive install-html-recursive \
|
||||
install-info-recursive install-pdf-recursive \
|
||||
install-ps-recursive install-recursive installcheck-recursive \
|
||||
installdirs-recursive pdf-recursive ps-recursive \
|
||||
tags-recursive uninstall-recursive
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
|
@ -130,12 +192,33 @@ am__installdirs = "$(DESTDIR)$(datadir)" "$(DESTDIR)$(datadir)"
|
|||
DATA = $(dist_data_DATA) $(nodist_data_DATA)
|
||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||
distclean-recursive maintainer-clean-recursive
|
||||
AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
|
||||
$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
|
||||
distdir
|
||||
am__recursive_targets = \
|
||||
$(RECURSIVE_TARGETS) \
|
||||
$(RECURSIVE_CLEAN_TARGETS) \
|
||||
$(am__extra_recursive_targets)
|
||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||
distdir distdir-am
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DIST_SUBDIRS = $(SUBDIRS)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/driver.list.in
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
am__relativize = \
|
||||
dir0=`pwd`; \
|
||||
|
@ -165,9 +248,11 @@ am__relativize = \
|
|||
A2X = @A2X@
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
ASCIIDOC = @ASCIIDOC@
|
||||
ASPELL = @ASPELL@
|
||||
AUGPARSE = @AUGPARSE@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
|
@ -178,6 +263,7 @@ CCDEPMODE = @CCDEPMODE@
|
|||
CFLAGS = @CFLAGS@
|
||||
CONFPATH = @CONFPATH@
|
||||
CPP = @CPP@
|
||||
CPPCHECK = @CPPCHECK@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||
|
@ -191,6 +277,7 @@ DEFS = @DEFS@
|
|||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||
|
@ -203,6 +290,7 @@ ECHO_T = @ECHO_T@
|
|||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
FGREP = @FGREP@
|
||||
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
@ -213,12 +301,15 @@ LD = @LD@
|
|||
LDFLAGS = @LDFLAGS@
|
||||
LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@
|
||||
LIBAVAHI_LIBS = @LIBAVAHI_LIBS@
|
||||
LIBDIR = @LIBDIR@
|
||||
LIBGD_CFLAGS = @LIBGD_CFLAGS@
|
||||
LIBGD_LDFLAGS = @LIBGD_LDFLAGS@
|
||||
LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||
|
@ -229,21 +320,29 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
|||
LIBS = @LIBS@
|
||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LN_S_R = @LN_S_R@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NETLIBS = @NETLIBS@
|
||||
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
NUT_DATADIR = @NUT_DATADIR@
|
||||
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||
NUT_NETVERSION = @NUT_NETVERSION@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
|
@ -263,6 +362,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
|||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
PORT = @PORT@
|
||||
PYTHON = @PYTHON@
|
||||
PYTHON2 = @PYTHON2@
|
||||
PYTHON3 = @PYTHON3@
|
||||
RANLIB = @RANLIB@
|
||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||
RUN_AS_USER = @RUN_AS_USER@
|
||||
|
@ -271,12 +373,16 @@ SED = @SED@
|
|||
SERLIBS = @SERLIBS@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@
|
||||
STATEPATH = @STATEPATH@
|
||||
STRIP = @STRIP@
|
||||
SUN_LIBUSB = @SUN_LIBUSB@
|
||||
TREE_VERSION = @TREE_VERSION@
|
||||
VALGRIND = @VALGRIND@
|
||||
VERSION = @VERSION@
|
||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||
XMLLINT = @XMLLINT@
|
||||
XSLTPROC = @XSLTPROC@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
|
@ -290,6 +396,7 @@ am__leading_dot = @am__leading_dot@
|
|||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
auglensdir = @auglensdir@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
|
@ -303,6 +410,9 @@ datarootdir = @datarootdir@
|
|||
devddir = @devddir@
|
||||
docdir = @docdir@
|
||||
driverexecdir = @driverexecdir@
|
||||
dummy_PKG_CONFIG = @dummy_PKG_CONFIG@
|
||||
dummy_PKG_CONFIG_CFLAGS = @dummy_PKG_CONFIG_CFLAGS@
|
||||
dummy_PKG_CONFIG_LIBS = @dummy_PKG_CONFIG_LIBS@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
|
@ -321,18 +431,21 @@ localedir = @localedir@
|
|||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
now = @now@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
pkgconfigdir = @pkgconfigdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
||||
systemdshutdowndir = @systemdshutdowndir@
|
||||
systemdsystemunitdir = @systemdsystemunitdir@
|
||||
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
|
@ -346,6 +459,8 @@ SUBDIRS = html
|
|||
dist_data_DATA = cmdvartab
|
||||
nodist_data_DATA = driver.list
|
||||
EXTRA_DIST = evolution500.seq epdu-managed.dev
|
||||
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||
CLEANFILES = *.pdf *.html *-spellchecked
|
||||
all: all-recursive
|
||||
|
||||
.SUFFIXES:
|
||||
|
@ -361,14 +476,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
|||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu data/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
|
@ -431,22 +545,25 @@ uninstall-nodist_dataDATA:
|
|||
dir='$(DESTDIR)$(datadir)'; $(am__uninstall_files_from_dir)
|
||||
|
||||
# This directory's subdirectories are mostly independent; you can cd
|
||||
# into them and run `make' without going through this Makefile.
|
||||
# To change the values of `make' variables: instead of editing Makefiles,
|
||||
# (1) if the variable is set in `config.status', edit `config.status'
|
||||
# (which will cause the Makefiles to be regenerated when you run `make');
|
||||
# (2) otherwise, pass the desired values on the `make' command line.
|
||||
$(RECURSIVE_TARGETS):
|
||||
@fail= failcom='exit 1'; \
|
||||
for f in x $$MAKEFLAGS; do \
|
||||
case $$f in \
|
||||
*=* | --[!k]*);; \
|
||||
*k*) failcom='fail=yes';; \
|
||||
esac; \
|
||||
done; \
|
||||
# into them and run 'make' without going through this Makefile.
|
||||
# To change the values of 'make' variables: instead of editing Makefiles,
|
||||
# (1) if the variable is set in 'config.status', edit 'config.status'
|
||||
# (which will cause the Makefiles to be regenerated when you run 'make');
|
||||
# (2) otherwise, pass the desired values on the 'make' command line.
|
||||
$(am__recursive_targets):
|
||||
@fail=; \
|
||||
if $(am__make_keepgoing); then \
|
||||
failcom='fail=yes'; \
|
||||
else \
|
||||
failcom='exit 1'; \
|
||||
fi; \
|
||||
dot_seen=no; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
case "$@" in \
|
||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||
*) list='$(SUBDIRS)' ;; \
|
||||
esac; \
|
||||
for subdir in $$list; do \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
if test "$$subdir" = "."; then \
|
||||
dot_seen=yes; \
|
||||
|
@ -461,57 +578,12 @@ $(RECURSIVE_TARGETS):
|
|||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||
fi; test -z "$$fail"
|
||||
|
||||
$(RECURSIVE_CLEAN_TARGETS):
|
||||
@fail= failcom='exit 1'; \
|
||||
for f in x $$MAKEFLAGS; do \
|
||||
case $$f in \
|
||||
*=* | --[!k]*);; \
|
||||
*k*) failcom='fail=yes';; \
|
||||
esac; \
|
||||
done; \
|
||||
dot_seen=no; \
|
||||
case "$@" in \
|
||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||
*) list='$(SUBDIRS)' ;; \
|
||||
esac; \
|
||||
rev=''; for subdir in $$list; do \
|
||||
if test "$$subdir" = "."; then :; else \
|
||||
rev="$$subdir $$rev"; \
|
||||
fi; \
|
||||
done; \
|
||||
rev="$$rev ."; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
for subdir in $$rev; do \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
if test "$$subdir" = "."; then \
|
||||
local_target="$$target-am"; \
|
||||
else \
|
||||
local_target="$$target"; \
|
||||
fi; \
|
||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||
|| eval $$failcom; \
|
||||
done && test -z "$$fail"
|
||||
tags-recursive:
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
|
||||
done
|
||||
ctags-recursive:
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
|
||||
done
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-recursive
|
||||
TAGS: tags
|
||||
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
mkid -fID $$unique
|
||||
tags: TAGS
|
||||
|
||||
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||
|
@ -527,12 +599,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
||||
fi; \
|
||||
done; \
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
|
@ -544,15 +611,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: CTAGS
|
||||
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
||||
$(TAGS_FILES) $(LISP)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | \
|
||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
||||
ctags: ctags-recursive
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
@ -561,11 +624,29 @@ GTAGS:
|
|||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscopelist: cscopelist-recursive
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
distdir-am: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
|
@ -650,6 +731,7 @@ install-strip:
|
|||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
@ -658,6 +740,7 @@ distclean-generic:
|
|||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
clean: clean-recursive
|
||||
|
||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||
|
@ -724,25 +807,35 @@ ps-am:
|
|||
|
||||
uninstall-am: uninstall-dist_dataDATA uninstall-nodist_dataDATA
|
||||
|
||||
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
|
||||
install-am install-strip tags-recursive
|
||||
.MAKE: $(am__recursive_targets) install-am install-strip
|
||||
|
||||
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
|
||||
all all-am check check-am clean clean-generic clean-libtool \
|
||||
ctags ctags-recursive distclean distclean-generic \
|
||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||
html-am info info-am install install-am install-data \
|
||||
install-data-am install-dist_dataDATA install-dvi \
|
||||
install-dvi-am install-exec install-exec-am install-html \
|
||||
install-html-am install-info install-info-am install-man \
|
||||
install-nodist_dataDATA install-pdf install-pdf-am install-ps \
|
||||
install-ps-am install-strip installcheck installcheck-am \
|
||||
installdirs installdirs-am maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
||||
mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
|
||||
uninstall uninstall-am uninstall-dist_dataDATA \
|
||||
uninstall-nodist_dataDATA
|
||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
|
||||
check-am clean clean-generic clean-libtool cscopelist-am ctags \
|
||||
ctags-am distclean distclean-generic distclean-libtool \
|
||||
distclean-tags distdir dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am \
|
||||
install-dist_dataDATA install-dvi install-dvi-am install-exec \
|
||||
install-exec-am install-html install-html-am install-info \
|
||||
install-info-am install-man install-nodist_dataDATA \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
installdirs-am maintainer-clean maintainer-clean-generic \
|
||||
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
|
||||
ps ps-am tags tags-am uninstall uninstall-am \
|
||||
uninstall-dist_dataDATA uninstall-nodist_dataDATA
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
# NOTE: Due to portability, we do not use a GNU percent-wildcard extension:
|
||||
#%-spellchecked: % Makefile.am $(top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
|
||||
# $(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
cmdvartab-spellchecked: cmdvartab Makefile.am $(top_srcdir)/docs/Makefile.am $(abs_srcdir)/$(NUT_SPELL_DICT)
|
||||
$(MAKE) -s -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC_ONE="$<" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
spellcheck spellcheck-interactive spellcheck-sortdict:
|
||||
$(MAKE) -f $(top_builddir)/docs/Makefile SPELLCHECK_SRC="cmdvartab" SPELLCHECK_DIR="$(srcdir)" $@
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
|
|
|
@ -20,6 +20,7 @@ VARDESC ups.firmware "UPS firmware"
|
|||
VARDESC ups.firmware.aux "Auxiliary device firmware"
|
||||
VARDESC ups.temperature "UPS temperature (degrees C)"
|
||||
VARDESC ups.load "Load on UPS (percent of full)"
|
||||
VARDESC ups.load.energysave "Load on UPS that triggers energysave (percent)"
|
||||
VARDESC ups.load.high "Load when UPS switches to overload condition (percent)"
|
||||
VARDESC ups.id "UPS system identifier"
|
||||
VARDESC ups.delay.start "Interval to wait before (re)starting the load (seconds)"
|
||||
|
@ -46,6 +47,11 @@ VARDESC input.voltage "Input voltage (V)"
|
|||
VARDESC input.voltage.extended "Extended input voltage range"
|
||||
VARDESC input.voltage.maximum "Maximum incoming voltage seen (V)"
|
||||
VARDESC input.voltage.minimum "Minimum incoming voltage seen (V)"
|
||||
VARDESC input.voltage.status "Voltage status relative to the thresholds"
|
||||
VARDESC input.voltage.low.warning "Input voltage low warning threshold (V)"
|
||||
VARDESC input.voltage.low.critical "Input voltage low critical threshold (V)"
|
||||
VARDESC input.voltage.high.warning "Input voltage high warning threshold (V)"
|
||||
VARDESC input.voltage.high.critical "Input voltage high critical threshold (V)"
|
||||
VARDESC input.voltage.nominal "Nominal input voltage (V)"
|
||||
VARDESC input.transfer.reason "Reason for last transfer to battery"
|
||||
VARDESC input.transfer.low "Low voltage transfer point (V)"
|
||||
|
@ -58,8 +64,14 @@ VARDESC input.sensitivity "Input power sensitivity"
|
|||
VARDESC input.quality "Input power quality"
|
||||
VARDESC input.current "Input current (A)"
|
||||
VARDESC input.current.nominal "Nominal input current (A)"
|
||||
VARDESC input.current.status "Current status relative to the thresholds"
|
||||
VARDESC input.current.low.warning "Input current low warning threshold (A)"
|
||||
VARDESC input.current.low.critical "Input current low critical threshold (A)"
|
||||
VARDESC input.current.high.warning "Input current high warning threshold (A)"
|
||||
VARDESC input.current.high.critical "Input current high critical threshold (A)"
|
||||
VARDESC input.frequency "Input line frequency (Hz)"
|
||||
VARDESC input.frequency.extended "Extended input frequency range"
|
||||
VARDESC input.frequency.status "Frequency status"
|
||||
VARDESC input.frequency.nominal "Nominal input line frequency (Hz)"
|
||||
VARDESC input.frequency.low "Minimum input line frequency (Hz)"
|
||||
VARDESC input.frequency.high "Maximum input line frequency (Hz)"
|
||||
|
@ -67,6 +79,12 @@ VARDESC input.transfer.boost.low "Low voltage boosting transfer point (V)"
|
|||
VARDESC input.transfer.boost.high "High voltage boosting transfer point (V)"
|
||||
VARDESC input.transfer.trim.low "Low voltage trimming transfer point (V)"
|
||||
VARDESC input.transfer.trim.high "High voltage trimming transfer point (V)"
|
||||
VARDESC input.transfer.delay "Delay before transfer to mains"
|
||||
VARDESC input.load "Load on (ePDU) input (percent of full)"
|
||||
VARDESC input.realpower "Current sum value of all (ePDU) phases real power (W)"
|
||||
VARDESC input.power "Current sum value of all (ePDU) phases apparent power (VA)"
|
||||
VARDESC input.source "The current input power source"
|
||||
VARDESC input.source.preferred "The preferred input power source"
|
||||
|
||||
VARDESC output.voltage "Output voltage (V)"
|
||||
VARDESC output.voltage.nominal "Nominal output voltage (V)"
|
||||
|
@ -76,6 +94,7 @@ VARDESC output.current "Output current (A)"
|
|||
VARDESC output.current.nominal "Nominal output current (A)"
|
||||
|
||||
VARDESC battery.charge "Battery charge (percent of full)"
|
||||
VARDESC battery.charge.approx "Rough approximation of battery charge"
|
||||
VARDESC battery.charge.low "Remaining battery level when UPS switches to LB (percent)"
|
||||
VARDESC battery.charge.restart "Minimum battery level for restart after power off (percent)"
|
||||
VARDESC battery.charge.warning "Battery level when UPS switches to Warning state (percent)"
|
||||
|
@ -94,19 +113,40 @@ VARDESC battery.packs.bad "Number of bad battery packs"
|
|||
VARDESC battery.type "Battery chemistry"
|
||||
VARDESC battery.protection "Prevent deep discharge of battery"
|
||||
VARDESC battery.energysave "Switch off when running on battery and no/low load"
|
||||
VARDESC battery.energysave.load "Switch off UPS if on battery and load level lower (percent)"
|
||||
VARDESC battery.energysave.delay "Delay before switch off UPS if on battery and load level low (min)"
|
||||
VARDESC battery.energysave.realpower "Switch off UPS if on battery and load level lower (Watts)"
|
||||
VARDESC battery.charger.status "Battery charger status"
|
||||
|
||||
VARDESC ambient.temperature "Ambient temperature (degrees C)"
|
||||
VARDESC ambient.temperature.alarm "Ambient temperature alarm is active"
|
||||
VARDESC ambient.temperature.alarm.maximum "Maximum allowed ambient temperature"
|
||||
VARDESC ambient.temperature.alarm.minimum "Minimum allowed ambient temperature"
|
||||
VARDESC ambient.temperature.status "Ambient temperature status relative to the configured thresholds"
|
||||
VARDESC ambient.temperature.alarm.maximum "Maximum allowed ambient temperature (degrees C)"
|
||||
VARDESC ambient.temperature.alarm.minimum "Minimum allowed ambient temperature (degrees C)"
|
||||
VARDESC ambient.temperature.alarm.enable "Enable ambient temperature alarm"
|
||||
VARDESC ambient.humidity "Ambient humidity"
|
||||
VARDESC ambient.temperature.low "Temperature threshold low (degrees C)"
|
||||
VARDESC ambient.temperature.low.warning "Temperature threshold low warning (degrees C)"
|
||||
VARDESC ambient.temperature.low.critical "Temperature threshold low critical (degrees C)"
|
||||
VARDESC ambient.temperature.high "Temperature threshold high (degrees C)"
|
||||
VARDESC ambient.temperature.high.warning "Temperature threshold high warning (degrees C)"
|
||||
VARDESC ambient.temperature.high.critical "Temperature threshold high critical (degrees C)"
|
||||
VARDESC ambient.humidity "Ambient humidity (percent)"
|
||||
VARDESC ambient.humidity.alarm "Ambient humidity alarm is active"
|
||||
VARDESC ambient.humidity.alarm.maximum "Maximum allowed ambient humidity"
|
||||
VARDESC ambient.humidity.alarm.minimum "Minimum allowed ambient humidity"
|
||||
VARDESC ambient.humidity.status "Ambient humidity status relative to the configured thresholds"
|
||||
VARDESC ambient.humidity.alarm.maximum "Maximum allowed ambient humidity (percent)"
|
||||
VARDESC ambient.humidity.alarm.minimum "Minimum allowed ambient humidity (percent)"
|
||||
VARDESC ambient.humidity.alarm.enable "Enable ambient humidity alarm"
|
||||
VARDESC ambient.humidity.low "Ambient humidity threshold low (percent)"
|
||||
VARDESC ambient.humidity.low.warning "Ambient humidity threshold low warning (percent)"
|
||||
VARDESC ambient.humidity.low.critical "Ambient humidity threshold low critical (percent)"
|
||||
VARDESC ambient.humidity.high "Ambient humidity threshold high (percent)"
|
||||
VARDESC ambient.humidity.high.warning "Ambient humidity threshold high warning (percent)"
|
||||
VARDESC ambient.humidity.high.critical "Ambient humidity threshold high critical (percent)"
|
||||
VARDESC ambient.present "Ambient sensor presence"
|
||||
VARDESC ambient.contacts.1.status "State of the dry contact sensor 1"
|
||||
VARDESC ambient.contacts.2.status "State of the dry contact sensor 2"
|
||||
|
||||
# FIXME: the outlet collection is indexed - solve with regexs?
|
||||
# FIXME: the outlet collection is indexed - solve with regexps?
|
||||
#
|
||||
# VARDESC outlet.[[:digit:]]+.id "Outlet system identifier (<index>)"
|
||||
|
||||
|
@ -138,6 +178,7 @@ VARDESC outlet.2.delay.start "Interval to wait before restarting this outlet (se
|
|||
VARDESC driver.name "Driver name"
|
||||
VARDESC driver.version "Driver version - NUT release"
|
||||
VARDESC driver.version.internal "Internal driver version"
|
||||
VARDESC driver.version.usb "USB library version"
|
||||
|
||||
VARDESC device.part "Device Part Number"
|
||||
|
||||
|
@ -179,8 +220,10 @@ CMDDESC beeper.mute "Temporarily mute the UPS beeper"
|
|||
CMDDESC beeper.toggle "Toggle the UPS beeper"
|
||||
CMDDESC outlet.1.load.off "Turn off the load on outlet 1 immediately"
|
||||
CMDDESC outlet.1.load.on "Turn on the load on outlet 1 immediately"
|
||||
CMDDESC outlet.1.shutdown.return "Turn off the outlet 1 and return when power is back"
|
||||
CMDDESC outlet.2.load.off "Turn off the load on outlet 2 immediately"
|
||||
CMDDESC outlet.2.load.on "Turn on the load on outlet 2 immediately"
|
||||
CMDDESC outlet.2.shutdown.return "Turn off the outlet 2 and return when power is back"
|
||||
|
||||
# The following two commands should *only* be defined when you need
|
||||
# to compose a 'shutdown.return' command by sending both a switch-off
|
||||
|
|
|
@ -16,8 +16,9 @@
|
|||
# ========
|
||||
# - device type:
|
||||
# "ups" for Uninterruptible Power Supply
|
||||
# "pdu" for Power Distributions Unit
|
||||
# "scd" for Solar Controlers Device
|
||||
# "pdu" for Power Distribution Unit
|
||||
# "scd" for Solar Controller Device
|
||||
# "ats" for Automatic Transfer Switch
|
||||
#
|
||||
# - support level: a number from "1" to "5" (stars) meaning:
|
||||
# * protocol based on reverse engineering
|
||||
|
@ -34,32 +35,50 @@
|
|||
# Duplicate text in the last field will be cooked out during the conversion
|
||||
# to HTML with ROWSPAN magic. They must be an exact match for this to work.
|
||||
|
||||
"Ablerex" "ups" "2" "MS-RT" "" "blazer_ser"
|
||||
"Ablerex" "ups" "2" "625L" "USB" "blazer_usb"
|
||||
"Ablerex" "ups" "2" "Hope Office 400/600" "" "blazer_ser"
|
||||
"Ablerex" "ups" "2" "MARS MS3000RT" "" "blazer_ser"
|
||||
"Ablerex" "ups" "2" "MS-RT" "" "blazer_ser"
|
||||
"Ablerex" "ups" "2" "MP series" "USB" "nutdrv_qx"
|
||||
"Ablerex" "ups" "2" "ARES Plus series" "USB" "nutdrv_qx"
|
||||
"Ablerex" "ups" "2" "MSII series" "USB" "nutdrv_qx"
|
||||
"Ablerex" "ups" "2" "MSIII series" "USB" "nutdrv_qx"
|
||||
"Ablerex" "ups" "2" "GRs series" "USB" "nutdrv_qx"
|
||||
"Ablerex" "ups" "2" "GRs Plus series" "USB" "nutdrv_qx"
|
||||
|
||||
"ActivePower" "ups" "2" "400VA" "" "blazer_ser"
|
||||
"ActivePower" "ups" "2" "1400VA" "" "blazer_ser"
|
||||
"ActivePower" "ups" "2" "2000VA" "" "blazer_ser"
|
||||
|
||||
"Advice" "ups" "2" "TopGuard 2000" "" "blazer_ser"
|
||||
"Advice" "ups" "2" "Top V Pro 6-10K" "USB" "blazer_usb" # https://www.advice.co.il/en/advice-products/ups-systems/ups-online-systems/one-phase-ups-5k-10k/%D7%90%D7%9C-%D7%A4%D7%A1%D7%A7-%D7%90%D7%95%D7%9F-%D7%9C%D7%99%D7%99%D7%9F-top-v-pro-6-10k-detail https://github.com/networkupstools/nut/issues/744
|
||||
"Advice" "ups" "2" "PRS850" "USB" "blazer_usb"
|
||||
"Advice" "ups" "2" "PRV700 Pro" "USB" "blazer_usb"
|
||||
|
||||
"AEC" "ups" "1" "MiniGuard UPS 700" "Megatec M2501 cable" "genericups upstype=21"
|
||||
|
||||
"AEG Power Solutions" "ups" "2" "PROTECT HOME" "" "blazer_ser or blazer_usb"
|
||||
"AEG Power Solutions" "ups" "3" "PROTECT NAS" "" "usbhid-ups"
|
||||
"AEG Power Solutions" "ups" "3" "PROTECT B" "" "usbhid-ups"
|
||||
|
||||
"APC" "ups" "3" "APC AP9584 Serial-to-USB kit" "USB" "usbhid-ups" # Allows USB connections to Serial-port APC devices, https://github.com/networkupstools/nut/pull/181
|
||||
"APC" "ups" "2" "Back-UPS 1200BR (Microsol)" "" "solis"
|
||||
"APC" "ups" "2" "Back-UPS BZ2200BI-BR (Microsol)" "" "solis"
|
||||
"APC" "ups" "1" "Back-UPS Pro" "" "apcsmart"
|
||||
"APC" "ups" "1" "Matrix-UPS" "" "apcsmart"
|
||||
"APC" "ups" "1" "Smart-UPS" "" "apcsmart"
|
||||
"APC" "ups" "1" "Smart-UPS SMT/SMX/SURTD" "Microlink models with RJ45 socket - they *require* AP9620 SmartSlot expansion card and smart cable" "apcsmart"
|
||||
"APC" "ups" "2" "Back-UPS Pro USB" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "Back-UPS USB" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "Back-UPS (USB)" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "Back-UPS CS USB" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "Back-UPS RS USB" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "Back-UPS LS USB" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "Back-UPS ES/CyberFort 350" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "Back-UPS BF500" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "BACK-UPS XS LCD" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "Smart-UPS USB" "USB" "usbhid-ups"
|
||||
"APC" "ups" "2" "Back-UPS XS 1000M (Back-UPS Pro 1000, Model BX1000M)" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/139
|
||||
"APC" "ups" "2" "SMC2200BI-BR" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/557
|
||||
"APC" "ups" "2" "Smart-UPS (USB)" "USB" "usbhid-ups"
|
||||
"APC" "ups" "1" "Back-UPS" "940-0095A/C cables" "genericups upstype=1"
|
||||
"APC" "ups" "1" "Back-UPS" "940-0020B/C cables" "genericups upstype=2"
|
||||
"APC" "ups" "1" "Back-UPS" "940-0023A cable" "genericups upstype=9"
|
||||
|
@ -68,10 +87,12 @@
|
|||
"APC" "ups" "3" "Smart-UPS RT XL" "AP9618 SNMP monitoring card" "snmp-ups"
|
||||
"APC" "ups" "3" "(various)" "AP9618 SNMP monitoring card" "snmp-ups"
|
||||
"APC" "ups" "3" "(various)" "AP9630 SNMP monitoring card" "snmp-ups privProtocol=AES"
|
||||
"APC" "ups" "3" "(various)" "APCUPSD-controlled devices" "apcupsd-ups"
|
||||
"APC" "pdu" "1" "Masterswitch" "940-0020 cable" "genericups upstype=12"
|
||||
"APC" "pdu" "1" "AP9210" "8 outlets" "powerman-pdu (experimental)"
|
||||
"APC" "pdu" "1" "AP79xx" "8 to 24 outlets" "powerman-pdu (experimental)"
|
||||
"APC" "pdu" "3" "(various)" "SNMP monitoring card" "snmp-ups (experimental)"
|
||||
"APC" "pdu" "3" "(various APxxxx)" "SNMP monitoring card" "snmp-ups"
|
||||
"APC" "ats" "3" "ATS AP7724" "" "snmp-ups (experimental)"
|
||||
|
||||
"Aphel" "pdu" "3" "various PDU" "" "snmp-ups (experimental)"
|
||||
|
||||
|
@ -81,6 +102,8 @@
|
|||
|
||||
"Appro" "pdu" "1" "SWPDU" "48 outlets" "powerman-pdu (experimental)"
|
||||
|
||||
"ARES" "ups" "2" "AR265i" "USB" "nutdrv_qx port=auto vendorid=0001 productid=0000 protocol=hunnox langid_fix=0x0409 novendor noscanlangid" # https://github.com/networkupstools/nut/pull/638 did not explicitly mention the driver parameters, but other reports in the discussion did
|
||||
|
||||
"ARTronic" "ups" "2" "ARTon Millenium 1/2/3/6/10 kVA" "Serial" "blazer_ser"
|
||||
"ARTronic" "ups" "2" "ARTon Millenium 3.1 10/15/20 kVA" "Serial" "blazer_ser"
|
||||
"ARTronic" "ups" "2" "ARTon Titanium 6/10 kVA" "Serial" "blazer_ser"
|
||||
|
@ -91,6 +114,12 @@
|
|||
"ARTronic" "ups" "2" "ARTon Platinium Combo 3.1 10/15/20 kVA" "USB" "blazer_usb"
|
||||
"ARTronic" "ups" "2" "ARTon Platinium RT 1/2/3/6/10 kVA" "USB" "blazer_usb"
|
||||
|
||||
"Armac" "ups" "2" "R/2000I/PSW" "(USB ID 0925:1234)" "nutdrv_qx"
|
||||
|
||||
"ASEM SPA" "ups" "5" "PB1300 UPS" "i2c" "asem"
|
||||
|
||||
"Asium" "ups" "3" "P700" "USB" "blazer_usb" # http://www.asiumpower.com/Asium-ASIUM-P700-650VA-360W/dp/B009SMEQ10
|
||||
|
||||
"ATEK" "ups" "2" "Defensor 1K Tower / Rack" "USB" "blazer_usb"
|
||||
"ATEK" "ups" "2" "Defensor 2K Tower / Rack" "USB" "blazer_usb"
|
||||
"ATEK" "ups" "2" "Defensor 3K Tower / Rack" "USB" "blazer_usb"
|
||||
|
@ -107,6 +136,7 @@
|
|||
"Atlantis Land" "ups" "2" "(various)" "USB" "nutdrv_qx"
|
||||
|
||||
"Aviem Systems" "ups" "2" "Aviem Power RT 1000-3000VA" "" "blazer_ser"
|
||||
"Aviem Systems" "ups" "2" "Aviem Pro 2000VA" "USB" "blazer_usb" # https://github.com/networkupstools/nut/issues/827
|
||||
|
||||
"Baytech" "pdu" "1" "RPC3" "8 outlets" "powerman-pdu (experimental)"
|
||||
"Baytech" "pdu" "1" "RPC3-20NC" "8 outlets" "powerman-pdu (experimental)"
|
||||
|
@ -120,6 +150,7 @@
|
|||
"Belkin" "ups" "2" "F6H375-USB" "USB (<= 2005 models, vendor id: 050d)" "usbhid-ups"
|
||||
"Belkin" "ups" "2" "F6H375-USB" "USB (2007 models, vendor id: 0665)" "blazer_usb"
|
||||
"Belkin" "ups" "2" "Office Series F6C550-AVR" "USB" "usbhid-ups"
|
||||
"Belkin" "ups" "3" "Regulator PRO-USB" "USB (~2000, product id: 0f51)" "usbhid-ups"
|
||||
"Belkin" "ups" "2" "Regulator Pro" "F6C525-SER, F6C625-SER" "belkin"
|
||||
"Belkin" "ups" "1" "Resource" "" "genericups upstype=4"
|
||||
"Belkin" "ups" "2" "Small Enterprise F6C1500-TW-RK" "serial port" "belkin"
|
||||
|
@ -173,44 +204,63 @@
|
|||
"COVER ENERGY SA" "ups" "2" "COVER PRM 1K/2K/3K/6K/10K EC" "" "blazer_usb"
|
||||
"COVER ENERGY SA" "ups" "2" "COVER PRM 6K/10K PR" "" "blazer_usb"
|
||||
|
||||
"CPC" "ups" "2" "RACK850VA" "USB" "nutdrv_qx port=auto vendorid=0001 productid=0000 product=MEC0003 protocol=hunnox langid_fix=0x0409 novendor noscanlangid" # https://github.com/networkupstools/nut/pull/638 caveats at https://github.com/networkupstools/nut/issues/537
|
||||
|
||||
"Crown" "ups" "2" "CMU-SP1200IEC" "USB" "nutdrv_qx port=auto vendorid=0001 productid=0000 protocol=hunnox langid_fix=0x0409 novendor noscanlangid" # https://github.com/networkupstools/nut/pull/638 caveats at https://github.com/networkupstools/nut/issues/1014
|
||||
|
||||
"Cyber Power Systems" "ups" "1" "550SL" "" "genericups upstype=7"
|
||||
"Cyber Power Systems" "ups" "1" "725SL" "" "genericups upstype=7"
|
||||
"Cyber Power Systems" "ups" "1" "CPS1100AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS1200AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS1250AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS1500AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS1500AVR-HO" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS320AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS500AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS650AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS700AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS800AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS825VA" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS850AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS900AVR" "" "powerpanel" # http://www.cyberpowersystems.com/products/ups-systems/other-ups/CPS900AVR.html
|
||||
"Cyber Power Systems" "ups" "1" "CPS1250AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS1500AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "Power99" "" "genericups upstype=7"
|
||||
"Cyber Power Systems" "ups" "1" "550SL" "" "genericups upstype=7"
|
||||
"Cyber Power Systems" "ups" "1" "725SL" "" "genericups upstype=7"
|
||||
"Cyber Power Systems" "ups" "1" "CPS825VA" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS1100AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS1200AVR" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "CPS1500AVR-HO" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "PR2200" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "2" "PR3000E" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "2" "OL3000RMXL2U" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "1" "Power99" "" "genericups upstype=7"
|
||||
"Cyber Power Systems" "ups" "2" "AE550" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "BL1250U" "USB" "usbhid-ups" # https://www.cyberpowersystems.com/product/ups/battery-backup/bl1250u/ https://github.com/networkupstools/nut/issues/1012
|
||||
"Cyber Power Systems" "ups" "2" "BR1000ELCD" "USB" "usbhid-ups" # https://www.cyberpower.com/eu/en/product/sku/BR1000ELCD https://github.com/networkupstools/nut/issues/552
|
||||
"Cyber Power Systems" "ups" "2" "CP1350AVRLCD" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "CP1500AVRLCD" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "CP850PFCLCD" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/605
|
||||
"Cyber Power Systems" "ups" "2" "CP1500PFCLCD" "USB" "usbhid-ups" # https://www.cyberpowersystems.com/product/ups/cp1500pfclcd/ https://github.com/networkupstools/nut/issues/520
|
||||
"Cyber Power Systems" "ups" "2" "CP900AVR" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "CPS685AVR" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "CPS800AVR" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "AE550" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "CP 1500C" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "CP825AVR-G / LE825G" "USB" "usbhid-ups" # http://www.cyberpowersystems.com/products/ups-systems/retail-products/LE825G.html
|
||||
"Cyber Power Systems" "ups" "3" "OR2200LCDRM2U" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "OR700LCDRM1U" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "PR6000LCDRTXL5U" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "OL3000RMXL2U" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "2" "PR3000E" "" "powerpanel"
|
||||
"Cyber Power Systems" "ups" "2" "Value 1500ELCD-RU" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "Value 400E" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "Value 600E" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "Value 800E" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "CP900AVR" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "CP1000AVRLCD" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "CP1350AVRLCD" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "CP1500AVRLCD" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "2" "CP1000PFCLCD" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "CP 1500C" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "CP1000PFCLCD" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "CP1500EPFCLCD" "USB" "usbhid-ups" # http://www.cyberpower-eu.com/products/ups_systems/pfc-sinewave/cp1500epfclcd.htm
|
||||
"Cyber Power Systems" "ups" "3" "CP825AVR-G / LE825G" "USB" "usbhid-ups" # http://www.cyberpowersystems.com/products/ups-systems/retail-products/LE825G.html
|
||||
"Cyber Power Systems" "ups" "3" "EC350G" "USB" "usbhid-ups" # https://www.cyberpowersystems.com/products/ups/ecologic/ec350g
|
||||
"Cyber Power Systems" "ups" "3" "EC750G" "USB" "usbhid-ups" # https://www.cyberpowersystems.com/products/ups/desktop/ec750g
|
||||
"Cyber Power Systems" "ups" "3" "EC850LCD" "USB" "usbhid-ups" # https://www.cyberpowersystems.com/product/ups/ec850lcd/ https://github.com/networkupstools/nut/issues/622
|
||||
"Cyber Power Systems" "ups" "3" "OR1500ERM1U" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/1338
|
||||
"Cyber Power Systems" "ups" "3" "OR2200LCDRM2U" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "OR700LCDRM1U" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "OR500LCDRM1U" "USB" "usbhid-ups" # https://www.cyberpowersystems.com/product/ups/or500lcdrm1u/ https://github.com/networkupstools/nut/issues/578
|
||||
"Cyber Power Systems" "ups" "3" "RT650EI" "USB" "usbhid-ups" # http://www.cyberpowersystems.de/produkte/backup-usv-serien/rt-serie.html https://github.com/networkupstools/nut/issues/453
|
||||
"Cyber Power Systems" "ups" "3" "UT2200E" "USB" "usbhid-ups" # https://www.cyberpower.com/ww/en/product/sku/UT2200E https://github.com/networkupstools/nut/issues/556
|
||||
"Cyber Power Systems" "ups" "3" "PR1500RT2U" "" "usbhid-ups" # https://www.cyberpowersystems.com/product/ups/new-smart-app-sinewave/pr1500rt2u/ https://github.com/networkupstools/nut/issues/1191
|
||||
"Cyber Power Systems" "ups" "3" "PR6000LCDRTXL5U" "USB" "usbhid-ups"
|
||||
"Cyber Power Systems" "ups" "3" "PR2200LCDRT2U" "" "snmp-ups"
|
||||
"Cyber Power Systems" "ups" "3" "RMCARD100" "" "snmp-ups"
|
||||
"Cyber Power Systems" "ups" "3" "RMCARD201" "" "snmp-ups"
|
||||
"Cyber Power Systems" "ups" "3" "RMCARD202" "" "snmp-ups"
|
||||
"Cyber Power Systems" "ups" "3" "RMCARD205" "" "snmp-ups"
|
||||
"Cyber Power Systems" "ups" "3" "RMCARD301" "" "snmp-ups"
|
||||
|
||||
"Cyclades" "pdu" "1" "PM8" "8 outlets" "powerman-pdu (experimental)"
|
||||
|
@ -240,14 +290,24 @@
|
|||
"Dell" "ups" "5" "Various (XML/HTTP mode)" "UPS Network Management Card" "netxml-ups (experimental)"
|
||||
|
||||
"Delta" "ups" "1" "GES602N" "" "belkin"
|
||||
"Delta" "ups" "4" "Delta UPS Amplon R Series" "USB port" "usbhid-ups"
|
||||
|
||||
"Deltec" "ups" "1" "PowerRite Pro II" "" "genericups upstype=15"
|
||||
"Deltec" "ups" "4" "PRM 450/700/1000/1500" "" "upscode2"
|
||||
|
||||
"DEXP" "ups" "2" "MIX 850VA" "USB" "blazer_usb langid_fix=0x0409 runtimecal=240,100,720,50 default.battery.voltage.high=2.27 default.battery.voltage.low=1.72" # https://github.com/networkupstools/nut/issues/721
|
||||
|
||||
"Digital Loggers" "pdu" "1" "LPC, EPCR2, DIN" "8 outlets" "powerman-pdu (experimental)"
|
||||
|
||||
"DigiTECH" "ups" "2" "Computer 650VA" "USB" "nutdrv_qx port=auto vendorid=0001 productid=0000 protocol=hunnox langid_fix=0x0409 novendor noscanlangid" # https://github.com/networkupstools/nut/pull/638 caveats at https://github.com/networkupstools/nut/issues/674 (may need longer pollinterval)
|
||||
|
||||
"Digitus" "ups" "1" "DN-170014" "USB" "richcomm_usb" # http://www.digitus.info/en/products/professional-network/security-and-surveillance/power-supply/uninterrruptable-power-supplies/ups-uninterruptible-power-systems-dn-170014/section/prof/
|
||||
"Digitus" "ups" "2" "DN-170020" "" "blazer_ser"
|
||||
"Digitus" "ups" "2" "DN-170040" "USB" "blazer_usb" # https://github.com/networkupstools/nut/issues/1251
|
||||
"Digitus" "ups" "2" "DN-170041" "USB" "blazer_usb" # https://github.com/networkupstools/nut/issues/1251
|
||||
"Digitus" "ups" "2" "DN-170040" "USB" "nutdrv_qx" # https://github.com/networkupstools/nut/issues/1251
|
||||
"Digitus" "ups" "2" "DN-170041" "USB" "nutdrv_qx" # https://github.com/networkupstools/nut/issues/1251
|
||||
"Digitus" "ups" "2" "DN-170076" "USB" "nutdrv_qx" # https://www.digitus.info/en/products/network-and-server-cabinets/power-supply/uninterruptible-power-supplies/dn-170076/ https://github.com/networkupstools/nut/issues/948
|
||||
|
||||
"Dynamix" "ups" "2" "UPS1700D" "" "blazer_ser"
|
||||
"Dynamix" "ups" "2" "UPS-650VA" "" "blazer_ser"
|
||||
|
@ -261,6 +321,7 @@
|
|||
"Eaton" "ups" "5" "Ellipse ECO 650/800/1200/1600 VA" "USB" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "USB cable" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "USB cable" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "Ellipse PRO 650 VA" "USB cable" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "EX 700/1000/1500 VA" "USB port" "usbhid-ups"
|
||||
|
@ -269,30 +330,41 @@
|
|||
"Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "5 PX" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "Nova AVR 625/1250" "USB" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "5E650iUSB" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "5E1100iUSB" "USB port" "usbhid-ups" # http://powerquality.eaton.com/5E1100iUSB.aspx?CX&GUID=8D85FE66-3102-427C-8F33-B8D56BBDD4D3
|
||||
"Eaton" "ups" "4" "5E2200" "USB port" "nutdrv_qx"
|
||||
"Eaton" "ups" "5" "5S" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "5SC" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "5P" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "9SX" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "EX 700/1000/1500 VA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "EX 2200/3000/3000 XL VA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "EX 1000 RT2U / 1500 RT2U" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "5 PX" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "EX RT 1:1 7/11 kVA" "" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "EX RT 3:1 5/7/11 kVA" "" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "5SC" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "5P" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "9SX" "Serial port" "mge-shut or oldmge-shut"
|
||||
"Eaton" "ups" "5" "9PX" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "9PX Split Phase 6/8/10 kVA" "USB port" "usbhid-ups"
|
||||
"Eaton" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut"
|
||||
"Eaton" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut"
|
||||
"Eaton" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "EX 700/1000/1500 VA" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "EX 2200/3000/3000 XL VA" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "EX 1000 RT2U / 1500 RT2U" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "5 PX" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "EX RT 1:1 7/11 kVA" "" "mge-shut"
|
||||
"Eaton" "ups" "5" "EX RT 3:1 5/7/11 kVA" "" "mge-shut"
|
||||
"Eaton" "ups" "5" "5SC" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "5P" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "9SX" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "9PX" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "9PX 2000 RT" "USB port" "mge-shut" # https://github.com/networkupstools/nut/issues/540
|
||||
"Eaton" "ups" "5" "9PX Split Phase 6/8/10 kVA" "Serial port" "mge-shut"
|
||||
"Eaton" "ups" "5" "9PX" "SNMP/Web card" "netxml-ups"
|
||||
"Eaton" "ups" "5" "9PX Split Phase 6/8/10 kVA" "SNMP/Web card" "netxml-ups"
|
||||
"Eaton" "ups" "5" "EX RT (XML/HTTP)" "NMC Transverse card (ref 66074)" "netxml-ups (experimental)"
|
||||
"Eaton" "ups" "5" "EX RT (SNMP)" "NMC Transverse card (ref 66074)" "snmp-ups (experimental)"
|
||||
"Eaton" "ups" "5" "E Series NV UPS 400-2000 VA" "" "blazer_usb"
|
||||
"Eaton" "ups" "5" "E Series DX UPS 1-20 kVA" "" "mge-utalk"
|
||||
"Eaton" "ups" "5" "E Series DX UPS 1-20 kVA" "" "blazer_ser" # http://www.eaton.com/Eaton/ESeriesUPS/DXUPS/
|
||||
"Eaton" "ups" "4" "NetUPS SE 450/700/1000/1500" "" "upscode2"
|
||||
"Eaton" "ups" "5" "BladeUPS (SNMP)" "ConnectUPS Web/SNMP Card" "snmp-ups (experimental)"
|
||||
"Eaton" "ups" "5" "various models (SNMP mode)" "Power Xpert Gateway UPS Card" "snmp-ups (experimental)"
|
||||
"Eaton" "ups" "5" "various models (XML/HTTP mode)" "NMC Minislot (ref 66102)" "netxml-ups (experimental)"
|
||||
"Eaton" "ups" "5" "various models (SNMP mode)" "NMC Minislot (ref 66102)" "snmp-ups (experimental)"
|
||||
"Eaton" "ups" "5" "various models (XML/HTTP mode)" "SNMP/Web Minislot card (ref 66244)" "netxml-ups (experimental)"
|
||||
|
@ -302,6 +374,7 @@
|
|||
"Eaton" "pdu" "5" "ePDU Switched" "" "snmp-ups"
|
||||
"Eaton" "pdu" "5" "ePDU Monitored" "" "snmp-ups or netxml-ups"
|
||||
"Eaton" "ups" "5" "Powerware 3105" "USB" "bcmxcp_usb" # http://powerquality.eaton.com/Products-services/Backup-Power-UPS/3105-eol.aspx
|
||||
"Eaton" "ups" "5" "Powerware 9125" "USB card" "bcmxcp_usb"
|
||||
"Eaton" "ups" "5" "Powerware 9130" "" "bcmxcp or usbhid-ups"
|
||||
"Eaton" "ups" "5" "Powerware 9140" "" "bcmxcp or usbhid-ups"
|
||||
"Eaton" "ups" "5" "Powerware 5130" "" "usbhid-ups"
|
||||
|
@ -310,15 +383,27 @@
|
|||
"Eaton" "ups" "5" "ConnectUPS X / BD / E Slot" "Serial Pass-through mode" "bcmxcp"
|
||||
"Eaton" "ups" "5" "ConnectUPS X / BD / E Slot" "Network port" "snmp-ups"
|
||||
"Eaton" "ups" "5" "Management Card Contact" "Config 3 - Cable 66033" "genericups upstype=7"
|
||||
"Eaton" "ats" "5" "Eaton ATS16" "" "snmp-ups"
|
||||
"Eaton" "ats" "5" "Eaton ATS30" "" "snmp-ups"
|
||||
|
||||
"Effekta" "ups" "2" "MI/MT/MH" "2502 cable" "blazer_ser"
|
||||
"Effekta" "ups" "2" "RM2000MH" "" "blazer_ser"
|
||||
|
||||
"Electrys" "ups" "2" "UPS 2500" "" "nutdrv_qx or blazer_ser"
|
||||
|
||||
"Elsist" "ups" "2" "Nemo2.0 160" "USB" "blazer_usb" # http://www.naicon.com/company/wp-content/uploads/2017/05/Manual-NEMO2.0-Ver.02-Eng.pdf https://github.com/networkupstools/nut/issues/719
|
||||
|
||||
"Emerson" "pdu" "3" "PM3000 metered & switched" "" "snmp-ups"
|
||||
|
||||
"Energy Sistem" "ups" "2" "(various)" "" "blazer_ser"
|
||||
|
||||
"Energy Technologies" "ups" "2" "DPK1/1-3" "Serial" "blazer_ser" # https://www.tensy.ru/podderzhka/dokumentatsiya/ibp-serii-dpk/ https://github.com/networkupstools/nut/issues/762
|
||||
|
||||
"ETA" "ups" "1" "mini+UPS" "WinNT/Upsoft cable" "genericups upstype=7"
|
||||
"ETA" "ups" "1" "mini+UPS PRO" "UPS Explorer cable" "etapro"
|
||||
|
||||
"EUROCASE" "ups" "2" "EA200N 2000VA" "USB" "nutdrv_qx" # http://partis.cz/index.php?gid=2551
|
||||
|
||||
"EVER" "ups" "1" "NET DPC series" "Serial port" "everups"
|
||||
"EVER" "ups" "1" "AP Pro series" "Serial port" "everups"
|
||||
"EVER" "ups" "1" "625/1000" "" "safenet"
|
||||
|
@ -329,6 +414,7 @@
|
|||
"EVER" "ups" "2" "DUO II Pro series" "USB port" "blazer_usb"
|
||||
"EVER" "ups" "2" "POWERLINE RT 1-3kVA series" "USB port" "blazer_usb"
|
||||
"EVER" "ups" "2" "POWERLINE RT 6-10kVA series" "USB port" "blazer_usb"
|
||||
"EVER" "ups" "4" "ECO Pro AVR CDS series" "USB port" "usbhid-ups"
|
||||
|
||||
"Exide" "ups" "1" "NetUPS SE" "" "genericups upstype=15"
|
||||
"Exide" "ups" "4" "NetUPS SE 450/700/1000/1500" "" "upscode2"
|
||||
|
@ -341,13 +427,19 @@
|
|||
"Fairstone" "ups" "1" "L525/L625/L750" "" "safenet"
|
||||
|
||||
"Fideltronik" "ups" "1" "Ares 700 and larger" "" "genericups upstype=6"
|
||||
"Fideltronik" "ups" "2" "LUPUS 500" "USB" "nutdrv_qx"
|
||||
"Fideltronik" "ups" "1" "Other Ares models" "" "genericups upstype=19"
|
||||
"Fideltronik INIGO" "ups" "2" "Viper 1200" "USB" "nutdrv_qx" # http://fideltronikinigo.com/viper/viper-1200/
|
||||
|
||||
"Fiskars" "ups" "4" "PowerRite MAX" "" "upscode2"
|
||||
"Fiskars" "ups" "4" "PowerServer 10" "" "upscode2"
|
||||
"Fiskars" "ups" "4" "PowerServer 30" "" "upscode2"
|
||||
"Fiskars" "ups" "4" "9200" "UPS Information Unit" "upscode2"
|
||||
|
||||
"Flight Technic & International (FTUPS)" "ups" "2" "FT-1000BS" "Serial" "nutdrv_qx"
|
||||
"Flight Technic & International (FTUPS)" "ups" "2" "FT-1000BS" "USB" "nutdrv_qx"
|
||||
"Flight Technic & International (FTUPS)" "ups" "2" "FT-1000BS(T)" "Serial" "nutdrv_qx"
|
||||
"Flight Technic & International (FTUPS)" "ups" "2" "FT-1000BS(T)" "USB" "nutdrv_qx"
|
||||
"Flight Technic & International (FTUPS)" "ups" "2" "Smart On Line UPS 1KVA" "Serial" "nutdrv_qx"
|
||||
"Flight Technic & International (FTUPS)" "ups" "2" "Smart On Line UPS 1KVA" "USB" "nutdrv_qx"
|
||||
"Flight Technic & International (FTUPS)" "ups" "2" "(various)" "Serial" "nutdrv_qx"
|
||||
|
@ -372,6 +464,11 @@
|
|||
|
||||
"Gemini" "ups" "1" "UPS625/UPS1000" "" "safenet"
|
||||
|
||||
"Grafenthal" "ups" "2" "PR-3000-HS" "SNMP/Web Minislot card (ref 149G0006)" "snmp-ups" # http://grafenthal.de/produkte/usv/online/pr-hs-serie/pr-3000-hs/?L=3et8
|
||||
|
||||
"Greencell" "ups" "2" "Micropower 600" "USB" "nutdrv_qx" # https://github.com/networkupstools/nut/issues/1080
|
||||
"Greencell" "ups" "2" "Micropower 600" "USB" "blazer_usb" # https://github.com/networkupstools/nut/issues/1080
|
||||
|
||||
"Gtec" "ups" "2" "ZP120N-1K / ZP120N-1KS / ZP120N-2K / ZP120N-2KS / ZP120N-3K / ZP120N-3KS" "" "blazer_usb"
|
||||
"Gtec" "ups" "2" "ZP120N-6K / ZP120N-6KS / ZP120N-10K-11 / ZP120N-10KS-11" "" "blazer_usb"
|
||||
"Gtec" "ups" "2" "ZP120N-10K-31-00 / ZP120N-10K-31-07 / ZP120N-10K-31-09 / ZP120N-10K-31-99 / ZP120N-20K" "USB port" "blazer_usb"
|
||||
|
@ -379,6 +476,8 @@
|
|||
"Gtec" "ups" "2" "ZP120N-10K-31-00 / ZP120N-10K-31-07 / ZP120N-10K-31-09 / ZP120N-10K-31-99 / ZP120N-20K" "Serial port" "blazer_ser"
|
||||
"Gtec" "ups" "2" "AP160N-1K / AP160LCD-1K-KS / AP160N-2K / AP160LCD-2K-KS / AP160N-3K / AP160LCD-3K-KS / AP160N-6K-PDU / AP160N-10K-PDU" "Serial port" "blazer_ser"
|
||||
|
||||
"Guardian" "ups" "2" "LCD 1500 AP (IGA1500LCD)" "Serial" "nutdrv_qx"
|
||||
|
||||
"HP" "ups" "1" "PowerTrust 2997A" "HP 5061-2575 cable" "apcsmart"
|
||||
"HP" "ups" "3" "T750 G2" "Serial port" "bcmxcp"
|
||||
"HP" "ups" "3" "T1000 G3" "Serial port" "bcmxcp"
|
||||
|
@ -387,8 +486,8 @@
|
|||
"HP" "ups" "4" "R3000 XR" "" "bcmxcp"
|
||||
"HP" "ups" "4" "R5500 XR" "" "bcmxcp"
|
||||
"HP" "ups" "3" "T500 / T750" "older models, USB port" "bcmxcp_usb"
|
||||
"HP" "ups" "3" "R/T3000" "Serial port" "mge-shut or oldmge-shut"
|
||||
"HP" "ups" "3" "R5000 / R7000" "Serial port" "mge-shut or oldmge-shut"
|
||||
"HP" "ups" "3" "R/T3000" "Serial port" "mge-shut"
|
||||
"HP" "ups" "3" "R5000 / R7000" "Serial port" "mge-shut"
|
||||
"HP" "ups" "3" "T750 INTL" "" "usbhid-ups"
|
||||
"HP" "ups" "3" "T1000 INTL" "" "usbhid-ups"
|
||||
"HP" "ups" "3" "T1500 INTL" "" "usbhid-ups"
|
||||
|
@ -402,6 +501,15 @@
|
|||
"HP" "ups" "4" "Various (SNMP mode)" "HP UPS Management Module" "snmp-ups"
|
||||
"HP" "pdu" "1" "HP3488 Switch/Control Unit" "" "powerman-pdu (experimental)"
|
||||
|
||||
"HPE" "pdu" "5" "Various (SNMP mode)" "" "snmp-ups"
|
||||
|
||||
"Huawei" "ups" "4" "UPS5000-E" "" "snmp-ups"
|
||||
"Huawei" "ups" "3" "UPS2000-G and UPS2000-A series" "MODBUS (USB with Linux 5.12+, or Serial RS-232)" "huawei-ups2000" # https://github.com/networkupstools/nut/issues/1066 https://github.com/networkupstools/nut/pull/1198 https://github.com/networkupstools/nut/pull/954 https://github.com/networkupstools/nut/issues/1017
|
||||
|
||||
"Hunnox" "ups" "2" "HNX-850" "USB" "nutdrv_qx port=auto vendorid=0001 productid=0000 protocol=hunnox langid_fix=0x0409 novendor noscanlangid" # https://github.com/networkupstools/nut/pull/638
|
||||
|
||||
"IBM" "ups" "5" "Various" "USB port" "usbhid-ups"
|
||||
"IBM" "ups" "5" "Various" "Serial port" "mge-shut"
|
||||
"IBM" "pdu" "1" "Blade Center Management Module" "15 outlets" "powerman-pdu (experimental)"
|
||||
|
||||
"ICS" "pdu" "1" "8064 Ethernet Relay Interface" "16 outlets" "powerman-pdu (experimental)"
|
||||
|
@ -429,10 +537,12 @@
|
|||
|
||||
"IPMI" "pdu" "1" "" "" "powerman-pdu (experimental)"
|
||||
|
||||
"Ippon" "ups" "2" "Back Basic 850 Euro" "USB" "blazer_usb (experimental)" # https://github.com/networkupstools/nut/issues/802
|
||||
"Ippon" "ups" "2" "Back Power Pro 400/500/600/700/800" "" "blazer_ser"
|
||||
"Ippon" "ups" "2" "Back Power Pro 400/500/600/700/800" "USB" "blazer_usb (experimental)"
|
||||
"Ippon" "ups" "2" "Back Comfo Pro 600/800" "" "blazer_ser"
|
||||
"Ippon" "ups" "2" "Back Comfo Pro 600/800" "USB" "blazer_usb (experimental)"
|
||||
"Ippon" "ups" "2" "Back Comfo Pro II 650/850/1050" "USB" "blazer_usb (experimental)"
|
||||
"Ippon" "ups" "2" "Smart Power Pro 1000/1400/2000" "" "blazer_ser"
|
||||
"Ippon" "ups" "2" "Smart Power Pro 1000/1400/2000" "USB" "blazer_usb (experimental)"
|
||||
"Ippon" "ups" "2" "Smart Winner 750/1000/1500/2000/3000" "" "blazer_ser"
|
||||
|
@ -445,9 +555,13 @@
|
|||
|
||||
"Jageson Technology" "ups" "1" "Jasuny USPS" "" "genericups upstype=4"
|
||||
|
||||
"JAWAN" "ups" "2" "JW-UPSLC02" "USB" "blazer_usb"
|
||||
|
||||
"Kanji" "ups" "1" "800 VA" "USB" "nutdrv_atcl_usb"
|
||||
|
||||
"Kebo" "ups" "2" "1200D/D Series" "" "blazer_ser"
|
||||
"Kebo" "ups" "2" "UPS-1000D (UPS-1000VA)" "USB" "blazer_usb" # https://github.com/networkupstools/nut/issues/981
|
||||
"Kebo" "ups" "2" "UPS-650VA" "USB" "megatec_usb"
|
||||
|
||||
"KOLFF" "ups" "2" "BLACK NOVA 1K/2K/3K/6K/10K/20K TOWER" "" "blazer_usb"
|
||||
"KOLFF" "ups" "2" "BLACK NOVA 1K/2K/3K/6K/10K/20K XL TOWER" "" "blazer_usb"
|
||||
|
@ -457,8 +571,48 @@
|
|||
"Krauler" "ups" "2" "UP-D1200VA" "USB" "blazer_usb"
|
||||
"Krauler" "ups" "2" "UP-M500VA" "USB" "blazer_usb"
|
||||
|
||||
"Lacerda" "ups" "2" "New Orion 800VA" "USB" "blazer_usb"
|
||||
|
||||
"LDLC" "ups" "2" "UPS-1200D" "" "blazer_usb langid_fix=0x4095"
|
||||
|
||||
"Legrand" "ups" "2" "Daker DK" "Serial" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Daker DK" "USB" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Daker DK Plus" "Serial" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Daker DK Plus" "USB" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Keor Line RT" "Serial" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Keor Line RT" "USB" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Keor LP" "Serial" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Keor Multiplug" "USB" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Keor S" "Serial" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Keor S" "USB" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Keor PDU" "USB" "usbhid-ups"
|
||||
"Legrand" "ups" "2" "Keor SP" "USB" "usbhid-ups"
|
||||
"Legrand" "ups" "2" "Keor SPX" "USB" "nutdrv_qx"
|
||||
"Legrand" "ups" "4" "Megaline 1250" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "Megaline 2500" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "Megaline 3750" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "Megaline 5000" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "Megaline 5000 /2" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "Megaline 6250 /2" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "Megaline 7500 /2" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "Megaline 8750 /2" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "Megaline 10000 /2" "Serial" "metasys"
|
||||
"Legrand" "ups" "2" "Niky" "Serial" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Niky" "USB" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Niky S" "Serial" "nutdrv_qx"
|
||||
"Legrand" "ups" "2" "Niky S" "USB" "nutdrv_qx"
|
||||
"Legrand" "ups" "4" "WHAD 800" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD 1000" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD 1250" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD 1500" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD 2000" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD 2500" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD CAB 1250" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD CAB 2500" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD HE 800" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD HE 1000" "Serial" "metasys"
|
||||
"Legrand" "ups" "4" "WHAD HE 1500" "Serial" "metasys"
|
||||
|
||||
"Lestar" "ups" "2" "MD-800E" "" "blazer_ser"
|
||||
|
||||
"Lexis" "ups" "2" "X-Power Tigra 1kVA" "" "blazer_ser or bestups"
|
||||
|
@ -468,60 +622,66 @@
|
|||
"Liebert" "ups" "1" "GXT2-3000RT230" "" "liebert-esp2 (experimental)"
|
||||
"Liebert" "ups" "2" "PowerSure Personal XT" "USB" "usbhid-ups"
|
||||
"Liebert" "ups" "2" "PowerSure PSA" "USB" "usbhid-ups"
|
||||
"Liebert" "ups" "2" "PowerSure PSA 500" "USB" "usbhid-ups"
|
||||
"Liebert" "ups" "2" "PowerSure PSA500MT3-230U" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/601
|
||||
"Liebert" "ups" "2" "PowerSure PSI 1440" "USB" "usbhid-ups" # http://www.emersonnetworkpower.com/en-US/Products/ACPower/Pages/LiebertPowerSurePSILineInteractiveUPS10003000VA.aspx
|
||||
|
||||
"LNXI" "pdu" "1" "Icebox" "10 outlets" "powerman-pdu (experimental)"
|
||||
|
||||
"Lyonn" "ups" "2" "CTB-800V" "" "nutdrv_qx"
|
||||
"Lyonn" "ups" "2" "CTB-1200" "" "blazer_usb"
|
||||
|
||||
"Masterguard" "ups" "1" "(various)" "" "masterguard"
|
||||
|
||||
"Maxxtro" "ups" "2" "UPS 600 VA" "serial port" "blazer_ser"
|
||||
|
||||
"Mecer" "ups" "2" "ME-1000-WTU" "USB" "nutdrv_qx" # http://www.comx-computers.co.za/download/mecer/ME-1000-WTU.pdf
|
||||
"Mecer" "ups" "2" "ME-2000" "" "blazer_ser"
|
||||
|
||||
"Meta System" "ups" "1" "HF Line" "1..4 boards" "metasys"
|
||||
"Meta System" "ups" "1" "HF Line \/2" "5..8 boards" "metasys"
|
||||
"Meta System" "ups" "1" "HF Millennium 810" "" "metasys"
|
||||
"Meta System" "ups" "1" "HF Millennium 820" "" "metasys"
|
||||
"Meta System" "ups" "1" "HF TOP Line 910" "" "metasys"
|
||||
"Meta System" "ups" "1" "HF TOP Line 920" "" "metasys"
|
||||
"Meta System" "ups" "1" "HF TOP Line 930" "" "metasys"
|
||||
"Meta System" "ups" "1" "HF TOP Line 940" "" "metasys"
|
||||
"Meta System" "ups" "1" "HF TOP Line 950" "" "metasys"
|
||||
"Meta System" "ups" "1" "HF TOP Line 960" "" "metasys"
|
||||
"Meta System" "ups" "1" "HF TOP Line 970" "" "metasys"
|
||||
"Meta System" "ups" "1" "HF TOP Line 980" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO Network 750" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO Network 1000" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO Network 1050" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO Network 1500" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO Network 1800" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO Network 2000" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO Network 2100" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO Network 2500" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO Network 3000" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO 305" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO 308" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO 311" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO 511" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO 516" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO 519" "" "metasys"
|
||||
"Meta System" "ups" "1" "ECO 522" "" "metasys"
|
||||
"Meta System" "ups" "1" "ally HF 800" "" "metasys"
|
||||
"Meta System" "ups" "1" "ally HF 1000" "" "metasys"
|
||||
"Meta System" "ups" "1" "ally HF 1250" "" "metasys"
|
||||
"Meta System" "ups" "1" "ally HF 1600" "" "metasys"
|
||||
"Meta System" "ups" "1" "ally HF 2000" "" "metasys"
|
||||
"Meta System" "ups" "1" "ally HF 2500" "" "metasys"
|
||||
"Meta System" "ups" "1" "Megaline 1250" "" "metasys"
|
||||
"Meta System" "ups" "1" "Megaline 2500" "" "metasys"
|
||||
"Meta System" "ups" "1" "Megaline 3750" "" "metasys"
|
||||
"Meta System" "ups" "1" "Megaline 5000" "" "metasys"
|
||||
"Meta System" "ups" "1" "Megaline 6250" "" "metasys"
|
||||
"Meta System" "ups" "1" "Megaline 7500" "" "metasys"
|
||||
"Meta System" "ups" "1" "Megaline 8750" "" "metasys"
|
||||
"Meta System" "ups" "1" "Megaline 10000" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF Line" "1..4 boards" "metasys"
|
||||
"Meta System" "ups" "4" "HF Line /2" "5..8 boards" "metasys"
|
||||
"Meta System" "ups" "4" "HF Millennium 810" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF Millennium 820" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF TOP Line 910" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF TOP Line 920" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF TOP Line 930" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF TOP Line 940" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF TOP Line 950" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF TOP Line 960" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF TOP Line 970" "" "metasys"
|
||||
"Meta System" "ups" "4" "HF TOP Line 980" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO Network 750" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO Network 1000" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO Network 1050" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO Network 1500" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO Network 1800" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO Network 2000" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO Network 2100" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO Network 2500" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO Network 3000" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO 305" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO 308" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO 311" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO 511" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO 516" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO 519" "" "metasys"
|
||||
"Meta System" "ups" "4" "ECO 522" "" "metasys"
|
||||
"Meta System" "ups" "4" "ally HF 800" "" "metasys"
|
||||
"Meta System" "ups" "4" "ally HF 1000" "" "metasys"
|
||||
"Meta System" "ups" "4" "ally HF 1250" "" "metasys"
|
||||
"Meta System" "ups" "4" "ally HF 1600" "" "metasys"
|
||||
"Meta System" "ups" "4" "ally HF 2000" "" "metasys"
|
||||
"Meta System" "ups" "4" "ally HF 2500" "" "metasys"
|
||||
"Meta System" "ups" "4" "Megaline 1250" "" "metasys"
|
||||
"Meta System" "ups" "4" "Megaline 2500" "" "metasys"
|
||||
"Meta System" "ups" "4" "Megaline 3750" "" "metasys"
|
||||
"Meta System" "ups" "4" "Megaline 5000" "" "metasys"
|
||||
"Meta System" "ups" "4" "Megaline 6250" "" "metasys"
|
||||
"Meta System" "ups" "4" "Megaline 7500" "" "metasys"
|
||||
"Meta System" "ups" "4" "Megaline 8750" "" "metasys"
|
||||
"Meta System" "ups" "4" "Megaline 10000" "" "metasys"
|
||||
"Meta System" "ups" "4" "DHEA 1000" "Serial" "metasys"
|
||||
"Meta System" "ups" "4" "DHEA 1500" "Serial" "metasys"
|
||||
|
||||
"MGE Office Protection Systems" "ups" "5" "Protection Center 500/675 VA" "USB" "usbhid-ups"
|
||||
"MGE Office Protection Systems" "ups" "5" "Protection Station 500/650/800 VA" "USB" "usbhid-ups"
|
||||
|
@ -532,15 +692,15 @@
|
|||
"MGE Office Protection Systems" "ups" "5" "Pulsar 700/1000/1500 VA" "USB port" "usbhid-ups"
|
||||
"MGE Office Protection Systems" "ups" "5" "Pulsar M 2200/3000 VA" "USB port" "usbhid-ups"
|
||||
"MGE Office Protection Systems" "ups" "5" "Pulsar MX 5/8/10/15/20 kVA" "USB port" "usbhid-ups"
|
||||
"MGE Office Protection Systems" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Pulsar 700/1000/1500 VA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Pulsar M 2200/3000 VA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Pulsar MX 5/8/10/15/20 kVA" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Comet EX RT 1:1 7/11 kVA" "" "mge-shut or oldmge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Comet EX RT 3:1 5/7/11 kVA" "" "mge-shut or oldmge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Pulsar 700/1000/1500 VA" "Serial port" "mge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Pulsar M 2200/3000 VA" "Serial port" "mge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Pulsar MX 5/8/10/15/20 kVA" "Serial port" "mge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Comet EX RT 1:1 7/11 kVA" "" "mge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Comet EX RT 3:1 5/7/11 kVA" "" "mge-shut"
|
||||
"MGE Office Protection Systems" "ups" "5" "Comet EX RT (XML/HTTP)" "NMC Transverse card (ref 66074)" "netxml-ups (experimental)"
|
||||
"MGE Office Protection Systems" "ups" "5" "Comet EX RT (SNMP)" "NMC Transverse card (ref 66074)" "snmp-ups (experimental)"
|
||||
"MGE Office Protection Systems" "ups" "5" "various models (XML/HTTP mode)" "NMC Minislot (Ref 66102)" "netxml-ups (experimental)"
|
||||
|
@ -588,45 +748,45 @@
|
|||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 4000 RT" "USB" "usbhid-ups"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 5000 RT" "USB" "usbhid-ups"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Comet / Galaxy (USB)" "USB Card (ref 66067)" "usbhid-ups"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 600 Serial" "" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 1100 Serial" "" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse USBS" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse S" "" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium USBS" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium S" "" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 600" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 750" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 1000" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 1500" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 600" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 850" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 1100" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 1500" "Serial cable" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme C / EX RT" "" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Comet EX RT" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Comet EX RT 3:1" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Esprit" "" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 650" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 850" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 1150" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1250" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 1550" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1750" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 2000" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 2500" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 3000" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 2200" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 3000" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 3000 XL" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 700" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000 RT2U" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500 RT2U" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 4000 RT" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 5000 RT" "Serial port" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Evolution" "Serial port" "mge-shut or oldmge-shut or mge-utalk"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme C" "" "mge-shut or oldmge-shut or mge-utalk"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 600 Serial" "" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 1100 Serial" "" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse USBS" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse S" "" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium USBS" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium S" "" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 600" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 750" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 1000" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 1500" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 600" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 850" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 1100" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse MAX 1500" "Serial cable" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme C / EX RT" "" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Comet EX RT" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Comet EX RT 3:1" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Esprit" "" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 650" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 850" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 1150" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1250" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 1550" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1750" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 2000" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 2500" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 3000" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 2200" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 3000" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar M 3000 XL" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 700" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000 RT2U" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500 RT2U" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 4000 RT" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 5000 RT" "Serial port" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Evolution" "Serial port" "mge-shut or mge-utalk"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme C" "" "mge-shut or mge-utalk"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar ES+" "" "mge-utalk"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar ESV+" "" "mge-utalk"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar SV" "" "mge-utalk"
|
||||
|
@ -638,7 +798,7 @@
|
|||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme" "" "mge-utalk"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Comet EXtreme" "" "mge-utalk"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Comet / Galaxy (Serial)" "Utalk Serial Card (ref 66060)" "mge-utalk"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Comet / Galaxy (Serial)" "HID COM Serial Card (ref 66066)" "mge-shut or oldmge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Comet / Galaxy (Serial)" "HID COM Serial Card (ref 66066)" "mge-shut"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar / Comet / Galaxy (SNMP)" "SNMP/Web Transverse card (ref 66074)" "snmp-ups (experimental)"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "various models (XML/HTTP mode)" "NMC Minislot (Ref 66102)" "netxml-ups (experimental)"
|
||||
"MGE UPS SYSTEMS" "ups" "5" "various models (SNMP mode)" "NMC Minislot (Ref 66102)" "snmp-ups (experimental)"
|
||||
|
@ -671,6 +831,8 @@
|
|||
"Microline" "ups" "2" "C-Lion Innova Tower 6K/10K" "" "blazer_usb"
|
||||
"Microline" "ups" "2" "C-Lion Innova Combo 10K/20K (3/1)" "" "blazer_usb"
|
||||
|
||||
"Micropower" "ups" "2" "LCD 1000" "USB" "blazer_usb"
|
||||
|
||||
"Microsol" "ups" "4" "Solis 1.0" "1000VA" "solis"
|
||||
"Microsol" "ups" "4" "Solis 1.5" "1500VA" "solis"
|
||||
"Microsol" "ups" "4" "Solis 2.0" "2000VA" "solis"
|
||||
|
@ -696,14 +858,27 @@
|
|||
|
||||
"Neus" "ups" "2" "400va / 600va" "" "blazer_ser"
|
||||
|
||||
"NHS Sistemas de Energia" "ups" "5" "Expert C Online 6000" "" "gamatronic" # http://www.nhs.com.br/produtos_interna/id/TWpFeQ==
|
||||
"NHS Sistemas de Energia" "ups" "5" "Expert C Online 8000" "" "gamatronic"
|
||||
"NHS Sistemas de Energia" "ups" "5" "Expert C Online 10000" "" "gamatronic"
|
||||
"NHS Sistemas de Energia" "ups" "5" "Expert S Online 6000" "" "gamatronic"
|
||||
"NHS Sistemas de Energia" "ups" "5" "Expert S Online 8000" "" "gamatronic"
|
||||
"NHS Sistemas de Energia" "ups" "5" "Expert S Online 10000" "" "gamatronic"
|
||||
"NHS Sistemas de Energia" "ups" "5" "Expert S Online 10000" "" "gamatronic"
|
||||
"NHS Sistemas de Energia" "ups" "5" "Laser Senoidal 5000VA" "USB" "gamatronic" # http://www.nhs.com.br/produtos_interna/id/T0RrPQ==
|
||||
|
||||
"Nitram" "ups" "1" "Elite 500" "" "genericups upstype=8"
|
||||
"Nitram" "ups" "1" "Elite 2002" "" "genericups upstype=16"
|
||||
"Nitram" "ups" "1" "Elite 2005" "" "powerpanel"
|
||||
|
||||
"nJoy" "ups" "2" "Keen 600" "USB" "blazer_ser port=/dev/ttyUSB0" # https://www.njoy.ro/UPS/keen-600
|
||||
"nJoy" "ups" "2" "Keen 600" "USB" "nutdrv_qx port=/dev/ttyUSB0" # https://www.njoy.ro/UPS/keen-600
|
||||
"nJoy" "ups" "3" "Aten PRO 3000" "SNMP" "snmp-ups" # At least basic status is served; https://www.njoy.global/product/aten-pro-3000
|
||||
|
||||
"Novex" "ups" "1" "NUPS-650" "USB" "blazer_usb protocol=megatec" # http://komp.1k.by/periphery-ups/novex/Novex_NUPS_650-130052.html
|
||||
|
||||
"Numeric" "ups" "2" "3000 SW" "" "blazer_ser"
|
||||
"Numeric" "ups" "2" "Digital 800 plus" "USB" "blazer_usb"
|
||||
"Numeric" "ups" "2" "Digital 800 plus" "USB" "nutdrv_qx or blazer_usb"
|
||||
|
||||
"Oneac" "ups" "1" "ON400" "advanced interface" "oneac"
|
||||
"Oneac" "ups" "1" "ON600" "advanced interface" "oneac"
|
||||
|
@ -727,16 +902,24 @@
|
|||
"Online" "ups" "2" "Zinto A" "" "blazer_usb"
|
||||
"Online" "ups" "1" "Zinto D" "" "optiups"
|
||||
"Online" "ups" "2" "Yunto YQ450" "" "blazer_usb"
|
||||
"Online" "ups" "2" "Xanto S700" "/dev/ttyUSB0" "nutdrv_qx" # https://github.com/networkupstools/nut/issues/1279
|
||||
|
||||
"OnLite" "ups" "2" "AQUA" "50" "blazer_ser"
|
||||
|
||||
"Opti-UPS" "ups" "1" "PowerES" "420E" "optiups"
|
||||
"Opti-UPS" "ups" "1" "VS 575C" "type=OPTI" "powercom"
|
||||
"Opti-UPS" "ups" "1" "Power Series" "PS1500E" "blazer_usb"
|
||||
|
||||
"Orvaldi Power Protection" "ups" "2" "various" "not 400 or 600" "blazer_ser"
|
||||
"Orvaldi Power Protection" "ups" "2" "750 / 900SP" "" "blazer_usb"
|
||||
|
||||
"Phasak" "ups" "2" "400VA / 600VA" "" "blazer_ser"
|
||||
"Phasak" "ups" "2" "9465 or P6N" "USB" "nutdrv_qx" # https://github.com/networkupstools/nut/issues/1187 => Voltronic-QS-Hex protocol detected
|
||||
|
||||
"PhoenixContact" "ups" "4" "QUINT-UPS/24DC" "2320461" "phoenixcontact_modbus" #https://www.phoenixcontact.com/online/portal/us?uri=pxc-oc-itemdetail:pid=2320461
|
||||
|
||||
"PiJuice" "ups" "5" "PiJuice HAT" "" "pijuice" # https://github.com/PiSupply/PiJuice/issues/124
|
||||
"PiJuice" "ups" "5" "PiJuice Zero pHAT" "" "pijuice"
|
||||
|
||||
"Plexus" "ups" "2" "500VA" "USB" "blazer_usb"
|
||||
"Plexus" "ups" "2" "1000VA Pro" "USB" "blazer_usb"
|
||||
|
@ -760,6 +943,15 @@
|
|||
"Powercom" "ups" "4" "(various)" "USB (<= 2009 models, product id: 0002)" "powercom (requires 'usbserial' kernel module)"
|
||||
"Powercom" "ups" "5" "(various)" "USB (2009 models, product id: 00a?)" "usbhid-ups (experimental)"
|
||||
"Powercom" "ups" "5" "BNT-xxxAP" "USB (product id: 0004)" "usbhid-ups (experimental)"
|
||||
"Powercom" "ups" "1" "BNT-xxxAP" "USB (product id: 0001)" "usbhid-ups (experimental)"
|
||||
"Powercom" "ups" "3" "RPT-600AP" "USB" "usbhid-ups" # http://pcmups.com.tw/eA/html/product/show.php?num=226&root=13&kind=105&page=1&keyword= https://github.com/networkupstools/nut/issues/633
|
||||
"Powercom" "ups" "3" "Raptor 2000" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/633
|
||||
|
||||
"Powercool" "ups" "1" "350VA to 1600VA" "USB" "nutdrv_atcl_usb"
|
||||
"Powercool" "ups" "2" "650VA" "USB" "nutdrv_qx port=auto vendorid=0001 productid=0000 product=MEC0003 protocol=hunnox langid_fix=0x0409 novendor noscanlangid" # https://github.com/networkupstools/nut/pull/638 caveats at https://github.com/networkupstools/nut/issues/537
|
||||
"Powercool" "ups" "2" "650VA" "USB" "nutdrv_qx port=auto vendorid=0001 productid=0000 bus=001 product=MEC0003 protocol=hunnox langid_fix=0x0409 novendor norating noscanlangid" # https://github.com/networkupstools/nut/pull/638 caveats at https://github.com/networkupstools/nut/issues/537
|
||||
"Powercool" "ups" "2" "1500VA" "USB" "nutdrv_qx port=auto vendorid=0001 productid=0000 product=MEC0003 protocol=hunnox langid_fix=0x0409 novendor noscanlangid" # https://github.com/networkupstools/nut/pull/638 caveats at https://github.com/networkupstools/nut/issues/537 - e.g. battery percentage is not being returned
|
||||
"Powercool" "ups" "2" "2000VA" "USB" "nutdrv_qx port=auto vendorid=0001 productid=0000 product=MEC0003 protocol=hunnox langid_fix=0x0409 novendor noscanlangid" # https://github.com/networkupstools/nut/pull/638 caveats at https://github.com/networkupstools/nut/issues/537
|
||||
|
||||
"POWEREX" "ups" "2" "VI 1000 LED" "" "blazer_usb"
|
||||
|
||||
|
@ -787,6 +979,18 @@
|
|||
"PowerWalker" "ups" "2" "Line-Interactive VI 850 LCD" "" "blazer_usb"
|
||||
"PowerWalker" "ups" "2" "Online VFI 1000RT/1500RT/2000RT/3000RT/6000RT/10000RT LCD" "" "blazer_usb"
|
||||
"PowerWalker" "ups" "2" "Line-Interactive VI 1000RT/1500RT/2000RT/3000RT LCD" "" "blazer_usb"
|
||||
"PowerWalker" "ups" "2" "VFI 1000 CG PF1" "" "nutdrv_qx" # https://powerwalker.com/?page=product&item=10122108&lang=en
|
||||
"PowerWalker" "ups" "2" "VFI 2000 TGS" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/560 and https://github.com/networkupstools/nut/pull/564
|
||||
"PowerWalker" "ups" "2" "VI 650 SH" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/483
|
||||
"PowerWalker" "ups" "2" "VI 650/850 SHL" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/646
|
||||
"PowerWalker" "ups" "2" "VI 1200 SHL" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/1270
|
||||
"PowerWalker" "ups" "2" "VI 2200 SHL" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/756
|
||||
"PowerWalker" "ups" "2" "VI 1200 SH" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/646
|
||||
"PowerWalker" "ups" "2" "VI 2200 SH" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/646
|
||||
"PowerWalker" "ups" "2" "Basic VI 1000 SB" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/818
|
||||
"PowerWalker" "ups" "2" "PR1500LCDRT2U" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/818
|
||||
"PowerWalker" "ups" "2" "VI 3000 SCL" "USB" "blazer_usb" # https://github.com/networkupstools/nut/issues/971
|
||||
"PowerWalker" "ups" "2" "VI 750T/HID" "USB" "usbhid-ups" # https://powerwalker.com/?page=select&cat=VI_THID&lang=en https://github.com/networkupstools/nut/issues/774
|
||||
|
||||
"Powerware" "ups" "4" "3110" "" "genericups upstype=7"
|
||||
"Powerware" "ups" "4" "3115" "" "genericups upstype=11"
|
||||
|
@ -816,6 +1020,7 @@
|
|||
"Raritan" "pdu" "3" "Intelligent PDU - Dominion PX" "no report, but should be supported" "snmp-ups (experimental)"
|
||||
"Raritan" "pdu" "3" "Metered PDU - Raritan PM" "no report, but should be supported" "snmp-ups (experimental)"
|
||||
"Raritan" "pdu" "3" "Switched PDU - Raritan RPC" "no report, but should be supported" "snmp-ups (experimental)"
|
||||
"Raritan" "pdu" "3" "Dominion PX2" "" "snmp-ups"
|
||||
|
||||
"REDi" "ups" "2" "Blazer 400VA / 600VA / 800VA" "" "blazer_ser"
|
||||
|
||||
|
@ -825,8 +1030,8 @@
|
|||
|
||||
"Riello" "ups" "3" "Riello Sentinel SDL 6000-7" "Netman Plus 102 SNMP Card" "snmp-ups"
|
||||
"Riello" "ups" "3" "Riello Sentinel Dual SDH 1000-7" "Netman Plus 102 SNMP Card" "snmp-ups"
|
||||
"Riello" "ups" "5" "IDG 400/600/800/1200/1600" "" "riello_usb"
|
||||
"Riello" "ups" "5" "IPG 600/800" "" "riello_usb"
|
||||
"Riello" "ups" "4" "IDG 400/600/800/1200/1600" "" "riello_usb"
|
||||
"Riello" "ups" "4" "IPG 600/800" "" "riello_usb"
|
||||
"Riello" "ups" "5" "WPG 400/600/800" "" "riello_usb"
|
||||
"Riello" "ups" "5" "NPW 600/800/1000/1500/2000" "" "riello_usb"
|
||||
"Riello" "ups" "5" "NDG 800/1000/1500/2000" "" "riello_usb"
|
||||
|
@ -864,10 +1069,39 @@
|
|||
|
||||
"Rocketfish" "ups" "2" "RF-1000VA / RF-1025VA" "" "usbhid-ups"
|
||||
|
||||
"Rucelf" "ups" "2" "Rucelf UPOII-3000-96-EL" "" "blazer_ser" # http://www.rucelf.ua/en/catalog/upoii-3000-96-el/
|
||||
|
||||
"Salicru" "ups" "2" "SPS ONE 700VA" "USB" "blazer_usb"
|
||||
"Salicru" "ups" "2" "SPS ONE 2000VA" "USB" "nutdrv_qx" # https://www.salicru.com/en/ups/sps-one.html https://github.com/networkupstools/nut/issues/554
|
||||
"Salicru" "ups" "2" "SPS 650/850 HOME" "usb" "usbhid-ups (experimental)"
|
||||
"Salicru" "ups" "2" "SLC TWIN PRO2" "usb" "usbhid-ups (experimental)" # https://github.com/networkupstools/nut/issues/450
|
||||
"Salicru" "ups" "2" "SLC-1500-TWIN PRO3" "usb" "usbhid-ups (experimental)" # https://github.com/networkupstools/nut/issues/1142
|
||||
"Salicru" "ups" "2" "SLC TWINPRO3" "usb" "usbhid-ups (experimental)"
|
||||
"Salicru" "ups" "2" "SLC TWIN RT3" "usb" "usbhid-ups (experimental)"
|
||||
|
||||
"Santak" "ups" "2" "Castle C*K" "Serial" "blazer_ser" # https://github.com/networkupstools/nut/issues/1039
|
||||
"Santak" "ups" "2" "MT*-PRO" "Serial" "blazer_ser" # https://github.com/networkupstools/nut/issues/1039
|
||||
|
||||
"Siemens" "ups" "4" "SITOP UPS500" "serial" "nutdrv_siemens_sitop (experimental, untested)"
|
||||
"Siemens" "ups" "4" "SITOP UPS500" "USB" "nutdrv_siemens_sitop (experimental)"
|
||||
|
||||
"SmartLabs" "pdu" "1" "2412S Power Line Modem" "for X10/Insteon" "powerman-pdu (experimental)"
|
||||
|
||||
"SMS (Brazil)" "ups" "2" "Manager III" "" "blazer_ser"
|
||||
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-600" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-600-XPS" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-600-LED-C13" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-600-LED-C13-PRO" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-800" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-800-LED-С13" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-1000-XPS" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-1200" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-1500" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-2000" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-2000-XPS" "" "nutdrv_qx"
|
||||
"SNR" "ups" "2" "SNR-UPS-LID-3000-XPS" "" "nutdrv_qx"
|
||||
|
||||
"SOLA" "ups" "1" "305" "cable INT-0025C" "genericups upstype=7"
|
||||
"SOLA" "ups" "1" "325" "" "blazer_ser or bestups"
|
||||
"SOLA" "ups" "1" "520" "" "blazer_ser or bestups"
|
||||
|
@ -905,24 +1139,17 @@
|
|||
"Sweex" "ups" "1" "500/1000" "" "genericups upstype=7"
|
||||
"Sweex" "ups" "1" "1000" "USB" "richcomm_usb"
|
||||
"Sweex" "ups" "2" "(various)" "" "blazer_ser"
|
||||
"Sweex" "ups" "2" "INTELLIGENT UPS 1500VA P220" "USB" "blazer_usb (USB ID 0665:5161)" # http://www.sweex.com/en/notebook-pc-accessoires/ups/PP220/
|
||||
|
||||
"Syndome" "ups" "2" "Era 500VA" "USB" "blazer_usb"
|
||||
"Syndome" "ups" "2" "Atom LCD-1000" "USB" "usbhid-ups" # https://github.com/networkupstools/nut/issues/483
|
||||
|
||||
"Sysgration" "ups" "2" "UPGUARDS Pro650" "" "blazer_ser"
|
||||
|
||||
"Tecnoware" "ups" "2" "Easy Power 1200" "" "blazer_ser"
|
||||
"Tecnoware" "ups" "2" "UPS ERA LCD 0.65" "" "blazer_usb langid_fix=0x409"
|
||||
"Tecnoware" "ups" "2" "UPS ERA LCD 0.65" "USB" "blazer_usb langid_fix=0x409"
|
||||
"Tecnoware" "ups" "2" "UPS ERA PLUS 1100" "USB" "blazer_usb" # https://www.tecnoware.com/Prodotti/FGCERAPL1100/ups-era-plus-1100.aspx https://github.com/networkupstools/nut/issues/747
|
||||
|
||||
"Tripp Lite" "ups" "1" "INTERNETOFFICE700" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "2" "OMNIVS1000" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "1" "OMNIVS1500XL" "USB" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "1" "SMART700USB" "USB" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "1" "SMART1500RM2U" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "1" "SMART550USB" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "1" "OMNISMART500" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "1" "SMART2200RMXL2U" "USB (older; product ID: 0001)" "tripplite_usb (experimental)"
|
||||
"Tripp Lite" "ups" "1" "SmartUPS" "" "tripplite"
|
||||
"Tripp Lite" "ups" "1" "SmartOnline" "" "tripplitesu"
|
||||
"Tripp Lite" "ups" "1" "(various)" "Lan 2.2 interface - black 73-0844 cable" "genericups upstype=5"
|
||||
"Tripp Lite" "ups" "2" "1500 LCD" "USB" "usbhid-ups"
|
||||
"Tripp Lite" "ups" "3" "AVR550U" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=930&txtModelID=3090
|
||||
|
@ -952,23 +1179,39 @@
|
|||
"Tripp Lite" "ups" "3" "INTERNET750U" "USB (protocol 1007)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3142
|
||||
"Tripp Lite" "ups" "3" "INTERNET900U" "USB (protocol 1007)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=930&txtModelID=3657
|
||||
"Tripp Lite" "ups" "3" "INTERNETOFFICE500" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=930&txtModelID=11
|
||||
"Tripp Lite" "ups" "1" "INTERNETOFFICE700" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "3" "INTERNETOFFICE700" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=930&txtModelID=14
|
||||
"Tripp Lite" "ups" "3" "OMNI650LCD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3195
|
||||
"Tripp Lite" "ups" "3" "OMNI900LCD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=3082
|
||||
"Tripp Lite" "ups" "2" "OMNI1000LCD" "USB" "usbhid-ups"
|
||||
"Tripp Lite" "ups" "3" "OMNISMART300PNP" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=19
|
||||
"Tripp Lite" "ups" "1" "OMNISMART500" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "3" "OMNISMART500" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=21
|
||||
"Tripp Lite" "ups" "3" "OMNISMART700" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=23
|
||||
"Tripp Lite" "ups" "3" "OMNIVS1000" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2656
|
||||
"Tripp Lite" "ups" "2" "OMNIVSINT800" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "3" "OMNIVS800" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2729
|
||||
"Tripp Lite" "ups" "2" "OMNIVS1000" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "3" "OMNIVS1000" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2656
|
||||
"Tripp Lite" "ups" "1" "OMNIVS1500XL" "USB" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "3" "POS500" "USB (protocol 2007)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3742
|
||||
"Tripp Lite" "ups" "3" "SM2200RMDVTAA" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=4648
|
||||
"Tripp Lite" "ups" "1" "SmartUPS" "" "tripplite"
|
||||
"Tripp Lite" "ups" "1" "SmartOnline" "" "tripplitesu"
|
||||
"Tripp Lite" "ups" "1" "SMART550USB" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "3" "SMART550USB" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2002
|
||||
"Tripp Lite" "ups" "3" "SMART550USBWD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2591
|
||||
"Tripp Lite" "ups" "1" "SMART700USB" "USB" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "3" "SMART750RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3020
|
||||
"Tripp Lite" "ups" "3" "SMART750SLT" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3007
|
||||
"Tripp Lite" "ups" "3" "SMART750USB" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2679
|
||||
"Tripp Lite" "ups" "3" "SMART750XLA" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3820
|
||||
"Tripp Lite" "ups" "3" "SMART1000LCD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=3071
|
||||
"Tripp Lite" "ups" "3" "SMART1000RM2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2657
|
||||
"Tripp Lite" "ups" "3" "SMART1000RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=5262
|
||||
"Tripp Lite" "ups" "3" "SMART1050SLT" "USB (protocol 3012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3253
|
||||
"Tripp Lite" "ups" "3" "SMART1050SLTAA" "USB (protocol 3012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=4389
|
||||
"Tripp Lite" "ups" "3" "SMART1200LCD" "USB (protocol 2009)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3193
|
||||
"Tripp Lite" "ups" "1" "SMART1500RM2U" "USB (older; product ID: 0001)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "3" "SMART1500CRMXL" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3826
|
||||
"Tripp Lite" "ups" "3" "SMART1500LCD" "USB (protocol 2009)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=3151
|
||||
"Tripp Lite" "ups" "3" "SMART1500LCDXL" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=4978
|
||||
|
@ -980,6 +1223,7 @@
|
|||
"Tripp Lite" "ups" "3" "SMART2200CRMXL" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3825
|
||||
"Tripp Lite" "ups" "3" "SMART2200RM2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=4403
|
||||
"Tripp Lite" "ups" "3" "SMART2200RM2UN" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=5428
|
||||
"Tripp Lite" "ups" "1" "SMART2200RMXL2U" "USB (older; product ID: 0001)" "tripplite_usb (experimental)"
|
||||
"Tripp Lite" "ups" "3" "SMART2200RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3264
|
||||
"Tripp Lite" "ups" "3" "SMART2200RMXL2UP" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=4672
|
||||
"Tripp Lite" "ups" "3" "SMART2200RMXLN" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=5427
|
||||
|
@ -994,13 +1238,8 @@
|
|||
"Tripp Lite" "ups" "3" "SMART3000RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=4418
|
||||
"Tripp Lite" "ups" "3" "SMART3000RMXLN" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=5425
|
||||
"Tripp Lite" "ups" "3" "SMART3000SLT" "USB (protocol 3013)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3490
|
||||
"Tripp Lite" "ups" "3" "SMART500RT1U" "USB (protocol 3005)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2853
|
||||
"Tripp Lite" "ups" "3" "SMART550USB" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2002
|
||||
"Tripp Lite" "ups" "3" "SMART550USBWD" "USB (protocol 2010)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2591
|
||||
"Tripp Lite" "ups" "3" "SMART750RMXL2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3020
|
||||
"Tripp Lite" "ups" "3" "SMART750SLT" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3007
|
||||
"Tripp Lite" "ups" "3" "SMART750USB" "USB (protocol 2012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=932&txtModelID=2679
|
||||
"Tripp Lite" "ups" "3" "SMART750XLA" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=3820
|
||||
"Tripp Lite" "ups" "2" "SMART500RT1U" "USB (older; product ID 0001, protocol 3005)" "tripplite_usb"
|
||||
"Tripp Lite" "ups" "3" "SMART500RT1U" "USB (newer; protocol/product ID 3005)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2853
|
||||
"Tripp Lite" "ups" "3" "SMX1000LCD" "USB (protocol 2005)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3200
|
||||
"Tripp Lite" "ups" "3" "SMX1000RT2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2798
|
||||
"Tripp Lite" "ups" "3" "SMX1050SLT" "USB (protocol 3012)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3249
|
||||
|
@ -1011,8 +1250,12 @@
|
|||
"Tripp Lite" "ups" "3" "SMX3000RT2UTAA" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=4396
|
||||
"Tripp Lite" "ups" "3" "SMX3000XLRT2U" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=933&txtModelID=2694
|
||||
"Tripp Lite" "ups" "3" "SMX3000XLRT2UA" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=5658
|
||||
"Tripp Lite" "ups" "3" "SMX500RT1U" "USB (protocol 3005)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=2691
|
||||
"Tripp Lite" "ups" "3" "SMX500RT1U" "USB (older; product ID 0001, protocol 3005)" "tripplite_usb" # https://www.tripplite.com/support/product/part-number/SMX500RT1U https://github.com/networkupstools/nut/pull/584
|
||||
"Tripp Lite" "ups" "3" "SMX500RT1U" "USB (newer; protocol/product ID 3005)" "usbhid-ups" # https://www.tripplite.com/support/product/part-number/SMX500RT1U
|
||||
"Tripp Lite" "ups" "3" "SMX750SLT" "USB (protocol 3014)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3021
|
||||
"Tripp Lite" "ups" "3" "SU750RTXL2U" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3194
|
||||
"Tripp Lite" "ups" "3" "SU750RTXLCD2U" "USB (protocol 4004)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=5070
|
||||
"Tripp Lite" "ups" "3" "SU750XL" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3299
|
||||
"Tripp Lite" "ups" "3" "SU1000RTXL2UA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=2948
|
||||
"Tripp Lite" "ups" "3" "SU1000RTXLCD2U" "USB (protocol 4004)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=745&txtModelID=4980
|
||||
"Tripp Lite" "ups" "3" "SU1000XLA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=3180
|
||||
|
@ -1032,9 +1275,6 @@
|
|||
"Tripp Lite" "ups" "3" "SU3000RTXR3UHW" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=4976
|
||||
"Tripp Lite" "ups" "3" "SU3000XL" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=3601
|
||||
"Tripp Lite" "ups" "3" "SU3000XLCD" "USB (protocol 4004)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=744&txtModelID=5342
|
||||
"Tripp Lite" "ups" "3" "SU750RTXL2U" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3194
|
||||
"Tripp Lite" "ups" "3" "SU750RTXLCD2U" "USB (protocol 4004)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=5070
|
||||
"Tripp Lite" "ups" "3" "SU750XL" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3299
|
||||
"Tripp Lite" "ups" "3" "SUINT1000RTXL2UA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=3983
|
||||
"Tripp Lite" "ups" "3" "SUINT1500RTXL2UA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=2720
|
||||
"Tripp Lite" "ups" "3" "SUINT2200RTXL2UA" "USB (protocol 4001)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtSeriesID=934&txtModelID=3970
|
||||
|
@ -1044,6 +1284,8 @@
|
|||
"Trust" "ups" "2" "UPS 1200VA Management PW-4120M" "" "blazer_ser"
|
||||
"Trust" "ups" "2" "UPS 1300VA Management PW-4130M" "" "blazer_ser"
|
||||
|
||||
"TS Shara" "ups" "4" "(various)" "" "nutdrv_qx"
|
||||
|
||||
"UNITEK" "ups" "2" "ALPHA 500 IC" "" "blazer_ser"
|
||||
"UNITEK" "ups" "2" "Alpha 1000is" "" "blazer_ser"
|
||||
"UNITEK" "ups" "2" "Alpha 500" "" "blazer_ser"
|
||||
|
@ -1060,6 +1302,8 @@
|
|||
"UPSonic" "ups" "2" "PrOffice 650" "USB" "blazer_usb"
|
||||
"UPSonic" "ups" "2" "DS-800" "USB" "blazer_usb"
|
||||
|
||||
"V7" "ups" "2" "UPS1RM2U1500-1E" "USB" "blazer_usb" # http://www.v7world.com/uk/ups-1500va-rack-mount-2u-eu.html https://github.com/networkupstools/nut/issues/716
|
||||
|
||||
"Various" "ups" "4" "(various)" "SEC protocol" "gamatronic"
|
||||
"Various" "ups" "1" "(various)" "Generic RUPS model" "genericups upstype=4"
|
||||
"Various" "ups" "1" "(various)" "Generic RUPS 2000 (Megatec M2501 cable)" "genericups upstype=21"
|
||||
|
@ -1084,10 +1328,16 @@
|
|||
|
||||
"Vivaldi" "ups" "1" "EA200 LED" "USB" "richcomm_usb"
|
||||
|
||||
"Voltronic Power" "ups" "2" "Apex 1KVA" "Serial" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Apex 1KVA" "USB" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Frigate TX 1KVA" "Serial" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Frigate TX 1KVA" "USB" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Galleon 1KVA" "Serial" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Galleon 1KVA" "USB" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Galleon X9-RT LCD-1-3K" "USB" "blazer_usb" # https://github.com/networkupstools/nut/issues/1251
|
||||
"Voltronic Power" "ups" "2" "Galleon X9-RT LCD-1-3K" "USB" "nutdrv_qx" # https://github.com/networkupstools/nut/issues/1251
|
||||
"Voltronic Power" "ups" "2" "Imperial 1KVA" "Serial" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Imperial 1KVA" "USB" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Prosine 800" "Serial" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Prosine 800" "USB" "nutdrv_qx"
|
||||
"Voltronic Power" "ups" "2" "Vesta LED 850VA" "USB" "nutdrv_qx"
|
||||
|
|
|
@ -5,3 +5,7 @@ if WITH_CGI
|
|||
nodist_html_DATA = header.html
|
||||
endif
|
||||
EXTRA_DIST = README
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||
# Generated by configure script:
|
||||
DISTCLEANFILES = header.html
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
# Makefile.in generated by automake 1.11.6 from Makefile.am.
|
||||
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
|
||||
# Foundation, Inc.
|
||||
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
@ -16,23 +15,61 @@
|
|||
@SET_MAKE@
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__make_dryrun = \
|
||||
{ \
|
||||
am__dry=no; \
|
||||
am__is_gnu_make = { \
|
||||
if test -z '$(MAKELEVEL)'; then \
|
||||
false; \
|
||||
elif test -n '$(MAKE_HOST)'; then \
|
||||
true; \
|
||||
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||
true; \
|
||||
else \
|
||||
false; \
|
||||
fi; \
|
||||
}
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||
*) \
|
||||
for am__flg in $$MAKEFLAGS; do \
|
||||
case $$am__flg in \
|
||||
*=*|--*) ;; \
|
||||
*n*) am__dry=yes; break;; \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
done;; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
test $$am__dry = yes; \
|
||||
}
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
|
@ -53,19 +90,24 @@ build_triplet = @build@
|
|||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
subdir = data/html
|
||||
DIST_COMMON = README $(am__dist_html_DATA_DIST) $(srcdir)/Makefile.am \
|
||||
$(srcdir)/Makefile.in $(srcdir)/header.html.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \
|
||||
$(top_srcdir)/m4/ax_c_pragmas.m4 \
|
||||
$(top_srcdir)/m4/ax_check_compile_flag.m4 \
|
||||
$(top_srcdir)/m4/ax_compare_version.m4 \
|
||||
$(top_srcdir)/m4/ax_run_or_link_ifelse.m4 \
|
||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||
$(top_srcdir)/m4/nut_check_asciidoc.m4 \
|
||||
$(top_srcdir)/m4/nut_check_cppcheck.m4 \
|
||||
$(top_srcdir)/m4/nut_check_headers_windows.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libavahi.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libltdl.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libmodbus.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libneon.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||
|
@ -74,15 +116,34 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
|||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||
$(top_srcdir)/m4/nut_check_os.m4 \
|
||||
$(top_srcdir)/m4/nut_check_pkgconfig.m4 \
|
||||
$(top_srcdir)/m4/nut_check_python.m4 \
|
||||
$(top_srcdir)/m4/nut_compiler_family.m4 \
|
||||
$(top_srcdir)/m4/nut_func_getnameinfo_argtypes.m4 \
|
||||
$(top_srcdir)/m4/nut_report_feature.m4 \
|
||||
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_html_DATA_DIST) \
|
||||
$(am__DIST_COMMON)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||
CONFIG_CLEAN_FILES = header.html
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
am__can_run_installinfo = \
|
||||
|
@ -120,13 +181,18 @@ am__uninstall_files_from_dir = { \
|
|||
}
|
||||
am__installdirs = "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(htmldir)"
|
||||
DATA = $(dist_html_DATA) $(nodist_html_DATA)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/header.html.in \
|
||||
README
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
A2X = @A2X@
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
ASCIIDOC = @ASCIIDOC@
|
||||
ASPELL = @ASPELL@
|
||||
AUGPARSE = @AUGPARSE@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
|
@ -137,6 +203,7 @@ CCDEPMODE = @CCDEPMODE@
|
|||
CFLAGS = @CFLAGS@
|
||||
CONFPATH = @CONFPATH@
|
||||
CPP = @CPP@
|
||||
CPPCHECK = @CPPCHECK@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||
|
@ -150,6 +217,7 @@ DEFS = @DEFS@
|
|||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||
|
@ -162,6 +230,7 @@ ECHO_T = @ECHO_T@
|
|||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
FGREP = @FGREP@
|
||||
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
|
@ -172,12 +241,15 @@ LD = @LD@
|
|||
LDFLAGS = @LDFLAGS@
|
||||
LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@
|
||||
LIBAVAHI_LIBS = @LIBAVAHI_LIBS@
|
||||
LIBDIR = @LIBDIR@
|
||||
LIBGD_CFLAGS = @LIBGD_CFLAGS@
|
||||
LIBGD_LDFLAGS = @LIBGD_LDFLAGS@
|
||||
LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||
|
@ -188,21 +260,29 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
|||
LIBS = @LIBS@
|
||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LN_S_R = @LN_S_R@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NETLIBS = @NETLIBS@
|
||||
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
NUT_DATADIR = @NUT_DATADIR@
|
||||
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||
NUT_NETVERSION = @NUT_NETVERSION@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
|
@ -222,6 +302,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
|||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
PORT = @PORT@
|
||||
PYTHON = @PYTHON@
|
||||
PYTHON2 = @PYTHON2@
|
||||
PYTHON3 = @PYTHON3@
|
||||
RANLIB = @RANLIB@
|
||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||
RUN_AS_USER = @RUN_AS_USER@
|
||||
|
@ -230,12 +313,16 @@ SED = @SED@
|
|||
SERLIBS = @SERLIBS@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
SOURCE_HIGHLIGHT = @SOURCE_HIGHLIGHT@
|
||||
STATEPATH = @STATEPATH@
|
||||
STRIP = @STRIP@
|
||||
SUN_LIBUSB = @SUN_LIBUSB@
|
||||
TREE_VERSION = @TREE_VERSION@
|
||||
VALGRIND = @VALGRIND@
|
||||
VERSION = @VERSION@
|
||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||
XMLLINT = @XMLLINT@
|
||||
XSLTPROC = @XSLTPROC@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
|
@ -249,6 +336,7 @@ am__leading_dot = @am__leading_dot@
|
|||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
auglensdir = @auglensdir@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
|
@ -262,6 +350,9 @@ datarootdir = @datarootdir@
|
|||
devddir = @devddir@
|
||||
docdir = @docdir@
|
||||
driverexecdir = @driverexecdir@
|
||||
dummy_PKG_CONFIG = @dummy_PKG_CONFIG@
|
||||
dummy_PKG_CONFIG_CFLAGS = @dummy_PKG_CONFIG_CFLAGS@
|
||||
dummy_PKG_CONFIG_LIBS = @dummy_PKG_CONFIG_LIBS@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
|
@ -280,18 +371,21 @@ localedir = @localedir@
|
|||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
now = @now@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
pkgconfigdir = @pkgconfigdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
runstatedir = @runstatedir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
||||
systemdshutdowndir = @systemdshutdowndir@
|
||||
systemdsystemunitdir = @systemdsystemunitdir@
|
||||
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
|
@ -307,6 +401,9 @@ udevdir = @udevdir@
|
|||
@WITH_CGI_TRUE@dist_html_DATA = index.html bottom.html nut-banner.png
|
||||
@WITH_CGI_TRUE@nodist_html_DATA = header.html
|
||||
EXTRA_DIST = README
|
||||
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||
# Generated by configure script:
|
||||
DISTCLEANFILES = header.html
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
|
@ -322,14 +419,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
|||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/html/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu data/html/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
|
@ -390,14 +486,17 @@ uninstall-nodist_htmlDATA:
|
|||
@list='$(nodist_html_DATA)'; test -n "$(htmldir)" || list=; \
|
||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||
dir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir)
|
||||
tags: TAGS
|
||||
TAGS:
|
||||
tags TAGS:
|
||||
|
||||
ctags: CTAGS
|
||||
CTAGS:
|
||||
ctags CTAGS:
|
||||
|
||||
cscope cscopelist:
|
||||
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
distdir: $(BUILT_SOURCES)
|
||||
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||
|
||||
distdir-am: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
|
@ -460,10 +559,12 @@ clean-generic:
|
|||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||
|
@ -533,18 +634,21 @@ uninstall-am: uninstall-dist_htmlDATA uninstall-nodist_htmlDATA
|
|||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
|
||||
distclean distclean-generic distclean-libtool distdir dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-dist_htmlDATA install-dvi \
|
||||
install-dvi-am install-exec install-exec-am install-html \
|
||||
install-html-am install-info install-info-am install-man \
|
||||
install-nodist_htmlDATA install-pdf install-pdf-am install-ps \
|
||||
install-ps-am install-strip installcheck installcheck-am \
|
||||
installdirs maintainer-clean maintainer-clean-generic \
|
||||
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
|
||||
ps ps-am uninstall uninstall-am uninstall-dist_htmlDATA \
|
||||
cscopelist-am ctags-am distclean distclean-generic \
|
||||
distclean-libtool distdir dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am \
|
||||
install-dist_htmlDATA install-dvi install-dvi-am install-exec \
|
||||
install-exec-am install-html install-html-am install-info \
|
||||
install-info-am install-man install-nodist_htmlDATA \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||
tags-am uninstall uninstall-am uninstall-dist_htmlDATA \
|
||||
uninstall-nodist_htmlDATA
|
||||
|
||||
.PRECIOUS: Makefile
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
|
|
9
debian/Makefile.am
vendored
9
debian/Makefile.am
vendored
|
@ -1,9 +0,0 @@
|
|||
EXTRA_DIST = changelog control copyright description.subst hotplug \
|
||||
nut-cgi.config nut-cgi.docs nut-cgi.examples nut-cgi.postinst nut-cgi.postrm \
|
||||
nut-cgi.preinst nut-cgi.README.Debian nut-cgi.templates nut.config \
|
||||
nut.default nut.dirs nut.docs nut.examples nut-hal-drivers.docs \
|
||||
nut-server.init nut-client.init nut-client.links \
|
||||
nut.postinst nut.postrm nut.preinst nut.prerm nut.README.Debian \
|
||||
nut.templates nut.TODO.Debian rules watch \
|
||||
po/ca.po po/cs.po po/de.po po/fr.po po/POTFILES.in \
|
||||
po/pt.po po/pt_BR.po po/templates.pot po/vi.po
|
381
debian/Makefile.in
vendored
381
debian/Makefile.in
vendored
|
@ -1,381 +0,0 @@
|
|||
# Makefile.in generated by automake 1.10.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
VPATH = @srcdir@
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
subdir = packaging/debian
|
||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_create_stdint_h.m4 \
|
||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||
$(top_srcdir)/m4/nut_check_hiddev.m4 \
|
||||
$(top_srcdir)/m4/nut_check_ipv6.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libhal.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libneon.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libssl.m4 \
|
||||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||
$(top_srcdir)/m4/nut_report_feature.m4 \
|
||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||
$(top_srcdir)/configure.in
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CONFPATH = @CONFPATH@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
ECHO = @ECHO@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
F77 = @F77@
|
||||
FFLAGS = @FFLAGS@
|
||||
GREP = @GREP@
|
||||
HAL_CALLOUTS_PATH = @HAL_CALLOUTS_PATH@
|
||||
HAL_FDI_PATH = @HAL_FDI_PATH@
|
||||
HAL_USER = @HAL_USER@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBGD_CFLAGS = @LIBGD_CFLAGS@
|
||||
LIBGD_LDFLAGS = @LIBGD_LDFLAGS@
|
||||
LIBHAL_CFLAGS = @LIBHAL_CFLAGS@
|
||||
LIBHAL_LDFLAGS = @LIBHAL_LDFLAGS@
|
||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||
LIBNEON_LDFLAGS = @LIBNEON_LDFLAGS@
|
||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||
LIBNETSNMP_LDFLAGS = @LIBNETSNMP_LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||
LIBSSL_LDFLAGS = @LIBSSL_LDFLAGS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||
LIBUSB_LDFLAGS = @LIBUSB_LDFLAGS@
|
||||
LINUX_HIDDEV = @LINUX_HIDDEV@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NETLIBS = @NETLIBS@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJEXT = @OBJEXT@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
RANLIB = @RANLIB@
|
||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||
RUN_AS_USER = @RUN_AS_USER@
|
||||
SED = @SED@
|
||||
SERLIBS = @SERLIBS@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STATEPATH = @STATEPATH@
|
||||
STRIP = @STRIP@
|
||||
SUN_LIBUSB = @SUN_LIBUSB@
|
||||
VERSION = @VERSION@
|
||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_F77 = @ac_ct_F77@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
cgiexecdir = @cgiexecdir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
driverexecdir = @driverexecdir@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
hotplugdir = @hotplugdir@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
pkgconfigdir = @pkgconfigdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
target_os = @target_os@
|
||||
target_vendor = @target_vendor@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
udevdir = @udevdir@
|
||||
EXTRA_DIST = changelog control copyright description.subst hotplug \
|
||||
nut-cgi.config nut-cgi.docs nut-cgi.examples nut-cgi.postinst nut-cgi.postrm \
|
||||
nut-cgi.preinst nut-cgi.README.Debian nut-cgi.templates nut.config \
|
||||
nut.default nut.dirs nut.docs nut.examples nut-hal-drivers.docs \
|
||||
nut.init nut.links nut.postinst nut.postrm nut.preinst nut.prerm \
|
||||
nut.README.Debian nut.templates nut.TODO.Debian \
|
||||
rules watch po/ca.po po/cs.po po/de.po po/fr.po po/POTFILES.in \
|
||||
po/pt.po po/pt_BR.po po/templates.pot po/vi.po
|
||||
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
||||
&& exit 0; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packaging/debian/Makefile'; \
|
||||
cd $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu packaging/debian/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
tags: TAGS
|
||||
TAGS:
|
||||
|
||||
ctags: CTAGS
|
||||
CTAGS:
|
||||
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
|
||||
fi; \
|
||||
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
|
||||
else \
|
||||
test -f $(distdir)/$$file \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile
|
||||
installdirs:
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
`test -z '$(STRIP)' || \
|
||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-generic
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am:
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am:
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
|
||||
distclean distclean-generic distclean-libtool distdir dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-info install-info-am install-man install-pdf \
|
||||
install-pdf-am install-ps install-ps-am install-strip \
|
||||
installcheck installcheck-am installdirs maintainer-clean \
|
||||
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
||||
mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
245
debian/changelog
vendored
245
debian/changelog
vendored
|
@ -1,3 +1,248 @@
|
|||
nut (2.8.0-1) unstable; urgency=medium
|
||||
|
||||
[ lagertonne ]
|
||||
* new upstream 2.8.0
|
||||
|
||||
-- lagertonne <mail@lagertonne.de> Wed, 29 Jun 2022 13:12:45 +0000
|
||||
|
||||
nut (2.7.4-14) unstable; urgency=medium
|
||||
|
||||
[ Jeremy Sowden ]
|
||||
* d/patches: add patch to fix FTBFS with g++-11 (closes: #984260)
|
||||
|
||||
[ Laurent Bigonville ]
|
||||
* debian/control: Bump Standards-Version to 4.6.0 (no further changes)
|
||||
* debian/source_nut.py: Change the shebang to python3
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Sat, 06 Nov 2021 18:41:33 +0100
|
||||
|
||||
nut (2.7.4-13) unstable; urgency=medium
|
||||
|
||||
[ Arnaud Quette ]
|
||||
* Retirement of Arnaud Quette from the Debian project
|
||||
|
||||
[ Debian Janitor ]
|
||||
* Set upstream metadata fields: Bug-Database, Bug-Submit (from ./configure),
|
||||
Name (from ./configure), Repository, Repository-Browse.
|
||||
|
||||
[ Sergio Durigan Junior ]
|
||||
* d/libnutclient0.symbols: Update file, and fix FTBFS. (Closes: #957614)
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Thu, 15 Oct 2020 12:16:34 +0200
|
||||
|
||||
nut (2.7.4-12) unstable; urgency=medium
|
||||
|
||||
* Port autopkgtests to python3, taken from Ubuntu, thanks to them and
|
||||
Dimitri John Ledkov (Closes: #937169)
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Thu, 30 Jan 2020 01:06:14 +0100
|
||||
|
||||
nut (2.7.4-11) unstable; urgency=medium
|
||||
|
||||
* Remove python(2) binding and disable nut-monitor package for now as it
|
||||
depends on unmaintained pygtk (Closes: #885358, #937169)
|
||||
* debian/control: Add support for the <!nodoc> Build-Profile
|
||||
* debian/patches/0013-fix-doc-build.patch: Fix the documentation build with
|
||||
asciidoc >= 0.9
|
||||
* Disable python3-nut package for now as it's broken with python3
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Sun, 15 Dec 2019 21:22:13 +0100
|
||||
|
||||
nut (2.7.4-10) unstable; urgency=medium
|
||||
|
||||
* debian/libnutscan1.symbols: hurd-i386 is not built with ipmi support and
|
||||
thus is libnutscan is not exporting the related symbols
|
||||
* debian/libnutclient0.symbols: Add new C++ template exported on arm64 and
|
||||
x32
|
||||
* debian/tests: Import changes from the ubuntu package, thanks to them.
|
||||
Add psmisc to the dependencies as it's not installed by default in debian
|
||||
* Add the apport script coming from Ubuntu, thanks to them again
|
||||
* Add higher resolution icon for nut-monitor
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Mon, 19 Aug 2019 01:04:36 +0200
|
||||
|
||||
nut (2.7.4-9) unstable; urgency=medium
|
||||
|
||||
[ Ondřej Nový ]
|
||||
* d/changelog: Remove trailing whitespaces
|
||||
* d/control: Remove XS-Testsuite field, not needed anymore
|
||||
|
||||
[ Arnaud Quette ]
|
||||
* debian/control, debian/rules, debian/libnutscan1.install,
|
||||
debian/libnutscan-dev.install: distribute nut-scanner. (Closes: #921379
|
||||
LP: #1814314)
|
||||
|
||||
[ Laurent Bigonville ]
|
||||
* Switch from cdbs to debhelper sequence
|
||||
* Bump debhelper compatibility version to 12
|
||||
* Add libltdl-dev to the build-dependencies and fix FTBFS when it is
|
||||
installed (Closes: #831740)
|
||||
* debian/control: Bump Standards-Version to 4.4.0 (no further changes)
|
||||
* debian/control: Add libnss3-dev to the dependencies of libupsclient-dev
|
||||
* debian/tests/control: Drop python-unit and depend against python package
|
||||
instead (Closes: #908963)
|
||||
* debian/control: Fix duplicate package descriptions to please lintian
|
||||
* debian/*.symbols: Add Build-Depends-Package field
|
||||
* debian/control, debian/watch: Use https for the Homepage and download page
|
||||
* debian/libnutclient0.symbols: Adjust the symbols due to C++ changes
|
||||
* debian/patches/0011-use-pkgconfig-module.patch: Use pkg-config module
|
||||
names instead of listing the libraries, to please lintian
|
||||
* Move pidfiles from /var/run/nut to /run/nut, there is nothing else to do
|
||||
since /var/run is a symlink to /run for some times now (policy 3.9.3)
|
||||
* debian/patches/0012-add-AEG-PROTECT-NAS-support.patch: Add support for
|
||||
recent AEG PROTECT NAS UPS, from upstream (Closes: #919112)
|
||||
* debian/nut-server.lintian-overrides: Override
|
||||
package-supports-alternative-init-but-no-init.d-script
|
||||
lib/systemd/system/nut-driver.service, in LSB world, the drivers are started
|
||||
by nut-server initscript
|
||||
* debian/nut-client.lintian-overrides: Drop unused override
|
||||
* debian/nut-monitor.install: Install nut-monitor.appdata.xml in
|
||||
/usr/share/metainfo/ instead of /usr/share/appdata/
|
||||
* Simplify debian/rules, install systemd files on non-linux arch as well
|
||||
* Remove obsolete files and old upgrade paths for users coming from version
|
||||
prior to wheezy
|
||||
* debian/control: Mark -dev packages as Multi-Arch: same
|
||||
* Add debian/patches/0001-reproductible-build.patch: Try to make the
|
||||
documentation reproductible
|
||||
* debian/patches/0003-install-dev-files-in-usr.patch: Also change the prefix
|
||||
in libnutclient.pc.in for consistency
|
||||
* debian/patches/0009-fix-nutshutdown-install.patch: Use patch coming from
|
||||
upstream instead of our own patch
|
||||
* debian/rules, debian/control: Override --with-systemdshutdowndir passed to
|
||||
configure to fix FTBFS on non-linux architectures and do not build-depend
|
||||
against systemd
|
||||
* debian/rules: Install augeas lenses in /usr/share/augeas/lenses/ instead
|
||||
of /usr/share/augeas/lenses/dist/, the later seems to be reserved for
|
||||
augeas own lenses, not 3rd party ones
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Sun, 04 Aug 2019 10:34:17 +0200
|
||||
|
||||
nut (2.7.4-8) unstable; urgency=medium
|
||||
|
||||
* debian/libnutclient0.symbols: Use arch-bits=32 and arch-bits=64 instead of
|
||||
listing the architectures explicitly (Closes: #892234)
|
||||
* debian/libnutclient0.symbols: Fix FTBFS on riscv64
|
||||
* debian/control: Update the Vcs-* fields to point to the new gitlab/salsa
|
||||
machine
|
||||
* debian/control: Bump Standards-Version to 4.1.4 (no further changes)
|
||||
* debian/control: Drop X-Python-Version field, not needed anymore because
|
||||
the version is ancient
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Fri, 01 Jun 2018 17:55:25 +0200
|
||||
|
||||
nut (2.7.4-7) unstable; urgency=medium
|
||||
|
||||
* debian/libnutclient0.symbols: Fix symbols file, this should fix FTBFS on
|
||||
most architectures. (Closes: #890981)
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Wed, 21 Feb 2018 12:06:16 +0100
|
||||
|
||||
nut (2.7.4-6) unstable; urgency=medium
|
||||
|
||||
* debian/control: Switch dependency from python-gobject to python-gobject-2,
|
||||
the former is a transitional package (Closes: #890158)
|
||||
* debian/libnutclient0.symbols: Update the symbols file to fix the FTBFS on
|
||||
ppc64 and sparc64 architectures
|
||||
* debian/control: Add python-notify to the recommended packages of
|
||||
nut-monitor, it can displays notification in case the UPS is on battery
|
||||
* debian/control: Bump debhelper build-dependency and drop dh-systemd
|
||||
* debian/rules: Assign DEB_HOST_ARCH_OS with ?= instead of :? to please
|
||||
lintian
|
||||
* debian/libnutclient0.symbols: Fix version of symbols introduced in last
|
||||
NMU
|
||||
* Add python3-nut package
|
||||
* debian/control: Bump Standards-Version to 4.1.3 and bump existing packages
|
||||
from the extra priority to optional as the former is deprecated
|
||||
* debian/nut-server.lintian-overrides: Add overrides for
|
||||
udev-rule-missing-subsystem, the SUBSYSTEM check is at the top of the file
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Tue, 20 Feb 2018 13:08:57 +0100
|
||||
|
||||
nut (2.7.4-5.1) unstable; urgency=medium
|
||||
|
||||
* Non-maintainer upload.
|
||||
|
||||
[ Laurent Bigonville ]
|
||||
* debian/nut-server.postinst: The udevd process is called systemd-udevd for
|
||||
quite sometimes already, properly detect whether it's running or not, this
|
||||
should fix the devices permissions for USB UPS's (LP: #1540008)
|
||||
* debian/rules: Mask ups-monitor, this is not a real LSB initscript but it's
|
||||
a symlink to the nut-client one. The purpose of this was to offer a common
|
||||
interface to shutdown the UPS in case of power loss, this is not necessary
|
||||
with systemd as this functionality is handeled by the
|
||||
/lib/systemd/system-shutdown/nutshutdown script now.
|
||||
|
||||
[ Michael Stapelberg ]
|
||||
* Update symbols file for gcc-7 (Closes: #853579)
|
||||
|
||||
-- Michael Stapelberg <stapelberg@debian.org> Wed, 23 Aug 2017 22:24:57 +0200
|
||||
|
||||
nut (2.7.4-5) unstable; urgency=medium
|
||||
|
||||
* debian/control: Build-depends against asciidoc-dblatex, Recommends are not
|
||||
pulled automatically by the buildd (Closes: #851015)
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Wed, 25 Jan 2017 09:14:10 +0100
|
||||
|
||||
nut (2.7.4-4) unstable; urgency=medium
|
||||
|
||||
* debian/libnutclient0.symbols: Update the .symbols file, this should fix
|
||||
the FTBFS (Closes: #835703)
|
||||
* debian/nut-monitor.install: Install appdata file
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Tue, 27 Sep 2016 23:00:50 +0200
|
||||
|
||||
nut (2.7.4-3) unstable; urgency=medium
|
||||
|
||||
* debian/libnutclient0.symbols: Really add all the needed symbols (Closes:
|
||||
#831725)
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Sun, 24 Jul 2016 16:40:24 +0200
|
||||
|
||||
nut (2.7.4-2) unstable; urgency=medium
|
||||
|
||||
* debian/libnutclient0.symbols: Adjust .symbols file for arch specific C++
|
||||
symbols (Thanks to pkgkde tools)
|
||||
* Run wrap-and-sort
|
||||
* debian/control: Add systemd to the build-dependencies, we need the
|
||||
systemd.pc file to be installed during the build
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Mon, 18 Jul 2016 17:48:25 +0200
|
||||
|
||||
nut (2.7.4-1) unstable; urgency=low
|
||||
|
||||
[ Arnaud Quette ]
|
||||
* New upstream release (Closes: #806255)
|
||||
* debian/patches/series: remove 0007-killpower-path.patch
|
||||
* debian/control: add new packages libnutclient0 and libnutclient-dev
|
||||
* debian/rules: adapted for the new packages
|
||||
* debian/libnutclient0.install, debian/libnutclient0.symbols,
|
||||
debian/libnutclient-dev.install, debian/libnutclient-dev.manpages:
|
||||
created for the new packages
|
||||
|
||||
[ Laurent Bigonville ]
|
||||
* debian/gbp.conf: Switch back the branch to the "debian" one
|
||||
* Drop d/p/0009-fix-favorites-permissions.patch, merged upstream
|
||||
* d/p/0002-nut-monitor-paths.patch, d/p/0006-ups-conf-maxretry.patch:
|
||||
Refreshed
|
||||
* debian/control: Bump Standards-Version to 3.9.8 (no further changes)
|
||||
* debian/control: Add dh-python to the build-dependencies
|
||||
* Bump debhelper compatibility to 9
|
||||
* d/p/0009-fix-nutshutdown-install.patch: Install the nutshutdown script in
|
||||
the correct path
|
||||
* debian/nut-server.install: 52-nut-usbups.rules file has been renamed to
|
||||
62-nut-usbups.rules
|
||||
* debian/libnutclient0.symbols, debian/libupsclient4.symbols: Adjust the
|
||||
.symbols files
|
||||
* debian/control: Use https:// URL's in Vcs-* fields
|
||||
* debian/nut-cgi.README.Debian: Fix typo
|
||||
* debian/control: Fix the grammar in nut-ipmi long description
|
||||
* Drop debian/nut-monitor.menu and debian/nut-monitor.xpm, not needed
|
||||
anymore per tech-ctte decision #741573
|
||||
* debian/rules: Enable hardening=+all
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Mon, 18 Jul 2016 10:58:49 +0200
|
||||
|
||||
nut (2.7.2-4) unstable; urgency=medium
|
||||
|
||||
* Really fix package initial installation when PID1 is systemd (Closes:
|
||||
|
|
2
debian/compat
vendored
2
debian/compat
vendored
|
@ -1 +1 @@
|
|||
8
|
||||
12
|
||||
|
|
192
debian/control
vendored
192
debian/control
vendored
|
@ -1,38 +1,34 @@
|
|||
Source: nut
|
||||
Section: admin
|
||||
Priority: optional
|
||||
Maintainer: Arnaud Quette <aquette@debian.org>
|
||||
Uploaders: Laurent Bigonville <bigon@debian.org>
|
||||
Build-Depends: debhelper (>= 8.1.3),
|
||||
cdbs (>= 0.4.122~),
|
||||
autotools-dev,
|
||||
dh-autoreconf,
|
||||
dh-systemd (>= 1.14),
|
||||
Maintainer: Laurent Bigonville <bigon@debian.org>
|
||||
Build-Depends: debhelper (>= 12),
|
||||
dh-python,
|
||||
libfreeipmi-dev (>= 0.8.5) [!hurd-i386],
|
||||
libgd-dev | libgd2-xpm-dev | libgd2-noxpm-dev,
|
||||
libipmimonitoring-dev (>= 1.1.5-2) [!hurd-i386],
|
||||
libltdl-dev,
|
||||
libneon27-gnutls-dev | libneon27-dev,
|
||||
libnss3-dev,
|
||||
libpowerman0-dev (>= 2.3.3),
|
||||
libsnmp-dev | libsnmp9-dev,
|
||||
libusb-dev (>= 0.1.8),
|
||||
libneon27-gnutls-dev | libneon27-dev,
|
||||
libpowerman0-dev (>= 2.3.3),
|
||||
libwrap0-dev (>= 7.6),
|
||||
python (>= 2.6.6-3~),
|
||||
libfreeipmi-dev (>= 0.8.5) [!hurd-i386],
|
||||
libipmimonitoring-dev (>= 1.1.5-2) [!hurd-i386],
|
||||
libnss3-dev
|
||||
Build-Depends-Indep: asciidoc (>= 8.6.3),
|
||||
docbook-xsl,
|
||||
dblatex (>= 0.2.5),
|
||||
libxml2-utils
|
||||
Standards-Version: 3.9.5
|
||||
Homepage: http://www.networkupstools.org/
|
||||
Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/nut.git;a=summary
|
||||
Vcs-Git: git://anonscm.debian.org/collab-maint/nut.git
|
||||
X-Python-Version: >= 2.5
|
||||
XS-Testsuite: autopkgtest
|
||||
python3
|
||||
Build-Depends-Indep: asciidoc (>= 8.6.3) <!nodoc>,
|
||||
asciidoc-dblatex <!nodoc>,
|
||||
dblatex (>= 0.2.5) <!nodoc>,
|
||||
docbook-xsl <!nodoc>,
|
||||
libxml2-utils <!nodoc>
|
||||
Standards-Version: 4.6.0
|
||||
Homepage: https://networkupstools.org/
|
||||
Vcs-Browser: https://salsa.debian.org/debian/nut
|
||||
Vcs-Git: https://salsa.debian.org/debian/nut.git
|
||||
|
||||
Package: nut
|
||||
Architecture: all
|
||||
Section: metapackages
|
||||
Depends: ${misc:Depends}, nut-server, nut-client
|
||||
Depends: nut-client, nut-server, ${misc:Depends}
|
||||
Description: network UPS tools - metapackage
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
@ -45,11 +41,14 @@ Description: network UPS tools - metapackage
|
|||
|
||||
Package: nut-server
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6), ${udev}, nut-client (= ${binary:Version})
|
||||
Suggests: nut-cgi, nut-snmp, nut-ipmi, nut-xml
|
||||
Conflicts: nut-hal-drivers
|
||||
Replaces: nut (<< 2.6.1-2~)
|
||||
Breaks: nut (<< 2.6.1-2~)
|
||||
Depends: adduser,
|
||||
lsb-base (>= 3.0-6),
|
||||
nut-client (= ${binary:Version}),
|
||||
udev [linux-any],
|
||||
${misc:Depends},
|
||||
${shlibs:Depends}
|
||||
Suggests: nut-cgi, nut-ipmi, nut-snmp, nut-xml
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Description: network UPS tools - core system
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
@ -62,13 +61,13 @@ Description: network UPS tools - core system
|
|||
|
||||
Package: nut-client
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6)
|
||||
Depends: adduser, lsb-base (>= 3.0-6), ${misc:Depends}, ${shlibs:Depends}
|
||||
Provides: ups-monitor
|
||||
Conflicts: ups-monitor
|
||||
Recommends: bash-completion
|
||||
Suggests: nut-monitor
|
||||
Replaces: ups-monitor, nut (<< 2.6.1-2~), nut-server (<< 2.6.3-1~)
|
||||
Breaks: nut (<< 2.6.1-2~), nut-server (<< 2.6.3-1~)
|
||||
Replaces: ups-monitor
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Description: network UPS tools - clients
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
@ -81,7 +80,7 @@ Description: network UPS tools - clients
|
|||
|
||||
Package: nut-cgi
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, adduser
|
||||
Depends: adduser, ${misc:Depends}, ${shlibs:Depends}
|
||||
Recommends: apache2 | httpd-cgi
|
||||
Suggests: nut
|
||||
Description: network UPS tools - web interface
|
||||
|
@ -96,7 +95,7 @@ Description: network UPS tools - web interface
|
|||
|
||||
Package: nut-snmp
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 1.4.1-pre1)
|
||||
Depends: nut (>= 1.4.1-pre1), ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: network UPS tools - SNMP driver
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
@ -109,8 +108,8 @@ Description: network UPS tools - SNMP driver
|
|||
Manager interface to the core NUT system.
|
||||
|
||||
Package: nut-ipmi
|
||||
Architecture: linux-any kfreebsd-any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 1.4.1-pre1)
|
||||
Architecture: kfreebsd-any linux-any
|
||||
Depends: nut (>= 1.4.1-pre1), ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: network UPS tools - IPMI driver
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
@ -118,14 +117,13 @@ Description: network UPS tools - IPMI driver
|
|||
through the server, and are notified whenever the power status
|
||||
changes.
|
||||
.
|
||||
This package currently provides nut-ipmipsu, a driver which allows
|
||||
to monitor IPMI power supply units (PSU) found in servers of
|
||||
popular brands, such as Dell, HP, IBM. It adds an IPMI interface
|
||||
to the core NUT system.
|
||||
This package currently provides nut-ipmipsu, a driver which allows the user to
|
||||
monitor IPMI power supply units (PSU) found in servers of popular brands, such
|
||||
as Dell, HP, IBM. It adds an IPMI interface to the core NUT system.
|
||||
|
||||
Package: nut-xml
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 2.2.2)
|
||||
Depends: nut (>= 2.2.2), ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: network UPS tools - XML/HTTP driver
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
@ -139,8 +137,10 @@ Description: network UPS tools - XML/HTTP driver
|
|||
|
||||
Package: nut-powerman-pdu
|
||||
Architecture: any
|
||||
Priority: extra
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, nut (>= 2.4.0), powerman (>= 2.3.3)
|
||||
Depends: nut (>= 2.4.0),
|
||||
powerman (>= 2.3.3),
|
||||
${misc:Depends},
|
||||
${shlibs:Depends}
|
||||
Description: network UPS tools - PowerMan PDU driver
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
@ -156,6 +156,7 @@ Architecture: all
|
|||
Section: doc
|
||||
Depends: ${misc:Depends}
|
||||
Suggests: doc-base
|
||||
Build-Profiles: <!nodoc>
|
||||
Description: network UPS tools - documentation
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
@ -168,7 +169,7 @@ Description: network UPS tools - documentation
|
|||
Package: libupsclient4
|
||||
Section: libs
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Multi-Arch: same
|
||||
Description: network UPS tools - client library
|
||||
|
@ -183,9 +184,11 @@ Description: network UPS tools - client library
|
|||
Package: libupsclient-dev
|
||||
Section: libdevel
|
||||
Architecture: any
|
||||
Depends: libupsclient4 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
|
||||
Conflicts: libupsclient1-dev
|
||||
Replaces: libupsclient1-dev
|
||||
Depends: libnss3-dev,
|
||||
libupsclient4 (= ${binary:Version}),
|
||||
${misc:Depends},
|
||||
${shlibs:Depends}
|
||||
Multi-Arch: same
|
||||
Description: network UPS tools - development files
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
@ -195,40 +198,103 @@ Description: network UPS tools - development files
|
|||
.
|
||||
This package provides the development files.
|
||||
|
||||
Package: python-nut
|
||||
Section: python
|
||||
Architecture: all
|
||||
Depends: ${python:Depends}, ${misc:Depends}
|
||||
Description: network UPS tools - Python bindings for NUT server
|
||||
Package: libnutclient0
|
||||
Section: libs
|
||||
Architecture: any
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Multi-Arch: same
|
||||
Description: network UPS tools - new client library
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
power distribution unit (PDU) hardware. Clients access the hardware
|
||||
through the server, and are notified whenever the power status
|
||||
changes.
|
||||
.
|
||||
This package provides Python bindings to connect to NUT server.
|
||||
This package provides the new shared client library.
|
||||
|
||||
Package: nut-monitor
|
||||
Architecture: all
|
||||
Depends: ${python:Depends},
|
||||
Package: libnutclient-dev
|
||||
Section: libdevel
|
||||
Architecture: any
|
||||
Depends: libnutclient0 (= ${binary:Version}),
|
||||
${misc:Depends},
|
||||
python-gobject,
|
||||
python-gtk2,
|
||||
python-glade2,
|
||||
python-nut
|
||||
Description: network UPS tools - GUI application to monitor UPS status
|
||||
${shlibs:Depends}
|
||||
Multi-Arch: same
|
||||
Description: network UPS tools - development files for the new client library
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
power distribution unit (PDU) hardware. Clients access the hardware
|
||||
through the server, and are notified whenever the power status
|
||||
changes.
|
||||
.
|
||||
This package provides nut-monitor, a GUI application to monitor UPS status.
|
||||
This package provides the development files for the new client library.
|
||||
|
||||
Package: libnutscan1
|
||||
Section: libs
|
||||
Architecture: any
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Multi-Arch: same
|
||||
Description: network UPS tools - scanner library
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
power distribution unit (PDU) hardware. Clients access the hardware
|
||||
through the server, and are notified whenever the power status
|
||||
changes.
|
||||
.
|
||||
This package provides the shared scanner library.
|
||||
|
||||
Package: libnutscan-dev
|
||||
Section: libdevel
|
||||
Architecture: any
|
||||
Depends: libnutscan1 (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends}
|
||||
Breaks: libupsclient-dev (<< 2.7.4-9~)
|
||||
Replaces: libupsclient-dev (<< 2.7.4-9~)
|
||||
Multi-Arch: same
|
||||
Description: network UPS tools - development files for the scanner library
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
power distribution unit (PDU) hardware. Clients access the hardware
|
||||
through the server, and are notified whenever the power status
|
||||
changes.
|
||||
.
|
||||
This package provides the development files for the scanner library.
|
||||
|
||||
#Package: python3-nut
|
||||
#Section: python
|
||||
#Architecture: all
|
||||
#Depends: ${misc:Depends}, ${python3:Depends}
|
||||
#Description: network UPS tools - Python3 bindings for NUT server
|
||||
# Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
# allows computers to share uninterruptible power supply (UPS) and
|
||||
# power distribution unit (PDU) hardware. Clients access the hardware
|
||||
# through the server, and are notified whenever the power status
|
||||
# changes.
|
||||
# .
|
||||
# This package provides Python3 bindings to connect to NUT server.
|
||||
|
||||
#Package: nut-monitor
|
||||
#Architecture: all
|
||||
#Depends: python-glade2,
|
||||
# python-gobject-2,
|
||||
# python-gtk2,
|
||||
# python-nut,
|
||||
# ${misc:Depends},
|
||||
# ${python:Depends}
|
||||
#Recommends: python-notify
|
||||
#Description: network UPS tools - GUI application to monitor UPS status
|
||||
# Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
# allows computers to share uninterruptible power supply (UPS) and
|
||||
# power distribution unit (PDU) hardware. Clients access the hardware
|
||||
# through the server, and are notified whenever the power status
|
||||
# changes.
|
||||
# .
|
||||
# This package provides nut-monitor, a GUI application to monitor UPS status.
|
||||
|
||||
Package: libups-nut-perl
|
||||
Section: perl
|
||||
Architecture: all
|
||||
Depends: ${perl:Depends}, ${misc:Depends}
|
||||
Depends: ${misc:Depends}, ${perl:Depends}
|
||||
Description: network UPS tools - Perl bindings for NUT server
|
||||
Network UPS Tools (NUT) is a client/server monitoring system that
|
||||
allows computers to share uninterruptible power supply (UPS) and
|
||||
|
|
1
debian/description.subst
vendored
1
debian/description.subst
vendored
|
@ -1 +0,0 @@
|
|||
description=nut is a client/server uninterruptible power supply (UPS) monitoring system${Newline}${Space}that permits the sharing of one (or more) UPS between several machines. The${Newline}${Space}'server' monitors the UPS and notifies the 'clients' when the UPS is on${Newline}${Space}battery or has a low battery.
|
2
debian/gbp.conf
vendored
2
debian/gbp.conf
vendored
|
@ -1,5 +1,5 @@
|
|||
[DEFAULT]
|
||||
debian-branch = debian-jessie
|
||||
debian-branch = debian
|
||||
upstream-branch = upstream
|
||||
pristine-tar = True
|
||||
|
||||
|
|
24
debian/hotplug
vendored
24
debian/hotplug
vendored
|
@ -1,24 +0,0 @@
|
|||
#!/bin/bash
|
||||
# taken from libgphoto2
|
||||
|
||||
GROUP=nut
|
||||
|
||||
# for previous udev versions
|
||||
if [ "$ACTION" = "add" ] && [ -f "$DEVICE" ]
|
||||
then
|
||||
# check if $GROUP really exists
|
||||
if getent group $GROUP > /dev/null; then
|
||||
chmod 660 "$DEVICE"
|
||||
chown root:$GROUP "$DEVICE"
|
||||
fi
|
||||
fi
|
||||
|
||||
# for recent udev versions
|
||||
if [ "$ACTION" = "add" ] && [ -r "$DEVNAME" ]
|
||||
then
|
||||
# check if $GROUP really exists
|
||||
if getent group $GROUP > /dev/null; then
|
||||
chmod 660 "$DEVNAME"
|
||||
chown root:$GROUP "$DEVNAME"
|
||||
fi
|
||||
fi
|
4
debian/libnutclient-dev.install
vendored
Normal file
4
debian/libnutclient-dev.install
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
usr/include/nutclient.h
|
||||
usr/lib/*/libnutclient.a
|
||||
usr/lib/*/libnutclient.so
|
||||
usr/lib/*/pkgconfig/libnutclient.pc
|
1
debian/libnutclient0.install
vendored
Normal file
1
debian/libnutclient0.install
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
lib/*/libnutclient.so.*
|
199
debian/libnutclient0.symbols
vendored
Normal file
199
debian/libnutclient0.symbols
vendored
Normal file
|
@ -0,0 +1,199 @@
|
|||
# SymbolsHelper-Confirmed: 2.7.4-9~ amd64 arm64 armel armhf hppa i386 ia64 m68k mips mips64el mipsel powerpc ppc64 ppc64el riscv64 s390x sh4 sparc64 x32
|
||||
libnutclient.so.0 libnutclient0 #MINVER#
|
||||
* Build-Depends-Package: libnutclient-dev
|
||||
(c++)"nut::Client::Client()@Base" 2.7.3
|
||||
(c++)"nut::Client::getDevice(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Client::getDeviceVariableValues(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Client::getDevices()@Base" 2.7.3
|
||||
(c++)"nut::Client::hasDevice(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Client::hasDeviceCommand(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Client::hasDeviceVariable(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Client::~Client()@Base" 2.7.3
|
||||
(c++)"nut::Command::Command(nut::Command const&)@Base" 2.7.3
|
||||
(c++)"nut::Command::Command(nut::Device*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Command::execute()@Base" 2.7.3
|
||||
(c++)"nut::Command::getDescription[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::Command::getDevice() const@Base" 2.7.3
|
||||
(c++)"nut::Command::getDevice()@Base" 2.7.3
|
||||
(c++)"nut::Command::getName[abi:cxx11]() const@Base" 2.7.3
|
||||
(c++)"nut::Command::isOk() const@Base" 2.7.3
|
||||
(c++)"nut::Command::operator bool() const@Base" 2.7.3
|
||||
(c++)"nut::Command::operator!() const@Base" 2.7.3
|
||||
(c++)"nut::Command::operator<(nut::Command const&) const@Base" 2.7.3
|
||||
(c++)"nut::Command::operator==(nut::Command const&) const@Base" 2.7.3
|
||||
(c++)"nut::Command::~Command()@Base" 2.7.3
|
||||
(c++)"nut::Device::Device(nut::Client*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Device::Device(nut::Device const&)@Base" 2.7.3
|
||||
(c++)"nut::Device::executeCommand(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Device::forcedShutdown()@Base" 2.7.3
|
||||
(c++)"nut::Device::getClient() const@Base" 2.7.3
|
||||
(c++)"nut::Device::getClient()@Base" 2.7.3
|
||||
(c++)"nut::Device::getCommand(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Device::getCommandNames[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::Device::getCommands()@Base" 2.7.3
|
||||
(c++)"nut::Device::getDescription[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::Device::getName[abi:cxx11]() const@Base" 2.7.3
|
||||
(c++)"nut::Device::getNumLogins()@Base" 2.7.3
|
||||
(c++)"nut::Device::getRWVariableNames[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::Device::getRWVariables()@Base" 2.7.3
|
||||
(c++)"nut::Device::getVariable(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Device::getVariableNames[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::Device::getVariableValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Device::getVariableValues[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::Device::getVariables()@Base" 2.7.3
|
||||
(c++)"nut::Device::isOk() const@Base" 2.7.3
|
||||
(c++)"nut::Device::login()@Base" 2.7.3
|
||||
(c++)"nut::Device::master()@Base" 2.7.3
|
||||
(c++)"nut::Device::operator bool() const@Base" 2.7.3
|
||||
(c++)"nut::Device::operator!() const@Base" 2.7.3
|
||||
(c++)"nut::Device::operator<(nut::Device const&) const@Base" 2.7.3
|
||||
(c++)"nut::Device::operator==(nut::Device const&) const@Base" 2.7.3
|
||||
(c++)"nut::Device::setVariable(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Device::setVariable(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)@Base" 2.7.3
|
||||
(c++)"nut::Device::~Device()@Base" 2.7.3
|
||||
(c++)"nut::IOException::~IOException()@Base" 2.7.3
|
||||
(c++)"nut::NotConnectedException::NotConnectedException()@Base" 2.7.3
|
||||
(c++)"nut::NotConnectedException::~NotConnectedException()@Base" 2.7.3
|
||||
(c++)"nut::NutException::NutException(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::NutException::str[abi:cxx11]() const@Base" 2.7.3
|
||||
(c++)"nut::NutException::what() const@Base" 2.7.3
|
||||
(c++)"nut::NutException::~NutException()@Base" 2.7.3
|
||||
(c++)"nut::SystemException::SystemException()@Base" 2.7.3
|
||||
(c++)"nut::SystemException::err[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::SystemException::~SystemException()@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::TcpClient()@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::TcpClient(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::authenticate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::connect()@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::connect(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::detectError(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::deviceForcedShutdown(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::deviceGetNumLogins(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::deviceLogin(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::deviceMaster(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::disconnect()@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::escape(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::executeDeviceCommand(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++|arch-bits=32)"nut::TcpClient::explode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)@Base" 2.7.4
|
||||
(c++|arch-bits=64)"nut::TcpClient::explode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long)@Base" 2.7.4
|
||||
(c++)"nut::TcpClient::get(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDevice(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDeviceCommandDescription(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDeviceCommandNames(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDeviceDescription(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDeviceNames[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDeviceRWVariableNames(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDeviceVariableDescription(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDeviceVariableNames(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDeviceVariableValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getDeviceVariableValues(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getHost[abi:cxx11]() const@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getPort() const@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::getTimeout() const@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::isConnected() const@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::list(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::logout()@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::sendQuery(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::setDeviceVariable(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::setDeviceVariable(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::setTimeout(long)@Base" 2.7.3
|
||||
(c++)"nut::TcpClient::~TcpClient()@Base" 2.7.3
|
||||
(c++)"nut::TimeoutException::TimeoutException()@Base" 2.7.3
|
||||
(c++)"nut::TimeoutException::~TimeoutException()@Base" 2.7.3
|
||||
(c++)"nut::UnknownHostException::UnknownHostException()@Base" 2.7.3
|
||||
(c++)"nut::UnknownHostException::~UnknownHostException()@Base" 2.7.3
|
||||
(c++)"nut::Variable::Variable(nut::Device*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Variable::Variable(nut::Variable const&)@Base" 2.7.3
|
||||
(c++)"nut::Variable::getDescription[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::Variable::getDevice() const@Base" 2.7.3
|
||||
(c++)"nut::Variable::getDevice()@Base" 2.7.3
|
||||
(c++)"nut::Variable::getName[abi:cxx11]() const@Base" 2.7.3
|
||||
(c++)"nut::Variable::getValue[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::Variable::isOk() const@Base" 2.7.3
|
||||
(c++)"nut::Variable::operator bool() const@Base" 2.7.3
|
||||
(c++)"nut::Variable::operator!() const@Base" 2.7.3
|
||||
(c++)"nut::Variable::operator<(nut::Variable const&) const@Base" 2.7.3
|
||||
(c++)"nut::Variable::operator==(nut::Variable const&) const@Base" 2.7.3
|
||||
(c++)"nut::Variable::setValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"nut::Variable::setValues(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)@Base" 2.7.3
|
||||
(c++)"nut::Variable::~Variable()@Base" 2.7.3
|
||||
(c++)"nut::internal::Socket::Socket()@Base" 2.7.3
|
||||
(c++)"nut::internal::Socket::connect(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@Base" 2.7.3
|
||||
(c++)"nut::internal::Socket::disconnect()@Base" 2.7.3
|
||||
(c++)"nut::internal::Socket::isConnected() const@Base" 2.7.3
|
||||
(c++|arch-bits=32)"nut::internal::Socket::read(void*, unsigned int)@Base" 2.7.4
|
||||
(c++|arch-bits=64)"nut::internal::Socket::read(void*, unsigned long)@Base" 2.7.4
|
||||
(c++)"nut::internal::Socket::read[abi:cxx11]()@Base" 2.7.3
|
||||
(c++)"nut::internal::Socket::setTimeout(long)@Base" 2.7.3
|
||||
(c++)"nut::internal::Socket::write(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++|arch-bits=32)"nut::internal::Socket::write(void const*, unsigned int)@Base" 2.7.4
|
||||
(c++|arch-bits=64)"nut::internal::Socket::write(void const*, unsigned long)@Base" 2.7.4
|
||||
nutclient_authenticate@Base 2.7.3
|
||||
nutclient_destroy@Base 2.7.3
|
||||
nutclient_device_forced_shutdown@Base 2.7.3
|
||||
nutclient_device_login@Base 2.7.3
|
||||
nutclient_device_master@Base 2.7.3
|
||||
nutclient_execute_device_command@Base 2.7.3
|
||||
nutclient_get_device_command_description@Base 2.7.3
|
||||
nutclient_get_device_commands@Base 2.7.3
|
||||
nutclient_get_device_description@Base 2.7.3
|
||||
nutclient_get_device_num_logins@Base 2.7.3
|
||||
nutclient_get_device_rw_variables@Base 2.7.3
|
||||
nutclient_get_device_variable_description@Base 2.7.3
|
||||
nutclient_get_device_variable_values@Base 2.7.3
|
||||
nutclient_get_device_variables@Base 2.7.3
|
||||
nutclient_get_devices@Base 2.7.3
|
||||
nutclient_has_device@Base 2.7.3
|
||||
nutclient_has_device_command@Base 2.7.3
|
||||
nutclient_has_device_variable@Base 2.7.3
|
||||
nutclient_logout@Base 2.7.3
|
||||
nutclient_set_device_variable_value@Base 2.7.3
|
||||
nutclient_set_device_variable_values@Base 2.7.3
|
||||
nutclient_tcp_create_client@Base 2.7.3
|
||||
nutclient_tcp_disconnect@Base 2.7.3
|
||||
nutclient_tcp_get_timeout@Base 2.7.3
|
||||
nutclient_tcp_is_connected@Base 2.7.3
|
||||
nutclient_tcp_reconnect@Base 2.7.3
|
||||
nutclient_tcp_set_timeout@Base 2.7.3
|
||||
(c++)"std::_Rb_tree<nut::Device, nut::Device, std::_Identity<nut::Device>, std::less<nut::Device>, std::allocator<nut::Device> >::_M_erase(std::_Rb_tree_node<nut::Device>*)@Base" 2.7.3
|
||||
(c++)"std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::_Identity<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_erase(std::_Rb_tree_node<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >*)@Base" 2.7.3
|
||||
(c++)"std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::_Identity<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::find(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::_M_erase(std::_Rb_tree_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >*)@Base" 2.7.3
|
||||
(c++|optional=templinst)"std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.4
|
||||
(c++)"std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::_M_get_insert_unique_pos(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.3
|
||||
(c++)"std::pair<std::_Rb_tree_iterator<nut::Variable>, bool> std::_Rb_tree<nut::Variable, nut::Variable, std::_Identity<nut::Variable>, std::less<nut::Variable>, std::allocator<nut::Variable> >::_M_insert_unique<nut::Variable>(nut::Variable&&)@Base" 2.7.3
|
||||
(c++)"std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::operator=(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)@Base" 2.7.3
|
||||
(c++)"std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::~vector()@Base" 2.7.3
|
||||
(c++)"std::vector<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::allocator<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::~vector()@Base" 2.7.3
|
||||
strarr_alloc@Base 2.7.3
|
||||
strarr_free@Base 2.7.3
|
||||
(c++)"typeinfo for nut::Client@Base" 2.7.3
|
||||
(c++)"typeinfo for nut::IOException@Base" 2.7.3
|
||||
(c++)"typeinfo for nut::NotConnectedException@Base" 2.7.3
|
||||
(c++)"typeinfo for nut::NutException@Base" 2.7.3
|
||||
(c++)"typeinfo for nut::SystemException@Base" 2.7.3
|
||||
(c++)"typeinfo for nut::TcpClient@Base" 2.7.3
|
||||
(c++)"typeinfo for nut::TimeoutException@Base" 2.7.3
|
||||
(c++)"typeinfo for nut::UnknownHostException@Base" 2.7.3
|
||||
(c++)"typeinfo name for nut::Client@Base" 2.7.3
|
||||
(c++)"typeinfo name for nut::IOException@Base" 2.7.3
|
||||
(c++)"typeinfo name for nut::NotConnectedException@Base" 2.7.3
|
||||
(c++)"typeinfo name for nut::NutException@Base" 2.7.3
|
||||
(c++)"typeinfo name for nut::SystemException@Base" 2.7.3
|
||||
(c++)"typeinfo name for nut::TcpClient@Base" 2.7.3
|
||||
(c++)"typeinfo name for nut::TimeoutException@Base" 2.7.3
|
||||
(c++)"typeinfo name for nut::UnknownHostException@Base" 2.7.3
|
||||
(c++|optional=templinst)"void std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_realloc_insert<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.4
|
||||
(c++|optional=templinst)"void std::vector<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::allocator<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::_M_realloc_insert<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >(__gnu_cxx::__normal_iterator<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, std::vector<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::allocator<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&&)@Base" 2.7.4
|
||||
(c++)"vtable for nut::Client@Base" 2.7.3
|
||||
(c++)"vtable for nut::IOException@Base" 2.7.3
|
||||
(c++)"vtable for nut::NotConnectedException@Base" 2.7.3
|
||||
(c++)"vtable for nut::NutException@Base" 2.7.3
|
||||
(c++)"vtable for nut::SystemException@Base" 2.7.3
|
||||
(c++)"vtable for nut::TcpClient@Base" 2.7.3
|
||||
(c++)"vtable for nut::TimeoutException@Base" 2.7.3
|
||||
(c++)"vtable for nut::UnknownHostException@Base" 2.7.3
|
||||
(c++|optional=templinst)"void std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_realloc_insert<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)@Base" 2.7.4
|
||||
(c++|optional=templinst|arch=s390x mipsel armhf)"std::pair<std::_Rb_tree_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, bool> std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::_Identity<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_insert_unique<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.4
|
||||
(c++|optional=templinst|arch=!s390x !mipsel !armhf)"std::set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::insert(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 2.7.4
|
6
debian/libnutscan-dev.install
vendored
Normal file
6
debian/libnutscan-dev.install
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
usr/include/nut-scan.h
|
||||
usr/include/nutscan-device.h
|
||||
usr/include/nutscan-init.h
|
||||
usr/include/nutscan-ip.h
|
||||
usr/lib/*/libnutscan.so
|
||||
usr/lib/*/pkgconfig/libnutscan.pc
|
1
debian/libnutscan1.install
vendored
Normal file
1
debian/libnutscan1.install
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
lib/*/libnutscan.so.*
|
157
debian/libnutscan1.symbols
vendored
Normal file
157
debian/libnutscan1.symbols
vendored
Normal file
|
@ -0,0 +1,157 @@
|
|||
libnutscan.so.1 libnutscan1 #MINVER#
|
||||
* Build-Depends-Package: libnutscan-dev
|
||||
AUT@Base 2.7.4-9~
|
||||
UPS_VERSION@Base 2.7.4-9~
|
||||
altpidpath@Base 2.7.4-9~
|
||||
background@Base 2.7.4-9~
|
||||
become_user@Base 2.7.4-9~
|
||||
calc_checksum@Base 2.7.4-9~
|
||||
checksum_test@Base 2.7.4-9~
|
||||
chroot_start@Base 2.7.4-9~
|
||||
comm_upsdrv_info@Base 2.7.4-9~
|
||||
command_read_sequence@Base 2.7.4-9~
|
||||
command_write_sequence@Base 2.7.4-9~
|
||||
confpath@Base 2.7.4-9~
|
||||
device_path@Base 2.7.4-9~
|
||||
device_portname@Base 2.7.4-9~
|
||||
dflt_statepath@Base 2.7.4-9~
|
||||
do_lock_port@Base 2.7.4-9~
|
||||
exit_flag@Base 2.7.4-9~
|
||||
fatal_with_errno@Base 2.7.4-9~
|
||||
fatalx@Base 2.7.4-9~
|
||||
g_usec_timeout@Base 2.7.4-9~
|
||||
get_answer@Base 2.7.4-9~
|
||||
get_libname@Base 2.7.4-9~
|
||||
get_user_pwent@Base 2.7.4-9~
|
||||
getval@Base 2.7.4-9~
|
||||
(arch=!hurd-i386)is_ipmi_device_supported@Base 2.7.4-9~
|
||||
nut_debug_level@Base 2.7.4-9~
|
||||
nut_log_level@Base 2.7.4-9~
|
||||
nut_snmp_add_null_var@Base 2.7.4-9~
|
||||
nutscan_add_device_to_device@Base 2.7.4-9~
|
||||
nutscan_add_option_to_device@Base 2.7.4-9~
|
||||
nutscan_avail_avahi@Base 2.7.4-9~
|
||||
nutscan_avail_ipmi@Base 2.7.4-9~
|
||||
nutscan_avail_nut@Base 2.7.4-9~
|
||||
nutscan_avail_snmp@Base 2.7.4-9~
|
||||
nutscan_avail_usb@Base 2.7.4-9~
|
||||
nutscan_avail_xml_http@Base 2.7.4-9~
|
||||
nutscan_cidr_to_ip@Base 2.7.4-9~
|
||||
nutscan_device_type_string@Base 2.7.4-9~
|
||||
nutscan_device_type_strings@Base 2.7.4-9~
|
||||
nutscan_display_parsable@Base 2.7.4-9~
|
||||
nutscan_display_ups_conf@Base 2.7.4-9~
|
||||
nutscan_free@Base 2.7.4-9~
|
||||
nutscan_free_device@Base 2.7.4-9~
|
||||
nutscan_get_serial_ports_list@Base 2.7.4-9~
|
||||
nutscan_init@Base 2.7.4-9~
|
||||
nutscan_ip_iter_inc@Base 2.7.4-9~
|
||||
nutscan_ip_iter_init@Base 2.7.4-9~
|
||||
(arch=!hurd-i386)nutscan_load_ipmi_library@Base 2.7.4-9~
|
||||
nutscan_load_neon_library@Base 2.7.4-9~
|
||||
nutscan_load_snmp_library@Base 2.7.4-9~
|
||||
nutscan_load_upsclient_library@Base 2.7.4-9~
|
||||
nutscan_load_usb_library@Base 2.7.4-9~
|
||||
nutscan_new_device@Base 2.7.4-9~
|
||||
nutscan_rewind_device@Base 2.7.4-9~
|
||||
nutscan_scan_avahi@Base 2.7.4-9~
|
||||
nutscan_scan_eaton_serial@Base 2.7.4-9~
|
||||
nutscan_scan_eaton_serial_q1@Base 2.7.4-9~
|
||||
nutscan_scan_eaton_serial_shut@Base 2.7.4-9~
|
||||
nutscan_scan_eaton_serial_xcp@Base 2.7.4-9~
|
||||
nutscan_scan_ipmi@Base 2.7.4-9~
|
||||
nutscan_scan_nut@Base 2.7.4-9~
|
||||
nutscan_scan_snmp@Base 2.7.4-9~
|
||||
nutscan_scan_usb@Base 2.7.4-9~
|
||||
nutscan_scan_xml_http@Base 2.7.4-9~
|
||||
open_syslog@Base 2.7.4-9~
|
||||
pw_baud_rates@Base 2.7.4-9~
|
||||
pw_comm_setup@Base 2.7.4-9~
|
||||
search_paths@Base 2.7.4-9~
|
||||
select_read@Base 2.7.4-9~
|
||||
select_write@Base 2.7.4-9~
|
||||
send_read_command@Base 2.7.4-9~
|
||||
send_write_command@Base 2.7.4-9~
|
||||
sendsignal@Base 2.7.4-9~
|
||||
sendsignalfn@Base 2.7.4-9~
|
||||
ser_close@Base 2.7.4-9~
|
||||
ser_comm_fail@Base 2.7.4-9~
|
||||
ser_comm_good@Base 2.7.4-9~
|
||||
ser_flush_in@Base 2.7.4-9~
|
||||
ser_flush_io@Base 2.7.4-9~
|
||||
ser_get_buf@Base 2.7.4-9~
|
||||
ser_get_buf_len@Base 2.7.4-9~
|
||||
ser_get_char@Base 2.7.4-9~
|
||||
ser_get_cts@Base 2.7.4-9~
|
||||
ser_get_dcd@Base 2.7.4-9~
|
||||
ser_get_dsr@Base 2.7.4-9~
|
||||
ser_get_line@Base 2.7.4-9~
|
||||
ser_get_line_alert@Base 2.7.4-9~
|
||||
ser_open@Base 2.7.4-9~
|
||||
ser_open_nf@Base 2.7.4-9~
|
||||
ser_send@Base 2.7.4-9~
|
||||
ser_send_buf@Base 2.7.4-9~
|
||||
ser_send_buf_pace@Base 2.7.4-9~
|
||||
ser_send_char@Base 2.7.4-9~
|
||||
ser_send_pace@Base 2.7.4-9~
|
||||
ser_set_dtr@Base 2.7.4-9~
|
||||
ser_set_rts@Base 2.7.4-9~
|
||||
ser_set_speed@Base 2.7.4-9~
|
||||
ser_set_speed_nf@Base 2.7.4-9~
|
||||
shut_synchronise@Base 2.7.4-9~
|
||||
snprintfcat@Base 2.7.4-9~
|
||||
str_is_double@Base 2.7.4-9~
|
||||
str_is_double_strict@Base 2.7.4-9~
|
||||
str_is_int@Base 2.7.4-9~
|
||||
str_is_int_strict@Base 2.7.4-9~
|
||||
str_is_long@Base 2.7.4-9~
|
||||
str_is_long_strict@Base 2.7.4-9~
|
||||
str_is_short@Base 2.7.4-9~
|
||||
str_is_short_strict@Base 2.7.4-9~
|
||||
str_is_uint@Base 2.7.4-9~
|
||||
str_is_uint_strict@Base 2.7.4-9~
|
||||
str_is_ulong@Base 2.7.4-9~
|
||||
str_is_ulong_strict@Base 2.7.4-9~
|
||||
str_is_ushort@Base 2.7.4-9~
|
||||
str_is_ushort_strict@Base 2.7.4-9~
|
||||
str_ltrim@Base 2.7.4-9~
|
||||
str_ltrim_m@Base 2.7.4-9~
|
||||
str_ltrim_space@Base 2.7.4-9~
|
||||
str_rtrim@Base 2.7.4-9~
|
||||
str_rtrim_m@Base 2.7.4-9~
|
||||
str_rtrim_space@Base 2.7.4-9~
|
||||
str_to_double@Base 2.7.4-9~
|
||||
str_to_double_strict@Base 2.7.4-9~
|
||||
str_to_int@Base 2.7.4-9~
|
||||
str_to_int_strict@Base 2.7.4-9~
|
||||
str_to_long@Base 2.7.4-9~
|
||||
str_to_long_strict@Base 2.7.4-9~
|
||||
str_to_short@Base 2.7.4-9~
|
||||
str_to_short_strict@Base 2.7.4-9~
|
||||
str_to_uint@Base 2.7.4-9~
|
||||
str_to_uint_strict@Base 2.7.4-9~
|
||||
str_to_ulong@Base 2.7.4-9~
|
||||
str_to_ulong_strict@Base 2.7.4-9~
|
||||
str_to_ushort@Base 2.7.4-9~
|
||||
str_to_ushort_strict@Base 2.7.4-9~
|
||||
str_trim@Base 2.7.4-9~
|
||||
str_trim_m@Base 2.7.4-9~
|
||||
str_trim_space@Base 2.7.4-9~
|
||||
syslogbit_set@Base 2.7.4-9~
|
||||
upsdebug_ascii@Base 2.7.4-9~
|
||||
upsdebug_hex@Base 2.7.4-9~
|
||||
upsdebug_with_errno@Base 2.7.4-9~
|
||||
upsdebugx@Base 2.7.4-9~
|
||||
upsdrv_cleanup@Base 2.7.4-9~
|
||||
upsdrv_comm_good@Base 2.7.4-9~
|
||||
upsdrv_initups@Base 2.7.4-9~
|
||||
upsdrv_reconnect@Base 2.7.4-9~
|
||||
upsfd@Base 2.7.4-9~
|
||||
upslog_with_errno@Base 2.7.4-9~
|
||||
upslogx@Base 2.7.4-9~
|
||||
writepid@Base 2.7.4-9~
|
||||
xbasename@Base 2.7.4-9~
|
||||
xcalloc@Base 2.7.4-9~
|
||||
xmalloc@Base 2.7.4-9~
|
||||
xrealloc@Base 2.7.4-9~
|
||||
xstrdup@Base 2.7.4-9~
|
10
debian/libupsclient-dev.install
vendored
10
debian/libupsclient-dev.install
vendored
|
@ -1,9 +1,5 @@
|
|||
usr/lib/*/libupsclient.so
|
||||
usr/lib/*/libupsclient.a
|
||||
usr/lib/*/pkgconfig/libupsclient.pc
|
||||
usr/include/nut-scan.h
|
||||
usr/include/nutscan-device.h
|
||||
usr/include/nutscan-init.h
|
||||
usr/include/nutscan-ip.h
|
||||
usr/include/parseconf.h
|
||||
usr/include/upsclient.h
|
||||
usr/lib/*/libupsclient.a
|
||||
usr/lib/*/libupsclient.so
|
||||
usr/lib/*/pkgconfig/libupsclient.pc
|
||||
|
|
2
debian/libupsclient-dev.manpages
vendored
2
debian/libupsclient-dev.manpages
vendored
|
@ -1,2 +0,0 @@
|
|||
debian/tmp/usr/share/man/man3/nutscan*.3
|
||||
debian/tmp/usr/share/man/man3/upscli*.3
|
40
debian/libupsclient4.symbols
vendored
40
debian/libupsclient4.symbols
vendored
|
@ -1,4 +1,5 @@
|
|||
libupsclient.so.4 libupsclient4 #MINVER#
|
||||
* Build-Depends-Package: libupsclient-dev
|
||||
UPS_VERSION@Base 2.7.2
|
||||
altpidpath@Base 2.7.2
|
||||
background@Base 2.7.2
|
||||
|
@ -9,7 +10,6 @@ libupsclient.so.4 libupsclient4 #MINVER#
|
|||
fatal_with_errno@Base 2.7.2
|
||||
fatalx@Base 2.7.2
|
||||
get_user_pwent@Base 2.7.2
|
||||
ltrim@Base 2.7.2
|
||||
nut_debug_level@Base 2.7.2
|
||||
nut_log_level@Base 2.7.2
|
||||
open_syslog@Base 2.7.2
|
||||
|
@ -21,7 +21,6 @@ libupsclient.so.4 libupsclient4 #MINVER#
|
|||
pconf_init@Base 2.7.2
|
||||
pconf_line@Base 2.7.2
|
||||
pconf_parse_error@Base 2.7.2
|
||||
rtrim@Base 2.7.2
|
||||
select_read@Base 2.7.2
|
||||
select_write@Base 2.7.2
|
||||
sendsignal@Base 2.7.2
|
||||
|
@ -45,6 +44,43 @@ libupsclient.so.4 libupsclient4 #MINVER#
|
|||
state_setflags@Base 2.7.2
|
||||
state_setinfo@Base 2.7.2
|
||||
state_tree_find@Base 2.7.2
|
||||
str_is_double@Base 2.7.4
|
||||
str_is_double_strict@Base 2.7.4
|
||||
str_is_int@Base 2.7.4
|
||||
str_is_int_strict@Base 2.7.4
|
||||
str_is_long@Base 2.7.4
|
||||
str_is_long_strict@Base 2.7.4
|
||||
str_is_short@Base 2.7.4
|
||||
str_is_short_strict@Base 2.7.4
|
||||
str_is_uint@Base 2.7.4
|
||||
str_is_uint_strict@Base 2.7.4
|
||||
str_is_ulong@Base 2.7.4
|
||||
str_is_ulong_strict@Base 2.7.4
|
||||
str_is_ushort@Base 2.7.4
|
||||
str_is_ushort_strict@Base 2.7.4
|
||||
str_ltrim@Base 2.7.4
|
||||
str_ltrim_m@Base 2.7.4
|
||||
str_ltrim_space@Base 2.7.4
|
||||
str_rtrim@Base 2.7.4
|
||||
str_rtrim_m@Base 2.7.4
|
||||
str_rtrim_space@Base 2.7.4
|
||||
str_to_double@Base 2.7.4
|
||||
str_to_double_strict@Base 2.7.4
|
||||
str_to_int@Base 2.7.4
|
||||
str_to_int_strict@Base 2.7.4
|
||||
str_to_long@Base 2.7.4
|
||||
str_to_long_strict@Base 2.7.4
|
||||
str_to_short@Base 2.7.4
|
||||
str_to_short_strict@Base 2.7.4
|
||||
str_to_uint@Base 2.7.4
|
||||
str_to_uint_strict@Base 2.7.4
|
||||
str_to_ulong@Base 2.7.4
|
||||
str_to_ulong_strict@Base 2.7.4
|
||||
str_to_ushort@Base 2.7.4
|
||||
str_to_ushort_strict@Base 2.7.4
|
||||
str_trim@Base 2.7.4
|
||||
str_trim_m@Base 2.7.4
|
||||
str_trim_space@Base 2.7.4
|
||||
syslogbit_set@Base 2.7.2
|
||||
upscli_add_host_cert@Base 2.7.2
|
||||
upscli_cleanup@Base 2.7.2
|
||||
|
|
BIN
debian/local/nut-monitor.png
vendored
Normal file
BIN
debian/local/nut-monitor.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
490
debian/local/nut-monitor.svg
vendored
Normal file
490
debian/local/nut-monitor.svg
vendored
Normal file
|
@ -0,0 +1,490 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48"
|
||||
height="48"
|
||||
id="svg2"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.45"
|
||||
version="1.0"
|
||||
sodipodi:docbase="/home/dobey/Projects/gnome-icon-theme/scalable/devices"
|
||||
sodipodi:docname="battery.svg"
|
||||
inkscape:export-filename="/home/lapo/Desktop/per jimmac/scalable/devices/battery.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
id="linearGradient3367">
|
||||
<stop
|
||||
id="stop3369"
|
||||
offset="0"
|
||||
style="stop-color:#555753" />
|
||||
<stop
|
||||
style="stop-color:#8a8d85;stop-opacity:1;"
|
||||
offset="0.32156199"
|
||||
id="stop3371" />
|
||||
<stop
|
||||
style="stop-color:#babdb6;stop-opacity:1;"
|
||||
offset="0.53021115"
|
||||
id="stop3373" />
|
||||
<stop
|
||||
id="stop3375"
|
||||
offset="0.85266888"
|
||||
style="stop-color:#dcdeda;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3377"
|
||||
offset="1"
|
||||
style="stop-color:#babdb6" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3351">
|
||||
<stop
|
||||
style="stop-color:#888a85"
|
||||
offset="0"
|
||||
id="stop3353" />
|
||||
<stop
|
||||
style="stop-color:#555753"
|
||||
offset="1"
|
||||
id="stop3355" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3290">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3292" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3294" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3280">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3282" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3284" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3265">
|
||||
<stop
|
||||
style="stop-color:#c4a000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3267" />
|
||||
<stop
|
||||
style="stop-color:#c4a000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3269" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3254">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3256" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3258" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3236">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3238" />
|
||||
<stop
|
||||
style="stop-color:#fce94f"
|
||||
offset="1"
|
||||
id="stop3240" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3227">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3229" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3231" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3217">
|
||||
<stop
|
||||
style="stop-color:#c4a000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3219" />
|
||||
<stop
|
||||
style="stop-color:#edd400"
|
||||
offset="1"
|
||||
id="stop3221" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3174">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3176" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3178" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3146">
|
||||
<stop
|
||||
id="stop3148"
|
||||
offset="0"
|
||||
style="stop-color:#c4a000" />
|
||||
<stop
|
||||
style="stop-color:#d8ba00;stop-opacity:1;"
|
||||
offset="0.35133624"
|
||||
id="stop3160" />
|
||||
<stop
|
||||
style="stop-color:#edd400;stop-opacity:1;"
|
||||
offset="0.50020754"
|
||||
id="stop3152" />
|
||||
<stop
|
||||
id="stop3162"
|
||||
offset="0.85000002"
|
||||
style="stop-color:#fdf4a7;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3158"
|
||||
offset="1"
|
||||
style="stop-color:#fce94f" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3280"
|
||||
id="radialGradient3286"
|
||||
cx="21.34375"
|
||||
cy="14.125"
|
||||
fx="21.34375"
|
||||
fy="14.125"
|
||||
r="11.96875"
|
||||
gradientTransform="matrix(1,0,0,0.302872,8.341852e-16,9.846932)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3236"
|
||||
id="radialGradient3337"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.690032,-4.583908e-18,1.406348e-18,0.228281,6.615871,10.90053)"
|
||||
cx="19.717636"
|
||||
cy="16.677069"
|
||||
fx="19.717636"
|
||||
fy="16.677069"
|
||||
r="12.46875" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3174"
|
||||
id="radialGradient3339"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.253821,-0.396912,0.124986,0.425706,-7.949749,14.71501)"
|
||||
cx="19.161945"
|
||||
cy="24.691038"
|
||||
fx="19.161945"
|
||||
fy="24.691038"
|
||||
r="12.46875" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3265"
|
||||
id="linearGradient3341"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="31.18708"
|
||||
y1="9.9904861"
|
||||
x2="25.531752"
|
||||
y2="18.613125" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3174"
|
||||
id="radialGradient3343"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.253821,-0.396912,0.124986,0.425706,-7.949749,14.71501)"
|
||||
cx="19.161945"
|
||||
cy="24.691038"
|
||||
fx="19.161945"
|
||||
fy="24.691038"
|
||||
r="12.46875" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3227"
|
||||
id="radialGradient3347"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.499279,-0.163895,3.603099e-2,0.557877,-10.01886,8.004429)"
|
||||
cx="19.863604"
|
||||
cy="11.205179"
|
||||
fx="19.863604"
|
||||
fy="11.205179"
|
||||
r="4" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3217"
|
||||
id="linearGradient3380"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(2,-4.760636e-13)"
|
||||
x1="18.5625"
|
||||
y1="11.1875"
|
||||
x2="17.71875"
|
||||
y2="12.534899" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3146"
|
||||
id="linearGradient3384"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(2,-4.760636e-13)"
|
||||
x1="25.500298"
|
||||
y1="10.985043"
|
||||
x2="17.499449"
|
||||
y2="10.985043" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3351"
|
||||
id="linearGradient3393"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="13.375"
|
||||
y1="23.221346"
|
||||
x2="13.375"
|
||||
y2="32.383766"
|
||||
gradientTransform="translate(-2,-4.760636e-13)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3290"
|
||||
id="linearGradient3398"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="13.96536"
|
||||
y1="10.495919"
|
||||
x2="20.682875"
|
||||
y2="31.382992"
|
||||
gradientTransform="translate(2,0)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3254"
|
||||
id="linearGradient3401"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(2,-4.760636e-13)"
|
||||
x1="12.25"
|
||||
y1="20.230709"
|
||||
x2="17.125"
|
||||
y2="34.173542" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3146"
|
||||
id="linearGradient3404"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(2,-4.760636e-13)"
|
||||
x1="33.5625"
|
||||
y1="19.125"
|
||||
x2="9.4987011"
|
||||
y2="19.125" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3367"
|
||||
id="linearGradient3407"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(2,-4.760636e-13)"
|
||||
x1="33.50008"
|
||||
y1="28.375"
|
||||
x2="9.4992361"
|
||||
y2="28.375" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="34.743513"
|
||||
inkscape:cy="19.440609"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer5"
|
||||
showgrid="false"
|
||||
gridempspacing="2"
|
||||
gridspacingx="0.5px"
|
||||
gridspacingy="0.5px"
|
||||
inkscape:window-width="872"
|
||||
inkscape:window-height="771"
|
||||
inkscape:window-x="392"
|
||||
inkscape:window-y="55"
|
||||
stroke="#c4a000"
|
||||
inkscape:grid-points="false"
|
||||
inkscape:grid-bbox="true"
|
||||
fill="#555753"
|
||||
showborder="false"
|
||||
inkscape:showpageshadow="false" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Lapo Calamandrei</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:title>Battery</dc:title>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>battery</rdf:li>
|
||||
<rdf:li>recharge</rdf:li>
|
||||
<rdf:li>power</rdf:li>
|
||||
<rdf:li>acpi</rdf:li>
|
||||
<rdf:li>apm</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/SourceCode" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer6"
|
||||
inkscape:label="Shadow"
|
||||
style="display:inline">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.7254902;color:#000000;fill:url(#radialGradient3286);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
id="path3278"
|
||||
sodipodi:cx="21.34375"
|
||||
sodipodi:cy="14.125"
|
||||
sodipodi:rx="11.96875"
|
||||
sodipodi:ry="3.625"
|
||||
d="M 33.3125 14.125 A 11.96875 3.625 0 1 1 9.375,14.125 A 11.96875 3.625 0 1 1 33.3125 14.125 z"
|
||||
transform="matrix(1.389034,0,0,1.337644,-6.147196,18.98077)" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Battery"
|
||||
style="display:inline" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="inner stroke"
|
||||
style="display:inline" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer5"
|
||||
inkscape:label="tip"
|
||||
style="display:inline">
|
||||
<path
|
||||
style="color:#000000;fill:url(#linearGradient3407);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 22,10.5 C 16.084021,10.716519 11.5,12.21646 11.5,14 L 11.5,37 C 11.5,38.932002 16.876,40.500001 23.5,40.5 C 30.124,40.5 35.5,38.932003 35.5,37 L 35.5,14 C 35.5,12.067998 30.124001,10.5 23.5,10.5 C 23.13775,10.5 22.79161,10.490818 22.4375,10.5 C 22.294038,10.50372 22.141983,10.494804 22,10.5 z "
|
||||
id="path2230"
|
||||
sodipodi:nodetypes="csssssssc" />
|
||||
<path
|
||||
style="color:#000000;fill:url(#linearGradient3404);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 22.4375,10.5 C 16.316456,10.658717 11.5,12.173655 11.5,14 L 11.5,20.5 C 11.5,22.432002 16.875999,24.000001 23.5,24 C 30.124,24 35.5,22.432001 35.5,20.5 L 35.5,14 C 35.5,12.067998 30.124,10.5 23.5,10.5 C 23.13775,10.5 22.79161,10.490818 22.4375,10.5 z "
|
||||
id="path2232"
|
||||
sodipodi:nodetypes="cssssssc" />
|
||||
<path
|
||||
style="opacity:0.36862745;color:#000000;fill:url(#linearGradient3401);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 15,16 L 20,16 L 20,40.3125 L 15,39.5 L 15,16 z "
|
||||
id="rect3244"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="opacity:0.34509804;color:#000000;fill:url(#linearGradient3398);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 22,10.5 C 16.084021,10.716519 11.5,12.21646 11.5,14 L 11.5,37 C 11.5,38.932002 16.876,40.500001 23.5,40.5 C 30.124,40.5 35.5,38.932003 35.5,37 L 35.5,14 C 35.5,12.067998 30.124001,10.5 23.5,10.5 C 23.13775,10.5 22.79161,10.490818 22.4375,10.5 C 22.294038,10.50372 22.141983,10.494804 22,10.5 z "
|
||||
id="path3288"
|
||||
sodipodi:nodetypes="csssssssc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:url(#radialGradient3337);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient3339);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
id="path3164"
|
||||
sodipodi:cx="21.34375"
|
||||
sodipodi:cy="14.125"
|
||||
sodipodi:rx="11.96875"
|
||||
sodipodi:ry="3.625"
|
||||
d="M 33.3125 14.125 A 11.96875 3.625 0 1 1 9.375,14.125 A 11.96875 3.625 0 1 1 33.3125 14.125 z"
|
||||
transform="matrix(1.002611,0,0,0.965518,2.100522,0.362061)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.63921569;color:#000000;fill:url(#linearGradient3341);fill-opacity:1;fill-rule:nonzero;stroke:url(#radialGradient3343);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
id="path3263"
|
||||
sodipodi:cx="21.34375"
|
||||
sodipodi:cy="14.125"
|
||||
sodipodi:rx="11.96875"
|
||||
sodipodi:ry="3.625"
|
||||
d="M 33.3125 14.125 A 11.96875 3.625 0 1 1 9.375,14.125 A 11.96875 3.625 0 1 1 33.3125 14.125 z"
|
||||
transform="matrix(1.002611,0,0,0.965518,2.100522,0.362061)" />
|
||||
<path
|
||||
style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3393);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 11.5,21.5 L 11.5,37 C 11.5,38.932002 16.876,40.500001 23.5,40.5 C 30.124,40.5 35.5,38.932003 35.5,37 L 35.5,21.5"
|
||||
id="path2217"
|
||||
sodipodi:nodetypes="ccscc" />
|
||||
<path
|
||||
style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#c4a000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 35.5,21.5 L 35.5,14 C 35.5,12.067998 30.124001,10.5 23.5,10.5 C 23.13775,10.5 22.79161,10.490818 22.4375,10.5 C 22.294038,10.50372 22.141983,10.494804 22,10.5 C 16.084021,10.716519 11.5,12.21646 11.5,14 L 11.5,21.5"
|
||||
id="path2219"
|
||||
sodipodi:nodetypes="cssscsc" />
|
||||
<path
|
||||
style="opacity:0.49019608;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 21.84375,11.5 C 16.548895,11.680925 12.5,12.74668 12.5,14 C 12.5,15.142813 12.5,35.855219 12.5,37 C 12.5,38.38 17.427994,39.5 23.5,39.5 C 29.572006,39.5 34.5,38.38 34.5,37 C 34.5,35.940784 34.499999,15.059216 34.5,14 C 34.5,12.62 29.572007,11.5 23.5,11.5 C 23.1205,11.5 22.744639,11.49146 22.375,11.5 C 22.201732,11.504003 22.014552,11.494164 21.84375,11.5 z "
|
||||
id="path2206"
|
||||
sodipodi:nodetypes="csssssssc" />
|
||||
<path
|
||||
style="color:#000000;fill:url(#linearGradient3384);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 23,9.5 C 21.315666,9.5803665 19.950192,10.074035 19.59375,10.6875 C 19.587086,10.699702 19.568368,10.737692 19.5625,10.75 C 19.559767,10.75618 19.533781,10.775045 19.53125,10.78125 C 19.528923,10.78748 19.533372,10.806246 19.53125,10.8125 C 19.521672,10.843887 19.504323,10.905557 19.5,10.9375 C 19.49935,10.943909 19.500435,10.96232 19.5,10.96875 C 19.499782,10.975199 19.5,12.993531 19.5,13 C 19.5,13.006469 19.499782,13.024801 19.5,13.03125 C 19.500435,13.03768 19.49935,13.056091 19.5,13.0625 C 19.504323,13.094443 19.521672,13.156113 19.53125,13.1875 C 19.533372,13.193754 19.528923,13.21252 19.53125,13.21875 C 19.533781,13.224955 19.559767,13.24382 19.5625,13.25 C 19.568368,13.262308 19.587086,13.300298 19.59375,13.3125 C 19.985483,13.986704 21.58525,14.5 23.5,14.5 C 25.41475,14.5 27.014517,13.986704 27.40625,13.3125 C 27.412914,13.300298 27.431632,13.262308 27.4375,13.25 C 27.440233,13.24382 27.466219,13.224955 27.46875,13.21875 C 27.471077,13.21252 27.466628,13.193754 27.46875,13.1875 C 27.478328,13.156113 27.495677,13.094443 27.5,13.0625 C 27.50065,13.056091 27.499565,13.03768 27.5,13.03125 C 27.500218,13.024801 27.5,13.006469 27.5,13 C 27.5,12.993531 27.500218,10.975199 27.5,10.96875 C 27.499565,10.96232 27.50065,10.943909 27.5,10.9375 C 27.495677,10.905557 27.478328,10.843887 27.46875,10.8125 C 27.466628,10.806246 27.471077,10.78748 27.46875,10.78125 C 27.466219,10.775045 27.440233,10.75618 27.4375,10.75 C 27.431632,10.737692 27.412914,10.699702 27.40625,10.6875 C 27.014517,10.013296 25.41475,9.5 23.5,9.5 C 23.3275,9.5 23.166766,9.4920429 23,9.5 z "
|
||||
id="path3198"
|
||||
sodipodi:nodetypes="cssssssssssssssssssssssssssssc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:url(#radialGradient3347);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
id="path3225"
|
||||
sodipodi:cx="21.5"
|
||||
sodipodi:cy="11"
|
||||
sodipodi:rx="4"
|
||||
sodipodi:ry="1.5"
|
||||
d="M 25.5 11 A 4 1.5 0 1 1 17.5,11 A 4 1.5 0 1 1 25.5 11 z"
|
||||
transform="matrix(0.867417,0,0,0.666667,4.820203,3.666665)" />
|
||||
<path
|
||||
style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3380);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 23,9.5 C 21.315666,9.5803665 19.950192,10.074035 19.59375,10.6875 C 19.587086,10.699702 19.568368,10.737692 19.5625,10.75 C 19.559767,10.75618 19.533781,10.775045 19.53125,10.78125 C 19.528923,10.78748 19.533372,10.806246 19.53125,10.8125 C 19.521672,10.843887 19.504323,10.905557 19.5,10.9375 C 19.49935,10.943909 19.500435,10.96232 19.5,10.96875 C 19.499782,10.975199 19.5,12.993531 19.5,13 C 19.5,13.006469 19.499782,13.024801 19.5,13.03125 C 19.500435,13.03768 19.49935,13.056091 19.5,13.0625 C 19.504323,13.094443 19.521672,13.156113 19.53125,13.1875 C 19.533372,13.193754 19.528923,13.21252 19.53125,13.21875 C 19.533781,13.224955 19.559767,13.24382 19.5625,13.25 C 19.568368,13.262308 19.587086,13.300298 19.59375,13.3125 C 19.985483,13.986704 21.58525,14.5 23.5,14.5 C 25.41475,14.5 27.014517,13.986704 27.40625,13.3125 C 27.412914,13.300298 27.431632,13.262308 27.4375,13.25 C 27.440233,13.24382 27.466219,13.224955 27.46875,13.21875 C 27.471077,13.21252 27.466628,13.193754 27.46875,13.1875 C 27.478328,13.156113 27.495677,13.094443 27.5,13.0625 C 27.50065,13.056091 27.499565,13.03768 27.5,13.03125 C 27.500218,13.024801 27.5,13.006469 27.5,13 C 27.5,12.993531 27.500218,10.975199 27.5,10.96875 C 27.499565,10.96232 27.50065,10.943909 27.5,10.9375 C 27.495677,10.905557 27.478328,10.843887 27.46875,10.8125 C 27.466628,10.806246 27.471077,10.78748 27.46875,10.78125 C 27.466219,10.775045 27.440233,10.75618 27.4375,10.75 C 27.431632,10.737692 27.412914,10.699702 27.40625,10.6875 C 27.014517,10.013296 25.41475,9.5 23.5,9.5 C 23.3275,9.5 23.166766,9.4920429 23,9.5 z "
|
||||
id="path3205"
|
||||
sodipodi:nodetypes="cssssssssssssssssssssssssssssc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 23 KiB |
2
debian/nut-cgi.README.Debian
vendored
2
debian/nut-cgi.README.Debian
vendored
|
@ -6,7 +6,7 @@ Network UPS Tools - CGI Interface - Quick Start for Debian
|
|||
|
||||
1) Sample configuration files are provided in /etc/nut/
|
||||
Rename without the ".sample" suffix the files hosts.conf, upsstats.html,
|
||||
upsstats-single.html and optionaly upsset.conf.
|
||||
upsstats-single.html and optionally upsset.conf.
|
||||
Then edit these to match your configuration.
|
||||
|
||||
2) Ensure these configuration files are readable by others
|
||||
|
|
2
debian/nut-cgi.install
vendored
2
debian/nut-cgi.install
vendored
|
@ -1,6 +1,6 @@
|
|||
debian/tmp/etc/nut/hosts.conf
|
||||
debian/tmp/etc/nut/upsset.conf
|
||||
debian/tmp/etc/nut/upsstats.html
|
||||
debian/tmp/etc/nut/upsstats-single.html
|
||||
debian/tmp/etc/nut/upsstats.html
|
||||
debian/tmp/usr/lib/cgi-bin/
|
||||
debian/tmp/usr/share/nut/www
|
||||
|
|
6
debian/nut-cgi.manpages
vendored
6
debian/nut-cgi.manpages
vendored
|
@ -1,6 +0,0 @@
|
|||
debian/tmp/usr/share/man/man5/hosts.conf.5
|
||||
debian/tmp/usr/share/man/man5/upsset.conf.5
|
||||
debian/tmp/usr/share/man/man5/upsstats.html.5
|
||||
debian/tmp/usr/share/man/man8/upsimage.cgi.8
|
||||
debian/tmp/usr/share/man/man8/upsset.cgi.8
|
||||
debian/tmp/usr/share/man/man8/upsstats.cgi.8
|
10
debian/nut-cgi.postinst
vendored
10
debian/nut-cgi.postinst
vendored
|
@ -31,15 +31,7 @@ case "$1" in
|
|||
done
|
||||
;;
|
||||
|
||||
abort-upgrade)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
abort-remove)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
abort-deconfigure)
|
||||
abort-upgrade|abort-remove|abort-deconfigure)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
|
|
47
debian/nut-cgi.postrm
vendored
47
debian/nut-cgi.postrm
vendored
|
@ -1,47 +0,0 @@
|
|||
#!/bin/sh -e
|
||||
|
||||
case "$1" in
|
||||
|
||||
remove)
|
||||
# remove sample file if those were previously (wrongly) installed
|
||||
for file in upsset.conf hosts.conf upsstats.html upsstats-single.html ; do
|
||||
if [ -f /etc/nut/${file}.sample ] ; then
|
||||
rm -f /etc/nut/${file}.sample
|
||||
fi
|
||||
done
|
||||
;;
|
||||
|
||||
purge)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
upgrade)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
failed-upgrade)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
abort-install)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
abort-upgrade)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
disappear)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "$0: incorrect arguments: $*" >&2
|
||||
exit 1
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
4
debian/nut-client.init
vendored
4
debian/nut-client.init
vendored
|
@ -19,7 +19,7 @@ PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
|
|||
NAME=nut-client
|
||||
DESC="NUT - power device monitor and shutdown controller"
|
||||
CONFIG=/etc/nut/nut.conf
|
||||
pid_dir=/var/run/nut
|
||||
pid_dir=/run/nut
|
||||
upsmon_pid=${pid_dir}/upsmon.pid
|
||||
upsmon=/sbin/upsmon
|
||||
log=">/dev/null 2>/dev/null"
|
||||
|
@ -50,7 +50,7 @@ if [ "x$MODE" = "xnone" -o -z "$MODE" ] ; then
|
|||
exit 0
|
||||
fi
|
||||
|
||||
# Check if /var/run/nut exists and has the correct perms
|
||||
# Check if /run/nut exists and has the correct perms
|
||||
check_var_directory() {
|
||||
[ ! -d ${pid_dir} ] && mkdir -p ${pid_dir} \
|
||||
&& chown root:nut ${pid_dir} \
|
||||
|
|
32
debian/nut-client.install
vendored
32
debian/nut-client.install
vendored
|
@ -1,21 +1,25 @@
|
|||
debian/tmp/bin/upslog
|
||||
debian/tmp/bin/upsc
|
||||
debian/tmp/bin/upsrw
|
||||
debian/tmp/bin/upscmd
|
||||
debian/tmp/sbin/upsmon
|
||||
debian/tmp/lib/nut/upsmon
|
||||
debian/tmp/sbin/upssched
|
||||
debian/tmp/bin/upslog
|
||||
debian/tmp/bin/upsrw
|
||||
debian/tmp/bin/upssched-cmd
|
||||
debian/tmp/etc/nut/nut.conf
|
||||
debian/tmp/etc/nut/upsmon.conf
|
||||
debian/tmp/etc/nut/upssched.conf
|
||||
debian/tmp/usr/share/augeas/lenses/dist/nuthostsconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/dist/nutnutconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/dist/nutupsconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/dist/nutupsdconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/dist/nutupsdusers.aug
|
||||
debian/tmp/usr/share/augeas/lenses/dist/nutupsmonconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/dist/nutupsschedconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/dist/nutupssetconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/dist/tests/test_nut.aug
|
||||
debian/tmp/lib/nut/upsmon
|
||||
debian/tmp/lib/systemd/system/nut-client.service
|
||||
debian/tmp/lib/systemd/system/nut-monitor.service
|
||||
debian/tmp/lib/systemd/system/ups-monitor.service
|
||||
debian/tmp/sbin/upsmon
|
||||
debian/tmp/sbin/upssched
|
||||
debian/tmp/usr/share/apport/package-hooks/source_nut-client.py
|
||||
debian/tmp/usr/share/augeas/lenses/nuthostsconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/nutnutconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/nutupsconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/nutupsdconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/nutupsdusers.aug
|
||||
debian/tmp/usr/share/augeas/lenses/nutupsmonconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/nutupsschedconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/nutupssetconf.aug
|
||||
debian/tmp/usr/share/augeas/lenses/tests/test_nut.aug
|
||||
debian/tmp/usr/share/bash-completion/completions/nut
|
||||
|
|
1
debian/nut-client.lintian-overrides
vendored
1
debian/nut-client.lintian-overrides
vendored
|
@ -1,2 +1 @@
|
|||
nut-client: script-in-etc-init.d-not-registered-via-update-rc.d
|
||||
nut-client: systemd-no-service-for-init-script ups-monitor
|
||||
|
|
9
debian/nut-client.manpages
vendored
9
debian/nut-client.manpages
vendored
|
@ -1,9 +0,0 @@
|
|||
debian/tmp/usr/share/man/man8/upsc.8
|
||||
debian/tmp/usr/share/man/man8/upscmd.8
|
||||
debian/tmp/usr/share/man/man8/upsmon.8
|
||||
debian/tmp/usr/share/man/man8/upsrw.8
|
||||
debian/tmp/usr/share/man/man8/upssched.8
|
||||
debian/tmp/usr/share/man/man5/nut.conf.5
|
||||
debian/tmp/usr/share/man/man5/upsmon.conf.5
|
||||
debian/tmp/usr/share/man/man5/upssched.conf.5
|
||||
debian/tmp/usr/share/man/man8/upslog.8
|
34
debian/nut-client.postinst
vendored
34
debian/nut-client.postinst
vendored
|
@ -43,38 +43,20 @@ case "$1" in
|
|||
done
|
||||
fi
|
||||
|
||||
# make sure that /var/run/nut exists and has the correct ownerships
|
||||
if [ ! -d /var/run/nut ] ; then
|
||||
mkdir -p /var/run/nut
|
||||
# make sure that /run/nut exists and has the correct ownerships
|
||||
if [ ! -d /run/nut ] ; then
|
||||
mkdir -p /run/nut
|
||||
fi
|
||||
if [ -d /var/run/nut ] ; then
|
||||
chown root:nut /var/run/nut
|
||||
chmod 770 /var/run/nut
|
||||
if [ -d /run/nut ] ; then
|
||||
chown root:nut /run/nut
|
||||
chmod 770 /run/nut
|
||||
if which restorecon >/dev/null 2>&1; then
|
||||
restorecon /var/run/nut
|
||||
restorecon /run/nut
|
||||
fi
|
||||
fi
|
||||
|
||||
if dpkg --compare-versions "$2" le "2.6.4-2~" &&
|
||||
[ -f /etc/init.d/nut ] ; then
|
||||
if [ "`md5sum /etc/init.d/nut | cut -d ' ' -f 1`" = 72f1dbc6b92cb4407f26605d05b12681 ]; then
|
||||
rm -f /etc/init.d/nut
|
||||
else
|
||||
mv /etc/init.d/nut /etc/init.d/nut.dpkg-old
|
||||
fi
|
||||
update-rc.d nut remove >/dev/null
|
||||
fi
|
||||
;;
|
||||
|
||||
abort-upgrade)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
abort-remove)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
abort-deconfigure)
|
||||
abort-upgrade|abort-remove|abort-deconfigure)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
|
|
20
debian/nut-client.postrm
vendored
Normal file
20
debian/nut-client.postrm
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
case "$1" in
|
||||
remove)
|
||||
[ -d /run/nut ] && rmdir --ignore-fail-on-non-empty /run/nut >/dev/null 2>&1
|
||||
;;
|
||||
purge|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "postrm called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue