python bt_python实现p2p文件传输

本文介绍了一种基于BT协议的Python工具,用于大规模部署文件,特别是针对服务器集群。通过该工具,作者成功地将一个240M的文件在140秒内分发到70多台机器,效率显著。文章包含代码实现,展示了如何创建和下载BT种子,以及使用方法和环境准备。该工具适用于提升文件在多台主机间的传输速度。
摘要由CSDN通过智能技术生成

一、需求及应用场景

考虑到我手上的服务器逐渐的增多,有时候需要大规模的部署同一个文件,例如因为方便使用systemtap这个工具定位问题,需要把手上几百台服务器同时安装kernel-debuginfo这个包,原有的方式采用一个源服务器,采用rsync或者scp之类的文件传输方式只能做到一个点往下分发这个文件,这个时候下发的速度就会比较的慢,基于以上原因,我写了一个基于bt协议传输文件的小工具,实际测试,传输到10个机房,70多台机器传输一个240M的这个内核文件,到所有的机器,源采用限速2m/s的上传速度,测试的结果大概只要140s,就可以全部传输完毕,这个效率是非常之高,如果不限速的情况下速度会更快,下面把这个程序开源出来。

二、代码

#!/usr/bin/env python

import libtorrent as lt

import sys

import os

import time

from optparse import OptionParser

import socket

import struct

import fcntl

def get_interface_ip(ifname):

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s',

ifname[:15]))[20:24])

def ip2long(ip):

return reduce(lambda a,b:(a<<8)+b,[int(i) for i in ip.split('.')])

def get_wan_ip_address():

interfaces = set(['eth0', 'eth1', 'eth2', 'eth3', 'em1', 'em2', 'em3', 'em4'])

ip = ''

for i in interfaces:

try:

ip = get_interface_ip(i)

if (ip2long(ip) < ip2long('10.0.0.0') or ip2long(ip) > ip2long('10.255.255.255')) \

and (ip2long(ip) < ip2long('172.16.0.0') or ip2long(ip) > ip2long('172.33.255.255')) \

and (ip2long(ip) < ip2long('192.168.0.0') or ip2long(ip) > ip2long('192.168.255.255')):

return ip

except:

pass

return ip

def make_torrent(path, save):

fs = lt.file_storage()

lt.add_files(fs, path)

if fs.num_files() == 0:

print 'no files added'

sys.exit(1)</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值