wndr4300实现Webdav服务器

环境与目标

路由器硬件:Netgear wndr4300

路由器系统:OpenWrt Barrier Breaker 14.07正式版

Omnifocus的Mac版从2.0开始不再支持Bonjour同步,迫使我不得不自己在Mac上搭建了一个Webdav服务器。

具体搭建方法这里不详述了,因为我发现这个服务器非常不稳定,经常连不上,导致体验比较差。尝试从路由器ping我的Macbook,发现延迟很高,相当不稳定。于是决定将Webdav服务器搬到我的openwrt路由器上去。

好在openwrt上要支持Webdav也很方便,首先,openwrt自带的uhttpd是不支持Webdav的,因而必须要用支持Wevdav的lighttpd替换它。这个uhttpd原本的任务是做luci配置页面的后台,因而lighttpd需要接管这个任务。

安装lighttpd

首先,通过如下命令安装lighttpd及相关module。

opkg update
opkg install lighttpd
opkg install lighttpd-mod-webdav
opkg install lighttpd-mod-auth
opkg install lighttpd-mod-cgi

cgi用于替代uhttpd做管理页面的后台。

auth用于Webdav的验证,但并不是必须的。

配置lighttpd

随后对lighttpd的配置文件/etc/lighttpd/lighttpd.conf进行修改

首先启用mod:

server.modules = (
# "mod_rewrite",
# "mod_redirect",
# "mod_alias",

# "mod_status",
# "mod_setenv",
# "mod_fastcgi",
# "mod_proxy",
# "mod_simple_vhost",
  "mod_cgi",
# "mod_ssi",
# "mod_usertrack",
# "mod_expire",
  "mod_webdav",
  "mod_auth"
)

注意Webdav在auth前,之所以这样配置主要是lighttpd的文档强调了这个事。我并没有亲自尝试过不这么安排顺序会怎样。

向下找到cgi的配置项,将其改为

cgi.assign = ( "luci" => "/usr/bin/lua")

最后找到Webdav的配置项,改为

$HTTP["url"] =~ "^/omnifocus($|/)" {
 webdav.activate = "enable"
# webdav.is-readonly = "enable"
 webdav.sqlite-db-name = "/var/run/lighttpd-webdav-lock.db"
}

注意这里is-readonly我并没有启用,因为要作为omnifocus的同步服务器是需要将文件像服务器写入的。这块配置第一行的意思是当访问url中omnifocus子目录时进行大括号内的配置,既启用Webdav并配置数据库。

这个配置是无加密验证的配置,考虑到这个路由器只在自己家庭内使用,暂且配置到这种程度是够用的。

启用lighttpd

接下来保存配置,并到/www中建一个目录

cd /www
mkdir omnifocus

未来同步的数据就存储在这个目录中。

禁用uhttpd并启用lighttpd

/etc/init.d/uhttpd stop
/etc/init.d/uhttpd disable
/etc/init.d/lighttpd enable
/etc/init.d/lighttpd start

这之后试着访问路由器ip地址,应该能和之前一样访问路由器后台页面了。同时也可以通过forklift一类的工具尝试一下server地址设置为路由器ip(默认是192.168.1.1),remote path 设置为/omnifocus,不出以外即可连接上路由器的Webdav服务器了。

此时将omnifocus的Webdav服务器地址设置为

http://192.168.1.1/omnifocus

即可完成同步了。

为路由器设置一个域名

我觉得192.168.1.1这个地址太通用了,当我的设备在其他网络中时,可能会将那个网络的路由器当作Webdav同步服务器,进而尝试进行同步。为了避免这种情况,我想将路由器绑定一个域名,比如openwrt.lan,这个域名在路由器局域网外无意义,因而设备不会得到对应的ip地址,进而不会尝试同步,而在内网中指向路由器ip,使得同步功能能在内网正常工作。

方法非常简单,在路由器的hosts文件(/etc/hosts)中加一行:

192.168.1.1 openwrt.lan

保存后重启dnsmasq服务生效

/etc/init.d/dnsmasq restart

注意如果你的设备开启了VPN或自己指定了DNS服务器,则不会向路由器请求域名解析,这种情况需要另外想办法。

如果一切顺利,你可以将omnifocus的Webdav服务器的地址改成

http://openwrt.lan/omnifocus

好像少了点什么

auth部分待续,因为现在同步体验非常棒,搞得我都懒得弄这个了。