diff options
-rwxr-xr-x | .github/prepare_debian.sh | 1 | ||||
-rw-r--r-- | NEWS | 38 | ||||
-rw-r--r-- | THANKS.in | 5 | ||||
-rw-r--r-- | doc/RELEASING.md | 8 | ||||
-rw-r--r-- | plugins/check_http.c | 8 | ||||
-rwxr-xr-x | plugins/tests/check_http.t | 70 |
6 files changed, 124 insertions, 6 deletions
diff --git a/.github/prepare_debian.sh b/.github/prepare_debian.sh index d8a76da..5222659 100755 --- a/.github/prepare_debian.sh +++ b/.github/prepare_debian.sh | |||
@@ -5,6 +5,7 @@ set -e | |||
5 | 5 | ||
6 | export DEBIAN_FRONTEND=noninteractive | 6 | export DEBIAN_FRONTEND=noninteractive |
7 | 7 | ||
8 | sed "s/main/non-free contrib/g" /etc/apt/sources.list.d/debian.sources > /etc/apt/sources.list.d/debian-nonfree.sources | ||
8 | apt-get update | 9 | apt-get update |
9 | apt-get -y install software-properties-common | 10 | apt-get -y install software-properties-common |
10 | if [ $(lsb_release -is) = "Debian" ]; then | 11 | if [ $(lsb_release -is) = "Debian" ]; then |
@@ -1,5 +1,43 @@ | |||
1 | This file documents the major additions and syntax changes between releases. | 1 | This file documents the major additions and syntax changes between releases. |
2 | 2 | ||
3 | 2.3.3 2nd Feb 2023 | ||
4 | ENHANCEMENTS | ||
5 | using PRId64 and PRIu64 instead of %ld directly | ||
6 | check_http: Make faster with larger files | ||
7 | check_snmp: add 'multiplier' to modify current value | ||
8 | check_http: Implement chunked encoding decoding | ||
9 | check_http/check_curl: add chunked encoding test | ||
10 | check_log: Added --exclude to exclude patterns | ||
11 | check_log: Add tests | ||
12 | check_disk: Clarify usage possibilites | ||
13 | |||
14 | FIXES | ||
15 | fixed two PRId64 to PRIu64 in perfdata_uint64 | ||
16 | check_pgsql: Removing is_pg_dbname alltogether,using postgres API. | ||
17 | check_http: Remove superflous CRLF in HTTP-Requests | ||
18 | check_curl: detect ipv6 | ||
19 | check_icmp: fix parsing help/version long options | ||
20 | check_http: fix test plan | ||
21 | check_disk: Find accessible mount path if multiple are available | ||
22 | check_apt: Fix unknown escape sequence error output | ||
23 | check_curl: fix checking large bodys | ||
24 | check_snmp: Improve tests for check_snmp & multiply option | ||
25 | check_snmp: always apply format when applying multiplier | ||
26 | check_http: Use real booleans instead of ints | ||
27 | check_http: Document process_arguments a little bit better | ||
28 | check_http: Remove dead code | ||
29 | check_http: Fix several bug in the implementation of unchunking | ||
30 | check_http: Reformat a part to increase readability | ||
31 | check_apt: Put upgrade options in the root sections | ||
32 | check_apt: Fix comment | ||
33 | check_apt: Use real booleans | ||
34 | check_mailq: Fixing nullmailer regex | ||
35 | check_snmp: Fix regex matches | ||
36 | check_log: Fixed a bug when using --all | ||
37 | check_log: Cleaned up duplicated code in the args | ||
38 | check_http: Fix memory reallocation error in chunk decoding logic | ||
39 | check_http: Add space for ending NULL byte in array for chunked encoding | ||
40 | |||
3 | 2.3.2 20th Oct 2022 | 41 | 2.3.2 20th Oct 2022 |
4 | GENERAL | 42 | GENERAL |
5 | Use netcat-openbsd for debian explicitely (by @RincewindsHat #1704) | 43 | Use netcat-openbsd for debian explicitely (by @RincewindsHat #1704) |
@@ -400,3 +400,8 @@ Peter Newman | |||
400 | Tobias Fiebig | 400 | Tobias Fiebig |
401 | Tobias Wiese | 401 | Tobias Wiese |
402 | Wolfgang Karall-Ahlborn | 402 | Wolfgang Karall-Ahlborn |
403 | Danijel Tasov | ||
404 | Robert Bohne | ||
405 | Wolfgang Nieder | ||
406 | andrew bezella | ||
407 | Lorenz Gruenwald | ||
diff --git a/doc/RELEASING.md b/doc/RELEASING.md index 58ec3e1..432b1da 100644 --- a/doc/RELEASING.md +++ b/doc/RELEASING.md | |||
@@ -2,7 +2,7 @@ Releasing a New Monitoring Plugins Version | |||
2 | ========================================== | 2 | ========================================== |
3 | 3 | ||
4 | Throughout this document, it is assumed that the current Monitoring | 4 | Throughout this document, it is assumed that the current Monitoring |
5 | Plugins version is 2.3.2, and that we're about to publish version 2.4. | 5 | Plugins version is 2.3.3, and that we're about to publish version 2.4. |
6 | It is also assumed that the official repository on GitHub is tracked | 6 | It is also assumed that the official repository on GitHub is tracked |
7 | using the remote name `monitoring-plugins` (rather than `origin`). | 7 | using the remote name `monitoring-plugins` (rather than `origin`). |
8 | 8 | ||
@@ -11,14 +11,14 @@ Before you start | |||
11 | 11 | ||
12 | - Check Github Actions status. | 12 | - Check Github Actions status. |
13 | - Update local Git repository to the current `master` tip. For a | 13 | - Update local Git repository to the current `master` tip. For a |
14 | maintenance release (e.g., version 2.3.2), update to the current | 14 | maintenance release (e.g., version 2.3.4), update to the current |
15 | `maint-2.3` tip, instead. | 15 | `maint-2.3` tip, instead. |
16 | 16 | ||
17 | Prepare and commit files | 17 | Prepare and commit files |
18 | ------------------------ | 18 | ------------------------ |
19 | 19 | ||
20 | - Update `configure.ac` and `NP-VERSION-GEN` with new version. | 20 | - Update `configure.ac` and `NP-VERSION-GEN` with new version. |
21 | - Update `NEWS` from `git log --reverse v2.3.1..` output, and specify | 21 | - Update `NEWS` from `git log --reverse v2.3.3..` output, and specify |
22 | the release version/date. | 22 | the release version/date. |
23 | - Update `AUTHORS` if there are new team members. | 23 | - Update `AUTHORS` if there are new team members. |
24 | - Update `THANKS.in` using `tools/update-thanks`. | 24 | - Update `THANKS.in` using `tools/update-thanks`. |
@@ -93,6 +93,6 @@ Announce new release | |||
93 | 93 | ||
94 | If you want to mention the number of contributors in the announcement: | 94 | If you want to mention the number of contributors in the announcement: |
95 | 95 | ||
96 | git shortlog -s v2.3.1..v2.4 | wc -l | 96 | git shortlog -s v2.3.3..v2.4 | wc -l |
97 | 97 | ||
98 | <!-- vim:set filetype=markdown textwidth=72: --> | 98 | <!-- vim:set filetype=markdown textwidth=72: --> |
diff --git a/plugins/check_http.c b/plugins/check_http.c index 5fa310f..8dda046 100644 --- a/plugins/check_http.c +++ b/plugins/check_http.c | |||
@@ -1462,7 +1462,13 @@ char *unchunk_content(const char *content) { | |||
1462 | memcpy(result + (overall_size - size_of_chunk), start_of_chunk, size_of_chunk); | 1462 | memcpy(result + (overall_size - size_of_chunk), start_of_chunk, size_of_chunk); |
1463 | } | 1463 | } |
1464 | 1464 | ||
1465 | result[overall_size] = '\0'; | 1465 | if (overall_size == 0 && result == NULL) { |
1466 | // We might just have received the end chunk without previous content, so result is never allocated | ||
1467 | result = calloc(1, sizeof(char)); | ||
1468 | // No error handling here, we can only return NULL anyway | ||
1469 | } else { | ||
1470 | result[overall_size] = '\0'; | ||
1471 | } | ||
1466 | return result; | 1472 | return result; |
1467 | } | 1473 | } |
1468 | 1474 | ||
diff --git a/plugins/tests/check_http.t b/plugins/tests/check_http.t index d766ac3..6078b27 100755 --- a/plugins/tests/check_http.t +++ b/plugins/tests/check_http.t | |||
@@ -9,12 +9,14 @@ use strict; | |||
9 | use Test::More; | 9 | use Test::More; |
10 | use NPTest; | 10 | use NPTest; |
11 | use FindBin qw($Bin); | 11 | use FindBin qw($Bin); |
12 | use IO::Socket::INET; | ||
12 | 13 | ||
13 | $ENV{'LC_TIME'} = "C"; | 14 | $ENV{'LC_TIME'} = "C"; |
14 | 15 | ||
15 | my $common_tests = 71; | 16 | my $common_tests = 71; |
16 | my $virtual_port_tests = 8; | 17 | my $virtual_port_tests = 8; |
17 | my $ssl_only_tests = 12; | 18 | my $ssl_only_tests = 12; |
19 | my $chunked_encoding_special_tests = 1; | ||
18 | # Check that all dependent modules are available | 20 | # Check that all dependent modules are available |
19 | eval "use HTTP::Daemon 6.01;"; | 21 | eval "use HTTP::Daemon 6.01;"; |
20 | plan skip_all => 'HTTP::Daemon >= 6.01 required' if $@; | 22 | plan skip_all => 'HTTP::Daemon >= 6.01 required' if $@; |
@@ -30,7 +32,7 @@ if ($@) { | |||
30 | plan skip_all => "Missing required module for test: $@"; | 32 | plan skip_all => "Missing required module for test: $@"; |
31 | } else { | 33 | } else { |
32 | if (-x "./$plugin") { | 34 | if (-x "./$plugin") { |
33 | plan tests => $common_tests * 2 + $ssl_only_tests + $virtual_port_tests; | 35 | plan tests => $common_tests * 2 + $ssl_only_tests + $virtual_port_tests + $chunked_encoding_special_tests; |
34 | } else { | 36 | } else { |
35 | plan skip_all => "No $plugin compiled"; | 37 | plan skip_all => "No $plugin compiled"; |
36 | } | 38 | } |
@@ -51,6 +53,7 @@ my $port_http = 50000 + int(rand(1000)); | |||
51 | my $port_https = $port_http + 1; | 53 | my $port_https = $port_http + 1; |
52 | my $port_https_expired = $port_http + 2; | 54 | my $port_https_expired = $port_http + 2; |
53 | my $port_https_clientcert = $port_http + 3; | 55 | my $port_https_clientcert = $port_http + 3; |
56 | my $port_hacked_http = $port_http + 4; | ||
54 | 57 | ||
55 | # This array keeps sockets around for implementing timeouts | 58 | # This array keeps sockets around for implementing timeouts |
56 | my @persist; | 59 | my @persist; |
@@ -72,6 +75,28 @@ if (!$pid) { | |||
72 | } | 75 | } |
73 | push @pids, $pid; | 76 | push @pids, $pid; |
74 | 77 | ||
78 | # Fork the hacked HTTP server | ||
79 | undef $pid; | ||
80 | $pid = fork; | ||
81 | defined $pid or die "Failed to fork"; | ||
82 | if (!$pid) { | ||
83 | # this is the fork | ||
84 | undef @pids; | ||
85 | my $socket = new IO::Socket::INET ( | ||
86 | LocalHost => '0.0.0.0', | ||
87 | LocalPort => $port_hacked_http, | ||
88 | Proto => 'tcp', | ||
89 | Listen => 5, | ||
90 | Reuse => 1 | ||
91 | ); | ||
92 | die "cannot create socket $!n" unless $socket; | ||
93 | my $local_sock = $socket->sockport(); | ||
94 | print "server waiting for client connection on port $local_sock\n"; | ||
95 | run_hacked_http_server ( $socket ); | ||
96 | die "hacked http server stopped"; | ||
97 | } | ||
98 | push @pids, $pid; | ||
99 | |||
75 | if (exists $servers->{https}) { | 100 | if (exists $servers->{https}) { |
76 | # Fork a normal HTTPS server | 101 | # Fork a normal HTTPS server |
77 | $pid = fork; | 102 | $pid = fork; |
@@ -207,6 +232,37 @@ sub run_server { | |||
207 | } | 232 | } |
208 | } | 233 | } |
209 | 234 | ||
235 | sub run_hacked_http_server { | ||
236 | my $socket = shift; | ||
237 | |||
238 | # auto-flush on socket | ||
239 | $| = 1; | ||
240 | |||
241 | |||
242 | while(1) | ||
243 | { | ||
244 | # waiting for a new client connection | ||
245 | my $client_socket = $socket->accept(); | ||
246 | |||
247 | # get information about a newly connected client | ||
248 | my $client_address = $client_socket->peerhost(); | ||
249 | my $client_portn = $client_socket->peerport(); | ||
250 | print "connection from $client_address:$client_portn"; | ||
251 | |||
252 | # read up to 1024 characters from the connected client | ||
253 | my $data = ""; | ||
254 | $client_socket->recv($data, 1024); | ||
255 | print "received data: $data"; | ||
256 | |||
257 | # write response data to the connected client | ||
258 | $data = "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n"; | ||
259 | $client_socket->send($data); | ||
260 | |||
261 | # notify client that response has been sent | ||
262 | shutdown($client_socket, 1); | ||
263 | } | ||
264 | } | ||
265 | |||
210 | END { | 266 | END { |
211 | foreach my $pid (@pids) { | 267 | foreach my $pid (@pids) { |
212 | if ($pid) { print "Killing $pid\n"; kill "INT", $pid } | 268 | if ($pid) { print "Killing $pid\n"; kill "INT", $pid } |
@@ -222,6 +278,7 @@ if ($ARGV[0] && $ARGV[0] eq "-d") { | |||
222 | my $result; | 278 | my $result; |
223 | my $command = "./$plugin -H 127.0.0.1"; | 279 | my $command = "./$plugin -H 127.0.0.1"; |
224 | 280 | ||
281 | run_chunked_encoding_special_test( {command => "$command -p $port_hacked_http"}); | ||
225 | run_common_tests( { command => "$command -p $port_http" } ); | 282 | run_common_tests( { command => "$command -p $port_http" } ); |
226 | SKIP: { | 283 | SKIP: { |
227 | skip "HTTP::Daemon::SSL not installed", $common_tests + $ssl_only_tests if ! exists $servers->{https}; | 284 | skip "HTTP::Daemon::SSL not installed", $common_tests + $ssl_only_tests if ! exists $servers->{https}; |
@@ -511,3 +568,14 @@ sub run_common_tests { | |||
511 | }; | 568 | }; |
512 | is( $@, "", $cmd ); | 569 | is( $@, "", $cmd ); |
513 | } | 570 | } |
571 | |||
572 | sub run_chunked_encoding_special_test { | ||
573 | my ($opts) = @_; | ||
574 | my $command = $opts->{command}; | ||
575 | |||
576 | $cmd = "$command -u / -s 'ChunkedEncodingSpecialTest'"; | ||
577 | eval { | ||
578 | $result = NPTest->testCmd( $cmd, 5 ); | ||
579 | }; | ||
580 | is( $@, "", $cmd ); | ||
581 | } | ||