在Ubuntu上安装指定版本的Firefox

如果你使用Selenium(Webdriver),并且用Firefox作为一个主要的测试浏览器的话,最近一定比较郁闷。Selenium最近也是一路快跑,升级到了2.12了。他们的博客也就是发到2.9而已。而伟大的FF居然升级到了8.0,伤不起啊!每次新版本Firefox出来以后,Webdriver基本上肯定是支持不了的,然后发一个小版本来fix一下,我说你们这是何苦呢?最郁闷的是,我用PythonBindings,在Ubuntu 11下是用不了的,只能在Ubuntu 10上面搞。昨天Firefox自动升级到8.0,我也就跟着完蛋了。吐槽完毕,说说解决办法。

1. 下载指定版本的Firefox

先在这里:http://releases.mozilla.org/pub/mozilla.org/firefox/releases/下载你想要的Firefox,这里我下的7.0。点进去以后还得选平台,大家都懂得。

2. 解压缩包

tar jxpvf firefox-7.0.tar.bz2

3. 修改owner,假如说上面解压缩出来的文件是放在/home/qa/firefox下

sudo chown -R root:root /home/qa/firefox

4. 把原来的symbol link删掉

sudo unlink /usr/bin/firefox

5. 建一个新的link

sudo ln -s /home/qa/firefox/firefox /usr/bin/firefox

搞定!

最后一步,关掉Firefox的自动更新

1. 在Firefox里面输入

about:config

2. 找到这个变量,设置为false

app.update.auto

终于搞定。

鉴于现在Selenium和Firefox频繁升级,如果大家的自动化测试跑得好好的,就不要主动或者被动地升级了。麻木追新是要付出代价的。

用Python修改含有日期的文件名

问题:修要修改一些LOG FILE的名字,那些LOG FILE的文件名格式大概是 log-v0-20091012-daily-1a5019a0.csv 。需要修改红色的日期部分,把这个日期改小一点,例如改到20091001。

首先上程序:

import time, os, string, sys
ONE_DAY = (24 * 60 * 60)
if __name__ == "__main__":
    if len(sys.argv)<2:
        print "argv error, useage: python " + __file__ + " foldername int"
        sys.exit()
    if len(sys.argv)==2:
        intrday = 1
    else:
        intrday = int(sys.argv[2])
    folder = sys.argv[1]
    localtime = time.localtime()
    todate = str(localtime[0]) + str(localtime[1]) + str(localtime[2])
    targettime = time.localtime(time.time() - ONE_DAY*intrday)
    newdate = str(targettime[0]) + str(targettime[1]) + str(targettime[2])
    print folder
    for file in os.listdir(folder):
        newname = string.join(string.split(file, todate), newdate)
        os.rename(folder+file, folder+newname)

用的时候就是 $ python rename.py ./ 4 ;这个命令会把当前目录下面符合这个条件的文件名中的日期往前改4天,运行完了以后的文件名就是:log-v0-20091008-daily-1a5019a0.csv

如果还需要把文件的访问时间和修改时间也一并修改的话,那么只需要用os.utime(path, times)这个函数就好了,times是元组(Tuple),一般可以这样用:

time_for_utime = (time.time(), time.time())
os.utime(path, time_for_utime)

Linux下的snmpd.conf配置说明

SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。在RHEL中,SNMP的配置文件地址是/etc/snmp/snmpd.conf。snmpd.conf的配置项很多,但是真正常用的就那么几个,下面来逐个介绍。

com2sec命令,它的基本语法是“com2sec NAME SOURCE COMMUNITY”。这里要提一下SNMP的安全策略,其实SNMP的安全性并不好,在这个协议中使用COMMUNITY这个东西来做访问控制的。简单来理解就是现在有一个帮会的一个人找去了总舵,那么这个人怎么跟总舵相认呢?他们直接约定一个“暗号”,例如见面就说“床前明月光”,那么总舵的前台就会带你去“床前明月光”想对应的地方。现在回过头来看这行配置,假如有以下一句话

com2sec  magusu default  magus

意思就是做一个映射,把magus这个COMMUNITY串和magusu这个名字做好一对映射,那么以后在调用SNMP的时候,只要你声明你就是magus,那么就可以获得相应的权限了。有了映射以后下面需要做的是建立一个从magusu到组的一个映射,用到的命令是group,它的基本语法是“group NAME MODEL SECURITY”

group  magusg v2c  magusu

上面这句话的意思就是把magusu放到组magusg里面,用的协议是v2c,插一句,SNMP现在通常用的有3个版本。那好了,组建好了下来要做什么呢?就是要建立一个VIEW,VIEW的基本语法是“view NAME TYPE SUBTREE [MASK]”

view  magusv  included  .1.3.6.1.4.1.9129

像上面这句话的意思就是赋予magusv这个view能够查看1.3.6.1.4.1.9129下面所有节点的权限。最后要做的是设定哪些组的人,哪些view的用户可以做什么具体的事情,用access来设置,基本语法是“access NAME CONTEXT MODEL LEVEL PREFX READ WRITE NOTIFY”。

access   magusg   “”   any   noauth   exact   magusv   magusv   none

由于例子中用的是v2c版本的协议,所以CONTEXT必须为空,MODEL也就是协议的版本号,在这里例子里面可以是any也可以是v2c,还是由于v2c的缘故,所以LEVEL是noauth;READ、WRITE和NOTIFY分别需要指定一个view或者什么都不指定;在这里的设置就是magusv这个view可以对前面设置好的节点进行读和写操作。

到此,服务端的配置已经完成,重启一下snmpd就可以了,下面看看如何通过SNMP得到我们想要的数据

snmpwalk -v 2c -c magus localhost 1.3.6.1.4.1.9129.1.2.2

snmpwalk可以便利指定节点下的所有子节点,-v 参数指定SNMP的协议版本,这个跟我们之前配置服务器的版本是要一致的,也就是2c,然后-c参数就指定了community的字符串,也就是刚才定义的magus,然后就是主机地址,由于我在本机测试,所以用的localhost,实际中可以填上IP,最后就是OID的值。搞定!

对于刚刚接触SNMP的朋友来说,理解community的作用是关键,其实说的通俗点就是接头暗号,而且还是个明文的“暗号”。

VT100终端下screen key binding参考对照表

从此就在Linux环境下工作了,最近听说一个软件,名叫screen,主要应用的场景就是当你需要运行一些耗时较长的任务的时候,终端很容易就超时了,超时了以后你前面做的所有东西都白费了,但是有了screen,永远在线成为可能。developerWorks上有一篇文章专门介绍screen的使用,推荐阅读。

我碰到的问题就是想修改screenrc这个配置的时候,不知道具体的Key Binding,看到默认配置里面K7对应的F7按键,F1对应的F11,比较迷茫。还好终于谷歌出来一个很有用的对照表。具体怎么设置可以看这里