webdis (0.1.4+dfsg-2) unstable; urgency=medium
authorSandro Tosi <morph@debian.org>
Fri, 10 Apr 2020 06:40:29 +0000 (07:40 +0100)
committerSandro Tosi <morph@debian.org>
Fri, 10 Apr 2020 06:40:29 +0000 (07:40 +0100)
  * Post unittests to python3; Closes: #943271, #951624

[dgit import unpatched webdis 0.1.4+dfsg-2]

32 files changed:
1  2 
debian/changelog
debian/compat
debian/control
debian/copyright
debian/docs
debian/patches/fix-test-new-libevent.patch
debian/patches/msgpack-clib.patch
debian/patches/msgpack-compat.patch
debian/patches/msgpack-pkgconfig.patch
debian/patches/print-listen-port-number.patch
debian/patches/python3.patch
debian/patches/series
debian/patches/tests.patch
debian/redis-test.conf
debian/rules
debian/source/format
debian/test.sh
debian/tests/control
debian/tests/webdis
debian/watch
debian/webdis-test.json
debian/webdis.1
debian/webdis.default
debian/webdis.dirs
debian/webdis.init
debian/webdis.install
debian/webdis.json
debian/webdis.logrotate
debian/webdis.manpages
debian/webdis.postinst
debian/webdis.postrm
debian/webdis.service

