Cisco 7941G IP Phone 刷SIP固件

托@lty1993 的福,最近入手了几台便宜的Cisco 7941G IP Phone,由此开启了刷机之旅。

默认情况下这部电话通过Cisco自家的Call manager系统来provison和管理。仅在固件升级到9.2 SIP之后才能连接标准的SIP服务器当作一部SIP Phone来独立使用。Cisco的各种文档里只描述了如何通过自家系统provison,对于如何通过TFP刷机之有寥寥数语。@lty1993 反复试验探索出了如下刷机方法,我在此做一份笔记,希望可以帮到(想淘便宜电话的)后人

首先要确定你的电脑固件版本,低于8.0的情况下没法直接升级。建议先做一个hard reset后从8.0固件刷起。方法是按住#键接电源,看到液晶屏右边选择两路线路的灯(以下简称两灯)黄色闪烁后放开,按3491672850*# 后机器下方耳机,静音,speaker(以下简称三灯)开始红色闪烁即开始了删除固件的过程。这个过程完成后电话开机液晶屏是完全不现实内容的,只有两灯交替闪烁绿色。

这个时候就要开始刷机。你需要一台TFT服务器根目录下放置电话固件内容(稍后会详细解释)。并且你的DHCP服务器需要添加一个额外的Option。code为150,value是转成16进制的TFTP server的IP地址。比如你的IP如果是192.168.66.3,那value就是0xC0A84203 注意前面的0x不能省略。这样做的目的是为了让电话在启动的时候通过DHCP拿到TFTP服务器地址从而进行固件升级。

根据无数次人肉实验得出的经验是固件升级可以跳级,但是必须遵循 8.0 (3)-> 8.5(2) -> 9.4(2) -> 9.2(2)[sip] 这个顺序。低于8.0的固件需要先做hard reset后才能刷入8.0固件。固件可以从Cisco网站下载。记得需要下载zip文件版本,文件解压缩后得到的文件放入TFTP服务器根目录。在Linux下我们尝试过tftp-hpa,在Mac OSX下有TftpServer都测试可以正常使用。

紧接着刚才提到的hard reset后两灯闪烁绿色情况。如果这个时候TFTP server开启并且DHCP option设置成功的话,你的电话应该能自动开始刷机。刚刚hard reset后升级液晶屏是没有显示的,但是电话右下角的三灯会慢慢地出现一个红色灯从左往右移动,这个过程会持续一分半钟。如果发现红色快速一闪而过那说明固件校验不合格或版本非法。

当升级8.0 成功后第一次启动就能看到液晶屏上又出现久违的Cisco字样。这时候可以准备更新TFTP上的固件并且拔掉电话电源。之后还是需要按着#键开机,并且在两灯黄色闪烁的时候soft reset,按键如下 123456789*0# 这个时候电话会立刻重启并且寻找TFTP服务器开始升级。在固件升级的同时可以在液晶屏上看到正在更新的文件和进度显示。

前三次升级 8.0, 8.5, 9.4的时候都只需要固件文件即可,最后一次升级9.4 SIP完成后开机会自动在TFTP服务器上寻找SIP服务器配置和dial plan配置文件。这个时候情确保TFTP server继续开启。这两个配置文件也是Cisco文档里找不到具体schema,全靠 @lty1993 人肉一点点摸索出来。其中SEPXXXXXXXXXXXX.cnf.xml 中的XXXXXXXXXXXX需要替换为电话的Mac地址其中字母全部大写。dialplan-XXXXXXXXXXXX.xml 文件名是在SEPXXXXXXXXXXXX.cnf.xml中指定的, 所以不一定需要叫这个名字,这里仅仅为了便于管理才保持同样命名规则。

下面是2个配置例子。基本上修改下服务器地址和extension/password就可以正常使用了。需要注意的是这部电话似乎只支持SIP TCP链接,而freepbx/asterisk默认是UDP,需要手工开启TCP支持,否则registering会一直注册不上。 <transportLayerProtocol>这个参数值为1即为TCP,2为UDP,默认是4(不知道是什么?也许是CM中某个协议?)

需要修改的地方还有EXTENSION_NUMBER 换成SIP服务器上真实的extension号码,比如100. <authPassword> 的值替换成账户密码。<dialTemplate> 的值替换为你的dial plan文件用户名。

至此当你的电话升级固件至9.2 SIP之后开机能读到正确的2个配置文件就应该能立刻注册上你的SIP服务。如果发现registering一直不过,首先检查你的服务器是否支持TCP连接。

Cisco网站固件下载地址
用户配置文件

