Monthly Archives: June 2012

简单的Python DNS服务器

import socket

class DNSQuery:
  def __init__(self, data):
    self.data=data
    self.dominio=''

    tipo = (ord(data[2]) >> 3) & 15   # Opcode bits
    if tipo == 0:                     # Standard query
      ini=12
      lon=ord(data[ini])
      while lon != 0:
        self.dominio+=data[ini+1:ini+lon+1]+'.'
        ini+=lon+1
        lon=ord(data[ini])

  def respuesta(self, ip):
    packet=''
    if self.dominio:
      packet+=self.data[:2] + "\x81\x80"
      packet+=self.data[4:6] + self.data[4:6] + '\x00\x00\x00\x00'   # Questions and Answers Counts
      packet+=self.data[12:]                                         # Original Domain Name Question
      packet+='\xc0\x0c'                                             # Pointer to domain name
      packet+='\x00\x01\x00\x01\x00\x00\x00\x3c\x00\x04'             # Response type, ttl and resource data length -> 4 bytes
      packet+=str.join('',map(lambda x: chr(int(x)), ip.split('.'))) # 4bytes of IP
    return packet

if __name__ == '__main__':
  ip='192.168.1.1'
  print 'pyminifakeDNS:: dom.query. 60 IN A %s' % ip
  
  udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  udps.bind(('',53))
  
  try:
    while 1:
      data, addr = udps.recvfrom(1024)
      p=DNSQuery(data)
      udps.sendto(p.respuesta(ip), addr)
      print 'Respuesta: %s -> %s' % (p.dominio, ip)
  except KeyboardInterrupt:
    print 'Finalizando'
    udps.close()

DNS压力测试软件

压力测试软件queryperf
BIND的本身就自带压测软件queryperf,只是默认编译的时候不被编译。

1、下载bind软件,

# wget http://ftp.isc.org/isc/bind9/9.7.3/bind-9.7.3.tar.gz        
# tar zxvf bind-9.7.3.tar.gz        
# cd bind-9.7.3/contrib/queryperf/

2、安装queryperf
看一下README 说的很想详细。

# ./configure
# make

编译完之后会生成queryperf 文件。
使用方法:
实例:

# queryperf -d input_file -s server
  input_file:压力测试的时候读取的文件,
          格式: www.rootman.cn A
                 www.rootman.cn A
 server:要测试dns服务器的IP。

以下是shell脚本,向input_file里边多插入些数据测试。

#!/bin/sh
var=1
while [ $var -le 10000 ]
do
echo "www.rootman.cn A " >> test.txt
var=$(($var + 1 ))
done
exit 0

测试结果:

Statistics:

  Parse input file:     once
  Ended due to:         reaching end of file

  Queries sent:         11659 queries
  Queries completed:    11654 queries
  Queries lost:         5 queries
  Queries delayed(?):   0 queries

  RTT max:              0.015806 sec
  RTT min:              0.000707 sec
  RTT average:          0.003978 sec
  RTT std deviation:    0.001477 sec
  RTT out of range:     0 queries

  Percentage completed:  99.96%
  Percentage lost:        0.04%

  Started at:           Fri Jun 29 16:25:48 2012
  Finished at:          Fri Jun 29 16:25:53 2012
  Ran for:              5.252518 seconds

  Queries per second:   2218.745371 qps

Centos和Debian使用网易源

1、首先备份/etc/yum.repos.d/CentOS-Base.repo

#mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、根据CentOS版本选择操作
CentOS-5

#wget http://mirrors.163.com/.help/CentOS5-Base-163.repo -O /etc/yum.repos.d/CentOS-Base.repo
#yum makecache

CentOS-6

#wget http://mirrors.163.com/.help/CentOS6-Base-163.repo  -O /etc/yum.repos.d/CentOS-Base.repo
#yum makecache

Debian-5
编辑/etc/apt/sources.list文件

deb http://mirrors.163.com/debian lenny main non-free contrib  
deb http://mirrors.163.com/debian lenny-proposed-updates main contrib non-free  
deb http://mirrors.163.com/debian-security lenny/updates main contrib non-free   
 
