比这篇新的文章: Codee#18255
比这篇旧的文章: Codee#18231

apt-getfast2

语言: Python, 标签: python apt-get deb 多线程 ubuntu 2011/04/04发布 1年前更新
作者: weizhe86, 点击377次, 评论(0), 收藏者(1), , 打分:

背景
主题: 字体:
Python语言: apt-getfast2
001 #!/usr/bin/env python
002 #coding=utf-8
003 #filename=apt-getfast2
004 import os
005 import sys
006
007 if os.getuid()!=0:
008     os.system('gksu python %s'%' '.join(sys.argv))
009     exit()
010
011 import md5
012 import time
013 import urllib
014 import threading
015 import shutil
016
017 def md5file(path):
018     fi=open(path)
019     md5code=md5.new(fi.read()).hexdigest()
020     fi.close()
021     return md5code
022
023 class apt:
024     def __init__(self):
025         self.debpath='/var/cache/apt/archives/partial/'
026         self.archpath='/var/cache/apt/archives/'
027     def run(self):
028         comm=os.popen('apt-get --print-uris -y %s'%' '.join(sys.argv[1:]))
029         #comm=os.popen('apt-get --print-uris -y install kdm')
030         self.slist=comm.read().split('\n')
031         self.debdicts={}
032         self.updebdicts={}
033         self.splis()
034         self.mulit()
035
036     def checkdeb(self,deb,debpath):#通过md5 检查deb文件是否完整//注:md5file执行两遍需要优化
037         debs=os.listdir(debpath)
038         debname=debpath+deb
039         if deb not in debs:
040             print '未发现',debname
041             return False
042         elif md5file(debname) != self.debdicts[deb]['md5']:
043             print '发现',debname
044             print md5file(debname)
045             print self.debdicts[deb]['md5']
046             os.remove(debname)
047             return False
048         else:
049             print '\n'+md5file(debname)
050             print self.debdicts[deb]['md5']
051             return True
052     def splis(self):#获取deb词典
053         for i in self.slist:
054             if i.startswith("'http://") :
055                 d=i.split(" ")
056                 self.debdicts.update({d[1]:{'uri':d[0].replace("'",''),'size':int(d[2]),'md5':d[3].split(':')[1]}})
057         for deb in self.debdicts.keys():#统计系统中未下载的deb文件
058             if not self.checkdeb(deb,self.archpath):
059                 self.updebdicts.update({deb:self.debdicts[deb]})
060         self.sizelist=[(self.updebdicts[key]['size'],{key:self.updebdicts[key]}) for key in self.updebdicts]
061         self.sizelist.sort()#排序
062         self.sizelist.reverse()#倒序
063         print [i[0] for i in self.sizelist]
064         print '*'*30
065         joajoeif=(2197976, {'kdelibs5-data_4%3a4.6.1-0ubuntu3_amd64.deb': {'md5': 'a5b5914cc565787e8ca90ada75590a41', 'uri': 'http://archive.ubuntu.com/ubuntu/pool/main/k/kde4libs/kdelibs5-data_4.6.1-0ubuntu3_all.deb', 'size': 2197976}})
066     def down(self,deb):
067         url=deb.values()[0]['uri']
068         filepath=self.debpath+deb.keys()[0]
069         urllib.urlretrieve(url=url,filename=filepath,reporthook=self.show)
070         if not self.checkdeb(deb.keys()[0],self.debpath):
071             self.down(deb)
072         else:
073             shutil.move(filepath,self.archpath+deb.keys()[0])
074             print filepath,'>>>',self.archpath+deb.keys()[0]
075         print '\rok   ',filepath
076         try:
077             tmps=self.nowdeb.next()
078         except:
079             print '\nline close'
080             return
081         self.down(tmps)
082     def show(self,*argv):
083         sys.stderr.write('.')
084     def geturlnow(self):
085         for deb in self.sizelist:
086             yield deb[1]
087     def mulit(self):
088         th=[]
089         self.nowdeb=self.geturlnow()
090         block=min(10,len(self.sizelist))
091         for i in range(block):
092             x=threading.Thread(target=self.down,args=[self.nowdeb.next()])
093             x.start()
094             th.append(x)
095         for i in th:
096             threading.Thread.join(i)
097 starttime=time.time()
098 a=apt()
099 a.run()
100 endtime=time.time()
101 print endtime-starttime
102 os.system('sudo apt-get -y %s'%' '.join(sys.argv[1:]))


所有评论,共0条:( 我也来说两句)


发表评论

注册登录后再发表评论