配置文件修改还可以参考 这个网址

如果你在配置文件中发掘中了新功能不妨留言和大家分享一下,比如通讯录功能如果可以和LDAP连起来应该会很有意思。

解决 svn: local missing, incoming edit upon merge

事情源于今天下午做的一个svn rebase操作

trunk上有文件a.sql, 在newbranch上被改名成了b.sql。在我对newbranch做rebase之前,trunk上的a.sql又从其他branch merge到了一些改动,于是当我svn merge trunk -> newbranch的时候就不可避免的出现了tree conflict。这个时候用svn st查看newbranch上working copy的状态就会发现这个文件的状态是 “> local missing, incoming edit upon merge”。

解决办法就是首先svn resolve --accept working a.sql,将tree conflict先解决,这时候在working copy里a.sql是不存在的(因为working copy里只有b.sql)。然后需要将a.sql从其他branch merge来的改动也merge回newbranch上的b.sql。

svn log --stop-on-copy newbranch 获取newbranch创建时的revision,假设为r100
svn merge -r100:HEAD '^/trunk/a.sql' b.sql 把所有从r100开始到head所有对于a.sql的改动全部merge到b.sql。至此,这个头疼的local missing, incoming edit upon merge就解决。如果有多个文件则依次逐个merge。

归根结底这源于svn对于文件移动的实现是copy + delete,这样会赋予改名后的新文件一个新的revision。2002年的时候就有人因此开了一个bug ticket,不过看样子是不会有fix了…

如果想一劳永逸解决这个问题,最终解决方案就是放弃svn转投git

Gentoo 下开启pip的bash completion

1. 安装 Pip
[code lang=”bash”]
$ curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
[/code]

2. 生成bash completion profile
[code lang=”bash”]
$ pip completion –bash >> /usr/share/bash-completion/pip
[/code]

3. 开启pip的bashcomp
[code lang=”bash”]
$ eselect bashcomp enable pip
[/code]

Mac OSX 上安装 cx_Oracle (for python)

系统: Mac OS X Lion 10.7.3 64bit
环境: Gentoo Prefix Bash / Python 2.7.3

首先从Oracle下载 Oracle Instance Client

Lion下需要安装32bit版本

  • instantclient-basic-10.2.0.4.0-macosx-x86.zip
  • instantclient-sdk-10.2.0.4.0-macosx-x86.zip

解压zip文件到同一目录下,得到类似如下文件

开始安装前需要设置环境变量如下
[code lang=”bash”]
# export ORACLE_HOME=[File Path]/instantclient_10_2
# export LD_LIBRARY_PATH=$ORACLE_HOME
# export DYLD_LIBRARY_PATH=$ORACLE_HOME
[/code]

还需要做一个符号链接
[code lang=”bash”]
# cd $ORACLE_HOME
# ln -s libclntsh.dylib.10.1 libclntsh.dylib
[/code]

接下来的安装过程就和其他python module一样
[code lang=”bash”]
# easy_install cx_Oracle
[/code]

2010年我所购买的软件和服务

2010即将过去,在此总结下自己在这一年里付费购买的软件以及服务。作为一个软件行业从业人员,尊重软件开发者的劳动价值,树立版权意识,以及对于网络付费应用(当然我指的不是收费成人网站)的接受程度应该是循序渐进的。仅以此文献给诸多读者,希望大家在读后能更多的支持开发者以得到更好的服务和高质量的软件作品。

1. Flickr 年费 $24.95 尽管自己是Google服务的忠实拥趸,但Picasa在国内的境遇实在是惨了点。被墙的后果就是当你想分享照片给不善于网络翻墙的亲友时会有诸多不便。付费成为Pro后即没有每个月100兆流量限制,并且可以看到自己照片被浏览的数据统计。胶州路的一场大火让自己对物理胶片的保存心存后怕,有条件的情况下还是尽量数字化后异地在线多点保存吧。对于墙外的用户来说Picasa有一大优势就是你所购买的容量是和Gmail共享,完全不浪费。

2. Last Pass 年费 $12 在密码保存领域尽管有1Password这样更好的选择,但能用Yubico key来做二次验证算是Last Pass最终吸引我购买的原因。每次验证的时候需要插入YubiKey并且按动那个绿色光圈实在是一件很Geek的举动。同时Last Pass也支持PC/Mac/Android/iOS 全平台。

3. Linode VPS 年费 $239 此blog发布的主机,也可以自己安装配置来提供各式各样的网络服务,你懂的。