deb-src http://mirrors.163.com/debian lenny main non-free contrib  
deb-src http://mirrors.163.com/debian lenny-proposed-updates main contrib non-free  
deb-src http://mirrors.163.com/debian-security lenny/updates main contrib non-free

Debian-6 (Squeeze)

deb http://mirrors.163.com/debian/ squeeze main non-free contrib
deb http://mirrors.163.com/debian/ squeeze-proposed-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ squeeze main non-free contrib
deb-src http://mirrors.163.com/debian/ squeeze-proposed-updates main non-free contrib

访问webhostingtalk论坛缓慢的解决办法

访问webhostingtalk论坛一直很慢很慢,但是看起来不像是网络缓慢,因为论坛的头部出来后过了好半天都没有反映,好像是在等待加载什么东西,后来发现是在加载twitter和facebook的widgets造成的,处理方法也很简单,在本机的hosts中把这些指向为localhost就行了:

127.0.0.1 platform.twitter.com
127.0.0.1 connect.facebook.net
127.0.0.1 widgets.digg.com

在win7中hosts的位置在C:\Windows\System32\drivers\etc目录下,直接编辑win7会阻止,需要先把hosts拷贝出来编辑后然后粘贴覆盖即可,win7会要你输入密码,输入后OK。

烦人的wordpress自动半角转全角符号问题

WordPress半角引号自动转换为全角引号问题:

一、通过修改主题functions.php实现:

在主题functions.php文件中加入以下代码:

/*禁用半角引号自动转换为全角引号*/
remove_filter('the_content','wptexturize');

二、通过修改WP源文件实现:
注释掉 wp-includes\formatting.php文件的下列两行代码即可

$curl = str_replace($static_characters, $static_replacements, $curl);
$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);
不过两种方法都试了,但是没有用两个--连在一块仍然会被显示为一个-

PS:或者给需要保留半角的段落加上code标签也可以。

极高的CPU的load average

有个Openvz guest对CPU占用太高,就限制CPU使用率,没想到引起load average的奇高无比,甚至达到了24!后来才发现就是因为给这个guest限制了CPU,所以导致如此。可以用Openvz的工具查看guest的load average:

vzlist -o ctid,laverage

Openvz的guest一般在被CPU限速或者IO限制的情况下,都会导致CPU load average居高不下。

WHCMS强制https后支付宝掉单的问题

自动前几天whmcs强制使用https后,支付宝支付一直处于掉单的状态:具体表现为,客户以及通过支付宝支付,但是WHMCS后台仍显示“未支付”。

看了下alipay的gateway源码,有一项是设置callback的:

$parameter = array(
	"service"         => "create_direct_pay_by_user",  //交易类型
	"partner"         => $gatewayPID,          //合作商户号
	"return_url"      => $systemurl."/modules/gateways/callback/alipay_return.htm",       //同步返回
	"notify_url"      => $systemurl."/modules/gateways/callback/alipay_callback.php",       //异步返回
	"_input_charset"  => $_input_charset,   //字符集,默认为GBK
	"subject"         => "$companyname 订单",        //商品名称,必填
	"body"            => $description,      //商品描述,必填
	"out_trade_no"    => $invoiceid,        //商品外部交易号,必填(保证唯一性)
	"total_fee"       => $amount,           //商品单价,必填(价格不能为0)
	"payment_type"    => "1",               //默认为1,不需要修改

	"show_url"        => $systemurl,         //商品相关网站
	"seller_email"    => $gatewaySELLER_EMAIL      //卖家邮箱,必填
);

我猜想“/modules/gateways/callback/alipay_callback.php”就是支付宝服务器在用户支付成功后通知whmcs支付宝gateway的,但是由于Nginx强制使用https导致支付宝服务器和这个callback的通讯有问题,引起掉单。

解决办法就是在Nginx中去掉对callback的URL强制转换https,本来想用Nginx rewrite模块的if条件,但是Nginx官方不建议使用if条件,因为if is evil,后来直接在conf中独立对callback添加一处设置就行了:

location whmcs/modules/gateways/callback/alipay_callback.php {
break;
}

重启Nginx后,一切OK