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
;
144 from cStringIO
import StringIO
as BytesIO
;
146 from StringIO
import StringIO
;
147 from StringIO
import StringIO
as BytesIO
;
149 __use_pysftp__
= False;
151 __use_pysftp__
= False;
152 __file_format_name__
= "CatFile";
153 __program_name__
= "Py"+__file_format_name__
;
154 __file_format_lower__
= __file_format_name__
.lower();
155 __file_format_magic__
= __file_format_name__
;
156 __file_format_len__
= len(__file_format_magic__
);
157 __file_format_hex__
= binascii
.hexlify(__file_format_magic__
.encode("UTF-8")).decode("UTF-8");
158 __file_format_delimiter__
= "\x00";
159 __file_format_ver__
= "001";
160 __use_new_style__
= True;
161 __use_advanced_list__
= True;
162 __use_alt_inode__
= False;
163 __file_format_extension__
= ".cat";
164 __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__
];
165 __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__
};
166 __project__
= __program_name__
;
167 __project_url__
= "https://github.com/GameMaker2k/PyCatFile";
168 __version_info__
= (0, 11, 4, "RC 1", 1);
169 __version_date_info__
= (2024, 5, 17, "RC 1", 1);
170 __version_date__
= str(__version_date_info__
[0]) + "." + str(__version_date_info__
[1]).zfill(2) + "." + str(__version_date_info__
[2]).zfill(2);
171 __revision__
= __version_info__
[3];
172 __revision_id__
= "$Id$";
173 if(__version_info__
[4] is not None):
174 __version_date_plusrc__
= __version_date__
+ "-" + str(__version_date_info__
[4]);
175 if(__version_info__
[4] is None):
176 __version_date_plusrc__
= __version_date__
;
177 if(__version_info__
[3] is not None):
178 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]) + " " + str(__version_info__
[3]);
179 if(__version_info__
[3] is None):
180 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]);
182 PyBitness
= platform
.architecture();
183 if(PyBitness
=="32bit" or PyBitness
=="32"):
185 elif(PyBitness
=="64bit" or PyBitness
=="64"):
190 geturls_ua_pycatfile_python
= "Mozilla/5.0 (compatible; {proname}/{prover}; +{prourl})".format(proname
=__project__
, prover
=__version__
, prourl
=__project_url__
);
191 if(platform
.python_implementation()!=""):
192 py_implementation
= platform
.python_implementation();
193 if(platform
.python_implementation()==""):
194 py_implementation
= "Python";
195 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__
);
196 geturls_ua_googlebot_google
= "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
197 geturls_ua_googlebot_google_old
= "Googlebot/2.1 (+http://www.google.com/bot.html)";
198 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
)};
199 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
)};
200 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"};
201 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"};
203 def CompressionSupport():
204 compression_list
= [];
207 compression_list
.append("gz");
208 compression_list
.append("gzip");
213 compression_list
.append("bz2");
214 compression_list
.append("bzip2");
219 compression_list
.append("lz4");
224 compression_list
.append("lzo");
225 compression_list
.append("lzop");
230 compression_list
.append("zstd");
231 compression_list
.append("zstandard");
236 compression_list
.append("lzma");
237 compression_list
.append("xz");
241 from backports
import lzma
;
242 compression_list
.append("lzma");
243 compression_list
.append("xz");
246 return compression_list
;
248 compressionsupport
= CompressionSupport();
249 compressionlist
= ['auto'];
250 compressionlistalt
= [];
253 if('gzip' in compressionsupport
):
254 compressionlist
.append('gzip');
255 compressionlistalt
.append('gzip');
256 outextlist
.append('gz');
257 outextlistwd
.append('.gz');
258 if('bzip2' in compressionsupport
):
259 compressionlist
.append('bzip2');
260 compressionlistalt
.append('bzip2');
261 outextlist
.append('bz2');
262 outextlistwd
.append('.bz2');
263 if('zstd' in compressionsupport
):
264 compressionlist
.append('zstd');
265 compressionlistalt
.append('zstd');
266 outextlist
.append('zst');
267 outextlistwd
.append('.zst');
268 if('lz4' in compressionsupport
):
269 compressionlist
.append('lz4');
270 compressionlistalt
.append('lz4');
271 outextlist
.append('lz4');
272 outextlistwd
.append('.lz4');
273 if('lzo' in compressionsupport
):
274 compressionlist
.append('lzo');
275 compressionlistalt
.append('lzo');
276 outextlist
.append('lzo');
277 outextlistwd
.append('.lzo');
278 if('lzop' in compressionsupport
):
279 compressionlist
.append('lzop');
280 compressionlistalt
.append('lzop');
281 outextlist
.append('lzop');
282 outextlistwd
.append('.lzop');
283 if('lzma' in compressionsupport
):
284 compressionlist
.append('lzma');
285 compressionlistalt
.append('lzma');
286 outextlist
.append('lzma');
287 outextlistwd
.append('.lzma');
288 if('xz' in compressionsupport
):
289 compressionlist
.append('xz');
290 compressionlistalt
.append('xz');
291 outextlist
.append('xz');
292 outextlistwd
.append('.xz');
294 tarfile_mimetype
= "application/tar";
295 tarfile_tar_mimetype
= tarfile_mimetype
;
296 zipfile_mimetype
= "application/zip";
297 zipfile_zip_mimetype
= zipfile_mimetype
;
298 rarfile_mimetype
= "application/rar";
299 rarfile_rar_mimetype
= rarfile_mimetype
;
300 archivefile_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"";
301 archivefile_cat_mimetype
= archivefile_mimetype
;
302 archivefile_gzip_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+gzip";
303 archivefile_gz_mimetype
= archivefile_gzip_mimetype
;
304 archivefile_bzip2_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+bzip2";
305 archivefile_bz2_mimetype
= archivefile_bzip2_mimetype
;
306 archivefile_lz4_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lz4";
307 archivefile_lzop_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lzop";
308 archivefile_lzo_mimetype
= archivefile_lzop_mimetype
;
309 archivefile_zstandard_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+zstandard";
310 archivefile_zstd_mimetype
= archivefile_zstandard_mimetype
;
311 archivefile_lzma_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lzma";
312 archivefile_xz_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+xz";
313 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"];
315 if __name__
== "__main__":
317 curscrpath
= os
.path
.dirname(sys
.argv
[0]);
321 curscrpath
= curscrpath
.replace(os
.sep
, "/");
322 curscrpath
= curscrpath
+ "/";
323 scrfile
= curscrpath
+ "catfile.py";
324 if(os
.path
.exists(scrfile
) and os
.path
.isfile(scrfile
)):
325 scrcmd
= subprocess
.Popen([sys
.executable
, scrfile
] + sys
.argv
[1:]);
328 def VerbosePrintOut(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
334 "warning": logging
.warning
,
335 "error": logging
.error
,
336 "critical": logging
.critical
,
337 "exception": logging
.exception
,
338 "logalt": lambda x
: logging
.log(dgblevel
, x
),
339 "debug": logging
.debug
341 log_function
= log_functions
.get(outtype
);
343 log_function(dbgtxt
);
347 def VerbosePrintOutReturn(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
348 VerbosePrintOut(dbgtxt
, outtype
, dbgenable
, dgblevel
);
351 def RemoveWindowsPath(dpath
):
355 dpath
= dpath
.replace(os
.path
.sep
, "/");
356 dpath
= dpath
.rstrip("/");
357 if(dpath
=="." or dpath
==".."):
361 def NormalizeRelativePath(inpath
):
362 inpath
= RemoveWindowsPath(inpath
);
363 if(os
.path
.isabs(inpath
)):
366 if(inpath
.startswith("./") or inpath
.startswith("../")):
369 outpath
= "./" + inpath
;
372 def PrependPath(base_dir
, child_path
):
373 # Check if base_dir is None or empty, if so, return child_path as is
376 # Ensure base_dir ends with exactly one slash
377 if not base_dir
.endswith('/'):
379 # Check if child_path starts with ./ or ../ (indicating a relative path)
380 if child_path
.startswith('./') or child_path
.startswith('../'):
381 # For relative paths, we don't alter the child_path
382 return base_dir
+ child_path
;
384 # For non-relative paths, ensure there's no starting slash on child_path to avoid double slashes
385 return base_dir
+ child_path
.lstrip('/');
387 def ListDir(dirpath
, followlink
=False, duplicates
=False):
388 if(isinstance(dirpath
, (list, tuple, ))):
389 dirpath
= list(filter(None, dirpath
));
390 elif(isinstance(dirpath
, (str, ))):
391 dirpath
= list(filter(None, [dirpath
]));
393 for mydirfile
in dirpath
:
394 if(not os
.path
.exists(mydirfile
)):
396 mydirfile
= NormalizeRelativePath(mydirfile
);
397 if(os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
)):
398 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
399 if(os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
)):
400 for root
, dirs
, filenames
in os
.walk(mydirfile
):
402 dpath
= RemoveWindowsPath(dpath
);
403 if(dpath
not in retlist
and not duplicates
):
404 retlist
.append(dpath
);
406 retlist
.append(dpath
);
407 for file in filenames
:
408 fpath
= os
.path
.join(root
, file);
409 fpath
= RemoveWindowsPath(fpath
);
410 if(fpath
not in retlist
and not duplicates
):
411 retlist
.append(fpath
);
413 retlist
.append(fpath
);
415 retlist
.append(RemoveWindowsPath(mydirfile
));
418 def ListDirAdvanced(dirpath
, followlink
=False, duplicates
=False):
419 if isinstance(dirpath
, (list, tuple)):
420 dirpath
= list(filter(None, dirpath
));
421 elif isinstance(dirpath
, str):
422 dirpath
= list(filter(None, [dirpath
]));
424 for mydirfile
in dirpath
:
425 if not os
.path
.exists(mydirfile
):
427 mydirfile
= NormalizeRelativePath(mydirfile
);
428 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
) and followlink
:
429 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
))
430 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
431 for root
, dirs
, filenames
in os
.walk(mydirfile
):
432 # Sort dirs and filenames alphabetically in place
433 dirs
.sort(key
=lambda x
: x
.lower());
434 filenames
.sort(key
=lambda x
: x
.lower());
435 dpath
= RemoveWindowsPath(root
);
436 if not duplicates
and dpath
not in retlist
:
437 retlist
.append(dpath
);
439 retlist
.append(dpath
);
440 for file in filenames
:
441 fpath
= os
.path
.join(root
, file);
442 fpath
= RemoveWindowsPath(fpath
);
443 if not duplicates
and fpath
not in retlist
:
444 retlist
.append(fpath
);
446 retlist
.append(fpath
);
448 retlist
.append(RemoveWindowsPath(mydirfile
));
451 def create_alias_function(prefix
, base_name
, suffix
, target_function
):
452 # Define a new function that wraps the target function
453 def alias_function(*args
, **kwargs
):
454 return target_function(*args
, **kwargs
);
456 # Create the function name by combining the prefix, base name, and the suffix
457 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
);
459 # Add the new function to the global namespace
460 globals()[function_name
] = alias_function
;
462 def create_alias_function_alt(prefix
, base_name
, suffix
, target_function
):
463 # Create the function name by combining the prefix, base name, and the suffix
464 # Use the format method for string formatting, compatible with Python 2 and 3
465 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
)
466 # Add the new function (alias of the target_function) to the global namespace
467 # This line is compatible as-is with both Python 2 and 3
468 globals()[function_name
] = target_function
470 def FormatSpecsListToDict(formatspecs
=__file_format_list__
):
471 if(isinstance(formatspecs
, (list, tuple, ))):
472 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]};
473 elif(isinstance(formatspecs
, (dict, ))):
476 return __file_format_dict__
;
477 return __file_format_dict__
;
479 def TarFileCheck(infile
):
481 if is_tarfile(infile
):
487 # Check if the input is a file object
488 if hasattr(infile
, 'read'):
489 # Save the current file position
490 current_position
= infile
.tell();
491 # Attempt to open the file object as a tar file
492 tar
= tarfile
.open(fileobj
=infile
);
494 # Restore the file position
495 infile
.seek(current_position
);
498 # Assume it's a filename
499 tar
= tarfile
.open(name
=infile
);
502 except tarfile
.TarError
:
505 # initial_value can be 0xFFFF or 0x0000
506 def crc16_ansi(msg
, initial_value
=0xFFFF):
507 # CRC-16-IBM / CRC-16-ANSI polynomial and initial value
508 poly
= 0x8005; # Polynomial for CRC-16-IBM / CRC-16-ANSI
509 crc
= initial_value
; # Initial value
511 crc ^
= b
<< 8; # XOR byte into CRC top byte
512 for _
in range(8): # Process each bit
513 if crc
& 0x8000: # If the top bit is set
514 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
516 crc
= crc
<< 1; # Just shift left
517 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
520 # initial_value can be 0xFFFF or 0x0000
521 def crc16_ibm(msg
, initial_value
=0xFFFF):
522 return crc16_ansi(msg
, initial_value
);
524 # initial_value is 0xFFFF
526 return crc16_ansi(msg
, 0xFFFF);
528 # initial_value can be 0xFFFF, 0x1D0F or 0x0000
529 def crc16_ccitt(msg
, initial_value
=0xFFFF):
530 # CRC-16-CCITT polynomial
531 poly
= 0x1021; # Polynomial for CRC-16-CCITT
532 # Use the specified initial value
535 crc ^
= b
<< 8; # XOR byte into CRC top byte
536 for _
in range(8): # Process each bit
537 if crc
& 0x8000: # If the top bit is set
538 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
540 crc
= crc
<< 1; # Just shift left
541 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
544 # initial_value can be 0x42F0E1EBA9EA3693 or 0x0000000000000000
545 def crc64_ecma(msg
, initial_value
=0x0000000000000000):
546 # CRC-64-ECMA polynomial and initial value
547 poly
= 0x42F0E1EBA9EA3693;
548 crc
= initial_value
; # Initial value for CRC-64-ECMA
550 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
551 for _
in range(8): # Process each bit
552 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
553 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
555 crc
<<= 1; # Just shift left if the MSB is 0
556 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
559 # initial_value can be 0x000000000000001B or 0xFFFFFFFFFFFFFFFF
560 def crc64_iso(msg
, initial_value
=0xFFFFFFFFFFFFFFFF):
561 # CRC-64-ISO polynomial and initial value
562 poly
= 0x000000000000001B;
563 crc
= initial_value
; # Common initial value for CRC-64-ISO
565 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
566 for _
in range(8): # Process each bit
567 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
568 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
570 crc
<<= 1; # Just shift left if the MSB is 0
571 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
574 def GetDataFromArray(data
, path
, default
=None):
578 element
= element
[key
];
580 except (KeyError, TypeError, IndexError):
583 def GetDataFromArrayAlt(structure
, path
, default
=None):
586 if isinstance(element
, dict) and key
in element
:
587 element
= element
[key
];
588 elif isinstance(element
, list) and isinstance(key
, int) and -len(element
) <= key
< len(element
):
589 element
= element
[key
];
594 def GetHeaderChecksum(inlist
=[], checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_dict__
):
595 formatspecs
= FormatSpecsListToDict(formatspecs
);
596 fileheader
= AppendNullBytes(inlist
, formatspecs
['format_delimiter']) if isinstance(inlist
, list) else AppendNullByte(inlist
, formatspecs
['format_delimiter']);
598 fileheader
= fileheader
.encode('UTF-8');
600 "crc16": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
601 "crc16_ansi": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
602 "crc16_ibm": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
603 "crc16_ccitt": lambda data
: format(crc16_ccitt(data
) & 0xffff, '04x').lower(),
604 "adler32": lambda data
: format(zlib
.adler32(data
) & 0xffffffff, '08x').lower(),
605 "crc32": lambda data
: format(crc32(data
) & 0xffffffff, '08x').lower(),
606 "crc64_ecma": lambda data
: format(crc64_ecma(data
) & 0xffffffffffffffff, '016x').lower(),
607 "crc64": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
608 "crc64_iso": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
610 if checksumtype
in checksum_methods
:
611 return checksum_methods
[checksumtype
](fileheader
);
612 elif CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
):
613 checksumoutstr
= hashlib
.new(checksumtype
);
614 checksumoutstr
.update(fileheader
);
615 return checksumoutstr
.hexdigest().lower();
616 return format(0, 'x').lower();
618 def GetFileChecksum(instr
, checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_dict__
):
619 formatspecs
= FormatSpecsListToDict(formatspecs
);
621 instr
= instr
.encode('UTF-8');
623 "crc16": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
624 "crc16_ansi": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
625 "crc16_ibm": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
626 "crc16_ccitt": lambda data
: format(crc16_ccitt(data
) & 0xffff, '04x').lower(),
627 "adler32": lambda data
: format(zlib
.adler32(data
) & 0xffffffff, '08x').lower(),
628 "crc32": lambda data
: format(crc32(data
) & 0xffffffff, '08x').lower(),
629 "crc64_ecma": lambda data
: format(crc64_ecma(data
) & 0xffffffffffffffff, '016x').lower(),
630 "crc64": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
631 "crc64_iso": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
633 if checksumtype
in checksum_methods
:
634 return checksum_methods
[checksumtype
](instr
);
635 elif CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
):
636 checksumoutstr
= hashlib
.new(checksumtype
);
637 checksumoutstr
.update(instr
);
638 return checksumoutstr
.hexdigest().lower();
639 return format(0, 'x').lower();
641 def ValidateHeaderChecksum(inlist
=[], checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_dict__
):
642 formatspecs
= FormatSpecsListToDict(formatspecs
);
643 catfileheadercshex
= GetHeaderChecksum(inlist
, checksumtype
, True, formatspecs
).lower();
644 return inchecksum
.lower() == catfileheadercshex
;
646 def ValidateFileChecksum(infile
, checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_dict__
):
647 formatspecs
= FormatSpecsListToDict(formatspecs
);
648 catinfilecshex
= GetFileChecksum(infile
, checksumtype
, True, formatspecs
).lower();
649 return inchecksum
.lower() == catinfilecshex
;
651 def ReadTillNullByteOld(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
654 nullbyte
= delimiter
.encode("UTF-8");
656 curbyte
= fp
.read(1);
657 if(curbyte
==nullbyte
or not curbyte
):
659 curfullbyte
= curfullbyte
+ curbyte
;
660 return curfullbyte
.decode('UTF-8');
662 def ReadUntilNullByteOld(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
663 return ReadTillNullByteOld(fp
, delimiter
);
665 def ReadTillNullByteAlt(fp
, delimiter
=__file_format_dict__
['format_delimiter'], chunk_size
=1024, max_read
=1024000):
666 delimiter
= delimiter
.encode('UTF-8') # Ensure the delimiter is in bytes
667 buffer = bytearray();
669 delimiter_length
= len(delimiter
);
671 chunk
= fp
.read(chunk_size
)
673 # End of file reached without finding the delimiter
675 buffer.extend(chunk
);
676 total_read
+= len(chunk
);
677 if delimiter
in buffer:
678 # Delimiter found, calculate where to reset the file pointer
679 index
= buffer.find(delimiter
);
680 # Calculate how many extra bytes were read after the delimiter
681 extra_bytes_read
= len(buffer) - (index
+ delimiter_length
);
682 # Move the file pointer back to just after the delimiter
683 fp
.seek(-extra_bytes_read
, 1);
684 buffer = buffer[:index
];
686 if total_read
>= max_read
:
687 # Stop reading if max limit is reached to prevent excessive memory usage
688 raise MemoryError("Maximum read limit reached without finding the delimiter.");
689 # Check for incomplete UTF-8 sequences at the end of the buffer
690 if len(buffer) > 1 and 128 <= buffer[-1] < 192:
691 # This suggests that the last byte might be the start of a multi-byte character
692 # Try to read one more byte to complete the character
693 extra_byte
= fp
.read(1);
695 buffer.extend(extra_byte
);
697 # No more data available
700 return buffer.decode('UTF-8', errors
='replace');
701 except UnicodeDecodeError:
702 return buffer.decode('UTF-8', errors
='replace');
704 def ReadUntilNullByteAlt(fp
, delimiter
=__file_format_dict__
['format_delimiter'], chunk_size
=1024, max_read
=1024000):
705 return ReadTillNullByteAlt(fp
, delimiter
, chunk_size
, max_read
);
707 def ReadTillNullByte(fp
, delimiter
=__file_format_dict__
['format_delimiter'], max_read
=1024000):
708 curfullbyte
= bytearray();
709 nullbyte
= delimiter
.encode("UTF-8");
710 total_read
= 0; # Track the total number of bytes read
712 curbyte
= fp
.read(1);
713 if curbyte
== nullbyte
or not curbyte
:
715 curfullbyte
.extend(curbyte
);
717 if total_read
>= max_read
:
718 raise MemoryError("Maximum read limit reached without finding the delimiter.");
719 # Decode the full byte array to string once out of the loop
721 return curfullbyte
.decode('UTF-8');
722 except UnicodeDecodeError:
723 # Handle potential partial UTF-8 characters
724 for i
in range(1, 4):
726 return curfullbyte
[:-i
].decode('UTF-8');
727 except UnicodeDecodeError:
729 raise; # Re-raise if decoding fails even after trimming
731 def ReadUntilNullByte(fp
, delimiter
=__file_format_dict__
['format_delimiter'], max_read
=1024000):
732 return ReadTillNullByte(fp
, delimiter
, max_read
);
734 def ReadTillNullByteByNum(fp
, delimiter
=__file_format_dict__
['format_delimiter'], num_delimiters
=1, chunk_size
=1024, max_read
=1024000):
735 delimiter
= delimiter
.encode('UTF-8'); # Ensure the delimiter is in bytes
736 buffer = bytearray();
738 delimiter_length
= len(delimiter
);
740 while len(results
) < num_delimiters
:
741 chunk
= fp
.read(chunk_size
);
743 # End of file reached; decode whatever is collected if it's the last needed part
745 results
.append(buffer.decode('UTF-8', errors
='replace'));
748 total_read
+= len(chunk
);
749 # Check if we have found the delimiter
750 while delimiter
in buffer:
751 index
= buffer.find(delimiter
);
752 # Decode the section before the delimiter
753 results
.append(buffer[:index
].decode('UTF-8', errors
='replace'));
754 # Remove the processed part from the buffer
755 buffer = buffer[index
+ delimiter_length
:];
756 if len(results
) == num_delimiters
:
757 # If reached the required number of delimiters, adjust the file pointer and stop
758 fp
.seek(-len(buffer), 1);
760 if total_read
>= max_read
:
761 # Stop reading if max limit is reached to prevent excessive memory usage
762 raise MemoryError("Maximum read limit reached without finding the delimiter.");
763 # Check for incomplete UTF-8 sequences at the end of the buffer
764 if len(buffer) > 1 and 128 <= buffer[-1] < 192:
765 # This suggests that the last byte might be the start of a multi-byte character
766 # Try to read one more byte to complete the character
767 extra_byte
= fp
.read(1);
769 buffer.extend(extra_byte
);
771 # No more data available
773 # Process remaining buffer if less than the required number of delimiters were found
774 if len(buffer) > 0 and len(results
) < num_delimiters
:
775 results
.append(buffer.decode('UTF-8', errors
='replace'));
778 def ReadUntilNullByteByNum(fp
, delimiter
=__file_format_dict__
['format_delimiter'], num_delimiters
=1, chunk_size
=1024, max_read
=1024000):
779 return ReadTillNullByteByNum(fp
, delimiter
, num_delimiters
, chunk_size
, max_read
);
781 def SeekToEndOfFile(fp
):
785 if(lasttell
==fp
.tell()):
787 lasttell
= fp
.tell();
790 def ReadFileHeaderData(fp
, rounds
=0, delimiter
=__file_format_dict__
['format_delimiter']):
794 while(rocount
<roend
):
795 HeaderOut
.append(ReadTillNullByte(fp
, delimiter
));
796 rocount
= rocount
+ 1;
799 def ReadFileHeaderDataBySize(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
800 headerpresize
= ReadTillNullByte(fp
, delimiter
);
801 headersize
= int(headerpresize
, 16);
804 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
807 roend
= int(len(headercontent
));
808 HeaderOut
= [headerpresize
];
809 while(rocount
<roend
):
810 HeaderOut
.append(headercontent
[rocount
]);
811 rocount
= rocount
+ 1;
814 def ReadFileHeaderDataWoSize(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
815 preheaderdata
= ReadFileHeaderData(fp
, 2, delimiter
);
816 headersize
= int(preheaderdata
[0], 16);
817 headernumfields
= int(preheaderdata
[1], 16);
818 if(headersize
<=0 or headernumfields
<=0):
820 headerdata
= ReadTillNullByteByNum(fp
, delimiter
, headernumfields
);
821 #headerdata = ReadFileHeaderData(fp, headernumfields, delimiter);
822 HeaderOut
= preheaderdata
+ headerdata
;
825 def ReadFileHeaderDataBySizeWithContent(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
826 formatspecs
= FormatSpecsListToDict(formatspecs
);
827 delimiter
= formatspecs
['format_delimiter'];
828 fheaderstart
= fp
.tell();
829 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
830 if(len(HeaderOut
)==0):
832 if(re
.findall("^[.|/]", HeaderOut
[3])):
833 fname
= HeaderOut
[3];
835 fname
= "./"+HeaderOut
[3];
836 fchecksumtype
= HeaderOut
[-3].lower();
837 fcs
= HeaderOut
[-2].lower();
838 fccs
= HeaderOut
[-1].lower();
839 fsize
= int(HeaderOut
[5], 16);
840 fcompression
= HeaderOut
[12];
841 fcsize
= int(HeaderOut
[13], 16);
842 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
843 if(fcs
!=newfcs
and not skipchecksum
):
844 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
845 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
847 fhend
= fp
.tell() - 1;
848 fcontentstart
= fp
.tell();
849 fcontents
= BytesIO();
850 if(fsize
>0 and not listonly
):
851 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
852 fcontents
.write(fp
.read(fsize
));
854 fcontents
.write(fp
.read(fcsize
));
855 elif(fsize
>0 and listonly
):
856 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
860 fcontents
.seek(0, 0);
861 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
862 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
863 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
864 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
866 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
869 fcontents
.seek(0, 0);
871 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
873 fcontentend
= fp
.tell() - 1;
874 HeaderOut
.append(fcontents
);
877 def ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
878 formatspecs
= FormatSpecsListToDict(formatspecs
);
879 delimiter
= formatspecs
['format_delimiter'];
880 fheaderstart
= fp
.tell();
881 if(formatspecs
['new_style']):
882 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
884 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
885 if(len(HeaderOut
)==0):
887 fheadsize
= int(HeaderOut
[0], 16);
888 fnumfields
= int(HeaderOut
[1], 16);
889 ftype
= int(HeaderOut
[2], 16);
890 if(re
.findall("^[.|/]", HeaderOut
[3])):
891 fname
= HeaderOut
[3];
893 fname
= "./"+HeaderOut
[3];
894 fbasedir
= os
.path
.dirname(fname
);
895 flinkname
= HeaderOut
[4];
896 fsize
= int(HeaderOut
[5], 16);
897 fatime
= int(HeaderOut
[6], 16);
898 fmtime
= int(HeaderOut
[7], 16);
899 fctime
= int(HeaderOut
[8], 16);
900 fbtime
= int(HeaderOut
[9], 16);
901 fmode
= int(HeaderOut
[10], 16);
902 fchmode
= stat
.S_IMODE(fmode
);
903 ftypemod
= stat
.S_IFMT(fmode
);
904 fwinattributes
= int(HeaderOut
[11], 16);
905 fcompression
= HeaderOut
[12];
906 fcsize
= int(HeaderOut
[13], 16);
907 fuid
= int(HeaderOut
[14], 16);
908 funame
= HeaderOut
[15];
909 fgid
= int(HeaderOut
[16], 16);
910 fgname
= HeaderOut
[17];
911 fid
= int(HeaderOut
[18], 16);
912 finode
= int(HeaderOut
[19], 16);
913 flinkcount
= int(HeaderOut
[20], 16);
914 fdev_minor
= int(HeaderOut
[21], 16);
915 fdev_major
= int(HeaderOut
[22], 16);
916 frdev_minor
= int(HeaderOut
[23], 16);
917 frdev_major
= int(HeaderOut
[24], 16);
918 fextrasize
= int(HeaderOut
[25], 16);
919 fextrafields
= int(HeaderOut
[26], 16);
920 extrafieldslist
= [];
922 extraend
= extrastart
+ fextrafields
;
923 extrafieldslist
= [];
924 if(extrastart
<extraend
):
925 extrafieldslist
.append(HeaderOut
[extrastart
]);
926 extrastart
= extrastart
+ 1;
927 fchecksumtype
= HeaderOut
[extrastart
].lower();
928 fcs
= HeaderOut
[extrastart
+ 1].lower();
929 fccs
= HeaderOut
[extrastart
+ 2].lower();
930 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
931 if(fcs
!=newfcs
and not skipchecksum
):
932 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
933 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
935 fhend
= fp
.tell() - 1;
936 fcontentstart
= fp
.tell();
937 fcontents
= BytesIO();
938 pyhascontents
= False;
939 if(fsize
>0 and not listonly
):
940 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
941 fcontents
.write(fp
.read(fsize
));
943 fcontents
.write(fp
.read(fcsize
));
944 pyhascontents
= True;
945 elif(fsize
>0 and listonly
):
946 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
950 pyhascontents
= False;
951 fcontents
.seek(0, 0);
952 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
953 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
954 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
955 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
957 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
960 fcontents
.seek(0, 0);
962 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
963 fcontents
.seek(0, 0);
964 fccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
966 fcontentend
= fp
.tell() - 1;
967 fcontents
.seek(0, 0);
968 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
};
971 def ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
972 formatspecs
= FormatSpecsListToDict(formatspecs
);
973 delimiter
= formatspecs
['format_delimiter'];
974 fheaderstart
= fp
.tell();
975 if(formatspecs
['new_style']):
976 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
978 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
979 if(len(HeaderOut
)==0):
981 fheadsize
= int(HeaderOut
[0], 16);
982 fnumfields
= int(HeaderOut
[1], 16);
983 ftype
= int(HeaderOut
[2], 16);
984 if(re
.findall("^[.|/]", HeaderOut
[3])):
985 fname
= HeaderOut
[3];
987 fname
= "./"+HeaderOut
[3];
988 fbasedir
= os
.path
.dirname(fname
);
989 flinkname
= HeaderOut
[4];
990 fsize
= int(HeaderOut
[5], 16);
991 fatime
= int(HeaderOut
[6], 16);
992 fmtime
= int(HeaderOut
[7], 16);
993 fctime
= int(HeaderOut
[8], 16);
994 fbtime
= int(HeaderOut
[9], 16);
995 fmode
= int(HeaderOut
[10], 16);
996 fchmode
= stat
.S_IMODE(fmode
);
997 ftypemod
= stat
.S_IFMT(fmode
);
998 fwinattributes
= int(HeaderOut
[11], 16);
999 fcompression
= HeaderOut
[12];
1000 fcsize
= int(HeaderOut
[13], 16);
1001 fuid
= int(HeaderOut
[14], 16);
1002 funame
= HeaderOut
[15];
1003 fgid
= int(HeaderOut
[16], 16);
1004 fgname
= HeaderOut
[17];
1005 fid
= int(HeaderOut
[18], 16);
1006 finode
= int(HeaderOut
[19], 16);
1007 flinkcount
= int(HeaderOut
[20], 16);
1008 fdev_minor
= int(HeaderOut
[21], 16);
1009 fdev_major
= int(HeaderOut
[22], 16);
1010 frdev_minor
= int(HeaderOut
[23], 16);
1011 frdev_major
= int(HeaderOut
[24], 16);
1012 fextrasize
= int(HeaderOut
[25], 16);
1013 fextrafields
= int(HeaderOut
[26], 16);
1014 extrafieldslist
= [];
1016 extraend
= extrastart
+ fextrafields
;
1017 extrafieldslist
= [];
1018 if(extrastart
<extraend
):
1019 extrafieldslist
.append(HeaderOut
[extrastart
]);
1020 extrastart
= extrastart
+ 1;
1021 fchecksumtype
= HeaderOut
[extrastart
].lower();
1022 fcs
= HeaderOut
[extrastart
+ 1].lower();
1023 fccs
= HeaderOut
[extrastart
+ 2].lower();
1024 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
1025 if(fcs
!=newfcs
and not skipchecksum
):
1026 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
1027 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
1029 fhend
= fp
.tell() - 1;
1030 fcontentstart
= fp
.tell();
1031 fcontents
= BytesIO();
1032 pyhascontents
= False;
1033 if(fsize
>0 and not listonly
):
1034 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1035 fcontents
.write(fp
.read(fsize
));
1037 fcontents
.write(fp
.read(fcsize
));
1038 pyhascontents
= True;
1039 elif(fsize
>0 and listonly
):
1040 if(fcompression
=="none" or fcompression
=="" or fcompression
=="atuo"):
1044 pyhascontents
= False;
1045 fcontents
.seek(0, 0);
1046 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
1047 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
1048 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
1049 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
1051 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1054 fcontents
.seek(0, 0);
1056 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
1057 fcontents
.seek(0, 0);
1059 fcontentend
= fp
.tell() - 1;
1060 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
];
1063 def ReadFileDataBySizeWithContent(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1064 formatspecs
= FormatSpecsListToDict(formatspecs
);
1065 delimiter
= formatspecs
['format_delimiter'];
1069 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1072 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1073 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1074 if(not headercheck
and not skipchecksum
):
1075 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1076 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1078 fnumfiles
= int(catheader
[1], 16);
1081 while(countnum
< fnumfiles
):
1082 HeaderOut
= ReadFileHeaderDataBySizeWithContent(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
)
1083 if(len(HeaderOut
)==0):
1085 flist
.append(HeaderOut
);
1086 countnum
= countnum
+ 1;
1089 def ReadFileDataBySizeWithContentToArray(fp
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1090 formatspecs
= FormatSpecsListToDict(formatspecs
);
1091 delimiter
= formatspecs
['format_delimiter'];
1095 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1098 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1099 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1100 if(not headercheck
and not skipchecksum
):
1101 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1102 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1104 catstring
= catheader
[0];
1105 catversion
= re
.findall(r
"([\d]+)", catstring
);
1106 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
1107 fprenumfiles
= catheader
[1];
1108 fnumfiles
= int(fprenumfiles
, 16);
1109 fprechecksumtype
= catheader
[2];
1110 fprechecksum
= catheader
[3];
1111 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': []};
1112 if(seekstart
<0 and seekstart
>fnumfiles
):
1114 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
1115 seekend
= fnumfiles
;
1116 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
1117 seekend
= fnumfiles
- abs(seekend
);
1120 while(il
< seekstart
):
1121 prefhstart
= fp
.tell();
1122 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
['format_delimiter']);
1123 if(len(preheaderdata
)==0):
1125 prefsize
= int(preheaderdata
[5], 16);
1126 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-3].lower(), True, formatspecs
);
1127 prefcs
= preheaderdata
[-2];
1128 if(prefcs
!=prenewfcs
and not skipchecksum
):
1129 VVerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
1130 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
1132 valid_archive
= False;
1133 invalid_archive
= True;
1134 prefhend
= fp
.tell() - 1;
1135 prefcontentstart
= fp
.tell();
1136 prefcontents
= BytesIO();
1137 pyhascontents
= False;
1139 prefcontents
.write(fp
.read(prefsize
));
1140 prefcontents
.seek(0, 0);
1141 prenewfccs
= GetFileChecksum(prefcontents
.read(), preheaderdata
[-3].lower(), False, formatspecs
);
1142 prefccs
= preheaderdata
[-1];
1143 pyhascontents
= True;
1144 if(prefccs
!=prenewfccs
and not skipchecksum
):
1145 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
1146 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
1151 countnum
= seekstart
;
1152 while(countnum
< seekend
):
1153 HeaderOut
= ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1154 if(len(HeaderOut
)==0):
1156 HeaderOut
.update({'fid': realidnum
, 'fidalt': realidnum
});
1157 catlist
['ffilelist'].append(HeaderOut
);
1158 countnum
= countnum
+ 1;
1159 realidnum
= realidnum
+ 1;
1162 def ReadFileDataBySizeWithContentToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1163 formatspecs
= FormatSpecsListToDict(formatspecs
);
1164 if(isinstance(infile
, dict)):
1165 listcatfiles
= infile
;
1167 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
1169 listcatfiles
= ReadFileDataBySizeWithContentToArray(infile
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1170 if(not listcatfiles
):
1172 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': {}}}};
1173 lenlist
= len(listcatfiles
['ffilelist']);
1175 lcfx
= int(listcatfiles
['fnumfiles']);
1176 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
1177 lcfx
= int(lenlist
);
1179 lcfx
= int(listcatfiles
['fnumfiles']);
1181 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
1182 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
1183 catarray
['filetoid'].update(filetoidarray
);
1184 catarray
['idtofile'].update(idtofilearray
);
1185 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
1186 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
1187 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
1188 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
1189 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
1190 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
1191 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1192 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1193 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
1194 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1195 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1196 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1197 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1198 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
1199 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
1200 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
1201 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1202 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1203 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
1204 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
1205 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
1206 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1207 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1208 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
1209 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
1210 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
1211 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
1212 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1213 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1214 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1215 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1219 def ReadFileDataBySizeWithContentToList(fp
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1220 formatspecs
= FormatSpecsListToDict(formatspecs
);
1221 delimiter
= formatspecs
['format_delimiter'];
1225 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1228 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1229 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1230 if(not headercheck
and not skipchecksum
):
1231 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1232 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1234 catstring
= catheader
[0];
1235 catversion
= re
.findall(r
"([\d]+)", catstring
);
1236 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
1237 fprenumfiles
= catheader
[1];
1238 fnumfiles
= int(fprenumfiles
, 16);
1239 fprechecksumtype
= catheader
[2];
1240 fprechecksum
= catheader
[3];
1242 if(seekstart
<0 and seekstart
>fnumfiles
):
1244 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
1245 seekend
= fnumfiles
;
1246 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
1247 seekend
= fnumfiles
- abs(seekend
);
1250 while(il
< seekstart
):
1251 prefhstart
= fp
.tell();
1252 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
['format_delimiter']);
1253 if(len(preheaderdata
)==0):
1255 prefsize
= int(preheaderdata
[5], 16);
1256 prefcompression
= preheaderdata
[12];
1257 prefcsize
= int(preheaderdata
[13], 16);
1258 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-3].lower(), True, formatspecs
);
1259 prefcs
= preheaderdata
[-2];
1260 if(prefcs
!=prenewfcs
and not skipchecksum
):
1261 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
1262 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
1264 valid_archive
= False;
1265 invalid_archive
= True;
1266 prefhend
= fp
.tell() - 1;
1267 prefcontentstart
= fp
.tell();
1269 pyhascontents
= False;
1271 if(prefcompression
=="none" or prefcompression
=="" or prefcompression
=="auto"):
1272 prefcontents
= catfp
.read(prefsize
);
1274 prefcontents
= catfp
.read(prefcsize
);
1275 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
1276 prefccs
= preheaderdata
[-1];
1277 pyhascontents
= True;
1278 if(prefccs
!=prenewfccs
and not skipchecksum
):
1279 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
1280 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
1285 countnum
= seekstart
;
1286 while(countnum
< seekend
):
1287 HeaderOut
= ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1288 if(len(HeaderOut
)==0):
1290 catlist
.append(HeaderOut
);
1291 countnum
= countnum
+ 1;
1292 realidnum
= realidnum
+ 1;
1295 def ReadInFileBySizeWithContentToArray(infile
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1296 formatspecs
= FormatSpecsListToDict(formatspecs
);
1297 delimiter
= formatspecs
['format_delimiter'];
1298 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1301 fp
= UncompressArchiveFile(fp
, formatspecs
);
1302 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1303 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1310 if(hasattr(sys
.stdin
, "buffer")):
1311 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1313 shutil
.copyfileobj(sys
.stdin
, fp
);
1315 fp
= UncompressArchiveFile(fp
, formatspecs
);
1319 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1320 fp
= download_file_from_internet_file(infile
);
1321 fp
= UncompressArchiveFile(fp
, formatspecs
);
1327 infile
= RemoveWindowsPath(infile
);
1328 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
1329 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1331 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1332 if(not compresscheck
):
1333 fextname
= os
.path
.splitext(infile
)[1];
1334 if(fextname
==".gz"):
1335 compresscheck
= "gzip";
1336 elif(fextname
==".bz2"):
1337 compresscheck
= "bzip2";
1338 elif(fextname
==".zst"):
1339 compresscheck
= "zstd";
1340 elif(fextname
==".lz4" or fextname
==".clz4"):
1341 compresscheck
= "lz4";
1342 elif(fextname
==".lzo" or fextname
==".lzop"):
1343 compresscheck
= "lzo";
1344 elif(fextname
==".lzma" or fextname
==".xz"):
1345 compresscheck
= "lzma";
1348 if(not compresscheck
):
1350 fp
= UncompressFile(infile
, formatspecs
, "rb");
1351 return ReadFileDataBySizeWithContentToArray(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1353 def ReadInFileBySizeWithContentToList(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1354 formatspecs
= FormatSpecsListToDict(formatspecs
);
1355 delimiter
= formatspecs
['format_delimiter'];
1356 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1359 fp
= UncompressArchiveFile(fp
, formatspecs
);
1360 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1361 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1368 if(hasattr(sys
.stdin
, "buffer")):
1369 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1371 shutil
.copyfileobj(sys
.stdin
, fp
);
1373 fp
= UncompressArchiveFile(fp
, formatspecs
);
1377 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1378 fp
= download_file_from_internet_file(infile
);
1379 fp
= UncompressArchiveFile(fp
, formatspecs
);
1385 infile
= RemoveWindowsPath(infile
);
1386 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
1387 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1389 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1390 if(not compresscheck
):
1391 fextname
= os
.path
.splitext(infile
)[1];
1392 if(fextname
==".gz"):
1393 compresscheck
= "gzip";
1394 elif(fextname
==".bz2"):
1395 compresscheck
= "bzip2";
1396 elif(fextname
==".zst"):
1397 compresscheck
= "zstd";
1398 elif(fextname
==".lz4" or fextname
==".clz4"):
1399 compresscheck
= "lz4";
1400 elif(fextname
==".lzo" or fextname
==".lzop"):
1401 compresscheck
= "lzo";
1402 elif(fextname
==".lzma" or fextname
==".xz"):
1403 compresscheck
= "lzma";
1406 if(not compresscheck
):
1408 fp
= UncompressFile(infile
, formatspecs
, "rb");
1409 return ReadFileDataBySizeWithContentToList(fp
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1411 def ReadInFileBySizeWithContentToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1412 formatspecs
= FormatSpecsListToDict(formatspecs
);
1413 if(isinstance(infile
, dict)):
1414 listcatfiles
= infile
;
1416 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
1417 infile
= RemoveWindowsPath(infile
);
1418 listcatfiles
= ReadInFileBySizeWithContentToArray(infile
, listonly
, skipchecksum
, formatspecs
);
1419 if(not listcatfiles
):
1421 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': {}}}};
1422 lenlist
= len(listcatfiles
['ffilelist']);
1424 lcfx
= int(listcatfiles
['fnumfiles']);
1425 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
1426 lcfx
= int(lenlist
);
1428 lcfx
= int(listcatfiles
['fnumfiles']);
1430 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
1431 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
1432 catarray
['filetoid'].update(filetoidarray
);
1433 catarray
['idtofile'].update(idtofilearray
);
1434 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
1435 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
1436 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
1437 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
1438 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
1439 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
1440 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1441 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1442 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
1443 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1444 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1445 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1446 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1447 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
1448 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
1449 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
1450 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1451 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1452 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
1453 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
1454 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
1455 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1456 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1457 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
1458 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
1459 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
1460 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
1461 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1462 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1463 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1464 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1468 def AppendNullByte(indata
, delimiter
=__file_format_dict__
['format_delimiter']):
1469 outdata
= str(indata
) + delimiter
;
1472 def AppendNullBytes(indata
=[], delimiter
=__file_format_dict__
['format_delimiter']):
1477 outdata
= outdata
+ AppendNullByte(indata
[inum
], delimiter
);
1481 def AppendFileHeader(fp
, numfiles
, checksumtype
="crc32", formatspecs
=__file_format_dict__
):
1482 formatspecs
= FormatSpecsListToDict(formatspecs
);
1483 delimiter
= formatspecs
['format_delimiter'];
1484 catver
= formatspecs
['format_ver'];
1485 fileheaderver
= str(int(catver
.replace(".", "")));
1486 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
1487 fp
.write(fileheader
.encode('UTF-8'));
1488 fnumfiles
= format(int(numfiles
), 'x').lower();
1489 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
['format_delimiter']);
1490 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
1491 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
1492 fp
.write(fnumfilesa
.encode('UTF-8'));
1495 os
.fsync(fp
.fileno());
1496 except io
.UnsupportedOperation
:
1498 except AttributeError:
1500 except OSError as e
:
1504 def MakeEmptyFilePointer(fp
, checksumtype
="crc32", formatspecs
=__file_format_dict__
):
1505 formatspecs
= FormatSpecsListToDict(formatspecs
);
1506 AppendFileHeader(fp
, 0, checksumtype
, formatspecs
);
1509 def MakeEmptyFile(outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", formatspecs
=__file_format_dict__
, returnfp
=False):
1510 formatspecs
= FormatSpecsListToDict(formatspecs
);
1511 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1512 if(os
.path
.exists(outfile
)):
1515 except OSError as e
:
1519 catfpfp
= BytesIO();
1520 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1522 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1525 fbasename
= os
.path
.splitext(outfile
)[0];
1526 fextname
= os
.path
.splitext(outfile
)[1];
1527 catfp
= CompressOpenFile(outfile
, True, compressionlevel
);
1528 catfp
= AppendFileHeader(catfp
, 0, checksumtype
, formatspecs
);
1529 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1530 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1533 os
.fsync(catfp
.fileno());
1534 except io
.UnsupportedOperation
:
1536 except AttributeError:
1538 except OSError as e
:
1542 if(hasattr(sys
.stdout
, "buffer")):
1543 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1545 shutil
.copyfileobj(catfp
, sys
.stdout
);
1546 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1547 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1549 upload_file_to_internet_file(catfp
, outfile
);
1557 def AppendFileHeaderWithContent(fp
, filevalues
=[], extradata
=[], filecontent
="", checksumtype
="crc32", formatspecs
=__file_format_dict__
):
1558 formatspecs
= FormatSpecsListToDict(formatspecs
);
1559 extrafields
= format(len(extradata
), 'x').lower();
1560 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
1561 if(len(extradata
)>0):
1562 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
1563 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1564 catoutlen
= len(filevalues
) + len(extradata
) + 5;
1565 catoutlenhex
= format(catoutlen
, 'x').lower();
1566 catoutlist
= filevalues
;
1567 catoutlist
.insert(0, catoutlenhex
);
1568 catoutlist
.append(extrasizelen
);
1569 catoutlist
.append(extrafields
);
1570 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
1571 if(len(extradata
)>0):
1572 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
1573 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
1574 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1575 catfilecontentcshex
= GetFileChecksum(filecontent
, checksumtype
, False, formatspecs
);
1576 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
1577 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
1578 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
1579 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1580 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
1581 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1582 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
1583 catfileout
= catfileoutstrecd
+ filecontent
+ nullstrecd
;
1584 fp
.write(catfileout
);
1587 os
.fsync(fp
.fileno());
1588 except io
.UnsupportedOperation
:
1590 except AttributeError:
1592 except OSError as e
:
1596 def AppendFilesWithContent(infiles
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
1597 formatspecs
= FormatSpecsListToDict(formatspecs
);
1598 advancedlist
= formatspecs
['use_advanced_list'];
1599 altinode
= formatspecs
['use_alt_inode'];
1601 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1603 for line
in sys
.stdin
:
1604 infilelist
.append(line
.strip());
1605 infilelist
= list(filter(None, infilelist
));
1606 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
1607 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
1609 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
1610 for line
in finfile
:
1611 infilelist
.append(line
.strip());
1612 infilelist
= list(filter(None, infilelist
));
1614 if(isinstance(infiles
, (list, tuple, ))):
1615 infilelist
= list(filter(None, infiles
));
1616 elif(isinstance(infiles
, (str, ))):
1617 infilelist
= list(filter(None, [infiles
]));
1619 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
1621 GetDirList
= ListDir(infilelist
, followlink
, False);
1629 inodetocatinode
= {};
1630 numfiles
= int(len(GetDirList
));
1631 fnumfiles
= format(numfiles
, 'x').lower();
1632 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1633 for curfname
in GetDirList
:
1634 if(re
.findall("^[.|/]", curfname
)):
1637 fname
= "./"+curfname
;
1639 VerbosePrintOut(fname
);
1640 if(not followlink
or followlink
is None):
1641 fstatinfo
= os
.lstat(fname
);
1643 fstatinfo
= os
.stat(fname
);
1644 fpremode
= fstatinfo
.st_mode
;
1645 finode
= fstatinfo
.st_ino
;
1646 flinkcount
= fstatinfo
.st_nlink
;
1648 if(stat
.S_ISREG(fpremode
)):
1650 elif(stat
.S_ISLNK(fpremode
)):
1652 elif(stat
.S_ISCHR(fpremode
)):
1654 elif(stat
.S_ISBLK(fpremode
)):
1656 elif(stat
.S_ISDIR(fpremode
)):
1658 elif(stat
.S_ISFIFO(fpremode
)):
1660 elif(stat
.S_ISSOCK(fpremode
)):
1662 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
1664 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
1666 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
1671 fcurfid
= format(int(curfid
), 'x').lower();
1672 if(not followlink
and finode
!=0):
1674 if(finode
in inodelist
):
1676 flinkname
= inodetofile
[finode
];
1678 fcurinode
= format(int(finode
), 'x').lower();
1680 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
1681 if(finode
not in inodelist
):
1682 inodelist
.append(finode
);
1683 inodetofile
.update({finode
: fname
});
1684 inodetocatinode
.update({finode
: curinode
});
1686 fcurinode
= format(int(finode
), 'x').lower();
1688 fcurinode
= format(int(curinode
), 'x').lower();
1689 curinode
= curinode
+ 1;
1691 fcurinode
= format(int(curinode
), 'x').lower();
1692 curinode
= curinode
+ 1;
1693 curfid
= curfid
+ 1;
1695 flinkname
= os
.readlink(fname
);
1696 fdev
= fstatinfo
.st_dev
;
1697 getfdev
= GetDevMajorMinor(fdev
);
1698 fdev_minor
= getfdev
[0];
1699 fdev_major
= getfdev
[1];
1700 frdev
= fstatinfo
.st_dev
;
1701 if(hasattr(fstatinfo
, "st_rdev")):
1702 frdev
= fstatinfo
.st_rdev
;
1704 frdev
= fstatinfo
.st_dev
;
1705 getfrdev
= GetDevMajorMinor(frdev
);
1706 frdev_minor
= getfrdev
[0];
1707 frdev_major
= getfrdev
[1];
1708 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1709 fsize
= format(int("0"), 'x').lower();
1710 elif(ftype
==0 or ftype
==7):
1711 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
1713 fsize
= format(int(fstatinfo
.st_size
)).lower();
1714 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
1715 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
1716 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1717 if(hasattr(fstatinfo
, "st_birthtime")):
1718 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
1720 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1721 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
1722 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
1723 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
1724 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
1725 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
1730 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
1731 funame
= userinfo
.pw_name
;
1740 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
1741 fgname
= groupinfo
.gr_name
;
1746 fdev_minor
= format(int(fdev_minor
), 'x').lower();
1747 fdev_major
= format(int(fdev_major
), 'x').lower();
1748 frdev_minor
= format(int(frdev_minor
), 'x').lower();
1749 frdev_major
= format(int(frdev_major
), 'x').lower();
1750 finode
= format(int(finode
), 'x').lower();
1751 flinkcount
= format(int(flinkcount
), 'x').lower();
1752 if(hasattr(fstatinfo
, "st_file_attributes")):
1753 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
1755 fwinattributes
= format(int(0), 'x').lower();
1757 fcsize
= format(int(0), 'x').lower();
1758 fcontents
= BytesIO();
1760 if(ftype
==0 or ftype
==7):
1761 with
open(fname
, "rb") as fpc
:
1762 shutil
.copyfileobj(fpc
, fcontents
);
1763 if(not compresswholefile
):
1764 fcontents
.seek(0, 2);
1765 ucfsize
= fcontents
.tell();
1766 fcontents
.seek(0, 0);
1767 if(compression
=="auto"):
1768 ilsize
= len(compressionlistalt
);
1771 while(ilmin
< ilsize
):
1772 cfcontents
= BytesIO();
1773 shutil
.copyfileobj(fcontents
, cfcontents
);
1774 fcontents
.seek(0, 0);
1775 cfcontents
.seek(0, 0);
1776 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
1778 cfcontents
.seek(0, 2);
1779 ilcsize
.append(cfcontents
.tell());
1783 ilcsize
.append(sys
.maxint
);
1784 except AttributeError:
1785 ilcsize
.append(sys
.maxsize
);
1787 ilcmin
= ilcsize
.index(min(ilcsize
));
1788 compression
= compressionlistalt
[ilcmin
];
1789 fcontents
.seek(0, 0);
1790 cfcontents
= BytesIO();
1791 shutil
.copyfileobj(fcontents
, cfcontents
);
1792 cfcontents
.seek(0, 0);
1793 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
1794 cfcontents
.seek(0, 2);
1795 cfsize
= cfcontents
.tell();
1796 if(ucfsize
> cfsize
):
1797 fcsize
= format(int(cfsize
), 'x').lower();
1798 fcompression
= compression
;
1800 fcontents
= cfcontents
;
1801 if(followlink
and (ftype
==1 or ftype
==2)):
1802 flstatinfo
= os
.stat(flinkname
);
1803 with
open(flinkname
, "rb") as fpc
:
1804 shutil
.copyfileobj(fpc
, fcontents
);
1805 if(not compresswholefile
):
1806 fcontents
.seek(0, 2);
1807 ucfsize
= fcontents
.tell();
1808 fcontents
.seek(0, 0);
1809 if(compression
=="auto"):
1810 ilsize
= len(compressionlistalt
);
1813 while(ilmin
< ilsize
):
1814 cfcontents
= BytesIO();
1815 shutil
.copyfileobj(fcontents
, cfcontents
);
1816 fcontents
.seek(0, 0);
1817 cfcontents
.seek(0, 0);
1818 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
1820 cfcontents
.seek(0, 2);
1821 ilcsize
.append(cfcontents
.tell());
1825 ilcsize
.append(sys
.maxint
);
1826 except AttributeError:
1827 ilcsize
.append(sys
.maxsize
);
1829 ilcmin
= ilcsize
.index(min(ilcsize
));
1830 compression
= compressionlistalt
[ilcmin
];
1831 fcontents
.seek(0, 0);
1832 cfcontents
= BytesIO();
1833 shutil
.copyfileobj(fcontents
, cfcontents
);
1834 cfcontents
.seek(0, 0);
1835 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
1836 cfcontents
.seek(0, 2);
1837 cfsize
= cfcontents
.tell();
1838 if(ucfsize
> cfsize
):
1839 fcsize
= format(int(cfsize
), 'x').lower();
1840 fcompression
= compression
;
1842 fcontents
= cfcontents
;
1843 if(fcompression
=="none"):
1845 fcontents
.seek(0, 0);
1846 ftypehex
= format(ftype
, 'x').lower();
1847 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
];
1848 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
1850 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
1854 def AppendListsWithContent(inlist
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
1855 formatspecs
= FormatSpecsListToDict(formatspecs
);
1857 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1858 GetDirList
= inlist
;
1866 inodetocatinode
= {};
1867 numfiles
= int(len(GetDirList
));
1868 fnumfiles
= format(numfiles
, 'x').lower();
1869 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1870 for curfname
in GetDirList
:
1871 ftype
= format(curfname
[0], 'x').lower();
1872 if(re
.findall("^[.|/]", curfname
[1])):
1873 fname
= curfname
[1];
1875 fname
= "./"+curfname
[1];
1876 fbasedir
= os
.path
.dirname(fname
);
1877 flinkname
= curfname
[2];
1878 fsize
= format(curfname
[3], 'x').lower();
1879 fatime
= format(curfname
[4], 'x').lower();
1880 fmtime
= format(curfname
[5], 'x').lower();
1881 fctime
= format(curfname
[6], 'x').lower();
1882 fbtime
= format(curfname
[7], 'x').lower();
1883 fmode
= format(curfname
[8], 'x').lower();
1884 fwinattributes
= format(curfname
[9], 'x').lower();
1885 fcompression
= curfname
[10];
1886 fcsize
= format(curfname
[11], 'x').lower();
1887 fuid
= format(curfname
[12], 'x').lower();
1888 funame
= curfname
[13];
1889 fgid
= format(curfname
[14], 'x').lower();
1890 fgname
= curfname
[15];
1891 fid
= format(curfname
[16], 'x').lower();
1892 finode
= format(curfname
[17], 'x').lower();
1893 flinkcount
= format(curfname
[18], 'x').lower();
1894 fdev_minor
= format(curfname
[19], 'x').lower();
1895 fdev_major
= format(curfname
[20], 'x').lower();
1896 frdev_minor
= format(curfname
[21], 'x').lower();
1897 frdev_major
= format(curfname
[22], 'x').lower();
1898 extradata
= curfname
[23];
1899 fchecksumtype
= curfname
[24];
1900 fcontents
= curfname
[25];
1901 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
];
1902 fcontents
.seek(0, 0);
1903 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
1905 fp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
1908 def AppendInFileWithContent(infile
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
1909 formatspecs
= FormatSpecsListToDict(formatspecs
);
1910 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, True, False, formatspecs
);
1911 return AppendListsWithContent(inlist
, fp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1913 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):
1914 formatspecs
= FormatSpecsListToDict(formatspecs
);
1915 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1916 if(os
.path
.exists(outfile
)):
1919 except OSError as e
:
1923 catfpfp
= BytesIO();
1924 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1926 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1929 fbasename
= os
.path
.splitext(outfile
)[0];
1930 fextname
= os
.path
.splitext(outfile
)[1];
1931 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
1932 catfp
= AppendFilesWithContent(infiles
, catfp
, dirlistfromtxt
, filevalues
, extradata
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
);
1933 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1934 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1937 os
.fsync(catfp
.fileno());
1938 except io
.UnsupportedOperation
:
1940 except AttributeError:
1942 except OSError as e
:
1946 if(hasattr(sys
.stdout
, "buffer")):
1947 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1949 shutil
.copyfileobj(catfp
, sys
.stdout
);
1950 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1951 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1953 upload_file_to_internet_file(catfp
, outfile
);
1961 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):
1962 formatspecs
= FormatSpecsListToDict(formatspecs
);
1963 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1964 if(os
.path
.exists(outfile
)):
1967 except OSError as e
:
1971 catfpfp
= BytesIO();
1972 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1974 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1977 fbasename
= os
.path
.splitext(outfile
)[0];
1978 fextname
= os
.path
.splitext(outfile
)[1];
1979 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
1980 catfp
= AppendListsWithContent(inlist
, catfp
, dirlistfromtxt
, filevalues
, extradata
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
);
1981 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1982 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1985 os
.fsync(catfp
.fileno());
1986 except io
.UnsupportedOperation
:
1988 except AttributeError:
1990 except OSError as e
:
1994 if(hasattr(sys
.stdout
, "buffer")):
1995 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1997 shutil
.copyfileobj(catfp
, sys
.stdout
);
1998 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1999 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2001 upload_file_to_internet_file(catfp
, outfile
);
2009 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):
2010 formatspecs
= FormatSpecsListToDict(formatspecs
);
2011 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, True, False, formatspecs
);
2012 return AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
, returnfp
);
2014 def PrintPermissionString(fchmode
, ftype
):
2015 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' } };
2017 for fmodval
in str(oct(fchmode
))[-3:]:
2018 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
2019 if(ftype
==0 or ftype
==7):
2020 permissionstr
= "-" + permissionstr
;
2022 permissionstr
= "h" + permissionstr
;
2024 permissionstr
= "l" + permissionstr
;
2026 permissionstr
= "c" + permissionstr
;
2028 permissionstr
= "b" + permissionstr
;
2030 permissionstr
= "d" + permissionstr
;
2032 permissionstr
= "f" + permissionstr
;
2034 permissionstr
= "D" + permissionstr
;
2036 permissionstr
= "p" + permissionstr
;
2038 permissionstr
= "w" + permissionstr
;
2040 permissionoutstr
= stat
.filemode(fchmode
);
2041 except AttributeError:
2042 permissionoutstr
= permissionstr
;
2044 permissionoutstr
= permissionstr
;
2045 return permissionoutstr
;
2047 def PrintPermissionStringAlt(fchmode
, ftype
):
2049 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
2050 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
2052 # Translate file mode into permission string
2053 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
2054 # Append file type indicator
2056 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
2057 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
2059 file_type
= type_indicators
.get(ftype
, '-');
2060 permissionstr
= file_type
+ permissionstr
;
2062 permissionoutstr
= stat
.filemode(fchmode
);
2063 except AttributeError:
2064 permissionoutstr
= permissionstr
;
2065 return permissionoutstr
;
2067 def CheckCompressionType(infile
, formatspecs
=__file_format_dict__
, closefp
=True):
2068 formatspecs
= FormatSpecsListToDict(formatspecs
);
2069 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2073 catfp
= open(infile
, "rb");
2074 except FileNotFoundError
:
2077 prefp
= catfp
.read(2);
2079 if(prefp
==binascii
.unhexlify("1f8b")):
2082 prefp
= catfp
.read(3);
2083 if(prefp
==binascii
.unhexlify("425a68")):
2085 if(prefp
==binascii
.unhexlify("5d0000")):
2088 prefp
= catfp
.read(4);
2089 if(prefp
==binascii
.unhexlify("28b52ffd")):
2091 if(prefp
==binascii
.unhexlify("04224d18")):
2093 if(prefp
==binascii
.unhexlify("504B0304")):
2094 filetype
= "zipfile";
2096 prefp
= catfp
.read(5);
2097 if(prefp
==binascii
.unhexlify("7573746172")):
2098 filetype
= "tarfile";
2100 prefp
= catfp
.read(6);
2101 if(prefp
==binascii
.unhexlify("fd377a585a00")):
2103 if(prefp
==binascii
.unhexlify("377abcaf271c")):
2104 filetype
= "7zipfile";
2106 prefp
= catfp
.read(7);
2107 if(prefp
==binascii
.unhexlify("526172211a0700")):
2108 filetype
= "rarfile";
2109 if(prefp
==binascii
.unhexlify("43617446696c65")):
2110 filetype
= "catfile";
2112 prefp
= catfp
.read(8);
2113 if(prefp
==binascii
.unhexlify("526172211a070100")):
2114 filetype
= "rarfile";
2116 prefp
= catfp
.read(formatspecs
['format_len']);
2117 if(prefp
==binascii
.unhexlify(formatspecs
['format_hex'])):
2118 filetype
= formatspecs
['format_lower'];
2120 prefp
= catfp
.read(9);
2121 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
2124 prefp
= catfp
.read(10);
2125 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2126 filetype
= "tarfile";
2128 if(filetype
=="gzip" or filetype
=="bzip2" or filetype
=="lzma" or filetype
=="zstd" or filetype
=="lz4"):
2129 if(TarFileCheck(catfp
)):
2130 filetype
= "tarfile";
2132 if(TarFileCheck(catfp
)):
2133 filetype
= "tarfile";
2134 elif(zipfile
.is_zipfile(catfp
)):
2135 filetype
= "zipfile";
2136 elif(rarfile
.is_rarfile(catfp
) or rarfile
.is_rarfile_sfx(catfp
)):
2137 filetype
= "rarile";
2145 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_dict__
, closefp
=True):
2146 formatspecs
= FormatSpecsListToDict(formatspecs
);
2148 instringsfile
= BytesIO(instring
);
2150 instringsfile
= BytesIO(instring
.encode("UTF-8"));
2151 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
2153 def GetCompressionMimeType(infile
, formatspecs
=__file_format_dict__
):
2154 formatspecs
= FormatSpecsListToDict(formatspecs
);
2155 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
2156 if(compresscheck
=="gzip" or compresscheck
=="gz"):
2157 return archivefile_gzip_mimetype
;
2158 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
2159 return archivefile_bzip2_mimetype
;
2160 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
2161 return archivefile_zstandard_mimetype
;
2162 if(compresscheck
=="lz4"):
2163 return archivefile_lz4_mimetype
;
2164 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
2165 return archivefile_lzop_mimetype
;
2166 if(compresscheck
=="lzma"):
2167 return archivefile_lzma_mimetype
;
2168 if(compresscheck
=="xz"):
2169 return archivefile_xz_mimetype
;
2170 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
['format_lower']):
2171 return archivefile_cat_mimetype
;
2172 if(not compresscheck
):
2176 def UncompressArchiveFile(fp
, formatspecs
=__file_format_dict__
):
2177 formatspecs
= FormatSpecsListToDict(formatspecs
);
2178 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2180 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
2181 if(compresscheck
=="gzip"):
2186 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
2187 if(compresscheck
=="bzip2"):
2193 catfp
.write(bz2
.decompress(fp
.read()));
2194 if(compresscheck
=="zstd"):
2200 catfp
.write(zstandard
.decompress(fp
.read()));
2201 if(compresscheck
=="lz4"):
2207 catfp
.write(lz4
.frame
.decompress(fp
.read()));
2208 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
2214 catfp
.write(lzo
.decompress(fp
.read()));
2215 if(compresscheck
=="lzma" or compresscheck
=="xz"):
2220 from backports
import lzma
2224 catfp
.write(lzma
.decompress(fp
.read()));
2225 if(compresscheck
=="catfile" or compresscheck
==formatspecs
['format_lower']):
2227 if(not compresscheck
):
2232 from backports
import lzma
2236 with fp
as fpcontent
:
2238 catfp
.write(lzma
.decompress(fp
.read()));
2239 except lzma
.LZMAError
:
2241 if(compresscheck
!="catfile" or compresscheck
!=formatspecs
['format_lower']):
2245 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
2247 def UncompressFile(infile
, formatspecs
=__file_format_dict__
, mode
="rb"):
2248 formatspecs
= FormatSpecsListToDict(formatspecs
);
2249 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
2250 if(sys
.version_info
[0]==2 and compresscheck
):
2256 if(compresscheck
=="gzip"):
2262 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
2263 except (ValueError, TypeError) as e
:
2264 filefp
= gzip
.open(infile
, mode
);
2265 if(compresscheck
=="bzip2"):
2271 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
2272 except (ValueError, TypeError) as e
:
2273 filefp
= bz2
.open(infile
, mode
);
2274 if(compresscheck
=="zstd"):
2280 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
2281 except (ValueError, TypeError) as e
:
2282 filefp
= zstandard
.open(infile
, mode
);
2283 if(compresscheck
=="lz4"):
2289 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
2290 except (ValueError, TypeError) as e
:
2291 filefp
= lz4
.frame
.open(infile
, mode
);
2292 if(compresscheck
=="lzo"):
2298 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
2299 except (ValueError, TypeError) as e
:
2300 filefp
= lzo
.open(infile
, mode
);
2301 if(compresscheck
=="lzma"):
2306 from backports
import lzma
2310 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
2311 except (ValueError, TypeError) as e
:
2312 filefp
= lzma
.open(infile
, mode
);
2313 if(compresscheck
=="catfile" or compresscheck
==formatspecs
['format_lower']):
2315 filefp
= open(infile
, mode
, encoding
="UTF-8");
2316 except (ValueError, TypeError) as e
:
2317 filefp
= open(infile
, mode
);
2318 if(not compresscheck
):
2320 filefp
= open(infile
, mode
, encoding
="UTF-8");
2321 except (ValueError, TypeError) as e
:
2322 filefp
= open(infile
, mode
);
2323 except FileNotFoundError
:
2327 def UncompressString(infile
):
2328 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
2329 if(compresscheck
=="gzip"):
2334 fileuz
= gzip
.decompress(infile
);
2335 if(compresscheck
=="bzip2"):
2340 fileuz
= bz2
.decompress(infile
);
2341 if(compresscheck
=="zstd"):
2346 fileuz
= zstandard
.decompress(infile
);
2347 if(compresscheck
=="lz4"):
2352 fileuz
= lz4
.frame
.decompress(infile
);
2353 if(compresscheck
=="lzo"):
2358 fileuz
= lzo
.decompress(infile
);
2359 if(compresscheck
=="lzma"):
2364 from backports
import lzma
2367 fileuz
= lzma
.decompress(infile
);
2368 if(not compresscheck
):
2370 if(hasattr(fileuz
, 'decode')):
2371 fileuz
= fileuz
.decode("UTF-8");
2374 def UncompressStringAlt(infile
):
2375 filefp
= StringIO();
2376 outstring
= UncompressString(infile
);
2377 filefp
.write(outstring
);
2381 def CheckCompressionSubType(infile
, formatspecs
=__file_format_dict__
, closefp
=True):
2382 formatspecs
= FormatSpecsListToDict(formatspecs
);
2383 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
2384 if(not compresscheck
):
2385 fextname
= os
.path
.splitext(infile
)[1];
2386 if(fextname
==".gz"):
2387 compresscheck
= "gzip";
2388 elif(fextname
==".bz2"):
2389 compresscheck
= "bzip2";
2390 elif(fextname
==".zst"):
2391 compresscheck
= "zstd";
2392 elif(fextname
==".lz4"):
2393 compresscheck
= "lz4";
2394 elif(fextname
==".lzo" or fextname
==".lzop"):
2395 compresscheck
= "lzo";
2396 elif(fextname
==".lzma" or fextname
==".xz"):
2397 compresscheck
= "lzma";
2400 if(compresscheck
=="gzip" or compresscheck
=="bzip2" or compresscheck
=="lzma" or compresscheck
=="zstd" or compresscheck
=="lz4"):
2401 if(TarFileCheck(infile
)):
2402 filetype
= "tarfile";
2403 if(not compresscheck
):
2404 if(TarFileCheck(infile
)):
2406 elif(zipfile
.is_zipfile(infile
)):
2408 elif(rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
)):
2413 if(compresscheck
=="catfile"):
2415 if(compresscheck
==formatspecs
['format_lower']):
2416 return formatspecs
['format_lower'];
2417 if(compresscheck
=="tarfile"):
2419 if(compresscheck
=="zipfile"):
2421 if(rarfile_support
and compresscheck
=="rarfile"):
2423 if(py7zr_support
and compresscheck
=="7zipfile"):
2425 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2426 catfp
= UncompressArchiveFile(infile
, formatspecs
['format_lower']);
2429 if(compresscheck
=="gzip"):
2434 catfp
= gzip
.GzipFile(infile
, "rb");
2435 if(compresscheck
=="bzip2"):
2440 catfp
= bz2
.BZ2File(infile
, "rb");
2441 if(compresscheck
=="lz4"):
2446 catfp
= lz4
.frame
.open(infile
, "rb");
2447 if(compresscheck
=="zstd"):
2452 catfp
= zstandard
.open(infile
, "rb");
2453 if(compresscheck
=="lzma" or compresscheck
=="xz"):
2458 from backports
import lzma
2461 catfp
= lzma
.open(infile
, "rb");
2462 except FileNotFoundError
:
2465 prefp
= catfp
.read(5);
2466 if(prefp
==binascii
.unhexlify("7573746172")):
2467 filetype
= "tarfile";
2469 prefp
= catfp
.read(7);
2470 if(prefp
==binascii
.unhexlify("43617446696c65")):
2471 filetype
= "catfile";
2473 prefp
= catfp
.read(formatspecs
['format_len']);
2474 if(prefp
==binascii
.unhexlify(formatspecs
['format_hex'])):
2475 filetype
= formatspecs
['format_lower'];
2477 prefp
= catfp
.read(10);
2478 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2479 filetype
= "tarfile";
2485 def GZipCompress(data
, compresslevel
=9):
2490 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
2492 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
2496 catfp
= open(tmpfp
.name
, "rb");
2497 except FileNotFoundError
:
2499 catdata
= catfp
.read();
2503 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_dict__
):
2504 formatspecs
= FormatSpecsListToDict(formatspecs
);
2505 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2508 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
2509 compression
= "auto";
2510 if(compression
not in compressionlist
and compression
is None):
2511 compression
= "auto";
2512 if(compression
=="gzip"):
2518 if(compressionlevel
is None):
2519 compressionlevel
= 9;
2521 compressionlevel
= int(compressionlevel
);
2522 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
2523 if(compression
=="bzip2"):
2529 if(compressionlevel
is None):
2530 compressionlevel
= 9;
2532 compressionlevel
= int(compressionlevel
);
2533 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
2534 if(compression
=="lz4"):
2540 if(compressionlevel
is None):
2541 compressionlevel
= 9;
2543 compressionlevel
= int(compressionlevel
);
2544 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
2545 if(compression
=="lzo" or compression
=="lzop"):
2551 if(compressionlevel
is None):
2552 compressionlevel
= 9;
2554 compressionlevel
= int(compressionlevel
);
2555 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
2556 if(compression
=="zstd"):
2562 if(compressionlevel
is None):
2563 compressionlevel
= 10;
2565 compressionlevel
= int(compressionlevel
);
2566 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
2567 if(compression
=="lzma"):
2572 from backports
import lzma
2576 if(compressionlevel
is None):
2577 compressionlevel
= 9;
2579 compressionlevel
= int(compressionlevel
);
2580 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
2581 if(compression
=="xz"):
2586 from backports
import lzma
2590 if(compressionlevel
is None):
2591 compressionlevel
= 9;
2593 compressionlevel
= int(compressionlevel
);
2594 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
2595 if(compression
=="auto" or compression
is None):
2600 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
2602 def CompressOpenFile(outfile
, compressionenable
=True, compressionlevel
=None):
2603 if(outfile
is None):
2605 fbasename
= os
.path
.splitext(outfile
)[0];
2606 fextname
= os
.path
.splitext(outfile
)[1];
2607 if(compressionlevel
is None and fextname
!=".zst"):
2608 compressionlevel
= 9;
2609 elif(compressionlevel
is None and fextname
==".zst"):
2610 compressionlevel
= 10;
2612 compressionlevel
= int(compressionlevel
);
2613 if(sys
.version_info
[0]==2):
2618 if(fextname
not in outextlistwd
or not compressionenable
):
2620 outfp
= open(outfile
, "wb", encoding
="UTF-8");
2621 except (ValueError, TypeError) as e
:
2622 outfp
= open(outfile
, "wb");
2623 elif(fextname
==".gz"):
2629 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2630 except (ValueError, TypeError) as e
:
2631 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
2632 elif(fextname
==".bz2"):
2638 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2639 except (ValueError, TypeError) as e
:
2640 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
2641 elif(fextname
==".zst"):
2647 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
2648 except (ValueError, TypeError) as e
:
2649 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
2650 elif(fextname
==".xz"):
2655 from backports
import lzma
2659 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
2660 except (ValueError, TypeError) as e
:
2661 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
2662 elif(fextname
==".lz4"):
2668 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
2669 except (ValueError, TypeError) as e
:
2670 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
2671 elif(fextname
==".lzo"):
2677 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
2678 except (ValueError, TypeError) as e
:
2679 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
2680 elif(fextname
==".lzma"):
2685 from backports
import lzma
2689 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
2690 except (ValueError, TypeError) as e
:
2691 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
2692 except FileNotFoundError
:
2696 def GetDevMajorMinor(fdev
):
2698 if(hasattr(os
, "minor")):
2699 retdev
.append(os
.minor(fdev
));
2702 if(hasattr(os
, "major")):
2703 retdev
.append(os
.major(fdev
));
2708 def CheckSumSupport(checkfor
, guaranteed
=True):
2711 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2712 except AttributeError:
2713 hash_list
= sorted(list(hashlib
.algorithms
));
2716 hash_list
= sorted(list(hashlib
.algorithms_available
));
2717 except AttributeError:
2718 hash_list
= sorted(list(hashlib
.algorithms
));
2719 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
2720 if(checkfor
in checklistout
):
2725 def CheckSumSupportAlt(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
= hash_list
;
2737 if(checkfor
in checklistout
):
2742 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):
2743 formatspecs
= FormatSpecsListToDict(formatspecs
);
2744 advancedlist
= formatspecs
['use_advanced_list'];
2745 altinode
= formatspecs
['use_alt_inode'];
2746 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2747 outfile
= RemoveWindowsPath(outfile
);
2748 checksumtype
= checksumtype
.lower();
2749 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2750 checksumtype
="crc32";
2751 if(checksumtype
=="none"):
2753 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
2754 compression
= "auto";
2755 if(compression
not in compressionlist
and compression
is None):
2756 compression
= "auto";
2758 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2759 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2760 if(os
.path
.exists(outfile
)):
2763 except OSError as e
:
2768 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2770 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2773 fbasename
= os
.path
.splitext(outfile
)[0];
2774 fextname
= os
.path
.splitext(outfile
)[1];
2775 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
2776 catver
= formatspecs
['format_ver'];
2777 fileheaderver
= str(int(catver
.replace(".", "")));
2780 for line
in sys
.stdin
:
2781 infilelist
.append(line
.strip());
2782 infilelist
= list(filter(None, infilelist
));
2783 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
2784 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
2786 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
2787 for line
in finfile
:
2788 infilelist
.append(line
.strip());
2789 infilelist
= list(filter(None, infilelist
));
2791 if(isinstance(infiles
, (list, tuple, ))):
2792 infilelist
= list(filter(None, infiles
));
2793 elif(isinstance(infiles
, (str, ))):
2794 infilelist
= list(filter(None, [infiles
]));
2796 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
2798 GetDirList
= ListDir(infilelist
, followlink
, False);
2806 inodetocatinode
= {};
2807 numfiles
= int(len(GetDirList
));
2808 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
2809 for curfname
in GetDirList
:
2810 if(re
.findall("^[.|/]", curfname
)):
2813 fname
= "./"+curfname
;
2815 VerbosePrintOut(fname
);
2816 if(not followlink
or followlink
is None):
2817 fstatinfo
= os
.lstat(fname
);
2819 fstatinfo
= os
.stat(fname
);
2820 fpremode
= fstatinfo
.st_mode
;
2821 finode
= fstatinfo
.st_ino
;
2822 flinkcount
= fstatinfo
.st_nlink
;
2824 if(stat
.S_ISREG(fpremode
)):
2826 elif(stat
.S_ISLNK(fpremode
)):
2828 elif(stat
.S_ISCHR(fpremode
)):
2830 elif(stat
.S_ISBLK(fpremode
)):
2832 elif(stat
.S_ISDIR(fpremode
)):
2834 elif(stat
.S_ISFIFO(fpremode
)):
2836 elif(stat
.S_ISSOCK(fpremode
)):
2838 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
2840 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
2842 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
2847 fcurfid
= format(int(curfid
), 'x').lower();
2848 if(not followlink
and finode
!=0):
2850 if(finode
in inodelist
):
2852 flinkname
= inodetofile
[finode
];
2854 fcurinode
= format(int(finode
), 'x').lower();
2856 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
2857 if(finode
not in inodelist
):
2858 inodelist
.append(finode
);
2859 inodetofile
.update({finode
: fname
});
2860 inodetocatinode
.update({finode
: curinode
});
2862 fcurinode
= format(int(finode
), 'x').lower();
2864 fcurinode
= format(int(curinode
), 'x').lower();
2865 curinode
= curinode
+ 1;
2867 fcurinode
= format(int(curinode
), 'x').lower();
2868 curinode
= curinode
+ 1;
2869 curfid
= curfid
+ 1;
2871 flinkname
= os
.readlink(fname
);
2872 fdev
= fstatinfo
.st_dev
;
2873 getfdev
= GetDevMajorMinor(fdev
);
2874 fdev_minor
= getfdev
[0];
2875 fdev_major
= getfdev
[1];
2876 frdev
= fstatinfo
.st_dev
;
2877 if(hasattr(fstatinfo
, "st_rdev")):
2878 frdev
= fstatinfo
.st_rdev
;
2880 frdev
= fstatinfo
.st_dev
;
2881 getfrdev
= GetDevMajorMinor(frdev
);
2882 frdev_minor
= getfrdev
[0];
2883 frdev_major
= getfrdev
[1];
2884 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2885 fsize
= format(int("0"), 'x').lower();
2886 elif(ftype
==0 or ftype
==7):
2887 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
2889 fsize
= format(int(fstatinfo
.st_size
)).lower();
2890 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
2891 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
2892 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2893 if(hasattr(fstatinfo
, "st_birthtime")):
2894 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
2896 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2897 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
2898 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
2899 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
2900 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
2901 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
2906 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
2907 funame
= userinfo
.pw_name
;
2916 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
2917 fgname
= groupinfo
.gr_name
;
2922 fdev_minor
= format(int(fdev_minor
), 'x').lower();
2923 fdev_major
= format(int(fdev_major
), 'x').lower();
2924 frdev_minor
= format(int(frdev_minor
), 'x').lower();
2925 frdev_major
= format(int(frdev_major
), 'x').lower();
2926 finode
= format(int(finode
), 'x').lower();
2927 flinkcount
= format(int(flinkcount
), 'x').lower();
2928 if(hasattr(fstatinfo
, "st_file_attributes")):
2929 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
2931 fwinattributes
= format(int(0), 'x').lower();
2933 fcsize
= format(int(0), 'x').lower();
2934 fcontents
= BytesIO();
2935 if(ftype
==0 or ftype
==7):
2936 with
open(fname
, "rb") as fpc
:
2937 shutil
.copyfileobj(fpc
, fcontents
);
2938 if(not compresswholefile
):
2939 fcontents
.seek(0, 2);
2940 ucfsize
= fcontents
.tell();
2941 fcontents
.seek(0, 0);
2942 if(compression
=="auto"):
2943 ilsize
= len(compressionlistalt
);
2946 while(ilmin
< ilsize
):
2947 cfcontents
= BytesIO();
2948 shutil
.copyfileobj(fcontents
, cfcontents
);
2949 fcontents
.seek(0, 0);
2950 cfcontents
.seek(0, 0);
2951 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
2953 cfcontents
.seek(0, 2);
2954 ilcsize
.append(cfcontents
.tell());
2958 ilcsize
.append(sys
.maxint
);
2959 except AttributeError:
2960 ilcsize
.append(sys
.maxsize
);
2962 ilcmin
= ilcsize
.index(min(ilcsize
));
2963 compression
= compressionlistalt
[ilcmin
];
2964 fcontents
.seek(0, 0);
2965 cfcontents
= BytesIO();
2966 shutil
.copyfileobj(fcontents
, cfcontents
);
2967 cfcontents
.seek(0, 0);
2968 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
2969 cfcontents
.seek(0, 2);
2970 cfsize
= cfcontents
.tell();
2971 if(ucfsize
> cfsize
):
2972 fcsize
= format(int(cfsize
), 'x').lower();
2973 fcompression
= compression
;
2975 fcontents
= cfcontents
;
2976 if(fcompression
=="none"):
2978 if(followlink
and (ftype
==1 or ftype
==2)):
2979 flstatinfo
= os
.stat(flinkname
);
2980 with
open(flinkname
, "rb") as fpc
:
2981 shutil
.copyfileobj(fpc
, fcontents
);
2982 if(not compresswholefile
):
2983 fcontents
.seek(0, 2);
2984 ucfsize
= fcontents
.tell();
2985 fcontents
.seek(0, 0);
2986 if(compression
=="auto"):
2987 ilsize
= len(compressionlistalt
);
2990 while(ilmin
< ilsize
):
2991 cfcontents
= BytesIO();
2992 shutil
.copyfileobj(fcontents
, cfcontents
);
2993 fcontents
.seek(0, 0);
2994 cfcontents
.seek(0, 0);
2995 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
2997 cfcontents
.seek(0, 2);
2998 ilcsize
.append(cfcontents
.tell());
3002 ilcsize
.append(sys
.maxint
);
3003 except AttributeError:
3004 ilcsize
.append(sys
.maxsize
);
3006 ilcmin
= ilcsize
.index(min(ilcsize
));
3007 compression
= compressionlistalt
[ilcmin
];
3008 fcontents
.seek(0, 0);
3009 cfcontents
= BytesIO();
3010 shutil
.copyfileobj(fcontents
, cfcontents
);
3011 cfcontents
.seek(0, 0);
3012 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3013 cfcontents
.seek(0, 2);
3014 cfsize
= cfcontents
.tell();
3015 if(ucfsize
> cfsize
):
3016 fcsize
= format(int(cfsize
), 'x').lower();
3017 fcompression
= compression
;
3019 fcontents
= cfcontents
;
3020 fcontents
.seek(0, 0);
3021 ftypehex
= format(ftype
, 'x').lower();
3022 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
];
3023 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3026 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3027 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3028 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3031 os
.fsync(catfp
.fileno());
3032 except io
.UnsupportedOperation
:
3034 except AttributeError:
3036 except OSError as e
:
3040 if(hasattr(sys
.stdout
, "buffer")):
3041 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3043 shutil
.copyfileobj(catfp
, sys
.stdout
);
3044 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3045 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3047 upload_file_to_internet_file(catfp
, outfile
);
3055 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
3057 if(hasattr(shutil
, "register_archive_format")):
3058 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
3059 return PackArchiveFile(source_dir
, archive_name
, False, "auto", True, None, False, "crc32", [], __file_format_dict__
['format_delimiter'], False, False);
3060 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
3062 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):
3063 formatspecs
= FormatSpecsListToDict(formatspecs
);
3064 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3066 create_alias_function("Pack", __file_format_name__
, "FromDirList", PackArchiveFileFromDirList
);
3068 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3069 formatspecs
= FormatSpecsListToDict(formatspecs
);
3070 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3071 outfile
= RemoveWindowsPath(outfile
);
3072 checksumtype
= checksumtype
.lower();
3073 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3074 checksumtype
="crc32";
3075 if(checksumtype
=="none"):
3077 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3078 compression
= "auto";
3079 if(compression
not in compressionlist
and compression
is None):
3080 compression
= "auto";
3082 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3083 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3084 if(os
.path
.exists(outfile
)):
3087 except OSError as e
:
3092 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3094 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3097 fbasename
= os
.path
.splitext(outfile
)[0];
3098 fextname
= os
.path
.splitext(outfile
)[1];
3099 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3100 catver
= formatspecs
['format_ver'];
3101 fileheaderver
= str(int(catver
.replace(".", "")));
3107 inodetocatinode
= {};
3110 if(hasattr(sys
.stdin
, "buffer")):
3111 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3113 shutil
.copyfileobj(sys
.stdin
, infile
);
3118 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3119 infile
= download_file_from_internet_file(infile
);
3124 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3126 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
3128 if(not tarfile
.TarFileCheck(infile
)):
3130 except AttributeError:
3131 if(not TarFileCheck(infile
)):
3136 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3137 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
3139 tarfp
= tarfile
.open(infile
, "r");
3140 except FileNotFoundError
:
3142 numfiles
= int(len(tarfp
.getmembers()));
3143 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3144 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
3145 if(re
.findall("^[.|/]", member
.name
)):
3146 fname
= member
.name
;
3148 fname
= "./"+member
.name
;
3150 VerbosePrintOut(fname
);
3151 fpremode
= member
.mode
;
3152 ffullmode
= member
.mode
;
3156 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3158 elif(member
.isdev()):
3159 ffullmode
= member
.mode
;
3161 elif(member
.islnk()):
3162 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3164 elif(member
.issym()):
3165 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
3167 elif(member
.ischr()):
3168 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
3170 elif(member
.isblk()):
3171 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
3173 elif(member
.isdir()):
3174 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
3176 elif(member
.isfifo()):
3177 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
3179 elif(member
.issparse()):
3180 ffullmode
= member
.mode
;
3183 ffullmode
= member
.mode
;
3186 fcurfid
= format(int(curfid
), 'x').lower();
3187 fcurinode
= format(int(curfid
), 'x').lower();
3188 curfid
= curfid
+ 1;
3190 flinkname
= member
.linkname
;
3191 fdev_minor
= format(int(member
.devminor
), 'x').lower();
3192 fdev_major
= format(int(member
.devmajor
), 'x').lower();
3193 frdev_minor
= format(int(member
.devminor
), 'x').lower();
3194 frdev_major
= format(int(member
.devmajor
), 'x').lower();
3195 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3196 fsize
= format(int("0"), 'x').lower();
3197 elif(ftype
==0 or ftype
==7):
3198 fsize
= format(int(member
.size
), 'x').lower();
3200 fsize
= format(int(member
.size
), 'x').lower();
3201 fatime
= format(int(member
.mtime
), 'x').lower();
3202 fmtime
= format(int(member
.mtime
), 'x').lower();
3203 fctime
= format(int(member
.mtime
), 'x').lower();
3204 fbtime
= format(int(member
.mtime
), 'x').lower();
3205 fmode
= format(int(ffullmode
), 'x').lower();
3206 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
3207 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
3208 fuid
= format(int(member
.uid
), 'x').lower();
3209 fgid
= format(int(member
.gid
), 'x').lower();
3210 funame
= member
.uname
;
3211 fgname
= member
.gname
;
3212 flinkcount
= format(int(flinkcount
), 'x').lower();
3213 fwinattributes
= format(int(0), 'x').lower();
3215 fcsize
= format(int(0), 'x').lower();
3216 fcontents
= BytesIO();
3217 if(ftype
==0 or ftype
==7):
3218 with tarfp
.extractfile(member
) as fpc
:
3219 shutil
.copyfileobj(fpc
, fcontents
);
3220 if(not compresswholefile
):
3221 fcontents
.seek(0, 2);
3222 ucfsize
= fcontents
.tell();
3223 fcontents
.seek(0, 0);
3224 if(compression
=="auto"):
3225 ilsize
= len(compressionlistalt
);
3228 while(ilmin
< ilsize
):
3229 cfcontents
= BytesIO();
3230 shutil
.copyfileobj(fcontents
, cfcontents
);
3231 fcontents
.seek(0, 0);
3232 cfcontents
.seek(0, 0);
3233 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3235 cfcontents
.seek(0, 2);
3236 ilcsize
.append(cfcontents
.tell());
3240 ilcsize
.append(sys
.maxint
);
3241 except AttributeError:
3242 ilcsize
.append(sys
.maxsize
);
3244 ilcmin
= ilcsize
.index(min(ilcsize
));
3245 compression
= compressionlistalt
[ilcmin
];
3246 fcontents
.seek(0, 0);
3247 cfcontents
= BytesIO();
3248 shutil
.copyfileobj(fcontents
, cfcontents
);
3249 cfcontents
.seek(0, 0);
3250 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3251 cfcontents
.seek(0, 2);
3252 cfsize
= cfcontents
.tell();
3253 if(ucfsize
> cfsize
):
3254 fcsize
= format(int(cfsize
), 'x').lower();
3255 fcompression
= compression
;
3257 fcontents
= cfcontents
;
3258 if(fcompression
=="none"):
3260 fcontents
.seek(0, 0);
3261 ftypehex
= format(ftype
, 'x').lower();
3262 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
];
3263 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3266 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3267 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3268 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3271 os
.fsync(catfp
.fileno());
3272 except io
.UnsupportedOperation
:
3274 except AttributeError:
3276 except OSError as e
:
3280 if(hasattr(sys
.stdout
, "buffer")):
3281 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3283 shutil
.copyfileobj(catfp
, sys
.stdout
);
3284 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3285 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3287 upload_file_to_internet_file(catfp
, outfile
);
3295 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
3297 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3298 formatspecs
= FormatSpecsListToDict(formatspecs
);
3299 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3300 outfile
= RemoveWindowsPath(outfile
);
3301 checksumtype
= checksumtype
.lower();
3302 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3303 checksumtype
="crc32";
3304 if(checksumtype
=="none"):
3306 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3307 compression
= "auto";
3308 if(compression
not in compressionlist
and compression
is None):
3309 compression
= "auto";
3311 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3312 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3313 if(os
.path
.exists(outfile
)):
3316 except OSError as e
:
3321 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3323 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3326 fbasename
= os
.path
.splitext(outfile
)[0];
3327 fextname
= os
.path
.splitext(outfile
)[1];
3328 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3329 catver
= formatspecs
['format_ver'];
3330 fileheaderver
= str(int(catver
.replace(".", "")));
3336 inodetocatinode
= {};
3339 if(hasattr(sys
.stdin
, "buffer")):
3340 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3342 shutil
.copyfileobj(sys
.stdin
, infile
);
3347 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3348 infile
= download_file_from_internet_file(infile
);
3353 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3357 if(not zipfile
.is_zipfile(infile
)):
3360 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
3361 except FileNotFoundError
:
3363 ziptest
= zipfp
.testzip();
3365 VerbosePrintOut("Bad file found!");
3366 numfiles
= int(len(zipfp
.infolist()));
3367 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3368 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
3369 if(re
.findall("^[.|/]", member
.filename
)):
3370 fname
= member
.filename
;
3372 fname
= "./"+member
.filename
;
3373 zipinfo
= zipfp
.getinfo(member
.filename
);
3375 VerbosePrintOut(fname
);
3376 if(not member
.is_dir()):
3377 fpremode
= int(stat
.S_IFREG
+ 438);
3378 elif(member
.is_dir()):
3379 fpremode
= int(stat
.S_IFDIR
+ 511);
3382 if(not member
.is_dir()):
3384 elif(member
.is_dir()):
3387 fcurfid
= format(int(curfid
), 'x').lower();
3388 fcurinode
= format(int(curfid
), 'x').lower();
3389 curfid
= curfid
+ 1;
3390 fdev_minor
= format(int(0), 'x').lower();
3391 fdev_major
= format(int(0), 'x').lower();
3392 frdev_minor
= format(int(0), 'x').lower();
3393 frdev_major
= format(int(0), 'x').lower();
3395 fsize
= format(int("0"), 'x').lower();
3397 fsize
= format(int(member
.file_size
), 'x').lower();
3399 fsize
= format(int(member
.file_size
), 'x').lower();
3400 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3401 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3402 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3403 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3404 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
3405 fwinattributes
= format(int(zipinfo
.external_attr
), 'x').lower();
3406 if(not member
.is_dir()):
3407 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3408 fchmode
= stat
.S_IMODE(fmode
);
3409 ftypemod
= stat
.S_IFMT(fmode
);
3410 elif(member
.is_dir()):
3411 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3412 fchmode
= stat
.S_IMODE(fmode
);
3413 ftypemod
= stat
.S_IFMT(fmode
);
3414 elif(zipinfo
.create_system
==3):
3415 fwinattributes
= format(int(0), 'x').lower();
3416 fmode
= format(int(zipinfo
.external_attr
), 'x').lower();
3417 fchmode
= stat
.S_IMODE(fmode
);
3418 ftypemod
= stat
.S_IFMT(fmode
);
3420 fwinattributes
= format(int(0), 'x').lower();
3421 if(not member
.is_dir()):
3422 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3423 fchmode
= stat
.S_IMODE(fmode
);
3424 ftypemod
= stat
.S_IFMT(fmode
);
3425 elif(member
.is_dir()):
3426 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3427 fchmode
= stat
.S_IMODE(fmode
);
3428 ftypemod
= stat
.S_IFMT(fmode
);
3430 fcsize
= format(int(0), 'x').lower();
3432 fuid
= format(int(os
.getuid()), 'x').lower();
3433 except AttributeError:
3434 fuid
= format(int(0), 'x').lower();
3436 fuid
= format(int(0), 'x').lower();
3438 fgid
= format(int(os
.getgid()), 'x').lower();
3439 except AttributeError:
3440 fgid
= format(int(0), 'x').lower();
3442 fgid
= format(int(0), 'x').lower();
3446 userinfo
= pwd
.getpwuid(os
.getuid());
3447 funame
= userinfo
.pw_name
;
3450 except AttributeError:
3458 groupinfo
= grp
.getgrgid(os
.getgid());
3459 fgname
= groupinfo
.gr_name
;
3462 except AttributeError:
3466 fcontents
= BytesIO();
3468 fcontents
.write(zipfp
.read(member
.filename
));
3469 if(not compresswholefile
):
3470 fcontents
.seek(0, 2);
3471 ucfsize
= fcontents
.tell();
3472 fcontents
.seek(0, 0);
3473 if(compression
=="auto"):
3474 ilsize
= len(compressionlistalt
);
3477 while(ilmin
< ilsize
):
3478 cfcontents
= BytesIO();
3479 shutil
.copyfileobj(fcontents
, cfcontents
);
3480 fcontents
.seek(0, 0);
3481 cfcontents
.seek(0, 0);
3482 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3483 cfcontents
.seek(0, 2);
3484 ilcsize
.append(cfcontents
.tell());
3487 ilcmin
= ilcsize
.index(min(ilcsize
));
3488 compression
= compressionlistalt
[ilcmin
];
3489 fcontents
.seek(0, 0);
3490 cfcontents
= BytesIO();
3491 shutil
.copyfileobj(fcontents
, cfcontents
);
3492 cfcontents
.seek(0, 0);
3493 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3494 cfcontents
.seek(0, 2);
3495 cfsize
= cfcontents
.tell();
3496 if(ucfsize
> cfsize
):
3497 fcsize
= format(int(cfsize
), 'x').lower();
3498 fcompression
= compression
;
3500 fcontents
= cfcontents
;
3501 if(fcompression
=="none"):
3503 fcontents
.seek(0, 0);
3504 ftypehex
= format(ftype
, 'x').lower();
3505 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
];
3506 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3509 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3510 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3511 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3514 os
.fsync(catfp
.fileno());
3515 except io
.UnsupportedOperation
:
3517 except AttributeError:
3519 except OSError as e
:
3523 if(hasattr(sys
.stdout
, "buffer")):
3524 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3526 shutil
.copyfileobj(catfp
, sys
.stdout
);
3527 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3528 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3530 upload_file_to_internet_file(catfp
, outfile
);
3538 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
3540 if(not rarfile_support
):
3541 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3544 if(rarfile_support
):
3545 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3546 formatspecs
= FormatSpecsListToDict(formatspecs
);
3547 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3548 outfile
= RemoveWindowsPath(outfile
);
3549 checksumtype
= checksumtype
.lower();
3550 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3551 checksumtype
="crc32";
3552 if(checksumtype
=="none"):
3554 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3555 compression
= "auto";
3556 if(compression
not in compressionlist
and compression
is None):
3557 compression
= "auto";
3559 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3560 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3561 if(os
.path
.exists(outfile
)):
3564 except OSError as e
:
3569 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3571 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3574 fbasename
= os
.path
.splitext(outfile
)[0];
3575 fextname
= os
.path
.splitext(outfile
)[1];
3576 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3577 catver
= formatspecs
['format_ver'];
3578 fileheaderver
= str(int(catver
.replace(".", "")));
3584 inodetocatinode
= {};
3585 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3587 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
3589 rarfp
= rarfile
.RarFile(infile
, "r");
3590 rartest
= rarfp
.testrar();
3592 VerbosePrintOut("Bad file found!");
3593 numfiles
= int(len(rarfp
.infolist()));
3594 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3597 os
.fsync(catfp
.fileno());
3598 except io
.UnsupportedOperation
:
3600 except AttributeError:
3602 except OSError as e
:
3604 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
3607 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
3610 member
.external_attr
3612 except AttributeError:
3614 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
3617 member
.external_attr
3619 except AttributeError:
3624 if(re
.findall("^[.|/]", member
.filename
)):
3625 fname
= member
.filename
;
3627 fname
= "./"+member
.filename
;
3628 rarinfo
= rarfp
.getinfo(member
.filename
);
3630 VerbosePrintOut(fname
);
3631 if(is_unix
and member
.external_attr
!=0):
3632 fpremode
= int(member
.external_attr
);
3633 elif(member
.is_file()):
3634 fpremode
= int(stat
.S_IFREG
+ 438);
3635 elif(member
.is_symlink()):
3636 fpremode
= int(stat
.S_IFLNK
+ 438);
3637 elif(member
.is_dir()):
3638 fpremode
= int(stat
.S_IFDIR
+ 511);
3639 if(is_windows
and member
.external_attr
!=0):
3640 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
3642 fwinattributes
= format(int(0), 'x').lower();
3644 fcsize
= format(int(0), 'x').lower();
3647 if(member
.is_file()):
3649 elif(member
.is_symlink()):
3651 elif(member
.is_dir()):
3655 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
3656 fcurfid
= format(int(curfid
), 'x').lower();
3657 fcurinode
= format(int(curfid
), 'x').lower();
3658 curfid
= curfid
+ 1;
3659 fdev_minor
= format(int(0), 'x').lower();
3660 fdev_major
= format(int(0), 'x').lower();
3661 frdev_minor
= format(int(0), 'x').lower();
3662 frdev_major
= format(int(0), 'x').lower();
3664 fsize
= format(int("0"), 'x').lower();
3666 fsize
= format(int(member
.file_size
), 'x').lower();
3668 fsize
= format(int(member
.file_size
), 'x').lower();
3671 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
3673 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3674 except AttributeError:
3675 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3676 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3679 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
3681 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3682 except AttributeError:
3683 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3684 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3685 if(is_unix
and member
.external_attr
!=0):
3686 fmode
= format(int(member
.external_attr
), 'x').lower();
3687 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
3688 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
3689 elif(member
.is_file()):
3690 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3691 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3692 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3693 elif(member
.is_symlink()):
3694 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
3695 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3696 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3697 elif(member
.is_dir()):
3698 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3699 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3700 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3702 fuid
= format(int(os
.getuid()), 'x').lower();
3703 except AttributeError:
3704 fuid
= format(int(0), 'x').lower();
3706 fuid
= format(int(0), 'x').lower();
3708 fgid
= format(int(os
.getgid()), 'x').lower();
3709 except AttributeError:
3710 fgid
= format(int(0), 'x').lower();
3712 fgid
= format(int(0), 'x').lower();
3716 userinfo
= pwd
.getpwuid(os
.getuid());
3717 funame
= userinfo
.pw_name
;
3720 except AttributeError:
3728 groupinfo
= grp
.getgrgid(os
.getgid());
3729 fgname
= groupinfo
.gr_name
;
3732 except AttributeError:
3736 fcontents
= BytesIO();
3738 fcontents
.write(rarfp
.read(member
.filename
));
3739 if(not compresswholefile
):
3740 fcontents
.seek(0, 2);
3741 ucfsize
= fcontents
.tell();
3742 fcontents
.seek(0, 0);
3743 if(compression
=="auto"):
3744 ilsize
= len(compressionlistalt
);
3747 while(ilmin
< ilsize
):
3748 cfcontents
= BytesIO();
3749 shutil
.copyfileobj(fcontents
, cfcontents
);
3750 fcontents
.seek(0, 0);
3751 cfcontents
.seek(0, 0);
3752 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3754 cfcontents
.seek(0, 2);
3755 ilcsize
.append(cfcontents
.tell());
3759 ilcsize
.append(sys
.maxint
);
3760 except AttributeError:
3761 ilcsize
.append(sys
.maxsize
);
3763 ilcmin
= ilcsize
.index(min(ilcsize
));
3764 compression
= compressionlistalt
[ilcmin
];
3765 fcontents
.seek(0, 0);
3766 cfcontents
= BytesIO();
3767 shutil
.copyfileobj(fcontents
, cfcontents
);
3768 cfcontents
.seek(0, 0);
3769 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3770 cfcontents
.seek(0, 2);
3771 cfsize
= cfcontents
.tell();
3772 if(ucfsize
> cfsize
):
3773 fcsize
= format(int(cfsize
), 'x').lower();
3774 fcompression
= compression
;
3776 fcontents
= cfcontents
;
3777 if(fcompression
=="none"):
3779 fcontents
.seek(0, 0);
3780 ftypehex
= format(ftype
, 'x').lower();
3781 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
];
3782 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3785 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3786 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3787 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
)
3790 os
.fsync(catfp
.fileno());
3791 except io
.UnsupportedOperation
:
3793 except AttributeError:
3795 except OSError as e
:
3799 if(hasattr(sys
.stdout
, "buffer")):
3800 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3802 shutil
.copyfileobj(catfp
, sys
.stdout
);
3803 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3804 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3806 upload_file_to_internet_file(catfp
, outfile
);
3814 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
3816 if(not py7zr_support
):
3817 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3821 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3822 formatspecs
= FormatSpecsListToDict(formatspecs
);
3823 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3824 outfile
= RemoveWindowsPath(outfile
);
3825 checksumtype
= checksumtype
.lower();
3826 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3827 checksumtype
="crc32";
3828 if(checksumtype
=="none"):
3830 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3831 compression
= "auto";
3832 if(compression
not in compressionlist
and compression
is None):
3833 compression
= "auto";
3835 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3836 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3837 if(os
.path
.exists(outfile
)):
3840 except OSError as e
:
3845 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3847 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3850 fbasename
= os
.path
.splitext(outfile
)[0];
3851 fextname
= os
.path
.splitext(outfile
)[1];
3852 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3853 catver
= formatspecs
['format_ver'];
3854 fileheaderver
= str(int(catver
.replace(".", "")));
3860 inodetocatinode
= {};
3861 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3863 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
3864 file_content
= szpfp
.readall();
3865 #sztest = szpfp.testzip();
3866 sztestalt
= szpfp
.test();
3868 VerbosePrintOut("Bad file found!");
3869 numfiles
= int(len(szpfp
.list()));
3870 AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3871 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
3872 if(re
.findall("^[.|/]", member
.filename
)):
3873 fname
= member
.filename
;
3875 fname
= "./"+member
.filename
;
3877 VerbosePrintOut(fname
);
3878 if(not member
.is_directory
):
3879 fpremode
= int(stat
.S_IFREG
+ 438);
3880 elif(member
.is_directory
):
3881 fpremode
= int(stat
.S_IFDIR
+ 511);
3882 fwinattributes
= format(int(0), 'x').lower();
3884 fcsize
= format(int(0), 'x').lower();
3887 if(member
.is_directory
):
3892 fcurfid
= format(int(curfid
), 'x').lower();
3893 fcurinode
= format(int(curfid
), 'x').lower();
3894 curfid
= curfid
+ 1;
3895 fdev_minor
= format(int(0), 'x').lower();
3896 fdev_major
= format(int(0), 'x').lower();
3897 frdev_minor
= format(int(0), 'x').lower();
3898 frdev_major
= format(int(0), 'x').lower();
3900 fsize
= format(int("0"), 'x').lower();
3901 fatime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3902 fmtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3903 fctime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3904 fbtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3905 if(member
.is_directory
):
3906 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3907 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3908 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3910 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3911 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3912 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3914 fuid
= format(int(os
.getuid()), 'x').lower();
3915 except AttributeError:
3916 fuid
= format(int(0), 'x').lower();
3918 fuid
= format(int(0), 'x').lower();
3920 fgid
= format(int(os
.getgid()), 'x').lower();
3921 except AttributeError:
3922 fgid
= format(int(0), 'x').lower();
3924 fgid
= format(int(0), 'x').lower();
3928 userinfo
= pwd
.getpwuid(os
.getuid());
3929 funame
= userinfo
.pw_name
;
3932 except AttributeError:
3940 groupinfo
= grp
.getgrgid(os
.getgid());
3941 fgname
= groupinfo
.gr_name
;
3944 except AttributeError:
3948 fcontents
= BytesIO();
3950 fcontents
.write(file_content
[member
.filename
].read());
3951 fsize
= format(fcontents
.tell(), 'x').lower();
3952 file_content
[member
.filename
].close();
3953 if(not compresswholefile
):
3954 fcontents
.seek(0, 2);
3955 ucfsize
= fcontents
.tell();
3956 fcontents
.seek(0, 0);
3957 if(compression
=="auto"):
3958 ilsize
= len(compressionlistalt
);
3961 while(ilmin
< ilsize
):
3962 cfcontents
= BytesIO();
3963 shutil
.copyfileobj(fcontents
, cfcontents
);
3964 fcontents
.seek(0, 0);
3965 cfcontents
.seek(0, 0);
3966 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3968 cfcontents
.seek(0, 2);
3969 ilcsize
.append(cfcontents
.tell());
3973 ilcsize
.append(sys
.maxint
);
3974 except AttributeError:
3975 ilcsize
.append(sys
.maxsize
);
3977 ilcmin
= ilcsize
.index(min(ilcsize
));
3978 compression
= compressionlistalt
[ilcmin
];
3979 fcontents
.seek(0, 0);
3980 cfcontents
= BytesIO();
3981 shutil
.copyfileobj(fcontents
, cfcontents
);
3982 cfcontents
.seek(0, 0);
3983 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3984 cfcontents
.seek(0, 2);
3985 cfsize
= cfcontents
.tell();
3986 if(ucfsize
> cfsize
):
3987 fcsize
= format(int(cfsize
), 'x').lower();
3988 fcompression
= compression
;
3990 fcontents
= cfcontents
;
3991 if(fcompression
=="none"):
3993 fcontents
.seek(0, 0);
3994 ftypehex
= format(ftype
, 'x').lower();
3995 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
];
3996 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3999 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
4000 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4001 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
)
4004 os
.fsync(catfp
.fileno());
4005 except io
.UnsupportedOperation
:
4007 except AttributeError:
4009 except OSError as e
:
4013 if(hasattr(sys
.stdout
, "buffer")):
4014 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
4016 shutil
.copyfileobj(catfp
, sys
.stdout
);
4017 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
4018 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
4020 upload_file_to_internet_file(catfp
, outfile
);
4028 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFile", PackArchiveFileFromSevenZipFile
);
4030 def PackArchiveFileFromInFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4031 formatspecs
= FormatSpecsListToDict(formatspecs
);
4032 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4034 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4035 if(checkcompressfile
=="tarfile"):
4036 return PackArchiveFileFromTarFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4037 elif(checkcompressfile
=="zipfile"):
4038 return PackArchiveFileFromZipFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4039 elif(checkcompressfile
=="catfile"):
4040 return RePackArchiveFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, False, 0, 0, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
4041 elif(rarfile_support
and checkcompressfile
=="rarfile"):
4042 return PackArchiveFileFromRarFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4043 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
4044 return PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4049 create_alias_function("Pack", __file_format_name__
, "FromInFile", PackArchiveFileFromInFile
);
4051 def ArchiveFileSeekToFileNum(infile
, seekto
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4052 formatspecs
= FormatSpecsListToDict(formatspecs
);
4053 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4056 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4057 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4058 if(checkcompressfile
=="tarfile"):
4059 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4060 if(checkcompressfile
=="zipfile"):
4061 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4062 if(rarfile_support
and checkcompressfile
=="rarfile"):
4063 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4064 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4065 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4066 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4073 if(hasattr(sys
.stdin
, "buffer")):
4074 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4076 shutil
.copyfileobj(sys
.stdin
, catfp
);
4078 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4082 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4083 catfp
= download_file_from_internet_file(infile
);
4085 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4090 infile
= RemoveWindowsPath(infile
);
4091 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4092 if(checkcompressfile
=="tarfile"):
4093 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4094 if(checkcompressfile
=="zipfile"):
4095 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4096 if(rarfile_support
and checkcompressfile
=="rarfile"):
4097 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4098 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4099 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4100 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4102 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4103 if(not compresscheck
):
4104 fextname
= os
.path
.splitext(infile
)[1];
4105 if(fextname
==".gz"):
4106 compresscheck
= "gzip";
4107 elif(fextname
==".bz2"):
4108 compresscheck
= "bzip2";
4109 elif(fextname
==".zst"):
4110 compresscheck
= "zstd";
4111 elif(fextname
==".lz4" or fextname
==".clz4"):
4112 compresscheck
= "lz4";
4113 elif(fextname
==".lzo" or fextname
==".lzop"):
4114 compresscheck
= "lzo";
4115 elif(fextname
==".lzma" or fextname
==".xz"):
4116 compresscheck
= "lzma";
4119 if(not compresscheck
):
4121 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4126 SeekToEndOfFile(catfp);
4128 SeekToEndOfFile(catfp);
4129 CatSize = catfp.tell();
4130 CatSizeEnd = CatSize;
4138 curloc
= catfp
.tell();
4141 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4143 catfp
.seek(curloc
, 0);
4144 catstring
= catheader
[0];
4145 catversion
= re
.findall(r
"([\d]+)", catstring
);
4146 fprenumfiles
= catheader
[1];
4147 fnumfiles
= int(fprenumfiles
, 16);
4148 fprechecksumtype
= catheader
[2];
4149 fprechecksum
= catheader
[3];
4150 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4151 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4152 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4153 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4154 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4155 fheadtell
= len(fileheader
);
4156 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4157 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4158 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4160 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4161 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4162 if(seekto
>=fnumfiles
):
4163 seekto
= fnumfiles
- 1;
4169 prefhstart
= catfp
.tell();
4170 if(formatspecs
['new_style']):
4171 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4173 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4174 if(len(preheaderdata
)==0):
4176 prefheadsize
= int(preheaderdata
[0], 16);
4177 prefnumfields
= int(preheaderdata
[1], 16);
4178 preftype
= int(preheaderdata
[2], 16);
4179 if(re
.findall("^[.|/]", preheaderdata
[3])):
4180 prefname
= preheaderdata
[3];
4182 prefname
= "./"+preheaderdata
[3];
4183 prefbasedir
= os
.path
.dirname(prefname
);
4184 preflinkname
= preheaderdata
[4];
4185 prefsize
= int(preheaderdata
[5], 16);
4186 prefatime
= int(preheaderdata
[6], 16);
4187 prefmtime
= int(preheaderdata
[7], 16);
4188 prefctime
= int(preheaderdata
[8], 16);
4189 prefbtime
= int(preheaderdata
[9], 16);
4190 prefmode
= int(preheaderdata
[10], 16);
4191 prefchmode
= stat
.S_IMODE(prefmode
);
4192 preftypemod
= stat
.S_IFMT(prefmode
);
4193 prefwinattributes
= int(preheaderdata
[11], 16);
4194 prefcompression
= preheaderdata
[12];
4195 prefcsize
= int(preheaderdata
[13], 16);
4196 prefuid
= int(preheaderdata
[14], 16);
4197 prefuname
= preheaderdata
[15];
4198 prefgid
= int(preheaderdata
[16], 16);
4199 prefgname
= preheaderdata
[17];
4200 fid
= int(preheaderdata
[18], 16);
4201 finode
= int(preheaderdata
[19], 16);
4202 flinkcount
= int(preheaderdata
[20], 16);
4203 prefdev_minor
= int(preheaderdata
[21], 16);
4204 prefdev_major
= int(preheaderdata
[22], 16);
4205 prefrdev_minor
= int(preheaderdata
[23], 16);
4206 prefrdev_major
= int(preheaderdata
[24], 16);
4207 prefextrasize
= int(preheaderdata
[25], 16);
4208 prefextrafields
= int(preheaderdata
[26], 16);
4209 extrafieldslist
= [];
4211 extraend
= extrastart
+ prefextrafields
;
4212 extrafieldslist
= [];
4213 if(extrastart
<extraend
):
4214 extrafieldslist
.append(preheaderdata
[extrastart
]);
4215 extrastart
= extrastart
+ 1;
4216 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4217 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4218 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4220 hcmax
= len(preheaderdata
) - 2;
4223 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
['format_delimiter']);
4225 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4226 if(prefcs
!=prenewfcs
and not skipchecksum
):
4227 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4228 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4230 valid_archive
= False;
4231 invalid_archive
= True;
4232 prefhend
= catfp
.tell() - 1;
4233 prefcontentstart
= catfp
.tell();
4235 pyhascontents
= False;
4237 if(prefcompression
):
4238 prefcontents
= catfp
.read(prefsize
);
4240 prefcontents
= catfp
.read(prefcsize
);
4241 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4242 pyhascontents
= True;
4243 if(prefccs
!=prenewfccs
and not skipchecksum
):
4244 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4245 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4249 catfp
.seek(seekstart
, 0);
4251 catfheadsize
= int(preheaderdata
[0], 16);
4252 catfnumfields
= int(preheaderdata
[1], 16);
4253 catftype
= int(preheaderdata
[2], 16);
4254 if(re
.findall("^[.|/]", preheaderdata
[3])):
4255 catfname
= preheaderdata
[3];
4257 catfname
= "./"+preheaderdata
[3];
4258 catflinkname
= preheaderdata
[4];
4259 catfsize
= int(preheaderdata
[5], 16);
4260 catfbasedir
= os
.path
.dirname(catfname
);
4261 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4263 catlist
.update({'catfp': catfp
});
4268 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
4270 def ArchiveFileSeekToFileName(infile
, seekfile
=None, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4271 formatspecs
= FormatSpecsListToDict(formatspecs
);
4272 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4275 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4276 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4277 if(checkcompressfile
=="tarfile"):
4278 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4279 if(checkcompressfile
=="zipfile"):
4280 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4281 if(rarfile_support
and checkcompressfile
=="rarfile"):
4282 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4283 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4284 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4285 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4292 if(hasattr(sys
.stdin
, "buffer")):
4293 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4295 shutil
.copyfileobj(sys
.stdin
, catfp
);
4297 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4301 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4302 catfp
= download_file_from_internet_file(infile
);
4303 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4309 infile
= RemoveWindowsPath(infile
);
4310 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4311 if(checkcompressfile
=="tarfile"):
4312 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4313 if(checkcompressfile
=="zipfile"):
4314 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4315 if(rarfile_support
and checkcompressfile
=="rarfile"):
4316 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4317 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4318 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4319 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4321 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4322 if(not compresscheck
):
4323 fextname
= os
.path
.splitext(infile
)[1];
4324 if(fextname
==".gz"):
4325 compresscheck
= "gzip";
4326 elif(fextname
==".bz2"):
4327 compresscheck
= "bzip2";
4328 elif(fextname
==".zst"):
4329 compresscheck
= "zstd";
4330 elif(fextname
==".lz4" or fextname
==".clz4"):
4331 compresscheck
= "lz4";
4332 elif(fextname
==".lzo" or fextname
==".lzop"):
4333 compresscheck
= "lzo";
4334 elif(fextname
==".lzma" or fextname
==".xz"):
4335 compresscheck
= "lzma";
4338 if(not compresscheck
):
4340 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4345 SeekToEndOfFile(catfp);
4347 SeekToEndOfFile(catfp);
4348 CatSize = catfp.tell();
4349 CatSizeEnd = CatSize;
4357 curloc
= catfp
.tell();
4360 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4362 catfp
.seek(curloc
, 0);
4363 catstring
= catheader
[0];
4364 catversion
= re
.findall(r
"([\d]+)", catstring
);
4365 fprenumfiles
= catheader
[1];
4366 fnumfiles
= int(fprenumfiles
, 16);
4367 fprechecksumtype
= catheader
[2];
4368 fprechecksum
= catheader
[3];
4369 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4370 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4371 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4372 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4373 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4374 fheadtell
= len(fileheader
);
4375 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4376 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4377 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4379 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4380 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4381 seekto
= fnumfiles
- 1
4386 prefhstart
= catfp
.tell();
4387 if(formatspecs
['new_style']):
4388 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4390 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4391 if(len(preheaderdata
)==0):
4393 prefheadsize
= int(preheaderdata
[0], 16);
4394 prefnumfields
= int(preheaderdata
[1], 16);
4395 preftype
= int(preheaderdata
[2], 16);
4396 if(re
.findall("^[.|/]", preheaderdata
[3])):
4397 prefname
= preheaderdata
[3];
4399 prefname
= "./"+preheaderdata
[3];
4400 prefbasedir
= os
.path
.dirname(prefname
);
4401 preflinkname
= preheaderdata
[4];
4402 prefsize
= int(preheaderdata
[5], 16);
4403 prefatime
= int(preheaderdata
[6], 16);
4404 prefmtime
= int(preheaderdata
[7], 16);
4405 prefctime
= int(preheaderdata
[8], 16);
4406 prefbtime
= int(preheaderdata
[9], 16);
4407 prefmode
= int(preheaderdata
[10], 16);
4408 prefchmode
= stat
.S_IMODE(prefmode
);
4409 preftypemod
= stat
.S_IFMT(prefmode
);
4410 prefwinattributes
= int(preheaderdata
[11], 16);
4411 prefcompression
= preheaderdata
[12];
4412 prefcsize
= int(preheaderdata
[13], 16);
4413 prefuid
= int(preheaderdata
[14], 16);
4414 prefuname
= preheaderdata
[15];
4415 prefgid
= int(preheaderdata
[16], 16);
4416 prefgname
= preheaderdata
[17];
4417 fid
= int(preheaderdata
[18], 16);
4418 finode
= int(preheaderdata
[19], 16);
4419 flinkcount
= int(preheaderdata
[20], 16);
4420 prefdev_minor
= int(preheaderdata
[21], 16);
4421 prefdev_major
= int(preheaderdata
[22], 16);
4422 prefrdev_minor
= int(preheaderdata
[23], 16);
4423 prefrdev_major
= int(preheaderdata
[24], 16);
4424 prefextrasize
= int(preheaderdata
[25], 16);
4425 prefextrafields
= int(preheaderdata
[26], 16);
4426 extrafieldslist
= [];
4428 extraend
= extrastart
+ prefextrafields
;
4429 extrafieldslist
= [];
4430 if(extrastart
<extraend
):
4431 extrafieldslist
.append(preheaderdata
[extrastart
]);
4432 extrastart
= extrastart
+ 1;
4433 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4434 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4435 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4437 hcmax
= len(preheaderdata
) - 2;
4440 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
['format_delimiter']);
4442 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4443 if(prefcs
!=prenewfcs
and not skipchecksum
):
4444 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4445 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4447 valid_archive
= False;
4448 invalid_archive
= True;
4449 prefhend
= catfp
.tell() - 1;
4450 prefcontentstart
= catfp
.tell();
4452 pyhascontents
= False;
4454 if(prefcompression
):
4455 prefcontents
= catfp
.read(prefsize
);
4457 prefcontents
= catfp
.read(prefcsize
);
4458 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4459 pyhascontents
= True;
4460 if(prefccs
!=prenewfccs
and not skipchecksum
):
4461 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4462 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4467 prefname
= preheaderdata
[2];
4468 if(re
.findall("^[.|/]", preheaderdata
[2])):
4469 prefname
= preheaderdata
[2];
4471 prefname
= "./"+preheaderdata
[2];
4472 if(prefname
==seekfile
):
4475 catfp
.seek(seekstart
, 0);
4477 catfheadsize
= int(preheaderdata
[0], 16);
4478 catfnumfields
= int(preheaderdata
[1], 16);
4479 catftype
= int(preheaderdata
[2], 16);
4480 if(re
.findall("^[.|/]", preheaderdata
[3])):
4481 catfname
= preheaderdata
[3];
4483 catfname
= "./"+preheaderdata
[3];
4484 catflinkname
= preheaderdata
[4];
4485 catfsize
= int(preheaderdata
[5], 16);
4486 catfbasedir
= os
.path
.dirname(catfname
);
4488 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4492 catlist
.update({'catfp': catfp
});
4497 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
4499 def ArchiveFileValidate(infile
, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4500 formatspecs
= FormatSpecsListToDict(formatspecs
);
4502 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4503 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4506 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4507 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4508 if(checkcompressfile
=="tarfile"):
4509 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4510 if(checkcompressfile
=="zipfile"):
4511 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4512 if(rarfile_support
and checkcompressfile
=="rarfile"):
4513 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4514 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4515 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4516 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4523 if(hasattr(sys
.stdin
, "buffer")):
4524 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4526 shutil
.copyfileobj(sys
.stdin
, catfp
);
4528 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4532 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4533 catfp
= download_file_from_internet_file(infile
);
4534 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4540 infile
= RemoveWindowsPath(infile
);
4541 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4542 if(checkcompressfile
=="tarfile"):
4543 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4544 if(checkcompressfile
=="zipfile"):
4545 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4546 if(rarfile_support
and checkcompressfile
=="rarfile"):
4547 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4548 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4549 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4550 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4552 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4553 if(not compresscheck
):
4554 fextname
= os
.path
.splitext(infile
)[1];
4555 if(fextname
==".gz"):
4556 compresscheck
= "gzip";
4557 elif(fextname
==".bz2"):
4558 compresscheck
= "bzip2";
4559 elif(fextname
==".zst"):
4560 compresscheck
= "zstd";
4561 elif(fextname
==".lz4" or fextname
==".clz4"):
4562 compresscheck
= "lz4";
4563 elif(fextname
==".lzo" or fextname
==".lzop"):
4564 compresscheck
= "lzo";
4565 elif(fextname
==".lzma" or fextname
==".xz"):
4566 compresscheck
= "lzma";
4569 if(not compresscheck
):
4571 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4576 SeekToEndOfFile(catfp);
4578 SeekToEndOfFile(catfp);
4579 CatSize = catfp.tell();
4580 CatSizeEnd = CatSize;
4588 curloc
= catfp
.tell();
4591 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4593 catfp
.seek(curloc
, 0);
4594 catstring
= catheader
[0];
4595 catversion
= re
.findall(r
"([\d]+)", catstring
);
4596 fprenumfiles
= catheader
[1];
4597 fnumfiles
= int(fprenumfiles
, 16);
4598 fprechecksumtype
= catheader
[2];
4599 fprechecksum
= catheader
[3];
4601 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4602 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4603 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4604 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4605 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4606 valid_archive
= True;
4607 invalid_archive
= False;
4609 VerbosePrintOut(infile
);
4610 VerbosePrintOut("Number of Records " + str(fnumfiles
));
4611 if(fprechecksum
==catfileheadercshex
):
4613 VerbosePrintOut("File Header Checksum Passed at offset " + str(0));
4614 VerbosePrintOut("'" + str(fprechecksum
) + "' == " + "'" + str(catfileheadercshex
) + "'");
4617 VerbosePrintOut("File Header Checksum Failed at offset " + str(0));
4618 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4619 valid_archive
= False;
4620 invalid_archive
= True;
4622 VerbosePrintOut("");
4623 while(il
<fnumfiles
):
4624 catfhstart
= catfp
.tell();
4625 if(formatspecs
['new_style']):
4626 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4628 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4629 if(len(catheaderdata
)==0):
4631 catfheadsize
= int(catheaderdata
[0], 16);
4632 catfnumfields
= int(catheaderdata
[1], 16);
4633 catftype
= int(catheaderdata
[2], 16);
4634 if(re
.findall("^[.|/]", catheaderdata
[3])):
4635 catfname
= catheaderdata
[3];
4637 catfname
= "./"+catheaderdata
[3];
4638 catfbasedir
= os
.path
.dirname(catfname
);
4639 catflinkname
= catheaderdata
[4];
4640 catfsize
= int(catheaderdata
[5], 16);
4641 catfatime
= int(catheaderdata
[6], 16);
4642 catfmtime
= int(catheaderdata
[7], 16);
4643 catfctime
= int(catheaderdata
[8], 16);
4644 catfbtime
= int(catheaderdata
[9], 16);
4645 catfmode
= int(catheaderdata
[10], 16);
4646 catfchmode
= stat
.S_IMODE(catfmode
);
4647 catftypemod
= stat
.S_IFMT(catfmode
);
4648 catfwinattributes
= int(catheaderdata
[11], 16);
4649 catfcompression
= catheaderdata
[12];
4650 catfcsize
= int(catheaderdata
[13], 16);
4651 catfuid
= int(catheaderdata
[14], 16);
4652 catfuname
= catheaderdata
[15];
4653 catfgid
= int(catheaderdata
[16], 16);
4654 catfgname
= catheaderdata
[17];
4655 fid
= int(catheaderdata
[18], 16);
4656 finode
= int(catheaderdata
[19], 16);
4657 flinkcount
= int(catheaderdata
[20], 16);
4658 catfdev_minor
= int(catheaderdata
[21], 16);
4659 catfdev_major
= int(catheaderdata
[22], 16);
4660 catfrdev_minor
= int(catheaderdata
[23], 16);
4661 catfrdev_major
= int(catheaderdata
[24], 16);
4662 catfextrasize
= int(catheaderdata
[25], 16);
4663 catfextrafields
= int(catheaderdata
[26], 16);
4664 extrafieldslist
= [];
4666 extraend
= extrastart
+ catfextrafields
;
4667 extrafieldslist
= [];
4668 if(extrastart
<extraend
):
4669 extrafieldslist
.append(catheaderdata
[extrastart
]);
4670 extrastart
= extrastart
+ 1;
4671 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4672 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4673 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4675 hcmax
= len(catheaderdata
) - 2;
4678 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
['format_delimiter']);
4680 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4682 VerbosePrintOut(catfname
);
4683 VerbosePrintOut("Record Number " + str(il
) + "; File ID " + str(fid
) + "; iNode Number " + str(finode
));
4684 if(catfcs
==catnewfcs
):
4686 VerbosePrintOut("File Header Checksum Passed at offset " + str(catfhstart
));
4687 VerbosePrintOut("'" + str(catfcs
) + "' == " + "'" + str(catnewfcs
) + "'");
4690 VerbosePrintOut("File Header Checksum Failed at offset " + str(catfhstart
));
4691 VerbosePrintOut("'" + str(catfcs
) + "' != " + "'" + str(catnewfcs
) + "'");
4692 valid_archive
= False;
4693 invalid_archive
= True;
4694 catfhend
= catfp
.tell() - 1;
4695 catfcontentstart
= catfp
.tell();
4697 pyhascontents
= False;
4699 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4700 catfcontents
= catfp
.read(catfsize
);
4702 catfcontents
= catfp
.read(catfcsize
);
4703 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
4704 pyhascontents
= True;
4705 if(catfccs
==catnewfccs
):
4707 VerbosePrintOut("File Content Checksum Passed at offset " + str(catfcontentstart
));
4708 VerbosePrintOut("'" + str(catfccs
) + "' == " + "'" + str(catnewfccs
) + "'");
4711 VerbosePrintOut("File Content Checksum Failed at offset " + str(catfcontentstart
));
4712 VerbosePrintOut("'" + str(catfccs
) + "' != " + "'" + str(catnewfccs
) + "'");
4713 valid_archive
= False;
4714 invalid_archive
= True;
4716 VerbosePrintOut("");
4729 create_alias_function("", __file_format_name__
, "Validate", ArchiveFileValidate
);
4731 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4732 formatspecs
= FormatSpecsListToDict(formatspecs
);
4733 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4736 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4737 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4738 if(checkcompressfile
=="tarfile"):
4739 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4740 if(checkcompressfile
=="zipfile"):
4741 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4742 if(rarfile_support
and checkcompressfile
=="rarfile"):
4743 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4744 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4745 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4746 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4753 if(hasattr(sys
.stdin
, "buffer")):
4754 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4756 shutil
.copyfileobj(sys
.stdin
, catfp
);
4758 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4762 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4763 catfp
= download_file_from_internet_file(infile
);
4764 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4770 infile
= RemoveWindowsPath(infile
);
4771 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4772 if(checkcompressfile
=="tarfile"):
4773 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4774 if(checkcompressfile
=="zipfile"):
4775 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4776 if(rarfile_support
and checkcompressfile
=="rarfile"):
4777 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4778 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4779 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4780 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4782 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4783 if(not compresscheck
):
4784 fextname
= os
.path
.splitext(infile
)[1];
4785 if(fextname
==".gz"):
4786 compresscheck
= "gzip";
4787 elif(fextname
==".bz2"):
4788 compresscheck
= "bzip2";
4789 elif(fextname
==".zst"):
4790 compresscheck
= "zstd";
4791 elif(fextname
==".lz4" or fextname
==".clz4"):
4792 compresscheck
= "lz4";
4793 elif(fextname
==".lzo" or fextname
==".lzop"):
4794 compresscheck
= "lzo";
4795 elif(fextname
==".lzma" or fextname
==".xz"):
4796 compresscheck
= "lzma";
4799 if(not compresscheck
):
4801 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4806 SeekToEndOfFile(catfp);
4808 SeekToEndOfFile(catfp);
4809 CatSize = catfp.tell();
4810 CatSizeEnd = CatSize;
4818 curloc
= catfp
.tell();
4821 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4823 catfp
.seek(curloc
, 0);
4824 catstring
= catheader
[0];
4825 catversion
= re
.findall(r
"([\d]+)", catstring
);
4826 fprenumfiles
= catheader
[1];
4827 fnumfiles
= int(fprenumfiles
, 16);
4828 fprechecksumtype
= catheader
[2];
4829 fprechecksum
= catheader
[3];
4830 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4831 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4832 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4833 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4834 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4835 fheadtell
= len(fileheader
);
4836 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4837 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
4838 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4840 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4841 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': []};
4842 if(seekstart
<0 and seekstart
>fnumfiles
):
4844 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
4845 seekend
= fnumfiles
;
4846 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
4847 seekend
= fnumfiles
- abs(seekend
);
4850 while(il
< seekstart
):
4851 prefhstart
= catfp
.tell();
4852 if(formatspecs
['new_style']):
4853 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4855 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4856 if(len(preheaderdata
)==0):
4858 prefheadsize
= int(preheaderdata
[0], 16);
4859 prefnumfields
= int(preheaderdata
[1], 16);
4860 if(re
.findall("^[.|/]", preheaderdata
[3])):
4861 prefname
= preheaderdata
[3];
4863 prefname
= "./"+preheaderdata
[3];
4864 prefsize
= int(preheaderdata
[5], 16);
4865 prefcompression
= preheaderdata
[12];
4866 prefcsize
= int(preheaderdata
[13], 16);
4867 prefextrasize
= int(preheaderdata
[24], 16);
4868 prefextrafields
= int(preheaderdata
[25], 16);
4869 extrafieldslist
= [];
4871 extraend
= extrastart
+ prefextrafields
;
4872 extrafieldslist
= [];
4873 if(extrastart
<extraend
):
4874 extrafieldslist
.append(preheaderdata
[extrastart
]);
4875 extrastart
= extrastart
+ 1;
4876 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4877 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4878 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4880 hcmax
= len(preheaderdata
) - 2;
4883 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
['format_delimiter']);
4885 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4886 if(prefcs
!=prenewfcs
and not skipchecksum
):
4887 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4888 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4890 valid_archive
= False;
4891 invalid_archive
= True;
4892 prefhend
= catfp
.tell() - 1;
4893 prefcontentstart
= catfp
.tell();
4895 pyhascontents
= False;
4897 if(prefcompression
=="none" or prefcompression
=="" or prefcompression
=="auto"):
4898 prefcontents
= catfp
.read(prefsize
);
4900 prefcontents
= catfp
.read(prefcsize
);
4901 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4902 pyhascontents
= True;
4903 if(prefccs
!=prenewfccs
and not skipchecksum
):
4904 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4905 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4909 fileidnum
= seekstart
;
4911 while(fileidnum
<seekend
):
4912 catfhstart
= catfp
.tell();
4913 if(formatspecs
['new_style']):
4914 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4916 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4917 if(len(catheaderdata
)==0):
4919 catfheadsize
= int(catheaderdata
[0], 16);
4920 catfnumfields
= int(catheaderdata
[1], 16);
4921 catftype
= int(catheaderdata
[2], 16);
4922 if(re
.findall("^[.|/]", catheaderdata
[3])):
4923 catfname
= catheaderdata
[3];
4925 catfname
= "./"+catheaderdata
[3];
4926 catfbasedir
= os
.path
.dirname(catfname
);
4927 catflinkname
= catheaderdata
[4];
4928 catfsize
= int(catheaderdata
[5], 16);
4929 catfatime
= int(catheaderdata
[6], 16);
4930 catfmtime
= int(catheaderdata
[7], 16);
4931 catfctime
= int(catheaderdata
[8], 16);
4932 catfbtime
= int(catheaderdata
[9], 16);
4933 catfmode
= int(catheaderdata
[10], 16);
4934 catfchmode
= stat
.S_IMODE(catfmode
);
4935 catftypemod
= stat
.S_IFMT(catfmode
);
4936 catfwinattributes
= int(catheaderdata
[11], 16);
4937 catfcompression
= catheaderdata
[12];
4938 catfcsize
= int(catheaderdata
[13], 16);
4939 catfuid
= int(catheaderdata
[14], 16);
4940 catfuname
= catheaderdata
[15];
4941 catfgid
= int(catheaderdata
[16], 16);
4942 catfgname
= catheaderdata
[17];
4943 catfid
= int(catheaderdata
[18], 16);
4944 catfinode
= int(catheaderdata
[19], 16);
4945 catflinkcount
= int(catheaderdata
[20], 16);
4946 catfdev_minor
= int(catheaderdata
[21], 16);
4947 catfdev_major
= int(catheaderdata
[22], 16);
4948 catfrdev_minor
= int(catheaderdata
[23], 16);
4949 catfrdev_major
= int(catheaderdata
[24], 16);
4950 catfextrasize
= int(catheaderdata
[25], 16);
4951 catfextrafields
= int(catheaderdata
[26], 16);
4952 extrafieldslist
= [];
4954 extraend
= extrastart
+ catfextrafields
;
4955 extrafieldslist
= [];
4956 if(extrastart
<extraend
):
4957 extrafieldslist
.append(catheaderdata
[extrastart
]);
4958 extrastart
= extrastart
+ 1;
4959 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4960 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4961 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4963 hcmax
= len(catheaderdata
) - 2;
4966 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
['format_delimiter']);
4968 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4969 if(catfcs
!=catnewfcs
and not skipchecksum
):
4970 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
4971 VerbosePrintOut("'" + str(catfcs
) + "' != " + "'" + str(catnewfcs
) + "'");
4973 catfhend
= catfp
.tell() - 1;
4974 catfcontentstart
= catfp
.tell();
4975 catfcontents
= BytesIO();
4976 pyhascontents
= False;
4977 if(catfsize
>0 and not listonly
):
4978 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4979 catfcontents
.write(catfp
.read(catfsize
));
4981 catfcontents
.write(catfp
.read(catfcsize
));
4982 catfcontents
.seek(0, 0);
4983 catnewfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
4984 pyhascontents
= True;
4985 if(catfccs
!=catnewfccs
and skipchecksum
):
4986 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
4987 VerbosePrintOut("'" + str(catfccs
) + "' != " + "'" + str(catnewfccs
) + "'");
4989 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4992 catfcontents
.seek(0, 0);
4994 catfcontents
= UncompressArchiveFile(catfcontents
, formatspecs
);
4995 catfcontents
.seek(0, 0);
4996 catfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
4997 if(catfsize
>0 and listonly
):
4998 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4999 catfp
.seek(catfsize
, 1);
5001 catfp
.seek(catfcsize
, 1);
5002 pyhascontents
= False;
5004 catfcontentend
= catfp
.tell() - 1;
5005 catfcontents
.seek(0, 0);
5006 catlist
['ffilelist'].append({'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
});
5007 fileidnum
= fileidnum
+ 1;
5008 realidnum
= realidnum
+ 1;
5010 catlist
.update({'catfp': catfp
});
5015 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
5017 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5018 formatspecs
= FormatSpecsListToDict(formatspecs
);
5019 catfp
= BytesIO(catstr
);
5020 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5021 return listcatfiles
;
5023 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
5025 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5026 formatspecs
= FormatSpecsListToDict(formatspecs
);
5028 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5029 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5030 return listcatfiles
;
5032 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5033 formatspecs
= FormatSpecsListToDict(formatspecs
);
5035 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5036 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5037 return listcatfiles
;
5039 if(not rarfile_support
):
5040 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5043 if(rarfile_support
):
5044 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5045 formatspecs
= FormatSpecsListToDict(formatspecs
);
5047 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5048 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5049 return listcatfiles
;
5051 if(not py7zr_support
):
5052 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5056 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5057 formatspecs
= FormatSpecsListToDict(formatspecs
);
5059 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5060 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5061 return listcatfiles
;
5063 def InFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5064 formatspecs
= FormatSpecsListToDict(formatspecs
);
5065 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
5066 if(checkcompressfile
=="tarfile"):
5067 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5068 elif(checkcompressfile
=="zipfile"):
5069 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5070 elif(checkcompressfile
=="catfile"):
5071 return ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
5072 elif(rarfile_support
and checkcompressfile
=="rarfile"):
5073 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5074 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
5075 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5080 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5081 formatspecs
= FormatSpecsListToDict(formatspecs
);
5082 catver
= formatspecs
['format_ver'];
5083 fileheaderver
= str(int(catver
.replace(".", "")));
5084 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5085 advancedlist
= formatspecs
['use_advanced_list'];
5086 altinode
= formatspecs
['use_alt_inode'];
5089 for line
in sys
.stdin
:
5090 infilelist
.append(line
.strip());
5091 infilelist
= list(filter(None, infilelist
));
5092 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
5093 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
5095 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
5096 for line
in finfile
:
5097 infilelist
.append(line
.strip());
5098 infilelist
= list(filter(None, infilelist
));
5100 if(isinstance(infiles
, (list, tuple, ))):
5101 infilelist
= list(filter(None, infiles
));
5102 elif(isinstance(infiles
, (str, ))):
5103 infilelist
= list(filter(None, [infiles
]));
5105 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
5107 GetDirList
= ListDir(infilelist
, followlink
, False);
5115 inodetocatinode
= {};
5117 fnumfiles
= int(len(GetDirList
));
5118 catver
= formatspecs
['format_ver'];
5119 fileheaderver
= str(int(catver
.replace(".", "")));
5120 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5121 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5122 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5123 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5124 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5125 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5126 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5127 fheadtell
= len(fileheader
);
5128 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5129 for curfname
in GetDirList
:
5130 catfhstart
= fheadtell
;
5131 if(re
.findall("^[.|/]", curfname
)):
5134 fname
= "./"+curfname
;
5136 VerbosePrintOut(fname
);
5137 if(not followlink
or followlink
is None):
5138 fstatinfo
= os
.lstat(fname
);
5140 fstatinfo
= os
.stat(fname
);
5141 fpremode
= fstatinfo
.st_mode
;
5142 finode
= fstatinfo
.st_ino
;
5143 flinkcount
= fstatinfo
.st_nlink
;
5145 if(stat
.S_ISREG(fpremode
)):
5147 elif(stat
.S_ISLNK(fpremode
)):
5149 elif(stat
.S_ISCHR(fpremode
)):
5151 elif(stat
.S_ISBLK(fpremode
)):
5153 elif(stat
.S_ISDIR(fpremode
)):
5155 elif(stat
.S_ISFIFO(fpremode
)):
5157 elif(stat
.S_ISSOCK(fpremode
)):
5159 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
5161 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
5163 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
5168 fbasedir
= os
.path
.dirname(fname
);
5170 if(not followlink
and finode
!=0):
5172 if(finode
in inodelist
):
5174 flinkname
= inodetofile
[finode
];
5178 fcurinode
= inodetocatinode
[finode
];
5179 if(finode
not in inodelist
):
5180 inodelist
.append(finode
);
5181 inodetofile
.update({finode
: fname
});
5182 inodetocatinode
.update({finode
: curinode
});
5186 fcurinode
= curinode
;
5187 curinode
= curinode
+ 1;
5189 fcurinode
= curinode
;
5190 curinode
= curinode
+ 1;
5191 curfid
= curfid
+ 1;
5193 flinkname
= os
.readlink(fname
);
5194 fdev
= fstatinfo
.st_dev
;
5195 getfdev
= GetDevMajorMinor(fdev
);
5196 fdev_minor
= getfdev
[0];
5197 fdev_major
= getfdev
[1];
5198 frdev
= fstatinfo
.st_dev
;
5199 if(hasattr(fstatinfo
, "st_rdev")):
5200 frdev
= fstatinfo
.st_rdev
;
5202 frdev
= fstatinfo
.st_dev
;
5203 getfrdev
= GetDevMajorMinor(frdev
);
5204 frdev_minor
= getfrdev
[0];
5205 frdev_major
= getfrdev
[1];
5206 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5208 if(ftype
==0 or ftype
==7):
5209 fsize
= fstatinfo
.st_size
;
5210 fatime
= fstatinfo
.st_atime
;
5211 fmtime
= fstatinfo
.st_mtime
;
5212 fctime
= fstatinfo
.st_ctime
;
5213 if(hasattr(fstatinfo
, "st_birthtime")):
5214 fbtime
= fstatinfo
.st_birthtime
;
5216 fbtime
= fstatinfo
.st_ctime
;
5217 fmode
= fstatinfo
.st_mode
;
5218 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
5219 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
5220 fuid
= fstatinfo
.st_uid
;
5221 fgid
= fstatinfo
.st_gid
;
5226 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
5227 funame
= userinfo
.pw_name
;
5236 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
5237 fgname
= groupinfo
.gr_name
;
5242 fdev_minor
= fdev_minor
;
5243 fdev_major
= fdev_major
;
5244 frdev_minor
= frdev_minor
;
5245 frdev_major
= frdev_major
;
5246 flinkcount
= flinkcount
;
5247 if(hasattr(fstatinfo
, "st_file_attributes")):
5248 fwinattributes
= fstatinfo
.st_file_attributes
;
5253 fcontents
= BytesIO();
5254 if(ftype
==0 or ftype
==7):
5255 with
open(fname
, "rb") as fpc
:
5256 shutil
.copyfileobj(fpc
, fcontents
);
5257 if(followlink
and (ftype
==1 or ftype
==2)):
5258 flstatinfo
= os
.stat(flinkname
);
5259 with
open(flinkname
, "rb") as fpc
:
5260 shutil
.copyfileobj(fpc
, fcontents
);
5261 fcontents
.seek(0, 0);
5262 ftypehex
= format(ftype
, 'x').lower();
5263 extrafields
= len(extradata
);
5264 extrafieldslist
= extradata
;
5265 catfextrafields
= extrafields
;
5266 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5267 if(len(extradata
)>0):
5268 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5269 extrasizelen
= len(extrasizestr
);
5270 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5271 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()];
5272 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5273 catoutlenhex
= format(catoutlen
, 'x').lower();
5274 catoutlist
.insert(0, catoutlenhex
);
5275 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5276 catheaderdata
= catoutlist
;
5277 if(len(extradata
)>0):
5278 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5279 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
5280 catfnumfields
= catoutlen
;
5281 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5282 fcontents
.seek(0, 0);
5283 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5284 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5285 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5286 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5287 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5288 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5289 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5290 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5291 catfcontentstart
= fheadtell
;
5292 fheadtell
+= len(catfileoutstr
) + 1;
5293 catfcontentend
= fheadtell
- 1;
5294 catfhend
= catfcontentend
;
5295 fcontents
.seek(0, 0);
5296 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5297 pyhascontents
= False;
5298 if(int(fsize
)>0 and not listonly
):
5299 pyhascontents
= True;
5300 if(int(fsize
)>0 and listonly
):
5301 fcontents
= BytesIO();
5302 pyhascontents
= False;
5303 fcontents
.seek(0, 0);
5304 catlist
['ffilelist'].append({'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
});
5305 fileidnum
= fileidnum
+ 1;
5308 def TarFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5309 formatspecs
= FormatSpecsListToDict(formatspecs
);
5315 inodetocatinode
= {};
5319 if(hasattr(sys
.stdin
, "buffer")):
5320 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5322 shutil
.copyfileobj(sys
.stdin
, infile
);
5327 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5328 infile
= download_file_from_internet_file(infile
);
5333 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5335 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
5337 if(not tarfile
.TarFileCheck(infile
)):
5339 except AttributeError:
5340 if(not TarFileCheck(infile
)):
5345 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5346 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
5348 tarfp
= tarfile
.open(infile
, "r");
5349 except FileNotFoundError
:
5351 fnumfiles
= int(len(tarfp
.getmembers()));
5352 catver
= formatspecs
['format_ver'];
5353 fileheaderver
= str(int(catver
.replace(".", "")));
5354 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5355 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5356 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5357 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5358 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5359 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5360 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5361 fheadtell
= len(fileheader
);
5362 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5363 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
5364 catfhstart
= fheadtell
;
5365 if(re
.findall("^[.|/]", member
.name
)):
5366 fname
= member
.name
;
5368 fname
= "./"+member
.name
;
5370 VerbosePrintOut(fname
);
5371 fpremode
= member
.mode
;
5372 ffullmode
= member
.mode
;
5376 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5378 elif(member
.isdev()):
5379 ffullmode
= member
.mode
;
5381 elif(member
.islnk()):
5382 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5384 elif(member
.issym()):
5385 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
5387 elif(member
.ischr()):
5388 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
5390 elif(member
.isblk()):
5391 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
5393 elif(member
.isdir()):
5394 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
5396 elif(member
.isfifo()):
5397 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
5399 elif(member
.issparse()):
5400 ffullmode
= member
.mode
;
5403 ffullmode
= member
.mode
;
5406 fbasedir
= os
.path
.dirname(fname
);
5410 curfid
= curfid
+ 1;
5412 flinkname
= member
.linkname
;
5413 fdev_minor
= member
.devminor
;
5414 fdev_major
= member
.devmajor
;
5415 frdev_minor
= member
.devminor
;
5416 frdev_major
= member
.devmajor
;
5417 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5419 elif(ftype
==0 or ftype
==7):
5420 fsize
= member
.size
;
5422 fsize
= member
.size
;
5423 fatime
= member
.mtime
;
5424 fmtime
= member
.mtime
;
5425 fctime
= member
.mtime
;
5426 fbtime
= member
.mtime
;
5428 fchmode
= stat
.S_IMODE(ffullmode
);
5429 ftypemod
= stat
.S_IFMT(ffullmode
);
5432 funame
= member
.uname
;
5433 fgname
= member
.gname
;
5434 flinkcount
= flinkcount
;
5435 fwinattributes
= int(0);
5438 fcontents
= BytesIO();
5439 if(ftype
==0 or ftype
==7):
5440 with tarfp
.extractfile(member
) as fpc
:
5441 shutil
.copyfileobj(fpc
, fcontents
);
5442 fcontents
.seek(0, 0);
5443 ftypehex
= format(ftype
, 'x').lower();
5444 extrafields
= len(extradata
);
5445 extrafieldslist
= extradata
;
5446 catfextrafields
= extrafields
;
5447 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5448 if(len(extradata
)>0):
5449 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5450 extrasizelen
= len(extrasizestr
);
5451 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5452 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()];
5453 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5454 catoutlenhex
= format(catoutlen
, 'x').lower();
5455 catoutlist
.insert(0, catoutlenhex
);
5456 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5457 catheaderdata
= catoutlist
;
5458 if(len(extradata
)>0):
5459 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5460 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
5461 catfnumfields
= catoutlen
;
5462 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5463 fcontents
.seek(0, 0);
5464 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5465 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5466 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5467 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5468 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5469 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5470 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5471 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5472 catfcontentstart
= fheadtell
;
5473 fheadtell
+= len(catfileoutstr
) + 1;
5474 catfcontentend
= fheadtell
- 1;
5475 catfhend
= catfcontentend
;
5476 fcontents
.seek(0, 0);
5477 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5478 pyhascontents
= False;
5479 if(int(fsize
)>0 and not listonly
):
5480 pyhascontents
= True;
5481 if(int(fsize
)>0 and listonly
):
5482 fcontents
= BytesIO();
5483 pyhascontents
= False;
5484 fcontents
.seek(0, 0);
5485 catlist
['ffilelist'].append({'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
});
5486 fileidnum
= fileidnum
+ 1;
5489 def ZipFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5490 formatspecs
= FormatSpecsListToDict(formatspecs
);
5496 inodetocatinode
= {};
5500 if(hasattr(sys
.stdin
, "buffer")):
5501 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5503 shutil
.copyfileobj(sys
.stdin
, infile
);
5508 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5509 infile
= download_file_from_internet_file(infile
);
5514 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5518 if(not zipfile
.is_zipfile(infile
)):
5521 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
5522 except FileNotFoundError
:
5524 ziptest
= zipfp
.testzip();
5526 VerbosePrintOut("Bad file found!");
5527 fnumfiles
= int(len(zipfp
.infolist()));
5528 catver
= formatspecs
['format_ver'];
5529 fileheaderver
= str(int(catver
.replace(".", "")));
5530 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5531 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5532 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5533 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5534 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5535 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5536 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5537 fheadtell
= len(fileheader
);
5538 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5539 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
5540 catfhstart
= fheadtell
;
5541 if(re
.findall("^[.|/]", member
.filename
)):
5542 fname
= member
.filename
;
5544 fname
= "./"+member
.filename
;
5545 zipinfo
= zipfp
.getinfo(member
.filename
);
5547 VerbosePrintOut(fname
);
5548 if(not member
.is_dir()):
5549 fpremode
= stat
.S_IFREG
+ 438;
5550 elif(member
.is_dir()):
5551 fpremode
= stat
.S_IFDIR
+ 511;
5554 if(not member
.is_dir()):
5556 elif(member
.is_dir()):
5559 fbasedir
= os
.path
.dirname(fname
);
5563 curfid
= curfid
+ 1;
5571 fsize
= member
.file_size
;
5573 fsize
= member
.file_size
;
5574 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5575 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5576 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5577 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5578 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
5579 fwinattributes
= int(zipinfo
.external_attr
);
5580 if(not member
.is_dir()):
5581 fmode
= int(stat
.S_IFREG
+ 438);
5582 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5583 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5584 elif(member
.is_dir()):
5585 fmode
= int(stat
.S_IFDIR
+ 511);
5586 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5587 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5588 elif(zipinfo
.create_system
==3):
5589 fwinattributes
= int(0);
5590 fmode
= int(zipinfo
.external_attr
);
5592 fwinattributes
= int(0);
5593 if(not member
.is_dir()):
5594 fmode
= int(stat
.S_IFREG
+ 438);
5595 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5596 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5597 elif(member
.is_dir()):
5598 fmode
= int(stat
.S_IFDIR
+ 511);
5599 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5600 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5605 except AttributeError:
5611 except AttributeError:
5618 userinfo
= pwd
.getpwuid(os
.getuid());
5619 funame
= userinfo
.pw_name
;
5622 except AttributeError:
5630 groupinfo
= grp
.getgrgid(os
.getgid());
5631 fgname
= groupinfo
.gr_name
;
5634 except AttributeError:
5638 fcontents
= BytesIO();
5640 fcontents
.write(zipfp
.read(member
.filename
));
5641 fcontents
.seek(0, 0);
5642 ftypehex
= format(ftype
, 'x').lower();
5643 extrafields
= len(extradata
);
5644 extrafieldslist
= extradata
;
5645 catfextrafields
= extrafields
;
5646 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5647 if(len(extradata
)>0):
5648 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5649 extrasizelen
= len(extrasizestr
);
5650 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5651 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()];
5652 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5653 catoutlenhex
= format(catoutlen
, 'x').lower();
5654 catoutlist
.insert(0, catoutlenhex
);
5655 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5656 catheaderdata
= catoutlist
;
5657 if(len(extradata
)>0):
5658 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5659 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
5660 catfnumfields
= catoutlen
;
5661 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5662 fcontents
.seek(0, 0);
5663 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5664 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5665 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5666 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5667 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5668 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5669 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5670 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5671 catfcontentstart
= fheadtell
;
5672 fheadtell
+= len(catfileoutstr
) + 1;
5673 catfcontentend
= fheadtell
- 1;
5674 catfhend
= catfcontentend
;
5675 fcontents
.seek(0, 0);
5676 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5677 pyhascontents
= False;
5678 if(int(fsize
)>0 and not listonly
):
5679 pyhascontents
= True;
5680 if(int(fsize
)>0 and listonly
):
5681 fcontents
= BytesIO();
5682 pyhascontents
= False;
5683 fcontents
.seek(0, 0);
5684 catlist
['ffilelist'].append({'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
});
5685 fileidnum
= fileidnum
+ 1;
5688 if(not rarfile_support
):
5689 def RarFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5692 if(rarfile_support
):
5693 def RarFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5694 formatspecs
= FormatSpecsListToDict(formatspecs
);
5700 inodetocatinode
= {};
5702 if(not os
.path
.exists(infile
,) or not os
.path
.isfile(infile
,)):
5704 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5706 rarfp
= rarfile
.RarFile(infile
, "r");
5707 rartest
= rarfp
.testrar();
5709 VerbosePrintOut("Bad file found!");
5710 fnumfiles
= int(len(rarfp
.infolist()));
5711 catver
= formatspecs
['format_ver'];
5712 fileheaderver
= str(int(catver
.replace(".", "")));
5713 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5714 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5715 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5716 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5717 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5718 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5719 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5720 fheadtell
= len(fileheader
);
5721 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5722 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5723 catfhstart
= fheadtell
;
5726 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
5729 member
.external_attr
5731 except AttributeError:
5733 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
5736 member
.external_attr
5738 except AttributeError:
5743 if(re
.findall("^[.|/]", member
.filename
)):
5744 fname
= member
.filename
;
5746 fname
= "./"+member
.filename
;
5747 rarinfo
= rarfp
.getinfo(member
.filename
);
5749 VerbosePrintOut(fname
);
5750 if(is_unix
and member
.external_attr
!=0):
5751 fpremode
= int(member
.external_attr
);
5752 elif(member
.is_file()):
5753 fpremode
= stat
.S_IFREG
+ 438;
5754 elif(member
.is_symlink()):
5755 fpremode
= stat
.S_IFLNK
+ 438;
5756 elif(member
.is_dir()):
5757 fpremode
= stat
.S_IFDIR
+ 511;
5758 if(is_windows
and member
.external_attr
!=0):
5759 fwinattributes
= int(member
.external_attr
);
5761 fwinattributes
= int(0);
5766 if(member
.is_file()):
5768 elif(member
.is_symlink()):
5770 elif(member
.is_dir()):
5774 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
5775 fbasedir
= os
.path
.dirname(fname
);
5779 curfid
= curfid
+ 1;
5787 fsize
= member
.file_size
;
5790 fatime
= int(member
.atime
.timestamp());
5792 fatime
= int(member
.mtime
.timestamp());
5793 except AttributeError:
5794 fatime
= int(member
.mtime
.timestamp());
5795 fmtime
= int(member
.mtime
.timestamp());
5798 fctime
= int(member
.ctime
.timestamp());
5800 fctime
= int(member
.mtime
.timestamp());
5801 except AttributeError:
5802 fctime
= int(member
.mtime
.timestamp());
5803 fbtime
= int(member
.mtime
.timestamp());
5804 if(is_unix
and member
.external_attr
!=0):
5805 fmode
= int(member
.external_attr
);
5806 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5807 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5808 elif(member
.is_file()):
5809 fmode
= int(stat
.S_IFREG
+ 438)
5810 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5811 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5812 elif(member
.is_symlink()):
5813 fmode
= int(stat
.S_IFLNK
+ 438)
5814 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5815 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5816 elif(member
.is_dir()):
5817 fmode
= int(stat
.S_IFDIR
+ 511)
5818 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5819 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5822 except AttributeError:
5828 except AttributeError:
5835 userinfo
= pwd
.getpwuid(os
.getuid());
5836 funame
= userinfo
.pw_name
;
5839 except AttributeError:
5847 groupinfo
= grp
.getgrgid(os
.getgid());
5848 fgname
= groupinfo
.gr_name
;
5851 except AttributeError:
5855 fcontents
= BytesIO();
5857 fcontents
.write(rarfp
.read(member
.filename
));
5858 fcontents
.seek(0, 0);
5859 ftypehex
= format(ftype
, 'x').lower();
5860 extrafields
= len(extradata
);
5861 extrafieldslist
= extradata
;
5862 catfextrafields
= extrafields
;
5863 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5864 if(len(extradata
)>0):
5865 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5866 extrasizelen
= len(extrasizestr
);
5867 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5868 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()];
5869 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5870 catoutlenhex
= format(catoutlen
, 'x').lower();
5871 catoutlist
.insert(0, catoutlenhex
);
5872 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5873 if(len(extradata
)>0):
5874 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5875 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
5876 catfnumfields
= 24 + catfextrafields
;
5877 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5878 fcontents
.seek(0, 0);
5879 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5880 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5881 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5882 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5883 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5884 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5885 catheaderdata
= catoutlist
;
5886 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5887 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5888 catfcontentstart
= fheadtell
;
5889 fheadtell
+= len(catfileoutstr
) + 1;
5890 catfcontentend
= fheadtell
- 1;
5891 catfhend
= catfcontentend
;
5892 fcontents
.seek(0, 0);
5893 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5894 pyhascontents
= False;
5895 if(int(fsize
)>0 and not listonly
):
5896 pyhascontents
= True;
5897 if(int(fsize
)>0 and listonly
):
5898 fcontents
= BytesIO();
5899 pyhascontents
= False;
5900 fcontents
.seek(0, 0);
5901 catlist
['ffilelist'].append({'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
});
5902 fileidnum
= fileidnum
+ 1;
5905 if(not py7zr_support
):
5906 def SevenZipFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5910 def SevenZipFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5911 formatspecs
= FormatSpecsListToDict(formatspecs
);
5917 inodetocatinode
= {};
5919 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
5920 file_content
= szpfp
.readall();
5921 #sztest = szpfp.testzip();
5922 sztestalt
= szpfp
.test();
5924 VerbosePrintOut("Bad file found!");
5925 numfiles
= int(len(szpfp
.list()));
5926 catver
= formatspecs
['format_ver'];
5927 fileheaderver
= str(int(catver
.replace(".", "")));
5928 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5929 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5930 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5931 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5932 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5933 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5934 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5935 fheadtell
= len(fileheader
);
5936 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5937 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
5938 catfhstart
= fheadtell
;
5939 if(re
.findall("^[.|/]", member
.filename
)):
5940 fname
= member
.filename
;
5942 fname
= "./"+member
.filename
;
5943 if(not member
.is_directory
):
5944 fpremode
= int(stat
.S_IFREG
+ 438);
5945 elif(member
.is_directory
):
5946 fpremode
= int(stat
.S_IFDIR
+ 511);
5947 fwinattributes
= int(0);
5952 if(member
.is_directory
):
5957 fbasedir
= os
.path
.dirname(fname
);
5961 curfid
= curfid
+ 1;
5968 fatime
= int(member
.creationtime
.timestamp());
5969 fmtime
= int(member
.creationtime
.timestamp());
5970 fctime
= int(member
.creationtime
.timestamp());
5971 fbtime
= int(member
.creationtime
.timestamp());
5972 if(member
.is_directory
):
5973 fmode
= int(stat
.S_IFDIR
+ 511)
5974 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5975 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5977 fmode
= int(stat
.S_IFLNK
+ 438)
5978 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5979 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5982 except AttributeError:
5988 except AttributeError:
5995 userinfo
= pwd
.getpwuid(os
.getuid());
5996 funame
= userinfo
.pw_name
;
5999 except AttributeError:
6007 groupinfo
= grp
.getgrgid(os
.getgid());
6008 fgname
= groupinfo
.gr_name
;
6011 except AttributeError:
6015 fcontents
= BytesIO();
6017 fcontents
.write(file_content
[member
.filename
].read());
6018 fsize
= format(fcontents
.tell(), 'x').lower();
6020 fcontents
.seek(0, 0);
6021 ftypehex
= format(ftype
, 'x').lower();
6022 extrafields
= len(extradata
);
6023 extrafieldslist
= extradata
;
6024 catfextrafields
= extrafields
;
6025 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
6026 if(len(extradata
)>0):
6027 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6028 extrasizelen
= len(extrasizestr
);
6029 extrasizelenhex
= format(extrasizelen
, 'x').lower();
6030 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()];
6031 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6032 catoutlenhex
= format(catoutlen
, 'x').lower();
6033 catoutlist
.insert(0, catoutlenhex
);
6034 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
6035 catheaderdata
= catoutlist
;
6036 if(len(extradata
)>0):
6037 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6038 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
['format_delimiter']);
6039 catfnumfields
= 24 + catfextrafields
;
6040 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6041 fcontents
.seek(0, 0);
6042 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
6043 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6044 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
6045 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
6046 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6047 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6048 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6049 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
6050 catfcontentstart
= fheadtell
;
6051 fheadtell
+= len(catfileoutstr
) + 1;
6052 catfcontentend
= fheadtell
- 1;
6053 catfhend
= catfcontentend
;
6054 fcontents
.seek(0, 0);
6055 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
6056 pyhascontents
= False;
6057 if(int(fsize
)>0 and not listonly
):
6058 pyhascontents
= True;
6059 if(int(fsize
)>0 and listonly
):
6060 fcontents
= BytesIO();
6061 pyhascontents
= False;
6062 fcontents
.seek(0, 0);
6063 catlist
['ffilelist'].append({'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
});
6064 fileidnum
= fileidnum
+ 1;
6067 def InFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6068 formatspecs
= FormatSpecsListToDict(formatspecs
);
6069 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
6070 if(checkcompressfile
=="tarfile"):
6071 return TarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6072 elif(checkcompressfile
=="zipfile"):
6073 return ZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6074 elif(checkcompressfile
=="catfile"):
6075 return ArchiveFileToArray(infile
, 0, 0, listonly
, True, False, formatspecs
, False);
6076 elif(rarfile_support
and checkcompressfile
=="rarfile"):
6077 return RarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6078 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
6079 return SevenZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6084 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):
6085 formatspecs
= FormatSpecsListToDict(formatspecs
);
6086 outarray
= BytesIO();
6087 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6088 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6089 return listcatfiles
;
6091 def ArchiveFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6092 formatspecs
= FormatSpecsListToDict(formatspecs
);
6093 if(isinstance(infile
, dict)):
6094 listcatfiles
= infile
;
6096 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6097 infile
= RemoveWindowsPath(infile
);
6098 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
, returnfp
);
6099 if(not listcatfiles
):
6101 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': {}}}};
6103 catarray
.update({'catfp': listcatfiles
['catfp']});
6104 lenlist
= len(listcatfiles
['ffilelist']);
6106 lcfx
= int(listcatfiles
['fnumfiles']);
6107 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6108 lcfx
= int(lenlist
);
6110 lcfx
= int(listcatfiles
['fnumfiles']);
6112 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6113 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6114 catarray
['filetoid'].update(filetoidarray
);
6115 catarray
['idtofile'].update(idtofilearray
);
6116 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6117 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6118 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6119 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6120 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6121 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6122 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6123 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6124 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6125 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6126 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6127 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6128 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6129 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6130 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6131 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6132 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6133 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6134 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6135 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6136 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6137 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6138 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6139 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6140 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6141 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6142 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6143 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6144 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6145 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6146 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6150 create_alias_function("", __file_format_name__
, "ToArrayIndex", ArchiveFileToArrayIndex
);
6152 def ListDirToArrayIndexAlt(infiles
, dirlistfromtxt
=False, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6153 formatspecs
= FormatSpecsListToDict(formatspecs
);
6154 listcatfiles
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6155 if(not listcatfiles
):
6157 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': {}}}};
6158 lenlist
= len(listcatfiles
['ffilelist']);
6160 lcfx
= int(listcatfiles
['fnumfiles']);
6161 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6162 lcfx
= int(lenlist
);
6164 lcfx
= int(listcatfiles
['fnumfiles']);
6166 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6167 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6168 catarray
['filetoid'].update(filetoidarray
);
6169 catarray
['idtofile'].update(idtofilearray
);
6170 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6171 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6172 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6173 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6174 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6175 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6176 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6177 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6178 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6179 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6180 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6181 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6182 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6183 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6184 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6185 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6186 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6187 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6188 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6189 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6190 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6191 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6192 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6193 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6194 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6195 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6196 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6197 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6198 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6199 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6200 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6204 def TarFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6205 formatspecs
= FormatSpecsListToDict(formatspecs
);
6206 listcatfiles
= TarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6207 if(not listcatfiles
):
6209 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': {}}}};
6210 lenlist
= len(listcatfiles
['ffilelist']);
6212 lcfx
= int(listcatfiles
['fnumfiles']);
6213 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6214 lcfx
= int(lenlist
);
6216 lcfx
= int(listcatfiles
['fnumfiles']);
6218 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6219 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6220 catarray
['filetoid'].update(filetoidarray
);
6221 catarray
['idtofile'].update(idtofilearray
);
6222 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6223 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6224 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6225 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6226 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6227 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6228 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6229 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6230 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6231 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6232 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6233 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6234 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6235 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6236 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6237 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6238 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6239 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6240 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6241 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6242 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6243 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6244 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6245 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6246 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6247 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6248 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6249 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6250 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6251 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6252 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6256 def ZipFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6257 formatspecs
= FormatSpecsListToDict(formatspecs
);
6258 listcatfiles
= ZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6259 if(not listcatfiles
):
6261 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': {}}}};
6262 lenlist
= len(listcatfiles
['ffilelist']);
6264 lcfx
= int(listcatfiles
['fnumfiles']);
6265 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6266 lcfx
= int(lenlist
);
6268 lcfx
= int(listcatfiles
['fnumfiles']);
6270 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6271 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6272 catarray
['filetoid'].update(filetoidarray
);
6273 catarray
['idtofile'].update(idtofilearray
);
6274 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6275 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6276 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6277 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6278 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6279 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6280 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6281 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6282 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6283 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6284 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6285 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6286 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6287 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6288 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6289 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6290 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6291 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6292 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6293 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6294 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6295 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6296 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6297 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6298 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6299 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6300 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6301 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6302 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6303 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6304 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6308 if(not rarfile_support
):
6309 def RarFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6312 if(rarfile_support
):
6313 def RarFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6314 formatspecs
= FormatSpecsListToDict(formatspecs
);
6315 listcatfiles
= RarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6316 if(not listcatfiles
):
6318 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': {}}}};
6319 lenlist
= len(listcatfiles
['ffilelist']);
6321 lcfx
= int(listcatfiles
['fnumfiles']);
6322 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6323 lcfx
= int(lenlist
);
6325 lcfx
= int(listcatfiles
['fnumfiles']);
6327 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6328 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6329 catarray
['filetoid'].update(filetoidarray
);
6330 catarray
['idtofile'].update(idtofilearray
);
6331 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6332 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6333 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6334 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6335 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6336 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6337 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6338 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6339 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6340 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6341 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6342 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6343 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6344 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6345 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6346 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6347 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6348 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6349 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6350 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6351 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6352 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6353 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6354 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6355 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6356 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6357 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6358 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6359 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6360 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6361 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6365 if(not py7zr_support
):
6366 def SevenZipFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6370 def SevenZipFileToArrayIndexAlt(infile
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6371 formatspecs
= FormatSpecsListToDict(formatspecs
);
6372 listcatfiles
= SevenZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6373 if(not listcatfiles
):
6375 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': {}}}};
6376 lenlist
= len(listcatfiles
['ffilelist']);
6378 lcfx
= int(listcatfiles
['fnumfiles']);
6379 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6380 lcfx
= int(lenlist
);
6382 lcfx
= int(listcatfiles
['fnumfiles']);
6384 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6385 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6386 catarray
['filetoid'].update(filetoidarray
);
6387 catarray
['idtofile'].update(idtofilearray
);
6388 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6389 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6390 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6391 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6392 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6393 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6394 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6395 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6396 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6397 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6398 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6399 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6400 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6401 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6402 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6403 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6404 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6405 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6406 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6407 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6408 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6409 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6410 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6411 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6412 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6413 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6414 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6415 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6416 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6417 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6418 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6422 def ArchiveFileStringToArrayIndex(catstr
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6423 formatspecs
= FormatSpecsListToDict(formatspecs
);
6424 catfp
= BytesIO(catstr
);
6425 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
, returnfp
);
6426 return listcatfiles
;
6428 create_alias_function("", __file_format_name__
, "StringToArrayIndex", ArchiveFileStringToArrayIndex
);
6430 def TarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6431 formatspecs
= FormatSpecsListToDict(formatspecs
);
6433 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
6434 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6435 return listcatfiles
;
6437 def ZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6438 formatspecs
= FormatSpecsListToDict(formatspecs
);
6440 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
6441 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6442 return listcatfiles
;
6444 if(not rarfile_support
):
6445 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6448 if(rarfile_support
):
6449 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6450 formatspecs
= FormatSpecsListToDict(formatspecs
);
6452 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
6453 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6454 return listcatfiles
;
6456 if(not py7zr_support
):
6457 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6461 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6462 formatspecs
= FormatSpecsListToDict(formatspecs
);
6464 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
6465 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6466 return listcatfiles
;
6468 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):
6469 formatspecs
= FormatSpecsListToDict(formatspecs
);
6470 outarray
= BytesIO();
6471 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
, True);
6472 listcatfiles
= ArchiveFileToArrayIndex(outarray
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
)
6473 return listcatfiles
;
6475 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):
6476 formatspecs
= FormatSpecsListToDict(formatspecs
);
6477 if(isinstance(infile
, dict)):
6478 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6479 listcatfiles
= prelistcatfiles
['list'];
6481 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6482 infile
= RemoveWindowsPath(infile
);
6484 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6485 listcatfiles
= prelistcatfiles
['list'];
6487 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6488 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
6489 outfile
= RemoveWindowsPath(outfile
);
6490 checksumtype
= checksumtype
.lower();
6491 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
6492 checksumtype
="crc32";
6493 if(checksumtype
=="none"):
6495 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
6496 compression
= "auto";
6497 if(compression
not in compressionlist
and compression
is None):
6498 compression
= "auto";
6500 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6501 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
6502 if(os
.path
.exists(outfile
)):
6505 except OSError as e
:
6507 if(not listcatfiles
):
6512 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6514 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6517 fbasename
= os
.path
.splitext(outfile
)[0];
6518 fextname
= os
.path
.splitext(outfile
)[1];
6519 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
6520 catver
= formatspecs
['format_ver'];
6521 fileheaderver
= str(int(catver
.replace(".", "")));
6522 lenlist
= len(listcatfiles
['ffilelist']);
6523 fnumfiles
= int(listcatfiles
['fnumfiles']);
6524 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
6525 fnumfiles
= lenlist
;
6526 AppendFileHeader(catfp
, fnumfiles
, checksumtype
, formatspecs
);
6527 lenlist
= len(listcatfiles
['ffilelist']);
6528 fnumfiles
= int(listcatfiles
['fnumfiles']);
6530 lcfx
= int(listcatfiles
['fnumfiles']);
6531 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6532 lcfx
= int(lenlist
);
6534 lcfx
= int(listcatfiles
['fnumfiles']);
6542 if(re
.findall("^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
6543 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
6545 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
6547 VerbosePrintOut(fname
);
6548 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
6549 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
6550 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6551 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
6552 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
6553 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
6554 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
6555 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
6556 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
6557 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
6558 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
6559 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
6560 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
6561 finode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['finode']), 'x').lower();
6562 flinkcount
= format(int(listcatfiles
['ffilelist'][reallcfi
]['flinkcount']), 'x').lower();
6563 fwinattributes
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fwinattributes']), 'x').lower();
6564 fcompression
= listcatfiles
['ffilelist'][reallcfi
]['fcompression'];
6565 fcsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fcsize']), 'x').lower();
6566 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
6567 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
6568 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
6569 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
6570 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
6571 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6572 if(not followlink
and len(extradata
)<0):
6573 extradata
= listcatfiles
['ffilelist'][reallcfi
]['fextralist'];
6574 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
6576 fcsize
= format(int(0), 'x').lower();
6577 if(not compresswholefile
):
6578 fcontents
.seek(0, 2);
6579 ucfsize
= fcontents
.tell();
6580 fcontents
.seek(0, 0);
6581 if(compression
=="auto"):
6582 ilsize
= len(compressionlistalt
);
6585 while(ilmin
< ilsize
):
6586 cfcontents
= BytesIO();
6587 shutil
.copyfileobj(fcontents
, cfcontents
);
6588 fcontents
.seek(0, 0);
6589 cfcontents
.seek(0, 0);
6590 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
6592 cfcontents
.seek(0, 2);
6593 ilcsize
.append(cfcontents
.tell());
6597 ilcsize
.append(sys
.maxint
);
6598 except AttributeError:
6599 ilcsize
.append(sys
.maxsize
);
6601 ilcmin
= ilcsize
.index(min(ilcsize
));
6602 compression
= compressionlistalt
[ilcmin
];
6603 fcontents
.seek(0, 0);
6604 cfcontents
= BytesIO();
6605 shutil
.copyfileobj(fcontents
, cfcontents
);
6606 cfcontents
.seek(0, 0);
6607 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
6608 cfcontents
.seek(0, 2);
6609 cfsize
= cfcontents
.tell();
6610 if(ucfsize
> cfsize
):
6611 fcsize
= format(int(cfsize
), 'x').lower();
6612 fcompression
= compression
;
6614 fcontents
= cfcontents
;
6616 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
6617 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6618 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6619 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6620 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
6621 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
6622 flinkname
= flinkinfo
['flinkname'];
6623 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
6624 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
6625 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
6626 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
6627 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
6628 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
6629 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
6630 funame
= flinkinfo
['funame'];
6631 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
6632 fgname
= flinkinfo
['fgname'];
6633 finode
= format(int(flinkinfo
['finode']), 'x').lower();
6634 flinkcount
= format(int(flinkinfo
['flinkcount']), 'x').lower();
6635 fwinattributes
= format(int(flinkinfo
['fwinattributes']), 'x').lower();
6636 fcompression
= flinkinfo
['fcompression'];
6637 fcsize
= format(int(flinkinfo
['fcsize']), 'x').lower();
6638 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
6639 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
6640 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
6641 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
6642 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
6643 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
6644 if(len(extradata
)<0):
6645 extradata
= flinkinfo
['fextralist'];
6646 fcontents
= flinkinfo
['fcontents'];
6647 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
6649 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
6650 fcurfid
= format(curfid
, 'x').lower();
6651 if(not followlink
and finode
!=0):
6652 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
6653 fcurinode
= format(int(curinode
), 'x').lower();
6654 inodetofile
.update({curinode
: fname
});
6655 filetoinode
.update({fname
: curinode
});
6656 curinode
= curinode
+ 1;
6658 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
6660 fcurinode
= format(int(curinode
), 'x').lower();
6661 curinode
= curinode
+ 1;
6662 curfid
= curfid
+ 1;
6663 if(fcompression
=="none"):
6665 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
];
6666 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
6669 reallcfi
= reallcfi
+ 1;
6671 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
6672 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6673 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
6676 os
.fsync(catfp
.fileno());
6677 except io
.UnsupportedOperation
:
6679 except AttributeError:
6681 except OSError as e
:
6685 if(hasattr(sys
.stdout
, "buffer")):
6686 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
6688 shutil
.copyfileobj(catfp
, sys
.stdout
);
6689 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6690 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
6692 upload_file_to_internet_file(catfp
, outfile
);
6700 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
6702 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6703 formatspecs
= FormatSpecsListToDict(formatspecs
);
6704 catfp
= BytesIO(catstr
);
6705 listcatfiles
= RePackArchiveFile(catfp
, compression
, compresswholefile
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6706 return listcatfiles
;
6708 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
6710 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):
6711 formatspecs
= FormatSpecsListToDict(formatspecs
);
6712 outarray
= BytesIO();
6713 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6714 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6715 return listcatfiles
;
6717 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
6719 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):
6720 formatspecs
= FormatSpecsListToDict(formatspecs
);
6721 if(outdir
is not None):
6722 outdir
= RemoveWindowsPath(outdir
);
6724 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6725 if(isinstance(infile
, dict)):
6726 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6727 listcatfiles
= prelistcatfiles
['list'];
6729 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6730 infile
= RemoveWindowsPath(infile
);
6732 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6733 listcatfiles
= prelistcatfiles
['list'];
6735 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6736 if(not listcatfiles
):
6738 lenlist
= len(listcatfiles
['ffilelist']);
6739 fnumfiles
= int(listcatfiles
['fnumfiles']);
6741 lcfx
= int(listcatfiles
['fnumfiles']);
6742 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6743 lcfx
= int(lenlist
);
6745 lcfx
= int(listcatfiles
['fnumfiles']);
6751 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
6752 funame
= userinfo
.pw_name
;
6761 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
6762 fgname
= groupinfo
.gr_name
;
6768 VerbosePrintOut(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6769 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6770 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6771 listcatfiles
['ffilelist'][lcfi
]['fcontents'].seek(0, 0);
6772 shutil
.copyfileobj(listcatfiles
['ffilelist'][lcfi
]['fcontents'], fpc
);
6775 os
.fsync(fpc
.fileno());
6776 except io
.UnsupportedOperation
:
6778 except AttributeError:
6780 except OSError as e
:
6782 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6783 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6784 if(preservepermissions
):
6785 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6787 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6788 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6790 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6791 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6792 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6797 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6798 funame
= userinfo
.pw_name
;
6807 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6808 fgname
= groupinfo
.gr_name
;
6813 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6814 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6815 flinkinfo
['fcontents'].seek(0, 0);
6816 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6819 os
.fsync(fpc
.fileno());
6820 except io
.UnsupportedOperation
:
6822 except AttributeError:
6824 except OSError as e
:
6826 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6827 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6828 if(preservepermissions
):
6829 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6831 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6832 if(flinkinfo
['ftype']==1):
6833 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6834 if(flinkinfo
['ftype']==2):
6835 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6836 if(flinkinfo
['ftype']==5):
6837 if(preservepermissions
):
6838 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6840 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6841 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6842 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6843 if(preservepermissions
):
6844 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6846 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6847 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6848 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6850 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6851 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6853 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6854 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6855 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6860 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6861 funame
= userinfo
.pw_name
;
6870 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6871 fgname
= groupinfo
.gr_name
;
6876 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6877 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6878 flinkinfo
['fcontents'].seek(0, 0);
6879 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6882 os
.fsync(fpc
.fileno());
6883 except io
.UnsupportedOperation
:
6885 except AttributeError:
6887 except OSError as e
:
6889 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6890 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6891 if(preservepermissions
):
6892 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6894 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6895 if(flinkinfo
['ftype']==1):
6896 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6897 if(flinkinfo
['ftype']==2):
6898 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6899 if(flinkinfo
['ftype']==5):
6900 if(preservepermissions
):
6901 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6903 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6904 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6905 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6906 if(preservepermissions
):
6907 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6909 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6910 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6911 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6913 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6914 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6915 if(preservepermissions
):
6916 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6918 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6919 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6920 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6921 if(preservepermissions
):
6922 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6924 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6925 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
6926 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6929 return listcatfiles
['ffilelist']['catfp'];
6933 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
6935 if(hasattr(shutil
, "register_unpack_format")):
6936 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
6937 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_dict__
['format_delimiter'], False, False);
6938 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
6940 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6941 formatspecs
= FormatSpecsListToDict(formatspecs
);
6942 catfp
= BytesIO(catstr
);
6943 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6944 return listcatfiles
;
6946 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
6948 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6949 formatspecs
= FormatSpecsListToDict(formatspecs
);
6950 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6951 if(isinstance(infile
, dict)):
6952 listcatfiles
= infile
;
6954 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6955 infile
= RemoveWindowsPath(infile
);
6956 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, False, skipchecksum
, formatspecs
, returnfp
);
6957 if(not listcatfiles
):
6959 lenlist
= len(listcatfiles
['ffilelist']);
6960 fnumfiles
= int(listcatfiles
['fnumfiles']);
6962 lcfx
= int(listcatfiles
['fnumfiles']);
6963 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6964 lcfx
= int(lenlist
);
6966 lcfx
= int(listcatfiles
['fnumfiles']);
6969 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
6971 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
6973 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' } };
6974 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
6975 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6976 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6977 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6978 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6979 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
6980 if(len(fuprint
)<=0):
6981 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
6982 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
6983 if(len(fgprint
)<=0):
6984 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
6985 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
));
6988 return listcatfiles
['catfp'];
6992 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
6994 def ArchiveFileStringListFiles(catstr
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6995 formatspecs
= FormatSpecsListToDict(formatspecs
);
6996 catfp
= BytesIO(catstr
);
6997 listcatfiles
= ArchiveFileListFiles(catstr
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6998 return listcatfiles
;
7000 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileStringListFiles
);
7002 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
7003 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7006 if(hasattr(sys
.stdin
, "buffer")):
7007 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7009 shutil
.copyfileobj(sys
.stdin
, infile
);
7014 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7015 infile
= download_file_from_internet_file(infile
);
7020 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7022 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
7024 if(not tarfile
.TarFileCheck(infile
)):
7026 except AttributeError:
7027 if(not TarFileCheck(infile
)):
7032 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
7033 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
7035 tarfp
= tarfile
.open(infile
, "r");
7036 except FileNotFoundError
:
7040 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
7041 returnval
.update({lcfi
: member
.name
});
7042 fpremode
= member
.mode
;
7043 ffullmode
= member
.mode
;
7047 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7049 elif(member
.isdev()):
7050 ffullmode
= member
.mode
;
7052 elif(member
.islnk()):
7053 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7055 elif(member
.issym()):
7056 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
7058 elif(member
.ischr()):
7059 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
7061 elif(member
.isblk()):
7062 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
7064 elif(member
.isdir()):
7065 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
7067 elif(member
.isfifo()):
7068 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
7070 elif(member
.issparse()):
7071 ffullmode
= member
.mode
;
7074 VerbosePrintOut(member
.name
);
7076 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' } };
7077 printfname
= member
.name
;
7079 printfname
= member
.name
+ " link to " + member
.linkname
;
7080 elif(member
.issym()):
7081 printfname
= member
.name
+ " -> " + member
.linkname
;
7082 fuprint
= member
.uname
;
7083 if(len(fuprint
)<=0):
7084 fuprint
= member
.uid
;
7085 fgprint
= member
.gname
;
7086 if(len(fgprint
)<=0):
7087 fgprint
= member
.gid
;
7088 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
));
7091 return listcatfiles
['catfp'];
7095 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7096 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7099 if(hasattr(sys
.stdin
, "buffer")):
7100 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7102 shutil
.copyfileobj(sys
.stdin
, infile
);
7107 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7108 infile
= download_file_from_internet_file(infile
);
7113 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7117 if(not zipfile
.is_zipfile(infile
)):
7120 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
7121 except FileNotFoundError
:
7125 ziptest
= zipfp
.testzip();
7127 VerbosePrintOut("Bad file found!");
7128 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
7129 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
7130 fwinattributes
= int(zipinfo
.external_attr
);
7131 if(not member
.is_dir()):
7132 fmode
= int(stat
.S_IFREG
+ 438);
7133 fchmode
= int(stat
.S_IMODE(fmode
));
7134 ftypemod
= int(stat
.S_IFMT(fmode
));
7135 elif(member
.is_dir()):
7136 fmode
= int(stat
.S_IFDIR
+ 511);
7137 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7138 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7139 elif(zipinfo
.create_system
==3):
7140 fwinattributes
=int(0);
7141 fmode
= int(zipinfo
.external_attr
);
7142 fchmode
= int(stat
.S_IMODE(fmode
));
7143 ftypemod
= int(stat
.S_IFMT(fmode
));
7145 fwinattributes
= int(0);
7146 if(not member
.is_dir()):
7147 fmode
= int(stat
.S_IFREG
+ 438);
7148 fchmode
= int(stat
.S_IMODE(fmode
));
7149 ftypemod
= int(stat
.S_IFMT(fmode
));
7150 elif(member
.is_dir()):
7151 fmode
= int(stat
.S_IFDIR
+ 511);
7152 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7153 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7154 returnval
.update({lcfi
: member
.filename
});
7156 VerbosePrintOut(member
.filename
);
7158 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' } };
7160 for fmodval
in str(oct(fmode
))[-3:]:
7161 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7162 if(not member
.is_dir()):
7164 permissionstr
= "-" + permissionstr
;
7165 elif(member
.is_dir()):
7167 permissionstr
= "d" + permissionstr
;
7168 printfname
= member
.filename
;
7170 fuid
= int(os
.getuid());
7171 except AttributeError:
7176 fgid
= int(os
.getgid());
7177 except AttributeError:
7184 userinfo
= pwd
.getpwuid(os
.getuid());
7185 funame
= userinfo
.pw_name
;
7188 except AttributeError:
7196 groupinfo
= grp
.getgrgid(os
.getgid());
7197 fgname
= groupinfo
.gr_name
;
7200 except AttributeError:
7205 if(len(fuprint
)<=0):
7206 fuprint
= str(fuid
);
7208 if(len(fgprint
)<=0):
7209 fgprint
= str(fgid
);
7210 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
));
7213 return listcatfiles
['catfp'];
7217 if(not rarfile_support
):
7218 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7219 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7220 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7223 if(rarfile_support
):
7224 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7225 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7226 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7228 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
7232 rarfp
= rarfile
.RarFile(infile
, "r");
7233 rartest
= rarfp
.testrar();
7235 VerbosePrintOut("Bad file found!");
7236 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
7239 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
7242 member
.external_attr
7244 except AttributeError:
7246 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
7249 member
.external_attr
7251 except AttributeError:
7256 if(is_unix
and member
.external_attr
!=0):
7257 fpremode
= int(member
.external_attr
);
7258 elif(member
.is_file()):
7259 fpremode
= int(stat
.S_IFREG
+ 438);
7260 elif(member
.is_symlink()):
7261 fpremode
= int(stat
.S_IFLNK
+ 438);
7262 elif(member
.is_dir()):
7263 fpremode
= int(stat
.S_IFDIR
+ 511);
7264 if(is_windows
and member
.external_attr
!=0):
7265 fwinattributes
= int(member
.external_attr
);
7267 fwinattributes
= int(0);
7268 if(is_unix
and member
.external_attr
!=0):
7269 fmode
= int(member
.external_attr
);
7270 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
7271 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
7272 elif(member
.is_file()):
7273 fmode
= int(stat
.S_IFREG
+ 438);
7274 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
7275 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
7276 elif(member
.is_symlink()):
7277 fmode
= int(stat
.S_IFLNK
+ 438);
7278 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7279 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7280 elif(member
.is_dir()):
7281 fmode
= int(stat
.S_IFDIR
+ 511);
7282 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7283 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7284 returnval
.update({lcfi
: member
.filename
});
7286 VerbosePrintOut(member
.filename
);
7288 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' } };
7290 for fmodval
in str(oct(fmode
))[-3:]:
7291 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7292 if(member
.is_file()):
7294 permissionstr
= "-" + permissionstr
;
7295 printfname
= member
.filename
;
7296 elif(member
.is_symlink()):
7298 permissionstr
= "l" + permissionstr
;
7299 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
7300 elif(member
.is_dir()):
7302 permissionstr
= "d" + permissionstr
;
7303 printfname
= member
.filename
;
7305 fuid
= int(os
.getuid());
7306 except AttributeError:
7311 fgid
= int(os
.getgid());
7312 except AttributeError:
7319 userinfo
= pwd
.getpwuid(os
.getuid());
7320 funame
= userinfo
.pw_name
;
7323 except AttributeError:
7331 groupinfo
= grp
.getgrgid(os
.getgid());
7332 fgname
= groupinfo
.gr_name
;
7335 except AttributeError:
7340 if(len(fuprint
)<=0):
7341 fuprint
= str(fuid
);
7343 if(len(fgprint
)<=0):
7344 fgprint
= str(fgid
);
7345 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7348 return listcatfiles
['catfp'];
7352 if(not py7zr_support
):
7353 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7354 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7355 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7359 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7360 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7361 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7365 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
7366 file_content
= szpfp
.readall();
7367 #sztest = szpfp.testzip();
7368 sztestalt
= szpfp
.test();
7370 VerbosePrintOut("Bad file found!");
7371 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
7372 if(re
.findall("^[.|/]", member
.filename
)):
7373 fname
= member
.filename
;
7375 fname
= "./"+member
.filename
;
7376 if(not member
.is_directory
):
7377 fpremode
= int(stat
.S_IFREG
+ 438);
7378 elif(member
.is_directory
):
7379 fpremode
= int(stat
.S_IFDIR
+ 511);
7380 fwinattributes
= int(0);
7381 if(member
.is_directory
):
7382 fmode
= int(stat
.S_IFDIR
+ 511);
7383 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7384 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7386 fmode
= int(stat
.S_IFLNK
+ 438);
7387 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7388 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7389 returnval
.update({lcfi
: member
.filename
});
7391 VerbosePrintOut(member
.filename
);
7393 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' } };
7395 for fmodval
in str(oct(fmode
))[-3:]:
7396 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7398 if(not member
.is_directory
):
7400 permissionstr
= "-" + permissionstr
;
7401 printfname
= member
.filename
;
7402 elif(member
.is_directory
):
7404 permissionstr
= "d" + permissionstr
;
7405 printfname
= member
.filename
;
7407 fsize
= len(file_content
[member
.filename
].read());
7408 file_content
[member
.filename
].close();
7410 fuid
= int(os
.getuid());
7411 except AttributeError:
7416 fgid
= int(os
.getgid());
7417 except AttributeError:
7424 userinfo
= pwd
.getpwuid(os
.getuid());
7425 funame
= userinfo
.pw_name
;
7428 except AttributeError:
7436 groupinfo
= grp
.getgrgid(os
.getgid());
7437 fgname
= groupinfo
.gr_name
;
7440 except AttributeError:
7445 if(len(fuprint
)<=0):
7446 fuprint
= str(fuid
);
7448 if(len(fgprint
)<=0):
7449 fgprint
= str(fgid
);
7450 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(fsize
).rjust(15) + " " + member
.creationtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7453 return listcatfiles
['catfp'];
7457 def InFileListFiles(infile
, verbose
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
7458 formatspecs
= FormatSpecsListToDict(formatspecs
);
7459 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7460 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
7461 if(checkcompressfile
=="tarfile"):
7462 return TarFileListFiles(infile
, verbose
, returnfp
);
7463 elif(checkcompressfile
=="zipfile"):
7464 return ZipFileListFiles(infile
, verbose
, returnfp
);
7465 elif(checkcompressfile
=="catfile"):
7466 return ArchiveFileListFiles(infile
, 0, 0, False, formatspecs
, verbose
, returnfp
);
7467 elif(rarfile_support
and checkcompressfile
=="rarfile"):
7468 return RarFileListFiles(infile
, verbose
, returnfp
);
7469 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
7470 return SevenZipFileListFiles(infile
, verbose
, returnfp
);
7475 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):
7476 formatspecs
= FormatSpecsListToDict(formatspecs
);
7477 outarray
= BytesIO();
7478 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
7479 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7480 return listcatfiles
;
7482 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):
7483 formatspecs
= FormatSpecsListToDict(formatspecs
);
7484 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
7485 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7486 return listcatfiles
;
7488 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):
7489 formatspecs
= FormatSpecsListToDict(formatspecs
);
7490 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
7491 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
7492 return listcatfiles
;
7494 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
7496 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7497 formatspecs
= FormatSpecsListToDict(formatspecs
);
7498 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7499 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7500 return listcatfiles
;
7502 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
7504 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7505 formatspecs
= FormatSpecsListToDict(formatspecs
);
7506 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7507 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7508 return listcatfiles
;
7510 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
7512 if(not rarfile_support
):
7513 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7516 if(rarfile_support
):
7517 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7518 formatspecs
= FormatSpecsListToDict(formatspecs
);
7519 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7520 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7521 return listcatfiles
;
7523 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
7525 if(not py7zr_support
):
7526 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7530 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7531 formatspecs
= FormatSpecsListToDict(formatspecs
);
7532 outarray
= SevenZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7533 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7534 return listcatfiles
;
7536 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFileAlt", PackArchiveFileFromSevenZipFileAlt
);
7538 def download_file_from_ftp_file(url
):
7539 urlparts
= urlparse(url
);
7540 file_name
= os
.path
.basename(urlparts
.path
);
7541 file_dir
= os
.path
.dirname(urlparts
.path
);
7542 if(urlparts
.username
is not None):
7543 ftp_username
= urlparts
.username
;
7545 ftp_username
= "anonymous";
7546 if(urlparts
.password
is not None):
7547 ftp_password
= urlparts
.password
;
7548 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7549 ftp_password
= "anonymous";
7552 if(urlparts
.scheme
=="ftp"):
7554 elif(urlparts
.scheme
=="ftps" and ftpssl
):
7558 if(urlparts
.scheme
=="sftp"):
7560 return download_file_from_pysftp_file(url
);
7562 return download_file_from_sftp_file(url
);
7563 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7564 return download_file_from_http_file(url
);
7565 ftp_port
= urlparts
.port
;
7566 if(urlparts
.port
is None):
7569 ftp
.connect(urlparts
.hostname
, ftp_port
);
7570 except socket
.gaierror
:
7571 log
.info("Error With URL "+url
);
7573 except socket
.timeout
:
7574 log
.info("Error With URL "+url
);
7576 ftp
.login(urlparts
.username
, urlparts
.password
);
7577 if(urlparts
.scheme
=="ftps"):
7579 ftpfile
= BytesIO();
7580 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
7581 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
7586 def download_file_from_ftp_string(url
):
7587 ftpfile
= download_file_from_ftp_file(url
);
7588 return ftpfile
.read();
7590 def upload_file_to_ftp_file(ftpfile
, url
):
7591 urlparts
= urlparse(url
);
7592 file_name
= os
.path
.basename(urlparts
.path
);
7593 file_dir
= os
.path
.dirname(urlparts
.path
);
7594 if(urlparts
.username
is not None):
7595 ftp_username
= urlparts
.username
;
7597 ftp_username
= "anonymous";
7598 if(urlparts
.password
is not None):
7599 ftp_password
= urlparts
.password
;
7600 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7601 ftp_password
= "anonymous";
7604 if(urlparts
.scheme
=="ftp"):
7606 elif(urlparts
.scheme
=="ftps" and ftpssl
):
7610 if(urlparts
.scheme
=="sftp"):
7612 return upload_file_to_pysftp_file(url
);
7614 return upload_file_to_sftp_file(url
);
7615 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7617 ftp_port
= urlparts
.port
;
7618 if(urlparts
.port
is None):
7621 ftp
.connect(urlparts
.hostname
, ftp_port
);
7622 except socket
.gaierror
:
7623 log
.info("Error With URL "+url
);
7625 except socket
.timeout
:
7626 log
.info("Error With URL "+url
);
7628 ftp
.login(urlparts
.username
, urlparts
.password
);
7629 if(urlparts
.scheme
=="ftps"):
7631 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
7636 def upload_file_to_ftp_string(ftpstring
, url
):
7637 ftpfileo
= BytesIO(ftpstring
);
7638 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
7642 def download_file_from_http_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7643 # Parse the URL to extract username and password if present
7644 urlparts
= urlparse(url
);
7645 username
= urlparts
.username
;
7646 password
= urlparts
.password
;
7647 # Rebuild the URL without the username and password
7648 netloc
= urlparts
.hostname
;
7649 if(urlparts
.scheme
=="sftp"):
7651 return download_file_from_pysftp_file(url
);
7653 return download_file_from_sftp_file(url
);
7654 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7655 return download_file_from_ftp_file(url
);
7657 netloc
+= ':' + str(urlparts
.port
);
7658 rebuilt_url
= urlunparse((urlparts
.scheme
, netloc
, urlparts
.path
, urlparts
.params
, urlparts
.query
, urlparts
.fragment
));
7659 # Create a temporary file object
7660 httpfile
= BytesIO();
7662 # Use the requests library if available
7663 if username
and password
:
7664 response
= requests
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
), stream
=True);
7666 response
= requests
.get(rebuilt_url
, headers
=headers
, stream
=True);
7667 response
.raw
.decode_content
= True
7668 shutil
.copyfileobj(response
.raw
, httpfile
);
7670 # Build a Request object for urllib
7671 request
= Request(rebuilt_url
, headers
=headers
);
7672 # Create an opener object for handling URLs
7673 if username
and password
:
7674 # Create a password manager
7675 password_mgr
= HTTPPasswordMgrWithDefaultRealm();
7676 # Add the username and password
7677 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
7678 # Create an authentication handler using the password manager
7679 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
7680 # Build the opener with the authentication handler
7681 opener
= build_opener(auth_handler
);
7683 opener
= build_opener();
7684 with opener
.open(request
) as response
:
7685 shutil
.copyfileobj(response
, httpfile
);
7686 # Reset file pointer to the start
7687 httpfile
.seek(0, 0);
7688 # Return the temporary file object
7691 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7692 httpfile
= download_file_from_http_file(url
, headers
);
7693 return ftpfile
.read();
7696 def download_file_from_sftp_file(url
):
7697 urlparts
= urlparse(url
);
7698 file_name
= os
.path
.basename(urlparts
.path
);
7699 file_dir
= os
.path
.dirname(urlparts
.path
);
7700 sftp_port
= urlparts
.port
;
7701 if(urlparts
.port
is None):
7704 sftp_port
= urlparts
.port
;
7705 if(urlparts
.username
is not None):
7706 sftp_username
= urlparts
.username
;
7708 sftp_username
= "anonymous";
7709 if(urlparts
.password
is not None):
7710 sftp_password
= urlparts
.password
;
7711 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7712 sftp_password
= "anonymous";
7715 if(urlparts
.scheme
=="ftp"):
7716 return download_file_from_ftp_file(url
);
7717 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7718 return download_file_from_http_file(url
);
7719 if(urlparts
.scheme
!="sftp"):
7721 ssh
= paramiko
.SSHClient();
7722 ssh
.load_system_host_keys();
7723 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7725 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7726 except paramiko
.ssh_exception
.SSHException
:
7728 except socket
.gaierror
:
7729 log
.info("Error With URL "+url
);
7731 except socket
.timeout
:
7732 log
.info("Error With URL "+url
);
7734 sftp
= ssh
.open_sftp();
7735 sftpfile
= BytesIO();
7736 sftp
.getfo(urlparts
.path
, sftpfile
);
7739 sftpfile
.seek(0, 0);
7742 def download_file_from_sftp_file(url
):
7746 def download_file_from_sftp_string(url
):
7747 sftpfile
= download_file_from_sftp_file(url
);
7748 return sftpfile
.read();
7750 def download_file_from_ftp_string(url
):
7754 def upload_file_to_sftp_file(sftpfile
, url
):
7755 urlparts
= urlparse(url
);
7756 file_name
= os
.path
.basename(urlparts
.path
);
7757 file_dir
= os
.path
.dirname(urlparts
.path
);
7758 sftp_port
= urlparts
.port
;
7759 if(urlparts
.port
is None):
7762 sftp_port
= urlparts
.port
;
7763 if(urlparts
.username
is not None):
7764 sftp_username
= urlparts
.username
;
7766 sftp_username
= "anonymous";
7767 if(urlparts
.password
is not None):
7768 sftp_password
= urlparts
.password
;
7769 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7770 sftp_password
= "anonymous";
7773 if(urlparts
.scheme
=="ftp"):
7774 return upload_file_to_ftp_file(url
);
7775 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7777 if(urlparts
.scheme
!="sftp"):
7779 ssh
= paramiko
.SSHClient();
7780 ssh
.load_system_host_keys();
7781 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7783 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7784 except paramiko
.ssh_exception
.SSHException
:
7786 except socket
.gaierror
:
7787 log
.info("Error With URL "+url
);
7789 except socket
.timeout
:
7790 log
.info("Error With URL "+url
);
7792 sftp
= ssh
.open_sftp();
7793 sftp
.putfo(sftpfile
, urlparts
.path
);
7796 sftpfile
.seek(0, 0);
7799 def upload_file_to_sftp_file(sftpfile
, url
):
7803 def upload_file_to_sftp_string(sftpstring
, url
):
7804 sftpfileo
= BytesIO(sftpstring
);
7805 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
7809 def upload_file_to_sftp_string(url
):
7813 def download_file_from_pysftp_file(url
):
7814 urlparts
= urlparse(url
);
7815 file_name
= os
.path
.basename(urlparts
.path
);
7816 file_dir
= os
.path
.dirname(urlparts
.path
);
7817 sftp_port
= urlparts
.port
;
7818 if(urlparts
.port
is None):
7821 sftp_port
= urlparts
.port
;
7822 if(urlparts
.username
is not None):
7823 sftp_username
= urlparts
.username
;
7825 sftp_username
= "anonymous";
7826 if(urlparts
.password
is not None):
7827 sftp_password
= urlparts
.password
;
7828 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7829 sftp_password
= "anonymous";
7832 if(urlparts
.scheme
=="ftp"):
7833 return download_file_from_ftp_file(url
);
7834 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7835 return download_file_from_http_file(url
);
7836 if(urlparts
.scheme
!="sftp"):
7839 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7840 except paramiko
.ssh_exception
.SSHException
:
7842 except socket
.gaierror
:
7843 log
.info("Error With URL "+url
);
7845 except socket
.timeout
:
7846 log
.info("Error With URL "+url
);
7848 sftp
= ssh
.open_sftp();
7849 sftpfile
= BytesIO();
7850 sftp
.getfo(urlparts
.path
, sftpfile
);
7853 sftpfile
.seek(0, 0);
7856 def download_file_from_pysftp_file(url
):
7860 def download_file_from_pysftp_string(url
):
7861 sftpfile
= download_file_from_pysftp_file(url
);
7862 return sftpfile
.read();
7864 def download_file_from_ftp_string(url
):
7868 def upload_file_to_pysftp_file(sftpfile
, url
):
7869 urlparts
= urlparse(url
);
7870 file_name
= os
.path
.basename(urlparts
.path
);
7871 file_dir
= os
.path
.dirname(urlparts
.path
);
7872 sftp_port
= urlparts
.port
;
7873 if(urlparts
.port
is None):
7876 sftp_port
= urlparts
.port
;
7877 if(urlparts
.username
is not None):
7878 sftp_username
= urlparts
.username
;
7880 sftp_username
= "anonymous";
7881 if(urlparts
.password
is not None):
7882 sftp_password
= urlparts
.password
;
7883 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7884 sftp_password
= "anonymous";
7887 if(urlparts
.scheme
=="ftp"):
7888 return upload_file_to_ftp_file(url
);
7889 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7891 if(urlparts
.scheme
!="sftp"):
7894 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7895 except paramiko
.ssh_exception
.SSHException
:
7897 except socket
.gaierror
:
7898 log
.info("Error With URL "+url
);
7900 except socket
.timeout
:
7901 log
.info("Error With URL "+url
);
7903 sftp
= ssh
.open_sftp();
7904 sftp
.putfo(sftpfile
, urlparts
.path
);
7907 sftpfile
.seek(0, 0);
7910 def upload_file_to_pysftp_file(sftpfile
, url
):
7914 def upload_file_to_pysftp_string(sftpstring
, url
):
7915 sftpfileo
= BytesIO(sftpstring
);
7916 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
7920 def upload_file_to_pysftp_string(url
):
7923 def download_file_from_internet_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7924 urlparts
= urlparse(url
);
7925 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7926 return download_file_from_http_file(url
, headers
);
7927 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7928 return download_file_from_ftp_file(url
);
7929 elif(urlparts
.scheme
=="sftp"):
7930 if(__use_pysftp__
and havepysftp
):
7931 return download_file_from_pysftp_file(url
);
7933 return download_file_from_sftp_file(url
);
7938 def download_file_from_internet_uncompress_file(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_dict__
):
7939 formatspecs
= FormatSpecsListToDict(formatspecs
);
7940 fp
= download_file_from_internet_file(url
);
7941 fp
= UncompressArchiveFile(fp
, formatspecs
);
7947 def download_file_from_internet_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7948 urlparts
= urlparse(url
);
7949 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7950 return download_file_from_http_string(url
, headers
);
7951 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7952 return download_file_from_ftp_string(url
);
7953 elif(urlparts
.scheme
=="sftp"):
7954 if(__use_pysftp__
and havepysftp
):
7955 return download_file_from_pysftp_string(url
);
7957 return download_file_from_sftp_string(url
);
7962 def download_file_from_internet_uncompress_string(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_dict__
):
7963 formatspecs
= FormatSpecsListToDict(formatspecs
);
7964 fp
= download_file_from_internet_string(url
);
7965 fp
= UncompressArchiveFile(fp
, formatspecs
);
7971 def upload_file_to_internet_file(ifp
, url
):
7972 urlparts
= urlparse(url
);
7973 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7975 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7976 return upload_file_to_ftp_file(ifp
, url
);
7977 elif(urlparts
.scheme
=="sftp"):
7978 if(__use_pysftp__
and havepysftp
):
7979 return upload_file_to_pysftp_file(ifp
, url
);
7981 return upload_file_to_sftp_file(ifp
, url
);
7986 def upload_file_to_internet_compress_file(ifp
, url
, formatspecs
=__file_format_dict__
):
7987 formatspecs
= FormatSpecsListToDict(formatspecs
);
7988 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
7992 upload_file_to_internet_file(catfp
, outfile
);
7995 def upload_file_to_internet_string(ifp
, url
):
7996 urlparts
= urlparse(url
);
7997 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7999 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8000 return upload_file_to_ftp_string(ifp
, url
);
8001 elif(urlparts
.scheme
=="sftp"):
8002 if(__use_pysftp__
and havepysftp
):
8003 return upload_file_to_pysftp_string(ifp
, url
);
8005 return upload_file_to_sftp_string(ifp
, url
);
8010 def upload_file_to_internet_compress_string(ifp
, url
, formatspecs
=__file_format_dict__
):
8011 formatspecs
= FormatSpecsListToDict(formatspecs
);
8012 catfp
= CompressArchiveFile(BytesIO(ifp
), compression
, compressionlevel
, formatspecs
);
8016 upload_file_to_internet_file(catfp
, outfile
);
8020 if(hasattr(shutil
, "register_archive_format")):
8021 # Register the packing format
8022 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
8023 except shutil
.RegistryError
:
8027 if(hasattr(shutil
, "register_unpack_format")):
8028 # Register the unpacking format
8029 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
8030 except shutil
.RegistryError
: