A new package smtptrapd to provide a (secondary) SMTP server returning 4xx soft error. Signed-off-by: Lubos Stanek (lubek) <lubek@lubek.name>

git-svn-id: svn://svn.openwrt.org/openwrt/packages@11065 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
thepeople 2008-05-08 00:57:21 +00:00
parent be30da719d
commit a931d77737
3 changed files with 207 additions and 0 deletions

51
net/smtptrapd/Makefile Normal file
View File

@ -0,0 +1,51 @@
#
# Copyright (C) 2008 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=smtptrapd
PKG_VERSION:=1.5
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://smtptrapd.inodes.org
PKG_MD5SUM:=edc5f2f3ea9f9bdd9e0f479a58903bf1
include $(INCLUDE_DIR)/package.mk
define Package/smtptrapd
SECTION:=net
CATEGORY:=Network
DEPENDS:=+libpthread
TITLE:=SMTP Trap Daemon
URL:=http://smtptrapd.inodes.org/
endef
define Package/smtptrapd/description
The smtptrapd program is a multi-threaded daemon that provides
a RFC 2821 compliant SMTP service that always returns a 4xx soft
error to the RCPT TO verb.
endef
define Build/Compile
$(TARGET_CC) \
$(TARGET_CFLAGS) \
-I $(STAGING_DIR)/usr/include \
-D_REENTRANT \
$(PKG_BUILD_DIR)/smtptrapd.c \
-o $(PKG_BUILD_DIR)/smtptrapd \
-L$(STAGING_DIR)/usr/lib/ -lpthread
endef
define Package/smtptrapd/install
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/smtptrapd.init $(1)/etc/init.d/smtptrapd
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/smtptrapd $(1)/usr/sbin/
endef
$(eval $(call BuildPackage,smtptrapd))

View File

@ -0,0 +1,144 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2008 OpenWrt.org
START=90
NAME="smtptrapd"
DAEMON="/usr/sbin/$NAME"
RUN_D="/var/run"
EXTRA_COMMANDS="list status exconf"
EXTRA_HELP=" list Lists available configurations
status Prints status of the service
exconf Shows an example config file
The actions start, stop, restart, reload, status operate
globally on all configurations unless the particular
configuration has been provided as the next parameter.
"
check_req() {
if [ -x "$DAEMON" ]; then
return 0
else
echo "The daemon binary is missing!"
return 1
fi
}
check_section() {
echo "$1" | grep -vq '^cfg[[:xdigit:]]\{6\}$'
}
start_service() {
local cfg="$1"
local named="$2"
check_section "$cfg" || return 1
[ "$named" != "" -a "$cfg" != "$named" ] && return 0
local args listen_ip banner_host username num_threads listen_port accept_queue_len
config_get listen_ip "$cfg" listen_ip
[ -n "$listen_ip" ] && append args "-l $listen_ip"
config_get listen_port "$cfg" listen_port
[ -n "$listen_port" ] && append args "-p $listen_port"
config_get username "$cfg" username
[ -n "$username" ] && append args "-u $username"
config_get banner_host "$cfg" banner_host
[ -n "$banner_host" ] && append args "-b \"$banner_host\""
config_get num_threads "$cfg" num_threads
[ -n "$num_threads" ] && append args "-t $num_threads"
config_get accept_queue_len "$cfg" accept_queue_len
[ -n "$accept_queue_len" ] && append args "-m $accept_queue_len"
append args "-f ${RUN_D}/${NAME}-${cfg}.pid"
eval "$DAEMON $args"
}
stop_service() {
local cfg="$1"
local named="$2"
check_section "$cfg" || return 1
[ "$named" != "" -a "$cfg" != "$named" ] && return 0
local PID_F="${RUN_D}/${NAME}-${cfg}.pid"
[ -f $PID_F ] && {
local ppid=$(cat $PID_F)
ps | grep "^[[:space:]]*$ppid[[:space:]]" | grep -q "[s]mtptrapd\>" && kill $ppid
rm -f $PID_F
}
}
status_service() {
local cfg="$1"
local named="$2"
check_section "$cfg" || return 1
[ "$named" != "" -a "$cfg" != "$named" ] && return 0
local PID_F="${RUN_D}/${NAME}-${cfg}.pid"
[ -f $PID_F ] && {
local ppid=$(cat $PID_F)
if ps | grep "^[[:space:]]*$ppid[[:space:]]" | grep -q "[s]mtptrapd\>"; then
echo "$cfg (pid $ppid) is running"
else
echo "$cfg is not running (stale pid file exists)"
fi
}
}
list_service() {
local cfg="$1"
check_section "$cfg" || return 1
echo " $cfg"
}
start() {
local svc_cfg="$1"
check_req || return 1
[ ! -d $RUN_D ] && mkdir -p $RUN_D
config_load "$NAME"
config_foreach start_service "$NAME" "$svc_cfg"
}
stop() {
local svc_cfg="$1"
check_req || return 1
config_load "/etc/config/$NAME"
if [ -n "$svc_cfg" ]; then
config_foreach stop_service "$NAME" "$svc_cfg"
else
config_foreach stop_service "$NAME"
local pf
for pf in $(ls ${RUN_D}/${NAME}*.pid 2>/dev/null); do
local ppid=$(cat $pf)
ps | grep "^[[:space:]]*$ppid[[:space:]]" | grep -q "[s]mtptrapd\>" && kill "$ppid"
rm -f $pf
done
fi
}
status() {
local svc_cfg="$1"
check_req || return 1
config_load "$NAME"
config_foreach status_service "$NAME" "$svc_cfg"
}
list() {
check_req || return 1
echo "Available $NAME configurations:"
config_load "$NAME"
config_foreach list_service "$NAME"
}
exconf() {
echo "An example configuration in /etc/config/$NAME:" >&2
cat <<EOF
config '$NAME' 'myfailhost'
option 'num_threads' '1'
# The init script operates only with named sections
# All options (default values)
# option 'banner_host' '<hostname>'
# option 'username' 'nobody'
# option 'listen_ip' '<all addresses>'
# option 'listen_port' '25'
# option 'num_threads' '10'
# option 'accept_queue_len' '100'
EOF
}

View File

@ -0,0 +1,12 @@
diff -urN smtptrapd-1.5.orig/smtptrapd.c smtptrapd-1.5.dev/smtptrapd.c
--- smtptrapd-1.5.orig/smtptrapd.c 2008-04-15 12:56:20.000000000 +0200
+++ smtptrapd-1.5.dev/smtptrapd.c 2008-04-16 18:23:03.000000000 +0200
@@ -545,7 +545,7 @@
config.threads = NUM_CONSUMER;
config.max_queue_len = MAX_QUEUE_LEN;
- while ((c = getopt(argc, argv, "hc:l:p:b:u:m:t:")) != -1) {
+ while ((c = getopt(argc, argv, "hc:l:p:b:u:m:t:f:")) != -1) {
switch (c) {
case 'h':