12月 11

raspberry pi 自动初始化脚本

  玩了几天,打算刷一下。但是很多要升级也挺麻烦,直接写了个脚本,自动升级。大家如果还有自己需要的,也可以自行添加,这样初始就方便多了。
  先修改成亚洲的源
$ sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
$ sudo vi /etc/apt/sources.list
deb http://mirror.nus.edu.sg/raspbian/raspbian wheezy main contrib non-free rpi
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ wheezy main contrib non-free rpi

  如果直接用我的脚本命令如下:
$ wget http://www.simonzhang.net/wp-content/uploads/2012/12/pisystemupdate.py_.gz
$ gunzip pisystemupdate.py_.gz ;chmod a+x pisystemupdate.py_;python pisystemupdate.py_
不知道为什么加了个尾巴

  脚本内容如下:

#!/bin/env python
# -*- coding:utf-8 -*-
# Revision:
# Date:        2012-12-10
# Author:      simonzhang
# Email:       simon-zzm@163.com
# Web:         www.simonzhang.net
# -------------------------------
import os
import time

def SystemUpdate():   #系统升级
    try:
        os.system('sudo apt-get -y update')
        _get = 'ok'
    except:
        _get = 'ERROR'
    return _get

def Timing():   #校时
    try:
        os.system('sudo cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime')
        os.system('sudo apt-get install -y ntpdate')
        os.system('sudo /usr/sbin/ntpdate stdtime.gov.hk')
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get


def Vncserver():    #远程桌面
    try:
        os.system('sudo apt-get install -y tightvncserver') 
        _get = 'ok'
    except:
        _get = 'ERROR'
    return _get


def DevelopTool():    #开发工具
    try:
        os.system('sudo apt-get install -y gcc make')
        _get = 'ok'
    except:
        _get = 'ERROR'
    return _get

def SystemTools():    #系统常用工具
    try:
        os.system('sudo apt-get install -y bison gawk vim chkconfig') 
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get


def PythonTools():   #python 管理工具
    try:
        os.system('wget -q http://peak.telecommunity.com/dist/ez_setup.py')
        os.system('sudo python ez_setup.py')
        os.system('sudo easy_install pygame')
        _get = 'ok'
    except:
        _get = 'ERROR'
    return _get

	
def PythonImage():    #python的图片处理
    try:
	os.system('sudo apt-get install -y libjpeg*-dev')
	os.system('sudo apt-get install -y python-imaging') 
	os.system('sudo apt-get install -y python-dev')
	os.system('sudo easy_install tornado PIL')
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get


def PythonFrame():    #python框架
    try:
        os.system('sudo easy_install tornado Django')
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get

def OpenCV():   #摄像头
    try:
        os.system('sudo apt-get install -y python-opencv')
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get


def InstallMysql():   #数据库,密码为pi
    try:
	os.system('sudo debconf-set-selections <<< \'mysql-server-5.5 mysql-server/root_password password pi\'')
	os.system('sudo debconf-set-selections <<< \'mysql-server-5.5 mysql-server/root_password_again password pi\'')
	os.system('sudo apt-get -y install mysql-server')
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get


def Installjava():   #java环境
    try:
	os.system('sudo apt-get install -y openjdk-7-jdk')
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get

def ChineseFont():   #中文字体
    try:
	os.system('sudo apt-get install -y ttf-wqy-microhei')
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get
	
def InputMethod():   #输入法
    try:
	os.system('sudo apt-get install -y scim scim-pinyin')
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get

	
def AudioDriver():   #音频
    try:
        os.system('sudo apt-get install -y alsa-utils')
        os.system('sudo modprobe snd_bcm2835')
	_get = 'ok'
    except:
        _get = 'ERROR'
    return _get

	
def main():
    install_list = [SystemUpdate, \
                    Timing, \
                    Vncserver, \
                    DevelopTool, \
                    SystemTools, \
                    PythonTools, \
                    PythonImage, \
                    PythonFrame, \
                    OpenCV, \
                    InstallMysql, \
                    Installjava, \
                    ChineseFont, \
                    InputMethod,  \
                    AudioDriver, \
                    SystemUpdate,
                   ]
    for il in install_list:
        print '*' * 50
        print ': %s start' % il
        print '*' * 50
        install_status = il()
        nt = time.localtime()
        log_time = "%s-%s-%s %s:%s:%s" % (nt[2], nt[2], nt[3], nt[4], nt[5], nt[6])
        log_file = open("pi_install.log", "ab")
        log_file.write("%s %s install %s\n" % (log_time, il, install_status))
        log_file.close()
    os.system('sudo apt-get upgrade -y')
    print "Install all end."


if __name__ == '__main__':
    main()

pisystemupdate.py

6月 20

nginx 自动封 ip 过高连接

  用命令查看web连接过高的IP地址,但是需要人工智能去封,太麻烦了,直接写个脚本自动解决。web服务器是用nginx,python为2.6
  首先在nignx的config中建立空文件deny.ip, 然后在nginx.conf 的http标签中添加“include deny.ip;”。在nginx下sbin的目录中放入自动脚本。脚本可以查到连接最大的IP,并插入屏蔽列表中,验证正确性后导入配置。全部完成或者出错后发送邮件。被封ip再次访问会报403错误,如果不希望报错可以跳转到其它页面。源码如下:

check_deny_up.py

#!/bin/python
#-*- coding:utf-8 -*-
# Filename:    main.py
# Revision:    1.0
# Date:        2012-06-20
# Author:      simonzhang
# web:         www.simonzhang.net
# Email:       simon-zzm@163.com
### END INIT INFO
import os
from string import strip
from email.mime.text import MIMEText
import smtplib

