From: Sandro Tosi Date: Fri, 10 Apr 2020 06:40:29 +0000 (+0100) Subject: webdis (0.1.4+dfsg-2) unstable; urgency=medium X-Git-Tag: archive/raspbian/0.1.4+dfsg-2+rpi1^2~8 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=5043bae518701a8f9c98c2d290c778d129736575;p=webdis.git webdis (0.1.4+dfsg-2) unstable; urgency=medium * Post unittests to python3; Closes: #943271, #951624 [dgit import unpatched webdis 0.1.4+dfsg-2] --- 5043bae518701a8f9c98c2d290c778d129736575 diff --cc debian/changelog index 0000000,0000000..886c9fd new file mode 100644 --- /dev/null +++ b/debian/changelog @@@ -1,0 -1,0 +1,84 @@@ ++webdis (0.1.4+dfsg-2) unstable; urgency=medium ++ ++ * Post unittests to python3; Closes: #943271, #951624 ++ ++ -- Sandro Tosi 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 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 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 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 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 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 Fri, 24 Oct 2014 22:48:16 +0300 ++ ++webdis (0.1.1-1) unstable; urgency=low ++ ++ * Initial release (Closes: #623528) ++ ++ -- Andriy Senkovych Mon, 04 Aug 2014 02:10:55 +0300 diff --cc debian/compat index 0000000,0000000..b4de394 new file mode 100644 --- /dev/null +++ b/debian/compat @@@ -1,0 -1,0 +1,1 @@@ ++11 diff --cc debian/control index 0000000,0000000..a3418d8 new file mode 100644 --- /dev/null +++ b/debian/control @@@ -1,0 -1,0 +1,44 @@@ ++Source: webdis ++Section: web ++Priority: optional ++Maintainer: Andrii Senkovych ++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. diff --cc debian/copyright index 0000000,0000000..aba5408 new file mode 100644 --- /dev/null +++ b/debian/copyright @@@ -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 ++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 ++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 ++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 ++ . ++ 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 ++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 ++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 ++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 0000000,0000000..8d526b9 new file mode 100644 --- /dev/null +++ b/debian/docs @@@ -1,0 -1,0 +1,1 @@@ ++README.markdown diff --cc debian/patches/fix-test-new-libevent.patch index 0000000,0000000..1614a85 new file mode 100644 --- /dev/null +++ b/debian/patches/fix-test-new-libevent.patch @@@ -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 ++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); ++ } ++ diff --cc debian/patches/msgpack-clib.patch index 0000000,0000000..2ea2b26 new file mode 100644 --- /dev/null +++ b/debian/patches/msgpack-clib.patch @@@ -1,0 -1,0 +1,36 @@@ ++From 2a8908bdcf89b1cc8a332033bc9f8971b82438a3 Mon Sep 17 00:00:00 2001 ++From: James McCoy ++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 ++--- ++ 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 ++ diff --cc debian/patches/msgpack-compat.patch index 0000000,0000000..227ea31 new file mode 100644 --- /dev/null +++ b/debian/patches/msgpack-compat.patch @@@ -1,0 -1,0 +1,42 @@@ ++From 7526080ac6f1c08584688ac568da9ce25024cf59 Mon Sep 17 00:00:00 2001 ++From: James McCoy ++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 ++--- ++ 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 ++ #include ++ +++/* 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; diff --cc debian/patches/msgpack-pkgconfig.patch index 0000000,0000000..9294fa8 new file mode 100644 --- /dev/null +++ b/debian/patches/msgpack-pkgconfig.patch @@@ -1,0 -1,0 +1,39 @@@ ++From ca170bcced750629ef65e66c6a5b1642cb3ddde0 Mon Sep 17 00:00:00 2001 ++From: James McCoy ++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 ++--- ++ 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 ++ ++ diff --cc debian/patches/print-listen-port-number.patch index 0000000,0000000..d148b0e new file mode 100644 --- /dev/null +++ b/debian/patches/print-listen-port-number.patch @@@ -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 ++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; ++ } diff --cc debian/patches/python3.patch index 0000000,0000000..e6a58a1 new file mode 100644 --- /dev/null +++ b/debian/patches/python3.patch @@@ -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) diff --cc debian/patches/series index 0000000,0000000..6154403 new file mode 100644 --- /dev/null +++ b/debian/patches/series @@@ -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 diff --cc debian/patches/tests.patch index 0000000,0000000..e3325c7 new file mode 100644 --- /dev/null +++ b/debian/patches/tests.patch @@@ -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 ++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)) ++ diff --cc debian/redis-test.conf index 0000000,0000000..1bef2ef new file mode 100644 --- /dev/null +++ b/debian/redis-test.conf @@@ -1,0 -1,0 +1,4 @@@ ++daemonize yes ++pidfile REDIS_PIDFILE ++port 0 ++unixsocket REDIS_SOCK diff --cc debian/rules index 0000000,0000000..c20ca36 new file mode 100755 --- /dev/null +++ b/debian/rules @@@ -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 diff --cc debian/source/format index 0000000,0000000..163aaf8 new file mode 100644 --- /dev/null +++ b/debian/source/format @@@ -1,0 -1,0 +1,1 @@@ ++3.0 (quilt) diff --cc debian/test.sh index 0000000,0000000..eff8255 new file mode 100755 --- /dev/null +++ b/debian/test.sh @@@ -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 diff --cc debian/tests/control index 0000000,0000000..af1bd10 new file mode 100644 --- /dev/null +++ b/debian/tests/control @@@ -1,0 -1,0 +1,4 @@@ ++Tests: webdis ++Depends: @, redis-server, build-essential, libevent-dev, ++ net-tools, python3 ++Restrictions: isolation-container, allow-stderr diff --cc debian/tests/webdis index 0000000,0000000..dc2cc97 new file mode 100644 --- /dev/null +++ b/debian/tests/webdis @@@ -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 0000000,0000000..9e0040e new file mode 100644 --- /dev/null +++ b/debian/watch @@@ -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 diff --cc debian/webdis-test.json index 0000000,0000000..770295d new file mode 100644 --- /dev/null +++ b/debian/webdis-test.json @@@ -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 0000000,0000000..abb8d29 new file mode 100644 --- /dev/null +++ b/debian/webdis.1 @@@ -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 for the ++Debian project (but may be used by others). diff --cc debian/webdis.default index 0000000,0000000..c764a07 new file mode 100644 --- /dev/null +++ b/debian/webdis.default @@@ -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="" diff --cc debian/webdis.dirs index 0000000,0000000..6ded28a new file mode 100644 --- /dev/null +++ b/debian/webdis.dirs @@@ -1,0 -1,0 +1,1 @@@ ++/var/log/webdis diff --cc debian/webdis.init index 0000000,0000000..2eb72b9 new file mode 100644 --- /dev/null +++ b/debian/webdis.init @@@ -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 ++ ++: diff --cc debian/webdis.install index 0000000,0000000..9a94d95 new file mode 100644 --- /dev/null +++ b/debian/webdis.install @@@ -1,0 -1,0 +1,1 @@@ ++debian/webdis.json /etc/webdis/ diff --cc debian/webdis.json index 0000000,0000000..19a67a7 new file mode 100644 --- /dev/null +++ b/debian/webdis.json @@@ -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" ++} diff --cc debian/webdis.logrotate index 0000000,0000000..7ff7c3d new file mode 100644 --- /dev/null +++ b/debian/webdis.logrotate @@@ -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 ++} diff --cc debian/webdis.manpages index 0000000,0000000..d588228 new file mode 100644 --- /dev/null +++ b/debian/webdis.manpages @@@ -1,0 -1,0 +1,1 @@@ ++debian/webdis.1 diff --cc debian/webdis.postinst index 0000000,0000000..8e0b4cb new file mode 100644 --- /dev/null +++ b/debian/webdis.postinst @@@ -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 ++ ++ diff --cc debian/webdis.postrm index 0000000,0000000..416644b new file mode 100644 --- /dev/null +++ b/debian/webdis.postrm @@@ -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 diff --cc debian/webdis.service index 0000000,0000000..ac958c6 new file mode 100644 --- /dev/null +++ b/debian/webdis.service @@@ -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