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: 5/15/2024 Ver. 0.11.4 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
, zipfile
, platform
;
23 from backports
import tempfile
;
29 from ftplib
import FTP
, FTP_TLS
;
32 from ftplib
import FTP
;
35 # Try Python 3 imports
36 from urllib
.parse
import urlparse
, urlunparse
;
38 # Fall back to Python 2 imports
39 from urlparse
import urlparse
, urlunparse
;
41 if os
.name
== 'nt': # Only modify if on Windows
42 if sys
.version
[0] == "2":
44 sys
.stdout
= codecs
.getwriter('utf-8')(sys
.stdout
);
45 sys
.stderr
= codecs
.getwriter('utf-8')(sys
.stderr
);
48 sys
.stdout
= io
.TextIOWrapper(sys
.stdout
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
49 sys
.stderr
= io
.TextIOWrapper(sys
.stderr
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
51 hashlib_guaranteed
= False;
52 os
.environ
["PYTHONIOENCODING"] = "UTF-8";
53 os
.environ
["LC_CTYPE"] = "UTF-8";
57 sys
.setdefaultencoding('UTF-8');
60 except AttributeError:
64 except AttributeError:
68 from zlib
import crc32
;
70 from binascii
import crc32
;
72 if(sys
.version_info
[0]==2):
73 FileNotFoundError
= IOError;
75 rarfile_support
= False;
78 rarfile_support
= True;
80 rarfile_support
= False;
82 py7zr_support
= False;
87 py7zr_support
= False;
90 from xtarfile
import is_tarfile
;
93 from safetar
import is_tarfile
;
95 from tarfile
import is_tarfile
;
98 import xtarfile
as tarfile
;
101 import safetar
as tarfile
;
105 haveparamiko
= False;
110 haveparamiko
= False;
119 haverequests
= False;
124 haverequests
= False;
128 logging
.getLogger("urllib3").setLevel(logging
.WARNING
);
132 from urllib
.request
import Request
, build_opener
, HTTPBasicAuthHandler
;
133 from urllib
.parse
import urlparse
;
136 from urllib2
import Request
, build_opener
, HTTPBasicAuthHandler
;
137 from urlparse
import urlparse
;
140 from io
import StringIO
, BytesIO
;
143 from cStringIO
import StringIO
, StringIO
as BytesIO
;
145 from StringIO
import StringIO
, StringIO
as BytesIO
;
147 __use_pysftp__
= False;
149 __use_pysftp__
= False;
150 __file_format_name__
= "CatFile";
151 __program_name__
= "Py"+__file_format_name__
;
152 __file_format_lower__
= __file_format_name__
.lower();
153 __file_format_magic__
= __file_format_name__
;
154 __file_format_len__
= len(__file_format_magic__
);
155 __file_format_hex__
= binascii
.hexlify(__file_format_magic__
.encode("UTF-8")).decode("UTF-8");
156 __file_format_delimiter__
= "\x00";
157 __file_format_ver__
= "001";
158 __use_new_style__
= True;
159 __use_advanced_list__
= True;
160 __use_alt_inode__
= False;
161 __file_format_extension__
= ".cat";
162 __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__
, __use_advanced_list__
, __use_alt_inode__
];
163 __file_format_dict__
= {'format_name': __file_format_name__
, 'format_magic': __file_format_magic__
, 'format_lower': __file_format_lower__
, 'format_len': __file_format_len__
, 'format_hex': __file_format_hex__
, 'format_delimiter': __file_format_delimiter__
, 'format_ver': __file_format_ver__
, 'new_style': __use_new_style__
, 'use_advanced_list': __use_advanced_list__
, 'use_alt_inode': __use_alt_inode__
};
164 __project__
= __program_name__
;
165 __project_url__
= "https://github.com/GameMaker2k/PyCatFile";
166 __version_info__
= (0, 11, 4, "RC 1", 1);
167 __version_date_info__
= (2024, 5, 17, "RC 1", 1);
168 __version_date__
= str(__version_date_info__
[0]) + "." + str(__version_date_info__
[1]).zfill(2) + "." + str(__version_date_info__
[2]).zfill(2);
169 __revision__
= __version_info__
[3];
170 __revision_id__
= "$Id$";
171 if(__version_info__
[4] is not None):
172 __version_date_plusrc__
= __version_date__
+ "-" + str(__version_date_info__
[4]);
173 if(__version_info__
[4] is None):
174 __version_date_plusrc__
= __version_date__
;
175 if(__version_info__
[3] is not None):
176 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]) + " " + str(__version_info__
[3]);
177 if(__version_info__
[3] is None):
178 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]);
180 PyBitness
= platform
.architecture();
181 if(PyBitness
=="32bit" or PyBitness
=="32"):
183 elif(PyBitness
=="64bit" or PyBitness
=="64"):
188 geturls_ua_pycatfile_python
= "Mozilla/5.0 (compatible; {proname}/{prover}; +{prourl})".format(proname
=__project__
, prover
=__version__
, prourl
=__project_url__
);
189 if(platform
.python_implementation()!=""):
190 py_implementation
= platform
.python_implementation();
191 if(platform
.python_implementation()==""):
192 py_implementation
= "Python";
193 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__
);
194 geturls_ua_googlebot_google
= "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
195 geturls_ua_googlebot_google_old
= "Googlebot/2.1 (+http://www.google.com/bot.html)";
196 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
)};
197 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
)};
198 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"};
199 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"};
201 def CompressionSupport():
202 compression_list
= [];
205 compression_list
.append("gz");
206 compression_list
.append("gzip");
211 compression_list
.append("bz2");
212 compression_list
.append("bzip2");
217 compression_list
.append("lz4");
222 compression_list
.append("lzo");
223 compression_list
.append("lzop");
228 compression_list
.append("zstd");
229 compression_list
.append("zstandard");
234 compression_list
.append("lzma");
235 compression_list
.append("xz");
239 from backports
import lzma
;
240 compression_list
.append("lzma");
241 compression_list
.append("xz");
244 return compression_list
;
246 compressionsupport
= CompressionSupport();
247 compressionlist
= ['auto'];
248 compressionlistalt
= [];
251 if('gzip' in compressionsupport
):
252 compressionlist
.append('gzip');
253 compressionlistalt
.append('gzip');
254 outextlist
.append('gz');
255 outextlistwd
.append('.gz');
256 if('bzip2' in compressionsupport
):
257 compressionlist
.append('bzip2');
258 compressionlistalt
.append('bzip2');
259 outextlist
.append('bz2');
260 outextlistwd
.append('.bz2');
261 if('zstd' in compressionsupport
):
262 compressionlist
.append('zstd');
263 compressionlistalt
.append('zstd');
264 outextlist
.append('zst');
265 outextlistwd
.append('.zst');
266 if('lz4' in compressionsupport
):
267 compressionlist
.append('lz4');
268 compressionlistalt
.append('lz4');
269 outextlist
.append('lz4');
270 outextlistwd
.append('.lz4');
271 if('lzo' in compressionsupport
):
272 compressionlist
.append('lzo');
273 compressionlistalt
.append('lzo');
274 outextlist
.append('lzo');
275 outextlistwd
.append('.lzo');
276 if('lzop' in compressionsupport
):
277 compressionlist
.append('lzop');
278 compressionlistalt
.append('lzop');
279 outextlist
.append('lzop');
280 outextlistwd
.append('.lzop');
281 if('lzma' in compressionsupport
):
282 compressionlist
.append('lzma');
283 compressionlistalt
.append('lzma');
284 outextlist
.append('lzma');
285 outextlistwd
.append('.lzma');
286 if('xz' in compressionsupport
):
287 compressionlist
.append('xz');
288 compressionlistalt
.append('xz');
289 outextlist
.append('xz');
290 outextlistwd
.append('.xz');
292 tarfile_mimetype
= "application/tar";
293 tarfile_tar_mimetype
= tarfile_mimetype
;
294 zipfile_mimetype
= "application/zip";
295 zipfile_zip_mimetype
= zipfile_mimetype
;
296 rarfile_mimetype
= "application/rar";
297 rarfile_rar_mimetype
= rarfile_mimetype
;
298 archivefile_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"";
299 archivefile_cat_mimetype
= archivefile_mimetype
;
300 archivefile_gzip_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+gzip";
301 archivefile_gz_mimetype
= archivefile_gzip_mimetype
;
302 archivefile_bzip2_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+bzip2";
303 archivefile_bz2_mimetype
= archivefile_bzip2_mimetype
;
304 archivefile_lz4_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lz4";
305 archivefile_lzop_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lzop";
306 archivefile_lzo_mimetype
= archivefile_lzop_mimetype
;
307 archivefile_zstandard_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+zstandard";
308 archivefile_zstd_mimetype
= archivefile_zstandard_mimetype
;
309 archivefile_lzma_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lzma";
310 archivefile_xz_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+xz";
311 archivefile_extensions
= [__file_format_extension__
, __file_format_extension__
+".gz", __file_format_extension__
+".bz2", __file_format_extension__
+".zst", __file_format_extension__
+".lz4", __file_format_extension__
+".lzo", __file_format_extension__
+".lzop", __file_format_extension__
+".lzma", __file_format_extension__
+".xz"];
313 if __name__
== "__main__":
315 curscrpath
= os
.path
.dirname(sys
.argv
[0]);
319 curscrpath
= curscrpath
.replace(os
.sep
, "/");
320 curscrpath
= curscrpath
+ "/";
321 scrfile
= curscrpath
+ "catfile.py";
322 if(os
.path
.exists(scrfile
) and os
.path
.isfile(scrfile
)):
323 scrcmd
= subprocess
.Popen([sys
.executable
, scrfile
] + sys
.argv
[1:]);
326 def VerbosePrintOut(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
332 "warning": logging
.warning
,
333 "error": logging
.error
,
334 "critical": logging
.critical
,
335 "exception": logging
.exception
,
336 "logalt": lambda x
: logging
.log(dgblevel
, x
),
337 "debug": logging
.debug
339 log_function
= log_functions
.get(outtype
);
341 log_function(dbgtxt
);
345 def VerbosePrintOutReturn(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
346 VerbosePrintOut(dbgtxt
, outtype
, dbgenable
, dgblevel
);
349 def RemoveWindowsPath(dpath
):
353 dpath
= dpath
.replace(os
.path
.sep
, "/");
354 dpath
= dpath
.rstrip("/");
355 if(dpath
=="." or dpath
==".."):
359 def NormalizeRelativePath(inpath
):
360 inpath
= RemoveWindowsPath(inpath
);
361 if(os
.path
.isabs(inpath
)):
364 if(inpath
.startswith("./") or inpath
.startswith("../")):
367 outpath
= "./" + inpath
;
370 def PrependPath(base_dir
, child_path
):
371 # Check if base_dir is None or empty, if so, return child_path as is
374 # Ensure base_dir ends with exactly one slash
375 if not base_dir
.endswith('/'):
377 # Check if child_path starts with ./ or ../ (indicating a relative path)
378 if child_path
.startswith('./') or child_path
.startswith('../'):
379 # For relative paths, we don't alter the child_path
380 return base_dir
+ child_path
;
382 # For non-relative paths, ensure there's no starting slash on child_path to avoid double slashes
383 return base_dir
+ child_path
.lstrip('/');
385 def ListDir(dirpath
, followlink
=False, duplicates
=False):
386 if(isinstance(dirpath
, (list, tuple, ))):
387 dirpath
= list(filter(None, dirpath
));
388 elif(isinstance(dirpath
, (str, ))):
389 dirpath
= list(filter(None, [dirpath
]));
391 for mydirfile
in dirpath
:
392 if(not os
.path
.exists(mydirfile
)):
394 mydirfile
= NormalizeRelativePath(mydirfile
);
395 if(os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
)):
396 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
397 if(os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
)):
398 for root
, dirs
, filenames
in os
.walk(mydirfile
):
400 dpath
= RemoveWindowsPath(dpath
);
401 if(dpath
not in retlist
and not duplicates
):
402 retlist
.append(dpath
);
404 retlist
.append(dpath
);
405 for file in filenames
:
406 fpath
= os
.path
.join(root
, file);
407 fpath
= RemoveWindowsPath(fpath
);
408 if(fpath
not in retlist
and not duplicates
):
409 retlist
.append(fpath
);
411 retlist
.append(fpath
);
413 retlist
.append(RemoveWindowsPath(mydirfile
));
416 def ListDirAdvanced(dirpath
, followlink
=False, duplicates
=False):
417 if isinstance(dirpath
, (list, tuple)):
418 dirpath
= list(filter(None, dirpath
));
419 elif isinstance(dirpath
, str):
420 dirpath
= list(filter(None, [dirpath
]));
422 for mydirfile
in dirpath
:
423 if not os
.path
.exists(mydirfile
):
425 mydirfile
= NormalizeRelativePath(mydirfile
);
426 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
) and followlink
:
427 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
))
428 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
429 for root
, dirs
, filenames
in os
.walk(mydirfile
):
430 # Sort dirs and filenames alphabetically in place
431 dirs
.sort(key
=lambda x
: x
.lower());
432 filenames
.sort(key
=lambda x
: x
.lower());
433 dpath
= RemoveWindowsPath(root
);
434 if not duplicates
and dpath
not in retlist
:
435 retlist
.append(dpath
);
437 retlist
.append(dpath
);
438 for file in filenames
:
439 fpath
= os
.path
.join(root
, file);
440 fpath
= RemoveWindowsPath(fpath
);
441 if not duplicates
and fpath
not in retlist
:
442 retlist
.append(fpath
);
444 retlist
.append(fpath
);
446 retlist
.append(RemoveWindowsPath(mydirfile
));
449 def create_alias_function(prefix
, base_name
, suffix
, target_function
):
450 # Define a new function that wraps the target function
451 def alias_function(*args
, **kwargs
):
452 return target_function(*args
, **kwargs
);
454 # Create the function name by combining the prefix, base name, and the suffix
455 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
);
457 # Add the new function to the global namespace
458 globals()[function_name
] = alias_function
;
460 def create_alias_function_alt(prefix
, base_name
, suffix
, target_function
):
461 # Create the function name by combining the prefix, base name, and the suffix
462 # Use the format method for string formatting, compatible with Python 2 and 3
463 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
)
464 # Add the new function (alias of the target_function) to the global namespace
465 # This line is compatible as-is with both Python 2 and 3
466 globals()[function_name
] = target_function
468 def FormatSpecsListToDict(formatspecs
=__file_format_list__
):
469 if(isinstance(formatspecs
, (list, tuple, ))):
470 return {'format_name': formatspecs
[0], 'format_magic': formatspecs
[1], 'format_lower': formatspecs
[2], 'format_len': formatspecs
[3], 'format_hex': formatspecs
[4], 'format_delimiter': formatspecs
[5], 'format_ver': formatspecs
[6], 'new_style': formatspecs
[7], 'use_advanced_list': formatspecs
[8], 'use_alt_inode': formatspecs
[9]};
471 elif(isinstance(formatspecs
, (dict, ))):
474 return __file_format_dict__
;
475 return __file_format_dict__
;
477 def TarFileCheck(infile
):
479 if tarfile
.is_tarfile(infile
):
485 # Check if the input is a file object
486 if hasattr(infile
, 'read'):
487 # Save the current file position
488 current_position
= infile
.tell();
489 # Attempt to open the file object as a tar file
490 tar
= tarfile
.open(fileobj
=infile
);
492 # Restore the file position
493 infile
.seek(current_position
);
496 # Assume it's a filename
497 tar
= tarfile
.open(name
=infile
);
500 except tarfile
.TarError
:
503 # initial_value can be 0xFFFF or 0x0000
504 def crc16_ansi(msg
, initial_value
=0xFFFF):
505 # CRC-16-IBM / CRC-16-ANSI polynomial and initial value
506 poly
= 0x8005; # Polynomial for CRC-16-IBM / CRC-16-ANSI
507 crc
= initial_value
; # Initial value
509 crc ^
= b
<< 8; # XOR byte into CRC top byte
510 for _
in range(8): # Process each bit
511 if crc
& 0x8000: # If the top bit is set
512 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
514 crc
= crc
<< 1; # Just shift left
515 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
518 # initial_value can be 0xFFFF or 0x0000
519 def crc16_ibm(msg
, initial_value
=0xFFFF):
520 return crc16_ansi(msg
, initial_value
);
522 # initial_value is 0xFFFF
524 return crc16_ansi(msg
, 0xFFFF);
526 # initial_value can be 0xFFFF, 0x1D0F or 0x0000
527 def crc16_ccitt(msg
, initial_value
=0xFFFF):
528 # CRC-16-CCITT polynomial
529 poly
= 0x1021; # Polynomial for CRC-16-CCITT
530 # Use the specified initial value
533 crc ^
= b
<< 8; # XOR byte into CRC top byte
534 for _
in range(8): # Process each bit
535 if crc
& 0x8000: # If the top bit is set
536 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
538 crc
= crc
<< 1; # Just shift left
539 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
542 # initial_value can be 0x42F0E1EBA9EA3693 or 0x0000000000000000
543 def crc64_ecma(msg
, initial_value
=0x0000000000000000):
544 # CRC-64-ECMA polynomial and initial value
545 poly
= 0x42F0E1EBA9EA3693;
546 crc
= initial_value
; # Initial value for CRC-64-ECMA
548 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
549 for _
in range(8): # Process each bit
550 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
551 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
553 crc
<<= 1; # Just shift left if the MSB is 0
554 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
557 # initial_value can be 0x000000000000001B or 0xFFFFFFFFFFFFFFFF
558 def crc64_iso(msg
, initial_value
=0xFFFFFFFFFFFFFFFF):
559 # CRC-64-ISO polynomial and initial value
560 poly
= 0x000000000000001B;
561 crc
= initial_value
; # Common initial value for CRC-64-ISO
563 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
564 for _
in range(8): # Process each bit
565 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
566 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
568 crc
<<= 1; # Just shift left if the MSB is 0
569 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
572 def GetDataFromArray(data
, path
, default
=None):
576 element
= element
[key
];
578 except (KeyError, TypeError, IndexError):
581 def GetDataFromArrayAlt(structure
, path
, default
=None):
584 if isinstance(element
, dict) and key
in element
:
585 element
= element
[key
];
586 elif isinstance(element
, list) and isinstance(key
, int) and -len(element
) <= key
< len(element
):
587 element
= element
[key
];
592 def GetHeaderChecksum(inlist
=[], checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_dict__
):
593 formatspecs
= FormatSpecsListToDict(formatspecs
);
594 if isinstance(inlist
, list):
595 fileheader
= AppendNullBytes(inlist
, formatspecs
['format_delimiter']);
597 fileheader
= AppendNullByte(inlist
, formatspecs
['format_delimiter']);
599 fileheader
= fileheader
.encode('UTF-8');
600 if(checksumtype
=="none" or checksumtype
==""):
601 catfileheadercshex
= format(0, 'x').lower();
602 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
603 catfileheadercshex
= format(crc16(fileheader
) & 0xffff, '04x').lower();
604 elif(checksumtype
=="crc16_ccitt"):
605 catfileheadercshex
= format(crc16_ccitt(fileheader
) & 0xffff, '04x').lower();
606 elif(checksumtype
=="adler32"):
607 catfileheadercshex
= format(zlib
.adler32(fileheader
) & 0xffffffff, '08x').lower();
608 elif(checksumtype
=="crc32"):
609 catfileheadercshex
= format(crc32(fileheader
) & 0xffffffff, '08x').lower();
610 elif(checksumtype
=="crc64_ecma"):
611 catfileheadercshex
= format(crc64_ecma(fileheader
) & 0xffffffffffffffff, '016x').lower();
612 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
613 catfileheadercshex
= format(crc64_iso(fileheader
) & 0xffffffffffffffff, '016x').lower();
614 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
615 checksumoutstr
= hashlib
.new(checksumtype
);
616 checksumoutstr
.update(fileheader
);
617 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
619 catfileheadercshex
= format(0, 'x').lower();
620 return catfileheadercshex
;
622 def GetFileChecksum(instr
, checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_dict__
):
623 formatspecs
= FormatSpecsListToDict(formatspecs
);
625 instr
= instr
.encode('UTF-8');
626 if(checksumtype
=="none" or checksumtype
==""):
627 catinstrcshex
= format(0, 'x').lower();
628 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
629 catinstrcshex
= format(crc16(instr
) & 0xffff, '04x').lower();
630 elif(checksumtype
=="crc16_ccitt"):
631 catinstrcshex
= format(crc16_ccitt(instr
) & 0xffff, '04x').lower();
632 elif(checksumtype
=="adler32"):
633 catinstrcshex
= format(zlib
.adler32(instr
) & 0xffffffff, '08x').lower();
634 elif(checksumtype
=="crc32"):
635 catinstrcshex
= format(crc32(instr
) & 0xffffffff, '08x').lower();
636 elif(checksumtype
=="crc64_ecma"):
637 catinstrcshex
= format(crc64_ecma(instr
) & 0xffffffffffffffff, '016x').lower();
638 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
639 catinstrcshex
= format(crc64_iso(instr
) & 0xffffffffffffffff, '016x').lower();
640 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
641 checksumoutstr
= hashlib
.new(checksumtype
);
642 checksumoutstr
.update(instr
);
643 catinstrcshex
= checksumoutstr
.hexdigest().lower();
645 catinstrcshex
= format(0, 'x').lower();
646 return catinstrcshex
;
648 def ValidateHeaderChecksum(inlist
=[], checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_dict__
):
649 formatspecs
= FormatSpecsListToDict(formatspecs
);
650 catfileheadercshex
= GetHeaderChecksum(inlist
, checksumtype
, True, formatspecs
);
651 inchecksum
= inchecksum
.lower();
652 catfileheadercshex
= catfileheadercshex
.lower();
653 if(inchecksum
==catfileheadercshex
):
658 def ValidateFileChecksum(infile
, checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_dict__
):
659 formatspecs
= FormatSpecsListToDict(formatspecs
);
660 catinfilecshex
= GetFileChecksum(infile
, checksumtype
, True, formatspecs
);
661 inchecksum
= inchecksum
.lower();
662 catinfilecshex
= catinfilecshex
.lower();
663 if(inchecksum
==catinfilecshex
):
668 def ReadTillNullByteOld(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
671 nullbyte
= delimiter
.encode("UTF-8");
673 curbyte
= fp
.read(1);
674 if(curbyte
==nullbyte
or not curbyte
):
676 curfullbyte
= curfullbyte
+ curbyte
;
677 return curfullbyte
.decode('UTF-8');
679 def ReadUntilNullByteOld(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
680 return ReadTillNullByteOld(fp
, delimiter
);
682 def ReadTillNullByteAlt(fp
, delimiter
=__file_format_dict__
['format_delimiter'], chunk_size
=1024, max_read
=1024000):
683 delimiter
= delimiter
.encode('UTF-8') # Ensure the delimiter is in bytes
684 buffer = bytearray();
686 delimiter_length
= len(delimiter
);
688 chunk
= fp
.read(chunk_size
)
690 # End of file reached without finding the delimiter
692 buffer.extend(chunk
);
693 total_read
+= len(chunk
);
694 if delimiter
in buffer:
695 # Delimiter found, calculate where to reset the file pointer
696 index
= buffer.find(delimiter
);
697 # Calculate how many extra bytes were read after the delimiter
698 extra_bytes_read
= len(buffer) - (index
+ delimiter_length
);
699 # Move the file pointer back to just after the delimiter
700 fp
.seek(-extra_bytes_read
, 1);
701 buffer = buffer[:index
];
703 if total_read
>= max_read
:
704 # Stop reading if max limit is reached to prevent excessive memory usage
705 raise MemoryError("Maximum read limit reached without finding the delimiter.");
706 # Check for incomplete UTF-8 sequences at the end of the buffer
707 if len(buffer) > 1 and 128 <= buffer[-1] < 192:
708 # This suggests that the last byte might be the start of a multi-byte character
709 # Try to read one more byte to complete the character
710 extra_byte
= fp
.read(1);
712 buffer.extend(extra_byte
);
714 # No more data available
717 return buffer.decode('UTF-8', errors
='replace');
718 except UnicodeDecodeError:
719 return buffer.decode('UTF-8', errors
='replace');
721 def ReadUntilNullByteAlt(fp
, delimiter
=__file_format_dict__
['format_delimiter'], chunk_size
=1024, max_read
=1024000):
722 return ReadTillNullByteAlt(fp
, delimiter
, chunk_size
, max_read
);
724 def ReadTillNullByte(fp
, delimiter
=__file_format_dict__
['format_delimiter'], max_read
=1024000):
725 curfullbyte
= bytearray();
726 nullbyte
= delimiter
.encode("UTF-8");
727 total_read
= 0; # Track the total number of bytes read
729 curbyte
= fp
.read(1);
730 if curbyte
== nullbyte
or not curbyte
:
732 curfullbyte
.extend(curbyte
);
734 if total_read
>= max_read
:
735 raise MemoryError("Maximum read limit reached without finding the delimiter.");
736 # Decode the full byte array to string once out of the loop
738 return curfullbyte
.decode('UTF-8');
739 except UnicodeDecodeError:
740 # Handle potential partial UTF-8 characters
741 for i
in range(1, 4):
743 return curfullbyte
[:-i
].decode('UTF-8');
744 except UnicodeDecodeError:
746 raise; # Re-raise if decoding fails even after trimming
748 def ReadUntilNullByte(fp
, delimiter
=__file_format_dict__
['format_delimiter'], max_read
=1024000):
749 return ReadTillNullByte(fp
, delimiter
, max_read
);
751 def ReadTillNullByteByNum(fp
, delimiter
=__file_format_dict__
['format_delimiter'], num_delimiters
=1, chunk_size
=1024, max_read
=1024000):
752 delimiter
= delimiter
.encode('UTF-8'); # Ensure the delimiter is in bytes
753 buffer = bytearray();
755 delimiter_length
= len(delimiter
);
757 while len(results
) < num_delimiters
:
758 chunk
= fp
.read(chunk_size
);
760 # End of file reached; decode whatever is collected if it's the last needed part
762 results
.append(buffer.decode('UTF-8', errors
='replace'));
765 total_read
+= len(chunk
);
766 # Check if we have found the delimiter
767 while delimiter
in buffer:
768 index
= buffer.find(delimiter
);
769 # Decode the section before the delimiter
770 results
.append(buffer[:index
].decode('UTF-8', errors
='replace'));
771 # Remove the processed part from the buffer
772 buffer = buffer[index
+ delimiter_length
:];
773 if len(results
) == num_delimiters
:
774 # If reached the required number of delimiters, adjust the file pointer and stop
775 fp
.seek(-len(buffer), 1);
777 if total_read
>= max_read
:
778 # Stop reading if max limit is reached to prevent excessive memory usage
779 raise MemoryError("Maximum read limit reached without finding the delimiter.");
780 # Check for incomplete UTF-8 sequences at the end of the buffer
781 if len(buffer) > 1 and 128 <= buffer[-1] < 192:
782 # This suggests that the last byte might be the start of a multi-byte character
783 # Try to read one more byte to complete the character
784 extra_byte
= fp
.read(1);
786 buffer.extend(extra_byte
);
788 # No more data available
790 # Process remaining buffer if less than the required number of delimiters were found
791 if len(buffer) > 0 and len(results
) < num_delimiters
:
792 results
.append(buffer.decode('UTF-8', errors
='replace'));
795 def ReadUntilNullByteByNum(fp
, delimiter
=__file_format_dict__
['format_delimiter'], num_delimiters
=1, chunk_size
=1024, max_read
=1024000):
796 return ReadTillNullByteByNum(fp
, delimiter
, num_delimiters
, chunk_size
, max_read
);
798 def SeekToEndOfFile(fp
):
802 if(lasttell
==fp
.tell()):
804 lasttell
= fp
.tell();
807 def ReadFileHeaderData(fp
, rounds
=0, delimiter
=__file_format_dict__
['format_delimiter']):
811 while(rocount
<roend
):
812 HeaderOut
.append(ReadTillNullByte(fp
, delimiter
));
813 rocount
= rocount
+ 1;
816 def ReadFileHeaderDataBySize(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
817 headerpresize
= ReadTillNullByte(fp
, delimiter
);
818 headersize
= int(headerpresize
, 16);
821 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
824 roend
= int(len(headercontent
));
825 HeaderOut
= [headerpresize
];
826 while(rocount
<roend
):
827 HeaderOut
.append(headercontent
[rocount
]);
828 rocount
= rocount
+ 1;
831 def ReadFileHeaderDataWoSize(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
832 preheaderdata
= ReadFileHeaderData(fp
, 2, delimiter
);
833 headersize
= int(preheaderdata
[0], 16);
834 headernumfields
= int(preheaderdata
[1], 16);
835 if(headersize
<=0 or headernumfields
<=0):
837 headerdata
= ReadTillNullByteByNum(fp
, delimiter
, headernumfields
);
838 #headerdata = ReadFileHeaderData(fp, headernumfields, delimiter);
839 HeaderOut
= preheaderdata
+ headerdata
;
842 def ReadFileHeaderDataBySizeWithContent(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
843 formatspecs
= FormatSpecsListToDict(formatspecs
);
844 delimiter
= formatspecs
['format_delimiter'];
845 fheaderstart
= fp
.tell();
846 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
847 if(len(HeaderOut
)==0):
849 if(re
.findall("^[.|/]", HeaderOut
[3])):
850 fname
= HeaderOut
[3];
852 fname
= "./"+HeaderOut
[3];
853 fchecksumtype
= HeaderOut
[-3].lower();
854 fcs
= HeaderOut
[-2].lower();
855 fccs
= HeaderOut
[-1].lower();
856 fsize
= int(HeaderOut
[5], 16);
857 fcompression
= HeaderOut
[12];
858 fcsize
= int(HeaderOut
[13], 16);
859 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
860 if(fcs
!=newfcs
and not skipchecksum
):
861 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
862 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
864 fhend
= fp
.tell() - 1;
865 fcontentstart
= fp
.tell();
866 fcontents
= BytesIO();
867 if(fsize
>0 and not listonly
):
868 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
869 fcontents
.write(fp
.read(fsize
));
871 fcontents
.write(fp
.read(fcsize
));
872 elif(fsize
>0 and listonly
):
873 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
877 fcontents
.seek(0, 0);
878 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
879 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
880 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
881 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
883 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
886 fcontents
.seek(0, 0);
888 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
890 fcontentend
= fp
.tell() - 1;
891 HeaderOut
.append(fcontents
);
894 def ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
895 formatspecs
= FormatSpecsListToDict(formatspecs
);
896 delimiter
= formatspecs
['format_delimiter'];
897 fheaderstart
= fp
.tell();
898 if(formatspecs
['new_style']):
899 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
901 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
902 if(len(HeaderOut
)==0):
904 fheadsize
= int(HeaderOut
[0], 16);
905 fnumfields
= int(HeaderOut
[1], 16);
906 ftype
= int(HeaderOut
[2], 16);
907 if(re
.findall("^[.|/]", HeaderOut
[3])):
908 fname
= HeaderOut
[3];
910 fname
= "./"+HeaderOut
[3];
911 fbasedir
= os
.path
.dirname(fname
);
912 flinkname
= HeaderOut
[4];
913 fsize
= int(HeaderOut
[5], 16);
914 fatime
= int(HeaderOut
[6], 16);
915 fmtime
= int(HeaderOut
[7], 16);
916 fctime
= int(HeaderOut
[8], 16);
917 fbtime
= int(HeaderOut
[9], 16);
918 fmode
= int(HeaderOut
[10], 16);
919 fchmode
= stat
.S_IMODE(fmode
);
920 ftypemod
= stat
.S_IFMT(fmode
);
921 fwinattributes
= int(HeaderOut
[11], 16);
922 fcompression
= HeaderOut
[12];
923 fcsize
= int(HeaderOut
[13], 16);
924 fuid
= int(HeaderOut
[14], 16);
925 funame
= HeaderOut
[15];
926 fgid
= int(HeaderOut
[16], 16);
927 fgname
= HeaderOut
[17];
928 fid
= int(HeaderOut
[18], 16);
929 finode
= int(HeaderOut
[19], 16);
930 flinkcount
= int(HeaderOut
[20], 16);
931 fdev_minor
= int(HeaderOut
[21], 16);
932 fdev_major
= int(HeaderOut
[22], 16);
933 frdev_minor
= int(HeaderOut
[23], 16);
934 frdev_major
= int(HeaderOut
[24], 16);
935 fextrasize
= int(HeaderOut
[25], 16);
936 fextrafields
= int(HeaderOut
[26], 16);
937 extrafieldslist
= [];
939 extraend
= extrastart
+ fextrafields
;
940 extrafieldslist
= [];
941 if(extrastart
<extraend
):
942 extrafieldslist
.append(HeaderOut
[extrastart
]);
943 extrastart
= extrastart
+ 1;
944 fchecksumtype
= HeaderOut
[extrastart
].lower();
945 fcs
= HeaderOut
[extrastart
+ 1].lower();
946 fccs
= HeaderOut
[extrastart
+ 2].lower();
947 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
948 if(fcs
!=newfcs
and not skipchecksum
):
949 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
950 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
952 fhend
= fp
.tell() - 1;
953 fcontentstart
= fp
.tell();
954 fcontents
= BytesIO();
955 pyhascontents
= False;
956 if(fsize
>0 and not listonly
):
957 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
958 fcontents
.write(fp
.read(fsize
));
960 fcontents
.write(fp
.read(fcsize
));
961 pyhascontents
= True;
962 elif(fsize
>0 and listonly
):
963 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
967 pyhascontents
= False;
968 fcontents
.seek(0, 0);
969 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
970 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
971 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
972 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
974 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
977 fcontents
.seek(0, 0);
979 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
980 fcontents
.seek(0, 0);
981 fccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
983 fcontentend
= fp
.tell() - 1;
984 fcontents
.seek(0, 0);
985 catlist
= {'fheadersize': fheadsize
, 'fhstart': fheaderstart
, 'fhend': fhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fwinattributes': fwinattributes
, 'fcompression': fcompression
, 'fcsize': fcsize
, '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': fchecksumtype
, 'fnumfields': fnumfields
+ 2, 'frawheader': HeaderOut
, 'fextrafields': fextrafields
, 'fextrafieldsize': fextrasize
, 'fextralist': extrafieldslist
, 'fheaderchecksum': fcs
, 'fcontentchecksum': fccs
, 'fhascontents': pyhascontents
, 'fcontentstart': fcontentstart
, 'fcontentend': fcontentend
, 'fcontents': fcontents
};
988 def ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
989 formatspecs
= FormatSpecsListToDict(formatspecs
);
990 delimiter
= formatspecs
['format_delimiter'];
991 fheaderstart
= fp
.tell();
992 if(formatspecs
['new_style']):
993 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
995 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
996 if(len(HeaderOut
)==0):
998 fheadsize
= int(HeaderOut
[0], 16);
999 fnumfields
= int(HeaderOut
[1], 16);
1000 ftype
= int(HeaderOut
[2], 16);
1001 if(re
.findall("^[.|/]", HeaderOut
[3])):
1002 fname
= HeaderOut
[3];
1004 fname
= "./"+HeaderOut
[3];
1005 fbasedir
= os
.path
.dirname(fname
);
1006 flinkname
= HeaderOut
[4];
1007 fsize
= int(HeaderOut
[5], 16);
1008 fatime
= int(HeaderOut
[6], 16);
1009 fmtime
= int(HeaderOut
[7], 16);
1010 fctime
= int(HeaderOut
[8], 16);
1011 fbtime
= int(HeaderOut
[9], 16);
1012 fmode
= int(HeaderOut
[10], 16);
1013 fchmode
= stat
.S_IMODE(fmode
);
1014 ftypemod
= stat
.S_IFMT(fmode
);
1015 fwinattributes
= int(HeaderOut
[11], 16);
1016 fcompression
= HeaderOut
[12];
1017 fcsize
= int(HeaderOut
[13], 16);
1018 fuid
= int(HeaderOut
[14], 16);
1019 funame
= HeaderOut
[15];
1020 fgid
= int(HeaderOut
[16], 16);
1021 fgname
= HeaderOut
[17];
1022 fid
= int(HeaderOut
[18], 16);
1023 finode
= int(HeaderOut
[19], 16);
1024 flinkcount
= int(HeaderOut
[20], 16);
1025 fdev_minor
= int(HeaderOut
[21], 16);
1026 fdev_major
= int(HeaderOut
[22], 16);
1027 frdev_minor
= int(HeaderOut
[23], 16);
1028 frdev_major
= int(HeaderOut
[24], 16);
1029 fextrasize
= int(HeaderOut
[25], 16);
1030 fextrafields
= int(HeaderOut
[26], 16);
1031 extrafieldslist
= [];
1033 extraend
= extrastart
+ fextrafields
;
1034 extrafieldslist
= [];
1035 if(extrastart
<extraend
):
1036 extrafieldslist
.append(HeaderOut
[extrastart
]);
1037 extrastart
= extrastart
+ 1;
1038 fchecksumtype
= HeaderOut
[extrastart
].lower();
1039 fcs
= HeaderOut
[extrastart
+ 1].lower();
1040 fccs
= HeaderOut
[extrastart
+ 2].lower();
1041 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
1042 if(fcs
!=newfcs
and not skipchecksum
):
1043 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
1044 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
1046 fhend
= fp
.tell() - 1;
1047 fcontentstart
= fp
.tell();
1048 fcontents
= BytesIO();
1049 pyhascontents
= False;
1050 if(fsize
>0 and not listonly
):
1051 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1052 fcontents
.write(fp
.read(fsize
));
1054 fcontents
.write(fp
.read(fcsize
));
1055 pyhascontents
= True;
1056 elif(fsize
>0 and listonly
):
1057 if(fcompression
=="none" or fcompression
=="" or fcompression
=="atuo"):
1061 pyhascontents
= False;
1062 fcontents
.seek(0, 0);
1063 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
1064 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
1065 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
1066 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
1068 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1071 fcontents
.seek(0, 0);
1073 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
1074 fcontents
.seek(0, 0);
1076 fcontentend
= fp
.tell() - 1;
1077 catlist
= [ftype
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fcompression
, fcsize
, fuid
, funame
, fgid
, fgname
, fid
, finode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrafieldslist
, fchecksumtype
, fcontents
];
1080 def ReadFileDataBySizeWithContent(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1081 formatspecs
= FormatSpecsListToDict(formatspecs
);
1082 delimiter
= formatspecs
['format_delimiter'];
1086 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1089 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1090 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1091 if(not headercheck
and not skipchecksum
):
1092 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1093 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1095 fnumfiles
= int(catheader
[1], 16);
1098 while(countnum
< fnumfiles
):
1099 HeaderOut
= ReadFileHeaderDataBySizeWithContent(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
)
1100 if(len(HeaderOut
)==0):
1102 flist
.append(HeaderOut
);
1103 countnum
= countnum
+ 1;
1106 def ReadFileDataBySizeWithContentToArray(fp
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1107 formatspecs
= FormatSpecsListToDict(formatspecs
);
1108 delimiter
= formatspecs
['format_delimiter'];
1112 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1115 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1116 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1117 if(not headercheck
and not skipchecksum
):
1118 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1119 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1121 catstring
= catheader
[0];
1122 catversion
= re
.findall(r
"([\d]+)", catstring
);
1123 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
1124 fprenumfiles
= catheader
[1];
1125 fnumfiles
= int(fprenumfiles
, 16);
1126 fprechecksumtype
= catheader
[2];
1127 fprechecksum
= catheader
[3];
1128 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
1129 if(seekstart
<0 and seekstart
>fnumfiles
):
1131 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
1132 seekend
= fnumfiles
;
1133 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
1134 seekend
= fnumfiles
- abs(seekend
);
1137 while(il
< seekstart
):
1138 prefhstart
= fp
.tell();
1139 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
['format_delimiter']);
1140 if(len(preheaderdata
)==0):
1142 prefsize
= int(preheaderdata
[5], 16);
1143 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-3].lower(), True, formatspecs
);
1144 prefcs
= preheaderdata
[-2];
1145 if(prefcs
!=prenewfcs
and not skipchecksum
):
1146 VVerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
1147 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
1149 valid_archive
= False;
1150 invalid_archive
= True;
1151 prefhend
= fp
.tell() - 1;
1152 prefcontentstart
= fp
.tell();
1153 prefcontents
= BytesIO();
1154 pyhascontents
= False;
1156 prefcontents
.write(fp
.read(prefsize
));
1157 prefcontents
.seek(0, 0);
1158 prenewfccs
= GetFileChecksum(prefcontents
.read(), preheaderdata
[-3].lower(), False, formatspecs
);
1159 prefccs
= preheaderdata
[-1];
1160 pyhascontents
= True;
1161 if(prefccs
!=prenewfccs
and not skipchecksum
):
1162 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
1163 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
1168 countnum
= seekstart
;
1169 while(countnum
< seekend
):
1170 catlist
['ffilelist'].update({realidnum
: {'fid': realidnum
, 'fidalt': realidnum
}});
1171 HeaderOut
= ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1172 if(len(HeaderOut
)==0):
1174 catlist
['ffilelist'][realidnum
].update(HeaderOut
);
1175 countnum
= countnum
+ 1;
1176 realidnum
= realidnum
+ 1;
1179 def ReadFileDataBySizeWithContentToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1180 formatspecs
= FormatSpecsListToDict(formatspecs
);
1181 if(isinstance(infile
, dict)):
1182 listcatfiles
= infile
;
1184 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
1186 listcatfiles
= ReadFileDataBySizeWithContentToArray(infile
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1187 if(not listcatfiles
):
1189 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': {}}}};
1190 lenlist
= len(listcatfiles
['ffilelist']);
1192 lcfx
= int(listcatfiles
['fnumfiles']);
1193 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
1194 lcfx
= int(lenlist
);
1196 lcfx
= int(listcatfiles
['fnumfiles']);
1198 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
1199 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
1200 catarray
['filetoid'].update(filetoidarray
);
1201 catarray
['idtofile'].update(idtofilearray
);
1202 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
1203 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
1204 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
1205 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
1206 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
1207 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
1208 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1209 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1210 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
1211 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1212 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1213 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1214 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1215 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
1216 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
1217 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
1218 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1219 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1220 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
1221 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
1222 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
1223 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1224 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1225 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
1226 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
1227 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
1228 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
1229 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1230 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1231 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1232 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1236 def ReadFileDataBySizeWithContentToList(fp
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1237 formatspecs
= FormatSpecsListToDict(formatspecs
);
1238 delimiter
= formatspecs
['format_delimiter'];
1242 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1245 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1246 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1247 if(not headercheck
and not skipchecksum
):
1248 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1249 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1251 catstring
= catheader
[0];
1252 catversion
= re
.findall(r
"([\d]+)", catstring
);
1253 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
1254 fprenumfiles
= catheader
[1];
1255 fnumfiles
= int(fprenumfiles
, 16);
1256 fprechecksumtype
= catheader
[2];
1257 fprechecksum
= catheader
[3];
1259 if(seekstart
<0 and seekstart
>fnumfiles
):
1261 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
1262 seekend
= fnumfiles
;
1263 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
1264 seekend
= fnumfiles
- abs(seekend
);
1267 while(il
< seekstart
):
1268 prefhstart
= fp
.tell();
1269 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
['format_delimiter']);
1270 if(len(preheaderdata
)==0):
1272 prefsize
= int(preheaderdata
[5], 16);
1273 prefcompression
= preheaderdata
[12];
1274 prefcsize
= int(preheaderdata
[13], 16);
1275 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-3].lower(), True, formatspecs
);
1276 prefcs
= preheaderdata
[-2];
1277 if(prefcs
!=prenewfcs
and not skipchecksum
):
1278 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
1279 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
1281 valid_archive
= False;
1282 invalid_archive
= True;
1283 prefhend
= fp
.tell() - 1;
1284 prefcontentstart
= fp
.tell();
1286 pyhascontents
= False;
1288 if(prefcompression
=="none" or prefcompression
=="" or prefcompression
=="auto"):
1289 prefcontents
= catfp
.read(prefsize
);
1291 prefcontents
= catfp
.read(prefcsize
);
1292 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
1293 prefccs
= preheaderdata
[-1];
1294 pyhascontents
= True;
1295 if(prefccs
!=prenewfccs
and not skipchecksum
):
1296 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
1297 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
1302 countnum
= seekstart
;
1303 while(countnum
< seekend
):
1304 HeaderOut
= ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1305 if(len(HeaderOut
)==0):
1307 catlist
.append(HeaderOut
);
1308 countnum
= countnum
+ 1;
1309 realidnum
= realidnum
+ 1;
1312 def ReadInFileBySizeWithContentToArray(infile
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1313 formatspecs
= FormatSpecsListToDict(formatspecs
);
1314 delimiter
= formatspecs
['format_delimiter'];
1315 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1318 fp
= UncompressArchiveFile(fp
, formatspecs
);
1319 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1320 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1327 if(hasattr(sys
.stdin
, "buffer")):
1328 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1330 shutil
.copyfileobj(sys
.stdin
, fp
);
1332 fp
= UncompressArchiveFile(fp
, formatspecs
);
1336 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1337 fp
= download_file_from_internet_file(infile
);
1338 fp
= UncompressArchiveFile(fp
, formatspecs
);
1344 infile
= RemoveWindowsPath(infile
);
1345 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
1346 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1348 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1349 if(not compresscheck
):
1350 fextname
= os
.path
.splitext(infile
)[1];
1351 if(fextname
==".gz"):
1352 compresscheck
= "gzip";
1353 elif(fextname
==".bz2"):
1354 compresscheck
= "bzip2";
1355 elif(fextname
==".zst"):
1356 compresscheck
= "zstd";
1357 elif(fextname
==".lz4" or fextname
==".clz4"):
1358 compresscheck
= "lz4";
1359 elif(fextname
==".lzo" or fextname
==".lzop"):
1360 compresscheck
= "lzo";
1361 elif(fextname
==".lzma" or fextname
==".xz"):
1362 compresscheck
= "lzma";
1365 if(not compresscheck
):
1367 fp
= UncompressFile(infile
, formatspecs
, "rb");
1368 return ReadFileDataBySizeWithContentToArray(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1370 def ReadInFileBySizeWithContentToList(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1371 formatspecs
= FormatSpecsListToDict(formatspecs
);
1372 delimiter
= formatspecs
['format_delimiter'];
1373 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1376 fp
= UncompressArchiveFile(fp
, formatspecs
);
1377 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1378 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1385 if(hasattr(sys
.stdin
, "buffer")):
1386 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1388 shutil
.copyfileobj(sys
.stdin
, fp
);
1390 fp
= UncompressArchiveFile(fp
, formatspecs
);
1394 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1395 fp
= download_file_from_internet_file(infile
);
1396 fp
= UncompressArchiveFile(fp
, formatspecs
);
1402 infile
= RemoveWindowsPath(infile
);
1403 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
1404 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1406 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1407 if(not compresscheck
):
1408 fextname
= os
.path
.splitext(infile
)[1];
1409 if(fextname
==".gz"):
1410 compresscheck
= "gzip";
1411 elif(fextname
==".bz2"):
1412 compresscheck
= "bzip2";
1413 elif(fextname
==".zst"):
1414 compresscheck
= "zstd";
1415 elif(fextname
==".lz4" or fextname
==".clz4"):
1416 compresscheck
= "lz4";
1417 elif(fextname
==".lzo" or fextname
==".lzop"):
1418 compresscheck
= "lzo";
1419 elif(fextname
==".lzma" or fextname
==".xz"):
1420 compresscheck
= "lzma";
1423 if(not compresscheck
):
1425 fp
= UncompressFile(infile
, formatspecs
, "rb");
1426 return ReadFileDataBySizeWithContentToList(fp
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1428 def ReadInFileBySizeWithContentToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1429 formatspecs
= FormatSpecsListToDict(formatspecs
);
1430 if(isinstance(infile
, dict)):
1431 listcatfiles
= infile
;
1433 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
1434 infile
= RemoveWindowsPath(infile
);
1435 listcatfiles
= ReadInFileBySizeWithContentToArray(infile
, listonly
, skipchecksum
, formatspecs
);
1436 if(not listcatfiles
):
1438 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': {}}}};
1439 lenlist
= len(listcatfiles
['ffilelist']);
1441 lcfx
= int(listcatfiles
['fnumfiles']);
1442 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
1443 lcfx
= int(lenlist
);
1445 lcfx
= int(listcatfiles
['fnumfiles']);
1447 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
1448 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
1449 catarray
['filetoid'].update(filetoidarray
);
1450 catarray
['idtofile'].update(idtofilearray
);
1451 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
1452 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
1453 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
1454 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
1455 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
1456 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
1457 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1458 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1459 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
1460 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1461 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1462 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1463 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1464 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
1465 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
1466 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
1467 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1468 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1469 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
1470 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
1471 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
1472 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1473 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1474 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
1475 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
1476 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
1477 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
1478 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1479 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1480 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1481 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1485 def AppendNullByte(indata
, delimiter
=__file_format_dict__
['format_delimiter']):
1486 outdata
= str(indata
) + delimiter
;
1489 def AppendNullBytes(indata
=[], delimiter
=__file_format_dict__
['format_delimiter']):
1494 outdata
= outdata
+ AppendNullByte(indata
[inum
], delimiter
);
1498 def AppendFileHeader(fp
, numfiles
, checksumtype
="crc32", formatspecs
=__file_format_dict__
):
1499 formatspecs
= FormatSpecsListToDict(formatspecs
);
1500 delimiter
= formatspecs
['format_delimiter'];
1501 catver
= formatspecs
['format_ver'];
1502 fileheaderver
= str(int(catver
.replace(".", "")));
1503 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
1504 fp
.write(fileheader
.encode('UTF-8'));
1505 fnumfiles
= format(int(numfiles
), 'x').lower();
1506 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
['format_delimiter']);
1507 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
1508 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
1509 fp
.write(fnumfilesa
.encode('UTF-8'));
1512 os
.fsync(fp
.fileno());
1513 except io
.UnsupportedOperation
:
1515 except AttributeError:
1517 except OSError as e
:
1521 def MakeEmptyFilePointer(fp
, checksumtype
="crc32", formatspecs
=__file_format_dict__
):
1522 formatspecs
= FormatSpecsListToDict(formatspecs
);
1523 AppendFileHeader(fp
, 0, checksumtype
, formatspecs
);
1526 def MakeEmptyFile(outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", formatspecs
=__file_format_dict__
, returnfp
=False):
1527 formatspecs
= FormatSpecsListToDict(formatspecs
);
1528 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1529 if(os
.path
.exists(outfile
)):
1532 except OSError as e
:
1536 catfpfp
= BytesIO();
1537 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1539 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1542 fbasename
= os
.path
.splitext(outfile
)[0];
1543 fextname
= os
.path
.splitext(outfile
)[1];
1544 catfp
= CompressOpenFile(outfile
, True, compressionlevel
);
1545 catfp
= AppendFileHeader(catfp
, 0, checksumtype
, formatspecs
);
1546 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1547 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1550 os
.fsync(catfp
.fileno());
1551 except io
.UnsupportedOperation
:
1553 except AttributeError:
1555 except OSError as e
:
1559 if(hasattr(sys
.stdout
, "buffer")):
1560 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1562 shutil
.copyfileobj(catfp
, sys
.stdout
);
1563 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1564 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1566 upload_file_to_internet_file(catfp
, outfile
);
1574 def AppendFileHeaderWithContent(fp
, filevalues
=[], extradata
=[], filecontent
="", checksumtype
="crc32", formatspecs
=__file_format_dict__
):
1575 formatspecs
= FormatSpecsListToDict(formatspecs
);
1576 extrafields
= format(len(extradata
), 'x').lower();
1577 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
1578 if(len(extradata
)>0):
1579 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
1580 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1581 catoutlen
= len(filevalues
) + len(extradata
) + 5;
1582 catoutlenhex
= format(catoutlen
, 'x').lower();
1583 catoutlist
= filevalues
;
1584 catoutlist
.insert(0, catoutlenhex
);
1585 catoutlist
.append(extrasizelen
);
1586 catoutlist
.append(extrafields
);
1587 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
1588 if(len(extradata
)>0):
1589 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
1590 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
1591 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1592 catfilecontentcshex
= GetFileChecksum(filecontent
, checksumtype
, False, formatspecs
);
1593 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
1594 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
1595 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
1596 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1597 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
1598 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1599 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
1600 catfileout
= catfileoutstrecd
+ filecontent
+ nullstrecd
;
1601 fp
.write(catfileout
);
1604 os
.fsync(fp
.fileno());
1605 except io
.UnsupportedOperation
:
1607 except AttributeError:
1609 except OSError as e
:
1613 def AppendFilesWithContent(infiles
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
1614 formatspecs
= FormatSpecsListToDict(formatspecs
);
1615 advancedlist
= formatspecs
['use_advanced_list'];
1616 altinode
= formatspecs
['use_alt_inode'];
1618 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1620 for line
in sys
.stdin
:
1621 infilelist
.append(line
.strip());
1622 infilelist
= list(filter(None, infilelist
));
1623 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
1624 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
1626 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
1627 for line
in finfile
:
1628 infilelist
.append(line
.strip());
1629 infilelist
= list(filter(None, infilelist
));
1631 if(isinstance(infiles
, (list, tuple, ))):
1632 infilelist
= list(filter(None, infiles
));
1633 elif(isinstance(infiles
, (str, ))):
1634 infilelist
= list(filter(None, [infiles
]));
1636 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
1638 GetDirList
= ListDir(infilelist
, followlink
, False);
1646 inodetocatinode
= {};
1647 numfiles
= int(len(GetDirList
));
1648 fnumfiles
= format(numfiles
, 'x').lower();
1649 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1650 for curfname
in GetDirList
:
1651 if(re
.findall("^[.|/]", curfname
)):
1654 fname
= "./"+curfname
;
1656 VerbosePrintOut(fname
);
1657 if(not followlink
or followlink
is None):
1658 fstatinfo
= os
.lstat(fname
);
1660 fstatinfo
= os
.stat(fname
);
1661 fpremode
= fstatinfo
.st_mode
;
1662 finode
= fstatinfo
.st_ino
;
1663 flinkcount
= fstatinfo
.st_nlink
;
1665 if(stat
.S_ISREG(fpremode
)):
1667 elif(stat
.S_ISLNK(fpremode
)):
1669 elif(stat
.S_ISCHR(fpremode
)):
1671 elif(stat
.S_ISBLK(fpremode
)):
1673 elif(stat
.S_ISDIR(fpremode
)):
1675 elif(stat
.S_ISFIFO(fpremode
)):
1677 elif(stat
.S_ISSOCK(fpremode
)):
1679 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
1681 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
1683 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
1688 fcurfid
= format(int(curfid
), 'x').lower();
1689 if(not followlink
and finode
!=0):
1691 if(finode
in inodelist
):
1693 flinkname
= inodetofile
[finode
];
1695 fcurinode
= format(int(finode
), 'x').lower();
1697 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
1698 if(finode
not in inodelist
):
1699 inodelist
.append(finode
);
1700 inodetofile
.update({finode
: fname
});
1701 inodetocatinode
.update({finode
: curinode
});
1703 fcurinode
= format(int(finode
), 'x').lower();
1705 fcurinode
= format(int(curinode
), 'x').lower();
1706 curinode
= curinode
+ 1;
1708 fcurinode
= format(int(curinode
), 'x').lower();
1709 curinode
= curinode
+ 1;
1710 curfid
= curfid
+ 1;
1712 flinkname
= os
.readlink(fname
);
1713 fdev
= fstatinfo
.st_dev
;
1714 getfdev
= GetDevMajorMinor(fdev
);
1715 fdev_minor
= getfdev
[0];
1716 fdev_major
= getfdev
[1];
1717 frdev
= fstatinfo
.st_dev
;
1718 if(hasattr(fstatinfo
, "st_rdev")):
1719 frdev
= fstatinfo
.st_rdev
;
1721 frdev
= fstatinfo
.st_dev
;
1722 getfrdev
= GetDevMajorMinor(frdev
);
1723 frdev_minor
= getfrdev
[0];
1724 frdev_major
= getfrdev
[1];
1725 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1726 fsize
= format(int("0"), 'x').lower();
1727 elif(ftype
==0 or ftype
==7):
1728 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
1730 fsize
= format(int(fstatinfo
.st_size
)).lower();
1731 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
1732 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
1733 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1734 if(hasattr(fstatinfo
, "st_birthtime")):
1735 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
1737 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1738 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
1739 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
1740 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
1741 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
1742 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
1747 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
1748 funame
= userinfo
.pw_name
;
1757 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
1758 fgname
= groupinfo
.gr_name
;
1763 fdev_minor
= format(int(fdev_minor
), 'x').lower();
1764 fdev_major
= format(int(fdev_major
), 'x').lower();
1765 frdev_minor
= format(int(frdev_minor
), 'x').lower();
1766 frdev_major
= format(int(frdev_major
), 'x').lower();
1767 finode
= format(int(finode
), 'x').lower();
1768 flinkcount
= format(int(flinkcount
), 'x').lower();
1769 if(hasattr(fstatinfo
, "st_file_attributes")):
1770 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
1772 fwinattributes
= format(int(0), 'x').lower();
1774 fcsize
= format(int(0), 'x').lower();
1775 fcontents
= BytesIO();
1777 if(ftype
==0 or ftype
==7):
1778 with
open(fname
, "rb") as fpc
:
1779 shutil
.copyfileobj(fpc
, fcontents
);
1780 if(not compresswholefile
):
1781 fcontents
.seek(0, 2);
1782 ucfsize
= fcontents
.tell();
1783 fcontents
.seek(0, 0);
1784 if(compression
=="auto"):
1785 ilsize
= len(compressionlistalt
);
1788 while(ilmin
< ilsize
):
1789 cfcontents
= BytesIO();
1790 shutil
.copyfileobj(fcontents
, cfcontents
);
1791 fcontents
.seek(0, 0);
1792 cfcontents
.seek(0, 0);
1793 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
1795 cfcontents
.seek(0, 2);
1796 ilcsize
.append(cfcontents
.tell());
1800 ilcsize
.append(sys
.maxint
);
1801 except AttributeError:
1802 ilcsize
.append(sys
.maxsize
);
1804 ilcmin
= ilcsize
.index(min(ilcsize
));
1805 compression
= compressionlistalt
[ilcmin
];
1806 fcontents
.seek(0, 0);
1807 cfcontents
= BytesIO();
1808 shutil
.copyfileobj(fcontents
, cfcontents
);
1809 cfcontents
.seek(0, 0);
1810 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
1811 cfcontents
.seek(0, 2);
1812 cfsize
= cfcontents
.tell();
1813 if(ucfsize
> cfsize
):
1814 fcsize
= format(int(cfsize
), 'x').lower();
1815 fcompression
= compression
;
1817 fcontents
= cfcontents
;
1818 if(followlink
and (ftype
==1 or ftype
==2)):
1819 flstatinfo
= os
.stat(flinkname
);
1820 with
open(flinkname
, "rb") as fpc
:
1821 shutil
.copyfileobj(fpc
, fcontents
);
1822 if(not compresswholefile
):
1823 fcontents
.seek(0, 2);
1824 ucfsize
= fcontents
.tell();
1825 fcontents
.seek(0, 0);
1826 if(compression
=="auto"):
1827 ilsize
= len(compressionlistalt
);
1830 while(ilmin
< ilsize
):
1831 cfcontents
= BytesIO();
1832 shutil
.copyfileobj(fcontents
, cfcontents
);
1833 fcontents
.seek(0, 0);
1834 cfcontents
.seek(0, 0);
1835 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
1837 cfcontents
.seek(0, 2);
1838 ilcsize
.append(cfcontents
.tell());
1842 ilcsize
.append(sys
.maxint
);
1843 except AttributeError:
1844 ilcsize
.append(sys
.maxsize
);
1846 ilcmin
= ilcsize
.index(min(ilcsize
));
1847 compression
= compressionlistalt
[ilcmin
];
1848 fcontents
.seek(0, 0);
1849 cfcontents
= BytesIO();
1850 shutil
.copyfileobj(fcontents
, cfcontents
);
1851 cfcontents
.seek(0, 0);
1852 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
1853 cfcontents
.seek(0, 2);
1854 cfsize
= cfcontents
.tell();
1855 if(ucfsize
> cfsize
):
1856 fcsize
= format(int(cfsize
), 'x').lower();
1857 fcompression
= compression
;
1859 fcontents
= cfcontents
;
1860 if(fcompression
=="none"):
1862 fcontents
.seek(0, 0);
1863 ftypehex
= format(ftype
, 'x').lower();
1864 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fcompression
, fcsize
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
1865 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
1867 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
1871 def AppendListsWithContent(inlist
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
1872 formatspecs
= FormatSpecsListToDict(formatspecs
);
1874 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1875 GetDirList
= inlist
;
1883 inodetocatinode
= {};
1884 numfiles
= int(len(GetDirList
));
1885 fnumfiles
= format(numfiles
, 'x').lower();
1886 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1887 for curfname
in GetDirList
:
1888 ftype
= format(curfname
[0], 'x').lower();
1889 if(re
.findall("^[.|/]", curfname
[1])):
1890 fname
= curfname
[1];
1892 fname
= "./"+curfname
[1];
1893 fbasedir
= os
.path
.dirname(fname
);
1894 flinkname
= curfname
[2];
1895 fsize
= format(curfname
[3], 'x').lower();
1896 fatime
= format(curfname
[4], 'x').lower();
1897 fmtime
= format(curfname
[5], 'x').lower();
1898 fctime
= format(curfname
[6], 'x').lower();
1899 fbtime
= format(curfname
[7], 'x').lower();
1900 fmode
= format(curfname
[8], 'x').lower();
1901 fwinattributes
= format(curfname
[9], 'x').lower();
1902 fcompression
= curfname
[10];
1903 fcsize
= format(curfname
[11], 'x').lower();
1904 fuid
= format(curfname
[12], 'x').lower();
1905 funame
= curfname
[13];
1906 fgid
= format(curfname
[14], 'x').lower();
1907 fgname
= curfname
[15];
1908 fid
= format(curfname
[16], 'x').lower();
1909 finode
= format(curfname
[17], 'x').lower();
1910 flinkcount
= format(curfname
[18], 'x').lower();
1911 fdev_minor
= format(curfname
[19], 'x').lower();
1912 fdev_major
= format(curfname
[20], 'x').lower();
1913 frdev_minor
= format(curfname
[21], 'x').lower();
1914 frdev_major
= format(curfname
[22], 'x').lower();
1915 extradata
= curfname
[23];
1916 fchecksumtype
= curfname
[24];
1917 fcontents
= curfname
[25];
1918 catoutlist
= [ftype
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fcompression
, fcsize
, fuid
, funame
, fgid
, fgname
, fid
, finode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
1919 fcontents
.seek(0, 0);
1920 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
1922 fp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
1925 def AppendInFileWithContent(infile
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
1926 formatspecs
= FormatSpecsListToDict(formatspecs
);
1927 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, True, False, formatspecs
);
1928 return AppendListsWithContent(inlist
, fp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1930 def AppendFilesWithContentToOutFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
1931 formatspecs
= FormatSpecsListToDict(formatspecs
);
1932 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1933 if(os
.path
.exists(outfile
)):
1936 except OSError as e
:
1940 catfpfp
= BytesIO();
1941 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1943 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1946 fbasename
= os
.path
.splitext(outfile
)[0];
1947 fextname
= os
.path
.splitext(outfile
)[1];
1948 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
1949 catfp
= AppendFilesWithContent(infiles
, catfp
, dirlistfromtxt
, filevalues
, extradata
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
);
1950 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1951 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1954 os
.fsync(catfp
.fileno());
1955 except io
.UnsupportedOperation
:
1957 except AttributeError:
1959 except OSError as e
:
1963 if(hasattr(sys
.stdout
, "buffer")):
1964 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1966 shutil
.copyfileobj(catfp
, sys
.stdout
);
1967 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1968 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1970 upload_file_to_internet_file(catfp
, outfile
);
1978 def AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
1979 formatspecs
= FormatSpecsListToDict(formatspecs
);
1980 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1981 if(os
.path
.exists(outfile
)):
1984 except OSError as e
:
1988 catfpfp
= BytesIO();
1989 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1991 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1994 fbasename
= os
.path
.splitext(outfile
)[0];
1995 fextname
= os
.path
.splitext(outfile
)[1];
1996 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
1997 catfp
= AppendListsWithContent(inlist
, catfp
, dirlistfromtxt
, filevalues
, extradata
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
);
1998 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1999 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2002 os
.fsync(catfp
.fileno());
2003 except io
.UnsupportedOperation
:
2005 except AttributeError:
2007 except OSError as e
:
2011 if(hasattr(sys
.stdout
, "buffer")):
2012 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2014 shutil
.copyfileobj(catfp
, sys
.stdout
);
2015 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2016 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2018 upload_file_to_internet_file(catfp
, outfile
);
2026 def AppendInFileWithContentToOutFile(infile
, outfile
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
2027 formatspecs
= FormatSpecsListToDict(formatspecs
);
2028 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, True, False, formatspecs
);
2029 return AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
, returnfp
);
2031 def PrintPermissionString(fchmode
, ftype
):
2032 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' } };
2034 for fmodval
in str(oct(fchmode
))[-3:]:
2035 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
2036 if(ftype
==0 or ftype
==7):
2037 permissionstr
= "-" + permissionstr
;
2039 permissionstr
= "h" + permissionstr
;
2041 permissionstr
= "l" + permissionstr
;
2043 permissionstr
= "c" + permissionstr
;
2045 permissionstr
= "b" + permissionstr
;
2047 permissionstr
= "d" + permissionstr
;
2049 permissionstr
= "f" + permissionstr
;
2051 permissionstr
= "D" + permissionstr
;
2053 permissionstr
= "p" + permissionstr
;
2055 permissionstr
= "w" + permissionstr
;
2057 permissionoutstr
= stat
.filemode(fchmode
);
2058 except AttributeError:
2059 permissionoutstr
= permissionstr
;
2061 permissionoutstr
= permissionstr
;
2062 return permissionoutstr
;
2064 def PrintPermissionStringAlt(fchmode
, ftype
):
2066 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
2067 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
2069 # Translate file mode into permission string
2070 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
2071 # Append file type indicator
2073 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
2074 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
2076 file_type
= type_indicators
.get(ftype
, '-');
2077 permissionstr
= file_type
+ permissionstr
;
2079 permissionoutstr
= stat
.filemode(fchmode
);
2080 except AttributeError:
2081 permissionoutstr
= permissionstr
;
2082 return permissionoutstr
;
2084 def CheckCompressionType(infile
, formatspecs
=__file_format_dict__
, closefp
=True):
2085 formatspecs
= FormatSpecsListToDict(formatspecs
);
2086 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2090 catfp
= open(infile
, "rb");
2091 except FileNotFoundError
:
2094 prefp
= catfp
.read(2);
2096 if(prefp
==binascii
.unhexlify("1f8b")):
2099 prefp
= catfp
.read(3);
2100 if(prefp
==binascii
.unhexlify("425a68")):
2102 if(prefp
==binascii
.unhexlify("5d0000")):
2105 prefp
= catfp
.read(4);
2106 if(prefp
==binascii
.unhexlify("28b52ffd")):
2108 if(prefp
==binascii
.unhexlify("04224d18")):
2110 if(prefp
==binascii
.unhexlify("504B0304")):
2111 filetype
= "zipfile";
2113 prefp
= catfp
.read(5);
2114 if(prefp
==binascii
.unhexlify("7573746172")):
2115 filetype
= "tarfile";
2117 prefp
= catfp
.read(6);
2118 if(prefp
==binascii
.unhexlify("fd377a585a00")):
2120 if(prefp
==binascii
.unhexlify("377abcaf271c")):
2121 filetype
= "7zipfile";
2123 prefp
= catfp
.read(7);
2124 if(prefp
==binascii
.unhexlify("526172211a0700")):
2125 filetype
= "rarfile";
2126 if(prefp
==binascii
.unhexlify("43617446696c65")):
2127 filetype
= "catfile";
2129 prefp
= catfp
.read(8);
2130 if(prefp
==binascii
.unhexlify("526172211a070100")):
2131 filetype
= "rarfile";
2133 prefp
= catfp
.read(formatspecs
['format_len']);
2134 if(prefp
==binascii
.unhexlify(formatspecs
['format_hex'])):
2135 filetype
= formatspecs
['format_lower'];
2137 prefp
= catfp
.read(9);
2138 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
2141 prefp
= catfp
.read(10);
2142 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2143 filetype
= "tarfile";
2145 if(filetype
=="gzip" or filetype
=="bzip2" or filetype
=="lzma" or filetype
=="zstd" or filetype
=="lz4"):
2146 if(TarFileCheck(catfp
)):
2147 filetype
= "tarfile";
2149 if(TarFileCheck(catfp
)):
2150 filetype
= "tarfile";
2151 elif(zipfile
.is_zipfile(catfp
)):
2152 filetype
= "zipfile";
2153 elif(rarfile
.is_rarfile(catfp
) or rarfile
.is_rarfile_sfx(catfp
)):
2154 filetype
= "rarile";
2162 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_dict__
, closefp
=True):
2163 formatspecs
= FormatSpecsListToDict(formatspecs
);
2165 instringsfile
= BytesIO(instring
);
2167 instringsfile
= BytesIO(instring
.encode("UTF-8"));
2168 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
2170 def GetCompressionMimeType(infile
, formatspecs
=__file_format_dict__
):
2171 formatspecs
= FormatSpecsListToDict(formatspecs
);
2172 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
2173 if(compresscheck
=="gzip" or compresscheck
=="gz"):
2174 return archivefile_gzip_mimetype
;
2175 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
2176 return archivefile_bzip2_mimetype
;
2177 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
2178 return archivefile_zstandard_mimetype
;
2179 if(compresscheck
=="lz4"):
2180 return archivefile_lz4_mimetype
;
2181 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
2182 return archivefile_lzop_mimetype
;
2183 if(compresscheck
=="lzma"):
2184 return archivefile_lzma_mimetype
;
2185 if(compresscheck
=="xz"):
2186 return archivefile_xz_mimetype
;
2187 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
['format_lower']):
2188 return archivefile_cat_mimetype
;
2189 if(not compresscheck
):
2193 def UncompressArchiveFile(fp
, formatspecs
=__file_format_dict__
):
2194 formatspecs
= FormatSpecsListToDict(formatspecs
);
2195 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2197 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
2198 if(compresscheck
=="gzip"):
2203 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
2204 if(compresscheck
=="bzip2"):
2210 catfp
.write(bz2
.decompress(fp
.read()));
2211 if(compresscheck
=="zstd"):
2217 catfp
.write(zstandard
.decompress(fp
.read()));
2218 if(compresscheck
=="lz4"):
2224 catfp
.write(lz4
.frame
.decompress(fp
.read()));
2225 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
2231 catfp
.write(lzo
.decompress(fp
.read()));
2232 if(compresscheck
=="lzma" or compresscheck
=="xz"):
2237 from backports
import lzma
2241 catfp
.write(lzma
.decompress(fp
.read()));
2242 if(compresscheck
=="catfile" or compresscheck
==formatspecs
['format_lower']):
2244 if(not compresscheck
):
2249 from backports
import lzma
2253 with fp
as fpcontent
:
2255 catfp
.write(lzma
.decompress(fp
.read()));
2256 except lzma
.LZMAError
:
2258 if(compresscheck
!="catfile" or compresscheck
!=formatspecs
['format_lower']):
2262 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
2264 def UncompressFile(infile
, formatspecs
=__file_format_dict__
, mode
="rb"):
2265 formatspecs
= FormatSpecsListToDict(formatspecs
);
2266 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
2267 if(sys
.version_info
[0]==2 and compresscheck
):
2273 if(compresscheck
=="gzip"):
2279 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
2280 except (ValueError, TypeError) as e
:
2281 filefp
= gzip
.open(infile
, mode
);
2282 if(compresscheck
=="bzip2"):
2288 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
2289 except (ValueError, TypeError) as e
:
2290 filefp
= bz2
.open(infile
, mode
);
2291 if(compresscheck
=="zstd"):
2297 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
2298 except (ValueError, TypeError) as e
:
2299 filefp
= zstandard
.open(infile
, mode
);
2300 if(compresscheck
=="lz4"):
2306 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
2307 except (ValueError, TypeError) as e
:
2308 filefp
= lz4
.frame
.open(infile
, mode
);
2309 if(compresscheck
=="lzo"):
2315 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
2316 except (ValueError, TypeError) as e
:
2317 filefp
= lzo
.open(infile
, mode
);
2318 if(compresscheck
=="lzma"):
2323 from backports
import lzma
2327 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
2328 except (ValueError, TypeError) as e
:
2329 filefp
= lzma
.open(infile
, mode
);
2330 if(compresscheck
=="catfile" or compresscheck
==formatspecs
['format_lower']):
2332 filefp
= open(infile
, mode
, encoding
="UTF-8");
2333 except (ValueError, TypeError) as e
:
2334 filefp
= open(infile
, mode
);
2335 if(not compresscheck
):
2337 filefp
= open(infile
, mode
, encoding
="UTF-8");
2338 except (ValueError, TypeError) as e
:
2339 filefp
= open(infile
, mode
);
2340 except FileNotFoundError
:
2344 def UncompressString(infile
):
2345 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
2346 if(compresscheck
=="gzip"):
2351 fileuz
= gzip
.decompress(infile
);
2352 if(compresscheck
=="bzip2"):
2357 fileuz
= bz2
.decompress(infile
);
2358 if(compresscheck
=="zstd"):
2363 fileuz
= zstandard
.decompress(infile
);
2364 if(compresscheck
=="lz4"):
2369 fileuz
= lz4
.frame
.decompress(infile
);
2370 if(compresscheck
=="lzo"):
2375 fileuz
= lzo
.decompress(infile
);
2376 if(compresscheck
=="lzma"):
2381 from backports
import lzma
2384 fileuz
= lzma
.decompress(infile
);
2385 if(not compresscheck
):
2387 if(hasattr(fileuz
, 'decode')):
2388 fileuz
= fileuz
.decode("UTF-8");
2391 def UncompressStringAlt(infile
):
2392 filefp
= StringIO();
2393 outstring
= UncompressString(infile
);
2394 filefp
.write(outstring
);
2398 def CheckCompressionSubType(infile
, formatspecs
=__file_format_dict__
, closefp
=True):
2399 formatspecs
= FormatSpecsListToDict(formatspecs
);
2400 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
2401 if(not compresscheck
):
2402 fextname
= os
.path
.splitext(infile
)[1];
2403 if(fextname
==".gz"):
2404 compresscheck
= "gzip";
2405 elif(fextname
==".bz2"):
2406 compresscheck
= "bzip2";
2407 elif(fextname
==".zst"):
2408 compresscheck
= "zstd";
2409 elif(fextname
==".lz4"):
2410 compresscheck
= "lz4";
2411 elif(fextname
==".lzo" or fextname
==".lzop"):
2412 compresscheck
= "lzo";
2413 elif(fextname
==".lzma" or fextname
==".xz"):
2414 compresscheck
= "lzma";
2417 if(compresscheck
=="gzip" or compresscheck
=="bzip2" or compresscheck
=="lzma" or compresscheck
=="zstd" or compresscheck
=="lz4"):
2418 if(TarFileCheck(infile
)):
2419 filetype
= "tarfile";
2420 if(not compresscheck
):
2421 if(TarFileCheck(infile
)):
2423 elif(zipfile
.is_zipfile(infile
)):
2425 elif(rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
)):
2430 if(compresscheck
=="catfile"):
2432 if(compresscheck
==formatspecs
['format_lower']):
2433 return formatspecs
['format_lower'];
2434 if(compresscheck
=="tarfile"):
2436 if(compresscheck
=="zipfile"):
2438 if(rarfile_support
and compresscheck
=="rarfile"):
2440 if(py7zr_support
and compresscheck
=="7zipfile"):
2442 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2443 catfp
= UncompressArchiveFile(infile
, formatspecs
['format_lower']);
2446 if(compresscheck
=="gzip"):
2451 catfp
= gzip
.GzipFile(infile
, "rb");
2452 if(compresscheck
=="bzip2"):
2457 catfp
= bz2
.BZ2File(infile
, "rb");
2458 if(compresscheck
=="lz4"):
2463 catfp
= lz4
.frame
.open(infile
, "rb");
2464 if(compresscheck
=="zstd"):
2469 catfp
= zstandard
.open(infile
, "rb");
2470 if(compresscheck
=="lzma" or compresscheck
=="xz"):
2475 from backports
import lzma
2478 catfp
= lzma
.open(infile
, "rb");
2479 except FileNotFoundError
:
2482 prefp
= catfp
.read(5);
2483 if(prefp
==binascii
.unhexlify("7573746172")):
2484 filetype
= "tarfile";
2486 prefp
= catfp
.read(7);
2487 if(prefp
==binascii
.unhexlify("43617446696c65")):
2488 filetype
= "catfile";
2490 prefp
= catfp
.read(formatspecs
['format_len']);
2491 if(prefp
==binascii
.unhexlify(formatspecs
['format_hex'])):
2492 filetype
= formatspecs
['format_lower'];
2494 prefp
= catfp
.read(10);
2495 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2496 filetype
= "tarfile";
2502 def GZipCompress(data
, compresslevel
=9):
2507 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
2509 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
2513 catfp
= open(tmpfp
.name
, "rb");
2514 except FileNotFoundError
:
2516 catdata
= catfp
.read();
2520 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_dict__
):
2521 formatspecs
= FormatSpecsListToDict(formatspecs
);
2522 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2525 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
2526 compression
= "auto";
2527 if(compression
not in compressionlist
and compression
is None):
2528 compression
= "auto";
2529 if(compression
=="gzip"):
2535 if(compressionlevel
is None):
2536 compressionlevel
= 9;
2538 compressionlevel
= int(compressionlevel
);
2539 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
2540 if(compression
=="bzip2"):
2546 if(compressionlevel
is None):
2547 compressionlevel
= 9;
2549 compressionlevel
= int(compressionlevel
);
2550 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
2551 if(compression
=="lz4"):
2557 if(compressionlevel
is None):
2558 compressionlevel
= 9;
2560 compressionlevel
= int(compressionlevel
);
2561 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
2562 if(compression
=="lzo" or compression
=="lzop"):
2568 if(compressionlevel
is None):
2569 compressionlevel
= 9;
2571 compressionlevel
= int(compressionlevel
);
2572 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
2573 if(compression
=="zstd"):
2579 if(compressionlevel
is None):
2580 compressionlevel
= 10;
2582 compressionlevel
= int(compressionlevel
);
2583 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
2584 if(compression
=="lzma"):
2589 from backports
import lzma
2593 if(compressionlevel
is None):
2594 compressionlevel
= 9;
2596 compressionlevel
= int(compressionlevel
);
2597 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
2598 if(compression
=="xz"):
2603 from backports
import lzma
2607 if(compressionlevel
is None):
2608 compressionlevel
= 9;
2610 compressionlevel
= int(compressionlevel
);
2611 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
2612 if(compression
=="auto" or compression
is None):
2617 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
2619 def CompressOpenFile(outfile
, compressionenable
=True, compressionlevel
=None):
2620 if(outfile
is None):
2622 fbasename
= os
.path
.splitext(outfile
)[0];
2623 fextname
= os
.path
.splitext(outfile
)[1];
2624 if(compressionlevel
is None and fextname
!=".zst"):
2625 compressionlevel
= 9;
2626 elif(compressionlevel
is None and fextname
==".zst"):
2627 compressionlevel
= 10;
2629 compressionlevel
= int(compressionlevel
);
2630 if(sys
.version_info
[0]==2):
2635 if(fextname
not in outextlistwd
or not compressionenable
):
2637 outfp
= open(outfile
, "wb", encoding
="UTF-8");
2638 except (ValueError, TypeError) as e
:
2639 outfp
= open(outfile
, "wb");
2640 elif(fextname
==".gz"):
2646 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2647 except (ValueError, TypeError) as e
:
2648 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
2649 elif(fextname
==".bz2"):
2655 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2656 except (ValueError, TypeError) as e
:
2657 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
2658 elif(fextname
==".zst"):
2664 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
2665 except (ValueError, TypeError) as e
:
2666 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
2667 elif(fextname
==".xz"):
2672 from backports
import lzma
2676 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
2677 except (ValueError, TypeError) as e
:
2678 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
2679 elif(fextname
==".lz4"):
2685 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
2686 except (ValueError, TypeError) as e
:
2687 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
2688 elif(fextname
==".lzo"):
2694 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
2695 except (ValueError, TypeError) as e
:
2696 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
2697 elif(fextname
==".lzma"):
2702 from backports
import lzma
2706 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
2707 except (ValueError, TypeError) as e
:
2708 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
2709 except FileNotFoundError
:
2713 def GetDevMajorMinor(fdev
):
2715 if(hasattr(os
, "minor")):
2716 retdev
.append(os
.minor(fdev
));
2719 if(hasattr(os
, "major")):
2720 retdev
.append(os
.major(fdev
));
2725 def CheckSumSupport(checkfor
, guaranteed
=True):
2728 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2729 except AttributeError:
2730 hash_list
= sorted(list(hashlib
.algorithms
));
2733 hash_list
= sorted(list(hashlib
.algorithms_available
));
2734 except AttributeError:
2735 hash_list
= sorted(list(hashlib
.algorithms
));
2736 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
2737 if(checkfor
in checklistout
):
2742 def CheckSumSupportAlt(checkfor
, guaranteed
=True):
2745 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2746 except AttributeError:
2747 hash_list
= sorted(list(hashlib
.algorithms
));
2750 hash_list
= sorted(list(hashlib
.algorithms_available
));
2751 except AttributeError:
2752 hash_list
= sorted(list(hashlib
.algorithms
));
2753 checklistout
= hash_list
;
2754 if(checkfor
in checklistout
):
2759 def PackArchiveFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
2760 formatspecs
= FormatSpecsListToDict(formatspecs
);
2761 advancedlist
= formatspecs
['use_advanced_list'];
2762 altinode
= formatspecs
['use_alt_inode'];
2763 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2764 outfile
= RemoveWindowsPath(outfile
);
2765 checksumtype
= checksumtype
.lower();
2766 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2767 checksumtype
="crc32";
2768 if(checksumtype
=="none"):
2770 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
2771 compression
= "auto";
2772 if(compression
not in compressionlist
and compression
is None):
2773 compression
= "auto";
2775 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2776 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2777 if(os
.path
.exists(outfile
)):
2780 except OSError as e
:
2785 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2787 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2790 fbasename
= os
.path
.splitext(outfile
)[0];
2791 fextname
= os
.path
.splitext(outfile
)[1];
2792 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
2793 catver
= formatspecs
['format_ver'];
2794 fileheaderver
= str(int(catver
.replace(".", "")));
2797 for line
in sys
.stdin
:
2798 infilelist
.append(line
.strip());
2799 infilelist
= list(filter(None, infilelist
));
2800 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
2801 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
2803 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
2804 for line
in finfile
:
2805 infilelist
.append(line
.strip());
2806 infilelist
= list(filter(None, infilelist
));
2808 if(isinstance(infiles
, (list, tuple, ))):
2809 infilelist
= list(filter(None, infiles
));
2810 elif(isinstance(infiles
, (str, ))):
2811 infilelist
= list(filter(None, [infiles
]));
2813 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
2815 GetDirList
= ListDir(infilelist
, followlink
, False);
2823 inodetocatinode
= {};
2824 numfiles
= int(len(GetDirList
));
2825 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
2826 for curfname
in GetDirList
:
2827 if(re
.findall("^[.|/]", curfname
)):
2830 fname
= "./"+curfname
;
2832 VerbosePrintOut(fname
);
2833 if(not followlink
or followlink
is None):
2834 fstatinfo
= os
.lstat(fname
);
2836 fstatinfo
= os
.stat(fname
);
2837 fpremode
= fstatinfo
.st_mode
;
2838 finode
= fstatinfo
.st_ino
;
2839 flinkcount
= fstatinfo
.st_nlink
;
2841 if(stat
.S_ISREG(fpremode
)):
2843 elif(stat
.S_ISLNK(fpremode
)):
2845 elif(stat
.S_ISCHR(fpremode
)):
2847 elif(stat
.S_ISBLK(fpremode
)):
2849 elif(stat
.S_ISDIR(fpremode
)):
2851 elif(stat
.S_ISFIFO(fpremode
)):
2853 elif(stat
.S_ISSOCK(fpremode
)):
2855 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
2857 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
2859 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
2864 fcurfid
= format(int(curfid
), 'x').lower();
2865 if(not followlink
and finode
!=0):
2867 if(finode
in inodelist
):
2869 flinkname
= inodetofile
[finode
];
2871 fcurinode
= format(int(finode
), 'x').lower();
2873 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
2874 if(finode
not in inodelist
):
2875 inodelist
.append(finode
);
2876 inodetofile
.update({finode
: fname
});
2877 inodetocatinode
.update({finode
: curinode
});
2879 fcurinode
= format(int(finode
), 'x').lower();
2881 fcurinode
= format(int(curinode
), 'x').lower();
2882 curinode
= curinode
+ 1;
2884 fcurinode
= format(int(curinode
), 'x').lower();
2885 curinode
= curinode
+ 1;
2886 curfid
= curfid
+ 1;
2888 flinkname
= os
.readlink(fname
);
2889 fdev
= fstatinfo
.st_dev
;
2890 getfdev
= GetDevMajorMinor(fdev
);
2891 fdev_minor
= getfdev
[0];
2892 fdev_major
= getfdev
[1];
2893 frdev
= fstatinfo
.st_dev
;
2894 if(hasattr(fstatinfo
, "st_rdev")):
2895 frdev
= fstatinfo
.st_rdev
;
2897 frdev
= fstatinfo
.st_dev
;
2898 getfrdev
= GetDevMajorMinor(frdev
);
2899 frdev_minor
= getfrdev
[0];
2900 frdev_major
= getfrdev
[1];
2901 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2902 fsize
= format(int("0"), 'x').lower();
2903 elif(ftype
==0 or ftype
==7):
2904 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
2906 fsize
= format(int(fstatinfo
.st_size
)).lower();
2907 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
2908 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
2909 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2910 if(hasattr(fstatinfo
, "st_birthtime")):
2911 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
2913 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2914 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
2915 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
2916 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
2917 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
2918 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
2923 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
2924 funame
= userinfo
.pw_name
;
2933 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
2934 fgname
= groupinfo
.gr_name
;
2939 fdev_minor
= format(int(fdev_minor
), 'x').lower();
2940 fdev_major
= format(int(fdev_major
), 'x').lower();
2941 frdev_minor
= format(int(frdev_minor
), 'x').lower();
2942 frdev_major
= format(int(frdev_major
), 'x').lower();
2943 finode
= format(int(finode
), 'x').lower();
2944 flinkcount
= format(int(flinkcount
), 'x').lower();
2945 if(hasattr(fstatinfo
, "st_file_attributes")):
2946 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
2948 fwinattributes
= format(int(0), 'x').lower();
2950 fcsize
= format(int(0), 'x').lower();
2951 fcontents
= BytesIO();
2952 if(ftype
==0 or ftype
==7):
2953 with
open(fname
, "rb") as fpc
:
2954 shutil
.copyfileobj(fpc
, fcontents
);
2955 if(not compresswholefile
):
2956 fcontents
.seek(0, 2);
2957 ucfsize
= fcontents
.tell();
2958 fcontents
.seek(0, 0);
2959 if(compression
=="auto"):
2960 ilsize
= len(compressionlistalt
);
2963 while(ilmin
< ilsize
):
2964 cfcontents
= BytesIO();
2965 shutil
.copyfileobj(fcontents
, cfcontents
);
2966 fcontents
.seek(0, 0);
2967 cfcontents
.seek(0, 0);
2968 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
2970 cfcontents
.seek(0, 2);
2971 ilcsize
.append(cfcontents
.tell());
2975 ilcsize
.append(sys
.maxint
);
2976 except AttributeError:
2977 ilcsize
.append(sys
.maxsize
);
2979 ilcmin
= ilcsize
.index(min(ilcsize
));
2980 compression
= compressionlistalt
[ilcmin
];
2981 fcontents
.seek(0, 0);
2982 cfcontents
= BytesIO();
2983 shutil
.copyfileobj(fcontents
, cfcontents
);
2984 cfcontents
.seek(0, 0);
2985 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
2986 cfcontents
.seek(0, 2);
2987 cfsize
= cfcontents
.tell();
2988 if(ucfsize
> cfsize
):
2989 fcsize
= format(int(cfsize
), 'x').lower();
2990 fcompression
= compression
;
2992 fcontents
= cfcontents
;
2993 if(fcompression
=="none"):
2995 if(followlink
and (ftype
==1 or ftype
==2)):
2996 flstatinfo
= os
.stat(flinkname
);
2997 with
open(flinkname
, "rb") as fpc
:
2998 shutil
.copyfileobj(fpc
, fcontents
);
2999 if(not compresswholefile
):
3000 fcontents
.seek(0, 2);
3001 ucfsize
= fcontents
.tell();
3002 fcontents
.seek(0, 0);
3003 if(compression
=="auto"):
3004 ilsize
= len(compressionlistalt
);
3007 while(ilmin
< ilsize
):
3008 cfcontents
= BytesIO();
3009 shutil
.copyfileobj(fcontents
, cfcontents
);
3010 fcontents
.seek(0, 0);
3011 cfcontents
.seek(0, 0);
3012 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3014 cfcontents
.seek(0, 2);
3015 ilcsize
.append(cfcontents
.tell());
3019 ilcsize
.append(sys
.maxint
);
3020 except AttributeError:
3021 ilcsize
.append(sys
.maxsize
);
3023 ilcmin
= ilcsize
.index(min(ilcsize
));
3024 compression
= compressionlistalt
[ilcmin
];
3025 fcontents
.seek(0, 0);
3026 cfcontents
= BytesIO();
3027 shutil
.copyfileobj(fcontents
, cfcontents
);
3028 cfcontents
.seek(0, 0);
3029 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3030 cfcontents
.seek(0, 2);
3031 cfsize
= cfcontents
.tell();
3032 if(ucfsize
> cfsize
):
3033 fcsize
= format(int(cfsize
), 'x').lower();
3034 fcompression
= compression
;
3036 fcontents
= cfcontents
;
3037 fcontents
.seek(0, 0);
3038 ftypehex
= format(ftype
, 'x').lower();
3039 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fcompression
, fcsize
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
3040 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3043 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3044 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3045 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3048 os
.fsync(catfp
.fileno());
3049 except io
.UnsupportedOperation
:
3051 except AttributeError:
3053 except OSError as e
:
3057 if(hasattr(sys
.stdout
, "buffer")):
3058 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3060 shutil
.copyfileobj(catfp
, sys
.stdout
);
3061 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3062 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3064 upload_file_to_internet_file(catfp
, outfile
);
3072 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
3074 if(hasattr(shutil
, "register_archive_format")):
3075 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
3076 return PackArchiveFile(source_dir
, archive_name
, False, "auto", True, None, False, "crc32", [], __file_format_dict__
['format_delimiter'], False, False);
3077 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
3079 def PackArchiveFileFromDirList(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3080 formatspecs
= FormatSpecsListToDict(formatspecs
);
3081 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3083 create_alias_function("Pack", __file_format_name__
, "FromDirList", PackArchiveFileFromDirList
);
3085 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3086 formatspecs
= FormatSpecsListToDict(formatspecs
);
3087 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3088 outfile
= RemoveWindowsPath(outfile
);
3089 checksumtype
= checksumtype
.lower();
3090 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3091 checksumtype
="crc32";
3092 if(checksumtype
=="none"):
3094 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3095 compression
= "auto";
3096 if(compression
not in compressionlist
and compression
is None):
3097 compression
= "auto";
3099 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3100 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3101 if(os
.path
.exists(outfile
)):
3104 except OSError as e
:
3109 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3111 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3114 fbasename
= os
.path
.splitext(outfile
)[0];
3115 fextname
= os
.path
.splitext(outfile
)[1];
3116 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3117 catver
= formatspecs
['format_ver'];
3118 fileheaderver
= str(int(catver
.replace(".", "")));
3124 inodetocatinode
= {};
3127 if(hasattr(sys
.stdin
, "buffer")):
3128 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3130 shutil
.copyfileobj(sys
.stdin
, infile
);
3135 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3136 infile
= download_file_from_internet_file(infile
);
3141 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3143 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
3145 if(not tarfile
.TarFileCheck(infile
)):
3147 except AttributeError:
3148 if(not TarFileCheck(infile
)):
3153 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3154 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
3156 tarfp
= tarfile
.open(infile
, "r");
3157 except FileNotFoundError
:
3159 numfiles
= int(len(tarfp
.getmembers()));
3160 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3161 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
3162 if(re
.findall("^[.|/]", member
.name
)):
3163 fname
= member
.name
;
3165 fname
= "./"+member
.name
;
3167 VerbosePrintOut(fname
);
3168 fpremode
= member
.mode
;
3169 ffullmode
= member
.mode
;
3173 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3175 elif(member
.isdev()):
3176 ffullmode
= member
.mode
;
3178 elif(member
.islnk()):
3179 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3181 elif(member
.issym()):
3182 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
3184 elif(member
.ischr()):
3185 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
3187 elif(member
.isblk()):
3188 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
3190 elif(member
.isdir()):
3191 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
3193 elif(member
.isfifo()):
3194 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
3196 elif(member
.issparse()):
3197 ffullmode
= member
.mode
;
3200 ffullmode
= member
.mode
;
3203 fcurfid
= format(int(curfid
), 'x').lower();
3204 fcurinode
= format(int(curfid
), 'x').lower();
3205 curfid
= curfid
+ 1;
3207 flinkname
= member
.linkname
;
3208 fdev_minor
= format(int(member
.devminor
), 'x').lower();
3209 fdev_major
= format(int(member
.devmajor
), 'x').lower();
3210 frdev_minor
= format(int(member
.devminor
), 'x').lower();
3211 frdev_major
= format(int(member
.devmajor
), 'x').lower();
3212 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3213 fsize
= format(int("0"), 'x').lower();
3214 elif(ftype
==0 or ftype
==7):
3215 fsize
= format(int(member
.size
), 'x').lower();
3217 fsize
= format(int(member
.size
), 'x').lower();
3218 fatime
= format(int(member
.mtime
), 'x').lower();
3219 fmtime
= format(int(member
.mtime
), 'x').lower();
3220 fctime
= format(int(member
.mtime
), 'x').lower();
3221 fbtime
= format(int(member
.mtime
), 'x').lower();
3222 fmode
= format(int(ffullmode
), 'x').lower();
3223 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
3224 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
3225 fuid
= format(int(member
.uid
), 'x').lower();
3226 fgid
= format(int(member
.gid
), 'x').lower();
3227 funame
= member
.uname
;
3228 fgname
= member
.gname
;
3229 flinkcount
= format(int(flinkcount
), 'x').lower();
3230 fwinattributes
= format(int(0), 'x').lower();
3232 fcsize
= format(int(0), 'x').lower();
3233 fcontents
= BytesIO();
3234 if(ftype
==0 or ftype
==7):
3235 with tarfp
.extractfile(member
) as fpc
:
3236 shutil
.copyfileobj(fpc
, fcontents
);
3237 if(not compresswholefile
):
3238 fcontents
.seek(0, 2);
3239 ucfsize
= fcontents
.tell();
3240 fcontents
.seek(0, 0);
3241 if(compression
=="auto"):
3242 ilsize
= len(compressionlistalt
);
3245 while(ilmin
< ilsize
):
3246 cfcontents
= BytesIO();
3247 shutil
.copyfileobj(fcontents
, cfcontents
);
3248 fcontents
.seek(0, 0);
3249 cfcontents
.seek(0, 0);
3250 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3252 cfcontents
.seek(0, 2);
3253 ilcsize
.append(cfcontents
.tell());
3257 ilcsize
.append(sys
.maxint
);
3258 except AttributeError:
3259 ilcsize
.append(sys
.maxsize
);
3261 ilcmin
= ilcsize
.index(min(ilcsize
));
3262 compression
= compressionlistalt
[ilcmin
];
3263 fcontents
.seek(0, 0);
3264 cfcontents
= BytesIO();
3265 shutil
.copyfileobj(fcontents
, cfcontents
);
3266 cfcontents
.seek(0, 0);
3267 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3268 cfcontents
.seek(0, 2);
3269 cfsize
= cfcontents
.tell();
3270 if(ucfsize
> cfsize
):
3271 fcsize
= format(int(cfsize
), 'x').lower();
3272 fcompression
= compression
;
3274 fcontents
= cfcontents
;
3275 if(fcompression
=="none"):
3277 fcontents
.seek(0, 0);
3278 ftypehex
= format(ftype
, 'x').lower();
3279 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fcompression
, fcsize
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
3280 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3283 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3284 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3285 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3288 os
.fsync(catfp
.fileno());
3289 except io
.UnsupportedOperation
:
3291 except AttributeError:
3293 except OSError as e
:
3297 if(hasattr(sys
.stdout
, "buffer")):
3298 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3300 shutil
.copyfileobj(catfp
, sys
.stdout
);
3301 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3302 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3304 upload_file_to_internet_file(catfp
, outfile
);
3312 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
3314 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3315 formatspecs
= FormatSpecsListToDict(formatspecs
);
3316 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3317 outfile
= RemoveWindowsPath(outfile
);
3318 checksumtype
= checksumtype
.lower();
3319 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3320 checksumtype
="crc32";
3321 if(checksumtype
=="none"):
3323 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3324 compression
= "auto";
3325 if(compression
not in compressionlist
and compression
is None):
3326 compression
= "auto";
3328 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3329 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3330 if(os
.path
.exists(outfile
)):
3333 except OSError as e
:
3338 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3340 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3343 fbasename
= os
.path
.splitext(outfile
)[0];
3344 fextname
= os
.path
.splitext(outfile
)[1];
3345 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3346 catver
= formatspecs
['format_ver'];
3347 fileheaderver
= str(int(catver
.replace(".", "")));
3353 inodetocatinode
= {};
3356 if(hasattr(sys
.stdin
, "buffer")):
3357 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3359 shutil
.copyfileobj(sys
.stdin
, infile
);
3364 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3365 infile
= download_file_from_internet_file(infile
);
3370 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3374 if(not zipfile
.is_zipfile(infile
)):
3377 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
3378 except FileNotFoundError
:
3380 ziptest
= zipfp
.testzip();
3382 VerbosePrintOut("Bad file found!");
3383 numfiles
= int(len(zipfp
.infolist()));
3384 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3385 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
3386 if(re
.findall("^[.|/]", member
.filename
)):
3387 fname
= member
.filename
;
3389 fname
= "./"+member
.filename
;
3390 zipinfo
= zipfp
.getinfo(member
.filename
);
3392 VerbosePrintOut(fname
);
3393 if(not member
.is_dir()):
3394 fpremode
= int(stat
.S_IFREG
+ 438);
3395 elif(member
.is_dir()):
3396 fpremode
= int(stat
.S_IFDIR
+ 511);
3399 if(not member
.is_dir()):
3401 elif(member
.is_dir()):
3404 fcurfid
= format(int(curfid
), 'x').lower();
3405 fcurinode
= format(int(curfid
), 'x').lower();
3406 curfid
= curfid
+ 1;
3407 fdev_minor
= format(int(0), 'x').lower();
3408 fdev_major
= format(int(0), 'x').lower();
3409 frdev_minor
= format(int(0), 'x').lower();
3410 frdev_major
= format(int(0), 'x').lower();
3412 fsize
= format(int("0"), 'x').lower();
3414 fsize
= format(int(member
.file_size
), 'x').lower();
3416 fsize
= format(int(member
.file_size
), 'x').lower();
3417 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3418 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3419 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3420 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3421 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
3422 fwinattributes
= format(int(zipinfo
.external_attr
), 'x').lower();
3423 if(not member
.is_dir()):
3424 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3425 fchmode
= stat
.S_IMODE(fmode
);
3426 ftypemod
= stat
.S_IFMT(fmode
);
3427 elif(member
.is_dir()):
3428 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3429 fchmode
= stat
.S_IMODE(fmode
);
3430 ftypemod
= stat
.S_IFMT(fmode
);
3431 elif(zipinfo
.create_system
==3):
3432 fwinattributes
= format(int(0), 'x').lower();
3433 fmode
= format(int(zipinfo
.external_attr
), 'x').lower();
3434 fchmode
= stat
.S_IMODE(fmode
);
3435 ftypemod
= stat
.S_IFMT(fmode
);
3437 fwinattributes
= format(int(0), 'x').lower();
3438 if(not member
.is_dir()):
3439 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3440 fchmode
= stat
.S_IMODE(fmode
);
3441 ftypemod
= stat
.S_IFMT(fmode
);
3442 elif(member
.is_dir()):
3443 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3444 fchmode
= stat
.S_IMODE(fmode
);
3445 ftypemod
= stat
.S_IFMT(fmode
);
3447 fcsize
= format(int(0), 'x').lower();
3449 fuid
= format(int(os
.getuid()), 'x').lower();
3450 except AttributeError:
3451 fuid
= format(int(0), 'x').lower();
3453 fuid
= format(int(0), 'x').lower();
3455 fgid
= format(int(os
.getgid()), 'x').lower();
3456 except AttributeError:
3457 fgid
= format(int(0), 'x').lower();
3459 fgid
= format(int(0), 'x').lower();
3463 userinfo
= pwd
.getpwuid(os
.getuid());
3464 funame
= userinfo
.pw_name
;
3467 except AttributeError:
3475 groupinfo
= grp
.getgrgid(os
.getgid());
3476 fgname
= groupinfo
.gr_name
;
3479 except AttributeError:
3483 fcontents
= BytesIO();
3485 fcontents
.write(zipfp
.read(member
.filename
));
3486 if(not compresswholefile
):
3487 fcontents
.seek(0, 2);
3488 ucfsize
= fcontents
.tell();
3489 fcontents
.seek(0, 0);
3490 if(compression
=="auto"):
3491 ilsize
= len(compressionlistalt
);
3494 while(ilmin
< ilsize
):
3495 cfcontents
= BytesIO();
3496 shutil
.copyfileobj(fcontents
, cfcontents
);
3497 fcontents
.seek(0, 0);
3498 cfcontents
.seek(0, 0);
3499 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3500 cfcontents
.seek(0, 2);
3501 ilcsize
.append(cfcontents
.tell());
3504 ilcmin
= ilcsize
.index(min(ilcsize
));
3505 compression
= compressionlistalt
[ilcmin
];
3506 fcontents
.seek(0, 0);
3507 cfcontents
= BytesIO();
3508 shutil
.copyfileobj(fcontents
, cfcontents
);
3509 cfcontents
.seek(0, 0);
3510 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3511 cfcontents
.seek(0, 2);
3512 cfsize
= cfcontents
.tell();
3513 if(ucfsize
> cfsize
):
3514 fcsize
= format(int(cfsize
), 'x').lower();
3515 fcompression
= compression
;
3517 fcontents
= cfcontents
;
3518 if(fcompression
=="none"):
3520 fcontents
.seek(0, 0);
3521 ftypehex
= format(ftype
, 'x').lower();
3522 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fcompression
, fcsize
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
3523 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3526 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3527 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3528 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3531 os
.fsync(catfp
.fileno());
3532 except io
.UnsupportedOperation
:
3534 except AttributeError:
3536 except OSError as e
:
3540 if(hasattr(sys
.stdout
, "buffer")):
3541 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3543 shutil
.copyfileobj(catfp
, sys
.stdout
);
3544 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3545 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3547 upload_file_to_internet_file(catfp
, outfile
);
3555 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
3557 if(not rarfile_support
):
3558 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3561 if(rarfile_support
):
3562 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3563 formatspecs
= FormatSpecsListToDict(formatspecs
);
3564 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3565 outfile
= RemoveWindowsPath(outfile
);
3566 checksumtype
= checksumtype
.lower();
3567 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3568 checksumtype
="crc32";
3569 if(checksumtype
=="none"):
3571 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3572 compression
= "auto";
3573 if(compression
not in compressionlist
and compression
is None):
3574 compression
= "auto";
3576 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3577 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3578 if(os
.path
.exists(outfile
)):
3581 except OSError as e
:
3586 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3588 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3591 fbasename
= os
.path
.splitext(outfile
)[0];
3592 fextname
= os
.path
.splitext(outfile
)[1];
3593 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3594 catver
= formatspecs
['format_ver'];
3595 fileheaderver
= str(int(catver
.replace(".", "")));
3601 inodetocatinode
= {};
3602 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3604 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
3606 rarfp
= rarfile
.RarFile(infile
, "r");
3607 rartest
= rarfp
.testrar();
3609 VerbosePrintOut("Bad file found!");
3610 numfiles
= int(len(rarfp
.infolist()));
3611 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3614 os
.fsync(catfp
.fileno());
3615 except io
.UnsupportedOperation
:
3617 except AttributeError:
3619 except OSError as e
:
3621 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
3624 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
3627 member
.external_attr
3629 except AttributeError:
3631 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
3634 member
.external_attr
3636 except AttributeError:
3641 if(re
.findall("^[.|/]", member
.filename
)):
3642 fname
= member
.filename
;
3644 fname
= "./"+member
.filename
;
3645 rarinfo
= rarfp
.getinfo(member
.filename
);
3647 VerbosePrintOut(fname
);
3648 if(is_unix
and member
.external_attr
!=0):
3649 fpremode
= int(member
.external_attr
);
3650 elif(member
.is_file()):
3651 fpremode
= int(stat
.S_IFREG
+ 438);
3652 elif(member
.is_symlink()):
3653 fpremode
= int(stat
.S_IFLNK
+ 438);
3654 elif(member
.is_dir()):
3655 fpremode
= int(stat
.S_IFDIR
+ 511);
3656 if(is_windows
and member
.external_attr
!=0):
3657 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
3659 fwinattributes
= format(int(0), 'x').lower();
3661 fcsize
= format(int(0), 'x').lower();
3664 if(member
.is_file()):
3666 elif(member
.is_symlink()):
3668 elif(member
.is_dir()):
3672 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
3673 fcurfid
= format(int(curfid
), 'x').lower();
3674 fcurinode
= format(int(curfid
), 'x').lower();
3675 curfid
= curfid
+ 1;
3676 fdev_minor
= format(int(0), 'x').lower();
3677 fdev_major
= format(int(0), 'x').lower();
3678 frdev_minor
= format(int(0), 'x').lower();
3679 frdev_major
= format(int(0), 'x').lower();
3681 fsize
= format(int("0"), 'x').lower();
3683 fsize
= format(int(member
.file_size
), 'x').lower();
3685 fsize
= format(int(member
.file_size
), 'x').lower();
3688 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
3690 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3691 except AttributeError:
3692 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3693 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3696 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
3698 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3699 except AttributeError:
3700 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3701 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3702 if(is_unix
and member
.external_attr
!=0):
3703 fmode
= format(int(member
.external_attr
), 'x').lower();
3704 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
3705 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
3706 elif(member
.is_file()):
3707 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3708 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3709 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3710 elif(member
.is_symlink()):
3711 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
3712 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3713 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3714 elif(member
.is_dir()):
3715 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3716 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3717 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3719 fuid
= format(int(os
.getuid()), 'x').lower();
3720 except AttributeError:
3721 fuid
= format(int(0), 'x').lower();
3723 fuid
= format(int(0), 'x').lower();
3725 fgid
= format(int(os
.getgid()), 'x').lower();
3726 except AttributeError:
3727 fgid
= format(int(0), 'x').lower();
3729 fgid
= format(int(0), 'x').lower();
3733 userinfo
= pwd
.getpwuid(os
.getuid());
3734 funame
= userinfo
.pw_name
;
3737 except AttributeError:
3745 groupinfo
= grp
.getgrgid(os
.getgid());
3746 fgname
= groupinfo
.gr_name
;
3749 except AttributeError:
3753 fcontents
= BytesIO();
3755 fcontents
.write(rarfp
.read(member
.filename
));
3756 if(not compresswholefile
):
3757 fcontents
.seek(0, 2);
3758 ucfsize
= fcontents
.tell();
3759 fcontents
.seek(0, 0);
3760 if(compression
=="auto"):
3761 ilsize
= len(compressionlistalt
);
3764 while(ilmin
< ilsize
):
3765 cfcontents
= BytesIO();
3766 shutil
.copyfileobj(fcontents
, cfcontents
);
3767 fcontents
.seek(0, 0);
3768 cfcontents
.seek(0, 0);
3769 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3771 cfcontents
.seek(0, 2);
3772 ilcsize
.append(cfcontents
.tell());
3776 ilcsize
.append(sys
.maxint
);
3777 except AttributeError:
3778 ilcsize
.append(sys
.maxsize
);
3780 ilcmin
= ilcsize
.index(min(ilcsize
));
3781 compression
= compressionlistalt
[ilcmin
];
3782 fcontents
.seek(0, 0);
3783 cfcontents
= BytesIO();
3784 shutil
.copyfileobj(fcontents
, cfcontents
);
3785 cfcontents
.seek(0, 0);
3786 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3787 cfcontents
.seek(0, 2);
3788 cfsize
= cfcontents
.tell();
3789 if(ucfsize
> cfsize
):
3790 fcsize
= format(int(cfsize
), 'x').lower();
3791 fcompression
= compression
;
3793 fcontents
= cfcontents
;
3794 if(fcompression
=="none"):
3796 fcontents
.seek(0, 0);
3797 ftypehex
= format(ftype
, 'x').lower();
3798 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fcompression
, fcsize
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
3799 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3802 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3803 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3804 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
)
3807 os
.fsync(catfp
.fileno());
3808 except io
.UnsupportedOperation
:
3810 except AttributeError:
3812 except OSError as e
:
3816 if(hasattr(sys
.stdout
, "buffer")):
3817 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3819 shutil
.copyfileobj(catfp
, sys
.stdout
);
3820 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3821 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3823 upload_file_to_internet_file(catfp
, outfile
);
3831 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
3833 if(not py7zr_support
):
3834 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3838 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3839 formatspecs
= FormatSpecsListToDict(formatspecs
);
3840 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3841 outfile
= RemoveWindowsPath(outfile
);
3842 checksumtype
= checksumtype
.lower();
3843 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3844 checksumtype
="crc32";
3845 if(checksumtype
=="none"):
3847 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3848 compression
= "auto";
3849 if(compression
not in compressionlist
and compression
is None):
3850 compression
= "auto";
3852 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3853 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3854 if(os
.path
.exists(outfile
)):
3857 except OSError as e
:
3862 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3864 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3867 fbasename
= os
.path
.splitext(outfile
)[0];
3868 fextname
= os
.path
.splitext(outfile
)[1];
3869 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3870 catver
= formatspecs
['format_ver'];
3871 fileheaderver
= str(int(catver
.replace(".", "")));
3877 inodetocatinode
= {};
3878 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3880 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
3881 file_content
= szpfp
.readall();
3882 #sztest = szpfp.testzip();
3883 sztestalt
= szpfp
.test();
3885 VerbosePrintOut("Bad file found!");
3886 numfiles
= int(len(szpfp
.list()));
3887 AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3888 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
3889 if(re
.findall("^[.|/]", member
.filename
)):
3890 fname
= member
.filename
;
3892 fname
= "./"+member
.filename
;
3894 VerbosePrintOut(fname
);
3895 if(not member
.is_directory
):
3896 fpremode
= int(stat
.S_IFREG
+ 438);
3897 elif(member
.is_directory
):
3898 fpremode
= int(stat
.S_IFDIR
+ 511);
3899 fwinattributes
= format(int(0), 'x').lower();
3901 fcsize
= format(int(0), 'x').lower();
3904 if(member
.is_directory
):
3909 fcurfid
= format(int(curfid
), 'x').lower();
3910 fcurinode
= format(int(curfid
), 'x').lower();
3911 curfid
= curfid
+ 1;
3912 fdev_minor
= format(int(0), 'x').lower();
3913 fdev_major
= format(int(0), 'x').lower();
3914 frdev_minor
= format(int(0), 'x').lower();
3915 frdev_major
= format(int(0), 'x').lower();
3917 fsize
= format(int("0"), 'x').lower();
3918 fatime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3919 fmtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3920 fctime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3921 fbtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3922 if(member
.is_directory
):
3923 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3924 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3925 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3927 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3928 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3929 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3931 fuid
= format(int(os
.getuid()), 'x').lower();
3932 except AttributeError:
3933 fuid
= format(int(0), 'x').lower();
3935 fuid
= format(int(0), 'x').lower();
3937 fgid
= format(int(os
.getgid()), 'x').lower();
3938 except AttributeError:
3939 fgid
= format(int(0), 'x').lower();
3941 fgid
= format(int(0), 'x').lower();
3945 userinfo
= pwd
.getpwuid(os
.getuid());
3946 funame
= userinfo
.pw_name
;
3949 except AttributeError:
3957 groupinfo
= grp
.getgrgid(os
.getgid());
3958 fgname
= groupinfo
.gr_name
;
3961 except AttributeError:
3965 fcontents
= BytesIO();
3967 fcontents
.write(file_content
[member
.filename
].read());
3968 fsize
= format(fcontents
.tell(), 'x').lower();
3969 file_content
[member
.filename
].close();
3970 if(not compresswholefile
):
3971 fcontents
.seek(0, 2);
3972 ucfsize
= fcontents
.tell();
3973 fcontents
.seek(0, 0);
3974 if(compression
=="auto"):
3975 ilsize
= len(compressionlistalt
);
3978 while(ilmin
< ilsize
):
3979 cfcontents
= BytesIO();
3980 shutil
.copyfileobj(fcontents
, cfcontents
);
3981 fcontents
.seek(0, 0);
3982 cfcontents
.seek(0, 0);
3983 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3985 cfcontents
.seek(0, 2);
3986 ilcsize
.append(cfcontents
.tell());
3990 ilcsize
.append(sys
.maxint
);
3991 except AttributeError:
3992 ilcsize
.append(sys
.maxsize
);
3994 ilcmin
= ilcsize
.index(min(ilcsize
));
3995 compression
= compressionlistalt
[ilcmin
];
3996 fcontents
.seek(0, 0);
3997 cfcontents
= BytesIO();
3998 shutil
.copyfileobj(fcontents
, cfcontents
);
3999 cfcontents
.seek(0, 0);
4000 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
4001 cfcontents
.seek(0, 2);
4002 cfsize
= cfcontents
.tell();
4003 if(ucfsize
> cfsize
):
4004 fcsize
= format(int(cfsize
), 'x').lower();
4005 fcompression
= compression
;
4007 fcontents
= cfcontents
;
4008 if(fcompression
=="none"):
4010 fcontents
.seek(0, 0);
4011 ftypehex
= format(ftype
, 'x').lower();
4012 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fcompression
, fcsize
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
4013 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
4016 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
4017 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4018 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
)
4021 os
.fsync(catfp
.fileno());
4022 except io
.UnsupportedOperation
:
4024 except AttributeError:
4026 except OSError as e
:
4030 if(hasattr(sys
.stdout
, "buffer")):
4031 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
4033 shutil
.copyfileobj(catfp
, sys
.stdout
);
4034 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
4035 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
4037 upload_file_to_internet_file(catfp
, outfile
);
4045 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFile", PackArchiveFileFromSevenZipFile
);
4047 def PackArchiveFileFromInFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4048 formatspecs
= FormatSpecsListToDict(formatspecs
);
4049 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4051 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4052 if(checkcompressfile
=="tarfile"):
4053 return PackArchiveFileFromTarFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4054 elif(checkcompressfile
=="zipfile"):
4055 return PackArchiveFileFromZipFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4056 elif(checkcompressfile
=="catfile"):
4057 return RePackArchiveFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, False, 0, 0, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
4058 elif(rarfile_support
and checkcompressfile
=="rarfile"):
4059 return PackArchiveFileFromRarFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4060 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
4061 return PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4066 create_alias_function("Pack", __file_format_name__
, "FromInFile", PackArchiveFileFromInFile
);
4068 def ArchiveFileSeekToFileNum(infile
, seekto
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4069 formatspecs
= FormatSpecsListToDict(formatspecs
);
4070 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4073 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4074 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4075 if(checkcompressfile
=="tarfile"):
4076 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4077 if(checkcompressfile
=="zipfile"):
4078 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4079 if(rarfile_support
and checkcompressfile
=="rarfile"):
4080 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4081 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4082 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4083 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4090 if(hasattr(sys
.stdin
, "buffer")):
4091 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4093 shutil
.copyfileobj(sys
.stdin
, catfp
);
4095 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4099 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4100 catfp
= download_file_from_internet_file(infile
);
4102 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4107 infile
= RemoveWindowsPath(infile
);
4108 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4109 if(checkcompressfile
=="tarfile"):
4110 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4111 if(checkcompressfile
=="zipfile"):
4112 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4113 if(rarfile_support
and checkcompressfile
=="rarfile"):
4114 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4115 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4116 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4117 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4119 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4120 if(not compresscheck
):
4121 fextname
= os
.path
.splitext(infile
)[1];
4122 if(fextname
==".gz"):
4123 compresscheck
= "gzip";
4124 elif(fextname
==".bz2"):
4125 compresscheck
= "bzip2";
4126 elif(fextname
==".zst"):
4127 compresscheck
= "zstd";
4128 elif(fextname
==".lz4" or fextname
==".clz4"):
4129 compresscheck
= "lz4";
4130 elif(fextname
==".lzo" or fextname
==".lzop"):
4131 compresscheck
= "lzo";
4132 elif(fextname
==".lzma" or fextname
==".xz"):
4133 compresscheck
= "lzma";
4136 if(not compresscheck
):
4138 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4143 SeekToEndOfFile(catfp);
4145 SeekToEndOfFile(catfp);
4146 CatSize = catfp.tell();
4147 CatSizeEnd = CatSize;
4155 curloc
= catfp
.tell();
4158 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4160 catfp
.seek(curloc
, 0);
4161 catstring
= catheader
[0];
4162 catversion
= re
.findall(r
"([\d]+)", catstring
);
4163 fprenumfiles
= catheader
[1];
4164 fnumfiles
= int(fprenumfiles
, 16);
4165 fprechecksumtype
= catheader
[2];
4166 fprechecksum
= catheader
[3];
4167 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4168 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4169 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4170 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4171 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4172 fheadtell
= len(fileheader
);
4173 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4174 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4175 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4177 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4178 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4179 if(seekto
>=fnumfiles
):
4180 seekto
= fnumfiles
- 1;
4186 prefhstart
= catfp
.tell();
4187 if(formatspecs
['new_style']):
4188 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4190 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4191 if(len(preheaderdata
)==0):
4193 prefheadsize
= int(preheaderdata
[0], 16);
4194 prefnumfields
= int(preheaderdata
[1], 16);
4195 preftype
= int(preheaderdata
[2], 16);
4196 if(re
.findall("^[.|/]", preheaderdata
[3])):
4197 prefname
= preheaderdata
[3];
4199 prefname
= "./"+preheaderdata
[3];
4200 prefbasedir
= os
.path
.dirname(prefname
);
4201 preflinkname
= preheaderdata
[4];
4202 prefsize
= int(preheaderdata
[5], 16);
4203 prefatime
= int(preheaderdata
[6], 16);
4204 prefmtime
= int(preheaderdata
[7], 16);
4205 prefctime
= int(preheaderdata
[8], 16);
4206 prefbtime
= int(preheaderdata
[9], 16);
4207 prefmode
= int(preheaderdata
[10], 16);
4208 prefchmode
= stat
.S_IMODE(prefmode
);
4209 preftypemod
= stat
.S_IFMT(prefmode
);
4210 prefwinattributes
= int(preheaderdata
[11], 16);
4211 prefcompression
= preheaderdata
[12];
4212 prefcsize
= int(preheaderdata
[13], 16);
4213 prefuid
= int(preheaderdata
[14], 16);
4214 prefuname
= preheaderdata
[15];
4215 prefgid
= int(preheaderdata
[16], 16);
4216 prefgname
= preheaderdata
[17];
4217 fid
= int(preheaderdata
[18], 16);
4218 finode
= int(preheaderdata
[19], 16);
4219 flinkcount
= int(preheaderdata
[20], 16);
4220 prefdev_minor
= int(preheaderdata
[21], 16);
4221 prefdev_major
= int(preheaderdata
[22], 16);
4222 prefrdev_minor
= int(preheaderdata
[23], 16);
4223 prefrdev_major
= int(preheaderdata
[24], 16);
4224 prefextrasize
= int(preheaderdata
[25], 16);
4225 prefextrafields
= int(preheaderdata
[26], 16);
4226 extrafieldslist
= [];
4228 extraend
= extrastart
+ prefextrafields
;
4229 extrafieldslist
= [];
4230 if(extrastart
<extraend
):
4231 extrafieldslist
.append(preheaderdata
[extrastart
]);
4232 extrastart
= extrastart
+ 1;
4233 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4234 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4235 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4237 hcmax
= len(preheaderdata
) - 2;
4240 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
['format_delimiter']);
4242 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4243 if(prefcs
!=prenewfcs
and not skipchecksum
):
4244 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4245 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4247 valid_archive
= False;
4248 invalid_archive
= True;
4249 prefhend
= catfp
.tell() - 1;
4250 prefcontentstart
= catfp
.tell();
4252 pyhascontents
= False;
4254 if(prefcompression
):
4255 prefcontents
= catfp
.read(prefsize
);
4257 prefcontents
= catfp
.read(prefcsize
);
4258 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4259 pyhascontents
= True;
4260 if(prefccs
!=prenewfccs
and not skipchecksum
):
4261 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4262 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4266 catfp
.seek(seekstart
, 0);
4268 catfheadsize
= int(preheaderdata
[0], 16);
4269 catfnumfields
= int(preheaderdata
[1], 16);
4270 catftype
= int(preheaderdata
[2], 16);
4271 if(re
.findall("^[.|/]", preheaderdata
[3])):
4272 catfname
= preheaderdata
[3];
4274 catfname
= "./"+preheaderdata
[3];
4275 catflinkname
= preheaderdata
[4];
4276 catfsize
= int(preheaderdata
[5], 16);
4277 catfbasedir
= os
.path
.dirname(catfname
);
4278 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4280 catlist
.update({'catfp': catfp
});
4285 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
4287 def ArchiveFileSeekToFileName(infile
, seekfile
=None, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4288 formatspecs
= FormatSpecsListToDict(formatspecs
);
4289 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4292 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4293 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4294 if(checkcompressfile
=="tarfile"):
4295 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4296 if(checkcompressfile
=="zipfile"):
4297 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4298 if(rarfile_support
and checkcompressfile
=="rarfile"):
4299 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4300 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4301 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4302 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4309 if(hasattr(sys
.stdin
, "buffer")):
4310 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4312 shutil
.copyfileobj(sys
.stdin
, catfp
);
4314 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4318 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4319 catfp
= download_file_from_internet_file(infile
);
4320 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4326 infile
= RemoveWindowsPath(infile
);
4327 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4328 if(checkcompressfile
=="tarfile"):
4329 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4330 if(checkcompressfile
=="zipfile"):
4331 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4332 if(rarfile_support
and checkcompressfile
=="rarfile"):
4333 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4334 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4335 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4336 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4338 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4339 if(not compresscheck
):
4340 fextname
= os
.path
.splitext(infile
)[1];
4341 if(fextname
==".gz"):
4342 compresscheck
= "gzip";
4343 elif(fextname
==".bz2"):
4344 compresscheck
= "bzip2";
4345 elif(fextname
==".zst"):
4346 compresscheck
= "zstd";
4347 elif(fextname
==".lz4" or fextname
==".clz4"):
4348 compresscheck
= "lz4";
4349 elif(fextname
==".lzo" or fextname
==".lzop"):
4350 compresscheck
= "lzo";
4351 elif(fextname
==".lzma" or fextname
==".xz"):
4352 compresscheck
= "lzma";
4355 if(not compresscheck
):
4357 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4362 SeekToEndOfFile(catfp);
4364 SeekToEndOfFile(catfp);
4365 CatSize = catfp.tell();
4366 CatSizeEnd = CatSize;
4374 curloc
= catfp
.tell();
4377 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4379 catfp
.seek(curloc
, 0);
4380 catstring
= catheader
[0];
4381 catversion
= re
.findall(r
"([\d]+)", catstring
);
4382 fprenumfiles
= catheader
[1];
4383 fnumfiles
= int(fprenumfiles
, 16);
4384 fprechecksumtype
= catheader
[2];
4385 fprechecksum
= catheader
[3];
4386 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4387 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4388 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4389 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4390 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4391 fheadtell
= len(fileheader
);
4392 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4393 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4394 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4396 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4397 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4398 seekto
= fnumfiles
- 1
4403 prefhstart
= catfp
.tell();
4404 if(formatspecs
['new_style']):
4405 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4407 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4408 if(len(preheaderdata
)==0):
4410 prefheadsize
= int(preheaderdata
[0], 16);
4411 prefnumfields
= int(preheaderdata
[1], 16);
4412 preftype
= int(preheaderdata
[2], 16);
4413 if(re
.findall("^[.|/]", preheaderdata
[3])):
4414 prefname
= preheaderdata
[3];
4416 prefname
= "./"+preheaderdata
[3];
4417 prefbasedir
= os
.path
.dirname(prefname
);
4418 preflinkname
= preheaderdata
[4];
4419 prefsize
= int(preheaderdata
[5], 16);
4420 prefatime
= int(preheaderdata
[6], 16);
4421 prefmtime
= int(preheaderdata
[7], 16);
4422 prefctime
= int(preheaderdata
[8], 16);
4423 prefbtime
= int(preheaderdata
[9], 16);
4424 prefmode
= int(preheaderdata
[10], 16);
4425 prefchmode
= stat
.S_IMODE(prefmode
);
4426 preftypemod
= stat
.S_IFMT(prefmode
);
4427 prefwinattributes
= int(preheaderdata
[11], 16);
4428 prefcompression
= preheaderdata
[12];
4429 prefcsize
= int(preheaderdata
[13], 16);
4430 prefuid
= int(preheaderdata
[14], 16);
4431 prefuname
= preheaderdata
[15];
4432 prefgid
= int(preheaderdata
[16], 16);
4433 prefgname
= preheaderdata
[17];
4434 fid
= int(preheaderdata
[18], 16);
4435 finode
= int(preheaderdata
[19], 16);
4436 flinkcount
= int(preheaderdata
[20], 16);
4437 prefdev_minor
= int(preheaderdata
[21], 16);
4438 prefdev_major
= int(preheaderdata
[22], 16);
4439 prefrdev_minor
= int(preheaderdata
[23], 16);
4440 prefrdev_major
= int(preheaderdata
[24], 16);
4441 prefextrasize
= int(preheaderdata
[25], 16);
4442 prefextrafields
= int(preheaderdata
[26], 16);
4443 extrafieldslist
= [];
4445 extraend
= extrastart
+ prefextrafields
;
4446 extrafieldslist
= [];
4447 if(extrastart
<extraend
):
4448 extrafieldslist
.append(preheaderdata
[extrastart
]);
4449 extrastart
= extrastart
+ 1;
4450 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4451 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4452 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4454 hcmax
= len(preheaderdata
) - 2;
4457 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
['format_delimiter']);
4459 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4460 if(prefcs
!=prenewfcs
and not skipchecksum
):
4461 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4462 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4464 valid_archive
= False;
4465 invalid_archive
= True;
4466 prefhend
= catfp
.tell() - 1;
4467 prefcontentstart
= catfp
.tell();
4469 pyhascontents
= False;
4471 if(prefcompression
):
4472 prefcontents
= catfp
.read(prefsize
);
4474 prefcontents
= catfp
.read(prefcsize
);
4475 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4476 pyhascontents
= True;
4477 if(prefccs
!=prenewfccs
and not skipchecksum
):
4478 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4479 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4484 prefname
= preheaderdata
[2];
4485 if(re
.findall("^[.|/]", preheaderdata
[2])):
4486 prefname
= preheaderdata
[2];
4488 prefname
= "./"+preheaderdata
[2];
4489 if(prefname
==seekfile
):
4492 catfp
.seek(seekstart
, 0);
4494 catfheadsize
= int(preheaderdata
[0], 16);
4495 catfnumfields
= int(preheaderdata
[1], 16);
4496 catftype
= int(preheaderdata
[2], 16);
4497 if(re
.findall("^[.|/]", preheaderdata
[3])):
4498 catfname
= preheaderdata
[3];
4500 catfname
= "./"+preheaderdata
[3];
4501 catflinkname
= preheaderdata
[4];
4502 catfsize
= int(preheaderdata
[5], 16);
4503 catfbasedir
= os
.path
.dirname(catfname
);
4505 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4509 catlist
.update({'catfp': catfp
});
4514 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
4516 def ArchiveFileValidate(infile
, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4517 formatspecs
= FormatSpecsListToDict(formatspecs
);
4519 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4520 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4523 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4524 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4525 if(checkcompressfile
=="tarfile"):
4526 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4527 if(checkcompressfile
=="zipfile"):
4528 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4529 if(rarfile_support
and checkcompressfile
=="rarfile"):
4530 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4531 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4532 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4533 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4540 if(hasattr(sys
.stdin
, "buffer")):
4541 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4543 shutil
.copyfileobj(sys
.stdin
, catfp
);
4545 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4549 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4550 catfp
= download_file_from_internet_file(infile
);
4551 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4557 infile
= RemoveWindowsPath(infile
);
4558 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4559 if(checkcompressfile
=="tarfile"):
4560 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4561 if(checkcompressfile
=="zipfile"):
4562 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4563 if(rarfile_support
and checkcompressfile
=="rarfile"):
4564 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4565 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4566 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4567 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4569 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4570 if(not compresscheck
):
4571 fextname
= os
.path
.splitext(infile
)[1];
4572 if(fextname
==".gz"):
4573 compresscheck
= "gzip";
4574 elif(fextname
==".bz2"):
4575 compresscheck
= "bzip2";
4576 elif(fextname
==".zst"):
4577 compresscheck
= "zstd";
4578 elif(fextname
==".lz4" or fextname
==".clz4"):
4579 compresscheck
= "lz4";
4580 elif(fextname
==".lzo" or fextname
==".lzop"):
4581 compresscheck
= "lzo";
4582 elif(fextname
==".lzma" or fextname
==".xz"):
4583 compresscheck
= "lzma";
4586 if(not compresscheck
):
4588 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4593 SeekToEndOfFile(catfp);
4595 SeekToEndOfFile(catfp);
4596 CatSize = catfp.tell();
4597 CatSizeEnd = CatSize;
4605 curloc
= catfp
.tell();
4608 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4610 catfp
.seek(curloc
, 0);
4611 catstring
= catheader
[0];
4612 catversion
= re
.findall(r
"([\d]+)", catstring
);
4613 fprenumfiles
= catheader
[1];
4614 fnumfiles
= int(fprenumfiles
, 16);
4615 fprechecksumtype
= catheader
[2];
4616 fprechecksum
= catheader
[3];
4618 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4619 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4620 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4621 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4622 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4623 valid_archive
= True;
4624 invalid_archive
= False;
4626 VerbosePrintOut(infile
);
4627 VerbosePrintOut("Number of Records " + str(fnumfiles
));
4628 if(fprechecksum
==catfileheadercshex
):
4630 VerbosePrintOut("File Header Checksum Passed at offset " + str(0));
4631 VerbosePrintOut("'" + str(fprechecksum
) + "' == " + "'" + str(catfileheadercshex
) + "'");
4634 VerbosePrintOut("File Header Checksum Failed at offset " + str(0));
4635 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4636 valid_archive
= False;
4637 invalid_archive
= True;
4639 VerbosePrintOut("");
4640 while(il
<fnumfiles
):
4641 catfhstart
= catfp
.tell();
4642 if(formatspecs
['new_style']):
4643 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4645 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4646 if(len(catheaderdata
)==0):
4648 catfheadsize
= int(catheaderdata
[0], 16);
4649 catfnumfields
= int(catheaderdata
[1], 16);
4650 catftype
= int(catheaderdata
[2], 16);
4651 if(re
.findall("^[.|/]", catheaderdata
[3])):
4652 catfname
= catheaderdata
[3];
4654 catfname
= "./"+catheaderdata
[3];
4655 catfbasedir
= os
.path
.dirname(catfname
);
4656 catflinkname
= catheaderdata
[4];
4657 catfsize
= int(catheaderdata
[5], 16);
4658 catfatime
= int(catheaderdata
[6], 16);
4659 catfmtime
= int(catheaderdata
[7], 16);
4660 catfctime
= int(catheaderdata
[8], 16);
4661 catfbtime
= int(catheaderdata
[9], 16);
4662 catfmode
= int(catheaderdata
[10], 16);
4663 catfchmode
= stat
.S_IMODE(catfmode
);
4664 catftypemod
= stat
.S_IFMT(catfmode
);
4665 catfwinattributes
= int(catheaderdata
[11], 16);
4666 catfcompression
= catheaderdata
[12];
4667 catfcsize
= int(catheaderdata
[13], 16);
4668 catfuid
= int(catheaderdata
[14], 16);
4669 catfuname
= catheaderdata
[15];
4670 catfgid
= int(catheaderdata
[16], 16);
4671 catfgname
= catheaderdata
[17];
4672 fid
= int(catheaderdata
[18], 16);
4673 finode
= int(catheaderdata
[19], 16);
4674 flinkcount
= int(catheaderdata
[20], 16);
4675 catfdev_minor
= int(catheaderdata
[21], 16);
4676 catfdev_major
= int(catheaderdata
[22], 16);
4677 catfrdev_minor
= int(catheaderdata
[23], 16);
4678 catfrdev_major
= int(catheaderdata
[24], 16);
4679 catfextrasize
= int(catheaderdata
[25], 16);
4680 catfextrafields
= int(catheaderdata
[26], 16);
4681 extrafieldslist
= [];
4683 extraend
= extrastart
+ catfextrafields
;
4684 extrafieldslist
= [];
4685 if(extrastart
<extraend
):
4686 extrafieldslist
.append(catheaderdata
[extrastart
]);
4687 extrastart
= extrastart
+ 1;
4688 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4689 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4690 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4692 hcmax
= len(catheaderdata
) - 2;
4695 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
['format_delimiter']);
4697 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4699 VerbosePrintOut(catfname
);
4700 VerbosePrintOut("Record Number " + str(il
) + "; File ID " + str(fid
) + "; iNode Number " + str(finode
));
4701 if(catfcs
==catnewfcs
):
4703 VerbosePrintOut("File Header Checksum Passed at offset " + str(catfhstart
));
4704 VerbosePrintOut("'" + str(catfcs
) + "' == " + "'" + str(catnewfcs
) + "'");
4707 VerbosePrintOut("File Header Checksum Failed at offset " + str(catfhstart
));
4708 VerbosePrintOut("'" + str(catfcs
) + "' != " + "'" + str(catnewfcs
) + "'");
4709 valid_archive
= False;
4710 invalid_archive
= True;
4711 catfhend
= catfp
.tell() - 1;
4712 catfcontentstart
= catfp
.tell();
4714 pyhascontents
= False;
4716 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4717 catfcontents
= catfp
.read(catfsize
);
4719 catfcontents
= catfp
.read(catfcsize
);
4720 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
4721 pyhascontents
= True;
4722 if(catfccs
==catnewfccs
):
4724 VerbosePrintOut("File Content Checksum Passed at offset " + str(catfcontentstart
));
4725 VerbosePrintOut("'" + str(catfccs
) + "' == " + "'" + str(catnewfccs
) + "'");
4728 VerbosePrintOut("File Content Checksum Failed at offset " + str(catfcontentstart
));
4729 VerbosePrintOut("'" + str(catfccs
) + "' != " + "'" + str(catnewfccs
) + "'");
4730 valid_archive
= False;
4731 invalid_archive
= True;
4733 VerbosePrintOut("");
4746 create_alias_function("", __file_format_name__
, "Validate", ArchiveFileValidate
);
4748 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4749 formatspecs
= FormatSpecsListToDict(formatspecs
);
4750 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4753 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4754 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4755 if(checkcompressfile
=="tarfile"):
4756 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4757 if(checkcompressfile
=="zipfile"):
4758 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4759 if(rarfile_support
and checkcompressfile
=="rarfile"):
4760 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4761 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4762 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4763 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4770 if(hasattr(sys
.stdin
, "buffer")):
4771 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4773 shutil
.copyfileobj(sys
.stdin
, catfp
);
4775 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4779 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4780 catfp
= download_file_from_internet_file(infile
);
4781 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4787 infile
= RemoveWindowsPath(infile
);
4788 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4789 if(checkcompressfile
=="tarfile"):
4790 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4791 if(checkcompressfile
=="zipfile"):
4792 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4793 if(rarfile_support
and checkcompressfile
=="rarfile"):
4794 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4795 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4796 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4797 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4799 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4800 if(not compresscheck
):
4801 fextname
= os
.path
.splitext(infile
)[1];
4802 if(fextname
==".gz"):
4803 compresscheck
= "gzip";
4804 elif(fextname
==".bz2"):
4805 compresscheck
= "bzip2";
4806 elif(fextname
==".zst"):
4807 compresscheck
= "zstd";
4808 elif(fextname
==".lz4" or fextname
==".clz4"):
4809 compresscheck
= "lz4";
4810 elif(fextname
==".lzo" or fextname
==".lzop"):
4811 compresscheck
= "lzo";
4812 elif(fextname
==".lzma" or fextname
==".xz"):
4813 compresscheck
= "lzma";
4816 if(not compresscheck
):
4818 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4823 SeekToEndOfFile(catfp);
4825 SeekToEndOfFile(catfp);
4826 CatSize = catfp.tell();
4827 CatSizeEnd = CatSize;
4835 curloc
= catfp
.tell();
4838 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4840 catfp
.seek(curloc
, 0);
4841 catstring
= catheader
[0];
4842 catversion
= re
.findall(r
"([\d]+)", catstring
);
4843 fprenumfiles
= catheader
[1];
4844 fnumfiles
= int(fprenumfiles
, 16);
4845 fprechecksumtype
= catheader
[2];
4846 fprechecksum
= catheader
[3];
4847 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4848 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4849 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4850 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4851 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4852 fheadtell
= len(fileheader
);
4853 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4854 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
4855 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4857 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4858 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4859 if(seekstart
<0 and seekstart
>fnumfiles
):
4861 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
4862 seekend
= fnumfiles
;
4863 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
4864 seekend
= fnumfiles
- abs(seekend
);
4867 while(il
< seekstart
):
4868 prefhstart
= catfp
.tell();
4869 if(formatspecs
['new_style']):
4870 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4872 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4873 if(len(preheaderdata
)==0):
4875 prefheadsize
= int(preheaderdata
[0], 16);
4876 prefnumfields
= int(preheaderdata
[1], 16);
4877 if(re
.findall("^[.|/]", preheaderdata
[3])):
4878 prefname
= preheaderdata
[3];
4880 prefname
= "./"+preheaderdata
[3];
4881 prefsize
= int(preheaderdata
[5], 16);
4882 prefcompression
= preheaderdata
[12];
4883 prefcsize
= int(preheaderdata
[13], 16);
4884 prefextrasize
= int(preheaderdata
[24], 16);
4885 prefextrafields
= int(preheaderdata
[25], 16);
4886 extrafieldslist
= [];
4888 extraend
= extrastart
+ prefextrafields
;
4889 extrafieldslist
= [];
4890 if(extrastart
<extraend
):
4891 extrafieldslist
.append(preheaderdata
[extrastart
]);
4892 extrastart
= extrastart
+ 1;
4893 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4894 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4895 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4897 hcmax
= len(preheaderdata
) - 2;
4900 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
['format_delimiter']);
4902 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4903 if(prefcs
!=prenewfcs
and not skipchecksum
):
4904 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4905 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4907 valid_archive
= False;
4908 invalid_archive
= True;
4909 prefhend
= catfp
.tell() - 1;
4910 prefcontentstart
= catfp
.tell();
4912 pyhascontents
= False;
4914 if(prefcompression
=="none" or prefcompression
=="" or prefcompression
=="auto"):
4915 prefcontents
= catfp
.read(prefsize
);
4917 prefcontents
= catfp
.read(prefcsize
);
4918 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4919 pyhascontents
= True;
4920 if(prefccs
!=prenewfccs
and not skipchecksum
):
4921 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4922 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4926 fileidnum
= seekstart
;
4928 while(fileidnum
<seekend
):
4929 catfhstart
= catfp
.tell();
4930 if(formatspecs
['new_style']):
4931 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4933 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4934 if(len(catheaderdata
)==0):
4936 catfheadsize
= int(catheaderdata
[0], 16);
4937 catfnumfields
= int(catheaderdata
[1], 16);
4938 catftype
= int(catheaderdata
[2], 16);
4939 if(re
.findall("^[.|/]", catheaderdata
[3])):
4940 catfname
= catheaderdata
[3];
4942 catfname
= "./"+catheaderdata
[3];
4943 catfbasedir
= os
.path
.dirname(catfname
);
4944 catflinkname
= catheaderdata
[4];
4945 catfsize
= int(catheaderdata
[5], 16);
4946 catfatime
= int(catheaderdata
[6], 16);
4947 catfmtime
= int(catheaderdata
[7], 16);
4948 catfctime
= int(catheaderdata
[8], 16);
4949 catfbtime
= int(catheaderdata
[9], 16);
4950 catfmode
= int(catheaderdata
[10], 16);
4951 catfchmode
= stat
.S_IMODE(catfmode
);
4952 catftypemod
= stat
.S_IFMT(catfmode
);
4953 catfwinattributes
= int(catheaderdata
[11], 16);
4954 catfcompression
= catheaderdata
[12];
4955 catfcsize
= int(catheaderdata
[13], 16);
4956 catfuid
= int(catheaderdata
[14], 16);
4957 catfuname
= catheaderdata
[15];
4958 catfgid
= int(catheaderdata
[16], 16);
4959 catfgname
= catheaderdata
[17];
4960 catfid
= int(catheaderdata
[18], 16);
4961 catfinode
= int(catheaderdata
[19], 16);
4962 catflinkcount
= int(catheaderdata
[20], 16);
4963 catfdev_minor
= int(catheaderdata
[21], 16);
4964 catfdev_major
= int(catheaderdata
[22], 16);
4965 catfrdev_minor
= int(catheaderdata
[23], 16);
4966 catfrdev_major
= int(catheaderdata
[24], 16);
4967 catfextrasize
= int(catheaderdata
[25], 16);
4968 catfextrafields
= int(catheaderdata
[26], 16);
4969 extrafieldslist
= [];
4971 extraend
= extrastart
+ catfextrafields
;
4972 extrafieldslist
= [];
4973 if(extrastart
<extraend
):
4974 extrafieldslist
.append(catheaderdata
[extrastart
]);
4975 extrastart
= extrastart
+ 1;
4976 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4977 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4978 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4980 hcmax
= len(catheaderdata
) - 2;
4983 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
['format_delimiter']);
4985 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4986 if(catfcs
!=catnewfcs
and not skipchecksum
):
4987 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
4988 VerbosePrintOut("'" + str(catfcs
) + "' != " + "'" + str(catnewfcs
) + "'");
4990 catfhend
= catfp
.tell() - 1;
4991 catfcontentstart
= catfp
.tell();
4992 catfcontents
= BytesIO();
4993 pyhascontents
= False;
4994 if(catfsize
>0 and not listonly
):
4995 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4996 catfcontents
.write(catfp
.read(catfsize
));
4998 catfcontents
.write(catfp
.read(catfcsize
));
4999 catfcontents
.seek(0, 0);
5000 catnewfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
5001 pyhascontents
= True;
5002 if(catfccs
!=catnewfccs
and skipchecksum
):
5003 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
5004 VerbosePrintOut("'" + str(catfccs
) + "' != " + "'" + str(catnewfccs
) + "'");
5006 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
5009 catfcontents
.seek(0, 0);
5011 catfcontents
= UncompressArchiveFile(catfcontents
, formatspecs
);
5012 catfcontents
.seek(0, 0);
5013 catfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
5014 if(catfsize
>0 and listonly
):
5015 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
5016 catfp
.seek(catfsize
, 1);
5018 catfp
.seek(catfcsize
, 1);
5019 pyhascontents
= False;
5021 catfcontentend
= catfp
.tell() - 1;
5022 catfcontents
.seek(0, 0);
5023 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
, 'fwinattributes': catfwinattributes
, 'fcompression': catfcompression
, 'fcsize': catfcsize
, 'fuid': catfuid
, 'funame': catfuname
, 'fgid': catfgid
, 'fgname': catfgname
, 'finode': catfinode
, 'flinkcount': catflinkcount
, 'fminor': catfdev_minor
, 'fmajor': catfdev_major
, 'frminor': catfrdev_minor
, 'frmajor': catfrdev_major
, 'fchecksumtype': catfchecksumtype
, 'fnumfields': catfnumfields
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': catfextrasize
, 'fextralist': extrafieldslist
, 'fheaderchecksum': catfcs
, 'fcontentchecksum': catfccs
, 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': catfcontents
} });
5024 fileidnum
= fileidnum
+ 1;
5025 realidnum
= realidnum
+ 1;
5027 catlist
.update({'catfp': catfp
});
5032 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
5034 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5035 formatspecs
= FormatSpecsListToDict(formatspecs
);
5036 catfp
= BytesIO(catstr
);
5037 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5038 return listcatfiles
;
5040 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
5042 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5043 formatspecs
= FormatSpecsListToDict(formatspecs
);
5045 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5046 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5047 return listcatfiles
;
5049 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5050 formatspecs
= FormatSpecsListToDict(formatspecs
);
5052 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5053 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5054 return listcatfiles
;
5056 if(not rarfile_support
):
5057 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5060 if(rarfile_support
):
5061 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5062 formatspecs
= FormatSpecsListToDict(formatspecs
);
5064 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5065 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5066 return listcatfiles
;
5068 if(not py7zr_support
):
5069 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5073 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5074 formatspecs
= FormatSpecsListToDict(formatspecs
);
5076 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5077 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5078 return listcatfiles
;
5080 def InFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5081 formatspecs
= FormatSpecsListToDict(formatspecs
);
5082 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
5083 if(checkcompressfile
=="tarfile"):
5084 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5085 elif(checkcompressfile
=="zipfile"):
5086 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5087 elif(checkcompressfile
=="catfile"):
5088 return ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5089 elif(rarfile_support
and checkcompressfile
=="rarfile"):
5090 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5091 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
5092 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5097 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5098 formatspecs
= FormatSpecsListToDict(formatspecs
);
5099 catver
= formatspecs
['format_ver'];
5100 fileheaderver
= str(int(catver
.replace(".", "")));
5101 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5102 advancedlist
= formatspecs
['use_advanced_list'];
5103 altinode
= formatspecs
['use_alt_inode'];
5106 for line
in sys
.stdin
:
5107 infilelist
.append(line
.strip());
5108 infilelist
= list(filter(None, infilelist
));
5109 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
5110 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
5112 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
5113 for line
in finfile
:
5114 infilelist
.append(line
.strip());
5115 infilelist
= list(filter(None, infilelist
));
5117 if(isinstance(infiles
, (list, tuple, ))):
5118 infilelist
= list(filter(None, infiles
));
5119 elif(isinstance(infiles
, (str, ))):
5120 infilelist
= list(filter(None, [infiles
]));
5122 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
5124 GetDirList
= ListDir(infilelist
, followlink
, False);
5132 inodetocatinode
= {};
5134 fnumfiles
= int(len(GetDirList
));
5135 catver
= formatspecs
['format_ver'];
5136 fileheaderver
= str(int(catver
.replace(".", "")));
5137 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5138 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5139 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5140 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5141 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5142 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5143 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5144 fheadtell
= len(fileheader
);
5145 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5146 for curfname
in GetDirList
:
5147 catfhstart
= fheadtell
;
5148 if(re
.findall("^[.|/]", curfname
)):
5151 fname
= "./"+curfname
;
5153 VerbosePrintOut(fname
);
5154 if(not followlink
or followlink
is None):
5155 fstatinfo
= os
.lstat(fname
);
5157 fstatinfo
= os
.stat(fname
);
5158 fpremode
= fstatinfo
.st_mode
;
5159 finode
= fstatinfo
.st_ino
;
5160 flinkcount
= fstatinfo
.st_nlink
;
5162 if(stat
.S_ISREG(fpremode
)):
5164 elif(stat
.S_ISLNK(fpremode
)):
5166 elif(stat
.S_ISCHR(fpremode
)):
5168 elif(stat
.S_ISBLK(fpremode
)):
5170 elif(stat
.S_ISDIR(fpremode
)):
5172 elif(stat
.S_ISFIFO(fpremode
)):
5174 elif(stat
.S_ISSOCK(fpremode
)):
5176 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
5178 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
5180 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
5185 fbasedir
= os
.path
.dirname(fname
);
5187 if(not followlink
and finode
!=0):
5189 if(finode
in inodelist
):
5191 flinkname
= inodetofile
[finode
];
5195 fcurinode
= inodetocatinode
[finode
];
5196 if(finode
not in inodelist
):
5197 inodelist
.append(finode
);
5198 inodetofile
.update({finode
: fname
});
5199 inodetocatinode
.update({finode
: curinode
});
5203 fcurinode
= curinode
;
5204 curinode
= curinode
+ 1;
5206 fcurinode
= curinode
;
5207 curinode
= curinode
+ 1;
5208 curfid
= curfid
+ 1;
5210 flinkname
= os
.readlink(fname
);
5211 fdev
= fstatinfo
.st_dev
;
5212 getfdev
= GetDevMajorMinor(fdev
);
5213 fdev_minor
= getfdev
[0];
5214 fdev_major
= getfdev
[1];
5215 frdev
= fstatinfo
.st_dev
;
5216 if(hasattr(fstatinfo
, "st_rdev")):
5217 frdev
= fstatinfo
.st_rdev
;
5219 frdev
= fstatinfo
.st_dev
;
5220 getfrdev
= GetDevMajorMinor(frdev
);
5221 frdev_minor
= getfrdev
[0];
5222 frdev_major
= getfrdev
[1];
5223 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5225 if(ftype
==0 or ftype
==7):
5226 fsize
= fstatinfo
.st_size
;
5227 fatime
= fstatinfo
.st_atime
;
5228 fmtime
= fstatinfo
.st_mtime
;
5229 fctime
= fstatinfo
.st_ctime
;
5230 if(hasattr(fstatinfo
, "st_birthtime")):
5231 fbtime
= fstatinfo
.st_birthtime
;
5233 fbtime
= fstatinfo
.st_ctime
;
5234 fmode
= fstatinfo
.st_mode
;
5235 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
5236 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
5237 fuid
= fstatinfo
.st_uid
;
5238 fgid
= fstatinfo
.st_gid
;
5243 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
5244 funame
= userinfo
.pw_name
;
5253 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
5254 fgname
= groupinfo
.gr_name
;
5259 fdev_minor
= fdev_minor
;
5260 fdev_major
= fdev_major
;
5261 frdev_minor
= frdev_minor
;
5262 frdev_major
= frdev_major
;
5263 flinkcount
= flinkcount
;
5264 if(hasattr(fstatinfo
, "st_file_attributes")):
5265 fwinattributes
= fstatinfo
.st_file_attributes
;
5270 fcontents
= BytesIO();
5271 if(ftype
==0 or ftype
==7):
5272 with
open(fname
, "rb") as fpc
:
5273 shutil
.copyfileobj(fpc
, fcontents
);
5274 if(followlink
and (ftype
==1 or ftype
==2)):
5275 flstatinfo
= os
.stat(flinkname
);
5276 with
open(flinkname
, "rb") as fpc
:
5277 shutil
.copyfileobj(fpc
, fcontents
);
5278 fcontents
.seek(0, 0);
5279 ftypehex
= format(ftype
, 'x').lower();
5280 extrafields
= len(extradata
);
5281 extrafieldslist
= extradata
;
5282 catfextrafields
= extrafields
;
5283 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5284 if(len(extradata
)>0):
5285 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5286 extrasizelen
= len(extrasizestr
);
5287 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5288 catoutlist
= [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(fwinattributes
), 'x').lower(), fcompression
, format(int(fcsize
), '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()];
5289 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5290 catoutlenhex
= format(catoutlen
, 'x').lower();
5291 catoutlist
.insert(0, catoutlenhex
);
5292 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5293 catheaderdata
= catoutlist
;
5294 if(len(extradata
)>0):
5295 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5296 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
5297 catfnumfields
= catoutlen
;
5298 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5299 fcontents
.seek(0, 0);
5300 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5301 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5302 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5303 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5304 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5305 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5306 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5307 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5308 catfcontentstart
= fheadtell
;
5309 fheadtell
+= len(catfileoutstr
) + 1;
5310 catfcontentend
= fheadtell
- 1;
5311 catfhend
= catfcontentend
;
5312 fcontents
.seek(0, 0);
5313 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5314 pyhascontents
= False;
5315 if(int(fsize
)>0 and not listonly
):
5316 pyhascontents
= True;
5317 if(int(fsize
)>0 and listonly
):
5318 fcontents
= BytesIO();
5319 pyhascontents
= False;
5320 fcontents
.seek(0, 0);
5321 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
, 'fwinattributes': fwinattributes
, 'fcompression': fcompression
, 'fcsize': fcsize
, '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
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
5322 fileidnum
= fileidnum
+ 1;
5325 def TarFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5326 formatspecs
= FormatSpecsListToDict(formatspecs
);
5332 inodetocatinode
= {};
5336 if(hasattr(sys
.stdin
, "buffer")):
5337 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5339 shutil
.copyfileobj(sys
.stdin
, infile
);
5344 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5345 infile
= download_file_from_internet_file(infile
);
5350 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5352 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
5354 if(not tarfile
.TarFileCheck(infile
)):
5356 except AttributeError:
5357 if(not TarFileCheck(infile
)):
5362 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5363 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
5365 tarfp
= tarfile
.open(infile
, "r");
5366 except FileNotFoundError
:
5368 fnumfiles
= int(len(tarfp
.getmembers()));
5369 catver
= formatspecs
['format_ver'];
5370 fileheaderver
= str(int(catver
.replace(".", "")));
5371 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5372 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5373 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5374 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5375 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5376 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5377 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5378 fheadtell
= len(fileheader
);
5379 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5380 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
5381 catfhstart
= fheadtell
;
5382 if(re
.findall("^[.|/]", member
.name
)):
5383 fname
= member
.name
;
5385 fname
= "./"+member
.name
;
5387 VerbosePrintOut(fname
);
5388 fpremode
= member
.mode
;
5389 ffullmode
= member
.mode
;
5393 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5395 elif(member
.isdev()):
5396 ffullmode
= member
.mode
;
5398 elif(member
.islnk()):
5399 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5401 elif(member
.issym()):
5402 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
5404 elif(member
.ischr()):
5405 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
5407 elif(member
.isblk()):
5408 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
5410 elif(member
.isdir()):
5411 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
5413 elif(member
.isfifo()):
5414 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
5416 elif(member
.issparse()):
5417 ffullmode
= member
.mode
;
5420 ffullmode
= member
.mode
;
5423 fbasedir
= os
.path
.dirname(fname
);
5427 curfid
= curfid
+ 1;
5429 flinkname
= member
.linkname
;
5430 fdev_minor
= member
.devminor
;
5431 fdev_major
= member
.devmajor
;
5432 frdev_minor
= member
.devminor
;
5433 frdev_major
= member
.devmajor
;
5434 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5436 elif(ftype
==0 or ftype
==7):
5437 fsize
= member
.size
;
5439 fsize
= member
.size
;
5440 fatime
= member
.mtime
;
5441 fmtime
= member
.mtime
;
5442 fctime
= member
.mtime
;
5443 fbtime
= member
.mtime
;
5445 fchmode
= stat
.S_IMODE(ffullmode
);
5446 ftypemod
= stat
.S_IFMT(ffullmode
);
5449 funame
= member
.uname
;
5450 fgname
= member
.gname
;
5451 flinkcount
= flinkcount
;
5452 fwinattributes
= int(0);
5455 fcontents
= BytesIO();
5456 if(ftype
==0 or ftype
==7):
5457 with tarfp
.extractfile(member
) as fpc
:
5458 shutil
.copyfileobj(fpc
, fcontents
);
5459 fcontents
.seek(0, 0);
5460 ftypehex
= format(ftype
, 'x').lower();
5461 extrafields
= len(extradata
);
5462 extrafieldslist
= extradata
;
5463 catfextrafields
= extrafields
;
5464 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5465 if(len(extradata
)>0):
5466 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5467 extrasizelen
= len(extrasizestr
);
5468 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5469 catoutlist
= [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(fwinattributes
), 'x').lower(), fcompression
, format(int(fcsize
), '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()];
5470 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5471 catoutlenhex
= format(catoutlen
, 'x').lower();
5472 catoutlist
.insert(0, catoutlenhex
);
5473 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5474 catheaderdata
= catoutlist
;
5475 if(len(extradata
)>0):
5476 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5477 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
5478 catfnumfields
= catoutlen
;
5479 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5480 fcontents
.seek(0, 0);
5481 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5482 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5483 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5484 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5485 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5486 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5487 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5488 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5489 catfcontentstart
= fheadtell
;
5490 fheadtell
+= len(catfileoutstr
) + 1;
5491 catfcontentend
= fheadtell
- 1;
5492 catfhend
= catfcontentend
;
5493 fcontents
.seek(0, 0);
5494 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5495 pyhascontents
= False;
5496 if(int(fsize
)>0 and not listonly
):
5497 pyhascontents
= True;
5498 if(int(fsize
)>0 and listonly
):
5499 fcontents
= BytesIO();
5500 pyhascontents
= False;
5501 fcontents
.seek(0, 0);
5502 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
, 'fwinattributes': fwinattributes
, 'fcompression': fcompression
, 'fcsize': fcsize
, '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
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
5503 fileidnum
= fileidnum
+ 1;
5506 def ZipFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5507 formatspecs
= FormatSpecsListToDict(formatspecs
);
5513 inodetocatinode
= {};
5517 if(hasattr(sys
.stdin
, "buffer")):
5518 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5520 shutil
.copyfileobj(sys
.stdin
, infile
);
5525 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5526 infile
= download_file_from_internet_file(infile
);
5531 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5535 if(not zipfile
.is_zipfile(infile
)):
5538 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
5539 except FileNotFoundError
:
5541 ziptest
= zipfp
.testzip();
5543 VerbosePrintOut("Bad file found!");
5544 fnumfiles
= int(len(zipfp
.infolist()));
5545 catver
= formatspecs
['format_ver'];
5546 fileheaderver
= str(int(catver
.replace(".", "")));
5547 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5548 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5549 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5550 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5551 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5552 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5553 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5554 fheadtell
= len(fileheader
);
5555 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5556 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
5557 catfhstart
= fheadtell
;
5558 if(re
.findall("^[.|/]", member
.filename
)):
5559 fname
= member
.filename
;
5561 fname
= "./"+member
.filename
;
5562 zipinfo
= zipfp
.getinfo(member
.filename
);
5564 VerbosePrintOut(fname
);
5565 if(not member
.is_dir()):
5566 fpremode
= stat
.S_IFREG
+ 438;
5567 elif(member
.is_dir()):
5568 fpremode
= stat
.S_IFDIR
+ 511;
5571 if(not member
.is_dir()):
5573 elif(member
.is_dir()):
5576 fbasedir
= os
.path
.dirname(fname
);
5580 curfid
= curfid
+ 1;
5588 fsize
= member
.file_size
;
5590 fsize
= member
.file_size
;
5591 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5592 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5593 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5594 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5595 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
5596 fwinattributes
= int(zipinfo
.external_attr
);
5597 if(not member
.is_dir()):
5598 fmode
= int(stat
.S_IFREG
+ 438);
5599 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5600 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5601 elif(member
.is_dir()):
5602 fmode
= int(stat
.S_IFDIR
+ 511);
5603 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5604 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5605 elif(zipinfo
.create_system
==3):
5606 fwinattributes
= int(0);
5607 fmode
= int(zipinfo
.external_attr
);
5609 fwinattributes
= int(0);
5610 if(not member
.is_dir()):
5611 fmode
= int(stat
.S_IFREG
+ 438);
5612 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5613 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5614 elif(member
.is_dir()):
5615 fmode
= int(stat
.S_IFDIR
+ 511);
5616 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5617 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5622 except AttributeError:
5628 except AttributeError:
5635 userinfo
= pwd
.getpwuid(os
.getuid());
5636 funame
= userinfo
.pw_name
;
5639 except AttributeError:
5647 groupinfo
= grp
.getgrgid(os
.getgid());
5648 fgname
= groupinfo
.gr_name
;
5651 except AttributeError:
5655 fcontents
= BytesIO();
5657 fcontents
.write(zipfp
.read(member
.filename
));
5658 fcontents
.seek(0, 0);
5659 ftypehex
= format(ftype
, 'x').lower();
5660 extrafields
= len(extradata
);
5661 extrafieldslist
= extradata
;
5662 catfextrafields
= extrafields
;
5663 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5664 if(len(extradata
)>0):
5665 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5666 extrasizelen
= len(extrasizestr
);
5667 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5668 catoutlist
= [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(fwinattributes
), 'x').lower(), fcompression
, format(int(fcsize
), '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()];
5669 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5670 catoutlenhex
= format(catoutlen
, 'x').lower();
5671 catoutlist
.insert(0, catoutlenhex
);
5672 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5673 catheaderdata
= catoutlist
;
5674 if(len(extradata
)>0):
5675 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5676 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
5677 catfnumfields
= catoutlen
;
5678 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5679 fcontents
.seek(0, 0);
5680 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5681 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5682 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5683 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5684 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5685 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5686 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5687 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5688 catfcontentstart
= fheadtell
;
5689 fheadtell
+= len(catfileoutstr
) + 1;
5690 catfcontentend
= fheadtell
- 1;
5691 catfhend
= catfcontentend
;
5692 fcontents
.seek(0, 0);
5693 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5694 pyhascontents
= False;
5695 if(int(fsize
)>0 and not listonly
):
5696 pyhascontents
= True;
5697 if(int(fsize
)>0 and listonly
):
5698 fcontents
= BytesIO();
5699 pyhascontents
= False;
5700 fcontents
.seek(0, 0);
5701 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
, 'fwinattributes': fwinattributes
, 'fcompression': fcompression
, 'fcsize': fcsize
, '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
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
5702 fileidnum
= fileidnum
+ 1;
5705 if(not rarfile_support
):
5706 def RarFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5709 if(rarfile_support
):
5710 def RarFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5711 formatspecs
= FormatSpecsListToDict(formatspecs
);
5717 inodetocatinode
= {};
5719 if(not os
.path
.exists(infile
,) or not os
.path
.isfile(infile
,)):
5721 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5723 rarfp
= rarfile
.RarFile(infile
, "r");
5724 rartest
= rarfp
.testrar();
5726 VerbosePrintOut("Bad file found!");
5727 fnumfiles
= int(len(rarfp
.infolist()));
5728 catver
= formatspecs
['format_ver'];
5729 fileheaderver
= str(int(catver
.replace(".", "")));
5730 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5731 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5732 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5733 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5734 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5735 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5736 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5737 fheadtell
= len(fileheader
);
5738 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5739 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5740 catfhstart
= fheadtell
;
5743 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
5746 member
.external_attr
5748 except AttributeError:
5750 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
5753 member
.external_attr
5755 except AttributeError:
5760 if(re
.findall("^[.|/]", member
.filename
)):
5761 fname
= member
.filename
;
5763 fname
= "./"+member
.filename
;
5764 rarinfo
= rarfp
.getinfo(member
.filename
);
5766 VerbosePrintOut(fname
);
5767 if(is_unix
and member
.external_attr
!=0):
5768 fpremode
= int(member
.external_attr
);
5769 elif(member
.is_file()):
5770 fpremode
= stat
.S_IFREG
+ 438;
5771 elif(member
.is_symlink()):
5772 fpremode
= stat
.S_IFLNK
+ 438;
5773 elif(member
.is_dir()):
5774 fpremode
= stat
.S_IFDIR
+ 511;
5775 if(is_windows
and member
.external_attr
!=0):
5776 fwinattributes
= int(member
.external_attr
);
5778 fwinattributes
= int(0);
5783 if(member
.is_file()):
5785 elif(member
.is_symlink()):
5787 elif(member
.is_dir()):
5791 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
5792 fbasedir
= os
.path
.dirname(fname
);
5796 curfid
= curfid
+ 1;
5804 fsize
= member
.file_size
;
5807 fatime
= int(member
.atime
.timestamp());
5809 fatime
= int(member
.mtime
.timestamp());
5810 except AttributeError:
5811 fatime
= int(member
.mtime
.timestamp());
5812 fmtime
= int(member
.mtime
.timestamp());
5815 fctime
= int(member
.ctime
.timestamp());
5817 fctime
= int(member
.mtime
.timestamp());
5818 except AttributeError:
5819 fctime
= int(member
.mtime
.timestamp());
5820 fbtime
= int(member
.mtime
.timestamp());
5821 if(is_unix
and member
.external_attr
!=0):
5822 fmode
= int(member
.external_attr
);
5823 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5824 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5825 elif(member
.is_file()):
5826 fmode
= int(stat
.S_IFREG
+ 438)
5827 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5828 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5829 elif(member
.is_symlink()):
5830 fmode
= int(stat
.S_IFLNK
+ 438)
5831 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5832 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5833 elif(member
.is_dir()):
5834 fmode
= int(stat
.S_IFDIR
+ 511)
5835 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5836 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5839 except AttributeError:
5845 except AttributeError:
5852 userinfo
= pwd
.getpwuid(os
.getuid());
5853 funame
= userinfo
.pw_name
;
5856 except AttributeError:
5864 groupinfo
= grp
.getgrgid(os
.getgid());
5865 fgname
= groupinfo
.gr_name
;
5868 except AttributeError:
5872 fcontents
= BytesIO();
5874 fcontents
.write(rarfp
.read(member
.filename
));
5875 fcontents
.seek(0, 0);
5876 ftypehex
= format(ftype
, 'x').lower();
5877 extrafields
= len(extradata
);
5878 extrafieldslist
= extradata
;
5879 catfextrafields
= extrafields
;
5880 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5881 if(len(extradata
)>0):
5882 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5883 extrasizelen
= len(extrasizestr
);
5884 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5885 catoutlist
= [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(fwinattributes
), 'x').lower(), fcompression
, format(int(fcsize
), '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()];
5886 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5887 catoutlenhex
= format(catoutlen
, 'x').lower();
5888 catoutlist
.insert(0, catoutlenhex
);
5889 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5890 if(len(extradata
)>0):
5891 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5892 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
5893 catfnumfields
= 24 + catfextrafields
;
5894 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5895 fcontents
.seek(0, 0);
5896 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5897 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5898 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5899 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5900 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5901 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5902 catheaderdata
= catoutlist
;
5903 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5904 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5905 catfcontentstart
= fheadtell
;
5906 fheadtell
+= len(catfileoutstr
) + 1;
5907 catfcontentend
= fheadtell
- 1;
5908 catfhend
= catfcontentend
;
5909 fcontents
.seek(0, 0);
5910 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5911 pyhascontents
= False;
5912 if(int(fsize
)>0 and not listonly
):
5913 pyhascontents
= True;
5914 if(int(fsize
)>0 and listonly
):
5915 fcontents
= BytesIO();
5916 pyhascontents
= False;
5917 fcontents
.seek(0, 0);
5918 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
, 'fwinattributes': fwinattributes
, 'fcompression': fcompression
, 'fcsize': fcsize
, '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
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
5919 fileidnum
= fileidnum
+ 1;
5922 if(not py7zr_support
):
5923 def SevenZipFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5927 def SevenZipFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5928 formatspecs
= FormatSpecsListToDict(formatspecs
);
5934 inodetocatinode
= {};
5936 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
5937 file_content
= szpfp
.readall();
5938 #sztest = szpfp.testzip();
5939 sztestalt
= szpfp
.test();
5941 VerbosePrintOut("Bad file found!");
5942 numfiles
= int(len(szpfp
.list()));
5943 catver
= formatspecs
['format_ver'];
5944 fileheaderver
= str(int(catver
.replace(".", "")));
5945 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5946 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5947 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5948 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5949 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5950 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5951 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5952 fheadtell
= len(fileheader
);
5953 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5954 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
5955 catfhstart
= fheadtell
;
5956 if(re
.findall("^[.|/]", member
.filename
)):
5957 fname
= member
.filename
;
5959 fname
= "./"+member
.filename
;
5960 if(not member
.is_directory
):
5961 fpremode
= int(stat
.S_IFREG
+ 438);
5962 elif(member
.is_directory
):
5963 fpremode
= int(stat
.S_IFDIR
+ 511);
5964 fwinattributes
= int(0);
5969 if(member
.is_directory
):
5974 fbasedir
= os
.path
.dirname(fname
);
5978 curfid
= curfid
+ 1;
5985 fatime
= int(member
.creationtime
.timestamp());
5986 fmtime
= int(member
.creationtime
.timestamp());
5987 fctime
= int(member
.creationtime
.timestamp());
5988 fbtime
= int(member
.creationtime
.timestamp());
5989 if(member
.is_directory
):
5990 fmode
= int(stat
.S_IFDIR
+ 511)
5991 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5992 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5994 fmode
= int(stat
.S_IFLNK
+ 438)
5995 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5996 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5999 except AttributeError:
6005 except AttributeError:
6012 userinfo
= pwd
.getpwuid(os
.getuid());
6013 funame
= userinfo
.pw_name
;
6016 except AttributeError:
6024 groupinfo
= grp
.getgrgid(os
.getgid());
6025 fgname
= groupinfo
.gr_name
;
6028 except AttributeError:
6032 fcontents
= BytesIO();
6034 fcontents
.write(file_content
[member
.filename
].read());
6035 fsize
= format(fcontents
.tell(), 'x').lower();
6037 fcontents
.seek(0, 0);
6038 ftypehex
= format(ftype
, 'x').lower();
6039 extrafields
= len(extradata
);
6040 extrafieldslist
= extradata
;
6041 catfextrafields
= extrafields
;
6042 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
6043 if(len(extradata
)>0):
6044 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6045 extrasizelen
= len(extrasizestr
);
6046 extrasizelenhex
= format(extrasizelen
, 'x').lower();
6047 catoutlist
= [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(fwinattributes
), 'x').lower(), fcompression
, format(int(fcsize
), '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()];
6048 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6049 catoutlenhex
= format(catoutlen
, 'x').lower();
6050 catoutlist
.insert(0, catoutlenhex
);
6051 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
6052 catheaderdata
= catoutlist
;
6053 if(len(extradata
)>0):
6054 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6055 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
6056 catfnumfields
= 24 + catfextrafields
;
6057 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6058 fcontents
.seek(0, 0);
6059 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
6060 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6061 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
6062 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
6063 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6064 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6065 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6066 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
6067 catfcontentstart
= fheadtell
;
6068 fheadtell
+= len(catfileoutstr
) + 1;
6069 catfcontentend
= fheadtell
- 1;
6070 catfhend
= catfcontentend
;
6071 fcontents
.seek(0, 0);
6072 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
6073 pyhascontents
= False;
6074 if(int(fsize
)>0 and not listonly
):
6075 pyhascontents
= True;
6076 if(int(fsize
)>0 and listonly
):
6077 fcontents
= BytesIO();
6078 pyhascontents
= False;
6079 fcontents
.seek(0, 0);
6080 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
, 'fwinattributes': fwinattributes
, 'fcompression': fcompression
, 'fcsize': fcsize
, '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
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
6081 fileidnum
= fileidnum
+ 1;
6084 def InFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6085 formatspecs
= FormatSpecsListToDict(formatspecs
);
6086 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
6087 if(checkcompressfile
=="tarfile"):
6088 return TarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6089 elif(checkcompressfile
=="zipfile"):
6090 return ZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6091 elif(checkcompressfile
=="catfile"):
6092 return ArchiveFileToArray(infile
, 0, 0, listonly
, True, False, formatspecs
, False);
6093 elif(rarfile_support
and checkcompressfile
=="rarfile"):
6094 return RarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6095 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
6096 return SevenZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6101 def ListDirToArray(infiles
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6102 formatspecs
= FormatSpecsListToDict(formatspecs
);
6103 outarray
= BytesIO();
6104 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6105 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6106 return listcatfiles
;
6108 def ArchiveFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6109 formatspecs
= FormatSpecsListToDict(formatspecs
);
6110 if(isinstance(infile
, dict)):
6111 listcatfiles
= infile
;
6113 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6114 infile
= RemoveWindowsPath(infile
);
6115 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
, returnfp
);
6116 if(not listcatfiles
):
6118 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': {}}}};
6120 catarray
.update({'catfp': listcatfiles
['catfp']});
6121 lenlist
= len(listcatfiles
['ffilelist']);
6123 lcfx
= int(listcatfiles
['fnumfiles']);
6124 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6125 lcfx
= int(lenlist
);
6127 lcfx
= int(listcatfiles
['fnumfiles']);
6129 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6130 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6131 catarray
['filetoid'].update(filetoidarray
);
6132 catarray
['idtofile'].update(idtofilearray
);
6133 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6134 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6135 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6136 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6137 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6138 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6139 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6140 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6141 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6142 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6143 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6144 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6145 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6146 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6147 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6148 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6149 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6150 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6151 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6152 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6153 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6154 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6155 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6156 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6157 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6158 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6159 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6160 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6161 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6162 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6163 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6167 create_alias_function("", __file_format_name__
, "ToArrayIndex", ArchiveFileToArrayIndex
);
6169 def ListDirToArrayIndexAlt(infiles
, dirlistfromtxt
=False, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6170 formatspecs
= FormatSpecsListToDict(formatspecs
);
6171 listcatfiles
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6172 if(not listcatfiles
):
6174 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': {}}}};
6175 lenlist
= len(listcatfiles
['ffilelist']);
6177 lcfx
= int(listcatfiles
['fnumfiles']);
6178 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6179 lcfx
= int(lenlist
);
6181 lcfx
= int(listcatfiles
['fnumfiles']);
6183 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6184 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6185 catarray
['filetoid'].update(filetoidarray
);
6186 catarray
['idtofile'].update(idtofilearray
);
6187 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6188 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6189 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6190 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6191 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6192 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6193 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6194 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6195 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6196 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6197 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6198 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6199 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6200 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6201 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6202 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6203 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6204 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6205 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6206 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6207 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6208 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6209 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6210 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6211 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6212 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6213 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6214 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6215 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6216 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6217 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6221 def TarFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6222 formatspecs
= FormatSpecsListToDict(formatspecs
);
6223 listcatfiles
= TarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6224 if(not listcatfiles
):
6226 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': {}}}};
6227 lenlist
= len(listcatfiles
['ffilelist']);
6229 lcfx
= int(listcatfiles
['fnumfiles']);
6230 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6231 lcfx
= int(lenlist
);
6233 lcfx
= int(listcatfiles
['fnumfiles']);
6235 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6236 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6237 catarray
['filetoid'].update(filetoidarray
);
6238 catarray
['idtofile'].update(idtofilearray
);
6239 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6240 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6241 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6242 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6243 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6244 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6245 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6246 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6247 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6248 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6249 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6250 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6251 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6252 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6253 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6254 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6255 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6256 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6257 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6258 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6259 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6260 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6261 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6262 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6263 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6264 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6265 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6266 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6267 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6268 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6269 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6273 def ZipFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6274 formatspecs
= FormatSpecsListToDict(formatspecs
);
6275 listcatfiles
= ZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6276 if(not listcatfiles
):
6278 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': {}}}};
6279 lenlist
= len(listcatfiles
['ffilelist']);
6281 lcfx
= int(listcatfiles
['fnumfiles']);
6282 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6283 lcfx
= int(lenlist
);
6285 lcfx
= int(listcatfiles
['fnumfiles']);
6287 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6288 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6289 catarray
['filetoid'].update(filetoidarray
);
6290 catarray
['idtofile'].update(idtofilearray
);
6291 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6292 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6293 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6294 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6295 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6296 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6297 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6298 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6299 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6300 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6301 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6302 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6303 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6304 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6305 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6306 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6307 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6308 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6309 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6310 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6311 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6312 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6313 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6314 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6315 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6316 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6317 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6318 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6319 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6320 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6321 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6325 if(not rarfile_support
):
6326 def RarFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6329 if(rarfile_support
):
6330 def RarFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6331 formatspecs
= FormatSpecsListToDict(formatspecs
);
6332 listcatfiles
= RarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6333 if(not listcatfiles
):
6335 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': {}}}};
6336 lenlist
= len(listcatfiles
['ffilelist']);
6338 lcfx
= int(listcatfiles
['fnumfiles']);
6339 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6340 lcfx
= int(lenlist
);
6342 lcfx
= int(listcatfiles
['fnumfiles']);
6344 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6345 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6346 catarray
['filetoid'].update(filetoidarray
);
6347 catarray
['idtofile'].update(idtofilearray
);
6348 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6349 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6350 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6351 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6352 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6353 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6354 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6355 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6356 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6357 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6358 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6359 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6360 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6361 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6362 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6363 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6364 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6365 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6366 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6367 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6368 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6369 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6370 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6371 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6372 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6373 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6374 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6375 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6376 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6377 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6378 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6382 if(not py7zr_support
):
6383 def SevenZipFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6387 def SevenZipFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6388 formatspecs
= FormatSpecsListToDict(formatspecs
);
6389 listcatfiles
= SevenZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6390 if(not listcatfiles
):
6392 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': {}}}};
6393 lenlist
= len(listcatfiles
['ffilelist']);
6395 lcfx
= int(listcatfiles
['fnumfiles']);
6396 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6397 lcfx
= int(lenlist
);
6399 lcfx
= int(listcatfiles
['fnumfiles']);
6401 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6402 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6403 catarray
['filetoid'].update(filetoidarray
);
6404 catarray
['idtofile'].update(idtofilearray
);
6405 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6406 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6407 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6408 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6409 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6410 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6411 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6412 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6413 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6414 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6415 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6416 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6417 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6418 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6419 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6420 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6421 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6422 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6423 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6424 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6425 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6426 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6427 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6428 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6429 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6430 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6431 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6432 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6433 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6434 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6435 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6439 def ArchiveFileStringToArrayIndex(catstr
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6440 formatspecs
= FormatSpecsListToDict(formatspecs
);
6441 catfp
= BytesIO(catstr
);
6442 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
, returnfp
);
6443 return listcatfiles
;
6445 create_alias_function("", __file_format_name__
, "StringToArrayIndex", ArchiveFileStringToArrayIndex
);
6447 def TarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6448 formatspecs
= FormatSpecsListToDict(formatspecs
);
6450 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
6451 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6452 return listcatfiles
;
6454 def ZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6455 formatspecs
= FormatSpecsListToDict(formatspecs
);
6457 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
6458 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6459 return listcatfiles
;
6461 if(not rarfile_support
):
6462 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6465 if(rarfile_support
):
6466 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6467 formatspecs
= FormatSpecsListToDict(formatspecs
);
6469 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
6470 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6471 return listcatfiles
;
6473 if(not py7zr_support
):
6474 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6478 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6479 formatspecs
= FormatSpecsListToDict(formatspecs
);
6481 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
6482 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6483 return listcatfiles
;
6485 def ListDirToArrayIndex(infiles
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6486 formatspecs
= FormatSpecsListToDict(formatspecs
);
6487 outarray
= BytesIO();
6488 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
, True);
6489 listcatfiles
= ArchiveFileToArrayIndex(outarray
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
)
6490 return listcatfiles
;
6492 def RePackArchiveFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6493 formatspecs
= FormatSpecsListToDict(formatspecs
);
6494 if(isinstance(infile
, dict)):
6495 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6496 listcatfiles
= prelistcatfiles
['list'];
6498 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6499 infile
= RemoveWindowsPath(infile
);
6501 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6502 listcatfiles
= prelistcatfiles
['list'];
6504 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6505 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
6506 outfile
= RemoveWindowsPath(outfile
);
6507 checksumtype
= checksumtype
.lower();
6508 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
6509 checksumtype
="crc32";
6510 if(checksumtype
=="none"):
6512 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
6513 compression
= "auto";
6514 if(compression
not in compressionlist
and compression
is None):
6515 compression
= "auto";
6517 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6518 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
6519 if(os
.path
.exists(outfile
)):
6522 except OSError as e
:
6524 if(not listcatfiles
):
6529 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6531 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6534 fbasename
= os
.path
.splitext(outfile
)[0];
6535 fextname
= os
.path
.splitext(outfile
)[1];
6536 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
6537 catver
= formatspecs
['format_ver'];
6538 fileheaderver
= str(int(catver
.replace(".", "")));
6539 lenlist
= len(listcatfiles
['ffilelist']);
6540 fnumfiles
= int(listcatfiles
['fnumfiles']);
6541 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
6542 fnumfiles
= lenlist
;
6543 AppendFileHeader(catfp
, fnumfiles
, checksumtype
, formatspecs
);
6544 lenlist
= len(listcatfiles
['ffilelist']);
6545 fnumfiles
= int(listcatfiles
['fnumfiles']);
6547 lcfx
= int(listcatfiles
['fnumfiles']);
6548 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6549 lcfx
= int(lenlist
);
6551 lcfx
= int(listcatfiles
['fnumfiles']);
6559 if(re
.findall("^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
6560 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
6562 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
6564 VerbosePrintOut(fname
);
6565 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
6566 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
6567 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6568 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
6569 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
6570 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
6571 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
6572 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
6573 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
6574 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
6575 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
6576 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
6577 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
6578 finode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['finode']), 'x').lower();
6579 flinkcount
= format(int(listcatfiles
['ffilelist'][reallcfi
]['flinkcount']), 'x').lower();
6580 fwinattributes
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fwinattributes']), 'x').lower();
6581 fcompression
= listcatfiles
['ffilelist'][reallcfi
]['fcompression'];
6582 fcsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fcsize']), 'x').lower();
6583 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
6584 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
6585 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
6586 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
6587 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
6588 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6589 if(not followlink
and len(extradata
)<0):
6590 extradata
= listcatfiles
['ffilelist'][reallcfi
]['fextralist'];
6591 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
6593 fcsize
= format(int(0), 'x').lower();
6594 if(not compresswholefile
):
6595 fcontents
.seek(0, 2);
6596 ucfsize
= fcontents
.tell();
6597 fcontents
.seek(0, 0);
6598 if(compression
=="auto"):
6599 ilsize
= len(compressionlistalt
);
6602 while(ilmin
< ilsize
):
6603 cfcontents
= BytesIO();
6604 shutil
.copyfileobj(fcontents
, cfcontents
);
6605 fcontents
.seek(0, 0);
6606 cfcontents
.seek(0, 0);
6607 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
6609 cfcontents
.seek(0, 2);
6610 ilcsize
.append(cfcontents
.tell());
6614 ilcsize
.append(sys
.maxint
);
6615 except AttributeError:
6616 ilcsize
.append(sys
.maxsize
);
6618 ilcmin
= ilcsize
.index(min(ilcsize
));
6619 compression
= compressionlistalt
[ilcmin
];
6620 fcontents
.seek(0, 0);
6621 cfcontents
= BytesIO();
6622 shutil
.copyfileobj(fcontents
, cfcontents
);
6623 cfcontents
.seek(0, 0);
6624 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
6625 cfcontents
.seek(0, 2);
6626 cfsize
= cfcontents
.tell();
6627 if(ucfsize
> cfsize
):
6628 fcsize
= format(int(cfsize
), 'x').lower();
6629 fcompression
= compression
;
6631 fcontents
= cfcontents
;
6633 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
6634 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6635 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6636 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6637 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
6638 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
6639 flinkname
= flinkinfo
['flinkname'];
6640 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
6641 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
6642 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
6643 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
6644 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
6645 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
6646 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
6647 funame
= flinkinfo
['funame'];
6648 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
6649 fgname
= flinkinfo
['fgname'];
6650 finode
= format(int(flinkinfo
['finode']), 'x').lower();
6651 flinkcount
= format(int(flinkinfo
['flinkcount']), 'x').lower();
6652 fwinattributes
= format(int(flinkinfo
['fwinattributes']), 'x').lower();
6653 fcompression
= flinkinfo
['fcompression'];
6654 fcsize
= format(int(flinkinfo
['fcsize']), 'x').lower();
6655 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
6656 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
6657 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
6658 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
6659 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
6660 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
6661 if(len(extradata
)<0):
6662 extradata
= flinkinfo
['fextralist'];
6663 fcontents
= flinkinfo
['fcontents'];
6664 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
6666 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
6667 fcurfid
= format(curfid
, 'x').lower();
6668 if(not followlink
and finode
!=0):
6669 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
6670 fcurinode
= format(int(curinode
), 'x').lower();
6671 inodetofile
.update({curinode
: fname
});
6672 filetoinode
.update({fname
: curinode
});
6673 curinode
= curinode
+ 1;
6675 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
6677 fcurinode
= format(int(curinode
), 'x').lower();
6678 curinode
= curinode
+ 1;
6679 curfid
= curfid
+ 1;
6680 if(fcompression
=="none"):
6682 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fcompression
, fcsize
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
6683 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
6686 reallcfi
= reallcfi
+ 1;
6688 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
6689 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6690 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
6693 os
.fsync(catfp
.fileno());
6694 except io
.UnsupportedOperation
:
6696 except AttributeError:
6698 except OSError as e
:
6702 if(hasattr(sys
.stdout
, "buffer")):
6703 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
6705 shutil
.copyfileobj(catfp
, sys
.stdout
);
6706 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6707 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
6709 upload_file_to_internet_file(catfp
, outfile
);
6717 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
6719 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6720 formatspecs
= FormatSpecsListToDict(formatspecs
);
6721 catfp
= BytesIO(catstr
);
6722 listcatfiles
= RePackArchiveFile(catfp
, compression
, compresswholefile
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6723 return listcatfiles
;
6725 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
6727 def PackArchiveFileFromListDir(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6728 formatspecs
= FormatSpecsListToDict(formatspecs
);
6729 outarray
= BytesIO();
6730 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6731 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6732 return listcatfiles
;
6734 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
6736 def UnPackArchiveFile(infile
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, preservepermissions
=True, preservetime
=True, verbose
=False, returnfp
=False):
6737 formatspecs
= FormatSpecsListToDict(formatspecs
);
6738 if(outdir
is not None):
6739 outdir
= RemoveWindowsPath(outdir
);
6741 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6742 if(isinstance(infile
, dict)):
6743 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6744 listcatfiles
= prelistcatfiles
['list'];
6746 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6747 infile
= RemoveWindowsPath(infile
);
6749 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6750 listcatfiles
= prelistcatfiles
['list'];
6752 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6753 if(not listcatfiles
):
6755 lenlist
= len(listcatfiles
['ffilelist']);
6756 fnumfiles
= int(listcatfiles
['fnumfiles']);
6758 lcfx
= int(listcatfiles
['fnumfiles']);
6759 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6760 lcfx
= int(lenlist
);
6762 lcfx
= int(listcatfiles
['fnumfiles']);
6768 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
6769 funame
= userinfo
.pw_name
;
6778 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
6779 fgname
= groupinfo
.gr_name
;
6785 VerbosePrintOut(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6786 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6787 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6788 listcatfiles
['ffilelist'][lcfi
]['fcontents'].seek(0, 0);
6789 shutil
.copyfileobj(listcatfiles
['ffilelist'][lcfi
]['fcontents'], fpc
);
6792 os
.fsync(fpc
.fileno());
6793 except io
.UnsupportedOperation
:
6795 except AttributeError:
6797 except OSError as e
:
6799 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6800 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6801 if(preservepermissions
):
6802 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6804 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6805 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6807 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6808 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6809 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6814 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6815 funame
= userinfo
.pw_name
;
6824 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6825 fgname
= groupinfo
.gr_name
;
6830 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6831 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6832 flinkinfo
['fcontents'].seek(0, 0);
6833 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6836 os
.fsync(fpc
.fileno());
6837 except io
.UnsupportedOperation
:
6839 except AttributeError:
6841 except OSError as e
:
6843 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6844 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6845 if(preservepermissions
):
6846 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6848 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6849 if(flinkinfo
['ftype']==1):
6850 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6851 if(flinkinfo
['ftype']==2):
6852 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6853 if(flinkinfo
['ftype']==5):
6854 if(preservepermissions
):
6855 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6857 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6858 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6859 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6860 if(preservepermissions
):
6861 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6863 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6864 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6865 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6867 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6868 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6870 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6871 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6872 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6877 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6878 funame
= userinfo
.pw_name
;
6887 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6888 fgname
= groupinfo
.gr_name
;
6893 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6894 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6895 flinkinfo
['fcontents'].seek(0, 0);
6896 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6899 os
.fsync(fpc
.fileno());
6900 except io
.UnsupportedOperation
:
6902 except AttributeError:
6904 except OSError as e
:
6906 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6907 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6908 if(preservepermissions
):
6909 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6911 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6912 if(flinkinfo
['ftype']==1):
6913 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6914 if(flinkinfo
['ftype']==2):
6915 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6916 if(flinkinfo
['ftype']==5):
6917 if(preservepermissions
):
6918 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6920 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6921 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6922 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6923 if(preservepermissions
):
6924 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6926 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6927 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6928 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6930 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6931 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6932 if(preservepermissions
):
6933 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6935 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6936 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6937 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6938 if(preservepermissions
):
6939 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6941 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6942 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
6943 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6946 return listcatfiles
['ffilelist']['catfp'];
6950 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
6952 if(hasattr(shutil
, "register_unpack_format")):
6953 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
6954 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_dict__
['format_delimiter'], False, False);
6955 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
6957 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6958 formatspecs
= FormatSpecsListToDict(formatspecs
);
6959 catfp
= BytesIO(catstr
);
6960 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6961 return listcatfiles
;
6963 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
6965 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6966 formatspecs
= FormatSpecsListToDict(formatspecs
);
6967 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6968 if(isinstance(infile
, dict)):
6969 listcatfiles
= infile
;
6971 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6972 infile
= RemoveWindowsPath(infile
);
6973 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, False, skipchecksum
, formatspecs
, returnfp
);
6974 if(not listcatfiles
):
6976 lenlist
= len(listcatfiles
['ffilelist']);
6977 fnumfiles
= int(listcatfiles
['fnumfiles']);
6979 lcfx
= int(listcatfiles
['fnumfiles']);
6980 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6981 lcfx
= int(lenlist
);
6983 lcfx
= int(listcatfiles
['fnumfiles']);
6986 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
6988 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
6990 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' } };
6991 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
6992 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6993 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6994 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6995 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6996 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
6997 if(len(fuprint
)<=0):
6998 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
6999 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
7000 if(len(fgprint
)<=0):
7001 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
7002 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
));
7005 return listcatfiles
['catfp'];
7009 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
7011 def ArchiveFileStringListFiles(catstr
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7012 formatspecs
= FormatSpecsListToDict(formatspecs
);
7013 catfp
= BytesIO(catstr
);
7014 listcatfiles
= ArchiveFileListFiles(catstr
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7015 return listcatfiles
;
7017 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileStringListFiles
);
7019 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
7020 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7023 if(hasattr(sys
.stdin
, "buffer")):
7024 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7026 shutil
.copyfileobj(sys
.stdin
, infile
);
7031 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7032 infile
= download_file_from_internet_file(infile
);
7037 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7039 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
7041 if(not tarfile
.TarFileCheck(infile
)):
7043 except AttributeError:
7044 if(not TarFileCheck(infile
)):
7049 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
7050 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
7052 tarfp
= tarfile
.open(infile
, "r");
7053 except FileNotFoundError
:
7057 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
7058 returnval
.update({lcfi
: member
.name
});
7059 fpremode
= member
.mode
;
7060 ffullmode
= member
.mode
;
7064 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7066 elif(member
.isdev()):
7067 ffullmode
= member
.mode
;
7069 elif(member
.islnk()):
7070 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7072 elif(member
.issym()):
7073 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
7075 elif(member
.ischr()):
7076 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
7078 elif(member
.isblk()):
7079 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
7081 elif(member
.isdir()):
7082 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
7084 elif(member
.isfifo()):
7085 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
7087 elif(member
.issparse()):
7088 ffullmode
= member
.mode
;
7091 VerbosePrintOut(member
.name
);
7093 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' } };
7094 printfname
= member
.name
;
7096 printfname
= member
.name
+ " link to " + member
.linkname
;
7097 elif(member
.issym()):
7098 printfname
= member
.name
+ " -> " + member
.linkname
;
7099 fuprint
= member
.uname
;
7100 if(len(fuprint
)<=0):
7101 fuprint
= member
.uid
;
7102 fgprint
= member
.gname
;
7103 if(len(fgprint
)<=0):
7104 fgprint
= member
.gid
;
7105 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
));
7108 return listcatfiles
['catfp'];
7112 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7113 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7116 if(hasattr(sys
.stdin
, "buffer")):
7117 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7119 shutil
.copyfileobj(sys
.stdin
, infile
);
7124 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7125 infile
= download_file_from_internet_file(infile
);
7130 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7134 if(not zipfile
.is_zipfile(infile
)):
7137 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
7138 except FileNotFoundError
:
7142 ziptest
= zipfp
.testzip();
7144 VerbosePrintOut("Bad file found!");
7145 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
7146 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
7147 fwinattributes
= int(zipinfo
.external_attr
);
7148 if(not member
.is_dir()):
7149 fmode
= int(stat
.S_IFREG
+ 438);
7150 fchmode
= int(stat
.S_IMODE(fmode
));
7151 ftypemod
= int(stat
.S_IFMT(fmode
));
7152 elif(member
.is_dir()):
7153 fmode
= int(stat
.S_IFDIR
+ 511);
7154 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7155 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7156 elif(zipinfo
.create_system
==3):
7157 fwinattributes
=int(0);
7158 fmode
= int(zipinfo
.external_attr
);
7159 fchmode
= int(stat
.S_IMODE(fmode
));
7160 ftypemod
= int(stat
.S_IFMT(fmode
));
7162 fwinattributes
= int(0);
7163 if(not member
.is_dir()):
7164 fmode
= int(stat
.S_IFREG
+ 438);
7165 fchmode
= int(stat
.S_IMODE(fmode
));
7166 ftypemod
= int(stat
.S_IFMT(fmode
));
7167 elif(member
.is_dir()):
7168 fmode
= int(stat
.S_IFDIR
+ 511);
7169 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7170 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7171 returnval
.update({lcfi
: member
.filename
});
7173 VerbosePrintOut(member
.filename
);
7175 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' } };
7177 for fmodval
in str(oct(fmode
))[-3:]:
7178 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7179 if(not member
.is_dir()):
7181 permissionstr
= "-" + permissionstr
;
7182 elif(member
.is_dir()):
7184 permissionstr
= "d" + permissionstr
;
7185 printfname
= member
.filename
;
7187 fuid
= int(os
.getuid());
7188 except AttributeError:
7193 fgid
= int(os
.getgid());
7194 except AttributeError:
7201 userinfo
= pwd
.getpwuid(os
.getuid());
7202 funame
= userinfo
.pw_name
;
7205 except AttributeError:
7213 groupinfo
= grp
.getgrgid(os
.getgid());
7214 fgname
= groupinfo
.gr_name
;
7217 except AttributeError:
7222 if(len(fuprint
)<=0):
7223 fuprint
= str(fuid
);
7225 if(len(fgprint
)<=0):
7226 fgprint
= str(fgid
);
7227 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
));
7230 return listcatfiles
['catfp'];
7234 if(not rarfile_support
):
7235 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7236 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7237 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7240 if(rarfile_support
):
7241 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7242 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7243 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7245 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
7249 rarfp
= rarfile
.RarFile(infile
, "r");
7250 rartest
= rarfp
.testrar();
7252 VerbosePrintOut("Bad file found!");
7253 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
7256 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
7259 member
.external_attr
7261 except AttributeError:
7263 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
7266 member
.external_attr
7268 except AttributeError:
7273 if(is_unix
and member
.external_attr
!=0):
7274 fpremode
= int(member
.external_attr
);
7275 elif(member
.is_file()):
7276 fpremode
= int(stat
.S_IFREG
+ 438);
7277 elif(member
.is_symlink()):
7278 fpremode
= int(stat
.S_IFLNK
+ 438);
7279 elif(member
.is_dir()):
7280 fpremode
= int(stat
.S_IFDIR
+ 511);
7281 if(is_windows
and member
.external_attr
!=0):
7282 fwinattributes
= int(member
.external_attr
);
7284 fwinattributes
= int(0);
7285 if(is_unix
and member
.external_attr
!=0):
7286 fmode
= int(member
.external_attr
);
7287 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
7288 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
7289 elif(member
.is_file()):
7290 fmode
= int(stat
.S_IFREG
+ 438);
7291 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
7292 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
7293 elif(member
.is_symlink()):
7294 fmode
= int(stat
.S_IFLNK
+ 438);
7295 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7296 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7297 elif(member
.is_dir()):
7298 fmode
= int(stat
.S_IFDIR
+ 511);
7299 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7300 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7301 returnval
.update({lcfi
: member
.filename
});
7303 VerbosePrintOut(member
.filename
);
7305 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' } };
7307 for fmodval
in str(oct(fmode
))[-3:]:
7308 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7309 if(member
.is_file()):
7311 permissionstr
= "-" + permissionstr
;
7312 printfname
= member
.filename
;
7313 elif(member
.is_symlink()):
7315 permissionstr
= "l" + permissionstr
;
7316 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
7317 elif(member
.is_dir()):
7319 permissionstr
= "d" + permissionstr
;
7320 printfname
= member
.filename
;
7322 fuid
= int(os
.getuid());
7323 except AttributeError:
7328 fgid
= int(os
.getgid());
7329 except AttributeError:
7336 userinfo
= pwd
.getpwuid(os
.getuid());
7337 funame
= userinfo
.pw_name
;
7340 except AttributeError:
7348 groupinfo
= grp
.getgrgid(os
.getgid());
7349 fgname
= groupinfo
.gr_name
;
7352 except AttributeError:
7357 if(len(fuprint
)<=0):
7358 fuprint
= str(fuid
);
7360 if(len(fgprint
)<=0):
7361 fgprint
= str(fgid
);
7362 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7365 return listcatfiles
['catfp'];
7369 if(not py7zr_support
):
7370 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7371 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7372 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7376 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7377 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7378 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7382 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
7383 file_content
= szpfp
.readall();
7384 #sztest = szpfp.testzip();
7385 sztestalt
= szpfp
.test();
7387 VerbosePrintOut("Bad file found!");
7388 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
7389 if(re
.findall("^[.|/]", member
.filename
)):
7390 fname
= member
.filename
;
7392 fname
= "./"+member
.filename
;
7393 if(not member
.is_directory
):
7394 fpremode
= int(stat
.S_IFREG
+ 438);
7395 elif(member
.is_directory
):
7396 fpremode
= int(stat
.S_IFDIR
+ 511);
7397 fwinattributes
= int(0);
7398 if(member
.is_directory
):
7399 fmode
= int(stat
.S_IFDIR
+ 511);
7400 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7401 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7403 fmode
= int(stat
.S_IFLNK
+ 438);
7404 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7405 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7406 returnval
.update({lcfi
: member
.filename
});
7408 VerbosePrintOut(member
.filename
);
7410 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' } };
7412 for fmodval
in str(oct(fmode
))[-3:]:
7413 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7415 if(not member
.is_directory
):
7417 permissionstr
= "-" + permissionstr
;
7418 printfname
= member
.filename
;
7419 elif(member
.is_directory
):
7421 permissionstr
= "d" + permissionstr
;
7422 printfname
= member
.filename
;
7424 fsize
= len(file_content
[member
.filename
].read());
7425 file_content
[member
.filename
].close();
7427 fuid
= int(os
.getuid());
7428 except AttributeError:
7433 fgid
= int(os
.getgid());
7434 except AttributeError:
7441 userinfo
= pwd
.getpwuid(os
.getuid());
7442 funame
= userinfo
.pw_name
;
7445 except AttributeError:
7453 groupinfo
= grp
.getgrgid(os
.getgid());
7454 fgname
= groupinfo
.gr_name
;
7457 except AttributeError:
7462 if(len(fuprint
)<=0):
7463 fuprint
= str(fuid
);
7465 if(len(fgprint
)<=0):
7466 fgprint
= str(fgid
);
7467 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(fsize
).rjust(15) + " " + member
.creationtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7470 return listcatfiles
['catfp'];
7474 def InFileListFiles(infile
, verbose
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
7475 formatspecs
= FormatSpecsListToDict(formatspecs
);
7476 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7477 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
7478 if(checkcompressfile
=="tarfile"):
7479 return TarFileListFiles(infile
, verbose
, returnfp
);
7480 elif(checkcompressfile
=="zipfile"):
7481 return ZipFileListFiles(infile
, verbose
, returnfp
);
7482 elif(checkcompressfile
=="catfile"):
7483 return ArchiveFileListFiles(infile
, 0, 0, False, formatspecs
, verbose
, returnfp
);
7484 elif(rarfile_support
and checkcompressfile
=="rarfile"):
7485 return RarFileListFiles(infile
, verbose
, returnfp
);
7486 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
7487 return SevenZipFileListFiles(infile
, verbose
, returnfp
);
7492 def ListDirListFiles(infiles
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7493 formatspecs
= FormatSpecsListToDict(formatspecs
);
7494 outarray
= BytesIO();
7495 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
7496 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7497 return listcatfiles
;
7499 def ListDirListFilesAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7500 formatspecs
= FormatSpecsListToDict(formatspecs
);
7501 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
7502 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7503 return listcatfiles
;
7505 def PackArchiveFileFromListDirAlt(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7506 formatspecs
= FormatSpecsListToDict(formatspecs
);
7507 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
7508 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
7509 return listcatfiles
;
7511 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
7513 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7514 formatspecs
= FormatSpecsListToDict(formatspecs
);
7515 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7516 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7517 return listcatfiles
;
7519 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
7521 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7522 formatspecs
= FormatSpecsListToDict(formatspecs
);
7523 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7524 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7525 return listcatfiles
;
7527 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
7529 if(not rarfile_support
):
7530 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7533 if(rarfile_support
):
7534 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7535 formatspecs
= FormatSpecsListToDict(formatspecs
);
7536 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7537 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7538 return listcatfiles
;
7540 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
7542 if(not py7zr_support
):
7543 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7547 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7548 formatspecs
= FormatSpecsListToDict(formatspecs
);
7549 outarray
= SevenZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7550 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7551 return listcatfiles
;
7553 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFileAlt", PackArchiveFileFromSevenZipFileAlt
);
7555 def download_file_from_ftp_file(url
):
7556 urlparts
= urlparse(url
);
7557 file_name
= os
.path
.basename(urlparts
.path
);
7558 file_dir
= os
.path
.dirname(urlparts
.path
);
7559 if(urlparts
.username
is not None):
7560 ftp_username
= urlparts
.username
;
7562 ftp_username
= "anonymous";
7563 if(urlparts
.password
is not None):
7564 ftp_password
= urlparts
.password
;
7565 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7566 ftp_password
= "anonymous";
7569 if(urlparts
.scheme
=="ftp"):
7571 elif(urlparts
.scheme
=="ftps" and ftpssl
):
7575 if(urlparts
.scheme
=="sftp"):
7577 return download_file_from_pysftp_file(url
);
7579 return download_file_from_sftp_file(url
);
7580 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7581 return download_file_from_http_file(url
);
7582 ftp_port
= urlparts
.port
;
7583 if(urlparts
.port
is None):
7586 ftp
.connect(urlparts
.hostname
, ftp_port
);
7587 except socket
.gaierror
:
7588 log
.info("Error With URL "+url
);
7590 except socket
.timeout
:
7591 log
.info("Error With URL "+url
);
7593 ftp
.login(urlparts
.username
, urlparts
.password
);
7594 if(urlparts
.scheme
=="ftps"):
7596 ftpfile
= BytesIO();
7597 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
7598 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
7603 def download_file_from_ftp_string(url
):
7604 ftpfile
= download_file_from_ftp_file(url
);
7605 return ftpfile
.read();
7607 def upload_file_to_ftp_file(ftpfile
, url
):
7608 urlparts
= urlparse(url
);
7609 file_name
= os
.path
.basename(urlparts
.path
);
7610 file_dir
= os
.path
.dirname(urlparts
.path
);
7611 if(urlparts
.username
is not None):
7612 ftp_username
= urlparts
.username
;
7614 ftp_username
= "anonymous";
7615 if(urlparts
.password
is not None):
7616 ftp_password
= urlparts
.password
;
7617 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7618 ftp_password
= "anonymous";
7621 if(urlparts
.scheme
=="ftp"):
7623 elif(urlparts
.scheme
=="ftps" and ftpssl
):
7627 if(urlparts
.scheme
=="sftp"):
7629 return upload_file_to_pysftp_file(url
);
7631 return upload_file_to_sftp_file(url
);
7632 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7634 ftp_port
= urlparts
.port
;
7635 if(urlparts
.port
is None):
7638 ftp
.connect(urlparts
.hostname
, ftp_port
);
7639 except socket
.gaierror
:
7640 log
.info("Error With URL "+url
);
7642 except socket
.timeout
:
7643 log
.info("Error With URL "+url
);
7645 ftp
.login(urlparts
.username
, urlparts
.password
);
7646 if(urlparts
.scheme
=="ftps"):
7648 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
7653 def upload_file_to_ftp_string(ftpstring
, url
):
7654 ftpfileo
= BytesIO(ftpstring
);
7655 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
7659 def download_file_from_http_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7660 # Parse the URL to extract username and password if present
7661 urlparts
= urlparse(url
);
7662 username
= urlparts
.username
;
7663 password
= urlparts
.password
;
7664 # Rebuild the URL without the username and password
7665 netloc
= urlparts
.hostname
;
7666 if(urlparts
.scheme
=="sftp"):
7668 return download_file_from_pysftp_file(url
);
7670 return download_file_from_sftp_file(url
);
7671 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7672 return download_file_from_ftp_file(url
);
7674 netloc
+= ':' + str(urlparts
.port
);
7675 rebuilt_url
= urlunparse((urlparts
.scheme
, netloc
, urlparts
.path
, urlparts
.params
, urlparts
.query
, urlparts
.fragment
));
7676 # Create a temporary file object
7677 httpfile
= BytesIO();
7679 # Use the requests library if available
7680 if username
and password
:
7681 response
= requests
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
), stream
=True);
7683 response
= requests
.get(rebuilt_url
, headers
=headers
, stream
=True);
7684 response
.raw
.decode_content
= True
7685 shutil
.copyfileobj(response
.raw
, httpfile
);
7687 # Build a Request object for urllib
7688 request
= Request(rebuilt_url
, headers
=headers
);
7689 # Create an opener object for handling URLs
7690 if username
and password
:
7691 # Create a password manager
7692 password_mgr
= HTTPPasswordMgrWithDefaultRealm();
7693 # Add the username and password
7694 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
7695 # Create an authentication handler using the password manager
7696 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
7697 # Build the opener with the authentication handler
7698 opener
= build_opener(auth_handler
);
7700 opener
= build_opener();
7701 with opener
.open(request
) as response
:
7702 shutil
.copyfileobj(response
, httpfile
);
7703 # Reset file pointer to the start
7704 httpfile
.seek(0, 0);
7705 # Return the temporary file object
7708 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7709 httpfile
= download_file_from_http_file(url
, headers
);
7710 return ftpfile
.read();
7713 def download_file_from_sftp_file(url
):
7714 urlparts
= urlparse(url
);
7715 file_name
= os
.path
.basename(urlparts
.path
);
7716 file_dir
= os
.path
.dirname(urlparts
.path
);
7717 sftp_port
= urlparts
.port
;
7718 if(urlparts
.port
is None):
7721 sftp_port
= urlparts
.port
;
7722 if(urlparts
.username
is not None):
7723 sftp_username
= urlparts
.username
;
7725 sftp_username
= "anonymous";
7726 if(urlparts
.password
is not None):
7727 sftp_password
= urlparts
.password
;
7728 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7729 sftp_password
= "anonymous";
7732 if(urlparts
.scheme
=="ftp"):
7733 return download_file_from_ftp_file(url
);
7734 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7735 return download_file_from_http_file(url
);
7736 if(urlparts
.scheme
!="sftp"):
7738 ssh
= paramiko
.SSHClient();
7739 ssh
.load_system_host_keys();
7740 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7742 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7743 except paramiko
.ssh_exception
.SSHException
:
7745 except socket
.gaierror
:
7746 log
.info("Error With URL "+url
);
7748 except socket
.timeout
:
7749 log
.info("Error With URL "+url
);
7751 sftp
= ssh
.open_sftp();
7752 sftpfile
= BytesIO();
7753 sftp
.getfo(urlparts
.path
, sftpfile
);
7756 sftpfile
.seek(0, 0);
7759 def download_file_from_sftp_file(url
):
7763 def download_file_from_sftp_string(url
):
7764 sftpfile
= download_file_from_sftp_file(url
);
7765 return sftpfile
.read();
7767 def download_file_from_ftp_string(url
):
7771 def upload_file_to_sftp_file(sftpfile
, url
):
7772 urlparts
= urlparse(url
);
7773 file_name
= os
.path
.basename(urlparts
.path
);
7774 file_dir
= os
.path
.dirname(urlparts
.path
);
7775 sftp_port
= urlparts
.port
;
7776 if(urlparts
.port
is None):
7779 sftp_port
= urlparts
.port
;
7780 if(urlparts
.username
is not None):
7781 sftp_username
= urlparts
.username
;
7783 sftp_username
= "anonymous";
7784 if(urlparts
.password
is not None):
7785 sftp_password
= urlparts
.password
;
7786 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7787 sftp_password
= "anonymous";
7790 if(urlparts
.scheme
=="ftp"):
7791 return upload_file_to_ftp_file(url
);
7792 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7794 if(urlparts
.scheme
!="sftp"):
7796 ssh
= paramiko
.SSHClient();
7797 ssh
.load_system_host_keys();
7798 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7800 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7801 except paramiko
.ssh_exception
.SSHException
:
7803 except socket
.gaierror
:
7804 log
.info("Error With URL "+url
);
7806 except socket
.timeout
:
7807 log
.info("Error With URL "+url
);
7809 sftp
= ssh
.open_sftp();
7810 sftp
.putfo(sftpfile
, urlparts
.path
);
7813 sftpfile
.seek(0, 0);
7816 def upload_file_to_sftp_file(sftpfile
, url
):
7820 def upload_file_to_sftp_string(sftpstring
, url
):
7821 sftpfileo
= BytesIO(sftpstring
);
7822 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
7826 def upload_file_to_sftp_string(url
):
7830 def download_file_from_pysftp_file(url
):
7831 urlparts
= urlparse(url
);
7832 file_name
= os
.path
.basename(urlparts
.path
);
7833 file_dir
= os
.path
.dirname(urlparts
.path
);
7834 sftp_port
= urlparts
.port
;
7835 if(urlparts
.port
is None):
7838 sftp_port
= urlparts
.port
;
7839 if(urlparts
.username
is not None):
7840 sftp_username
= urlparts
.username
;
7842 sftp_username
= "anonymous";
7843 if(urlparts
.password
is not None):
7844 sftp_password
= urlparts
.password
;
7845 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7846 sftp_password
= "anonymous";
7849 if(urlparts
.scheme
=="ftp"):
7850 return download_file_from_ftp_file(url
);
7851 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7852 return download_file_from_http_file(url
);
7853 if(urlparts
.scheme
!="sftp"):
7856 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7857 except paramiko
.ssh_exception
.SSHException
:
7859 except socket
.gaierror
:
7860 log
.info("Error With URL "+url
);
7862 except socket
.timeout
:
7863 log
.info("Error With URL "+url
);
7865 sftp
= ssh
.open_sftp();
7866 sftpfile
= BytesIO();
7867 sftp
.getfo(urlparts
.path
, sftpfile
);
7870 sftpfile
.seek(0, 0);
7873 def download_file_from_pysftp_file(url
):
7877 def download_file_from_pysftp_string(url
):
7878 sftpfile
= download_file_from_pysftp_file(url
);
7879 return sftpfile
.read();
7881 def download_file_from_ftp_string(url
):
7885 def upload_file_to_pysftp_file(sftpfile
, url
):
7886 urlparts
= urlparse(url
);
7887 file_name
= os
.path
.basename(urlparts
.path
);
7888 file_dir
= os
.path
.dirname(urlparts
.path
);
7889 sftp_port
= urlparts
.port
;
7890 if(urlparts
.port
is None):
7893 sftp_port
= urlparts
.port
;
7894 if(urlparts
.username
is not None):
7895 sftp_username
= urlparts
.username
;
7897 sftp_username
= "anonymous";
7898 if(urlparts
.password
is not None):
7899 sftp_password
= urlparts
.password
;
7900 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7901 sftp_password
= "anonymous";
7904 if(urlparts
.scheme
=="ftp"):
7905 return upload_file_to_ftp_file(url
);
7906 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7908 if(urlparts
.scheme
!="sftp"):
7911 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7912 except paramiko
.ssh_exception
.SSHException
:
7914 except socket
.gaierror
:
7915 log
.info("Error With URL "+url
);
7917 except socket
.timeout
:
7918 log
.info("Error With URL "+url
);
7920 sftp
= ssh
.open_sftp();
7921 sftp
.putfo(sftpfile
, urlparts
.path
);
7924 sftpfile
.seek(0, 0);
7927 def upload_file_to_pysftp_file(sftpfile
, url
):
7931 def upload_file_to_pysftp_string(sftpstring
, url
):
7932 sftpfileo
= BytesIO(sftpstring
);
7933 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
7937 def upload_file_to_pysftp_string(url
):
7940 def download_file_from_internet_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7941 urlparts
= urlparse(url
);
7942 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7943 return download_file_from_http_file(url
, headers
);
7944 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7945 return download_file_from_ftp_file(url
);
7946 elif(urlparts
.scheme
=="sftp"):
7947 if(__use_pysftp__
and havepysftp
):
7948 return download_file_from_pysftp_file(url
);
7950 return download_file_from_sftp_file(url
);
7955 def download_file_from_internet_uncompress_file(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_dict__
):
7956 formatspecs
= FormatSpecsListToDict(formatspecs
);
7957 fp
= download_file_from_internet_file(url
);
7958 fp
= UncompressArchiveFile(fp
, formatspecs
);
7964 def download_file_from_internet_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7965 urlparts
= urlparse(url
);
7966 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7967 return download_file_from_http_string(url
, headers
);
7968 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7969 return download_file_from_ftp_string(url
);
7970 elif(urlparts
.scheme
=="sftp"):
7971 if(__use_pysftp__
and havepysftp
):
7972 return download_file_from_pysftp_string(url
);
7974 return download_file_from_sftp_string(url
);
7979 def download_file_from_internet_uncompress_string(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_dict__
):
7980 formatspecs
= FormatSpecsListToDict(formatspecs
);
7981 fp
= download_file_from_internet_string(url
);
7982 fp
= UncompressArchiveFile(fp
, formatspecs
);
7988 def upload_file_to_internet_file(ifp
, url
):
7989 urlparts
= urlparse(url
);
7990 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7992 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7993 return upload_file_to_ftp_file(ifp
, url
);
7994 elif(urlparts
.scheme
=="sftp"):
7995 if(__use_pysftp__
and havepysftp
):
7996 return upload_file_to_pysftp_file(ifp
, url
);
7998 return upload_file_to_sftp_file(ifp
, url
);
8003 def upload_file_to_internet_compress_file(ifp
, url
, formatspecs
=__file_format_dict__
):
8004 formatspecs
= FormatSpecsListToDict(formatspecs
);
8005 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
8009 upload_file_to_internet_file(catfp
, outfile
);
8012 def upload_file_to_internet_string(ifp
, url
):
8013 urlparts
= urlparse(url
);
8014 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8016 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8017 return upload_file_to_ftp_string(ifp
, url
);
8018 elif(urlparts
.scheme
=="sftp"):
8019 if(__use_pysftp__
and havepysftp
):
8020 return upload_file_to_pysftp_string(ifp
, url
);
8022 return upload_file_to_sftp_string(ifp
, url
);
8027 def upload_file_to_internet_compress_string(ifp
, url
, formatspecs
=__file_format_dict__
):
8028 formatspecs
= FormatSpecsListToDict(formatspecs
);
8029 catfp
= CompressArchiveFile(BytesIO(ifp
), compression
, compressionlevel
, formatspecs
);
8033 upload_file_to_internet_file(catfp
, outfile
);
8037 if(hasattr(shutil
, "register_archive_format")):
8038 # Register the packing format
8039 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
8040 except shutil
.RegistryError
:
8044 if(hasattr(shutil
, "register_unpack_format")):
8045 # Register the unpacking format
8046 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
8047 except shutil
.RegistryError
: