Ich habe es bereits so ähnlich mit rc.ftpd implementiert und es scheint zu funktionieren. Zunächst habe ich in modlibrc eine neue Funktion eingeführt, die so aussieht:
Code:
modlib_inetd_control()
{
local configfile="/var/tmp/inetd.conf"
local tmpfile="/var/tmp/inetd.conf.tmp"
[ "$CONFIG_IPV6" = "y" ] && local tcp_v46='tcp6' || local tcp_v46='tcp'
case "$2" in
ftpd )
grep -v /rc.ftpd $configfile > $tmpfile
[ "$1" = "enable" ] && echo "21 stream $tcp_v46 nowait root /etc/init.d/rc.ftpd rc.ftpd inetd" >> $tmpfile
;;
*)
return 127
esac
mv $tmpfile $configfile
killall -HUP inetd
return $?
}
Ist mehr oder weniger von AVM-eigenem /bin/inetdctl abgeschaut, mit dem inetdctl erstmal kompatibel aber doch ein bisschen angepasst (ich habe hier extra, die SAMBA-Sektion weg gelassen, die gibt es bei mir auch noch und sie ist bis jetzt noch unangetastet). Man kann die einzelne Dienste entweder händisch so pflegen, dass für jeden Dienst da so ein case-Eintrag steht (wie AVM es tut), oder versuchen es auf einen gemeinsamen Nenner zu bringen, wenn man davon ausgeht, dass alle Dienste über rc.dienstname gestartet werden und eine Aufruf-Option Namens "inetd" besitzen, wenn sie denn über inetd gestartet werden wollen.
Soweit so gut. Nun kommt die inetd-Sektion von meinem rc.ftpd. Sie ist dann von dem AVM-eigenem /bin/inetdftp abgeschaut und sieht so aus:
Code:
inetd()
{
[ "$CONFIG_WEBDAV" = "y" ] && [ -x $WEBDAVCONTROL ] && $WEBDAVCONTROL start > /dev/null 2>&1 &
run_binary inetd
status=$?
[ "$CONFIG_WEBDAV" = "y" ] && [ -x $WEBDAVCONTROL ] && $WEBDAVCONTROL stop_last > /dev/null 2>&1 &
return $status
}
run_binary ist eine Funktion bei meinem rc.ftpd, die alle notwendigen Parameter zum Starten von Binary aufsammelt. Diese Funktion kann mit dem Parameter "daemon" aufgerufen werden und startet dann ftpd wie gewohnt als Daemon ohne inetd. Wenn man run_binary mit einem anderen Parameter aufruft (so wie hier mit inetd), dann wird ftpd ohne "-D" und ohne andere Daemon-spezifische Parameter gestartet. Somit agiert
Code:
/etc/init.d/rc.ftpd inetd
als Ersatz für /bin/inetdftp und ist so eine Art Parser/Wrapper für den inetd-Modus. Bei den AVM-spezifischen Sachen, wo noch WebDAV usw. mitgestartet/mitgestoppt werden wollen, ist es damit gedient. Für den Rest würde die Funktion inetd() dann nur eine Zeile beinhalten.
Weiterhin habe ich irgendwo in der start-Sektion von rc.ftpd dann eine Zeile stehen:
Code:
modlib_inetd_control enable $DAEMON
die abhängig davon aufgerufen wird, ob inetd-Modus für diesen konkreten Dienst gewünscht ist oder nicht (für AVM-FTPD werde ich noch entsprechende FREETZ-Variablen dafür einführen, denn momentan wird Existenz von /bin/inetdctl als Kriterium für inetd gecheckt).
Und dann entsprechende Eintragung in der stop-Sektion:
Code:
modlib_inetd_control disable $DAEMON
Wie gesagt, diese AVM-artige Syntax mit "enable" "disable" als Schnittstelle fliegt bei mir höchstwahrscheinlich raus, oder wird wenigstens erweitert. Neben dem Daemon-Namen würde ich da auch gerne wenigstens Port und Sockettype übertragen, damit man es universell gestalten kann und die Sachen nicht zu hard coden.
Wie ist eure Meinung zu einer solchen Vorgehensweise? Mit dem ftpd funktioniert es bei mir ja und wenn nichts gegen spricht, würde ich vsftpd und bftpd da vielleicht nachziehen und in einem gemeinsamen Pack als patch anbieten, sobald es fertig ist. Bis dahin sind alle Meinungen und Ratschläge eurerseits willkommen.
MfG