emlog 更新至 5.1.2 出现的问题 @emlog博客

今天 emlog 博客系统发布了 5.1.2 版本,在更新过程中遇到的问题来总结一下。

1. 从 5.0.1 升级时,执行“up5.0.1to5.1.1.php”升级程序,提示“错误操作:您必须完成升级步骤里的第一步才再进行本操作,详见安装说明”。

解决方法:因为我直接用了 5.1.1 和 5.1.2 的补丁,没有在更新到 5.1.1 之后就升级数据库。将升级程序 (up5.0.1to5.1.1.php) 的 105 行注释掉或删除即可。(请确保是从 5.0.1 升级的,不然要先执行之前的升级程序。)

2. 旧的“代码高亮”插件与新版自带功能冲突,导致“写文章”页面出错,无法载入编辑器。

解决方法:在后台管理页面的“插件”中删除“代码高亮”插件即可。新版 KindEditor 已经带了 prettyprint 代码高亮功能。

3. [W3C Validator 规范错误] (默认主题) 底部 <script>prettyPrint();</script> 缺少 type 属性。

解决方法:修改为 <script type=”text/javascript”> 即可。(位于 content/templates/default/footer.php)

4. [W3C Validator 规范错误] (默认主题) 右侧边栏的 <li> 标签位置错误。

解决方法:在 content/templates/default/module.php 的 79 行后面,插入新行内容 </li> 。应该是作者的小失误吧。

以上所有修改过的文件,可以点击这里下载

由于 emlog 当前没有真正的开源(版本库是托管于 bitbucket 的私有库),<更正>emlog 官微告诉我现在已经开源了,源码在GitHub,不过貌似没有之前版本的提交记录了</更正>,我在本地维护了一个修改版的 emlog 程序,包括一些默认模板和代码的修改,修改后的页面都符合 W3C 标准(可以测试本博客首页和大部分文章,有些文章内容中有错误除外)。如果有兴趣的话,可以联系我索取该版本或直接 pull 我的版本库。

使用 systemd 的系统关机或重启时,自动执行特定命令

Arch Linux 这种比较潮的系统,已经迁移到了 systemd 这个管理器。这篇文章介绍如何在系统关机或重启时,自动执行特定命令。当然开机时自动启动服务也是一样的道理。

Manpage of Systemd

systemd 是一种系统和服务管理程序,与 Ubuntu 下的 upstart 类似,都是用来替代原始 BSD 或 System V 风格的 init 程序,实现在开机、不同的启动级别以及关机和重启时,执行相应的命令,启动或停止相应的服务。

1. 首先,我们要创建自己的 .service 服务文件。创建 /etc/systemd/system/xiaodu.service 内容如下:(点击下载

[Unit]
Description=Xiaodu: Remove bbswitch before shutdown/reboot
DefaultDependencies=no
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/sbin/modprobe -r bbswitch

其中,ExecStart= 后面替换为自己要执行的命令。我这里是为了在关机或重启前,卸载 bbswitch 模块,以便正常关机。

2. 按照需求将该服务文件链接到特定的位置。例如需要在关机之前执行,则:

# ln -s /etc/systemd/system/xiaodu.service /usr/lib/systemd/system/shutdown.target.wants/

这里的 shutdown.target 指的是关机前需要执行,同样也会在重启之前执行。如果只需在重启之前执行,则需要链接到 reboot.target.wants (可能需要创建该文件夹)。

由于在编写 .service 文件的时候,没有写 [Install] 段落,因此不能直接通过 # systemctl enable xiaodu.service 来启用,只能手动链接。更多信息可以参考 systemd.service 的手册页。

3. 要测试是否生效,可以尝试“启动”该服务 # systemctl start xiaodu.service ,也可以直接关机或重启来检查。

配置 Dnsmasq 来避免山东联通的错误域名劫持广告

这篇讲的是如何配置 Dnsmasq 服务器,来避免 ISP 在域名不存在 (NXDOMAIN) 时返回错误的地址。通用于各个存在此问题的电信、联通运营商。

现在 Ubuntu 或 Arch Linux 等发行版,都默认用 NetworkManager (NM) 来管理网络连接。而现在 NM 已经支持与 Dnsmasq 配合进行 DNS 解析的缓存,而且最新版本 (Ubuntu 12.10 Quantal 以上,或 NM 0.9.6+)中已经可以直接修改 Dnsmasq 的配置文件了。

参考资料: 使用Dnsmasq解决联通的dns劫持 (这篇另外也讲了一些 Dnsmasq 其他的用处,比如防止 DNS 污染、屏蔽特定网站等。我很欣赏这篇文章里屏蔽的那几个网站,哈哈!

1. 首先要确定,你要屏蔽哪些 IP 地址?使用 nslookup 后跟一个不存在的域名,多试几次,可以大概知道一个 IP 地址的范围。例如:

$ nslookup fsjdlfjksljflsjakljls.com
... (省略) ...
Name: fsjdlfjksljflsjakljls.com
Address: 123.129.254.15

当然也可以去网上查询,例如山东联通的 IP 地址范围是:123.129.254.11 ~ 123.129.254.19。(这里吐槽一下,最开始用了9台服务器估计是想负载均衡,结果愚蠢的联通不知道该怎么配置,于是最开始解析到的都是 123.129.254.13,现在又都是15了……)

2. 然后要确定,你是不是在用 Dnsmasq?是的话,应该修改哪个配置文件?注意观察上面 nslookup 的结果,如果有这样一行:

Server: 127.0.0.1

就说明你在使用 Dnsmasq 本地服务器;否则如果是一个公网地址,就说明你没有配置使用它。

之后,再确定你是手动安装的 Dnsmasq,还是 NM 自带的?(关于如何配置 NM 使用 Dnsmasq,Ubuntu 是默认如此的,Arch 等用户请查看相关文档。)

$ ps aux | grep dnsmasq
... /usr/bin/dnsmasq ... --pid-file=/var/run/nm-dns-dnsmasq.pid ... --conf-file=/var/run/nm-dns-dnsmasq.conf ... --conf-dir=/etc/NetworkManager/dnsmasq.d

这里就能看出,是一个由 NM 控制的 Dnsmasq,包含 NM 动态生成的配置文件 /var/run/nm-dns-dnsmasq.conf,以及用户可修改的配置文件夹,也就是我们用到的 /etc/NetworkManager/dnsmasq.d 。如果没有看到类似的字样,说明你的 Dnsmasq 是手动安装的,配置文件通常位于 /etc/dnsmasq.conf。

3. 最后,按照 Dnsmasq 的格式,修改配置文件。如果是 NM 控制的,请在 /etc/NetworkManager/dnsmasq.d 下创建 xiaodu.conf,并填入以下内容;如果是手动安装的,请在 /etc/dnsmasq.conf 中添加以下内容。(其中的 IP 地址每行一个,按自己 ISP 的实际情况修改

bogus-nxdomain=123.129.254.11
bogus-nxdomain=123.129.254.12
bogus-nxdomain=123.129.254.13
bogus-nxdomain=123.129.254.14
bogus-nxdomain=123.129.254.15
bogus-nxdomain=123.129.254.16
bogus-nxdomain=123.129.254.17
bogus-nxdomain=123.129.254.18
bogus-nxdomain=123.129.254.19

写入完成后,保存即可。之后,可以重新启动 NM 或 Dnsmasq,使新配置生效。现在再来查询上面的域名:

$ nslookup fsjdlfjksljflsjakljls.com
... (省略) ...
** server can't find fsjdlfjksljflsjakljls.com: NXDOMAIN

这样就实现了我们上面的目的,防止 ISP 对不存在的域名进行劫持。