文章标签 » python

backup:更实用的大文件搜索

findbigfile.py

#!/usr/bin/env python
import sys, os

#100M
BIG_FILE_SIZE = 1024 * 1024 * 100
BIG_DIR_SIZE = int(os.popen('getconf PAGE_SIZE').read().strip()) * 1024
EXCLUDES = ['/home/cdn/wpt_data']

EXCLUDES = [os.path.normpath(p) for p in EXCLUDES]
stack = [os.path.normpath(sys.argv[1])] 

def format_size(s):
    if s < 1024:
        return '%d Bytes' % s
    if s < 1024 * 1024:
        return '%d KB' % (s/1024)
    if s < 1024 * 1024 * 1024:
    	return '%d MB' % (s/1024/1024)
    return '%d GB' % (s/1024/1024/1024)

while len(stack):
    check_file = stack.pop()

    if check_file in EXCLUDES:
        continue

    #pass link
    if os.path.islink(check_file):
        continue

    if os.path.isfile(check_file):
        s = os.path.getsize(check_file)
        if s > BIG_FILE_SIZE:
            print 'BIG FILE:%s\t%s' % (check_file, format_size(s))
        continue

    if os.path.isdir(check_file):
        s = os.path.getsize(check_file)

        #pass big directory
        if s > BIG_DIR_SIZE:
            print 'BIG DIR:%s\t%s' % (check_file, format_size(s))
            continue

        try:
            for f in os.listdir(check_file):
                stack.append(os.path.join(check_file, f))
        except:
            pass

backup:alexa query

#!/usr/bin/env python

import sys
import urllib
import re
import Queue
import threading
import time
import socket

RANK = re.compile(r'<img src="/images/icons/globe-sm.jpg" alt="Global" style="margin-bottom:-2px;"/>([^<]+)</div>')
CHINA = re.compile(r'<img class="dynamic-icon"[^>]+"China Flag"/>([^<]+)</div>')
WWW = re.compile(r'^www\.')
def get_alexa(domain):
    d = WWW.sub('', domain)
    html = urllib.urlopen('http://www.alexa.com/siteinfo/' + d).read()
    rt = RANK.findall(html)
    output = domain + ','
    if len(rt):
        output += rt[0].strip().replace(',', '')
    else:
        output += '-'
    output += ','
    rt = CHINA.findall(html)
    if len(rt):
        output += rt[0].strip().replace(',', '')
    else:
        output += '-'
    output += '\n'
    sys.stdout.write(output)


class Alexa(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
    
    def run(self):
        while True:
            domain = self.queue.get()
            try:
                get_alexa(domain)
            except socket.error:
                time.sleep(2)
                self.queue.put(domain)
                self.queue.task_done()
                continue
            except:
                self.queue.task_done()
                continue
            self.queue.task_done()

queue = Queue.Queue()
for i in xrange(20):
    t = Alexa(queue)
    t.setDaemon(True)
    t.start()

for line in open('./input.txt'):
    queue.put(line.strip())
queue.join()

backcup:unbuffer implementation in python

#!/usr/bin/env python
import os,sys,pty
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 0)

pid, fd = pty.fork()
if pid < 0:
    print >>sys.stderr, 'fork error'
#child
elif pid == 0:
    os.execvp(sys.argv[1], sys.argv[1:])
#parent
else:
    while True:
        try:
            s = os.read(fd, 1)
        except OSError, e:
            break
        if s == '':
            break
        sys.stdout.write(s)
    os.wait()

backup:tcpdump计算每10秒的平均传输速度(含上下行)

#!/usr/bin/env python

import re,sys
import time
import os
import subprocess
import datetime
import signal

GET_LENGTH = re.compile(r'length (\d+):')
LOG = open('./tcp.log', 'a')
IP = '10.235.160.73' #针对指定站点
while True:
        total = 0
        start = time.time()
        tcpdump = subprocess.Popen('tcpdump -e -i eth0 -nn host %s' % IP, shell=True, stdout=subprocess.PIPE)
        for line in iter(tcpdump.stdout.readline, ''):
                rt = GET_LENGTH.findall(line)
                if len(rt):
                        total += int(rt[0])
                if time.time() - start >= 10:
                        os.kill(tcpdump.pid, signal.SIGKILL)
                        os.waitpid(-1, os.WNOHANG)
                        break

        log = '%s\t%s\n' % (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), total/(time.time() - start)/1024)
        print log,
        LOG.write(log)

fix:ssh主机管理工具~

从一开使用ubuntu,到后来换到mac,一直使用系统自带的ssh命令,上传文件使用scp命令,由于平时使用并不频繁,也不觉得麻烦。再后来每天用到的机器多了,就不得不每次去公司wiki上查一下机器名,然后粘贴一下,次数多了,就迫切需要一个能像securecrt一样管理主机列表的功能。
首先发掘的用的是mac自带终端

这个用了不到一周,发现撮的不行,总是会新开一个窗口,不能在新标签中打开,只能手工再从菜单里选一个合并所有窗口。再高级点的功能搜索,分组更是木有。。

之后装了一个mac版securecrt,当然对于我来说,securecrt就比mac自带终端多一个好用的列表管理,其他功能基本不用。。,用了一个月到期啦。。。

嘿嘿,对于猿类来说,最终极的解决方案就是自己写一个,于是有了这个简单,易用的ssh列表管理脚本sshgo (http://github.com/emptyhua/sshgo),是个python写的命令行小脚本,只依赖python>=2.4, 不需要gui,所以不但可以本地使用,也可以很方便的放到跳板机上使用。

软件特性:

  • 单python文件,仅依赖python版本 >= 2.4,适用于mac,linux系统
  • 分组功能
  • 搜索功能(支持python正则表达式)

使用方法:

将主机列表文件放置在~/.ssh_hosts,使用tab或4个空格来创建分组结果,举个例子:

Home
    root@192.168.1.106
Work
    root@comp1 -p 9999
    root@comp2 -p 9999
    root@comp3 -p 9999
VHost
    VMWare
        test@vm1
        test@vm2
        test@vm3
        test@vm4
    VirtualBox:
        test@vbox1
        test@vbox2
        test@vbox3
        test@vbox4
MacOS
    hi@mymac

然后下载管理脚本

wget "https://raw.github.com/emptyhua/sshgo/master/sshgo" -O ./sshgo
#添加执行权限
chmod +x ./sshgo
#GO,就可以看到前面截图所示的效果了
./sshgo

快捷键:

  • 退出: q
  • 向上滚动: k
  • 向下滚动: j
  • 选择主机: space
  • 搜索: /
  • 退出搜索结果: q
  • 展开分组: o
  • 收起分组: c
  • 展开所有分组: O
  • 收起所有分组: C

使用Zmodem?

Zmodem的确是另一个偶尔会用下的功能,可以通过安装zssh实现,在Mac下可以通过macports安装

sudo port install zssh lrzsz

假如安装了zssh,sshgo会优先使用zssh连接主机。连接前zssh会有提示

Press ^@ (C-Space) to enter file transfer mode, then ? for help
#意思是按ctrl + 空格进入文件传输模式(Mac下的这个组合已经被右上角的Spotlight搜索功能占用了,可以在快捷键设置里给他换到其他快捷键组合)

上传文件

按ctrl + 空格进入文件传输模式,之后使用`sz example.txt`上传文件

下载文件

在服务端`sz example.txt`,然后ctrl + 空格,然后`rz` 接收文件