88import donate_cpu_lib as lib
99import argparse
1010import glob
11+ import gzip
12+ import natsort
1113import os
1214import sys
1315import random
16+ import re
17+ import requests
1418import subprocess
1519
1620
@@ -20,6 +24,100 @@ def format_float(a, b=1):
2024 return 'N/A'
2125
2226
27+ def ftp_get (url ):
28+ try :
29+ response = requests .get (url , timeout = 300 )
30+ response .raise_for_status ()
31+ return response .content
32+ except requests .RequestException as err :
33+ print ('Failed to fetch {}: {}' .format (url , err ))
34+ return None
35+
36+
37+ def latestvername (names ):
38+ s = natsort .natsorted (names , key = lambda x : x [x .index ('_' )+ 1 :x .index ('.orig.tar' )])
39+ return s [- 1 ]
40+
41+
42+ def getpackages ():
43+ debian = 'https://ftp.debian.org/debian/'
44+
45+ data = ftp_get (debian + 'ls-lR.gz' )
46+ if data is None :
47+ print ('Failed to fetch ls-lR.gz' )
48+ sys .exit (1 )
49+
50+ lines = gzip .decompress (data ).decode ('utf-8' , errors = 'replace' ).splitlines ()
51+
52+ # Example content in ls-lR:
53+ #./pool/main/0/0xffff:
54+ #total 1452
55+ #-rw-r--r-- 2 dak debadmin 6524 Dec 25 2016 0xffff_0.7-2.debian.tar.xz
56+ #-rw-r--r-- 2 dak debadmin 1791 Dec 25 2016 0xffff_0.7-2.dsc
57+ #-rw-r--r-- 2 dak debadmin 57168 Dec 25 2016 0xffff_0.7-2_amd64.deb
58+ #-rw-r--r-- 2 dak debadmin 48578 Dec 26 2016 0xffff_0.7-2_arm64.deb
59+ #-rw-r--r-- 2 dak debadmin 56730 Dec 26 2016 0xffff_0.7-2_armel.deb
60+ #-rw-r--r-- 2 dak debadmin 57296 Dec 26 2016 0xffff_0.7-2_armhf.deb
61+ #-rw-r--r-- 2 dak debadmin 60254 Dec 26 2016 0xffff_0.7-2_i386.deb
62+ #-rw-r--r-- 2 dak debadmin 53130 Dec 26 2016 0xffff_0.7-2_mips.deb
63+ #-rw-r--r-- 2 dak debadmin 52542 Dec 26 2016 0xffff_0.7-2_mips64el.deb
64+ #-rw-r--r-- 2 dak debadmin 53712 Dec 26 2016 0xffff_0.7-2_mipsel.deb
65+ #-rw-r--r-- 2 dak debadmin 51908 Dec 26 2016 0xffff_0.7-2_ppc64el.deb
66+ #-rw-r--r-- 2 dak debadmin 53548 Dec 26 2016 0xffff_0.7-2_s390x.deb
67+ #-rw-r--r-- 2 dak debadmin 65248 Dec 25 2016 0xffff_0.7.orig.tar.gz
68+ #-rw-r--r-- 2 dak debadmin 6884 Jul 19 19:08 0xffff_0.8-1.debian.tar.xz
69+ #-rw-r--r-- 2 dak debadmin 1807 Jul 19 19:08 0xffff_0.8-1.dsc
70+ #-rw-r--r-- 2 dak debadmin 58908 Jul 19 19:08 0xffff_0.8-1_amd64.deb
71+ #-rw-r--r-- 2 dak debadmin 51340 Jul 19 19:58 0xffff_0.8-1_arm64.deb
72+ #-rw-r--r-- 2 dak debadmin 57612 Jul 19 20:13 0xffff_0.8-1_armel.deb
73+ #-rw-r--r-- 2 dak debadmin 58584 Jul 19 19:58 0xffff_0.8-1_armhf.deb
74+ #-rw-r--r-- 2 dak debadmin 57544 Jul 19 20:23 0xffff_0.8-1_hurd-i386.deb
75+ #-rw-r--r-- 2 dak debadmin 62048 Jul 19 23:54 0xffff_0.8-1_i386.deb
76+ #-rw-r--r-- 2 dak debadmin 55080 Jul 23 19:07 0xffff_0.8-1_kfreebsd-amd64.deb
77+ #-rw-r--r-- 2 dak debadmin 58392 Jul 23 19:07 0xffff_0.8-1_kfreebsd-i386.deb
78+ #-rw-r--r-- 2 dak debadmin 54144 Jul 19 22:28 0xffff_0.8-1_mips.deb
79+ #-rw-r--r-- 2 dak debadmin 53648 Jul 20 00:56 0xffff_0.8-1_mips64el.deb
80+ #-rw-r--r-- 2 dak debadmin 54740 Jul 19 22:58 0xffff_0.8-1_mipsel.deb
81+ #-rw-r--r-- 2 dak debadmin 57424 Jul 19 19:58 0xffff_0.8-1_ppc64el.deb
82+ #-rw-r--r-- 2 dak debadmin 53764 Jul 19 22:28 0xffff_0.8-1_s390x.deb
83+ #-rw-r--r-- 2 dak debadmin 64504 Jul 19 19:08 0xffff_0.8.orig.tar.gz
84+ #
85+
86+ path = None
87+ previous_path = ''
88+ archives = []
89+ filename = None
90+ filenames = []
91+ for line in lines :
92+ line = line .strip ()
93+ if len (line ) < 4 :
94+ if filename :
95+ res1 = re .match (r'(.*)-[0-9.]+$' , path )
96+ if res1 is None :
97+ res1 = re .match (r'(.*)[-.][0-9.]+$' , path )
98+ res2 = re .match (r'(.*)-[0-9.]+$' , previous_path )
99+ if res2 is None :
100+ res2 = re .match (r'(.*)[-.][0-9.]+$' , previous_path )
101+ if res1 is None or res2 is None or res1 .group (1 ) != res2 .group (1 ):
102+ archives .append (path + '/' + latestvername (filenames ))
103+ else :
104+ archives [- 1 ] = path + '/' + latestvername (filenames )
105+ if path :
106+ previous_path = path
107+ path = None
108+ filename = None
109+ filenames = []
110+ elif line .startswith ('./pool/main/' ):
111+ path = debian + line [2 :- 1 ]
112+ elif path and line .endswith (('.orig.tar.gz' , '.orig.tar.bz2' , '.orig.tar.xz' )):
113+ filename = line [1 + line .rfind (' ' ):]
114+ filenames .append (filename )
115+
116+ return archives
117+
118+
119+
120+
23121if __name__ == "__main__" :
24122 __my_script_name = os .path .splitext (os .path .basename (sys .argv [0 ]))[0 ]
25123 __work_path = os .path .expanduser (os .path .join ('~' , 'cppcheck-' + __my_script_name + '-workfolder' ))
@@ -40,6 +138,16 @@ def format_float(a, b=1):
40138
41139 print (args )
42140
141+ if args .packages_path :
142+ # You can download packages using daca2-download.py
143+ args .packages = glob .glob (os .path .join (args .packages_path , '*.tar.xz' ))
144+ random .shuffle (args .packages )
145+ elif args .packages is None :
146+ args .packages = getpackages ()
147+ random .shuffle (args .packages )
148+
149+ print ('\n ' .join (args .packages [:20 ]))
150+
43151 if not lib .check_requirements ():
44152 print ("Error: Check requirements" )
45153 sys .exit (1 )
@@ -100,35 +208,14 @@ def format_float(a, b=1):
100208 print ('Failed to compile your version of Cppcheck' )
101209 sys .exit (1 )
102210
103- if args .packages_path :
104- # You can download packages using daca2-download.py
105- args .packages = glob .glob (os .path .join (args .packages_path , '*.tar.xz' ))
106- args .p = len (args .packages )
107- packages_idxs = list (range (args .p ))
108- random .shuffle (packages_idxs )
109- elif args .packages :
110- args .p = len (args .packages )
111- packages_idxs = []
112- else :
113- packages_count = lib .get_packages_count ()
114- if not packages_count :
115- print ("network or server might be temporarily down.." )
116- sys .exit (1 )
117-
118- packages_idxs = list (range (packages_count ))
119- random .shuffle (packages_idxs )
120-
121211 packages_processed = 0
122212 crashes = []
123213 timeouts = []
124214
125- while (packages_processed < args .p and len (packages_idxs ) > 0 ) or args .packages :
126- if args .packages :
127- package = args .packages .pop ()
128- else :
129- package = lib .get_package (packages_idxs .pop ())
215+ while packages_processed < args .p and args .packages :
216+ package = args .packages .pop ()
130217
131- if package .startswith ('ftp://' ) or package .startswith ('http ://' ):
218+ if package .startswith ('ftp://' ) or package .startswith ('https ://' ):
132219 tgz = lib .download_package (work_path , package , None )
133220 if tgz is None :
134221 print ("No package downloaded" )
0 commit comments