Skip to main content

retr0chat telnet/vt100 chat server

Project description

r0c telnet server

screenshot of telnet connected to a r0c server

summary

imagine being stuck on ancient gear, in the middle of nowhere, on a slow connection between machines that are even more archaic than the toaster you're trying to keep from falling apart

retr0chat is the lightweight, no-dependencies, runs-anywhere solution for when life gives you lemons

  • tries to be irssi
  • zero dependencies on python 2.6, 2.7, 3.x
  • supports telnet, netcat, /dev/tcp, TLS clients
  • is not an irc server, but can bridge to/from irc servers
  • modem-aware; comfortable at 1200 bps
  • fallbacks for inhumane conditions
    • linemode
    • no vt100 / ansi escape codes

endorsements

compatibility

features

irc-like:

  • public channels with persistent history (pgup/pgdn)
  • private messages (/msg acidburn hey)
  • nick completion with Tab ↹
  • notifications (bell/visual) on hilights and PMs
  • command subset (/nick, /join, /part, /names, /topic, /me)
  • inline message coloring, see /help

technical:

  • client behavior detection (echo, colors, charset, newline)
  • message input with readline-like editing (arrow-left/right, home/end, backspace)
    • history of sent messages (arrow-up/down)
  • bandwidth-conservative (push/pop lines instead of full redraws; scroll-regions)
  • fast enough; 600 clients @ 750 msgs/sec, or 1'000 cli @ 350 msg/s
  • bridge several irc channels from several networks into one r0c channel

windows clients

  • use putty in telnet mode
  • or the powershell client
  • or enable Telnet Client in control panel -> programs -> programs and features -> turn windows features on or off, then press WIN+R and run telnet r0c.int

putty is the best option;

  • the powershell client is OK and no longer spammy as of windows 10.0.15063 (win10 1703 / LTSC)
  • windows-telnet has a bug (since win7) where non-ascii letters occasionally render but usually dont
    • this is due to a buffer overflow in telnet.exe, so r0c will apply a rate-limit to avoid it
    • looks like messages larger than 512 bytes end up messing with the unicode glyphs area? or something

linux clients

most to least recommended

client example
telnet telnet r0c.int
socat socat -,raw,echo=0 tcp:r0c.int:531
bash mostly internals
netcat nc r0c.int 531

you can even exec 147<>/dev/tcp/r0c.int/531;cat<&147&while IFS= read -rn1 x;do [ -z "$x" ]&&x=$'\n';printf %s "$x">&147;done (disconnect using exec 147<&-; killall cat #sorry)

tls clients

if you enable TLS with -tpt 2424 (telnet) and/or -tpn 1515 (netcat) you can connect to r0c with TLS encryption using any of the following:

  • telnet-ssl -zssl -zsecure -zcacert=r0c.crt r0c.int 2424
  • socat -,raw,echo=0 openssl:r0c.int:1515,cafile=cert.crt
  • socat -,raw,echo=0 openssl:127.0.0.1:1515,verify=0
  • stty -icanon; ncat --ssl --ssl-trustfile r0c.crt -v r0c.int 1515
  • stty -icanon; openssl s_client -CAfile ~/.r0c/cert.crt -nbio -connect r0c.int:1515
  • windows: powershell client with port +1515 (the + enables TLS)
    • powershell does not verify certificate; the other clients do

the powershell client and bash client comes bundled with the server; see protips

connecting from a web browser

screenshot of chrome connecting to r0c through ttyd

oh you betcha! see the webtty readme

installation

just run r0c.py and that's it (usually)

  • or install through pypi (python3 only): python3 -m pip install --user -U r0c

you can run it as a service so it autostarts on boot:

irc

if you want to connect your r0c instance to an irc network and bridge channels between them, you can do that:

screenshot of a r0c channel being bridged to an irc channel

python3 r0c.py --ircn a,127.0.0.1,6667,r0c --ircb a,chat,g

run that command to start r0c with irc bridging enabled; r0c will then connect to an irc server (which we nicknamed a) on 127.0.0.1:6667 with the irc-nick r0c and bridge the irc-channel #chat with the r0c-channel #g

if you then start an irc server locally, for example miniircd by running python3 miniircd --verbose then you're all set, people can now join r0c by connecting via irc

to bridge additional channels on the same network, add more --ircb args, for example --ircb a,tech,tech like in the screenshot, and optionally add more networks with --ircn

firewall rules

skip this section if:

  • you are using the systemd service
  • or you are running as root and do not have a firewall
  • or you're on windows

if you're using firewalld, and just want to open up the high ports (not 23 and 531) then this is probably enough:

firewall-cmd --permanent --add-port={23,531,2323,1531,2424,1515,8023}/tcp
firewall-cmd --reload

but having to specify the port when connecting is lame so consider the folllowing --

telnet uses port 23 by default, so on the server you'll want to port-forward 23 to 2323 (and 531 to 1531 for plaintext):

iptables -A INPUT -p tcp --dport 23 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 531 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 2323 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 1531 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 2424 -m state --state NEW -j ACCEPT  # tls telnet
iptables -A INPUT -p tcp --dport 1515 -m state --state NEW -j ACCEPT  # tls netcat
iptables -A INPUT -p tcp --dport 8023 -m state --state NEW -j ACCEPT  # http/ttyd
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23 -j REDIRECT --to-port 2323
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 531 -j REDIRECT --to-port 1531

(you'll have to do this on every reboot)

documentation

not really but there is a list of commands and a list of hotkeys, and also UI demystified

protips

try the following commands and hotkeys after connecting:

  • /cy enables colored nicknames
  • /b3 (max cowbell) beeps on every message
  • /v or ctrl-n hides names and makes wordwrap more obvious; good for viewing a wall of text that somebody pasted
  • CTRL-L or /r if rendering breaks

other surprises

  • when running r0c.py it will extract a few bundled clients for your convenience (powershell and bash); look for the [SFX] sfxdir: /tmp/pe-r0c.1000 message during startup, they'll be in a clients subfolder over there

    • if you installed r0c through pip instead then the clients will be somewhere crazy like C:\Users\ed\AppData\Roaming\Python\share\doc\r0c\clients\powershell.ps1 or /home/ed/.local/share/doc/r0c/clients/powershell.ps1, good luck!

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

r0c-1.6.1.tar.gz (76.1 kB view details)

Uploaded Source

Built Distribution

r0c-1.6.1-py2.py3-none-any.whl (83.4 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file r0c-1.6.1.tar.gz.

File metadata

  • Download URL: r0c-1.6.1.tar.gz
  • Upload date:
  • Size: 76.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for r0c-1.6.1.tar.gz
Algorithm Hash digest
SHA256 a0bf52f6a7f319992d38b909de708a562ae87d6019954447c31beb297a4b05f7
MD5 95ca009e0db20bb44d896035859e6769
BLAKE2b-256 3c09ecf91aa324e6b95268a8c5a5d871528b373f951f5d8b839a710b3b92099b

See more details on using hashes here.

File details

Details for the file r0c-1.6.1-py2.py3-none-any.whl.

File metadata

  • Download URL: r0c-1.6.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 83.4 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for r0c-1.6.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 2d385ccd828290c43999c6b63270ab562014896e996cef18ba4a83a35a27a82d
MD5 0dbc6ac9519e59d615205319a2a339c0
BLAKE2b-256 25ce45e2f277e270964d27b7007112d40b3be46fd6bdbad672604452ffc14e08

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page