Compare commits
304 commits
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 | ||
|
237be91ad9 | ||
|
b0b61548a4 | ||
|
1a30e36c57 | ||
|
38537675ba | ||
|
79b4afb095 | ||
|
b762a3580e | ||
|
e948707093 | ||
|
85836f6836 | ||
|
f07d79cd65 | ||
|
f5439265c8 | ||
|
cf7db8a9f1 | ||
|
c2a1ac8f1f | ||
|
7ca12c8e25 | ||
|
a980444360 | ||
|
564becd819 | ||
|
5dc71af109 | ||
|
64e656ba48 | ||
|
47e0e45e35 | ||
|
f8cfca1b18 | ||
|
1563b485dc | ||
|
241119d464 | ||
|
fedf671e4d | ||
|
f07df515f5 | ||
|
819cab0654 | ||
|
c57ad7e897 | ||
|
165791ea2a | ||
|
d504d61101 | ||
|
1e664224b2 | ||
|
f26715942d | ||
|
8bd57e3e01 | ||
|
d551399f97 | ||
|
6621b7de39 | ||
|
c94a1d80c6 | ||
|
a766575eca | ||
|
d0947d03cc | ||
|
8a985c46f3 | ||
|
106ff01fcf | ||
|
032745e879 | ||
|
9b564eb7df | ||
|
e02d926691 | ||
|
bbd9f7852b | ||
|
c68443d795 | ||
|
bd7c860a72 | ||
|
cbf85f6779 | ||
|
0389780de8 | ||
|
a62d95150d | ||
|
8e8886fd95 | ||
|
3bac34e788 | ||
|
74efce57eb | ||
|
0469bcf177 | ||
|
1b8376079e | ||
|
9b4acffd6c | ||
|
8157c709a1 | ||
|
4c61ee613e | ||
|
154f28c325 | ||
|
fd9b4809ec | ||
|
38742dde53 | ||
|
a60005575f | ||
|
65234e6c7b | ||
|
476bccbdb3 | ||
|
f313323738 | ||
|
cc689212ad | ||
|
c51fe5965a | ||
|
d5939980c1 | ||
|
fc374550b2 | ||
|
8e1c6bce0d | ||
|
623a7f2f69 | ||
|
e8e497bcf4 | ||
|
2f87baa5a4 | ||
|
11b7980da6 | ||
|
47044fe3b0 | ||
|
853f3503ce | ||
|
715368e54f | ||
|
d54dd54840 | ||
|
68adcbdb65 | ||
|
caf09b3d58 | ||
|
a80da4998d | ||
|
c79bcd71af | ||
|
5b99c93354 | ||
|
3f5ae0e4fb | ||
|
2904bfac3c | ||
|
b8b31887a5 | ||
|
7903ed56c2 | ||
|
4730afcab2 | ||
|
b5e16725fa | ||
|
ce071bf6d9 | ||
|
4c70406ad9 | ||
|
0d1e4a2dcc | ||
|
8141cb7297 | ||
|
e25bc18d96 | ||
|
d518f66985 | ||
|
d634a9971d | ||
|
37fc917325 | ||
|
b13692c4ba | ||
|
fa2376d331 | ||
|
a7e6c2affc | ||
|
6c85678343 | ||
|
5d4e219ae8 | ||
|
04703f7239 | ||
|
0429bb5294 | ||
|
a6634bc58e | ||
|
1cd02baa2d | ||
|
dbeaea56b0 | ||
|
a9f5fa9b6f | ||
|
51c7f9422f | ||
|
f50e269016 | ||
|
357d77d1f2 | ||
|
82fda8eb40 | ||
|
ca0de194e2 | ||
|
39a7ae33fb | ||
|
112d9a7c99 | ||
|
848fe6dc74 | ||
|
e16f76b337 | ||
|
8b4a877ae9 | ||
|
a97c472533 | ||
|
f4447a2e78 | ||
|
19bb945c64 | ||
|
dafbfe8075 | ||
|
1aa25b671d | ||
|
926c972a29 | ||
|
ba62773351 | ||
|
40fd3ef098 | ||
|
0d4527e4ff | ||
|
bd91941eb2 | ||
|
39af1601d0 | ||
|
968d86eb02 | ||
|
e69a4460bb | ||
|
e75060ac30 | ||
|
18de36389b | ||
|
56b9da25f1 | ||
|
eb01d7e338 | ||
|
6be08da846 | ||
|
9d7ae928f5 | ||
|
2ffa6bd479 | ||
|
1e45c0d270 | ||
|
dfa7599f33 | ||
|
63f12aa09f | ||
|
14ffb4d76b | ||
|
46c56a3a13 | ||
|
ad6a04226d | ||
|
910934027d | ||
|
1106c880a1 | ||
|
85d2d1a10a | ||
|
1b2269cf22 | ||
|
7424f22810 | ||
|
0acf1f781a | ||
|
ba4d85c19c | ||
|
3059d08dfd | ||
|
8cc62ab670 | ||
|
b98ff51068 | ||
|
21f8749a47 | ||
|
9f5431316b | ||
|
06a2c09071 | ||
|
3323ee6303 | ||
|
facb367831 | ||
|
8aa07bb6f9 | ||
|
92977d203d | ||
|
db7ab48e75 | ||
|
a876e1ab6d | ||
|
6e28b57f51 | ||
|
9584e8dd52 | ||
|
405017598b | ||
|
6d0c7e7b30 | ||
|
4d1040666f | ||
|
eed8994e1e | ||
|
89058c95d8 | ||
|
0e20f2aa14 | ||
|
7bcbb63286 | ||
|
4670a72fca | ||
|
c3894a1752 | ||
|
c38582d5c2 | ||
|
a180d2ab55 | ||
|
7320befdae | ||
|
5b1840b8ff | ||
|
996a34e6b6 | ||
|
44b38c4ff6 | ||
|
0b9baae4e9 | ||
|
45abd239cf | ||
|
9675a8feb9 | ||
|
582ac2bbfd | ||
|
9a6e44c40b | ||
|
58a98cfddc | ||
|
00b3b334a9 | ||
|
fbab08eae5 | ||
|
2f40c02cd5 | ||
|
d71a946e56 | ||
|
f3d62f1302 | ||
|
5bc443a878 | ||
|
69151f849c | ||
|
31a319d731 |
917 changed files with 144755 additions and 30018 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: {}
|
316
INSTALL
316
INSTALL
|
@ -1,8 +1,8 @@
|
||||||
Installation Instructions
|
Installation Instructions
|
||||||
*************************
|
*************************
|
||||||
|
|
||||||
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
|
Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
|
||||||
Inc.
|
Foundation, Inc.
|
||||||
|
|
||||||
Copying and distribution of this file, with or without modification,
|
Copying and distribution of this file, with or without modification,
|
||||||
are permitted in any medium without royalty provided the copyright
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
@ -12,97 +12,96 @@ without warranty of any kind.
|
||||||
Basic Installation
|
Basic Installation
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Briefly, the shell command `./configure && make && make install'
|
Briefly, the shell command './configure && make && make install'
|
||||||
should configure, build, and install this package. The following
|
should configure, build, and install this package. The following
|
||||||
more-detailed instructions are generic; see the `README' file for
|
more-detailed instructions are generic; see the 'README' file for
|
||||||
instructions specific to this package. Some packages provide this
|
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
|
below. The lack of an optional feature in a given package is not
|
||||||
necessarily a bug. More recommendations for GNU packages can be found
|
necessarily a bug. More recommendations for GNU packages can be found
|
||||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
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
|
various system-dependent variables used during compilation. It uses
|
||||||
those values to create a `Makefile' in each directory of the package.
|
those values to create a 'Makefile' in each directory of the package.
|
||||||
It may also create one or more `.h' files containing system-dependent
|
It may also create one or more '.h' files containing system-dependent
|
||||||
definitions. Finally, it creates a shell script `config.status' that
|
definitions. Finally, it creates a shell script 'config.status' that
|
||||||
you can run in the future to recreate the current configuration, and a
|
you can run in the future to recreate the current configuration, and a
|
||||||
file `config.log' containing compiler output (useful mainly for
|
file 'config.log' containing compiler output (useful mainly for
|
||||||
debugging `configure').
|
debugging 'configure').
|
||||||
|
|
||||||
It can also use an optional file (typically called `config.cache'
|
It can also use an optional file (typically called 'config.cache' and
|
||||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
enabled with '--cache-file=config.cache' or simply '-C') that saves the
|
||||||
the results of its tests to speed up reconfiguring. Caching is
|
results of its tests to speed up reconfiguring. Caching is disabled by
|
||||||
disabled by default to prevent problems with accidental use of stale
|
default to prevent problems with accidental use of stale cache files.
|
||||||
cache files.
|
|
||||||
|
|
||||||
If you need to do unusual things to compile the package, please try
|
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
|
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
|
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
|
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.
|
may remove or edit it.
|
||||||
|
|
||||||
The file `configure.ac' (or `configure.in') is used to create
|
The file 'configure.ac' (or 'configure.in') is used to create
|
||||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
'configure' by a program called 'autoconf'. You need 'configure.ac' if
|
||||||
you want to change it or regenerate `configure' using a newer version
|
you want to change it or regenerate 'configure' using a newer version of
|
||||||
of `autoconf'.
|
'autoconf'.
|
||||||
|
|
||||||
The simplest way to compile this package is:
|
The simplest way to compile this package is:
|
||||||
|
|
||||||
1. `cd' to the directory containing the package's source code and type
|
1. 'cd' to the directory containing the package's source code and type
|
||||||
`./configure' to configure the package for your system.
|
'./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.
|
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.
|
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
|
documentation. When installing into a prefix owned by root, it is
|
||||||
recommended that the package be configured and built as a regular
|
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.
|
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 time using the binaries in their final installed location.
|
||||||
This target does not install anything. Running this target as a
|
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
|
root privileges, verifies that the installation completed
|
||||||
correctly.
|
correctly.
|
||||||
|
|
||||||
6. You can remove the program binaries and object files from the
|
6. You can remove the program binaries and object files from the
|
||||||
source code directory by typing `make clean'. To also remove the
|
source code directory by typing 'make clean'. To also remove the
|
||||||
files that `configure' created (so you can compile the package for
|
files that 'configure' created (so you can compile the package for
|
||||||
a different kind of computer), type `make distclean'. There is
|
a different kind of computer), type 'make distclean'. There is
|
||||||
also a `make maintainer-clean' target, but that is intended mainly
|
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
|
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
|
all sorts of other programs in order to regenerate files that came
|
||||||
with the distribution.
|
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
|
files again. In practice, not all packages have tested that
|
||||||
uninstallation works correctly, even though it is required by the
|
uninstallation works correctly, even though it is required by the
|
||||||
GNU Coding Standards.
|
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
|
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.
|
This target is generally not run by end users.
|
||||||
|
|
||||||
Compilers and Options
|
Compilers and Options
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
Some systems require unusual options for compilation or linking that
|
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.
|
for details on some of the pertinent environment variables.
|
||||||
|
|
||||||
You can give `configure' initial values for configuration parameters
|
You can give 'configure' initial values for configuration parameters
|
||||||
by setting variables in the command line or in the environment. Here
|
by setting variables in the command line or in the environment. Here is
|
||||||
is an example:
|
an example:
|
||||||
|
|
||||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
./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
|
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
|
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
|
directory where you want the object files and executables to go and run
|
||||||
the `configure' script. `configure' automatically checks for the
|
the 'configure' script. 'configure' automatically checks for the source
|
||||||
source code in the directory that `configure' is in and in `..'. This
|
code in the directory that 'configure' is in and in '..'. This is known
|
||||||
is known as a "VPATH" build.
|
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
|
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.
|
reconfiguring for another architecture.
|
||||||
|
|
||||||
On MacOS X 10.5 and later systems, you can create libraries and
|
On MacOS X 10.5 and later systems, you can create libraries and
|
||||||
executables that work on multiple system types--known as "fat" or
|
executables that work on multiple system types--known as "fat" or
|
||||||
"universal" binaries--by specifying multiple `-arch' options to the
|
"universal" binaries--by specifying multiple '-arch' options to the
|
||||||
compiler but only a single `-arch' option to the preprocessor. Like
|
compiler but only a single '-arch' option to the preprocessor. Like
|
||||||
this:
|
this:
|
||||||
|
|
||||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
./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
|
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
|
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
|
Installation Names
|
||||||
==================
|
==================
|
||||||
|
|
||||||
By default, `make install' installs the package's commands under
|
By default, 'make install' installs the package's commands under
|
||||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
'/usr/local/bin', include files under '/usr/local/include', etc. You
|
||||||
can specify an installation prefix other than `/usr/local' by giving
|
can specify an installation prefix other than '/usr/local' by giving
|
||||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
'configure' the option '--prefix=PREFIX', where PREFIX must be an
|
||||||
absolute file name.
|
absolute file name.
|
||||||
|
|
||||||
You can specify separate installation prefixes for
|
You can specify separate installation prefixes for
|
||||||
architecture-specific files and architecture-independent files. If you
|
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.
|
PREFIX as the prefix for installing programs and libraries.
|
||||||
Documentation and other data files still use the regular prefix.
|
Documentation and other data files still use the regular prefix.
|
||||||
|
|
||||||
In addition, if you use an unusual directory layout you can give
|
In addition, if you use an unusual directory layout you can give
|
||||||
options like `--bindir=DIR' to specify different values for particular
|
options like '--bindir=DIR' to specify different values for particular
|
||||||
kinds of files. Run `configure --help' for a list of the directories
|
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
|
you can set and what kinds of files go in them. In general, the default
|
||||||
default for these options is expressed in terms of `${prefix}', so that
|
for these options is expressed in terms of '${prefix}', so that
|
||||||
specifying just `--prefix' will affect all of the other directory
|
specifying just '--prefix' will affect all of the other directory
|
||||||
specifications that were not explicitly provided.
|
specifications that were not explicitly provided.
|
||||||
|
|
||||||
The most portable way to affect installation locations is to pass the
|
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
|
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.
|
having to reconfigure or recompile.
|
||||||
|
|
||||||
The first method involves providing an override variable for each
|
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
|
prefix=/alternate/directory' will choose an alternate location for all
|
||||||
directory configuration variables that were expressed in terms of
|
directory configuration variables that were expressed in terms of
|
||||||
`${prefix}'. Any directories that were specified during `configure',
|
'${prefix}'. Any directories that were specified during 'configure',
|
||||||
but not in terms of `${prefix}', must each be overridden at install
|
but not in terms of '${prefix}', must each be overridden at install time
|
||||||
time for the entire installation to be relocated. The approach of
|
for the entire installation to be relocated. The approach of makefile
|
||||||
makefile variable overrides for each directory variable is required by
|
variable overrides for each directory variable is required by the GNU
|
||||||
the GNU Coding Standards, and ideally causes no recompilation.
|
Coding Standards, and ideally causes no recompilation. However, some
|
||||||
However, some platforms have known limitations with the semantics of
|
platforms have known limitations with the semantics of shared libraries
|
||||||
shared libraries that end up requiring recompilation when using this
|
that end up requiring recompilation when using this method, particularly
|
||||||
method, particularly noticeable in packages that use GNU Libtool.
|
noticeable in packages that use GNU Libtool.
|
||||||
|
|
||||||
The second method involves providing the `DESTDIR' variable. For
|
The second method involves providing the 'DESTDIR' variable. For
|
||||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
example, 'make install DESTDIR=/alternate/directory' will prepend
|
||||||
`/alternate/directory' before all installation names. The approach of
|
'/alternate/directory' before all installation names. The approach of
|
||||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
'DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||||
does not work on platforms that have drive letters. On the other hand,
|
does not work on platforms that have drive letters. On the other hand,
|
||||||
it does better at avoiding recompilation issues, and works well even
|
it does better at avoiding recompilation issues, and works well even
|
||||||
when some directory options were not specified in terms of `${prefix}'
|
when some directory options were not specified in terms of '${prefix}'
|
||||||
at `configure' time.
|
at 'configure' time.
|
||||||
|
|
||||||
Optional Features
|
Optional Features
|
||||||
=================
|
=================
|
||||||
|
|
||||||
If the package supports it, you can cause programs to be installed
|
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
|
with an extra prefix or suffix on their names by giving 'configure' the
|
||||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
|
||||||
|
|
||||||
Some packages pay attention to `--enable-FEATURE' options to
|
Some packages pay attention to '--enable-FEATURE' options to
|
||||||
`configure', where FEATURE indicates an optional part of the package.
|
'configure', where FEATURE indicates an optional part of the package.
|
||||||
They may also pay attention to `--with-PACKAGE' options, where 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
|
is something like 'gnu-as' or 'x' (for the X Window System). The
|
||||||
`README' should mention any `--enable-' and `--with-' options that the
|
'README' should mention any '--enable-' and '--with-' options that the
|
||||||
package recognizes.
|
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,
|
find the X include and library files automatically, but if it doesn't,
|
||||||
you can use the `configure' options `--x-includes=DIR' and
|
you can use the 'configure' options '--x-includes=DIR' and
|
||||||
`--x-libraries=DIR' to specify their locations.
|
'--x-libraries=DIR' to specify their locations.
|
||||||
|
|
||||||
Some packages offer the ability to configure how verbose the
|
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
|
--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
|
--disable-silent-rules' sets the default to verbose, which can be
|
||||||
overridden with `make V=0'.
|
overridden with 'make V=0'.
|
||||||
|
|
||||||
Particular systems
|
Particular systems
|
||||||
==================
|
==================
|
||||||
|
|
||||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC
|
||||||
CC is not installed, it is recommended to use the following options in
|
is not installed, it is recommended to use the following options in
|
||||||
order to use an ANSI C compiler:
|
order to use an ANSI C compiler:
|
||||||
|
|
||||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||||
|
|
||||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
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
|
HP-UX 'make' updates targets which have the same time stamps as their
|
||||||
their prerequisites, which makes it generally unusable when shipped
|
prerequisites, which makes it generally unusable when shipped generated
|
||||||
generated files such as `configure' are involved. Use GNU `make'
|
files such as 'configure' are involved. Use GNU 'make' instead.
|
||||||
instead.
|
|
||||||
|
|
||||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
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
|
parse its '<wchar.h>' header file. The option '-nodtk' can be used as a
|
||||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
workaround. If GNU CC is not installed, it is therefore recommended to
|
||||||
to try
|
try
|
||||||
|
|
||||||
./configure CC="cc"
|
./configure CC="cc"
|
||||||
|
|
||||||
|
@ -242,26 +240,26 @@ and if that doesn't work, try
|
||||||
|
|
||||||
./configure CC="cc -nodtk"
|
./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
|
directory contains several dysfunctional programs; working variants of
|
||||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
these programs are available in '/usr/bin'. So, if you need '/usr/ucb'
|
||||||
in your `PATH', put it _after_ `/usr/bin'.
|
in your 'PATH', put it _after_ '/usr/bin'.
|
||||||
|
|
||||||
On Haiku, software installed for all users goes in `/boot/common',
|
On Haiku, software installed for all users goes in '/boot/common',
|
||||||
not `/usr/local'. It is recommended to use the following options:
|
not '/usr/local'. It is recommended to use the following options:
|
||||||
|
|
||||||
./configure --prefix=/boot/common
|
./configure --prefix=/boot/common
|
||||||
|
|
||||||
Specifying the System Type
|
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
|
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
|
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
|
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
|
'--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:
|
type, such as 'sun4', or a canonical name which has the form:
|
||||||
|
|
||||||
CPU-COMPANY-SYSTEM
|
CPU-COMPANY-SYSTEM
|
||||||
|
|
||||||
|
@ -270,101 +268,101 @@ where SYSTEM can have one of these forms:
|
||||||
OS
|
OS
|
||||||
KERNEL-OS
|
KERNEL-OS
|
||||||
|
|
||||||
See the file `config.sub' for the possible values of each field. If
|
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
|
'config.sub' isn't included in this package, then this package doesn't
|
||||||
need to know the machine type.
|
need to know the machine type.
|
||||||
|
|
||||||
If you are _building_ compiler tools for cross-compiling, you should
|
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.
|
produce code for.
|
||||||
|
|
||||||
If you want to _use_ a cross compiler, that generates code for a
|
If you want to _use_ a cross compiler, that generates code for a
|
||||||
platform different from the build platform, you should specify the
|
platform different from the build platform, you should specify the
|
||||||
"host" platform (i.e., that on which the generated programs will
|
"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
|
Sharing Defaults
|
||||||
================
|
================
|
||||||
|
|
||||||
If you want to set default values for `configure' scripts to share,
|
If you want to set default values for 'configure' scripts to share,
|
||||||
you can create a site shell script called `config.site' that gives
|
you can create a site shell script called 'config.site' that gives
|
||||||
default values for variables like `CC', `cache_file', and `prefix'.
|
default values for variables like 'CC', 'cache_file', and 'prefix'.
|
||||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
'configure' looks for 'PREFIX/share/config.site' if it exists, then
|
||||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
'PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||||
`CONFIG_SITE' environment variable to the location of the site script.
|
'CONFIG_SITE' environment variable to the location of the site script.
|
||||||
A warning: not all `configure' scripts look for a site script.
|
A warning: not all 'configure' scripts look for a site script.
|
||||||
|
|
||||||
Defining Variables
|
Defining Variables
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Variables not defined in a site shell script can be set in the
|
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
|
configure again during the build, and the customized values of these
|
||||||
variables may be lost. In order to avoid this problem, you should set
|
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
|
./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).
|
overridden in the site shell script).
|
||||||
|
|
||||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
|
||||||
an Autoconf limitation. Until the limitation is lifted, you can use
|
Autoconf limitation. Until the limitation is lifted, you can use this
|
||||||
this workaround:
|
workaround:
|
||||||
|
|
||||||
CONFIG_SHELL=/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.
|
operates.
|
||||||
|
|
||||||
`--help'
|
'--help'
|
||||||
`-h'
|
'-h'
|
||||||
Print a summary of all of the options to `configure', and exit.
|
Print a summary of all of the options to 'configure', and exit.
|
||||||
|
|
||||||
`--help=short'
|
'--help=short'
|
||||||
`--help=recursive'
|
'--help=recursive'
|
||||||
Print a summary of the options unique to this package's
|
Print a summary of the options unique to this package's
|
||||||
`configure', and exit. The `short' variant lists options used
|
'configure', and exit. The 'short' variant lists options used only
|
||||||
only in the top level, while the `recursive' variant lists options
|
in the top level, while the 'recursive' variant lists options also
|
||||||
also present in any nested packages.
|
present in any nested packages.
|
||||||
|
|
||||||
`--version'
|
'--version'
|
||||||
`-V'
|
'-V'
|
||||||
Print the version of Autoconf used to generate the `configure'
|
Print the version of Autoconf used to generate the 'configure'
|
||||||
script, and exit.
|
script, and exit.
|
||||||
|
|
||||||
`--cache-file=FILE'
|
'--cache-file=FILE'
|
||||||
Enable the cache: use and save the results of the tests in 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.
|
disable caching.
|
||||||
|
|
||||||
`--config-cache'
|
'--config-cache'
|
||||||
`-C'
|
'-C'
|
||||||
Alias for `--cache-file=config.cache'.
|
Alias for '--cache-file=config.cache'.
|
||||||
|
|
||||||
`--quiet'
|
'--quiet'
|
||||||
`--silent'
|
'--silent'
|
||||||
`-q'
|
'-q'
|
||||||
Do not print messages saying which checks are being made. To
|
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).
|
messages will still be shown).
|
||||||
|
|
||||||
`--srcdir=DIR'
|
'--srcdir=DIR'
|
||||||
Look for the package's source code in directory DIR. Usually
|
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'
|
'--prefix=DIR'
|
||||||
Use DIR as the installation prefix. *note Installation Names::
|
Use DIR as the installation prefix. *note Installation Names:: for
|
||||||
for more details, including other options available for fine-tuning
|
more details, including other options available for fine-tuning the
|
||||||
the installation locations.
|
installation locations.
|
||||||
|
|
||||||
`--no-create'
|
'--no-create'
|
||||||
`-n'
|
'-n'
|
||||||
Run the configure checks, but stop before creating any output
|
Run the configure checks, but stop before creating any output
|
||||||
files.
|
files.
|
||||||
|
|
||||||
`configure' also accepts some other, not widely useful, options. Run
|
'configure' also accepts some other, not widely useful, options. Run
|
||||||
`configure --help' for more details.
|
'configure --help' for more details.
|
||||||
|
|
63
INSTALL.nut
63
INSTALL.nut
|
@ -1,11 +1,13 @@
|
||||||
Installation instructions
|
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>>.
|
Whenever it is possible, prefer <<Installing_packages, installing from packages>>.
|
||||||
Packagers have done an excellent and hard work at improving NUT integration into
|
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_source]]
|
||||||
Installing from 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
|
The NUT linkdoc:packager-guide[Packager Guide], which presents the best
|
||||||
practices for installing and integrating NUT, is also a good reading.
|
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]
|
[NOTE]
|
||||||
.Keep in mind that...
|
.Keep in mind that...
|
||||||
================================================================================
|
================================================================================
|
||||||
|
@ -52,7 +61,7 @@ long as you are consistent.
|
||||||
The process for doing this varies from one system to the next, and
|
The process for doing this varies from one system to the next, and
|
||||||
explaining how to add users is beyond the scope of this document.
|
explaining how to add users is beyond the scope of this document.
|
||||||
|
|
||||||
For the purposes of this document, the user name and group name
|
For the purposes of this document, the user name and group name
|
||||||
will be 'ups' and 'nut' respectively.
|
will be 'ups' and 'nut' respectively.
|
||||||
|
|
||||||
Be sure the new user is a member of the new group! If you forget to
|
Be sure the new user is a member of the new group! If you forget to
|
||||||
|
@ -87,7 +96,7 @@ docs/configure.txt or './configure --help' for all the available
|
||||||
options.
|
options.
|
||||||
|
|
||||||
If you alter paths with additional switches, be sure to use those
|
If you alter paths with additional switches, be sure to use those
|
||||||
new paths while reading the rest of the steps.
|
new paths while reading the rest of the steps.
|
||||||
|
|
||||||
Reference: <<Configure_options,Configure options>> from the
|
Reference: <<Configure_options,Configure options>> from the
|
||||||
User Manual.
|
User Manual.
|
||||||
|
@ -100,7 +109,7 @@ Build the programs
|
||||||
|
|
||||||
This will build the NUT client and server programs and the
|
This will build the NUT client and server programs and the
|
||||||
selected drivers. It will also build any other features that were
|
selected drivers. It will also build any other features that were
|
||||||
selected during <<Configuration,configuration>> step above.
|
selected during <<Configuration,configuration>> step above.
|
||||||
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
|
@ -175,7 +184,7 @@ permissions for the USB device, you may need to set up (operating
|
||||||
system dependent) hotplugging scripts. Sample scripts and
|
system dependent) hotplugging scripts. Sample scripts and
|
||||||
information are provided in the scripts/hotplug and
|
information are provided in the scripts/hotplug and
|
||||||
scripts/udev directories. For most users, the hotplugging scripts
|
scripts/udev directories. For most users, the hotplugging scripts
|
||||||
will be installed automatically by "make install".
|
will be installed automatically by "make install".
|
||||||
|
|
||||||
(If you want to try if a driver works without setting up
|
(If you want to try if a driver works without setting up
|
||||||
hotplugging, you can add the "-u root" option to upsd, upsmon, and
|
hotplugging, you can add the "-u root" option to upsd, upsmon, and
|
||||||
|
@ -292,25 +301,47 @@ You can either install NUT as a binary package or as a port.
|
||||||
Binary package
|
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
|
Port
|
||||||
^^^^
|
^^^^
|
||||||
|
|
||||||
The port is located under /usr/ports/sysutils/nut.
|
The port is located under +sysutils/nut+.
|
||||||
To install it, use the following command:
|
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
|
||||||
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Optionally, 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,
|
# service devd restart
|
||||||
- sysutils/nut-usb, for the USB drivers,
|
|
||||||
- sysutils/nut-libupsclient, for the upsclient library.
|
(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.
|
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
|
P: Arnaud Quette
|
||||||
M: aquette.dev@gmail.com
|
M: aquette.dev@gmail.com
|
||||||
M: ArnaudQuette@eaton.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, ...
|
mge-utalk, snmp-ups, ...
|
||||||
|
|
||||||
P: Fabio Di Niro
|
P: Fabio Di Niro
|
||||||
|
|
267
Makefile.am
267
Makefile.am
|
@ -5,23 +5,33 @@ ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
# subdirectories to build and distribute. The order matters, as
|
# subdirectories to build and distribute. The order matters, as
|
||||||
# several subdirectories depend on stuff in "common" or tools being built first
|
# 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
|
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.
|
# COPYING is included automatically.
|
||||||
EXTRA_DIST = INSTALL.nut LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING
|
EXTRA_DIST = INSTALL.nut LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# flags to pass to ./configure when calling "make distcheck" and "make
|
# flags to pass to ./configure when calling "make distcheck" and "make
|
||||||
# distcheck-light". Try to check as many features as possible! Also
|
# distcheck-light". Try to check as many features as possible! Also
|
||||||
# need to give hotplug-dir and udev-dir, so that staged install does
|
# need to give augeas-lenses-dir, hotplug-dir and udev-dir, so that
|
||||||
# not fail.
|
# staged install does not fail.
|
||||||
|
|
||||||
DISTCHECK_FLAGS = --with-all --with-ssl --with-doc=auto
|
DISTCHECK_FLAGS = --with-all --with-ssl --with-doc=auto
|
||||||
DISTCHECK_LIGHT_FLAGS = --with-all=auto --with-ssl=auto --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} \
|
DISTCHECK_CONFIGURE_FLAGS = ${DISTCHECK_FLAGS} \
|
||||||
--with-systemdsystemunitdir='$${prefix}/lib/systemd/system' \
|
--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-hotplug-dir='$${prefix}/etc/hotplug' \
|
||||||
--with-udev-dir='$${prefix}/etc/udev' \
|
--with-udev-dir='$${prefix}/etc/udev' \
|
||||||
--with-devd-dir='$${prefix}/etc/devd'
|
--with-devd-dir='$${prefix}/etc/devd'
|
||||||
|
@ -29,6 +39,10 @@ DISTCHECK_CONFIGURE_FLAGS = ${DISTCHECK_FLAGS} \
|
||||||
distcheck-light:
|
distcheck-light:
|
||||||
$(MAKE) $(AM_MAKEFLAGS) DISTCHECK_FLAGS="$(DISTCHECK_LIGHT_FLAGS)" distcheck
|
$(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
|
# workaround the dist generated files that are also part of the distribution
|
||||||
# Note that distcleancheck is disabled for now, while waiting for a proper
|
# Note that distcleancheck is disabled for now, while waiting for a proper
|
||||||
# solution, that do not break older unix systems
|
# solution, that do not break older unix systems
|
||||||
|
@ -37,9 +51,150 @@ distcheck-light:
|
||||||
distcleancheck:
|
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:
|
# Automatically generate the ChangeLog from Git logs:
|
||||||
MAINTAINERCLEAN_FILES = ChangeLog
|
MAINTAINERCLEANFILES += ChangeLog
|
||||||
|
|
||||||
# Older boundary of the ChangeLog commits range
|
# Older boundary of the ChangeLog commits range
|
||||||
# It can be a tag ('v2.2.0'), a commit hash, a date, ...
|
# It can be a tag ('v2.2.0'), a commit hash, a date, ...
|
||||||
|
@ -48,18 +203,30 @@ GITLOG_START_POINT=v2.6.0
|
||||||
|
|
||||||
# Force ChangeLog regeneration upon make dist (due to nonexistant 'dummy-stamp'),
|
# Force ChangeLog regeneration upon make dist (due to nonexistant 'dummy-stamp'),
|
||||||
# in case it has already been generated previously
|
# in case it has already been generated previously
|
||||||
|
# Note that the script is hard-coded to generate "ChangeLog" in the current dir
|
||||||
dummy-stamp:
|
dummy-stamp:
|
||||||
ChangeLog: tools/gitlog2changelog.py dummy-stamp
|
ChangeLog: tools/gitlog2changelog.py dummy-stamp
|
||||||
$(top_srcdir)/tools/gitlog2changelog.py $(GITLOG_START_POINT) || \
|
cd $(top_builddir) && \
|
||||||
echo "gitlog2changelog.py failed to generate the ChangeLog. See https://github.com/networkupstools/nut/commits/master" > $@
|
./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
|
# 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
|
rm -f nut-@PACKAGE_VERSION@.tar.gz.sig
|
||||||
gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz
|
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
|
md5sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.md5
|
||||||
sha256sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.sha256
|
sha256sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.sha256
|
||||||
|
|
||||||
|
@ -101,7 +268,7 @@ install-dirs:
|
||||||
@echo "Warning: 'make install-dirs' is deprecated."
|
@echo "Warning: 'make install-dirs' is deprecated."
|
||||||
@echo "Use 'make installdirs' instead."
|
@echo "Use 'make installdirs' instead."
|
||||||
@echo $(WARN)
|
@echo $(WARN)
|
||||||
make installdirs
|
$(MAKE) installdirs
|
||||||
cgi build-cgi install-cgi install-cgi-dir install-cgi-bin \
|
cgi build-cgi install-cgi install-cgi-dir install-cgi-bin \
|
||||||
install-cgi-man install-cgi-conf install-cgi-html:
|
install-cgi-man install-cgi-conf install-cgi-html:
|
||||||
@echo "Error: 'make $@' no longer exists."
|
@echo "Error: 'make $@' no longer exists."
|
||||||
|
@ -117,23 +284,65 @@ snmp build-snmp install-snmp install-snmp-mgr install-snmp-man:
|
||||||
@echo "Use './configure --with-snmp' instead."
|
@echo "Use './configure --with-snmp' instead."
|
||||||
setver:
|
setver:
|
||||||
@echo "Error: 'make setver' no longer exists."
|
@echo "Error: 'make setver' no longer exists."
|
||||||
@echo "Edit configure.in to set version number."
|
@echo "Edit configure.ac to set version number."
|
||||||
package:
|
|
||||||
if test `uname -s` = "HP-UX"; then \
|
# Clean the dist tarball and packages
|
||||||
cd scripts/HP-UX; \
|
MAINTAINERCLEANFILES_DISTBALL = nut-*.tar.gz
|
||||||
make package; \
|
# HP-UX:
|
||||||
mv NUT_HPUX_package.depot NUT_HPUX_package@PACKAGE_VERSION@.depot; \
|
MAINTAINERCLEANFILES_PACKAGES = NUT_HPUX_package@PACKAGE_VERSION@.depot
|
||||||
elif test `uname -s` = "SunOS"; then \
|
# AIX as below, and RedHat-compatible (cover binary and source packages):
|
||||||
make; \
|
MAINTAINERCLEANFILES_PACKAGES += nut*rpm
|
||||||
rm -rf @prefix@; \
|
# Debian-compatible (cover binary and source packages):
|
||||||
make install; \
|
MAINTAINERCLEANFILES_PACKAGES += nut*deb
|
||||||
cd scripts/Solaris; \
|
# Solaris SVR4 package archives:
|
||||||
make package; \
|
MAINTAINERCLEANFILES_PACKAGES += NUT_solaris_*_package@PACKAGE_VERSION@.local.gz
|
||||||
make uninstall; \
|
# Newer Solaris IPS (aka "pkg(5)" format archives)
|
||||||
rm -rf @prefix@; \
|
MAINTAINERCLEANFILES_PACKAGES += *.p5p
|
||||||
elif test `uname -s` = "AIX"; then \
|
|
||||||
make dist; \
|
MAINTAINERCLEANFILES += $(MAINTAINERCLEANFILES_DISTBALL)
|
||||||
cp scripts/Aix/nut-aix.spec /usr/src/packages/SPECS; \
|
MAINTAINERCLEANFILES += $(MAINTAINERCLEANFILES_PACKAGES)
|
||||||
cp scripts/Aix/nut.init nut-*.tar.gz /usr/src/packages/SOURCES; \
|
|
||||||
rpm -ba /usr/src/packages/SPECS/nut-aix.spec; \
|
package: dist
|
||||||
fi;
|
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
|
||||||
|
|
427
Makefile.in
427
Makefile.in
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -16,7 +16,17 @@
|
||||||
|
|
||||||
# top-level Makefile for NUT
|
# top-level Makefile for NUT
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
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 = \
|
am__make_running_with_option = \
|
||||||
case $${target_option-} in \
|
case $${target_option-} in \
|
||||||
?) ;; \
|
?) ;; \
|
||||||
|
@ -81,27 +91,24 @@ build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
target_triplet = @target@
|
target_triplet = @target@
|
||||||
subdir = .
|
subdir = .
|
||||||
DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \
|
|
||||||
$(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
|
||||||
$(top_srcdir)/configure $(am__configure_deps) \
|
|
||||||
$(top_srcdir)/scripts/Aix/nut-aix.spec.in \
|
|
||||||
$(top_srcdir)/scripts/avahi/nut.service.in \
|
|
||||||
$(top_srcdir)/scripts/HP-UX/nut.psf.in \
|
|
||||||
$(top_srcdir)/scripts/HP-UX/postinstall.in \
|
|
||||||
$(top_srcdir)/scripts/ufw/nut.ufw.profile.in COPYING TODO \
|
|
||||||
compile config.guess config.sub depcomp install-sh missing \
|
|
||||||
ltmain.sh
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
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/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_asciidoc.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_libavahi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libltdl.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_libneon.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||||
|
@ -110,18 +117,29 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_os.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_report_feature.m4 \
|
||||||
|
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||||
$(top_srcdir)/configure.ac
|
$(top_srcdir)/configure.ac
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
||||||
|
$(am__configure_deps) $(am__DIST_COMMON)
|
||||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
configure.lineno config.status.lineno
|
configure.lineno config.status.lineno
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||||
CONFIG_CLEAN_FILES = scripts/Aix/nut-aix.spec \
|
CONFIG_CLEAN_FILES = scripts/Aix/nut-aix.spec \
|
||||||
scripts/avahi/nut.service scripts/HP-UX/nut.psf \
|
scripts/avahi/nut.service scripts/HP-UX/nut.psf \
|
||||||
scripts/HP-UX/postinstall scripts/ufw/nut.ufw.profile
|
scripts/python/module/PyNUT.py scripts/Aix/nut.init \
|
||||||
|
scripts/HP-UX/postinstall \
|
||||||
|
scripts/python/app/NUT-Monitor-py2gtk2 \
|
||||||
|
scripts/python/app/NUT-Monitor-py3qt5 \
|
||||||
|
scripts/python/module/test_nutclient.py
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
@ -157,7 +175,7 @@ am__recursive_targets = \
|
||||||
$(RECURSIVE_CLEAN_TARGETS) \
|
$(RECURSIVE_CLEAN_TARGETS) \
|
||||||
$(am__extra_recursive_targets)
|
$(am__extra_recursive_targets)
|
||||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||||
cscope distdir dist dist-all distcheck
|
cscope distdir distdir-am dist dist-all distcheck
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
# Read a list of newline-separated strings from the standard input,
|
# Read a list of newline-separated strings from the standard input,
|
||||||
# and print each of them once, without duplicates. Input order is
|
# and print each of them once, without duplicates. Input order is
|
||||||
|
@ -179,6 +197,18 @@ ETAGS = etags
|
||||||
CTAGS = ctags
|
CTAGS = ctags
|
||||||
CSCOPE = cscope
|
CSCOPE = cscope
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
|
am__DIST_COMMON = $(srcdir)/Makefile.in \
|
||||||
|
$(top_srcdir)/scripts/Aix/nut-aix.spec.in \
|
||||||
|
$(top_srcdir)/scripts/Aix/nut.init.in \
|
||||||
|
$(top_srcdir)/scripts/HP-UX/nut.psf.in \
|
||||||
|
$(top_srcdir)/scripts/HP-UX/postinstall.in \
|
||||||
|
$(top_srcdir)/scripts/avahi/nut.service.in \
|
||||||
|
$(top_srcdir)/scripts/python/app/NUT-Monitor-py2gtk2.in \
|
||||||
|
$(top_srcdir)/scripts/python/app/NUT-Monitor-py3qt5.in \
|
||||||
|
$(top_srcdir)/scripts/python/module/PyNUT.py.in \
|
||||||
|
$(top_srcdir)/scripts/python/module/test_nutclient.py.in \
|
||||||
|
AUTHORS COPYING ChangeLog INSTALL NEWS README TODO compile \
|
||||||
|
config.guess config.sub depcomp install-sh ltmain.sh missing
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
distdir = $(PACKAGE)-$(VERSION)
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
top_distdir = $(distdir)
|
top_distdir = $(distdir)
|
||||||
|
@ -217,6 +247,8 @@ am__relativize = \
|
||||||
DIST_ARCHIVES = $(distdir).tar.gz
|
DIST_ARCHIVES = $(distdir).tar.gz
|
||||||
GZIP_ENV = --best
|
GZIP_ENV = --best
|
||||||
DIST_TARGETS = dist-gzip
|
DIST_TARGETS = dist-gzip
|
||||||
|
# Exists only to be overridden by the user if desired.
|
||||||
|
AM_DISTCHECK_DVI_TARGET = dvi
|
||||||
distuninstallcheck_listfiles = find . -type f -print
|
distuninstallcheck_listfiles = find . -type f -print
|
||||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||||
|
@ -228,6 +260,7 @@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
ASCIIDOC = @ASCIIDOC@
|
ASCIIDOC = @ASCIIDOC@
|
||||||
ASPELL = @ASPELL@
|
ASPELL = @ASPELL@
|
||||||
|
AUGPARSE = @AUGPARSE@
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -238,6 +271,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CONFPATH = @CONFPATH@
|
CONFPATH = @CONFPATH@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
|
CPPCHECK = @CPPCHECK@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||||
|
@ -251,6 +285,7 @@ DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
DLLTOOL = @DLLTOOL@
|
DLLTOOL = @DLLTOOL@
|
||||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||||
|
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||||
|
@ -263,6 +298,7 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
@ -280,6 +316,8 @@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||||
|
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||||
|
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||||
|
@ -290,21 +328,32 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||||
|
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
|
|
||||||
|
# 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@
|
||||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||||
|
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
LN_S = @LN_S@
|
LN_S = @LN_S@
|
||||||
|
LN_S_R = @LN_S_R@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
NETLIBS = @NETLIBS@
|
NETLIBS = @NETLIBS@
|
||||||
|
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||||
NM = @NM@
|
NM = @NM@
|
||||||
NMEDIT = @NMEDIT@
|
NMEDIT = @NMEDIT@
|
||||||
|
NUT_DATADIR = @NUT_DATADIR@
|
||||||
|
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||||
NUT_NETVERSION = @NUT_NETVERSION@
|
NUT_NETVERSION = @NUT_NETVERSION@
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -324,6 +373,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
||||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
PORT = @PORT@
|
PORT = @PORT@
|
||||||
|
PYTHON = @PYTHON@
|
||||||
|
PYTHON2 = @PYTHON2@
|
||||||
|
PYTHON3 = @PYTHON3@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||||
RUN_AS_USER = @RUN_AS_USER@
|
RUN_AS_USER = @RUN_AS_USER@
|
||||||
|
@ -337,6 +389,7 @@ STATEPATH = @STATEPATH@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
SUN_LIBUSB = @SUN_LIBUSB@
|
SUN_LIBUSB = @SUN_LIBUSB@
|
||||||
TREE_VERSION = @TREE_VERSION@
|
TREE_VERSION = @TREE_VERSION@
|
||||||
|
VALGRIND = @VALGRIND@
|
||||||
VERSION = @VERSION@
|
VERSION = @VERSION@
|
||||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||||
XMLLINT = @XMLLINT@
|
XMLLINT = @XMLLINT@
|
||||||
|
@ -354,6 +407,7 @@ am__leading_dot = @am__leading_dot@
|
||||||
am__quote = @am__quote@
|
am__quote = @am__quote@
|
||||||
am__tar = @am__tar@
|
am__tar = @am__tar@
|
||||||
am__untar = @am__untar@
|
am__untar = @am__untar@
|
||||||
|
auglensdir = @auglensdir@
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
build = @build@
|
build = @build@
|
||||||
build_alias = @build_alias@
|
build_alias = @build_alias@
|
||||||
|
@ -367,6 +421,9 @@ datarootdir = @datarootdir@
|
||||||
devddir = @devddir@
|
devddir = @devddir@
|
||||||
docdir = @docdir@
|
docdir = @docdir@
|
||||||
driverexecdir = @driverexecdir@
|
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@
|
dvidir = @dvidir@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
host = @host@
|
host = @host@
|
||||||
|
@ -392,12 +449,14 @@ pkgconfigdir = @pkgconfigdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
systemdshutdowndir = @systemdshutdowndir@
|
||||||
systemdsystemunitdir = @systemdsystemunitdir@
|
systemdsystemunitdir = @systemdsystemunitdir@
|
||||||
|
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||||
target = @target@
|
target = @target@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
target_cpu = @target_cpu@
|
target_cpu = @target_cpu@
|
||||||
|
@ -413,7 +472,7 @@ ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
# subdirectories to build and distribute. The order matters, as
|
# subdirectories to build and distribute. The order matters, as
|
||||||
# several subdirectories depend on stuff in "common" or tools being built first
|
# 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
|
lib scripts server tests
|
||||||
|
|
||||||
|
|
||||||
|
@ -423,20 +482,62 @@ EXTRA_DIST = INSTALL.nut LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# flags to pass to ./configure when calling "make distcheck" and "make
|
# flags to pass to ./configure when calling "make distcheck" and "make
|
||||||
# distcheck-light". Try to check as many features as possible! Also
|
# distcheck-light". Try to check as many features as possible! Also
|
||||||
# need to give hotplug-dir and udev-dir, so that staged install does
|
# need to give augeas-lenses-dir, hotplug-dir and udev-dir, so that
|
||||||
# not fail.
|
# staged install does not fail.
|
||||||
DISTCHECK_FLAGS = --with-all --with-ssl --with-doc=auto
|
DISTCHECK_FLAGS = --with-all --with-ssl --with-doc=auto
|
||||||
DISTCHECK_LIGHT_FLAGS = --with-all=auto --with-ssl=auto --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} \
|
DISTCHECK_CONFIGURE_FLAGS = ${DISTCHECK_FLAGS} \
|
||||||
--with-systemdsystemunitdir='$${prefix}/lib/systemd/system' \
|
--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-hotplug-dir='$${prefix}/etc/hotplug' \
|
||||||
--with-udev-dir='$${prefix}/etc/udev' \
|
--with-udev-dir='$${prefix}/etc/udev' \
|
||||||
--with-devd-dir='$${prefix}/etc/devd'
|
--with-devd-dir='$${prefix}/etc/devd'
|
||||||
|
|
||||||
|
|
||||||
|
# Files made by our targets:
|
||||||
|
CLEANFILES = *-spellchecked cppcheck*.xml
|
||||||
|
|
||||||
|
# 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`:
|
||||||
|
#???# configure.ac~
|
||||||
|
DISTCLEANFILES = ChangeLog config.log configure~ 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):
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# Automatically generate the ChangeLog from Git logs:
|
# Automatically generate the ChangeLog from Git logs:
|
||||||
MAINTAINERCLEAN_FILES = ChangeLog
|
MAINTAINERCLEANFILES = INSTALL aclocal.m4 config.guess config.sub \
|
||||||
|
configure depcomp install-sh ltmain.sh test-driver \
|
||||||
|
m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \
|
||||||
|
m4/lt~obsolete.m4 Makefile.in .dirstamp include/config.h.in \
|
||||||
|
ChangeLog $(MAINTAINERCLEANFILES_DISTBALL) \
|
||||||
|
$(MAINTAINERCLEANFILES_PACKAGES)
|
||||||
|
|
||||||
|
# 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).
|
||||||
|
@HAVE_CPPCHECK_TRUE@CPPCHECK_SRC_H = $(top_srcdir)/*/*.h $(top_srcdir)/*/*/*.h
|
||||||
|
# CPPCHECK_SRC_H += $(top_srcdir)/*.h
|
||||||
|
@HAVE_CPPCHECK_TRUE@CPPCHECK_SRC_C = $(top_srcdir)/*/*.c $(top_srcdir)/*/*/*.c
|
||||||
|
# CPPCHECK_SRC_C += $(top_srcdir)/*.cpp
|
||||||
|
@HAVE_CPPCHECK_TRUE@CPPCHECK_SRC_CXX = $(top_srcdir)/*/*.cpp
|
||||||
|
|
||||||
# Older boundary of the ChangeLog commits range
|
# Older boundary of the ChangeLog commits range
|
||||||
# It can be a tag ('v2.2.0'), a commit hash, a date, ...
|
# It can be a tag ('v2.2.0'), a commit hash, a date, ...
|
||||||
|
@ -447,6 +548,17 @@ GITLOG_START_POINT = v2.6.0
|
||||||
# targets from old build system (pre-automake).
|
# targets from old build system (pre-automake).
|
||||||
# supported for a period of time for backward "compatibility".
|
# supported for a period of time for backward "compatibility".
|
||||||
WARN = "----------------------------------------------------------------------"
|
WARN = "----------------------------------------------------------------------"
|
||||||
|
|
||||||
|
# Clean the dist tarball and packages
|
||||||
|
MAINTAINERCLEANFILES_DISTBALL = nut-*.tar.gz
|
||||||
|
# HP-UX:
|
||||||
|
# AIX as below, and RedHat-compatible (cover binary and source packages):
|
||||||
|
# Debian-compatible (cover binary and source packages):
|
||||||
|
# Solaris SVR4 package archives:
|
||||||
|
# Newer Solaris IPS (aka "pkg(5)" format archives)
|
||||||
|
MAINTAINERCLEANFILES_PACKAGES = \
|
||||||
|
NUT_HPUX_package@PACKAGE_VERSION@.depot nut*rpm nut*deb \
|
||||||
|
NUT_solaris_*_package@PACKAGE_VERSION@.local.gz *.p5p
|
||||||
all: all-recursive
|
all: all-recursive
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
@ -465,15 +577,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu Makefile
|
$(AUTOMAKE) --gnu Makefile
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
echo ' $(SHELL) ./config.status'; \
|
echo ' $(SHELL) ./config.status'; \
|
||||||
$(SHELL) ./config.status;; \
|
$(SHELL) ./config.status;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
@ -490,9 +601,17 @@ scripts/avahi/nut.service: $(top_builddir)/config.status $(top_srcdir)/scripts/a
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
scripts/HP-UX/nut.psf: $(top_builddir)/config.status $(top_srcdir)/scripts/HP-UX/nut.psf.in
|
scripts/HP-UX/nut.psf: $(top_builddir)/config.status $(top_srcdir)/scripts/HP-UX/nut.psf.in
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
|
scripts/python/module/PyNUT.py: $(top_builddir)/config.status $(top_srcdir)/scripts/python/module/PyNUT.py.in
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
|
scripts/Aix/nut.init: $(top_builddir)/config.status $(top_srcdir)/scripts/Aix/nut.init.in
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
scripts/HP-UX/postinstall: $(top_builddir)/config.status $(top_srcdir)/scripts/HP-UX/postinstall.in
|
scripts/HP-UX/postinstall: $(top_builddir)/config.status $(top_srcdir)/scripts/HP-UX/postinstall.in
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
scripts/ufw/nut.ufw.profile: $(top_builddir)/config.status $(top_srcdir)/scripts/ufw/nut.ufw.profile.in
|
scripts/python/app/NUT-Monitor-py2gtk2: $(top_builddir)/config.status $(top_srcdir)/scripts/python/app/NUT-Monitor-py2gtk2.in
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
|
scripts/python/app/NUT-Monitor-py3qt5: $(top_builddir)/config.status $(top_srcdir)/scripts/python/app/NUT-Monitor-py3qt5.in
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
|
scripts/python/module/test_nutclient.py: $(top_builddir)/config.status $(top_srcdir)/scripts/python/module/test_nutclient.py.in
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
|
|
||||||
mostlyclean-libtool:
|
mostlyclean-libtool:
|
||||||
|
@ -610,7 +729,10 @@ distclean-tags:
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
distdir: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||||
|
|
||||||
|
distdir-am: $(DISTFILES)
|
||||||
$(am__remove_distdir)
|
$(am__remove_distdir)
|
||||||
test -d "$(distdir)" || mkdir "$(distdir)"
|
test -d "$(distdir)" || mkdir "$(distdir)"
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
@ -675,7 +797,7 @@ distdir: $(DISTFILES)
|
||||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||||
|| chmod -R a+r "$(distdir)"
|
|| chmod -R a+r "$(distdir)"
|
||||||
dist-gzip: distdir
|
dist-gzip: distdir
|
||||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
|
||||||
$(am__post_remove_distdir)
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
dist-bzip2: distdir
|
dist-bzip2: distdir
|
||||||
|
@ -690,18 +812,22 @@ dist-xz: distdir
|
||||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||||
$(am__post_remove_distdir)
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-zstd: distdir
|
||||||
|
tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
dist-tarZ: distdir
|
dist-tarZ: distdir
|
||||||
@echo WARNING: "Support for shar distribution archives is" \
|
@echo WARNING: "Support for distribution archives compressed with" \
|
||||||
"deprecated." >&2
|
"legacy program 'compress' is deprecated." >&2
|
||||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||||
$(am__post_remove_distdir)
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
dist-shar: distdir
|
dist-shar: distdir
|
||||||
@echo WARNING: "Support for distribution archives compressed with" \
|
@echo WARNING: "Support for shar distribution archives is" \
|
||||||
"legacy program 'compress' is deprecated." >&2
|
"deprecated." >&2
|
||||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
|
||||||
$(am__post_remove_distdir)
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
dist-zip: distdir
|
dist-zip: distdir
|
||||||
|
@ -719,7 +845,7 @@ dist dist-all:
|
||||||
distcheck: dist
|
distcheck: dist
|
||||||
case '$(DIST_ARCHIVES)' in \
|
case '$(DIST_ARCHIVES)' in \
|
||||||
*.tar.gz*) \
|
*.tar.gz*) \
|
||||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||||
*.tar.bz2*) \
|
*.tar.bz2*) \
|
||||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||||
*.tar.lz*) \
|
*.tar.lz*) \
|
||||||
|
@ -729,25 +855,27 @@ distcheck: dist
|
||||||
*.tar.Z*) \
|
*.tar.Z*) \
|
||||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||||
*.shar.gz*) \
|
*.shar.gz*) \
|
||||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
||||||
*.zip*) \
|
*.zip*) \
|
||||||
unzip $(distdir).zip ;;\
|
unzip $(distdir).zip ;;\
|
||||||
|
*.tar.zst*) \
|
||||||
|
zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
|
||||||
esac
|
esac
|
||||||
chmod -R a-w $(distdir)
|
chmod -R a-w $(distdir)
|
||||||
chmod u+w $(distdir)
|
chmod u+w $(distdir)
|
||||||
mkdir $(distdir)/_build $(distdir)/_inst
|
mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
|
||||||
chmod a-w $(distdir)
|
chmod a-w $(distdir)
|
||||||
test -d $(distdir)/_build || exit 0; \
|
test -d $(distdir)/_build || exit 0; \
|
||||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||||
&& am__cwd=`pwd` \
|
&& am__cwd=`pwd` \
|
||||||
&& $(am__cd) $(distdir)/_build \
|
&& $(am__cd) $(distdir)/_build/sub \
|
||||||
&& ../configure \
|
&& ../../configure \
|
||||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
--srcdir=.. --prefix="$$dc_install_base" \
|
--srcdir=../.. --prefix="$$dc_install_base" \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
&& $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||||
|
@ -816,14 +944,17 @@ install-strip:
|
||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
distclean-generic:
|
distclean-generic:
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
-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 . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||||
|
-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
|
||||||
|
|
||||||
maintainer-clean-generic:
|
maintainer-clean-generic:
|
||||||
@echo "This command is intended for maintainers to use"
|
@echo "This command is intended for maintainers to use"
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
clean: clean-recursive
|
clean: clean-recursive
|
||||||
|
|
||||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||||
|
@ -832,7 +963,7 @@ distclean: distclean-recursive
|
||||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
-rm -f Makefile
|
-rm -f Makefile
|
||||||
distclean-am: clean-am distclean-generic distclean-libtool \
|
distclean-am: clean-am distclean-generic distclean-libtool \
|
||||||
distclean-tags
|
distclean-local distclean-tags
|
||||||
|
|
||||||
dvi: dvi-recursive
|
dvi: dvi-recursive
|
||||||
|
|
||||||
|
@ -876,7 +1007,8 @@ maintainer-clean: maintainer-clean-recursive
|
||||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
-rm -rf $(top_srcdir)/autom4te.cache
|
-rm -rf $(top_srcdir)/autom4te.cache
|
||||||
-rm -f Makefile
|
-rm -f Makefile
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
maintainer-clean-am: distclean-am maintainer-clean-generic \
|
||||||
|
maintainer-clean-local
|
||||||
|
|
||||||
mostlyclean: mostlyclean-recursive
|
mostlyclean: mostlyclean-recursive
|
||||||
|
|
||||||
|
@ -898,22 +1030,32 @@ uninstall-am:
|
||||||
am--refresh check check-am clean clean-cscope clean-generic \
|
am--refresh check check-am clean clean-cscope clean-generic \
|
||||||
clean-libtool cscope cscopelist-am ctags ctags-am dist \
|
clean-libtool cscope cscopelist-am ctags ctags-am dist \
|
||||||
dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
|
dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
|
||||||
dist-xz dist-zip distcheck distclean distclean-generic \
|
dist-xz dist-zip dist-zstd distcheck distclean \
|
||||||
distclean-libtool distclean-tags distcleancheck distdir \
|
distclean-generic distclean-libtool distclean-local \
|
||||||
distuninstallcheck dvi dvi-am html html-am info info-am \
|
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||||
install install-am install-data install-data-am install-dvi \
|
dvi-am html html-am info info-am install install-am \
|
||||||
install-dvi-am install-exec install-exec-am install-html \
|
install-data install-data-am install-dvi install-dvi-am \
|
||||||
install-html-am install-info install-info-am install-man \
|
install-exec install-exec-am install-html install-html-am \
|
||||||
install-pdf install-pdf-am install-ps install-ps-am \
|
install-info install-info-am install-man install-pdf \
|
||||||
install-strip installcheck installcheck-am installdirs \
|
install-pdf-am install-ps install-ps-am install-strip \
|
||||||
installdirs-am maintainer-clean maintainer-clean-generic \
|
installcheck installcheck-am installdirs installdirs-am \
|
||||||
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
|
maintainer-clean maintainer-clean-generic \
|
||||||
ps ps-am tags tags-am uninstall uninstall-am
|
maintainer-clean-local mostlyclean mostlyclean-generic \
|
||||||
|
mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
|
||||||
|
uninstall-am
|
||||||
|
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
|
||||||
|
libtool: $(LIBTOOL_DEPS)
|
||||||
|
$(SHELL) ./config.status libtool
|
||||||
|
|
||||||
distcheck-light:
|
distcheck-light:
|
||||||
$(MAKE) $(AM_MAKEFLAGS) DISTCHECK_FLAGS="$(DISTCHECK_LIGHT_FLAGS)" distcheck
|
$(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
|
# workaround the dist generated files that are also part of the distribution
|
||||||
# Note that distcleancheck is disabled for now, while waiting for a proper
|
# Note that distcleancheck is disabled for now, while waiting for a proper
|
||||||
# solution, that do not break older unix systems
|
# solution, that do not break older unix systems
|
||||||
|
@ -922,20 +1064,125 @@ distcheck-light:
|
||||||
distcleancheck:
|
distcleancheck:
|
||||||
@:
|
@:
|
||||||
|
|
||||||
|
# Quick alias for root dir recipe:
|
||||||
|
realclean: maintainer-clean
|
||||||
|
|
||||||
|
# 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
|
||||||
|
@HAVE_CPPCHECK_TRUE@cppcheck: cppcheck-cxx11.xml cppcheck-c99.xml
|
||||||
|
# CPPCHECK_SRC_CXX += $(top_srcdir)/*.cpp $(top_srcdir)/*/*/*.cpp
|
||||||
|
|
||||||
|
@HAVE_CPPCHECK_TRUE@cppcheck-cxx11.xml: $(CPPCHECK_SRC_CXX) $(CPPCHECK_SRC_H)
|
||||||
|
@HAVE_CPPCHECK_TRUE@ $(CPPCHECK) --std=c++11 --enable=all --inconclusive --xml --xml-version=2 . 2>$@
|
||||||
|
|
||||||
|
@HAVE_CPPCHECK_TRUE@cppcheck-c99.xml: $(CPPCHECK_SRC_C) $(CPPCHECK_SRC_H)
|
||||||
|
@HAVE_CPPCHECK_TRUE@ $(CPPCHECK) --std=c99 --enable=all --inconclusive --xml --xml-version=2 . 2>$@
|
||||||
|
@HAVE_CPPCHECK_FALSE@cppcheck:
|
||||||
|
@HAVE_CPPCHECK_FALSE@ @echo "CPPCHECK analysis not available since 'cppcheck' was not found."
|
||||||
|
|
||||||
# Force ChangeLog regeneration upon make dist (due to nonexistant 'dummy-stamp'),
|
# Force ChangeLog regeneration upon make dist (due to nonexistant 'dummy-stamp'),
|
||||||
# in case it has already been generated previously
|
# in case it has already been generated previously
|
||||||
|
# Note that the script is hard-coded to generate "ChangeLog" in the current dir
|
||||||
dummy-stamp:
|
dummy-stamp:
|
||||||
ChangeLog: tools/gitlog2changelog.py dummy-stamp
|
ChangeLog: tools/gitlog2changelog.py dummy-stamp
|
||||||
$(top_srcdir)/tools/gitlog2changelog.py $(GITLOG_START_POINT) || \
|
cd $(top_builddir) && \
|
||||||
echo "gitlog2changelog.py failed to generate the ChangeLog. See https://github.com/networkupstools/nut/commits/master" > $@
|
./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
|
# 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
|
rm -f nut-@PACKAGE_VERSION@.tar.gz.sig
|
||||||
gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz
|
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
|
md5sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.md5
|
||||||
sha256sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.sha256
|
sha256sum nut-@PACKAGE_VERSION@.tar.gz > nut-@PACKAGE_VERSION@.tar.gz.sha256
|
||||||
|
|
||||||
|
@ -971,7 +1218,7 @@ install-dirs:
|
||||||
@echo "Warning: 'make install-dirs' is deprecated."
|
@echo "Warning: 'make install-dirs' is deprecated."
|
||||||
@echo "Use 'make installdirs' instead."
|
@echo "Use 'make installdirs' instead."
|
||||||
@echo $(WARN)
|
@echo $(WARN)
|
||||||
make installdirs
|
$(MAKE) installdirs
|
||||||
cgi build-cgi install-cgi install-cgi-dir install-cgi-bin \
|
cgi build-cgi install-cgi install-cgi-dir install-cgi-bin \
|
||||||
install-cgi-man install-cgi-conf install-cgi-html:
|
install-cgi-man install-cgi-conf install-cgi-html:
|
||||||
@echo "Error: 'make $@' no longer exists."
|
@echo "Error: 'make $@' no longer exists."
|
||||||
|
@ -987,26 +1234,52 @@ snmp build-snmp install-snmp install-snmp-mgr install-snmp-man:
|
||||||
@echo "Use './configure --with-snmp' instead."
|
@echo "Use './configure --with-snmp' instead."
|
||||||
setver:
|
setver:
|
||||||
@echo "Error: 'make setver' no longer exists."
|
@echo "Error: 'make setver' no longer exists."
|
||||||
@echo "Edit configure.in to set version number."
|
@echo "Edit configure.ac to set version number."
|
||||||
package:
|
|
||||||
if test `uname -s` = "HP-UX"; then \
|
package: dist
|
||||||
cd scripts/HP-UX; \
|
DESTDIR="$(abs_builddir)/_install_pkgprotodir" ; export DESTDIR; \
|
||||||
make package; \
|
rm -rf "$$DESTDIR"; \
|
||||||
mv NUT_HPUX_package.depot NUT_HPUX_package@PACKAGE_VERSION@.depot; \
|
case "`uname -s`" in \
|
||||||
elif test `uname -s` = "SunOS"; then \
|
"HP-UX") \
|
||||||
make; \
|
( cd scripts/HP-UX && \
|
||||||
rm -rf @prefix@; \
|
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" package && \
|
||||||
make install; \
|
mv NUT_HPUX_package.depot $(abs_top_builddir)/NUT_HPUX_package@PACKAGE_VERSION@.depot ) ;; \
|
||||||
cd scripts/Solaris; \
|
"SunOS") \
|
||||||
make package; \
|
$(MAKE) $(AM_MAKEFLAGS) && \
|
||||||
make uninstall; \
|
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" install && \
|
||||||
rm -rf @prefix@; \
|
( cd scripts/Solaris && \
|
||||||
elif test `uname -s` = "AIX"; then \
|
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" package ) && \
|
||||||
make dist; \
|
$(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$DESTDIR" uninstall && \
|
||||||
cp scripts/Aix/nut-aix.spec /usr/src/packages/SPECS; \
|
rm -rf "$$DESTDIR" || \
|
||||||
cp scripts/Aix/nut.init nut-*.tar.gz /usr/src/packages/SOURCES; \
|
{ echo "FAILED to produce SunOS packages, inspect '$$DESTDIR' for clues" >&2 ; exit 1; } ;; \
|
||||||
rpm -ba /usr/src/packages/SPECS/nut-aix.spec; \
|
"AIX") \
|
||||||
fi;
|
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
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
|
542
NEWS
542
NEWS
|
@ -1,7 +1,413 @@
|
||||||
If you're upgrading from an earlier version, see the UPGRADING file.
|
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
|
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:
|
Release notes for NUT 2.7.4 - what's new since 2.7.3:
|
||||||
|
@ -164,7 +570,7 @@ Release notes for NUT 2.7.3 - what's new since 2.7.2:
|
||||||
- all drivers: a new 'synchronous' driver flag is available for very verbose
|
- all drivers: a new 'synchronous' driver flag is available for very verbose
|
||||||
units, such as some ePDUs
|
units, such as some ePDUs
|
||||||
|
|
||||||
- Eaton:
|
- Eaton:
|
||||||
* Add support for EnergySaving features for Eaton UPSs (HID USB/SHUT and
|
* Add support for EnergySaving features for Eaton UPSs (HID USB/SHUT and
|
||||||
XCP USB/serial)
|
XCP USB/serial)
|
||||||
* Fix and complete Eaton ePDUs G2/G3 support
|
* Fix and complete Eaton ePDUs G2/G3 support
|
||||||
|
@ -188,7 +594,7 @@ Release notes for NUT 2.7.3 - what's new since 2.7.2:
|
||||||
NHS Sistemas de Energia Expert S Online 6000/8000/10000
|
NHS Sistemas de Energia Expert S Online 6000/8000/10000
|
||||||
Powercom BNT-xxxAP (USB product id: 0001)
|
Powercom BNT-xxxAP (USB product id: 0001)
|
||||||
Rucelf UPOII-3000-96-EL
|
Rucelf UPOII-3000-96-EL
|
||||||
Tripp Lite OMNIVSINT800
|
Tripp Lite OMNIVSINT800
|
||||||
Voltronic Power Apex 1KVA and Imperial 1KVA
|
Voltronic Power Apex 1KVA and Imperial 1KVA
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
@ -218,7 +624,7 @@ Release notes for NUT 2.7.2 - what's new since 2.7.1:
|
||||||
|
|
||||||
- snmp-ups: add support for XPPC-MIB and Tripp Lite SU10KRT3/1X.
|
- snmp-ups: add support for XPPC-MIB and Tripp Lite SU10KRT3/1X.
|
||||||
Also fix erroneous status in HP/Compaq SNMP MIB (with the most recent HP
|
Also fix erroneous status in HP/Compaq SNMP MIB (with the most recent HP
|
||||||
firmware (1.76) ; improved various MIBs (APC, HP/Compaq, ...)
|
firmware (1.76) ; improved various MIBs (APC, HP/Compaq, ...)
|
||||||
|
|
||||||
- nutdrv_qx: add new 'fallback' Q1 subdriver, with minimal 'Q1' support.
|
- nutdrv_qx: add new 'fallback' Q1 subdriver, with minimal 'Q1' support.
|
||||||
General improvements on all subdrivers.
|
General improvements on all subdrivers.
|
||||||
|
@ -285,7 +691,7 @@ Release notes for NUT 2.7.1 - what's new since 2.6.5:
|
||||||
- libnutclient has been added as a C++ alternative to libupsclient.
|
- libnutclient has been added as a C++ alternative to libupsclient.
|
||||||
|
|
||||||
- Packaging files for Solaris and HP-UX (sponsored by Eaton)
|
- Packaging files for Solaris and HP-UX (sponsored by Eaton)
|
||||||
|
|
||||||
- Fix shutdown of Eaton HID, using usbhid-ups and mge-shut
|
- Fix shutdown of Eaton HID, using usbhid-ups and mge-shut
|
||||||
|
|
||||||
- usbhid-ups: final fix for APC Back UPS ES. APC Back UPS ES devices have
|
- usbhid-ups: final fix for APC Back UPS ES. APC Back UPS ES devices have
|
||||||
|
@ -308,11 +714,11 @@ Release notes for NUT 2.7.1 - what's new since 2.6.5:
|
||||||
related to power devices and management
|
related to power devices and management
|
||||||
|
|
||||||
- Improve systemd integration
|
- Improve systemd integration
|
||||||
|
|
||||||
- snmp-ups: Fixed a crash on outlet management, and added delta_ups MIB
|
- snmp-ups: Fixed a crash on outlet management, and added delta_ups MIB
|
||||||
support. Also fixed mappings for upsBypassVoltage, upsBypassCurrent, and
|
support. Also fixed mappings for upsBypassVoltage, upsBypassCurrent, and
|
||||||
upsBypassPower in three-phase IETF MIB.
|
upsBypassPower in three-phase IETF MIB.
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
Release notes for NUT 2.6.5 - what's new since 2.6.4:
|
Release notes for NUT 2.6.5 - what's new since 2.6.4:
|
||||||
|
|
||||||
|
@ -349,7 +755,7 @@ Release notes for NUT 2.6.5 - what's new since 2.6.4:
|
||||||
VMware ESXI 5.0, through a native VIB package. This is, for the time
|
VMware ESXI 5.0, through a native VIB package. This is, for the time
|
||||||
being, an external effort from René Garcia (refer to the Download section
|
being, an external effort from René Garcia (refer to the Download section
|
||||||
on NUT website). But work is underway to improve this integration, and
|
on NUT website). But work is underway to improve this integration, and
|
||||||
include it in the NUT source tree
|
include it in the NUT source tree
|
||||||
|
|
||||||
- IPMI support (nut-ipmipsu driver and nut-scanner): prepare for supporting
|
- IPMI support (nut-ipmipsu driver and nut-scanner): prepare for supporting
|
||||||
API changes in upcoming FreeIPMI versions 1.1.x and 1.2.x.
|
API changes in upcoming FreeIPMI versions 1.1.x and 1.2.x.
|
||||||
|
@ -374,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
|
especially from the network. Non printable characters were missed
|
||||||
from strings operation (such as strlen), but still copied to the
|
from strings operation (such as strlen), but still copied to the
|
||||||
buffer, causing an overflow.
|
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 ~
|
Space to ~
|
||||||
(Reported by Sebastian Pohle, Alioth bug #313636, CVE-2012-2944)
|
(Reported by Sebastian Pohle, Alioth bug #313636, CVE-2012-2944)
|
||||||
|
|
||||||
|
@ -424,7 +830,7 @@ Release notes for NUT 2.6.4 - what's new since 2.6.3:
|
||||||
PowerShield Defender 1200VA
|
PowerShield Defender 1200VA
|
||||||
PowerWalker Online VFI LCD, Line-Interactive VI LCD and Line-Interactive VI
|
PowerWalker Online VFI LCD, Line-Interactive VI LCD and Line-Interactive VI
|
||||||
Riello Netman Plus 102 SNMP Card
|
Riello Netman Plus 102 SNMP Card
|
||||||
Tripp-Lite OMNISMART500
|
Tripp-Lite OMNISMART500
|
||||||
|
|
||||||
- apcsmart has received some fixes to work better on Mac OS X, and in general
|
- apcsmart has received some fixes to work better on Mac OS X, and in general
|
||||||
|
|
||||||
|
@ -436,7 +842,7 @@ 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
|
- blazer_ser and blazer_usb now try to automatically estimate high and low
|
||||||
voltages, to be able to calculate battery charge ; support for online
|
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
|
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
|
- bestups has also received some care, though users are encouraged to switch
|
||||||
to blazer_ser, since bestups will soon be deprecated.
|
to blazer_ser, since bestups will soon be deprecated.
|
||||||
|
@ -468,19 +874,19 @@ Release notes for NUT 2.6.4 - what's new since 2.6.3:
|
||||||
|
|
||||||
- Riello protocols have been officially published in NUT protocols library:
|
- Riello protocols have been officially published in NUT protocols library:
|
||||||
http://www.networkupstools.org/ups-protocols.html#_riello
|
http://www.networkupstools.org/ups-protocols.html#_riello
|
||||||
|
|
||||||
- Duplicate instances of upsd / upsmon are now detected upon startup
|
- Duplicate instances of upsd / upsmon are now detected upon startup
|
||||||
|
|
||||||
- NUT variables namespace has been completed with missing variables and
|
- NUT variables namespace has been completed with missing variables and
|
||||||
commands that are already known and standard
|
commands that are already known and standard
|
||||||
|
|
||||||
- upslog now comes with a companion file, for logrotate configuration
|
- upslog now comes with a companion file, for logrotate configuration
|
||||||
|
|
||||||
- more devices embed NUT for power protection, now including Thecus NAS range
|
- more devices embed NUT for power protection, now including Thecus NAS range
|
||||||
|
|
||||||
- more bugfixes, cleanup and improvements, on both source code and
|
- more bugfixes, cleanup and improvements, on both source code and
|
||||||
documentation, with a good bunch from Greg A. Woods.
|
documentation, with a good bunch from Greg A. Woods.
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
Release notes for NUT 2.6.3 - what's new since 2.6.2:
|
Release notes for NUT 2.6.3 - what's new since 2.6.2:
|
||||||
|
|
||||||
|
@ -527,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
|
- Base files for HPUX packaging have been added. This is still a work in
|
||||||
progress.
|
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
|
- more bugfixes, cleanup and improvements, on both source code and
|
||||||
documentation.
|
documentation.
|
||||||
|
@ -550,7 +956,7 @@ Release notes for NUT 2.6.2 - what's new since 2.6.1:
|
||||||
* SNMP,
|
* SNMP,
|
||||||
* XML/HTTP (from Eaton),
|
* XML/HTTP (from Eaton),
|
||||||
* NUT servers, using the classic connect or Avahi / mDNS methods.
|
* NUT servers, using the classic connect or Avahi / mDNS methods.
|
||||||
|
|
||||||
IPMI support will be added in the next release.
|
IPMI support will be added in the next release.
|
||||||
A separate library, called 'libnutscan', is also available to provide these
|
A separate library, called 'libnutscan', is also available to provide these
|
||||||
feature. Future NUT releases will provides binding for the supported
|
feature. Future NUT releases will provides binding for the supported
|
||||||
|
@ -562,10 +968,10 @@ Release notes for NUT 2.6.2 - what's new since 2.6.1:
|
||||||
the future.
|
the future.
|
||||||
For more info, refer to nut/scripts/java/README, or the developer guide
|
For more info, refer to nut/scripts/java/README, or the developer guide
|
||||||
(chapter 'Creating new client'). Javadoc documentation is also provided,
|
(chapter 'Creating new client'). Javadoc documentation is also provided,
|
||||||
along with Java archives (.jar) in the Download section.
|
along with Java archives (.jar) in the Download section.
|
||||||
|
|
||||||
- support for new devices: Eaton 3S ; Cyber Power Systems CP1000AVRLCD ;
|
- 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
|
Smart-UPS RT XL ; Orvaldi 750 / 900SP ; POWEREX VI 1000 LED ; PowerWalker
|
||||||
VI 850 LCD ; SVEN Power Pro+ series (USB ID ffff:0000).
|
VI 850 LCD ; SVEN Power Pro+ series (USB ID ffff:0000).
|
||||||
|
|
||||||
|
@ -590,9 +996,9 @@ Release notes for NUT 2.6.2 - what's new since 2.6.1:
|
||||||
the default 3 seconds.
|
the default 3 seconds.
|
||||||
|
|
||||||
- snmp-ups.c has a new initialization method, that uses sysObjectID, which is
|
- 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'
|
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.
|
support has been completed.
|
||||||
|
|
||||||
- Initial support has been added for systemd, the System and Service Manager
|
- Initial support has been added for systemd, the System and Service Manager
|
||||||
|
@ -604,7 +1010,7 @@ Release notes for NUT 2.6.2 - what's new since 2.6.1:
|
||||||
|
|
||||||
- Finally, after years of dedication to NUT, Arjen de Korte is now retired.
|
- Finally, after years of dedication to NUT, Arjen de Korte is now retired.
|
||||||
Sincere thanks to you Arjen from us all.
|
Sincere thanks to you Arjen from us all.
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
Release notes for NUT 2.6.1 - what's new since 2.6.0:
|
Release notes for NUT 2.6.1 - what's new since 2.6.0:
|
||||||
|
|
||||||
|
@ -635,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.
|
- 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
|
- on the quality assurance side, Eaton has worked on fixing a few
|
||||||
conformances, like C++ style comments and warnings, using a newly developed
|
non-conformance issues, like C++ style comments and warnings, using
|
||||||
verification tool (Prachi Gandhi).
|
a newly developed verification tool (Prachi Gandhi).
|
||||||
|
|
||||||
- fix remaining references to LIBSSL_LDFLAGS, instead of LIBSSL_LIBS,
|
- fix remaining references to LIBSSL_LDFLAGS, instead of LIBSSL_LIBS,
|
||||||
which cause unresolved symbol on libupsclient users (Fabrice Coutadeur).
|
which cause unresolved symbol on libupsclient users (Fabrice Coutadeur).
|
||||||
|
@ -696,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 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).
|
- refresh and improve USB helper files (udev and UPower).
|
||||||
|
|
||||||
|
@ -767,8 +1173,8 @@ Release notes for NUT 2.4.1 - what's new since 2.4.0:
|
||||||
version 1.1.
|
version 1.1.
|
||||||
|
|
||||||
- the situation of the build toolchain has been fixed, with regard to the
|
- 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.
|
further configure call.
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
Release notes for NUT 2.4.0 - what's new since 2.2.2:
|
Release notes for NUT 2.4.0 - what's new since 2.2.2:
|
||||||
|
@ -779,7 +1185,7 @@ Release notes for NUT 2.4.0 - what's new since 2.2.2:
|
||||||
including: Eaton ePDUs (Managed and Monitored), some Aphel models, some
|
including: Eaton ePDUs (Managed and Monitored), some Aphel models, some
|
||||||
Raritan PDUs, and the whole list of Powerman supported devices:
|
Raritan PDUs, and the whole list of Powerman supported devices:
|
||||||
http://powerman.sourceforge.net/supported.html
|
http://powerman.sourceforge.net/supported.html
|
||||||
|
|
||||||
- support for new devices: the various PDUs cited above, Chloride Desk Power
|
- support for new devices: the various PDUs cited above, Chloride Desk Power
|
||||||
650, Cyber Power Systems Value 400E/600E/800E (USB models), Delta GES602N,
|
650, Cyber Power Systems Value 400E/600E/800E (USB models), Delta GES602N,
|
||||||
Digitus DN-170020, the whole Eaton ranges (mostly composed of MGE Office
|
Digitus DN-170020, the whole Eaton ranges (mostly composed of MGE Office
|
||||||
|
@ -809,8 +1215,8 @@ Release notes for NUT 2.4.0 - what's new since 2.2.2:
|
||||||
|
|
||||||
- NUT now ships a bash completion function for 'upsc' command
|
- NUT now ships a bash completion function for 'upsc' command
|
||||||
(scripts/misc/nut.bash_completion). Simply copy it to /etc/bash_completion.d
|
(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
|
maintenance cost (thus allowing developers to focus on what matters: the
|
||||||
code!). Examples of this are:
|
code!). Examples of this are:
|
||||||
- the USB information automatic extraction to generate the various USB helper
|
- the USB information automatic extraction to generate the various USB helper
|
||||||
|
@ -827,7 +1233,7 @@ Release notes for NUT 2.2.2 - what's new since 2.2.1:
|
||||||
- support for new devices: APC BACK-UPS XS LCD, Atlantis Land,
|
- support for new devices: APC BACK-UPS XS LCD, Atlantis Land,
|
||||||
Mustek Powermust Office 650, Oneac XAU models, Powerware PW5115 and
|
Mustek Powermust Office 650, Oneac XAU models, Powerware PW5115 and
|
||||||
PW9120 (USB), Nitram Elite 2005
|
PW9120 (USB), Nitram Elite 2005
|
||||||
|
|
||||||
- Integrated Power Management (NUT HAL integration) has reached a
|
- Integrated Power Management (NUT HAL integration) has reached a
|
||||||
major milestone: it is now the most advanced UPS integration into
|
major milestone: it is now the most advanced UPS integration into
|
||||||
Power Management layer known in existing OSs. It has received many
|
Power Management layer known in existing OSs. It has received many
|
||||||
|
@ -846,15 +1252,15 @@ Release notes for NUT 2.2.2 - what's new since 2.2.1:
|
||||||
|
|
||||||
- the netxml-ups driver has appeared to support MGE* network HTTP/XML
|
- the netxml-ups driver has appeared to support MGE* network HTTP/XML
|
||||||
cards.
|
cards.
|
||||||
|
|
||||||
- NUT now distributes by default the shared version of libupsclient
|
- NUT now distributes by default the shared version of libupsclient
|
||||||
(version 1.0.0), and use this for the provided clients (upsmon, upsc,
|
(version 1.0.0), and use this for the provided clients (upsmon, upsc,
|
||||||
upsrw, upscmd). This is part of an effort to reduce NUT's footprint,
|
upsrw, upscmd). This is part of an effort to reduce NUT's footprint,
|
||||||
both on disk and in memory.
|
both on disk and in memory.
|
||||||
|
|
||||||
- powerpanel has reach a new step toward the replacement of nitram and
|
- powerpanel has reach a new step toward the replacement of nitram and
|
||||||
cpsups drivers. The final step is scheduled for NUT 2.4.
|
cpsups drivers. The final step is scheduled for NUT 2.4.
|
||||||
|
|
||||||
- many changes, cleanup and fixes to the NUT core and various drivers.
|
- many changes, cleanup and fixes to the NUT core and various drivers.
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
@ -874,7 +1280,7 @@ Release notes for NUT 2.2.1 - what's new since 2.2.0:
|
||||||
|
|
||||||
- the megatec and megatec_usb drivers have also been backported from the
|
- the megatec and megatec_usb drivers have also been backported from the
|
||||||
development (trunk) version.
|
development (trunk) version.
|
||||||
|
|
||||||
- the client development files have also received some care:
|
- the client development files have also received some care:
|
||||||
the upsclient pkg-config file has been fixed, and the upsclient.h
|
the upsclient pkg-config file has been fixed, and the upsclient.h
|
||||||
file allows older NUT clients to continue using the UPSCONN structure.
|
file allows older NUT clients to continue using the UPSCONN structure.
|
||||||
|
@ -926,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
|
This release is a backport of the development version. Many changes
|
||||||
have already been backported previously. Thus it is more a
|
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.
|
for new models.
|
||||||
|
|
||||||
- support for new devices: APC Smart-UPS with 6TI firmware; Belkin
|
- support for new devices: APC Smart-UPS with 6TI firmware; Belkin
|
||||||
|
@ -949,7 +1355,7 @@ Release notes for NUT 2.0.5 - what's new since 2.0.4:
|
||||||
|
|
||||||
- solis: shutdown programming, support new cables, Solaris support
|
- solis: shutdown programming, support new cables, Solaris support
|
||||||
|
|
||||||
- tripplite_usb: updated SMARTPRO support, fixed OL/OB reporting,
|
- tripplite_usb: updated SMARTPRO support, fixed OL/OB reporting,
|
||||||
better error handling, some memory bugs
|
better error handling, some memory bugs
|
||||||
|
|
||||||
- new dummy-ups driver simulator
|
- new dummy-ups driver simulator
|
||||||
|
@ -960,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:
|
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
|
- 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.
|
enhancement for Solaris.
|
||||||
[Peter Selinger and Arnaud Quette]
|
[Peter Selinger and Arnaud Quette]
|
||||||
|
|
||||||
- A bug has been fixed in NUT core to support resuming from suspend-to-disk.
|
- 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.
|
through the NTP - Network Time Protocol.
|
||||||
[Arjen de Korte]
|
[Arjen de Korte]
|
||||||
|
|
||||||
|
@ -988,7 +1394,7 @@ Release notes for NUT 2.0.4 - what's new since 2.0.3:
|
||||||
[Carlos Rodrigues]
|
[Carlos Rodrigues]
|
||||||
|
|
||||||
- The new rhino driver was added to support Microsol Rhino UPS hardware
|
- 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
|
internal / external shutdown programming. solis can now save external
|
||||||
shutdown programming to ups, and support new cables for solis 3
|
shutdown programming to ups, and support new cables for solis 3
|
||||||
[Silvino B. Magalhães]
|
[Silvino B. Magalhães]
|
||||||
|
@ -1028,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)
|
ups.model retrieval for some specific case (release 0.65)
|
||||||
|
|
||||||
- The drivers don't change to the "statepath" directory anymore at
|
- 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.
|
failure to poweroff the UPS if /var is already unmounted.
|
||||||
[Gaspar Bakos]
|
[Gaspar Bakos]
|
||||||
|
|
||||||
|
@ -1048,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
|
- The packaging files for Red Hat have received various fixes
|
||||||
[Thomas Jarosch]
|
[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
|
compile on Solaris
|
||||||
[Paweł Kierdelewicz]
|
[Paweł Kierdelewicz]
|
||||||
|
|
||||||
|
@ -1090,7 +1496,7 @@ Release notes for NUT 2.0.2 - what's new since 2.0.1:
|
||||||
[Thanos Chatziathanassiou, Olli Salvia]
|
[Thanos Chatziathanassiou, Olli Salvia]
|
||||||
|
|
||||||
- The bcmxcp driver is back with support for Powerware UPSs.
|
- 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.
|
- The cyberpower driver now supports CyberPower 1000AVR.
|
||||||
[Dave Huang]
|
[Dave Huang]
|
||||||
|
@ -1101,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 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]
|
[Marek Michalkiewicz]
|
||||||
|
|
||||||
- The new upscode2 driver supports Fiskars, Compaq and Powerware
|
- The new upscode2 driver supports Fiskars, Compaq and Powerware
|
||||||
|
@ -1140,7 +1546,7 @@ Release notes for NUT 2.0.1 - what's new since 2.0.0:
|
||||||
- The everups driver now supports types 73-76 (NET 700/1000/1400/500-DPC)
|
- The everups driver now supports types 73-76 (NET 700/1000/1400/500-DPC)
|
||||||
[hunter]
|
[hunter]
|
||||||
|
|
||||||
- The new metasys driver supports Meta System models: Line,
|
- The new metasys driver supports Meta System models: Line,
|
||||||
HF Millennium, HF Top Line, ECO Network, ECO, Ally HF, Megaline
|
HF Millennium, HF Top Line, ECO Network, ECO, Ally HF, Megaline
|
||||||
[BlaXwan]
|
[BlaXwan]
|
||||||
|
|
||||||
|
@ -1153,7 +1559,7 @@ Release notes for NUT 2.0.1 - what's new since 2.0.0:
|
||||||
and bypass control.
|
and bypass control.
|
||||||
[Gert Lynge]
|
[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
|
working condition for the 2.0 tree, including code cleanups, several
|
||||||
new variables, commands, and user-definable parameters. See
|
new variables, commands, and user-definable parameters. See
|
||||||
ChangeLog for more.
|
ChangeLog for more.
|
||||||
|
@ -1192,7 +1598,7 @@ Release notes for NUT 2.0.1 - what's new since 2.0.0:
|
||||||
[Arnaud Quette]
|
[Arnaud Quette]
|
||||||
|
|
||||||
- The fentonups driver now recognizes several more Megatec protocol
|
- The fentonups driver now recognizes several more Megatec protocol
|
||||||
units:
|
units:
|
||||||
|
|
||||||
SuperPower HP360, Hope-550 [Denis Zaika]
|
SuperPower HP360, Hope-550 [Denis Zaika]
|
||||||
Unitek Alpha 1000is [Antoine Cuvellard]
|
Unitek Alpha 1000is [Antoine Cuvellard]
|
||||||
|
@ -1206,7 +1612,7 @@ Release notes for NUT 2.0.1 - what's new since 2.0.0:
|
||||||
|
|
||||||
- upssched's CANCEL events were broken following the change to
|
- upssched's CANCEL events were broken following the change to
|
||||||
text-based socket messages in 1.5 and have been fixed.
|
text-based socket messages in 1.5 and have been fixed.
|
||||||
[Steven Schoch]
|
[Steven Schoch]
|
||||||
|
|
||||||
- Calls to varargs functions with raw strings from the config files
|
- Calls to varargs functions with raw strings from the config files
|
||||||
without an intervening "%s" have been fixed in upsmon, upssched,
|
without an intervening "%s" have been fixed in upsmon, upssched,
|
||||||
|
@ -1225,8 +1631,8 @@ Release notes for NUT 2.0.0 - what's new since 1.4.x:
|
||||||
interim compatibility hacks have been removed.
|
interim compatibility hacks have been removed.
|
||||||
|
|
||||||
- New serial handling code has been added, with greatly simplified
|
- New serial handling code has been added, with greatly simplified
|
||||||
operations. The old mess involving repeated calls to sigaction,
|
operations. The old mess involving repeated calls to sigaction,
|
||||||
alarm, and read has been condensed to a select-read loop.
|
alarm, and read has been condensed to a select-read loop.
|
||||||
|
|
||||||
This change allows drivers which don't do any serial communications
|
This change allows drivers which don't do any serial communications
|
||||||
at all (hidups, snmp-ups) to drop that baggage, so they are a bit
|
at all (hidups, snmp-ups) to drop that baggage, so they are a bit
|
||||||
|
@ -1277,13 +1683,13 @@ Release notes for NUT 2.0.0 - what's new since 1.4.x:
|
||||||
[Viktor T. Toth]
|
[Viktor T. Toth]
|
||||||
|
|
||||||
- The newhidups driver has been merged as the first step towards
|
- The newhidups driver has been merged as the first step towards
|
||||||
portable USB UPS support. This will eventually replace the old
|
portable USB UPS support. This will eventually replace the old
|
||||||
Linux-only hidups driver. The newhidups driver is tagged
|
Linux-only hidups driver. The newhidups driver is tagged
|
||||||
experimental since it is under active development.
|
experimental since it is under active development.
|
||||||
[Arnaud Quette, Charles Lepple]
|
[Arnaud Quette, Charles Lepple]
|
||||||
|
|
||||||
- The newapc driver has been renamed to apcsmart, replacing the old
|
- The newapc driver has been renamed to apcsmart, replacing the old
|
||||||
driver with that name. If you used the newapc driver, be sure to
|
driver with that name. If you used the newapc driver, be sure to
|
||||||
delete the old binary and fix your ups.conf.
|
delete the old binary and fix your ups.conf.
|
||||||
|
|
||||||
- The apcsmart driver now supports asynchronous notification data
|
- The apcsmart driver now supports asynchronous notification data
|
||||||
|
@ -1312,7 +1718,7 @@ Release notes for NUT 2.0.0 - what's new since 1.4.x:
|
||||||
instcmds.
|
instcmds.
|
||||||
|
|
||||||
- Effekta MT 2000 RM hardware is now supported by the fentonups driver.
|
- 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
|
- The new safenet driver supports UPS hardware that uses the protocol
|
||||||
of the same name. This includes models from many manufacturers,
|
of the same name. This includes models from many manufacturers,
|
||||||
|
@ -1376,20 +1782,20 @@ Release notes for NUT 1.4.0 - what's new since 1.2.x:
|
||||||
|
|
||||||
- upssched now explicitly confirms reception of timer commands before
|
- upssched now explicitly confirms reception of timer commands before
|
||||||
exiting. This was done to avoid a race where one process would
|
exiting. This was done to avoid a race where one process would
|
||||||
exit right when another one was starting. The second one would
|
exit right when another one was starting. The second one would
|
||||||
believe its command had been handled when it had been lost.
|
believe its command had been handled when it had been lost.
|
||||||
|
|
||||||
- upslog has been reworked to use standard getopt parsing to provide
|
- upslog has been reworked to use standard getopt parsing to provide
|
||||||
the monitoring settings. The old way of specifying arguments is
|
the monitoring settings. The old way of specifying arguments is
|
||||||
still supported for backwards compatibility.
|
still supported for backwards compatibility.
|
||||||
|
|
||||||
upslog has also been changed to only parse the format string once,
|
upslog has also been changed to only parse the format string once,
|
||||||
rather than doing it every time through the loop. This should
|
rather than doing it every time through the loop. This should
|
||||||
provide a minuscule drop in CPU utilization.
|
provide a minuscule drop in CPU utilization.
|
||||||
|
|
||||||
- Usernames are now required in upsmon and upsd. This means that you
|
- Usernames are now required in upsmon and upsd. This means that you
|
||||||
must add a username to your MONITOR lines in upsmon.conf and then
|
must add a username to your MONITOR lines in upsmon.conf and then
|
||||||
create a matching user in upsd.users.
|
create a matching user in upsd.users.
|
||||||
|
|
||||||
Installations from the 1.2 era probably already use usernames, so
|
Installations from the 1.2 era probably already use usernames, so
|
||||||
this mostly affects those from 1.0 and before.
|
this mostly affects those from 1.0 and before.
|
||||||
|
@ -1426,14 +1832,14 @@ Release notes for NUT 1.4.0 - what's new since 1.2.x:
|
||||||
|
|
||||||
- Signal handlers no longer do any significant amount of work. Some of
|
- Signal handlers no longer do any significant amount of work. Some of
|
||||||
the programs used to do numerous things in there, raising concerns
|
the programs used to do numerous things in there, raising concerns
|
||||||
about reentrancy. They now set flags and allow the main loop to do
|
about reentrancy. They now set flags and allow the main loop to do
|
||||||
the actual work from there.
|
the actual work from there.
|
||||||
|
|
||||||
- A bug in upsmon where NOTIFYFLAG settings could be ignored was fixed.
|
- A bug in upsmon where NOTIFYFLAG settings could be ignored was fixed.
|
||||||
|
|
||||||
- Group handling has been changed. configure no longer accepts
|
- Group handling has been changed. configure no longer accepts
|
||||||
--with-group, and the programs no longer setgid() to a hardcoded
|
--with-group, and the programs no longer setgid() to a hardcoded
|
||||||
value. They now setgid() to the primary group of whatever the
|
value. They now setgid() to the primary group of whatever the
|
||||||
user value may be.
|
user value may be.
|
||||||
|
|
||||||
This may be compiled in with --with-user as before, and many programs
|
This may be compiled in with --with-user as before, and many programs
|
||||||
|
@ -1460,7 +1866,7 @@ Release notes for NUT 1.4.0 - what's new since 1.2.x:
|
||||||
battery tests were also added.
|
battery tests were also added.
|
||||||
|
|
||||||
- The dummyups testing driver has been removed. The dummycons testing
|
- The dummyups testing driver has been removed. The dummycons testing
|
||||||
driver can do everything that dummyups once did and much more.
|
driver can do everything that dummyups once did and much more.
|
||||||
dummycons is also now built by default for easier testing.
|
dummycons is also now built by default for easier testing.
|
||||||
|
|
||||||
- The newapc driver has been reworked to take advantage of the new
|
- The newapc driver has been reworked to take advantage of the new
|
||||||
|
@ -1475,7 +1881,7 @@ Release notes for NUT 1.4.0 - what's new since 1.2.x:
|
||||||
a shutdown sequence, and more.
|
a shutdown sequence, and more.
|
||||||
[Arnaud Quette]
|
[Arnaud Quette]
|
||||||
|
|
||||||
- The mge-utalk driver had trouble establishing communications in
|
- The mge-utalk driver had trouble establishing communications in
|
||||||
some cases due to the RTS line being set. This has been fixed.
|
some cases due to the RTS line being set. This has been fixed.
|
||||||
|
|
||||||
The mge-shut driver has been added to the tree, and has replaced
|
The mge-shut driver has been added to the tree, and has replaced
|
||||||
|
@ -1491,7 +1897,7 @@ Release notes for NUT 1.4.0 - what's new since 1.2.x:
|
||||||
others before long.
|
others before long.
|
||||||
[Arnaud Quette]
|
[Arnaud Quette]
|
||||||
|
|
||||||
- KIN-2200AP hardware is now recognized by the powercom driver.
|
- KIN-2200AP hardware is now recognized by the powercom driver.
|
||||||
This change may also support other KIN-xxxxAP equipment.
|
This change may also support other KIN-xxxxAP equipment.
|
||||||
[Preston A. Elder]
|
[Preston A. Elder]
|
||||||
|
|
||||||
|
@ -1569,7 +1975,7 @@ Release notes for NUT 1.4.0 - what's new since 1.2.x:
|
||||||
- The inline keyword is now handled properly on systems which do not
|
- The inline keyword is now handled properly on systems which do not
|
||||||
support it or have it specified as another name. This was breaking
|
support it or have it specified as another name. This was breaking
|
||||||
compiles on some systems.
|
compiles on some systems.
|
||||||
[Petter Reinholdtsen]
|
[Petter Reinholdtsen]
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
Release notes for NUT 1.2.2 - what's new since 1.2.1:
|
Release notes for NUT 1.2.2 - what's new since 1.2.1:
|
||||||
|
@ -1607,7 +2013,7 @@ Release notes for NUT 1.2.2 - what's new since 1.2.1:
|
||||||
[Alex Cichowski]
|
[Alex Cichowski]
|
||||||
|
|
||||||
- The liebert driver also now uses debouncing logic on the status
|
- The liebert driver also now uses debouncing logic on the status
|
||||||
lines. It was possible to get false readings that would start a
|
lines. It was possible to get false readings that would start a
|
||||||
shutdown or just annoy users with excessive onbatt/online notify
|
shutdown or just annoy users with excessive onbatt/online notify
|
||||||
messages. The new code forces the status to settle down for 3 polls
|
messages. The new code forces the status to settle down for 3 polls
|
||||||
before accepting the new value.
|
before accepting the new value.
|
||||||
|
@ -1654,7 +2060,7 @@ Release notes for NUT 1.2.2 - what's new since 1.2.1:
|
||||||
|
|
||||||
- upsd no longer tries to reference a deleted client structure if the
|
- upsd no longer tries to reference a deleted client structure if the
|
||||||
client disconnects at the wrong time. Previously, it tried to use
|
client disconnects at the wrong time. Previously, it tried to use
|
||||||
that pointer after the sendback() function had already failed on
|
that pointer after the sendback() function had already failed on
|
||||||
write and deleted the client. This could cause upsd to segfault
|
write and deleted the client. This could cause upsd to segfault
|
||||||
depending on what areas were accessed.
|
depending on what areas were accessed.
|
||||||
[Patrik Schindler]
|
[Patrik Schindler]
|
||||||
|
@ -1676,7 +2082,7 @@ Release notes for NUT 1.2.1 - what's new since 1.2.0:
|
||||||
- The old multilink driver is back with a new name: liebert. It
|
- The old multilink driver is back with a new name: liebert. It
|
||||||
supports Liebert UPStation GXE hardware with the contact-closure
|
supports Liebert UPStation GXE hardware with the contact-closure
|
||||||
cable. This is currently an experimental driver as there is no
|
cable. This is currently an experimental driver as there is no
|
||||||
way to power down the load.
|
way to power down the load.
|
||||||
|
|
||||||
- configure now picks up the right flags for gd automatically if gd
|
- configure now picks up the right flags for gd automatically if gd
|
||||||
2.0.8 or higher is installed. This greatly simplifies the CGI build
|
2.0.8 or higher is installed. This greatly simplifies the CGI build
|
||||||
|
|
90
README
90
README
|
@ -102,7 +102,7 @@ This package is broken down into several categories:
|
||||||
- *clients* - They talk to upsd and do things with the status data.
|
- *clients* - They talk to upsd and do things with the status data.
|
||||||
- *cgi-bin* - Special class of clients that you can use with your web server.
|
- *cgi-bin* - Special class of clients that you can use with your web server.
|
||||||
- *scripts* - Contains various scripts, like the Perl and Python binding,
|
- *scripts* - Contains various scripts, like the Perl and Python binding,
|
||||||
integration bits and applications.
|
integration bits and applications.
|
||||||
|
|
||||||
Drivers
|
Drivers
|
||||||
-------
|
-------
|
||||||
|
@ -120,8 +120,9 @@ The entry in `ups.conf` looks like this:
|
||||||
driver = apcsmart
|
driver = apcsmart
|
||||||
port = /dev/ttyS1
|
port = /dev/ttyS1
|
||||||
|
|
||||||
To start and stop drivers, use upsdrvctl. By default, it will start or
|
To start and stop drivers, use upsdrvctl of upsdrvsvcctl (installed on
|
||||||
stop every UPS in the config file:
|
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 start
|
||||||
/usr/local/ups/sbin/upsdrvctl stop
|
/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 start sparky
|
||||||
/usr/local/ups/sbin/upsdrvctl stop 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
|
To find the driver name for your device, refer to the section below
|
||||||
called "HARDWARE SUPPORT TABLE".
|
called "HARDWARE SUPPORT TABLE".
|
||||||
|
|
||||||
|
@ -236,8 +248,8 @@ Power distribution unit management
|
||||||
|
|
||||||
NUT also provides an advanced support for power distribution units.
|
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.
|
chapter to learn more about when to use this feature.
|
||||||
|
|
||||||
Network Server
|
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
|
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:
|
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
|
The monitored UPS possibly supplies power to this system running `upsmon`,
|
||||||
responsible for shutting it down when the battery is depleted. This occurs
|
but more importantly -- this system can manage the UPS (typically, this
|
||||||
after any slave systems have disconnected safely.
|
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`
|
The shutdown of this (primary) system itself, as well as eventually an
|
||||||
process on that system should define that UPS as a master.
|
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.
|
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
|
The monitored UPS may supply power to the system running `upsmon` (or
|
||||||
shut it down directly.
|
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
|
Use this mode when you run multiple computers on the same UPS.
|
||||||
one can be connected to the serial port on the UPS, and that system is the
|
Obviously, only one can be connected to the serial or USB port
|
||||||
master. Everything else is a slave.
|
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.
|
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
|
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,
|
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
|
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
|
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
|
Major release jumps are mostly due to large changes to the features
|
||||||
list. There have also been a number of architectural changes which
|
list. There have also been a number of architectural changes which
|
||||||
|
@ -486,11 +522,11 @@ may not be noticeable to most users, but which can impact developers.
|
||||||
Backwards and Forwards Compatibility
|
Backwards and Forwards Compatibility
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
|
||||||
The old network code spans a range from about 0.41.1 when TCP support
|
The old network code spans a range from about 0.41.1 when TCP support
|
||||||
was introduced up to the recent 1.4 series. It used variable names
|
was introduced up to the recent 1.4 series. It used variable names
|
||||||
like STATUS, UTILITY, and LOADPCT. Many of these names go back to the
|
like STATUS, UTILITY, and LOADPCT. Many of these names go back to the
|
||||||
earliest prototypes of this software from 1997. At that point there
|
earliest prototypes of this software from 1997. At that point there
|
||||||
was no way to know that so many drivers would come along and introduce
|
was no way to know that so many drivers would come along and introduce
|
||||||
so many new variables and commands. The resulting mess grew out of
|
so many new variables and commands. The resulting mess grew out of
|
||||||
control over the years.
|
control over the years.
|
||||||
|
|
||||||
|
@ -522,9 +558,9 @@ Here's a table to make it easier to visualize:
|
||||||
|=============================================
|
|=============================================
|
||||||
|
|
||||||
Version 2.0, and more recent, do not contain backwards compatibility for
|
Version 2.0, and more recent, do not contain backwards compatibility for
|
||||||
the old protocol and variable/command names. As a result, 2.0 clients can't
|
the old protocol and variable/command names. As a result, 2.0 clients can't
|
||||||
talk to anything older than a 1.4 server. If you ask a 2.0 client to
|
talk to anything older than a 1.4 server. If you ask a 2.0 client to
|
||||||
fetch "STATUS", it will fail. You'll have to ask for "ups.status"
|
fetch "STATUS", it will fail. You'll have to ask for "ups.status"
|
||||||
instead.
|
instead.
|
||||||
|
|
||||||
Authors of separate monitoring programs should have used the 1.4 series
|
Authors of separate monitoring programs should have used the 1.4 series
|
||||||
|
|
4
TODO
4
TODO
|
@ -13,7 +13,7 @@ Roadmap
|
||||||
^^^
|
^^^
|
||||||
|
|
||||||
This release is focused on the website and documentation rewrite, using
|
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
|
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
|
solar panel driver, and the powerman internal approach of a generic engine with
|
||||||
a scripting interface is a cool idea.
|
a scripting interface is a cool idea.
|
||||||
Ref http://powerman.svn.sourceforge.net/viewvc/powerman/trunk/etc/apcpdu.dev?revision=969&view=markup
|
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
|
for native PDU support
|
||||||
- see how we can help and collaborate with DeviceKit-power
|
- see how we can help and collaborate with DeviceKit-power
|
||||||
|
|
130
UPGRADING
130
UPGRADING
|
@ -7,6 +7,132 @@ This file lists changes that affect users who installed older versions
|
||||||
of this software. When upgrading from an older version, be sure to
|
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.
|
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
|
Changes from 2.7.3 to 2.7.4
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
@ -171,7 +297,7 @@ Changes from 2.2.1 to 2.2.2
|
||||||
This enable the additional build and distribution of the static
|
This enable the additional build and distribution of the static
|
||||||
version of libupsclient, along with the pkg-config helper and manual
|
version of libupsclient, along with the pkg-config helper and manual
|
||||||
pages. The default configure option is to distribute only the shared
|
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).
|
"--disable-shared" configure option (distribute static only binaries).
|
||||||
- The UPS poweroff handling of the usbhid-ups driver has been reworked.
|
- The UPS poweroff handling of the usbhid-ups driver has been reworked.
|
||||||
Though regression is not expected, users of this driver are
|
Though regression is not expected, users of this driver are
|
||||||
|
@ -182,7 +308,7 @@ Changes from 2.2.0 to 2.2.1
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
- nothing that affects upgraded systems.
|
- 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
|
- Developers of external client application using libupsclient are
|
||||||
encouraged to rename their "UPSCONN" client structure to "UPSCONN_t"
|
encouraged to rename their "UPSCONN" client structure to "UPSCONN_t"
|
||||||
since the former will disappear by the release of NUT 2.4.
|
since the former will disappear by the release of NUT 2.4.
|
||||||
|
|
548
aclocal.m4
vendored
548
aclocal.m4
vendored
|
@ -1,6 +1,6 @@
|
||||||
# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
|
# generated automatically by aclocal 1.16.3 -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -20,146 +20,63 @@ You have another version of autoconf. It may work, but is not guaranteed to.
|
||||||
If you have problems, you may need to regenerate the build system entirely.
|
If you have problems, you may need to regenerate the build system entirely.
|
||||||
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
|
To do so, use the procedure documented by the package, typically 'autoreconf'.])])
|
||||||
|
|
||||||
# longlong.m4 serial 17
|
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||||
dnl Copyright (C) 1999-2007, 2009-2014 Free Software Foundation, Inc.
|
# serial 12 (pkg-config-0.29.2)
|
||||||
dnl This file is free software; the Free Software Foundation
|
|
||||||
dnl gives unlimited permission to copy and/or distribute it,
|
|
||||||
dnl with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
dnl From Paul Eggert.
|
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||||
|
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
|
||||||
|
dnl
|
||||||
|
dnl This program is free software; you can redistribute it and/or modify
|
||||||
|
dnl it under the terms of the GNU General Public License as published by
|
||||||
|
dnl the Free Software Foundation; either version 2 of the License, or
|
||||||
|
dnl (at your option) any later version.
|
||||||
|
dnl
|
||||||
|
dnl This program is distributed in the hope that it will be useful, but
|
||||||
|
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
dnl General Public License for more details.
|
||||||
|
dnl
|
||||||
|
dnl You should have received a copy of the GNU General Public License
|
||||||
|
dnl along with this program; if not, write to the Free Software
|
||||||
|
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
dnl 02111-1307, USA.
|
||||||
|
dnl
|
||||||
|
dnl As a special exception to the GNU General Public License, if you
|
||||||
|
dnl distribute this file as part of a program that contains a
|
||||||
|
dnl configuration script generated by Autoconf, you may include it under
|
||||||
|
dnl the same distribution terms that you use for the rest of that
|
||||||
|
dnl program.
|
||||||
|
|
||||||
# Define HAVE_LONG_LONG_INT if 'long long int' works.
|
dnl PKG_PREREQ(MIN-VERSION)
|
||||||
# This fixes a bug in Autoconf 2.61, and can be faster
|
dnl -----------------------
|
||||||
# than what's in Autoconf 2.62 through 2.68.
|
dnl Since: 0.29
|
||||||
|
dnl
|
||||||
|
dnl Verify that the version of the pkg-config macros are at least
|
||||||
|
dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
|
||||||
|
dnl installed version of pkg-config, this checks the developer's version
|
||||||
|
dnl of pkg.m4 when generating configure.
|
||||||
|
dnl
|
||||||
|
dnl To ensure that this macro is defined, also add:
|
||||||
|
dnl m4_ifndef([PKG_PREREQ],
|
||||||
|
dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
|
||||||
|
dnl
|
||||||
|
dnl See the "Since" comment for each macro you use to see what version
|
||||||
|
dnl of the macros you require.
|
||||||
|
m4_defun([PKG_PREREQ],
|
||||||
|
[m4_define([PKG_MACROS_VERSION], [0.29.2])
|
||||||
|
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
|
||||||
|
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
|
||||||
|
])dnl PKG_PREREQ
|
||||||
|
|
||||||
# Note: If the type 'long long int' exists but is only 32 bits large
|
dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
||||||
# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
|
dnl ----------------------------------
|
||||||
# defined. In this case you can treat 'long long int' like 'long int'.
|
dnl Since: 0.16
|
||||||
|
dnl
|
||||||
AC_DEFUN([AC_TYPE_LONG_LONG_INT],
|
dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
|
||||||
[
|
dnl first found in the path. Checks that the version of pkg-config found
|
||||||
AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
|
dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
|
||||||
AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
|
dnl used since that's the first version where most current features of
|
||||||
[ac_cv_type_long_long_int=yes
|
dnl pkg-config existed.
|
||||||
if test "x${ac_cv_prog_cc_c99-no}" = xno; then
|
|
||||||
ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
|
|
||||||
if test $ac_cv_type_long_long_int = yes; then
|
|
||||||
dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
|
|
||||||
dnl If cross compiling, assume the bug is not important, since
|
|
||||||
dnl nobody cross compiles for this platform as far as we know.
|
|
||||||
AC_RUN_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM(
|
|
||||||
[[@%:@include <limits.h>
|
|
||||||
@%:@ifndef LLONG_MAX
|
|
||||||
@%:@ define HALF \
|
|
||||||
(1LL << (sizeof (long long int) * CHAR_BIT - 2))
|
|
||||||
@%:@ define LLONG_MAX (HALF - 1 + HALF)
|
|
||||||
@%:@endif]],
|
|
||||||
[[long long int n = 1;
|
|
||||||
int i;
|
|
||||||
for (i = 0; ; i++)
|
|
||||||
{
|
|
||||||
long long int m = n << i;
|
|
||||||
if (m >> i != n)
|
|
||||||
return 1;
|
|
||||||
if (LLONG_MAX / 2 < m)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;]])],
|
|
||||||
[],
|
|
||||||
[ac_cv_type_long_long_int=no],
|
|
||||||
[:])
|
|
||||||
fi
|
|
||||||
fi])
|
|
||||||
if test $ac_cv_type_long_long_int = yes; then
|
|
||||||
AC_DEFINE([HAVE_LONG_LONG_INT], [1],
|
|
||||||
[Define to 1 if the system has the type 'long long int'.])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
|
|
||||||
# This fixes a bug in Autoconf 2.61, and can be faster
|
|
||||||
# than what's in Autoconf 2.62 through 2.68.
|
|
||||||
|
|
||||||
# Note: If the type 'unsigned long long int' exists but is only 32 bits
|
|
||||||
# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
|
|
||||||
# will not be defined. In this case you can treat 'unsigned long long int'
|
|
||||||
# like 'unsigned long int'.
|
|
||||||
|
|
||||||
AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
|
|
||||||
[
|
|
||||||
AC_CACHE_CHECK([for unsigned long long int],
|
|
||||||
[ac_cv_type_unsigned_long_long_int],
|
|
||||||
[ac_cv_type_unsigned_long_long_int=yes
|
|
||||||
if test "x${ac_cv_prog_cc_c99-no}" = xno; then
|
|
||||||
AC_LINK_IFELSE(
|
|
||||||
[_AC_TYPE_LONG_LONG_SNIPPET],
|
|
||||||
[],
|
|
||||||
[ac_cv_type_unsigned_long_long_int=no])
|
|
||||||
fi])
|
|
||||||
if test $ac_cv_type_unsigned_long_long_int = yes; then
|
|
||||||
AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
|
|
||||||
[Define to 1 if the system has the type 'unsigned long long int'.])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
# Expands to a C program that can be used to test for simultaneous support
|
|
||||||
# of 'long long' and 'unsigned long long'. We don't want to say that
|
|
||||||
# 'long long' is available if 'unsigned long long' is not, or vice versa,
|
|
||||||
# because too many programs rely on the symmetry between signed and unsigned
|
|
||||||
# integer types (excluding 'bool').
|
|
||||||
AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
|
|
||||||
[
|
|
||||||
AC_LANG_PROGRAM(
|
|
||||||
[[/* For now, do not test the preprocessor; as of 2007 there are too many
|
|
||||||
implementations with broken preprocessors. Perhaps this can
|
|
||||||
be revisited in 2012. In the meantime, code should not expect
|
|
||||||
#if to work with literals wider than 32 bits. */
|
|
||||||
/* Test literals. */
|
|
||||||
long long int ll = 9223372036854775807ll;
|
|
||||||
long long int nll = -9223372036854775807LL;
|
|
||||||
unsigned long long int ull = 18446744073709551615ULL;
|
|
||||||
/* Test constant expressions. */
|
|
||||||
typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
|
|
||||||
? 1 : -1)];
|
|
||||||
typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
|
|
||||||
? 1 : -1)];
|
|
||||||
int i = 63;]],
|
|
||||||
[[/* Test availability of runtime routines for shift and division. */
|
|
||||||
long long int llmax = 9223372036854775807ll;
|
|
||||||
unsigned long long int ullmax = 18446744073709551615ull;
|
|
||||||
return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
|
|
||||||
| (llmax / ll) | (llmax % ll)
|
|
||||||
| (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
|
|
||||||
| (ullmax / ull) | (ullmax % ull));]])
|
|
||||||
])
|
|
||||||
|
|
||||||
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
|
||||||
# serial 1 (pkg-config-0.24)
|
|
||||||
#
|
|
||||||
# Copyright © 2004 Scott James Remnant <scott@netsplit.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.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
|
||||||
# ----------------------------------
|
|
||||||
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
||||||
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
||||||
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
|
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
|
||||||
|
@ -181,18 +98,19 @@ if test -n "$PKG_CONFIG"; then
|
||||||
PKG_CONFIG=""
|
PKG_CONFIG=""
|
||||||
fi
|
fi
|
||||||
fi[]dnl
|
fi[]dnl
|
||||||
])# PKG_PROG_PKG_CONFIG
|
])dnl PKG_PROG_PKG_CONFIG
|
||||||
|
|
||||||
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||||
#
|
dnl -------------------------------------------------------------------
|
||||||
# Check to see whether a particular set of modules exists. Similar
|
dnl Since: 0.18
|
||||||
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
|
dnl
|
||||||
#
|
dnl Check to see whether a particular set of modules exists. Similar to
|
||||||
# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
|
||||||
# only at the first occurence in configure.ac, so if the first place
|
dnl
|
||||||
# it's called might be skipped (such as if it is within an "if", you
|
dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||||
# have to call PKG_CHECK_EXISTS manually
|
dnl only at the first occurence in configure.ac, so if the first place
|
||||||
# --------------------------------------------------------------
|
dnl it's called might be skipped (such as if it is within an "if", you
|
||||||
|
dnl have to call PKG_CHECK_EXISTS manually
|
||||||
AC_DEFUN([PKG_CHECK_EXISTS],
|
AC_DEFUN([PKG_CHECK_EXISTS],
|
||||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||||
if test -n "$PKG_CONFIG" && \
|
if test -n "$PKG_CONFIG" && \
|
||||||
|
@ -202,8 +120,10 @@ m4_ifvaln([$3], [else
|
||||||
$3])dnl
|
$3])dnl
|
||||||
fi])
|
fi])
|
||||||
|
|
||||||
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
||||||
# ---------------------------------------------
|
dnl ---------------------------------------------
|
||||||
|
dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
|
||||||
|
dnl pkg_failed based on the result.
|
||||||
m4_define([_PKG_CONFIG],
|
m4_define([_PKG_CONFIG],
|
||||||
[if test -n "$$1"; then
|
[if test -n "$$1"; then
|
||||||
pkg_cv_[]$1="$$1"
|
pkg_cv_[]$1="$$1"
|
||||||
|
@ -215,10 +135,11 @@ m4_define([_PKG_CONFIG],
|
||||||
else
|
else
|
||||||
pkg_failed=untried
|
pkg_failed=untried
|
||||||
fi[]dnl
|
fi[]dnl
|
||||||
])# _PKG_CONFIG
|
])dnl _PKG_CONFIG
|
||||||
|
|
||||||
# _PKG_SHORT_ERRORS_SUPPORTED
|
dnl _PKG_SHORT_ERRORS_SUPPORTED
|
||||||
# -----------------------------
|
dnl ---------------------------
|
||||||
|
dnl Internal check to see if pkg-config supports short errors.
|
||||||
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
|
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
|
||||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||||
|
@ -226,26 +147,24 @@ if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||||
else
|
else
|
||||||
_pkg_short_errors_supported=no
|
_pkg_short_errors_supported=no
|
||||||
fi[]dnl
|
fi[]dnl
|
||||||
])# _PKG_SHORT_ERRORS_SUPPORTED
|
])dnl _PKG_SHORT_ERRORS_SUPPORTED
|
||||||
|
|
||||||
|
|
||||||
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||||
# [ACTION-IF-NOT-FOUND])
|
dnl [ACTION-IF-NOT-FOUND])
|
||||||
#
|
dnl --------------------------------------------------------------
|
||||||
#
|
dnl Since: 0.4.0
|
||||||
# Note that if there is a possibility the first call to
|
dnl
|
||||||
# PKG_CHECK_MODULES might not happen, you should be sure to include an
|
dnl Note that if there is a possibility the first call to
|
||||||
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
|
||||||
#
|
dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
||||||
#
|
|
||||||
# --------------------------------------------------------------
|
|
||||||
AC_DEFUN([PKG_CHECK_MODULES],
|
AC_DEFUN([PKG_CHECK_MODULES],
|
||||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||||
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
||||||
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
||||||
|
|
||||||
pkg_failed=no
|
pkg_failed=no
|
||||||
AC_MSG_CHECKING([for $1])
|
AC_MSG_CHECKING([for $2])
|
||||||
|
|
||||||
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
||||||
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
||||||
|
@ -255,11 +174,11 @@ and $1[]_LIBS to avoid the need to call pkg-config.
|
||||||
See the pkg-config man page for more details.])
|
See the pkg-config man page for more details.])
|
||||||
|
|
||||||
if test $pkg_failed = yes; then
|
if test $pkg_failed = yes; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
_PKG_SHORT_ERRORS_SUPPORTED
|
_PKG_SHORT_ERRORS_SUPPORTED
|
||||||
if test $_pkg_short_errors_supported = yes; then
|
if test $_pkg_short_errors_supported = yes; then
|
||||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
|
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
|
||||||
else
|
else
|
||||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
|
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
|
||||||
fi
|
fi
|
||||||
# Put the nasty error message in config.log where it belongs
|
# Put the nasty error message in config.log where it belongs
|
||||||
|
@ -276,7 +195,7 @@ installed software in a non-standard prefix.
|
||||||
_PKG_TEXT])[]dnl
|
_PKG_TEXT])[]dnl
|
||||||
])
|
])
|
||||||
elif test $pkg_failed = untried; then
|
elif test $pkg_failed = untried; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
m4_default([$4], [AC_MSG_FAILURE(
|
m4_default([$4], [AC_MSG_FAILURE(
|
||||||
[The pkg-config script could not be found or is too old. Make sure it
|
[The pkg-config script could not be found or is too old. Make sure it
|
||||||
is in your PATH or set the PKG_CONFIG environment variable to the full
|
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||||
|
@ -292,16 +211,40 @@ else
|
||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
$3
|
$3
|
||||||
fi[]dnl
|
fi[]dnl
|
||||||
])# PKG_CHECK_MODULES
|
])dnl PKG_CHECK_MODULES
|
||||||
|
|
||||||
|
|
||||||
# PKG_INSTALLDIR(DIRECTORY)
|
dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||||
# -------------------------
|
dnl [ACTION-IF-NOT-FOUND])
|
||||||
# Substitutes the variable pkgconfigdir as the location where a module
|
dnl ---------------------------------------------------------------------
|
||||||
# should install pkg-config .pc files. By default the directory is
|
dnl Since: 0.29
|
||||||
# $libdir/pkgconfig, but the default can be changed by passing
|
dnl
|
||||||
# DIRECTORY. The user can override through the --with-pkgconfigdir
|
dnl Checks for existence of MODULES and gathers its build flags with
|
||||||
# parameter.
|
dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
|
||||||
|
dnl and VARIABLE-PREFIX_LIBS from --libs.
|
||||||
|
dnl
|
||||||
|
dnl Note that if there is a possibility the first call to
|
||||||
|
dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
|
||||||
|
dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
|
||||||
|
dnl configure.ac.
|
||||||
|
AC_DEFUN([PKG_CHECK_MODULES_STATIC],
|
||||||
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||||
|
_save_PKG_CONFIG=$PKG_CONFIG
|
||||||
|
PKG_CONFIG="$PKG_CONFIG --static"
|
||||||
|
PKG_CHECK_MODULES($@)
|
||||||
|
PKG_CONFIG=$_save_PKG_CONFIG[]dnl
|
||||||
|
])dnl PKG_CHECK_MODULES_STATIC
|
||||||
|
|
||||||
|
|
||||||
|
dnl PKG_INSTALLDIR([DIRECTORY])
|
||||||
|
dnl -------------------------
|
||||||
|
dnl Since: 0.27
|
||||||
|
dnl
|
||||||
|
dnl Substitutes the variable pkgconfigdir as the location where a module
|
||||||
|
dnl should install pkg-config .pc files. By default the directory is
|
||||||
|
dnl $libdir/pkgconfig, but the default can be changed by passing
|
||||||
|
dnl DIRECTORY. The user can override through the --with-pkgconfigdir
|
||||||
|
dnl parameter.
|
||||||
AC_DEFUN([PKG_INSTALLDIR],
|
AC_DEFUN([PKG_INSTALLDIR],
|
||||||
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
|
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
|
||||||
m4_pushdef([pkg_description],
|
m4_pushdef([pkg_description],
|
||||||
|
@ -312,16 +255,18 @@ AC_ARG_WITH([pkgconfigdir],
|
||||||
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
|
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
|
||||||
m4_popdef([pkg_default])
|
m4_popdef([pkg_default])
|
||||||
m4_popdef([pkg_description])
|
m4_popdef([pkg_description])
|
||||||
]) dnl PKG_INSTALLDIR
|
])dnl PKG_INSTALLDIR
|
||||||
|
|
||||||
|
|
||||||
# PKG_NOARCH_INSTALLDIR(DIRECTORY)
|
dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
|
||||||
# -------------------------
|
dnl --------------------------------
|
||||||
# Substitutes the variable noarch_pkgconfigdir as the location where a
|
dnl Since: 0.27
|
||||||
# module should install arch-independent pkg-config .pc files. By
|
dnl
|
||||||
# default the directory is $datadir/pkgconfig, but the default can be
|
dnl Substitutes the variable noarch_pkgconfigdir as the location where a
|
||||||
# changed by passing DIRECTORY. The user can override through the
|
dnl module should install arch-independent pkg-config .pc files. By
|
||||||
# --with-noarch-pkgconfigdir parameter.
|
dnl default the directory is $datadir/pkgconfig, but the default can be
|
||||||
|
dnl changed by passing DIRECTORY. The user can override through the
|
||||||
|
dnl --with-noarch-pkgconfigdir parameter.
|
||||||
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
|
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
|
||||||
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
|
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
|
||||||
m4_pushdef([pkg_description],
|
m4_pushdef([pkg_description],
|
||||||
|
@ -332,13 +277,15 @@ AC_ARG_WITH([noarch-pkgconfigdir],
|
||||||
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
|
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
|
||||||
m4_popdef([pkg_default])
|
m4_popdef([pkg_default])
|
||||||
m4_popdef([pkg_description])
|
m4_popdef([pkg_description])
|
||||||
]) dnl PKG_NOARCH_INSTALLDIR
|
])dnl PKG_NOARCH_INSTALLDIR
|
||||||
|
|
||||||
|
|
||||||
# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
|
dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
|
||||||
# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||||
# -------------------------------------------
|
dnl -------------------------------------------
|
||||||
# Retrieves the value of the pkg-config variable for the given module.
|
dnl Since: 0.28
|
||||||
|
dnl
|
||||||
|
dnl Retrieves the value of the pkg-config variable for the given module.
|
||||||
AC_DEFUN([PKG_CHECK_VAR],
|
AC_DEFUN([PKG_CHECK_VAR],
|
||||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||||
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
|
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
|
||||||
|
@ -347,9 +294,9 @@ _PKG_CONFIG([$1], [variable="][$3]["], [$2])
|
||||||
AS_VAR_COPY([$1], [pkg_cv_][$1])
|
AS_VAR_COPY([$1], [pkg_cv_][$1])
|
||||||
|
|
||||||
AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
||||||
])# PKG_CHECK_VAR
|
])dnl PKG_CHECK_VAR
|
||||||
|
|
||||||
# Copyright (C) 2002-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -361,10 +308,10 @@ AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
||||||
# generated from the m4 files accompanying Automake X.Y.
|
# generated from the m4 files accompanying Automake X.Y.
|
||||||
# (This private macro should not be called outside this file.)
|
# (This private macro should not be called outside this file.)
|
||||||
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
||||||
[am__api_version='1.14'
|
[am__api_version='1.16'
|
||||||
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
||||||
dnl require some minimum version. Point them to the right macro.
|
dnl require some minimum version. Point them to the right macro.
|
||||||
m4_if([$1], [1.14.1], [],
|
m4_if([$1], [1.16.3], [],
|
||||||
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -380,14 +327,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
|
||||||
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
||||||
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
||||||
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
||||||
[AM_AUTOMAKE_VERSION([1.14.1])dnl
|
[AM_AUTOMAKE_VERSION([1.16.3])dnl
|
||||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||||
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
||||||
|
|
||||||
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -439,7 +386,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
|
||||||
|
|
||||||
# AM_CONDITIONAL -*- Autoconf -*-
|
# AM_CONDITIONAL -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1997-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1997-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -470,7 +417,7 @@ AC_CONFIG_COMMANDS_PRE(
|
||||||
Usually this means the macro was only invoked conditionally.]])
|
Usually this means the macro was only invoked conditionally.]])
|
||||||
fi])])
|
fi])])
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -661,13 +608,12 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
|
||||||
|
|
||||||
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
# with or without modifications, as long as this notice is preserved.
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
|
||||||
# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||||
# ------------------------------
|
# ------------------------------
|
||||||
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
|
@ -675,49 +621,43 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
# Older Autoconf quotes --file arguments for eval, but not when files
|
# Older Autoconf quotes --file arguments for eval, but not when files
|
||||||
# are listed without --file. Let's play safe and only enable the eval
|
# are listed without --file. Let's play safe and only enable the eval
|
||||||
# if we detect the quoting.
|
# if we detect the quoting.
|
||||||
case $CONFIG_FILES in
|
# TODO: see whether this extra hack can be removed once we start
|
||||||
*\'*) eval set x "$CONFIG_FILES" ;;
|
# requiring Autoconf 2.70 or later.
|
||||||
*) set x $CONFIG_FILES ;;
|
AS_CASE([$CONFIG_FILES],
|
||||||
esac
|
[*\'*], [eval set x "$CONFIG_FILES"],
|
||||||
|
[*], [set x $CONFIG_FILES])
|
||||||
shift
|
shift
|
||||||
for mf
|
# Used to flag and report bootstrapping failures.
|
||||||
|
am_rc=0
|
||||||
|
for am_mf
|
||||||
do
|
do
|
||||||
# Strip MF so we end up with the name of the file.
|
# Strip MF so we end up with the name of the file.
|
||||||
mf=`echo "$mf" | sed -e 's/:.*$//'`
|
am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
|
||||||
# Check whether this is an Automake generated Makefile or not.
|
# Check whether this is an Automake generated Makefile which includes
|
||||||
# We used to match only the files named 'Makefile.in', but
|
# dependency-tracking related rules and includes.
|
||||||
# some people rename them; so instead we look at the file content.
|
# Grep'ing the whole file directly is not great: AIX grep has a line
|
||||||
# Grep'ing the first line is not enough: some people post-process
|
|
||||||
# each Makefile.in and add a new line on top of each file to say so.
|
|
||||||
# Grep'ing the whole file is not good either: AIX grep has a line
|
|
||||||
# limit of 2048, but all sed's we know have understand at least 4000.
|
# limit of 2048, but all sed's we know have understand at least 4000.
|
||||||
if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
|
sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
|
||||||
dirpart=`AS_DIRNAME("$mf")`
|
|| continue
|
||||||
else
|
am_dirpart=`AS_DIRNAME(["$am_mf"])`
|
||||||
continue
|
am_filepart=`AS_BASENAME(["$am_mf"])`
|
||||||
fi
|
AM_RUN_LOG([cd "$am_dirpart" \
|
||||||
# Extract the definition of DEPDIR, am__include, and am__quote
|
&& sed -e '/# am--include-marker/d' "$am_filepart" \
|
||||||
# from the Makefile without running 'make'.
|
| $MAKE -f - am--depfiles]) || am_rc=$?
|
||||||
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
|
|
||||||
test -z "$DEPDIR" && continue
|
|
||||||
am__include=`sed -n 's/^am__include = //p' < "$mf"`
|
|
||||||
test -z "$am__include" && continue
|
|
||||||
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
|
|
||||||
# Find all dependency output files, they are included files with
|
|
||||||
# $(DEPDIR) in their names. We invoke sed twice because it is the
|
|
||||||
# simplest approach to changing $(DEPDIR) to its actual value in the
|
|
||||||
# expansion.
|
|
||||||
for file in `sed -n "
|
|
||||||
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
|
|
||||||
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
|
|
||||||
# Make sure the directory exists.
|
|
||||||
test -f "$dirpart/$file" && continue
|
|
||||||
fdir=`AS_DIRNAME(["$file"])`
|
|
||||||
AS_MKDIR_P([$dirpart/$fdir])
|
|
||||||
# echo "creating $dirpart/$file"
|
|
||||||
echo '# dummy' > "$dirpart/$file"
|
|
||||||
done
|
|
||||||
done
|
done
|
||||||
|
if test $am_rc -ne 0; then
|
||||||
|
AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
|
||||||
|
for automatic dependency tracking. If GNU make was not used, consider
|
||||||
|
re-running the configure script with MAKE="gmake" (or whatever is
|
||||||
|
necessary). You can also try re-running configure with the
|
||||||
|
'--disable-dependency-tracking' option to at least be able to build
|
||||||
|
the package (albeit without support for automatic dependency tracking).])
|
||||||
|
fi
|
||||||
|
AS_UNSET([am_dirpart])
|
||||||
|
AS_UNSET([am_filepart])
|
||||||
|
AS_UNSET([am_mf])
|
||||||
|
AS_UNSET([am_rc])
|
||||||
|
rm -f conftest-deps.mk
|
||||||
}
|
}
|
||||||
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
|
||||||
|
|
||||||
|
@ -726,18 +666,17 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# This macro should only be invoked once -- use via AC_REQUIRE.
|
# This macro should only be invoked once -- use via AC_REQUIRE.
|
||||||
#
|
#
|
||||||
# This code is only required when automatic dependency tracking
|
# This code is only required when automatic dependency tracking is enabled.
|
||||||
# is enabled. FIXME. This creates each '.P' file that we will
|
# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
|
||||||
# need in order to bootstrap the dependency handling code.
|
# order to bootstrap the dependency handling code.
|
||||||
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
|
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
[AC_CONFIG_COMMANDS([depfiles],
|
[AC_CONFIG_COMMANDS([depfiles],
|
||||||
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
|
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
|
||||||
[AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
|
[AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
|
||||||
])
|
|
||||||
|
|
||||||
# Do all the work for Automake. -*- Autoconf -*-
|
# Do all the work for Automake. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -824,11 +763,11 @@ AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
|
||||||
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
||||||
# For better backward compatibility. To be removed once Automake 1.9.x
|
# For better backward compatibility. To be removed once Automake 1.9.x
|
||||||
# dies out for good. For more background, see:
|
# dies out for good. For more background, see:
|
||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
||||||
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
|
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
|
||||||
# We need awk for the "check" target. The system "awk" is bad on
|
# We need awk for the "check" target (and possibly the TAP driver). The
|
||||||
# some platforms.
|
# system "awk" is bad on some platforms.
|
||||||
AC_REQUIRE([AC_PROG_AWK])dnl
|
AC_REQUIRE([AC_PROG_AWK])dnl
|
||||||
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
||||||
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
|
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
|
||||||
|
@ -892,7 +831,7 @@ END
|
||||||
Aborting the configuration process, to ensure you take notice of the issue.
|
Aborting the configuration process, to ensure you take notice of the issue.
|
||||||
|
|
||||||
You can download and install GNU coreutils to get an 'rm' implementation
|
You can download and install GNU coreutils to get an 'rm' implementation
|
||||||
that behaves properly: <http://www.gnu.org/software/coreutils/>.
|
that behaves properly: <https://www.gnu.org/software/coreutils/>.
|
||||||
|
|
||||||
If you want to complete the configuration process using your problematic
|
If you want to complete the configuration process using your problematic
|
||||||
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
|
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
|
||||||
|
@ -902,6 +841,9 @@ END
|
||||||
AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
|
AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
dnl The trailing newline in this macro's definition is deliberate, for
|
||||||
|
dnl backward compatibility and to allow trailing 'dnl'-style comments
|
||||||
|
dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
|
dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
|
||||||
|
@ -931,7 +873,7 @@ for _am_header in $config_headers :; do
|
||||||
done
|
done
|
||||||
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -942,7 +884,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
|
||||||
# Define $install_sh.
|
# Define $install_sh.
|
||||||
AC_DEFUN([AM_PROG_INSTALL_SH],
|
AC_DEFUN([AM_PROG_INSTALL_SH],
|
||||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||||
if test x"${install_sh}" != xset; then
|
if test x"${install_sh+set}" != xset; then
|
||||||
case $am_aux_dir in
|
case $am_aux_dir in
|
||||||
*\ * | *\ *)
|
*\ * | *\ *)
|
||||||
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
|
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
|
||||||
|
@ -952,7 +894,7 @@ if test x"${install_sh}" != xset; then
|
||||||
fi
|
fi
|
||||||
AC_SUBST([install_sh])])
|
AC_SUBST([install_sh])])
|
||||||
|
|
||||||
# Copyright (C) 2003-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2003-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -974,7 +916,7 @@ AC_SUBST([am__leading_dot])])
|
||||||
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
|
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
|
||||||
# From Jim Meyering
|
# From Jim Meyering
|
||||||
|
|
||||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1009,7 +951,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
|
||||||
|
|
||||||
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1017,49 +959,42 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
|
||||||
|
|
||||||
# AM_MAKE_INCLUDE()
|
# AM_MAKE_INCLUDE()
|
||||||
# -----------------
|
# -----------------
|
||||||
# Check to see how make treats includes.
|
# Check whether make has an 'include' directive that can support all
|
||||||
|
# the idioms we need for our automatic dependency tracking code.
|
||||||
AC_DEFUN([AM_MAKE_INCLUDE],
|
AC_DEFUN([AM_MAKE_INCLUDE],
|
||||||
[am_make=${MAKE-make}
|
[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
|
||||||
cat > confinc << 'END'
|
cat > confinc.mk << 'END'
|
||||||
am__doit:
|
am__doit:
|
||||||
@echo this is the am__doit target
|
@echo this is the am__doit target >confinc.out
|
||||||
.PHONY: am__doit
|
.PHONY: am__doit
|
||||||
END
|
END
|
||||||
# If we don't find an include directive, just comment out the code.
|
|
||||||
AC_MSG_CHECKING([for style of include used by $am_make])
|
|
||||||
am__include="#"
|
am__include="#"
|
||||||
am__quote=
|
am__quote=
|
||||||
_am_result=none
|
# BSD make does it like this.
|
||||||
# First try GNU make style include.
|
echo '.include "confinc.mk" # ignored' > confmf.BSD
|
||||||
echo "include confinc" > confmf
|
# Other make implementations (GNU, Solaris 10, AIX) do it like this.
|
||||||
# Ignore all kinds of additional output from 'make'.
|
echo 'include confinc.mk # ignored' > confmf.GNU
|
||||||
case `$am_make -s -f confmf 2> /dev/null` in #(
|
_am_result=no
|
||||||
*the\ am__doit\ target*)
|
for s in GNU BSD; do
|
||||||
am__include=include
|
AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
|
||||||
am__quote=
|
AS_CASE([$?:`cat confinc.out 2>/dev/null`],
|
||||||
_am_result=GNU
|
['0:this is the am__doit target'],
|
||||||
;;
|
[AS_CASE([$s],
|
||||||
esac
|
[BSD], [am__include='.include' am__quote='"'],
|
||||||
# Now try BSD make style include.
|
[am__include='include' am__quote=''])])
|
||||||
if test "$am__include" = "#"; then
|
if test "$am__include" != "#"; then
|
||||||
echo '.include "confinc"' > confmf
|
_am_result="yes ($s style)"
|
||||||
case `$am_make -s -f confmf 2> /dev/null` in #(
|
break
|
||||||
*the\ am__doit\ target*)
|
fi
|
||||||
am__include=.include
|
done
|
||||||
am__quote="\""
|
rm -f confinc.* confmf.*
|
||||||
_am_result=BSD
|
AC_MSG_RESULT([${_am_result}])
|
||||||
;;
|
AC_SUBST([am__include])])
|
||||||
esac
|
AC_SUBST([am__quote])])
|
||||||
fi
|
|
||||||
AC_SUBST([am__include])
|
|
||||||
AC_SUBST([am__quote])
|
|
||||||
AC_MSG_RESULT([$_am_result])
|
|
||||||
rm -f confinc confmf
|
|
||||||
])
|
|
||||||
|
|
||||||
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1997-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1997-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1080,12 +1015,7 @@ AC_DEFUN([AM_MISSING_HAS_RUN],
|
||||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||||
AC_REQUIRE_AUX_FILE([missing])dnl
|
AC_REQUIRE_AUX_FILE([missing])dnl
|
||||||
if test x"${MISSING+set}" != xset; then
|
if test x"${MISSING+set}" != xset; then
|
||||||
case $am_aux_dir in
|
MISSING="\${SHELL} '$am_aux_dir/missing'"
|
||||||
*\ * | *\ *)
|
|
||||||
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
|
|
||||||
*)
|
|
||||||
MISSING="\${SHELL} $am_aux_dir/missing" ;;
|
|
||||||
esac
|
|
||||||
fi
|
fi
|
||||||
# Use eval to expand $SHELL
|
# Use eval to expand $SHELL
|
||||||
if eval "$MISSING --is-lightweight"; then
|
if eval "$MISSING --is-lightweight"; then
|
||||||
|
@ -1098,7 +1028,7 @@ fi
|
||||||
|
|
||||||
# Helper functions for option handling. -*- Autoconf -*-
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1127,7 +1057,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
|
||||||
AC_DEFUN([_AM_IF_OPTION],
|
AC_DEFUN([_AM_IF_OPTION],
|
||||||
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1174,7 +1104,7 @@ AC_LANG_POP([C])])
|
||||||
# For backward compatibility.
|
# For backward compatibility.
|
||||||
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
|
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1193,7 +1123,7 @@ AC_DEFUN([AM_RUN_LOG],
|
||||||
|
|
||||||
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1274,7 +1204,7 @@ AC_CONFIG_COMMANDS_PRE(
|
||||||
rm -f conftest.file
|
rm -f conftest.file
|
||||||
])
|
])
|
||||||
|
|
||||||
# Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2009-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1334,7 +1264,7 @@ AC_SUBST([AM_BACKSLASH])dnl
|
||||||
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1362,7 +1292,7 @@ fi
|
||||||
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
||||||
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
||||||
|
|
||||||
# Copyright (C) 2006-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2006-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1381,7 +1311,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
|
||||||
|
|
||||||
# Check how to create a tarball. -*- Autoconf -*-
|
# Check how to create a tarball. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2004-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2004-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -1512,7 +1442,11 @@ AC_SUBST([am__tar])
|
||||||
AC_SUBST([am__untar])
|
AC_SUBST([am__untar])
|
||||||
]) # _AM_PROG_TAR
|
]) # _AM_PROG_TAR
|
||||||
|
|
||||||
|
m4_include([m4/ax_c___attribute__.m4])
|
||||||
|
m4_include([m4/ax_c_pragmas.m4])
|
||||||
|
m4_include([m4/ax_check_compile_flag.m4])
|
||||||
m4_include([m4/ax_compare_version.m4])
|
m4_include([m4/ax_compare_version.m4])
|
||||||
|
m4_include([m4/ax_run_or_link_ifelse.m4])
|
||||||
m4_include([m4/libtool.m4])
|
m4_include([m4/libtool.m4])
|
||||||
m4_include([m4/ltoptions.m4])
|
m4_include([m4/ltoptions.m4])
|
||||||
m4_include([m4/ltsugar.m4])
|
m4_include([m4/ltsugar.m4])
|
||||||
|
@ -1520,10 +1454,13 @@ m4_include([m4/ltversion.m4])
|
||||||
m4_include([m4/lt~obsolete.m4])
|
m4_include([m4/lt~obsolete.m4])
|
||||||
m4_include([m4/nut_arg_with.m4])
|
m4_include([m4/nut_arg_with.m4])
|
||||||
m4_include([m4/nut_check_asciidoc.m4])
|
m4_include([m4/nut_check_asciidoc.m4])
|
||||||
|
m4_include([m4/nut_check_cppcheck.m4])
|
||||||
|
m4_include([m4/nut_check_headers_windows.m4])
|
||||||
m4_include([m4/nut_check_libavahi.m4])
|
m4_include([m4/nut_check_libavahi.m4])
|
||||||
m4_include([m4/nut_check_libfreeipmi.m4])
|
m4_include([m4/nut_check_libfreeipmi.m4])
|
||||||
m4_include([m4/nut_check_libgd.m4])
|
m4_include([m4/nut_check_libgd.m4])
|
||||||
m4_include([m4/nut_check_libltdl.m4])
|
m4_include([m4/nut_check_libltdl.m4])
|
||||||
|
m4_include([m4/nut_check_libmodbus.m4])
|
||||||
m4_include([m4/nut_check_libneon.m4])
|
m4_include([m4/nut_check_libneon.m4])
|
||||||
m4_include([m4/nut_check_libnetsnmp.m4])
|
m4_include([m4/nut_check_libnetsnmp.m4])
|
||||||
m4_include([m4/nut_check_libnss.m4])
|
m4_include([m4/nut_check_libnss.m4])
|
||||||
|
@ -1532,5 +1469,10 @@ m4_include([m4/nut_check_libpowerman.m4])
|
||||||
m4_include([m4/nut_check_libusb.m4])
|
m4_include([m4/nut_check_libusb.m4])
|
||||||
m4_include([m4/nut_check_libwrap.m4])
|
m4_include([m4/nut_check_libwrap.m4])
|
||||||
m4_include([m4/nut_check_os.m4])
|
m4_include([m4/nut_check_os.m4])
|
||||||
|
m4_include([m4/nut_check_pkgconfig.m4])
|
||||||
|
m4_include([m4/nut_check_python.m4])
|
||||||
|
m4_include([m4/nut_compiler_family.m4])
|
||||||
|
m4_include([m4/nut_func_getnameinfo_argtypes.m4])
|
||||||
m4_include([m4/nut_report_feature.m4])
|
m4_include([m4/nut_report_feature.m4])
|
||||||
|
m4_include([m4/nut_stash_warnings.m4])
|
||||||
m4_include([m4/nut_type_socklen_t.m4])
|
m4_include([m4/nut_type_socklen_t.m4])
|
||||||
|
|
|
@ -1,7 +1,19 @@
|
||||||
# Network UPS Tools: clients
|
# 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
|
# 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
|
if WITH_SSL
|
||||||
LDADD += $(LIBSSL_LIBS)
|
LDADD += $(LIBSSL_LIBS)
|
||||||
endif
|
endif
|
||||||
|
@ -20,9 +32,13 @@ endif
|
||||||
bin_PROGRAMS = upsc upslog upsrw upscmd
|
bin_PROGRAMS = upsc upslog upsrw upscmd
|
||||||
dist_bin_SCRIPTS = upssched-cmd
|
dist_bin_SCRIPTS = upssched-cmd
|
||||||
sbin_PROGRAMS = upsmon upssched
|
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
|
if WITH_DEV
|
||||||
include_HEADERS = upsclient.h ../include/parseconf.h nutclient.h
|
include_HEADERS = upsclient.h ../include/parseconf.h nutclient.h nutclientmem.h
|
||||||
endif
|
endif
|
||||||
if WITH_CGI
|
if WITH_CGI
|
||||||
cgiexec_PROGRAMS = upsstats.cgi upsimage.cgi upsset.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
|
upsmon_SOURCES = upsmon.c upsmon.h upsclient.h
|
||||||
|
|
||||||
upssched_SOURCES = upssched.c upssched.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_SOURCES = upsimage.c upsclient.h upsimagearg.h cgilib.c cgilib.h
|
||||||
upsimage_cgi_LDADD = $(LDADD) $(LIBGD_LDFLAGS)
|
upsimage_cgi_LDADD = $(LDADD) $(LIBGD_LDFLAGS)
|
||||||
|
@ -46,15 +62,44 @@ upsstats_cgi_SOURCES = upsstats.c upsclient.h status.h upsstats.h \
|
||||||
|
|
||||||
# not LDADD.
|
# not LDADD.
|
||||||
libupsclient_la_SOURCES = upsclient.c upsclient.h
|
libupsclient_la_SOURCES = upsclient.c upsclient.h
|
||||||
libupsclient_la_LIBADD = ../common/libcommonclient.la
|
libupsclient_la_LIBADD = $(top_builddir)/common/libcommonclient.la
|
||||||
if WITH_SSL
|
if WITH_SSL
|
||||||
libupsclient_la_LIBADD += $(LIBSSL_LIBS)
|
libupsclient_la_LIBADD += $(LIBSSL_LIBS)
|
||||||
endif
|
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
|
# 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_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
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -14,13 +14,21 @@
|
||||||
|
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
|
|
||||||
# Network UPS Tools: clients
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
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 = \
|
am__make_running_with_option = \
|
||||||
case $${target_option-} in \
|
case $${target_option-} in \
|
||||||
?) ;; \
|
?) ;; \
|
||||||
|
@ -90,24 +98,31 @@ target_triplet = @target@
|
||||||
bin_PROGRAMS = upsc$(EXEEXT) upslog$(EXEEXT) upsrw$(EXEEXT) \
|
bin_PROGRAMS = upsc$(EXEEXT) upslog$(EXEEXT) upsrw$(EXEEXT) \
|
||||||
upscmd$(EXEEXT)
|
upscmd$(EXEEXT)
|
||||||
sbin_PROGRAMS = upsmon$(EXEEXT) upssched$(EXEEXT)
|
sbin_PROGRAMS = upsmon$(EXEEXT) upssched$(EXEEXT)
|
||||||
|
@HAVE_CXX11_TRUE@am__append_4 = libnutclient.la libnutclientstub.la
|
||||||
@WITH_CGI_TRUE@cgiexec_PROGRAMS = upsstats.cgi$(EXEEXT) \
|
@WITH_CGI_TRUE@cgiexec_PROGRAMS = upsstats.cgi$(EXEEXT) \
|
||||||
@WITH_CGI_TRUE@ upsimage.cgi$(EXEEXT) upsset.cgi$(EXEEXT)
|
@WITH_CGI_TRUE@ upsimage.cgi$(EXEEXT) upsset.cgi$(EXEEXT)
|
||||||
@WITH_SSL_TRUE@am__append_4 = $(LIBSSL_LIBS)
|
@WITH_SSL_TRUE@am__append_5 = $(LIBSSL_LIBS)
|
||||||
|
@HAVE_CXX11_FALSE@am__append_6 = nutclient.h nutclient.cpp \
|
||||||
|
@HAVE_CXX11_FALSE@ nutclientmem.h nutclientmem.cpp
|
||||||
subdir = clients
|
subdir = clients
|
||||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
|
||||||
$(dist_bin_SCRIPTS) $(top_srcdir)/depcomp \
|
|
||||||
$(am__include_HEADERS_DIST)
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
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/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_asciidoc.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_libavahi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libltdl.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_libneon.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||||
|
@ -116,15 +131,26 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_os.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_report_feature.m4 \
|
||||||
|
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||||
$(top_srcdir)/configure.ac
|
$(top_srcdir)/configure.ac
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(dist_bin_SCRIPTS) \
|
||||||
|
$(am__include_HEADERS_DIST) $(am__DIST_COMMON)
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||||
CONFIG_CLEAN_FILES =
|
CONFIG_CLEAN_FILES =
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(cgiexecdir)" \
|
||||||
|
"$(DESTDIR)$(sbindir)" "$(DESTDIR)$(libdir)" \
|
||||||
|
"$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"
|
||||||
|
PROGRAMS = $(bin_PROGRAMS) $(cgiexec_PROGRAMS) $(sbin_PROGRAMS)
|
||||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||||
am__vpath_adj = case $$p in \
|
am__vpath_adj = case $$p in \
|
||||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||||
|
@ -152,12 +178,11 @@ am__uninstall_files_from_dir = { \
|
||||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||||
}
|
}
|
||||||
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
|
|
||||||
"$(DESTDIR)$(cgiexecdir)" "$(DESTDIR)$(sbindir)" \
|
|
||||||
"$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"
|
|
||||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||||
libnutclient_la_LIBADD =
|
@HAVE_CXX11_TRUE@libnutclient_la_DEPENDENCIES = \
|
||||||
am_libnutclient_la_OBJECTS = nutclient.lo
|
@HAVE_CXX11_TRUE@ $(top_builddir)/common/libcommonclient.la
|
||||||
|
am__libnutclient_la_SOURCES_DIST = nutclient.h nutclient.cpp
|
||||||
|
@HAVE_CXX11_TRUE@am_libnutclient_la_OBJECTS = nutclient.lo
|
||||||
libnutclient_la_OBJECTS = $(am_libnutclient_la_OBJECTS)
|
libnutclient_la_OBJECTS = $(am_libnutclient_la_OBJECTS)
|
||||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||||
|
@ -167,9 +192,20 @@ libnutclient_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
|
||||||
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
|
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
|
||||||
$(AM_CXXFLAGS) $(CXXFLAGS) $(libnutclient_la_LDFLAGS) \
|
$(AM_CXXFLAGS) $(CXXFLAGS) $(libnutclient_la_LDFLAGS) \
|
||||||
$(LDFLAGS) -o $@
|
$(LDFLAGS) -o $@
|
||||||
|
@HAVE_CXX11_TRUE@am_libnutclient_la_rpath = -rpath $(libdir)
|
||||||
|
@HAVE_CXX11_TRUE@libnutclientstub_la_DEPENDENCIES = libnutclient.la
|
||||||
|
am__libnutclientstub_la_SOURCES_DIST = nutclientmem.h nutclientmem.cpp
|
||||||
|
@HAVE_CXX11_TRUE@am_libnutclientstub_la_OBJECTS = nutclientmem.lo
|
||||||
|
libnutclientstub_la_OBJECTS = $(am_libnutclientstub_la_OBJECTS)
|
||||||
|
libnutclientstub_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
|
||||||
|
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
|
||||||
|
$(AM_CXXFLAGS) $(CXXFLAGS) $(libnutclientstub_la_LDFLAGS) \
|
||||||
|
$(LDFLAGS) -o $@
|
||||||
|
@HAVE_CXX11_TRUE@am_libnutclientstub_la_rpath = -rpath $(libdir)
|
||||||
am__DEPENDENCIES_1 =
|
am__DEPENDENCIES_1 =
|
||||||
@WITH_SSL_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
|
@WITH_SSL_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
|
||||||
libupsclient_la_DEPENDENCIES = ../common/libcommonclient.la \
|
libupsclient_la_DEPENDENCIES = \
|
||||||
|
$(top_builddir)/common/libcommonclient.la \
|
||||||
$(am__DEPENDENCIES_2)
|
$(am__DEPENDENCIES_2)
|
||||||
am_libupsclient_la_OBJECTS = upsclient.lo
|
am_libupsclient_la_OBJECTS = upsclient.lo
|
||||||
libupsclient_la_OBJECTS = $(am_libupsclient_la_OBJECTS)
|
libupsclient_la_OBJECTS = $(am_libupsclient_la_OBJECTS)
|
||||||
|
@ -177,52 +213,51 @@ libupsclient_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
|
||||||
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
|
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
|
||||||
$(AM_CFLAGS) $(CFLAGS) $(libupsclient_la_LDFLAGS) $(LDFLAGS) \
|
$(AM_CFLAGS) $(CFLAGS) $(libupsclient_la_LDFLAGS) $(LDFLAGS) \
|
||||||
-o $@
|
-o $@
|
||||||
PROGRAMS = $(bin_PROGRAMS) $(cgiexec_PROGRAMS) $(sbin_PROGRAMS)
|
|
||||||
am_upsc_OBJECTS = upsc.$(OBJEXT)
|
am_upsc_OBJECTS = upsc.$(OBJEXT)
|
||||||
upsc_OBJECTS = $(am_upsc_OBJECTS)
|
upsc_OBJECTS = $(am_upsc_OBJECTS)
|
||||||
upsc_LDADD = $(LDADD)
|
upsc_LDADD = $(LDADD)
|
||||||
upsc_DEPENDENCIES = ../common/libcommon.la libupsclient.la \
|
upsc_DEPENDENCIES = $(top_builddir)/common/libcommon.la \
|
||||||
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
libupsclient.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
||||||
am_upscmd_OBJECTS = upscmd.$(OBJEXT)
|
am_upscmd_OBJECTS = upscmd.$(OBJEXT)
|
||||||
upscmd_OBJECTS = $(am_upscmd_OBJECTS)
|
upscmd_OBJECTS = $(am_upscmd_OBJECTS)
|
||||||
upscmd_LDADD = $(LDADD)
|
upscmd_LDADD = $(LDADD)
|
||||||
upscmd_DEPENDENCIES = ../common/libcommon.la libupsclient.la \
|
upscmd_DEPENDENCIES = $(top_builddir)/common/libcommon.la \
|
||||||
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
libupsclient.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
||||||
am_upsimage_cgi_OBJECTS = upsimage.$(OBJEXT) cgilib.$(OBJEXT)
|
am_upsimage_cgi_OBJECTS = upsimage.$(OBJEXT) cgilib.$(OBJEXT)
|
||||||
upsimage_cgi_OBJECTS = $(am_upsimage_cgi_OBJECTS)
|
upsimage_cgi_OBJECTS = $(am_upsimage_cgi_OBJECTS)
|
||||||
am__DEPENDENCIES_3 = ../common/libcommon.la libupsclient.la \
|
am__DEPENDENCIES_3 = $(top_builddir)/common/libcommon.la \
|
||||||
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
libupsclient.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
||||||
upsimage_cgi_DEPENDENCIES = $(am__DEPENDENCIES_3) \
|
upsimage_cgi_DEPENDENCIES = $(am__DEPENDENCIES_3) \
|
||||||
$(am__DEPENDENCIES_1)
|
$(am__DEPENDENCIES_1)
|
||||||
am_upslog_OBJECTS = upslog.$(OBJEXT)
|
am_upslog_OBJECTS = upslog.$(OBJEXT)
|
||||||
upslog_OBJECTS = $(am_upslog_OBJECTS)
|
upslog_OBJECTS = $(am_upslog_OBJECTS)
|
||||||
upslog_LDADD = $(LDADD)
|
upslog_LDADD = $(LDADD)
|
||||||
upslog_DEPENDENCIES = ../common/libcommon.la libupsclient.la \
|
upslog_DEPENDENCIES = $(top_builddir)/common/libcommon.la \
|
||||||
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
libupsclient.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
||||||
am_upsmon_OBJECTS = upsmon.$(OBJEXT)
|
am_upsmon_OBJECTS = upsmon.$(OBJEXT)
|
||||||
upsmon_OBJECTS = $(am_upsmon_OBJECTS)
|
upsmon_OBJECTS = $(am_upsmon_OBJECTS)
|
||||||
upsmon_LDADD = $(LDADD)
|
upsmon_LDADD = $(LDADD)
|
||||||
upsmon_DEPENDENCIES = ../common/libcommon.la libupsclient.la \
|
upsmon_DEPENDENCIES = $(top_builddir)/common/libcommon.la \
|
||||||
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
libupsclient.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
||||||
am_upsrw_OBJECTS = upsrw.$(OBJEXT)
|
am_upsrw_OBJECTS = upsrw.$(OBJEXT)
|
||||||
upsrw_OBJECTS = $(am_upsrw_OBJECTS)
|
upsrw_OBJECTS = $(am_upsrw_OBJECTS)
|
||||||
upsrw_LDADD = $(LDADD)
|
upsrw_LDADD = $(LDADD)
|
||||||
upsrw_DEPENDENCIES = ../common/libcommon.la libupsclient.la \
|
upsrw_DEPENDENCIES = $(top_builddir)/common/libcommon.la \
|
||||||
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
libupsclient.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
||||||
am_upssched_OBJECTS = upssched.$(OBJEXT)
|
am_upssched_OBJECTS = upssched.$(OBJEXT)
|
||||||
upssched_OBJECTS = $(am_upssched_OBJECTS)
|
upssched_OBJECTS = $(am_upssched_OBJECTS)
|
||||||
upssched_DEPENDENCIES = ../common/libcommon.la \
|
upssched_DEPENDENCIES = $(top_builddir)/common/libcommon.la \
|
||||||
../common/libparseconf.la $(am__DEPENDENCIES_1)
|
$(top_builddir)/common/libparseconf.la $(am__DEPENDENCIES_1)
|
||||||
am_upsset_cgi_OBJECTS = upsset.$(OBJEXT) cgilib.$(OBJEXT)
|
am_upsset_cgi_OBJECTS = upsset.$(OBJEXT) cgilib.$(OBJEXT)
|
||||||
upsset_cgi_OBJECTS = $(am_upsset_cgi_OBJECTS)
|
upsset_cgi_OBJECTS = $(am_upsset_cgi_OBJECTS)
|
||||||
upsset_cgi_LDADD = $(LDADD)
|
upsset_cgi_LDADD = $(LDADD)
|
||||||
upsset_cgi_DEPENDENCIES = ../common/libcommon.la libupsclient.la \
|
upsset_cgi_DEPENDENCIES = $(top_builddir)/common/libcommon.la \
|
||||||
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
libupsclient.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
||||||
am_upsstats_cgi_OBJECTS = upsstats.$(OBJEXT) cgilib.$(OBJEXT)
|
am_upsstats_cgi_OBJECTS = upsstats.$(OBJEXT) cgilib.$(OBJEXT)
|
||||||
upsstats_cgi_OBJECTS = $(am_upsstats_cgi_OBJECTS)
|
upsstats_cgi_OBJECTS = $(am_upsstats_cgi_OBJECTS)
|
||||||
upsstats_cgi_LDADD = $(LDADD)
|
upsstats_cgi_LDADD = $(LDADD)
|
||||||
upsstats_cgi_DEPENDENCIES = ../common/libcommon.la libupsclient.la \
|
upsstats_cgi_DEPENDENCIES = $(top_builddir)/common/libcommon.la \
|
||||||
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
libupsclient.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
|
||||||
SCRIPTS = $(dist_bin_SCRIPTS)
|
SCRIPTS = $(dist_bin_SCRIPTS)
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
@ -238,7 +273,14 @@ am__v_at_0 = @
|
||||||
am__v_at_1 =
|
am__v_at_1 =
|
||||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include
|
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include
|
||||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||||
am__depfiles_maybe = depfiles
|
am__maybe_remake_depfiles = depfiles
|
||||||
|
am__depfiles_remade = ./$(DEPDIR)/cgilib.Po ./$(DEPDIR)/nutclient.Plo \
|
||||||
|
./$(DEPDIR)/nutclientmem.Plo ./$(DEPDIR)/upsc.Po \
|
||||||
|
./$(DEPDIR)/upsclient.Plo ./$(DEPDIR)/upscmd.Po \
|
||||||
|
./$(DEPDIR)/upsimage.Po ./$(DEPDIR)/upslog.Po \
|
||||||
|
./$(DEPDIR)/upsmon.Po ./$(DEPDIR)/upsrw.Po \
|
||||||
|
./$(DEPDIR)/upssched.Po ./$(DEPDIR)/upsset.Po \
|
||||||
|
./$(DEPDIR)/upsstats.Po
|
||||||
am__mv = mv -f
|
am__mv = mv -f
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
@ -276,15 +318,16 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
|
||||||
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
|
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
|
||||||
am__v_CXXLD_0 = @echo " CXXLD " $@;
|
am__v_CXXLD_0 = @echo " CXXLD " $@;
|
||||||
am__v_CXXLD_1 =
|
am__v_CXXLD_1 =
|
||||||
SOURCES = $(libnutclient_la_SOURCES) $(libupsclient_la_SOURCES) \
|
SOURCES = $(libnutclient_la_SOURCES) $(libnutclientstub_la_SOURCES) \
|
||||||
$(upsc_SOURCES) $(upscmd_SOURCES) $(upsimage_cgi_SOURCES) \
|
$(libupsclient_la_SOURCES) $(upsc_SOURCES) $(upscmd_SOURCES) \
|
||||||
$(upslog_SOURCES) $(upsmon_SOURCES) $(upsrw_SOURCES) \
|
$(upsimage_cgi_SOURCES) $(upslog_SOURCES) $(upsmon_SOURCES) \
|
||||||
$(upssched_SOURCES) $(upsset_cgi_SOURCES) \
|
$(upsrw_SOURCES) $(upssched_SOURCES) $(upsset_cgi_SOURCES) \
|
||||||
$(upsstats_cgi_SOURCES)
|
$(upsstats_cgi_SOURCES)
|
||||||
DIST_SOURCES = $(libnutclient_la_SOURCES) $(libupsclient_la_SOURCES) \
|
DIST_SOURCES = $(am__libnutclient_la_SOURCES_DIST) \
|
||||||
$(upsc_SOURCES) $(upscmd_SOURCES) $(upsimage_cgi_SOURCES) \
|
$(am__libnutclientstub_la_SOURCES_DIST) \
|
||||||
$(upslog_SOURCES) $(upsmon_SOURCES) $(upsrw_SOURCES) \
|
$(libupsclient_la_SOURCES) $(upsc_SOURCES) $(upscmd_SOURCES) \
|
||||||
$(upssched_SOURCES) $(upsset_cgi_SOURCES) \
|
$(upsimage_cgi_SOURCES) $(upslog_SOURCES) $(upsmon_SOURCES) \
|
||||||
|
$(upsrw_SOURCES) $(upssched_SOURCES) $(upsset_cgi_SOURCES) \
|
||||||
$(upsstats_cgi_SOURCES)
|
$(upsstats_cgi_SOURCES)
|
||||||
am__can_run_installinfo = \
|
am__can_run_installinfo = \
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
@ -292,7 +335,7 @@ am__can_run_installinfo = \
|
||||||
*) (install-info --version) >/dev/null 2>&1;; \
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
esac
|
esac
|
||||||
am__include_HEADERS_DIST = upsclient.h ../include/parseconf.h \
|
am__include_HEADERS_DIST = upsclient.h ../include/parseconf.h \
|
||||||
nutclient.h
|
nutclient.h nutclientmem.h
|
||||||
HEADERS = $(include_HEADERS)
|
HEADERS = $(include_HEADERS)
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
# Read a list of newline-separated strings from the standard input,
|
# Read a list of newline-separated strings from the standard input,
|
||||||
|
@ -313,6 +356,7 @@ am__define_uniq_tagged_files = \
|
||||||
done | $(am__uniquify_input)`
|
done | $(am__uniquify_input)`
|
||||||
ETAGS = etags
|
ETAGS = etags
|
||||||
CTAGS = ctags
|
CTAGS = ctags
|
||||||
|
am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
A2X = @A2X@
|
A2X = @A2X@
|
||||||
ACLOCAL = @ACLOCAL@
|
ACLOCAL = @ACLOCAL@
|
||||||
|
@ -321,6 +365,7 @@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
ASCIIDOC = @ASCIIDOC@
|
ASCIIDOC = @ASCIIDOC@
|
||||||
ASPELL = @ASPELL@
|
ASPELL = @ASPELL@
|
||||||
|
AUGPARSE = @AUGPARSE@
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -331,6 +376,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CONFPATH = @CONFPATH@
|
CONFPATH = @CONFPATH@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
|
CPPCHECK = @CPPCHECK@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||||
|
@ -344,6 +390,7 @@ DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
DLLTOOL = @DLLTOOL@
|
DLLTOOL = @DLLTOOL@
|
||||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||||
|
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||||
|
@ -356,6 +403,7 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
@ -373,6 +421,8 @@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||||
|
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||||
|
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||||
|
@ -383,21 +433,29 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||||
|
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||||
|
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
LN_S = @LN_S@
|
LN_S = @LN_S@
|
||||||
|
LN_S_R = @LN_S_R@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
NETLIBS = @NETLIBS@
|
NETLIBS = @NETLIBS@
|
||||||
|
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||||
NM = @NM@
|
NM = @NM@
|
||||||
NMEDIT = @NMEDIT@
|
NMEDIT = @NMEDIT@
|
||||||
|
NUT_DATADIR = @NUT_DATADIR@
|
||||||
|
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||||
NUT_NETVERSION = @NUT_NETVERSION@
|
NUT_NETVERSION = @NUT_NETVERSION@
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -417,6 +475,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
||||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
PORT = @PORT@
|
PORT = @PORT@
|
||||||
|
PYTHON = @PYTHON@
|
||||||
|
PYTHON2 = @PYTHON2@
|
||||||
|
PYTHON3 = @PYTHON3@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||||
RUN_AS_USER = @RUN_AS_USER@
|
RUN_AS_USER = @RUN_AS_USER@
|
||||||
|
@ -430,6 +491,7 @@ STATEPATH = @STATEPATH@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
SUN_LIBUSB = @SUN_LIBUSB@
|
SUN_LIBUSB = @SUN_LIBUSB@
|
||||||
TREE_VERSION = @TREE_VERSION@
|
TREE_VERSION = @TREE_VERSION@
|
||||||
|
VALGRIND = @VALGRIND@
|
||||||
VERSION = @VERSION@
|
VERSION = @VERSION@
|
||||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||||
XMLLINT = @XMLLINT@
|
XMLLINT = @XMLLINT@
|
||||||
|
@ -447,6 +509,7 @@ am__leading_dot = @am__leading_dot@
|
||||||
am__quote = @am__quote@
|
am__quote = @am__quote@
|
||||||
am__tar = @am__tar@
|
am__tar = @am__tar@
|
||||||
am__untar = @am__untar@
|
am__untar = @am__untar@
|
||||||
|
auglensdir = @auglensdir@
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
build = @build@
|
build = @build@
|
||||||
build_alias = @build_alias@
|
build_alias = @build_alias@
|
||||||
|
@ -460,6 +523,9 @@ datarootdir = @datarootdir@
|
||||||
devddir = @devddir@
|
devddir = @devddir@
|
||||||
docdir = @docdir@
|
docdir = @docdir@
|
||||||
driverexecdir = @driverexecdir@
|
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@
|
dvidir = @dvidir@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
host = @host@
|
host = @host@
|
||||||
|
@ -485,12 +551,14 @@ pkgconfigdir = @pkgconfigdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
systemdshutdowndir = @systemdshutdowndir@
|
||||||
systemdsystemunitdir = @systemdsystemunitdir@
|
systemdsystemunitdir = @systemdsystemunitdir@
|
||||||
|
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||||
target = @target@
|
target = @target@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
target_cpu = @target_cpu@
|
target_cpu = @target_cpu@
|
||||||
|
@ -501,8 +569,16 @@ top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
udevdir = @udevdir@
|
udevdir = @udevdir@
|
||||||
|
|
||||||
|
# Network UPS Tools: clients
|
||||||
|
EXTRA_DIST = $(am__append_6)
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
# by default, link programs in this directory with libcommon.a
|
# 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) \
|
||||||
$(am__append_1)
|
$(am__append_1)
|
||||||
|
|
||||||
# Avoid per-target CFLAGS, because this will prevent re-use of object
|
# Avoid per-target CFLAGS, because this will prevent re-use of object
|
||||||
|
@ -510,15 +586,15 @@ LDADD = ../common/libcommon.la libupsclient.la $(NETLIBS) \
|
||||||
# but only add them if we really use the target.
|
# but only add them if we really use the target.
|
||||||
AM_CFLAGS = -I$(top_srcdir)/include $(am__append_2) $(am__append_3)
|
AM_CFLAGS = -I$(top_srcdir)/include $(am__append_2) $(am__append_3)
|
||||||
dist_bin_SCRIPTS = upssched-cmd
|
dist_bin_SCRIPTS = upssched-cmd
|
||||||
lib_LTLIBRARIES = libupsclient.la libnutclient.la
|
lib_LTLIBRARIES = libupsclient.la $(am__append_4)
|
||||||
@WITH_DEV_TRUE@include_HEADERS = upsclient.h ../include/parseconf.h nutclient.h
|
@WITH_DEV_TRUE@include_HEADERS = upsclient.h ../include/parseconf.h nutclient.h nutclientmem.h
|
||||||
upsc_SOURCES = upsc.c upsclient.h
|
upsc_SOURCES = upsc.c upsclient.h
|
||||||
upscmd_SOURCES = upscmd.c upsclient.h
|
upscmd_SOURCES = upscmd.c upsclient.h
|
||||||
upsrw_SOURCES = upsrw.c upsclient.h
|
upsrw_SOURCES = upsrw.c upsclient.h
|
||||||
upslog_SOURCES = upslog.c upsclient.h upslog.h
|
upslog_SOURCES = upslog.c upsclient.h upslog.h
|
||||||
upsmon_SOURCES = upsmon.c upsmon.h upsclient.h
|
upsmon_SOURCES = upsmon.c upsmon.h upsclient.h
|
||||||
upssched_SOURCES = upssched.c upssched.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_SOURCES = upsimage.c upsclient.h upsimagearg.h cgilib.c cgilib.h
|
||||||
upsimage_cgi_LDADD = $(LDADD) $(LIBGD_LDFLAGS)
|
upsimage_cgi_LDADD = $(LDADD) $(LIBGD_LDFLAGS)
|
||||||
upsset_cgi_SOURCES = upsset.c upsclient.h cgilib.c cgilib.h
|
upsset_cgi_SOURCES = upsset.c upsclient.h cgilib.c cgilib.h
|
||||||
|
@ -528,13 +604,29 @@ upsstats_cgi_SOURCES = upsstats.c upsclient.h status.h upsstats.h \
|
||||||
|
|
||||||
# not LDADD.
|
# not LDADD.
|
||||||
libupsclient_la_SOURCES = upsclient.c upsclient.h
|
libupsclient_la_SOURCES = upsclient.c upsclient.h
|
||||||
libupsclient_la_LIBADD = ../common/libcommonclient.la $(am__append_4)
|
libupsclient_la_LIBADD = $(top_builddir)/common/libcommonclient.la \
|
||||||
|
$(am__append_5)
|
||||||
|
|
||||||
|
# Below we set API versions of public libraries
|
||||||
|
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
||||||
|
# Note that changes here may have to be reflected in packaging (the shared
|
||||||
|
# object .so names would differ)
|
||||||
|
|
||||||
# libupsclient version information
|
# libupsclient version information
|
||||||
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
libupsclient_la_LDFLAGS = -version-info 6:0:0 -export-symbols-regex ^upscli_
|
||||||
libupsclient_la_LDFLAGS = -version-info 4:0:0
|
|
||||||
libnutclient_la_SOURCES = nutclient.h nutclient.cpp
|
# libnutclient version information and build
|
||||||
libnutclient_la_LDFLAGS = -version-info 0:0:0
|
@HAVE_CXX11_TRUE@libnutclient_la_SOURCES = nutclient.h nutclient.cpp
|
||||||
|
@HAVE_CXX11_TRUE@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:
|
||||||
|
@HAVE_CXX11_TRUE@libnutclient_la_LIBADD = $(top_builddir)/common/libcommonclient.la
|
||||||
|
|
||||||
|
# libnutclientstub version information and build
|
||||||
|
@HAVE_CXX11_TRUE@libnutclientstub_la_SOURCES = nutclientmem.h nutclientmem.cpp
|
||||||
|
@HAVE_CXX11_TRUE@libnutclientstub_la_LDFLAGS = -version-info 1:0:0
|
||||||
|
@HAVE_CXX11_TRUE@libnutclientstub_la_LIBADD = libnutclient.la
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
@ -551,14 +643,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu clients/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu clients/Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu clients/Makefile
|
$(AUTOMAKE) --gnu clients/Makefile
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' 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__depfiles_maybe);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
@ -569,47 +660,6 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||||
$(am__aclocal_m4_deps):
|
$(am__aclocal_m4_deps):
|
||||||
|
|
||||||
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
|
||||||
list2=; for p in $$list; do \
|
|
||||||
if test -f $$p; then \
|
|
||||||
list2="$$list2 $$p"; \
|
|
||||||
else :; fi; \
|
|
||||||
done; \
|
|
||||||
test -z "$$list2" || { \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
|
|
||||||
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
|
|
||||||
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
|
|
||||||
}
|
|
||||||
|
|
||||||
uninstall-libLTLIBRARIES:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
|
||||||
for p in $$list; do \
|
|
||||||
$(am__strip_dir) \
|
|
||||||
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
|
|
||||||
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
|
|
||||||
done
|
|
||||||
|
|
||||||
clean-libLTLIBRARIES:
|
|
||||||
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
|
||||||
@list='$(lib_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}; \
|
|
||||||
}
|
|
||||||
|
|
||||||
libnutclient.la: $(libnutclient_la_OBJECTS) $(libnutclient_la_DEPENDENCIES) $(EXTRA_libnutclient_la_DEPENDENCIES)
|
|
||||||
$(AM_V_CXXLD)$(libnutclient_la_LINK) -rpath $(libdir) $(libnutclient_la_OBJECTS) $(libnutclient_la_LIBADD) $(LIBS)
|
|
||||||
|
|
||||||
libupsclient.la: $(libupsclient_la_OBJECTS) $(libupsclient_la_DEPENDENCIES) $(EXTRA_libupsclient_la_DEPENDENCIES)
|
|
||||||
$(AM_V_CCLD)$(libupsclient_la_LINK) -rpath $(libdir) $(libupsclient_la_OBJECTS) $(libupsclient_la_LIBADD) $(LIBS)
|
|
||||||
install-binPROGRAMS: $(bin_PROGRAMS)
|
install-binPROGRAMS: $(bin_PROGRAMS)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
|
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
|
||||||
|
@ -758,6 +808,50 @@ clean-sbinPROGRAMS:
|
||||||
echo " rm -f" $$list; \
|
echo " rm -f" $$list; \
|
||||||
rm -f $$list
|
rm -f $$list
|
||||||
|
|
||||||
|
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
||||||
|
list2=; for p in $$list; do \
|
||||||
|
if test -f $$p; then \
|
||||||
|
list2="$$list2 $$p"; \
|
||||||
|
else :; fi; \
|
||||||
|
done; \
|
||||||
|
test -z "$$list2" || { \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
|
||||||
|
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
|
||||||
|
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
|
||||||
|
}
|
||||||
|
|
||||||
|
uninstall-libLTLIBRARIES:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
||||||
|
for p in $$list; do \
|
||||||
|
$(am__strip_dir) \
|
||||||
|
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
|
||||||
|
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean-libLTLIBRARIES:
|
||||||
|
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
||||||
|
@list='$(lib_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}; \
|
||||||
|
}
|
||||||
|
|
||||||
|
libnutclient.la: $(libnutclient_la_OBJECTS) $(libnutclient_la_DEPENDENCIES) $(EXTRA_libnutclient_la_DEPENDENCIES)
|
||||||
|
$(AM_V_CXXLD)$(libnutclient_la_LINK) $(am_libnutclient_la_rpath) $(libnutclient_la_OBJECTS) $(libnutclient_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
|
libnutclientstub.la: $(libnutclientstub_la_OBJECTS) $(libnutclientstub_la_DEPENDENCIES) $(EXTRA_libnutclientstub_la_DEPENDENCIES)
|
||||||
|
$(AM_V_CXXLD)$(libnutclientstub_la_LINK) $(am_libnutclientstub_la_rpath) $(libnutclientstub_la_OBJECTS) $(libnutclientstub_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
|
libupsclient.la: $(libupsclient_la_OBJECTS) $(libupsclient_la_DEPENDENCIES) $(EXTRA_libupsclient_la_DEPENDENCIES)
|
||||||
|
$(AM_V_CCLD)$(libupsclient_la_LINK) -rpath $(libdir) $(libupsclient_la_OBJECTS) $(libupsclient_la_LIBADD) $(LIBS)
|
||||||
|
|
||||||
upsc$(EXEEXT): $(upsc_OBJECTS) $(upsc_DEPENDENCIES) $(EXTRA_upsc_DEPENDENCIES)
|
upsc$(EXEEXT): $(upsc_OBJECTS) $(upsc_DEPENDENCIES) $(EXTRA_upsc_DEPENDENCIES)
|
||||||
@rm -f upsc$(EXEEXT)
|
@rm -f upsc$(EXEEXT)
|
||||||
$(AM_V_CCLD)$(LINK) $(upsc_OBJECTS) $(upsc_LDADD) $(LIBS)
|
$(AM_V_CCLD)$(LINK) $(upsc_OBJECTS) $(upsc_LDADD) $(LIBS)
|
||||||
|
@ -835,18 +929,25 @@ mostlyclean-compile:
|
||||||
distclean-compile:
|
distclean-compile:
|
||||||
-rm -f *.tab.c
|
-rm -f *.tab.c
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgilib.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgilib.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutclient.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutclient.Plo@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsc.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nutclientmem.Plo@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsclient.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsc.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upscmd.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsclient.Plo@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsimage.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upscmd.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upslog.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsimage.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsmon.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upslog.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsrw.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsmon.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upssched.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsrw.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsset.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upssched.Po@am__quote@ # am--include-marker
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsstats.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsset.Po@am__quote@ # am--include-marker
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsstats.Po@am__quote@ # am--include-marker
|
||||||
|
|
||||||
|
$(am__depfiles_remade):
|
||||||
|
@$(MKDIR_P) $(@D)
|
||||||
|
@echo '# dummy' >$@-t && $(am__mv) $@-t $@
|
||||||
|
|
||||||
|
am--depfiles: $(am__depfiles_remade)
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
||||||
|
@ -975,7 +1076,10 @@ cscopelist-am: $(am__tagged_files)
|
||||||
distclean-tags:
|
distclean-tags:
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH 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'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
list='$(DISTFILES)'; \
|
list='$(DISTFILES)'; \
|
||||||
|
@ -1007,11 +1111,11 @@ distdir: $(DISTFILES)
|
||||||
done
|
done
|
||||||
check-am: all-am
|
check-am: all-am
|
||||||
check: check-am
|
check: check-am
|
||||||
all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(HEADERS)
|
all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(SCRIPTS) $(HEADERS)
|
||||||
install-binPROGRAMS: install-libLTLIBRARIES
|
install-binPROGRAMS: install-libLTLIBRARIES
|
||||||
|
|
||||||
installdirs:
|
installdirs:
|
||||||
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(cgiexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \
|
for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(cgiexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
done
|
done
|
||||||
install: install-am
|
install: install-am
|
||||||
|
@ -1044,6 +1148,7 @@ distclean-generic:
|
||||||
maintainer-clean-generic:
|
maintainer-clean-generic:
|
||||||
@echo "This command is intended for maintainers to use"
|
@echo "This command is intended for maintainers to use"
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
clean: clean-am
|
clean: clean-am
|
||||||
|
|
||||||
clean-am: clean-binPROGRAMS clean-cgiexecPROGRAMS clean-generic \
|
clean-am: clean-binPROGRAMS clean-cgiexecPROGRAMS clean-generic \
|
||||||
|
@ -1051,7 +1156,19 @@ clean-am: clean-binPROGRAMS clean-cgiexecPROGRAMS clean-generic \
|
||||||
mostlyclean-am
|
mostlyclean-am
|
||||||
|
|
||||||
distclean: distclean-am
|
distclean: distclean-am
|
||||||
-rm -rf ./$(DEPDIR)
|
-rm -f ./$(DEPDIR)/cgilib.Po
|
||||||
|
-rm -f ./$(DEPDIR)/nutclient.Plo
|
||||||
|
-rm -f ./$(DEPDIR)/nutclientmem.Plo
|
||||||
|
-rm -f ./$(DEPDIR)/upsc.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsclient.Plo
|
||||||
|
-rm -f ./$(DEPDIR)/upscmd.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsimage.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upslog.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsmon.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsrw.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upssched.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsset.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsstats.Po
|
||||||
-rm -f Makefile
|
-rm -f Makefile
|
||||||
distclean-am: clean-am distclean-compile distclean-generic \
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
distclean-tags
|
distclean-tags
|
||||||
|
@ -1099,7 +1216,19 @@ install-ps-am:
|
||||||
installcheck-am:
|
installcheck-am:
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
maintainer-clean: maintainer-clean-am
|
||||||
-rm -rf ./$(DEPDIR)
|
-rm -f ./$(DEPDIR)/cgilib.Po
|
||||||
|
-rm -f ./$(DEPDIR)/nutclient.Plo
|
||||||
|
-rm -f ./$(DEPDIR)/nutclientmem.Plo
|
||||||
|
-rm -f ./$(DEPDIR)/upsc.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsclient.Plo
|
||||||
|
-rm -f ./$(DEPDIR)/upscmd.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsimage.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upslog.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsmon.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsrw.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upssched.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsset.Po
|
||||||
|
-rm -f ./$(DEPDIR)/upsstats.Po
|
||||||
-rm -f Makefile
|
-rm -f Makefile
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
@ -1122,7 +1251,7 @@ uninstall-am: uninstall-binPROGRAMS uninstall-cgiexecPROGRAMS \
|
||||||
|
|
||||||
.MAKE: install-am install-strip
|
.MAKE: install-am install-strip
|
||||||
|
|
||||||
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
|
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
|
||||||
clean-binPROGRAMS clean-cgiexecPROGRAMS clean-generic \
|
clean-binPROGRAMS clean-cgiexecPROGRAMS clean-generic \
|
||||||
clean-libLTLIBRARIES clean-libtool clean-sbinPROGRAMS \
|
clean-libLTLIBRARIES clean-libtool clean-sbinPROGRAMS \
|
||||||
cscopelist-am ctags ctags-am distclean distclean-compile \
|
cscopelist-am ctags ctags-am distclean distclean-compile \
|
||||||
|
@ -1142,6 +1271,21 @@ uninstall-am: uninstall-binPROGRAMS uninstall-cgiexecPROGRAMS \
|
||||||
uninstall-dist_binSCRIPTS uninstall-includeHEADERS \
|
uninstall-dist_binSCRIPTS uninstall-includeHEADERS \
|
||||||
uninstall-libLTLIBRARIES uninstall-sbinPROGRAMS
|
uninstall-libLTLIBRARIES uninstall-sbinPROGRAMS
|
||||||
|
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
dummy:
|
||||||
|
|
||||||
|
# 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.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
|
|
@ -46,9 +46,12 @@ static char *unescape(char *buf)
|
||||||
hex[1] = buf[++i];
|
hex[1] = buf[++i];
|
||||||
hex[2] = '\0';
|
hex[2] = '\0';
|
||||||
if (!isxdigit((unsigned char) hex[0])
|
if (!isxdigit((unsigned char) hex[0])
|
||||||
|| !isxdigit((unsigned char) hex[0]))
|
|| !isxdigit((unsigned char) hex[1]))
|
||||||
fatalx(EXIT_FAILURE, "bad escape char");
|
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))
|
if ((ch == 10) || (ch == 13))
|
||||||
ch = ' ';
|
ch = ' ';
|
||||||
|
@ -89,7 +92,7 @@ void extractcgiargs(void)
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
*eq = '\0';
|
*eq = '\0';
|
||||||
value = eq + 1;
|
value = eq + 1;
|
||||||
amp = strchr(value, '&');
|
amp = strchr(value, '&');
|
||||||
|
@ -101,7 +104,7 @@ void extractcgiargs(void)
|
||||||
ptr = NULL;
|
ptr = NULL;
|
||||||
|
|
||||||
cleanvar = unescape(varname);
|
cleanvar = unescape(varname);
|
||||||
cleanval = unescape(value);
|
cleanval = unescape(value);
|
||||||
parsearg(cleanvar, cleanval);
|
parsearg(cleanvar, cleanval);
|
||||||
free(cleanvar);
|
free(cleanvar);
|
||||||
free(cleanval);
|
free(cleanval);
|
||||||
|
@ -199,4 +202,4 @@ int checkhost(const char *host, char **desc)
|
||||||
pconf_finish(&ctx);
|
pconf_finish(&ctx);
|
||||||
|
|
||||||
return 0; /* not found: access denied */
|
return 0; /* not found: access denied */
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
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
|
#ifdef __cplusplus
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -41,3 +44,4 @@ int checkhost(const char *host, char **desc);
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* NUT_CGILIB_H_SEEN */
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -28,6 +28,13 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <exception>
|
#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
|
namespace nut
|
||||||
{
|
{
|
||||||
|
@ -51,9 +58,11 @@ class NutException : public std::exception
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NutException(const std::string& msg):_msg(msg){}
|
NutException(const std::string& msg):_msg(msg){}
|
||||||
virtual ~NutException() throw() {}
|
NutException(const NutException&) = default;
|
||||||
virtual const char * what() const throw() {return this->_msg.c_str();}
|
NutException& operator=(NutException& rhs) = default;
|
||||||
virtual std::string str() const throw() {return this->_msg;}
|
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:
|
private:
|
||||||
std::string _msg;
|
std::string _msg;
|
||||||
};
|
};
|
||||||
|
@ -65,7 +74,9 @@ class SystemException : public NutException
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SystemException();
|
SystemException();
|
||||||
virtual ~SystemException() throw() {}
|
SystemException(const SystemException&) = default;
|
||||||
|
SystemException& operator=(SystemException& rhs) = default;
|
||||||
|
virtual ~SystemException() override;
|
||||||
private:
|
private:
|
||||||
static std::string err();
|
static std::string err();
|
||||||
};
|
};
|
||||||
|
@ -78,7 +89,9 @@ class IOException : public NutException
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IOException(const std::string& msg):NutException(msg){}
|
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:
|
public:
|
||||||
UnknownHostException():IOException("Unknown host"){}
|
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:
|
public:
|
||||||
NotConnectedException():IOException("Not connected"){}
|
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:
|
public:
|
||||||
TimeoutException():IOException("Timeout"){}
|
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.
|
* A nut client is the starting point to dialog to NUTD.
|
||||||
* It can connect to an NUTD then retrieve its device list.
|
* It can connect to an NUTD then retrieve its device list.
|
||||||
|
@ -122,7 +160,7 @@ class Client
|
||||||
friend class Variable;
|
friend class Variable;
|
||||||
friend class Command;
|
friend class Command;
|
||||||
public:
|
public:
|
||||||
~Client();
|
virtual ~Client();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Intend to authenticate to a NUTD server.
|
* 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 ?
|
* \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.
|
* \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.
|
* Disconnect from the NUTD server.
|
||||||
* \todo Is his method is global to all connection protocol or is it specific to TCP ?
|
* \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.
|
* Device manipulations.
|
||||||
|
@ -151,29 +189,29 @@ public:
|
||||||
* \param name Name of the device.
|
* \param name Name of the device.
|
||||||
* \return 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.
|
* Retrieve the list of all devices supported by UPSD server.
|
||||||
* \return The set of supported devices.
|
* \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.
|
* Test if a device is supported by the NUTD server.
|
||||||
* \param dev Device name.
|
* \param dev Device name.
|
||||||
* \return true if supported, false otherwise.
|
* \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.
|
* Retrieve names of devices supported by NUTD server.
|
||||||
* \return The set of names of supported devices.
|
* \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.
|
* Retrieve the description of a device.
|
||||||
* \param name Device name.
|
* \param name Device name.
|
||||||
* \return Device description.
|
* \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
|
* \param dev Device name
|
||||||
* \return Variable names
|
* \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.
|
* Retrieve names of read/write variables supported by a device.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \return RW variable names
|
* \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.
|
* Test if a variable is supported by a device.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \param name Variable name
|
* \param name Variable name
|
||||||
* \return true if the variable is supported.
|
* \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.
|
* Retrieve the description of a variable.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \param name Variable name
|
* \param name Variable name
|
||||||
* \return Variable description if provided.
|
* \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.
|
* Retrieve values of a variable.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \param name Variable name
|
* \param name Variable name
|
||||||
* \return Variable values (usually one) if available.
|
* \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.
|
* Retrieve values of all variables of a device.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \return Variable values indexed by variable names.
|
* \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.
|
* Intend to set the value of a variable.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \param name Variable name
|
* \param name Variable name
|
||||||
* \param value Variable value
|
* \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.
|
* Intend to set the value of a variable.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \param name Variable 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
|
* \param dev Device name
|
||||||
* \return Command names
|
* \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.
|
* Test if a command is supported by a device.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \param name Command name
|
* \param name Command name
|
||||||
* \return true if the command is supported.
|
* \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.
|
* Retrieve the description of a command.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \param name Command name
|
* \param name Command name
|
||||||
* \return Command description if provided.
|
* \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.
|
* Intend to execute a command.
|
||||||
* \param dev Device name
|
* \param dev Device name
|
||||||
* \param name Command 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.
|
* Log the current user (if authenticated) for a device.
|
||||||
* \param dev Device name.
|
* \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.
|
* \param dev Device name.
|
||||||
* \return Number of logged-in users.
|
* \return Number of logged-in users.
|
||||||
*/
|
*/
|
||||||
virtual int deviceGetNumLogins(const std::string& dev)throw(NutException)=0;
|
virtual int deviceGetNumLogins(const std::string& dev) = 0;
|
||||||
virtual void deviceMaster(const std::string& dev)throw(NutException)=0;
|
/* NOTE: "master" is deprecated since NUT v2.8.0 in favor of "primary".
|
||||||
virtual void deviceForcedShutdown(const std::string& dev)throw(NutException)=0;
|
* 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:
|
protected:
|
||||||
Client();
|
Client();
|
||||||
|
@ -297,6 +360,11 @@ protected:
|
||||||
*/
|
*/
|
||||||
class TcpClient : public Client
|
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:
|
public:
|
||||||
/**
|
/**
|
||||||
* Construct a nut TcpClient object.
|
* Construct a nut TcpClient object.
|
||||||
|
@ -309,21 +377,21 @@ public:
|
||||||
* \param host Server host name.
|
* \param host Server host name.
|
||||||
* \param port Server port.
|
* \param port Server port.
|
||||||
*/
|
*/
|
||||||
TcpClient(const std::string& host, int port = 3493)throw(nut::IOException);
|
TcpClient(const std::string& host, uint16_t port = 3493);
|
||||||
~TcpClient();
|
~TcpClient() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect it to the specified server.
|
* Connect it to the specified server.
|
||||||
* \param host Server host name.
|
* \param host Server host name.
|
||||||
* \param port Server port.
|
* \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.
|
* Connect to the server.
|
||||||
* Host name and ports must have already set (usefull for reconnection).
|
* Host name and ports must have already set (usefull for reconnection).
|
||||||
*/
|
*/
|
||||||
void connect()throw(nut::IOException);
|
void connect();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test if the connection is active.
|
* Test if the connection is active.
|
||||||
|
@ -339,13 +407,13 @@ public:
|
||||||
* Set the timeout in seconds.
|
* Set the timeout in seconds.
|
||||||
* \param timeout Timeout n seconds, negative to block operations.
|
* \param timeout Timeout n seconds, negative to block operations.
|
||||||
*/
|
*/
|
||||||
void setTimeout(long timeout);
|
void setTimeout(time_t timeout);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the timeout.
|
* Retrieve the timeout.
|
||||||
* \returns Current timeout in seconds.
|
* \returns Current timeout in seconds.
|
||||||
*/
|
*/
|
||||||
long getTimeout()const;
|
time_t getTimeout()const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retriueve the host name of the server the client is connected to.
|
* 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.
|
* Retriueve the port of host of the server the client is connected to.
|
||||||
* \return Server port
|
* \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 authenticate(const std::string& user, const std::string& passwd) override;
|
||||||
virtual void logout()throw(NutException);
|
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 std::set<std::string> getDeviceVariableNames(const std::string& dev)throw(NutException);
|
virtual Device getDevice(const std::string& name) override;
|
||||||
virtual std::set<std::string> getDeviceRWVariableNames(const std::string& dev)throw(NutException);
|
virtual std::set<std::string> getDeviceNames() override;
|
||||||
virtual std::string getDeviceVariableDescription(const std::string& dev, const std::string& name)throw(NutException);
|
virtual std::string getDeviceDescription(const std::string& name) override;
|
||||||
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> getDeviceCommandNames(const std::string& dev)throw(NutException);
|
virtual std::set<std::string> getDeviceVariableNames(const std::string& dev) override;
|
||||||
virtual std::string getDeviceCommandDescription(const std::string& dev, const std::string& name)throw(NutException);
|
virtual std::set<std::string> getDeviceRWVariableNames(const std::string& dev) override;
|
||||||
virtual void executeDeviceCommand(const std::string& dev, const std::string& name)throw(NutException);
|
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 void deviceLogin(const std::string& dev)throw(NutException);
|
virtual std::set<std::string> getDeviceCommandNames(const std::string& dev) override;
|
||||||
virtual void deviceMaster(const std::string& dev)throw(NutException);
|
virtual std::string getDeviceCommandDescription(const std::string& dev, const std::string& name) override;
|
||||||
virtual void deviceForcedShutdown(const std::string& dev)throw(NutException);
|
virtual TrackingID executeDeviceCommand(const std::string& dev, const std::string& name, const std::string& param="") override;
|
||||||
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:
|
protected:
|
||||||
std::string sendQuery(const std::string& req)throw(nut::IOException);
|
std::string sendQuery(const std::string& req);
|
||||||
static void detectError(const std::string& req)throw(nut::NutException);
|
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 = "")
|
std::vector<std::string> get(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> > list(const std::string& subcmd, const std::string& params = "");
|
||||||
throw(nut::NutException);
|
|
||||||
|
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::vector<std::string> explode(const std::string& str, size_t begin=0);
|
||||||
static std::string escape(const std::string& str);
|
static std::string escape(const std::string& str);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string _host;
|
std::string _host;
|
||||||
int _port;
|
uint16_t _port;
|
||||||
long _timeout;
|
time_t _timeout;
|
||||||
internal::Socket* _socket;
|
internal::Socket* _socket;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Device attached to a client.
|
* Device attached to a client.
|
||||||
* Device is a lightweight class which can be copied easily.
|
* Device is a lightweight class which can be copied easily.
|
||||||
|
@ -411,9 +490,14 @@ class Device
|
||||||
{
|
{
|
||||||
friend class Client;
|
friend class Client;
|
||||||
friend class TcpClient;
|
friend class TcpClient;
|
||||||
|
friend class TcpClientMock;
|
||||||
|
#ifdef _NUTCLIENTTEST_BUILD
|
||||||
|
friend class NutClientTest;
|
||||||
|
#endif
|
||||||
public:
|
public:
|
||||||
~Device();
|
~Device();
|
||||||
Device(const Device& dev);
|
Device(const Device& dev);
|
||||||
|
Device& operator=(const Device& dev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the name of the device.
|
* Retrieve the name of the device.
|
||||||
|
@ -435,112 +519,117 @@ public:
|
||||||
bool isOk()const;
|
bool isOk()const;
|
||||||
/**
|
/**
|
||||||
* Test if the device is valid (has a name and is attached to a client).
|
* Test if the device is valid (has a name and is attached to a client).
|
||||||
* @see Device::isOk()
|
* @see Device::isOk()
|
||||||
*/
|
*/
|
||||||
operator bool()const;
|
operator bool()const;
|
||||||
/**
|
/**
|
||||||
* Test if the device is not valid (has no name or is not attached to any client).
|
* Test if the device is not valid (has no name or is not attached to any client).
|
||||||
* @see Device::isOk()
|
* @see Device::isOk()
|
||||||
*/
|
*/
|
||||||
bool operator!()const;
|
bool operator!()const;
|
||||||
/**
|
/**
|
||||||
* Test if the two devices are sames (same name ad same client attached to).
|
* Test if the two devices are sames (same name ad same client attached to).
|
||||||
*/
|
*/
|
||||||
bool operator==(const Device& dev)const;
|
bool operator==(const Device& dev)const;
|
||||||
/**
|
/**
|
||||||
* Comparison operator.
|
* Comparison operator.
|
||||||
*/
|
*/
|
||||||
bool operator<(const Device& dev)const;
|
bool operator<(const Device& dev)const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the description of the devce if specified.
|
* 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.
|
* Intend to retrieve the value of a variable of the device.
|
||||||
* \param name Name of the variable to get.
|
* \param name Name of the variable to get.
|
||||||
* \return Value of the variable, if available.
|
* \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.
|
* Intend to retrieve values of all variables of the devices.
|
||||||
* \return Map of all variables values indexed by their names.
|
* \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.
|
* Retrieve all variables names supported by the device.
|
||||||
* \return Set of available variable names.
|
* \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.
|
* Retrieve all Read/Write variables names supported by the device.
|
||||||
* \return Set of available Read/Write variable names.
|
* \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.
|
* Intend to set the value of a variable of the device.
|
||||||
* \param name Variable name.
|
* \param name Variable name.
|
||||||
* \param value New variable value.
|
* \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.
|
* Intend to set values of a variable of the device.
|
||||||
* \param name Variable name.
|
* \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.
|
* Retrieve a Variable object representing the specified variable.
|
||||||
* \param name Variable name.
|
* \param name Variable name.
|
||||||
* \return Variable object.
|
* \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.
|
* Retrieve Variable objects representing all variables available for the device.
|
||||||
* \return Set of Variable objects.
|
* \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.
|
* Retrieve Variable objects representing all Read/Write variables available for the device.
|
||||||
* \return Set of Variable objects.
|
* \return Set of Variable objects.
|
||||||
*/
|
*/
|
||||||
std::set<Variable> getRWVariables()throw(NutException);
|
std::set<Variable> getRWVariables();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve names of all commands supported by the device.
|
* Retrieve names of all commands supported by the device.
|
||||||
* \return Set of available command names.
|
* \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.
|
* Retrieve objects for all commands supported by the device.
|
||||||
* \return Set of available Command objects.
|
* \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.
|
* Retrieve an object representing a command of the device.
|
||||||
* \param name Command name.
|
* \param name Command name.
|
||||||
* \return Command object.
|
* \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.
|
* Intend to execute a command on the device.
|
||||||
* \param name Command name.
|
* \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.
|
* Login current client's user for the device.
|
||||||
*/
|
*/
|
||||||
void login()throw(NutException);
|
void login();
|
||||||
void master()throw(NutException);
|
/* FIXME: Protocol update needed to handle master/primary alias
|
||||||
void forcedShutdown()throw(NutException);
|
* 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.
|
* Retrieve the number of logged user for the device.
|
||||||
* \return Number of users.
|
* \return Number of users.
|
||||||
*/
|
*/
|
||||||
int getNumLogins()throw(NutException);
|
int getNumLogins();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Device(Client* client, const std::string& name);
|
Device(Client* client, const std::string& name);
|
||||||
|
@ -558,10 +647,15 @@ class Variable
|
||||||
{
|
{
|
||||||
friend class Device;
|
friend class Device;
|
||||||
friend class TcpClient;
|
friend class TcpClient;
|
||||||
|
friend class TcpClientMock;
|
||||||
|
#ifdef _NUTCLIENTTEST_BUILD
|
||||||
|
friend class NutClientTest;
|
||||||
|
#endif
|
||||||
public:
|
public:
|
||||||
~Variable();
|
~Variable();
|
||||||
|
|
||||||
Variable(const Variable& var);
|
Variable(const Variable& var);
|
||||||
|
Variable& operator=(const Variable& var);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve variable name.
|
* Retrieve variable name.
|
||||||
|
@ -603,23 +697,23 @@ public:
|
||||||
* Intend to retrieve variable value.
|
* Intend to retrieve variable value.
|
||||||
* \return Value of the variable.
|
* \return Value of the variable.
|
||||||
*/
|
*/
|
||||||
std::vector<std::string> getValue()throw(NutException);
|
std::vector<std::string> getValue();
|
||||||
/**
|
/**
|
||||||
* Intend to retireve variable description.
|
* Intend to retireve variable description.
|
||||||
* \return Variable description if provided.
|
* \return Variable description if provided.
|
||||||
*/
|
*/
|
||||||
std::string getDescription()throw(NutException);
|
std::string getDescription();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Intend to set a value to the variable.
|
* Intend to set a value to the variable.
|
||||||
* \param value New variable value.
|
* \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.
|
* 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:
|
protected:
|
||||||
Variable(Device* dev, const std::string& name);
|
Variable(Device* dev, const std::string& name);
|
||||||
|
@ -637,10 +731,15 @@ class Command
|
||||||
{
|
{
|
||||||
friend class Device;
|
friend class Device;
|
||||||
friend class TcpClient;
|
friend class TcpClient;
|
||||||
|
friend class TcpClientMock;
|
||||||
|
#ifdef _NUTCLIENTTEST_BUILD
|
||||||
|
friend class NutClientTest;
|
||||||
|
#endif
|
||||||
public:
|
public:
|
||||||
~Command();
|
~Command();
|
||||||
|
|
||||||
Command(const Command& cmd);
|
Command(const Command& cmd);
|
||||||
|
Command& operator=(const Command& cmd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve command name.
|
* Retrieve command name.
|
||||||
|
@ -683,13 +782,13 @@ public:
|
||||||
* Intend to retireve command description.
|
* Intend to retireve command description.
|
||||||
* \return Command description if provided.
|
* \return Command description if provided.
|
||||||
*/
|
*/
|
||||||
std::string getDescription()throw(NutException);
|
std::string getDescription();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Intend to retrieve command description.
|
* Intend to execute the instant command on device.
|
||||||
* \return Command description if provided.
|
* \param param Optional additional command parameter
|
||||||
*/
|
*/
|
||||||
void execute()throw(NutException);
|
void execute(const std::string& param="");
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Command(Device* dev, const std::string& name);
|
Command(Device* dev, const std::string& name);
|
||||||
|
@ -722,13 +821,19 @@ typedef char** strarr;
|
||||||
/**
|
/**
|
||||||
* Alloc an array of string.
|
* Alloc an array of string.
|
||||||
*/
|
*/
|
||||||
strarr strarr_alloc(unsigned short count);
|
strarr strarr_alloc(size_t count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free an array of string.
|
* Free an array of string.
|
||||||
*/
|
*/
|
||||||
void strarr_free(strarr arr);
|
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.
|
* Nut general client types and functions.
|
||||||
|
@ -738,7 +843,7 @@ void strarr_free(strarr arr);
|
||||||
typedef void* NUTCLIENT_t;
|
typedef void* NUTCLIENT_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy a client.
|
* Destroy a client.
|
||||||
* \param client Nut client handle.
|
* \param client Nut client handle.
|
||||||
*/
|
*/
|
||||||
void nutclient_destroy(NUTCLIENT_t client);
|
void nutclient_destroy(NUTCLIENT_t client);
|
||||||
|
@ -776,7 +881,11 @@ int nutclient_get_device_num_logins(NUTCLIENT_t client, const char* dev);
|
||||||
* \param client Nut client handle.
|
* \param client Nut client handle.
|
||||||
* \param dev Device name to test.
|
* \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_master(NUTCLIENT_t client, const char* dev);
|
||||||
|
void nutclient_device_primary(NUTCLIENT_t client, const char* dev);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the FSD flag for the device.
|
* 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 dev Device name.
|
||||||
* \param cmd Command 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="");
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
|
||||||
|
@ -911,7 +1020,7 @@ void nutclient_execute_device_command(NUTCLIENT_t client, const char* dev, const
|
||||||
* \{
|
* \{
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* Hidden structure representing a TCP connection to NUTD.
|
* Hidden structure representing a TCP connection to NUTD.
|
||||||
* NUTCLIENT_TCP_t is back compatible to NUTCLIENT_t.
|
* NUTCLIENT_TCP_t is back compatible to NUTCLIENT_t.
|
||||||
*/
|
*/
|
||||||
typedef NUTCLIENT_t NUTCLIENT_TCP_t;
|
typedef NUTCLIENT_t NUTCLIENT_TCP_t;
|
||||||
|
@ -920,9 +1029,9 @@ typedef NUTCLIENT_t NUTCLIENT_TCP_t;
|
||||||
* Create a client to NUTD using a TCP connection.
|
* Create a client to NUTD using a TCP connection.
|
||||||
* \param host Host name to connect to.
|
* \param host Host name to connect to.
|
||||||
* \param port Host port.
|
* \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.
|
* Test if a nut TCP client is connected.
|
||||||
* \param client Nut TCP client handle.
|
* \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.
|
* Set the timeout value for the TCP connection.
|
||||||
* \param timeout Timeout in seconds, negative for blocking.
|
* \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.
|
* Retrieve the timeout value for the TCP connection.
|
||||||
* \return Timeout value in seconds.
|
* \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
|
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
|
#ifdef __cplusplus
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
extern "C" {
|
extern "C" {
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#endif
|
#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 *name;
|
||||||
char *desc;
|
char *desc;
|
||||||
int severity;
|
int severity;
|
||||||
|
@ -48,3 +54,4 @@ struct {
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* NUT_STATUS_H_SEEN */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* upsc - simple "client" to test communications
|
/* upsc - simple "client" to test communications
|
||||||
|
|
||||||
Copyright (C) 1999 Russell Kroll <rkroll@exploits.org>
|
Copyright (C) 1999 Russell Kroll <rkroll@exploits.org>
|
||||||
Copyright (C) 2012 Arnaud Quette <arnaud.quette@free.fr>
|
Copyright (C) 2012 Arnaud Quette <arnaud.quette@free.fr>
|
||||||
|
@ -25,6 +25,7 @@
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include "nut_stdint.h"
|
||||||
#include "upsclient.h"
|
#include "upsclient.h"
|
||||||
|
|
||||||
static char *upsname = NULL, *hostname = NULL;
|
static char *upsname = NULL, *hostname = NULL;
|
||||||
|
@ -58,7 +59,7 @@ static void usage(const char *prog)
|
||||||
static void printvar(const char *var)
|
static void printvar(const char *var)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
|
|
||||||
|
@ -86,7 +87,7 @@ static void printvar(const char *var)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numa < numq) {
|
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]);
|
printf("%s\n", answer[3]);
|
||||||
|
@ -95,7 +96,7 @@ static void printvar(const char *var)
|
||||||
static void list_vars(void)
|
static void list_vars(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
|
|
||||||
|
@ -119,7 +120,7 @@ static void list_vars(void)
|
||||||
|
|
||||||
/* VAR <upsname> <varname> <val> */
|
/* VAR <upsname> <varname> <val> */
|
||||||
if (numa < 4) {
|
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]);
|
printf("%s: %s\n", answer[2], answer[3]);
|
||||||
|
@ -129,7 +130,7 @@ static void list_vars(void)
|
||||||
static void list_upses(int verbose)
|
static void list_upses(int verbose)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
|
|
||||||
|
@ -137,7 +138,7 @@ static void list_upses(int verbose)
|
||||||
numq = 1;
|
numq = 1;
|
||||||
|
|
||||||
ret = upscli_list_start(ups, numq, query);
|
ret = upscli_list_start(ups, numq, query);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* check for an old upsd */
|
/* check for an old upsd */
|
||||||
if (upscli_upserror(ups) == UPSCLI_ERR_UNKCOMMAND) {
|
if (upscli_upserror(ups) == UPSCLI_ERR_UNKCOMMAND) {
|
||||||
|
@ -151,7 +152,7 @@ static void list_upses(int verbose)
|
||||||
|
|
||||||
/* UPS <upsname> <description> */
|
/* UPS <upsname> <description> */
|
||||||
if (numa < 3) {
|
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) {
|
if(verbose) {
|
||||||
|
@ -165,7 +166,7 @@ static void list_upses(int verbose)
|
||||||
static void list_clients(const char *devname)
|
static void list_clients(const char *devname)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
|
|
||||||
|
@ -188,7 +189,7 @@ static void list_clients(const char *devname)
|
||||||
|
|
||||||
/* CLIENT <upsname> <address> */
|
/* CLIENT <upsname> <address> */
|
||||||
if (numa < 3) {
|
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]);
|
printf("%s\n", answer[2]);
|
||||||
|
@ -208,7 +209,8 @@ static void clean_exit(void)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i, port;
|
int i;
|
||||||
|
uint16_t port;
|
||||||
int varlist = 0, clientlist = 0, verbose = 0;
|
int varlist = 0, clientlist = 0, verbose = 0;
|
||||||
const char *prog = xbasename(argv[0]);
|
const char *prog = xbasename(argv[0]);
|
||||||
|
|
||||||
|
@ -218,7 +220,9 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
case 'L':
|
case 'L':
|
||||||
verbose = 1;
|
verbose = 1;
|
||||||
|
goto fallthrough_case_l;
|
||||||
case 'l':
|
case 'l':
|
||||||
|
fallthrough_case_l:
|
||||||
varlist = 1;
|
varlist = 1;
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
|
@ -227,6 +231,9 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
case 'V':
|
case 'V':
|
||||||
fatalx(EXIT_SUCCESS, "Network UPS Tools upscmd %s", UPS_VERSION);
|
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':
|
case 'h':
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#ifdef HAVE_PTHREAD
|
#ifdef HAVE_PTHREAD
|
||||||
/* this include is needed on AIX to have errno stored in thread local storage */
|
/* this include is needed on AIX to have errno stored in thread local storage */
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
@ -38,13 +38,14 @@
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "upsclient.h"
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "nut_stdint.h"
|
||||||
#include "timehead.h"
|
#include "timehead.h"
|
||||||
|
#include "upsclient.h"
|
||||||
|
|
||||||
/* WA for Solaris/i386 bug: non-blocking connect sets errno to ENOENT */
|
/* WA for Solaris/i386 bug: non-blocking connect sets errno to ENOENT */
|
||||||
#if (defined NUT_PLATFORM_SOLARIS && CPU_TYPE == i386)
|
#if (defined NUT_PLATFORM_SOLARIS)
|
||||||
#define SOLARIS_i386_NBCONNECT_ENOENT(status) (ENOENT == (status))
|
#define SOLARIS_i386_NBCONNECT_ENOENT(status) ( (!strcmp("i386", CPU_TYPE)) ? (ENOENT == (status)) : 0 )
|
||||||
#else
|
#else
|
||||||
#define SOLARIS_i386_NBCONNECT_ENOENT(status) (0)
|
#define SOLARIS_i386_NBCONNECT_ENOENT(status) (0)
|
||||||
#endif /* end of Solaris/i386 WA for non-blocking connect */
|
#endif /* end of Solaris/i386 WA for non-blocking connect */
|
||||||
|
@ -75,7 +76,7 @@
|
||||||
#define shutdown_how 2
|
#define shutdown_how 2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct {
|
static struct {
|
||||||
int flags;
|
int flags;
|
||||||
const char *str;
|
const char *str;
|
||||||
} upscli_errlist[] =
|
} upscli_errlist[] =
|
||||||
|
@ -131,7 +132,7 @@ typedef struct HOST_CERT_s {
|
||||||
const char *certname;
|
const char *certname;
|
||||||
int certverify;
|
int certverify;
|
||||||
int forcessl;
|
int forcessl;
|
||||||
|
|
||||||
struct HOST_CERT_s *next;
|
struct HOST_CERT_s *next;
|
||||||
} HOST_CERT_t;
|
} HOST_CERT_t;
|
||||||
static HOST_CERT_t* upscli_find_host_cert(const char* hostname);
|
static HOST_CERT_t* upscli_find_host_cert(const char* hostname);
|
||||||
|
@ -153,7 +154,7 @@ static char* nsscertpasswd = NULL;
|
||||||
|
|
||||||
static void ssl_debug(void)
|
static void ssl_debug(void)
|
||||||
{
|
{
|
||||||
int e;
|
unsigned long e;
|
||||||
char errmsg[SMALLBUF];
|
char errmsg[SMALLBUF];
|
||||||
|
|
||||||
while ((e = ERR_get_error()) != 0) {
|
while ((e = ERR_get_error()) != 0) {
|
||||||
|
@ -162,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;
|
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)
|
switch (e)
|
||||||
{
|
{
|
||||||
case SSL_ERROR_WANT_READ:
|
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;
|
break;
|
||||||
|
|
||||||
case SSL_ERROR_WANT_WRITE:
|
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;
|
break;
|
||||||
|
|
||||||
case SSL_ERROR_SYSCALL:
|
case SSL_ERROR_SYSCALL:
|
||||||
if (ret == 0 && ERR_peek_error() == 0) {
|
if (ret == 0 && ERR_peek_error() == 0) {
|
||||||
upslogx(LOG_ERR, "ssl_error() EOF from client");
|
upslogx(LOG_ERR, "ssl_error() EOF from client");
|
||||||
} else {
|
} else {
|
||||||
upslogx(LOG_ERR, "ssl_error() ret=%d SSL_ERROR_SYSCALL", ret);
|
upslogx(LOG_ERR, "ssl_error() ret=%zd SSL_ERROR_SYSCALL", ret);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
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();
|
ssl_debug();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,9 +201,12 @@ static int ssl_error(SSL *ssl, int ret)
|
||||||
|
|
||||||
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
||||||
|
|
||||||
static char *nss_password_callback(PK11SlotInfo *slot, PRBool retry,
|
static char *nss_password_callback(PK11SlotInfo *slot, PRBool retry,
|
||||||
void *arg)
|
void *arg)
|
||||||
{
|
{
|
||||||
|
NUT_UNUSED_VARIABLE(retry);
|
||||||
|
NUT_UNUSED_VARIABLE(arg);
|
||||||
|
|
||||||
upslogx(LOG_INFO, "Intend to retrieve password for %s / %s: password %sconfigured",
|
upslogx(LOG_INFO, "Intend to retrieve password for %s / %s: password %sconfigured",
|
||||||
PK11_GetSlotName(slot), PK11_GetTokenName(slot), nsscertpasswd?"":"not ");
|
PK11_GetSlotName(slot), PK11_GetTokenName(slot), nsscertpasswd?"":"not ");
|
||||||
return nsscertpasswd ? PL_strdup(nsscertpasswd) : NULL;
|
return nsscertpasswd ? PL_strdup(nsscertpasswd) : NULL;
|
||||||
|
@ -233,6 +241,10 @@ static SECStatus AuthCertificateDontVerify(CERTCertDBHandle *arg, PRFileDesc *fd
|
||||||
PRBool checksig, PRBool isServer)
|
PRBool checksig, PRBool isServer)
|
||||||
{
|
{
|
||||||
UPSCONN_t *ups = (UPSCONN_t *)SSL_RevealPinArg(fd);
|
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",
|
upslogx(LOG_INFO, "Do not intend to authenticate server %s",
|
||||||
ups?ups->host:"<unnamed>");
|
ups?ups->host:"<unnamed>");
|
||||||
return SECSuccess;
|
return SECSuccess;
|
||||||
|
@ -241,6 +253,8 @@ static SECStatus AuthCertificateDontVerify(CERTCertDBHandle *arg, PRFileDesc *fd
|
||||||
static SECStatus BadCertHandler(UPSCONN_t *arg, PRFileDesc *fd)
|
static SECStatus BadCertHandler(UPSCONN_t *arg, PRFileDesc *fd)
|
||||||
{
|
{
|
||||||
HOST_CERT_t* cert;
|
HOST_CERT_t* cert;
|
||||||
|
NUT_UNUSED_VARIABLE(fd);
|
||||||
|
|
||||||
upslogx(LOG_WARNING, "Certificate validation failed for %s",
|
upslogx(LOG_WARNING, "Certificate validation failed for %s",
|
||||||
(arg&&arg->host)?arg->host:"<unnamed>");
|
(arg&&arg->host)?arg->host:"<unnamed>");
|
||||||
/* BadCertHandler is called when the NSS certificate validation is failed.
|
/* BadCertHandler is called when the NSS certificate validation is failed.
|
||||||
|
@ -288,49 +302,63 @@ static SECStatus GetClientAuthData(UPSCONN_t *arg, PRFileDesc *fd,
|
||||||
|
|
||||||
static void HandshakeCallback(PRFileDesc *fd, UPSCONN_t *client_data)
|
static void HandshakeCallback(PRFileDesc *fd, UPSCONN_t *client_data)
|
||||||
{
|
{
|
||||||
|
NUT_UNUSED_VARIABLE(fd);
|
||||||
|
|
||||||
upslogx(LOG_INFO, "SSL handshake done successfully with server %s",
|
upslogx(LOG_INFO, "SSL handshake done successfully with server %s",
|
||||||
client_data->host);
|
client_data->host);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||||
|
|
||||||
int upscli_init(int certverify, const char *certpath,
|
int upscli_init(int certverify, const char *certpath,
|
||||||
const char *certname, const char *certpasswd)
|
const char *certname, const char *certpasswd)
|
||||||
{
|
{
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
int ret, ssl_mode = SSL_VERIFY_NONE;
|
long ret;
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x10000000L
|
int ssl_mode = SSL_VERIFY_NONE;
|
||||||
const SSL_METHOD *ssl_method;
|
NUT_UNUSED_VARIABLE(certname);
|
||||||
#else
|
NUT_UNUSED_VARIABLE(certpasswd);
|
||||||
SSL_METHOD *ssl_method;
|
|
||||||
#endif
|
|
||||||
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
||||||
SECStatus status;
|
SECStatus status;
|
||||||
|
#else
|
||||||
|
NUT_UNUSED_VARIABLE(certverify);
|
||||||
|
NUT_UNUSED_VARIABLE(certpath);
|
||||||
|
NUT_UNUSED_VARIABLE(certname);
|
||||||
|
NUT_UNUSED_VARIABLE(certpasswd);
|
||||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||||
|
|
||||||
|
|
||||||
if (upscli_initialized == 1) {
|
if (upscli_initialized == 1) {
|
||||||
upslogx(LOG_WARNING, "upscli already initialized");
|
upslogx(LOG_WARNING, "upscli already initialized");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
|
|
||||||
SSL_library_init();
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
SSL_load_error_strings();
|
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) {
|
if (!ssl_ctx) {
|
||||||
upslogx(LOG_ERR, "Can not initialize SSL context");
|
upslogx(LOG_ERR, "Can not initialize SSL context");
|
||||||
return -1;
|
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 (!certpath) {
|
||||||
if (certverify == 1) {
|
if (certverify == 1) {
|
||||||
upslogx(LOG_ERR, "Can not verify certificate if any is specified");
|
upslogx(LOG_ERR, "Can not verify certificate if any is specified");
|
||||||
|
@ -353,13 +381,13 @@ int upscli_init(int certverify, const char *certpath,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSL_CTX_set_verify(ssl_ctx, ssl_mode, NULL);
|
SSL_CTX_set_verify(ssl_ctx, ssl_mode, NULL);
|
||||||
}
|
}
|
||||||
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
||||||
PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
|
PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
|
||||||
|
|
||||||
PK11_SetPasswordFunc(nss_password_callback);
|
PK11_SetPasswordFunc(nss_password_callback);
|
||||||
|
|
||||||
if (certpath) {
|
if (certpath) {
|
||||||
upslogx(LOG_INFO, "Init SSL with cerificate database located at %s", certpath);
|
upslogx(LOG_INFO, "Init SSL with cerificate database located at %s", certpath);
|
||||||
status = NSS_Init(certpath);
|
status = NSS_Init(certpath);
|
||||||
|
@ -372,16 +400,16 @@ int upscli_init(int certverify, const char *certpath,
|
||||||
nss_error("upscli_init / NSS_[NoDB]_Init");
|
nss_error("upscli_init / NSS_[NoDB]_Init");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = NSS_SetDomesticPolicy();
|
status = NSS_SetDomesticPolicy();
|
||||||
if (status != SECSuccess) {
|
if (status != SECSuccess) {
|
||||||
upslogx(LOG_ERR, "Can not initialize SSL policy");
|
upslogx(LOG_ERR, "Can not initialize SSL policy");
|
||||||
nss_error("upscli_init / NSS_SetDomesticPolicy");
|
nss_error("upscli_init / NSS_SetDomesticPolicy");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSL_ClearSessionCache();
|
SSL_ClearSessionCache();
|
||||||
|
|
||||||
status = SSL_OptionSetDefault(SSL_ENABLE_SSL3, PR_TRUE);
|
status = SSL_OptionSetDefault(SSL_ENABLE_SSL3, PR_TRUE);
|
||||||
if (status != SECSuccess) {
|
if (status != SECSuccess) {
|
||||||
upslogx(LOG_ERR, "Can not enable SSLv3");
|
upslogx(LOG_ERR, "Can not enable SSLv3");
|
||||||
|
@ -407,8 +435,13 @@ int upscli_init(int certverify, const char *certpath,
|
||||||
nsscertpasswd = xstrdup(certpasswd);
|
nsscertpasswd = xstrdup(certpasswd);
|
||||||
}
|
}
|
||||||
verify_certificate = certverify;
|
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 */
|
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||||
|
|
||||||
upscli_initialized = 1;
|
upscli_initialized = 1;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -423,6 +456,11 @@ void upscli_add_host_cert(const char* hostname, const char* certname, int certve
|
||||||
cert->certverify = certverify;
|
cert->certverify = certverify;
|
||||||
cert->forcessl = forcessl;
|
cert->forcessl = forcessl;
|
||||||
first_host_cert = cert;
|
first_host_cert = cert;
|
||||||
|
#else
|
||||||
|
NUT_UNUSED_VARIABLE(hostname);
|
||||||
|
NUT_UNUSED_VARIABLE(certname);
|
||||||
|
NUT_UNUSED_VARIABLE(certverify);
|
||||||
|
NUT_UNUSED_VARIABLE(forcessl);
|
||||||
#endif /* WITH_NSS */
|
#endif /* WITH_NSS */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,11 +476,13 @@ static HOST_CERT_t* upscli_find_host_cert(const char* hostname)
|
||||||
cert = cert->next;
|
cert = cert->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
NUT_UNUSED_VARIABLE(hostname);
|
||||||
#endif /* WITH_NSS */
|
#endif /* WITH_NSS */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int upscli_cleanup()
|
int upscli_cleanup(void)
|
||||||
{
|
{
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
if (ssl_ctx) {
|
if (ssl_ctx) {
|
||||||
|
@ -452,7 +492,7 @@ int upscli_cleanup()
|
||||||
|
|
||||||
#endif /* WITH_OPENSSL */
|
#endif /* WITH_OPENSSL */
|
||||||
|
|
||||||
#ifdef WITH_NSS
|
#ifdef WITH_NSS
|
||||||
/* Called to force cache clearing to prevent NSS shutdown failures.
|
/* Called to force cache clearing to prevent NSS shutdown failures.
|
||||||
* http://www.mozilla.org/projects/security/pki/nss/ref/ssl/sslfnc.html#1138601
|
* http://www.mozilla.org/projects/security/pki/nss/ref/ssl/sslfnc.html#1138601
|
||||||
*/
|
*/
|
||||||
|
@ -465,7 +505,7 @@ int upscli_cleanup()
|
||||||
*/
|
*/
|
||||||
PL_ArenaFinish();
|
PL_ArenaFinish();
|
||||||
#endif /* WITH_NSS */
|
#endif /* WITH_NSS */
|
||||||
|
|
||||||
upscli_initialized = 0;
|
upscli_initialized = 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -477,6 +517,16 @@ const char *upscli_strerror(UPSCONN_t *ups)
|
||||||
char sslbuf[UPSCLI_ERRBUF_LEN];
|
char sslbuf[UPSCLI_ERRBUF_LEN];
|
||||||
#endif
|
#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) {
|
if (!ups) {
|
||||||
return upscli_errlist[UPSCLI_ERR_INVALIDARG].str;
|
return upscli_errlist[UPSCLI_ERR_INVALIDARG].str;
|
||||||
}
|
}
|
||||||
|
@ -517,12 +567,12 @@ const char *upscli_strerror(UPSCONN_t *ups)
|
||||||
if (PR_GetErrorTextLength() < UPSCLI_ERRBUF_LEN) {
|
if (PR_GetErrorTextLength() < UPSCLI_ERRBUF_LEN) {
|
||||||
PR_GetErrorText(ups->errbuf);
|
PR_GetErrorText(ups->errbuf);
|
||||||
} else {
|
} else {
|
||||||
snprintf(ups->errbuf, UPSCLI_ERRBUF_LEN,
|
snprintf(ups->errbuf, UPSCLI_ERRBUF_LEN,
|
||||||
"SSL error #%ld, message too long to be displayed",
|
"SSL error #%ld, message too long to be displayed",
|
||||||
(long)PR_GetError());
|
(long)PR_GetError());
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
snprintf(ups->errbuf, UPSCLI_ERRBUF_LEN,
|
snprintf(ups->errbuf, UPSCLI_ERRBUF_LEN,
|
||||||
"SSL error, but SSL wasn't enabled at compile-time");
|
"SSL error, but SSL wasn't enabled at compile-time");
|
||||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||||
return ups->errbuf;
|
return ups->errbuf;
|
||||||
|
@ -534,6 +584,10 @@ const char *upscli_strerror(UPSCONN_t *ups)
|
||||||
return ups->errbuf;
|
return ups->errbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
|
|
||||||
snprintf(ups->errbuf, UPSCLI_ERRBUF_LEN, "Unknown error flag %d",
|
snprintf(ups->errbuf, UPSCLI_ERRBUF_LEN, "Unknown error flag %d",
|
||||||
|
@ -545,9 +599,9 @@ const char *upscli_strerror(UPSCONN_t *ups)
|
||||||
/* Read up to buflen bytes from fd and return the number of bytes
|
/* 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.
|
read. If no data is available within d_sec + d_usec, return 0.
|
||||||
On error, a value < 0 is returned (errno indicates error). */
|
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;
|
fd_set fds;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
|
@ -566,17 +620,37 @@ static int upscli_select_read(const int fd, void *buf, const size_t buflen, cons
|
||||||
return read(fd, buf, buflen);
|
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 */
|
/* 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
|
#ifdef WITH_SSL
|
||||||
if (ups->ssl) {
|
if (ups->ssl) {
|
||||||
#ifdef WITH_OPENSSL
|
#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 */
|
#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*/
|
#endif /* WITH_OPENSSL | WITH_NSS*/
|
||||||
|
|
||||||
if (ret < 1) {
|
if (ret < 1) {
|
||||||
|
@ -587,7 +661,7 @@ static int net_read(UPSCONN_t *ups, char *buf, size_t buflen)
|
||||||
}
|
}
|
||||||
#endif
|
#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? */
|
/* error reading data, server disconnected? */
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -602,13 +676,16 @@ static int net_read(UPSCONN_t *ups, char *buf, size_t buflen)
|
||||||
|
|
||||||
return ret;
|
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
|
/* 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.
|
written. If no data is available within d_sec + d_usec, return 0.
|
||||||
On error, a value < 0 is returned (errno indicates error). */
|
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;
|
fd_set fds;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
|
@ -627,17 +704,37 @@ static int upscli_select_write(const int fd, const void *buf, const size_t bufle
|
||||||
return write(fd, buf, buflen);
|
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 */
|
/* 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
|
#ifdef WITH_SSL
|
||||||
if (ups->ssl) {
|
if (ups->ssl) {
|
||||||
#ifdef WITH_OPENSSL
|
#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 */
|
#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 */
|
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||||
|
|
||||||
if (ret < 1) {
|
if (ret < 1) {
|
||||||
|
@ -648,7 +745,7 @@ static int net_write(UPSCONN_t *ups, const char *buf, size_t buflen)
|
||||||
}
|
}
|
||||||
#endif
|
#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? */
|
/* error writing data, server disconnected? */
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -663,6 +760,9 @@ static int net_write(UPSCONN_t *ups, const char *buf, size_t buflen)
|
||||||
|
|
||||||
return ret;
|
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
|
#ifdef WITH_SSL
|
||||||
|
@ -670,7 +770,7 @@ static int net_write(UPSCONN_t *ups, const char *buf, size_t buflen)
|
||||||
/*
|
/*
|
||||||
* 1 : OK
|
* 1 : OK
|
||||||
* -1 : ERROR
|
* -1 : ERROR
|
||||||
* 0 : SSL NOT SUPPORTED
|
* 0 : SSL NOT SUPPORTED
|
||||||
*/
|
*/
|
||||||
static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
{
|
{
|
||||||
|
@ -679,7 +779,7 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
||||||
SECStatus status;
|
SECStatus status;
|
||||||
PRFileDesc *socket;
|
PRFileDesc *socket;
|
||||||
HOST_CERT_t *cert;
|
HOST_CERT_t *cert;
|
||||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||||
char buf[UPSCLI_NETBUF_LEN];
|
char buf[UPSCLI_NETBUF_LEN];
|
||||||
|
|
||||||
|
@ -691,7 +791,7 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
"force initialisation without SSL configuration");
|
"force initialisation without SSL configuration");
|
||||||
upscli_init(0, NULL, NULL, NULL);
|
upscli_init(0, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* see if upsd even talks SSL/TLS */
|
/* see if upsd even talks SSL/TLS */
|
||||||
snprintf(buf, sizeof(buf), "STARTTLS\n");
|
snprintf(buf, sizeof(buf), "STARTTLS\n");
|
||||||
|
|
||||||
|
@ -708,7 +808,7 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* upsd is happy, so let's crank up the client */
|
/* upsd is happy, so let's crank up the client */
|
||||||
|
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
|
|
||||||
if (!ssl_ctx) {
|
if (!ssl_ctx) {
|
||||||
|
@ -737,7 +837,7 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
switch(res)
|
switch(res)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
upsdebugx(3, "SSL connected");
|
upsdebugx(3, "SSL connected (%s)", SSL_get_version(ups->ssl));
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
upslog_with_errno(1, "SSL_connect do not accept handshake.");
|
upslog_with_errno(1, "SSL_connect do not accept handshake.");
|
||||||
|
@ -747,7 +847,7 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
upslog_with_errno(1, "Unknown return value from SSL_connect %d", res);
|
upslog_with_errno(1, "Unknown return value from SSL_connect %d", res);
|
||||||
ssl_error(ups->ssl, res);
|
ssl_error(ups->ssl, res);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -764,12 +864,12 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
nss_error("upscli_sslinit / SSL_ImportFD");
|
nss_error("upscli_sslinit / SSL_ImportFD");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SSL_SetPKCS11PinArg(ups->ssl, ups) == -1){
|
if (SSL_SetPKCS11PinArg(ups->ssl, ups) == -1){
|
||||||
nss_error("upscli_sslinit / SSL_SetPKCS11PinArg");
|
nss_error("upscli_sslinit / SSL_SetPKCS11PinArg");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verifycert) {
|
if (verifycert) {
|
||||||
status = SSL_AuthCertificateHook(ups->ssl,
|
status = SSL_AuthCertificateHook(ups->ssl,
|
||||||
(SSLAuthCertificate)AuthCertificate, CERT_GetDefaultCertDB());
|
(SSLAuthCertificate)AuthCertificate, CERT_GetDefaultCertDB());
|
||||||
|
@ -781,19 +881,19 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
nss_error("upscli_sslinit / SSL_AuthCertificateHook");
|
nss_error("upscli_sslinit / SSL_AuthCertificateHook");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = SSL_BadCertHook(ups->ssl, (SSLBadCertHandler)BadCertHandler, ups);
|
status = SSL_BadCertHook(ups->ssl, (SSLBadCertHandler)BadCertHandler, ups);
|
||||||
if (status != SECSuccess) {
|
if (status != SECSuccess) {
|
||||||
nss_error("upscli_sslinit / SSL_BadCertHook");
|
nss_error("upscli_sslinit / SSL_BadCertHook");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = SSL_GetClientAuthDataHook(ups->ssl, (SSLGetClientAuthData)GetClientAuthData, ups);
|
status = SSL_GetClientAuthDataHook(ups->ssl, (SSLGetClientAuthData)GetClientAuthData, ups);
|
||||||
if (status != SECSuccess) {
|
if (status != SECSuccess) {
|
||||||
nss_error("upscli_sslinit / SSL_GetClientAuthDataHook");
|
nss_error("upscli_sslinit / SSL_GetClientAuthDataHook");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = SSL_HandshakeCallback(ups->ssl, (SSLHandshakeCallback)HandshakeCallback, ups);
|
status = SSL_HandshakeCallback(ups->ssl, (SSLHandshakeCallback)HandshakeCallback, ups);
|
||||||
if (status != SECSuccess) {
|
if (status != SECSuccess) {
|
||||||
nss_error("upscli_sslinit / SSL_HandshakeCallback");
|
nss_error("upscli_sslinit / SSL_HandshakeCallback");
|
||||||
|
@ -830,9 +930,9 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
/* TODO : Close the connection. */
|
/* TODO : Close the connection. */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
#endif /* WITH_OPENSSL | WITH_NSS */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -840,12 +940,15 @@ static int upscli_sslinit(UPSCONN_t *ups, int verifycert)
|
||||||
|
|
||||||
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 */
|
return 0; /* not supported */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WITH_SSL */
|
#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;
|
int sock_fd;
|
||||||
struct addrinfo hints, *res, *ai;
|
struct addrinfo hints, *res, *ai;
|
||||||
|
@ -871,7 +974,7 @@ int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags,stru
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(sport, sizeof(sport), "%hu", (unsigned short int)port);
|
snprintf(sport, sizeof(sport), "%ju", (uintmax_t)port);
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
|
||||||
|
@ -1005,7 +1108,7 @@ int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags,stru
|
||||||
ups->port = port;
|
ups->port = port;
|
||||||
|
|
||||||
hostcert = upscli_find_host_cert(host);
|
hostcert = upscli_find_host_cert(host);
|
||||||
|
|
||||||
if (hostcert != NULL) {
|
if (hostcert != NULL) {
|
||||||
/* An host security rule is specified. */
|
/* An host security rule is specified. */
|
||||||
certverify = hostcert->certverify;
|
certverify = hostcert->certverify;
|
||||||
|
@ -1015,39 +1118,39 @@ int upscli_tryconnect(UPSCONN_t *ups, const char *host, int port, int flags,stru
|
||||||
forcessl = (flags & UPSCLI_CONN_REQSSL) != 0 ? 1 : 0;
|
forcessl = (flags & UPSCLI_CONN_REQSSL) != 0 ? 1 : 0;
|
||||||
}
|
}
|
||||||
tryssl = (flags & UPSCLI_CONN_TRYSSL) != 0 ? 1 : 0;
|
tryssl = (flags & UPSCLI_CONN_TRYSSL) != 0 ? 1 : 0;
|
||||||
|
|
||||||
if (tryssl || forcessl) {
|
if (tryssl || forcessl) {
|
||||||
ret = upscli_sslinit(ups, certverify);
|
ret = upscli_sslinit(ups, certverify);
|
||||||
if (forcessl && ret != 1) {
|
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;
|
ups->upserror = UPSCLI_ERR_SSLFAIL;
|
||||||
upscli_disconnect(ups);
|
upscli_disconnect(ups);
|
||||||
return -1;
|
return -1;
|
||||||
} else if (tryssl && ret == -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);
|
upscli_disconnect(ups);
|
||||||
return -1;
|
return -1;
|
||||||
} else if (tryssl && ret == 0) {
|
} else if (tryssl && ret == 0) {
|
||||||
if (certverify != 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);
|
"certificate is needed, disconnect", host);
|
||||||
upscli_disconnect(ups);
|
upscli_disconnect(ups);
|
||||||
return -1;
|
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 {
|
} else {
|
||||||
upslogx(LOG_INFO, "Connected to %s in SSL", host);
|
upslogx(LOG_INFO, "Connected to NUT server %s in SSL", host);
|
||||||
if (certverify == 0) {
|
if (certverify == 0) {
|
||||||
/* you REALLY should set CERTVERIFY to 1 if using SSL... */
|
/* you REALLY should set CERTVERIFY to 1 if using SSL... */
|
||||||
upslogx(LOG_WARNING, "Certificate verification is disabled");
|
upslogx(LOG_WARNING, "Certificate verification is disabled");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
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);
|
return upscli_tryconnect(ups,host,port,flags,NULL);
|
||||||
}
|
}
|
||||||
|
@ -1058,7 +1161,7 @@ static struct {
|
||||||
const char *text;
|
const char *text;
|
||||||
} upsd_errlist[] =
|
} upsd_errlist[] =
|
||||||
{
|
{
|
||||||
{ UPSCLI_ERR_VARNOTSUPP, "VAR-NOT-SUPPORTED" },
|
{ UPSCLI_ERR_VARNOTSUPP, "VAR-NOT-SUPPORTED" },
|
||||||
{ UPSCLI_ERR_UNKNOWNUPS, "UNKNOWN-UPS" },
|
{ UPSCLI_ERR_UNKNOWNUPS, "UNKNOWN-UPS" },
|
||||||
{ UPSCLI_ERR_ACCESSDENIED, "ACCESS-DENIED" },
|
{ UPSCLI_ERR_ACCESSDENIED, "ACCESS-DENIED" },
|
||||||
{ UPSCLI_ERR_PWDREQUIRED, "PASSWORD-REQUIRED" },
|
{ UPSCLI_ERR_PWDREQUIRED, "PASSWORD-REQUIRED" },
|
||||||
|
@ -1083,7 +1186,7 @@ static struct {
|
||||||
{ UPSCLI_ERR_INVPASSWORD, "INVALID-PASSWORD" },
|
{ UPSCLI_ERR_INVPASSWORD, "INVALID-PASSWORD" },
|
||||||
{ UPSCLI_ERR_USERREQUIRED, "USERNAME-REQUIRED" },
|
{ UPSCLI_ERR_USERREQUIRED, "USERNAME-REQUIRED" },
|
||||||
{ UPSCLI_ERR_DRVNOTCONN, "DRIVER-NOT-CONNECTED" },
|
{ UPSCLI_ERR_DRVNOTCONN, "DRIVER-NOT-CONNECTED" },
|
||||||
|
|
||||||
{ 0, NULL, }
|
{ 0, NULL, }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1120,9 +1223,9 @@ static int upscli_errcheck(UPSCONN_t *ups, char *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void build_cmd(char *buf, size_t bufsize, const char *cmdname,
|
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;
|
size_t len;
|
||||||
char enc[UPSCLI_NETBUF_LEN];
|
char enc[UPSCLI_NETBUF_LEN];
|
||||||
const char *format;
|
const char *format;
|
||||||
|
@ -1142,8 +1245,20 @@ static void build_cmd(char *buf, size_t bufsize, const char *cmdname,
|
||||||
/* snprintfcat would tie us to common */
|
/* snprintfcat would tie us to common */
|
||||||
|
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
snprintf(buf + len, bufsize - len, format,
|
#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)));
|
pconf_encode(arg[i], enc, sizeof(enc)));
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
|
@ -1151,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 */
|
/* 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++) {
|
for (i = 0; i < num; i++) {
|
||||||
if (strcasecmp(q[i], a[i]) != 0) {
|
if (strcasecmp(q[i], a[i]) != 0) {
|
||||||
|
@ -1166,11 +1281,11 @@ static int verify_resp(int num, const char **q, char **a)
|
||||||
return 1; /* OK */
|
return 1; /* OK */
|
||||||
}
|
}
|
||||||
|
|
||||||
int upscli_get(UPSCONN_t *ups, unsigned int numq, const char **query,
|
int upscli_get(UPSCONN_t *ups, size_t numq, const char **query,
|
||||||
unsigned int *numa, char ***answer)
|
size_t *numa, char ***answer)
|
||||||
{
|
{
|
||||||
char cmd[UPSCLI_NETBUF_LEN], tmp[UPSCLI_NETBUF_LEN];
|
char cmd[UPSCLI_NETBUF_LEN], tmp[UPSCLI_NETBUF_LEN];
|
||||||
|
|
||||||
if (!ups) {
|
if (!ups) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1219,7 +1334,7 @@ int upscli_get(UPSCONN_t *ups, unsigned int numq, const char **query,
|
||||||
return 0;
|
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];
|
char cmd[UPSCLI_NETBUF_LEN], tmp[UPSCLI_NETBUF_LEN];
|
||||||
|
|
||||||
|
@ -1277,8 +1392,8 @@ int upscli_list_start(UPSCONN_t *ups, unsigned int numq, const char **query)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int upscli_list_next(UPSCONN_t *ups, unsigned int numq, const char **query,
|
int upscli_list_next(UPSCONN_t *ups, size_t numq, const char **query,
|
||||||
unsigned int *numa, char ***answer)
|
size_t *numa, char ***answer)
|
||||||
{
|
{
|
||||||
char tmp[UPSCLI_NETBUF_LEN];
|
char tmp[UPSCLI_NETBUF_LEN];
|
||||||
|
|
||||||
|
@ -1326,9 +1441,9 @@ int upscli_list_next(UPSCONN_t *ups, unsigned int numq, const char **query,
|
||||||
return 1;
|
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) {
|
if (!ups) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1349,7 +1464,7 @@ int upscli_sendline(UPSCONN_t *ups, const char *buf, size_t buflen)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = net_write(ups, buf, buflen);
|
ret = net_write(ups, buf, buflen, timeout);
|
||||||
|
|
||||||
if (ret < 1) {
|
if (ret < 1) {
|
||||||
upscli_disconnect(ups);
|
upscli_disconnect(ups);
|
||||||
|
@ -1359,9 +1474,14 @@ int upscli_sendline(UPSCONN_t *ups, const char *buf, size_t buflen)
|
||||||
return 0;
|
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;
|
size_t recv;
|
||||||
|
|
||||||
if (!ups) {
|
if (!ups) {
|
||||||
|
@ -1387,14 +1507,17 @@ int upscli_readline(UPSCONN_t *ups, char *buf, size_t buflen)
|
||||||
|
|
||||||
if (ups->readidx == ups->readlen) {
|
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) {
|
if (ret < 1) {
|
||||||
upscli_disconnect(ups);
|
upscli_disconnect(ups);
|
||||||
return -1;
|
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;
|
ups->readidx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1409,8 +1532,13 @@ int upscli_readline(UPSCONN_t *ups, char *buf, size_t buflen)
|
||||||
return 0;
|
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 */
|
/* 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;
|
char *s, tmp[SMALLBUF], *last = NULL;
|
||||||
|
|
||||||
|
@ -1446,9 +1574,10 @@ int upscli_splitname(const char *buf, char **upsname, char **hostname, int *port
|
||||||
}
|
}
|
||||||
|
|
||||||
/* split hostname[:port] into separate components */
|
/* 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;
|
char *s, tmp[SMALLBUF], *last = NULL;
|
||||||
|
long l;
|
||||||
|
|
||||||
/* paranoia */
|
/* paranoia */
|
||||||
if ((!buf) || (!hostname) || (!port)) {
|
if ((!buf) || (!hostname) || (!port)) {
|
||||||
|
@ -1491,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");
|
fprintf(stderr, "upscli_splitaddr: no port specified after ':' separator\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
*port = (uint16_t)l;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1518,7 +1650,7 @@ int upscli_disconnect(UPSCONN_t *ups)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
net_write(ups, "LOGOUT\n", 7);
|
net_write(ups, "LOGOUT\n", 7, 0);
|
||||||
|
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
if (ups->ssl) {
|
if (ups->ssl) {
|
||||||
|
|
|
@ -21,13 +21,26 @@
|
||||||
#define UPSCLIENT_H_SEEN
|
#define UPSCLIENT_H_SEEN
|
||||||
|
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
#elif defined(WITH_NSS) /* WITH_OPENSSL */
|
||||||
#include <nss.h>
|
#include <nss.h>
|
||||||
#include <ssl.h>
|
#include <ssl.h>
|
||||||
#endif /* WITH_OPENSSL | WITH_NSS */
|
#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
|
#ifdef __cplusplus
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -41,7 +54,7 @@ extern "C" {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *host;
|
char *host;
|
||||||
int port;
|
uint16_t port;
|
||||||
int fd;
|
int fd;
|
||||||
int flags;
|
int flags;
|
||||||
int upserror;
|
int upserror;
|
||||||
|
@ -69,31 +82,33 @@ typedef struct {
|
||||||
const char *upscli_strerror(UPSCONN_t *ups);
|
const char *upscli_strerror(UPSCONN_t *ups);
|
||||||
|
|
||||||
int upscli_init(int certverify, const char *certpath, const char *certname, const char *certpasswd);
|
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_tryconnect(UPSCONN_t *ups, const char *host, uint16_t port, int flags, struct timeval *tv);
|
||||||
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);
|
||||||
|
|
||||||
void upscli_add_host_cert(const char* hostname, const char* certname, int certverify, int forcessl);
|
void upscli_add_host_cert(const char* hostname, const char* certname, int certverify, int forcessl);
|
||||||
|
|
||||||
/* --- functions that only use the new names --- */
|
/* --- functions that only use the new names --- */
|
||||||
|
|
||||||
int upscli_get(UPSCONN_t *ups, unsigned int numq, const char **query,
|
int upscli_get(UPSCONN_t *ups, size_t numq, const char **query,
|
||||||
unsigned int *numa, char ***answer);
|
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,
|
int upscli_list_next(UPSCONN_t *ups, size_t numq, const char **query,
|
||||||
unsigned int *numa, char ***answer);
|
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 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);
|
int upscli_disconnect(UPSCONN_t *ups);
|
||||||
|
|
||||||
|
@ -103,7 +118,7 @@ int upscli_fd(UPSCONN_t *ups);
|
||||||
int upscli_upserror(UPSCONN_t *ups);
|
int upscli_upserror(UPSCONN_t *ups);
|
||||||
|
|
||||||
/* returns 1 if SSL mode is active for this connection */
|
/* returns 1 if SSL mode is active for this connection */
|
||||||
int upscli_ssl(UPSCONN_t *ups);
|
int upscli_ssl(UPSCONN_t *ups);
|
||||||
|
|
||||||
/* upsclient error list */
|
/* upsclient error list */
|
||||||
|
|
||||||
|
|
148
clients/upscmd.c
148
clients/upscmd.c
|
@ -1,6 +1,8 @@
|
||||||
/* upscmd - simple "client" to test instant commands via upsd
|
/* 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
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -26,10 +28,13 @@
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include "nut_stdint.h"
|
||||||
#include "upsclient.h"
|
#include "upsclient.h"
|
||||||
|
|
||||||
static char *upsname = NULL, *hostname = NULL;
|
static char *upsname = NULL, *hostname = NULL;
|
||||||
static UPSCONN_t *ups = NULL;
|
static UPSCONN_t *ups = NULL;
|
||||||
|
static int tracking_enabled = 0;
|
||||||
|
static unsigned int timeout = DEFAULT_TRACKING_TIMEOUT;
|
||||||
|
|
||||||
struct list_t {
|
struct list_t {
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -41,13 +46,16 @@ static void usage(const char *prog)
|
||||||
printf("Network UPS Tools upscmd %s\n\n", UPS_VERSION);
|
printf("Network UPS Tools upscmd %s\n\n", UPS_VERSION);
|
||||||
printf("usage: %s [-h]\n", prog);
|
printf("usage: %s [-h]\n", prog);
|
||||||
printf(" %s [-l <ups>]\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("Administration program to initiate instant commands on UPS hardware.\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf(" -h display this help text\n");
|
printf(" -h display this help text\n");
|
||||||
printf(" -l <ups> show available commands on UPS <ups>\n");
|
printf(" -l <ups> show available commands on UPS <ups>\n");
|
||||||
printf(" -u <username> set username for command authentication\n");
|
printf(" -u <username> set username for command authentication\n");
|
||||||
printf(" -p <password> set password 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("\n");
|
||||||
printf(" <ups> UPS identifier - <upsname>[@<hostname>[:<port>]]\n");
|
printf(" <ups> UPS identifier - <upsname>[@<hostname>[:<port>]]\n");
|
||||||
printf(" <command> Valid instant command - test.panel.start, etc.\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)
|
static void print_cmd(char *cmdname)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
|
|
||||||
|
@ -80,7 +88,7 @@ static void print_cmd(char *cmdname)
|
||||||
static void listcmds(void)
|
static void listcmds(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
struct list_t *lhead = NULL, *llast = NULL, *ltmp, *lnext;
|
struct list_t *lhead = NULL, *llast = NULL, *ltmp, *lnext;
|
||||||
|
@ -105,7 +113,7 @@ static void listcmds(void)
|
||||||
|
|
||||||
/* CMD <upsname> <cmdname> */
|
/* CMD <upsname> <cmdname> */
|
||||||
if (numa < 3) {
|
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,
|
/* 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)
|
static void do_cmd(char **argv, const int argc)
|
||||||
{
|
{
|
||||||
|
int cmd_complete = 0;
|
||||||
char buf[SMALLBUF];
|
char buf[SMALLBUF];
|
||||||
|
char tracking_id[UUID4_LEN];
|
||||||
|
time_t start, now;
|
||||||
|
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
snprintf(buf, sizeof(buf), "INSTCMD %s %s %s\n", upsname, argv[0], argv[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));
|
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) {
|
if (strncmp(buf, "OK", 2) != 0) {
|
||||||
fatalx(EXIT_FAILURE, "Unexpected response from upsd: %s", buf);
|
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);
|
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)
|
static void clean_exit(void)
|
||||||
{
|
{
|
||||||
|
@ -175,12 +270,14 @@ static void clean_exit(void)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
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;
|
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]);
|
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)
|
switch (i)
|
||||||
{
|
{
|
||||||
|
@ -198,8 +295,20 @@ int main(int argc, char **argv)
|
||||||
have_pw = 1;
|
have_pw = 1;
|
||||||
break;
|
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':
|
case 'V':
|
||||||
fatalx(EXIT_SUCCESS, "Network UPS Tools upscmd %s", UPS_VERSION);
|
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':
|
case 'h':
|
||||||
default:
|
default:
|
||||||
|
@ -313,6 +422,25 @@ int main(int argc, char **argv)
|
||||||
fatalx(EXIT_FAILURE, "Set password failed: %s", upscli_strerror(ups));
|
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);
|
do_cmd(&argv[1], argc - 1);
|
||||||
|
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "nut_stdint.h"
|
||||||
#include "upsclient.h"
|
#include "upsclient.h"
|
||||||
#include "cgilib.h"
|
#include "cgilib.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -49,7 +50,7 @@
|
||||||
|
|
||||||
static char *monhost = NULL, *cmd = NULL;
|
static char *monhost = NULL, *cmd = NULL;
|
||||||
|
|
||||||
static int port;
|
static uint16_t port;
|
||||||
static char *upsname, *hostname;
|
static char *upsname, *hostname;
|
||||||
static UPSCONN_t ups;
|
static UPSCONN_t ups;
|
||||||
|
|
||||||
|
@ -60,7 +61,7 @@ static UPSCONN_t ups;
|
||||||
|
|
||||||
void parsearg(char *var, char *value)
|
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 */
|
/* avoid bogus junk from evil people */
|
||||||
if ((strlen(var) > MAX_CGI_STRLEN) || (strlen(value) > MAX_CGI_STRLEN))
|
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++) {
|
for (i = 0; imgarg[i].name != NULL; i++) {
|
||||||
if (!strcmp(imgarg[i].name, var)) {
|
if (!strcmp(imgarg[i].name, var)) {
|
||||||
if (!strncmp(value, "0x", 2))
|
if (!strncmp(value, "0x", 2))
|
||||||
v = strtoul(value + 2, (char **)NULL, 16);
|
v = (long long)strtoul(value + 2, (char **)NULL, 16);
|
||||||
else
|
else
|
||||||
v = atoi(value);
|
v = (long long)atoi(value);
|
||||||
|
|
||||||
/* avoid false numbers from bad people */
|
/* avoid false numbers from bad people */
|
||||||
if (v < imgarg[i].min)
|
if (v < imgarg[i].min)
|
||||||
imgarg[i].val = imgarg[i].min;
|
imgarg[i].val = imgarg[i].min;
|
||||||
else if (v > imgarg[i].max)
|
else if (v > imgarg[i].max)
|
||||||
imgarg[i].val = imgarg[i].max;
|
imgarg[i].val = imgarg[i].max;
|
||||||
else
|
else {
|
||||||
imgarg[i].val = v;
|
assert (v < INT_MAX);
|
||||||
|
assert (v > INT_MIN);
|
||||||
|
imgarg[i].val = (int)v;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,6 +115,9 @@ static int get_imgarg(const char *name)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write the HTML header then have gd dump the image */
|
/* write the HTML header then have gd dump the image */
|
||||||
|
static void drawimage(gdImagePtr im)
|
||||||
|
__attribute__((noreturn));
|
||||||
|
|
||||||
static void drawimage(gdImagePtr im)
|
static void drawimage(gdImagePtr im)
|
||||||
{
|
{
|
||||||
printf("Pragma: no-cache\n");
|
printf("Pragma: no-cache\n");
|
||||||
|
@ -191,7 +198,7 @@ static void drawscale(
|
||||||
if (level % step5 == 0)
|
if (level % step5 == 0)
|
||||||
gdImageLine(im, 5, y, width - 5, y, col2);
|
gdImageLine(im, 5, y, width - 5, y, col2);
|
||||||
else
|
else
|
||||||
gdImageLine(im, 10, y, width - 10, y, col2);
|
gdImageLine(im, 10, y, width - 10, y, col2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,13 +207,25 @@ static void drawscale(
|
||||||
if (level % step10 == 0) {
|
if (level % step10 == 0) {
|
||||||
y = scale_height * (lvlhi - level) / range;
|
y = scale_height * (lvlhi - level) / range;
|
||||||
snprintf(lbltxt, sizeof(lbltxt), "%d", level);
|
snprintf(lbltxt, sizeof(lbltxt), "%d", level);
|
||||||
gdImageString(im, gdFontMediumBold, width - strlen(lbltxt)*gdFontMediumBold->w, y,
|
gdImageString(im, gdFontMediumBold,
|
||||||
(unsigned char *) lbltxt, scale_num_color);
|
width - (int)(strlen(lbltxt)) * gdFontMediumBold->w,
|
||||||
|
y, (unsigned char *) lbltxt, scale_num_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draws the bar style indicator */
|
/* 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(
|
static void drawbar(
|
||||||
int lvllo, int lvlhi, /* min and max numbers on the scale */
|
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 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"));
|
summary_color = color_alloc(im, get_imgarg("summary_col"));
|
||||||
|
|
||||||
/* rescale UPS value to fit in the scale */
|
/* 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: */
|
/* sanity checks: */
|
||||||
|
|
||||||
|
@ -257,9 +276,21 @@ static void drawbar(
|
||||||
bar_color);
|
bar_color);
|
||||||
|
|
||||||
/* stick the text version of the value at the bottom center */
|
/* 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);
|
snprintf(text, sizeof(text), format, value);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
gdImageString(im, gdFontMediumBold,
|
gdImageString(im, gdFontMediumBold,
|
||||||
(width - strlen(text)*gdFontMediumBold->w)/2,
|
(width - (int)(strlen(text))*gdFontMediumBold->w)/2,
|
||||||
height - gdFontMediumBold->h,
|
height - gdFontMediumBold->h,
|
||||||
(unsigned char *) text, summary_color);
|
(unsigned char *) text, summary_color);
|
||||||
|
|
||||||
|
@ -269,6 +300,9 @@ static void drawbar(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draws the error image */
|
/* draws the error image */
|
||||||
|
static void noimage(const char *fmt, ...)
|
||||||
|
__attribute__((noreturn));
|
||||||
|
|
||||||
static void noimage(const char *fmt, ...)
|
static void noimage(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
gdImagePtr im;
|
gdImagePtr im;
|
||||||
|
@ -278,7 +312,19 @@ static void noimage(const char *fmt, ...)
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
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);
|
vsnprintf(msg, sizeof(msg), fmt, ap);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
width = get_imgarg("width");
|
width = get_imgarg("width");
|
||||||
|
@ -293,17 +339,23 @@ static void noimage(const char *fmt, ...)
|
||||||
|
|
||||||
if (width > height)
|
if (width > height)
|
||||||
gdImageString(im, gdFontMediumBold,
|
gdImageString(im, gdFontMediumBold,
|
||||||
(width - strlen(msg)*gdFontMediumBold->w)/2,
|
(width - (int)(strlen(msg))*gdFontMediumBold->w)/2,
|
||||||
(height - gdFontMediumBold->h)/2,
|
(height - gdFontMediumBold->h)/2,
|
||||||
(unsigned char *) msg, summary_color);
|
(unsigned char *) msg, summary_color);
|
||||||
else
|
else
|
||||||
gdImageStringUp(im, gdFontMediumBold,
|
gdImageStringUp(im, gdFontMediumBold,
|
||||||
(width - gdFontMediumBold->h)/2,
|
(width - gdFontMediumBold->h)/2,
|
||||||
(height + strlen(msg)*gdFontMediumBold->w)/2,
|
(height + (int)(strlen(msg))*gdFontMediumBold->w)/2,
|
||||||
(unsigned char *) msg, summary_color);
|
(unsigned char *) msg, summary_color);
|
||||||
|
|
||||||
drawimage(im);
|
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 */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,6 +363,10 @@ static void noimage(const char *fmt, ...)
|
||||||
UPS variable can be determined.
|
UPS variable can be determined.
|
||||||
deviation < 0 means that values below nom should be grey instead of
|
deviation < 0 means that values below nom should be grey instead of
|
||||||
green */
|
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,
|
static void drawgeneralbar(double var, int min, int nom, int max,
|
||||||
int deviation, const char *format)
|
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 */
|
/* 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,
|
static void draw_utility(double var, int min, int nom, int max,
|
||||||
int deviation, const char *format)
|
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
|
/* Acceptable range of voltage is 85%-110% of nominal voltage
|
||||||
* in EU at least. Be conservative and say +-10% */
|
* 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);
|
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 */
|
/* draws battery.percent bar style indicator */
|
||||||
static void draw_battpct(double var, int min, int nom, int max,
|
static void draw_battpct(double var, int min, int nom,
|
||||||
int deviation, const char *format)
|
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) {
|
if (min < 0) {
|
||||||
min = 50;
|
min = 50;
|
||||||
}
|
}
|
||||||
|
@ -424,6 +492,10 @@ static void draw_battpct(double var, int min, int nom, int max,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draws battery.voltage bar style indicator */
|
/* 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,
|
static void draw_battvolt(double var, int min, int nom, int max,
|
||||||
int deviation, const char *format)
|
int deviation, const char *format)
|
||||||
{
|
{
|
||||||
|
@ -450,18 +522,17 @@ static void draw_battvolt(double var, int min, int nom, int max,
|
||||||
}
|
}
|
||||||
|
|
||||||
if(min == -1) {
|
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) {
|
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)
|
if (nom < min || nom > max)
|
||||||
nom = -1;
|
nom = -1;
|
||||||
|
|
||||||
|
deviation = (int)(-nom*0.05); /* 5% deviation from nominal voltage */
|
||||||
deviation = -(nom*0.05); /* 5% deviation from nominal voltage */
|
|
||||||
if(deviation==0) {
|
if(deviation==0) {
|
||||||
deviation = -1;
|
deviation = -1;
|
||||||
}
|
}
|
||||||
|
@ -470,33 +541,57 @@ static void draw_battvolt(double var, int min, int nom, int max,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draws ups.load bar style indicator */
|
/* 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)
|
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);
|
drawbar(0, 125, 5, 5, 25, 100, 125, -1, -1, 0, 50, var, format);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draws temperature bar style indicator */
|
/* 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,
|
static void draw_temperature(double var, int min, int nom, int max,
|
||||||
int deviation, const char *format)
|
int deviation, const char *format)
|
||||||
{
|
{
|
||||||
int hi = get_imgarg("tempmax");
|
int hi = get_imgarg("tempmax");
|
||||||
int lo = get_imgarg("tempmin");
|
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);
|
drawbar(lo, hi, 1, 5, 10, lo, min, max, hi, -1, -1, var, format);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draws humidity bar style indicator */
|
/* 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,
|
static void draw_humidity(double var, int min, int nom, int max,
|
||||||
int deviation, const char *format)
|
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);
|
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)
|
static int get_var(const char *var, char *buf, size_t buflen)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
|
|
||||||
|
@ -523,6 +618,8 @@ int main(int argc, char **argv)
|
||||||
char str[SMALLBUF];
|
char str[SMALLBUF];
|
||||||
int i, min, nom, max;
|
int i, min, nom, max;
|
||||||
double var = 0;
|
double var = 0;
|
||||||
|
NUT_UNUSED_VARIABLE(argc);
|
||||||
|
NUT_UNUSED_VARIABLE(argv);
|
||||||
|
|
||||||
extractcgiargs();
|
extractcgiargs();
|
||||||
|
|
||||||
|
@ -537,13 +634,17 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
if (upscli_splitname(monhost, &upsname, &hostname, &port) != 0) {
|
if (upscli_splitname(monhost, &upsname, &hostname, &port) != 0) {
|
||||||
noimage("Invalid UPS definition (upsname[@hostname[:port]])\n");
|
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) {
|
if (upscli_connect(&ups, hostname, port, 0) < 0) {
|
||||||
noimage("Can't connect to server:\n%s\n",
|
noimage("Can't connect to server:\n%s\n",
|
||||||
upscli_strerror(&ups));
|
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++)
|
for (i = 0; imgvar[i].name; i++)
|
||||||
|
@ -553,7 +654,9 @@ int main(int argc, char **argv)
|
||||||
registered with this variable */
|
registered with this variable */
|
||||||
if (!imgvar[i].drawfunc) {
|
if (!imgvar[i].drawfunc) {
|
||||||
noimage("Draw function N/A");
|
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 */
|
/* get the variable value */
|
||||||
|
@ -564,7 +667,9 @@ int main(int argc, char **argv)
|
||||||
snprintf(str, sizeof(str), "%s N/A",
|
snprintf(str, sizeof(str), "%s N/A",
|
||||||
imgvar[i].name);
|
imgvar[i].name);
|
||||||
noimage(str);
|
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,
|
/* when getting minimum, nominal and maximum values,
|
||||||
|
@ -617,7 +722,9 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
noimage("Unknown display");
|
noimage("Unknown display");
|
||||||
|
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
imgvar_t imgvar[] = {
|
imgvar_t imgvar[] = {
|
||||||
|
|
|
@ -17,25 +17,32 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
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
|
#ifdef __cplusplus
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
extern "C" {
|
extern "C" {
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#endif
|
#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;
|
char *name;
|
||||||
int val; /* hex digits, ala HTML */
|
int val; /* hex digits, ala HTML */
|
||||||
int min; /* minimum reasonable value */
|
int min; /* minimum reasonable value */
|
||||||
int max; /* maximum reasonable value */
|
int max; /* maximum reasonable value */
|
||||||
} imgarg[] =
|
} imgarg[] =
|
||||||
{
|
{
|
||||||
{ "width", 100, 50, 200 },
|
{ "width", 100, 50, 200 },
|
||||||
{ "height", 350, 100, 500 },
|
{ "height", 350, 100, 500 },
|
||||||
{ "scale_height", 300, 100, 500 },
|
{ "scale_height", 300, 100, 500 },
|
||||||
{ "back_col", 0x000000, 0x000000, 0xffffff },
|
{ "back_col", 0x000000, 0x000000, 0xffffff },
|
||||||
{ "scale_num_col", 0xffff00, 0x000000, 0xffffff },
|
{ "scale_num_col", 0xffff00, 0x000000, 0xffffff },
|
||||||
{ "summary_col", 0xffff00, 0x000000, 0xffffff },
|
{ "summary_col", 0xffff00, 0x000000, 0xffffff },
|
||||||
{ "ok_zone_maj_col", 0x00ff00, 0x000000, 0xffffff },
|
{ "ok_zone_maj_col", 0x00ff00, 0x000000, 0xffffff },
|
||||||
{ "ok_zone_min_col", 0x007800, 0x000000, 0xffffff },
|
{ "ok_zone_min_col", 0x007800, 0x000000, 0xffffff },
|
||||||
{ "neutral_zone_maj_col", 0xffffff, 0x000000, 0xffffff },
|
{ "neutral_zone_maj_col", 0xffffff, 0x000000, 0xffffff },
|
||||||
|
@ -47,20 +54,20 @@ struct {
|
||||||
{ "tempmax", 40, -100, 150 },
|
{ "tempmax", 40, -100, 150 },
|
||||||
{ "nom_in_freq", 50, 0, 100 },
|
{ "nom_in_freq", 50, 0, 100 },
|
||||||
{ "nom_out_freq", 50, 0, 100 },
|
{ "nom_out_freq", 50, 0, 100 },
|
||||||
{ NULL, 0, 0, 0 }
|
{ NULL, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *name; /* name of the UPS variable */
|
char *name; /* name of the UPS variable */
|
||||||
char *minimum; /* name of minimum value UPS variable
|
char *minimum; /* name of minimum value UPS variable
|
||||||
or variable in imgarg table */
|
or variable in imgarg table */
|
||||||
char *nominal; /* as above, only for nominal value */
|
char *nominal; /* as above, only for nominal value */
|
||||||
char *maximum; /* as above, only for maximum value */
|
char *maximum; /* as above, only for maximum value */
|
||||||
int deviation; /* variable deviation - width of green zone */
|
int deviation; /* variable deviation - width of green zone */
|
||||||
char *format; /* format string to generate summary text */
|
char *format; /* format string to generate summary text */
|
||||||
|
|
||||||
/* pointer to drawing function */
|
/* pointer to drawing function */
|
||||||
void (*drawfunc)(double, int, int, int, int, const char*);
|
void (*drawfunc)(double, int, int, int, int, const char*);
|
||||||
} imgvar_t;
|
} imgvar_t;
|
||||||
|
|
||||||
extern imgvar_t imgvar[];
|
extern imgvar_t imgvar[];
|
||||||
|
@ -71,3 +78,4 @@ extern imgvar_t imgvar[];
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* NUT_UPSIMAGEARG_H_SEEN */
|
||||||
|
|
|
@ -20,12 +20,12 @@
|
||||||
/* Basic theory of operation:
|
/* Basic theory of operation:
|
||||||
*
|
*
|
||||||
* First we go through and parse as much of the status format string as
|
* First we go through and parse as much of the status format string as
|
||||||
* possible. We used to do this parsing run every time, but that's a
|
* possible. We used to do this parsing run every time, but that's a
|
||||||
* waste of CPU since it can't change during the program's run.
|
* waste of CPU since it can't change during the program's run.
|
||||||
*
|
*
|
||||||
* This version does the parsing pass once, and creates a linked list of
|
* This version does the parsing pass once, and creates a linked list of
|
||||||
* pointers to the functions that do the work and the arg they get.
|
* pointers to the functions that do the work and the arg they get.
|
||||||
*
|
*
|
||||||
* That means the main loop just has to run the linked list and call
|
* That means the main loop just has to run the linked list and call
|
||||||
* anything it finds in there. Everything happens from there, and we
|
* anything it finds in there. Everything happens from there, and we
|
||||||
* don't have to pointlessly reparse the string every time around.
|
* don't have to pointlessly reparse the string every time around.
|
||||||
|
@ -37,9 +37,11 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "timehead.h"
|
#include "timehead.h"
|
||||||
|
#include "nut_stdint.h"
|
||||||
#include "upslog.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 char *upsname, *hostname;
|
||||||
static UPSCONN_t ups;
|
static UPSCONN_t ups;
|
||||||
|
|
||||||
|
@ -79,6 +81,8 @@ static void set_exit_flag(int sig)
|
||||||
|
|
||||||
static void set_print_now_flag(int 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 */
|
/* no need to do anything, the signal will cause sleep to be interrupted */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +112,9 @@ static void setup_signals(void)
|
||||||
fatal_with_errno(EXIT_FAILURE, "Can't install SIGUSR1 handler");
|
fatal_with_errno(EXIT_FAILURE, "Can't install SIGUSR1 handler");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void help(const char *prog)
|
||||||
|
__attribute__((noreturn));
|
||||||
|
|
||||||
static void help(const char *prog)
|
static void help(const char *prog)
|
||||||
{
|
{
|
||||||
printf("UPS status logger.\n");
|
printf("UPS status logger.\n");
|
||||||
|
@ -118,7 +125,9 @@ static void help(const char *prog)
|
||||||
printf(" -f <format> - Log format. See below for details.\n");
|
printf(" -f <format> - Log format. See below for details.\n");
|
||||||
printf(" - Use -f \"<format>\" so your shell doesn't break it up.\n");
|
printf(" - Use -f \"<format>\" so your shell doesn't break it up.\n");
|
||||||
printf(" -i <interval> - Time between updates, in seconds\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(" -p <pidbase> - Base name for PID file (defaults to \"%s\")\n", prog);
|
||||||
printf(" -s <ups> - Monitor UPS <ups> - <upsname>@<host>[:<port>]\n");
|
printf(" -s <ups> - Monitor UPS <ups> - <upsname>@<host>[:<port>]\n");
|
||||||
printf(" - Example: -s myups@server\n");
|
printf(" - Example: -s myups@server\n");
|
||||||
|
@ -146,6 +155,7 @@ static void do_host(const char *arg)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
char hn[LARGEBUF];
|
char hn[LARGEBUF];
|
||||||
|
NUT_UNUSED_VARIABLE(arg);
|
||||||
|
|
||||||
ret = gethostname(hn, sizeof(hn));
|
ret = gethostname(hn, sizeof(hn));
|
||||||
|
|
||||||
|
@ -159,11 +169,15 @@ static void do_host(const char *arg)
|
||||||
|
|
||||||
static void do_upshost(const char *arg)
|
static void do_upshost(const char *arg)
|
||||||
{
|
{
|
||||||
|
NUT_UNUSED_VARIABLE(arg);
|
||||||
|
|
||||||
snprintfcat(logbuffer, sizeof(logbuffer), "%s", monhost);
|
snprintfcat(logbuffer, sizeof(logbuffer), "%s", monhost);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_pid(const char *arg)
|
static void do_pid(const char *arg)
|
||||||
{
|
{
|
||||||
|
NUT_UNUSED_VARIABLE(arg);
|
||||||
|
|
||||||
snprintfcat(logbuffer, sizeof(logbuffer), "%ld", (long)getpid());
|
snprintfcat(logbuffer, sizeof(logbuffer), "%ld", (long)getpid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,6 +186,7 @@ static void do_time(const char *arg)
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
char timebuf[SMALLBUF], *format;
|
char timebuf[SMALLBUF], *format;
|
||||||
time_t tod;
|
time_t tod;
|
||||||
|
struct tm tmbuf;
|
||||||
|
|
||||||
format = xstrdup(arg);
|
format = xstrdup(arg);
|
||||||
|
|
||||||
|
@ -181,7 +196,7 @@ static void do_time(const char *arg)
|
||||||
format[i] = '%';
|
format[i] = '%';
|
||||||
|
|
||||||
time(&tod);
|
time(&tod);
|
||||||
strftime(timebuf, sizeof(timebuf), format, localtime(&tod));
|
strftime(timebuf, sizeof(timebuf), format, localtime_r(&tod, &tmbuf));
|
||||||
|
|
||||||
snprintfcat(logbuffer, sizeof(logbuffer), "%s", timebuf);
|
snprintfcat(logbuffer, sizeof(logbuffer), "%s", timebuf);
|
||||||
|
|
||||||
|
@ -191,7 +206,7 @@ static void do_time(const char *arg)
|
||||||
static void getvar(const char *var)
|
static void getvar(const char *var)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
|
|
||||||
|
@ -235,6 +250,7 @@ static void do_var(const char *arg)
|
||||||
static void do_etime(const char *arg)
|
static void do_etime(const char *arg)
|
||||||
{
|
{
|
||||||
time_t tod;
|
time_t tod;
|
||||||
|
NUT_UNUSED_VARIABLE(arg);
|
||||||
|
|
||||||
time(&tod);
|
time(&tod);
|
||||||
snprintfcat(logbuffer, sizeof(logbuffer), "%ld", (unsigned long) tod);
|
snprintfcat(logbuffer, sizeof(logbuffer), "%ld", (unsigned long) tod);
|
||||||
|
@ -269,7 +285,7 @@ static void add_call(void (*fptr)(const char *arg), const char *arg)
|
||||||
tmp->next = NULL;
|
tmp->next = NULL;
|
||||||
|
|
||||||
if (last)
|
if (last)
|
||||||
last->next = tmp;
|
last->next = tmp;
|
||||||
else
|
else
|
||||||
fhead = tmp;
|
fhead = tmp;
|
||||||
}
|
}
|
||||||
|
@ -277,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 */
|
/* turn the format string into a list of function calls with args */
|
||||||
static void compile_format(void)
|
static void compile_format(void)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
size_t i;
|
||||||
int j, found, ofs;
|
int j, found;
|
||||||
|
size_t ofs;
|
||||||
char *cmd, *arg, *ptr;
|
char *cmd, *arg, *ptr;
|
||||||
|
|
||||||
for (i = 0; i < strlen(logformat); i++) {
|
for (i = 0; i < strlen(logformat); i++) {
|
||||||
|
@ -330,7 +347,7 @@ static void compile_format(void)
|
||||||
/* see if we know how to handle this command */
|
/* see if we know how to handle this command */
|
||||||
|
|
||||||
for (j = 0; logcmds[j].name != NULL; j++) {
|
for (j = 0; logcmds[j].name != NULL; j++) {
|
||||||
if (strncasecmp(cmd, logcmds[j].name,
|
if (strncasecmp(cmd, logcmds[j].name,
|
||||||
strlen(logcmds[j].name)) == 0) {
|
strlen(logcmds[j].name)) == 0) {
|
||||||
|
|
||||||
add_call(logcmds[j].func, arg);
|
add_call(logcmds[j].func, arg);
|
||||||
|
@ -378,7 +395,7 @@ static void run_flist(void)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int interval = 30, i;
|
int interval = 30, i, foreground = -1;
|
||||||
const char *prog = xbasename(argv[0]);
|
const char *prog = xbasename(argv[0]);
|
||||||
time_t now, nextpoll = 0;
|
time_t now, nextpoll = 0;
|
||||||
const char *user = NULL;
|
const char *user = NULL;
|
||||||
|
@ -390,11 +407,13 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
printf("Network UPS Tools %s %s\n", prog, UPS_VERSION);
|
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) {
|
switch(i) {
|
||||||
case 'h':
|
case 'h':
|
||||||
help(prog);
|
help(prog);
|
||||||
|
#ifndef HAVE___ATTRIBUTE__NORETURN
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
monhost = optarg;
|
monhost = optarg;
|
||||||
|
@ -422,6 +441,14 @@ int main(int argc, char **argv)
|
||||||
case 'p':
|
case 'p':
|
||||||
pidfilebase = optarg;
|
pidfilebase = optarg;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'F':
|
||||||
|
foreground = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'B':
|
||||||
|
foreground = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,7 +489,7 @@ int main(int argc, char **argv)
|
||||||
if (!logformat)
|
if (!logformat)
|
||||||
fatalx(EXIT_FAILURE, "No format defined - but this should be impossible");
|
fatalx(EXIT_FAILURE, "No format defined - but this should be impossible");
|
||||||
|
|
||||||
printf("logging status of %s to %s (%is intervals)\n",
|
printf("logging status of %s to %s (%is intervals)\n",
|
||||||
monhost, logfn, interval);
|
monhost, logfn, interval);
|
||||||
|
|
||||||
if (upscli_splitname(monhost, &upsname, &hostname, &port) != 0) {
|
if (upscli_splitname(monhost, &upsname, &hostname, &port) != 0) {
|
||||||
|
@ -470,7 +497,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (upscli_connect(&ups, hostname, port, UPSCLI_CONN_TRYSSL) < 0)
|
if (upscli_connect(&ups, hostname, port, UPSCLI_CONN_TRYSSL) < 0)
|
||||||
fprintf(stderr, "Warning: initial connect failed: %s\n",
|
fprintf(stderr, "Warning: initial connect failed: %s\n",
|
||||||
upscli_strerror(&ups));
|
upscli_strerror(&ups));
|
||||||
|
|
||||||
if (strcmp(logfn, "-") == 0)
|
if (strcmp(logfn, "-") == 0)
|
||||||
|
@ -484,10 +511,19 @@ int main(int argc, char **argv)
|
||||||
/* now drop root if we have it */
|
/* now drop root if we have it */
|
||||||
new_uid = get_user_pwent(user);
|
new_uid = get_user_pwent(user);
|
||||||
|
|
||||||
open_syslog(prog);
|
open_syslog(prog);
|
||||||
|
|
||||||
if (logfile != stdout)
|
if (foreground < 0) {
|
||||||
|
if (logfile == stdout) {
|
||||||
|
foreground = 1;
|
||||||
|
} else {
|
||||||
|
foreground = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foreground) {
|
||||||
background();
|
background();
|
||||||
|
}
|
||||||
|
|
||||||
setup_signals();
|
setup_signals();
|
||||||
|
|
||||||
|
@ -502,7 +538,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
if (nextpoll > now) {
|
if (nextpoll > now) {
|
||||||
/* there is still time left, so sleep it off */
|
/* there is still time left, so sleep it off */
|
||||||
sleep(difftime(nextpoll, now));
|
sleep((unsigned int)(difftime(nextpoll, now)));
|
||||||
nextpoll += interval;
|
nextpoll += interval;
|
||||||
} else {
|
} else {
|
||||||
/* we spent more time in polling than the interval allows */
|
/* we spent more time in polling than the interval allows */
|
||||||
|
@ -510,7 +546,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reopen_flag) {
|
if (reopen_flag) {
|
||||||
upslogx(LOG_INFO, "Signal %d: reopening log file",
|
upslogx(LOG_INFO, "Signal %d: reopening log file",
|
||||||
reopen_flag);
|
reopen_flag);
|
||||||
reopen_log();
|
reopen_log();
|
||||||
reopen_flag = 0;
|
reopen_flag = 0;
|
||||||
|
@ -535,7 +571,7 @@ int main(int argc, char **argv)
|
||||||
fclose(logfile);
|
fclose(logfile);
|
||||||
|
|
||||||
upscli_disconnect(&ups);
|
upscli_disconnect(&ups);
|
||||||
|
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
/* upslog.h - table of functions for handling various logging functions */
|
/* upslog.h - table of functions for handling various logging functions */
|
||||||
|
|
||||||
|
#ifndef NUT_UPSLOG_H_SEEN
|
||||||
|
#define NUT_UPSLOG_H_SEEN 1
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -20,7 +23,10 @@ static void do_time(const char *arg);
|
||||||
static void do_var(const char *arg);
|
static void do_var(const char *arg);
|
||||||
static void do_etime(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;
|
const char *name;
|
||||||
void (*func)(const char *arg);
|
void (*func)(const char *arg);
|
||||||
} logcmds[] =
|
} logcmds[] =
|
||||||
|
@ -31,7 +37,7 @@ struct {
|
||||||
{ "TIME", do_time },
|
{ "TIME", do_time },
|
||||||
{ "VAR", do_var },
|
{ "VAR", do_var },
|
||||||
{ "ETIME", do_etime },
|
{ "ETIME", do_etime },
|
||||||
{ NULL, (void(*)())(NULL) }
|
{ NULL, (void(*)(const char*))(NULL) }
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -40,3 +46,4 @@ struct {
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* NUT_UPSLOG_H_SEEN */
|
||||||
|
|
583
clients/upsmon.c
583
clients/upsmon.c
File diff suppressed because it is too large
Load diff
|
@ -17,18 +17,23 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
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 */
|
/* flags for ups->status */
|
||||||
|
|
||||||
#define ST_ONLINE (1 << 0) /* UPS is on line (OL) */
|
#define ST_ONLINE (1 << 0) /* UPS is on line (OL) */
|
||||||
#define ST_ONBATT (1 << 1) /* UPS is on battery (OB) */
|
#define ST_ONBATT (1 << 1) /* UPS is on battery (OB) */
|
||||||
#define ST_LOWBATT (1 << 2) /* UPS has a low battery (LB) */
|
#define ST_LOWBATT (1 << 2) /* UPS has a low battery (LB) */
|
||||||
#define ST_FSD (1 << 3) /* master has set forced shutdown flag */
|
#define ST_FSD (1 << 3) /* primary has set forced shutdown flag */
|
||||||
#define ST_MASTER (1 << 4) /* we are the master on this UPS */
|
#define ST_PRIMARY (1 << 4) /* we are the primary (manager) of this UPS */
|
||||||
#define ST_LOGIN (1 << 5) /* we are logged into this UPS */
|
#define ST_MASTER ST_PRIMARY /* legacy alias */
|
||||||
#define ST_CONNECTED (1 << 6) /* upscli_connect returned OK */
|
#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 */
|
/* required contents of flag file */
|
||||||
#define SDMAGIC "upsmon-shutdown-file"
|
#define SDMAGIC "upsmon-shutdown-file"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
|
@ -44,9 +49,9 @@ typedef struct {
|
||||||
char *sys; /* raw system name from .conf */
|
char *sys; /* raw system name from .conf */
|
||||||
char *upsname; /* just upsname */
|
char *upsname; /* just upsname */
|
||||||
char *hostname; /* just hostname */
|
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 *un; /* username (optional for now) */
|
||||||
char *pw; /* password from conf */
|
char *pw; /* password from conf */
|
||||||
int status; /* status (see flags above) */
|
int status; /* status (see flags above) */
|
||||||
|
@ -65,16 +70,17 @@ typedef struct {
|
||||||
|
|
||||||
/* notify identifiers */
|
/* notify identifiers */
|
||||||
|
|
||||||
#define NOTIFY_ONLINE 0 /* UPS went on-line */
|
#define NOTIFY_ONLINE 0 /* UPS went on-line */
|
||||||
#define NOTIFY_ONBATT 1 /* UPS went on battery */
|
#define NOTIFY_ONBATT 1 /* UPS went on battery */
|
||||||
#define NOTIFY_LOWBATT 2 /* UPS went to low 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_COMMOK 4 /* Communication established */
|
||||||
#define NOTIFY_COMMBAD 5 /* Communication lost */
|
#define NOTIFY_COMMBAD 5 /* Communication lost */
|
||||||
#define NOTIFY_SHUTDOWN 6 /* System shutdown in progress */
|
#define NOTIFY_SHUTDOWN 6 /* System shutdown in progress */
|
||||||
#define NOTIFY_REPLBATT 7 /* UPS battery needs to be replaced */
|
#define NOTIFY_REPLBATT 7 /* UPS battery needs to be replaced */
|
||||||
#define NOTIFY_NOCOMM 8 /* UPS hasn't been contacted in awhile */
|
#define NOTIFY_NOCOMM 8 /* UPS hasn't been contacted in a while */
|
||||||
#define NOTIFY_NOPARENT 9 /* privileged parent process died */
|
#define NOTIFY_NOPARENT 9 /* privileged parent process died */
|
||||||
|
#define NOTIFY_CAL 10 /* UPS is performing calibration */
|
||||||
|
|
||||||
/* notify flag values */
|
/* notify flag values */
|
||||||
|
|
||||||
|
@ -86,7 +92,10 @@ typedef struct {
|
||||||
/* flags are set to NOTIFY_SYSLOG | NOTIFY_WALL at program init */
|
/* flags are set to NOTIFY_SYSLOG | NOTIFY_WALL at program init */
|
||||||
/* the user can override with NOTIFYFLAGS in the upsmon.conf */
|
/* 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;
|
int type;
|
||||||
const char *name;
|
const char *name;
|
||||||
char *msg; /* NULL until overridden */
|
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_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_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_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 }
|
{ 0, NULL, NULL, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -122,3 +132,5 @@ struct {
|
||||||
}
|
}
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* NUT_UPSMON_H_SEEN */
|
||||||
|
|
225
clients/upsrw.c
225
clients/upsrw.c
|
@ -1,6 +1,8 @@
|
||||||
/* upsrw - simple client for read/write variable access (formerly upsct2)
|
/* 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
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -25,10 +27,14 @@
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include "nut_stdint.h"
|
||||||
#include "upsclient.h"
|
#include "upsclient.h"
|
||||||
|
#include "extstate.h"
|
||||||
|
|
||||||
static char *upsname = NULL, *hostname = NULL;
|
static char *upsname = NULL, *hostname = NULL;
|
||||||
static UPSCONN_t *ups = NULL;
|
static UPSCONN_t *ups = NULL;
|
||||||
|
static int tracking_enabled = 0;
|
||||||
|
static unsigned int timeout = DEFAULT_TRACKING_TIMEOUT;
|
||||||
|
|
||||||
struct list_t {
|
struct list_t {
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -39,18 +45,22 @@ static void usage(const char *prog)
|
||||||
{
|
{
|
||||||
printf("Network UPS Tools %s %s\n\n", prog, UPS_VERSION);
|
printf("Network UPS Tools %s %s\n\n", prog, UPS_VERSION);
|
||||||
printf("usage: %s [-h]\n", prog);
|
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("Demo program to set variables within UPS hardware.\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf(" -h display this help text\n");
|
printf(" -h display this help text\n");
|
||||||
printf(" -s <variable> specify variable to be changed\n");
|
printf(" -s <variable> specify variable to be changed\n");
|
||||||
printf(" use -s VAR=VALUE to avoid prompting for value\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(" -u <username> set username for command authentication\n");
|
||||||
printf(" -p <password> set password 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("\n");
|
||||||
printf(" <ups> UPS identifier - <upsname>[@<hostname>[:<port>]]\n");
|
printf(" <ups> UPS identifier - <upsname>[@<hostname>[:<port>]]\n");
|
||||||
printf("\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)
|
static void clean_exit(void)
|
||||||
|
@ -64,9 +74,21 @@ static void clean_exit(void)
|
||||||
free(ups);
|
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)
|
static void do_set(const char *varname, const char *newval)
|
||||||
{
|
{
|
||||||
|
int cmd_complete = 0;
|
||||||
char buf[SMALLBUF], enc[SMALLBUF];
|
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)));
|
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));
|
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) {
|
if (strncmp(buf, "OK", 2) != 0) {
|
||||||
fatalx(EXIT_FAILURE, "Unexpected response from upsd: %s", buf);
|
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);
|
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)
|
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;
|
struct passwd *pw;
|
||||||
|
|
||||||
if (uin) {
|
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");
|
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);
|
do_set(varname, newval);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *get_data(const char *type, const char *varname)
|
static const char *get_data(const char *type, const char *varname)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
char **answer;
|
char **answer;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
|
|
||||||
|
@ -203,7 +319,7 @@ static const char *get_data(const char *type, const char *varname)
|
||||||
return answer[3];
|
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;
|
const char *val;
|
||||||
|
|
||||||
|
@ -214,14 +330,34 @@ static void do_string(const char *varname, const int len)
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Type: STRING\n");
|
printf("Type: STRING\n");
|
||||||
printf("Maximum length: %d\n", len);
|
printf("Maximum length: %ld\n", len);
|
||||||
printf("Value: %s\n", val);
|
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;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
char **answer, buf[SMALLBUF];
|
char **answer, buf[SMALLBUF];
|
||||||
const char *query[4], *val;
|
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);
|
ret = upscli_list_next(ups, numq, query, &numa, &answer);
|
||||||
|
|
||||||
printf("Type: ENUM\n");
|
/* 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) {
|
while (ret == 1) {
|
||||||
|
|
||||||
/* ENUM <upsname> <varname> <value> */
|
/* ENUM <upsname> <varname> <value> */
|
||||||
|
|
||||||
if (numa < 4) {
|
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]);
|
printf("Option: \"%s\"", answer[3]);
|
||||||
|
@ -272,7 +415,7 @@ static void do_enum(const char *varname)
|
||||||
static void do_range(const char *varname)
|
static void do_range(const char *varname)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
char **answer;
|
char **answer;
|
||||||
const char *query[4], *val;
|
const char *query[4], *val;
|
||||||
int ival, min, max;
|
int ival, min, max;
|
||||||
|
@ -299,14 +442,15 @@ static void do_range(const char *varname)
|
||||||
|
|
||||||
ret = upscli_list_next(ups, numq, query, &numa, &answer);
|
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) {
|
while (ret == 1) {
|
||||||
|
|
||||||
/* RANGE <upsname> <varname> <min> <max> */
|
/* RANGE <upsname> <varname> <min> <max> */
|
||||||
|
|
||||||
if (numa < 5) {
|
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]);
|
min = atoi(answer[3]);
|
||||||
|
@ -327,7 +471,8 @@ static void do_range(const char *varname)
|
||||||
static void do_type(const char *varname)
|
static void do_type(const char *varname)
|
||||||
{
|
{
|
||||||
int ret;
|
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;
|
char **answer;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
|
|
||||||
|
@ -339,16 +484,18 @@ static void do_type(const char *varname)
|
||||||
ret = upscli_get(ups, numq, query, &numa, &answer);
|
ret = upscli_get(ups, numq, query, &numa, &answer);
|
||||||
|
|
||||||
if ((ret < 0) || (numa < numq)) {
|
if ((ret < 0) || (numa < numq)) {
|
||||||
printf("Unknown type\n");
|
printf("Unknown type\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TYPE <upsname> <varname> <type>... */
|
/* TYPE <upsname> <varname> <type>... */
|
||||||
for (i = 3; i < numa; i++) {
|
for (i = 3; i < numa; i++) {
|
||||||
|
|
||||||
|
/* ENUM can be NUMBER or STRING
|
||||||
|
* just flag it for latter processing */
|
||||||
if (!strcasecmp(answer[i], "ENUM")) {
|
if (!strcasecmp(answer[i], "ENUM")) {
|
||||||
do_enum(varname);
|
is_enum = 1;
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcasecmp(answer[i], "RANGE")) {
|
if (!strcasecmp(answer[i], "RANGE")) {
|
||||||
|
@ -359,15 +506,21 @@ static void do_type(const char *varname)
|
||||||
if (!strncasecmp(answer[i], "STRING:", 7)) {
|
if (!strncasecmp(answer[i], "STRING:", 7)) {
|
||||||
|
|
||||||
char *len = answer[i] + 7;
|
char *len = answer[i] + 7;
|
||||||
int length = strtol(len, NULL, 10);
|
long length = strtol(len, NULL, 10);
|
||||||
|
|
||||||
do_string(varname, length);
|
if (is_enum == 1)
|
||||||
|
do_enum(varname, ST_FLAG_STRING, length);
|
||||||
|
else
|
||||||
|
do_string(varname, length);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strcasecmp(answer[i], "NUMBER")) {
|
if (!strcasecmp(answer[i], "NUMBER")) {
|
||||||
printf("Type: NUMBER\n");
|
if (is_enum == 1)
|
||||||
|
do_enum(varname, ST_FLAG_NUMBER, 0);
|
||||||
|
else
|
||||||
|
do_number(varname);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,6 +531,10 @@ static void do_type(const char *varname)
|
||||||
|
|
||||||
printf("Type: %s (unrecognized)\n", answer[i]);
|
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)
|
static void print_rw(const char *varname)
|
||||||
|
@ -402,7 +559,7 @@ static void print_rw(const char *varname)
|
||||||
static void print_rwlist(void)
|
static void print_rwlist(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[2];
|
const char *query[2];
|
||||||
char **answer;
|
char **answer;
|
||||||
struct list_t *lhead, *llast, *ltmp, *lnext;
|
struct list_t *lhead, *llast, *ltmp, *lnext;
|
||||||
|
@ -436,7 +593,7 @@ static void print_rwlist(void)
|
||||||
|
|
||||||
/* RW <upsname> <varname> <value> */
|
/* RW <upsname> <varname> <value> */
|
||||||
if (numa < 4) {
|
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 */
|
/* sock this entry away for later */
|
||||||
|
@ -473,22 +630,36 @@ static void print_rwlist(void)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i, port;
|
int i;
|
||||||
|
uint16_t port;
|
||||||
const char *prog = xbasename(argv[0]);
|
const char *prog = xbasename(argv[0]);
|
||||||
char *password = NULL, *username = NULL, *setvar = NULL;
|
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)
|
switch (i)
|
||||||
{
|
{
|
||||||
case 's':
|
case 's':
|
||||||
setvar = optarg;
|
setvar = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
if (setvar) {
|
||||||
|
upslogx(LOG_WARNING, "Listing mode requested, overriding setvar specified earlier!");
|
||||||
|
setvar = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
password = optarg;
|
password = optarg;
|
||||||
break;
|
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':
|
case 'u':
|
||||||
username = optarg;
|
username = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'w':
|
||||||
|
tracking_enabled = 1;
|
||||||
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
printf("Network UPS Tools %s %s\n", prog, UPS_VERSION);
|
printf("Network UPS Tools %s %s\n", prog, UPS_VERSION);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
|
|
@ -11,8 +11,19 @@
|
||||||
# from your AT lines.
|
# from your AT lines.
|
||||||
|
|
||||||
case $1 in
|
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)
|
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"
|
logger -t upssched-cmd "Unrecognized command: $1"
|
||||||
|
|
|
@ -46,9 +46,12 @@
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "upssched.h"
|
#include "upssched.h"
|
||||||
#include "timehead.h"
|
#include "timehead.h"
|
||||||
|
#include "nut_stdint.h"
|
||||||
|
|
||||||
typedef struct ttype_s {
|
typedef struct ttype_s {
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -56,14 +59,13 @@ typedef struct ttype_s {
|
||||||
struct ttype_s *next;
|
struct ttype_s *next;
|
||||||
} ttype_t;
|
} ttype_t;
|
||||||
|
|
||||||
ttype_t *thead = NULL;
|
static ttype_t *thead = NULL;
|
||||||
static conn_t *connhead = NULL;
|
static conn_t *connhead = NULL;
|
||||||
char *cmdscript = NULL, *pipefn = NULL, *lockfn = NULL;
|
static char *cmdscript = NULL, *pipefn = NULL, *lockfn = NULL;
|
||||||
int verbose = 0; /* use for debugging */
|
static int verbose = 0; /* use for debugging */
|
||||||
|
|
||||||
|
/* ups name and notify type (string) as received from upsmon */
|
||||||
/* ups name and notify type (string) as received from upsmon */
|
static const char *upsname, *notify_type;
|
||||||
const char *upsname, *notify_type;
|
|
||||||
|
|
||||||
#define PARENT_STARTED -2
|
#define PARENT_STARTED -2
|
||||||
#define PARENT_UNNECESSARY -3
|
#define PARENT_UNNECESSARY -3
|
||||||
|
@ -179,7 +181,7 @@ static void checktimers(void)
|
||||||
static void start_timer(const char *name, const char *ofsstr)
|
static void start_timer(const char *name, const char *ofsstr)
|
||||||
{
|
{
|
||||||
time_t now;
|
time_t now;
|
||||||
int ofs;
|
long ofs;
|
||||||
ttype_t *tmp, *last;
|
ttype_t *tmp, *last;
|
||||||
|
|
||||||
/* get the time */
|
/* get the time */
|
||||||
|
@ -194,7 +196,7 @@ static void start_timer(const char *name, const char *ofsstr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose)
|
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 */
|
/* now add to the queue */
|
||||||
tmp = last = thead;
|
tmp = last = thead;
|
||||||
|
@ -240,7 +242,7 @@ static void cancel_timer(const char *name, const char *cname)
|
||||||
static void us_serialize(int op)
|
static void us_serialize(int op)
|
||||||
{
|
{
|
||||||
static int pipefd[2];
|
static int pipefd[2];
|
||||||
int ret;
|
ssize_t ret;
|
||||||
char ch;
|
char ch;
|
||||||
|
|
||||||
switch(op) {
|
switch(op) {
|
||||||
|
@ -270,6 +272,7 @@ static int open_sock(void)
|
||||||
int ret, fd;
|
int ret, fd;
|
||||||
struct sockaddr_un ssaddr;
|
struct sockaddr_un ssaddr;
|
||||||
|
|
||||||
|
check_unix_socket_filename(pipefn);
|
||||||
fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
fd = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||||
|
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
|
@ -297,6 +300,9 @@ static int open_sock(void)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
fatal_with_errno(EXIT_FAILURE, "listen(%d, %d) failed", fd, US_LISTEN_BACKLOG);
|
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;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,17 +335,40 @@ static void conn_del(conn_t *target)
|
||||||
|
|
||||||
static int send_to_one(conn_t *conn, const char *fmt, ...)
|
static int send_to_one(conn_t *conn, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
int ret;
|
ssize_t ret;
|
||||||
|
size_t buflen;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char buf[US_SOCK_BUF_LEN];
|
char buf[US_SOCK_BUF_LEN];
|
||||||
|
|
||||||
va_start(ap, fmt);
|
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);
|
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
va_end(ap);
|
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);
|
upsdebugx(2, "write to fd %d failed", conn->fd);
|
||||||
|
|
||||||
close(conn->fd);
|
close(conn->fd);
|
||||||
|
@ -356,7 +385,7 @@ static void conn_add(int sockfd)
|
||||||
int acc, ret;
|
int acc, ret;
|
||||||
conn_t *tmp, *last;
|
conn_t *tmp, *last;
|
||||||
struct sockaddr_un saddr;
|
struct sockaddr_un saddr;
|
||||||
#if defined(__hpux) && !defined(_XOPEN_SOURCE_EXTENDED)
|
#if defined(__hpux) && !defined(_XOPEN_SOURCE_EXTENDED)
|
||||||
int salen;
|
int salen;
|
||||||
#else
|
#else
|
||||||
socklen_t salen;
|
socklen_t salen;
|
||||||
|
@ -370,6 +399,9 @@ static void conn_add(int sockfd)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* don't leak connection to CMDSCRIPT */
|
||||||
|
fcntl(acc, F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
/* enable nonblocking I/O */
|
/* enable nonblocking I/O */
|
||||||
|
|
||||||
ret = fcntl(acc, F_GETFL, 0);
|
ret = fcntl(acc, F_GETFL, 0);
|
||||||
|
@ -440,19 +472,20 @@ static int sock_arg(conn_t *conn)
|
||||||
return 0;
|
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: ");
|
upslogx(LOG_INFO, "Unknown command on socket: ");
|
||||||
|
|
||||||
for (i = 0; i < numarg; i++)
|
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)
|
static int sock_read(conn_t *conn)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i;
|
||||||
|
ssize_t ret;
|
||||||
char ch;
|
char ch;
|
||||||
|
|
||||||
for (i = 0; i < US_MAX_READ; i++) {
|
for (i = 0; i < US_MAX_READ; i++) {
|
||||||
|
@ -465,13 +498,19 @@ static int sock_read(conn_t *conn)
|
||||||
if ((ret == -1) && (errno == EAGAIN))
|
if ((ret == -1) && (errno == EAGAIN))
|
||||||
return 0;
|
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 */
|
/* some other problem */
|
||||||
return -1; /* error */
|
return -1; /* error */
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pconf_char(&conn->ctx, ch);
|
ret = pconf_char(&conn->ctx, ch);
|
||||||
|
|
||||||
if (ret == 0) /* nothing to parse yet */
|
if (ret == 0) /* nothing to parse yet */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
|
@ -594,6 +633,8 @@ static int try_connect(void)
|
||||||
int pipefd, ret;
|
int pipefd, ret;
|
||||||
struct sockaddr_un saddr;
|
struct sockaddr_un saddr;
|
||||||
|
|
||||||
|
check_unix_socket_filename(pipefn);
|
||||||
|
|
||||||
memset(&saddr, '\0', sizeof(saddr));
|
memset(&saddr, '\0', sizeof(saddr));
|
||||||
saddr.sun_family = AF_UNIX;
|
saddr.sun_family = AF_UNIX;
|
||||||
snprintf(saddr.sun_path, sizeof(saddr.sun_path), "%s", pipefn);
|
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);
|
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)
|
static void sendcmd(const char *cmd, const char *arg1, const char *arg2)
|
||||||
{
|
{
|
||||||
int i, pipefd, ret;
|
int i, pipefd;
|
||||||
char buf[SMALLBUF], enc[SMALLBUF];
|
ssize_t ret;
|
||||||
|
size_t enclen, buflen;
|
||||||
|
char buf[SMALLBUF], enc[SMALLBUF + 8];
|
||||||
|
int ret_s;
|
||||||
|
struct timeval tv;
|
||||||
|
fd_set fdread;
|
||||||
|
|
||||||
/* insanity */
|
/* insanity */
|
||||||
if (!arg1)
|
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);
|
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) */
|
/* see if the parent needs to be started (and maybe start it) */
|
||||||
|
|
||||||
for (i = 0; i < MAX_TRIES; i++) {
|
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);
|
pipefd = check_parent(cmd, arg2);
|
||||||
|
|
||||||
if (pipefd == PARENT_STARTED) {
|
if (pipefd == PARENT_STARTED) {
|
||||||
|
|
||||||
/* loop back and try to connect now */
|
/* loop back and try to connect now */
|
||||||
usleep(250000);
|
usleep(250000);
|
||||||
continue;
|
continue;
|
||||||
|
@ -715,23 +750,41 @@ static void sendcmd(const char *cmd, const char *arg1, const char *arg2)
|
||||||
|
|
||||||
/* we're connected now */
|
/* 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 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");
|
upslogx(LOG_ERR, "write failed, trying again");
|
||||||
close(pipefd);
|
close(pipefd);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ugh - probably should use select here... */
|
/* select on child's pipe fd */
|
||||||
setup_sigalrm();
|
do {
|
||||||
|
/* set timeout every time before call select() */
|
||||||
|
tv.tv_sec = 1;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
alarm(2);
|
FD_ZERO(&fdread);
|
||||||
ret = read(pipefd, buf, sizeof(buf));
|
FD_SET(pipefd, &fdread);
|
||||||
alarm(0);
|
|
||||||
|
|
||||||
signal(SIGALRM, SIG_IGN);
|
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));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (ret_s <= 0);
|
||||||
|
|
||||||
close(pipefd);
|
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);
|
upslogx(LOG_ERR, "read confirmation got [%s]", buf);
|
||||||
|
|
||||||
/* try again ... */
|
/* try again ... */
|
||||||
}
|
} /* loop until MAX_TRIES if no success above */
|
||||||
|
|
||||||
fatalx(EXIT_FAILURE, "Unable to connect to daemon and unable to start daemon");
|
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 (!strcmp(cmd, "EXECUTE")) {
|
||||||
if (ca1 == '\0') {
|
if (ca1[0] == '\0') {
|
||||||
upslogx(LOG_ERR, "Empty EXECUTE command argument");
|
upslogx(LOG_ERR, "Empty EXECUTE command argument");
|
||||||
return;
|
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);
|
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)
|
if (numargs < 2)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -900,9 +953,15 @@ static void checkconf(void)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
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 */
|
/* normally we don't have stderr, so get this going to syslog early */
|
||||||
open_syslog(prog);
|
open_syslog(prog);
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
/* upssched.h - supporting structures */
|
/* upssched.h - supporting structures */
|
||||||
|
|
||||||
|
#ifndef NUT_UPSSCHED_H_SEEN
|
||||||
|
#define NUT_UPSSCHED_H_SEEN 1
|
||||||
|
|
||||||
#include <parseconf.h>
|
#include <parseconf.h>
|
||||||
|
|
||||||
#define SERIALIZE_INIT 1
|
#define SERIALIZE_INIT 1
|
||||||
|
@ -25,3 +28,4 @@ typedef struct conn_s {
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* NUT_UPSSCHED_H_SEEN */
|
||||||
|
|
118
clients/upsset.c
118
clients/upsset.c
|
@ -24,6 +24,7 @@
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include "nut_stdint.h"
|
||||||
#include "upsclient.h"
|
#include "upsclient.h"
|
||||||
#include "cgilib.h"
|
#include "cgilib.h"
|
||||||
#include "parseconf.h"
|
#include "parseconf.h"
|
||||||
|
@ -39,12 +40,12 @@ struct list_t {
|
||||||
#define HARD_UPSVAR_LIMIT_NUM 64
|
#define HARD_UPSVAR_LIMIT_NUM 64
|
||||||
#define HARD_UPSVAR_LIMIT_LEN 256
|
#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 */
|
/* 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 char *upsname, *hostname;
|
||||||
static UPSCONN_t ups;
|
static UPSCONN_t ups;
|
||||||
|
|
||||||
|
@ -54,7 +55,7 @@ typedef struct {
|
||||||
void *next;
|
void *next;
|
||||||
} uvtype_t;
|
} uvtype_t;
|
||||||
|
|
||||||
uvtype_t *firstuv = NULL;
|
static uvtype_t *firstuv = NULL;
|
||||||
|
|
||||||
void parsearg(char *var, char *value)
|
void parsearg(char *var, char *value)
|
||||||
{
|
{
|
||||||
|
@ -134,7 +135,7 @@ static void do_header(const char *title)
|
||||||
printf("<HTML>\n");
|
printf("<HTML>\n");
|
||||||
printf("<HEAD><TITLE>upsset: %s</TITLE></HEAD>\n", title);
|
printf("<HEAD><TITLE>upsset: %s</TITLE></HEAD>\n", title);
|
||||||
|
|
||||||
printf("<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\" LINK=\"#0000EE\" VLINK=\"#551A8B\">\n");
|
printf("<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\" LINK=\"#0000EE\" VLINK=\"#551A8B\">\n");
|
||||||
|
|
||||||
printf("<TABLE BGCOLOR=\"#50A0A0\" ALIGN=\"CENTER\">\n");
|
printf("<TABLE BGCOLOR=\"#50A0A0\" ALIGN=\"CENTER\">\n");
|
||||||
printf("<TR><TD>\n");
|
printf("<TR><TD>\n");
|
||||||
|
@ -144,7 +145,7 @@ static void start_table(void)
|
||||||
{
|
{
|
||||||
printf("<TABLE CELLPADDING=\"5\" CELLSPACING=\"0\" ALIGN=\"CENTER\" WIDTH=\"100%%\">\n");
|
printf("<TABLE CELLPADDING=\"5\" CELLSPACING=\"0\" ALIGN=\"CENTER\" WIDTH=\"100%%\">\n");
|
||||||
printf("<TR><TH COLSPAN=2 BGCOLOR=\"#60B0B0\">\n");
|
printf("<TR><TH COLSPAN=2 BGCOLOR=\"#60B0B0\">\n");
|
||||||
printf("<FONT SIZE=\"+2\">Network UPS Tools upsset %s</FONT>\n",
|
printf("<FONT SIZE=\"+2\">Network UPS Tools upsset %s</FONT>\n",
|
||||||
UPS_VERSION);
|
UPS_VERSION);
|
||||||
printf("</TH></TR>\n");
|
printf("</TH></TR>\n");
|
||||||
}
|
}
|
||||||
|
@ -158,12 +159,12 @@ static void do_hidden(const char *next)
|
||||||
password);
|
password);
|
||||||
|
|
||||||
if (next)
|
if (next)
|
||||||
printf("<INPUT TYPE=\"HIDDEN\" NAME=\"function\" VALUE=\"%s\">\n",
|
printf("<INPUT TYPE=\"HIDDEN\" NAME=\"function\" VALUE=\"%s\">\n",
|
||||||
next);
|
next);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generate SELECT chooser from hosts.conf entries */
|
/* 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)
|
if (numargs < 3)
|
||||||
return;
|
return;
|
||||||
|
@ -222,7 +223,7 @@ static void do_pickups(const char *currfunc)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
upslist_arg(ctx.numargs, ctx.arglist);
|
upslist_arg(ctx.numargs, ctx.arglist);
|
||||||
}
|
}
|
||||||
|
|
||||||
pconf_finish(&ctx);
|
pconf_finish(&ctx);
|
||||||
|
@ -253,6 +254,10 @@ static void do_pickups(const char *currfunc)
|
||||||
printf("</FORM>\n");
|
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,
|
static void error_page(const char *next, const char *title,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
@ -260,7 +265,19 @@ static void error_page(const char *next, const char *title,
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
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);
|
vsnprintf(msg, sizeof(msg), fmt, ap);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
do_header(title);
|
do_header(title);
|
||||||
|
@ -282,6 +299,9 @@ static void error_page(const char *next, const char *title,
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void loginscreen(void)
|
||||||
|
__attribute__((noreturn));
|
||||||
|
|
||||||
static void loginscreen(void)
|
static void loginscreen(void)
|
||||||
{
|
{
|
||||||
do_header("Login");
|
do_header("Login");
|
||||||
|
@ -331,7 +351,7 @@ static void upsd_connect(void)
|
||||||
static void print_cmd(const char *cmd)
|
static void print_cmd(const char *cmd)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
char **answer;
|
char **answer;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
|
|
||||||
|
@ -354,7 +374,7 @@ static void print_cmd(const char *cmd)
|
||||||
static void showcmds(void)
|
static void showcmds(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[2];
|
const char *query[2];
|
||||||
char **answer;
|
char **answer;
|
||||||
struct list_t *lhead, *llast, *ltmp, *lnext;
|
struct list_t *lhead, *llast, *ltmp, *lnext;
|
||||||
|
@ -391,7 +411,7 @@ static void showcmds(void)
|
||||||
/* CMD upsname cmdname */
|
/* CMD upsname cmdname */
|
||||||
if (numa < 3) {
|
if (numa < 3) {
|
||||||
fprintf(stderr, "Error: insufficient data "
|
fprintf(stderr, "Error: insufficient data "
|
||||||
"(got %d args, need at least 3)\n", numa);
|
"(got %zu args, need at least 3)\n", numa);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -466,7 +486,7 @@ static void showcmds(void)
|
||||||
|
|
||||||
upscli_disconnect(&ups);
|
upscli_disconnect(&ups);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* handle setting authentication data in the server */
|
/* handle setting authentication data in the server */
|
||||||
static void send_auth(const char *next)
|
static void send_auth(const char *next)
|
||||||
|
@ -491,7 +511,7 @@ static void send_auth(const char *next)
|
||||||
"upsd version too old - USERNAME not supported");
|
"upsd version too old - USERNAME not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
error_page(next, "Can't set user name",
|
error_page(next, "Can't set user name",
|
||||||
"Set user name failed: %s", upscli_strerror(&ups));
|
"Set user name failed: %s", upscli_strerror(&ups));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -504,7 +524,10 @@ static void send_auth(const char *next)
|
||||||
if (upscli_readline(&ups, buf, sizeof(buf)) < 0)
|
if (upscli_readline(&ups, buf, sizeof(buf)) < 0)
|
||||||
error_page(next, "Can't set password",
|
error_page(next, "Can't set password",
|
||||||
"Password set failed: %s", upscli_strerror(&ups));
|
"Password set failed: %s", upscli_strerror(&ups));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void docmd(void)
|
||||||
|
__attribute__((noreturn));
|
||||||
|
|
||||||
static void docmd(void)
|
static void docmd(void)
|
||||||
{
|
{
|
||||||
|
@ -515,13 +538,13 @@ static void docmd(void)
|
||||||
"Access to that host is not authorized");
|
"Access to that host is not authorized");
|
||||||
|
|
||||||
/* the user is messing with us */
|
/* the user is messing with us */
|
||||||
if (!upscommand)
|
if (!upscommand)
|
||||||
error_page("showcmds", "Form error",
|
error_page("showcmds", "Form error",
|
||||||
"No instant command selected");
|
"No instant command selected");
|
||||||
|
|
||||||
/* (l)user took the default blank option */
|
/* (l)user took the default blank option */
|
||||||
if (strlen(upscommand) == 0)
|
if (strlen(upscommand) == 0)
|
||||||
error_page("showcmds", "Form error",
|
error_page("showcmds", "Form error",
|
||||||
"No instant command selected");
|
"No instant command selected");
|
||||||
|
|
||||||
upsd_connect();
|
upsd_connect();
|
||||||
|
@ -595,7 +618,7 @@ static void docmd(void)
|
||||||
static const char *get_data(const char *type, const char *varname)
|
static const char *get_data(const char *type, const char *varname)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
char **answer;
|
char **answer;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
|
|
||||||
|
@ -633,7 +656,7 @@ static void do_string(const char *varname, int maxlen)
|
||||||
static void do_enum(const char *varname)
|
static void do_enum(const char *varname)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
char **answer, *val;
|
char **answer, *val;
|
||||||
const char *query[4], *tmp;
|
const char *query[4], *tmp;
|
||||||
|
|
||||||
|
@ -659,8 +682,9 @@ static void do_enum(const char *varname)
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
printf("Unavailable\n");
|
printf("Unavailable\n");
|
||||||
fprintf(stderr, "Error doing ENUM %s %s: %s\n",
|
fprintf(stderr, "Error doing ENUM %s %s: %s\n",
|
||||||
upsname, varname, upscli_strerror(&ups));
|
upsname, varname, upscli_strerror(&ups));
|
||||||
|
free(val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -674,7 +698,7 @@ static void do_enum(const char *varname)
|
||||||
|
|
||||||
if (numa < 4) {
|
if (numa < 4) {
|
||||||
fprintf(stderr, "Error: insufficient data "
|
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);
|
free(val);
|
||||||
return;
|
return;
|
||||||
|
@ -697,7 +721,7 @@ static void do_enum(const char *varname)
|
||||||
static void do_type(const char *varname)
|
static void do_type(const char *varname)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int i, numq, numa;
|
size_t i, numq, numa;
|
||||||
char **answer;
|
char **answer;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
|
|
||||||
|
@ -709,7 +733,7 @@ static void do_type(const char *varname)
|
||||||
ret = upscli_get(&ups, numq, query, &numa, &answer);
|
ret = upscli_get(&ups, numq, query, &numa, &answer);
|
||||||
|
|
||||||
if ((ret < 0) || (numa < numq)) {
|
if ((ret < 0) || (numa < numq)) {
|
||||||
printf("Unknown type\n");
|
printf("Unknown type\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -727,7 +751,9 @@ static void do_type(const char *varname)
|
||||||
/* split out the :<len> data */
|
/* split out the :<len> data */
|
||||||
ptr = strchr(answer[i], ':');
|
ptr = strchr(answer[i], ':');
|
||||||
*ptr++ = '\0';
|
*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);
|
do_string(varname, len);
|
||||||
return;
|
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;
|
const char *tmp;
|
||||||
|
|
||||||
|
printf("<!-- <TR><TD>Device</TD><TD>%s</TD></TR> -->\n", arg_upsname);
|
||||||
|
|
||||||
printf("<TR BGCOLOR=\"#60B0B0\" ALIGN=\"CENTER\">\n");
|
printf("<TR BGCOLOR=\"#60B0B0\" ALIGN=\"CENTER\">\n");
|
||||||
|
|
||||||
printf("<TD>");
|
printf("<TD>");
|
||||||
|
@ -765,10 +793,13 @@ static void print_rw(const char *upsname, const char *varname)
|
||||||
printf("</TR>\n");
|
printf("</TR>\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void showsettings(void)
|
||||||
|
__attribute__((noreturn));
|
||||||
|
|
||||||
static void showsettings(void)
|
static void showsettings(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[2];
|
const char *query[2];
|
||||||
char **answer, *desc = NULL;
|
char **answer, *desc = NULL;
|
||||||
struct list_t *lhead, *llast, *ltmp, *lnext;
|
struct list_t *lhead, *llast, *ltmp, *lnext;
|
||||||
|
@ -907,13 +938,16 @@ static int setvar(const char *var, const char *val)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* turn a form submission of settings into SET commands for upsd */
|
/* turn a form submission of settings into SET commands for upsd */
|
||||||
|
static void savesettings(void)
|
||||||
|
__attribute__((noreturn));
|
||||||
|
|
||||||
static void savesettings(void)
|
static void savesettings(void)
|
||||||
{
|
{
|
||||||
int changed = 0;
|
int changed = 0;
|
||||||
char *desc;
|
char *desc;
|
||||||
uvtype_t *upsvar;
|
uvtype_t *upsvar;
|
||||||
|
|
||||||
if (!checkhost(monups, &desc))
|
if (!checkhost(monups, &desc))
|
||||||
error_page("showsettings", "Access denied",
|
error_page("showsettings", "Access denied",
|
||||||
"Access to that host is not authorized");
|
"Access to that host is not authorized");
|
||||||
|
|
||||||
|
@ -953,6 +987,9 @@ static void savesettings(void)
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void initial_pickups(void)
|
||||||
|
__attribute__((noreturn));
|
||||||
|
|
||||||
static void initial_pickups(void)
|
static void initial_pickups(void)
|
||||||
{
|
{
|
||||||
do_header("Select a UPS");
|
do_header("Select a UPS");
|
||||||
|
@ -1027,10 +1064,12 @@ static void check_conf(void)
|
||||||
fprintf(stderr, "upsset.conf does not permit execution\n");
|
fprintf(stderr, "upsset.conf does not permit execution\n");
|
||||||
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
NUT_UNUSED_VARIABLE(argc);
|
||||||
|
NUT_UNUSED_VARIABLE(argv);
|
||||||
username = password = function = monups = NULL;
|
username = password = function = monups = NULL;
|
||||||
|
|
||||||
printf("Content-type: text/html\n\n");
|
printf("Content-type: text/html\n\n");
|
||||||
|
@ -1040,15 +1079,16 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
/* see if there's anything waiting .. the server my not close STDIN properly */
|
/* see if there's anything waiting .. the server my not close STDIN properly */
|
||||||
if (1) {
|
if (1) {
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
FD_SET(STDIN_FILENO, &fds);
|
FD_SET(STDIN_FILENO, &fds);
|
||||||
tv.tv_sec = 0;
|
tv.tv_sec = 0;
|
||||||
tv.tv_usec = 250000; /* wait for up to 250ms for a POST response */
|
tv.tv_usec = 250000; /* wait for up to 250ms for a POST response */
|
||||||
if ((select(STDIN_FILENO+1, &fds, 0, 0, &tv)) > 0)
|
|
||||||
extractpostargs();
|
if ((select(STDIN_FILENO+1, &fds, 0, 0, &tv)) > 0)
|
||||||
|
extractpostargs();
|
||||||
}
|
}
|
||||||
if ((!username) || (!password) || (!function))
|
if ((!username) || (!password) || (!function))
|
||||||
loginscreen();
|
loginscreen();
|
||||||
|
@ -1074,6 +1114,6 @@ int main(int argc, char **argv)
|
||||||
docmd();
|
docmd();
|
||||||
|
|
||||||
printf("Error: Unhandled function name [%s]\n", function);
|
printf("Error: Unhandled function name [%s]\n", function);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "nut_stdint.h"
|
||||||
|
#include "timehead.h"
|
||||||
#include "upsclient.h"
|
#include "upsclient.h"
|
||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "cgilib.h"
|
#include "cgilib.h"
|
||||||
#include "parseconf.h"
|
#include "parseconf.h"
|
||||||
#include "timehead.h"
|
|
||||||
#include "upsstats.h"
|
#include "upsstats.h"
|
||||||
#include "upsimagearg.h"
|
#include "upsimagearg.h"
|
||||||
|
|
||||||
|
@ -36,7 +37,7 @@ static int use_celsius = 1, refreshdelay = -1, treemode = 0;
|
||||||
/* from cgilib's checkhost() */
|
/* from cgilib's checkhost() */
|
||||||
static char *monhostdesc = NULL;
|
static char *monhostdesc = NULL;
|
||||||
|
|
||||||
static int port;
|
static uint16_t port;
|
||||||
static char *upsname, *hostname;
|
static char *upsname, *hostname;
|
||||||
static char *upsimgpath="upsimage.cgi", *upsstatpath="upsstats.cgi";
|
static char *upsimgpath="upsimage.cgi", *upsstatpath="upsstats.cgi";
|
||||||
static UPSCONN_t ups;
|
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)
|
static int get_var(const char *var, char *buf, size_t buflen, int verbose)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
|
|
||||||
|
@ -134,7 +135,7 @@ static int get_var(const char *var, char *buf, size_t buflen, int verbose)
|
||||||
if (numa < numq) {
|
if (numa < numq) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf("[Invalid response]\n");
|
printf("[Invalid response]\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,9 +196,10 @@ static int do_date(const char *buf)
|
||||||
{
|
{
|
||||||
char datebuf[SMALLBUF];
|
char datebuf[SMALLBUF];
|
||||||
time_t tod;
|
time_t tod;
|
||||||
|
struct tm tmbuf;
|
||||||
|
|
||||||
time(&tod);
|
time(&tod);
|
||||||
if (strftime(datebuf, sizeof(datebuf), buf, localtime(&tod))) {
|
if (strftime(datebuf, sizeof(datebuf), buf, localtime_r(&tod, &tmbuf))) {
|
||||||
printf("%s", datebuf);
|
printf("%s", datebuf);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -291,12 +293,12 @@ static int do_img(char *buf)
|
||||||
|
|
||||||
/* only allow known types through */
|
/* only allow known types through */
|
||||||
|
|
||||||
if (!strcmp(type, "input.voltage")
|
if (!strcmp(type, "input.voltage")
|
||||||
|| !strcmp(type, "input.L1-N.voltage")
|
|| !strcmp(type, "input.L1-N.voltage")
|
||||||
|| !strcmp(type, "input.L2-N.voltage")
|
|| !strcmp(type, "input.L2-N.voltage")
|
||||||
|| !strcmp(type, "input.L3-N.voltage")
|
|| !strcmp(type, "input.L3-N.voltage")
|
||||||
|| !strcmp(type, "input.L1-L2.voltage")
|
|| !strcmp(type, "input.L1-L2.voltage")
|
||||||
|| !strcmp(type, "input.L2-L3.voltage")
|
|| !strcmp(type, "input.L2-L3.voltage")
|
||||||
|| !strcmp(type, "input.L3-L1.voltage")) {
|
|| !strcmp(type, "input.L3-L1.voltage")) {
|
||||||
return get_img_val(type, "Input voltage", imgargs);
|
return get_img_val(type, "Input voltage", imgargs);
|
||||||
}
|
}
|
||||||
|
@ -308,11 +310,11 @@ static int do_img(char *buf)
|
||||||
return get_img_val(type, "Battery charge", imgargs);
|
return get_img_val(type, "Battery charge", imgargs);
|
||||||
|
|
||||||
if (!strcmp(type, "output.voltage")
|
if (!strcmp(type, "output.voltage")
|
||||||
|| !strcmp(type, "output.L1-N.voltage")
|
|| !strcmp(type, "output.L1-N.voltage")
|
||||||
|| !strcmp(type, "output.L2-N.voltage")
|
|| !strcmp(type, "output.L2-N.voltage")
|
||||||
|| !strcmp(type, "output.L3-N.voltage")
|
|| !strcmp(type, "output.L3-N.voltage")
|
||||||
|| !strcmp(type, "output.L1-L2.voltage")
|
|| !strcmp(type, "output.L1-L2.voltage")
|
||||||
|| !strcmp(type, "output.L2-L3.voltage")
|
|| !strcmp(type, "output.L2-L3.voltage")
|
||||||
|| !strcmp(type, "output.L3-L1.voltage")) {
|
|| !strcmp(type, "output.L3-L1.voltage")) {
|
||||||
return get_img_val(type, "Output voltage", imgargs);
|
return get_img_val(type, "Output voltage", imgargs);
|
||||||
}
|
}
|
||||||
|
@ -349,7 +351,7 @@ static void ups_connect(void)
|
||||||
{
|
{
|
||||||
static ulist_t *lastups = NULL;
|
static ulist_t *lastups = NULL;
|
||||||
char *newups, *newhost;
|
char *newups, *newhost;
|
||||||
int newport;
|
uint16_t newport;
|
||||||
|
|
||||||
/* try to minimize reconnects */
|
/* try to minimize reconnects */
|
||||||
if (lastups) {
|
if (lastups) {
|
||||||
|
@ -363,13 +365,13 @@ static void ups_connect(void)
|
||||||
/* see if it's just on the same host */
|
/* see if it's just on the same host */
|
||||||
newups = newhost = NULL;
|
newups = newhost = NULL;
|
||||||
|
|
||||||
if (upscli_splitname(currups->sys, &newups, &newhost,
|
if (upscli_splitname(currups->sys, &newups, &newhost,
|
||||||
&newport) != 0) {
|
&newport) != 0) {
|
||||||
printf("Unusable UPS definition [%s]\n", currups->sys);
|
printf("Unusable UPS definition [%s]\n", currups->sys);
|
||||||
fprintf(stderr, "Unusable UPS definition [%s]\n",
|
fprintf(stderr, "Unusable UPS definition [%s]\n",
|
||||||
currups->sys);
|
currups->sys);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!strcmp(newhost, hostname)) && (port == newport)) {
|
if ((!strcmp(newhost, hostname)) && (port == newport)) {
|
||||||
free(upsname);
|
free(upsname);
|
||||||
|
@ -564,7 +566,7 @@ static void do_upsimgpath(const char *s) {
|
||||||
static void do_temp(const char *var)
|
static void do_temp(const char *var)
|
||||||
{
|
{
|
||||||
char tempc[SMALLBUF];
|
char tempc[SMALLBUF];
|
||||||
float tempf;
|
double tempf;
|
||||||
|
|
||||||
if (!get_var(var, tempc, sizeof(tempc), 1))
|
if (!get_var(var, tempc, sizeof(tempc), 1))
|
||||||
return;
|
return;
|
||||||
|
@ -807,7 +809,8 @@ static int do_command(char *cmd)
|
||||||
static void parse_line(const char *buf)
|
static void parse_line(const char *buf)
|
||||||
{
|
{
|
||||||
char cmd[SMALLBUF];
|
char cmd[SMALLBUF];
|
||||||
int i, len, do_cmd = 0;
|
size_t i, len;
|
||||||
|
char do_cmd = 0;
|
||||||
|
|
||||||
for (i = 0; buf[i]; i += len) {
|
for (i = 0; buf[i]; i += len) {
|
||||||
|
|
||||||
|
@ -824,9 +827,10 @@ static void parse_line(const char *buf)
|
||||||
i++; /* skip over the '@' character */
|
i++; /* skip over the '@' character */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
assert (len < INT_MAX);
|
||||||
|
|
||||||
if (do_cmd) {
|
if (do_cmd) {
|
||||||
snprintf(cmd, sizeof(cmd), "%.*s", len, &buf[i]);
|
snprintf(cmd, sizeof(cmd), "%.*s", (int)len, &buf[i]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -836,13 +840,13 @@ static void parse_line(const char *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* pass it trough */
|
/* pass it trough */
|
||||||
printf("%.*s", len, &buf[i]);
|
printf("%.*s", (int)len, &buf[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void display_template(const char *tfn)
|
static void display_template(const char *tfn)
|
||||||
{
|
{
|
||||||
char fn[SMALLBUF], buf[LARGEBUF];
|
char fn[SMALLBUF], buf[LARGEBUF];
|
||||||
|
|
||||||
snprintf(fn, sizeof(fn), "%s/%s", confpath(), tfn);
|
snprintf(fn, sizeof(fn), "%s/%s", confpath(), tfn);
|
||||||
|
|
||||||
|
@ -865,7 +869,7 @@ static void display_template(const char *tfn)
|
||||||
|
|
||||||
static void display_tree(int verbose)
|
static void display_tree(int verbose)
|
||||||
{
|
{
|
||||||
unsigned int numq, numa;
|
size_t numq, numa;
|
||||||
const char *query[4];
|
const char *query[4];
|
||||||
char **answer;
|
char **answer;
|
||||||
|
|
||||||
|
@ -890,7 +894,7 @@ static void display_tree(int verbose)
|
||||||
printf("<HTML>\n");
|
printf("<HTML>\n");
|
||||||
printf("<HEAD><TITLE>upsstat: data tree of %s</TITLE></HEAD>\n", currups->desc);
|
printf("<HEAD><TITLE>upsstat: data tree of %s</TITLE></HEAD>\n", currups->desc);
|
||||||
|
|
||||||
printf("<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\" LINK=\"#0000EE\" VLINK=\"#551A8B\">\n");
|
printf("<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\" LINK=\"#0000EE\" VLINK=\"#551A8B\">\n");
|
||||||
|
|
||||||
printf("<TABLE BGCOLOR=\"#50A0A0\" ALIGN=\"CENTER\">\n");
|
printf("<TABLE BGCOLOR=\"#50A0A0\" ALIGN=\"CENTER\">\n");
|
||||||
printf("<TR><TD>\n");
|
printf("<TR><TD>\n");
|
||||||
|
@ -910,12 +914,12 @@ static void display_tree(int verbose)
|
||||||
if (numa < 4) {
|
if (numa < 4) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf("[Invalid response]\n");
|
printf("[Invalid response]\n");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("<TR BGCOLOR=\"#60B0B0\" ALIGN=\"LEFT\">\n");
|
printf("<TR BGCOLOR=\"#60B0B0\" ALIGN=\"LEFT\">\n");
|
||||||
|
|
||||||
printf("<TD>%s</TD>\n", answer[2]);
|
printf("<TD>%s</TD>\n", answer[2]);
|
||||||
printf("<TD>:</TD>\n");
|
printf("<TD>:</TD>\n");
|
||||||
printf("<TD>%s<br></TD>\n", answer[3]);
|
printf("<TD>%s<br></TD>\n", answer[3]);
|
||||||
|
@ -936,7 +940,7 @@ static void add_ups(char *sys, char *desc)
|
||||||
|
|
||||||
tmp = last = ulhead;
|
tmp = last = ulhead;
|
||||||
|
|
||||||
while (tmp) {
|
while (tmp) {
|
||||||
last = tmp;
|
last = tmp;
|
||||||
tmp = tmp->next;
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
@ -1041,9 +1045,12 @@ static void display_single(void)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
NUT_UNUSED_VARIABLE(argc);
|
||||||
|
NUT_UNUSED_VARIABLE(argv);
|
||||||
|
|
||||||
extractcgiargs();
|
extractcgiargs();
|
||||||
|
|
||||||
printf("Content-type: text/html\n");
|
printf("Content-type: text/html\n");
|
||||||
printf("Pragma: no-cache\n");
|
printf("Pragma: no-cache\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
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
|
#ifdef __cplusplus
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -35,3 +38,4 @@ typedef struct {
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
#endif
|
#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
|
# do not hard depend on '../include/nut_version.h', since it blocks
|
||||||
# 'dist', and is only required for actual build, in which case
|
# 'dist', and is only required for actual build, in which case
|
||||||
# BUILT_SOURCES (in ../include) will ensure nut_version.h will
|
# BUILT_SOURCES (in ../include) will ensure nut_version.h will
|
||||||
# be built before anything else
|
# be built before anything else... but do depend on its build area:
|
||||||
libcommon_la_SOURCES = common.c state.c str.c upsconf.c
|
if BUILDING_IN_TREE
|
||||||
libcommonclient_la_SOURCES = common.c state.c str.c
|
# 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
|
# 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@
|
libcommon_la_LIBADD = libparseconf.la @LTLIBOBJS@
|
||||||
libcommonclient_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,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -17,7 +17,17 @@
|
||||||
# Network UPS Tools: common
|
# Network UPS Tools: common
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
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 = \
|
am__make_running_with_option = \
|
||||||
case $${target_option-} in \
|
case $${target_option-} in \
|
||||||
?) ;; \
|
?) ;; \
|
||||||
|
@ -81,20 +91,27 @@ POST_UNINSTALL = :
|
||||||
build_triplet = @build@
|
build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
target_triplet = @target@
|
target_triplet = @target@
|
||||||
|
@BUILDING_IN_TREE_TRUE@am__append_1 = common.c
|
||||||
|
@BUILDING_IN_TREE_TRUE@am__append_2 = common.c
|
||||||
subdir = common
|
subdir = common
|
||||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am atexit.c \
|
|
||||||
snprintf.c setenv.c strerror.c $(top_srcdir)/depcomp
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
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/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_asciidoc.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_libavahi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libltdl.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_libneon.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||||
|
@ -103,26 +120,39 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_os.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_report_feature.m4 \
|
||||||
|
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||||
$(top_srcdir)/configure.ac
|
$(top_srcdir)/configure.ac
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||||
CONFIG_CLEAN_FILES =
|
CONFIG_CLEAN_FILES =
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
||||||
libcommon_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@
|
libcommon_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@
|
||||||
am_libcommon_la_OBJECTS = common.lo state.lo str.lo upsconf.lo
|
am__libcommon_la_SOURCES_DIST = state.c str.c upsconf.c common.c
|
||||||
libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS)
|
@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_V@)
|
||||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||||
am__v_lt_0 = --silent
|
am__v_lt_0 = --silent
|
||||||
am__v_lt_1 =
|
am__v_lt_1 =
|
||||||
libcommonclient_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@
|
libcommonclient_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@
|
||||||
am_libcommonclient_la_OBJECTS = common.lo state.lo str.lo
|
am__libcommonclient_la_SOURCES_DIST = state.c str.c common.c
|
||||||
libcommonclient_la_OBJECTS = $(am_libcommonclient_la_OBJECTS)
|
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 =
|
libparseconf_la_LIBADD =
|
||||||
am_libparseconf_la_OBJECTS = parseconf.lo
|
am_libparseconf_la_OBJECTS = parseconf.lo
|
||||||
libparseconf_la_OBJECTS = $(am_libparseconf_la_OBJECTS)
|
libparseconf_la_OBJECTS = $(am_libparseconf_la_OBJECTS)
|
||||||
|
@ -140,7 +170,12 @@ am__v_at_0 = @
|
||||||
am__v_at_1 =
|
am__v_at_1 =
|
||||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include
|
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include
|
||||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
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
|
am__mv = mv -f
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
|
@ -160,9 +195,12 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||||
am__v_CCLD_1 =
|
am__v_CCLD_1 =
|
||||||
SOURCES = $(libcommon_la_SOURCES) $(libcommonclient_la_SOURCES) \
|
SOURCES = $(libcommon_la_SOURCES) $(nodist_libcommon_la_SOURCES) \
|
||||||
|
$(libcommonclient_la_SOURCES) \
|
||||||
|
$(nodist_libcommonclient_la_SOURCES) \
|
||||||
$(libparseconf_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)
|
$(libparseconf_la_SOURCES)
|
||||||
am__can_run_installinfo = \
|
am__can_run_installinfo = \
|
||||||
case $$AM_UPDATE_INFO_DIR in \
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
@ -188,6 +226,8 @@ am__define_uniq_tagged_files = \
|
||||||
done | $(am__uniquify_input)`
|
done | $(am__uniquify_input)`
|
||||||
ETAGS = etags
|
ETAGS = etags
|
||||||
CTAGS = ctags
|
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)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
A2X = @A2X@
|
A2X = @A2X@
|
||||||
ACLOCAL = @ACLOCAL@
|
ACLOCAL = @ACLOCAL@
|
||||||
|
@ -196,6 +236,7 @@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
ASCIIDOC = @ASCIIDOC@
|
ASCIIDOC = @ASCIIDOC@
|
||||||
ASPELL = @ASPELL@
|
ASPELL = @ASPELL@
|
||||||
|
AUGPARSE = @AUGPARSE@
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -206,6 +247,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CONFPATH = @CONFPATH@
|
CONFPATH = @CONFPATH@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
|
CPPCHECK = @CPPCHECK@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||||
|
@ -219,6 +261,7 @@ DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
DLLTOOL = @DLLTOOL@
|
DLLTOOL = @DLLTOOL@
|
||||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||||
|
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||||
|
@ -231,6 +274,7 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
@ -248,6 +292,8 @@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||||
|
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||||
|
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||||
|
@ -258,21 +304,29 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||||
|
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||||
|
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
LN_S = @LN_S@
|
LN_S = @LN_S@
|
||||||
|
LN_S_R = @LN_S_R@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
NETLIBS = @NETLIBS@
|
NETLIBS = @NETLIBS@
|
||||||
|
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||||
NM = @NM@
|
NM = @NM@
|
||||||
NMEDIT = @NMEDIT@
|
NMEDIT = @NMEDIT@
|
||||||
|
NUT_DATADIR = @NUT_DATADIR@
|
||||||
|
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||||
NUT_NETVERSION = @NUT_NETVERSION@
|
NUT_NETVERSION = @NUT_NETVERSION@
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -292,6 +346,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
||||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
PORT = @PORT@
|
PORT = @PORT@
|
||||||
|
PYTHON = @PYTHON@
|
||||||
|
PYTHON2 = @PYTHON2@
|
||||||
|
PYTHON3 = @PYTHON3@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||||
RUN_AS_USER = @RUN_AS_USER@
|
RUN_AS_USER = @RUN_AS_USER@
|
||||||
|
@ -305,6 +362,7 @@ STATEPATH = @STATEPATH@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
SUN_LIBUSB = @SUN_LIBUSB@
|
SUN_LIBUSB = @SUN_LIBUSB@
|
||||||
TREE_VERSION = @TREE_VERSION@
|
TREE_VERSION = @TREE_VERSION@
|
||||||
|
VALGRIND = @VALGRIND@
|
||||||
VERSION = @VERSION@
|
VERSION = @VERSION@
|
||||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||||
XMLLINT = @XMLLINT@
|
XMLLINT = @XMLLINT@
|
||||||
|
@ -322,6 +380,7 @@ am__leading_dot = @am__leading_dot@
|
||||||
am__quote = @am__quote@
|
am__quote = @am__quote@
|
||||||
am__tar = @am__tar@
|
am__tar = @am__tar@
|
||||||
am__untar = @am__untar@
|
am__untar = @am__untar@
|
||||||
|
auglensdir = @auglensdir@
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
build = @build@
|
build = @build@
|
||||||
build_alias = @build_alias@
|
build_alias = @build_alias@
|
||||||
|
@ -335,6 +394,9 @@ datarootdir = @datarootdir@
|
||||||
devddir = @devddir@
|
devddir = @devddir@
|
||||||
docdir = @docdir@
|
docdir = @docdir@
|
||||||
driverexecdir = @driverexecdir@
|
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@
|
dvidir = @dvidir@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
host = @host@
|
host = @host@
|
||||||
|
@ -360,12 +422,14 @@ pkgconfigdir = @pkgconfigdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
systemdshutdowndir = @systemdshutdowndir@
|
||||||
systemdsystemunitdir = @systemdsystemunitdir@
|
systemdsystemunitdir = @systemdsystemunitdir@
|
||||||
|
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||||
target = @target@
|
target = @target@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
target_cpu = @target_cpu@
|
target_cpu = @target_cpu@
|
||||||
|
@ -378,18 +442,20 @@ udevdir = @udevdir@
|
||||||
AM_CFLAGS = -I$(top_srcdir)/include
|
AM_CFLAGS = -I$(top_srcdir)/include
|
||||||
noinst_LTLIBRARIES = libparseconf.la libcommon.la libcommonclient.la
|
noinst_LTLIBRARIES = libparseconf.la libcommon.la libcommonclient.la
|
||||||
libparseconf_la_SOURCES = parseconf.c
|
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 str.c upsconf.c
|
|
||||||
libcommonclient_la_SOURCES = common.c state.c str.c
|
|
||||||
# ensure inclusion of local implementation of missing systems functions
|
# 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@
|
libcommon_la_LIBADD = libparseconf.la @LTLIBOBJS@
|
||||||
libcommonclient_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:
|
||||||
.SUFFIXES: .c .lo .o .obj
|
.SUFFIXES: .c .lo .o .obj
|
||||||
|
@ -405,14 +471,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu common/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu common/Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu common/Makefile
|
$(AUTOMAKE) --gnu common/Makefile
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' 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__depfiles_maybe);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
@ -450,15 +515,21 @@ mostlyclean-compile:
|
||||||
distclean-compile:
|
distclean-compile:
|
||||||
-rm -f *.tab.c
|
-rm -f *.tab.c
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/atexit.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@
|
@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@
|
@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@
|
@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@
|
@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@
|
@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@
|
@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@
|
@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@
|
@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:
|
.c.o:
|
||||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
||||||
|
@ -542,7 +613,10 @@ cscopelist-am: $(am__tagged_files)
|
||||||
distclean-tags:
|
distclean-tags:
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH 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'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
list='$(DISTFILES)'; \
|
list='$(DISTFILES)'; \
|
||||||
|
@ -573,11 +647,14 @@ distdir: $(DISTFILES)
|
||||||
fi; \
|
fi; \
|
||||||
done
|
done
|
||||||
check-am: all-am
|
check-am: all-am
|
||||||
check: check-am
|
check: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) check-am
|
||||||
all-am: Makefile $(LTLIBRARIES)
|
all-am: Makefile $(LTLIBRARIES)
|
||||||
installdirs:
|
installdirs:
|
||||||
install: install-am
|
install: $(BUILT_SOURCES)
|
||||||
install-exec: install-exec-am
|
$(MAKE) $(AM_MAKEFLAGS) install-am
|
||||||
|
install-exec: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) install-exec-am
|
||||||
install-data: install-data-am
|
install-data: install-data-am
|
||||||
uninstall: uninstall-am
|
uninstall: uninstall-am
|
||||||
|
|
||||||
|
@ -598,6 +675,7 @@ install-strip:
|
||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
distclean-generic:
|
distclean-generic:
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
@ -606,13 +684,23 @@ distclean-generic:
|
||||||
maintainer-clean-generic:
|
maintainer-clean-generic:
|
||||||
@echo "This command is intended for maintainers to use"
|
@echo "This command is intended for maintainers to use"
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
@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: clean-am
|
||||||
|
|
||||||
clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
|
clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
|
||||||
mostlyclean-am
|
mostlyclean-am
|
||||||
|
|
||||||
distclean: distclean-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
|
-rm -f Makefile
|
||||||
distclean-am: clean-am distclean-compile distclean-generic \
|
distclean-am: clean-am distclean-compile distclean-generic \
|
||||||
distclean-tags
|
distclean-tags
|
||||||
|
@ -658,7 +746,15 @@ install-ps-am:
|
||||||
installcheck-am:
|
installcheck-am:
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-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
|
-rm -f Makefile
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||||
|
|
||||||
|
@ -677,22 +773,45 @@ ps-am:
|
||||||
|
|
||||||
uninstall-am:
|
uninstall-am:
|
||||||
|
|
||||||
.MAKE: install-am install-strip
|
.MAKE: all check install install-am install-exec install-strip
|
||||||
|
|
||||||
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
|
.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
|
||||||
clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
|
clean-generic clean-libtool clean-noinstLTLIBRARIES \
|
||||||
ctags-am distclean distclean-compile distclean-generic \
|
cscopelist-am ctags ctags-am distclean distclean-compile \
|
||||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
distclean-generic distclean-libtool distclean-tags distdir dvi \
|
||||||
html-am info info-am install install-am install-data \
|
dvi-am html html-am info info-am install install-am \
|
||||||
install-data-am install-dvi install-dvi-am install-exec \
|
install-data install-data-am install-dvi install-dvi-am \
|
||||||
install-exec-am install-html install-html-am install-info \
|
install-exec install-exec-am install-html install-html-am \
|
||||||
install-info-am install-man install-pdf install-pdf-am \
|
install-info install-info-am install-man install-pdf \
|
||||||
install-ps install-ps-am install-strip installcheck \
|
install-pdf-am install-ps install-ps-am install-strip \
|
||||||
installcheck-am installdirs maintainer-clean \
|
installcheck installcheck-am installdirs maintainer-clean \
|
||||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
||||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
||||||
tags tags-am uninstall uninstall-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.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
|
580
common/common.c
580
common/common.c
|
@ -1,6 +1,7 @@
|
||||||
/* common.c - common useful functions
|
/* common.c - common useful functions
|
||||||
|
|
||||||
Copyright (C) 2000 Russell Kroll <rkroll@exploits.org>
|
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
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -21,8 +22,11 @@
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
|
||||||
/* the reason we define UPS_VERSION as a static string, rather than a
|
/* the reason we define UPS_VERSION as a static string, rather than a
|
||||||
macro, is to make dependency tracking easier (only common.o depends
|
macro, is to make dependency tracking easier (only common.o depends
|
||||||
|
@ -32,6 +36,52 @@
|
||||||
#include "nut_version.h"
|
#include "nut_version.h"
|
||||||
const char *UPS_VERSION = NUT_VERSION_MACRO;
|
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_debug_level = 0;
|
||||||
int nut_log_level = 0;
|
int nut_log_level = 0;
|
||||||
static int upslog_flags = UPSLOG_STDERR;
|
static int upslog_flags = UPSLOG_STDERR;
|
||||||
|
@ -51,7 +101,7 @@ static int xbit_test(int val, int flag)
|
||||||
return ((val & flag) == flag);
|
return ((val & flag) == flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* enable writing upslog_with_errno() and upslogx() type messages to
|
/* enable writing upslog_with_errno() and upslogx() type messages to
|
||||||
the syslog */
|
the syslog */
|
||||||
void syslogbit_set(void)
|
void syslogbit_set(void)
|
||||||
{
|
{
|
||||||
|
@ -126,7 +176,7 @@ void background(void)
|
||||||
close(1);
|
close(1);
|
||||||
close(2);
|
close(2);
|
||||||
|
|
||||||
if (pid != 0)
|
if (pid != 0)
|
||||||
_exit(EXIT_SUCCESS); /* parent */
|
_exit(EXIT_SUCCESS); /* parent */
|
||||||
|
|
||||||
/* child */
|
/* child */
|
||||||
|
@ -163,8 +213,32 @@ struct passwd *get_user_pwent(const char *name)
|
||||||
fatalx(EXIT_FAILURE, "user %s not found", name);
|
fatalx(EXIT_FAILURE, "user %s not found", name);
|
||||||
else
|
else
|
||||||
fatal_with_errno(EXIT_FAILURE, "getpwnam(%s)", name);
|
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 */
|
/* change to the user defined in the struct */
|
||||||
|
@ -208,7 +282,7 @@ void writepid(const char *name)
|
||||||
{
|
{
|
||||||
char fn[SMALLBUF];
|
char fn[SMALLBUF];
|
||||||
FILE *pidf;
|
FILE *pidf;
|
||||||
int mask;
|
mode_t mask;
|
||||||
|
|
||||||
/* use full path if present, else build filename in PIDPATH */
|
/* use full path if present, else build filename in PIDPATH */
|
||||||
if (*name == '/')
|
if (*name == '/')
|
||||||
|
@ -220,7 +294,9 @@ void writepid(const char *name)
|
||||||
pidf = fopen(fn, "w");
|
pidf = fopen(fn, "w");
|
||||||
|
|
||||||
if (pidf) {
|
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);
|
fclose(pidf);
|
||||||
} else {
|
} else {
|
||||||
upslog_with_errno(LOG_NOTICE, "writepid: fopen %s", fn);
|
upslog_with_errno(LOG_NOTICE, "writepid: fopen %s", fn);
|
||||||
|
@ -229,30 +305,17 @@ void writepid(const char *name)
|
||||||
umask(mask);
|
umask(mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* open pidfn, get the pid, then send it sig */
|
/* send sig to pid, returns -1 for error, or
|
||||||
int sendsignalfn(const char *pidfn, int sig)
|
* zero for a successfully sent signal
|
||||||
|
*/
|
||||||
|
int sendsignalpid(pid_t pid, int sig)
|
||||||
{
|
{
|
||||||
char buf[SMALLBUF];
|
int ret;
|
||||||
FILE *pidf;
|
|
||||||
int pid, ret;
|
|
||||||
|
|
||||||
pidf = fopen(pidfn, "r");
|
if (pid < 2 || pid > get_max_pid_t()) {
|
||||||
if (!pidf) {
|
upslogx(LOG_NOTICE,
|
||||||
upslog_with_errno(LOG_NOTICE, "fopen %s", pidfn);
|
"Ignoring invalid pid number %" PRIdMAX,
|
||||||
return -1;
|
(intmax_t) pid);
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,21 +324,78 @@ int sendsignalfn(const char *pidfn, int sig)
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
perror("kill");
|
perror("kill");
|
||||||
fclose(pidf);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now actually send it */
|
if (sig != 0) {
|
||||||
ret = kill(pid, sig);
|
/* now actually send it */
|
||||||
|
ret = kill(pid, sig);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
perror("kill");
|
perror("kill");
|
||||||
|
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);
|
fclose(pidf);
|
||||||
return -1;
|
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);
|
fclose(pidf);
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int snprintfcat(char *dst, size_t size, const char *fmt, ...)
|
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;
|
int ret;
|
||||||
|
|
||||||
size--;
|
size--;
|
||||||
assert(len <= size);
|
if (len > size) {
|
||||||
|
/* Do not truncate existing string */
|
||||||
|
errno = ERANGE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
va_start(ap, fmt);
|
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);
|
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);
|
va_end(ap);
|
||||||
|
|
||||||
dst[size] = '\0';
|
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 */
|
/* 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;
|
int ret;
|
||||||
char buf[LARGEBUF];
|
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);
|
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)))
|
if ((ret < 0) || (ret >= (int) sizeof(buf)))
|
||||||
syslog(LOG_WARNING, "vupslog: vsnprintf needed more than %d bytes",
|
syslog(LOG_WARNING, "vupslog: vsnprintf needed more than %d bytes",
|
||||||
|
@ -329,20 +501,20 @@ static void vupslog(int priority, const char *fmt, va_list va, int use_strerror)
|
||||||
snprintfcat(buf, sizeof(buf), ": %s", strerror(errno));
|
snprintfcat(buf, sizeof(buf), ": %s", strerror(errno));
|
||||||
|
|
||||||
if (nut_debug_level > 0) {
|
if (nut_debug_level > 0) {
|
||||||
static struct timeval start = { 0 };
|
static struct timeval start = { 0, 0 };
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
|
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
|
|
||||||
if (start.tv_sec == 0) {
|
if (start.tv_sec == 0) {
|
||||||
start = now;
|
start = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (start.tv_usec > now.tv_usec) {
|
if (start.tv_usec > now.tv_usec) {
|
||||||
now.tv_usec += 1000000;
|
now.tv_usec += 1000000;
|
||||||
now.tv_sec -= 1;
|
now.tv_sec -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "%4.0f.%06ld\t", difftime(now.tv_sec, start.tv_sec), (long)(now.tv_usec - start.tv_usec));
|
fprintf(stderr, "%4.0f.%06ld\t", difftime(now.tv_sec, start.tv_sec), (long)(now.tv_usec - start.tv_usec));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,7 +525,7 @@ static void vupslog(int priority, const char *fmt, va_list va, int use_strerror)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the default path for the directory containing configuration files */
|
/* Return the default path for the directory containing configuration files */
|
||||||
const char * confpath(void)
|
const char * confpath(void)
|
||||||
{
|
{
|
||||||
const char * path;
|
const char * path;
|
||||||
|
|
||||||
|
@ -364,33 +536,82 @@ const char * confpath(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the default path for the directory containing state files */
|
/* Return the default path for the directory containing state files */
|
||||||
const char * dflt_statepath(void)
|
const char * dflt_statepath(void)
|
||||||
{
|
{
|
||||||
const char * path;
|
const char * path;
|
||||||
|
|
||||||
if ((path = getenv("NUT_STATEPATH")) == NULL)
|
path = getenv("NUT_STATEPATH");
|
||||||
|
if ( (path == NULL) || (*path == '\0') )
|
||||||
path = STATEPATH;
|
path = STATEPATH;
|
||||||
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the alternate path for pid files */
|
/* Return the alternate path for pid files, for processes running as non-root
|
||||||
const char * altpidpath(void)
|
* 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
|
#ifdef ALTPIDPATH
|
||||||
return ALTPIDPATH;
|
return ALTPIDPATH;
|
||||||
#else
|
#else
|
||||||
return dflt_statepath();
|
/* We assume, here and elsewhere, that at least STATEPATH is always defined */
|
||||||
|
return STATEPATH;
|
||||||
#endif
|
#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) */
|
/* logs the formatted string to any configured logging devices + the output of strerror(errno) */
|
||||||
void upslog_with_errno(int priority, const char *fmt, ...)
|
void upslog_with_errno(int priority, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list va;
|
va_list va;
|
||||||
|
|
||||||
va_start(va, fmt);
|
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);
|
vupslog(priority, fmt, va, 1);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
va_end(va);
|
va_end(va);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,44 +621,115 @@ void upslogx(int priority, const char *fmt, ...)
|
||||||
va_list va;
|
va_list va;
|
||||||
|
|
||||||
va_start(va, fmt);
|
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);
|
vupslog(priority, fmt, va, 0);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
va_end(va);
|
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;
|
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)
|
if (nut_debug_level < level)
|
||||||
return;
|
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);
|
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);
|
vupslog(LOG_DEBUG, fmt, va, 1);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
va_end(va);
|
va_end(va);
|
||||||
}
|
}
|
||||||
|
|
||||||
void upsdebugx(int level, const char *fmt, ...)
|
void s_upsdebugx(int level, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list va;
|
va_list va;
|
||||||
|
char fmt2[LARGEBUF];
|
||||||
|
|
||||||
if (nut_debug_level < level)
|
if (nut_debug_level < level)
|
||||||
return;
|
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);
|
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);
|
vupslog(LOG_DEBUG, fmt, va, 0);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
va_end(va);
|
va_end(va);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dump message msg and len bytes from buf to upsdebugx(level) in
|
/* dump message msg and len bytes from buf to upsdebugx(level) in
|
||||||
hexadecimal. (This function replaces Philippe Marzouk's original
|
hexadecimal. (This function replaces Philippe Marzouk's original
|
||||||
dump_hex() function) */
|
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];
|
char line[100];
|
||||||
int n; /* number of characters currently in line */
|
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++) {
|
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",
|
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 */
|
/* 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. */
|
/* 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];
|
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;
|
unsigned char ch;
|
||||||
|
|
||||||
if (nut_debug_level < level)
|
if (nut_debug_level < level)
|
||||||
return; /* save cpu cycles */
|
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) {
|
for (i=0; i<len; ++i) {
|
||||||
ch = ((unsigned char *)buf)[i];
|
ch = ((const unsigned char *)buf)[i];
|
||||||
|
|
||||||
if (ch < 0x20)
|
if (ch < 0x20)
|
||||||
snprintfcat(line, sizeof(line), "%3s ", ascii_symb[ch]);
|
n = snprintfcat(line, sizeof(line), "%3s ", ascii_symb[ch]);
|
||||||
else if (ch >= 0x80)
|
else if (ch >= 0x80)
|
||||||
snprintfcat(line, sizeof(line), "%02Xh ", ch);
|
n = snprintfcat(line, sizeof(line), "%02Xh ", ch);
|
||||||
else
|
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)
|
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))
|
if (xbit_test(upslog_flags, UPSLOG_SYSLOG_ON_FATAL))
|
||||||
xbit_set(&upslog_flags, UPSLOG_SYSLOG);
|
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);
|
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, ...)
|
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_list va;
|
||||||
|
|
||||||
va_start(va, fmt);
|
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);
|
vfatal(fmt, va, (errno > 0) ? 1 : 0);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
exit(status);
|
exit(status);
|
||||||
|
@ -540,7 +871,19 @@ void fatalx(int status, const char *fmt, ...)
|
||||||
va_list va;
|
va_list va;
|
||||||
|
|
||||||
va_start(va, fmt);
|
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);
|
vfatal(fmt, va, 0);
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_FORMAT_NONLITERAL
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
exit(status);
|
exit(status);
|
||||||
|
@ -587,7 +930,7 @@ char *xstrdup(const char *string)
|
||||||
/* Read up to buflen bytes from fd and return the number of bytes
|
/* 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.
|
read. If no data is available within d_sec + d_usec, return 0.
|
||||||
On error, a value < 0 is returned (errno indicates error). */
|
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;
|
int ret;
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
|
@ -611,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
|
/* 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.
|
written. If no data is available within d_sec + d_usec, return 0.
|
||||||
On error, a value < 0 is returned (errno indicates error). */
|
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;
|
int ret;
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
|
@ -631,3 +974,106 @@ int select_write(const int fd, const void *buf, const size_t buflen, const long
|
||||||
|
|
||||||
return write(fd, buf, buflen);
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
* There is now a context buffer, and you call pconf_init to set it up.
|
* There is now a context buffer, and you call pconf_init to set it up.
|
||||||
* All subsequent calls must have it as the first argument. There are
|
* All subsequent calls must have it as the first argument. There are
|
||||||
* two entry points for parsing lines. You can have it read a file
|
* two entry points for parsing lines. You can have it read a file
|
||||||
* (pconf_file_begin and pconf_file_next), take lines directly from
|
* (pconf_file_begin and pconf_file_next), take lines directly from
|
||||||
* the caller (pconf_line), or go along a character at a time (pconf_char).
|
* the caller (pconf_line), or go along a character at a time (pconf_char).
|
||||||
* The parsing is identical no matter how you feed it.
|
* The parsing is identical no matter how you feed it.
|
||||||
*
|
*
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
*
|
*
|
||||||
* Fatal errors are those that involve memory allocation. If the user
|
* Fatal errors are those that involve memory allocation. If the user
|
||||||
* defines an error handler when calling pconf_init, that function will
|
* defines an error handler when calling pconf_init, that function will
|
||||||
* be called with the error message before parseconf exits. By default
|
* be called with the error message before parseconf exits. By default
|
||||||
* it will just write the message to stderr before exiting.
|
* it will just write the message to stderr before exiting.
|
||||||
*
|
*
|
||||||
* Input vs. Output:
|
* Input vs. Output:
|
||||||
|
@ -57,12 +57,12 @@
|
||||||
* also allows you to join lines, allowing you to have logical lines
|
* also allows you to join lines, allowing you to have logical lines
|
||||||
* that span physical lines, just like you can do in some shells.
|
* that span physical lines, just like you can do in some shells.
|
||||||
*
|
*
|
||||||
* Lines normally end with a newline, but reaching EOF will also force
|
* Lines normally end with a newline, but reaching EOF will also force
|
||||||
* parsing on what's been scanned so far.
|
* parsing on what's been scanned so far.
|
||||||
*
|
*
|
||||||
* Design:
|
* Design:
|
||||||
*
|
*
|
||||||
* Characters are read one at a time to drive the state machine.
|
* Characters are read one at a time to drive the state machine.
|
||||||
* As words are completed (by hitting whitespace or ending a "" item),
|
* As words are completed (by hitting whitespace or ending a "" item),
|
||||||
* they are committed to the next buffer in the arglist. realloc is
|
* they are committed to the next buffer in the arglist. realloc is
|
||||||
* used, so the buffer can grow to handle bigger words.
|
* used, so the buffer can grow to handle bigger words.
|
||||||
|
@ -76,15 +76,20 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "parseconf.h"
|
#include "parseconf.h"
|
||||||
|
#include "attribute.h"
|
||||||
|
#include "nut_stdint.h"
|
||||||
|
|
||||||
/* possible states */
|
/* possible states */
|
||||||
|
|
||||||
|
@ -97,6 +102,9 @@
|
||||||
#define STATE_ENDOFLINE 7
|
#define STATE_ENDOFLINE 7
|
||||||
#define STATE_PARSEERR 8
|
#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)
|
static void pconf_fatal(PCONF_CTX_t *ctx, const char *errtxt)
|
||||||
{
|
{
|
||||||
if (ctx->errhandler)
|
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)
|
static void add_arg_word(PCONF_CTX_t *ctx)
|
||||||
{
|
{
|
||||||
int argpos;
|
size_t argpos;
|
||||||
size_t wbuflen;
|
size_t wbuflen;
|
||||||
|
|
||||||
/* this is where the new value goes */
|
/* this is where the new value goes */
|
||||||
|
@ -122,13 +130,13 @@ static void add_arg_word(PCONF_CTX_t *ctx)
|
||||||
ctx->maxargs = ctx->numargs;
|
ctx->maxargs = ctx->numargs;
|
||||||
|
|
||||||
/* resize the lists */
|
/* resize the lists */
|
||||||
ctx->arglist = realloc(ctx->arglist,
|
ctx->arglist = realloc(ctx->arglist,
|
||||||
sizeof(char *) * ctx->numargs);
|
sizeof(char *) * ctx->numargs);
|
||||||
|
|
||||||
if (!ctx->arglist)
|
if (!ctx->arglist)
|
||||||
pconf_fatal(ctx, "realloc arglist failed");
|
pconf_fatal(ctx, "realloc arglist failed");
|
||||||
|
|
||||||
ctx->argsize = realloc(ctx->argsize,
|
ctx->argsize = realloc(ctx->argsize,
|
||||||
sizeof(size_t) * ctx->numargs);
|
sizeof(size_t) * ctx->numargs);
|
||||||
|
|
||||||
if (!ctx->argsize)
|
if (!ctx->argsize)
|
||||||
|
@ -171,7 +179,7 @@ static void addchar(PCONF_CTX_t *ctx)
|
||||||
|
|
||||||
wbuflen = strlen(ctx->wordbuf);
|
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)) {
|
if ((ctx->ch < 0x20) || (ctx->ch > 0x7f)) {
|
||||||
fprintf(stderr, "addchar: discarding invalid character (0x%02x)!\n",
|
fprintf(stderr, "addchar: discarding invalid character (0x%02x)!\n",
|
||||||
ctx->ch);
|
ctx->ch);
|
||||||
|
@ -199,7 +207,7 @@ static void addchar(PCONF_CTX_t *ctx)
|
||||||
ctx->wordptr = &ctx->wordbuf[wbuflen];
|
ctx->wordptr = &ctx->wordbuf[wbuflen];
|
||||||
}
|
}
|
||||||
|
|
||||||
*ctx->wordptr++ = ctx->ch;
|
*ctx->wordptr++ = (char)ctx->ch;
|
||||||
*ctx->wordptr = '\0';
|
*ctx->wordptr = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,8 +242,8 @@ static int findwordstart(PCONF_CTX_t *ctx)
|
||||||
return STATE_FINDEOL;
|
return STATE_FINDEOL;
|
||||||
|
|
||||||
/* space = not in a word yet, so loop back */
|
/* space = not in a word yet, so loop back */
|
||||||
if (isspace(ctx->ch))
|
if (isspace((size_t)ctx->ch))
|
||||||
return STATE_FINDWORDSTART;
|
return STATE_FINDWORDSTART;
|
||||||
|
|
||||||
/* \ = literal = accept the next char blindly */
|
/* \ = literal = accept the next char blindly */
|
||||||
if (ctx->ch == '\\')
|
if (ctx->ch == '\\')
|
||||||
|
@ -255,7 +263,7 @@ static int findwordstart(PCONF_CTX_t *ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
return STATE_COLLECT;
|
return STATE_COLLECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* eat characters until the end of the line is found */
|
/* eat characters until the end of the line is found */
|
||||||
static int findeol(PCONF_CTX_t *ctx)
|
static int findeol(PCONF_CTX_t *ctx)
|
||||||
|
@ -274,7 +282,7 @@ static void pconf_seterr(PCONF_CTX_t *ctx, const char *errmsg)
|
||||||
snprintf(ctx->errmsg, PCONF_ERR_LEN, "%s", errmsg);
|
snprintf(ctx->errmsg, PCONF_ERR_LEN, "%s", errmsg);
|
||||||
|
|
||||||
ctx->error = 1;
|
ctx->error = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* quote characters inside a word bounded by "quotes" */
|
/* quote characters inside a word bounded by "quotes" */
|
||||||
static int quotecollect(PCONF_CTX_t *ctx)
|
static int quotecollect(PCONF_CTX_t *ctx)
|
||||||
|
@ -291,7 +299,7 @@ static int quotecollect(PCONF_CTX_t *ctx)
|
||||||
/* another " means we're done with this word */
|
/* another " means we're done with this word */
|
||||||
if (ctx->ch == '"') {
|
if (ctx->ch == '"') {
|
||||||
endofword(ctx);
|
endofword(ctx);
|
||||||
|
|
||||||
return STATE_FINDWORDSTART;
|
return STATE_FINDWORDSTART;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,7 +342,7 @@ static int collect(PCONF_CTX_t *ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* space means the word is done */
|
/* space means the word is done */
|
||||||
if (isspace(ctx->ch)) {
|
if (isspace((size_t)ctx->ch)) {
|
||||||
endofword(ctx);
|
endofword(ctx);
|
||||||
|
|
||||||
return STATE_FINDWORDSTART;
|
return STATE_FINDWORDSTART;
|
||||||
|
@ -443,6 +451,9 @@ int pconf_file_begin(PCONF_CTX_t *ctx, const char *fn)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* prevent fd leaking to child processes */
|
||||||
|
fcntl(fileno(ctx->f), F_SETFD, FD_CLOEXEC);
|
||||||
|
|
||||||
return 1; /* OK */
|
return 1; /* OK */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,7 +582,7 @@ int pconf_line(PCONF_CTX_t *ctx, const char *line)
|
||||||
/* deal with any lingering characters */
|
/* deal with any lingering characters */
|
||||||
|
|
||||||
/* still building a word? */
|
/* still building a word? */
|
||||||
if (ctx->wordptr != ctx->wordbuf)
|
if (ctx->wordptr != ctx->wordbuf)
|
||||||
endofword(ctx); /* tie it off */
|
endofword(ctx); /* tie it off */
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -9,13 +9,14 @@ int nut_setenv(const char *name, const char *value, int overwrite)
|
||||||
char *val;
|
char *val;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
if (overwrite == 0) {
|
if (overwrite == 0) {
|
||||||
val = getenv(name);
|
val = getenv(name);
|
||||||
if (val != NULL) {
|
if (val != NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer = xmalloc(strlen(value) + strlen(name) + 2);
|
buffer = xmalloc(strlen(value) + strlen(name) + 2);
|
||||||
strcpy(buffer, name);
|
strcpy(buffer, name);
|
||||||
strcat(buffer, "=");
|
strcat(buffer, "=");
|
||||||
|
|
|
@ -35,9 +35,9 @@
|
||||||
* original. Also, there is now a builtin-test, just compile with:
|
* original. Also, there is now a builtin-test, just compile with:
|
||||||
* gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm
|
* gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm
|
||||||
* and run snprintf for results.
|
* and run snprintf for results.
|
||||||
*
|
*
|
||||||
* Thomas Roessler <roessler@guug.de> 01/27/98 for mutt 0.89i
|
* Thomas Roessler <roessler@guug.de> 01/27/98 for mutt 0.89i
|
||||||
* The PGP code was using unsigned hexadecimal formats.
|
* The PGP code was using unsigned hexadecimal formats.
|
||||||
* Unfortunately, unsigned formats simply didn't work.
|
* Unfortunately, unsigned formats simply didn't work.
|
||||||
*
|
*
|
||||||
* Michael Elkins <me@cs.hmc.edu> 03/05/98 for mutt 0.90.8
|
* Michael Elkins <me@cs.hmc.edu> 03/05/98 for mutt 0.90.8
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
# include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF)
|
#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF)
|
||||||
|
@ -102,14 +102,14 @@
|
||||||
/*int snprintf (char *str, size_t count, const char *fmt, ...);*/
|
/*int snprintf (char *str, size_t count, const char *fmt, ...);*/
|
||||||
/*int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);*/
|
/*int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);*/
|
||||||
|
|
||||||
static void dopr (char *buffer, size_t maxlen, const char *format,
|
static void dopr (char *buffer, size_t maxlen, const char *format,
|
||||||
va_list args);
|
va_list args);
|
||||||
static void fmtstr (char *buffer, size_t *currlen, size_t maxlen,
|
static void fmtstr (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
char *value, int flags, int min, int max);
|
char *value, int flags, int min, int max);
|
||||||
static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
long value, int base, int min, int max, int flags);
|
long value, int base, int min, int max, int flags);
|
||||||
static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
LDOUBLE fvalue, int min, int max, int flags);
|
LDOUBLE fvalue, int min, int max, int flags);
|
||||||
static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c );
|
static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -137,10 +137,26 @@ static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c );
|
||||||
|
|
||||||
/* Conversion Flags */
|
/* Conversion Flags */
|
||||||
#define DP_C_SHORT 1
|
#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_LONG 2
|
||||||
#define DP_C_LDOUBLE 3
|
#define DP_C_LDOUBLE 3
|
||||||
#define DP_C_LLONG 4
|
#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 char_to_int(p) ((p)- '0')
|
||||||
#define MAX(p,q) (((p) >= (q)) ? (p) : (q))
|
#define MAX(p,q) (((p) >= (q)) ? (p) : (q))
|
||||||
|
|
||||||
|
@ -156,7 +172,7 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
||||||
int flags;
|
int flags;
|
||||||
int cflags;
|
int cflags;
|
||||||
size_t currlen;
|
size_t currlen;
|
||||||
|
|
||||||
state = DP_S_DEFAULT;
|
state = DP_S_DEFAULT;
|
||||||
currlen = flags = cflags = min = 0;
|
currlen = flags = cflags = min = 0;
|
||||||
max = -1;
|
max = -1;
|
||||||
|
@ -164,237 +180,259 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
||||||
|
|
||||||
while (state != DP_S_DONE)
|
while (state != DP_S_DONE)
|
||||||
{
|
{
|
||||||
if ((ch == '\0') || (currlen >= maxlen))
|
if ((ch == '\0') || (currlen >= maxlen))
|
||||||
state = DP_S_DONE;
|
state = DP_S_DONE;
|
||||||
|
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
case DP_S_DEFAULT:
|
case DP_S_DEFAULT:
|
||||||
if (ch == '%')
|
if (ch == '%')
|
||||||
state = DP_S_FLAGS;
|
state = DP_S_FLAGS;
|
||||||
else
|
else
|
||||||
dopr_outch (buffer, &currlen, maxlen, ch);
|
dopr_outch (buffer, &currlen, maxlen, ch);
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
break;
|
break;
|
||||||
case DP_S_FLAGS:
|
case DP_S_FLAGS:
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
case '-':
|
case '-':
|
||||||
flags |= DP_F_MINUS;
|
flags |= DP_F_MINUS;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
break;
|
break;
|
||||||
case '+':
|
case '+':
|
||||||
flags |= DP_F_PLUS;
|
flags |= DP_F_PLUS;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
break;
|
break;
|
||||||
case ' ':
|
case ' ':
|
||||||
flags |= DP_F_SPACE;
|
flags |= DP_F_SPACE;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
break;
|
break;
|
||||||
case '#':
|
case '#':
|
||||||
flags |= DP_F_NUM;
|
flags |= DP_F_NUM;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
break;
|
break;
|
||||||
case '0':
|
case '0':
|
||||||
flags |= DP_F_ZERO;
|
flags |= DP_F_ZERO;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
state = DP_S_MIN;
|
state = DP_S_MIN;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DP_S_MIN:
|
case DP_S_MIN:
|
||||||
if (isdigit((unsigned char)ch))
|
if (isdigit((unsigned char)ch))
|
||||||
{
|
{
|
||||||
min = 10*min + char_to_int (ch);
|
min = 10*min + char_to_int (ch);
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
}
|
}
|
||||||
else if (ch == '*')
|
else if (ch == '*')
|
||||||
{
|
{
|
||||||
min = va_arg (args, int);
|
min = va_arg (args, int);
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
state = DP_S_DOT;
|
state = DP_S_DOT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
state = DP_S_DOT;
|
state = DP_S_DOT;
|
||||||
break;
|
break;
|
||||||
case DP_S_DOT:
|
case DP_S_DOT:
|
||||||
if (ch == '.')
|
if (ch == '.')
|
||||||
{
|
{
|
||||||
state = DP_S_MAX;
|
state = DP_S_MAX;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
state = DP_S_MOD;
|
state = DP_S_MOD;
|
||||||
break;
|
break;
|
||||||
case DP_S_MAX:
|
case DP_S_MAX:
|
||||||
if (isdigit((unsigned char)ch))
|
if (isdigit((unsigned char)ch))
|
||||||
{
|
{
|
||||||
if (max < 0)
|
if (max < 0)
|
||||||
max = 0;
|
max = 0;
|
||||||
max = 10*max + char_to_int (ch);
|
max = 10*max + char_to_int (ch);
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
}
|
}
|
||||||
else if (ch == '*')
|
else if (ch == '*')
|
||||||
{
|
{
|
||||||
max = va_arg (args, int);
|
max = va_arg (args, int);
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
state = DP_S_MOD;
|
state = DP_S_MOD;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
state = DP_S_MOD;
|
state = DP_S_MOD;
|
||||||
break;
|
break;
|
||||||
case DP_S_MOD:
|
case DP_S_MOD:
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
case 'h':
|
case 'h':
|
||||||
cflags = DP_C_SHORT;
|
cflags = DP_C_SHORT;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
cflags = DP_C_LONG;
|
cflags = DP_C_LONG;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
if (ch == 'l') { /* It's a long long */
|
if (ch == 'l') { /* It's a long long */
|
||||||
cflags = DP_C_LLONG;
|
cflags = DP_C_LLONG;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'L':
|
case 'L':
|
||||||
cflags = DP_C_LDOUBLE;
|
cflags = DP_C_LDOUBLE;
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
state = DP_S_CONV;
|
state = DP_S_CONV;
|
||||||
break;
|
break;
|
||||||
case DP_S_CONV:
|
case DP_S_CONV:
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
case 'd':
|
case 'd':
|
||||||
case 'i':
|
case 'i':
|
||||||
if (cflags == DP_C_SHORT)
|
if (cflags == DP_C_SHORT)
|
||||||
value = va_arg (args, short int);
|
#ifdef C89PLUS
|
||||||
else if (cflags == DP_C_LONG)
|
value = (short int)va_arg (args, int);
|
||||||
value = va_arg (args, long int);
|
#else
|
||||||
else if (cflags == DP_C_LLONG)
|
value = va_arg (args, short int);
|
||||||
value = va_arg (args, LLONG);
|
#endif
|
||||||
else
|
else if (cflags == DP_C_LONG)
|
||||||
value = va_arg (args, int);
|
value = va_arg (args, long int);
|
||||||
fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
|
else if (cflags == DP_C_LLONG)
|
||||||
break;
|
value = va_arg (args, LLONG);
|
||||||
|
else
|
||||||
|
value = va_arg (args, int);
|
||||||
|
fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
|
||||||
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
flags |= DP_F_UNSIGNED;
|
flags |= DP_F_UNSIGNED;
|
||||||
if (cflags == DP_C_SHORT)
|
if (cflags == DP_C_SHORT)
|
||||||
value = va_arg (args, unsigned short int);
|
#ifdef C89PLUS
|
||||||
else if (cflags == DP_C_LONG)
|
value = (unsigned short int)va_arg (args, unsigned int);
|
||||||
value = (long)va_arg (args, unsigned long int);
|
#else
|
||||||
else if (cflags == DP_C_LLONG)
|
value = va_arg (args, unsigned short int);
|
||||||
value = (long)va_arg (args, unsigned LLONG);
|
#endif
|
||||||
else
|
else if (cflags == DP_C_LONG)
|
||||||
value = (long)va_arg (args, unsigned int);
|
value = (long)va_arg (args, unsigned long int);
|
||||||
fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
|
else if (cflags == DP_C_LLONG)
|
||||||
break;
|
value = (long)va_arg (args, unsigned LLONG);
|
||||||
|
else
|
||||||
|
value = (long)va_arg (args, unsigned int);
|
||||||
|
fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags);
|
||||||
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
flags |= DP_F_UNSIGNED;
|
flags |= DP_F_UNSIGNED;
|
||||||
if (cflags == DP_C_SHORT)
|
if (cflags == DP_C_SHORT)
|
||||||
value = va_arg (args, unsigned short int);
|
#ifdef C89PLUS
|
||||||
else if (cflags == DP_C_LONG)
|
value = (unsigned short int)va_arg (args, unsigned int);
|
||||||
value = (long)va_arg (args, unsigned long int);
|
#else
|
||||||
else if (cflags == DP_C_LLONG)
|
value = va_arg (args, unsigned short int);
|
||||||
value = (LLONG)va_arg (args, unsigned LLONG);
|
#endif
|
||||||
else
|
else if (cflags == DP_C_LONG)
|
||||||
value = (long)va_arg (args, unsigned int);
|
value = (long)va_arg (args, unsigned long int);
|
||||||
fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
|
else if (cflags == DP_C_LLONG)
|
||||||
break;
|
value = (LLONG)va_arg (args, unsigned LLONG);
|
||||||
|
else
|
||||||
|
value = (long)va_arg (args, unsigned int);
|
||||||
|
fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);
|
||||||
|
break;
|
||||||
case 'X':
|
case 'X':
|
||||||
flags |= DP_F_UP;
|
flags |= DP_F_UP;
|
||||||
|
goto fallthrough_case_x;
|
||||||
case 'x':
|
case 'x':
|
||||||
flags |= DP_F_UNSIGNED;
|
fallthrough_case_x:
|
||||||
if (cflags == DP_C_SHORT)
|
flags |= DP_F_UNSIGNED;
|
||||||
value = va_arg (args, unsigned short int);
|
if (cflags == DP_C_SHORT)
|
||||||
else if (cflags == DP_C_LONG)
|
#ifdef C89PLUS
|
||||||
value = (long)va_arg (args, unsigned long int);
|
value = (unsigned short int)va_arg (args, unsigned int);
|
||||||
else if (cflags == DP_C_LLONG)
|
#else
|
||||||
value = (LLONG)va_arg (args, unsigned LLONG);
|
value = va_arg (args, unsigned short int);
|
||||||
else
|
#endif
|
||||||
value = (long)va_arg (args, unsigned int);
|
else if (cflags == DP_C_LONG)
|
||||||
fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
|
value = (long)va_arg (args, unsigned long int);
|
||||||
break;
|
else if (cflags == DP_C_LLONG)
|
||||||
|
value = (LLONG)va_arg (args, unsigned LLONG);
|
||||||
|
else
|
||||||
|
value = (long)va_arg (args, unsigned int);
|
||||||
|
fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags);
|
||||||
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
if (cflags == DP_C_LDOUBLE)
|
if (cflags == DP_C_LDOUBLE)
|
||||||
fvalue = va_arg (args, LDOUBLE);
|
fvalue = va_arg (args, LDOUBLE);
|
||||||
else
|
else
|
||||||
fvalue = va_arg (args, double);
|
fvalue = va_arg (args, double);
|
||||||
/* um, floating point? */
|
/* um, floating point? */
|
||||||
fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
|
fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags);
|
||||||
break;
|
break;
|
||||||
case 'E':
|
case 'E':
|
||||||
flags |= DP_F_UP;
|
flags |= DP_F_UP;
|
||||||
|
goto fallthrough_case_e;
|
||||||
case 'e':
|
case 'e':
|
||||||
if (cflags == DP_C_LDOUBLE)
|
fallthrough_case_e:
|
||||||
fvalue = va_arg (args, LDOUBLE);
|
if (cflags == DP_C_LDOUBLE)
|
||||||
else
|
fvalue = va_arg (args, LDOUBLE);
|
||||||
fvalue = va_arg (args, double);
|
else
|
||||||
break;
|
fvalue = va_arg (args, double);
|
||||||
|
break;
|
||||||
case 'G':
|
case 'G':
|
||||||
flags |= DP_F_UP;
|
flags |= DP_F_UP;
|
||||||
|
goto fallthrough_case_g;
|
||||||
case 'g':
|
case 'g':
|
||||||
if (cflags == DP_C_LDOUBLE)
|
fallthrough_case_g:
|
||||||
fvalue = va_arg (args, LDOUBLE);
|
if (cflags == DP_C_LDOUBLE)
|
||||||
else
|
fvalue = va_arg (args, LDOUBLE);
|
||||||
fvalue = va_arg (args, double);
|
else
|
||||||
break;
|
fvalue = va_arg (args, double);
|
||||||
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
|
dopr_outch (buffer, &currlen, maxlen, va_arg (args, int));
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
strvalue = va_arg (args, char *);
|
strvalue = va_arg (args, char *);
|
||||||
if (max < 0)
|
if (max < 0)
|
||||||
max = maxlen; /* ie, no max */
|
max = maxlen; /* ie, no max */
|
||||||
fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
|
fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max);
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
strvalue = va_arg (args, void *);
|
strvalue = va_arg (args, void *);
|
||||||
fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags);
|
fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags);
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
if (cflags == DP_C_SHORT)
|
if (cflags == DP_C_SHORT)
|
||||||
{
|
{
|
||||||
short int *num;
|
short int *num;
|
||||||
num = va_arg (args, short int *);
|
num = va_arg (args, short int *);
|
||||||
*num = currlen;
|
*num = currlen;
|
||||||
}
|
|
||||||
else if (cflags == DP_C_LONG)
|
|
||||||
{
|
|
||||||
long int *num;
|
|
||||||
num = va_arg (args, long int *);
|
|
||||||
*num = (long int)currlen;
|
|
||||||
}
|
|
||||||
else if (cflags == DP_C_LLONG)
|
|
||||||
{
|
|
||||||
LLONG *num;
|
|
||||||
num = va_arg (args, LLONG *);
|
|
||||||
*num = (LLONG)currlen;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int *num;
|
|
||||||
num = va_arg (args, int *);
|
|
||||||
*num = currlen;
|
|
||||||
}
|
}
|
||||||
break;
|
else if (cflags == DP_C_LONG)
|
||||||
|
{
|
||||||
|
long int *num;
|
||||||
|
num = va_arg (args, long int *);
|
||||||
|
*num = (long int)currlen;
|
||||||
|
}
|
||||||
|
else if (cflags == DP_C_LLONG)
|
||||||
|
{
|
||||||
|
LLONG *num;
|
||||||
|
num = va_arg (args, LLONG *);
|
||||||
|
*num = (LLONG)currlen;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int *num;
|
||||||
|
num = va_arg (args, int *);
|
||||||
|
*num = currlen;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case '%':
|
case '%':
|
||||||
dopr_outch (buffer, &currlen, maxlen, ch);
|
dopr_outch (buffer, &currlen, maxlen, ch);
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
/* not supported yet, treat as next char */
|
/* not supported yet, treat as next char */
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* Unknown, skip */
|
/* Unknown, skip */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ch = *format++;
|
ch = *format++;
|
||||||
state = DP_S_DEFAULT;
|
state = DP_S_DEFAULT;
|
||||||
|
@ -408,18 +446,18 @@ static void dopr (char *buffer, size_t maxlen, const char *format, va_list args)
|
||||||
break; /* some picky compilers need this */
|
break; /* some picky compilers need this */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (currlen < maxlen - 1)
|
if (currlen < maxlen - 1)
|
||||||
buffer[currlen] = '\0';
|
buffer[currlen] = '\0';
|
||||||
else
|
else
|
||||||
buffer[maxlen - 1] = '\0';
|
buffer[maxlen - 1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fmtstr (char *buffer, size_t *currlen, size_t maxlen,
|
static void fmtstr (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
char *value, int flags, int min, int max)
|
char *value, int flags, int min, int max)
|
||||||
{
|
{
|
||||||
int padlen, strln; /* amount to pad */
|
int padlen, strln; /* amount to pad */
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
|
||||||
if (value == 0)
|
if (value == 0)
|
||||||
{
|
{
|
||||||
value = "<NULL>";
|
value = "<NULL>";
|
||||||
|
@ -427,23 +465,23 @@ static void fmtstr (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
|
|
||||||
for (strln = 0; value[strln]; ++strln); /* strlen */
|
for (strln = 0; value[strln]; ++strln); /* strlen */
|
||||||
padlen = min - strln;
|
padlen = min - strln;
|
||||||
if (padlen < 0)
|
if (padlen < 0)
|
||||||
padlen = 0;
|
padlen = 0;
|
||||||
if (flags & DP_F_MINUS)
|
if (flags & DP_F_MINUS)
|
||||||
padlen = -padlen; /* Left Justify */
|
padlen = -padlen; /* Left Justify */
|
||||||
|
|
||||||
while ((padlen > 0) && (cnt < max))
|
while ((padlen > 0) && (cnt < max))
|
||||||
{
|
{
|
||||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||||
--padlen;
|
--padlen;
|
||||||
++cnt;
|
++cnt;
|
||||||
}
|
}
|
||||||
while (*value && (cnt < max))
|
while (*value && (cnt < max))
|
||||||
{
|
{
|
||||||
dopr_outch (buffer, currlen, maxlen, *value++);
|
dopr_outch (buffer, currlen, maxlen, *value++);
|
||||||
++cnt;
|
++cnt;
|
||||||
}
|
}
|
||||||
while ((padlen < 0) && (cnt < max))
|
while ((padlen < 0) && (cnt < max))
|
||||||
{
|
{
|
||||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||||
++padlen;
|
++padlen;
|
||||||
|
@ -454,7 +492,7 @@ static void fmtstr (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
|
/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
|
||||||
|
|
||||||
static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
long value, int base, int min, int max, int flags)
|
long value, int base, int min, int max, int flags)
|
||||||
{
|
{
|
||||||
int signvalue = 0;
|
int signvalue = 0;
|
||||||
unsigned long uvalue;
|
unsigned long uvalue;
|
||||||
|
@ -463,7 +501,7 @@ static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
int spadlen = 0; /* amount to space pad */
|
int spadlen = 0; /* amount to space pad */
|
||||||
int zpadlen = 0; /* amount to zero pad */
|
int zpadlen = 0; /* amount to zero pad */
|
||||||
int caps = 0;
|
int caps = 0;
|
||||||
|
|
||||||
if (max < 0)
|
if (max < 0)
|
||||||
max = 0;
|
max = 0;
|
||||||
|
|
||||||
|
@ -477,12 +515,12 @@ static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (flags & DP_F_PLUS) /* Do a sign (+/i) */
|
if (flags & DP_F_PLUS) /* Do a sign (+/i) */
|
||||||
signvalue = '+';
|
signvalue = '+';
|
||||||
else
|
else
|
||||||
if (flags & DP_F_SPACE)
|
if (flags & DP_F_SPACE)
|
||||||
signvalue = ' ';
|
signvalue = ' ';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
|
if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -503,27 +541,27 @@ static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
zpadlen = MAX(zpadlen, spadlen);
|
zpadlen = MAX(zpadlen, spadlen);
|
||||||
spadlen = 0;
|
spadlen = 0;
|
||||||
}
|
}
|
||||||
if (flags & DP_F_MINUS)
|
if (flags & DP_F_MINUS)
|
||||||
spadlen = -spadlen; /* Left Justifty */
|
spadlen = -spadlen; /* Left Justifty */
|
||||||
|
|
||||||
#ifdef DEBUG_SNPRINTF
|
#ifdef DEBUG_SNPRINTF
|
||||||
printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n",
|
printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n",
|
||||||
zpadlen, spadlen, min, max, place);
|
zpadlen, spadlen, min, max, place);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Spaces */
|
/* Spaces */
|
||||||
while (spadlen > 0)
|
while (spadlen > 0)
|
||||||
{
|
{
|
||||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||||
--spadlen;
|
--spadlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sign */
|
/* Sign */
|
||||||
if (signvalue)
|
if (signvalue)
|
||||||
dopr_outch (buffer, currlen, maxlen, signvalue);
|
dopr_outch (buffer, currlen, maxlen, signvalue);
|
||||||
|
|
||||||
/* Zeros */
|
/* Zeros */
|
||||||
if (zpadlen > 0)
|
if (zpadlen > 0)
|
||||||
{
|
{
|
||||||
while (zpadlen > 0)
|
while (zpadlen > 0)
|
||||||
{
|
{
|
||||||
|
@ -533,9 +571,9 @@ static void fmtint (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Digits */
|
/* Digits */
|
||||||
while (place > 0)
|
while (place > 0)
|
||||||
dopr_outch (buffer, currlen, maxlen, convert[--place]);
|
dopr_outch (buffer, currlen, maxlen, convert[--place]);
|
||||||
|
|
||||||
/* Left Justified spaces */
|
/* Left Justified spaces */
|
||||||
while (spadlen < 0) {
|
while (spadlen < 0) {
|
||||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||||
|
@ -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)
|
static LDOUBLE abs_val (LDOUBLE value)
|
||||||
{
|
{
|
||||||
LDOUBLE result = value;
|
LDOUBLE result = value;
|
||||||
|
@ -552,7 +591,13 @@ static LDOUBLE abs_val (LDOUBLE value)
|
||||||
|
|
||||||
return result;
|
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)
|
static LDOUBLE pow10 (int exp)
|
||||||
{
|
{
|
||||||
LDOUBLE result = 1;
|
LDOUBLE result = 1;
|
||||||
|
@ -562,10 +607,12 @@ static LDOUBLE pow10 (int exp)
|
||||||
result *= 10;
|
result *= 10;
|
||||||
exp--;
|
exp--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef HAVE_ROUND
|
||||||
static long round (LDOUBLE value)
|
static long round (LDOUBLE value)
|
||||||
{
|
{
|
||||||
long intpart;
|
long intpart;
|
||||||
|
@ -577,9 +624,11 @@ static long round (LDOUBLE value)
|
||||||
|
|
||||||
return intpart;
|
return intpart;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
|
#endif /* HAVE_FCVT */
|
||||||
|
|
||||||
static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
LDOUBLE fvalue, int min, int max, int flags)
|
LDOUBLE fvalue, int min, int max, int flags)
|
||||||
{
|
{
|
||||||
int signvalue = 0;
|
int signvalue = 0;
|
||||||
LDOUBLE ufvalue;
|
LDOUBLE ufvalue;
|
||||||
|
@ -601,12 +650,14 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
int iplace = 0;
|
int iplace = 0;
|
||||||
int fplace = 0;
|
int fplace = 0;
|
||||||
int padlen = 0; /* amount to pad */
|
int padlen = 0; /* amount to pad */
|
||||||
int zpadlen = 0;
|
int zpadlen = 0;
|
||||||
|
#ifndef HAVE_FCVT
|
||||||
int caps = 0;
|
int caps = 0;
|
||||||
long intpart;
|
long intpart;
|
||||||
long fracpart;
|
long fracpart;
|
||||||
|
#endif
|
||||||
/*
|
|
||||||
|
/*
|
||||||
* AIX manpage says the default is 0, but Solaris says the default
|
* AIX manpage says the default is 0, but Solaris says the default
|
||||||
* is 6, and sprintf on AIX defaults to 6
|
* is 6, and sprintf on AIX defaults to 6
|
||||||
*/
|
*/
|
||||||
|
@ -622,7 +673,7 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
signvalue = '+';
|
signvalue = '+';
|
||||||
else
|
else
|
||||||
if (flags & DP_F_SPACE)
|
if (flags & DP_F_SPACE)
|
||||||
signvalue = ' ';
|
signvalue = ' ';
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
|
if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */
|
||||||
|
@ -631,8 +682,8 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
#ifndef HAVE_FCVT
|
#ifndef HAVE_FCVT
|
||||||
intpart = (long)ufvalue;
|
intpart = (long)ufvalue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sorry, we only support 9 digits past the decimal because of our
|
* Sorry, we only support 9 digits past the decimal because of our
|
||||||
* conversion method
|
* conversion method
|
||||||
*/
|
*/
|
||||||
if (max > 9)
|
if (max > 9)
|
||||||
|
@ -650,8 +701,8 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_SNPRINTF
|
#ifdef DEBUG_SNPRINTF
|
||||||
printf("fmtfp: %g %d.%d min=%d max=%d\n",
|
printf("fmtfp: %g %d.%d min=%d max=%d\n",
|
||||||
(double)fvalue, intpart, fracpart, min, max);
|
(double)fvalue, intpart, fracpart, min, max);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Convert integer part */
|
/* Convert integer part */
|
||||||
|
@ -707,38 +758,38 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
fconvert[fplace++] = result[--r_length];
|
fconvert[fplace++] = result[--r_length];
|
||||||
|
|
||||||
while ((dec_pt < 0) && (fplace < max)) {
|
while ((dec_pt < 0) && (fplace < max)) {
|
||||||
fconvert[fplace++] = '0';
|
fconvert[fplace++] = '0';
|
||||||
dec_pt++;
|
dec_pt++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
iplace=0;
|
iplace=0;
|
||||||
for(c=dec_pt; c; iconvert[iplace++] = result[--c])
|
for(c=dec_pt; c; iconvert[iplace++] = result[--c])
|
||||||
;
|
;
|
||||||
iconvert[iplace] = '\0';
|
iconvert[iplace] = '\0';
|
||||||
|
|
||||||
result += dec_pt;
|
result += dec_pt;
|
||||||
fplace = 0;
|
fplace = 0;
|
||||||
|
|
||||||
for(c=(r_length-dec_pt); c; fconvert[fplace++] = result[--c])
|
for(c=(r_length-dec_pt); c; fconvert[fplace++] = result[--c])
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
#endif /* fcvt */
|
#endif /* fcvt */
|
||||||
|
|
||||||
/* -1 for decimal point, another -1 if we are printing a sign */
|
/* -1 for decimal point, another -1 if we are printing a sign */
|
||||||
padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
|
padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
|
||||||
zpadlen = max - fplace;
|
zpadlen = max - fplace;
|
||||||
if (zpadlen < 0)
|
if (zpadlen < 0)
|
||||||
zpadlen = 0;
|
zpadlen = 0;
|
||||||
if (padlen < 0)
|
if (padlen < 0)
|
||||||
padlen = 0;
|
padlen = 0;
|
||||||
if (flags & DP_F_MINUS)
|
if (flags & DP_F_MINUS)
|
||||||
padlen = -padlen; /* Left Justifty */
|
padlen = -padlen; /* Left Justifty */
|
||||||
|
|
||||||
if ((flags & DP_F_ZERO) && (padlen > 0))
|
if ((flags & DP_F_ZERO) && (padlen > 0))
|
||||||
{
|
{
|
||||||
if (signvalue)
|
if (signvalue)
|
||||||
{
|
{
|
||||||
dopr_outch (buffer, currlen, maxlen, signvalue);
|
dopr_outch (buffer, currlen, maxlen, signvalue);
|
||||||
--padlen;
|
--padlen;
|
||||||
|
@ -755,10 +806,10 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||||
--padlen;
|
--padlen;
|
||||||
}
|
}
|
||||||
if (signvalue)
|
if (signvalue)
|
||||||
dopr_outch (buffer, currlen, maxlen, signvalue);
|
dopr_outch (buffer, currlen, maxlen, signvalue);
|
||||||
|
|
||||||
while (iplace > 0)
|
while (iplace > 0)
|
||||||
dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);
|
dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]);
|
||||||
|
|
||||||
|
|
||||||
|
@ -771,10 +822,10 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
* char to print out.
|
* char to print out.
|
||||||
*/
|
*/
|
||||||
if (max > 0) {
|
if (max > 0) {
|
||||||
dopr_outch (buffer, currlen, maxlen, '.');
|
dopr_outch (buffer, currlen, maxlen, '.');
|
||||||
|
|
||||||
while (fplace > 0)
|
while (fplace > 0)
|
||||||
dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);
|
dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (zpadlen > 0)
|
while (zpadlen > 0)
|
||||||
|
@ -783,7 +834,7 @@ static void fmtfp (char *buffer, size_t *currlen, size_t maxlen,
|
||||||
--zpadlen;
|
--zpadlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (padlen < 0)
|
while (padlen < 0)
|
||||||
{
|
{
|
||||||
dopr_outch (buffer, currlen, maxlen, ' ');
|
dopr_outch (buffer, currlen, maxlen, ' ');
|
||||||
++padlen;
|
++padlen;
|
||||||
|
@ -820,7 +871,7 @@ static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
|
||||||
char *fmt;
|
char *fmt;
|
||||||
#endif
|
#endif
|
||||||
VA_LOCAL_DECL;
|
VA_LOCAL_DECL;
|
||||||
|
|
||||||
VA_START (fmt);
|
VA_START (fmt);
|
||||||
VA_SHIFT (str, char *);
|
VA_SHIFT (str, char *);
|
||||||
VA_SHIFT (count, size_t );
|
VA_SHIFT (count, size_t );
|
||||||
|
@ -860,7 +911,7 @@ static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
|
||||||
"%.1f",
|
"%.1f",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996,
|
double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996,
|
||||||
0.9996, 1.996, 4.136, 6442452944.1234, 0};
|
0.9996, 1.996, 4.136, 6442452944.1234, 0};
|
||||||
char *int_fmt[] = {
|
char *int_fmt[] = {
|
||||||
"%-1.5d",
|
"%-1.5d",
|
||||||
|
@ -888,9 +939,9 @@ static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
|
||||||
sprintf (buf2, fp_fmt[x], fp_nums[y]);
|
sprintf (buf2, fp_fmt[x], fp_nums[y]);
|
||||||
if (strcmp (buf1, buf2))
|
if (strcmp (buf1, buf2))
|
||||||
{
|
{
|
||||||
printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
|
printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
|
||||||
fp_fmt[x], buf1, buf2);
|
fp_fmt[x], buf1, buf2);
|
||||||
fail++;
|
fail++;
|
||||||
}
|
}
|
||||||
num++;
|
num++;
|
||||||
}
|
}
|
||||||
|
@ -902,9 +953,9 @@ static void dopr_outch (char *buffer, size_t *currlen, size_t maxlen, char c)
|
||||||
sprintf (buf2, int_fmt[x], int_nums[y]);
|
sprintf (buf2, int_fmt[x], int_nums[y]);
|
||||||
if (strcmp (buf1, buf2))
|
if (strcmp (buf1, buf2))
|
||||||
{
|
{
|
||||||
printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
|
printf("snprintf doesn't match Format: %s\n\tsnprintf = %s\n\tsprintf = %s\n",
|
||||||
int_fmt[x], buf1, buf2);
|
int_fmt[x], buf1, buf2);
|
||||||
fail++;
|
fail++;
|
||||||
}
|
}
|
||||||
num++;
|
num++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h" /* must be first */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <sys/stat.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;
|
*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)
|
int state_delinfo(st_tree_t **nptr, const char *var)
|
||||||
{
|
{
|
||||||
while (*nptr) {
|
while (*nptr) {
|
||||||
|
@ -141,6 +146,11 @@ int state_delinfo(st_tree_t **nptr, const char *var)
|
||||||
continue;
|
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 */
|
/* whatever is on the left, hang it off current right */
|
||||||
st_tree_node_add(&node->right, node->left);
|
st_tree_node_add(&node->right, node->left);
|
||||||
|
|
||||||
|
@ -153,7 +163,7 @@ int state_delinfo(st_tree_t **nptr, const char *var)
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0; /* not found */
|
return 0; /* not found */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* interface */
|
/* interface */
|
||||||
|
|
||||||
|
@ -218,7 +228,7 @@ static int st_tree_enum_add(enum_t **list, const char *enc)
|
||||||
list = &(*list)->next;
|
list = &(*list)->next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0; /* duplicate */
|
return 0; /* duplicate */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
int state_setaux(st_tree_t *root, const char *var, const char *auxs)
|
||||||
{
|
{
|
||||||
st_tree_t *sttmp;
|
st_tree_t *sttmp;
|
||||||
int aux;
|
long aux;
|
||||||
|
|
||||||
/* find the tree node for var */
|
/* find the tree node for var */
|
||||||
sttmp = state_tree_find(root, var);
|
sttmp = state_tree_find(root, var);
|
||||||
|
@ -354,7 +364,7 @@ int state_getflags(st_tree_t *root, const char *var)
|
||||||
return sttmp->flags;
|
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;
|
st_tree_t *sttmp;
|
||||||
|
|
||||||
|
@ -396,9 +406,9 @@ const range_t *state_getrangelist(st_tree_t *root, const char *var)
|
||||||
return sttmp->range_list;
|
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;
|
st_tree_t *sttmp;
|
||||||
|
|
||||||
/* find the tree node for var */
|
/* 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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strcasecmp(flag[i], "NUMBER")) {
|
||||||
|
sttmp->flags |= ST_FLAG_NUMBER;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
upsdebugx(2, "Unrecognized flag [%s]", flag[i]);
|
upsdebugx(2, "Unrecognized flag [%s]", flag[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
60
common/str.c
60
common/str.c
|
@ -20,12 +20,21 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h" /* must be first */
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <limits.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.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"
|
#include "str.h"
|
||||||
|
|
||||||
char *str_trim(char *string, const char character)
|
char *str_trim(char *string, const char character)
|
||||||
|
@ -109,7 +118,7 @@ char *str_ltrim_space(char *string)
|
||||||
|
|
||||||
while (
|
while (
|
||||||
*string != '\0' &&
|
*string != '\0' &&
|
||||||
isspace(*string)
|
isspace((size_t)*string)
|
||||||
)
|
)
|
||||||
memmove(string, string + 1, strlen(string));
|
memmove(string, string + 1, strlen(string));
|
||||||
|
|
||||||
|
@ -130,7 +139,7 @@ char *str_rtrim_space(char *string)
|
||||||
|
|
||||||
while (
|
while (
|
||||||
ptr >= string &&
|
ptr >= string &&
|
||||||
isspace(*ptr)
|
isspace((size_t)*ptr)
|
||||||
)
|
)
|
||||||
*ptr-- = '\0';
|
*ptr-- = '\0';
|
||||||
|
|
||||||
|
@ -252,7 +261,7 @@ int str_to_short(const char *string, short *number, const int base)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*number = num;
|
*number = (short)num;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -273,7 +282,7 @@ int str_to_short_strict(const char *string, short *number, const int base)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*number = num;
|
*number = (short)num;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,7 +300,7 @@ int str_to_ushort(const char *string, unsigned short *number, const int base)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*number = num;
|
*number = (unsigned short)num;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,13 +318,13 @@ int str_to_ushort_strict(const char *string, unsigned short *number, const int b
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*number = num;
|
*number = (unsigned short)num;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int str_to_int(const char *string, int *number, const int base)
|
int str_to_int(const char *string, int *number, const int base)
|
||||||
{
|
{
|
||||||
long num;
|
long num; /* long >= int, make sure we fit well */
|
||||||
|
|
||||||
*number = 0;
|
*number = 0;
|
||||||
|
|
||||||
|
@ -330,13 +339,13 @@ int str_to_int(const char *string, int *number, const int base)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*number = num;
|
*number = (int)num;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int str_to_int_strict(const char *string, int *number, const int base)
|
int str_to_int_strict(const char *string, int *number, const int base)
|
||||||
{
|
{
|
||||||
long num;
|
long num; /* long >= int, make sure we fit well */
|
||||||
|
|
||||||
*number = 0;
|
*number = 0;
|
||||||
|
|
||||||
|
@ -351,13 +360,13 @@ int str_to_int_strict(const char *string, int *number, const int base)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*number = num;
|
*number = (int)num;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int str_to_uint(const char *string, unsigned int *number, const int base)
|
int str_to_uint(const char *string, unsigned int *number, const int base)
|
||||||
{
|
{
|
||||||
unsigned long num;
|
unsigned long num; /* long >= int, make sure we fit well */
|
||||||
|
|
||||||
*number = 0;
|
*number = 0;
|
||||||
|
|
||||||
|
@ -369,13 +378,13 @@ int str_to_uint(const char *string, unsigned int *number, const int base)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*number = num;
|
*number = (unsigned int)num;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int str_to_uint_strict(const char *string, unsigned int *number, const int base)
|
int str_to_uint_strict(const char *string, unsigned int *number, const int base)
|
||||||
{
|
{
|
||||||
unsigned long num;
|
unsigned long num; /* long >= int, make sure we fit well */
|
||||||
|
|
||||||
*number = 0;
|
*number = 0;
|
||||||
|
|
||||||
|
@ -387,7 +396,7 @@ int str_to_uint_strict(const char *string, unsigned int *number, const int base)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*number = num;
|
*number = (unsigned int)num;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,7 +438,7 @@ int str_to_long_strict(const char *string, long *number, const int base)
|
||||||
if (
|
if (
|
||||||
string == NULL ||
|
string == NULL ||
|
||||||
*string == '\0' ||
|
*string == '\0' ||
|
||||||
isspace(*string)
|
isspace((size_t)*string)
|
||||||
) {
|
) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -495,7 +504,7 @@ int str_to_ulong_strict(const char *string, unsigned long *number, const int bas
|
||||||
*string == '\0' ||
|
*string == '\0' ||
|
||||||
*string == '+' ||
|
*string == '+' ||
|
||||||
*string == '-' ||
|
*string == '-' ||
|
||||||
isspace(*string)
|
isspace((size_t)*string)
|
||||||
) {
|
) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -559,7 +568,7 @@ int str_to_double_strict(const char *string, double *number, const int base)
|
||||||
if (
|
if (
|
||||||
string == NULL ||
|
string == NULL ||
|
||||||
*string == '\0' ||
|
*string == '\0' ||
|
||||||
isspace(*string)
|
isspace((size_t)*string)
|
||||||
) {
|
) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -605,3 +614,16 @@ int str_to_double_strict(const char *string, double *number, const int base)
|
||||||
|
|
||||||
return 1;
|
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];
|
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) {
|
switch (errnum) {
|
||||||
#if defined (EPERM)
|
#if defined (EPERM)
|
||||||
case EPERM:
|
case EPERM:
|
||||||
|
@ -498,6 +508,11 @@ char *strerror(int errnum)
|
||||||
/* Fallback: just print the error number */
|
/* Fallback: just print the error number */
|
||||||
snprintf(buf, sizeof(buf), "Error %d", errnum);
|
snprintf(buf, sizeof(buf), "Error %d", errnum);
|
||||||
return buf;
|
return buf;
|
||||||
|
|
||||||
|
#ifdef HAVE_PRAGMAS_FOR_GCC_DIAGNOSTIC_IGNORED_UNREACHABLE_CODE
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_STRERROR */
|
#endif /* HAVE_STRERROR */
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "config.h" /* must be the first header */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -29,14 +31,14 @@
|
||||||
static char *ups_section;
|
static char *ups_section;
|
||||||
|
|
||||||
/* handle arguments separated by parseconf */
|
/* 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)
|
if (numargs < 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* look for section headers - [upsname] */
|
/* look for section headers - [upsname] */
|
||||||
if ((arg[0][0] == '[') && (arg[0][strlen(arg[0])-1] == ']')) {
|
if ((arg[0][0] == '[') && (arg[0][strlen(arg[0])-1] == ']')) {
|
||||||
|
|
||||||
free(ups_section);
|
free(ups_section);
|
||||||
|
|
||||||
arg[0][strlen(arg[0])-1] = '\0';
|
arg[0][strlen(arg[0])-1] = '\0';
|
||||||
|
|
|
@ -15,3 +15,27 @@ endif
|
||||||
|
|
||||||
dist_sysconf_DATA = $(SECFILES) $(PUBFILES) $(CGI_INSTALL)
|
dist_sysconf_DATA = $(SECFILES) $(PUBFILES) $(CGI_INSTALL)
|
||||||
nodist_sysconf_DATA = upssched.conf.sample upsmon.conf.sample
|
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
|
||||||
|
|
102
conf/Makefile.in
102
conf/Makefile.in
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -17,7 +17,17 @@
|
||||||
# Network UPS Tools: conf
|
# Network UPS Tools: conf
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
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 = \
|
am__make_running_with_option = \
|
||||||
case $${target_option-} in \
|
case $${target_option-} in \
|
||||||
?) ;; \
|
?) ;; \
|
||||||
|
@ -82,21 +92,24 @@ build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
target_triplet = @target@
|
target_triplet = @target@
|
||||||
subdir = conf
|
subdir = conf
|
||||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
|
||||||
$(srcdir)/upsmon.conf.sample.in \
|
|
||||||
$(srcdir)/upssched.conf.sample.in \
|
|
||||||
$(am__dist_sysconf_DATA_DIST)
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
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/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_asciidoc.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_libavahi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libltdl.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_libneon.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||||
|
@ -105,11 +118,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_os.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_report_feature.m4 \
|
||||||
|
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||||
$(top_srcdir)/configure.ac
|
$(top_srcdir)/configure.ac
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_sysconf_DATA_DIST) \
|
||||||
|
$(am__DIST_COMMON)
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||||
CONFIG_CLEAN_FILES = upsmon.conf.sample upssched.conf.sample
|
CONFIG_CLEAN_FILES = upsmon.conf.sample upssched.conf.sample
|
||||||
|
@ -167,6 +187,9 @@ am__uninstall_files_from_dir = { \
|
||||||
am__installdirs = "$(DESTDIR)$(sysconfdir)" "$(DESTDIR)$(sysconfdir)"
|
am__installdirs = "$(DESTDIR)$(sysconfdir)" "$(DESTDIR)$(sysconfdir)"
|
||||||
DATA = $(dist_sysconf_DATA) $(nodist_sysconf_DATA)
|
DATA = $(dist_sysconf_DATA) $(nodist_sysconf_DATA)
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
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)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
A2X = @A2X@
|
A2X = @A2X@
|
||||||
ACLOCAL = @ACLOCAL@
|
ACLOCAL = @ACLOCAL@
|
||||||
|
@ -175,6 +198,7 @@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
ASCIIDOC = @ASCIIDOC@
|
ASCIIDOC = @ASCIIDOC@
|
||||||
ASPELL = @ASPELL@
|
ASPELL = @ASPELL@
|
||||||
|
AUGPARSE = @AUGPARSE@
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -185,6 +209,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CONFPATH = @CONFPATH@
|
CONFPATH = @CONFPATH@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
|
CPPCHECK = @CPPCHECK@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||||
|
@ -198,6 +223,7 @@ DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
DLLTOOL = @DLLTOOL@
|
DLLTOOL = @DLLTOOL@
|
||||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||||
|
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||||
|
@ -210,6 +236,7 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
@ -227,6 +254,8 @@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||||
|
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||||
|
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||||
|
@ -237,21 +266,29 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||||
|
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||||
|
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
LN_S = @LN_S@
|
LN_S = @LN_S@
|
||||||
|
LN_S_R = @LN_S_R@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
NETLIBS = @NETLIBS@
|
NETLIBS = @NETLIBS@
|
||||||
|
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||||
NM = @NM@
|
NM = @NM@
|
||||||
NMEDIT = @NMEDIT@
|
NMEDIT = @NMEDIT@
|
||||||
|
NUT_DATADIR = @NUT_DATADIR@
|
||||||
|
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||||
NUT_NETVERSION = @NUT_NETVERSION@
|
NUT_NETVERSION = @NUT_NETVERSION@
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -271,6 +308,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
||||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
PORT = @PORT@
|
PORT = @PORT@
|
||||||
|
PYTHON = @PYTHON@
|
||||||
|
PYTHON2 = @PYTHON2@
|
||||||
|
PYTHON3 = @PYTHON3@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||||
RUN_AS_USER = @RUN_AS_USER@
|
RUN_AS_USER = @RUN_AS_USER@
|
||||||
|
@ -284,6 +324,7 @@ STATEPATH = @STATEPATH@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
SUN_LIBUSB = @SUN_LIBUSB@
|
SUN_LIBUSB = @SUN_LIBUSB@
|
||||||
TREE_VERSION = @TREE_VERSION@
|
TREE_VERSION = @TREE_VERSION@
|
||||||
|
VALGRIND = @VALGRIND@
|
||||||
VERSION = @VERSION@
|
VERSION = @VERSION@
|
||||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||||
XMLLINT = @XMLLINT@
|
XMLLINT = @XMLLINT@
|
||||||
|
@ -301,6 +342,7 @@ am__leading_dot = @am__leading_dot@
|
||||||
am__quote = @am__quote@
|
am__quote = @am__quote@
|
||||||
am__tar = @am__tar@
|
am__tar = @am__tar@
|
||||||
am__untar = @am__untar@
|
am__untar = @am__untar@
|
||||||
|
auglensdir = @auglensdir@
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
build = @build@
|
build = @build@
|
||||||
build_alias = @build_alias@
|
build_alias = @build_alias@
|
||||||
|
@ -314,6 +356,9 @@ datarootdir = @datarootdir@
|
||||||
devddir = @devddir@
|
devddir = @devddir@
|
||||||
docdir = @docdir@
|
docdir = @docdir@
|
||||||
driverexecdir = @driverexecdir@
|
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@
|
dvidir = @dvidir@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
host = @host@
|
host = @host@
|
||||||
|
@ -339,12 +384,14 @@ pkgconfigdir = @pkgconfigdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
systemdshutdowndir = @systemdshutdowndir@
|
||||||
systemdsystemunitdir = @systemdsystemunitdir@
|
systemdsystemunitdir = @systemdsystemunitdir@
|
||||||
|
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||||
target = @target@
|
target = @target@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
target_cpu = @target_cpu@
|
target_cpu = @target_cpu@
|
||||||
|
@ -364,9 +411,15 @@ CGIPUB = hosts.conf.sample upsset.conf.sample upsstats.html.sample \
|
||||||
@WITH_CGI_TRUE@CGI_INSTALL = $(CGIPUB)
|
@WITH_CGI_TRUE@CGI_INSTALL = $(CGIPUB)
|
||||||
dist_sysconf_DATA = $(SECFILES) $(PUBFILES) $(CGI_INSTALL)
|
dist_sysconf_DATA = $(SECFILES) $(PUBFILES) $(CGI_INSTALL)
|
||||||
nodist_sysconf_DATA = upssched.conf.sample upsmon.conf.sample
|
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
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .in .in-spellchecked .sample .sample-spellchecked
|
||||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||||
@for dep in $?; do \
|
@for dep in $?; do \
|
||||||
case '$(am__configure_deps)' in \
|
case '$(am__configure_deps)' in \
|
||||||
|
@ -379,14 +432,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu conf/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu conf/Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu conf/Makefile
|
$(AUTOMAKE) --gnu conf/Makefile
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' 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__depfiles_maybe);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
@ -456,7 +508,10 @@ ctags CTAGS:
|
||||||
cscope cscopelist:
|
cscope cscopelist:
|
||||||
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
distdir: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||||
|
|
||||||
|
distdir-am: $(DISTFILES)
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
list='$(DISTFILES)'; \
|
list='$(DISTFILES)'; \
|
||||||
|
@ -515,6 +570,7 @@ install-strip:
|
||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
distclean-generic:
|
distclean-generic:
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
@ -523,6 +579,7 @@ distclean-generic:
|
||||||
maintainer-clean-generic:
|
maintainer-clean-generic:
|
||||||
@echo "This command is intended for maintainers to use"
|
@echo "This command is intended for maintainers to use"
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
clean: clean-am
|
clean: clean-am
|
||||||
|
|
||||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||||
|
@ -606,6 +663,25 @@ uninstall-am: uninstall-dist_sysconfDATA uninstall-nodist_sysconfDATA
|
||||||
uninstall-am uninstall-dist_sysconfDATA \
|
uninstall-am uninstall-dist_sysconfDATA \
|
||||||
uninstall-nodist_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.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#
|
#
|
||||||
# MONITOR <system> "<host description>"
|
# MONITOR <system> "<host description>"
|
||||||
#
|
#
|
||||||
# Examples:
|
# Examples:
|
||||||
#
|
#
|
||||||
# MONITOR myups@localhost "Local UPS"
|
# MONITOR myups@localhost "Local UPS"
|
||||||
# MONITOR su2200@10.64.1.1 "Finance department"
|
# MONITOR su2200@10.64.1.1 "Finance department"
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
# The values of MODE can be:
|
# The values of MODE can be:
|
||||||
# - none: NUT is not configured, or use the Integrated Power Management, or use
|
# - none: NUT is not configured, or use the Integrated Power Management, or use
|
||||||
# some external system to startup NUT components. So nothing is to be started.
|
# some external system to startup NUT components. So nothing is to be started.
|
||||||
# - standalone: This mode address a local only configuration, with 1 UPS
|
# - standalone: This mode address a local only configuration, with 1 UPS
|
||||||
# protecting the local system. This implies to start the 3 NUT layers (driver,
|
# protecting the local system. This implies to start the 3 NUT layers (driver,
|
||||||
# upsd and upsmon) and the matching configuration files. This mode can also
|
# upsd and upsmon) and the matching configuration files. This mode can also
|
||||||
# address UPS redundancy.
|
# address UPS redundancy.
|
||||||
|
@ -26,7 +26,14 @@
|
||||||
# - netclient: this mode only requires upsmon.
|
# - netclient: this mode only requires upsmon.
|
||||||
#
|
#
|
||||||
# IMPORTANT NOTE:
|
# 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!
|
# You MUST NOT use spaces around the equal sign!
|
||||||
|
|
||||||
MODE=none
|
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
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# --- SECURITY NOTE ---
|
# --- SECURITY NOTE ---
|
||||||
#
|
#
|
||||||
# If you use snmp-ups and set a community string in here, you
|
# If you use snmp-ups and set a community string in here, you
|
||||||
# will have to secure this file to keep other users from obtaining
|
# will have to secure this file to keep other users from obtaining
|
||||||
# that string. It needs to be readable by upsdrvctl and any drivers,
|
# that string. It needs to be readable by upsdrvctl and any drivers,
|
||||||
# and by upsd.
|
# and by upsd.
|
||||||
|
@ -14,69 +14,98 @@
|
||||||
# USB devices and SNMP devices are also supported.
|
# USB devices and SNMP devices are also supported.
|
||||||
#
|
#
|
||||||
# This file is used by upsdrvctl to start and stop your driver(s), and
|
# This file is used by upsdrvctl to start and stop your driver(s), and
|
||||||
# is also used by upsd to determine which drivers to monitor. The
|
# is also used by upsd to determine which drivers to monitor. The
|
||||||
# drivers themselves also read this file for configuration directives.
|
# drivers themselves also read this file for configuration directives.
|
||||||
#
|
#
|
||||||
# The general form is:
|
# The general form is:
|
||||||
#
|
#
|
||||||
# [upsname]
|
# [upsname]
|
||||||
# driver = <drivername>
|
# driver = <drivername>
|
||||||
# port = <portname>
|
# port = <portname>
|
||||||
# < any other directives here >
|
# < any other directives here >
|
||||||
#
|
#
|
||||||
# The section header ([upsname]) can be just about anything as long as
|
# The section header ([upsname]) can be just about anything as long as
|
||||||
# it is a single word inside brackets. upsd uses this to uniquely
|
# it is a single word inside brackets. upsd uses this to uniquely
|
||||||
# identify a UPS on this system.
|
# identify a UPS on this system.
|
||||||
#
|
#
|
||||||
# If you have a UPS called snoopy, your section header would be "[snoopy]".
|
# 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
|
# 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
|
# Configuration directives
|
||||||
# ------------------------
|
# ------------------------
|
||||||
#
|
|
||||||
# These directives are common to all drivers that support ups.conf:
|
|
||||||
#
|
#
|
||||||
# driver: REQUIRED. Specify the program to run to talk to this UPS.
|
# These directives are used by upsdrvctl only and should be specified outside
|
||||||
# apcsmart, bestups, and sec are some examples.
|
# of a driver definition:
|
||||||
#
|
#
|
||||||
# port: REQUIRED. The serial port where your UPS is connected.
|
# maxretry: OPTIONAL. Specify the number of attempts to start the driver(s),
|
||||||
# /dev/ttyS0 is usually the first port on Linux boxes, for example.
|
# 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.
|
||||||
#
|
#
|
||||||
# sdorder: optional. When you have multiple UPSes on your system, you
|
# The built-in default is 1 attempt.
|
||||||
# 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.
|
# 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.
|
||||||
#
|
#
|
||||||
# nolock: optional, and not recommended for use in this file.
|
# The default is 5 seconds.
|
||||||
#
|
#
|
||||||
# If you put nolock in here, the driver will not lock the
|
# chroot: OPTIONAL. Used for securing. See man page for details.
|
||||||
# serial port every time it starts. This may allow other
|
|
||||||
# processes to seize the port if you start more than one by
|
|
||||||
# mistake.
|
|
||||||
#
|
#
|
||||||
# This is only intended to be used on systems where locking
|
# driverpath: OPTIONAL. Used for custom setups. See man page for details.
|
||||||
# absolutely must be disabled for the software to work.
|
|
||||||
#
|
#
|
||||||
# maxstartdelay: optional. This can be set as a global variable
|
# 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
|
# above your first UPS definition and it can also be
|
||||||
# set in a UPS section. This value controls how long
|
# set in a UPS section. This value controls how long
|
||||||
# upsdrvctl will wait for the driver to finish starting.
|
# upsdrvctl will wait for the driver to finish starting.
|
||||||
# This keeps your system from getting stuck due to a
|
# This keeps your system from getting stuck due to a
|
||||||
# broken driver or UPS.
|
# broken driver or UPS.
|
||||||
#
|
|
||||||
# The default is 45 seconds.
|
# The default is 45 seconds.
|
||||||
#
|
#
|
||||||
# synchronous: optional. The driver work by default in asynchronous
|
# debug_min: OPTIONAL. Specify a minimum debug level for all driver daemons
|
||||||
# mode (i.e *synchronous=no*). This means that all data
|
# (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
|
# are pushed by the driver on the communication socket to
|
||||||
# upsd (Unix socket on Unix, Named pipe on Windows) without
|
# upsd (Unix socket on Unix, Named pipe on Windows) without
|
||||||
# waiting for these data to be actually consumed. With
|
# waiting for these data to be actually consumed. With
|
||||||
|
@ -91,9 +120,63 @@
|
||||||
# The default is 'no' (i.e. asynchronous mode) for backward
|
# The default is 'no' (i.e. asynchronous mode) for backward
|
||||||
# compatibility of the driver behavior.
|
# 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.
|
||||||
|
# apcsmart, bestups, and sec are some examples.
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
# 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
|
||||||
|
# serial port every time it starts. This may allow other
|
||||||
|
# processes to seize the port if you start more than one by
|
||||||
|
# mistake.
|
||||||
|
#
|
||||||
|
# This is only intended to be used on systems where locking
|
||||||
|
# absolutely must be disabled for the software to work.
|
||||||
|
#
|
||||||
|
# ignorelb: OPTIONAL. Ignore low battery condition reported by device,
|
||||||
|
# and evaluate remaining battery charge or runtime instead.
|
||||||
|
# See man page for details.
|
||||||
|
#
|
||||||
|
# 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
|
# Anything else is passed through to the hardware-specific part of
|
||||||
# the driver.
|
# the driver.
|
||||||
#
|
#
|
||||||
# Examples
|
# Examples
|
||||||
# --------
|
# --------
|
||||||
#
|
#
|
||||||
|
@ -101,19 +184,19 @@
|
||||||
# driver on /dev/ttyS0 is:
|
# driver on /dev/ttyS0 is:
|
||||||
#
|
#
|
||||||
# [powerpal]
|
# [powerpal]
|
||||||
# driver = blazer_ser
|
# driver = blazer_ser
|
||||||
# port = /dev/ttyS0
|
# port = /dev/ttyS0
|
||||||
# desc = "Web server"
|
# desc = "Web server"
|
||||||
#
|
#
|
||||||
# If your UPS driver requires additional settings, you can specify them
|
# If your UPS driver requires additional settings, you can specify them
|
||||||
# here. For example, if it supports a setting of "1234" for the
|
# here. For example, if it supports a setting of "1234" for the
|
||||||
# variable "cable", it would look like this:
|
# variable "cable", it would look like this:
|
||||||
#
|
#
|
||||||
# [myups]
|
# [myups]
|
||||||
# driver = mydriver
|
# driver = mydriver
|
||||||
# port = /dev/ttyS1
|
# port = /dev/ttyS1
|
||||||
# cable = 1234
|
# cable = 1234
|
||||||
# desc = "Something descriptive"
|
# desc = "Something descriptive"
|
||||||
#
|
#
|
||||||
# To find out if your driver supports any extra settings, start it with
|
# To find out if your driver supports any extra settings, start it with
|
||||||
# the -h option and/or read the driver's documentation.
|
# the -h option and/or read the driver's documentation.
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
# It should only be readable by the user that upsd becomes. See the FAQ.
|
# It should only be readable by the user that upsd becomes. See the FAQ.
|
||||||
#
|
#
|
||||||
# Each entry below provides usage and default value.
|
# Each entry below provides usage and default value.
|
||||||
|
#
|
||||||
|
# For more information, refer to upsd.conf manual page.
|
||||||
|
|
||||||
# =======================================================================
|
# =======================================================================
|
||||||
# MAXAGE <seconds>
|
# MAXAGE <seconds>
|
||||||
|
@ -19,6 +21,29 @@
|
||||||
# the data fresh within the normal 15 second interval. Watch the syslog
|
# the data fresh within the normal 15 second interval. Watch the syslog
|
||||||
# for notifications from upsd about staleness.
|
# 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 <path>
|
||||||
# STATEPATH /var/run/nut
|
# STATEPATH /var/run/nut
|
||||||
|
@ -27,15 +52,17 @@
|
||||||
# than the default that was compiled into the program.
|
# 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 127.0.0.1 3493
|
||||||
# LISTEN ::1 3493
|
# LISTEN ::1 3493
|
||||||
|
# LISTEN myhostname 83493
|
||||||
|
# LISTEN myhostname.mydomain
|
||||||
#
|
#
|
||||||
# This defaults to the localhost listening addresses and port 3493.
|
# 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.
|
# 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,
|
# You may specify each interface IP address or name that you want upsd to
|
||||||
# optionally with a port number.
|
# listen on for connections, optionally with a port number.
|
||||||
#
|
#
|
||||||
# You may need this if you have multiple interfaces on your machine and
|
# 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
|
# you don't want upsd to listen to all interfaces (for instance on a
|
||||||
|
@ -74,9 +101,9 @@
|
||||||
#
|
#
|
||||||
# When compiled with SSL support with NSS backend,
|
# When compiled with SSL support with NSS backend,
|
||||||
# you can enter the certificate path here.
|
# 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.
|
# Specify the path of the database directory.
|
||||||
#
|
#
|
||||||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||||
# for more information on the SSL support in NUT.
|
# for more information on the SSL support in NUT.
|
||||||
|
|
||||||
|
@ -88,7 +115,7 @@
|
||||||
# you can specify the certificate name to retrieve from database to
|
# you can specify the certificate name to retrieve from database to
|
||||||
# authenticate itself and the password
|
# authenticate itself and the password
|
||||||
# required to access certificate related private key.
|
# required to access certificate related private key.
|
||||||
#
|
#
|
||||||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||||
# for more information on the SSL support in NUT.
|
# for more information on the SSL support in NUT.
|
||||||
|
|
||||||
|
@ -103,7 +130,39 @@
|
||||||
# - 0 to not request to clients to provide any certificate
|
# - 0 to not request to clients to provide any certificate
|
||||||
# - 1 to require to all clients a certificate
|
# - 1 to require to all clients a certificate
|
||||||
# - 2 to require to all clients a valid certificate
|
# - 2 to require to all clients a valid certificate
|
||||||
#
|
#
|
||||||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||||
# for more information on the SSL support in NUT.
|
# 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.
|
||||||
|
|
|
@ -18,25 +18,25 @@
|
||||||
#
|
#
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# actions: Let the user do certain things with upsd.
|
# actions: Let the user do certain things with upsd.
|
||||||
#
|
#
|
||||||
# Valid actions are:
|
# Valid actions are:
|
||||||
#
|
#
|
||||||
# SET - change the value of certain variables in the UPS
|
# SET - change the value of certain variables in the UPS
|
||||||
# FSD - set the "forced shutdown" flag in the UPS
|
# FSD - set the "forced shutdown" flag in the UPS
|
||||||
#
|
#
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# instcmds: Let the user initiate specific instant commands. Use "ALL"
|
# instcmds: Let the user initiate specific instant commands. Use "ALL"
|
||||||
# to grant all commands automatically. There are many possible
|
# to grant all commands automatically. There are many possible
|
||||||
# commands, so use 'upscmd -l' to see what your hardware supports. Here
|
# commands, so use 'upscmd -l' to see what your hardware supports. Here
|
||||||
# are a few examples:
|
# are a few examples:
|
||||||
#
|
#
|
||||||
# test.panel.start - Start a front panel test
|
# test.panel.start - Start a front panel test
|
||||||
# test.battery.start - Start battery test
|
# test.battery.start - Start battery test
|
||||||
# test.battery.stop - Stop battery test
|
# test.battery.stop - Stop battery test
|
||||||
# calibrate.start - Start calibration
|
# calibrate.start - Start calibration
|
||||||
# calibrate.stop - Stop calibration
|
# calibrate.stop - Stop calibration
|
||||||
#
|
#
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
@ -61,12 +61,15 @@
|
||||||
#
|
#
|
||||||
# To add a user for your upsmon, use this example:
|
# To add a user for your upsmon, use this example:
|
||||||
#
|
#
|
||||||
# [upsmon]
|
# [upsmon]
|
||||||
# password = pass
|
# password = pass
|
||||||
# upsmon master
|
# upsmon primary
|
||||||
# or
|
# or
|
||||||
# upsmon slave
|
# upsmon secondary
|
||||||
#
|
#
|
||||||
# The matching MONITOR line in your upsmon.conf would look like this:
|
# 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.
|
||||||
|
|
|
@ -9,9 +9,9 @@
|
||||||
# waits to run the SHUTDOWNCMD. The other one switches to another userid
|
# waits to run the SHUTDOWNCMD. The other one switches to another userid
|
||||||
# and does everything else.
|
# and does everything else.
|
||||||
#
|
#
|
||||||
# The default nonprivileged user is set at compile-time with
|
# The default unprivileged user is set at compile-time with the option
|
||||||
# 'configure --with-user=...'.
|
# 'configure --with-user=...'
|
||||||
#
|
#
|
||||||
# You can override it with '-u <user>' when starting upsmon, or just
|
# You can override it with '-u <user>' when starting upsmon, or just
|
||||||
# define it here for convenience.
|
# define it here for convenience.
|
||||||
#
|
#
|
||||||
|
@ -30,19 +30,19 @@
|
||||||
# RUN_AS_USER @RUN_AS_USER@
|
# 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
|
# 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
|
# to the system running upsmon, but if you want to watch it, it has to
|
||||||
# be in this section.
|
# be in this section.
|
||||||
#
|
#
|
||||||
# You must have at least one of these declared.
|
# You must have at least one of these declared.
|
||||||
#
|
#
|
||||||
# <system> is a UPS identifier in the form <upsname>@<hostname>[:<port>]
|
# <system> is a UPS identifier in the form <upsname>@<hostname>[:<port>]
|
||||||
# like ups@localhost, su700@mybox, etc.
|
# like ups@localhost, su700@mybox, etc.
|
||||||
#
|
#
|
||||||
# Examples:
|
# Examples:
|
||||||
#
|
#
|
||||||
# - "su700@mybox" means a UPS called "su700" on a system called "mybox"
|
# - "su700@mybox" means a UPS called "su700" on a system called "mybox"
|
||||||
#
|
#
|
||||||
# - "fenton@bigbox:5678" is a UPS called "fenton" on a system called
|
# - "fenton@bigbox:5678" is a UPS called "fenton" on a system called
|
||||||
|
@ -54,34 +54,67 @@
|
||||||
# If the ups.conf on host "doghouse" has a section called "snoopy", the
|
# If the ups.conf on host "doghouse" has a section called "snoopy", the
|
||||||
# identifier for it would be "snoopy@doghouse".
|
# identifier for it would be "snoopy@doghouse".
|
||||||
#
|
#
|
||||||
# <powervalue> is an integer - the number of power supplies that this UPS
|
# <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
|
# feeds on this system. Most personal computers only have one power supply,
|
||||||
# is normally set to 1. You need a pretty big or special box to have any
|
# so this value is normally set to 1, while most modern servers have at least
|
||||||
# other value here.
|
# 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,
|
# You can also set this to 0 for a system that doesn't take any power
|
||||||
# but you still want to monitor. Use this when you want to hear about
|
# from the MONITORed supply, which you still want to monitor (e.g. for an
|
||||||
# changes for a given UPS without shutting down when it goes critical,
|
# administrative workstation fed from a different circuit than the datacenter
|
||||||
# unless <powervalue> is 0.
|
# 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
|
# <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:
|
# "blah", the upsd.users would look like this:
|
||||||
#
|
#
|
||||||
# [monmaster]
|
# [upsmon]
|
||||||
# password = blah
|
# password = blah
|
||||||
# upsmon master (or slave)
|
# upsmon primary # (or secondary)
|
||||||
#
|
|
||||||
# "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.
|
# "primary" means this system will shutdown last, allowing the secondary
|
||||||
|
# systems time to shutdown first.
|
||||||
#
|
#
|
||||||
# Examples:
|
# "secondary" means this system shuts down immediately when power goes
|
||||||
|
# critical and less than MINSUPPLIES power sources have reliable input feeds.
|
||||||
#
|
#
|
||||||
# MONITOR myups@bigserver 1 monmaster blah master
|
# The general assumption is that the "primary" system is the one with direct
|
||||||
# MONITOR su700@server.example.com 1 upsmon secretpass slave
|
# connection to an UPS (such as serial or USB cable), so the primary system
|
||||||
# MONITOR myups@localhost 1 upsmon pass master (or slave)
|
# 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 upswired blah primary
|
||||||
|
# MONITOR su700@server.example.com 1 upsmon secretpass secondary
|
||||||
|
# MONITOR myups@localhost 1 upsmon pass primary # (or secondary)
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
# MINSUPPLIES <num>
|
# MINSUPPLIES <num>
|
||||||
|
@ -91,7 +124,7 @@
|
||||||
# put "1" in this field.
|
# put "1" in this field.
|
||||||
#
|
#
|
||||||
# Large/expensive server type systems usually have more, and can run with
|
# 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
|
# so you'd set that to 2. The idea is to keep the box running as long
|
||||||
# as possible, right?
|
# as possible, right?
|
||||||
#
|
#
|
||||||
|
@ -106,7 +139,15 @@ MINSUPPLIES 1
|
||||||
#
|
#
|
||||||
# upsmon runs this command when the system needs to be brought down.
|
# 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"
|
SHUTDOWNCMD "/sbin/shutdown -h +0"
|
||||||
|
|
||||||
|
@ -115,25 +156,32 @@ SHUTDOWNCMD "/sbin/shutdown -h +0"
|
||||||
#
|
#
|
||||||
# upsmon calls this to send messages when things happen
|
# 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
|
# The environment string NOTIFYTYPE will contain the type string of
|
||||||
# whatever caused this event to happen.
|
# 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
|
# Note that this is only called for NOTIFY events that have EXEC set with
|
||||||
# NOTIFYFLAG. See NOTIFYFLAG below for more details.
|
# NOTIFYFLAG. See NOTIFYFLAG below for more details.
|
||||||
#
|
#
|
||||||
# Making this some sort of shell script might not be a bad idea. For more
|
# Making this some sort of shell script might not be a bad idea.
|
||||||
# information and ideas, see docs/scheduling.txt
|
# 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:
|
# Example:
|
||||||
# NOTIFYCMD @BINDIR@/notifyme
|
# NOTIFYCMD @BINDIR@/notifyme
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
# POLLFREQ <n>
|
# POLLFREQ <n>
|
||||||
#
|
#
|
||||||
# Polling frequency for normal activities, measured in seconds.
|
# Polling frequency for normal activities, measured in seconds.
|
||||||
#
|
#
|
||||||
# Adjust this to keep upsmon from flooding your network, but don't make
|
# 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.
|
# it too high or it may miss certain short-lived power events.
|
||||||
|
|
||||||
POLLFREQ 5
|
POLLFREQ 5
|
||||||
|
@ -144,8 +192,8 @@ POLLFREQ 5
|
||||||
# Polling frequency in seconds while UPS on battery.
|
# Polling frequency in seconds while UPS on battery.
|
||||||
#
|
#
|
||||||
# You can make this number lower than POLLFREQ, which will make updates
|
# 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
|
# 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.
|
# network load if you have a lot of these things running.
|
||||||
#
|
#
|
||||||
# The default is 5 seconds for both this and POLLFREQ.
|
# The default is 5 seconds for both this and POLLFREQ.
|
||||||
|
|
||||||
|
@ -154,17 +202,17 @@ POLLFREQALERT 5
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
# HOSTSYNC - How long upsmon will wait before giving up on another upsmon
|
# HOSTSYNC - How long upsmon will wait before giving up on another upsmon
|
||||||
#
|
#
|
||||||
# The master upsmon process uses this number when waiting for slaves to
|
# The primary upsmon process uses this number when waiting for secondary
|
||||||
# disconnect once it has set the forced shutdown (FSD) flag. If they
|
# systems to disconnect once it has set the forced shutdown (FSD) flag.
|
||||||
# don't disconnect after this many seconds, it goes on without them.
|
# 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
|
# Similarly, upsmon secondary processes wait up to this interval for the
|
||||||
# master upsmon to set FSD when a UPS they are monitoring goes critical -
|
# primary upsmon to set FSD when an UPS they are monitoring goes critical -
|
||||||
# that is, on battery and low battery. If the master doesn't do its job,
|
# that is, on battery and low battery. If the primary doesn't do its job,
|
||||||
# the slaves will shut down anyway to avoid damage to the file systems.
|
# 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
|
# 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
|
HOSTSYNC 15
|
||||||
|
|
||||||
|
@ -188,11 +236,12 @@ HOSTSYNC 15
|
||||||
DEADTIME 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
|
# 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 config-notes.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:
|
# Refer to the section:
|
||||||
|
@ -226,7 +275,7 @@ POWERDOWNFLAG /etc/killpower
|
||||||
# ONLINE : UPS is back online
|
# ONLINE : UPS is back online
|
||||||
# ONBATT : UPS is on battery
|
# ONBATT : UPS is on battery
|
||||||
# LOWBATT : UPS has a low battery (if also on battery, it's "critical")
|
# 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
|
# COMMOK : Communications established with the UPS
|
||||||
# COMMBAD : Communications lost to the UPS
|
# COMMBAD : Communications lost to the UPS
|
||||||
# SHUTDOWN : The system is being shutdown
|
# SHUTDOWN : The system is being shutdown
|
||||||
|
@ -255,7 +304,7 @@ POWERDOWNFLAG /etc/killpower
|
||||||
#
|
#
|
||||||
# Possible values for the flags:
|
# Possible values for the flags:
|
||||||
#
|
#
|
||||||
# SYSLOG - Write the message in the syslog
|
# SYSLOG - Write the message in the syslog
|
||||||
# WALL - Write the message to all users on the system
|
# WALL - Write the message to all users on the system
|
||||||
# EXEC - Execute NOTIFYCMD (see above) with the message
|
# EXEC - Execute NOTIFYCMD (see above) with the message
|
||||||
# IGNORE - Don't do anything
|
# IGNORE - Don't do anything
|
||||||
|
@ -269,7 +318,7 @@ POWERDOWNFLAG /etc/killpower
|
||||||
# every 43200 seconds, which is 12 hours. It does this by triggering a
|
# every 43200 seconds, which is 12 hours. It does this by triggering a
|
||||||
# NOTIFY_REPLBATT which is then handled by the usual notify structure
|
# NOTIFY_REPLBATT which is then handled by the usual notify structure
|
||||||
# you've defined above.
|
# you've defined above.
|
||||||
#
|
#
|
||||||
# If this number is not to your liking, override it here.
|
# If this number is not to your liking, override it here.
|
||||||
|
|
||||||
RBWARNTIME 43200
|
RBWARNTIME 43200
|
||||||
|
@ -279,7 +328,7 @@ RBWARNTIME 43200
|
||||||
#
|
#
|
||||||
# upsmon will let you know through the usual notify system if it can't
|
# 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
|
# 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
|
# trigger a NOTIFY_NOCOMM by default every 300 seconds unless you
|
||||||
# change the interval with this directive.
|
# change the interval with this directive.
|
||||||
|
|
||||||
NOCOMMWARNTIME 300
|
NOCOMMWARNTIME 300
|
||||||
|
@ -287,17 +336,20 @@ NOCOMMWARNTIME 300
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
# FINALDELAY - last sleep interval before shutting down the system
|
# 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
|
# before executing your SHUTDOWNCMD. If you need to do something in between
|
||||||
# those events, increase this number. Remember, at this point your UPS is
|
# 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
|
# 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
|
# 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.
|
# 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,
|
# Note: If FINALDELAY on the secondary is greater than HOSTSYNC on the
|
||||||
# the master will give up waiting for the slave to disconnect.
|
# primary, the primary will give up waiting for that secondary system
|
||||||
|
# to disconnect.
|
||||||
|
|
||||||
FINALDELAY 5
|
FINALDELAY 5
|
||||||
|
|
||||||
|
@ -307,9 +359,9 @@ FINALDELAY 5
|
||||||
# When compiled with SSL support, you can enter the certificate path here.
|
# When compiled with SSL support, you can enter the certificate path here.
|
||||||
#
|
#
|
||||||
# With NSS:
|
# 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.
|
# Specify the path of the database directory.
|
||||||
#
|
#
|
||||||
# CERTPATH @CONFPATH@/cert/upsmon
|
# CERTPATH @CONFPATH@/cert/upsmon
|
||||||
#
|
#
|
||||||
# With OpenSSL:
|
# With OpenSSL:
|
||||||
|
@ -319,7 +371,7 @@ FINALDELAY 5
|
||||||
# name hash value, which must hence be available.
|
# name hash value, which must hence be available.
|
||||||
#
|
#
|
||||||
# CERTPATH /usr/ssl/certs
|
# CERTPATH /usr/ssl/certs
|
||||||
#
|
#
|
||||||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||||
# for more information on the SSL support in NUT.
|
# for more information on the SSL support in NUT.
|
||||||
|
|
||||||
|
@ -332,7 +384,7 @@ FINALDELAY 5
|
||||||
# required to access certificate related private key.
|
# required to access certificate related private key.
|
||||||
#
|
#
|
||||||
# CERTIDENT "my nut monitor" "MyPasSw0rD"
|
# CERTIDENT "my nut monitor" "MyPasSw0rD"
|
||||||
#
|
#
|
||||||
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
# See 'docs/security.txt' or the Security chapter of NUT user manual
|
||||||
# for more information on the SSL support in NUT.
|
# for more information on the SSL support in NUT.
|
||||||
|
|
||||||
|
@ -355,14 +407,14 @@ FINALDELAY 5
|
||||||
# CERTVERIFY - make upsmon verify all connections with certificates
|
# CERTVERIFY - make upsmon verify all connections with certificates
|
||||||
# CERTVERIFY 1
|
# CERTVERIFY 1
|
||||||
#
|
#
|
||||||
# When compiled with SSL support, make upsmon verify all connections with
|
# When compiled with SSL support, make upsmon verify all connections with
|
||||||
# certificates.
|
# certificates.
|
||||||
# Without this, there is no guarantee that the upsd is the right host.
|
# 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.
|
# 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
|
# 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
|
# all of your upsd hosts are ready for SSL and have their certificates
|
||||||
# in order.
|
# 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.
|
# specified with a CERTHOST directive.
|
||||||
|
|
||||||
|
|
||||||
|
@ -376,5 +428,26 @@ FINALDELAY 5
|
||||||
# that nobody can sniff your sessions without a large effort. Setting
|
# that nobody can sniff your sessions without a large effort. Setting
|
||||||
# this will make upsmon drop connections if the remote upsd doesn't
|
# 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.
|
# 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.
|
# 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.
|
||||||
|
|
|
@ -25,7 +25,7 @@ CMDSCRIPT @BINDIR@/upssched-cmd
|
||||||
# normal users can't create the file, due to the possibility of symlinking
|
# normal users can't create the file, due to the possibility of symlinking
|
||||||
# and other evil.
|
# and other evil.
|
||||||
#
|
#
|
||||||
# Note: if you are running Solaris or similar, the permissions that
|
# Note: if you are running Solaris or similar, the permissions that
|
||||||
# upssched sets on this file *are not enough* to keep you safe. If
|
# upssched sets on this file *are not enough* to keep you safe. If
|
||||||
# your OS ignores the permissions on a FIFO, then you MUST put this in
|
# your OS ignores the permissions on a FIFO, then you MUST put this in
|
||||||
# a protected directory!
|
# a protected directory!
|
||||||
|
@ -67,9 +67,9 @@ CMDSCRIPT @BINDIR@/upssched-cmd
|
||||||
# <upsname> can be the special value * to apply this handler to every
|
# <upsname> can be the special value * to apply this handler to every
|
||||||
# possible value of <upsname>.
|
# possible value of <upsname>.
|
||||||
#
|
#
|
||||||
# Run the command <command> via your CMDSCRIPT when it happens.
|
# Run the command <command> via your CMDSCRIPT when it happens.
|
||||||
#
|
#
|
||||||
# Note that any AT that matches both the <notifytype> and the <upsname>
|
# Note that any AT that matches both the <notifytype> and the <upsname>
|
||||||
# for the current event will be used.
|
# for the current event will be used.
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
@ -83,9 +83,15 @@ CMDSCRIPT @BINDIR@/upssched-cmd
|
||||||
# argument.
|
# argument.
|
||||||
#
|
#
|
||||||
# Example:
|
# 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
|
# 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.
|
# has passed then pass the optional argument <cmd> to CMDSCRIPT.
|
||||||
#
|
#
|
||||||
# Example:
|
# Example:
|
||||||
# If a specific UPS (myups@localhost) comes back online, then stop the
|
# 1) If a specific UPS (myups@localhost) communication is restored, then stop
|
||||||
# timer before it triggers
|
# the timer before it triggers
|
||||||
#
|
#
|
||||||
# AT COMMOK myups@localhost CANCEL-TIMER upsgone
|
# 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
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
#
|
#
|
||||||
# This file is provided to ensure that you do not expose your upsd server
|
# This file is provided to ensure that you do not expose your upsd server
|
||||||
# to the world upon installing the CGI programs. Specifically, it keeps
|
# to the world upon installing the CGI programs. Specifically, it keeps
|
||||||
# the upsset.cgi program from running until you have assured it that you
|
# the upsset.cgi program from running until you have assured it that you
|
||||||
# have secured your web server's CGI directory.
|
# have secured your web server's CGI directory.
|
||||||
#
|
#
|
||||||
# By default, your web server will probably let anyone access upsset.cgi
|
# By default, your web server will probably let anyone access upsset.cgi
|
||||||
# once it is installed. This means that anyone could attempt to crack
|
# once it is installed. This means that anyone could attempt to crack
|
||||||
# upsd logins since they would appear to be coming from your web server,
|
# upsd logins since they would appear to be coming from your web server,
|
||||||
# rather than the outside world, slipping through any ACL/ACCESS definitions.
|
# rather than the outside world, slipping through any ACL/ACCESS definitions.
|
||||||
#
|
#
|
||||||
# For this reason, you *MUST* first secure your CGI programs before
|
# For this reason, you *MUST* first secure your CGI programs before
|
||||||
|
@ -17,17 +17,17 @@
|
||||||
# For Apache, the .htaccess file can be used in the directory with the
|
# For Apache, the .htaccess file can be used in the directory with the
|
||||||
# programs. You'll need something like this:
|
# programs. You'll need something like this:
|
||||||
#
|
#
|
||||||
# <Files upsset.cgi>
|
# <Files upsset.cgi>
|
||||||
# deny from all
|
# deny from all
|
||||||
# allow from your.network.addresses
|
# allow from your.network.addresses
|
||||||
# </Files>
|
# </Files>
|
||||||
#
|
#
|
||||||
# You will probably have to set "AllowOverride Limit" for this directory in
|
# You will probably have to set "AllowOverride Limit" for this directory in
|
||||||
# your server-level configuration file as well.
|
# your server-level configuration file as well.
|
||||||
#
|
#
|
||||||
# If this doesn't make sense, then stop reading and leave this program alone.
|
# If this doesn't make sense, then stop reading and leave this program alone.
|
||||||
#
|
#
|
||||||
# Assuming you have all this done (and it works), then you may uncomment
|
# Assuming you have all this done (and it works), then you may uncomment
|
||||||
# the line below and start using upsset.cgi through your web browser.
|
# the line below and start using upsset.cgi through your web browser.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
@UPSSTATSPATH upsstats.cgi@
|
@UPSSTATSPATH upsstats.cgi@
|
||||||
@UPSIMAGEPATH upsimage.cgi@
|
@UPSIMAGEPATH upsimage.cgi@
|
||||||
|
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||||
"http://www.w3.org/TR/REC-html40/loose.dtd">
|
"http://www.w3.org/TR/html4/strict.dtd">
|
||||||
<html>
|
<html>
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
|
@ -26,10 +26,16 @@
|
||||||
@REFRESH@
|
@REFRESH@
|
||||||
<title>@HOSTDESC@ : @VAR ups.model@ on @HOST@</title>
|
<title>@HOSTDESC@ : @VAR ups.model@ on @HOST@</title>
|
||||||
<!-- LINK REL="stylesheet" TYPE="text/css" HREF="http://localhost/nut/nut.css" / -->
|
<!-- 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>
|
</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>
|
<tr>
|
||||||
<th COLSPAN="20">Network UPS Tools upsstats @VERSION@ - @HOSTDESC@ - @VAR ups.model@ on @HOST@</th>
|
<th COLSPAN="20">Network UPS Tools upsstats @VERSION@ - @HOSTDESC@ - @VAR ups.model@ on @HOST@</th>
|
||||||
|
@ -51,7 +57,7 @@
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
|
|
||||||
<td BGCOLOR="#000000" VALIGN="TOP">
|
<td VALIGN="TOP">
|
||||||
|
|
||||||
<table BORDER="0"> <!-- table 2 -->
|
<table BORDER="0"> <!-- table 2 -->
|
||||||
|
|
||||||
|
@ -195,7 +201,7 @@
|
||||||
|
|
||||||
@IFSUPP ambient.temperature@
|
@IFSUPP ambient.temperature@
|
||||||
@IFSUPP ambient.humidity@
|
@IFSUPP ambient.humidity@
|
||||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
<td ALIGN="CENTER" VALIGN="TOP">
|
||||||
<table BORDER="0"><tr>
|
<table BORDER="0"><tr>
|
||||||
<td ALIGN="CENTER">Temperature<br>@IMG ambient.temperature tempmin=0 tempmax=50 width=90@</td>
|
<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>
|
<td ALIGN="CENTER">Humidity<br>@IMG ambient.humidity width=90@</td>
|
||||||
|
@ -203,21 +209,21 @@
|
||||||
</td>
|
</td>
|
||||||
@ELSE@
|
@ELSE@
|
||||||
@IFSUPP ambient.temperature@
|
@IFSUPP ambient.temperature@
|
||||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
<td ALIGN="CENTER" VALIGN="TOP">
|
||||||
<table BORDER="0"><tr>
|
<table BORDER="0"><tr>
|
||||||
<td ALIGN="CENTER">Temperature<br>@IMG ambient.temperature tempmin=0 tempmax=50@</td>
|
<td ALIGN="CENTER">Temperature<br>@IMG ambient.temperature tempmin=0 tempmax=50@</td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
</td>
|
</td>
|
||||||
@ELSE@
|
@ELSE@
|
||||||
@IFSUPP ambient.humidity@
|
@IFSUPP ambient.humidity@
|
||||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
<td ALIGN="CENTER" VALIGN="TOP">
|
||||||
<table BORDER="0"><tr>
|
<table BORDER="0"><tr>
|
||||||
<td ALIGN="CENTER">Humidity<br>@IMG ambient.humidity@</td>
|
<td ALIGN="CENTER">Humidity<br>@IMG ambient.humidity@</td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
</td>
|
</td>
|
||||||
@ENDIF@
|
@ENDIF@
|
||||||
|
|
||||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
<td ALIGN="CENTER" VALIGN="TOP">
|
||||||
<table BORDER="0"><tr>
|
<table BORDER="0"><tr>
|
||||||
@IFSUPP battery.charge@
|
@IFSUPP battery.charge@
|
||||||
@IFSUPP battery.voltage@
|
@IFSUPP battery.voltage@
|
||||||
|
@ -232,7 +238,7 @@
|
||||||
</tr></table>
|
</tr></table>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
<td ALIGN="CENTER" VALIGN="TOP">
|
||||||
<table BORDER="0"><tr>
|
<table BORDER="0"><tr>
|
||||||
@IFSUPP input.L2-L3.voltage@
|
@IFSUPP input.L2-L3.voltage@
|
||||||
<td ALIGN="CENTER">L1-L2<br>@IMG input.L1-L2.voltage width=68@</td>
|
<td ALIGN="CENTER">L1-L2<br>@IMG input.L1-L2.voltage width=68@</td>
|
||||||
|
@ -249,7 +255,7 @@
|
||||||
</tr></table>
|
</tr></table>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
<td ALIGN="CENTER" VALIGN="TOP">
|
||||||
<table BORDER="0"><tr>
|
<table BORDER="0"><tr>
|
||||||
@IFSUPP output.L2-L3.voltage@
|
@IFSUPP output.L2-L3.voltage@
|
||||||
<td ALIGN="CENTER">L1-L2<br>@IMG output.L1-L2.voltage width=68@</td>
|
<td ALIGN="CENTER">L1-L2<br>@IMG output.L1-L2.voltage width=68@</td>
|
||||||
|
@ -266,7 +272,7 @@
|
||||||
</tr></table>
|
</tr></table>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td ALIGN="CENTER" VALIGN="TOP" BGCOLOR="#000000">
|
<td ALIGN="CENTER" VALIGN="TOP">
|
||||||
<table BORDER="0"><tr>
|
<table BORDER="0"><tr>
|
||||||
@IFSUPP output.L2.power.percent@
|
@IFSUPP output.L2.power.percent@
|
||||||
<td ALIGN="CENTER">L1<br>@IMG output.L1.power.percent width=68@</td>
|
<td ALIGN="CENTER">L1<br>@IMG output.L1.power.percent width=68@</td>
|
||||||
|
@ -286,9 +292,12 @@
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
<a href="http://validator.w3.org/check?uri=referer"><img style="float:right"
|
<div><a href="https://jigsaw.w3.org/css-validator/check/referer"><img
|
||||||
src="http://www.w3.org/Icons/valid-html40"
|
style="float:right" src="https://jigsaw.w3.org/css-validator/images/vcss"
|
||||||
alt="Valid HTML 4.0 Transitional" height="31" width="88"></a>
|
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>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<!-- upsstats template file -->
|
<!-- upsstats template file -->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
This (upsstats.html) is the default template file which is used
|
This (upsstats.html) is the default template file which is used
|
||||||
when upsstats.cgi is loaded with no arguments.
|
when upsstats.cgi is loaded with no arguments.
|
||||||
|
|
||||||
|
@ -16,33 +16,41 @@
|
||||||
@UPSSTATSPATH upsstats.cgi@
|
@UPSSTATSPATH upsstats.cgi@
|
||||||
@UPSIMAGEPATH upsimage.cgi@
|
@UPSIMAGEPATH upsimage.cgi@
|
||||||
|
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||||
"http://www.w3.org/TR/REC-html40/loose.dtd">
|
"http://www.w3.org/TR/html4/strict.dtd">
|
||||||
<html>
|
<html>
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
@REFRESH@
|
@REFRESH@
|
||||||
<title>
|
<title>
|
||||||
Network UPS Tools upsstats
|
Network UPS Tools upsstats
|
||||||
@VERSION@
|
@VERSION@
|
||||||
: UPS Status
|
: UPS Status
|
||||||
</title>
|
</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" / -->
|
<!-- link rel="stylesheet" type="text/css" href="nut.css" / -->
|
||||||
@REFRESH@
|
@REFRESH@
|
||||||
</head>
|
</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>
|
<tr><td>
|
||||||
|
|
||||||
<table CELLPADDING="5">
|
<table>
|
||||||
<tr>
|
<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@
|
@VERSION@
|
||||||
</font>
|
</span>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
@DATE %a %b %d %X %Z %Y@
|
@DATE %a %b %d %X %Z %Y@
|
||||||
|
@ -50,7 +58,7 @@ Network UPS Tools upsstats
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<tr BGCOLOR="#60B0B0">
|
<tr style="background:#60B0B0;">
|
||||||
<th COLSPAN="1">System</th>
|
<th COLSPAN="1">System</th>
|
||||||
<th COLSPAN="1">Model</th>
|
<th COLSPAN="1">Model</th>
|
||||||
<th COLSPAN="1">Status</th>
|
<th COLSPAN="1">Status</th>
|
||||||
|
@ -65,20 +73,20 @@ Network UPS Tools upsstats
|
||||||
|
|
||||||
@FOREACHUPS@
|
@FOREACHUPS@
|
||||||
|
|
||||||
<tr ALIGN=CENTER>
|
<tr>
|
||||||
<td BGCOLOR="#00FFFF">
|
<td class="t1">
|
||||||
@HOSTLINK@
|
@HOSTLINK@
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td BGCOLOR="#00FFFF">
|
<td class="t1">
|
||||||
@VAR ups.model@
|
@VAR ups.model@
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td BGCOLOR="@STATUSCOLOR@">
|
<td style="background:@STATUSCOLOR@">
|
||||||
@STATUS@
|
@STATUS@
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td BGCOLOR="#00FF00">
|
<td class="t2">
|
||||||
@IFSUPP battery.charge@
|
@IFSUPP battery.charge@
|
||||||
@VAR 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.L1-L2.voltage@
|
||||||
@IFBETWEEN input.transfer.low input.transfer.high input.L2-L3.voltage@
|
@IFBETWEEN input.transfer.low input.transfer.high input.L2-L3.voltage@
|
||||||
@IFBETWEEN input.transfer.low input.transfer.high input.L3-L1.voltage@
|
@IFBETWEEN input.transfer.low input.transfer.high input.L3-L1.voltage@
|
||||||
<td BGCOLOR="#00FF00">
|
<td class="t2">
|
||||||
@ELSE@
|
@ELSE@
|
||||||
@IFSUPP input.L2-N.voltage@
|
@IFSUPP input.L2-N.voltage@
|
||||||
@IFBETWEEN input.transfer.low input.transfer.high input.L1-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.L2-N.voltage@
|
||||||
@IFBETWEEN input.transfer.low input.transfer.high input.L3-N.voltage@
|
@IFBETWEEN input.transfer.low input.transfer.high input.L3-N.voltage@
|
||||||
<td BGCOLOR="#00FF00">
|
<td class="t2">
|
||||||
@ELSE@
|
@ELSE@
|
||||||
@IFBETWEEN input.transfer.low input.transfer.high input.voltage@
|
@IFBETWEEN input.transfer.low input.transfer.high input.voltage@
|
||||||
<td BGCOLOR="#00FF00">
|
<td class="t2">
|
||||||
@ELSE@
|
@ELSE@
|
||||||
<td BGCOLOR="#FF0000">
|
<td style="background:red;">
|
||||||
@ENDIF@
|
@ENDIF@
|
||||||
|
|
||||||
@IFSUPP input.L2-L3.voltage@
|
@IFSUPP input.L2-L3.voltage@
|
||||||
|
@ -118,7 +126,7 @@ Network UPS Tools upsstats
|
||||||
@ENDIF@
|
@ENDIF@
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td BGCOLOR="#00FF00">
|
<td class="t2">
|
||||||
@IFSUPP output.L2-L3.voltage@
|
@IFSUPP output.L2-L3.voltage@
|
||||||
@VAR output.L1-L2.voltage@
|
@VAR output.L1-L2.voltage@
|
||||||
@VAR output.L2-L3.voltage@
|
@VAR output.L2-L3.voltage@
|
||||||
|
@ -134,7 +142,7 @@ Network UPS Tools upsstats
|
||||||
@ENDIF@
|
@ENDIF@
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td BGCOLOR="#00FF00">
|
<td class="t2">
|
||||||
@IFSUPP output.L2.power.percent@
|
@IFSUPP output.L2.power.percent@
|
||||||
@VAR output.L1.power.percent@
|
@VAR output.L1.power.percent@
|
||||||
@VAR output.L2.power.percent@
|
@VAR output.L2.power.percent@
|
||||||
|
@ -151,7 +159,7 @@ Network UPS Tools upsstats
|
||||||
@ENDIF@
|
@ENDIF@
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td BGCOLOR="#00FF00">
|
<td class="t2">
|
||||||
@IFSUPP ups.temperature@
|
@IFSUPP ups.temperature@
|
||||||
@UPSTEMP@
|
@UPSTEMP@
|
||||||
@DEGREES@
|
@DEGREES@
|
||||||
|
@ -162,13 +170,13 @@ Network UPS Tools upsstats
|
||||||
@ENDIF@
|
@ENDIF@
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td BGCOLOR="#00FF00">
|
<td class="t2">
|
||||||
@IFSUPP battery.runtime@
|
@IFSUPP battery.runtime@
|
||||||
@RUNTIME@
|
@RUNTIME@
|
||||||
@ENDIF@
|
@ENDIF@
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td BGCOLOR="#00FF00">
|
<td class="t2">
|
||||||
@TREELINK@
|
@TREELINK@
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -180,11 +188,9 @@ Network UPS Tools upsstats
|
||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<hr /><div><small>
|
<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="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="http://validator.w3.org/check?uri=referer"><img style="float:right"
|
<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>
|
||||||
src="http://www.w3.org/Icons/valid-html40"
|
|
||||||
alt="Valid HTML 4.0 Transitional" height="31" width="88"></a>
|
|
||||||
</small></div>
|
</small></div>
|
||||||
|
|
||||||
</body></html>
|
</body></html>
|
||||||
|
|
692
config.guess
vendored
692
config.guess
vendored
File diff suppressed because it is too large
Load diff
310
config.sub
vendored
310
config.sub
vendored
|
@ -1,8 +1,8 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Configuration validation subroutine script.
|
# Configuration validation subroutine script.
|
||||||
# Copyright 1992-2014 Free Software Foundation, Inc.
|
# Copyright 1992-2018 Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2014-09-11'
|
timestamp='2018-02-22'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# 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
|
# under the terms of the GNU General Public License as published by
|
||||||
|
@ -15,7 +15,7 @@ timestamp='2014-09-11'
|
||||||
# General Public License for more details.
|
# General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# 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
|
# As a special exception to the GNU General Public License, if you
|
||||||
# distribute this file as part of a program that contains a
|
# distribute this file as part of a program that contains a
|
||||||
|
@ -25,7 +25,7 @@ timestamp='2014-09-11'
|
||||||
# of the GNU General Public License, version 3 ("GPLv3").
|
# of the GNU General Public License, version 3 ("GPLv3").
|
||||||
|
|
||||||
|
|
||||||
# Please send patches with a ChangeLog entry to config-patches@gnu.org.
|
# Please send patches to <config-patches@gnu.org>.
|
||||||
#
|
#
|
||||||
# Configuration subroutine to validate and canonicalize a configuration type.
|
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||||
# Supply the specified configuration type as an argument.
|
# Supply the specified configuration type as an argument.
|
||||||
|
@ -33,7 +33,7 @@ timestamp='2014-09-11'
|
||||||
# Otherwise, we print the canonical config type on stdout and succeed.
|
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||||
|
|
||||||
# You can get the latest version of this script from:
|
# 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
|
# This file is supposed to be the same for all GNU packages
|
||||||
# and recognize all the CPU types, system types and aliases
|
# and recognize all the CPU types, system types and aliases
|
||||||
|
@ -53,12 +53,11 @@ timestamp='2014-09-11'
|
||||||
me=`echo "$0" | sed -e 's,.*/,,'`
|
me=`echo "$0" | sed -e 's,.*/,,'`
|
||||||
|
|
||||||
usage="\
|
usage="\
|
||||||
Usage: $0 [OPTION] CPU-MFR-OPSYS
|
Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
|
||||||
$0 [OPTION] ALIAS
|
|
||||||
|
|
||||||
Canonicalize a configuration name.
|
Canonicalize a configuration name.
|
||||||
|
|
||||||
Operation modes:
|
Options:
|
||||||
-h, --help print this help, then exit
|
-h, --help print this help, then exit
|
||||||
-t, --time-stamp print date of last modification, then exit
|
-t, --time-stamp print date of last modification, then exit
|
||||||
-v, --version print version number, then exit
|
-v, --version print version number, then exit
|
||||||
|
@ -68,7 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
|
||||||
version="\
|
version="\
|
||||||
GNU config.sub ($timestamp)
|
GNU config.sub ($timestamp)
|
||||||
|
|
||||||
Copyright 1992-2014 Free Software Foundation, Inc.
|
Copyright 1992-2018 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
|
@ -95,7 +94,7 @@ while test $# -gt 0 ; do
|
||||||
|
|
||||||
*local*)
|
*local*)
|
||||||
# First pass through any local machine types.
|
# First pass through any local machine types.
|
||||||
echo $1
|
echo "$1"
|
||||||
exit ;;
|
exit ;;
|
||||||
|
|
||||||
* )
|
* )
|
||||||
|
@ -113,24 +112,24 @@ esac
|
||||||
|
|
||||||
# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
|
# 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.
|
# 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
|
case $maybe_os in
|
||||||
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
|
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
|
||||||
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
||||||
knetbsd*-gnu* | netbsd*-gnu* | \
|
knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
|
||||||
kopensolaris*-gnu* | \
|
kopensolaris*-gnu* | cloudabi*-eabi* | \
|
||||||
storm-chaos* | os2-emx* | rtmk-nova*)
|
storm-chaos* | os2-emx* | rtmk-nova*)
|
||||||
os=-$maybe_os
|
os=-$maybe_os
|
||||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||||
;;
|
;;
|
||||||
android-linux)
|
android-linux)
|
||||||
os=-linux-android
|
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/-[^-]*$//'`
|
basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
|
||||||
if [ $basic_machine != $1 ]
|
if [ "$basic_machine" != "$1" ]
|
||||||
then os=`echo $1 | sed 's/.*-/-/'`
|
then os=`echo "$1" | sed 's/.*-/-/'`
|
||||||
else os=; fi
|
else os=; fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
@ -179,44 +178,44 @@ case $os in
|
||||||
;;
|
;;
|
||||||
-sco6)
|
-sco6)
|
||||||
os=-sco5v6
|
os=-sco5v6
|
||||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||||
;;
|
;;
|
||||||
-sco5)
|
-sco5)
|
||||||
os=-sco3.2v5
|
os=-sco3.2v5
|
||||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||||
;;
|
;;
|
||||||
-sco4)
|
-sco4)
|
||||||
os=-sco3.2v4
|
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]*)
|
-sco3.2.[4-9]*)
|
||||||
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
|
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]*)
|
-sco3.2v[4-9]*)
|
||||||
# Don't forget version if it is 3.2v4 or newer.
|
# 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*)
|
-sco5v6*)
|
||||||
# Don't forget version if it is 3.2v4 or newer.
|
# 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*)
|
-sco*)
|
||||||
os=-sco3.2v2
|
os=-sco3.2v2
|
||||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||||
;;
|
;;
|
||||||
-udk*)
|
-udk*)
|
||||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||||
;;
|
;;
|
||||||
-isc)
|
-isc)
|
||||||
os=-isc2.2
|
os=-isc2.2
|
||||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||||
;;
|
;;
|
||||||
-clix*)
|
-clix*)
|
||||||
basic_machine=clipper-intergraph
|
basic_machine=clipper-intergraph
|
||||||
;;
|
;;
|
||||||
-isc*)
|
-isc*)
|
||||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
|
||||||
;;
|
;;
|
||||||
-lynx*178)
|
-lynx*178)
|
||||||
os=-lynxos178
|
os=-lynxos178
|
||||||
|
@ -228,10 +227,7 @@ case $os in
|
||||||
os=-lynxos
|
os=-lynxos
|
||||||
;;
|
;;
|
||||||
-ptx*)
|
-ptx*)
|
||||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
|
basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'`
|
||||||
;;
|
|
||||||
-windowsnt*)
|
|
||||||
os=`echo $os | sed -e 's/windowsnt/winnt/'`
|
|
||||||
;;
|
;;
|
||||||
-psos*)
|
-psos*)
|
||||||
os=-psos
|
os=-psos
|
||||||
|
@ -255,15 +251,16 @@ case $basic_machine in
|
||||||
| arc | arceb \
|
| arc | arceb \
|
||||||
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
|
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
|
||||||
| avr | avr32 \
|
| avr | avr32 \
|
||||||
|
| ba \
|
||||||
| be32 | be64 \
|
| be32 | be64 \
|
||||||
| bfin \
|
| bfin \
|
||||||
| c4x | c8051 | clipper \
|
| c4x | c8051 | clipper \
|
||||||
| d10v | d30v | dlx | dsp16xx \
|
| d10v | d30v | dlx | dsp16xx \
|
||||||
| epiphany \
|
| e2k | epiphany \
|
||||||
| fido | fr30 | frv \
|
| fido | fr30 | frv | ft32 \
|
||||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||||
| hexagon \
|
| hexagon \
|
||||||
| i370 | i860 | i960 | ia64 \
|
| i370 | i860 | i960 | ia16 | ia64 \
|
||||||
| ip2k | iq2000 \
|
| ip2k | iq2000 \
|
||||||
| k1om \
|
| k1om \
|
||||||
| le32 | le64 \
|
| le32 | le64 \
|
||||||
|
@ -299,13 +296,14 @@ case $basic_machine in
|
||||||
| nios | nios2 | nios2eb | nios2el \
|
| nios | nios2 | nios2eb | nios2el \
|
||||||
| ns16k | ns32k \
|
| ns16k | ns32k \
|
||||||
| open8 | or1k | or1knd | or32 \
|
| open8 | or1k | or1knd | or32 \
|
||||||
| pdp10 | pdp11 | pj | pjl \
|
| pdp10 | pj | pjl \
|
||||||
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
||||||
|
| pru \
|
||||||
| pyramid \
|
| pyramid \
|
||||||
| riscv32 | riscv64 \
|
| riscv32 | riscv64 \
|
||||||
| rl78 | rx \
|
| rl78 | rx \
|
||||||
| score \
|
| 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 \
|
| sh64 | sh64le \
|
||||||
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
||||||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||||
|
@ -313,7 +311,8 @@ case $basic_machine in
|
||||||
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
||||||
| ubicom32 \
|
| ubicom32 \
|
||||||
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
||||||
| we32k \
|
| visium \
|
||||||
|
| wasm32 \
|
||||||
| x86 | xc16x | xstormy16 | xtensa \
|
| x86 | xc16x | xstormy16 | xtensa \
|
||||||
| z8k | z80)
|
| z8k | z80)
|
||||||
basic_machine=$basic_machine-unknown
|
basic_machine=$basic_machine-unknown
|
||||||
|
@ -327,11 +326,14 @@ case $basic_machine in
|
||||||
c6x)
|
c6x)
|
||||||
basic_machine=tic6x-unknown
|
basic_machine=tic6x-unknown
|
||||||
;;
|
;;
|
||||||
|
leon|leon[3-9])
|
||||||
|
basic_machine=sparc-$basic_machine
|
||||||
|
;;
|
||||||
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
|
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
|
||||||
basic_machine=$basic_machine-unknown
|
basic_machine=$basic_machine-unknown
|
||||||
os=-none
|
os=-none
|
||||||
;;
|
;;
|
||||||
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
|
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)
|
||||||
;;
|
;;
|
||||||
ms1)
|
ms1)
|
||||||
basic_machine=mt-unknown
|
basic_machine=mt-unknown
|
||||||
|
@ -360,7 +362,7 @@ case $basic_machine in
|
||||||
;;
|
;;
|
||||||
# Object if more than one company name word.
|
# 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
|
exit 1
|
||||||
;;
|
;;
|
||||||
# Recognize the basic CPU types with company name.
|
# Recognize the basic CPU types with company name.
|
||||||
|
@ -372,17 +374,18 @@ case $basic_machine in
|
||||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
|
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
|
||||||
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
||||||
| avr-* | avr32-* \
|
| avr-* | avr32-* \
|
||||||
|
| ba-* \
|
||||||
| be32-* | be64-* \
|
| be32-* | be64-* \
|
||||||
| bfin-* | bs2000-* \
|
| bfin-* | bs2000-* \
|
||||||
| c[123]* | c30-* | [cjt]90-* | c4x-* \
|
| c[123]* | c30-* | [cjt]90-* | c4x-* \
|
||||||
| c8051-* | clipper-* | craynv-* | cydra-* \
|
| c8051-* | clipper-* | craynv-* | cydra-* \
|
||||||
| d10v-* | d30v-* | dlx-* \
|
| d10v-* | d30v-* | dlx-* \
|
||||||
| elxsi-* \
|
| e2k-* | elxsi-* \
|
||||||
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
||||||
| h8300-* | h8500-* \
|
| h8300-* | h8500-* \
|
||||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||||
| hexagon-* \
|
| hexagon-* \
|
||||||
| i*86-* | i860-* | i960-* | ia64-* \
|
| i*86-* | i860-* | i960-* | ia16-* | ia64-* \
|
||||||
| ip2k-* | iq2000-* \
|
| ip2k-* | iq2000-* \
|
||||||
| k1om-* \
|
| k1om-* \
|
||||||
| le32-* | le64-* \
|
| le32-* | le64-* \
|
||||||
|
@ -423,13 +426,15 @@ case $basic_machine in
|
||||||
| orion-* \
|
| orion-* \
|
||||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
||||||
|
| pru-* \
|
||||||
| pyramid-* \
|
| pyramid-* \
|
||||||
|
| riscv32-* | riscv64-* \
|
||||||
| rl78-* | romp-* | rs6000-* | rx-* \
|
| rl78-* | romp-* | rs6000-* | rx-* \
|
||||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||||
| sparclite-* \
|
| sparclite-* \
|
||||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
|
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
|
||||||
| tahoe-* \
|
| tahoe-* \
|
||||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||||
| tile*-* \
|
| tile*-* \
|
||||||
|
@ -437,6 +442,8 @@ case $basic_machine in
|
||||||
| ubicom32-* \
|
| ubicom32-* \
|
||||||
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
||||||
| vax-* \
|
| vax-* \
|
||||||
|
| visium-* \
|
||||||
|
| wasm32-* \
|
||||||
| we32k-* \
|
| we32k-* \
|
||||||
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
||||||
| xstormy16-* | xtensa*-* \
|
| xstormy16-* | xtensa*-* \
|
||||||
|
@ -450,7 +457,7 @@ case $basic_machine in
|
||||||
# Recognize the various machine names and aliases which stand
|
# Recognize the various machine names and aliases which stand
|
||||||
# for a CPU type and a company and sometimes even an OS.
|
# for a CPU type and a company and sometimes even an OS.
|
||||||
386bsd)
|
386bsd)
|
||||||
basic_machine=i386-unknown
|
basic_machine=i386-pc
|
||||||
os=-bsd
|
os=-bsd
|
||||||
;;
|
;;
|
||||||
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
|
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
|
||||||
|
@ -484,7 +491,7 @@ case $basic_machine in
|
||||||
basic_machine=x86_64-pc
|
basic_machine=x86_64-pc
|
||||||
;;
|
;;
|
||||||
amd64-*)
|
amd64-*)
|
||||||
basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
amdahl)
|
amdahl)
|
||||||
basic_machine=580-amdahl
|
basic_machine=580-amdahl
|
||||||
|
@ -513,6 +520,9 @@ case $basic_machine in
|
||||||
basic_machine=i386-pc
|
basic_machine=i386-pc
|
||||||
os=-aros
|
os=-aros
|
||||||
;;
|
;;
|
||||||
|
asmjs)
|
||||||
|
basic_machine=asmjs-unknown
|
||||||
|
;;
|
||||||
aux)
|
aux)
|
||||||
basic_machine=m68k-apple
|
basic_machine=m68k-apple
|
||||||
os=-aux
|
os=-aux
|
||||||
|
@ -526,7 +536,7 @@ case $basic_machine in
|
||||||
os=-linux
|
os=-linux
|
||||||
;;
|
;;
|
||||||
blackfin-*)
|
blackfin-*)
|
||||||
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
os=-linux
|
os=-linux
|
||||||
;;
|
;;
|
||||||
bluegene*)
|
bluegene*)
|
||||||
|
@ -534,13 +544,13 @@ case $basic_machine in
|
||||||
os=-cnk
|
os=-cnk
|
||||||
;;
|
;;
|
||||||
c54x-*)
|
c54x-*)
|
||||||
basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
c55x-*)
|
c55x-*)
|
||||||
basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
c6x-*)
|
c6x-*)
|
||||||
basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
c90)
|
c90)
|
||||||
basic_machine=c90-cray
|
basic_machine=c90-cray
|
||||||
|
@ -629,10 +639,18 @@ case $basic_machine in
|
||||||
basic_machine=rs6000-bull
|
basic_machine=rs6000-bull
|
||||||
os=-bosx
|
os=-bosx
|
||||||
;;
|
;;
|
||||||
dpx2* | dpx2*-bull)
|
dpx2*)
|
||||||
basic_machine=m68k-bull
|
basic_machine=m68k-bull
|
||||||
os=-sysv3
|
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)
|
ebmon29k)
|
||||||
basic_machine=a29k-amd
|
basic_machine=a29k-amd
|
||||||
os=-ebmon
|
os=-ebmon
|
||||||
|
@ -722,9 +740,6 @@ case $basic_machine in
|
||||||
hp9k8[0-9][0-9] | hp8[0-9][0-9])
|
hp9k8[0-9][0-9] | hp8[0-9][0-9])
|
||||||
basic_machine=hppa1.0-hp
|
basic_machine=hppa1.0-hp
|
||||||
;;
|
;;
|
||||||
hppa-next)
|
|
||||||
os=-nextstep3
|
|
||||||
;;
|
|
||||||
hppaosf)
|
hppaosf)
|
||||||
basic_machine=hppa1.1-hp
|
basic_machine=hppa1.1-hp
|
||||||
os=-osf
|
os=-osf
|
||||||
|
@ -737,26 +752,26 @@ case $basic_machine in
|
||||||
basic_machine=i370-ibm
|
basic_machine=i370-ibm
|
||||||
;;
|
;;
|
||||||
i*86v32)
|
i*86v32)
|
||||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
|
||||||
os=-sysv32
|
os=-sysv32
|
||||||
;;
|
;;
|
||||||
i*86v4*)
|
i*86v4*)
|
||||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
|
||||||
os=-sysv4
|
os=-sysv4
|
||||||
;;
|
;;
|
||||||
i*86v)
|
i*86v)
|
||||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
|
||||||
os=-sysv
|
os=-sysv
|
||||||
;;
|
;;
|
||||||
i*86sol2)
|
i*86sol2)
|
||||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
|
||||||
os=-solaris2
|
os=-solaris2
|
||||||
;;
|
;;
|
||||||
i386mach)
|
i386mach)
|
||||||
basic_machine=i386-mach
|
basic_machine=i386-mach
|
||||||
os=-mach
|
os=-mach
|
||||||
;;
|
;;
|
||||||
i386-vsta | vsta)
|
vsta)
|
||||||
basic_machine=i386-unknown
|
basic_machine=i386-unknown
|
||||||
os=-vsta
|
os=-vsta
|
||||||
;;
|
;;
|
||||||
|
@ -774,17 +789,17 @@ case $basic_machine in
|
||||||
basic_machine=m68k-isi
|
basic_machine=m68k-isi
|
||||||
os=-sysv
|
os=-sysv
|
||||||
;;
|
;;
|
||||||
|
leon-*|leon[3-9]-*)
|
||||||
|
basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'`
|
||||||
|
;;
|
||||||
m68knommu)
|
m68knommu)
|
||||||
basic_machine=m68k-unknown
|
basic_machine=m68k-unknown
|
||||||
os=-linux
|
os=-linux
|
||||||
;;
|
;;
|
||||||
m68knommu-*)
|
m68knommu-*)
|
||||||
basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
os=-linux
|
os=-linux
|
||||||
;;
|
;;
|
||||||
m88k-omron*)
|
|
||||||
basic_machine=m88k-omron
|
|
||||||
;;
|
|
||||||
magnum | m3230)
|
magnum | m3230)
|
||||||
basic_machine=mips-mips
|
basic_machine=mips-mips
|
||||||
os=-sysv
|
os=-sysv
|
||||||
|
@ -816,10 +831,10 @@ case $basic_machine in
|
||||||
os=-mint
|
os=-mint
|
||||||
;;
|
;;
|
||||||
mips3*-*)
|
mips3*-*)
|
||||||
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
|
basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`
|
||||||
;;
|
;;
|
||||||
mips3*)
|
mips3*)
|
||||||
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
|
basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown
|
||||||
;;
|
;;
|
||||||
monitor)
|
monitor)
|
||||||
basic_machine=m68k-rom68k
|
basic_machine=m68k-rom68k
|
||||||
|
@ -838,7 +853,7 @@ case $basic_machine in
|
||||||
os=-msdos
|
os=-msdos
|
||||||
;;
|
;;
|
||||||
ms1-*)
|
ms1-*)
|
||||||
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'`
|
||||||
;;
|
;;
|
||||||
msys)
|
msys)
|
||||||
basic_machine=i686-pc
|
basic_machine=i686-pc
|
||||||
|
@ -880,7 +895,7 @@ case $basic_machine in
|
||||||
basic_machine=v70-nec
|
basic_machine=v70-nec
|
||||||
os=-sysv
|
os=-sysv
|
||||||
;;
|
;;
|
||||||
next | m*-next )
|
next | m*-next)
|
||||||
basic_machine=m68k-next
|
basic_machine=m68k-next
|
||||||
case $os in
|
case $os in
|
||||||
-nextstep* )
|
-nextstep* )
|
||||||
|
@ -925,6 +940,12 @@ case $basic_machine in
|
||||||
nsr-tandem)
|
nsr-tandem)
|
||||||
basic_machine=nsr-tandem
|
basic_machine=nsr-tandem
|
||||||
;;
|
;;
|
||||||
|
nsv-tandem)
|
||||||
|
basic_machine=nsv-tandem
|
||||||
|
;;
|
||||||
|
nsx-tandem)
|
||||||
|
basic_machine=nsx-tandem
|
||||||
|
;;
|
||||||
op50n-* | op60c-*)
|
op50n-* | op60c-*)
|
||||||
basic_machine=hppa1.1-oki
|
basic_machine=hppa1.1-oki
|
||||||
os=-proelf
|
os=-proelf
|
||||||
|
@ -957,7 +978,7 @@ case $basic_machine in
|
||||||
os=-linux
|
os=-linux
|
||||||
;;
|
;;
|
||||||
parisc-*)
|
parisc-*)
|
||||||
basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
os=-linux
|
os=-linux
|
||||||
;;
|
;;
|
||||||
pbd)
|
pbd)
|
||||||
|
@ -973,7 +994,7 @@ case $basic_machine in
|
||||||
basic_machine=i386-pc
|
basic_machine=i386-pc
|
||||||
;;
|
;;
|
||||||
pc98-*)
|
pc98-*)
|
||||||
basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
pentium | p5 | k5 | k6 | nexgen | viac3)
|
pentium | p5 | k5 | k6 | nexgen | viac3)
|
||||||
basic_machine=i586-pc
|
basic_machine=i586-pc
|
||||||
|
@ -988,16 +1009,16 @@ case $basic_machine in
|
||||||
basic_machine=i786-pc
|
basic_machine=i786-pc
|
||||||
;;
|
;;
|
||||||
pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
|
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-*)
|
pentiumpro-* | p6-* | 6x86-* | athlon-*)
|
||||||
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
|
pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
|
||||||
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
pentium4-*)
|
pentium4-*)
|
||||||
basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
pn)
|
pn)
|
||||||
basic_machine=pn-gould
|
basic_machine=pn-gould
|
||||||
|
@ -1007,23 +1028,23 @@ case $basic_machine in
|
||||||
ppc | ppcbe) basic_machine=powerpc-unknown
|
ppc | ppcbe) basic_machine=powerpc-unknown
|
||||||
;;
|
;;
|
||||||
ppc-* | ppcbe-*)
|
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
|
basic_machine=powerpcle-unknown
|
||||||
;;
|
;;
|
||||||
ppcle-* | powerpclittle-*)
|
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-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
|
basic_machine=powerpc64le-unknown
|
||||||
;;
|
;;
|
||||||
ppc64le-* | powerpc64little-*)
|
ppc64le-* | powerpc64little-*)
|
||||||
basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
ps2)
|
ps2)
|
||||||
basic_machine=i386-ibm
|
basic_machine=i386-ibm
|
||||||
|
@ -1077,17 +1098,10 @@ case $basic_machine in
|
||||||
sequent)
|
sequent)
|
||||||
basic_machine=i386-sequent
|
basic_machine=i386-sequent
|
||||||
;;
|
;;
|
||||||
sh)
|
|
||||||
basic_machine=sh-hitachi
|
|
||||||
os=-hms
|
|
||||||
;;
|
|
||||||
sh5el)
|
sh5el)
|
||||||
basic_machine=sh5le-unknown
|
basic_machine=sh5le-unknown
|
||||||
;;
|
;;
|
||||||
sh64)
|
simso-wrs)
|
||||||
basic_machine=sh64-unknown
|
|
||||||
;;
|
|
||||||
sparclite-wrs | simso-wrs)
|
|
||||||
basic_machine=sparclite-wrs
|
basic_machine=sparclite-wrs
|
||||||
os=-vxworks
|
os=-vxworks
|
||||||
;;
|
;;
|
||||||
|
@ -1106,7 +1120,7 @@ case $basic_machine in
|
||||||
os=-sysv4
|
os=-sysv4
|
||||||
;;
|
;;
|
||||||
strongarm-* | thumb-*)
|
strongarm-* | thumb-*)
|
||||||
basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`
|
||||||
;;
|
;;
|
||||||
sun2)
|
sun2)
|
||||||
basic_machine=m68000-sun
|
basic_machine=m68000-sun
|
||||||
|
@ -1228,6 +1242,9 @@ case $basic_machine in
|
||||||
basic_machine=hppa1.1-winbond
|
basic_machine=hppa1.1-winbond
|
||||||
os=-proelf
|
os=-proelf
|
||||||
;;
|
;;
|
||||||
|
x64)
|
||||||
|
basic_machine=x86_64-pc
|
||||||
|
;;
|
||||||
xbox)
|
xbox)
|
||||||
basic_machine=i686-pc
|
basic_machine=i686-pc
|
||||||
os=-mingw32
|
os=-mingw32
|
||||||
|
@ -1236,20 +1253,12 @@ case $basic_machine in
|
||||||
basic_machine=xps100-honeywell
|
basic_machine=xps100-honeywell
|
||||||
;;
|
;;
|
||||||
xscale-* | xscalee[bl]-*)
|
xscale-* | xscalee[bl]-*)
|
||||||
basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
|
basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`
|
||||||
;;
|
;;
|
||||||
ymp)
|
ymp)
|
||||||
basic_machine=ymp-cray
|
basic_machine=ymp-cray
|
||||||
os=-unicos
|
os=-unicos
|
||||||
;;
|
;;
|
||||||
z8k-*-coff)
|
|
||||||
basic_machine=z8k-unknown
|
|
||||||
os=-sim
|
|
||||||
;;
|
|
||||||
z80-*-coff)
|
|
||||||
basic_machine=z80-unknown
|
|
||||||
os=-sim
|
|
||||||
;;
|
|
||||||
none)
|
none)
|
||||||
basic_machine=none-none
|
basic_machine=none-none
|
||||||
os=-none
|
os=-none
|
||||||
|
@ -1278,10 +1287,6 @@ case $basic_machine in
|
||||||
vax)
|
vax)
|
||||||
basic_machine=vax-dec
|
basic_machine=vax-dec
|
||||||
;;
|
;;
|
||||||
pdp10)
|
|
||||||
# there are many clones, so DEC is not a safe bet
|
|
||||||
basic_machine=pdp10-unknown
|
|
||||||
;;
|
|
||||||
pdp11)
|
pdp11)
|
||||||
basic_machine=pdp11-dec
|
basic_machine=pdp11-dec
|
||||||
;;
|
;;
|
||||||
|
@ -1291,9 +1296,6 @@ case $basic_machine in
|
||||||
sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
|
sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||||
basic_machine=sh-unknown
|
basic_machine=sh-unknown
|
||||||
;;
|
;;
|
||||||
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
|
|
||||||
basic_machine=sparc-sun
|
|
||||||
;;
|
|
||||||
cydra)
|
cydra)
|
||||||
basic_machine=cydra-cydrome
|
basic_machine=cydra-cydrome
|
||||||
;;
|
;;
|
||||||
|
@ -1313,7 +1315,7 @@ case $basic_machine in
|
||||||
# Make sure to match an already-canonicalized machine name.
|
# 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
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
@ -1321,10 +1323,10 @@ esac
|
||||||
# Here we canonicalize certain aliases for manufacturers.
|
# Here we canonicalize certain aliases for manufacturers.
|
||||||
case $basic_machine in
|
case $basic_machine in
|
||||||
*-digital*)
|
*-digital*)
|
||||||
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
|
basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`
|
||||||
;;
|
;;
|
||||||
*-commodore*)
|
*-commodore*)
|
||||||
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
|
basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
;;
|
;;
|
||||||
|
@ -1335,8 +1337,8 @@ esac
|
||||||
if [ x"$os" != x"" ]
|
if [ x"$os" != x"" ]
|
||||||
then
|
then
|
||||||
case $os in
|
case $os in
|
||||||
# First match some system type aliases
|
# First match some system type aliases that might get confused
|
||||||
# that might get confused with valid system types.
|
# with valid system types.
|
||||||
# -solaris* is a basic system type, with this one exception.
|
# -solaris* is a basic system type, with this one exception.
|
||||||
-auroraux)
|
-auroraux)
|
||||||
os=-auroraux
|
os=-auroraux
|
||||||
|
@ -1347,45 +1349,48 @@ case $os in
|
||||||
-solaris)
|
-solaris)
|
||||||
os=-solaris2
|
os=-solaris2
|
||||||
;;
|
;;
|
||||||
-svr4*)
|
|
||||||
os=-sysv4
|
|
||||||
;;
|
|
||||||
-unixware*)
|
-unixware*)
|
||||||
os=-sysv4.2uw
|
os=-sysv4.2uw
|
||||||
;;
|
;;
|
||||||
-gnu/linux*)
|
-gnu/linux*)
|
||||||
os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
|
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.
|
# 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.
|
# -sysv* is not here because it comes later, after sysvr4.
|
||||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
||||||
| -sym* | -kopensolaris* | -plan9* \
|
| -sym* | -kopensolaris* | -plan9* \
|
||||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||||
| -aos* | -aros* \
|
| -aos* | -aros* | -cloudabi* | -sortix* \
|
||||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||||
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
| -hiux* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||||
| -bitrig* | -openbsd* | -solidbsd* \
|
| -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
|
||||||
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
||||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||||
| -chorusos* | -chorusrdb* | -cegcc* \
|
| -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
|
||||||
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||||
| -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
| -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
||||||
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
||||||
| -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
|
| -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
|
||||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \
|
||||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||||
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
||||||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
| -morphos* | -superux* | -rtmk* | -windiss* \
|
||||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
||||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
|
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
|
||||||
|
| -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \
|
||||||
|
| -midnightbsd*)
|
||||||
# Remember, each alternative MUST END IN *, to match a version number.
|
# Remember, each alternative MUST END IN *, to match a version number.
|
||||||
;;
|
;;
|
||||||
-qnx*)
|
-qnx*)
|
||||||
|
@ -1402,12 +1407,12 @@ case $os in
|
||||||
-nto*)
|
-nto*)
|
||||||
os=`echo $os | sed -e 's|nto|nto-qnx|'`
|
os=`echo $os | sed -e 's|nto|nto-qnx|'`
|
||||||
;;
|
;;
|
||||||
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
|
-sim | -xray | -os68k* | -v88r* \
|
||||||
| -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
|
| -windows* | -osx | -abug | -netware* | -os9* \
|
||||||
| -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
|
| -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
|
||||||
;;
|
;;
|
||||||
-mac*)
|
-mac*)
|
||||||
os=`echo $os | sed -e 's|mac|macos|'`
|
os=`echo "$os" | sed -e 's|mac|macos|'`
|
||||||
;;
|
;;
|
||||||
-linux-dietlibc)
|
-linux-dietlibc)
|
||||||
os=-linux-dietlibc
|
os=-linux-dietlibc
|
||||||
|
@ -1416,10 +1421,10 @@ case $os in
|
||||||
os=`echo $os | sed -e 's|linux|linux-gnu|'`
|
os=`echo $os | sed -e 's|linux|linux-gnu|'`
|
||||||
;;
|
;;
|
||||||
-sunos5*)
|
-sunos5*)
|
||||||
os=`echo $os | sed -e 's|sunos5|solaris2|'`
|
os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
|
||||||
;;
|
;;
|
||||||
-sunos6*)
|
-sunos6*)
|
||||||
os=`echo $os | sed -e 's|sunos6|solaris3|'`
|
os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
|
||||||
;;
|
;;
|
||||||
-opened*)
|
-opened*)
|
||||||
os=-openedition
|
os=-openedition
|
||||||
|
@ -1430,12 +1435,6 @@ case $os in
|
||||||
-wince*)
|
-wince*)
|
||||||
os=-wince
|
os=-wince
|
||||||
;;
|
;;
|
||||||
-osfrose*)
|
|
||||||
os=-osfrose
|
|
||||||
;;
|
|
||||||
-osf*)
|
|
||||||
os=-osf
|
|
||||||
;;
|
|
||||||
-utek*)
|
-utek*)
|
||||||
os=-bsd
|
os=-bsd
|
||||||
;;
|
;;
|
||||||
|
@ -1460,7 +1459,7 @@ case $os in
|
||||||
-nova*)
|
-nova*)
|
||||||
os=-rtmk-nova
|
os=-rtmk-nova
|
||||||
;;
|
;;
|
||||||
-ns2 )
|
-ns2)
|
||||||
os=-nextstep2
|
os=-nextstep2
|
||||||
;;
|
;;
|
||||||
-nsk*)
|
-nsk*)
|
||||||
|
@ -1482,7 +1481,7 @@ case $os in
|
||||||
-oss*)
|
-oss*)
|
||||||
os=-sysv3
|
os=-sysv3
|
||||||
;;
|
;;
|
||||||
-svr4)
|
-svr4*)
|
||||||
os=-sysv4
|
os=-sysv4
|
||||||
;;
|
;;
|
||||||
-svr3)
|
-svr3)
|
||||||
|
@ -1497,32 +1496,38 @@ case $os in
|
||||||
-ose*)
|
-ose*)
|
||||||
os=-ose
|
os=-ose
|
||||||
;;
|
;;
|
||||||
-es1800*)
|
|
||||||
os=-ose
|
|
||||||
;;
|
|
||||||
-xenix)
|
|
||||||
os=-xenix
|
|
||||||
;;
|
|
||||||
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
|
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
|
||||||
os=-mint
|
os=-mint
|
||||||
;;
|
;;
|
||||||
-aros*)
|
|
||||||
os=-aros
|
|
||||||
;;
|
|
||||||
-zvmoe)
|
-zvmoe)
|
||||||
os=-zvmoe
|
os=-zvmoe
|
||||||
;;
|
;;
|
||||||
-dicos*)
|
-dicos*)
|
||||||
os=-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*)
|
-nacl*)
|
||||||
;;
|
;;
|
||||||
|
-ios)
|
||||||
|
;;
|
||||||
-none)
|
-none)
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
# Get rid of the `-' at the beginning of $os.
|
# Get rid of the `-' at the beginning of $os.
|
||||||
os=`echo $os | sed 's/[^-]*-//'`
|
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
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
@ -1612,12 +1617,12 @@ case $basic_machine in
|
||||||
sparc-* | *-sun)
|
sparc-* | *-sun)
|
||||||
os=-sunos4.1.1
|
os=-sunos4.1.1
|
||||||
;;
|
;;
|
||||||
|
pru-*)
|
||||||
|
os=-elf
|
||||||
|
;;
|
||||||
*-be)
|
*-be)
|
||||||
os=-beos
|
os=-beos
|
||||||
;;
|
;;
|
||||||
*-haiku)
|
|
||||||
os=-haiku
|
|
||||||
;;
|
|
||||||
*-ibm)
|
*-ibm)
|
||||||
os=-aix
|
os=-aix
|
||||||
;;
|
;;
|
||||||
|
@ -1657,7 +1662,7 @@ case $basic_machine in
|
||||||
m88k-omron*)
|
m88k-omron*)
|
||||||
os=-luna
|
os=-luna
|
||||||
;;
|
;;
|
||||||
*-next )
|
*-next)
|
||||||
os=-nextstep
|
os=-nextstep
|
||||||
;;
|
;;
|
||||||
*-sequent)
|
*-sequent)
|
||||||
|
@ -1672,9 +1677,6 @@ case $basic_machine in
|
||||||
i370-*)
|
i370-*)
|
||||||
os=-mvs
|
os=-mvs
|
||||||
;;
|
;;
|
||||||
*-next)
|
|
||||||
os=-nextstep3
|
|
||||||
;;
|
|
||||||
*-gould)
|
*-gould)
|
||||||
os=-sysv
|
os=-sysv
|
||||||
;;
|
;;
|
||||||
|
@ -1784,15 +1786,15 @@ case $basic_machine in
|
||||||
vendor=stratus
|
vendor=stratus
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
|
basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"`
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
echo $basic_machine$os
|
echo "$basic_machine$os"
|
||||||
exit
|
exit
|
||||||
|
|
||||||
# Local variables:
|
# Local variables:
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
# eval: (add-hook 'write-file-functions 'time-stamp)
|
||||||
# time-stamp-start: "timestamp='"
|
# time-stamp-start: "timestamp='"
|
||||||
# time-stamp-format: "%:y-%02m-%02d"
|
# time-stamp-format: "%:y-%02m-%02d"
|
||||||
# time-stamp-end: "'"
|
# time-stamp-end: "'"
|
||||||
|
|
2195
configure.ac
2195
configure.ac
File diff suppressed because it is too large
Load diff
|
@ -5,3 +5,16 @@ SUBDIRS = html
|
||||||
dist_data_DATA = cmdvartab
|
dist_data_DATA = cmdvartab
|
||||||
nodist_data_DATA = driver.list
|
nodist_data_DATA = driver.list
|
||||||
EXTRA_DIST = evolution500.seq epdu-managed.dev
|
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
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -17,7 +17,17 @@
|
||||||
# Network UPS Tools: data
|
# Network UPS Tools: data
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
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 = \
|
am__make_running_with_option = \
|
||||||
case $${target_option-} in \
|
case $${target_option-} in \
|
||||||
?) ;; \
|
?) ;; \
|
||||||
|
@ -82,19 +92,24 @@ build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
target_triplet = @target@
|
target_triplet = @target@
|
||||||
subdir = data
|
subdir = data
|
||||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
|
||||||
$(srcdir)/driver.list.in $(dist_data_DATA)
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
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/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_asciidoc.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_libavahi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libltdl.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_libneon.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||||
|
@ -103,11 +118,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_os.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_report_feature.m4 \
|
||||||
|
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||||
$(top_srcdir)/configure.ac
|
$(top_srcdir)/configure.ac
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(dist_data_DATA) \
|
||||||
|
$(am__DIST_COMMON)
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||||
CONFIG_CLEAN_FILES = driver.list
|
CONFIG_CLEAN_FILES = driver.list
|
||||||
|
@ -175,7 +197,7 @@ am__recursive_targets = \
|
||||||
$(RECURSIVE_CLEAN_TARGETS) \
|
$(RECURSIVE_CLEAN_TARGETS) \
|
||||||
$(am__extra_recursive_targets)
|
$(am__extra_recursive_targets)
|
||||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||||
distdir
|
distdir distdir-am
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
# Read a list of newline-separated strings from the standard input,
|
# Read a list of newline-separated strings from the standard input,
|
||||||
# and print each of them once, without duplicates. Input order is
|
# and print each of them once, without duplicates. Input order is
|
||||||
|
@ -196,6 +218,7 @@ am__define_uniq_tagged_files = \
|
||||||
ETAGS = etags
|
ETAGS = etags
|
||||||
CTAGS = ctags
|
CTAGS = ctags
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
|
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/driver.list.in
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
am__relativize = \
|
am__relativize = \
|
||||||
dir0=`pwd`; \
|
dir0=`pwd`; \
|
||||||
|
@ -229,6 +252,7 @@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
ASCIIDOC = @ASCIIDOC@
|
ASCIIDOC = @ASCIIDOC@
|
||||||
ASPELL = @ASPELL@
|
ASPELL = @ASPELL@
|
||||||
|
AUGPARSE = @AUGPARSE@
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -239,6 +263,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CONFPATH = @CONFPATH@
|
CONFPATH = @CONFPATH@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
|
CPPCHECK = @CPPCHECK@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||||
|
@ -252,6 +277,7 @@ DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
DLLTOOL = @DLLTOOL@
|
DLLTOOL = @DLLTOOL@
|
||||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||||
|
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||||
|
@ -264,6 +290,7 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
@ -281,6 +308,8 @@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||||
|
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||||
|
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||||
|
@ -291,21 +320,29 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||||
|
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||||
|
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
LN_S = @LN_S@
|
LN_S = @LN_S@
|
||||||
|
LN_S_R = @LN_S_R@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
NETLIBS = @NETLIBS@
|
NETLIBS = @NETLIBS@
|
||||||
|
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||||
NM = @NM@
|
NM = @NM@
|
||||||
NMEDIT = @NMEDIT@
|
NMEDIT = @NMEDIT@
|
||||||
|
NUT_DATADIR = @NUT_DATADIR@
|
||||||
|
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||||
NUT_NETVERSION = @NUT_NETVERSION@
|
NUT_NETVERSION = @NUT_NETVERSION@
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -325,6 +362,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
||||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
PORT = @PORT@
|
PORT = @PORT@
|
||||||
|
PYTHON = @PYTHON@
|
||||||
|
PYTHON2 = @PYTHON2@
|
||||||
|
PYTHON3 = @PYTHON3@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||||
RUN_AS_USER = @RUN_AS_USER@
|
RUN_AS_USER = @RUN_AS_USER@
|
||||||
|
@ -338,6 +378,7 @@ STATEPATH = @STATEPATH@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
SUN_LIBUSB = @SUN_LIBUSB@
|
SUN_LIBUSB = @SUN_LIBUSB@
|
||||||
TREE_VERSION = @TREE_VERSION@
|
TREE_VERSION = @TREE_VERSION@
|
||||||
|
VALGRIND = @VALGRIND@
|
||||||
VERSION = @VERSION@
|
VERSION = @VERSION@
|
||||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||||
XMLLINT = @XMLLINT@
|
XMLLINT = @XMLLINT@
|
||||||
|
@ -355,6 +396,7 @@ am__leading_dot = @am__leading_dot@
|
||||||
am__quote = @am__quote@
|
am__quote = @am__quote@
|
||||||
am__tar = @am__tar@
|
am__tar = @am__tar@
|
||||||
am__untar = @am__untar@
|
am__untar = @am__untar@
|
||||||
|
auglensdir = @auglensdir@
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
build = @build@
|
build = @build@
|
||||||
build_alias = @build_alias@
|
build_alias = @build_alias@
|
||||||
|
@ -368,6 +410,9 @@ datarootdir = @datarootdir@
|
||||||
devddir = @devddir@
|
devddir = @devddir@
|
||||||
docdir = @docdir@
|
docdir = @docdir@
|
||||||
driverexecdir = @driverexecdir@
|
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@
|
dvidir = @dvidir@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
host = @host@
|
host = @host@
|
||||||
|
@ -393,12 +438,14 @@ pkgconfigdir = @pkgconfigdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
systemdshutdowndir = @systemdshutdowndir@
|
||||||
systemdsystemunitdir = @systemdsystemunitdir@
|
systemdsystemunitdir = @systemdsystemunitdir@
|
||||||
|
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||||
target = @target@
|
target = @target@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
target_cpu = @target_cpu@
|
target_cpu = @target_cpu@
|
||||||
|
@ -412,6 +459,8 @@ SUBDIRS = html
|
||||||
dist_data_DATA = cmdvartab
|
dist_data_DATA = cmdvartab
|
||||||
nodist_data_DATA = driver.list
|
nodist_data_DATA = driver.list
|
||||||
EXTRA_DIST = evolution500.seq epdu-managed.dev
|
EXTRA_DIST = evolution500.seq epdu-managed.dev
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||||
|
CLEANFILES = *.pdf *.html *-spellchecked
|
||||||
all: all-recursive
|
all: all-recursive
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
@ -427,14 +476,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu data/Makefile
|
$(AUTOMAKE) --gnu data/Makefile
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' 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__depfiles_maybe);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
@ -595,7 +643,10 @@ cscopelist-am: $(am__tagged_files)
|
||||||
distclean-tags:
|
distclean-tags:
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH 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'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
list='$(DISTFILES)'; \
|
list='$(DISTFILES)'; \
|
||||||
|
@ -680,6 +731,7 @@ install-strip:
|
||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
distclean-generic:
|
distclean-generic:
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
@ -688,6 +740,7 @@ distclean-generic:
|
||||||
maintainer-clean-generic:
|
maintainer-clean-generic:
|
||||||
@echo "This command is intended for maintainers to use"
|
@echo "This command is intended for maintainers to use"
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
clean: clean-recursive
|
clean: clean-recursive
|
||||||
|
|
||||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||||
|
@ -771,6 +824,18 @@ uninstall-am: uninstall-dist_dataDATA uninstall-nodist_dataDATA
|
||||||
ps ps-am tags tags-am uninstall uninstall-am \
|
ps ps-am tags tags-am uninstall uninstall-am \
|
||||||
uninstall-dist_dataDATA uninstall-nodist_dataDATA
|
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.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
|
|
@ -84,7 +84,7 @@ 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.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.power "Current sum value of all (ePDU) phases apparent power (VA)"
|
||||||
VARDESC input.source "The current input power source"
|
VARDESC input.source "The current input power source"
|
||||||
VARDESC input.source.preferred "The prefered input power source"
|
VARDESC input.source.preferred "The preferred input power source"
|
||||||
|
|
||||||
VARDESC output.voltage "Output voltage (V)"
|
VARDESC output.voltage "Output voltage (V)"
|
||||||
VARDESC output.voltage.nominal "Nominal output voltage (V)"
|
VARDESC output.voltage.nominal "Nominal output voltage (V)"
|
||||||
|
@ -94,6 +94,7 @@ VARDESC output.current "Output current (A)"
|
||||||
VARDESC output.current.nominal "Nominal output current (A)"
|
VARDESC output.current.nominal "Nominal output current (A)"
|
||||||
|
|
||||||
VARDESC battery.charge "Battery charge (percent of full)"
|
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.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.restart "Minimum battery level for restart after power off (percent)"
|
||||||
VARDESC battery.charge.warning "Battery level when UPS switches to Warning state (percent)"
|
VARDESC battery.charge.warning "Battery level when UPS switches to Warning state (percent)"
|
||||||
|
@ -145,7 +146,7 @@ VARDESC ambient.present "Ambient sensor presence"
|
||||||
VARDESC ambient.contacts.1.status "State of the dry contact sensor 1"
|
VARDESC ambient.contacts.1.status "State of the dry contact sensor 1"
|
||||||
VARDESC ambient.contacts.2.status "State of the dry contact sensor 2"
|
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>)"
|
# VARDESC outlet.[[:digit:]]+.id "Outlet system identifier (<index>)"
|
||||||
|
|
||||||
|
@ -177,6 +178,7 @@ VARDESC outlet.2.delay.start "Interval to wait before restarting this outlet (se
|
||||||
VARDESC driver.name "Driver name"
|
VARDESC driver.name "Driver name"
|
||||||
VARDESC driver.version "Driver version - NUT release"
|
VARDESC driver.version "Driver version - NUT release"
|
||||||
VARDESC driver.version.internal "Internal driver version"
|
VARDESC driver.version.internal "Internal driver version"
|
||||||
|
VARDESC driver.version.usb "USB library version"
|
||||||
|
|
||||||
VARDESC device.part "Device Part Number"
|
VARDESC device.part "Device Part Number"
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
# ========
|
# ========
|
||||||
# - device type:
|
# - device type:
|
||||||
# "ups" for Uninterruptible Power Supply
|
# "ups" for Uninterruptible Power Supply
|
||||||
# "pdu" for Power Distributions Unit
|
# "pdu" for Power Distribution Unit
|
||||||
# "scd" for Solar Controlers Device
|
# "scd" for Solar Controller Device
|
||||||
# "ats" for Automatic Transfer Switch
|
# "ats" for Automatic Transfer Switch
|
||||||
#
|
#
|
||||||
# - support level: a number from "1" to "5" (stars) meaning:
|
# - support level: a number from "1" to "5" (stars) meaning:
|
||||||
|
@ -35,15 +35,25 @@
|
||||||
# Duplicate text in the last field will be cooked out during the conversion
|
# 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.
|
# 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" "625L" "USB" "blazer_usb"
|
||||||
"Ablerex" "ups" "2" "Hope Office 400/600" "" "blazer_ser"
|
"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" "400VA" "" "blazer_ser"
|
||||||
"ActivePower" "ups" "2" "1400VA" "" "blazer_ser"
|
"ActivePower" "ups" "2" "1400VA" "" "blazer_ser"
|
||||||
"ActivePower" "ups" "2" "2000VA" "" "blazer_ser"
|
"ActivePower" "ups" "2" "2000VA" "" "blazer_ser"
|
||||||
|
|
||||||
"Advice" "ups" "2" "TopGuard 2000" "" "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"
|
"AEC" "ups" "1" "MiniGuard UPS 700" "Megatec M2501 cable" "genericups upstype=21"
|
||||||
|
|
||||||
|
@ -51,6 +61,7 @@
|
||||||
"AEG Power Solutions" "ups" "3" "PROTECT NAS" "" "usbhid-ups"
|
"AEG Power Solutions" "ups" "3" "PROTECT NAS" "" "usbhid-ups"
|
||||||
"AEG Power Solutions" "ups" "3" "PROTECT B" "" "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 1200BR (Microsol)" "" "solis"
|
||||||
"APC" "ups" "2" "Back-UPS BZ2200BI-BR (Microsol)" "" "solis"
|
"APC" "ups" "2" "Back-UPS BZ2200BI-BR (Microsol)" "" "solis"
|
||||||
"APC" "ups" "1" "Back-UPS Pro" "" "apcsmart"
|
"APC" "ups" "1" "Back-UPS Pro" "" "apcsmart"
|
||||||
|
@ -58,13 +69,16 @@
|
||||||
"APC" "ups" "1" "Smart-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" "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 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 RS USB" "USB" "usbhid-ups"
|
||||||
"APC" "ups" "2" "Back-UPS LS 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 ES/CyberFort 350" "USB" "usbhid-ups"
|
||||||
"APC" "ups" "2" "Back-UPS BF500" "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" "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-0095A/C cables" "genericups upstype=1"
|
||||||
"APC" "ups" "1" "Back-UPS" "940-0020B/C cables" "genericups upstype=2"
|
"APC" "ups" "1" "Back-UPS" "940-0020B/C cables" "genericups upstype=2"
|
||||||
"APC" "ups" "1" "Back-UPS" "940-0023A cable" "genericups upstype=9"
|
"APC" "ups" "1" "Back-UPS" "940-0023A cable" "genericups upstype=9"
|
||||||
|
@ -77,7 +91,7 @@
|
||||||
"APC" "pdu" "1" "Masterswitch" "940-0020 cable" "genericups upstype=12"
|
"APC" "pdu" "1" "Masterswitch" "940-0020 cable" "genericups upstype=12"
|
||||||
"APC" "pdu" "1" "AP9210" "8 outlets" "powerman-pdu (experimental)"
|
"APC" "pdu" "1" "AP9210" "8 outlets" "powerman-pdu (experimental)"
|
||||||
"APC" "pdu" "1" "AP79xx" "8 to 24 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)"
|
"APC" "ats" "3" "ATS AP7724" "" "snmp-ups (experimental)"
|
||||||
|
|
||||||
"Aphel" "pdu" "3" "various PDU" "" "snmp-ups (experimental)"
|
"Aphel" "pdu" "3" "various PDU" "" "snmp-ups (experimental)"
|
||||||
|
@ -88,6 +102,8 @@
|
||||||
|
|
||||||
"Appro" "pdu" "1" "SWPDU" "48 outlets" "powerman-pdu (experimental)"
|
"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 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 Millenium 3.1 10/15/20 kVA" "Serial" "blazer_ser"
|
||||||
"ARTronic" "ups" "2" "ARTon Titanium 6/10 kVA" "Serial" "blazer_ser"
|
"ARTronic" "ups" "2" "ARTon Titanium 6/10 kVA" "Serial" "blazer_ser"
|
||||||
|
@ -98,6 +114,8 @@
|
||||||
"ARTronic" "ups" "2" "ARTon Platinium Combo 3.1 10/15/20 kVA" "USB" "blazer_usb"
|
"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"
|
"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"
|
"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
|
"Asium" "ups" "3" "P700" "USB" "blazer_usb" # http://www.asiumpower.com/Asium-ASIUM-P700-650VA-360W/dp/B009SMEQ10
|
||||||
|
@ -118,6 +136,7 @@
|
||||||
"Atlantis Land" "ups" "2" "(various)" "USB" "nutdrv_qx"
|
"Atlantis Land" "ups" "2" "(various)" "USB" "nutdrv_qx"
|
||||||
|
|
||||||
"Aviem Systems" "ups" "2" "Aviem Power RT 1000-3000VA" "" "blazer_ser"
|
"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" "8 outlets" "powerman-pdu (experimental)"
|
||||||
"Baytech" "pdu" "1" "RPC3-20NC" "8 outlets" "powerman-pdu (experimental)"
|
"Baytech" "pdu" "1" "RPC3-20NC" "8 outlets" "powerman-pdu (experimental)"
|
||||||
|
@ -185,45 +204,63 @@
|
||||||
"COVER ENERGY SA" "ups" "2" "COVER PRM 1K/2K/3K/6K/10K EC" "" "blazer_usb"
|
"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"
|
"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" "CPS320AVR" "" "powerpanel"
|
||||||
"Cyber Power Systems" "ups" "1" "CPS500AVR" "" "powerpanel"
|
"Cyber Power Systems" "ups" "1" "CPS500AVR" "" "powerpanel"
|
||||||
"Cyber Power Systems" "ups" "1" "CPS650AVR" "" "powerpanel"
|
"Cyber Power Systems" "ups" "1" "CPS650AVR" "" "powerpanel"
|
||||||
"Cyber Power Systems" "ups" "1" "CPS700AVR" "" "powerpanel"
|
"Cyber Power Systems" "ups" "1" "CPS700AVR" "" "powerpanel"
|
||||||
"Cyber Power Systems" "ups" "1" "CPS800AVR" "" "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" "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" "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" "1" "PR2200" "" "powerpanel"
|
||||||
"Cyber Power Systems" "ups" "2" "PR3000E" "" "powerpanel"
|
"Cyber Power Systems" "ups" "1" "Power99" "" "genericups upstype=7"
|
||||||
"Cyber Power Systems" "ups" "2" "OL3000RMXL2U" "" "powerpanel"
|
"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" "CPS685AVR" "USB" "usbhid-ups"
|
||||||
"Cyber Power Systems" "ups" "2" "CPS800AVR" "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" "2" "OL3000RMXL2U" "" "powerpanel"
|
||||||
"Cyber Power Systems" "ups" "3" "CP 1500C" "USB" "usbhid-ups"
|
"Cyber Power Systems" "ups" "2" "PR3000E" "" "powerpanel"
|
||||||
"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" "2" "Value 1500ELCD-RU" "USB" "usbhid-ups"
|
||||||
"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" "Value 400E" "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 600E" "USB" "usbhid-ups"
|
||||||
"Cyber Power Systems" "ups" "2" "Value 800E" "USB" "usbhid-ups"
|
"Cyber Power Systems" "ups" "2" "Value 800E" "USB" "usbhid-ups"
|
||||||
"Cyber Power Systems" "ups" "2" "Value 1500ELCD-RU" "USB" "usbhid-ups"
|
"Cyber Power Systems" "ups" "3" "CP 1500C" "USB" "usbhid-ups"
|
||||||
"Cyber Power Systems" "ups" "2" "CP900AVR" "USB" "usbhid-ups"
|
"Cyber Power Systems" "ups" "3" "CP1000PFCLCD" "USB" "usbhid-ups"
|
||||||
"Cyber Power Systems" "ups" "2" "CP1000AVRLCD" "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" "2" "CP1350AVRLCD" "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" "2" "CP1500AVRLCD" "USB" "usbhid-ups"
|
"Cyber Power Systems" "ups" "3" "EC350G" "USB" "usbhid-ups" # https://www.cyberpowersystems.com/products/ups/ecologic/ec350g
|
||||||
"Cyber Power Systems" "ups" "2" "CP1000PFCLCD" "USB" "usbhid-ups"
|
"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" "RMCARD100" "" "snmp-ups"
|
||||||
"Cyber Power Systems" "ups" "3" "RMCARD201" "" "snmp-ups"
|
"Cyber Power Systems" "ups" "3" "RMCARD201" "" "snmp-ups"
|
||||||
"Cyber Power Systems" "ups" "3" "RMCARD202" "" "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"
|
"Cyber Power Systems" "ups" "3" "RMCARD301" "" "snmp-ups"
|
||||||
|
|
||||||
"Cyclades" "pdu" "1" "PM8" "8 outlets" "powerman-pdu (experimental)"
|
"Cyclades" "pdu" "1" "PM8" "8 outlets" "powerman-pdu (experimental)"
|
||||||
|
@ -253,14 +290,24 @@
|
||||||
"Dell" "ups" "5" "Various (XML/HTTP mode)" "UPS Network Management Card" "netxml-ups (experimental)"
|
"Dell" "ups" "5" "Various (XML/HTTP mode)" "UPS Network Management Card" "netxml-ups (experimental)"
|
||||||
|
|
||||||
"Delta" "ups" "1" "GES602N" "" "belkin"
|
"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" "1" "PowerRite Pro II" "" "genericups upstype=15"
|
||||||
"Deltec" "ups" "4" "PRM 450/700/1000/1500" "" "upscode2"
|
"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)"
|
"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" "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-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" "UPS1700D" "" "blazer_ser"
|
||||||
"Dynamix" "ups" "2" "UPS-650VA" "" "blazer_ser"
|
"Dynamix" "ups" "2" "UPS-650VA" "" "blazer_ser"
|
||||||
|
@ -274,6 +321,7 @@
|
||||||
"Eaton" "ups" "5" "Ellipse ECO 650/800/1200/1600 VA" "USB" "usbhid-ups"
|
"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 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 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 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" "Evolution S 1250/1750/2500/3000 VA" "USB port" "usbhid-ups"
|
||||||
"Eaton" "ups" "5" "EX 700/1000/1500 VA" "USB port" "usbhid-ups"
|
"Eaton" "ups" "5" "EX 700/1000/1500 VA" "USB port" "usbhid-ups"
|
||||||
|
@ -284,24 +332,32 @@
|
||||||
"Eaton" "ups" "5" "Nova AVR 625/1250" "USB" "usbhid-ups"
|
"Eaton" "ups" "5" "Nova AVR 625/1250" "USB" "usbhid-ups"
|
||||||
"Eaton" "ups" "5" "5E650iUSB" "USB port" "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" "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" "5S" "USB port" "usbhid-ups"
|
||||||
"Eaton" "ups" "5" "5SC" "USB port" "usbhid-ups"
|
"Eaton" "ups" "5" "5SC" "USB port" "usbhid-ups"
|
||||||
"Eaton" "ups" "5" "5P" "USB port" "usbhid-ups"
|
"Eaton" "ups" "5" "5P" "USB port" "usbhid-ups"
|
||||||
"Eaton" "ups" "5" "9SX" "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" "9PX" "USB port" "usbhid-ups"
|
||||||
"Eaton" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "9PX Split Phase 6/8/10 kVA" "USB port" "usbhid-ups"
|
||||||
"Eaton" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut"
|
||||||
"Eaton" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut"
|
||||||
"Eaton" "ups" "5" "EX 700/1000/1500 VA" "Serial port" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "Serial port" "mge-shut"
|
||||||
"Eaton" "ups" "5" "EX 2200/3000/3000 XL VA" "Serial port" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "Evolution S 1250/1750/2500/3000 VA" "Serial port" "mge-shut"
|
||||||
"Eaton" "ups" "5" "EX 1000 RT2U / 1500 RT2U" "Serial port" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "EX 700/1000/1500 VA" "Serial port" "mge-shut"
|
||||||
"Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "Serial port" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "EX 2200/3000/3000 XL VA" "Serial port" "mge-shut"
|
||||||
"Eaton" "ups" "5" "5 PX" "Serial port" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "EX 1000 RT2U / 1500 RT2U" "Serial port" "mge-shut"
|
||||||
"Eaton" "ups" "5" "EX RT 1:1 7/11 kVA" "" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "Serial port" "mge-shut"
|
||||||
"Eaton" "ups" "5" "EX RT 3:1 5/7/11 kVA" "" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "5 PX" "Serial port" "mge-shut"
|
||||||
"Eaton" "ups" "5" "5SC" "Serial port" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "EX RT 1:1 7/11 kVA" "" "mge-shut"
|
||||||
"Eaton" "ups" "5" "5P" "Serial port" "mge-shut or oldmge-shut"
|
"Eaton" "ups" "5" "EX RT 3:1 5/7/11 kVA" "" "mge-shut"
|
||||||
"Eaton" "ups" "5" "9SX" "Serial port" "mge-shut or oldmge-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 (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" "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 NV UPS 400-2000 VA" "" "blazer_usb"
|
||||||
|
@ -328,14 +384,21 @@
|
||||||
"Eaton" "ups" "5" "ConnectUPS X / BD / E Slot" "Network port" "snmp-ups"
|
"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" "ups" "5" "Management Card Contact" "Config 3 - Cable 66033" "genericups upstype=7"
|
||||||
"Eaton" "ats" "5" "Eaton ATS16" "" "snmp-ups"
|
"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" "MI/MT/MH" "2502 cable" "blazer_ser"
|
||||||
"Effekta" "ups" "2" "RM2000MH" "" "blazer_ser"
|
"Effekta" "ups" "2" "RM2000MH" "" "blazer_ser"
|
||||||
|
|
||||||
"Electrys" "ups" "2" "UPS 2500" "" "nutdrv_qx or 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 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" "WinNT/Upsoft cable" "genericups upstype=7"
|
||||||
"ETA" "ups" "1" "mini+UPS PRO" "UPS Explorer cable" "etapro"
|
"ETA" "ups" "1" "mini+UPS PRO" "UPS Explorer cable" "etapro"
|
||||||
|
|
||||||
|
@ -351,6 +414,7 @@
|
||||||
"EVER" "ups" "2" "DUO II Pro series" "USB port" "blazer_usb"
|
"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 1-3kVA series" "USB port" "blazer_usb"
|
||||||
"EVER" "ups" "2" "POWERLINE RT 6-10kVA 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" "1" "NetUPS SE" "" "genericups upstype=15"
|
||||||
"Exide" "ups" "4" "NetUPS SE 450/700/1000/1500" "" "upscode2"
|
"Exide" "ups" "4" "NetUPS SE 450/700/1000/1500" "" "upscode2"
|
||||||
|
@ -402,6 +466,9 @@
|
||||||
|
|
||||||
"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
|
"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-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-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"
|
"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"
|
||||||
|
@ -409,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" "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"
|
"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" "1" "PowerTrust 2997A" "HP 5061-2575 cable" "apcsmart"
|
||||||
"HP" "ups" "3" "T750 G2" "Serial port" "bcmxcp"
|
"HP" "ups" "3" "T750 G2" "Serial port" "bcmxcp"
|
||||||
"HP" "ups" "3" "T1000 G3" "Serial port" "bcmxcp"
|
"HP" "ups" "3" "T1000 G3" "Serial port" "bcmxcp"
|
||||||
|
@ -417,8 +486,8 @@
|
||||||
"HP" "ups" "4" "R3000 XR" "" "bcmxcp"
|
"HP" "ups" "4" "R3000 XR" "" "bcmxcp"
|
||||||
"HP" "ups" "4" "R5500 XR" "" "bcmxcp"
|
"HP" "ups" "4" "R5500 XR" "" "bcmxcp"
|
||||||
"HP" "ups" "3" "T500 / T750" "older models, USB port" "bcmxcp_usb"
|
"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" "R/T3000" "Serial port" "mge-shut"
|
||||||
"HP" "ups" "3" "R5000 / R7000" "Serial port" "mge-shut or oldmge-shut"
|
"HP" "ups" "3" "R5000 / R7000" "Serial port" "mge-shut"
|
||||||
"HP" "ups" "3" "T750 INTL" "" "usbhid-ups"
|
"HP" "ups" "3" "T750 INTL" "" "usbhid-ups"
|
||||||
"HP" "ups" "3" "T1000 INTL" "" "usbhid-ups"
|
"HP" "ups" "3" "T1000 INTL" "" "usbhid-ups"
|
||||||
"HP" "ups" "3" "T1500 INTL" "" "usbhid-ups"
|
"HP" "ups" "3" "T1500 INTL" "" "usbhid-ups"
|
||||||
|
@ -432,8 +501,15 @@
|
||||||
"HP" "ups" "4" "Various (SNMP mode)" "HP UPS Management Module" "snmp-ups"
|
"HP" "ups" "4" "Various (SNMP mode)" "HP UPS Management Module" "snmp-ups"
|
||||||
"HP" "pdu" "1" "HP3488 Switch/Control Unit" "" "powerman-pdu (experimental)"
|
"HP" "pdu" "1" "HP3488 Switch/Control Unit" "" "powerman-pdu (experimental)"
|
||||||
|
|
||||||
"Huawei" "ups" "4" "UPS5000-E" "" "snmp-ups"
|
"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)"
|
"IBM" "pdu" "1" "Blade Center Management Module" "15 outlets" "powerman-pdu (experimental)"
|
||||||
|
|
||||||
"ICS" "pdu" "1" "8064 Ethernet Relay Interface" "16 outlets" "powerman-pdu (experimental)"
|
"ICS" "pdu" "1" "8064 Ethernet Relay Interface" "16 outlets" "powerman-pdu (experimental)"
|
||||||
|
@ -461,10 +537,12 @@
|
||||||
|
|
||||||
"IPMI" "pdu" "1" "" "" "powerman-pdu (experimental)"
|
"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" "" "blazer_ser"
|
||||||
"Ippon" "ups" "2" "Back Power Pro 400/500/600/700/800" "USB" "blazer_usb (experimental)"
|
"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" "" "blazer_ser"
|
||||||
"Ippon" "ups" "2" "Back Comfo Pro 600/800" "USB" "blazer_usb (experimental)"
|
"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" "" "blazer_ser"
|
||||||
"Ippon" "ups" "2" "Smart Power Pro 1000/1400/2000" "USB" "blazer_usb (experimental)"
|
"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"
|
"Ippon" "ups" "2" "Smart Winner 750/1000/1500/2000/3000" "" "blazer_ser"
|
||||||
|
@ -482,6 +560,8 @@
|
||||||
"Kanji" "ups" "1" "800 VA" "USB" "nutdrv_atcl_usb"
|
"Kanji" "ups" "1" "800 VA" "USB" "nutdrv_atcl_usb"
|
||||||
|
|
||||||
"Kebo" "ups" "2" "1200D/D Series" "" "blazer_ser"
|
"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 TOWER" "" "blazer_usb"
|
||||||
"KOLFF" "ups" "2" "BLACK NOVA 1K/2K/3K/6K/10K/20K XL TOWER" "" "blazer_usb"
|
"KOLFF" "ups" "2" "BLACK NOVA 1K/2K/3K/6K/10K/20K XL TOWER" "" "blazer_usb"
|
||||||
|
@ -495,7 +575,43 @@
|
||||||
|
|
||||||
"LDLC" "ups" "2" "UPS-1200D" "" "blazer_usb langid_fix=0x4095"
|
"LDLC" "ups" "2" "UPS-1200D" "" "blazer_usb langid_fix=0x4095"
|
||||||
|
|
||||||
"Legrand" "ups" "2" "Keor Multiplug" "" "nutdrv_qx"
|
"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"
|
"Lestar" "ups" "2" "MD-800E" "" "blazer_ser"
|
||||||
|
|
||||||
|
@ -506,6 +622,8 @@
|
||||||
"Liebert" "ups" "1" "GXT2-3000RT230" "" "liebert-esp2 (experimental)"
|
"Liebert" "ups" "1" "GXT2-3000RT230" "" "liebert-esp2 (experimental)"
|
||||||
"Liebert" "ups" "2" "PowerSure Personal XT" "USB" "usbhid-ups"
|
"Liebert" "ups" "2" "PowerSure Personal XT" "USB" "usbhid-ups"
|
||||||
"Liebert" "ups" "2" "PowerSure PSA" "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
|
"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)"
|
"LNXI" "pdu" "1" "Icebox" "10 outlets" "powerman-pdu (experimental)"
|
||||||
|
@ -520,48 +638,50 @@
|
||||||
"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-1000-WTU" "USB" "nutdrv_qx" # http://www.comx-computers.co.za/download/mecer/ME-1000-WTU.pdf
|
||||||
"Mecer" "ups" "2" "ME-2000" "" "blazer_ser"
|
"Mecer" "ups" "2" "ME-2000" "" "blazer_ser"
|
||||||
|
|
||||||
"Meta System" "ups" "1" "HF Line" "1..4 boards" "metasys"
|
"Meta System" "ups" "4" "HF Line" "1..4 boards" "metasys"
|
||||||
"Meta System" "ups" "1" "HF Line \/2" "5..8 boards" "metasys"
|
"Meta System" "ups" "4" "HF Line /2" "5..8 boards" "metasys"
|
||||||
"Meta System" "ups" "1" "HF Millennium 810" "" "metasys"
|
"Meta System" "ups" "4" "HF Millennium 810" "" "metasys"
|
||||||
"Meta System" "ups" "1" "HF Millennium 820" "" "metasys"
|
"Meta System" "ups" "4" "HF Millennium 820" "" "metasys"
|
||||||
"Meta System" "ups" "1" "HF TOP Line 910" "" "metasys"
|
"Meta System" "ups" "4" "HF TOP Line 910" "" "metasys"
|
||||||
"Meta System" "ups" "1" "HF TOP Line 920" "" "metasys"
|
"Meta System" "ups" "4" "HF TOP Line 920" "" "metasys"
|
||||||
"Meta System" "ups" "1" "HF TOP Line 930" "" "metasys"
|
"Meta System" "ups" "4" "HF TOP Line 930" "" "metasys"
|
||||||
"Meta System" "ups" "1" "HF TOP Line 940" "" "metasys"
|
"Meta System" "ups" "4" "HF TOP Line 940" "" "metasys"
|
||||||
"Meta System" "ups" "1" "HF TOP Line 950" "" "metasys"
|
"Meta System" "ups" "4" "HF TOP Line 950" "" "metasys"
|
||||||
"Meta System" "ups" "1" "HF TOP Line 960" "" "metasys"
|
"Meta System" "ups" "4" "HF TOP Line 960" "" "metasys"
|
||||||
"Meta System" "ups" "1" "HF TOP Line 970" "" "metasys"
|
"Meta System" "ups" "4" "HF TOP Line 970" "" "metasys"
|
||||||
"Meta System" "ups" "1" "HF TOP Line 980" "" "metasys"
|
"Meta System" "ups" "4" "HF TOP Line 980" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO Network 750" "" "metasys"
|
"Meta System" "ups" "4" "ECO Network 750" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO Network 1000" "" "metasys"
|
"Meta System" "ups" "4" "ECO Network 1000" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO Network 1050" "" "metasys"
|
"Meta System" "ups" "4" "ECO Network 1050" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO Network 1500" "" "metasys"
|
"Meta System" "ups" "4" "ECO Network 1500" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO Network 1800" "" "metasys"
|
"Meta System" "ups" "4" "ECO Network 1800" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO Network 2000" "" "metasys"
|
"Meta System" "ups" "4" "ECO Network 2000" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO Network 2100" "" "metasys"
|
"Meta System" "ups" "4" "ECO Network 2100" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO Network 2500" "" "metasys"
|
"Meta System" "ups" "4" "ECO Network 2500" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO Network 3000" "" "metasys"
|
"Meta System" "ups" "4" "ECO Network 3000" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO 305" "" "metasys"
|
"Meta System" "ups" "4" "ECO 305" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO 308" "" "metasys"
|
"Meta System" "ups" "4" "ECO 308" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO 311" "" "metasys"
|
"Meta System" "ups" "4" "ECO 311" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO 511" "" "metasys"
|
"Meta System" "ups" "4" "ECO 511" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO 516" "" "metasys"
|
"Meta System" "ups" "4" "ECO 516" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO 519" "" "metasys"
|
"Meta System" "ups" "4" "ECO 519" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ECO 522" "" "metasys"
|
"Meta System" "ups" "4" "ECO 522" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ally HF 800" "" "metasys"
|
"Meta System" "ups" "4" "ally HF 800" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ally HF 1000" "" "metasys"
|
"Meta System" "ups" "4" "ally HF 1000" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ally HF 1250" "" "metasys"
|
"Meta System" "ups" "4" "ally HF 1250" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ally HF 1600" "" "metasys"
|
"Meta System" "ups" "4" "ally HF 1600" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ally HF 2000" "" "metasys"
|
"Meta System" "ups" "4" "ally HF 2000" "" "metasys"
|
||||||
"Meta System" "ups" "1" "ally HF 2500" "" "metasys"
|
"Meta System" "ups" "4" "ally HF 2500" "" "metasys"
|
||||||
"Meta System" "ups" "1" "Megaline 1250" "" "metasys"
|
"Meta System" "ups" "4" "Megaline 1250" "" "metasys"
|
||||||
"Meta System" "ups" "1" "Megaline 2500" "" "metasys"
|
"Meta System" "ups" "4" "Megaline 2500" "" "metasys"
|
||||||
"Meta System" "ups" "1" "Megaline 3750" "" "metasys"
|
"Meta System" "ups" "4" "Megaline 3750" "" "metasys"
|
||||||
"Meta System" "ups" "1" "Megaline 5000" "" "metasys"
|
"Meta System" "ups" "4" "Megaline 5000" "" "metasys"
|
||||||
"Meta System" "ups" "1" "Megaline 6250" "" "metasys"
|
"Meta System" "ups" "4" "Megaline 6250" "" "metasys"
|
||||||
"Meta System" "ups" "1" "Megaline 7500" "" "metasys"
|
"Meta System" "ups" "4" "Megaline 7500" "" "metasys"
|
||||||
"Meta System" "ups" "1" "Megaline 8750" "" "metasys"
|
"Meta System" "ups" "4" "Megaline 8750" "" "metasys"
|
||||||
"Meta System" "ups" "1" "Megaline 10000" "" "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 Center 500/675 VA" "USB" "usbhid-ups"
|
||||||
"MGE Office Protection Systems" "ups" "5" "Protection Station 500/650/800 VA" "USB" "usbhid-ups"
|
"MGE Office Protection Systems" "ups" "5" "Protection Station 500/650/800 VA" "USB" "usbhid-ups"
|
||||||
|
@ -572,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 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 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" "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 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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 (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" "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)"
|
"MGE Office Protection Systems" "ups" "5" "various models (XML/HTTP mode)" "NMC Minislot (Ref 66102)" "netxml-ups (experimental)"
|
||||||
|
@ -628,45 +748,45 @@
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar MX 4000 RT" "USB" "usbhid-ups"
|
"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" "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" "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 600 Serial" "" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 1100 Serial" "" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "NOVA AVR 1100 Serial" "" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse USBS" "Serial cable" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse USBS" "Serial cable" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse S" "" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse S" "" "mge-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 USBS" "Serial cable" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium S" "" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Ellipse Premium S" "" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Ellipse Office 600" "Serial cable" "mge-shut or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Comet EX RT 3:1" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Esprit" "" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar Esprit" "" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 650" "Serial port" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Evolution 650" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 850" "Serial port" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Evolution 850" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 1150" "Serial port" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Evolution 1150" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1250" "Serial port" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1250" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 1550" "Serial port" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Evolution 1550" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1750" "Serial port" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 1750" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution 2000" "Serial port" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Evolution 2000" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Evolution S 2500" "Serial port" "mge-shut or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 700" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000" "Serial port" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500" "Serial port" "mge-shut or oldmge-shut"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1500" "Serial port" "mge-shut"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar 1000 RT2U" "Serial port" "mge-shut or oldmge-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 or oldmge-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 or oldmge-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 or oldmge-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 oldmge-shut or mge-utalk"
|
"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 oldmge-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 ES+" "" "mge-utalk"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar ESV+" "" "mge-utalk"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar ESV+" "" "mge-utalk"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar SV" "" "mge-utalk"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar SV" "" "mge-utalk"
|
||||||
|
@ -678,7 +798,7 @@
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme" "" "mge-utalk"
|
"MGE UPS SYSTEMS" "ups" "5" "Pulsar EXtreme" "" "mge-utalk"
|
||||||
"MGE UPS SYSTEMS" "ups" "5" "Comet 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)" "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" "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 (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)"
|
"MGE UPS SYSTEMS" "ups" "5" "various models (SNMP mode)" "NMC Minislot (Ref 66102)" "snmp-ups (experimental)"
|
||||||
|
@ -751,10 +871,14 @@
|
||||||
"Nitram" "ups" "1" "Elite 2002" "" "genericups upstype=16"
|
"Nitram" "ups" "1" "Elite 2002" "" "genericups upstype=16"
|
||||||
"Nitram" "ups" "1" "Elite 2005" "" "powerpanel"
|
"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
|
"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" "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" "ON400" "advanced interface" "oneac"
|
||||||
"Oneac" "ups" "1" "ON600" "advanced interface" "oneac"
|
"Oneac" "ups" "1" "ON600" "advanced interface" "oneac"
|
||||||
|
@ -778,16 +902,24 @@
|
||||||
"Online" "ups" "2" "Zinto A" "" "blazer_usb"
|
"Online" "ups" "2" "Zinto A" "" "blazer_usb"
|
||||||
"Online" "ups" "1" "Zinto D" "" "optiups"
|
"Online" "ups" "1" "Zinto D" "" "optiups"
|
||||||
"Online" "ups" "2" "Yunto YQ450" "" "blazer_usb"
|
"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"
|
"OnLite" "ups" "2" "AQUA" "50" "blazer_ser"
|
||||||
|
|
||||||
"Opti-UPS" "ups" "1" "PowerES" "420E" "optiups"
|
"Opti-UPS" "ups" "1" "PowerES" "420E" "optiups"
|
||||||
"Opti-UPS" "ups" "1" "VS 575C" "type=OPTI" "powercom"
|
"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" "various" "not 400 or 600" "blazer_ser"
|
||||||
"Orvaldi Power Protection" "ups" "2" "750 / 900SP" "" "blazer_usb"
|
"Orvaldi Power Protection" "ups" "2" "750 / 900SP" "" "blazer_usb"
|
||||||
|
|
||||||
"Phasak" "ups" "2" "400VA / 600VA" "" "blazer_ser"
|
"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" "500VA" "USB" "blazer_usb"
|
||||||
"Plexus" "ups" "2" "1000VA Pro" "USB" "blazer_usb"
|
"Plexus" "ups" "2" "1000VA Pro" "USB" "blazer_usb"
|
||||||
|
@ -812,6 +944,14 @@
|
||||||
"Powercom" "ups" "5" "(various)" "USB (2009 models, product id: 00a?)" "usbhid-ups (experimental)"
|
"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" "5" "BNT-xxxAP" "USB (product id: 0004)" "usbhid-ups (experimental)"
|
||||||
"Powercom" "ups" "1" "BNT-xxxAP" "USB (product id: 0001)" "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"
|
"POWEREX" "ups" "2" "VI 1000 LED" "" "blazer_usb"
|
||||||
|
|
||||||
|
@ -839,6 +979,18 @@
|
||||||
"PowerWalker" "ups" "2" "Line-Interactive VI 850 LCD" "" "blazer_usb"
|
"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" "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" "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" "3110" "" "genericups upstype=7"
|
||||||
"Powerware" "ups" "4" "3115" "" "genericups upstype=11"
|
"Powerware" "ups" "4" "3115" "" "genericups upstype=11"
|
||||||
|
@ -868,6 +1020,7 @@
|
||||||
"Raritan" "pdu" "3" "Intelligent PDU - Dominion PX" "no report, but should be supported" "snmp-ups (experimental)"
|
"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" "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" "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"
|
"REDi" "ups" "2" "Blazer 400VA / 600VA / 800VA" "" "blazer_ser"
|
||||||
|
|
||||||
|
@ -877,8 +1030,8 @@
|
||||||
|
|
||||||
"Riello" "ups" "3" "Riello Sentinel SDL 6000-7" "Netman Plus 102 SNMP Card" "snmp-ups"
|
"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" "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" "4" "IDG 400/600/800/1200/1600" "" "riello_usb"
|
||||||
"Riello" "ups" "5" "IPG 600/800" "" "riello_usb"
|
"Riello" "ups" "4" "IPG 600/800" "" "riello_usb"
|
||||||
"Riello" "ups" "5" "WPG 400/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" "NPW 600/800/1000/1500/2000" "" "riello_usb"
|
||||||
"Riello" "ups" "5" "NDG 800/1000/1500/2000" "" "riello_usb"
|
"Riello" "ups" "5" "NDG 800/1000/1500/2000" "" "riello_usb"
|
||||||
|
@ -918,10 +1071,37 @@
|
||||||
|
|
||||||
"Rucelf" "ups" "2" "Rucelf UPOII-3000-96-EL" "" "blazer_ser" # http://www.rucelf.ua/en/catalog/upoii-3000-96-el/
|
"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)"
|
"SmartLabs" "pdu" "1" "2412S Power Line Modem" "for X10/Insteon" "powerman-pdu (experimental)"
|
||||||
|
|
||||||
"SMS (Brazil)" "ups" "2" "Manager III" "" "blazer_ser"
|
"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" "305" "cable INT-0025C" "genericups upstype=7"
|
||||||
"SOLA" "ups" "1" "325" "" "blazer_ser or bestups"
|
"SOLA" "ups" "1" "325" "" "blazer_ser or bestups"
|
||||||
"SOLA" "ups" "1" "520" "" "blazer_ser or bestups"
|
"SOLA" "ups" "1" "520" "" "blazer_ser or bestups"
|
||||||
|
@ -962,11 +1142,13 @@
|
||||||
"Sweex" "ups" "2" "INTELLIGENT UPS 1500VA P220" "USB" "blazer_usb (USB ID 0665:5161)" # http://www.sweex.com/en/notebook-pc-accessoires/ups/PP220/
|
"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" "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"
|
"Sysgration" "ups" "2" "UPGUARDS Pro650" "" "blazer_ser"
|
||||||
|
|
||||||
"Tecnoware" "ups" "2" "Easy Power 1200" "" "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" "(various)" "Lan 2.2 interface - black 73-0844 cable" "genericups upstype=5"
|
"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" "2" "1500 LCD" "USB" "usbhid-ups"
|
||||||
|
@ -1068,7 +1250,8 @@
|
||||||
"Tripp Lite" "ups" "3" "SMX3000RT2UTAA" "USB (protocol 3015)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=4396
|
"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" "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" "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" "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" "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" "SU750RTXLCD2U" "USB (protocol 4004)" "usbhid-ups" # http://www.tripplite.com/en/products/model.cfm?txtModelID=5070
|
||||||
|
@ -1119,6 +1302,8 @@
|
||||||
"UPSonic" "ups" "2" "PrOffice 650" "USB" "blazer_usb"
|
"UPSonic" "ups" "2" "PrOffice 650" "USB" "blazer_usb"
|
||||||
"UPSonic" "ups" "2" "DS-800" "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" "4" "(various)" "SEC protocol" "gamatronic"
|
||||||
"Various" "ups" "1" "(various)" "Generic RUPS model" "genericups upstype=4"
|
"Various" "ups" "1" "(various)" "Generic RUPS model" "genericups upstype=4"
|
||||||
"Various" "ups" "1" "(various)" "Generic RUPS 2000 (Megatec M2501 cable)" "genericups upstype=21"
|
"Various" "ups" "1" "(various)" "Generic RUPS 2000 (Megatec M2501 cable)" "genericups upstype=21"
|
||||||
|
@ -1149,6 +1334,8 @@
|
||||||
"Voltronic Power" "ups" "2" "Frigate TX 1KVA" "USB" "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" "Serial" "nutdrv_qx"
|
||||||
"Voltronic Power" "ups" "2" "Galleon 1KVA" "USB" "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" "Serial" "nutdrv_qx"
|
||||||
"Voltronic Power" "ups" "2" "Imperial 1KVA" "USB" "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" "Serial" "nutdrv_qx"
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
# Network UPS Tools: data/html
|
# Network UPS Tools: data/html
|
||||||
# install these only if configured --with-cgi
|
# install these only if configured --with-cgi
|
||||||
if WITH_CGI
|
if WITH_CGI
|
||||||
dist_html_DATA = index.html bottom.html nut-banner.png
|
dist_html_DATA = index.html bottom.html nut-banner.png
|
||||||
nodist_html_DATA = header.html
|
nodist_html_DATA = header.html
|
||||||
endif
|
endif
|
||||||
EXTRA_DIST = README
|
EXTRA_DIST = README
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||||
|
# Generated by configure script:
|
||||||
|
DISTCLEANFILES = header.html
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
# Makefile.in generated by automake 1.16.3 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -15,7 +15,17 @@
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
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 = \
|
am__make_running_with_option = \
|
||||||
case $${target_option-} in \
|
case $${target_option-} in \
|
||||||
?) ;; \
|
?) ;; \
|
||||||
|
@ -80,19 +90,24 @@ build_triplet = @build@
|
||||||
host_triplet = @host@
|
host_triplet = @host@
|
||||||
target_triplet = @target@
|
target_triplet = @target@
|
||||||
subdir = data/html
|
subdir = data/html
|
||||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
|
||||||
$(srcdir)/header.html.in $(am__dist_html_DATA_DIST) README
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
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/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
||||||
$(top_srcdir)/m4/lt~obsolete.m4 \
|
$(top_srcdir)/m4/lt~obsolete.m4 \
|
||||||
$(top_srcdir)/m4/nut_arg_with.m4 \
|
$(top_srcdir)/m4/nut_arg_with.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_asciidoc.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_libavahi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
$(top_srcdir)/m4/nut_check_libgd.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libltdl.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_libneon.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
$(top_srcdir)/m4/nut_check_libnss.m4 \
|
||||||
|
@ -101,11 +116,18 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
$(top_srcdir)/m4/nut_check_libusb.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
$(top_srcdir)/m4/nut_check_libwrap.m4 \
|
||||||
$(top_srcdir)/m4/nut_check_os.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_report_feature.m4 \
|
||||||
|
$(top_srcdir)/m4/nut_stash_warnings.m4 \
|
||||||
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
$(top_srcdir)/m4/nut_type_socklen_t.m4 \
|
||||||
$(top_srcdir)/configure.ac
|
$(top_srcdir)/configure.ac
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_html_DATA_DIST) \
|
||||||
|
$(am__DIST_COMMON)
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = $(top_builddir)/include/config.h
|
CONFIG_HEADER = $(top_builddir)/include/config.h
|
||||||
CONFIG_CLEAN_FILES = header.html
|
CONFIG_CLEAN_FILES = header.html
|
||||||
|
@ -160,6 +182,8 @@ am__uninstall_files_from_dir = { \
|
||||||
am__installdirs = "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(htmldir)"
|
am__installdirs = "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(htmldir)"
|
||||||
DATA = $(dist_html_DATA) $(nodist_html_DATA)
|
DATA = $(dist_html_DATA) $(nodist_html_DATA)
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
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)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
A2X = @A2X@
|
A2X = @A2X@
|
||||||
ACLOCAL = @ACLOCAL@
|
ACLOCAL = @ACLOCAL@
|
||||||
|
@ -168,6 +192,7 @@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
AR = @AR@
|
AR = @AR@
|
||||||
ASCIIDOC = @ASCIIDOC@
|
ASCIIDOC = @ASCIIDOC@
|
||||||
ASPELL = @ASPELL@
|
ASPELL = @ASPELL@
|
||||||
|
AUGPARSE = @AUGPARSE@
|
||||||
AUTOCONF = @AUTOCONF@
|
AUTOCONF = @AUTOCONF@
|
||||||
AUTOHEADER = @AUTOHEADER@
|
AUTOHEADER = @AUTOHEADER@
|
||||||
AUTOMAKE = @AUTOMAKE@
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
@ -178,6 +203,7 @@ CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
CONFPATH = @CONFPATH@
|
CONFPATH = @CONFPATH@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
|
CPPCHECK = @CPPCHECK@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
CPPUNIT_CFLAGS = @CPPUNIT_CFLAGS@
|
||||||
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
CPPUNIT_LIBS = @CPPUNIT_LIBS@
|
||||||
|
@ -191,6 +217,7 @@ DEFS = @DEFS@
|
||||||
DEPDIR = @DEPDIR@
|
DEPDIR = @DEPDIR@
|
||||||
DLLTOOL = @DLLTOOL@
|
DLLTOOL = @DLLTOOL@
|
||||||
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
DOC_BUILD_LIST = @DOC_BUILD_LIST@
|
||||||
|
DOC_CHECK_LIST = @DOC_CHECK_LIST@
|
||||||
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@
|
||||||
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@
|
||||||
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
DRIVER_MAN_LIST = @DRIVER_MAN_LIST@
|
||||||
|
@ -203,6 +230,7 @@ ECHO_T = @ECHO_T@
|
||||||
EGREP = @EGREP@
|
EGREP = @EGREP@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
GDLIB_CONFIG = @GDLIB_CONFIG@
|
||||||
GREP = @GREP@
|
GREP = @GREP@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
@ -220,6 +248,8 @@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@
|
||||||
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
LIBIPMI_LIBS = @LIBIPMI_LIBS@
|
||||||
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@
|
||||||
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
LIBLTDL_LIBS = @LIBLTDL_LIBS@
|
||||||
|
LIBMODBUS_CFLAGS = @LIBMODBUS_CFLAGS@
|
||||||
|
LIBMODBUS_LIBS = @LIBMODBUS_LIBS@
|
||||||
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
LIBNEON_CFLAGS = @LIBNEON_CFLAGS@
|
||||||
LIBNEON_LIBS = @LIBNEON_LIBS@
|
LIBNEON_LIBS = @LIBNEON_LIBS@
|
||||||
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@
|
||||||
|
@ -230,21 +260,29 @@ LIBPOWERMAN_LIBS = @LIBPOWERMAN_LIBS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
LIBSSL_CFLAGS = @LIBSSL_CFLAGS@
|
||||||
LIBSSL_LIBS = @LIBSSL_LIBS@
|
LIBSSL_LIBS = @LIBSSL_LIBS@
|
||||||
|
LIBSSL_REQUIRES = @LIBSSL_REQUIRES@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||||
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
|
||||||
|
LIBUSB_CONFIG = @LIBUSB_CONFIG@
|
||||||
LIBUSB_LIBS = @LIBUSB_LIBS@
|
LIBUSB_LIBS = @LIBUSB_LIBS@
|
||||||
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
LIBWRAP_CFLAGS = @LIBWRAP_CFLAGS@
|
||||||
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
LIBWRAP_LIBS = @LIBWRAP_LIBS@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
LN_S = @LN_S@
|
LN_S = @LN_S@
|
||||||
|
LN_S_R = @LN_S_R@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
NETLIBS = @NETLIBS@
|
NETLIBS = @NETLIBS@
|
||||||
|
NET_SNMP_CONFIG = @NET_SNMP_CONFIG@
|
||||||
NM = @NM@
|
NM = @NM@
|
||||||
NMEDIT = @NMEDIT@
|
NMEDIT = @NMEDIT@
|
||||||
|
NUT_DATADIR = @NUT_DATADIR@
|
||||||
|
NUT_LIBEXECDIR = @NUT_LIBEXECDIR@
|
||||||
NUT_NETVERSION = @NUT_NETVERSION@
|
NUT_NETVERSION = @NUT_NETVERSION@
|
||||||
OBJDUMP = @OBJDUMP@
|
OBJDUMP = @OBJDUMP@
|
||||||
OBJEXT = @OBJEXT@
|
OBJEXT = @OBJEXT@
|
||||||
|
@ -264,6 +302,9 @@ PKG_CONFIG = @PKG_CONFIG@
|
||||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
PORT = @PORT@
|
PORT = @PORT@
|
||||||
|
PYTHON = @PYTHON@
|
||||||
|
PYTHON2 = @PYTHON2@
|
||||||
|
PYTHON3 = @PYTHON3@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
RUN_AS_GROUP = @RUN_AS_GROUP@
|
RUN_AS_GROUP = @RUN_AS_GROUP@
|
||||||
RUN_AS_USER = @RUN_AS_USER@
|
RUN_AS_USER = @RUN_AS_USER@
|
||||||
|
@ -277,6 +318,7 @@ STATEPATH = @STATEPATH@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
SUN_LIBUSB = @SUN_LIBUSB@
|
SUN_LIBUSB = @SUN_LIBUSB@
|
||||||
TREE_VERSION = @TREE_VERSION@
|
TREE_VERSION = @TREE_VERSION@
|
||||||
|
VALGRIND = @VALGRIND@
|
||||||
VERSION = @VERSION@
|
VERSION = @VERSION@
|
||||||
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
|
||||||
XMLLINT = @XMLLINT@
|
XMLLINT = @XMLLINT@
|
||||||
|
@ -294,6 +336,7 @@ am__leading_dot = @am__leading_dot@
|
||||||
am__quote = @am__quote@
|
am__quote = @am__quote@
|
||||||
am__tar = @am__tar@
|
am__tar = @am__tar@
|
||||||
am__untar = @am__untar@
|
am__untar = @am__untar@
|
||||||
|
auglensdir = @auglensdir@
|
||||||
bindir = @bindir@
|
bindir = @bindir@
|
||||||
build = @build@
|
build = @build@
|
||||||
build_alias = @build_alias@
|
build_alias = @build_alias@
|
||||||
|
@ -307,6 +350,9 @@ datarootdir = @datarootdir@
|
||||||
devddir = @devddir@
|
devddir = @devddir@
|
||||||
docdir = @docdir@
|
docdir = @docdir@
|
||||||
driverexecdir = @driverexecdir@
|
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@
|
dvidir = @dvidir@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
host = @host@
|
host = @host@
|
||||||
|
@ -332,12 +378,14 @@ pkgconfigdir = @pkgconfigdir@
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
program_transform_name = @program_transform_name@
|
program_transform_name = @program_transform_name@
|
||||||
psdir = @psdir@
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
sbindir = @sbindir@
|
sbindir = @sbindir@
|
||||||
sharedstatedir = @sharedstatedir@
|
sharedstatedir = @sharedstatedir@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
sysconfdir = @sysconfdir@
|
sysconfdir = @sysconfdir@
|
||||||
systemdsystemshutdowndir = @systemdsystemshutdowndir@
|
systemdshutdowndir = @systemdshutdowndir@
|
||||||
systemdsystemunitdir = @systemdsystemunitdir@
|
systemdsystemunitdir = @systemdsystemunitdir@
|
||||||
|
systemdtmpfilesdir = @systemdtmpfilesdir@
|
||||||
target = @target@
|
target = @target@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
target_cpu = @target_cpu@
|
target_cpu = @target_cpu@
|
||||||
|
@ -348,11 +396,14 @@ top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
udevdir = @udevdir@
|
udevdir = @udevdir@
|
||||||
|
|
||||||
# Network UPS Tools: data/html
|
# Network UPS Tools: data/html
|
||||||
# install these only if configured --with-cgi
|
# install these only if configured --with-cgi
|
||||||
@WITH_CGI_TRUE@dist_html_DATA = index.html bottom.html nut-banner.png
|
@WITH_CGI_TRUE@dist_html_DATA = index.html bottom.html nut-banner.png
|
||||||
@WITH_CGI_TRUE@nodist_html_DATA = header.html
|
@WITH_CGI_TRUE@nodist_html_DATA = header.html
|
||||||
EXTRA_DIST = README
|
EXTRA_DIST = README
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in .dirstamp
|
||||||
|
# Generated by configure script:
|
||||||
|
DISTCLEANFILES = header.html
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
@ -368,14 +419,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/html/Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/html/Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu data/html/Makefile
|
$(AUTOMAKE) --gnu data/html/Makefile
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||||
*) \
|
*) \
|
||||||
echo ' 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__depfiles_maybe);; \
|
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
|
||||||
esac;
|
esac;
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||||
|
@ -443,7 +493,10 @@ ctags CTAGS:
|
||||||
cscope cscopelist:
|
cscope cscopelist:
|
||||||
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
distdir: $(BUILT_SOURCES)
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||||
|
|
||||||
|
distdir-am: $(DISTFILES)
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
list='$(DISTFILES)'; \
|
list='$(DISTFILES)'; \
|
||||||
|
@ -506,10 +559,12 @@ clean-generic:
|
||||||
distclean-generic:
|
distclean-generic:
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
-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 . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||||
|
-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
|
||||||
|
|
||||||
maintainer-clean-generic:
|
maintainer-clean-generic:
|
||||||
@echo "This command is intended for maintainers to use"
|
@echo "This command is intended for maintainers to use"
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
clean: clean-am
|
clean: clean-am
|
||||||
|
|
||||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||||
|
@ -592,6 +647,8 @@ uninstall-am: uninstall-dist_htmlDATA uninstall-nodist_htmlDATA
|
||||||
tags-am uninstall uninstall-am uninstall-dist_htmlDATA \
|
tags-am uninstall uninstall-am uninstall-dist_htmlDATA \
|
||||||
uninstall-nodist_htmlDATA
|
uninstall-nodist_htmlDATA
|
||||||
|
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>
|
<title>
|
||||||
Network UPS Tools
|
Network UPS Tools
|
||||||
</title>
|
</title>
|
||||||
</head>
|
</head>
|
||||||
<body BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000EE" VLINK="#551A8B">
|
<body BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000EE" VLINK="#551A8B">
|
||||||
|
|
19
debian/NEWS
vendored
Normal file
19
debian/NEWS
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
nut (2.7.2-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
Since version 1.2 NUT-Monitor uses safer directory permissions when
|
||||||
|
creating ~/.nut-monitor.
|
||||||
|
|
||||||
|
NUT-Monitor will now detect a pre-1.2 settings directory on startup
|
||||||
|
and update its permissions.
|
||||||
|
|
||||||
|
Please note that passwords stored in NUT-Monitor prior to this change
|
||||||
|
may have been exposed, and it is recommended that they be reset.
|
||||||
|
|
||||||
|
-- Michael Fincham <michael.fincham@catalyst.net.nz> Fri, 13 Feb 2015 11:57:12 +1300
|
||||||
|
|
||||||
|
nut (2.6.5-1) experimental; urgency=low
|
||||||
|
|
||||||
|
mge-shut driver has been replaced by a new implementation (newmge-shut).
|
||||||
|
In case of issue with this new version, users can revert to oldmge-shut.
|
||||||
|
|
||||||
|
-- Laurent Bigonville <bigon@debian.org> Mon, 13 Aug 2012 00:32:18 +0200
|
1934
debian/changelog
vendored
Normal file
1934
debian/changelog
vendored
Normal file
File diff suppressed because it is too large
Load diff
1
debian/compat
vendored
Normal file
1
debian/compat
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
12
|
305
debian/control
vendored
Normal file
305
debian/control
vendored
Normal file
|
@ -0,0 +1,305 @@
|
||||||
|
Source: nut
|
||||||
|
Section: admin
|
||||||
|
Priority: optional
|
||||||
|
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),
|
||||||
|
libwrap0-dev (>= 7.6),
|
||||||
|
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: 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
|
||||||
|
power distribution unit (PDU) hardware. Clients access the hardware
|
||||||
|
through the server, and are notified whenever the power status
|
||||||
|
changes.
|
||||||
|
.
|
||||||
|
This package is a metapackage that installs both nut-server and nut-client,
|
||||||
|
in most cases it is sufficient for a basic UPS monitoring system.
|
||||||
|
|
||||||
|
Package: nut-server
|
||||||
|
Architecture: any
|
||||||
|
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
|
||||||
|
power distribution unit (PDU) hardware. Clients access the hardware
|
||||||
|
through the server, and are notified whenever the power status
|
||||||
|
changes.
|
||||||
|
.
|
||||||
|
This package provides NUT's core system, and the serial and USB UPS
|
||||||
|
drivers.
|
||||||
|
|
||||||
|
Package: nut-client
|
||||||
|
Architecture: any
|
||||||
|
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
|
||||||
|
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
|
||||||
|
power distribution unit (PDU) hardware. Clients access the hardware
|
||||||
|
through the server, and are notified whenever the power status
|
||||||
|
changes.
|
||||||
|
.
|
||||||
|
This package provides NUT's clients that allows the user to control
|
||||||
|
and monitor the UPS.
|
||||||
|
|
||||||
|
Package: nut-cgi
|
||||||
|
Architecture: any
|
||||||
|
Depends: adduser, ${misc:Depends}, ${shlibs:Depends}
|
||||||
|
Recommends: apache2 | httpd-cgi
|
||||||
|
Suggests: nut
|
||||||
|
Description: network UPS tools - web interface
|
||||||
|
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 an HTTP interface for Network UPS Tools which makes
|
||||||
|
it possible to monitor the core NUT system with a web browser.
|
||||||
|
|
||||||
|
Package: nut-snmp
|
||||||
|
Architecture: any
|
||||||
|
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
|
||||||
|
power distribution unit (PDU) hardware. Clients access the hardware
|
||||||
|
through the server, and are notified whenever the power status
|
||||||
|
changes.
|
||||||
|
.
|
||||||
|
This package provides snmp-ups, the SNMP multi-MIB driver for UPS, which
|
||||||
|
supports various MIBs including IETF, MGE, and APC. It adds an SNMP
|
||||||
|
Manager interface to the core NUT system.
|
||||||
|
|
||||||
|
Package: nut-ipmi
|
||||||
|
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
|
||||||
|
power distribution unit (PDU) hardware. Clients access the hardware
|
||||||
|
through the server, and are notified whenever the power status
|
||||||
|
changes.
|
||||||
|
.
|
||||||
|
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: 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
|
||||||
|
power distribution unit (PDU) hardware. Clients access the hardware
|
||||||
|
through the server, and are notified whenever the power status
|
||||||
|
changes.
|
||||||
|
.
|
||||||
|
This package provides netxml-ups, which supports UPS models from
|
||||||
|
Eaton or MGE that use an XML/HTTP-based Network Management Card or
|
||||||
|
Proxy.
|
||||||
|
|
||||||
|
Package: nut-powerman-pdu
|
||||||
|
Architecture: any
|
||||||
|
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
|
||||||
|
power distribution unit (PDU) hardware. Clients access the hardware
|
||||||
|
through the server, and are notified whenever the power status
|
||||||
|
changes.
|
||||||
|
.
|
||||||
|
This package provides powerman-pdu, which allows NUT clients to communicate
|
||||||
|
with the PowerMan daemon to support PDUs.
|
||||||
|
|
||||||
|
Package: nut-doc
|
||||||
|
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
|
||||||
|
power distribution unit (PDU) hardware. Clients access the hardware
|
||||||
|
through the server, and are notified whenever the power status
|
||||||
|
changes.
|
||||||
|
.
|
||||||
|
This package contains FAQ, user, developer and packager documentation.
|
||||||
|
|
||||||
|
Package: libupsclient4
|
||||||
|
Section: libs
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||||
|
Pre-Depends: ${misc:Pre-Depends}
|
||||||
|
Multi-Arch: same
|
||||||
|
Description: network UPS tools - 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 the shared client library.
|
||||||
|
|
||||||
|
Package: libupsclient-dev
|
||||||
|
Section: libdevel
|
||||||
|
Architecture: any
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
|
||||||
|
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 the new shared client library.
|
||||||
|
|
||||||
|
Package: libnutclient-dev
|
||||||
|
Section: libdevel
|
||||||
|
Architecture: any
|
||||||
|
Depends: libnutclient0 (= ${binary:Version}),
|
||||||
|
${misc:Depends},
|
||||||
|
${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 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: ${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
|
||||||
|
power distribution unit (PDU) hardware. Clients access the hardware
|
||||||
|
through the server, and are notified whenever the power status
|
||||||
|
changes.
|
||||||
|
.
|
||||||
|
This package provides Perl bindings to connect to NUT server.
|
69
debian/copyright
vendored
Normal file
69
debian/copyright
vendored
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
This package was debianized by Luca Filipozzi <lfilipoz@debian.org> on
|
||||||
|
Wed Jun 28 19:48:05 PDT 2000
|
||||||
|
|
||||||
|
It was downloaded from http://www.networkupstools.org/
|
||||||
|
|
||||||
|
Upstream Authors:
|
||||||
|
|
||||||
|
Russell Kroll <rkroll@exploits.org>
|
||||||
|
Arnaud Quette <http://arnaud.quette.free.fr/contact.html>
|
||||||
|
Arjen de Korte <arjen@de-korte.org>
|
||||||
|
Charles Lepple <clepple@gmail.com>
|
||||||
|
Kjell Claesson <kjell.claesson@epost.tidanet.se>
|
||||||
|
David Goncalves <david@lestat.st>
|
||||||
|
and the NUT Team
|
||||||
|
|
||||||
|
Copyright:
|
||||||
|
|
||||||
|
Copyright (C) 2000-2008 Russell Kroll, Arnaud Quette and the NUT Team
|
||||||
|
|
||||||
|
Licenses:
|
||||||
|
|
||||||
|
Most files are licensed under the GNU General Public License (GPL) version 2,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
The files in the scripts/python/ directory are released under GNU General
|
||||||
|
Public License (GPL) version 3, or (at your option) any later version.
|
||||||
|
|
||||||
|
GPL-2
|
||||||
|
-----
|
||||||
|
|
||||||
|
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.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
On Debian systems, the full text of the GNU General Public License v2
|
||||||
|
may be found in /usr/share/common-licenses/GPL-2.
|
||||||
|
|
||||||
|
GPL-3
|
||||||
|
-----
|
||||||
|
|
||||||
|
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 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.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
On Debian systems, the full text of the GNU General Public License v3
|
||||||
|
may be found in /usr/share/common-licenses/GPL-3.
|
||||||
|
|
||||||
|
|
||||||
|
The Debian packaging is Copyright (C) 2008, Arnaud Quette <aquette@debian.org>
|
||||||
|
and is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
|
8
debian/gbp.conf
vendored
Normal file
8
debian/gbp.conf
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[DEFAULT]
|
||||||
|
debian-branch = debian
|
||||||
|
upstream-branch = upstream
|
||||||
|
pristine-tar = True
|
||||||
|
|
||||||
|
[git-buildpackage]
|
||||||
|
tarball-dir = ../tarballs/
|
||||||
|
export-dir = ../build-area/
|
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~
|
1
debian/libups-nut-perl.install
vendored
Normal file
1
debian/libups-nut-perl.install
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
scripts/perl/Nut.pm /usr/share/perl5/UPS/
|
5
debian/libupsclient-dev.install
vendored
Normal file
5
debian/libupsclient-dev.install
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
usr/include/parseconf.h
|
||||||
|
usr/include/upsclient.h
|
||||||
|
usr/lib/*/libupsclient.a
|
||||||
|
usr/lib/*/libupsclient.so
|
||||||
|
usr/lib/*/pkgconfig/libupsclient.pc
|
1
debian/libupsclient4.install
vendored
Normal file
1
debian/libupsclient4.install
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
lib/*/libupsclient.so.*
|
114
debian/libupsclient4.symbols
vendored
Normal file
114
debian/libupsclient4.symbols
vendored
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
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
|
||||||
|
become_user@Base 2.7.2
|
||||||
|
chroot_start@Base 2.7.2
|
||||||
|
confpath@Base 2.7.2
|
||||||
|
dflt_statepath@Base 2.7.2
|
||||||
|
fatal_with_errno@Base 2.7.2
|
||||||
|
fatalx@Base 2.7.2
|
||||||
|
get_user_pwent@Base 2.7.2
|
||||||
|
nut_debug_level@Base 2.7.2
|
||||||
|
nut_log_level@Base 2.7.2
|
||||||
|
open_syslog@Base 2.7.2
|
||||||
|
pconf_char@Base 2.7.2
|
||||||
|
pconf_encode@Base 2.7.2
|
||||||
|
pconf_file_begin@Base 2.7.2
|
||||||
|
pconf_file_next@Base 2.7.2
|
||||||
|
pconf_finish@Base 2.7.2
|
||||||
|
pconf_init@Base 2.7.2
|
||||||
|
pconf_line@Base 2.7.2
|
||||||
|
pconf_parse_error@Base 2.7.2
|
||||||
|
select_read@Base 2.7.2
|
||||||
|
select_write@Base 2.7.2
|
||||||
|
sendsignal@Base 2.7.2
|
||||||
|
sendsignalfn@Base 2.7.2
|
||||||
|
snprintfcat@Base 2.7.2
|
||||||
|
state_addcmd@Base 2.7.2
|
||||||
|
state_addenum@Base 2.7.2
|
||||||
|
state_addrange@Base 2.7.2
|
||||||
|
state_cmdfree@Base 2.7.2
|
||||||
|
state_delcmd@Base 2.7.2
|
||||||
|
state_delenum@Base 2.7.2
|
||||||
|
state_delinfo@Base 2.7.2
|
||||||
|
state_delrange@Base 2.7.2
|
||||||
|
state_getaux@Base 2.7.2
|
||||||
|
state_getenumlist@Base 2.7.2
|
||||||
|
state_getflags@Base 2.7.2
|
||||||
|
state_getinfo@Base 2.7.2
|
||||||
|
state_getrangelist@Base 2.7.2
|
||||||
|
state_infofree@Base 2.7.2
|
||||||
|
state_setaux@Base 2.7.2
|
||||||
|
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
|
||||||
|
upscli_connect@Base 2.7.2
|
||||||
|
upscli_disconnect@Base 2.7.2
|
||||||
|
upscli_errlist@Base 2.7.2
|
||||||
|
upscli_fd@Base 2.7.2
|
||||||
|
upscli_get@Base 2.7.2
|
||||||
|
upscli_init@Base 2.7.2
|
||||||
|
upscli_list_next@Base 2.7.2
|
||||||
|
upscli_list_start@Base 2.7.2
|
||||||
|
upscli_readline@Base 2.7.2
|
||||||
|
upscli_sendline@Base 2.7.2
|
||||||
|
upscli_splitaddr@Base 2.7.2
|
||||||
|
upscli_splitname@Base 2.7.2
|
||||||
|
upscli_ssl@Base 2.7.2
|
||||||
|
upscli_strerror@Base 2.7.2
|
||||||
|
upscli_tryconnect@Base 2.7.2
|
||||||
|
upscli_upserror@Base 2.7.2
|
||||||
|
upsdebug_ascii@Base 2.7.2
|
||||||
|
upsdebug_hex@Base 2.7.2
|
||||||
|
upsdebug_with_errno@Base 2.7.2
|
||||||
|
upsdebugx@Base 2.7.2
|
||||||
|
upslog_with_errno@Base 2.7.2
|
||||||
|
upslogx@Base 2.7.2
|
||||||
|
writepid@Base 2.7.2
|
||||||
|
xbasename@Base 2.7.2
|
||||||
|
xcalloc@Base 2.7.2
|
||||||
|
xmalloc@Base 2.7.2
|
||||||
|
xrealloc@Base 2.7.2
|
||||||
|
xstrdup@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 |
19
debian/local/upsd
vendored
Executable file
19
debian/local/upsd
vendored
Executable file
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Include NUT nut.conf
|
||||||
|
[ -r /etc/nut/nut.conf ] && . /etc/nut/nut.conf
|
||||||
|
|
||||||
|
case "$MODE" in
|
||||||
|
standalone|netserver)
|
||||||
|
exec /lib/nut/upsd "$@"
|
||||||
|
;;
|
||||||
|
none|netclient)
|
||||||
|
echo "upsd disabled, please adjust the configuration to your needs"
|
||||||
|
echo "Then set MODE to a suitable value in /etc/nut/nut.conf to enable it"
|
||||||
|
# exit success to avoid breaking the install process!
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
19
debian/local/upsmon
vendored
Executable file
19
debian/local/upsmon
vendored
Executable file
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Include NUT nut.conf
|
||||||
|
[ -r /etc/nut/nut.conf ] && . /etc/nut/nut.conf
|
||||||
|
|
||||||
|
case "$MODE" in
|
||||||
|
standalone|netserver|netclient)
|
||||||
|
exec /lib/nut/upsmon "$@"
|
||||||
|
;;
|
||||||
|
none)
|
||||||
|
echo "upsmon disabled, please adjust the configuration to your needs"
|
||||||
|
echo "Then set MODE to a suitable value in /etc/nut/nut.conf to enable it"
|
||||||
|
# exit success to avoid breaking the install process!
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
39
debian/nut-cgi.README.Debian
vendored
Normal file
39
debian/nut-cgi.README.Debian
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
Network UPS Tools - CGI Interface - Quick Start for Debian
|
||||||
|
----------------------------------------------------------
|
||||||
|
|
||||||
|
(I) Installation
|
||||||
|
=================
|
||||||
|
|
||||||
|
1) Sample configuration files are provided in /etc/nut/
|
||||||
|
Rename without the ".sample" suffix the files hosts.conf, upsstats.html,
|
||||||
|
upsstats-single.html and optionally upsset.conf.
|
||||||
|
Then edit these to match your configuration.
|
||||||
|
|
||||||
|
2) Ensure these configuration files are readable by others
|
||||||
|
|
||||||
|
chmod 755 /etc/nut
|
||||||
|
chmod 644 /etc/nut/upsset.conf
|
||||||
|
chmod 644 /etc/nut/hosts.conf
|
||||||
|
chmod 644 /etc/nut/upsstats.html
|
||||||
|
chmod 644 /etc/nut/upsstats-single.html
|
||||||
|
|
||||||
|
3) You will then be able to access NUT CGI through a Web browser.
|
||||||
|
The URL, which depends on your httpd configuration, is:
|
||||||
|
|
||||||
|
http://localhost/cgi-bin/nut/upsstats.cgi
|
||||||
|
|
||||||
|
4) NUT also provides a set of HTML files to wrap the CGIs.
|
||||||
|
To use it, create a new virtual host with your preferred webserver, and point the
|
||||||
|
Document Root to: /usr/share/nut/www/
|
||||||
|
|
||||||
|
You can also add an alias to an existing site, if it is supported:
|
||||||
|
Alias /nut/ "/usr/share/nut/www/"
|
||||||
|
|
||||||
|
Also ensure that the files in this directory have the suitable permissions.
|
||||||
|
|
||||||
|
For more information on nut-cgi configuration, have a look at the following
|
||||||
|
manual pages:
|
||||||
|
- upsstats.html (5)
|
||||||
|
- hosts.conf (5)
|
||||||
|
- upsset.conf (5)
|
||||||
|
|
1
debian/nut-cgi.docs
vendored
Normal file
1
debian/nut-cgi.docs
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
data/html/README
|
6
debian/nut-cgi.install
vendored
Normal file
6
debian/nut-cgi.install
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
debian/tmp/etc/nut/hosts.conf
|
||||||
|
debian/tmp/etc/nut/upsset.conf
|
||||||
|
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
|
47
debian/nut-cgi.postinst
vendored
Normal file
47
debian/nut-cgi.postinst
vendored
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
|
||||||
|
configure)
|
||||||
|
|
||||||
|
# make sure the nut user exists and has correct memberships
|
||||||
|
if ! getent group nut >/dev/null; then
|
||||||
|
addgroup --quiet --system nut
|
||||||
|
fi
|
||||||
|
if ! getent passwd nut >/dev/null; then
|
||||||
|
adduser --quiet --system --ingroup nut --home /var/lib/nut --no-create-home nut
|
||||||
|
elif ! groups nut | grep -qw nut; then
|
||||||
|
adduser nut nut
|
||||||
|
fi
|
||||||
|
# for Ubuntu, while waiting for a proper debconf
|
||||||
|
# if ! groups nut | grep -qw dialout; then
|
||||||
|
# adduser nut dialout
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# Ensure /etc/nut is readable/crossable for others
|
||||||
|
if [ -d /etc/nut/ ] ; then
|
||||||
|
chmod 755 /etc/nut
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure nut-cgi configuration files are readable by others
|
||||||
|
for file in upsset.conf hosts.conf upsstats.html upsstats-single.html ; do
|
||||||
|
if [ -f /etc/nut/$file ] ; then
|
||||||
|
chmod 644 /etc/nut/$file
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
|
||||||
|
abort-upgrade|abort-remove|abort-deconfigure)
|
||||||
|
# do nothing
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "$0: incorrect arguments: $*" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
|
exit 0
|
180
debian/nut-client.init
vendored
Executable file
180
debian/nut-client.init
vendored
Executable file
|
@ -0,0 +1,180 @@
|
||||||
|
#! /bin/sh
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: nut-client upsmon ups-monitor
|
||||||
|
# Required-Start: $local_fs $syslog $network $remote_fs
|
||||||
|
# Required-Stop: $local_fs $syslog $network $remote_fs
|
||||||
|
# Should-Start: nut-server
|
||||||
|
# Should-Stop:
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: Network UPS Tools monitor initscript
|
||||||
|
# Description: This script take care of starting and stopping the
|
||||||
|
# Network UPS Tools monitoring component (upsmon).
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
# Author: Arnaud Quette <aquette@debian.org>
|
||||||
|
|
||||||
|
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=/run/nut
|
||||||
|
upsmon_pid=${pid_dir}/upsmon.pid
|
||||||
|
upsmon=/sbin/upsmon
|
||||||
|
log=">/dev/null 2>/dev/null"
|
||||||
|
|
||||||
|
# Define LSB log_* functions.
|
||||||
|
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
|
||||||
|
. /lib/lsb/init-functions
|
||||||
|
|
||||||
|
# set upsmon specific options. use "man upsmon" for more info
|
||||||
|
# this parameter is now located in nut.conf, and not in /etc/default/nut anymore
|
||||||
|
# FIXME: retrieved from 'nut' script during update
|
||||||
|
UPSMON_OPTIONS=""
|
||||||
|
|
||||||
|
# Exit if the package is not installed
|
||||||
|
[ -x "$upsmon" ] || exit 0
|
||||||
|
|
||||||
|
# Include NUT nut.conf
|
||||||
|
[ -r $CONFIG ] && . $CONFIG
|
||||||
|
|
||||||
|
# FIXME: put all common bits, between nut-client and nut-server,
|
||||||
|
# into a common nut-function
|
||||||
|
|
||||||
|
# Explicitly require the configuration to be done in /etc/nut/nut.conf
|
||||||
|
if [ "x$MODE" = "xnone" -o -z "$MODE" ] ; then
|
||||||
|
log_action_msg "$NAME disabled, please adjust the configuration to your needs"
|
||||||
|
log_action_msg "Then set MODE to a suitable value in $CONFIG to enable it"
|
||||||
|
# exit success to avoid breaking the install process!
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 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} \
|
||||||
|
&& chmod 770 ${pid_dir} \
|
||||||
|
&& [ -x /sbin/restorecon ] && /sbin/restorecon ${pid_dir}
|
||||||
|
}
|
||||||
|
|
||||||
|
# check if the right components are running
|
||||||
|
check_status() {
|
||||||
|
case "$MODE" in
|
||||||
|
standalone|netserver|netclient)
|
||||||
|
status_of_proc -p $upsmon_pid $upsmon upsmon
|
||||||
|
;;
|
||||||
|
none|*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
start_stop_client () {
|
||||||
|
case "$MODE" in
|
||||||
|
standalone|netserver|netclient)
|
||||||
|
# FIXME: for standalone|netserver, ensure 'nut-server status' returns ?
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
start-stop-daemon -S -q -p $upsmon_pid -x $upsmon \
|
||||||
|
-- $UPSMON_OPTIONS >/dev/null 2>&1 && return 0 || return 1
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
start-stop-daemon -K -o -q -p $upsmon_pid -n upsmon >/dev/null 2>&1 \
|
||||||
|
&& return 0 || return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
none|*)
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
|
||||||
|
start)
|
||||||
|
log_daemon_msg "Starting $DESC" "$NAME"
|
||||||
|
check_var_directory
|
||||||
|
start_stop_client start
|
||||||
|
log_end_msg $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
stop)
|
||||||
|
log_daemon_msg "Stopping $DESC" "$NAME"
|
||||||
|
start_stop_client stop
|
||||||
|
log_end_msg $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
reload)
|
||||||
|
log_daemon_msg "Reloading $DESC" "$NAME"
|
||||||
|
$upsmon -c reload >/dev/null 2>&1
|
||||||
|
log_end_msg $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
restart|force-reload)
|
||||||
|
# FIXME: lack consistency, due to initscript split.
|
||||||
|
# This only addresses partial reload.
|
||||||
|
# Full reload requires to:
|
||||||
|
# - stop nut-client
|
||||||
|
# - restart (Ie stop+start) nut-server
|
||||||
|
# - start nut-client
|
||||||
|
log_daemon_msg "Restarting $DESC" "$NAME"
|
||||||
|
start_stop_client stop || true
|
||||||
|
# should then 'start_stop_server stop', Ie /etc/init.d/nut-server stop
|
||||||
|
#sleep 5
|
||||||
|
check_var_directory
|
||||||
|
# should first 'start_stop_server start', Ie /etc/init.d/nut-server start
|
||||||
|
start_stop_client start
|
||||||
|
log_end_msg $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
status)
|
||||||
|
#log_daemon_msg "Checking status of $DESC"
|
||||||
|
echo "Checking status of $DESC"
|
||||||
|
check_status
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
|
||||||
|
poweroff)
|
||||||
|
case "$MODE" in
|
||||||
|
standalone|netserver)
|
||||||
|
# Sanity check
|
||||||
|
flag=`sed -ne 's#^ *POWERDOWNFLAG *\(.*\)$#\1#p' /etc/nut/upsmon.conf`
|
||||||
|
if [ -z "$flag" ] ; then
|
||||||
|
log_action_msg "##########################################################"
|
||||||
|
log_action_msg "## POWERDOWNFLAG is not defined in /etc/nut/upsmon.conf ##"
|
||||||
|
log_action_msg "## ##"
|
||||||
|
log_action_msg "## Please read the Manual page upsmon.conf(5) ##"
|
||||||
|
log_action_msg "##########################################################"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Defer to nut-server to actually poweroff the UPS, if needed
|
||||||
|
# (the need is tested here though!)
|
||||||
|
if $upsmon -K >/dev/null 2>&1 ; then
|
||||||
|
log_daemon_msg "UPS poweroff required..."
|
||||||
|
log_end_msg 0
|
||||||
|
if [ -x /etc/init.d/nut-server ] ; then
|
||||||
|
exec /etc/init.d/nut-server poweroff
|
||||||
|
else
|
||||||
|
log_action_msg "Failure: /etc/init.d/nut-server script missing"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_action_msg "Power down flag is not set (UPS poweroff not needed)"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
none|netclient|*)
|
||||||
|
# nothing to do
|
||||||
|
log_action_msg "'$MODE' configuration does not require UPS poweroff"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
N=/etc/init.d/$NAME
|
||||||
|
echo "Usage: $N {start|stop|reload|restart|force-reload|status|poweroff}" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
25
debian/nut-client.install
vendored
Normal file
25
debian/nut-client.install
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
debian/tmp/bin/upsc
|
||||||
|
debian/tmp/bin/upscmd
|
||||||
|
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/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.links
vendored
Normal file
1
debian/nut-client.links
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
etc/init.d/nut-client etc/init.d/ups-monitor
|
1
debian/nut-client.lintian-overrides
vendored
Normal file
1
debian/nut-client.lintian-overrides
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
nut-client: script-in-etc-init.d-not-registered-via-update-rc.d
|
1
debian/nut-client.maintscript
vendored
Normal file
1
debian/nut-client.maintscript
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
rm_conffile /etc/bash_completion.d/nut 2.7.1-1~
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue