From 6b962c61dcd28876e00d29309b509e81ed58c495 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Mon, 25 Jul 2022 15:22:44 +0700 Subject: network/tnfsd: Added (trivial network filesystem server). Signed-off-by: Willy Sudiarto Raharjo --- network/tnfsd/COPYING | 41 +++++++++++++++ network/tnfsd/README | 49 ++++++++++++++++++ network/tnfsd/doinst.sh | 22 ++++++++ network/tnfsd/rc.tnfsd | 48 +++++++++++++++++ network/tnfsd/slack-desc | 19 +++++++ network/tnfsd/tnfsd.1 | 105 +++++++++++++++++++++++++++++++++++++ network/tnfsd/tnfsd.SlackBuild | 115 +++++++++++++++++++++++++++++++++++++++++ network/tnfsd/tnfsd.info | 10 ++++ network/tnfsd/tnfsd.rst | 96 ++++++++++++++++++++++++++++++++++ 9 files changed, 505 insertions(+) create mode 100644 network/tnfsd/COPYING create mode 100644 network/tnfsd/README create mode 100644 network/tnfsd/doinst.sh create mode 100644 network/tnfsd/rc.tnfsd create mode 100644 network/tnfsd/slack-desc create mode 100644 network/tnfsd/tnfsd.1 create mode 100644 network/tnfsd/tnfsd.SlackBuild create mode 100644 network/tnfsd/tnfsd.info create mode 100644 network/tnfsd/tnfsd.rst (limited to 'network') diff --git a/network/tnfsd/COPYING b/network/tnfsd/COPYING new file mode 100644 index 0000000000..e6bf05a125 --- /dev/null +++ b/network/tnfsd/COPYING @@ -0,0 +1,41 @@ +This information copied from the C sources. + +License for all tnfsd source files except strlcat.c and strlcpy.c: + + The MIT License + + Copyright (c) 2010 Dylan Smith + + 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. + +License for strlcat.c and strlcpy.c: + + Copyright (c) 1998 Todd C. Miller + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/network/tnfsd/README b/network/tnfsd/README new file mode 100644 index 0000000000..f77ceb3b27 --- /dev/null +++ b/network/tnfsd/README @@ -0,0 +1,49 @@ +tnfsd (trivial network filesystem server) + +TNFS is a simplified Internet file transfer protocol, designed for +limited resource usage and ease of implementation on small systems, +such as 8-bit computers. It's simpler than NFS, SMB, or FTP. It's +similar to TFTP, but has features TFTP lacks. + +Since tnfsd has no access control other than file permissions, and +since we generally don't want clients to have write access, this +package uses a dedicated user/group for the daemon, and another group +to control local write access to the shared directory. + +Before running this SlackBuild, you must create the tnfsd user and +the tnfsd and tnfs-files groups. Use these commands: + + groupadd -g 375 tnfsd + groupadd -g 376 tnfs-files + useradd -u 375 -d /var/tnfs -c "TNFS Daemon User" \ + -M -g tnfsd tnfsd -s /bin/false + +After the package is installed, add any users you want to the tnfs-files +group. These users will be able to create files in the /var/tnfs +directory. Example: + + usermod -a -G tnfs-files joeblow + +After the above command, the user joeblow will have to log out and +back in, to join the new group. Once this is done, the user can +copy files to /var/tnfs (or ~tnfs) and they will be visible to TNFS +clients. + +TNFS uses port 16384, UDP (for most 8-bit clients) and TCP (for the +Linux client), so make sure you allow incoming traffic if you have +firewall rules. + +This package includes the server and an init script for running +tnfsd as a system daemon. To start tnfsd at boot, first edit +/etc/rc.d/rc.tnfsd, read the comments, and change the default user and +directory if needed. Then add this to /etc/rc.d/rc.local: + + [ -x /etc/rc.d/rc.tnfsd ] && /etc/rc.d/rc.tnfsd start + +Depending on how you're using tnfsd, it might make more sense to start +the service as needed, as an unprivileged user, instead of running it +as a system daemon. + +Usage logging is a compile-time option. By default, it's enabled. If +you find it too chatty, you can rebuild this with USAGELOG=no set in +the environment. diff --git a/network/tnfsd/doinst.sh b/network/tnfsd/doinst.sh new file mode 100644 index 0000000000..c033d262ca --- /dev/null +++ b/network/tnfsd/doinst.sh @@ -0,0 +1,22 @@ +config() { + NEW="$1" + OLD="$(dirname $NEW)/$(basename $NEW .new)" + if [ ! -r $OLD ]; then + mv $NEW $OLD + elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then + rm $NEW + fi +} + +preserve_perms() { + NEW="$1" + OLD="$(dirname $NEW)/$(basename $NEW .new)" + if [ -e $OLD ]; then + cp -a $OLD ${NEW}.incoming + cat $NEW > ${NEW}.incoming + mv ${NEW}.incoming $NEW + fi + config $NEW +} + +preserve_perms etc/rc.d/rc.tnfsd.new diff --git a/network/tnfsd/rc.tnfsd b/network/tnfsd/rc.tnfsd new file mode 100644 index 0000000000..392856115a --- /dev/null +++ b/network/tnfsd/rc.tnfsd @@ -0,0 +1,48 @@ +#!/bin/sh + +# rc.tnfsd, part of SBo tnfsd build, by B. Watson. WTFPL. + +# To start tnfsd at boot, make this script executable, then add this code +# to /etc/rc.d/rc.local: +# [ -x /etc/rc.d/rc.tnfsd ] && /etc/rc.d/rc.tnfsd start + +# tnfsd will chroot to $TNFS_ROOT and set its user ID to $TNFS_USER, +# and its group ID to $TNFS_USER's primary group. Since there's no +# other form of access control, make sure the $TNFS_USER can't wrote +# to $TNFS_ROOT, unless you want to allow everyone who can connect +# to write/delete/overwrite everything in $TNFS_ROOT. By default, +# /var/tnfs is owned by root:tnfs-files. + +TNFS_USER=tnfsd +TNFS_ROOT=/var/tnfs + +# Log gets overwritten on startup (no rotation). +TNFS_LOG=/var/log/tnfsd.log + +# If you don't need the log at all. But if tnfsd fails to start, you +# won't see any error messages from it... +#TNFS_LOG=/dev/null + +kill_tnfsd() { + /usr/bin/killall tnfsd && sleep 1 +} + +start_tnfsd() { + echo "Starting tnfsd." + kill_tnfsd &>/dev/null + /usr/bin/tnfsd "$TNFS_ROOT" -c "$TNFS_USER" >"$TNFS_LOG" &1 & +} + +stop_tnfsd() { + echo "Stopping tnfsd." + kill_tnfsd +} + +case "$1" in + ""|start) start_tnfsd ;; + stop) stop_tnfsd ;; + restart) stop_tnfsd ; start_tnfsd ;; + *) echo "Usage: $0 stop|start|restart" 1&>2; exit 1 ;; +esac + +exit 0 diff --git a/network/tnfsd/slack-desc b/network/tnfsd/slack-desc new file mode 100644 index 0000000000..23cd397d46 --- /dev/null +++ b/network/tnfsd/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. +# Line up the first '|' above the ':' following the base package name, and +# the '|' on the right side marks the last column you can put a character in. +# You must make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':' except on otherwise blank lines. + + |-----handy-ruler------------------------------------------------------| +tnfsd: tnfsd (trivial network filesystem server) +tnfsd: +tnfsd: TNFS is a simplified Internet file transfer protocol, designed for +tnfsd: simplicity and ease of implementation on small systems, such as 8-bit +tnfsd: computers. It's simpler than NFS, SMB, or FTP. It's similar to TFTP, +tnfsd: but has features TFTP lacks. +tnfsd: +tnfsd: +tnfsd: +tnfsd: +tnfsd: diff --git a/network/tnfsd/tnfsd.1 b/network/tnfsd/tnfsd.1 new file mode 100644 index 0000000000..fa4a355e09 --- /dev/null +++ b/network/tnfsd/tnfsd.1 @@ -0,0 +1,105 @@ +.\" Man page generated from reStructuredText. +. +. +.nr rst2man-indent-level 0 +. +.de1 rstReportMargin +\\$1 \\n[an-margin] +level \\n[rst2man-indent-level] +level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] +- +\\n[rst2man-indent0] +\\n[rst2man-indent1] +\\n[rst2man-indent2] +.. +.de1 INDENT +.\" .rstReportMargin pre: +. RS \\$1 +. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] +. nr rst2man-indent-level +1 +.\" .rstReportMargin post: +.. +.de UNINDENT +. RE +.\" indent \\n[an-margin] +.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] +.nr rst2man-indent-level -1 +.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] +.in \\n[rst2man-indent\\n[rst2man-indent-level]]u +.. +.TH "TNFSD" 1 "2022-07-22" "20201019" "SlackBuilds.org" +.SH NAME +tnfsd \- trivial network filesystem daemon +.\" RST source for tnfsd(1) man page. Convert with: +. +.\" rst2man.py tnfsd.rst > tnfsd.1 +. +.\" rst2man.py comes from the SBo development/docutils package. +. +.SH SYNOPSIS +.sp +tnfsd \fBdirectory\fP [\fB\-c\fP \fIusername\fP] +.SH DESCRIPTION +.sp +TNFS is a simplified Internet file transfer protocol, designed for +simplicity and ease of implementation on small systems, such as 8\-bit +computers. It\(aqs simpler than NFS, SMB, or FTP. It\(aqs similar to TFTP, +but has features TFTP lacks. +.sp +\fBtnfsd\fP is the server for the TNFS protocol. It listens for clients +on UDP and TCP port 16384. Most 8\-bit clients use UDP, and the Linux +client \fBtnfs\-fuse\fP uses TCP. +.sp +The mandatory \fBdirectory\fP option is the root of the TNFS filesystem +tree. +.sp +The \fB\-c\fP \fIusername\fP option requires \fBtnfsd\fP to be run as +\fIroot\fP\&. If given, \fBtnfsd\fP will \fBchroot\fP(2) to the \fIdirectory\fP, +then drop its root privileges and run as the \fIusername\fP user instead. +.sp +Even without \fBchroot\fP, \fBtnfsd\fP will not deliberately allow access +to files outside the \fIdirectory\fP\&. The \fB\-c\fP option is a safety net, +in case there\(aqs a bug in \fBtnfsd\fP that allows such access (currently, +no such bug is known of). +.sp +Note that \fBtnfsd\fP can be started by a normal user, since it uses an +unprivileged UDP port. The \fB\-c\fP option won\(aqt work in this case. +.sp +\fBtnfsd\fP logs various information to standard error. If compiled with +\fI\-DUSAGE_LOG\fP, the log includes all mount, umount, and file transfer +requests including the client IP addresses. +.SH LIMITATIONS +.sp +\fBtnfsd\fP is designed to be simple, so the following list of +limitations should not be read as complaints or feature requests. +.sp +There is no way to run multiple \fBtnfsd\fP instances on the same +host, not even on a multi\-homed host. The default UDP port cannot +be changed; neither can the IP address used for binding (which is +\fI0.0.0.0\fP, aka \fIINADDR_ANY\fP). Also, there\(aqs no concept of virtual +hosts. If you \fIreally\fP want to run multiple instances, use containers +or virtual machines. +.sp +There\(aqs no way to limit which hosts may access \fBtnfsd\fP using any +mechanism such as \fBtcpd\fP(8). Firewall rules may be used instead, +e.g. \fBiptables\fP(8). +.sp +There isn\(aqt a way to share a directory read\-only with the current +\fBtnfsd\fP implementation. However, filesystem permissions can be used +to prevent the daemon from writing to the shared directory. +.SH COPYRIGHT +.sp +See the file /usr/doc/tnfsd\-20201019/COPYING for license information. +.SH AUTHORS +.sp +tnfsd was written by Dylan Smith. +.sp +This man page written for the SlackBuilds.org project +by B. Watson, and is licensed under the WTFPL. +.SH SEE ALSO +.sp +\fBtnfs\-fuse\fP(1), \fBfujinet\-pc\fP(1) +.sp +/usr/doc/tnfsd\-20201019/tnfs\-protocol.md +.\" Generated by docutils manpage writer. +. diff --git a/network/tnfsd/tnfsd.SlackBuild b/network/tnfsd/tnfsd.SlackBuild new file mode 100644 index 0000000000..9f54ec34ac --- /dev/null +++ b/network/tnfsd/tnfsd.SlackBuild @@ -0,0 +1,115 @@ +#!/bin/bash + +# Slackware build script for tnfsd + +# Written by B. Watson (urchlay@slackware.uk) + +# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details. + +cd $(dirname $0) ; CWD=$(pwd) + +PRGNAM=tnfsd +VERSION=${VERSION:-20201019} +BUILD=${BUILD:-1} +TAG=${TAG:-_SBo} +PKGTYPE=${PKGTYPE:-tgz} + +SRCNAM="spectranet" +SRCVER="TNFSD-$( echo $VERSION | sed 's,\(....\)\(..\)\(..\),\1-\2-\3,' )" + +if [ -z "$ARCH" ]; then + case "$( uname -m )" in + i?86) ARCH=i586 ;; + arm*) ARCH=arm ;; + *) ARCH=$( uname -m ) ;; + esac +fi + +if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then + echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE" + exit 0 +fi + +uid_gid_err() { + cat </dev/null || uid_gid_err +getent group tnfs-files &>/dev/null || uid_gid_err +getent passwd tnfsd &>/dev/null || uid_gid_err + +TMP=${TMP:-/tmp/SBo} +PKG=$TMP/package-$PRGNAM +OUTPUT=${OUTPUT:-/tmp} + +if [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686 -mtune=i686" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIRSUFFIX="64" +else + SLKCFLAGS="-O2" + LIBDIRSUFFIX="" +fi + +set -e + +rm -rf $PKG +mkdir -p $TMP $PKG $OUTPUT +cd $TMP +rm -rf $SRCNAM-$SRCVER +tar xvf $CWD/$SRCNAM-$SRCVER.tar.gz --wildcards '*/tnfs/*' +cd $SRCNAM-$SRCVER/tnfs +chown -R root:root . +find -L . -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \ + \! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+ + +# this printf causes tnfsd to log something like 13GB of data in 5 +# minutes, if anyone ever connects to it with TCP. No thank you. +sed -i '/printf.*DEBUG/d' tnfsd/datagram.c + +[ "${USAGELOG:-yes}" = "yes" ] && SLKCFLAGS+=" -DUSAGELOG" +sed -i "s,-Wall,& $SLKCFLAGS," tnfsd/Makefile +make -C tnfsd OS=LINUX + +PKGDOC=$PKG/usr/doc/$PRGNAM-$VERSION +PKGBIN=$PKG/usr/bin +PKGMAN1=$PKG/usr/man/man1 +PKGRCD=$PKG/etc/rc.d +PKGVAR=$PKG/var/tnfs +mkdir -p $PKGDOC $PKGBIN $PKGMAN1 $PKGRCD $PKGVAR +install -s -m0755 tnfsd/bin/tnfsd $PKGBIN/tnfsd +cp -a *.md *.txt $PKGDOC +cat $CWD/$PRGNAM.SlackBuild > $PKGDOC/$PRGNAM.SlackBuild + +mkdir -p $PKGVAR +chown root:tnfs-files $PKGVAR +chmod 1775 $PKGVAR + +# upstream license only exists in C comments, so I included this: +cat $CWD/COPYING > $PKGDOC/COPYING + +# man page written for this SlackBuild. +gzip -9c < $CWD/$PRGNAM.1 > $PKGMAN1/$PRGNAM.1.gz + +install -oroot -groot -m0755 $CWD/rc.$PRGNAM $PKGRCD/rc.$PRGNAM.new + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc +cat $CWD/doinst.sh > $PKG/install/doinst.sh + +cd $PKG +/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE diff --git a/network/tnfsd/tnfsd.info b/network/tnfsd/tnfsd.info new file mode 100644 index 0000000000..f286dc0f78 --- /dev/null +++ b/network/tnfsd/tnfsd.info @@ -0,0 +1,10 @@ +PRGNAM="tnfsd" +VERSION="20201019" +HOMEPAGE="https://github.com/FujiNetWIFI/spectranet/" +DOWNLOAD="https://github.com/FujiNetWIFI/spectranet/archive/TNFSD-2020-10-19/spectranet-TNFSD-2020-10-19.tar.gz" +MD5SUM="052e01e46bdf91f403060e126373e8b3" +DOWNLOAD_x86_64="" +MD5SUM_x86_64="" +REQUIRES="" +MAINTAINER="B. Watson" +EMAIL="urchlay@slackware.uk" diff --git a/network/tnfsd/tnfsd.rst b/network/tnfsd/tnfsd.rst new file mode 100644 index 0000000000..38cc19d9dd --- /dev/null +++ b/network/tnfsd/tnfsd.rst @@ -0,0 +1,96 @@ +.. RST source for tnfsd(1) man page. Convert with: +.. rst2man.py tnfsd.rst > tnfsd.1 +.. rst2man.py comes from the SBo development/docutils package. + +.. |version| replace:: 20201019 +.. |date| date:: + +===== +tnfsd +===== + +--------------------------------- +trivial network filesystem daemon +--------------------------------- + +:Manual section: 1 +:Manual group: SlackBuilds.org +:Date: |date| +:Version: |version| + +SYNOPSIS +======== + +tnfsd **directory** [**-c** *username*] + +DESCRIPTION +=========== + +TNFS is a simplified Internet file transfer protocol, designed for +simplicity and ease of implementation on small systems, such as 8-bit +computers. It's simpler than NFS, SMB, or FTP. It's similar to TFTP, +but has features TFTP lacks. + +**tnfsd** is the server for the TNFS protocol. It listens for clients +on UDP and TCP port 16384. Most 8-bit clients use UDP, and the Linux +client **tnfs-fuse** uses TCP. + +The mandatory **directory** option is the root of the TNFS filesystem +tree. + +The **-c** *username* option requires **tnfsd** to be run as +*root*. If given, **tnfsd** will **chroot**\(2) to the *directory*, +then drop its root privileges and run as the *username* user instead. + +Even without **chroot**, **tnfsd** will not deliberately allow access +to files outside the *directory*. The **-c** option is a safety net, +in case there's a bug in **tnfsd** that allows such access (currently, +no such bug is known of). + +Note that **tnfsd** can be started by a normal user, since it uses an +unprivileged UDP port. The **-c** option won't work in this case. + +**tnfsd** logs various information to standard error. If compiled with +*-DUSAGE_LOG*, the log includes all mount, umount, and file transfer +requests including the client IP addresses. + +LIMITATIONS +=========== + +**tnfsd** is designed to be simple, so the following list of +limitations should not be read as complaints or feature requests. + +There is no way to run multiple **tnfsd** instances on the same +host, not even on a multi-homed host. The default UDP port cannot +be changed; neither can the IP address used for binding (which is +*0.0.0.0*, aka *INADDR_ANY*). Also, there's no concept of virtual +hosts. If you *really* want to run multiple instances, use containers +or virtual machines. + +There's no way to limit which hosts may access **tnfsd** using any +mechanism such as **tcpd**\(8). Firewall rules may be used instead, +e.g. **iptables**\(8). + +There isn't a way to share a directory read-only with the current +**tnfsd** implementation. However, filesystem permissions can be used +to prevent the daemon from writing to the shared directory. + +COPYRIGHT +========= + +See the file /usr/doc/tnfsd-|version|/COPYING for license information. + +AUTHORS +======= + +tnfsd was written by Dylan Smith. + +This man page written for the SlackBuilds.org project +by B. Watson, and is licensed under the WTFPL. + +SEE ALSO +======== + +**tnfs-fuse**\(1), **fujinet-pc**\(1) + +/usr/doc/tnfsd-|version|/tnfs-protocol.md -- cgit v1.2.3