如何在redhat 5上使用CentOS的源

2011年06月15日

在redhat5系上使用yum是要注册的,不过可以使用centos的源来更新redhat。
先删掉自带的yum:

rpm -aq|grep yum|xargs rpm -e --nodeps

(–nodeps:不考虑依赖,强制安装)
然后手动下载三个文件并安装:(如果遇到404 请去http://mirrors.163.com/centos/5/os/i386/CentOS/查找最新版本,因为163源每天都会有更新)

wget http://mirrors.163.com/centos/5/os/i386/CentOS/yum-metadata-parser-1.1.2-3.el5.centos.i386.rpm
wget http://mirrors.163.com/centos/5/os/i386/CentOS/yum-3.2.22-33.el5.centos.noarch.rpm
wget http://mirrors.163.com/centos/5/os/i386/CentOS/python-iniparse-0.2.3-4.el5.noarch.rpm

rpm -ivh python-iniparse-0.2.3-4.el5.noarch.rpm yum-metadata-parser-1.1.2-3.el5.centos.i386.rpm yum-3.2.22-33.el5.centos.noarch.rpm --force --nodeps

编辑配置:

vi /etc/yum.repos.d/CentOS-Base.repo

[base]
name=CentOS-5 - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever5&arch=$basearch&
repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://mirrors.163.com/centos/5/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#released updates
[update]
name=CentOS-5 - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=updates
baseurl=http://mirrors.163.com/centos/5/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#packages used/produced in the build but not released
[addons]
name=CentOS-5 - Addons
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=addons

baseurl=http://mirrors.163.com/centos/5/addons/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#additional packages that may be useful
[extras]
name=CentOS-5 - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=extras

baseurl=http://mirrors.163.com/centos/5/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-5 - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=centosplus
baseurl=http://mirrors.163.com/centos/5/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#contrib - packages by Centos Users
[contrib]
name=CentOS-5 - Contrib
#mirrorlist=http://mirrorlist.centos.org/?release=4&arch=$basearch&repo=contrib
baseurl=http://mirrors.163.com/centos/5/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

执行yum更新:

yum update

如何流畅的使用google的服务:

2011年05月26日

如何流畅的使用google的服务:
ping google.cn  然后得到一个ip地址 然后将google的各种域名都绑定到这个ip上,就可以使用google的各种服务了。
203.208.46.145 是我ping得到的ip。目前几乎所有的google服务都可以这样使用
我目前绑定的域名有:
C:\Windows\System32\drivers\etc\hosts
203.208.46.145 www.appspot.com
203.208.46.145 appengine.google.com
203.208.46.145 appspot.com
203.208.46.145 www.google.com
203.208.46.145 gmail.com
203.208.46.145 www.gmail.com
203.208.46.145 mail.google.com
203.208.46.145 reader.google.com
203.208.46.145 doc.google.com
203.208.46.145 docs.google.com
203.208.46.145 goo.gl

在RHEL/centos5.2上升级python到2.5

2011年05月25日

由于centos 5 上的python 默认是2.4 ,不支持pexpect库,加上python2.4也太老了,很多库很多方法都有不一样的地方
比如urlparse方法的返回的结果集在2.4上显示和2.5就不一样;所以还是升级为好。

wget http://python.org/ftp/python/2.5.6/Python-2.5.6c1.tgz
tar zxvf Python-2.5.tgz
cd Python-2.5
./configure
make
make install
mv /usr/bin/python /usr/bin/python_bak
ln -s /usr/local/bin/python /usr/bin/python ###建立软连接,使系统默认的python指向python2.5

运行python -V检验当前环境十分为2.5版本

升级完成后,在REHL和centos5上面还会遇到yum无法工作的情况,这时候只需要做如下修改即可:
vi /usr/bin/yum

将文本编辑显示的#/usr/bin/python修改为#/usr/bin/python2.4,保存修改即可

LVS集群健康检查

2011年05月24日

LVS 对健康检查相关选项:
quiescent=yes
如果启用这个选项,它使ldirectord按时计算这个配置文件的md5校验和值,看其是否有改动,当发现有改动时自动应用那些改动,这个方便的 特性运行你容易地改变集群的配置,你对配置文件改动后几秒,ldirectord将察觉到有改动,调用ipvsadm命令实现改动,从有效服务器池中移除
quiescent=no
当一个节点在checktimeout设置的时间周期内没有响应是它是“静止的”(它的权重为0),当你设置了这个选项后,ldirectord将 会从IPVS表中移除真实服务器而不是“停止”它,从IPVS表移除节点将中断现有的客户端连接,并使LVS丢掉所有的连接跟踪记录和持续连接模板,如果 你不将这个选项设置为no,当某个节点崩溃时,对某些客户端计算机而言可能会显示为集群关闭了,因为在这个节点崩溃前这些客户端计算机被分配给它了,而连 接跟踪记录和程序连接模板仍然保留在Director上。

python 绑定ip获取指定url的下载信息

2011年05月16日

这个脚本主要作用是为了访问指定ip 指定url的页面下载情况,会输出3个信息,页面大小,http状态,建立连接时间,第一个字节传输时间,总时间。虽然此前已经用pycurl写过一个类似的脚本,但是没有绑定ip的功能,特别在一个服务有很多ip的情况下不是很方便,因此就有了这个脚本的诞生;因为看pycurl的文档发现没有绑定ip的方法,就只能很在python中用subprocess运行curl命令了。


#/usr/bin/env python
# coding: UTF-8
#@author: rui.xu <mrhaigui@gmail.com>
import sys
import socket
import urllib
import subprocess
from urlparse import urlparse
def fetch_url(URL,host):
	url = URL
	ip = host
	output = urlparse(url)
	modurl = output[0]+"://"+ip+output[2]+output[3]+output[4]+output[5]
	curl_cmd = "curl -o /dev/null -m 10 --compressed -s -w %{size_download}' '%{http_code}' '%{time_connect}' '%{time_starttransfer}' '%{time_total}"+" -H \"Host:"+output[1]+"\" "+modurl
	#print curl_cmd
	p = subprocess.Popen(curl_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
	(stdoutput,erroutput) = p.communicate()
	return url+"\n"+stdoutput

def main():
	url = sys.argv[1]
	ip = sys.argv[2]
	print fetch_url(url,ip)
if __name__ == '__main__':
	main()

用nginx屏蔽非法信息的url

2011年05月16日

去年写的一个小脚本,当时需求是为了及时屏蔽掉非法信息url,待客服部门确认后,再解封或者继续封锁,免得网监拔线。
这个是最初的脚本,后来写了一个restful服务(web.py写的),便于公司内部客服管理系统使用,restful服务暂时不贴了
在本脚本中利用到python的urlparse方法来提取出链接的uri,这样方便替换:
关于urlparse的用法:
在这里直接粘贴的是ipython的交互式输入输出,各位看官相信也已了然了,

In [1]: from urlparse import urlparse
In [2]: out = urlparse('http://daxuxu.info/2011/05/nginx-deny-some-invalid-url.html')

In [3]: out
Out[3]: ParseResult(scheme='http', netloc='daxuxu.info', path='/2011/05/nginx-deny-some-invalid-url.html', params='', query='', fragment='')

In [4]: out[0]
Out[4]: 'http'

In [5]: out[1]
Out[5]: 'daxuxu.info'

In [6]: out[2]
Out[6]: '/2011/05/nginx-deny-some-invalid-url.html'

该功能脚本程序如下:

#!/usr/bin/python
# coding: UTF-8
#@author: rui.xu <mrhaigui@gmail.com>
#Filename:
import os
import time
import datetime
import sys
import re
from urlparse import urlparse

def update_conf(url):
	out= urlparse(url)
	uri=out[2]
	print uri
	#if tryUri(uri):
	#	print "url is illegality"
	#else:
	startTime = time.localtime()
	strStartTime = time.strftime('%Y%m%d%H%M%S', startTime)
	fileName = '/home/xr/url_filter_rest/'+'deny_'+strStartTime+'.conf'
	#fileName = 'deny_'+strStartTime+'.conf'
	f_ng_conf = open(fileName,'w')
	line1_head = 'if ($request_uri = "'
	line1_end = '"){'
	line1=line1_head+uri+line1_end
	#line2 =  '    return 403;'
	line2 = '    rewrite ^ http://www.domain.com/error.html;'
	line3 = '}'
	print line1
	print line2
	print line3
	f_ng_conf.write(line1+"\n"+line2+"\n"+line3+"\n")
	f_ng_conf.close()
	return fileName

def tryUri(path):
	orc='css|js|css|png|jpeg|jpg|gif'
	if path == '/':
		return True
	if re.search(orc,path):
		print "Match"
		return True
	else:
		print "Not Match"
		return False

def main():
	inputUrl = sys.argv[1]
	update_conf(inputUrl)

if __name__ == '__main__':
	main()

linux netstat 连接状态查看

2011年05月16日

本文来自于高进波的博客

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

返回结果示例:

LAST_ACK 1
SYN_RECV 1
CLOSE_WAIT 33
ESTABLISHED 217
FIN_WAIT1 15
FIN_WAIT2 16
TIME_WAIT 46697
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

shell命令行下的光标移动等操作快捷键

2011年05月16日

(注意下面的”前”都是指”左”或”上”,”后”是”右”或”下”)

C-r 查找历史执行命令,很便捷的调用历史命令的方式,输入历史命令关键字,就会及时显示匹配命令,enter 即可执行
C-p 前一条指令
C-n 后一条指令
C-c 终止已经运行的命令(针对还没有运行完的命令和脚本,实际为向相关进程发送中断信号)或者取消已经输入的命令
C-o/C-j/C-m 执行当前行输入的命令,跟 enter 类似
C-l 清屏,clear 命令

C-a 移动光标到行首
C-e 移动光标到行尾

C-t 交换光标前俩字符的位置
C-h 往后删除一字符
C-d 往前删除一字符
C-b 往后移动一个字符
C-f 往前移动一个字符

下面几个操作原理估计类似 emacs 的 yank 操作,可以理解为一套独立的粘贴板机制:
C-w 剪切前一个单词(空格间隔的字符串单元)
C-u 剪切到行首
C-k 剪切到行尾
C-y 粘贴剪切

django url redirect

2011年05月16日

假如想让django把 / 重定向到 /blog

用lambda函数。

from django.http import HttpResponseRedirect

urlpatterns = patterns('',

    (r'^$', lambda x: HttpResponseRedirect('/blog/')),

)

这儿这个x是必须的,django会将request对象传到这儿.

来源:http://www.renrenhot.tk/blog/4/

Django 访问外键

2011年05月16日

访问外键的方法如下:

>>> b = Book.objects.get(id=50)
>>> b.publisher
<Publisher: Apress Publishing>
>>> b.publisher.website
u'http://www.apress.com/'

>>> p = Publisher.objects.get(name='Apress Publishing')
>>> p.book_set.all()
[<Book: The Django Book>, <Book: Dive Into Python>, ...]

>>> p = Publisher.objects.get(name='Apress Publishing')
>>> p.book_set.filter(name__icontains='django')
[<Book: The Django Book>, <Book: Pro Django>]

这里的book_set是一个QuerySet。book_set是django自动生成的。