index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..886c9fdd2f3960276b9dd406da9410c15ec666a3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,84 @@@
++webdis (0.1.4+dfsg-2) unstable; urgency=medium
++
++  * Post unittests to python3; Closes: #943271, #951624
++
++ -- Sandro Tosi <morph@debian.org>  Fri, 10 Apr 2020 02:40:29 -0400
++
++webdis (0.1.4+dfsg-1) unstable; urgency=medium
++
++  * New upstream version 0.1.4+dfsg
++  * d/control, d/copyright: update maintainers email and proper name spelling.
++  * Raise compat level to 11.
++  * d/control: remove explicit *-dbg package definition.
++  * d/control: bump Standards-Version to 4.2.0.
++  * d/control: update Vcs-* fields to point to salsa.d.o.
++  * d/control: add Rules-Requires-Root header set to no.
++  * d/control: add direct build dependency on pkg-config.
++  * d/webdis.install: no need to explicitly install webdis binary.
++  * d/rules: remove DESTDIR and CONFDIR vars setup by hand.
++  * d/rules: avoid installing webdis.prod.json from upstream.
++  * d/control, d/rules: remove trailing whitespace.
++  * d/control: remote unnecessary Testsuite header.
++  * d/copyright: use https protocol.
++  * Add systemd service configuration.
++  * d/patches/fix-test-new-libevent.patch: fix pubsub test when compiled w/
++    libevent 2.1.x. (Closes: #869951, #901555)
++  * d/rules: use /usr/share/dpkg/buildflags.mk to populate build flags.
++  * Fix lintian typo check
++
++ -- Andrii Senkovych <andrii@senkovych.com>  Sun, 26 Aug 2018 15:30:36 +0300
++
++webdis (0.1.2+dfsg-2) unstable; urgency=medium
++
++  * Update testsuite variable names. Fixup to sockstat
++  * Remove dependency on netstat or sockstat to run the tests
++
++ -- Andriy Senkovych <jolly_roger@itblog.org.ua>  Thu, 17 Nov 2016 00:46:01 +0200
++
++webdis (0.1.2+dfsg-1) unstable; urgency=medium
++
++  * New upstream version 0.1.2+dfsg
++  * Move repository to collab-maint on alioth
++  * Repack upstream tarball to remove hiredis, jansson and b64 copies
++  * Drop copyright notices for removed libraries
++  * Update Standards-Version to 3.9.8. No changes required
++  * Raise compat level to 10
++  * Add explicit dependency on lsb-base
++  * Enable all hardening features during build
++
++ -- Andriy Senkovych <jolly_roger@itblog.org.ua>  Thu, 10 Nov 2016 01:36:21 +0200
++
++webdis (0.1.1-2.2) unstable; urgency=medium
++
++  * Non-maintainer upload.
++  * Fix FTBFS with recent msgpack-c versions.  (Closes: #811343)
++    + Use pkg-config to determine CFLAGS/LDFLAGS
++      - Search for msgpackc library in both MA and non-MA directories to ease
++        backports
++    + Use different APIs for the RAW type, based on the version of msgpack-c
++
++ -- James McCoy <jamessan@debian.org>  Thu, 21 Jul 2016 23:43:34 -0400
++
++webdis (0.1.1-2.1) unstable; urgency=medium
++
++  * Non-maintainer upload.
++  * Remove embedded code copies (hiredis, jansson) in the clean target
++    to make sure not to use them; this notably fixes the FTBFS during
++    the libhiredis0.10 → libhiredis0.13 transition (Closes: #785476).
++
++ -- Cyril Brulebois <kibi@debian.org>  Tue, 14 Jul 2015 18:32:13 +0200
++
++webdis (0.1.1-2) unstable; urgency=medium
++
++  * Use correct license names in debian/copyright
++  * Document hiredis and jansson libraries
++  * Add autopkgtest support
++  * Update Standards-Version to 3.9.6. No changes required
++
++ -- Andriy Senkovych <jolly_roger@itblog.org.ua>  Fri, 24 Oct 2014 22:48:16 +0300
++
++webdis (0.1.1-1) unstable; urgency=low
++
++  * Initial release (Closes: #623528)
++
++ -- Andriy Senkovych <jolly_roger@itblog.org.ua>  Mon, 04 Aug 2014 02:10:55 +0300
diff --cc debian/compat
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b4de3947675361a7770d29b8982c407b0ec6b2a0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++11
diff --cc debian/control
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..a3418d877b8a7f62a6e087f6ba1c12f9e7786bb0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,44 @@@
++Source: webdis
++Section: web
++Priority: optional
++Maintainer: Andrii Senkovych <andrii@senkovych.com>
++Build-Depends: debhelper (>= 11~),
++    libevent-dev (>= 1.4.13),
++    libhiredis-dev (>= 0.10),
++    libjansson-dev (>= 1.3),
++    libb64-dev (>= 1.2),
++    libmsgpack-dev,
++    redis-server,
++    pkg-config,
++    python3,
++Standards-Version: 4.2.0
++Vcs-Git: https://salsa.debian.org/debian/webdis.git
++Vcs-Browser: https://salsa.debian.org/debian/webdis
++Homepage: http://webd.is
++Rules-Requires-Root: no
++
++Package: webdis
++Architecture: any
++Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lsb-base (>= 3.0-6)
++Suggests: redis-server
++Description: simple web server providing an HTTP interface to Redis
++ Webdis is a simple web server providing HTTP interface to Redis. Some features
++ include:
++  * Support for GET and POST requests.
++  * JSON output by default, optional JSONP parameter (?jsonp=myFunction).
++  * Raw Redis 2.0 protocol output with .raw suffix
++  * HTTP 1.1 pipelining (50,000 http requests per second on a desktop Linux
++    machine.)
++  * Restricted commands by IP range (CIDR subnet + mask) or HTTP Basic Auth,
++    returning 403 errors.
++  * Possible Redis authentication in the config file.
++  * Pub/Sub using Transfer-Encoding: chunked, works with JSONP as well. Webdis
++    can be used as a Comet server.
++  * Custom Content-Type using a pre-defined file extension, or with
++    ?type=some/thing.
++  * URL-encoded parameters for binary data or slashes.
++  * Logs, with a configurable verbosity.
++  * Cross-origin XHR, if compiled with libevent2 (for OPTIONS support).
++  * File upload with PUT.
++  * With the JSON output, the return value of INFO is parsed and transformed
++    into an object.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..aba5408178c2831a5c45425031fac2d2bf0ab516
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,104 @@@
++Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
++Upstream-Name: webdis
++Upstream-Contact: Nicolas Favre-Félix <n.favrefelix@gmail.com>
++Source: https://github.com/nicolasff/webdis/blob/master/COPYING
++Files-Excluded: jansson/* hiredis/* b64/*
++Comment: source tarball is repacked with +dfsg suffix to remove convenience
++ copies of the hiredis, jansson and b64 libraries that are already packaged in
++ Debian.
++
++Files: *
++Copyright: 2010-2011, Nicolas Favre-Felix <n.favrefelix@gmail.com>
++License: bsd-2-clause
++ Redistribution and use in source and binary forms, with or without modification,
++ are permitted provided that the following conditions are met:
++ . 
++  * Redistributions of source code must retain the above copyright notice,
++    this list of conditions and the following disclaimer.
++  * Redistributions in binary form must reproduce the above copyright notice,
++    this list of conditions and the following disclaimer in the documentation
++    and/or other materials provided with the distribution.
++ . 
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
++ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
++ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
++ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
++ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
++ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++Files: debian/*
++Copyright: 2011-2018, Andrii Senkovych <andrii@senkovych.com>
++License: GPL-2+
++ This package 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 package 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 complete text of the GNU General
++ Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
++
++Files: md5/*
++Copyright: 1999, 2000, 2002, Aladdin Enterprises
++           1999, 2000, 2002, L. Peter Deutsch <ghost@aladdin.com>
++License: bsd-3-clause
++ This software is provided 'as-is', without any express or implied
++ warranty.  In no event will the authors be held liable for any damages
++ arising from the use of this software.
++ .
++ Permission is granted to anyone to use this software for any purpose,
++ including commercial applications, and to alter it and redistribute it
++ freely, subject to the following restrictions:
++ .
++ 1. The origin of this software must not be misrepresented; you must not
++    claim that you wrote the original software. If you use this software
++    in a product, an acknowledgment in the product documentation would be
++    appreciated but is not required.
++ 2. Altered source versions must be plainly marked as such, and must not be
++    misrepresented as being the original software.
++ 3. This notice may not be removed or altered from any source distribution.
++
++Files: sha1/*
++Copyright: 1998, 2009, Paul E. Jones <paulej@packetizer.com>
++License: FPL
++ This software is licensed as "freeware."  Permission to distribute
++ this software in source and binary forms, including incorporation 
++ into other products, is hereby granted without a fee.  THIS SOFTWARE 
++ IS PROVIDED 'AS IS' AND WITHOUT ANY EXPRESSED OR IMPLIED WARRANTIES, 
++ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
++ AND FITNESS FOR A PARTICULAR PURPOSE.  THE AUTHOR SHALL NOT BE HELD 
++ LIABLE FOR ANY DAMAGES RESULTING FROM THE USE OF THIS SOFTWARE, EITHER 
++ DIRECTLY OR INDIRECTLY, INCLUDING, BUT NOT LIMITED TO, LOSS OF DATA 
++ OR DATA BEING RENDERED INACCURATE.
++
++Files: http-parser/*
++Copyright: 2009, 2010, Ryan Dahl <ry@tinyclouds.org>
++License: MIT
++ Permission is hereby granted, free of charge, to any person obtaining a copy
++ of this software and associated documentation files (the "Software"), to
++ deal in the Software without restriction, including without limitation the
++ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
++ sell copies of the Software, and to permit persons to whom the Software is
++ furnished to do so, subject to the following conditions:
++ .
++ The above copyright notice and this permission notice shall be included in
++ all copies or substantial portions of the Software.
++ .
++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
++ IN THE SOFTWARE.
diff --cc debian/docs
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8d526b990ffce78ebf981cac81ebcc125f9f5b26
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++README.markdown
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1614a856b08c33b174d212ca014d2f73fc1cec65
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,68 @@@
++Description: Fix pubsub test when compiled w/ libevent 2.1.x
++ The pubsub test hangs in the infinite loop due to changes in the libevent2.x
++ compared to the previous version. This patch makes test pass again.
++Author: Oleksandr Senkovych <bjsenya@gmail.com>
++Bug: https://github.com/nicolasff/webdis/issues/149
++Last-Update: 2018-08-25
++
++diff --git a/tests/pubsub.c b/tests/pubsub.c
++index f4a3451..2426ba9 100644
++--- a/tests/pubsub.c
+++++ b/tests/pubsub.c
++@@ -82,6 +82,23 @@ reader_http_request(struct cx *c, const char* buffer, const char *limit) {
++      }
++ }
++ 
+++/*
+++ * prepare an event structure(s)
+++ */
+++void
+++cx_init(struct cx* c)
+++{
+++     if(c->read_fun) { /* attach callback for read. */
+++             event_set(&c->evr, c->fd, EV_READ, c->read_fun, c);
+++             event_base_set(c->base, &c->evr);
+++     }
+++
+++     if(c->write_fun) { /* attach callback for write. */
+++             event_set(&c->evw, c->fd, EV_WRITE, c->write_fun, c);
+++             event_base_set(c->base, &c->evw);
+++     }
+++}
+++
++ /**
++  * (re)install connection in the event loop.
++  */
++@@ -89,16 +106,11 @@ void
++ cx_install(struct cx *c) {
++ 
++      if(c->read_fun) { /* attach callback for read. */
++-             event_set(&c->evr, c->fd, EV_READ, c->read_fun, c);
++-             event_base_set(c->base, &c->evr);
++              event_add(&c->evr, NULL);
++      }
++      if(c->write_fun) { /* attach callback for write. */
++-             event_set(&c->evw, c->fd, EV_WRITE, c->write_fun, c);
++-             event_base_set(c->base, &c->evw);
++              event_add(&c->evw, NULL);
++      }
++-
++ }
++ 
++ /**
++@@ -160,6 +172,7 @@ reader_new(struct event_base *base, const char *host, short port, int total, int
++      reader_http_request(c, c->http_request, "{\"SUBSCRIBE\":[\"subscribe\"");
++ 
++      /* add to the event loop. */
+++     cx_init(c);
++      cx_install(c);
++ }
++ 
++@@ -209,6 +222,7 @@ writer_new(struct event_base *base, const char *host, short port, int chan) {
++      sprintf(c->http_request, "GET /PUBLISH/chan:%d/hi HTTP/1.1\r\n\r\n", chan);
++      reader_http_request(c, c->http_request, "{\"PUBLISH\":");
++ 
+++     cx_init(c);
++      cx_install(c);
++ }
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2ea2b26b63f70d71626b6bfbd15215b8ff454837
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,36 @@@
++From 2a8908bdcf89b1cc8a332033bc9f8971b82438a3 Mon Sep 17 00:00:00 2001
++From: James McCoy <jamessan@jamessan.com>
++Date: Thu, 21 Jul 2016 23:30:32 -0400
++Subject: [PATCH] Find libmsgpackc in Multi-Arch library paths
++
++The msgpack library may be present in /usr/lib or /usr/lib/$arch,
++but only the former is being searched.  Check both places and fix the
++library name to use the C lib (libmsgpackc) rather than the C++ lib
++(libmsgpack).
++
++Signed-off-by: James McCoy <jamessan@jamessan.com>
++---
++ Makefile | 4 ++--
++ 1 file changed, 2 insertions(+), 2 deletions(-)
++
++diff --git a/Makefile b/Makefile
++index 40a7787..11bd9cd 100644
++--- a/Makefile
+++++ b/Makefile
++@@ -14,11 +14,11 @@ ifneq ($(findstring yes,$(shell pkg-config --exists msgpack && echo yes)),)
++      CFLAGS += -DMSGPACK=1 $(shell pkg-config --cflags msgpack)
++      LDFLAGS += $(shell pkg-config --libs msgpack)
++ else
++-     MSGPACK_LIB=$(shell ls /usr/lib/libmsgpack.so 2>/dev/null)
+++     MSGPACK_LIB=$(shell ls /usr/lib/libmsgpackc.so /usr/lib/*/libmsgpackc.so 2>/dev/null)
++      ifneq ($(strip $(MSGPACK_LIB)),)
++              FORMAT_OBJS += formats/msgpack.o
++              CFLAGS += -DMSGPACK=1
++-             LDFLAGS += -lmsgpack
+++             LDFLAGS += -lmsgpackc
++      endif
++ endif
++ 
++-- 
++2.8.1
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..227ea313521b21f3984c0db916dac9ea82d16289
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,42 @@@
++From 7526080ac6f1c08584688ac568da9ce25024cf59 Mon Sep 17 00:00:00 2001
++From: James McCoy <jamessan@jamessan.com>
++Date: Wed, 15 Jun 2016 09:26:20 -0400
++Subject: [PATCH] Use msgpack_pack_v4raw(_body) with new msgpack-c versions
++
++In msgpack-c's 1.0.0 release, the code was changed to be compatible with
++the v5 msgpack spec, specifically separating out the STR and BIN types
++as replacements for the old RAW type.
++
++While the STR type is likely the right replacement type to use, it does
++introduce a str 8 variant that wasn't present for the old RAW type.  For
++better compatibility, the msgpack_pack_v4raw functions were added to
++directly map to the old functionality.
++
++Signed-off-by: James McCoy <jamessan@jamessan.com>
++---
++ formats/msgpack.c | 12 ++++++++++++
++ 1 file changed, 12 insertions(+)
++
++diff --git a/formats/msgpack.c b/formats/msgpack.c
++index dc1ab0c..a3abc8b 100644
++--- a/formats/msgpack.c
+++++ b/formats/msgpack.c
++@@ -8,6 +8,18 @@
++ #include <hiredis/hiredis.h>
++ #include <hiredis/async.h>
++ 
+++/* msgpack-c versions >= 1.0 changed to support the v5 msgpack spec.
+++ * As part of doing this, the (un)pack_raw functions were replaced with
+++ * more explicit (un)pack_str and (un)pack_bin.  1.2.0 introduced the
+++ * (un)pack_v4raw functions to retain compatibility.
+++ */
+++#if defined(MSGPACK_VERSION_MAJOR) && defined(MSGPACK_VERSION_MINOR) \
+++     && MSGPACK_VERSION_MAJOR > 1 \
+++     || (MSGPACK_VERSION_MAJOR == 1 && MSGPACK_VERSION_MINOR >= 2)
+++#define msgpack_pack_raw msgpack_pack_v4raw
+++#define msgpack_pack_raw_body msgpack_pack_v4raw_body
+++#endif
+++
++ struct msg_out {
++      char *p;
++      size_t sz;
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9294fa82c52cd598ef3bab14ca824179a6deca21
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,39 @@@
++From ca170bcced750629ef65e66c6a5b1642cb3ddde0 Mon Sep 17 00:00:00 2001
++From: James McCoy <jamessan@jamessan.com>
++Date: Wed, 15 Jun 2016 09:06:50 -0400
++Subject: [PATCH] Use pkg-config to find msgpack library when available
++
++Since 0.5.8, msgpack-c has provided a pkg-config file.  If it's
++installed, use pkg-config to get the relevant CFLAGS/LDFLAGS.
++
++Signed-off-by: James McCoy <jamessan@jamessan.com>
++---
++ Makefile | 14 ++++++++++----
++ 1 file changed, 10 insertions(+), 4 deletions(-)
++
++diff --git a/Makefile b/Makefile
++index e29ad4b..40a7787 100644
++--- a/Makefile
+++++ b/Makefile
++@@ -9,11 +9,17 @@ CFLAGS ?= -O0 -ggdb -Wall -Wextra -I. -Ijansson/src -Ihttp-parser
++ LDFLAGS ?= -levent -pthread
++ 
++ # check for MessagePack
++-MSGPACK_LIB=$(shell ls /usr/lib/libmsgpack.so 2>/dev/null)
++-ifneq ($(strip $(MSGPACK_LIB)),)
+++ifneq ($(findstring yes,$(shell pkg-config --exists msgpack && echo yes)),)
++      FORMAT_OBJS += formats/msgpack.o
++-     CFLAGS += -DMSGPACK=1
++-     LDFLAGS += -lmsgpack
+++     CFLAGS += -DMSGPACK=1 $(shell pkg-config --cflags msgpack)
+++     LDFLAGS += $(shell pkg-config --libs msgpack)
+++else
+++     MSGPACK_LIB=$(shell ls /usr/lib/libmsgpack.so 2>/dev/null)
+++     ifneq ($(strip $(MSGPACK_LIB)),)
+++             FORMAT_OBJS += formats/msgpack.o
+++             CFLAGS += -DMSGPACK=1
+++             LDFLAGS += -lmsgpack
+++     endif
++ endif
++ 
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d148b0ee313560b03bf250222ccaa43005a29007
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,53 @@@
++Description: Print HTTP port number in the logs during startup
++ Current test suite allows dynamic HTTP port allocation for test purpose.
++ Once webdis is started it is possible to discover webdis' HTTP port using
++ netstat. However resent builds have shown that netstat has different options
++ for hurd and kfreebsd and thus tests are failed and the overall package build
++ is marked as failed as well. In order to overcome this I have tried to use
++ sockstat instead of netstat but bug #679876 renders sockstat unusable.
++ .
++ This patch removes the need to use netstat or sockstat to discover the port
++ number webdis is listening to and instead allows one to simply grep the
++ necessary info out of webdis logs.
++Author: Andrii Senkovych <andrii@senkovych.com>
++Last-Update: 2016-11-17
++Index: webdis/server.c
++===================================================================
++--- webdis.orig/server.c
+++++ webdis/server.c
++@@ -25,6 +25,7 @@ socket_setup(struct server *s, const cha
++ 
++      int reuse = 1;
++      struct sockaddr_in addr;
+++    socklen_t len = sizeof(addr);
++      int fd, ret;
++ 
++      memset(&addr, 0, sizeof(addr));
++@@ -60,7 +61,7 @@ socket_setup(struct server *s, const cha
++      }
++ 
++      /* bind */
++-     ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
+++     ret = bind(fd, (struct sockaddr*)&addr, len);
++      if (0 != ret) {
++              slog(s, WEBDIS_ERROR, strerror(errno), 0);
++              return -1;
++@@ -73,6 +74,18 @@ socket_setup(struct server *s, const cha
++              return -1;
++      }
++ 
+++    if (getsockname(fd, (struct sockaddr *)&addr, &len) != -1) {
+++        const char* comment = "Webdis listening on port %d";
+++        int port_num = ntohs(addr.sin_port);
+++
+++        char* buffer = malloc(strlen(comment) -2 + strlen("65535") + 1);
+++        sprintf(buffer, comment, port_num);
+++
+++             slog(s, WEBDIS_INFO, buffer , 0);
+++
+++        free(buffer);
+++    }
+++        
++      /* there you go, ready to accept! */
++      return fd;
++ }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e6a58a1bdc8e7b53751f46894a77ed1d722b901b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,286 @@@
++--- a/Makefile
+++++ b/Makefile
++@@ -63,8 +63,8 @@ WEBDIS_PORT ?= 7379
++ test_all: test perftest
++ 
++ test:
++-     python tests/basic.py
++-     python tests/limits.py
+++     python3 tests/basic.py
+++     python3 tests/limits.py
++      ./tests/pubsub -p $(WEBDIS_PORT)
++ 
++ perftest:
++--- a/tests/basic.py
+++++ b/tests/basic.py
++@@ -1,5 +1,5 @@
++ #!/usr/bin/python
++-import urllib2, unittest, json, hashlib
+++import urllib.request, urllib.error, urllib.parse, unittest, json, hashlib
++ from functools import wraps
++ try:
++      import msgpack
++@@ -16,15 +16,15 @@ class TestWebdis(unittest.TestCase):
++              return 'http://%s:%d/%s' % (host, port, url)
++ 
++      def query(self, url, data = None, headers={}):
++-             r = urllib2.Request(self.wrap(url), data, headers)
++-             return urllib2.urlopen(r)
+++             r = urllib.request.Request(self.wrap(url), data, headers)
+++             return urllib.request.urlopen(r)
++ 
++ class TestBasics(TestWebdis):
++ 
++      def test_crossdomain(self):
++              f = self.query('crossdomain.xml')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'application/xml')
++-             self.assertTrue("allow-access-from domain" in f.read())
+++             self.assertTrue(f.getheader('Content-Type') == 'application/xml')
+++             self.assertTrue(b"allow-access-from domain" in f.read())
++ 
++      def test_options(self):
++              pass
++@@ -42,25 +42,25 @@ class TestJSON(TestWebdis):
++              "success type (+OK)"
++              self.query('DEL/hello')
++              f = self.query('SET/hello/world')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'application/json')
++-             self.assertTrue(f.headers.getheader('ETag') == '"0db1124cf79ffeb80aff6d199d5822f8"')
++-             self.assertTrue(f.read() == '{"SET":[true,"OK"]}')
+++             self.assertTrue(f.getheader('Content-Type') == 'application/json')
+++             self.assertTrue(f.getheader('ETag') == '"0db1124cf79ffeb80aff6d199d5822f8"')
+++             self.assertTrue(f.read() == b'{"SET":[true,"OK"]}')
++ 
++      def test_get(self):
++              "string type"
++              self.query('SET/hello/world')
++              f = self.query('GET/hello')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'application/json')
++-             self.assertTrue(f.headers.getheader('ETag') == '"8cf38afc245b7a6a88696566483d1390"')
++-             self.assertTrue(f.read() == '{"GET":"world"}')
+++             self.assertTrue(f.getheader('Content-Type') == 'application/json')
+++             self.assertTrue(f.getheader('ETag') == '"8cf38afc245b7a6a88696566483d1390"')
+++             self.assertTrue(f.read() == b'{"GET":"world"}')
++ 
++      def test_incr(self):
++              "integer type"
++              self.query('DEL/hello')
++              f = self.query('INCR/hello')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'application/json')
++-             self.assertTrue(f.headers.getheader('ETag') == '"500e9bcdcbb1e98f25c1fbb880a96c99"')
++-             self.assertTrue(f.read() == '{"INCR":1}')
+++             self.assertTrue(f.getheader('Content-Type') == 'application/json')
+++             self.assertTrue(f.getheader('ETag') == '"500e9bcdcbb1e98f25c1fbb880a96c99"')
+++             self.assertTrue(f.read() == b'{"INCR":1}')
++ 
++      def test_list(self):
++              "list type"
++@@ -68,14 +68,14 @@ class TestJSON(TestWebdis):
++              self.query('RPUSH/hello/abc')
++              self.query('RPUSH/hello/def')
++              f = self.query('LRANGE/hello/0/-1')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'application/json')
++-             self.assertTrue(f.headers.getheader('ETag') == '"622e51f547a480bef7cf5452fb7782db"')
++-             self.assertTrue(f.read() == '{"LRANGE":["abc","def"]}')
+++             self.assertTrue(f.getheader('Content-Type') == 'application/json')
+++             self.assertTrue(f.getheader('ETag') == '"622e51f547a480bef7cf5452fb7782db"')
+++             self.assertTrue(f.read() == b'{"LRANGE":["abc","def"]}')
++ 
++      def test_error(self):
++              "error return type"
++              f = self.query('UNKNOWN/COMMAND')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'application/json')
+++             self.assertTrue(f.getheader('Content-Type') == 'application/json')
++              try:
++                      obj = json.loads(f.read())
++              except:
++@@ -86,7 +86,7 @@ class TestJSON(TestWebdis):
++              self.assertTrue('UNKNOWN' in obj)
++              self.assertTrue(isinstance(obj['UNKNOWN'], list))
++              self.assertTrue(obj['UNKNOWN'][0] == False)
++-             self.assertTrue(isinstance(obj['UNKNOWN'][1], unicode))
+++             self.assertTrue(isinstance(obj['UNKNOWN'][1], str))
++ 
++ class TestCustom(TestWebdis):
++      def test_list(self):
++@@ -94,16 +94,16 @@ class TestCustom(TestWebdis):
++              self.query('DEL/hello')
++              self.query('RPUSH/hello/a/b/c')
++              f = self.query('LRANGE/hello/0/-1.txt')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'text/plain')
++-             self.assertTrue(f.read() == "abc")
+++             self.assertTrue(f.getheader('Content-Type') == 'text/plain')
+++             self.assertTrue(f.read() == b"abc")
++ 
++      def test_separator(self):
++              "Separator in list responses with custom format"
++              self.query('DEL/hello')
++              self.query('RPUSH/hello/a/b/c')
++              f = self.query('LRANGE/hello/0/-1.txt?sep=--')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'text/plain')
++-             self.assertTrue(f.read() == "a--b--c")
+++             self.assertTrue(f.getheader('Content-Type') == 'text/plain')
+++             self.assertTrue(f.read() == b"a--b--c")
++ 
++ class TestRaw(TestWebdis):
++ 
++@@ -111,20 +111,20 @@ class TestRaw(TestWebdis):
++              "success type (+OK)"
++              self.query('DEL/hello')
++              f = self.query('SET/hello/world.raw')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'binary/octet-stream')
++-             self.assertTrue(f.read() == "+OK\r\n")
+++             self.assertTrue(f.getheader('Content-Type') == 'binary/octet-stream')
+++             self.assertTrue(f.read() == b"+OK\r\n")
++ 
++      def test_get(self):
++              "string type"
++              self.query('SET/hello/world')
++              f = self.query('GET/hello.raw')
++-             self.assertTrue(f.read() == '$5\r\nworld\r\n')
+++             self.assertTrue(f.read() == b'$5\r\nworld\r\n')
++ 
++      def test_incr(self):
++              "integer type"
++              self.query('DEL/hello')
++              f = self.query('INCR/hello.raw')
++-             self.assertTrue(f.read() == ':1\r\n')
+++             self.assertTrue(f.read() == b':1\r\n')
++ 
++      def test_list(self):
++              "list type"
++@@ -132,12 +132,12 @@ class TestRaw(TestWebdis):
++              self.query('RPUSH/hello/abc')
++              self.query('RPUSH/hello/def')
++              f = self.query('LRANGE/hello/0/-1.raw')
++-             self.assertTrue(f.read() == "*2\r\n$3\r\nabc\r\n$3\r\ndef\r\n")
+++             self.assertTrue(f.read() == b"*2\r\n$3\r\nabc\r\n$3\r\ndef\r\n")
++ 
++      def test_error(self):
++              "error return type"
++              f = self.query('UNKNOWN/COMMAND.raw')
++-             self.assertTrue(f.read().startswith("-ERR "))
+++             self.assertTrue(f.read().startswith(b"-ERR "))
++ 
++ def need_msgpack(fn):
++      def wrapper(self):
++@@ -152,7 +152,7 @@ class TestMsgPack(TestWebdis):
++              "success type (+OK)"
++              self.query('DEL/hello')
++              f = self.query('SET/hello/world.msg')
++-             self.assertTrue(f.headers.getheader('Content-Type') == 'application/x-msgpack')
+++             self.assertTrue(f.getheader('Content-Type') == 'application/x-msgpack')
++              obj = msgpack.loads(f.read())
++              self.assertTrue(obj == {'SET': [True, 'OK']})
++ 
++@@ -197,19 +197,19 @@ class TestETag(TestWebdis):
++ 
++      def test_etag_match(self):
++              self.query('SET/hello/world')
++-             h = hashlib.md5("world").hexdigest()    # match Etag
+++             h = hashlib.md5("world".encode()).hexdigest()   # match Etag
++              try:
++                      f = self.query('GET/hello.txt', None, {'If-None-Match': '"'+ h +'"'})
++-             except urllib2.HTTPError as e:
+++             except urllib.error.HTTPError as e:
++                      self.assertTrue(e.code == 304)
++                      return
++              self.assertTrue(False) # we should have received a 304.
++ 
++      def test_etag_fail(self):
++              self.query('SET/hello/world')
++-             h = hashlib.md5("nonsense").hexdigest() # non-matching Etag
+++             h = hashlib.md5("nonsense".encode()).hexdigest()        # non-matching Etag
++              f = self.query('GET/hello.txt', None, {'If-None-Match': '"'+ h +'"'})
++-             self.assertTrue(f.read() == 'world')
+++             self.assertTrue(f.read() == b'world')
++ 
++ class TestDbSwitch(TestWebdis):
++      def test_db(self):
++@@ -217,11 +217,11 @@ class TestDbSwitch(TestWebdis):
++              self.query('0/SET/key/val0')
++              self.query('1/SET/key/val1')
++              f = self.query('0/GET/key.txt')
++-             self.assertTrue(f.read() == "val0")
+++             self.assertTrue(f.read() == b"val0")
++              f = self.query('1/GET/key.txt')
++-             self.assertTrue(f.read() == "val1")
+++             self.assertTrue(f.read() == b"val1")
++              f = self.query('GET/key.txt')
++-             self.assertTrue(f.read() == "val0")
+++             self.assertTrue(f.read() == b"val0")
++ 
++ if __name__ == '__main__':
++      unittest.main()
++--- a/tests/limits.py
+++++ b/tests/limits.py
++@@ -14,7 +14,7 @@ class BlockingSocket:
++              self.s.connect((HOST, PORT))
++ 
++      def recv(self):
++-             out = ""
+++             out = b""
++              while True:
++                      try:
++                              ret = self.s.recv(4096)
++@@ -25,7 +25,7 @@ class BlockingSocket:
++                      out += ret
++ 
++      def recv_until(self, limit):
++-             out = ""
+++             out = b""
++              while not limit in out:
++                      try:
++                              out += self.s.recv(4096)
++@@ -58,7 +58,7 @@ class LargeString:
++ 
++      def __getitem__(self, chunk):
++              if chunk.start > self.len:
++-                     return ""
+++                     return b""
++              if chunk.start + chunk.stop > self.len:
++                      return self.char * (self.len - chunk.start)
++              return self.char * chunk.stop
++@@ -75,31 +75,31 @@ class TestHugeUrl(TestSocket):
++      def test_huge_url(self):
++              n = 1024*1024*1024      # 1GB query-string
++ 
++-             start = "GET /GET/x"
++-             end = " HTTP/1.0\r\n\r\n"
+++             start = b"GET /GET/x"
+++             end = b" HTTP/1.0\r\n\r\n"
++ 
++              ok = self.s.send(start)
++-             fail1 = self.s.send(LargeString("A", n))
+++             fail1 = self.s.send(LargeString(b"A", n))
++              fail2 = self.s.send(end)
++              out = self.s.recv()
++ 
++              self.assertTrue(ok)
++-             self.assertTrue("400 Bad Request" in out)
+++             self.assertTrue(b"400 Bad Request" in out)
++ 
++      def test_huge_upload(self):
++              n = 1024*1024*1024      # upload 1GB
++ 
++-             start = "PUT /SET/x HTTP/1.0\r\n"\
++-             + ("Content-Length: %d\r\n" % (n))\
++-             + "Expect: 100-continue\r\n\r\n"
+++             start = b"PUT /SET/x HTTP/1.0\r\n"\
+++             + (b"Content-Length: %d\r\n" % (n))\
+++             + b"Expect: 100-continue\r\n\r\n"
++ 
++              ok = self.s.send(start)
++-             cont = self.s.recv_until("\r\n")
++-             fail = self.s.send(LargeString("A", n))
+++             cont = self.s.recv_until(b"\r\n")
+++             fail = self.s.send(LargeString(b"A", n))
++ 
++              self.assertTrue(ok)
++-             self.assertTrue("HTTP/1.1 100 Continue" in cont)
+++             self.assertTrue(b"HTTP/1.1 100 Continue" in cont)
++              self.assertFalse(fail)
++ 
++ if __name__ == '__main__':
++-     unittest.main()
+++     unittest.main(verbosity=5)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..61544039d8c7b5c6629be78e7589d6f9b95b5c44
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,7 @@@
++fix-test-new-libevent.patch
++print-listen-port-number.patch
++tests.patch
++msgpack-pkgconfig.patch
++msgpack-compat.patch
++msgpack-clib.patch
++python3.patch
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e3325c7d8b4126e54cae3d6377893c5caafa9cb8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,38 @@@
++Description: Pass tests with python-msgpack >= 0.3
++ Current test suite pass with python-msgpack v0.2 but fails with python-msgpack
++ v0.3 and later due to changes in the library. Currently Debian ships v0.3 
++ for jessie and wheezy-backports.
++Author: Andrii Senkovych <andrii@senkovych.com>
++Bug: https://github.com/nicolasff/webdis/issues/92
++Last-Update: 2014-08-03
++diff --git a/tests/basic.py b/tests/basic.py
++index 89d664e..c70babe 100755
++--- a/tests/basic.py
+++++ b/tests/basic.py
++@@ -154,7 +154,7 @@ class TestMsgPack(TestWebdis):
++              f = self.query('SET/hello/world.msg')
++              self.assertTrue(f.headers.getheader('Content-Type') == 'application/x-msgpack')
++              obj = msgpack.loads(f.read())
++-             self.assertTrue(obj == {'SET': (True, 'OK')})
+++             self.assertTrue(obj == {'SET': [True, 'OK']})
++ 
++      @need_msgpack
++      def test_get(self):
++@@ -180,7 +180,7 @@ class TestMsgPack(TestWebdis):
++              self.query('RPUSH/hello/def')
++              f = self.query('LRANGE/hello/0/-1.msg')
++              obj = msgpack.loads(f.read())
++-             self.assertTrue(obj == {'LRANGE': ('abc', 'def')})
+++             self.assertTrue(obj == {'LRANGE': ['abc', 'def']})
++ 
++      @need_msgpack
++      def test_error(self):
++@@ -189,7 +189,7 @@ class TestMsgPack(TestWebdis):
++              obj = msgpack.loads(f.read())
++              self.assertTrue('UNKNOWN' in obj)
++              self.assertTrue(isinstance(obj, dict))
++-             self.assertTrue(isinstance(obj['UNKNOWN'], tuple))
+++             self.assertTrue(isinstance(obj['UNKNOWN'], list))
++              self.assertTrue(obj['UNKNOWN'][0] == False)
++              self.assertTrue(isinstance(obj['UNKNOWN'][1], str))
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1bef2efa567c6b9181456172ceea99daf7c5e49b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++daemonize yes
++pidfile REDIS_PIDFILE
++port 0
++unixsocket REDIS_SOCK
diff --cc debian/rules
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c20ca363d83b0315e49ba88fe8cf22d81f34776d
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,40 @@@
++#!/usr/bin/make -f
++# -*- makefile -*-
++
++export DEB_BUILD_MAINT_OPTIONS=hardening=+bindnow
++include /usr/share/dpkg/buildflags.mk
++CFLAGS += $(CPPFLAGS)
++
++export PREFIX = /usr
++
++# Objects to be removed from build procedure
++export HIREDIS_OBJ=
++export JANSSON_OBJ=
++export B64_OBJS=
++
++export CFLAGS += -I. -Ihttp-parser
++export LDFLAGS += -levent -pthread -lhiredis -ljansson -lb64
++
++%:
++      dh $@
++
++override_dh_auto_build:
++      dh_auto_build
++      $(MAKE) -C tests pubsub websocket
++
++override_dh_auto_clean:
++      $(MAKE) clean
++      $(MAKE) -C tests clean
++      rm -f debian/files
++      dh_auto_clean
++
++override_dh_auto_install:
++      dh_auto_install
++      rm debian/webdis/etc/webdis.prod.json
++
++override_dh_auto_test:
++ifneq (,$(findstring nocheck, $(DEB_BUILD_OPTIONS)))
++      @echo "Skipping check (disabled in DEB_BUILD_OPTIONS)."
++else
++      $(CURDIR)/debian/test.sh $(MAKE) test
++endif
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..163aaf8d82b6c54f23c45f32895dbdfdcc27b047
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++3.0 (quilt)
diff --cc debian/test.sh
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..eff825544ce8b1f95a90e8a63dc3069472edc7be
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,78 @@@
++#!/bin/sh
++# This script runs redis server and webdis server and launches the test
++# suite. It avoids race condition while obtaining a port to listen by
++# binding to random available port. The port is then found via netstat -nlp
++# using PID-file.
++
++TMPDIR=`mktemp -d`
++
++WEBDIS_PIDFILE=${TMPDIR}/webdis.pid
++WEBDIS_CONFFILE=${TMPDIR}/webdis.json
++WEBDIS_LOGFILE=${TMPDIR}/webdis.log
++
++REDIS_CONFFILE=${TMPDIR}/redis.conf
++REDIS_PIDFILE=${TMPDIR}/redis.pid
++REDIS_SOCK=${TMPDIR}/redis.sock
++
++if [ -n "$WEBDIS_BIN" ] ; then
++    if [ ! -x "$WEBDIS_BIN" ] ; then
++        echo "webdis binary $WEBDIS_BIN is not executable" 
++        exit 1
++    fi
++else
++    WEBDIS_BIN="$PWD/webdis"
++fi
++
++set_up() {
++    echo "Generating config files.."
++      sed -e "s|REDIS_SOCK|${REDIS_SOCK}|" -e "s|WEBDIS_PIDFILE|${WEBDIS_PIDFILE}|" \
++        -e "s|WEBDIS_LOGFILE|${WEBDIS_LOGFILE}|" \
++        debian/webdis-test.json > ${WEBDIS_CONFFILE}
++      sed -e "s|REDIS_PIDFILE|${REDIS_PIDFILE}|" -e "s|REDIS_SOCK|${REDIS_SOCK}|" \
++        debian/redis-test.conf > ${REDIS_CONFFILE}
++
++    echo "Starting redis-server.."
++      /sbin/start-stop-daemon --start --verbose \
++              --pidfile ${REDIS_PIDFILE} \
++              --exec `which redis-server` -- ${REDIS_CONFFILE} || return 1
++
++    echo "Starting webdis.."
++      /sbin/start-stop-daemon --start --verbose \
++              --pidfile ${WEBDIS_PIDFILE} \
++              --exec $WEBDIS_BIN -- ${WEBDIS_CONFFILE} || return 2
++
++    WEBDIS_PID=`cat $WEBDIS_PIDFILE`
++    export WEBDIS_PORT=`grep -o 'listening on port.*$' ${WEBDIS_LOGFILE}| \
++        tail -1|cut -d " " -f 4`
++    [ "0$WEBDIS_PORT" -gt 0 ] || return 3
++    echo webdis is listening on port "$WEBDIS_PORT"
++}
++
++tear_down() {
++    echo "Shutting down webdis.."
++      /sbin/start-stop-daemon --stop --verbose \
++              --retry=TERM/1/KILL/1 \
++              --pidfile ${WEBDIS_PIDFILE} \
++              --name webdis
++    echo "Shutting down redis-server.."
++      /sbin/start-stop-daemon --stop --verbose \
++              --retry=TERM/1/KILL/1 \
++              --pidfile ${REDIS_PIDFILE} \
++              --name redis-server
++}
++
++if ! set_up ; then
++    echo "Setting up redis/webdis server FAILED."
++    tear_down
++    exit 1
++fi
++
++echo Running test commands: $*
++
++$*
++EXIT_CODE=$?
++
++tear_down
++rm -fR $TMPDIR
++
++exit $EXIT_CODE
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..af1bd109192d93a5999800eeaf1041714863401f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++Tests: webdis
++Depends: @, redis-server, build-essential, libevent-dev,
++ net-tools, python3
++Restrictions: isolation-container, allow-stderr
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..dc2cc9798cb3eaec00a80ec527d87605f0f17540
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++#!/bin/sh
++set -e
++
++make -C tests
++WEBDIS_BIN=/usr/bin/webdis debian/test.sh make test
diff --cc debian/watch
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9e0040ee5163a46840cc9d54551e2a3a43f04103
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++version=3
++opts=dversionmangle=s/\+(dfsg|ds)$//,repacksuffix=+dfsg \
++    https://github.com/nicolasff/webdis/releases \
++    .*\/([0-9.]+)\.tar\.gz
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..770295d6bf15b8358852938d37697269ce4d289f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,29 @@@
++{
++      "redis_host":   "REDIS_SOCK",
++
++      "http_host":    "127.0.0.1",
++      "http_port":    0,
++
++      "threads":      2,
++      "pool_size": 5,
++
++      "daemonize":    true,
++    "pidfile":       "WEBDIS_PIDFILE",
++      "websockets":   false,
++
++      "database":     0,
++
++      "acl": [
++              {
++                      "disabled":     ["DEBUG"]
++              },
++
++              {
++                      "http_basic_auth":      "user:password",
++                      "enabled":              ["DEBUG"]
++              }
++      ],
++
++        "verbosity": 3,
++        "logfile": "WEBDIS_LOGFILE"
++}
diff --cc debian/webdis.1
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..abb8d2979fbf2ddc364f896546e9cd68bb5cb313
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++.TH WEBDIS 1 "August 29, 2013"
++.SH NAME
++webdis \- fast HTTP interface for redis-server(1)
++.SH SYNOPSIS
++.B webdis
++.RI configfile
++.SH DESCRIPTION
++Webdis is a Webdis is a simple HTTP server which forwards commands to Redis and
++sends the reply back using a format of your choice. Accessing
++/COMMAND/arg0/arg1/.../argN[.ext] on Webdis executes the command on Redis and
++returns the response; the reply format can be changed with the optional
++extension (.json, .txt).
++.PP
++.SH OPTIONS
++.IP "configfile"
++Read options from specified configuration file.
++.SH NOTES
++On Debian GNU/Linux systems, \fBwebdis\fP is typically started via the
++\fB/etc/init.d/webdis\fP initscript, not manually. This defaults to using
++\fB/etc/webdis/webdis.json\fP as a configuration file.
++.SH AUTHOR
++\fBwebdis\fP was written by Nicolas Favre-Félix.
++.PP
++This manual page was written by Andrii Senkovych <andrii@senkovych.com> for the
++Debian project (but may be used by others).
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c764a073d3075b45fca8aba0b0c4ec22f0bc6949
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++# Webdis configuration file used at startup. 
++CONFFILE="/etc/webdis/webdis.json"
++
++# Additional options that are passed to the Daemon.
++DAEMON_OPTS=""
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6ded28a582b4e0aa382548f057c17aa8ed6d14f2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++/var/log/webdis
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..2eb72b9eb5c7266d94f7c8994d02cabd84f5a1ba
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,174 @@@
++#! /bin/sh
++### BEGIN INIT INFO
++# Provides:          webdis
++# Required-Start:    $local_fs $remote_fs
++# Required-Stop:     $local_fs $remote_fs
++# Should-Start:      redis-server
++# Should-Stop:       redis-server
++# Default-Start:     2 3 4 5
++# Default-Stop:      0 1 6
++# Short-Description: Starts webdis daemon
++# Description:       Starts webdis daemon
++### END INIT INFO
++
++# Do NOT "set -e"
++
++# PATH should only include /usr/* if it runs after the mountnfs.sh script
++PATH=/sbin:/usr/sbin:/bin:/usr/bin
++DESC="webdis server"
++NAME=webdis
++DAEMON=/usr/bin/$NAME
++PIDDIR=/var/run/$NAME
++PIDFILE=$PIDDIR/$NAME.pid
++SCRIPTNAME=/etc/init.d/$NAME
++USER=webdis
++CONFFILE="/etc/webdis/webdis.json"
++
++# Exit if the package is not installed
++[ -x "$DAEMON" ] || exit 0
++
++# Read configuration variable file if it is present
++[ -r /etc/default/$NAME ] && . /etc/default/$NAME
++
++# Define LSB log_* functions.
++# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
++# and status_of_proc is working.
++. /lib/lsb/init-functions
++
++#
++# Function that starts the daemon/service
++#
++do_start()
++{
++    if [ ! -e $PIDDIR ] ; then
++        mkdir $PIDDIR
++        chown webdis: $PIDDIR
++    elif [ ! -d $PIDDIR ] ; then
++        log_action_cont_msg \ $PIDDIR exists but is not a directory
++        return 2
++    fi
++      # Return
++      #   0 if daemon has been started
++      #   1 if daemon was already running
++      #   2 if daemon could not be started
++      start-stop-daemon --start --quiet --test \
++        --pidfile $PIDFILE \
++        --user $USER --chuid $USER \
++        --exec $DAEMON > /dev/null \
++              || return 1
++      /sbin/start-stop-daemon --start --quiet \
++              --pidfile $PIDFILE \
++        --user $USER --chuid $USER \
++        --exec $DAEMON -- $CONFFILE $DAEMON_OPTS\
++              || return 2
++      # Add code here, if necessary, that waits for the process to be ready
++      # to handle requests from services started subsequently which depend
++      # on this one.  As a last resort, sleep for some time.
++}
++
++#
++# Function that stops the daemon/service
++#
++do_stop()
++{
++      # Return
++      #   0 if daemon has been stopped
++      #   1 if daemon was already stopped
++      #   2 if daemon could not be stopped
++      #   other if a failure occurred
++      start-stop-daemon --stop --quiet \
++        --pidfile $PIDFILE \
++        --user $USER \
++        --retry=TERM/1/KILL/1 \
++        --name $NAME
++      RETVAL="$?"
++      [ "$RETVAL" = 2 ] && return 2
++      # Wait for children to finish too if this is a daemon that forks
++      # and if the daemon is only ever run from this initscript.
++      # If the above conditions are not satisfied then add some other code
++      # that waits for the process to drop all resources that could be
++      # needed by services started subsequently.  A last resort is to
++      # sleep for some time.
++      start-stop-daemon --stop --quiet --oknodo \
++        --pidfile $PIDIFLE \
++        --user $USER \
++        --retry=0/1/KILL/1 \
++        --exec $DAEMON
++      [ "$?" = 2 ] && return 2
++      # Many daemons don't delete their pidfiles when they exit.
++      rm -f $PIDFILE
++      return "$RETVAL"
++}
++
++#
++# Function that sends a SIGHUP to the daemon/service
++#
++do_reload() {
++      #
++      # If the daemon can reload its configuration without
++      # restarting (for example, when it is sent a SIGHUP),
++      # then implement that here.
++      #
++      start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
++      return 0
++}
++
++case "$1" in
++  start)
++      log_daemon_msg "Starting $DESC" "$NAME"
++      do_start
++      case "$?" in
++              0|1) log_end_msg 0 ;;
++              2) log_end_msg 1 ;;
++      esac
++      ;;
++  stop)
++      log_daemon_msg "Stopping $DESC" "$NAME"
++      do_stop
++      case "$?" in
++              0|1) log_end_msg 0 ;;
++              2) log_end_msg 1 ;;
++      esac
++      ;;
++  status)
++       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
++       ;;
++  #reload|force-reload)
++      #
++      # If do_reload() is not implemented then leave this commented out
++      # and leave 'force-reload' as an alias for 'restart'.
++      #
++      #log_daemon_msg "Reloading $DESC" "$NAME"
++      #do_reload
++      #log_end_msg $?
++      #;;
++  restart|force-reload)
++      #
++      # If the "reload" option is implemented then remove the
++      # 'force-reload' alias
++      #
++      log_daemon_msg "Restarting $DESC" "$NAME"
++      do_stop
++      case "$?" in
++        0|1)
++              do_start
++              case "$?" in
++                      0) log_end_msg 0 ;;
++                      1) log_end_msg 1 ;; # Old process is still running
++                      *) log_end_msg 1 ;; # Failed to start
++              esac
++              ;;
++        *)
++              # Failed to stop
++              log_end_msg 1
++              ;;
++      esac
++      ;;
++  *)
++      #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
++      echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
++      exit 3
++      ;;
++esac
++
++:
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9a94d95b6b6198e0c6809eed98bc1af0fb6817d8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/webdis.json /etc/webdis/
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..19a67a7646d71324cdf5a22027356c0efb5611a8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,29 @@@
++{
++    "redis_host": "127.0.0.1",
++
++    "redis_port": 6379,
++    "redis_auth": null,
++
++    "http_host": "127.0.0.1",
++    "http_port": 7379,
++    "threads": 2,
++
++    "daemonize": true,
++    "pidfile": "/var/run/webdis/webdis.pid",
++
++    "database": 0,
++
++    "acl": [
++        {
++            "disabled":["DEBUG"]
++        },
++
++        {
++            "http_basic_auth": "user:password",
++            "enabled": ["DEBUG"]
++        }
++    ],
++
++        "verbosity": 3,
++        "logfile": "/var/log/webdis/webdis.log"
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7ff7c3d2549764dd1b2022607c2e3eaf48a819b3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,11 @@@
++/var/log/webdis/webdis.log {
++    missingok
++    rotate 5
++    weekly
++    size 10M
++    compress
++    notifempty
++    postrotate
++        /usr/bin/killall -HUP webdis
++    endscript
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..d588228f0d7548ea8c58725f960e0a632bb94c91
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++debian/webdis.1
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8e0b4cb167625efc028f54a32ad32cdc75956d41
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,33 @@@
++#! /bin/sh
++
++set -e
++WEBDIS_LOG=/var/log/webdis
++
++case "$1" in
++    configure)
++          adduser --system --group \
++            --home /var/lib/webdis \
++            --no-create-home \
++            --gecos "webdis system user" \
++            --disabled-login \
++            --disabled-password webdis
++        if ! dpkg-statoverride --list $WEBDIS_LOG >/dev/null 2>&1 ; then
++            dpkg-statoverride --update --add webdis webdis 0750 $WEBDIS_LOG
++        fi
++    ;;
++
++    abort-upgrade|abort-remove|abort-deconfigure)
++
++    ;;
++
++    *)
++        echo "postinst called with unknown argument \`$1'" >&2
++        exit 1
++    ;;
++esac
++
++#DEBHELPER#
++
++exit 0
++
++
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..416644b0cfd3999c0295008395855bbb7d0cee05
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,29 @@@
++#! /bin/sh
++
++set -e
++WEBDIS_LOG=/var/log/webdis
++
++case "$1" in
++    upgrade|failed-upgrade|abort-install|abort-upgrade|disappear|remove)
++        ;;
++
++    purge)
++        # Since no data is stored in the webdis home directory, the package is
++        # not affected by bug #621833 and thus homedir can be safely removed
++        if dpkg-statoverride --list $WEBDIS_LOG >/dev/null 2>&1 ; then
++            dpkg-statoverride --remove /var/log/webdis
++        fi
++        rm -rf $WEBDIS_LOG
++
++        deluser --system webdis
++        ;;
++
++    *)
++        echo "postrm called with unknown argument \`$1'" >&2
++        exit 1
++
++esac
++
++#DEBHELPER#
++
++exit 0
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ac958c63d855c7d3839823a8439f39896c861aa2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,21 @@@
++[Unit]
++Description=Webdis service, an HTTP interface to Redis
++After=network.target redis-server.service
++Documentation=man:webdis(1)
++Documentation=https://webd.is
++
++[Service]
++Type=forking
++WorkingDirectory=/
++ExecStartPre=mkdir /var/run/webdis
++ExecStartPre=chown webdis: /var/run/webdis
++ExecStart=/usr/bin/webdis /etc/webdis/webdis.json
++User=webdis
++Group=webdis
++PermissionsStartOnly=true
++PIDFile=/var/run/webdis/webdis.pid
++KillMode=process
++StandardOutput=journal
++
++[Install]
++WantedBy=multi-user.target