source: trunk/tools/sali_check @ 571

Last change on this file since 571 was 571, checked in by dennis, 7 years ago

Minor change to the sali_check script

  • Property svn:executable set to *
File size: 8.4 KB
Line 
1#!/usr/bin/env python
2
3import os
4import sys
5import re
6import ftplib
7import datetime
8import xmlrpclib
9import getpass
10
11WIKI_URL = 'https://%s:%s@oss.trac.surfsara.nl/sali/login/xmlrpc'
12WIKI_PAGE = 'SaliUsedPrograms'
13
14## The following versions are supported by us
15SHOW_VERSIONS = [
16        '1.5.8',
17]
18
19### TAKEN FROM http://code.activestate.com/recipes/135435-sort-a-string-using-numeric-order
20def sorted_copy(alist):
21    # inspired by Alex Martelli
22    # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52234
23    indices = map(_generate_index, alist)
24    decorated = zip(indices, alist)
25    decorated.sort()
26    return [ item for index, item in decorated ]
27   
28def _generate_index(str):
29    """
30    Splits a string into alpha and numeric elements, which
31    is used as an index for sorting"
32    """
33    #
34    # the index is built progressively
35    # using the _append function
36    #
37    index = []
38    def _append(fragment, alist=index):
39        if fragment.isdigit(): fragment = int(fragment)
40        alist.append(fragment)
41
42    # initialize loop
43    prev_isdigit = str[0].isdigit()
44    current_fragment = ''
45    # group a string into digit and non-digit parts
46    for char in str:
47        curr_isdigit = char.isdigit()
48        if curr_isdigit == prev_isdigit:
49            current_fragment += char
50        else:
51            _append(current_fragment)
52            current_fragment = char
53            prev_isdigit = curr_isdigit
54    _append(current_fragment)   
55    return tuple(index)
56### END EXTERNAL
57
58def replace_version( value, program, version ):
59    return value.replace( '$(%s_VERSION)' % program.upper(), version )
60
61def read_maked(path):
62
63    for item in os.listdir(path):
64
65        program = None
66        version = None
67        tarball = None
68        info    = None
69
70        if item.endswith('.rul'):
71            program = item[:-4]
72
73            if program == 'xmlrpc-c':
74                program = 'xmlrpc'
75
76            if program == 'popt':
77                continue
78
79            if program == 'kernel':
80                program = 'linux'
81                regex =  r'%s_(?P<vartype>[A-Z]+)(?P<assign>[:= \t]+)(?P<value>.+)$' % program.upper()
82            else:
83                regex =  r'^%s_(?P<vartype>[A-Z]+)(?P<assign>[:= \t]+)(?P<value>.+)$' % program.upper()
84
85            fi = open(os.path.join(path,item),'r')
86            data = fi.read()
87            fi.close()
88
89            ## match: PROGRAM_VARIABLE = VALUE
90            for result in re.finditer(regex,data,re.MULTILINE):
91                if result.group('vartype').lower() == 'version':
92                    if program == 'linux':
93                        if not version:
94                            version = list()
95                        if result.group('value') not in version:
96                            version.append( result.group('value') )
97                    else:
98                        version = result.group('value')
99                elif result.group('vartype').lower() == 'tarball':
100                    tarball = result.group('value')
101                elif result.group('vartype').lower() == 'info':
102                    info = result.group('value')
103
104            yield(program,version,tarball,info)
105
106DATA = dict()
107
108def append_to_dict(path,sversion):
109
110    ## First we check the trunk
111    path = os.path.join(os.path.join(path,sversion),'initrd/make.d')
112    for program,version,tarball,info in read_maked(path):
113        if not DATA.has_key(program):
114            DATA[program] = dict()
115
116        DATA[program]['tarball'] = tarball
117        DATA[program]['info'] = info
118       
119        if not DATA[program].has_key('versions'):
120            DATA[program]['versions'] = dict()
121
122        if not DATA[program]['versions'].has_key(version):
123            DATA[program]['versions'][version] = list()
124
125        DATA[program]['versions'][version].append(sversion)
126
127def append_main_maked(ipath,sversion):
128
129    path = os.path.join(os.path.join(ipath,sversion),'make.d')
130    if not os.path.exists(path):
131        path = os.path.join(os.path.join(ipath,sversion),'kernel/make.d')
132
133    for program,version,tarball,info in read_maked(path):
134        if not DATA.has_key(program):
135            DATA[program] = dict()
136
137        DATA[program]['tarball'] = tarball
138        DATA[program]['info'] = info
139       
140        if not DATA[program].has_key('versions'):
141            DATA[program]['versions'] = dict()
142
143        if program == 'linux':
144            for lversion in version:
145                if not DATA[program]['versions'].has_key(lversion):
146                    DATA[program]['versions'][lversion] = list()
147
148                DATA[program]['versions'][lversion].append(sversion)
149        else:
150            if not DATA[program]['versions'].has_key(version):
151                DATA[program]['versions'][version] = list()
152
153            DATA[program]['versions'][version].append(sversion)
154
155def tags_or_branches(path):
156    for version in os.listdir(path):
157        if version not in SHOW_VERSIONS:
158            continue
159
160        if os.path.exists(os.path.join(os.path.join(path,version),'initrd/make.d')):
161            append_to_dict(path,version)
162            append_main_maked(path,version)
163
164def column(word,length,align=''):
165    pattern = '%'+align+str(length)+'s'
166    return pattern % word
167
168if __name__ == '__main__':
169
170    action = 'trac'
171    path = None
172
173    if len(sys.argv) > 1 and len(sys.argv) < 4:
174        if os.path.exists(sys.argv[1]):
175            path = sys.argv[1]
176
177        if sys.argv[2] in ['print','trac']:
178            action = sys.argv[2]
179
180    if not path:
181        print "No path valid and/or given"
182        sys.exit(1)
183           
184    tags_or_branches(os.path.join(path,'tags'))
185    tags_or_branches(os.path.join(path,'branches'))
186
187    append_to_dict(path,'trunk')
188    append_main_maked(path,'trunk')
189
190    ftp = ftplib.FTP('ftp.sara.nl')
191    ftp.login()
192    try:
193        ftp_data = ftp.nlst('pub/sali/sources')
194    except ftplib.error_perm, resp:
195        ftp_data = list()
196    ftp.close()
197
198    ftp_data = [os.path.basename(item) for item in ftp_data if not os.path.basename(item) in ['.','..']]
199
200    tarballs = list()
201    trac_data = list()
202    if action == 'trac':
203        trac_data.append( '= Packages used by SALI =' )
204
205    for key in sorted_copy(DATA.keys()):
206        if action == 'trac':
207            trac_data.append( '== %s ==' % key )
208            if DATA[key]['info']:
209                trac_data.append( 'Project webpage: [%s]' % DATA[key]['info'] )
210            trac_data.append( '||= Version =||= Used by sali: =||= Tarball =||' )
211        else:
212            print key
213
214        for version in sorted_copy(DATA[key]['versions'].keys()):
215            if action == 'trac':
216                trac_data.append( '|| %s || %s || %s ||' % ( 
217                    version, 
218                    ', '.join(sorted_copy(DATA[key]['versions'][version])),
219                    ' ftp://ftp.sara.nl/pub/sali/sources/'+replace_version(DATA[key]['tarball'],key,version)
220                ) )
221            else:
222                print column(version,16),'|','Tarbal: ftp://ftp.sara.nl/pub/sali/sources/'+replace_version(DATA[key]['tarball'],key,version)
223                print column('',16),'|','Used in sali:', ', '.join(sorted_copy(DATA[key]['versions'][version]))
224                print
225            tarballs.append(replace_version(DATA[key]['tarball'],key,version))
226
227    if action == 'trac' and trac_data:
228     
229        unix_user = getpass.getuser()
230 
231        username = raw_input('Username [%s]: ' % unix_user)
232        password = getpass.getpass('Password: ')
233
234        if not username and unix_user:
235            username = unix_user
236
237        try:
238            server = xmlrpclib.ServerProxy( WIKI_URL % ( username, password ) )
239            rslt = server.wiki.putPage( 
240                WIKI_PAGE, 
241                "\n".join( trac_data ), 
242                { 'comment': 'autoupdate %s' % str( datetime.datetime.now() ) } 
243            )
244
245            if rslt:
246                print "Data has been save on wikipage %s" % WIKI_PAGE
247            else:
248                print "A unknown error has occurred, failed to save data"
249        except xmlrpclib.ProtocolError, err:
250            print "An error has occured: %s" % err.errcode
251            print "   %s" % str( err )
252        except xmlrpclib.Fault, fault:
253            if fault.faultCode == 1:
254                print "Wikipage is already up to date"
255
256    if ftp_data and action != 'trac':
257        ftp_data = set( ftp_data )
258
259        print "Not used tarballs:"
260        for tar in sorted_copy( ftp_data.difference( set( tarballs ) ) ):
261            print ' -',tar
262        print "Note: linux and zlib excluded"
Note: See TracBrowser for help on using the repository browser.