比这篇新的文章:
Codee#18255
比这篇旧的文章: Codee#18231
作者: weizhe86, 点击377次, 评论(0), 收藏者(1), , 打分:
所有评论,共0条:( 我也来说两句)
比这篇旧的文章: 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:]))
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条:( 我也来说两句)
代码
