面向TiddlyWiki简单易用的ruby webrick服务¶
TiddlyWiki页面不能在浏览器中直接保存:
虽然用浏览器插件能够解决文件本地存储,但是大多数插件都长时间没有更新,导致功能异常 - jimfoltz/tw5-server.rb 通过一个简单的 Ruby Atlas
webrick
实现了服务端保存TiddlyWiki,特别适合个人简单使用
tw5-server.rb
¶
在安装了 Ruby Atlas 的主机上,例如
docs
目录下存放从 TiddlyWiki官网 下载一个空白文档empty.html
。为了方便标识,将这个empty.html
改名为tiddlywiki.html
在同一个目录下存放 jimfoltz/tw5-server.rb 提供的
tw5-server.rb
:
require 'webrick'
require 'fileutils'
if ARGV.length != 0
root = ARGV.first.gsub('\\', '/')
else
root = '.'
end
BACKUP_DIR = 'bak'
module WEBrick
module HTTPServlet
class FileHandler
alias do_PUT do_GET
end
class DefaultFileHandler
def do_PUT(req, res)
file = "#{@config[:DocumentRoot]}#{req.path}"
res.body = ''
unless Dir.exist? BACKUP_DIR
Dir.mkdir BACKUP_DIR
end
FileUtils.cp(file, "#{BACKUP_DIR}/#{File.basename(file, '.html')}.#{Time.now.to_i.to_s}.html")
File.open(file, "w+") {|f| f.puts(req.body)}
end
def do_OPTIONS(req, res)
res['Allow'] = "GET,HEAD,OPTIONS,PUT"
res['dav'] = 'anything' # TW looks for a 'dav' header, and ignores any value
end
end
end
end
server = WEBrick::HTTPServer.new({:Port => 8000, :DocumentRoot => root, :BindAddress => "127.0.0.1"})
trap "INT" do
puts "Shutting down..."
server.shutdown
end
server.start
备注
原 jimfoltz/tw5-server.rb 代码中 Dir.exists?
我修订成 Dir.exist?
以适应Ruby 3.2之后版本( PSA (and a little rant): File.exists? Dir.exists? removed in Ruby 3.2.0 (deprecated in 2.2) )
修改方法参考了 Replace deprecated File.exists? with File.exist? #2740
在目录下运行命令:
ruby tw5-server.rb
输出显示
[2024-01-08 20:20:48] INFO WEBrick 1.7.0
[2024-01-08 20:20:48] INFO ruby 3.0.2 (2021-07-07) [x86_64-linux-gnu]
[2024-01-08 20:20:48] INFO WEBrick::HTTPServer#start: pid=1828686 port=8000
可以看到web服务是绑定在 127.0.0.1:8000
上,这样可以防止外部不安全的访问
对于在服务器上运行的时候,由于对外网卡接口不提供服务,所以我们需要通过 SSH隧道 将ssh登陆后端本地端口转发到服务器上回环地址上:
配置 ~/.ssh/config
设置:
Host bcloud
HostName 192.168.7.159
User admin
# 访问本机回环地址8000,转发到服务器bcloud的回环地址8000
LocalForward 8000 127.0.0.1:8000
这样就可以在 ssh服务 登陆 bzcloud
之后在自己本地浏览器 http://127.0.0.1:8000 访问到服务器对应的 127.0.0.1:8000
运行环境(补充)¶
我在 Termux - Andorid终端 ( 移动开发:Pixel手机(Android)开发环境构建 )环境中,通过 apt install ruby
安装了 ruby 3.2.2
版本。需要注意,如果没有同时安装 Ruby on Rails ,则需要通过 Ruby Gem 来安装上述执行脚本的依赖模块:
gem install webrick
gem install fileutils