4. MyWi 购买费 $19.99 iOS上用来做WIFI tethering的利器,有了它,WIFI Only的iPad出门也可以共享iPhone上的3G网络。不过和Android 2.2引入的Mobile AP功能不同,MyWi所创建的网络是基于Ad-hoc的。在截至Android 2.2.1的系统上还不支持接入Ad-hoc无线网,关于这个功能实现进度的读者可以参看 点此访问

5. 3G Unrestrictor 购买费 $3.99 Cydia Store上的又一好软件,用于“欺骗”程序将3G网络识别为WIFI。这样就可以在3G网络下使用Facetime(经测试联通网络下速度流畅),并且App Store也可以在3G网络下下载超过20兆的软件。

6. Office 2010 Home & Student Edition for PC / Office 2011 for Mac 用了多年的盗版Office,这次下定决心买了PC/MAC各一套正版。PC版虽然不带Outlook但已经完全不影响使用了,个人邮件重心都在Gmail上,不需要本地邮件客户端了。并且在你的邮件超过1G之后Outlook的搜索速度就变得让人难以忍受。

7. Mobile Me 年费 $99 Apple自家的云服务。你拥有的Mac设备越多,它就越有用。使用下来感觉me的邮件推送在iOS上速度比Gmail的更快。不过相比Android上的Gmail Push还是略逊一筹,不知道明年Apple在北卡的新数据中心投入使用后会不会有所改善。包含的iDisk,也是在Dropbox被墙之后分享文件给墙内用户的无奈之选。至于Gallery,手机上传不太稳定,不如Flickr好。Contacts同步和Android上用户体验无异。总体来说,如果你有超过两样Mac/iOS设备并且对价格不十分敏感的话,Mobile Me是个好选择。

8. Apple iTunes Store的诸多软件。今年已经充值了$75用户购买各种软件和游戏,唯一的不满就是不提供iPhone和iPad套装购买。同一款软件如果有HD版本的必须分开两次购买,如果Apple能提供bundle purchase加上稍许折扣,那会方便诸多同时拥有大小两件iOS的用户。

这篇文章的写作有感于 @tinyfool 的《盗版带给我们的是什么?》 自己和身边的人都是IT业内人士,如果连自己人都无视知识产权的重要性,那又如何指望别人来尊重自己的劳动成果?买得起iPhone/iPad的人不会买不起$0.99的软件,一套Office家庭与学生版可以用几年无须到处找激活码,即装即用。尊重他人就是尊重自己的劳动力。

rTorrent中schedule设置技巧

rTorrent中可以配置schedule让其监控某个指定目录,发现.torrent文件后自动下载。搭配事件控制可以达到讲下载好的文件自动移动到另一个目录并且继续做种的效果。

某些情况下我们希望监控多个目录,并且将下载完毕的文件根据种子源目录的不同移动到不同的目录,这时候就要用到下面的配置。

[code]
schedule = watch_directory_1,10,10,”load_start=~/Download/watch_stuff1/*.torrent,d.set_custom1=~/Download/stuff1/”
schedule = watch_directory_2,10,10,”load_start=~/Download/watch_stuff2/*.torrent,d.set_custom1=~/Download/stuff2/”

# 下载完成后将文件移动到变量custom1指定的目录
system.method.set_key =event.download.finished,move_complete,”d.set_directory=$d.get_custom1= ;execute=mv,-u,$d.get_base_path=,$d.get_custom1=”
[/code]

上面的mv就是指系统自带的命令。同理我们可以让rTorrent在下载完毕后执行指定的命令,比如发送一封email到指定信箱提醒。
[code]
# First and only argument to rtorrent_mail.sh is completed file’s name (d.get_name)
system.method.set_key = event.download.finished,notify_me,”execute=~/rtorrent_mail.sh,$d.get_name=”
[/code]
rtorrent_mail.sh如下
[code]
#!/bin/sh
echo “$(date) : $1 – Download completed.” | mail -s “[rtorrent] – Download completed : $1” alerts@example.com
[/code]

Hello world!

玩了几年虚拟主机,先是从国内的某不知名群租服务器上搬到了上海神话科技的主机,接着又是托同服务器上爱搞点不和谐内容的“邻居”的福三天两头被CT查封服务器,再后来兴起了ICP良民备案制度。不堪其扰之下把域名和主机都搬迁到了US Dreamhost的旗下。尽管dreamhost的服务挺好,而且速度和空间也不构成瓶颈,本着电工就是爱折腾的想法最后还是租了VPS。现正在把所有站点慢慢迁移至VPS主机,情绪稳定。