MythTV master
python_pathfix.py
Go to the documentation of this file.
2# python_pathfix - adjust python shebang paths
3#
4
5import sys
6import os
7from stat import ST_MODE
8import getopt
9
10def main():
11
12 # Pick up default interpreter (ours)
13 python_interpreter = os.path.normcase(sys.executable).encode()
14
15 # Don't bother reporting
16 verbose = False
17
18 # Set default return code
19 ret = 0
20
21 usage = ('usage: %s -v -i /python_interpreter file-or-directory ...\n' % sys.argv[0])
22
23 try:
24 opts, args = getopt.getopt(sys.argv[1:], 'i:v')
25 except getopt.GetoptError as msg:
26 sys.stderr.write(str(msg) + '\n')
27 sys.stderr.write(usage)
28 sys.exit(1)
29 for o, a in opts:
30 if o == '-i':
31 python_interpreter = a.encode()
32 if o == '-v':
33 verbose = True
34
35 if not python_interpreter or not python_interpreter.startswith(b'/'):
36 sys.stderr.write('-i interpreter option invalid (must be specified as a full path)\n')
37 sys.stderr.write(usage)
38 sys.exit(1)
39
40 if not args:
41 sys.stderr.write('file or directories not specified\n')
42 sys.stderr.write(usage)
43 sys.exit(1)
44
45 for arg in args:
46 if os.path.islink(arg):
47 continue
48 if os.path.isfile(arg):
49 if pathfix(filename=arg,
50 verbose=verbose,
51 python_interpreter=python_interpreter):
52 ret = 1
53 if os.path.isdir(arg):
54 for root, subdirs, files in os.walk(arg):
55 for f in files:
56 filename = os.path.join(root, f)
57 if os.path.islink(filename):
58 continue
59 if os.path.isfile(filename):
60 if pathfix(filename=filename,
61 verbose=verbose,
62 python_interpreter=python_interpreter):
63 ret = 1
64
65 sys.exit(ret)
66
67def pathfix(filename=None, verbose=False, python_interpreter='/usr/bin/python'):
68 if not filename:
69 if verbose:
70 sys.stdout.write('filename not provided\n')
71 return 1
72 # open input file
73 try:
74 infile = open(filename, 'rb')
75 except IOError as msg:
76 sys.stderr.write('%s: open failed: %r\n' % (filename, msg))
77 return 1
78 # process first line
79 try:
80 firstline = infile.readline()
81 except IOError as msg:
82 sys.stderr.write('%s: read failed: %r\n' % (filename, msg))
83 try:
84 infile.close()
85 except IOError as msg:
86 sys.stderr.write('%s: close failed: %r\n' % (filename, msg))
87 return 1
88 if firstline.rstrip(b'\n').find(b' -') != -1:
89 existingargs = firstline.rstrip(b'\n')[firstline.rstrip(b'\n').find(b' -'):]
90 else:
91 existingargs = b''
92 newline = b'#!' + python_interpreter + existingargs + b'\n'
93 if (not firstline.startswith(b'#!')) or (b"python" not in firstline) or (firstline == newline):
94 if verbose:
95 sys.stdout.write('%s: unchanged\n' % (filename))
96 try:
97 infile.close()
98 except IOError as msg:
99 sys.stderr.write('%s: close failed: %r\n' % (filename, msg))
100 return 0
101 # create temporary output
102 head, tail = os.path.split(filename)
103 tempname = os.path.join(head, '@' + tail)
104 try:
105 outfile = open(tempname, 'wb')
106 except IOError as msg:
107 sys.stderr.write('%s: create failed: %r\n' % (tempname, msg))
108 try:
109 infile.close()
110 except IOError as msg:
111 sys.stderr.write('%s: close failed: %r\n' % (filename, msg))
112 return 1
113 if verbose:
114 sys.stdout.write('%s: updating\n' % (filename))
115 # write first new line to temporary output
116 try:
117 outfile.write(newline)
118 except IOError as msg:
119 sys.stderr.write('%s: write failed: %r\n' % (tempname, msg))
120 try:
121 infile.close()
122 except IOError as msg:
123 sys.stderr.write('%s: close failed: %r\n' % (filename, msg))
124 try:
125 outfile.close()
126 except IOError as msg:
127 sys.stderr.write('%s: close failed: %r\n' % (tempname, msg))
128 return 1
129 # copy rest of file
130 while True:
131 try:
132 chunk = infile.read(32678)
133 except IOError as msg:
134 sys.stderr.write('%s: read failed: %r\n' % (filename, msg))
135 try:
136 infile.close()
137 except IOError as msg:
138 sys.stderr.write('%s: close failed: %r\n' % (filename, msg))
139 try:
140 outfile.close()
141 except IOError as msg:
142 sys.stderr.write('%s: close failed: %r\n' % (tempname, msg))
143 try:
144 os.remove(tempname)
145 except OSError as msg:
146 sys.stderr.write('%s: remove failed: %r\n' % (tempname, msg))
147 return 1
148 if not chunk:
149 break
150 try:
151 outfile.write(chunk)
152 except IOError as msg:
153 sys.stderr.write('%s: write failed: %r\n' % (tempname, msg))
154 try:
155 infile.close()
156 except IOError as msg:
157 sys.stderr.write('%s: close failed: %r\n' % (filename, msg))
158 try:
159 outfile.close()
160 except IOError as msg:
161 sys.stderr.write('%s: close failed: %r\n' % (tempname, msg))
162 try:
163 os.remove(tempname)
164 except OSError as msg:
165 sys.stderr.write('%s: remove failed: %r\n' % (tempname, msg))
166 return 1
167 # close files
168 try:
169 infile.close()
170 except IOError as msg:
171 sys.stderr.write('%s: close failed: %r\n' % (filename, msg))
172 try:
173 outfile.close()
174 except IOError as msg:
175 sys.stderr.write('%s: close failed: %r\n' % (tempname, msg))
176 try:
177 os.remove(tempname)
178 except OSError as msg:
179 sys.stderr.write('%s: remove failed: %r\n' % (tempname, msg))
180 return 1
181 try:
182 outfile.close()
183 except IOError as msg:
184 sys.stderr.write('%s: close failed: %r\n' % (tempname, msg))
185 try:
186 os.remove(tempname)
187 except OSError as msg:
188 sys.stderr.write('%s: remove failed: %r\n' % (tempname, msg))
189 return 1
190 # copy the file's mode to the temp file
191 try:
192 statbuf = os.stat(filename)
193 os.chmod(tempname, statbuf[ST_MODE] & 0o7777)
194 except OSError as msg:
195 sys.stderr.write('%s: warning, chmod failed: %r\n' % (tempname, msg))
196 # Remove original file
197 try:
198 os.remove(filename)
199 except OSError as msg:
200 sys.stderr.write('%s: remove failed: %r\n' % (filename, msg))
201 try:
202 os.remove(tempname)
203 except OSError as msg:
204 sys.stderr.write('%s: remove failed: %r\n' % (tempname, msg))
205 return 1
206 # move the temp file to the original file
207 try:
208 os.rename(tempname, filename)
209 except OSError as msg:
210 sys.stderr.write('%s: rename failed: %r\n' % (filename, msg))
211 # leave the tempname alone (might be used for recovery)
212 return 1
213 return 0
214
215if __name__ == '__main__':
216 main()
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
def pathfix(filename=None, verbose=False, python_interpreter='/usr/bin/python')