2 # -*- coding: utf-8 -*-
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the Revised BSD License.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 Revised BSD License for more details.
13 Copyright 2018-2024 Cool Dude 2k - http://idb.berlios.de/
14 Copyright 2018-2024 Game Maker 2k - http://intdb.sourceforge.net/
15 Copyright 2018-2024 Kazuki Przyborowski - https://github.com/KazukiPrzyborowski
17 $FileInfo: pycatfile.py - Last Update: 3/15/2024 Ver. 0.5.0 RC 1 - Author: cooldude2k $
20 from __future__
import absolute_import
, division
, print_function
, unicode_literals
;
21 import io
, os
, re
, sys
, time
, stat
, zlib
, base64
, shutil
, socket
, hashlib
, datetime
, logging
, binascii
, tempfile
, zipfile
, ftplib
, platform
;
22 from ftplib
import FTP
, FTP_TLS
;
23 if(sys
.version
[0]=="2"):
24 from urlparse
import urlparse
, urlunparse
, urlsplit
, urlunsplit
, urljoin
;
25 elif(sys
.version
[0]>="3"):
26 from urllib
.parse
import urlunparse
, urlsplit
, urlunsplit
, urljoin
, urlencode
;
27 from urllib
.parse
import urlparse
;
29 if os
.name
== 'nt': # Only modify if on Windows
30 if sys
.version
[0] == "2":
32 sys
.stdout
= codecs
.getwriter('utf-8')(sys
.stdout
);
33 sys
.stderr
= codecs
.getwriter('utf-8')(sys
.stderr
);
36 sys
.stdout
= io
.TextIOWrapper(sys
.stdout
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
37 sys
.stderr
= io
.TextIOWrapper(sys
.stderr
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
39 hashlib_guaranteed
= False;
40 os
.environ
["PYTHONIOENCODING"] = "UTF-8";
41 os
.environ
["LC_CTYPE"] = "UTF-8";
45 sys
.setdefaultencoding('UTF-8');
48 except AttributeError:
52 except AttributeError:
56 import simplejson
as json
;
61 from zlib
import crc32
;
63 from binascii
import crc32
;
65 rarfile_support
= False;
68 rarfile_support
= True;
70 rarfile_support
= False;
73 from safetar
import is_tarfile
;
76 from xtarfile
import is_tarfile
;
78 from tarfile
import is_tarfile
;
81 import safetar
as tarfile
;
84 import xtarfile
as tarfile
;
104 from urllib
.request
import Request
, build_opener
, HTTPBasicAuthHandler
;
105 from urllib
.parse
import urlparse
;
108 from urllib2
import Request
, build_opener
, HTTPBasicAuthHandler
;
109 from urlparse
import urlparse
;
111 if(sys
.version
[0]=="2"):
113 from io
import StringIO
, BytesIO
;
116 from cStringIO
import StringIO
;
117 from cStringIO
import StringIO
as BytesIO
;
119 from StringIO
import StringIO
;
120 from StringIO
import StringIO
as BytesIO
;
121 elif(sys
.version
[0]>="3"):
122 from io
import StringIO
, BytesIO
;
127 from cStringIO
import StringIO
as BytesIO
;
133 from StringIO
import StringIO
as BytesIO
;
139 from io
import BytesIO
;
144 __use_pysftp__
= False;
146 __use_pysftp__
= False;
147 __file_format_name__
= "CatFile";
148 __program_name__
= "Py"+__file_format_name__
;
149 __file_format_lower__
= __file_format_name__
.lower();
150 __file_format_magic__
= __file_format_name__
;
151 __file_format_len__
= len(__file_format_magic__
);
152 __file_format_hex__
= binascii
.hexlify(__file_format_magic__
.encode("UTF-8")).decode("UTF-8");
153 __file_format_delimiter__
= "\x00";
154 __file_format_ver__
= "001";
155 __use_new_style__
= True;
156 __file_format_list__
= [__file_format_name__
, __file_format_magic__
, __file_format_lower__
, __file_format_len__
, __file_format_hex__
, __file_format_delimiter__
, __file_format_ver__
, __use_new_style__
];
157 __project__
= __program_name__
;
158 __project_url__
= "https://github.com/GameMaker2k/PyCatFile";
159 __version_info__
= (0, 5, 0, "RC 1", 1);
160 __version_date_info__
= (2024, 3, 15, "RC 1", 1);
161 __version_date__
= str(__version_date_info__
[0]) + "." + str(__version_date_info__
[1]).zfill(2) + "." + str(__version_date_info__
[2]).zfill(2);
162 __revision__
= __version_info__
[3];
163 __revision_id__
= "$Id$";
164 if(__version_info__
[4] is not None):
165 __version_date_plusrc__
= __version_date__
+ "-" + str(__version_date_info__
[4]);
166 if(__version_info__
[4] is None):
167 __version_date_plusrc__
= __version_date__
;
168 if(__version_info__
[3] is not None):
169 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]) + " " + str(__version_info__
[3]);
170 if(__version_info__
[3] is None):
171 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]);
173 PyBitness
= platform
.architecture();
174 if(PyBitness
=="32bit" or PyBitness
=="32"):
176 elif(PyBitness
=="64bit" or PyBitness
=="64"):
181 geturls_ua_pycatfile_python
= "Mozilla/5.0 (compatible; {proname}/{prover}; +{prourl})".format(proname
=__project__
, prover
=__version__
, prourl
=__project_url__
);
182 if(platform
.python_implementation()!=""):
183 py_implementation
= platform
.python_implementation();
184 if(platform
.python_implementation()==""):
185 py_implementation
= "Python";
186 geturls_ua_pycatfile_python_alt
= "Mozilla/5.0 ({osver}; {archtype}; +{prourl}) {pyimp}/{pyver} (KHTML, like Gecko) {proname}/{prover}".format(osver
=platform
.system()+" "+platform
.release(), archtype
=platform
.machine(), prourl
=__project_url__
, pyimp
=py_implementation
, pyver
=platform
.python_version(), proname
=__project__
, prover
=__version__
);
187 geturls_ua_googlebot_google
= "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
188 geturls_ua_googlebot_google_old
= "Googlebot/2.1 (+http://www.google.com/bot.html)";
189 geturls_headers_pycatfile_python
= {'Referer': "http://google.com/", 'User-Agent': geturls_ua_pycatfile_python
, 'Accept-Encoding': "none", 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close", 'SEC-CH-UA': "\""+__project__
+"\";v=\""+str(__version__
)+"\", \"Not;A=Brand\";v=\"8\", \""+py_implementation
+"\";v=\""+str(platform
.release())+"\"", 'SEC-CH-UA-FULL-VERSION': str(__version__
), 'SEC-CH-UA-PLATFORM': ""+py_implementation
+"", 'SEC-CH-UA-ARCH': ""+platform
.machine()+"", 'SEC-CH-UA-PLATFORM': str(__version__
), 'SEC-CH-UA-BITNESS': str(PyBitness
)};
190 geturls_headers_pycatfile_python_alt
= {'Referer': "http://google.com/", 'User-Agent': geturls_ua_pycatfile_python_alt
, 'Accept-Encoding': "none", 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close", 'SEC-CH-UA': "\""+__project__
+"\";v=\""+str(__version__
)+"\", \"Not;A=Brand\";v=\"8\", \""+py_implementation
+"\";v=\""+str(platform
.release())+"\"", 'SEC-CH-UA-FULL-VERSION': str(__version__
), 'SEC-CH-UA-PLATFORM': ""+py_implementation
+"", 'SEC-CH-UA-ARCH': ""+platform
.machine()+"", 'SEC-CH-UA-PLATFORM': str(__version__
), 'SEC-CH-UA-BITNESS': str(PyBitness
)};
191 geturls_headers_googlebot_google
= {'Referer': "http://google.com/", 'User-Agent': geturls_ua_googlebot_google
, 'Accept-Encoding': "none", 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"};
192 geturls_headers_googlebot_google_old
= {'Referer': "http://google.com/", 'User-Agent': geturls_ua_googlebot_google_old
, 'Accept-Encoding': "none", 'Accept-Language': "en-US,en;q=0.8,en-CA,en-GB;q=0.6", 'Accept-Charset': "ISO-8859-1,ISO-8859-15,utf-8;q=0.7,*;q=0.7", 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 'Connection': "close"};
194 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'xz', 'lz4', 'lzo', 'lzma'];
195 outextlist
= ['gz', 'bz2', 'zst', 'xz', 'lz4', 'lzo', 'lzma'];
196 outextlistwd
= ['.gz', '.bz2', '.zst', '.xz', '.lz4', '.lzo', '.lzma'];
198 tarfile_mimetype
= "application/tar";
199 tarfile_tar_mimetype
= tarfile_mimetype
;
200 zipfile_mimetype
= "application/zip";
201 zipfile_zip_mimetype
= zipfile_mimetype
;
202 rarfile_mimetype
= "application/rar";
203 rarfile_rar_mimetype
= rarfile_mimetype
;
204 archivefile_mimetype
= "application/x-"+__file_format_list__
[1]+"";
205 archivefile_cat_mimetype
= archivefile_mimetype
;
206 archivefile_gzip_mimetype
= "application/x-"+__file_format_list__
[1]+"+gzip";
207 archivefile_gz_mimetype
= archivefile_gzip_mimetype
;
208 archivefile_bzip2_mimetype
= "application/x-"+__file_format_list__
[1]+"+bzip2";
209 archivefile_bz2_mimetype
= archivefile_bzip2_mimetype
;
210 archivefile_lz4_mimetype
= "application/x-"+__file_format_list__
[1]+"+lz4";
211 archivefile_lzop_mimetype
= "application/x-"+__file_format_list__
[1]+"+lzop";
212 archivefile_lzo_mimetype
= archivefile_lzop_mimetype
;
213 archivefile_zstandard_mimetype
= "application/x-"+__file_format_list__
[1]+"+zstandard";
214 archivefile_zstd_mimetype
= archivefile_zstandard_mimetype
;
215 archivefile_lzma_mimetype
= "application/x-"+__file_format_list__
[1]+"+lzma";
216 archivefile_xz_mimetype
= "application/x-"+__file_format_list__
[1]+"+xz";
217 archivefile_extensions
= ['.cat', '.cat.gz', '.cat.bz2', '.cat.zst', '.cat.lz4', '.cat.lzo', '.cat.lzop', '.cat.lzma', '.cat.xz'];
219 if __name__
== "__main__":
221 curscrpath
= os
.path
.dirname(sys
.argv
[0]);
225 curscrpath
= curscrpath
.replace(os
.sep
, "/");
226 curscrpath
= curscrpath
+ "/";
227 scrfile
= curscrpath
+ "catfile.py";
228 if(os
.path
.exists(scrfile
) and os
.path
.isfile(scrfile
)):
229 scrcmd
= subprocess
.Popen([sys
.executable
, scrfile
] + sys
.argv
[1:]);
232 def VerbosePrintOut(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
238 "warning": logging
.warning
,
239 "error": logging
.error
,
240 "critical": logging
.critical
,
241 "exception": logging
.exception
,
242 "logalt": lambda x
: logging
.log(dgblevel
, x
),
243 "debug": logging
.debug
245 log_function
= log_functions
.get(outtype
);
247 log_function(dbgtxt
);
251 def VerbosePrintOutReturn(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
252 VerbosePrintOut(dbgtxt
, outtype
, dbgenable
, dgblevel
);
255 def RemoveWindowsPath(dpath
):
259 dpath
= dpath
.replace(os
.path
.sep
, "/");
260 dpath
= dpath
.rstrip("/");
261 if(dpath
=="." or dpath
==".."):
265 def NormalizeRelativePath(inpath
):
266 inpath
= RemoveWindowsPath(inpath
);
267 if(os
.path
.isabs(inpath
)):
270 if(inpath
.startswith("./") or inpath
.startswith("../")):
273 outpath
= "./" + inpath
;
276 def ListDir(dirpath
, followlink
=False, duplicates
=False):
277 if(isinstance(dirpath
, (list, tuple, ))):
278 dirpath
= list(filter(None, dirpath
));
279 elif(isinstance(dirpath
, (str, ))):
280 dirpath
= list(filter(None, [dirpath
]));
282 for mydirfile
in dirpath
:
283 if(not os
.path
.exists(mydirfile
)):
285 mydirfile
= NormalizeRelativePath(mydirfile
);
286 if(os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
)):
287 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
288 if(os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
)):
289 for root
, dirs
, filenames
in os
.walk(mydirfile
):
291 dpath
= RemoveWindowsPath(dpath
);
292 if(dpath
not in retlist
and not duplicates
):
293 retlist
.append(dpath
);
295 retlist
.append(dpath
);
296 for file in filenames
:
297 fpath
= os
.path
.join(root
, file);
298 fpath
= RemoveWindowsPath(fpath
);
299 if(fpath
not in retlist
and not duplicates
):
300 retlist
.append(fpath
);
302 retlist
.append(fpath
);
304 retlist
.append(RemoveWindowsPath(mydirfile
));
307 def ListDirAdvanced(dirpath
, followlink
=False, duplicates
=False):
308 if isinstance(dirpath
, (list, tuple)):
309 dirpath
= list(filter(None, dirpath
));
310 elif isinstance(dirpath
, str):
311 dirpath
= list(filter(None, [dirpath
]));
313 for mydirfile
in dirpath
:
314 if not os
.path
.exists(mydirfile
):
316 mydirfile
= NormalizeRelativePath(mydirfile
);
317 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
) and followlink
:
318 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
))
319 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
320 for root
, dirs
, filenames
in os
.walk(mydirfile
):
321 # Sort dirs and filenames alphabetically in place
322 dirs
.sort(key
=lambda x
: x
.lower());
323 filenames
.sort(key
=lambda x
: x
.lower());
324 dpath
= RemoveWindowsPath(root
);
325 if not duplicates
and dpath
not in retlist
:
326 retlist
.append(dpath
);
328 retlist
.append(dpath
);
329 for file in filenames
:
330 fpath
= os
.path
.join(root
, file);
331 fpath
= RemoveWindowsPath(fpath
);
332 if not duplicates
and fpath
not in retlist
:
333 retlist
.append(fpath
);
335 retlist
.append(fpath
);
337 retlist
.append(RemoveWindowsPath(mydirfile
));
340 def create_alias_function(prefix
, base_name
, suffix
, target_function
):
341 # Define a new function that wraps the target function
342 def alias_function(*args
, **kwargs
):
343 return target_function(*args
, **kwargs
);
345 # Create the function name by combining the prefix, base name, and the suffix
346 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
);
348 # Add the new function to the global namespace
349 globals()[function_name
] = alias_function
;
351 # initial_value can be 0xFFFF or 0x0000
352 def crc16_ansi(msg
, initial_value
=0xFFFF):
353 # CRC-16-IBM / CRC-16-ANSI polynomial and initial value
354 poly
= 0x8005; # Polynomial for CRC-16-IBM / CRC-16-ANSI
355 crc
= initial_value
; # Initial value
357 crc ^
= b
<< 8; # XOR byte into CRC top byte
358 for _
in range(8): # Process each bit
359 if crc
& 0x8000: # If the top bit is set
360 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
362 crc
= crc
<< 1; # Just shift left
363 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
366 # initial_value can be 0xFFFF or 0x0000
367 def crc16_ibm(msg
, initial_value
=0xFFFF):
368 return crc16_ansi(msg
, initial_value
);
370 # initial_value is 0xFFFF
372 return crc16_ansi(msg
, 0xFFFF);
374 # initial_value can be 0xFFFF, 0x1D0F or 0x0000
375 def crc16_ccitt(msg
, initial_value
=0xFFFF):
376 # CRC-16-CCITT polynomial
377 poly
= 0x1021; # Polynomial for CRC-16-CCITT
378 # Use the specified initial value
381 crc ^
= b
<< 8; # XOR byte into CRC top byte
382 for _
in range(8): # Process each bit
383 if crc
& 0x8000: # If the top bit is set
384 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
386 crc
= crc
<< 1; # Just shift left
387 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
390 # initial_value can be 0x42F0E1EBA9EA3693 or 0x0000000000000000
391 def crc64_ecma(msg
, initial_value
=0x0000000000000000):
392 # CRC-64-ECMA polynomial and initial value
393 poly
= 0x42F0E1EBA9EA3693;
394 crc
= initial_value
; # Initial value for CRC-64-ECMA
396 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
397 for _
in range(8): # Process each bit
398 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
399 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
401 crc
<<= 1; # Just shift left if the MSB is 0
402 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
405 # initial_value can be 0x000000000000001B or 0xFFFFFFFFFFFFFFFF
406 def crc64_iso(msg
, initial_value
=0xFFFFFFFFFFFFFFFF):
407 # CRC-64-ISO polynomial and initial value
408 poly
= 0x000000000000001B;
409 crc
= initial_value
; # Common initial value for CRC-64-ISO
411 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
412 for _
in range(8): # Process each bit
413 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
414 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
416 crc
<<= 1; # Just shift left if the MSB is 0
417 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
420 def GetDataFromArray(data
, path
, default
=None):
424 element
= element
[key
];
426 except (KeyError, TypeError, IndexError):
429 def GetDataFromArrayAlt(structure
, path
, default
=None):
432 if isinstance(element
, dict) and key
in element
:
433 element
= element
[key
];
434 elif isinstance(element
, list) and isinstance(key
, int) and -len(element
) <= key
< len(element
):
435 element
= element
[key
];
440 def ReadTillNullByte(fp
, delimiter
=__file_format_delimiter__
):
443 nullbyte
= delimiter
.encode("UTF-8");
445 curbyte
= fp
.read(1);
446 if(curbyte
==nullbyte
or not curbyte
):
448 curfullbyte
= curfullbyte
+ curbyte
;
449 return curfullbyte
.decode('UTF-8');
451 def ReadUntilNullByte(fp
, delimiter
=__file_format_delimiter__
):
452 return ReadTillNullByte(fp
, delimiter
);
454 def SeekToEndOfFile(fp
):
458 if(lasttell
==fp
.tell()):
460 lasttell
= fp
.tell();
463 def ReadFileHeaderData(fp
, rounds
=0, delimiter
=__file_format_delimiter__
):
467 while(rocount
<roend
):
468 HeaderOut
.append(ReadTillNullByte(fp
, delimiter
));
469 rocount
= rocount
+ 1;
472 def ReadFileHeaderDataBySize(fp
, delimiter
=__file_format_delimiter__
):
473 headerpresize
= ReadTillNullByte(fp
, delimiter
);
474 headersize
= int(headerpresize
, 16);
475 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
478 roend
= int(len(headercontent
));
479 HeaderOut
= [headerpresize
];
480 while(rocount
<roend
):
481 HeaderOut
.append(headercontent
[rocount
]);
482 rocount
= rocount
+ 1;
485 def ReadFileHeaderDataByList(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
487 roend
= int(len(listval
));
489 while(rocount
<roend
):
490 RoundArray
= {listval
[rocount
]: ReadTillNullByte(fp
, delimiter
)};
491 HeaderOut
.update(RoundArray
);
492 rocount
= rocount
+ 1;
495 def ReadFileHeaderDataByListSize(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
496 headerpresize
= ReadTillNullByte(fp
, delimiter
);
497 headersize
= int(headerpresize
, 16);
498 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
502 roend
= int(len(headercontent
));
503 HeaderOut
= {listval
[0]: headerpresize
};
504 while(rocount
<roend
):
505 RoundArray
= {listval
[rocount
]: headercontent
[rocount
]};
506 HeaderOut
.update(RoundArray
);
507 rocount
= rocount
+ 1;
508 listcount
= listcount
+ 1;
511 def AppendNullByte(indata
, delimiter
=__file_format_delimiter__
):
512 outdata
= str(indata
) + delimiter
;
515 def AppendNullBytes(indata
=[], delimiter
=__file_format_delimiter__
):
520 outdata
= outdata
+ AppendNullByte(indata
[inum
], delimiter
);
524 def ReadTillNullByteAlt(fp
, delimiter
=__file_format_delimiter__
):
525 """Read bytes from file pointer until a null byte is encountered."""
526 bytes_list
= [] # Use list for efficient append operation.
528 cur_byte
= fp
.read(1);
529 if cur_byte
== delimiter
.encode() or not cur_byte
:
531 bytes_list
.append(cur_byte
);
532 return b
''.join(bytes_list
).decode('UTF-8');
534 def ReadUntilNullByteAlt(fp
, delimiter
=__file_format_delimiter__
):
535 return ReadTillNullByteAlt(fp
, delimiter
);
537 def ReadFileHeaderDataAlt(fp
, rounds
=0, delimiter
=__file_format_delimiter__
):
538 """Read multiple null-byte terminated strings from a file."""
540 for round_count
in range(rounds
):
541 header_out
[round_count
] = ReadTillNullByteAlt(fp
, delimiter
);
544 def ReadFileHeaderDataBySizeAlt(fp
, delimiter
=__file_format_delimiter__
):
545 # Read and convert header size from hexadecimal to integer
546 header_pre_size
= ReadTillNullByte(fp
, delimiter
);
547 header_size
= int(header_pre_size
, 16);
548 # Read and split the header content
549 header_content
= str(fp
.read(header_size
).decode('UTF-8')).split(delimiter
);
551 # Prepend the pre-size and return the combined list
552 return [header_pre_size
] + header_content
;
554 def ReadFileHeaderDataByListSizeAlt(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
555 # Read the size and content from the header
556 header_pre_size
= ReadTillNullByte(fp
, delimiter
);
557 header_size
= int(header_pre_size
, 16);
558 header_content
= str(fp
.read(header_size
).decode('UTF-8')).split(delimiter
);
560 # Initialize HeaderOut with the header pre-size if listval is not empty
561 HeaderOut
= {listval
[0]: header_pre_size
} if listval
else {};
562 # Map the remaining listval items to their corresponding header content, starting from the second item
563 for i
in range(1, min(len(header_content
) + 1, len(listval
))):
564 HeaderOut
[listval
[i
]] = header_content
[i
- 1]; # -1 because header_content is 0-indexed
567 def ReadFileHeaderDataByListAlt(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
568 """Read multiple null-byte terminated strings from a file."""
570 for round_count
in listval
:
571 header_out
.append(ReadTillNullByteAlt(fp
, delimiter
));
574 def AppendNullByteAlt(indata
, delimiter
=__file_format_delimiter__
):
575 """Append a null byte to the given data."""
576 return str(indata
) + delimiter
;
578 def AppendNullBytesAlt(indata
=[], delimiter
=__file_format_delimiter__
):
579 """Append a null byte to each element in the list and concatenate."""
580 return delimiter
.join(map(str, indata
)) + delimiter
; # Efficient concatenation with null byte.
582 def PrintPermissionString(fchmode
, ftype
):
583 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
585 for fmodval
in str(oct(fchmode
))[-3:]:
586 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
587 if(ftype
==0 or ftype
==7):
588 permissionstr
= "-" + permissionstr
;
590 permissionstr
= "h" + permissionstr
;
592 permissionstr
= "l" + permissionstr
;
594 permissionstr
= "c" + permissionstr
;
596 permissionstr
= "b" + permissionstr
;
598 permissionstr
= "d" + permissionstr
;
600 permissionstr
= "f" + permissionstr
;
602 permissionstr
= "D" + permissionstr
;
604 permissionstr
= "p" + permissionstr
;
606 permissionstr
= "w" + permissionstr
;
608 permissionoutstr
= stat
.filemode(fchmode
);
609 except AttributeError:
610 permissionoutstr
= permissionstr
;
612 permissionoutstr
= permissionstr
;
613 return permissionoutstr
;
615 def PrintPermissionStringAlt(fchmode
, ftype
):
617 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
618 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
620 # Translate file mode into permission string
621 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
622 # Append file type indicator
624 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
625 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
627 file_type
= type_indicators
.get(ftype
, '-');
628 permissionstr
= file_type
+ permissionstr
;
630 permissionoutstr
= stat
.filemode(fchmode
);
631 except AttributeError:
632 permissionoutstr
= permissionstr
;
633 return permissionoutstr
;
635 def CompressionSupport():
636 compression_list
= [];
639 compression_list
.append("gz");
640 compression_list
.append("gzip");
645 compression_list
.append("bz2");
646 compression_list
.append("bzip2");
651 compression_list
.append("lz4");
656 compression_list
.append("lzo");
657 compression_list
.append("lzop");
662 compression_list
.append("zstd");
663 compression_list
.append("zstandard");
668 compression_list
.append("lzma");
669 compression_list
.append("xz");
672 return compression_list
;
674 def CheckCompressionType(infile
, formatspecs
=__file_format_list__
, closefp
=True):
675 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
679 catfp
= open(infile
, "rb");
680 except FileNotFoundError
:
683 prefp
= catfp
.read(2);
685 if(prefp
==binascii
.unhexlify("1f8b")):
688 prefp
= catfp
.read(3);
689 if(prefp
==binascii
.unhexlify("425a68")):
691 if(prefp
==binascii
.unhexlify("5d0000")):
694 prefp
= catfp
.read(4);
695 if(prefp
==binascii
.unhexlify("28b52ffd")):
697 if(prefp
==binascii
.unhexlify("04224d18")):
699 if(prefp
==binascii
.unhexlify("504B0304")):
700 filetype
= "zipfile";
702 prefp
= catfp
.read(5);
703 if(prefp
==binascii
.unhexlify("7573746172")):
704 filetype
= "tarfile";
706 prefp
= catfp
.read(6);
707 if(prefp
==binascii
.unhexlify("fd377a585a00")):
710 prefp
= catfp
.read(7);
711 if(prefp
==binascii
.unhexlify("526172211a0700")):
712 filetype
= "rarfile";
713 if(prefp
==binascii
.unhexlify("43617446696c65")):
714 filetype
= "catfile";
716 prefp
= catfp
.read(8);
717 if(prefp
==binascii
.unhexlify("526172211a070100")):
718 filetype
= "rarfile";
720 prefp
= catfp
.read(formatspecs
[3]);
721 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
722 filetype
= formatspecs
[2];
724 prefp
= catfp
.read(9);
725 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
728 prefp
= catfp
.read(10);
729 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
730 filetype
= "tarfile";
736 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_list__
, closefp
=True):
738 instringsfile
= BytesIO(instring
);
740 instringsfile
= BytesIO(instring
.encode("UTF-8"));
741 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
743 def GetCompressionMimeType(infile
, formatspecs
=__file_format_list__
):
744 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
745 if(compresscheck
=="gzip" or compresscheck
=="gz"):
746 return archivefile_gzip_mimetype
;
747 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
748 return archivefile_bzip2_mimetype
;
749 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
750 return archivefile_zstandard_mimetype
;
751 if(compresscheck
=="lz4"):
752 return archivefile_lz4_mimetype
;
753 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
754 return archivefile_lzop_mimetype
;
755 if(compresscheck
=="lzma"):
756 return archivefile_lzma_mimetype
;
757 if(compresscheck
=="xz"):
758 return archivefile_xz_mimetype
;
759 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
[2]):
760 return archivefile_cat_mimetype
;
761 if(not compresscheck
):
765 def UncompressArchiveFile(fp
, formatspecs
=__file_format_list__
):
766 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
768 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
769 if(compresscheck
=="gzip"):
774 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
775 if(compresscheck
=="bzip2"):
781 catfp
.write(bz2
.decompress(fp
.read()));
782 if(compresscheck
=="zstd"):
788 catfp
.write(zstandard
.decompress(fp
.read()));
789 if(compresscheck
=="lz4"):
795 catfp
.write(lz4
.frame
.decompress(fp
.read()));
796 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
802 catfp
.write(lzo
.decompress(fp
.read()));
803 if(compresscheck
=="lzma" or compresscheck
=="xz"):
809 catfp
.write(lzma
.decompress(fp
.read()));
810 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
812 if(not compresscheck
):
818 with fp
as fpcontent
:
820 catfp
.write(lzma
.decompress(fp
.read()));
821 except lzma
.LZMAError
:
825 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
827 def UncompressFile(infile
, formatspecs
=__file_format_list__
, mode
="rb"):
828 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
829 if(sys
.version_info
[0]==2 and compresscheck
):
835 if(compresscheck
=="gzip"):
841 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
842 except (ValueError, TypeError) as e
:
843 filefp
= gzip
.open(infile
, mode
);
844 if(compresscheck
=="bzip2"):
850 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
851 except (ValueError, TypeError) as e
:
852 filefp
= bz2
.open(infile
, mode
);
853 if(compresscheck
=="zstd"):
859 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
860 except (ValueError, TypeError) as e
:
861 filefp
= zstandard
.open(infile
, mode
);
862 if(compresscheck
=="lz4"):
868 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
869 except (ValueError, TypeError) as e
:
870 filefp
= lz4
.frame
.open(infile
, mode
);
871 if(compresscheck
=="lzo"):
877 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
878 except (ValueError, TypeError) as e
:
879 filefp
= lzo
.open(infile
, mode
);
880 if(compresscheck
=="lzma"):
886 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
887 except (ValueError, TypeError) as e
:
888 filefp
= lzma
.open(infile
, mode
);
889 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
891 filefp
= open(infile
, mode
, encoding
="UTF-8");
892 except (ValueError, TypeError) as e
:
893 filefp
= open(infile
, mode
);
894 if(not compresscheck
):
896 filefp
= open(infile
, mode
, encoding
="UTF-8");
897 except (ValueError, TypeError) as e
:
898 filefp
= open(infile
, mode
);
899 except FileNotFoundError
:
903 def UncompressString(infile
):
904 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
905 if(compresscheck
=="gzip"):
910 fileuz
= gzip
.decompress(infile
);
911 if(compresscheck
=="bzip2"):
916 fileuz
= bz2
.decompress(infile
);
917 if(compresscheck
=="zstd"):
922 fileuz
= zstandard
.decompress(infile
);
923 if(compresscheck
=="lz4"):
928 fileuz
= lz4
.frame
.decompress(infile
);
929 if(compresscheck
=="lzo"):
934 fileuz
= lzo
.decompress(infile
);
935 if(compresscheck
=="lzma"):
940 fileuz
= lzma
.decompress(infile
);
941 if(not compresscheck
):
943 if(hasattr(fileuz
, 'decode')):
944 fileuz
= fileuz
.decode("UTF-8");
947 def UncompressStringAlt(infile
):
949 outstring
= UncompressString(infile
);
950 filefp
.write(outstring
);
954 def CheckCompressionSubType(infile
, formatspecs
=__file_format_list__
):
955 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
956 if(not compresscheck
):
957 fextname
= os
.path
.splitext(infile
)[1];
959 compresscheck
= "gzip";
960 if(fextname
==".bz2"):
961 compresscheck
= "bzip2";
962 if(fextname
==".zst"):
963 compresscheck
= "zstd";
964 if(fextname
==".lz4"):
965 compresscheck
= "lz4";
966 if(fextname
==".lzo" or fextname
==".lzop"):
967 compresscheck
= "lzo";
968 if(fextname
==".lzma" or fextname
==".xz"):
969 compresscheck
= "lzma";
970 if(not compresscheck
):
972 if(compresscheck
=="catfile"):
974 if(compresscheck
==formatspecs
[2]):
975 return formatspecs
[2];
976 if(compresscheck
=="tarfile"):
978 if(compresscheck
=="zipfile"):
980 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
981 catfp
= UncompressArchiveFile(infile
, formatspecs
[2]);
984 if(compresscheck
=="gzip"):
989 catfp
= gzip
.GzipFile(infile
, "rb");
990 if(compresscheck
=="bzip2"):
995 catfp
= bz2
.BZ2File(infile
, "rb");
996 if(compresscheck
=="lz4"):
1001 catfp
= lz4
.frame
.open(infile
, "rb");
1002 if(compresscheck
=="zstd"):
1007 catfp
= zstandard
.open(infile
, "rb");
1008 if(compresscheck
=="lzma" or compresscheck
=="xz"):
1013 catfp
= lzma
.open(infile
, "rb");
1014 except FileNotFoundError
:
1017 prefp
= catfp
.read(5);
1018 if(prefp
==binascii
.unhexlify("7573746172")):
1019 filetype
= "tarfile";
1021 prefp
= catfp
.read(7);
1022 if(prefp
==binascii
.unhexlify("43617446696c65")):
1023 filetype
= "catfile";
1025 prefp
= catfp
.read(formatspecs
[3]);
1026 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
1027 filetype
= formatspecs
[2];
1029 prefp
= catfp
.read(10);
1030 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
1031 filetype
= "tarfile";
1036 def GZipCompress(data
, compresslevel
=9):
1041 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
1043 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
1047 catfp
= open(tmpfp
.name
, "rb");
1048 except FileNotFoundError
:
1050 catdata
= catfp
.read();
1054 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_list__
):
1055 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1056 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
1059 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
1061 if(compression
not in compressionlist
and compression
is None):
1062 compression
= "auto";
1063 if(compression
=="gzip"):
1069 if(compressionlevel
is None):
1070 compressionlevel
= 9;
1072 compressionlevel
= int(compressionlevel
);
1073 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
1074 if(compression
=="bzip2"):
1080 if(compressionlevel
is None):
1081 compressionlevel
= 9;
1083 compressionlevel
= int(compressionlevel
);
1084 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
1085 if(compression
=="lz4"):
1091 if(compressionlevel
is None):
1092 compressionlevel
= 9;
1094 compressionlevel
= int(compressionlevel
);
1095 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
1096 if(compression
=="lzo" or compression
=="lzop"):
1102 if(compressionlevel
is None):
1103 compressionlevel
= 9;
1105 compressionlevel
= int(compressionlevel
);
1106 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
1107 if(compression
=="zstd"):
1113 if(compressionlevel
is None):
1114 compressionlevel
= 10;
1116 compressionlevel
= int(compressionlevel
);
1117 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
1118 if(compression
=="lzma"):
1124 if(compressionlevel
is None):
1125 compressionlevel
= 9;
1127 compressionlevel
= int(compressionlevel
);
1128 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
1129 if(compression
=="xz"):
1135 if(compressionlevel
is None):
1136 compressionlevel
= 9;
1138 compressionlevel
= int(compressionlevel
);
1139 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
1140 if(compression
=="auto" or compression
is None):
1145 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
1147 def CompressOpenFile(outfile
, compressionlevel
=None):
1148 if(outfile
is None):
1150 fbasename
= os
.path
.splitext(outfile
)[0];
1151 fextname
= os
.path
.splitext(outfile
)[1];
1152 if(compressionlevel
is None and fextname
!=".zst"):
1153 compressionlevel
= 9;
1154 elif(compressionlevel
is None and fextname
==".zst"):
1155 compressionlevel
= 10;
1157 compressionlevel
= int(compressionlevel
);
1158 if(sys
.version_info
[0]==2):
1163 if(fextname
not in outextlistwd
):
1165 outfp
= open(outfile
, "wb", encoding
="UTF-8");
1166 except (ValueError, TypeError) as e
:
1167 outfp
= open(outfile
, "wb");
1168 elif(fextname
==".gz"):
1174 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
1175 except (ValueError, TypeError) as e
:
1176 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
1177 elif(fextname
==".bz2"):
1183 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
1184 except (ValueError, TypeError) as e
:
1185 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
1186 elif(fextname
==".zst"):
1192 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
1193 except (ValueError, TypeError) as e
:
1194 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
1195 elif(fextname
==".xz"):
1201 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
1202 except (ValueError, TypeError) as e
:
1203 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
1204 elif(fextname
==".lz4"):
1210 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
1211 except (ValueError, TypeError) as e
:
1212 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
1213 elif(fextname
==".lzo"):
1219 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
1220 except (ValueError, TypeError) as e
:
1221 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
1222 elif(fextname
==".lzma"):
1228 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
1229 except (ValueError, TypeError) as e
:
1230 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
1231 except FileNotFoundError
:
1235 def GetDevMajorMinor(fdev
):
1237 if(hasattr(os
, "minor")):
1238 retdev
.append(os
.minor(fdev
));
1241 if(hasattr(os
, "major")):
1242 retdev
.append(os
.major(fdev
));
1247 def CheckSumSupport(checkfor
, guaranteed
=True):
1249 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
1251 hash_list
= sorted(list(hashlib
.algorithms_available
));
1252 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
1253 if(checkfor
in checklistout
):
1258 def CheckSumSupportAlt(checkfor
, guaranteed
=True):
1260 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
1262 hash_list
= sorted(list(hashlib
.algorithms_available
));
1263 checklistout
= hash_list
;
1264 if(checkfor
in checklistout
):
1269 def PackArchiveFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1270 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1271 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1272 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
1273 advancedlist
= True;
1274 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1275 outfile
= RemoveWindowsPath(outfile
);
1276 checksumtype
= checksumtype
.lower();
1277 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
1278 checksumtype
="crc32";
1279 if(checksumtype
=="none"):
1281 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
1283 if(compression
not in compressionlist
and compression
is None):
1284 compression
= "auto";
1286 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1287 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1288 if(os
.path
.exists(outfile
)):
1293 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1295 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1297 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1300 fbasename
= os
.path
.splitext(outfile
)[0];
1301 fextname
= os
.path
.splitext(outfile
)[1];
1302 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1303 catver
= formatspecs
[6];
1304 fileheaderver
= str(int(catver
.replace(".", "")));
1305 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
1306 catfp
.write(fileheader
.encode('UTF-8'));
1309 for line
in sys
.stdin
:
1310 infilelist
.append(line
.strip());
1311 infilelist
= list(filter(None, infilelist
));
1312 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
1313 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
1315 with
open(infiles
, "r") as finfile
:
1316 for line
in finfile
:
1317 infilelist
.append(line
.strip());
1318 infilelist
= list(filter(None, infilelist
));
1320 if(isinstance(infiles
, (list, tuple, ))):
1321 infilelist
= list(filter(None, infiles
));
1322 elif(isinstance(infiles
, (str, ))):
1323 infilelist
= list(filter(None, [infiles
]));
1325 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
1327 GetDirList
= ListDir(infilelist
, followlink
, False);
1335 inodetocatinode
= {};
1336 fnumfiles
= format(int(len(GetDirList
)), 'x').lower();
1337 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
1338 if(checksumtype
=="none" or checksumtype
==""):
1339 catfileheadercshex
= format(0, 'x').lower();
1340 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1341 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1342 elif(checksumtype
=="crc16_ccitt"):
1343 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1344 elif(checksumtype
=="adler32"):
1345 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1346 elif(checksumtype
=="crc32"):
1347 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1348 elif(checksumtype
=="crc64_ecma"):
1349 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1350 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1351 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1352 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1353 checksumoutstr
= hashlib
.new(checksumtype
);
1354 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
1355 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1357 catfileheadercshex
= format(0, 'x').lower
1358 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
1359 catfp
.write(fnumfilesa
.encode('UTF-8'));
1362 os
.fsync(catfp
.fileno());
1363 except io
.UnsupportedOperation
:
1365 except AttributeError:
1367 for curfname
in GetDirList
:
1368 catfhstart
= catfp
.tell();
1369 if(re
.findall("^[.|/]", curfname
)):
1372 fname
= "./"+curfname
;
1374 VerbosePrintOut(fname
);
1375 if(not followlink
or followlink
is None):
1376 fstatinfo
= os
.lstat(fname
);
1378 fstatinfo
= os
.stat(fname
);
1379 fpremode
= fstatinfo
.st_mode
;
1380 finode
= fstatinfo
.st_ino
;
1381 flinkcount
= fstatinfo
.st_nlink
;
1383 if(stat
.S_ISREG(fpremode
)):
1385 elif(stat
.S_ISLNK(fpremode
)):
1387 elif(stat
.S_ISCHR(fpremode
)):
1389 elif(stat
.S_ISBLK(fpremode
)):
1391 elif(stat
.S_ISDIR(fpremode
)):
1393 elif(stat
.S_ISFIFO(fpremode
)):
1395 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
1397 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
1399 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
1404 fcurfid
= format(int(curfid
), 'x').lower();
1405 if(not followlink
and finode
!=0):
1407 if(finode
in inodelist
):
1409 flinkname
= inodetofile
[finode
];
1410 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
1411 if(finode
not in inodelist
):
1412 inodelist
.append(finode
);
1413 inodetofile
.update({finode
: fname
});
1414 inodetocatinode
.update({finode
: curinode
});
1415 fcurinode
= format(int(curinode
), 'x').lower();
1416 curinode
= curinode
+ 1;
1418 fcurinode
= format(int(curinode
), 'x').lower();
1419 curinode
= curinode
+ 1;
1420 curfid
= curfid
+ 1;
1422 flinkname
= os
.readlink(fname
);
1423 fdev
= fstatinfo
.st_dev
;
1424 getfdev
= GetDevMajorMinor(fdev
);
1425 fdev_minor
= getfdev
[0];
1426 fdev_major
= getfdev
[1];
1427 frdev
= fstatinfo
.st_dev
;
1428 if(hasattr(fstatinfo
, "st_rdev")):
1429 frdev
= fstatinfo
.st_rdev
;
1431 frdev
= fstatinfo
.st_dev
;
1432 getfrdev
= GetDevMajorMinor(frdev
);
1433 frdev_minor
= getfrdev
[0];
1434 frdev_major
= getfrdev
[1];
1435 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1436 fsize
= format(int("0"), 'x').lower();
1437 elif(ftype
==0 or ftype
==7):
1438 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
1440 fsize
= format(int(fstatinfo
.st_size
)).lower();
1441 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
1442 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
1443 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1444 if(hasattr(fstatinfo
, "st_birthtime")):
1445 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
1447 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1448 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
1449 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
1450 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
1451 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
1452 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
1457 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
1458 funame
= userinfo
.pw_name
;
1467 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
1468 fgname
= groupinfo
.gr_name
;
1473 fdev_minor
= format(int(fdev_minor
), 'x').lower();
1474 fdev_major
= format(int(fdev_major
), 'x').lower();
1475 frdev_minor
= format(int(frdev_minor
), 'x').lower();
1476 frdev_major
= format(int(frdev_major
), 'x').lower();
1477 finode
= format(int(finode
), 'x').lower();
1478 flinkcount
= format(int(flinkcount
), 'x').lower();
1479 if(hasattr(fstatinfo
, "st_file_attributes")):
1480 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
1482 fwinattributes
= format(int(0), 'x').lower();
1483 fcontents
= "".encode('UTF-8');
1485 if(ftype
== 0 or ftype
== 7):
1486 with
open(fname
, "rb") as fpc
:
1488 chunk
= fpc
.read(chunk_size
);
1492 if(followlink
and (ftype
== 1 or ftype
== 2)):
1493 flstatinfo
= os
.stat(flinkname
);
1494 with
open(flinkname
, "rb") as fpc
:
1496 chunk
= fpc
.read(chunk_size
);
1500 ftypehex
= format(ftype
, 'x').lower();
1501 extrafields
= format(len(extradata
), 'x').lower();
1502 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
1503 if(len(extradata
)>0):
1504 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1505 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1506 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
1507 if(len(extradata
)>0):
1508 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1509 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
1510 if(checksumtype
=="none" or checksumtype
==""):
1511 catfileheadercshex
= format(0, 'x').lower();
1512 catfilecontentcshex
= format(0, 'x').lower();
1513 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1514 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
1515 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
1516 elif(checksumtype
=="crc16_ccitt"):
1517 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
1518 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
1519 elif(checksumtype
=="adler32"):
1520 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1521 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
1522 elif(checksumtype
=="crc32"):
1523 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1524 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
1525 elif(checksumtype
=="crc64_ecma"):
1526 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1527 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
1528 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1529 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1530 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
1531 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1532 checksumoutstr
= hashlib
.new(checksumtype
);
1533 checksumoutstr
.update("".encode('UTF-8'));
1534 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1535 checksumoutstr
= hashlib
.new(checksumtype
);
1536 checksumoutstr
.update(fcontents
);
1537 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
1539 catfileheadercshex
= format(0, 'x').lower();
1540 catfilecontentcshex
= format(0, 'x').lower();
1541 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1542 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
1543 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
1544 if(checksumtype
=="none" or checksumtype
==""):
1545 catfileheadercshex
= format(0, 'x').lower();
1546 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1547 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1548 elif(checksumtype
=="crc16_ccitt"):
1549 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1550 elif(checksumtype
=="adler32"):
1551 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1552 elif(checksumtype
=="crc32"):
1553 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1554 elif(checksumtype
=="crc64_ecma"):
1555 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1556 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1557 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1558 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1559 checksumoutstr
= hashlib
.new(checksumtype
);
1560 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
1561 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1563 catfileheadercshex
= format(0, 'x').lower();
1564 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1565 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
1566 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
1567 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1568 nullstrecd
= formatspecs
[5].encode('UTF-8');
1569 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
1570 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
1571 catfp
.write(catfileout
);
1574 os
.fsync(catfp
.fileno());
1575 except io
.UnsupportedOperation
:
1577 except AttributeError:
1579 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1580 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1583 os
.fsync(catfp
.fileno());
1584 except io
.UnsupportedOperation
:
1586 except AttributeError:
1590 if(hasattr(sys
.stdout
, "buffer")):
1591 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1593 shutil
.copyfileobj(catfp
, sys
.stdout
);
1594 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1595 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1597 upload_file_to_ftp_file(catfp
, outfile
);
1598 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1599 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1602 upload_file_to_pysftp_file(catfp
, outfile
);
1604 upload_file_to_sftp_file(catfp
, outfile
);
1612 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
1614 if(hasattr(shutil
, "register_archive_format")):
1615 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
1616 return PackArchiveFile(source_dir
, archive_name
, False, "auto", None, False, "crc32", [], __file_format_delimiter__
, False, False);
1617 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
1619 def PackArchiveFileFromDirList(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1620 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
1622 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1623 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1624 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1625 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
1626 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1627 outfile
= RemoveWindowsPath(outfile
);
1628 checksumtype
= checksumtype
.lower();
1629 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
1630 checksumtype
="crc32";
1631 if(checksumtype
=="none"):
1633 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
1635 if(compression
not in compressionlist
and compression
is None):
1636 compression
= "auto";
1638 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1639 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1640 if(os
.path
.exists(outfile
)):
1645 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1647 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1649 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1652 fbasename
= os
.path
.splitext(outfile
)[0];
1653 fextname
= os
.path
.splitext(outfile
)[1];
1654 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1655 catver
= formatspecs
[6];
1656 fileheaderver
= str(int(catver
.replace(".", "")));
1657 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
1658 catfp
.write(fileheader
.encode('UTF-8'));
1664 inodetocatinode
= {};
1667 if(hasattr(sys
.stdin
, "buffer")):
1668 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
1670 shutil
.copyfileobj(sys
.stdin
, infile
);
1675 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
1676 infile
= download_file_from_http_file(infile
);
1681 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
1682 infile
= download_file_from_ftp_file(infile
);
1687 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
1689 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
1691 if(not tarfile
.is_tarfile(infile
)):
1693 except AttributeError:
1694 if(not is_tarfile(infile
)):
1699 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1700 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
1702 tarfp
= tarfile
.open(infile
, "r");
1703 except FileNotFoundError
:
1705 fnumfiles
= format(int(len(tarfp
.getmembers())), 'x').lower();
1706 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
1707 if(checksumtype
=="none" or checksumtype
==""):
1708 catfileheadercshex
= format(0, 'x').lower();
1709 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1710 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1711 elif(checksumtype
=="crc16_ccitt"):
1712 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1713 elif(checksumtype
=="adler32"):
1714 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1715 elif(checksumtype
=="crc32"):
1716 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1717 elif(checksumtype
=="crc64_ecma"):
1718 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1719 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1720 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1721 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1722 checksumoutstr
= hashlib
.new(checksumtype
);
1723 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
1724 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1726 catfileheadercshex
= format(0, 'x').lower();
1727 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
1728 catfp
.write(fnumfilesa
.encode('UTF-8'));
1731 os
.fsync(catfp
.fileno());
1732 except io
.UnsupportedOperation
:
1734 except AttributeError:
1736 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
1737 catfhstart
= catfp
.tell();
1738 if(re
.findall("^[.|/]", member
.name
)):
1739 fname
= member
.name
;
1741 fname
= "./"+member
.name
;
1743 VerbosePrintOut(fname
);
1744 fpremode
= member
.mode
;
1745 ffullmode
= member
.mode
;
1749 ffullmode
= member
.mode
+ stat
.S_IFREG
;
1751 elif(member
.isdev()):
1752 ffullmode
= member
.mode
;
1754 elif(member
.islnk()):
1755 ffullmode
= member
.mode
+ stat
.S_IFREG
;
1757 elif(member
.issym()):
1758 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
1760 elif(member
.ischr()):
1761 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
1763 elif(member
.isblk()):
1764 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
1766 elif(member
.isdir()):
1767 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
1769 elif(member
.isfifo()):
1770 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
1772 elif(member
.issparse()):
1773 ffullmode
= member
.mode
;
1776 ffullmode
= member
.mode
;
1779 fcurfid
= format(int(curfid
), 'x').lower();
1780 fcurinode
= format(int(0), 'x').lower();
1781 curfid
= curfid
+ 1;
1783 flinkname
= member
.linkname
;
1784 fdev_minor
= format(int(member
.devminor
), 'x').lower();
1785 fdev_major
= format(int(member
.devmajor
), 'x').lower();
1786 frdev_minor
= format(int(member
.devminor
), 'x').lower();
1787 frdev_major
= format(int(member
.devmajor
), 'x').lower();
1788 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1789 fsize
= format(int("0"), 'x').lower();
1790 elif(ftype
==0 or ftype
==7):
1791 fsize
= format(int(member
.size
), 'x').lower();
1793 fsize
= format(int(member
.size
), 'x').lower();
1794 fatime
= format(int(member
.mtime
), 'x').lower();
1795 fmtime
= format(int(member
.mtime
), 'x').lower();
1796 fctime
= format(int(member
.mtime
), 'x').lower();
1797 fbtime
= format(int(member
.mtime
), 'x').lower();
1798 fmode
= format(int(ffullmode
), 'x').lower();
1799 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
1800 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
1801 fuid
= format(int(member
.uid
), 'x').lower();
1802 fgid
= format(int(member
.gid
), 'x').lower();
1803 funame
= member
.uname
;
1804 fgname
= member
.gname
;
1805 flinkcount
= format(int(flinkcount
), 'x').lower();
1806 fcontents
= "".encode('UTF-8');
1808 if(ftype
== 0 or ftype
== 7):
1809 with tarfp
.extractfile(member
) as fpc
:
1811 chunk
= fpc
.read(chunk_size
);
1815 ftypehex
= format(ftype
, 'x').lower();
1816 extrafields
= format(len(extradata
), 'x').lower();
1817 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
1818 if(len(extradata
)>0):
1819 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1820 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1821 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
1822 if(len(extradata
)>0):
1823 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1824 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
1825 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
1826 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
1827 if(checksumtype
=="none" or checksumtype
==""):
1828 catfileheadercshex
= format(0, 'x').lower();
1829 catfilecontentcshex
= format(0, 'x').lower();
1830 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1831 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
1832 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
1833 elif(checksumtype
=="crc16_ccitt"):
1834 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
1835 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
1836 elif(checksumtype
=="adler32"):
1837 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1838 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
1839 elif(checksumtype
=="crc32"):
1840 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1841 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
1842 elif(checksumtype
=="crc64_ecma"):
1843 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1844 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
1845 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1846 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1847 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
1848 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1849 checksumoutstr
= hashlib
.new(checksumtype
);
1850 checksumoutstr
.update("".encode('UTF-8'));
1851 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1852 checksumoutstr
= hashlib
.new(checksumtype
);
1853 checksumoutstr
.update(fcontents
);
1854 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
1856 catfileheadercshex
= format(0, 'x').lower();
1857 catfilecontentcshex
= format(0, 'x').lower();
1858 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1859 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
1860 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
1861 if(checksumtype
=="none" or checksumtype
==""):
1862 catfileheadercshex
= format(0, 'x').lower();
1863 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1864 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1865 elif(checksumtype
=="crc16_ccitt"):
1866 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1867 elif(checksumtype
=="adler32"):
1868 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1869 elif(checksumtype
=="crc32"):
1870 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1871 elif(checksumtype
=="crc64_ecma"):
1872 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1873 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1874 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1875 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1876 checksumoutstr
= hashlib
.new(checksumtype
);
1877 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
1878 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1880 catfileheadercshex
= format(0, 'x').lower();
1881 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1882 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1883 nullstrecd
= formatspecs
[5].encode('UTF-8');
1884 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
1885 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
1886 catfp
.write(catfileout
);
1889 os
.fsync(catfp
.fileno());
1890 except io
.UnsupportedOperation
:
1892 except AttributeError:
1894 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1895 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1898 os
.fsync(catfp
.fileno());
1899 except io
.UnsupportedOperation
:
1901 except AttributeError:
1905 if(hasattr(sys
.stdout
, "buffer")):
1906 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1908 shutil
.copyfileobj(catfp
, sys
.stdout
);
1909 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1910 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1912 upload_file_to_ftp_file(catfp
, outfile
);
1913 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1914 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1917 upload_file_to_pysftp_file(catfp
, outfile
);
1919 upload_file_to_sftp_file(catfp
, outfile
);
1927 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
1929 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1930 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1931 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1932 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
1933 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1934 outfile
= RemoveWindowsPath(outfile
);
1935 checksumtype
= checksumtype
.lower();
1936 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
1937 checksumtype
="crc32";
1938 if(checksumtype
=="none"):
1940 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
1942 if(compression
not in compressionlist
and compression
is None):
1943 compression
= "auto";
1945 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1946 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1947 if(os
.path
.exists(outfile
)):
1952 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1954 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1956 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1959 fbasename
= os
.path
.splitext(outfile
)[0];
1960 fextname
= os
.path
.splitext(outfile
)[1];
1961 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1962 catver
= formatspecs
[6];
1963 fileheaderver
= str(int(catver
.replace(".", "")));
1964 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
1965 catfp
.write(fileheader
.encode('UTF-8'));
1971 inodetocatinode
= {};
1974 if(hasattr(sys
.stdin
, "buffer")):
1975 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
1977 shutil
.copyfileobj(sys
.stdin
, infile
);
1982 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
1983 infile
= download_file_from_http_file(infile
);
1988 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
1989 infile
= download_file_from_ftp_file(infile
);
1994 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
1998 if(not zipfile
.is_zipfile(infile
)):
2001 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
2002 except FileNotFoundError
:
2004 ziptest
= zipfp
.testzip();
2006 VerbosePrintOut("Bad file found!");
2007 fnumfiles
= format(int(len(zipfp
.infolist())), 'x').lower();
2008 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2009 if(checksumtype
=="none" or checksumtype
==""):
2010 catfileheadercshex
= format(0, 'x').lower();
2011 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2012 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2013 elif(checksumtype
=="crc16_ccitt"):
2014 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2015 elif(checksumtype
=="adler32"):
2016 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2017 elif(checksumtype
=="crc32"):
2018 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2019 elif(checksumtype
=="crc64_ecma"):
2020 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2021 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2022 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2023 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2024 checksumoutstr
= hashlib
.new(checksumtype
);
2025 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
2026 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2028 catfileheadercshex
= format(0, 'x').lower();
2029 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2030 catfp
.write(fnumfilesa
.encode('UTF-8'));
2033 os
.fsync(catfp
.fileno());
2034 except io
.UnsupportedOperation
:
2036 except AttributeError:
2038 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
2039 catfhstart
= catfp
.tell();
2040 if(re
.findall("^[.|/]", member
.filename
)):
2041 fname
= member
.filename
;
2043 fname
= "./"+member
.filename
;
2044 zipinfo
= zipfp
.getinfo(member
.filename
);
2046 VerbosePrintOut(fname
);
2047 if(not member
.is_dir()):
2048 fpremode
= int(stat
.S_IFREG
+ 438);
2049 elif(member
.is_dir()):
2050 fpremode
= int(stat
.S_IFDIR
+ 511);
2053 if(not member
.is_dir()):
2055 elif(member
.is_dir()):
2058 fcurfid
= format(int(curfid
), 'x').lower();
2059 fcurinode
= format(int(0), 'x').lower();
2060 curfid
= curfid
+ 1;
2061 fdev_minor
= format(int(0), 'x').lower();
2062 fdev_major
= format(int(0), 'x').lower();
2063 frdev_minor
= format(int(0), 'x').lower();
2064 frdev_major
= format(int(0), 'x').lower();
2066 fsize
= format(int("0"), 'x').lower();
2068 fsize
= format(int(member
.file_size
), 'x').lower();
2070 fsize
= format(int(member
.file_size
), 'x').lower();
2071 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2072 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2073 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2074 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2075 if(not member
.is_dir()):
2076 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
2077 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
2078 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
2079 if(member
.is_dir()):
2080 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
2081 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2082 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2084 fuid
= format(int(os
.getuid()), 'x').lower();
2085 except AttributeError:
2086 fuid
= format(int(0), 'x').lower();
2088 fuid
= format(int(0), 'x').lower();
2090 fgid
= format(int(os
.getgid()), 'x').lower();
2091 except AttributeError:
2092 fgid
= format(int(0), 'x').lower();
2094 fgid
= format(int(0), 'x').lower();
2098 userinfo
= pwd
.getpwuid(os
.getuid());
2099 funame
= userinfo
.pw_name
;
2102 except AttributeError:
2110 groupinfo
= grp
.getgrgid(os
.getgid());
2111 fgname
= groupinfo
.gr_name
;
2114 except AttributeError:
2118 fcontents
= "".encode('UTF-8');
2120 fcontents
= zipfp
.read(member
.filename
);
2121 ftypehex
= format(ftype
, 'x').lower();
2122 extrafields
= format(len(extradata
), 'x').lower();
2123 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2124 if(len(extradata
)>0):
2125 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2126 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2127 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
2128 if(len(extradata
)>0):
2129 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2130 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2131 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2132 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2133 if(checksumtype
=="none" or checksumtype
==""):
2134 catfileheadercshex
= format(0, 'x').lower();
2135 catfilecontentcshex
= format(0, 'x').lower();
2136 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2137 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
2138 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
2139 elif(checksumtype
=="crc16_ccitt"):
2140 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
2141 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
2142 elif(checksumtype
=="adler32"):
2143 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2144 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
2145 elif(checksumtype
=="crc32"):
2146 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2147 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
2148 elif(checksumtype
=="crc64_ecma"):
2149 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2150 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
2151 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2152 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2153 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
2154 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2155 checksumoutstr
= hashlib
.new(checksumtype
);
2156 checksumoutstr
.update("".encode('UTF-8'));
2157 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2158 checksumoutstr
= hashlib
.new(checksumtype
);
2159 checksumoutstr
.update(fcontents
);
2160 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
2162 catfileheadercshex
= format(0, 'x').lower();
2163 catfilecontentcshex
= format(0, 'x').lower();
2164 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2165 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2166 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
2167 if(checksumtype
=="none" or checksumtype
==""):
2168 catfileheadercshex
= format(0, 'x').lower();
2169 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2170 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2171 elif(checksumtype
=="crc16_ccitt"):
2172 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2173 elif(checksumtype
=="adler32"):
2174 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2175 elif(checksumtype
=="crc32"):
2176 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2177 elif(checksumtype
=="crc64_ecma"):
2178 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2179 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2180 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2181 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2182 checksumoutstr
= hashlib
.new(checksumtype
);
2183 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
2184 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2186 catfileheadercshex
= format(0, 'x').lower();
2187 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2188 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2189 nullstrecd
= formatspecs
[5].encode('UTF-8');
2190 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
2191 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2192 catfp
.write(catfileout
);
2195 os
.fsync(catfp
.fileno());
2196 except io
.UnsupportedOperation
:
2198 except AttributeError:
2200 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2201 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2204 os
.fsync(catfp
.fileno());
2205 except io
.UnsupportedOperation
:
2207 except AttributeError:
2211 if(hasattr(sys
.stdout
, "buffer")):
2212 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2214 shutil
.copyfileobj(catfp
, sys
.stdout
);
2215 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
2216 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2218 upload_file_to_ftp_file(catfp
, outfile
);
2219 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
2220 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2223 upload_file_to_pysftp_file(catfp
, outfile
);
2225 upload_file_to_sftp_file(catfp
, outfile
);
2233 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
2235 if(not rarfile_support
):
2236 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2239 if(rarfile_support
):
2240 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2241 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
2242 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
2243 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
2244 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2245 outfile
= RemoveWindowsPath(outfile
);
2246 checksumtype
= checksumtype
.lower();
2247 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2248 checksumtype
="crc32";
2249 if(checksumtype
=="none"):
2251 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2253 if(compression
not in compressionlist
and compression
is None):
2254 compression
= "auto";
2256 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2257 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2258 if(os
.path
.exists(outfile
)):
2263 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2265 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
2267 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
2270 fbasename
= os
.path
.splitext(outfile
)[0];
2271 fextname
= os
.path
.splitext(outfile
)[1];
2272 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2273 catver
= formatspecs
[6];
2274 fileheaderver
= str(int(catver
.replace(".", "")));
2275 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2276 catfp
.write(fileheader
.encode('UTF-8'));
2282 inodetocatinode
= {};
2283 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2285 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
2287 rarfp
= rarfile
.RarFile(infile
, "r");
2288 rartest
= rarfp
.testrar();
2290 VerbosePrintOut("Bad file found!");
2291 fnumfiles
= format(int(len(rarfp
.infolist())), 'x').lower();
2292 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2293 if(checksumtype
=="none" or checksumtype
==""):
2294 catfileheadercshex
= format(0, 'x').lower();
2295 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2296 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2297 elif(checksumtype
=="crc16_ccitt"):
2298 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2299 elif(checksumtype
=="adler32"):
2300 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2301 elif(checksumtype
=="crc32"):
2302 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2303 elif(checksumtype
=="crc64_ecma"):
2304 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2305 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2306 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2307 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2308 checksumoutstr
= hashlib
.new(checksumtype
);
2309 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
2310 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2312 catfileheadercshex
= format(0, 'x').lower();
2313 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2314 catfp
.write(fnumfilesa
.encode('UTF-8'));
2317 os
.fsync(catfp
.fileno());
2318 except io
.UnsupportedOperation
:
2320 except AttributeError:
2322 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
2325 if(member
.host_os
== rarfile
.RAR_OS_UNIX
):
2328 member
.external_attr
2330 except AttributeError:
2332 elif(member
.host_os
== rarfile
.RAR_OS_WIN32
):
2335 member
.external_attr
2337 except AttributeError:
2342 catfhstart
= catfp
.tell();
2343 if(re
.findall("^[.|/]", member
.filename
)):
2344 fname
= member
.filename
;
2346 fname
= "./"+member
.filename
;
2347 rarinfo
= rarfp
.getinfo(member
.filename
);
2349 VerbosePrintOut(fname
);
2350 if(is_unix
and member
.external_attr
!=0):
2351 fpremode
= int(member
.external_attr
);
2352 elif(member
.is_file()):
2353 fpremode
= int(stat
.S_IFREG
+ 438);
2354 elif(member
.is_symlink()):
2355 fpremode
= int(stat
.S_IFLNK
+ 438);
2356 elif(member
.is_dir()):
2357 fpremode
= int(stat
.S_IFDIR
+ 511);
2358 if(is_windows
and member
.external_attr
!=0):
2359 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
2361 fwinattributes
= format(int(0), 'x').lower();
2364 if(member
.is_file()):
2366 elif(member
.is_symlink()):
2368 elif(member
.is_dir()):
2372 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
2373 fcurfid
= format(int(curfid
), 'x').lower();
2374 fcurinode
= format(int(0), 'x').lower();
2375 curfid
= curfid
+ 1;
2376 fdev_minor
= format(int(0), 'x').lower();
2377 fdev_major
= format(int(0), 'x').lower();
2378 frdev_minor
= format(int(0), 'x').lower();
2379 frdev_major
= format(int(0), 'x').lower();
2381 fsize
= format(int("0"), 'x').lower();
2383 fsize
= format(int(member
.file_size
), 'x').lower();
2385 fsize
= format(int(member
.file_size
), 'x').lower();
2388 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
2390 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2391 except AttributeError:
2392 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2393 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2396 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
2398 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2399 except AttributeError:
2400 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2401 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2402 if(is_unix
and member
.external_attr
!=0):
2403 fmode
= format(int(member
.external_attr
), 'x').lower();
2404 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
2405 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
2406 elif(member
.is_file()):
2407 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
2408 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
2409 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
2410 elif(member
.is_symlink()):
2411 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
2412 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
2413 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
2414 elif(member
.is_dir()):
2415 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
2416 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2417 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2419 fuid
= format(int(os
.getuid()), 'x').lower();
2420 except AttributeError:
2421 fuid
= format(int(0), 'x').lower();
2423 fuid
= format(int(0), 'x').lower();
2425 fgid
= format(int(os
.getgid()), 'x').lower();
2426 except AttributeError:
2427 fgid
= format(int(0), 'x').lower();
2429 fgid
= format(int(0), 'x').lower();
2433 userinfo
= pwd
.getpwuid(os
.getuid());
2434 funame
= userinfo
.pw_name
;
2437 except AttributeError:
2445 groupinfo
= grp
.getgrgid(os
.getgid());
2446 fgname
= groupinfo
.gr_name
;
2449 except AttributeError:
2453 fcontents
= "".encode('UTF-8');
2455 fcontents
= rarfp
.read(member
.filename
);
2456 ftypehex
= format(ftype
, 'x').lower();
2457 extrafields
= format(len(extradata
), 'x').lower();
2458 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2459 if(len(extradata
)>0):
2460 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2461 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2462 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
2463 if(len(extradata
)>0):
2464 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2465 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2466 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2467 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2468 if(checksumtype
=="none" or checksumtype
==""):
2469 catfileheadercshex
= format(0, 'x').lower();
2470 catfilecontentcshex
= format(0, 'x').lower();
2471 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2472 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
2473 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
2474 elif(checksumtype
=="crc16_ccitt"):
2475 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
2476 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
2477 elif(checksumtype
=="adler32"):
2478 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2479 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
2480 elif(checksumtype
=="crc32"):
2481 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2482 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
2483 elif(checksumtype
=="crc64_ecma"):
2484 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2485 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
2486 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2487 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2488 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
2489 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2490 checksumoutstr
= hashlib
.new(checksumtype
);
2491 checksumoutstr
.update("".encode('UTF-8'));
2492 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2493 checksumoutstr
= hashlib
.new(checksumtype
);
2494 checksumoutstr
.update(fcontents
);
2495 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
2497 catfileheadercshex
= format(0, 'x').lower();
2498 catfilecontentcshex
= format(0, 'x').lower();
2499 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2500 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2501 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
2502 if(checksumtype
=="none" or checksumtype
==""):
2503 catfileheadercshex
= format(0, 'x').lower()
2504 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2505 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
2506 elif(checksumtype
=="crc16_ccitt"):
2507 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
2508 elif(checksumtype
=="adler32"):
2509 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
2510 elif(checksumtype
=="crc32"):
2511 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
2512 elif(checksumtype
=="crc64_ecma"):
2513 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
2514 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2515 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
2516 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2517 checksumoutstr
= hashlib
.new(checksumtype
)
2518 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'))
2519 catfileheadercshex
= checksumoutstr
.hexdigest().lower()
2521 catfileheadercshex
= format(0, 'x').lower()
2522 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
2523 catfileoutstrecd
= catfileoutstr
.encode('UTF-8')
2524 nullstrecd
= formatspecs
[5].encode('UTF-8')
2525 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
2526 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
)
2527 catfp
.write(catfileout
)
2530 os
.fsync(catfp
.fileno())
2531 except io
.UnsupportedOperation
:
2533 except AttributeError:
2535 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2536 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
2539 os
.fsync(catfp
.fileno())
2540 except io
.UnsupportedOperation
:
2542 except AttributeError:
2546 if(hasattr(sys
.stdout
, "buffer")):
2547 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2549 shutil
.copyfileobj(catfp
, sys
.stdout
);
2550 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
2551 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2553 upload_file_to_ftp_file(catfp
, outfile
);
2554 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
2555 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2558 upload_file_to_pysftp_file(catfp
, outfile
);
2560 upload_file_to_sftp_file(catfp
, outfile
);
2568 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
2570 def ArchiveFileSeekToFileNum(infile
, seekto
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2571 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2574 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2575 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
2576 if(checkcompressfile
=="tarfile"):
2577 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2578 if(checkcompressfile
=="zipfile"):
2579 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2580 if(rarfile_support
and checkcompressfile
=="rarfile"):
2581 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2582 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2589 if(hasattr(sys
.stdin
, "buffer")):
2590 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
2592 shutil
.copyfileobj(sys
.stdin
, catfp
);
2594 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2598 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
2599 catfp
= download_file_from_http_file(infile
);
2601 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2605 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
2606 catfp
= download_file_from_ftp_file(infile
);
2608 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2612 elif(re
.findall(r
"^(sftp)\:\/\/", infile
) and haveparamiko
):
2614 catfp
= download_file_from_pysftp_file(infile
);
2616 catfp
= download_file_from_sftp_file(infile
);
2618 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2623 infile
= RemoveWindowsPath(infile
);
2624 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
2625 if(checkcompressfile
=="tarfile"):
2626 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2627 if(checkcompressfile
=="zipfile"):
2628 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2629 if(rarfile_support
and checkcompressfile
=="rarfile"):
2630 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2631 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2633 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
2634 if(not compresscheck
):
2635 fextname
= os
.path
.splitext(infile
)[1];
2636 if(fextname
==".gz"):
2637 compresscheck
= "gzip";
2638 if(fextname
==".bz2"):
2639 compresscheck
= "bzip2";
2640 if(fextname
==".zst"):
2641 compresscheck
= "zstd";
2642 if(fextname
==".lz4" or fextname
==".clz4"):
2643 compresscheck
= "lz4";
2644 if(fextname
==".lzo" or fextname
==".lzop"):
2645 compresscheck
= "lzo";
2646 if(fextname
==".lzma" or fextname
==".xz"):
2647 compresscheck
= "lzma";
2648 if(not compresscheck
):
2650 catfp
= UncompressFile(infile
, formatspecs
, "rb");
2655 SeekToEndOfFile(catfp);
2657 SeekToEndOfFile(catfp);
2658 CatSize = catfp.tell();
2659 CatSizeEnd = CatSize;
2667 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
2668 catstring
= catheader
[0];
2669 catversion
= re
.findall(r
"([\d]+)$", catstring
);
2670 fprenumfiles
= catheader
[1];
2671 fnumfiles
= int(fprenumfiles
, 16);
2672 fprechecksumtype
= catheader
[2];
2673 fprechecksum
= catheader
[3];
2674 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
2675 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
2676 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
2677 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
2678 catfileheadercshex
= format(0, 'x').lower();
2679 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
2680 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2681 elif(fprechecksumtype
=="crc16_ccitt"):
2682 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2683 elif(fprechecksumtype
=="adler32"):
2684 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2685 elif(fprechecksumtype
=="crc32"):
2686 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2687 elif(fprechecksumtype
=="crc64_ecma"):
2688 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2689 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
2690 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2691 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
2692 checksumoutstr
= hashlib
.new(fprechecksumtype
);
2693 checksumoutstr
.update(fileheader
.encode('UTF-8'));
2694 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2696 catfileheadercshex
= format(0, 'x').lower();
2697 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2698 fheadtell
= len(fileheader
);
2699 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
2700 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(catfp
.tell()));
2702 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
2703 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
2704 if(seekto
>=fnumfiles
):
2705 seekto
= fnumfiles
- 1;
2711 seekstart
= catfp
.tell();
2712 preheaderdata
= ReadFileHeaderData(catfp
, 5, formatspecs
[5]);
2713 prefheadsize
= int(preheaderdata
[0], 16);
2714 prefseek
= prefheadsize
- (int(len(preheaderdata
[1]) + 1) + int(len(preheaderdata
[2]) + 1) + int(len(preheaderdata
[3]) + 1) + int(len(preheaderdata
[4]) + 1));
2715 preftype
= int(preheaderdata
[1], 16);
2716 prefsize
= int(preheaderdata
[4], 16);
2717 catfp
.seek(prefseek
, 1);
2719 catfp
.seek(prefsize
, 1);
2722 catfp
.seek(seekstart
, 0);
2724 catfheadsize
= int(preheaderdata
[0], 16);
2725 catftype
= int(preheaderdata
[1], 16);
2726 if(re
.findall("^[.|/]", preheaderdata
[2])):
2727 catfname
= preheaderdata
[2];
2729 catfname
= "./"+preheaderdata
[2];
2730 catflinkname
= preheaderdata
[3];
2731 catfsize
= int(preheaderdata
[4], 16);
2732 catfbasedir
= os
.path
.dirname(catfname
);
2733 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
2735 catlist
.update({'catfp': catfp
});
2740 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
2742 def ArchiveFileSeekToFileName(infile
, seekfile
=None, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2743 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2746 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2747 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
2748 if(checkcompressfile
=="tarfile"):
2749 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2750 if(checkcompressfile
=="zipfile"):
2751 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2752 if(rarfile_support
and checkcompressfile
=="rarfile"):
2753 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2754 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2761 if(hasattr(sys
.stdin
, "buffer")):
2762 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
2764 shutil
.copyfileobj(sys
.stdin
, catfp
);
2766 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2770 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
2771 catfp
= download_file_from_http_file(infile
);
2773 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2777 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
2778 catfp
= download_file_from_ftp_file(infile
);
2780 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2784 elif(re
.findall(r
"^(sftp)\:\/\/", infile
) and haveparamiko
):
2786 catfp
= download_file_from_pysftp_file(infile
);
2788 catfp
= download_file_from_sftp_file(infile
);
2790 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2795 infile
= RemoveWindowsPath(infile
);
2796 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
2797 if(checkcompressfile
=="tarfile"):
2798 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2799 if(checkcompressfile
=="zipfile"):
2800 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2801 if(rarfile_support
and checkcompressfile
=="rarfile"):
2802 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2803 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2805 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
2806 if(not compresscheck
):
2807 fextname
= os
.path
.splitext(infile
)[1];
2808 if(fextname
==".gz"):
2809 compresscheck
= "gzip";
2810 if(fextname
==".bz2"):
2811 compresscheck
= "bzip2";
2812 if(fextname
==".zst"):
2813 compresscheck
= "zstd";
2814 if(fextname
==".lz4" or fextname
==".clz4"):
2815 compresscheck
= "lz4";
2816 if(fextname
==".lzo" or fextname
==".lzop"):
2817 compresscheck
= "lzo";
2818 if(fextname
==".lzma" or fextname
==".xz"):
2819 compresscheck
= "lzma";
2820 if(not compresscheck
):
2822 catfp
= UncompressFile(infile
, formatspecs
, "rb");
2827 SeekToEndOfFile(catfp);
2829 SeekToEndOfFile(catfp);
2830 CatSize = catfp.tell();
2831 CatSizeEnd = CatSize;
2839 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
2840 catstring
= catheader
[0];
2841 catversion
= re
.findall(r
"([\d]+)$", catstring
);
2842 fprenumfiles
= catheader
[1];
2843 fnumfiles
= int(fprenumfiles
, 16);
2844 fprechecksumtype
= catheader
[2];
2845 fprechecksum
= catheader
[3];
2846 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
2847 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
2848 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
2849 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
2850 catfileheadercshex
= format(0, 'x').lower();
2851 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
2852 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2853 elif(fprechecksumtype
=="crc16_ccitt"):
2854 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2855 elif(fprechecksumtype
=="adler32"):
2856 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2857 elif(fprechecksumtype
=="crc32"):
2858 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2859 elif(fprechecksumtype
=="crc64_ecma"):
2860 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2861 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
2862 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2863 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
2864 checksumoutstr
= hashlib
.new(fprechecksumtype
);
2865 checksumoutstr
.update(fileheader
.encode('UTF-8'));
2866 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2868 catfileheadercshex
= format(0, 'x').lower();
2869 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2870 fheadtell
= len(fileheader
);
2871 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
2872 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(catfp
.tell()));
2874 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
2875 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
2876 seekto
= fnumfiles
- 1
2881 seekstart
= catfp
.tell();
2882 preheaderdata
= ReadFileHeaderData(catfp
, 5, formatspecs
[5]);
2883 prefheadsize
= int(preheaderdata
[0], 16);
2884 prefseek
= prefheadsize
- (int(len(preheaderdata
[1]) + 1) + int(len(preheaderdata
[2]) + 1) + int(len(preheaderdata
[3]) + 1) + int(len(preheaderdata
[4]) + 1));
2885 preftype
= int(preheaderdata
[1], 16);
2886 prefsize
= int(preheaderdata
[4], 16);
2887 catfp
.seek(prefseek
, 1);
2889 catfp
.seek(prefsize
, 1);
2893 prefname
= preheaderdata
[2];
2894 if(re
.findall("^[.|/]", preheaderdata
[2])):
2895 prefname
= preheaderdata
[2];
2897 prefname
= "./"+preheaderdata
[2];
2898 if(prefname
==seekfile
):
2901 catfp
.seek(seekstart
, 0);
2903 catfheadsize
= int(preheaderdata
[0], 16);
2904 catftype
= int(preheaderdata
[1], 16);
2905 if(re
.findall("^[.|/]", preheaderdata
[2])):
2906 catfname
= preheaderdata
[2];
2908 catfname
= "./"+preheaderdata
[2];
2909 catflinkname
= preheaderdata
[3];
2910 catfsize
= int(preheaderdata
[4], 16);
2911 catfbasedir
= os
.path
.dirname(catfname
);
2913 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
2917 catlist
.update({'catfp': catfp
});
2922 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
2924 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2925 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2928 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2929 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
2930 if(checkcompressfile
=="tarfile"):
2931 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2932 if(checkcompressfile
=="zipfile"):
2933 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2934 if(rarfile_support
and checkcompressfile
=="rarfile"):
2935 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2936 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2943 if(hasattr(sys
.stdin
, "buffer")):
2944 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
2946 shutil
.copyfileobj(sys
.stdin
, catfp
);
2948 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2952 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
2953 catfp
= download_file_from_http_file(infile
);
2955 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2959 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
2960 catfp
= download_file_from_ftp_file(infile
);
2962 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2966 elif(re
.findall(r
"^(sftp)\:\/\/", infile
) and haveparamiko
):
2968 catfp
= download_file_from_pysftp_file(infile
);
2970 catfp
= download_file_from_sftp_file(infile
);
2972 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2977 infile
= RemoveWindowsPath(infile
);
2978 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
2979 if(checkcompressfile
=="tarfile"):
2980 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2981 if(checkcompressfile
=="zipfile"):
2982 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2983 if(rarfile_support
and checkcompressfile
=="rarfile"):
2984 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2985 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2987 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
2988 if(not compresscheck
):
2989 fextname
= os
.path
.splitext(infile
)[1];
2990 if(fextname
==".gz"):
2991 compresscheck
= "gzip";
2992 if(fextname
==".bz2"):
2993 compresscheck
= "bzip2";
2994 if(fextname
==".zst"):
2995 compresscheck
= "zstd";
2996 if(fextname
==".lz4" or fextname
==".clz4"):
2997 compresscheck
= "lz4";
2998 if(fextname
==".lzo" or fextname
==".lzop"):
2999 compresscheck
= "lzo";
3000 if(fextname
==".lzma" or fextname
==".xz"):
3001 compresscheck
= "lzma";
3002 if(not compresscheck
):
3004 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3009 SeekToEndOfFile(catfp);
3011 SeekToEndOfFile(catfp);
3012 CatSize = catfp.tell();
3013 CatSizeEnd = CatSize;
3021 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
3022 catstring
= catheader
[0];
3023 catversion
= re
.findall(r
"([\d]+)$", catstring
);
3024 fprenumfiles
= catheader
[1];
3025 fnumfiles
= int(fprenumfiles
, 16);
3026 fprechecksumtype
= catheader
[2];
3027 fprechecksum
= catheader
[3];
3028 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
3029 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3030 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
3031 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
3032 catfileheadercshex
= format(0, 'x').lower();
3033 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
3034 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3035 elif(fprechecksumtype
=="crc16_ccitt"):
3036 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3037 elif(fprechecksumtype
=="adler32"):
3038 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3039 elif(fprechecksumtype
=="crc32"):
3040 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3041 elif(fprechecksumtype
=="crc64_ecma"):
3042 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3043 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
3044 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3045 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
3046 checksumoutstr
= hashlib
.new(fprechecksumtype
);
3047 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3048 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3050 catfileheadercshex
= format(0, 'x').lower();
3051 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3052 fheadtell
= len(fileheader
);
3053 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
3054 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(catfp
.tell()));
3056 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3057 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
3058 if(seekstart
<0 and seekstart
>fnumfiles
):
3060 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
3061 seekend
= fnumfiles
;
3062 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
3063 seekend
= fnumfiles
- abs(seekend
);
3066 while(il
< seekstart
):
3067 preheaderdata
= ReadFileHeaderData(catfp
, 5, formatspecs
[5]);
3068 prefheadsize
= int(preheaderdata
[0], 16);
3069 prefseek
= prefheadsize
- (int(len(preheaderdata
[1]) + 1) + int(len(preheaderdata
[2]) + 1) + int(len(preheaderdata
[3]) + 1) + int(len(preheaderdata
[4]) + 1));
3070 preftype
= int(preheaderdata
[1], 16);
3071 prefsize
= int(preheaderdata
[4], 16);
3072 catfp
.seek(prefseek
, 1);
3074 catfp
.seek(prefsize
, 1);
3077 fileidnum
= seekstart
;
3079 while(fileidnum
<seekend
):
3080 catfhstart
= catfp
.tell();
3082 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
3084 catheaderdata
= ReadFileHeaderData(catfp
, 23, formatspecs
[5]);
3085 catfheadsize
= int(catheaderdata
[0], 16);
3086 catftype
= int(catheaderdata
[1], 16);
3087 if(re
.findall("^[.|/]", catheaderdata
[2])):
3088 catfname
= catheaderdata
[2];
3090 catfname
= "./"+catheaderdata
[2];
3091 catfbasedir
= os
.path
.dirname(catfname
);
3092 catflinkname
= catheaderdata
[3];
3093 catfsize
= int(catheaderdata
[4], 16);
3094 catfatime
= int(catheaderdata
[5], 16);
3095 catfmtime
= int(catheaderdata
[6], 16);
3096 catfctime
= int(catheaderdata
[7], 16);
3097 catfbtime
= int(catheaderdata
[8], 16);
3098 catfmode
= int(catheaderdata
[9], 16);
3099 catfchmode
= stat
.S_IMODE(catfmode
);
3100 catftypemod
= stat
.S_IFMT(catfmode
);
3101 catfuid
= int(catheaderdata
[10], 16);
3102 catfuname
= catheaderdata
[11];
3103 catfgid
= int(catheaderdata
[12], 16);
3104 catfgname
= catheaderdata
[13];
3105 fid
= int(catheaderdata
[14], 16);
3106 finode
= int(catheaderdata
[15], 16);
3107 flinkcount
= int(catheaderdata
[16], 16);
3108 catfdev_minor
= int(catheaderdata
[17], 16);
3109 catfdev_major
= int(catheaderdata
[18], 16);
3110 catfrdev_minor
= int(catheaderdata
[19], 16);
3111 catfrdev_major
= int(catheaderdata
[20], 16);
3112 catfextrasize
= int(catheaderdata
[21], 16);
3113 catfextrafields
= int(catheaderdata
[22], 16);
3114 extrafieldslist
= [];
3117 extraend
= extrastart
+ catfextrafields
;
3118 extrafieldslist
= [];
3119 if(extrastart
<extraend
):
3120 extrafieldslist
.append(catheaderdata
[extrastart
]);
3121 extrastart
= extrastart
+ 1;
3122 catfchecksumtype
= catheaderdata
[extrastart
].lower();
3123 catfcs
= catheaderdata
[extrastart
+ 1].lower();
3124 catfccs
= catheaderdata
[extrastart
+ 2].lower();
3126 extrafieldslist
= [];
3128 extrafieldslist
= ReadFileHeaderData(catfp
, catfextrafields
, formatspecs
[5]);
3129 checksumsval
= ReadFileHeaderData(catfp
, 3, formatspecs
[5]);
3130 catfchecksumtype
= checksumsval
[0].lower();
3131 catfcs
= checksumsval
[1].lower();
3132 catfccs
= checksumsval
[2].lower();
3135 hcmax
= len(catheaderdata
) - 2;
3137 hcmax
= len(catheaderdata
);
3140 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
3142 catfnumfields
= 24 + catfextrafields
;
3143 if(catfchecksumtype
=="none" or catfchecksumtype
==""):
3145 elif(catfchecksumtype
=="crc16" or catfchecksumtype
=="crc16_ansi" or catfchecksumtype
=="crc16_ibm"):
3146 catnewfcs
= format(crc16(hout
.encode('UTF-8')) & 0xffff, '04x').lower();
3147 elif(catfchecksumtype
=="adler32"):
3148 catnewfcs
= format(zlib
.adler32(hout
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3149 elif(catfchecksumtype
=="crc32"):
3150 catnewfcs
= format(crc32(hout
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3151 elif(catfchecksumtype
=="crc64_ecma"):
3152 catnewfcs
= format(crc64_ecma(hout
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3153 elif(catfchecksumtype
=="crc64" or catfchecksumtype
=="crc64_iso"):
3154 catnewfcs
= format(crc64_iso(hout
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3155 elif(CheckSumSupportAlt(catfchecksumtype
, hashlib_guaranteed
)):
3156 checksumoutstr
= hashlib
.new(catfchecksumtype
);
3157 checksumoutstr
.update(hout
.encode('UTF-8'));
3158 catnewfcs
= checksumoutstr
.hexdigest().lower();
3159 if(catfcs
!=catnewfcs
and not skipchecksum
):
3160 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
3162 catfhend
= catfp
.tell() - 1;
3163 catfcontentstart
= catfp
.tell();
3165 pyhascontents
= False;
3166 if(catfsize
>0 and not listonly
):
3167 catfcontents
= catfp
.read(catfsize
);
3168 if(catfchecksumtype
=="none" or catfchecksumtype
==""):
3170 elif(catfchecksumtype
=="crc16" or catfchecksumtype
=="crc16_ansi" or catfchecksumtype
=="crc16_ibm"):
3171 catnewfccs
= format(crc16(catfcontents
) & 0xffff, '04x').lower();
3172 elif(catfchecksumtype
=="crc16_ccitt"):
3173 catnewfcs
= format(crc16_ccitt(catfcontents
) & 0xffff, '04x').lower();
3174 elif(catfchecksumtype
=="adler32"):
3175 catnewfccs
= format(zlib
.adler32(catfcontents
) & 0xffffffff, '08x').lower();
3176 elif(catfchecksumtype
=="crc32"):
3177 catnewfccs
= format(crc32(catfcontents
) & 0xffffffff, '08x').lower();
3178 elif(catfchecksumtype
=="crc64_ecma"):
3179 catnewfcs
= format(crc64_ecma(catfcontents
) & 0xffffffffffffffff, '016x').lower();
3180 elif(catfchecksumtype
=="crc64" or catfchecksumtype
=="crc64_iso"):
3181 catnewfcs
= format(crc64_iso(catfcontents
) & 0xffffffffffffffff, '016x').lower();
3182 elif(CheckSumSupportAlt(catfchecksumtype
, hashlib_guaranteed
)):
3183 checksumoutstr
= hashlib
.new(catfchecksumtype
);
3184 checksumoutstr
.update(catfcontents
);
3185 catnewfccs
= checksumoutstr
.hexdigest().lower();
3186 pyhascontents
= True;
3187 if(catfccs
!=catnewfccs
and skipchecksum
):
3188 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
3190 if(catfsize
>0 and listonly
):
3191 catfp
.seek(catfsize
, 1);
3192 pyhascontents
= False;
3194 catfcontentend
= catfp
.tell() - 1;
3195 catlist
['ffilelist'].update({realidnum
: {'fid': realidnum
, 'fidalt': fileidnum
, 'fheadersize': catfheadsize
, 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
, 'fatime': catfatime
, 'fmtime': catfmtime
, 'fctime': catfctime
, 'fbtime': catfbtime
, 'fmode': catfmode
, 'fchmode': catfchmode
, 'ftypemod': catftypemod
, 'fuid': catfuid
, 'funame': catfuname
, 'fgid': catfgid
, 'fgname': catfgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': catfdev_minor
, 'fmajor': catfdev_major
, 'frminor': catfrdev_minor
, 'frmajor': catfrdev_major
, 'fchecksumtype': catfchecksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': catfextrasize
, 'fextralist': extrafieldslist
, 'fheaderchecksum': catfcs
, 'fcontentchecksum': catfccs
, 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': catfcontents
} });
3196 fileidnum
= fileidnum
+ 1;
3197 realidnum
= realidnum
+ 1;
3199 catlist
.update({'catfp': catfp
});
3204 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
3206 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3207 catfp
= BytesIO(catstr
);
3208 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3209 return listcatfiles
;
3211 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
3213 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3215 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
3216 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3217 return listcatfiles
;
3219 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3221 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
3222 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3223 return listcatfiles
;
3225 if(not rarfile_support
):
3226 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3229 if(rarfile_support
):
3230 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3232 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
3233 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3234 return listcatfiles
;
3236 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
3237 catver
= formatspecs
[6];
3238 fileheaderver
= str(int(catver
.replace(".", "")));
3239 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3240 advancedlist
= True;
3243 for line
in sys
.stdin
:
3244 infilelist
.append(line
.strip());
3245 infilelist
= list(filter(None, infilelist
));
3246 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
3247 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
3249 with
open(infiles
, "r") as finfile
:
3250 for line
in finfile
:
3251 infilelist
.append(line
.strip());
3252 infilelist
= list(filter(None, infilelist
));
3254 if(isinstance(infiles
, (list, tuple, ))):
3255 infilelist
= list(filter(None, infiles
));
3256 elif(isinstance(infiles
, (str, ))):
3257 infilelist
= list(filter(None, [infiles
]));
3259 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
3261 GetDirList
= ListDir(infilelist
, followlink
, False);
3269 inodetocatinode
= {};
3271 fnumfiles
= int(len(GetDirList
));
3272 catver
= formatspecs
[6];
3273 fileheaderver
= str(int(catver
.replace(".", "")));
3274 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3275 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3276 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
3277 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
3278 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3279 if(checksumtype
=="none" or checksumtype
==""):
3280 catfileheadercshex
= format(0, 'x').lower();
3281 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3282 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3283 elif(checksumtype
=="crc16_ccitt"):
3284 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3285 elif(checksumtype
=="adler32"):
3286 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3287 elif(checksumtype
=="crc32"):
3288 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3289 elif(checksumtype
=="crc64_ecma"):
3290 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3291 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3292 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3293 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3294 checksumoutstr
= hashlib
.new(checksumtype
);
3295 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3296 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3298 catfileheadercshex
= format(0, 'x').lower();
3299 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3300 fheadtell
= len(fileheader
);
3301 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
3302 for curfname
in GetDirList
:
3303 if(re
.findall("^[.|/]", curfname
)):
3306 fname
= "./"+curfname
;
3308 VerbosePrintOut(fname
);
3309 if(not followlink
or followlink
is None):
3310 fstatinfo
= os
.lstat(fname
);
3312 fstatinfo
= os
.stat(fname
);
3313 fpremode
= fstatinfo
.st_mode
;
3314 finode
= fstatinfo
.st_ino
;
3315 flinkcount
= fstatinfo
.st_nlink
;
3317 if(stat
.S_ISREG(fpremode
)):
3319 elif(stat
.S_ISLNK(fpremode
)):
3321 elif(stat
.S_ISCHR(fpremode
)):
3323 elif(stat
.S_ISBLK(fpremode
)):
3325 elif(stat
.S_ISDIR(fpremode
)):
3327 elif(stat
.S_ISFIFO(fpremode
)):
3329 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
3331 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
3333 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
3338 fbasedir
= os
.path
.dirname(fname
);
3340 if(not followlink
and finode
!=0):
3342 if(finode
in inodelist
):
3344 flinkname
= inodetofile
[finode
];
3345 fcurinode
= inodetocatinode
[finode
];
3346 if(finode
not in inodelist
):
3347 inodelist
.append(finode
);
3348 inodetofile
.update({finode
: fname
});
3349 inodetocatinode
.update({finode
: curinode
});
3350 fcurinode
= curinode
;
3351 curinode
= curinode
+ 1;
3353 fcurinode
= curinode
;
3354 curinode
= curinode
+ 1;
3355 curfid
= curfid
+ 1;
3357 flinkname
= os
.readlink(fname
);
3358 fdev
= fstatinfo
.st_dev
;
3359 getfdev
= GetDevMajorMinor(fdev
);
3360 fdev_minor
= getfdev
[0];
3361 fdev_major
= getfdev
[1];
3362 frdev
= fstatinfo
.st_dev
;
3363 if(hasattr(fstatinfo
, "st_rdev")):
3364 frdev
= fstatinfo
.st_rdev
;
3366 frdev
= fstatinfo
.st_dev
;
3367 getfrdev
= GetDevMajorMinor(frdev
);
3368 frdev_minor
= getfrdev
[0];
3369 frdev_major
= getfrdev
[1];
3370 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3372 if(ftype
==0 or ftype
==7):
3373 fsize
= fstatinfo
.st_size
;
3374 fatime
= fstatinfo
.st_atime
;
3375 fmtime
= fstatinfo
.st_mtime
;
3376 fctime
= fstatinfo
.st_ctime
;
3377 if(hasattr(fstatinfo
, "st_birthtime")):
3378 fbtime
= fstatinfo
.st_birthtime
;
3380 fbtime
= fstatinfo
.st_ctime
;
3381 fmode
= fstatinfo
.st_mode
;
3382 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
3383 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
3384 fuid
= fstatinfo
.st_uid
;
3385 fgid
= fstatinfo
.st_gid
;
3390 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
3391 funame
= userinfo
.pw_name
;
3400 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
3401 fgname
= groupinfo
.gr_name
;
3406 fdev_minor
= fdev_minor
;
3407 fdev_major
= fdev_major
;
3408 frdev_minor
= frdev_minor
;
3409 frdev_major
= frdev_major
;
3411 flinkcount
= flinkcount
;
3412 if(hasattr(fstatinfo
, "st_file_attributes")):
3413 fwinattributes
= fstatinfo
.st_file_attributes
;
3416 fcontents
= "".encode('UTF-8');
3418 if(ftype
== 0 or ftype
== 7):
3419 with
open(fname
, "rb") as fpc
:
3421 chunk
= fpc
.read(chunk_size
);
3425 if(followlink
and (ftype
== 1 or ftype
== 2)):
3426 flstatinfo
= os
.stat(flinkname
);
3427 with
open(flinkname
, "rb") as fpc
:
3429 chunk
= fpc
.read(chunk_size
);
3433 ftypehex
= format(ftype
, 'x').lower();
3434 extrafields
= len(extradata
);
3435 extrafieldslist
= extradata
;
3436 catfextrafields
= extrafields
;
3437 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3438 if(len(extradata
)>0):
3439 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3440 extrasizelen
= len(extrasizestr
);
3441 extrasizelenhex
= format(extrasizelen
, 'x').lower();
3442 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, format(int(fsize
), 'x').lower(), format(int(fatime
), 'x').lower(), format(int(fmtime
), 'x').lower(), format(int(fctime
), 'x').lower(), format(int(fbtime
), 'x').lower(), format(int(fmode
), 'x').lower(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()], formatspecs
[5]);
3443 if(len(extradata
)>0):
3444 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3445 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3446 catfnumfields
= 24 + catfextrafields
;
3447 if(checksumtype
=="none" or checksumtype
==""):
3448 catfileheadercshex
= format(0, 'x').lower();
3449 catfilecontentcshex
= format(0, 'x').lower();
3450 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3451 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3452 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3453 elif(checksumtype
=="crc16_ccitt"):
3454 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3455 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3456 elif(checksumtype
=="adler32"):
3457 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3458 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3459 elif(checksumtype
=="crc32"):
3460 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3461 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3462 elif(checksumtype
=="crc64_ecma"):
3463 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3464 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3465 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3466 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3467 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3468 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3469 checksumoutstr
= hashlib
.new(checksumtype
);
3470 checksumoutstr
.update("".encode('UTF-8'));
3471 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3472 checksumoutstr
= hashlib
.new(checksumtype
);
3473 checksumoutstr
.update(fcontents
);
3474 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3476 catfileheadercshex
= format(0, 'x').lower();
3477 catfilecontentcshex
= format(0, 'x').lower();
3478 catfhstart
= fheadtell
;
3479 fheadtell
+= len(catfileoutstr
);
3480 catfhend
= fheadtell
- 1;
3481 catfcontentstart
= fheadtell
;
3482 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3483 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3484 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3485 if(checksumtype
=="none" or checksumtype
==""):
3486 catfileheadercshex
= format(0, 'x').lower();
3487 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3488 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3489 elif(checksumtype
=="crc16_ccitt"):
3490 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3491 elif(checksumtype
=="adler32"):
3492 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3493 elif(checksumtype
=="crc32"):
3494 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3495 elif(checksumtype
=="crc64_ecma"):
3496 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3497 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3498 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3499 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3500 checksumoutstr
= hashlib
.new(checksumtype
);
3501 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3502 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3504 catfileheadercshex
= format(0, 'x').lower();
3505 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3506 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3507 nullstrecd
= formatspecs
[5].encode('UTF-8');
3508 fheadtell
+= len(catfileoutstr
) + 1;
3509 catfcontentend
= fheadtell
- 1;
3510 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3511 pyhascontents
= False;
3512 if(int(fsize
)>0 and not listonly
):
3513 pyhascontents
= True;
3514 if(int(fsize
)>0 and listonly
):
3516 pyhascontents
= False;
3517 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
3518 fileidnum
= fileidnum
+ 1;
3521 def TarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
3527 inodetocatinode
= {};
3531 if(hasattr(sys
.stdin
, "buffer")):
3532 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3534 shutil
.copyfileobj(sys
.stdin
, infile
);
3539 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
3540 infile
= download_file_from_http_file(infile
);
3545 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
3546 infile
= download_file_from_ftp_file(infile
);
3551 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3553 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
3555 if(not tarfile
.is_tarfile(infile
)):
3557 except AttributeError:
3558 if(not is_tarfile(infile
)):
3563 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3564 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
3566 tarfp
= tarfile
.open(infile
, "r");
3567 except FileNotFoundError
:
3569 fnumfiles
= int(len(tarfp
.getmembers()));
3570 catver
= formatspecs
[6];
3571 fileheaderver
= str(int(catver
.replace(".", "")));
3572 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3573 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3574 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
3575 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
3576 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3577 if(checksumtype
=="none" or checksumtype
==""):
3578 catfileheadercshex
= format(0, 'x').lower();
3579 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3580 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3581 elif(checksumtype
=="crc16_ccitt"):
3582 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3583 elif(checksumtype
=="adler32"):
3584 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3585 elif(checksumtype
=="crc32"):
3586 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3587 elif(checksumtype
=="crc64_ecma"):
3588 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3589 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3590 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3591 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3592 checksumoutstr
= hashlib
.new(checksumtype
);
3593 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3594 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3596 catfileheadercshex
= format(0, 'x').lower();
3597 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3598 fheadtell
= len(fileheader
);
3599 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
3600 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
3601 if(re
.findall("^[.|/]", member
.name
)):
3602 fname
= member
.name
;
3604 fname
= "./"+member
.name
;
3606 VerbosePrintOut(fname
);
3607 fpremode
= member
.mode
;
3608 ffullmode
= member
.mode
;
3612 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3614 elif(member
.isdev()):
3615 ffullmode
= member
.mode
;
3617 elif(member
.islnk()):
3618 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3620 elif(member
.issym()):
3621 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
3623 elif(member
.ischr()):
3624 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
3626 elif(member
.isblk()):
3627 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
3629 elif(member
.isdir()):
3630 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
3632 elif(member
.isfifo()):
3633 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
3635 elif(member
.issparse()):
3636 ffullmode
= member
.mode
;
3639 ffullmode
= member
.mode
;
3642 fbasedir
= os
.path
.dirname(fname
);
3646 curfid
= curfid
+ 1;
3648 flinkname
= member
.linkname
;
3649 fdev_minor
= member
.devminor
;
3650 fdev_major
= member
.devmajor
;
3651 frdev_minor
= member
.devminor
;
3652 frdev_major
= member
.devmajor
;
3653 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3655 elif(ftype
==0 or ftype
==7):
3656 fsize
= member
.size
;
3658 fsize
= member
.size
;
3659 fatime
= member
.mtime
;
3660 fmtime
= member
.mtime
;
3661 fctime
= member
.mtime
;
3662 fbtime
= member
.mtime
;
3664 fchmode
= stat
.S_IMODE(ffullmode
);
3665 ftypemod
= stat
.S_IFMT(ffullmode
);
3668 funame
= member
.uname
;
3669 fgname
= member
.gname
;
3670 flinkcount
= flinkcount
;
3671 fcontents
= "".encode('UTF-8');
3673 if(ftype
== 0 or ftype
== 7):
3674 with tarfp
.extractfile(member
) as fpc
:
3676 chunk
= fpc
.read(chunk_size
);
3680 ftypehex
= format(ftype
, 'x').lower();
3681 extrafields
= len(extradata
);
3682 extrafieldslist
= extradata
;
3683 catfextrafields
= extrafields
;
3684 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3685 if(len(extradata
)>0):
3686 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3687 extrasizelen
= len(extrasizestr
);
3688 extrasizelenhex
= format(extrasizelen
, 'x').lower();
3689 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, format(int(fsize
), 'x').lower(), format(int(fatime
), 'x').lower(), format(int(fmtime
), 'x').lower(), format(int(fctime
), 'x').lower(), format(int(fbtime
), 'x').lower(), format(int(fmode
), 'x').lower(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()], formatspecs
[5]);
3690 if(len(extradata
)>0):
3691 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3692 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3693 catfnumfields
= 24 + catfextrafields
;
3694 if(checksumtype
=="none" or checksumtype
==""):
3695 catfileheadercshex
= format(0, 'x').lower();
3696 catfilecontentcshex
= format(0, 'x').lower();
3697 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3698 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3699 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3700 elif(checksumtype
=="crc16_ccitt"):
3701 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3702 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3703 elif(checksumtype
=="adler32"):
3704 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3705 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3706 elif(checksumtype
=="crc32"):
3707 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3708 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3709 elif(checksumtype
=="crc64_ecma"):
3710 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3711 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3712 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3713 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3714 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3715 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3716 checksumoutstr
= hashlib
.new(checksumtype
);
3717 checksumoutstr
.update("".encode('UTF-8'));
3718 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3719 checksumoutstr
= hashlib
.new(checksumtype
);
3720 checksumoutstr
.update(fcontents
);
3721 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3723 catfileheadercshex
= format(0, 'x').lower();
3724 catfilecontentcshex
= format(0, 'x').lower();
3725 catfhstart
= fheadtell
;
3726 fheadtell
+= len(catfileoutstr
);
3727 catfhend
= fheadtell
- 1;
3728 catfcontentstart
= fheadtell
;
3729 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3730 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3731 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3732 if(checksumtype
=="none" or checksumtype
==""):
3733 catfileheadercshex
= format(0, 'x').lower();
3734 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3735 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3736 elif(checksumtype
=="crc16_ccitt"):
3737 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3738 elif(checksumtype
=="adler32"):
3739 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3740 elif(checksumtype
=="crc32"):
3741 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3742 elif(checksumtype
=="crc64_ecma"):
3743 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3744 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3745 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3746 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3747 checksumoutstr
= hashlib
.new(checksumtype
);
3748 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3749 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3751 catfileheadercshex
= format(0, 'x').lower();
3752 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3753 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3754 nullstrecd
= formatspecs
[5].encode('UTF-8');
3755 fheadtell
+= len(catfileoutstr
) + 1;
3756 catfcontentend
= fheadtell
- 1;
3757 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3758 pyhascontents
= False;
3759 if(int(fsize
)>0 and not listonly
):
3760 pyhascontents
= True;
3761 if(int(fsize
)>0 and listonly
):
3763 pyhascontents
= False;
3764 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
3765 fileidnum
= fileidnum
+ 1;
3768 def ZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
3769 advancedlist
= True;
3775 inodetocatinode
= {};
3779 if(hasattr(sys
.stdin
, "buffer")):
3780 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3782 shutil
.copyfileobj(sys
.stdin
, infile
);
3787 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
3788 infile
= download_file_from_http_file(infile
);
3793 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
3794 infile
= download_file_from_ftp_file(infile
);
3799 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3803 if(not zipfile
.is_zipfile(infile
)):
3806 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
3807 except FileNotFoundError
:
3809 ziptest
= zipfp
.testzip();
3811 VerbosePrintOut("Bad file found!");
3812 fnumfiles
= int(len(zipfp
.infolist()));
3813 catver
= formatspecs
[6];
3814 fileheaderver
= str(int(catver
.replace(".", "")));
3815 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3816 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
3817 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3818 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3819 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
3820 if(checksumtype
=="none" or checksumtype
==""):
3821 catfileheadercshex
= format(0, 'x').lower();
3822 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3823 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3824 elif(checksumtype
=="crc16_ccitt"):
3825 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3826 elif(checksumtype
=="adler32"):
3827 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3828 elif(checksumtype
=="crc32"):
3829 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3830 elif(checksumtype
=="crc64_ecma"):
3831 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3832 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3833 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3834 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3835 checksumoutstr
= hashlib
.new(checksumtype
);
3836 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3837 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3839 catfileheadercshex
= format(0, 'x').lower();
3840 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3841 fheadtell
= len(fileheader
);
3842 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
3843 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
3844 if(re
.findall("^[.|/]", member
.filename
)):
3845 fname
= member
.filename
;
3847 fname
= "./"+member
.filename
;
3848 zipinfo
= zipfp
.getinfo(member
.filename
);
3850 VerbosePrintOut(fname
);
3851 if(not member
.is_dir()):
3852 fpremode
= stat
.S_IFREG
+ 438;
3853 elif(member
.is_dir()):
3854 fpremode
= stat
.S_IFDIR
+ 511;
3857 if(not member
.is_dir()):
3859 elif(member
.is_dir()):
3862 fbasedir
= os
.path
.dirname(fname
);
3866 curfid
= curfid
+ 1;
3874 fsize
= member
.file_size
;
3876 fsize
= member
.file_size
;
3877 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
3878 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
3879 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
3880 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
3881 if(not member
.is_dir()):
3882 fmode
= stat
.S_IFREG
+ 438;
3883 fchmode
= stat
.S_IMODE(int(stat
.S_IFREG
+ 438));
3884 ftypemod
= stat
.S_IFMT(int(stat
.S_IFREG
+ 438));
3885 if(member
.is_dir()):
3886 fmode
= stat
.S_IFDIR
+ 511;
3887 fchmode
= stat
.S_IMODE(int(stat
.S_IFDIR
+ 511));
3888 ftypemod
= stat
.S_IFMT(int(stat
.S_IFDIR
+ 511));
3891 except AttributeError:
3897 except AttributeError:
3904 userinfo
= pwd
.getpwuid(os
.getuid());
3905 funame
= userinfo
.pw_name
;
3908 except AttributeError:
3916 groupinfo
= grp
.getgrgid(os
.getgid());
3917 fgname
= groupinfo
.gr_name
;
3920 except AttributeError:
3924 fcontents
= "".encode('UTF-8');
3926 fcontents
= zipfp
.read(member
.filename
);
3927 ftypehex
= format(ftype
, 'x').lower();
3928 extrafields
= len(extradata
);
3929 extrafieldslist
= extradata
;
3930 catfextrafields
= extrafields
;
3931 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3932 if(len(extradata
)>0):
3933 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3934 extrasizelen
= len(extrasizestr
);
3935 extrasizelenhex
= format(extrasizelen
, 'x').lower();
3936 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, format(int(fsize
), 'x').lower(), format(int(fatime
), 'x').lower(), format(int(fmtime
), 'x').lower(), format(int(fctime
), 'x').lower(), format(int(fbtime
), 'x').lower(), format(int(fmode
), 'x').lower(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()], formatspecs
[5]);
3937 if(len(extradata
)>0):
3938 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3939 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3940 catfnumfields
= 24 + catfextrafields
;
3941 if(checksumtype
=="none" or checksumtype
==""):
3942 catfileheadercshex
= format(0, 'x').lower();
3943 catfilecontentcshex
= format(0, 'x').lower();
3944 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3945 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3946 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3947 elif(checksumtype
=="crc16_ccitt"):
3948 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3949 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3950 elif(checksumtype
=="adler32"):
3951 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3952 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3953 elif(checksumtype
=="crc32"):
3954 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3955 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3956 elif(checksumtype
=="crc64_ecma"):
3957 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3958 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3959 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3960 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3961 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3962 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3963 checksumoutstr
= hashlib
.new(checksumtype
);
3964 checksumoutstr
.update("".encode('UTF-8'));
3965 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3966 checksumoutstr
= hashlib
.new(checksumtype
);
3967 checksumoutstr
.update(fcontents
);
3968 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3970 catfileheadercshex
= format(0, 'x').lower();
3971 catfilecontentcshex
= format(0, 'x').lower();
3972 catfhstart
= fheadtell
;
3973 fheadtell
+= len(catfileoutstr
);
3974 catfhend
= fheadtell
- 1;
3975 catfcontentstart
= fheadtell
;
3976 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3977 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3978 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3979 if(checksumtype
=="none" or checksumtype
==""):
3980 catfileheadercshex
= format(0, 'x').lower();
3981 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3982 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3983 elif(checksumtype
=="crc16_ccitt"):
3984 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3985 elif(checksumtype
=="adler32"):
3986 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3987 elif(checksumtype
=="crc32"):
3988 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3989 elif(checksumtype
=="crc64_ecma"):
3990 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3991 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3992 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3993 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3994 checksumoutstr
= hashlib
.new(checksumtype
);
3995 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3996 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3998 catfileheadercshex
= format(0, 'x').lower();
3999 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4000 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4001 nullstrecd
= formatspecs
[5].encode('UTF-8');
4002 fheadtell
+= len(catfileoutstr
) + 1;
4003 catfcontentend
= fheadtell
- 1;
4004 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
4005 pyhascontents
= False;
4006 if(int(fsize
)>0 and not listonly
):
4007 pyhascontents
= True;
4008 if(int(fsize
)>0 and listonly
):
4010 pyhascontents
= False;
4011 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
4012 fileidnum
= fileidnum
+ 1;
4015 if(not rarfile_support
):
4016 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4019 if(rarfile_support
):
4020 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4021 advancedlist
= True;
4027 inodetocatinode
= {};
4029 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
4031 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
4033 rarfp
= rarfile
.RarFile(infile
, "r");
4034 rartest
= rarfp
.testrar();
4036 VerbosePrintOut("Bad file found!");
4037 fnumfiles
= int(len(rarfp
.infolist()));
4038 catver
= formatspecs
[6];
4039 fileheaderver
= str(int(catver
.replace(".", "")));
4040 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4041 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4042 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4043 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4044 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4045 if(checksumtype
=="none" or checksumtype
==""):
4046 catfileheadercshex
= format(0, 'x').lower();
4047 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4048 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4049 elif(checksumtype
=="crc16_ccitt"):
4050 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4051 elif(checksumtype
=="adler32"):
4052 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4053 elif(checksumtype
=="crc32"):
4054 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4055 elif(checksumtype
=="crc64_ecma"):
4056 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4057 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4058 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4059 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4060 checksumoutstr
= hashlib
.new(checksumtype
);
4061 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4062 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4064 catfileheadercshex
= format(0, 'x').lower();
4065 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4066 fheadtell
= len(fileheader
);
4067 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4068 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
4071 if(member
.host_os
== rarfile
.RAR_OS_UNIX
):
4074 member
.external_attr
4076 except AttributeError:
4078 elif(member
.host_os
== rarfile
.RAR_OS_WIN32
):
4081 member
.external_attr
4083 except AttributeError:
4088 if(re
.findall("^[.|/]", member
.filename
)):
4089 fname
= member
.filename
;
4091 fname
= "./"+member
.filename
;
4092 rarinfo
= rarfp
.getinfo(member
.filename
);
4094 VerbosePrintOut(fname
);
4095 if(is_unix
and member
.external_attr
!=0):
4096 fpremode
= int(member
.external_attr
);
4097 elif(member
.is_file()):
4098 fpremode
= stat
.S_IFREG
+ 438;
4099 elif(member
.is_symlink()):
4100 fpremode
= stat
.S_IFLNK
+ 438;
4101 elif(member
.is_dir()):
4102 fpremode
= stat
.S_IFDIR
+ 511;
4103 if(is_windows
and member
.external_attr
!=0):
4104 fwinattributes
= int(member
.external_attr
);
4106 fwinattributes
= int(0);
4109 if(member
.is_file()):
4111 elif(member
.is_symlink()):
4113 elif(member
.is_dir()):
4117 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
4118 fbasedir
= os
.path
.dirname(fname
);
4122 curfid
= curfid
+ 1;
4130 fsize
= member
.file_size
;
4133 fatime
= int(member
.atime
.timestamp());
4135 fatime
= int(member
.mtime
.timestamp());
4136 except AttributeError:
4137 fatime
= int(member
.mtime
.timestamp());
4138 fmtime
= int(member
.mtime
.timestamp());
4141 fctime
= int(member
.ctime
.timestamp());
4143 fctime
= int(member
.mtime
.timestamp());
4144 except AttributeError:
4145 fctime
= int(member
.mtime
.timestamp());
4146 fbtime
= int(member
.mtime
.timestamp());
4147 if(is_unix
and member
.external_attr
!=0):
4148 fmode
= format(int(member
.external_attr
), 'x').lower();
4149 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
4150 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
4151 elif(member
.is_file()):
4152 fmode
= int(stat
.S_IFREG
+ 438)
4153 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
4154 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
4155 elif(member
.is_symlink()):
4156 fmode
= int(stat
.S_IFLNK
+ 438)
4157 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
4158 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
4159 elif(member
.is_dir()):
4160 fmode
= int(stat
.S_IFDIR
+ 511)
4161 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
4162 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
4165 except AttributeError:
4171 except AttributeError:
4178 userinfo
= pwd
.getpwuid(os
.getuid());
4179 funame
= userinfo
.pw_name
;
4182 except AttributeError:
4190 groupinfo
= grp
.getgrgid(os
.getgid());
4191 fgname
= groupinfo
.gr_name
;
4194 except AttributeError:
4198 fcontents
= "".encode('UTF-8');
4200 fcontents
= rarfp
.read(member
.filename
);
4201 ftypehex
= format(ftype
, 'x').lower();
4202 extrafields
= len(extradata
);
4203 extrafieldslist
= extradata
;
4204 catfextrafields
= extrafields
;
4205 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
4206 if(len(extradata
)>0):
4207 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4208 extrasizelen
= len(extrasizestr
);
4209 extrasizelenhex
= format(extrasizelen
, 'x').lower();
4210 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, format(int(fsize
), 'x').lower(), format(int(fatime
), 'x').lower(), format(int(fmtime
), 'x').lower(), format(int(fctime
), 'x').lower(), format(int(fbtime
), 'x').lower(), format(int(fmode
), 'x').lower(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()], formatspecs
[5]);
4211 if(len(extradata
)>0):
4212 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4213 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
4214 catfnumfields
= 24 + catfextrafields
;
4215 if(checksumtype
=="none" or checksumtype
==""):
4216 catfileheadercshex
= format(0, 'x').lower();
4217 catfilecontentcshex
= format(0, 'x').lower();
4218 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4219 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4220 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
4221 elif(checksumtype
=="crc16_ccitt"):
4222 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4223 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
4224 elif(checksumtype
=="adler32"):
4225 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4226 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
4227 elif(checksumtype
=="crc32"):
4228 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4229 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
4230 elif(checksumtype
=="crc64_ecma"):
4231 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4232 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
4233 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4234 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4235 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
4236 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4237 checksumoutstr
= hashlib
.new(checksumtype
);
4238 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
4239 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4241 catfileheadercshex
= format(0, 'x').lower();
4242 catfilecontentcshex
= format(0, 'x').lower();
4243 catfhstart
= fheadtell
;
4244 fheadtell
+= len(catfileoutstr
);
4245 catfhend
= fheadtell
- 1;
4246 catfcontentstart
= fheadtell
;
4247 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4248 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
4249 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
4250 if(checksumtype
=="none" or checksumtype
==""):
4251 catfileheadercshex
= format(0, 'x').lower();
4252 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4253 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4254 elif(checksumtype
=="crc16_ccitt"):
4255 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4256 elif(checksumtype
=="adler32"):
4257 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4258 elif(checksumtype
=="crc32"):
4259 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4260 elif(checksumtype
=="crc64_ecma"):
4261 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4262 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4263 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4264 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4265 checksumoutstr
= hashlib
.new(checksumtype
);
4266 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
4267 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4269 catfileheadercshex
= format(0, 'x').lower();
4270 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4271 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4272 nullstrecd
= formatspecs
[5].encode('UTF-8');
4273 fheadtell
+= len(catfileoutstr
) + 1;
4274 catfcontentend
= fheadtell
- 1;
4275 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
4276 pyhascontents
= False;
4277 if(int(fsize
)>0 and not listonly
):
4278 pyhascontents
= True;
4279 if(int(fsize
)>0 and listonly
):
4281 pyhascontents
= False;
4282 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
4283 fileidnum
= fileidnum
+ 1;
4286 def ListDirToArray(infiles
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4287 outarray
= BytesIO();
4288 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
4289 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4290 return listcatfiles
;
4292 def ArchiveFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4293 if(isinstance(infile
, dict)):
4294 listcatfiles
= infile
;
4296 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4297 infile
= RemoveWindowsPath(infile
);
4298 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4299 if(not listcatfiles
):
4301 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
4303 catarray
.update({'catfp': listcatfiles
['catfp']});
4304 lenlist
= len(listcatfiles
['ffilelist']);
4309 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4312 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4313 lcfx
= listcatfiles
['fnumfiles'];
4315 lcfx
= int(listcatfiles
['fnumfiles']);
4317 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4318 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4319 catarray
['filetoid'].update(filetoidarray
);
4320 catarray
['idtofile'].update(idtofilearray
);
4321 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4322 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4323 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4324 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4325 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4326 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4327 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4328 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4329 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4330 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4331 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4332 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4333 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4334 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4335 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4336 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4337 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4338 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4339 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4340 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4341 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4342 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4343 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4344 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4345 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4346 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4347 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4348 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4349 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4350 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4351 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4355 create_alias_function("", __file_format_name__
, "ToArrayIndex", ArchiveFileToArrayIndex
);
4357 def ListDirToArrayIndexAlt(infiles
, dirlistfromtxt
=False, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4358 listcatfiles
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4359 if(not listcatfiles
):
4361 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
4362 lenlist
= len(listcatfiles
['ffilelist']);
4367 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4370 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4371 lcfx
= listcatfiles
['fnumfiles'];
4373 lcfx
= int(listcatfiles
['fnumfiles']);
4375 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4376 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4377 catarray
['filetoid'].update(filetoidarray
);
4378 catarray
['idtofile'].update(idtofilearray
);
4379 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4380 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4381 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4382 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4383 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4384 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4385 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4386 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4387 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4388 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4389 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4390 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4391 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4392 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4393 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4394 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4395 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4396 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4397 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4398 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4399 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4400 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4401 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4402 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4403 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4404 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4405 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4406 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4407 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4408 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4409 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4413 def TarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4414 listcatfiles
= TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4415 if(not listcatfiles
):
4417 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
4418 lenlist
= len(listcatfiles
['ffilelist']);
4423 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4426 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4427 lcfx
= listcatfiles
['fnumfiles'];
4429 lcfx
= int(listcatfiles
['fnumfiles']);
4431 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4432 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4433 catarray
['filetoid'].update(filetoidarray
);
4434 catarray
['idtofile'].update(idtofilearray
);
4435 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4436 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4437 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4438 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4439 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4440 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4441 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4442 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4443 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4444 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4445 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4446 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4447 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4448 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4449 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4450 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4451 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4452 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4453 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4454 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4455 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4456 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4457 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4458 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4459 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4460 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4461 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4462 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4463 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4464 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4465 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4469 def ZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4470 listcatfiles
= ZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4471 if(not listcatfiles
):
4473 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
4474 lenlist
= len(listcatfiles
['ffilelist']);
4479 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4482 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4483 lcfx
= listcatfiles
['fnumfiles'];
4485 lcfx
= int(listcatfiles
['fnumfiles']);
4487 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4488 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4489 catarray
['filetoid'].update(filetoidarray
);
4490 catarray
['idtofile'].update(idtofilearray
);
4491 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4492 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4493 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4494 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4495 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4496 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4497 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4498 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4499 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4500 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4501 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4502 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4503 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4504 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4505 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4506 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4507 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4508 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4509 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4510 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4511 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4512 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4513 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4514 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4515 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4516 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4517 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4518 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4519 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4520 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4521 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4525 if(not rarfile_support
):
4526 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4529 if(rarfile_support
):
4530 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4531 listcatfiles
= RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4532 if(not listcatfiles
):
4534 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
4535 lenlist
= len(listcatfiles
['ffilelist']);
4540 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4543 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4544 lcfx
= listcatfiles
['fnumfiles'];
4546 lcfx
= int(listcatfiles
['fnumfiles']);
4548 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4549 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4550 catarray
['filetoid'].update(filetoidarray
);
4551 catarray
['idtofile'].update(idtofilearray
);
4552 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4553 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4554 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4555 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4556 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4557 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4558 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4559 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4560 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4561 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4562 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4563 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4564 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4565 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4566 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4567 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4568 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4569 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4570 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4571 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4572 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4573 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4574 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4575 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4576 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4577 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4578 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4579 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4580 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4581 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4582 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4586 def ArchiveFileStringToArrayIndex(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4587 catfp
= BytesIO(catstr
);
4588 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4589 return listcatfiles
;
4591 create_alias_function("", __file_format_name__
, "StringToArrayIndex", ArchiveFileStringToArrayIndex
);
4593 def TarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4595 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4596 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4597 return listcatfiles
;
4599 def ZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4601 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4602 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4603 return listcatfiles
;
4605 if(not rarfile_support
):
4606 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4609 if(rarfile_support
):
4610 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4612 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4613 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4614 return listcatfiles
;
4616 def ListDirToArrayIndex(infiles
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4617 outarray
= BytesIO();
4618 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
, True);
4619 listcatfiles
= ArchiveFileToArrayIndex(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
)
4620 return listcatfiles
;
4622 def RePackArchiveFile(infile
, outfile
, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4623 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
4624 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzop', 'lzo', 'lzma', 'xz'];
4625 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', 'lzop', '.lzo', '.lzma', '.xz'];
4626 if(isinstance(infile
, dict)):
4627 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4628 listcatfiles
= prelistcatfiles
['list'];
4630 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4631 infile
= RemoveWindowsPath(infile
);
4633 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4634 listcatfiles
= prelistcatfiles
['list'];
4636 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4637 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
4638 outfile
= RemoveWindowsPath(outfile
);
4639 checksumtype
= checksumtype
.lower();
4640 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
4641 checksumtype
="crc32";
4642 if(checksumtype
=="none"):
4644 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
4646 if(compression
not in compressionlist
and compression
is None):
4647 compression
= "auto";
4649 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4650 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
4651 if(os
.path
.exists(outfile
)):
4653 if(not listcatfiles
):
4658 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4660 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
4662 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
4665 fbasename
= os
.path
.splitext(outfile
)[0];
4666 fextname
= os
.path
.splitext(outfile
)[1];
4667 catfp
= CompressOpenFile(outfile
, compressionlevel
);
4668 catver
= formatspecs
[6];
4669 fileheaderver
= str(int(catver
.replace(".", "")));
4670 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4671 catfp
.write(fileheader
.encode('UTF-8'));
4672 lenlist
= len(listcatfiles
['ffilelist']);
4673 fnumfiles
= int(listcatfiles
['fnumfiles']);
4674 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
4675 fnumfiles
= lenlist
;
4676 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4677 fnumfilesa
= AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4678 if(checksumtype
=="none" or checksumtype
==""):
4679 catfileheadercshex
= format(0, 'x').lower();
4680 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4681 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
4682 elif(checksumtype
=="crc16_ccitt"):
4683 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
4684 elif(checksumtype
=="adler32"):
4685 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
4686 elif(checksumtype
=="crc32"):
4687 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
4688 elif(checksumtype
=="crc64_ecma"):
4689 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4690 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4691 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4692 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4693 checksumoutstr
= hashlib
.new(checksumtype
);
4694 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
4695 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4697 catfileheadercshex
= format(0, 'x').lower();
4698 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4699 catfp
.write(fnumfilesa
.encode('UTF-8'));
4702 os
.fsync(catfp
.fileno());
4703 except io
.UnsupportedOperation
:
4705 except AttributeError:
4711 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4714 lcfx
= int(listcatfiles
['fnumfiles']);
4722 catfhstart
= catfp
.tell();
4723 if(re
.findall("^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
4724 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
4726 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
4728 VerbosePrintOut(fname
);
4729 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
4730 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
4731 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
4732 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
4733 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
4734 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
4735 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
4736 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
4737 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
4738 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
4739 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
4740 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
4741 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
4742 finode
= listcatfiles
['ffilelist'][reallcfi
]['finode'];
4743 flinkcount
= listcatfiles
['ffilelist'][reallcfi
]['flinkcount'];
4744 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
4745 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
4746 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
4747 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
4748 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
4749 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
4750 if(len(extradata
) > 0):
4751 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(extradata
);
4752 listcatfiles
['ffilelist'][reallcfi
]['fextralist'] = extradata
;
4753 extrafields
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']), 'x').lower();
4754 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
4755 if(len(extradata
)>0):
4756 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4757 extrasizelen
= format(len(extrasizestr
), 'x').lower();
4758 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
4760 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
4761 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
4762 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
4763 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
4764 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
4765 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
4766 flinkname
= flinkinfo
['flinkname'];
4767 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
4768 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
4769 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
4770 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
4771 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
4772 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
4773 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
4774 funame
= flinkinfo
['funame'];
4775 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
4776 fgname
= flinkinfo
['fgname'];
4777 finode
= flinkinfo
['finode'];
4778 flinkcount
= flinkinfo
['flinkcount'];
4779 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
4780 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
4781 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
4782 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
4783 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
4784 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
4785 if(len(extradata
) > 0):
4786 flinkinfo
['fextrafields'] = len(extradata
);
4787 flinkinfo
['fextralist'] = extradata
;
4788 extrafields
= format(int(flinkinfo
['fextrafields']), 'x').lower();
4789 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
4790 if(len(extradata
)>0):
4791 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4792 extrasizelen
= format(len(extrasizestr
), 'x').lower();
4793 fcontents
= flinkinfo
['fcontents'];
4794 if(flinkinfo
['ftype']!=0 and flinkinfo
['ftype']!=7):
4796 fcontents
= fcontents
.encode('UTF-8');
4797 except AttributeError:
4799 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
4801 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=0 and listcatfiles
['ffilelist'][reallcfi
]['ftype']!=7):
4803 fcontents
= fcontents
.encode('UTF-8');
4804 except AttributeError:
4806 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
4807 fcurfid
= format(curfid
, 'x').lower();
4808 if(not followlink
and finode
!=0):
4809 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
4810 fcurinode
= format(int(curinode
), 'x').lower();
4811 inodetofile
.update({curinode
: fname
});
4812 filetoinode
.update({fname
: curinode
});
4813 curinode
= curinode
+ 1;
4815 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
4817 fcurinode
= format(int(curinode
), 'x').lower();
4818 curinode
= curinode
+ 1;
4819 curfid
= curfid
+ 1;
4820 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
4821 if(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']>0):
4822 extrafieldslist
= [];
4824 exil
= listcatfiles
['ffilelist'][reallcfi
]['fextrafields'];
4826 extrafieldslist
.append(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
4828 catfileoutstr
+= AppendNullBytes([extrafieldslist
], formatspecs
[5]);
4829 catfileoutstr
+= AppendNullBytes([checksumtype
], formatspecs
[5]);
4830 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
4831 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
4832 if(checksumtype
=="none" or checksumtype
==""):
4833 catfileheadercshex
= format(0, 'x').lower();
4834 catfilecontentcshex
= format(0, 'x').lower();
4835 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4836 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
4837 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
4838 elif(checksumtype
=="crc16_ccitt"):
4839 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
4840 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
4841 elif(checksumtype
=="adler32"):
4842 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
4843 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
4844 elif(checksumtype
=="crc32"):
4845 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
4846 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
4847 elif(checksumtype
=="crc64_ecma"):
4848 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4849 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
4850 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4851 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4852 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
4853 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4854 checksumoutstr
= hashlib
.new(checksumtype
);
4855 checksumoutstr
.update("".encode('UTF-8'));
4856 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4857 checksumoutstr
= hashlib
.new(checksumtype
);
4858 checksumoutstr
.update(fcontents
);
4859 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
4861 catfileheadercshex
= format(0, 'x').lower();
4862 catfilecontentcshex
= format(0, 'x').lower();
4863 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4864 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
4865 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
4866 if(checksumtype
=="none" or checksumtype
==""):
4867 catfileheadercshex
= format(0, 'x').lower();
4868 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4869 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4870 elif(checksumtype
=="crc16_ccitt"):
4871 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4872 elif(checksumtype
=="adler32"):
4873 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4874 elif(checksumtype
=="crc32"):
4875 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4876 elif(checksumtype
=="crc64_ecma"):
4877 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4878 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4879 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4880 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4881 checksumoutstr
= hashlib
.new(checksumtype
);
4882 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
4883 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4885 catfileheadercshex
= format(0, 'x').lower();
4886 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4887 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4888 nullstrecd
= formatspecs
[5].encode('UTF-8');
4889 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
4890 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
4891 catfp
.write(catfileout
);
4894 os
.fsync(catfp
.fileno());
4895 except io
.UnsupportedOperation
:
4897 except AttributeError:
4900 reallcfi
= reallcfi
+ 1;
4901 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4902 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
4905 os
.fsync(catfp
.fileno());
4906 except io
.UnsupportedOperation
:
4908 except AttributeError:
4912 if(hasattr(sys
.stdout
, "buffer")):
4913 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
4915 shutil
.copyfileobj(catfp
, sys
.stdout
);
4916 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
4917 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
4919 upload_file_to_ftp_file(catfp
, outfile
);
4920 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
4921 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
4924 upload_file_to_pysftp_file(catfp
, outfile
);
4926 upload_file_to_sftp_file(catfp
, outfile
);
4934 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
4936 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4937 catfp
= BytesIO(catstr
);
4938 listcatfiles
= RePackArchiveFile(catfp
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
4939 return listcatfiles
;
4941 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
4943 def PackArchiveFileFromListDir(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4944 outarray
= BytesIO();
4945 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
4946 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
4947 return listcatfiles
;
4949 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
4951 def ArchiveFileArrayBase64Encode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4953 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4954 if(isinstance(infile
, dict)):
4955 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4956 listcatfiles
= prelistcatfiles
['list'];
4958 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4959 infile
= RemoveWindowsPath(infile
);
4961 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4962 listcatfiles
= prelistcatfiles
['list'];
4964 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4965 if(not listcatfiles
):
4967 lenlist
= len(listcatfiles
['ffilelist']);
4972 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4975 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4976 lcfx
= listcatfiles
['fnumfiles'];
4978 lcfx
= int(listcatfiles
['fnumfiles']);
4979 if(lenlist
>lcfx
or lenlist
<lcfx
):
4982 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
4983 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64encode(listcatfiles
['ffilelist'][lcfi
]['fcontents']).decode("UTF-8");
4985 return listcatfiles
;
4987 create_alias_function("", __file_format_name__
, "ArrayBase64Encode", ArchiveFileArrayBase64Encode
);
4989 def ArchiveFileArrayBase64Decode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4991 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4992 if(isinstance(infile
, dict)):
4993 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4994 listcatfiles
= prelistcatfiles
['list'];
4996 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4997 infile
= RemoveWindowsPath(infile
);
4999 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5000 listcatfiles
= prelistcatfiles
['list'];
5002 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5003 if(not listcatfiles
):
5005 lenlist
= len(listcatfiles
['ffilelist']);
5010 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
5013 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5014 lcfx
= listcatfiles
['fnumfiles'];
5016 lcfx
= int(listcatfiles
['fnumfiles']);
5017 if(lenlist
>lcfx
or lenlist
<lcfx
):
5020 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
5021 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64decode(listcatfiles
['ffilelist'][lcfi
]['fcontents'].encode("UTF-8"));
5023 return listcatfiles
;
5025 create_alias_function("", __file_format_name__
, "ArrayBase64Decode", ArchiveFileArrayBase64Decode
);
5027 def UnPackArchiveFile(infile
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, preservepermissions
=True, preservetime
=True, verbose
=False, returnfp
=False):
5028 if(outdir
is not None):
5029 outdir
= RemoveWindowsPath(outdir
);
5031 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5032 if(isinstance(infile
, dict)):
5033 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5034 listcatfiles
= prelistcatfiles
['list'];
5036 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5037 infile
= RemoveWindowsPath(infile
);
5039 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5040 listcatfiles
= prelistcatfiles
['list'];
5042 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5043 if(not listcatfiles
):
5045 lenlist
= len(listcatfiles
['ffilelist']);
5050 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
5053 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5054 lcfx
= listcatfiles
['fnumfiles'];
5056 lcfx
= int(listcatfiles
['fnumfiles']);
5057 if(lenlist
>lcfx
or lenlist
<lcfx
):
5064 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
5065 funame
= userinfo
.pw_name
;
5074 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
5075 fgname
= groupinfo
.gr_name
;
5081 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
5082 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5083 with
open(listcatfiles
['ffilelist'][lcfi
]['fname'], "wb") as fpc
:
5084 fpc
.write(listcatfiles
['ffilelist'][lcfi
]['fcontents'])
5087 os
.fsync(fpc
.fileno())
5088 except io
.UnsupportedOperation
:
5090 except AttributeError:
5092 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
5093 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
5094 if(preservepermissions
):
5095 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fchmode']);
5097 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
5098 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5100 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
5101 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
5102 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
5107 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
5108 funame
= userinfo
.pw_name
;
5117 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
5118 fgname
= groupinfo
.gr_name
;
5123 if(flinkinfo
['ftype'] == 0 or flinkinfo
['ftype'] == 7):
5124 with
open(listcatfiles
['ffilelist'][lcfi
]['fname'], "wb") as fpc
:
5125 fpc
.write(flinkinfo
['fcontents'])
5128 os
.fsync(fpc
.fileno())
5129 except io
.UnsupportedOperation
:
5131 except AttributeError:
5133 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
5134 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
5135 if(preservepermissions
):
5136 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5138 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
5139 if(flinkinfo
['ftype']==1):
5140 os
.link(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5141 if(flinkinfo
['ftype']==2):
5142 os
.symlink(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5143 if(flinkinfo
['ftype']==5):
5144 if(preservepermissions
):
5145 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5147 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname']);
5148 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
5149 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
5150 if(preservepermissions
):
5151 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5153 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
5154 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
5155 os
.mkfifo(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5157 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5158 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5160 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
5161 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
5162 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
5167 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
5168 funame
= userinfo
.pw_name
;
5177 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
5178 fgname
= groupinfo
.gr_name
;
5183 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
5184 with
open(listcatfiles
['ffilelist'][lcfi
]['fname'], "wb") as fpc
:
5185 fpc
.write(flinkinfo
['fcontents'])
5188 os
.fsync(fpc
.fileno())
5189 except io
.UnsupportedOperation
:
5191 except AttributeError:
5193 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
5194 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
5195 if(preservepermissions
):
5196 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5198 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
5199 if(flinkinfo
['ftype']==1):
5200 os
.link(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5201 if(flinkinfo
['ftype']==2):
5202 os
.symlink(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5203 if(flinkinfo
['ftype']==5):
5204 if(preservepermissions
):
5205 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5207 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname']);
5208 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
5209 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
5210 if(preservepermissions
):
5211 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5213 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
5214 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
5215 os
.mkfifo(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5217 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5218 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5219 if(preservepermissions
):
5220 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fchmode']);
5222 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname']);
5223 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
5224 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
5225 if(preservepermissions
):
5226 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fchmode']);
5228 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
5229 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
5230 os
.mkfifo(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fchmode']);
5233 return listcatfiles
['ffilelist']['catfp'];
5237 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
5239 if(hasattr(shutil
, "register_unpack_format")):
5240 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
5241 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_delimiter__
, False, False);
5242 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
5244 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5245 catfp
= BytesIO(catstr
);
5246 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5247 return listcatfiles
;
5249 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
5251 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5252 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5253 if(isinstance(infile
, dict)):
5254 listcatfiles
= infile
;
5256 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5257 infile
= RemoveWindowsPath(infile
);
5258 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, skipchecksum
, formatspecs
, returnfp
);
5259 if(not listcatfiles
):
5261 lenlist
= len(listcatfiles
['ffilelist']);
5266 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
5268 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
5270 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
5271 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
5272 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5273 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
5274 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5275 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
5276 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
5277 if(len(fuprint
)<=0):
5278 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
5279 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
5280 if(len(fgprint
)<=0):
5281 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
5282 VerbosePrintOut(PrintPermissionString(listcatfiles
['ffilelist'][lcfi
]['fmode'], listcatfiles
['ffilelist'][lcfi
]['ftype']) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(listcatfiles
['ffilelist'][lcfi
]['fsize']).rjust(15) + " " + datetime
.datetime
.utcfromtimestamp(listcatfiles
['ffilelist'][lcfi
]['fmtime']).strftime('%Y-%m-%d %H:%M') + " " + printfname
));
5285 return listcatfiles
['catfp'];
5289 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
5291 def ArchiveFileStringListFiles(catstr
, followlink
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5292 catfp
= BytesIO(catstr
);
5293 listcatfiles
= UnPackArchiveFile(catfp
, None, followlink
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5294 return listcatfiles
;
5296 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileListFiles
);
5298 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
5299 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5302 if(hasattr(sys
.stdin
, "buffer")):
5303 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5305 shutil
.copyfileobj(sys
.stdin
, infile
);
5310 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
5311 infile
= download_file_from_http_file(infile
);
5316 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
5317 infile
= download_file_from_ftp_file(infile
);
5322 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5324 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
5326 if(not tarfile
.is_tarfile(infile
)):
5328 except AttributeError:
5329 if(not is_tarfile(infile
)):
5334 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5335 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
5337 tarfp
= tarfile
.open(infile
, "r");
5338 except FileNotFoundError
:
5340 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
5341 returnval
.update({lcfi
: member
.name
});
5342 fpremode
= member
.mode
;
5343 ffullmode
= member
.mode
;
5347 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5349 elif(member
.isdev()):
5350 ffullmode
= member
.mode
;
5352 elif(member
.islnk()):
5353 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5355 elif(member
.issym()):
5356 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
5358 elif(member
.ischr()):
5359 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
5361 elif(member
.isblk()):
5362 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
5364 elif(member
.isdir()):
5365 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
5367 elif(member
.isfifo()):
5368 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
5370 elif(member
.issparse()):
5371 ffullmode
= member
.mode
;
5374 VerbosePrintOut(member
.name
);
5376 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
5377 printfname
= member
.name
;
5379 printfname
= member
.name
+ " link to " + member
.linkname
;
5380 elif(member
.issym()):
5381 printfname
= member
.name
+ " -> " + member
.linkname
;
5382 fuprint
= member
.uname
;
5383 if(len(fuprint
)<=0):
5384 fuprint
= member
.uid
;
5385 fgprint
= member
.gname
;
5386 if(len(fgprint
)<=0):
5387 fgprint
= member
.gid
;
5388 VerbosePrintOut(PrintPermissionString(ffullmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.size
).rjust(15) + " " + datetime
.datetime
.utcfromtimestamp(member
.mtime
).strftime('%Y-%m-%d %H:%M') + " " + printfname
));
5391 return listcatfiles
['catfp'];
5395 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
5396 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5399 if(hasattr(sys
.stdin
, "buffer")):
5400 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5402 shutil
.copyfileobj(sys
.stdin
, infile
);
5407 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
5408 infile
= download_file_from_http_file(infile
);
5413 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
5414 infile
= download_file_from_ftp_file(infile
);
5419 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5423 if(not zipfile
.is_zipfile(infile
)):
5426 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
5427 except FileNotFoundError
:
5431 ziptest
= zipfp
.testzip();
5433 VerbosePrintOut("Bad file found!");
5434 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
5435 if(not member
.is_dir()):
5436 fpremode
= int(stat
.S_IFREG
+ 438);
5437 elif(member
.is_dir()):
5438 fpremode
= int(stat
.S_IFDIR
+ 511);
5439 if(not member
.is_dir()):
5440 fmode
= int(stat
.S_IFREG
+ 438);
5441 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5442 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5443 elif(member
.is_dir()):
5444 fmode
= int(stat
.S_IFDIR
+ 511);
5445 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5446 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5447 returnval
.update({lcfi
: member
.filename
});
5449 VerbosePrintOut(member
.filename
);
5451 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
5453 for fmodval
in str(oct(fmode
))[-3:]:
5454 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
5455 if(not member
.is_dir()):
5457 permissionstr
= "-" + permissionstr
;
5458 elif(member
.is_dir()):
5460 permissionstr
= "d" + permissionstr
;
5461 printfname
= member
.filename
;
5463 fuid
= int(os
.getuid());
5464 except AttributeError:
5469 fgid
= int(os
.getgid());
5470 except AttributeError:
5477 userinfo
= pwd
.getpwuid(os
.getuid());
5478 funame
= userinfo
.pw_name
;
5481 except AttributeError:
5489 groupinfo
= grp
.getgrgid(os
.getgid());
5490 fgname
= groupinfo
.gr_name
;
5493 except AttributeError:
5498 if(len(fuprint
)<=0):
5499 fuprint
= str(fuid
);
5501 if(len(fgprint
)<=0):
5502 fgprint
= str(fgid
);
5503 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + datetime
.datetime
.utcfromtimestamp(int(time
.mktime(member
.date_time
+ (0, 0, -1)))).strftime('%Y-%m-%d %H:%M') + " " + printfname
));
5506 return listcatfiles
['catfp'];
5510 if(not rarfile_support
):
5511 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
5512 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5513 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5516 if(rarfile_support
):
5517 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
5518 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5519 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5521 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5525 rarfp
= rarfile
.RarFile(infile
, "r");
5526 rartest
= rarfp
.testrar();
5528 VerbosePrintOut("Bad file found!");
5529 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5532 if(member
.host_os
== rarfile
.RAR_OS_UNIX
):
5535 member
.external_attr
5537 except AttributeError:
5539 elif(member
.host_os
== rarfile
.RAR_OS_WIN32
):
5542 member
.external_attr
5544 except AttributeError:
5549 if(is_unix
and member
.external_attr
!=0):
5550 fpremode
= int(member
.external_attr
);
5551 elif(member
.is_file()):
5552 fpremode
= int(stat
.S_IFREG
+ 438);
5553 elif(member
.is_symlink()):
5554 fpremode
= int(stat
.S_IFLNK
+ 438);
5555 elif(member
.is_dir()):
5556 fpremode
= int(stat
.S_IFDIR
+ 511);
5557 if(is_windows
and member
.external_attr
!=0):
5558 fwinattributes
= int(member
.external_attr
);
5560 fwinattributes
= int(0);
5561 if(is_unix
and member
.external_attr
!=0):
5562 fmode
= int(member
.external_attr
);
5563 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5564 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5565 elif(member
.is_file()):
5566 fmode
= int(stat
.S_IFREG
+ 438);
5567 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5568 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5569 elif(member
.is_symlink()):
5570 fmode
= int(stat
.S_IFLNK
+ 438);
5571 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
5572 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
5573 elif(member
.is_dir()):
5574 fmode
= int(stat
.S_IFDIR
+ 511);
5575 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5576 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5577 returnval
.update({lcfi
: member
.filename
});
5579 VerbosePrintOut(member
.filename
);
5581 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
5583 for fmodval
in str(oct(fmode
))[-3:]:
5584 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
5585 if(member
.is_file()):
5587 permissionstr
= "-" + permissionstr
;
5588 printfname
= member
.filename
;
5589 elif(member
.is_symlink()):
5591 permissionstr
= "l" + permissionstr
;
5592 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
5593 elif(member
.is_dir()):
5595 permissionstr
= "d" + permissionstr
;
5596 printfname
= member
.filename
;
5598 fuid
= int(os
.getuid());
5599 except AttributeError:
5604 fgid
= int(os
.getgid());
5605 except AttributeError:
5612 userinfo
= pwd
.getpwuid(os
.getuid());
5613 funame
= userinfo
.pw_name
;
5616 except AttributeError:
5624 groupinfo
= grp
.getgrgid(os
.getgid());
5625 fgname
= groupinfo
.gr_name
;
5628 except AttributeError:
5633 if(len(fuprint
)<=0):
5634 fuprint
= str(fuid
);
5636 if(len(fgprint
)<=0):
5637 fgprint
= str(fgid
);
5638 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
5641 return listcatfiles
['catfp'];
5645 def ListDirListFiles(infiles
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5646 outarray
= BytesIO();
5647 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
5648 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5649 return listcatfiles
;
5651 def ListDirListFilesAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=True, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5652 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
5653 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5654 return listcatfiles
;
5656 def PackArchiveFileFromListDirAlt(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5657 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
5658 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
5659 return listcatfiles
;
5661 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
5663 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5664 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
5665 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
5666 return listcatfiles
;
5668 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
5670 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5671 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
5672 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
5673 return listcatfiles
;
5675 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
5677 if(not rarfile_support
):
5678 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5681 if(rarfile_support
):
5682 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5683 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
5684 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
5685 return listcatfiles
;
5687 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
5689 def download_file_from_ftp_file(url
):
5690 urlparts
= urlparse(url
);
5691 file_name
= os
.path
.basename(urlparts
.path
);
5692 file_dir
= os
.path
.dirname(urlparts
.path
);
5693 if(urlparts
.username
is not None):
5694 ftp_username
= urlparts
.username
;
5696 ftp_username
= "anonymous";
5697 if(urlparts
.password
is not None):
5698 ftp_password
= urlparts
.password
;
5699 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
5700 ftp_password
= "anonymous";
5703 if(urlparts
.scheme
=="ftp"):
5705 elif(urlparts
.scheme
=="ftps"):
5709 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
5711 ftp_port
= urlparts
.port
;
5712 if(urlparts
.port
is None):
5715 ftp
.connect(urlparts
.hostname
, ftp_port
);
5716 except socket
.gaierror
:
5717 log
.info("Error With URL "+url
);
5719 except socket
.timeout
:
5720 log
.info("Error With URL "+url
);
5722 ftp
.login(urlparts
.username
, urlparts
.password
);
5723 if(urlparts
.scheme
=="ftps"):
5725 ftpfile
= BytesIO();
5726 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
5727 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
5732 def download_file_from_ftp_string(url
):
5733 ftpfile
= download_file_from_ftp_file(url
);
5734 return ftpfile
.read();
5736 def upload_file_to_ftp_file(ftpfile
, url
):
5737 urlparts
= urlparse(url
);
5738 file_name
= os
.path
.basename(urlparts
.path
);
5739 file_dir
= os
.path
.dirname(urlparts
.path
);
5740 if(urlparts
.username
is not None):
5741 ftp_username
= urlparts
.username
;
5743 ftp_username
= "anonymous";
5744 if(urlparts
.password
is not None):
5745 ftp_password
= urlparts
.password
;
5746 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
5747 ftp_password
= "anonymous";
5750 if(urlparts
.scheme
=="ftp"):
5752 elif(urlparts
.scheme
=="ftps"):
5756 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
5758 ftp_port
= urlparts
.port
;
5759 if(urlparts
.port
is None):
5762 ftp
.connect(urlparts
.hostname
, ftp_port
);
5763 except socket
.gaierror
:
5764 log
.info("Error With URL "+url
);
5766 except socket
.timeout
:
5767 log
.info("Error With URL "+url
);
5769 ftp
.login(urlparts
.username
, urlparts
.password
);
5770 if(urlparts
.scheme
=="ftps"):
5772 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
5777 def upload_file_to_ftp_string(ftpstring
, url
):
5778 ftpfileo
= BytesIO(ftpstring
);
5779 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
5783 def download_file_from_http_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
5784 # Parse the URL to extract username and password if present
5785 parsed_url
= urlparse(url
);
5786 username
= parsed_url
.username
;
5787 password
= parsed_url
.password
;
5788 # Rebuild the URL without the username and password
5789 rebuilt_url
= parsed_url
._replace
(netloc
=parsed_url
.hostname
).geturl();
5790 # Create a Request object with the given URL (without credentials) and headers
5791 request
= Request(rebuilt_url
, headers
=headers
);
5792 # Create an opener object for handling URLs
5793 if username
and password
:
5794 # Create a password manager
5795 password_mgr
= urllib
.request
.HTTPPasswordMgrWithDefaultRealm() if 'urllib.request' in sys
.modules
else urllib2
.HTTPPasswordMgrWithDefaultRealm();
5796 # Add the username and password
5797 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
5798 # Create an authentication handler using the password manager
5799 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
5800 # Build the opener with the authentication handler
5801 opener
= build_opener(auth_handler
);
5803 opener
= build_opener();
5804 # Open the URL using the custom opener
5805 response
= opener
.open(request
);
5806 data
= response
.read();
5807 # Write the data to a temporary file object
5808 temp_file
= BytesIO(data
);
5809 # Reset file pointer to the start
5811 # Return the temporary file object
5814 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
5815 httpfile
= download_file_from_http_file(url
, headers
);
5816 return ftpfile
.read();
5819 def download_file_from_sftp_file(url
):
5820 urlparts
= urlparse(url
);
5821 file_name
= os
.path
.basename(urlparts
.path
);
5822 file_dir
= os
.path
.dirname(urlparts
.path
);
5823 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
5825 sftp_port
= urlparts
.port
;
5826 if(urlparts
.port
is None):
5829 sftp_port
= urlparts
.port
;
5830 if(urlparts
.username
is not None):
5831 sftp_username
= urlparts
.username
;
5833 sftp_username
= "anonymous";
5834 if(urlparts
.password
is not None):
5835 sftp_password
= urlparts
.password
;
5836 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
5837 sftp_password
= "anonymous";
5840 if(urlparts
.scheme
!="sftp"):
5842 ssh
= paramiko
.SSHClient();
5843 ssh
.load_system_host_keys();
5844 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
5846 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
5847 except paramiko
.ssh_exception
.SSHException
:
5849 except socket
.gaierror
:
5850 log
.info("Error With URL "+url
);
5852 except socket
.timeout
:
5853 log
.info("Error With URL "+url
);
5855 sftp
= ssh
.open_sftp();
5856 sftpfile
= BytesIO();
5857 sftp
.getfo(urlparts
.path
, sftpfile
);
5860 sftpfile
.seek(0, 0);
5863 def download_file_from_sftp_file(url
):
5867 def download_file_from_sftp_string(url
):
5868 sftpfile
= download_file_from_sftp_file(url
);
5869 return sftpfile
.read();
5871 def download_file_from_ftp_string(url
):
5875 def upload_file_to_sftp_file(sftpfile
, url
):
5876 urlparts
= urlparse(url
);
5877 file_name
= os
.path
.basename(urlparts
.path
);
5878 file_dir
= os
.path
.dirname(urlparts
.path
);
5879 sftp_port
= urlparts
.port
;
5880 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
5882 if(urlparts
.port
is None):
5885 sftp_port
= urlparts
.port
;
5886 if(urlparts
.username
is not None):
5887 sftp_username
= urlparts
.username
;
5889 sftp_username
= "anonymous";
5890 if(urlparts
.password
is not None):
5891 sftp_password
= urlparts
.password
;
5892 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
5893 sftp_password
= "anonymous";
5896 if(urlparts
.scheme
!="sftp"):
5898 ssh
= paramiko
.SSHClient();
5899 ssh
.load_system_host_keys();
5900 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
5902 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
5903 except paramiko
.ssh_exception
.SSHException
:
5905 except socket
.gaierror
:
5906 log
.info("Error With URL "+url
);
5908 except socket
.timeout
:
5909 log
.info("Error With URL "+url
);
5911 sftp
= ssh
.open_sftp();
5912 sftp
.putfo(sftpfile
, urlparts
.path
);
5915 sftpfile
.seek(0, 0);
5918 def upload_file_to_sftp_file(sftpfile
, url
):
5922 def upload_file_to_sftp_string(sftpstring
, url
):
5923 sftpfileo
= BytesIO(sftpstring
);
5924 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
5928 def upload_file_to_sftp_string(url
):
5932 def download_file_from_pysftp_file(url
):
5933 urlparts
= urlparse(url
);
5934 file_name
= os
.path
.basename(urlparts
.path
);
5935 file_dir
= os
.path
.dirname(urlparts
.path
);
5936 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
5938 sftp_port
= urlparts
.port
;
5939 if(urlparts
.port
is None):
5942 sftp_port
= urlparts
.port
;
5943 if(urlparts
.username
is not None):
5944 sftp_username
= urlparts
.username
;
5946 sftp_username
= "anonymous";
5947 if(urlparts
.password
is not None):
5948 sftp_password
= urlparts
.password
;
5949 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
5950 sftp_password
= "anonymous";
5953 if(urlparts
.scheme
!="sftp"):
5956 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
5957 except paramiko
.ssh_exception
.SSHException
:
5959 except socket
.gaierror
:
5960 log
.info("Error With URL "+url
);
5962 except socket
.timeout
:
5963 log
.info("Error With URL "+url
);
5965 sftp
= ssh
.open_sftp();
5966 sftpfile
= BytesIO();
5967 sftp
.getfo(urlparts
.path
, sftpfile
);
5970 sftpfile
.seek(0, 0);
5973 def download_file_from_pysftp_file(url
):
5977 def download_file_from_pysftp_string(url
):
5978 sftpfile
= download_file_from_pysftp_file(url
);
5979 return sftpfile
.read();
5981 def download_file_from_ftp_string(url
):
5985 def upload_file_to_pysftp_file(sftpfile
, url
):
5986 urlparts
= urlparse(url
);
5987 file_name
= os
.path
.basename(urlparts
.path
);
5988 file_dir
= os
.path
.dirname(urlparts
.path
);
5989 sftp_port
= urlparts
.port
;
5990 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
5992 if(urlparts
.port
is None):
5995 sftp_port
= urlparts
.port
;
5996 if(urlparts
.username
is not None):
5997 sftp_username
= urlparts
.username
;
5999 sftp_username
= "anonymous";
6000 if(urlparts
.password
is not None):
6001 sftp_password
= urlparts
.password
;
6002 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6003 sftp_password
= "anonymous";
6006 if(urlparts
.scheme
!="sftp"):
6009 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
6010 except paramiko
.ssh_exception
.SSHException
:
6012 except socket
.gaierror
:
6013 log
.info("Error With URL "+url
);
6015 except socket
.timeout
:
6016 log
.info("Error With URL "+url
);
6018 sftp
= ssh
.open_sftp();
6019 sftp
.putfo(sftpfile
, urlparts
.path
);
6022 sftpfile
.seek(0, 0);
6025 def upload_file_to_pysftp_file(sftpfile
, url
):
6029 def upload_file_to_pysftp_string(sftpstring
, url
):
6030 sftpfileo
= BytesIO(sftpstring
);
6031 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
6035 def upload_file_to_pysftp_string(url
):
6039 if(hasattr(shutil
, "register_archive_format")):
6040 # Register the packing format
6041 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
6042 except shutil
.RegistryError
:
6046 if(hasattr(shutil
, "register_unpack_format")):
6047 # Register the unpacking format
6048 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
6049 except shutil
.RegistryError
: