#gopher #daemon #text-file #server #server-port #ascii-art

bin+lib phd

一种稀有的 Gopher 服务器

16 个版本

0.1.15 2022年12月4日
0.1.14 2020年11月17日
0.1.13 2020年8月22日
0.1.12 2020年6月27日
0.1.3 2019年12月30日

#283网络编程

MIT 许可证

36KB
780



phd 是一个小巧、易于使用的 Gopher 服务器。

将其指向一个目录,它将通过 Gopher 服务器提供所有文本文件、子目录和二进制文件。任何 .gph 文件都将作为 gophermaps 提供服务,并且可执行的 .gph 文件将作为程序运行,其输出将提供给客户端,就像过去的辉煌的 cgi-bin 时代一样!

~ 特殊文件 ~

  • header.gph: 如果在目录中存在,其内容将显示在目录内容之上。在其中放置 ASCII 艺术作品。
  • footer.gph: 与之相同,但将在目录内容下方显示。
  • index.gph: 完全用此文件中的内容替换目录的内容。
  • ??.gph: 访问 gopher://yoursite/1/dog/ 将尝试从磁盘渲染 dog.gph。访问 /1/dog.gph 将渲染 .gph 文件的原始内容。
  • .reverse: 如果存在,将按逆字母数字顺序列出目录内容。如果您按日期排序帖子,则非常有用。

.gph 文件中的任何一行,如果不包含制表符 (\t),将自动添加一个 i 前缀,将其转换为 Gopher 信息项。

为了您的方便,phd 支持 geomyidae 语法来创建链接

This is an info line.
[1|This is a link|/help|server|port]
[h|URL Link|URL:https://noogle.com]

serverport 将转换为活动运行服务器的服务器和端口,例如 localhost7070

包含制表符(\t)的任何行都将原样发送到客户端,这意味着您还可以编写并提供原始的Gophermap文件。

~ 动态内容 ~

任何标记为可执行.gph文件将作为独立程序运行,其输出将发送到客户端。它将传递三个参数:查询字符串(如果有)、服务器的主机名和当前端口。您可以根据需要进行处理。

例如

$ cat echo.gph
#!/bin/sh
echo "Hi, world! You said:" $1
echo "1Visit Gopherpedia	/	gopherpedia.com	70"

然后

$ gopher-client gopher://127.0.0.1/1/echo?something
[INFO] Hi, world! You said: something
[LINK] Visit Gopherpedia

或者更严重的是

$ cat figlet.gph
#!/bin/sh
figlet $1

然后

$ gopher-client gopher://127.0.0.1/1/figlet?hi gopher
[INFO]  _     _                     _
[INFO] | |__ (_)   __ _  ___  _ __ | |__   ___ _ __
[INFO] | '_ \| |  / _` |/ _ \| '_ \| '_ \ / _ \ '__|
[INFO] | | | | | | (_| | (_) | |_) | | | |  __/ |
[INFO] |_| |_|_|  \__, |\___/| .__/|_| |_|\___|_|
[INFO]            |___/      |_|

~ Ruby on Rails ~

sh很有趣,但对于严肃的工作,您需要使用像Ruby、PHP或Node.JS这样的严肃脚本语言。

$ cat sizes.gph
#!/usr/bin/env ruby

def filesize(file)
    (size=File.size file) > (k=1024) ? "#{size/k}K" : "#{size}B"
end

puts "~ file sizes ~"
spaces = 20
Dir[__dir__ + "/*"].each do |entry|
    name = File.basename entry
    puts "#{name}#{' ' * (spaces - name.length)}#{filesize entry}"
end

现在您终于可以与世界分享目录的文件大小了!

$ phetch -r 0.0.0.0:7070/1/sizes
i~ file sizes ~	(null)	127.0.0.1	7070
iCargo.toml          731B	(null)	127.0.0.1	7070
iLICENSE             1K	(null)	127.0.0.1	7070
iMakefile            724B	(null)	127.0.0.1	7070
itarget              288B	(null)	127.0.0.1	7070
iphd                 248K	(null)	127.0.0.1	7070
iCargo.lock          2K	(null)	127.0.0.1	7070
iREADME.md           4K	(null)	127.0.0.1	7070
img                 96B	(null)	127.0.0.1	7070
isizes.gph           276B	(null)	127.0.0.1	7070
isrc                 224B	(null)	127.0.0.1	7070

~ 使用方法 ~

Usage:

    phd [options] <root directory>

Options:

    -r, --render SELECTOR  Render and print SELECTOR to stdout only.
    -h, --host HOST        Hostname for links. [Default: {host}]
    -p, --port PORT        Port for links. [Default: {port}]
    -b, --bind ADDRESS     Socket address to bind to. [Default: {bind}]
    --no-color             Don't show colors in log messages.

Other flags:

    -h, --help      Print this screen.
    -v, --version   Print phd version.

Examples:

    phd ./path/to/site  # Serve directory over port 7070.
    phd -p 70 docs      # Serve 'docs' directory on port 70
    phd -h gopher.com   # Serve current directory over port 7070
                        # using hostname 'gopher.com'
    phd -r / ./site     # Render local gopher site to stdout.

~ 安装 ~

在macOS上,您可以使用Homebrew进行安装。

brew install xvxx/code/phd

Linux、Mac和Raspberry Pi的二进制文件可在gopher://phkt.io/1/releases/phd和https://github.com/xvxx/phd/releases找到。

只需将phd程序解压/解tar到您的$PATH中,然后开始使用!

如果您有cargo,您可以直接安装该包。

cargo install phd --locked

~ 开发 ~

cargo run -- ./path/to/gopher/site

~ 资源 ~

~ 待办事项 ~

  • systemd配置,或者类似的东西
  • TLS支持
  • 用户输入清理测试

~ 状态 ~

phd不再处于积极开发状态,但最新版本运行良好。

依赖项

~225–420KB