- Converts Makefile to UNIX line termination. Makefiles cannot be formatted with DOS CRLF because, otherwise, we could not escape \n to continue on a second line. We end up escaping \r and not \n. - Fixes remove-account! Procedure delete-if ``may modify sequence'', but we cannot be sure it will modify it. There are cases in which it does and there are cases in which it doesn't. Seeing it did modify in one case, I incorrectly assumed it would modify in all cases---such is life. Since I do want to modify it always, I wrote delete-if*, which in calls setf to be sure the list is overwritten. - Avoids (load'ing "~/.sbclrc") and, instead, does what Quicklisp does. It's not always the case that ~/.sbclrc exists. But Quicklisp in each installation knows what to do. So we do what Quicklisp does in each script that we use. - Frees us from using sb-ext:{file-exists,file-does-not-exist} Turns out SBCL 1.2.4.debian doesn't have these symbols. - Adds command-line parsing. - Adds install target to Makefile. - Rewrites Makefile with a new strategy. - Adds the daemon-tls/ service example. - Adds the daemon service example. - Convers all text files to LF instead of CRLF.
160 lines
4.8 KiB
Text
160 lines
4.8 KiB
Text
(*) Introduction
|
|
|
|
LOOP is an NNTP server written in Common Lisp.
|
|
|
|
(*) Assumptions
|
|
|
|
We assume
|
|
|
|
- you run SBCL
|
|
|
|
- you have Quicklisp installed and knows how to use it
|
|
|
|
- you know how to use a TCP server such as
|
|
|
|
https://cr.yp.to/ucspi-tcp.html
|
|
|
|
- you know how to manage a daemon with
|
|
|
|
https://cr.yp.to/daemontools.html
|
|
|
|
- you have git and knows how to use it
|
|
|
|
(*) How to install it
|
|
|
|
LOOP is not in the Quicklisp repository, so we'll instruct you to
|
|
install it as a local project. Go to
|
|
|
|
~/quicklisp/local-projects/
|
|
|
|
and say
|
|
|
|
$ git clone https://git.antartida.xyz/loop/srv loop
|
|
$ cd loop
|
|
$ echo /path/to/loop/home > conf-home
|
|
$ make install
|
|
|
|
If you just installed SBCL and quicklisp, the build might take a
|
|
little while due to downloading dependencies. Be patient.
|
|
|
|
(*) Systems with no installation issues
|
|
|
|
We installed LOOP just fine on
|
|
|
|
FreeBSD 14.1, 14.2 with SBCL 2.4.9.
|
|
Debian GNU/Linux 8.11 codename jessie with SBCL 1.2.4.debian.
|
|
|
|
(*) Systems with installation issues
|
|
|
|
We installed LOOP on Ubuntu 24.04 (24.01.1 LTS) codename noble with
|
|
SBCL 2.2.9.debian. We found that CLSQL could not load the shared
|
|
object libsqlite3.so because ``apt install libsqlite3'' installs the
|
|
library at
|
|
|
|
/usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6
|
|
|
|
with a symbolic link to libsqlite3.so.0, but not to libsqlite3.so.
|
|
SBCL is trying to load libsqlite3.so, so a solution is to just tell
|
|
your system to
|
|
|
|
ln -s libsqlite3.so.0 libsqlite3.so
|
|
|
|
at /usr/lib/x86_64-linux-gnu.
|
|
|
|
(*) Running LOOP
|
|
|
|
First, try it out.
|
|
|
|
--8<-------------------------------------------------------->8---
|
|
$ cd /path/to/loop/home
|
|
$ ./loop --help
|
|
NAME:
|
|
loop - An NNTP server for a circle of friends.
|
|
|
|
USAGE:
|
|
loop [options] [arguments ...]
|
|
|
|
OPTIONS:
|
|
--change-passwd <VALUE> <username> <new-password> changes password
|
|
--create-account <VALUE> <username> <invited-by> creates a new account
|
|
--help display usage information and exit
|
|
--logging turn on debug logging on stderr
|
|
--version display version and exit
|
|
-l, --list-accounts lists accounts
|
|
-r, --repl run a REPL on port 4006
|
|
-s, --server runs NNTP server reading from stdout
|
|
|
|
AUTHORS:
|
|
Circling Skies <loop@antartida.xyz>
|
|
|
|
LICENSE:
|
|
GPL v3
|
|
--8<-------------------------------------------------------->8---
|
|
|
|
You can talk to the NNTP server with -s:
|
|
|
|
--8<-------------------------------------------------------->8---
|
|
$ ./loop -s
|
|
200 Welcome! Say ``help'' for a menu.
|
|
quit
|
|
205 Good-bye.
|
|
--8<-------------------------------------------------------->8---
|
|
|
|
It's time to create an account for you. Whenever you run loop, make
|
|
sure you're in its home directory because it will look for the file
|
|
accounts.lisp always relatively to the current working directory of
|
|
the process. The same applies if you set up a cron job later
|
|
on---make sure the job, too, sets LOOP's home directory as its current
|
|
working directory.
|
|
|
|
(*) Create your account
|
|
|
|
LOOP requires authentication for most things, so you should create an
|
|
account for you right away. Accounts are kept in accounts.lisp in
|
|
your installation directory. Every time you create an account, you
|
|
must specify who is inviting this new account into the loop---because
|
|
we keep a tree of accounts. The root account is called anonymous, so
|
|
your first account must be invited by the anonymous account. So you
|
|
can say
|
|
|
|
./loop --create-account you anonymous
|
|
|
|
The anonymous account has no special power; it exists solely because
|
|
the graph of accounts needs a root.
|
|
|
|
(*) How to expose LOOP to the network
|
|
|
|
Run your TCP server of choice. For instance, if you're using djb's
|
|
tcpserver and would like LOOP to listen on port 1024, tell your shell
|
|
|
|
--8<-------------------------------------------------------->8---
|
|
$ tcpserver -v -HR 0.0.0.0 1024 ./loop -s
|
|
tcpserver: status: 0/40
|
|
--8<-------------------------------------------------------->8---
|
|
|
|
Using another terminal, telnet to your host on port 1024:
|
|
|
|
--8<-------------------------------------------------------->8---
|
|
$ telnet localhost 1024
|
|
Trying 127.0.0.1...
|
|
Connected to antartida.xyz.
|
|
Escape character is '^]'.
|
|
200 Welcome! Say ``help'' for a menu.
|
|
quit
|
|
205 Good-bye.
|
|
Connection closed by foreign host.
|
|
--8<-------------------------------------------------------->8---
|
|
|
|
Directories daemon/ and daemon-tls/ in LOOP's source code have sample
|
|
scripts to use with djb's tcpserver and daemontools. If you have
|
|
never done this, it will be better education if you learn to use
|
|
daemontools and ucspi-tcp before going live with a LOOP community.
|
|
It's easy and fun.
|
|
|
|
(*) Cron jobs
|
|
|
|
If you'd like to remove inactive accounts, we wrote
|
|
scripts/cron-remove-inactive-users.lisp. Her's our crontab:
|
|
|
|
$ crontab -l
|
|
@daily cd /path/to/loop/home && sbcl --script scripts/cron-remove-inactive-users.lisp
|