####
check_comm = "/bin/netstat -antp|grep :80|awk ' ''{print $5}'|awk -F: '{print $1}'|sort -r|uniq -c|sort -n -k1 -r"
max_ip = 100
mail_host = ‘’;
mail_user = ‘’;
mail_pwd = ‘’;
mail_to = ‘’;
mail_cc = ‘’;


def reboot_nginx_sendmail(ip_list):
    #### reboot nginx
    _get_check_confile = os.popen('./nginx -t').readlines()
    if str(_get_check_confile.find('ok')) != '-1':
        os.system('./nginx -s reload')
        _mail_content = ip_list
    else:
        _mail_content = 'Error'
    #### send mail
    msg = MIMEText(_mail_content)
    msg['From'] = mail_user
    msg['Subject'] = ' force ip.'
    msg['To'] = mail_to
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user, mail_pwd)
        s.sendmail(mail_user, [mail_to, mail_cc], msg.as_string())
        s.close()
    except Exception, e:
        print e


#### force out IP
def force_out(_deny_ip):
    _write_status = 0
    _read_force_file = open('../conf/deny.ip', 'rb').read()
    if  str(_read_force_file.find(_deny_ip)) == '-1':
        try:
            _get_force_file = open('../conf/deny.ip', 'ab')
            _get_force_file.write('deny %s ;\n' % _deny_ip)
            _get_force_file.close()
            _write_status = 1
            return _write_status
        except:
            return _write_status
            reboot_nginx_sendmail("Error !")
    return _write_status


def main():
    get_high_ip = os.popen('%s' % check_comm).readlines()
    _count_force_ip = 0
    _force_ip_list = ''
    for i in xrange(3):
        try:
            _get_count = strip(get_high_ip[i]).split(' ')[0]
            _get_ip = strip(strip(get_high_ip[i]).split(' ')[1])
        except:
            _get_count = 0
            _get_ip = ''
        # Maximum connection IP is Beyond the limit value
        if (int(_get_count) > max_ip) and (len(_get_ip) > 0):
            force_ip = _get_ip
            _get_status = force_out(force_ip)
            # check maximum is added in the deny.ip file
            if str(_get_status) == '1':
                _count_force_ip += 1
                _force_ip_list += ' %s ' % force_ip
#    if _count_force_ip > 0:
#        reboot_nginx_sendmail(_force_ip_list)


if __name__ == '__main__':
    main()

启动i脚本
check_deny_up.sh

#! /bin/bash
#
# make simon-zzm@163.com
#
#
### END INIT INFO

# Source function library.
. /etc/profile
cd /Data/apps/nginx/sbin/

# See how we were called.
case "$1" in
  start)
      /usr/local/bin/python check_ip_deny.py
      ;;
  *)
        echo $"Usage: $0 {start}"
        exit 1
esac

exit

将启动脚本放在crontab中运行。

3月 25

导出mysql 上传到ftp备份

导出mysql的库上传到ftp服务器备份,上传完毕删除本地文件。用crontab定时运行。用shell也很容以实现,毕竟在学习python,练习一下。

#!/usr/bin/env python
#-*- coding: utf-8 -*-
# ——————————————————————————-
# Filename: Back mysql
# Revision: 1.0
# Date: 2010-03-24
# Author: simon-zzm
# Email: simon-zzm@163.com
# Description:
# ——————————————————————————-
import os,time,sys
from ftplib import FTP
import datetime

###################设置参数
mysql_user=’root’
mysql_pass=’123456′
mysql_comm=’/usr/local/mysql/bin/mysqldump’
mysql_data=[‘test_a’,’test_b’] ###可以填写多个库
mysql_local_path=’/usr/local/checksystem/’
ftp_ip=’x.x.x.x’
ftp_user=’ftpuser’
ftp_pass=’test’
admin_mail=’simon-zzm@163.com’
###################开始运行
#导出的文件为gz的压缩文件,命名格式为ip地址、库名、导出日期组成。
###获得当前时间
get_time_now=time.strftime(‘%Y-%m-%d’)
###获得本机IP地址
ip = os.popen(“/sbin/ifconfig | grep ‘inet addr’ | awk ‘{print $2}'”).read()
get_local_ip = ip[ip.find(‘:’)+1:ip.find(‘n’)]
for i in mysql_data:
###拼成包名
mysql_back_name=mysql_local_path+get_local_ip+’_’+i+’_’+get_time_now+’.gz’
###拼成导出命令
gzip_command = “%s -u%s -p%s –opt %s |gzip >%s” %(mysql_comm,mysql_user,mysql_pass,i,mysql_back_name)
###导出并判断是否成功
if os.system(gzip_command)==0:
print ‘Back Successful’
###导出成功上传到ftp服务器
ftp=FTP()
ftp.set_debuglevel(2)
ftp.connect(ftp_ip,’21’)
ftp.login(ftp_user,ftp_pass)
file_handler = open(mysql_back_name,’rb’)
bufsize = 1024
ftp.storbinary(‘STOR %s’ % os.path.basename(mysql_back_name),file_handler,bufsize)
ftp.set_debuglevel(0)
file_handler.close()
ftp.quit()
print ‘up load over!’
###偷个懒使用linux命令将本地文件删掉。
os.popen(“/usr/bin/find “+mysql_local_path+”* -name *.gz -exec rm -rf {} ; “)
else:
print ‘false’
###如果导出失败,给管理员发个信,偷个懒使用linux命令解决。
mail_url=”/bin/mail -s “+get_local_ip+”back fail “+admin_mail+” os.popen(mail_url)