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: 6/2/2024 Ver. 0.12.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 import simplejson
as json
;
41 from urllib
.parse
import urlparse
, urlunparse
;
43 from urlparse
import urlparse
, urlunparse
;
45 # Windows-specific setup
47 if sys
.version_info
[0] == 2:
49 sys
.stdout
= codecs
.getwriter('utf-8')(sys
.stdout
);
50 sys
.stderr
= codecs
.getwriter('utf-8')(sys
.stderr
);
52 sys
.stdout
= io
.TextIOWrapper(sys
.stdout
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
53 sys
.stderr
= io
.TextIOWrapper(sys
.stderr
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
55 hashlib_guaranteed
= False;
57 os
.environ
["PYTHONIOENCODING"] = "UTF-8";
58 os
.environ
["LC_CTYPE"] = "UTF-8";
60 # Reload sys to set default encoding to UTF-8 (Python 2 only)
61 if sys
.version_info
[0] == 2:
64 sys
.setdefaultencoding('UTF-8');
65 except (NameError, AttributeError):
70 from zlib
import crc32
;
72 from binascii
import crc32
;
74 # Define FileNotFoundError for Python 2
78 FileNotFoundError
= IOError;
81 rarfile_support
= False;
84 rarfile_support
= True;
89 py7zr_support
= False;
98 from xtarfile
import is_tarfile
;
101 from safetar
import is_tarfile
;
103 from tarfile
import is_tarfile
;
107 import xtarfile
as tarfile
;
110 import safetar
as tarfile
;
115 haveparamiko
= False;
131 haverequests
= False;
136 logging
.getLogger("urllib3").setLevel(logging
.WARNING
);
140 # HTTP and URL parsing
142 from urllib
.request
import Request
, build_opener
, HTTPBasicAuthHandler
;
143 from urllib
.parse
import urlparse
;
145 from urllib2
import Request
, build_opener
, HTTPBasicAuthHandler
;
146 from urlparse
import urlparse
;
148 # StringIO and BytesIO
150 from io
import StringIO
, BytesIO
;
153 from cStringIO
import StringIO
;
154 from cStringIO
import StringIO
as BytesIO
;
156 from StringIO
import StringIO
;
157 from StringIO
import StringIO
as BytesIO
;
159 __use_pysftp__
= False;
161 __use_pysftp__
= False;
162 __file_format_name__
= "CatFile";
163 __program_name__
= "Py"+__file_format_name__
;
164 __file_format_lower__
= __file_format_name__
.lower();
165 __file_format_magic__
= __file_format_name__
;
166 __file_format_len__
= len(__file_format_magic__
);
167 __file_format_hex__
= binascii
.hexlify(__file_format_magic__
.encode("UTF-8")).decode("UTF-8");
168 __file_format_delimiter__
= "\x00";
169 __file_format_ver__
= "001";
170 __use_new_style__
= True;
171 __use_advanced_list__
= True;
172 __use_alt_inode__
= False;
173 __file_format_extension__
= ".cat";
175 __file_format_name__ = "FastArchive";
176 __program_name__ = "Py" + __file_format_name__;
177 __file_format_lower__ = __file_format_name__.lower();
178 __file_format_magic__ = "FstArch";
179 __file_format_len__ = len(__file_format_magic__);
180 __file_format_hex__ = binascii.hexlify(__file_format_magic__.encode("UTF-8")).decode("UTF-8");
181 __file_format_delimiter__ = "\x1F"; # Using a non-printable ASCII character as delimiter
182 __file_format_ver__ = "001";
183 __use_new_style__ = True;
184 __use_advanced_list__ = False;
185 __use_alt_inode__ = False;
186 __file_format_extension__ = ".fast";
188 __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__
];
189 __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__
};
190 __project__
= __program_name__
;
191 __project_url__
= "https://github.com/GameMaker2k/PyCatFile";
192 __version_info__
= (0, 12, 4, "RC 1", 1);
193 __version_date_info__
= (2024, 6, 2, "RC 1", 1);
194 __version_date__
= str(__version_date_info__
[0]) + "." + str(__version_date_info__
[1]).zfill(2) + "." + str(__version_date_info__
[2]).zfill(2);
195 __revision__
= __version_info__
[3];
196 __revision_id__
= "$Id$";
197 if(__version_info__
[4] is not None):
198 __version_date_plusrc__
= __version_date__
+ "-" + str(__version_date_info__
[4]);
199 if(__version_info__
[4] is None):
200 __version_date_plusrc__
= __version_date__
;
201 if(__version_info__
[3] is not None):
202 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]) + " " + str(__version_info__
[3]);
203 if(__version_info__
[3] is None):
204 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]);
206 PyBitness
= platform
.architecture();
207 if(PyBitness
=="32bit" or PyBitness
=="32"):
209 elif(PyBitness
=="64bit" or PyBitness
=="64"):
214 geturls_ua_pycatfile_python
= "Mozilla/5.0 (compatible; {proname}/{prover}; +{prourl})".format(proname
=__project__
, prover
=__version__
, prourl
=__project_url__
);
215 if(platform
.python_implementation()!=""):
216 py_implementation
= platform
.python_implementation();
217 if(platform
.python_implementation()==""):
218 py_implementation
= "Python";
219 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__
);
220 geturls_ua_googlebot_google
= "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
221 geturls_ua_googlebot_google_old
= "Googlebot/2.1 (+http://www.google.com/bot.html)";
222 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
)};
223 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
)};
224 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"};
225 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"};
227 compressionsupport
= [];
230 compressionsupport
.append("gz");
231 compressionsupport
.append("gzip");
236 compressionsupport
.append("bz2");
237 compressionsupport
.append("bzip2");
242 compressionsupport
.append("lz4");
247 compressionsupport
.append("lzo");
248 compressionsupport
.append("lzop");
253 compressionsupport
.append("zstd");
254 compressionsupport
.append("zstandard");
259 compressionsupport
.append("lzma");
260 compressionsupport
.append("xz");
263 from backports
import lzma
;
264 compressionsupport
.append("lzma");
265 compressionsupport
.append("xz");
269 compressionlist
= ['auto'];
270 compressionlistalt
= [];
273 if('gzip' in compressionsupport
):
274 compressionlist
.append('gzip');
275 compressionlistalt
.append('gzip');
276 outextlist
.append('gz');
277 outextlistwd
.append('.gz');
278 if('bzip2' in compressionsupport
):
279 compressionlist
.append('bzip2');
280 compressionlistalt
.append('bzip2');
281 outextlist
.append('bz2');
282 outextlistwd
.append('.bz2');
283 if('zstd' in compressionsupport
):
284 compressionlist
.append('zstd');
285 compressionlistalt
.append('zstd');
286 outextlist
.append('zst');
287 outextlistwd
.append('.zst');
288 if('lz4' in compressionsupport
):
289 compressionlist
.append('lz4');
290 compressionlistalt
.append('lz4');
291 outextlist
.append('lz4');
292 outextlistwd
.append('.lz4');
293 if('lzo' in compressionsupport
):
294 compressionlist
.append('lzo');
295 compressionlistalt
.append('lzo');
296 outextlist
.append('lzo');
297 outextlistwd
.append('.lzo');
298 if('lzop' in compressionsupport
):
299 compressionlist
.append('lzop');
300 compressionlistalt
.append('lzop');
301 outextlist
.append('lzop');
302 outextlistwd
.append('.lzop');
303 if('lzma' in compressionsupport
):
304 compressionlist
.append('lzma');
305 compressionlistalt
.append('lzma');
306 outextlist
.append('lzma');
307 outextlistwd
.append('.lzma');
308 if('xz' in compressionsupport
):
309 compressionlist
.append('xz');
310 compressionlistalt
.append('xz');
311 outextlist
.append('xz');
312 outextlistwd
.append('.xz');
314 tarfile_mimetype
= "application/tar";
315 tarfile_tar_mimetype
= tarfile_mimetype
;
316 zipfile_mimetype
= "application/zip";
317 zipfile_zip_mimetype
= zipfile_mimetype
;
318 rarfile_mimetype
= "application/rar";
319 rarfile_rar_mimetype
= rarfile_mimetype
;
320 archivefile_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"";
321 archivefile_cat_mimetype
= archivefile_mimetype
;
322 archivefile_gzip_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+gzip";
323 archivefile_gz_mimetype
= archivefile_gzip_mimetype
;
324 archivefile_bzip2_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+bzip2";
325 archivefile_bz2_mimetype
= archivefile_bzip2_mimetype
;
326 archivefile_lz4_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lz4";
327 archivefile_lzop_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lzop";
328 archivefile_lzo_mimetype
= archivefile_lzop_mimetype
;
329 archivefile_zstandard_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+zstandard";
330 archivefile_zstd_mimetype
= archivefile_zstandard_mimetype
;
331 archivefile_lzma_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lzma";
332 archivefile_xz_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+xz";
333 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"];
335 if __name__
== "__main__":
337 curscrpath
= os
.path
.dirname(sys
.argv
[0]);
341 curscrpath
= curscrpath
.replace(os
.sep
, "/");
342 curscrpath
= curscrpath
+ "/";
343 scrfile
= curscrpath
+ "catfile.py";
344 if(os
.path
.exists(scrfile
) and os
.path
.isfile(scrfile
)):
345 scrcmd
= subprocess
.Popen([sys
.executable
, scrfile
] + sys
.argv
[1:]);
348 def VerbosePrintOut(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
354 "warning": logging
.warning
,
355 "error": logging
.error
,
356 "critical": logging
.critical
,
357 "exception": logging
.exception
,
358 "logalt": lambda x
: logging
.log(dgblevel
, x
),
359 "debug": logging
.debug
361 log_function
= log_functions
.get(outtype
);
363 log_function(dbgtxt
);
367 def VerbosePrintOutReturn(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
368 VerbosePrintOut(dbgtxt
, outtype
, dbgenable
, dgblevel
);
371 def RemoveWindowsPath(dpath
):
375 dpath
= dpath
.replace(os
.path
.sep
, "/");
376 dpath
= dpath
.rstrip("/");
377 if(dpath
=="." or dpath
==".."):
381 def NormalizeRelativePath(inpath
):
382 inpath
= RemoveWindowsPath(inpath
);
383 if(os
.path
.isabs(inpath
)):
386 if(inpath
.startswith("./") or inpath
.startswith("../")):
389 outpath
= "./" + inpath
;
392 def PrependPath(base_dir
, child_path
):
393 # Check if base_dir is None or empty, if so, return child_path as is
396 # Ensure base_dir ends with exactly one slash
397 if not base_dir
.endswith('/'):
399 # Check if child_path starts with ./ or ../ (indicating a relative path)
400 if child_path
.startswith('./') or child_path
.startswith('../'):
401 # For relative paths, we don't alter the child_path
402 return base_dir
+ child_path
;
404 # For non-relative paths, ensure there's no starting slash on child_path to avoid double slashes
405 return base_dir
+ child_path
.lstrip('/');
407 def ListDir(dirpath
, followlink
=False, duplicates
=False):
408 if isinstance(dirpath
, (list, tuple, )):
409 dirpath
= list(filter(None, dirpath
));
410 elif isinstance(dirpath
, str):
411 dirpath
= list(filter(None, [dirpath
]));
413 fs_encoding
= sys
.getfilesystemencoding();
414 for mydirfile
in dirpath
:
415 if not os
.path
.exists(mydirfile
):
417 mydirfile
= NormalizeRelativePath(mydirfile
);
418 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
):
419 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
420 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
421 for root
, dirs
, filenames
in os
.walk(mydirfile
):
423 dpath
= RemoveWindowsPath(dpath
);
424 if fs_encoding
!= 'utf-8':
425 dpath
= dpath
.encode(fs_encoding
).decode('utf-8');
426 if dpath
not in retlist
and not duplicates
:
427 retlist
.append(dpath
);
429 retlist
.append(dpath
);
430 for file in filenames
:
431 fpath
= os
.path
.join(root
, file);
432 fpath
= RemoveWindowsPath(fpath
);
433 if fs_encoding
!= 'utf-8':
434 fpath
= fpath
.encode(fs_encoding
).decode('utf-8');
435 if fpath
not in retlist
and not duplicates
:
436 retlist
.append(fpath
);
438 retlist
.append(fpath
);
440 path
= RemoveWindowsPath(mydirfile
);
441 if fs_encoding
!= 'utf-8':
442 path
= path
.encode(fs_encoding
).decode('utf-8');
443 retlist
.append(path
);
446 def ListDirAdvanced(dirpath
, followlink
=False, duplicates
=False):
447 if isinstance(dirpath
, (list, tuple, )):
448 dirpath
= list(filter(None, dirpath
));
449 elif isinstance(dirpath
, str):
450 dirpath
= list(filter(None, [dirpath
]));
452 fs_encoding
= sys
.getfilesystemencoding();
453 for mydirfile
in dirpath
:
454 if not os
.path
.exists(mydirfile
):
456 mydirfile
= NormalizeRelativePath(mydirfile
);
457 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
) and followlink
:
458 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
459 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
460 for root
, dirs
, filenames
in os
.walk(mydirfile
):
461 # Sort dirs and filenames alphabetically in place
462 dirs
.sort(key
=lambda x
: x
.lower());
463 filenames
.sort(key
=lambda x
: x
.lower());
464 dpath
= RemoveWindowsPath(root
);
465 if fs_encoding
!= 'utf-8':
466 dpath
= dpath
.encode(fs_encoding
).decode('utf-8');
467 if not duplicates
and dpath
not in retlist
:
468 retlist
.append(dpath
);
470 retlist
.append(dpath
);
471 for file in filenames
:
472 fpath
= os
.path
.join(root
, file);
473 fpath
= RemoveWindowsPath(fpath
);
474 if fs_encoding
!= 'utf-8':
475 fpath
= fpath
.encode(fs_encoding
).decode('utf-8');
476 if not duplicates
and fpath
not in retlist
:
477 retlist
.append(fpath
);
479 retlist
.append(fpath
);
481 path
= RemoveWindowsPath(mydirfile
);
482 if fs_encoding
!= 'utf-8':
483 path
= path
.encode(fs_encoding
).decode('utf-8');
484 retlist
.append(path
);
487 def create_alias_function(prefix
, base_name
, suffix
, target_function
):
488 # Define a new function that wraps the target function
489 def alias_function(*args
, **kwargs
):
490 return target_function(*args
, **kwargs
);
491 # Create the function name by combining the prefix, base name, and the suffix
492 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
);
493 # Add the new function to the global namespace
494 globals()[function_name
] = alias_function
;
496 def create_alias_function_alt(prefix
, base_name
, suffix
, target_function
):
497 # Create the function name by combining the prefix, base name, and the suffix
498 # Use the format method for string formatting, compatible with Python 2 and 3
499 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
)
500 # Add the new function (alias of the target_function) to the global namespace
501 # This line is compatible as-is with both Python 2 and 3
502 globals()[function_name
] = target_function
504 def FormatSpecsListToDict(formatspecs
=__file_format_list__
):
505 if(isinstance(formatspecs
, (list, tuple, ))):
506 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]};
507 elif(isinstance(formatspecs
, (dict, ))):
510 return __file_format_dict__
;
511 return __file_format_dict__
;
513 def TarFileCheck(infile
):
515 if is_tarfile(infile
):
521 # Check if the input is a file object
522 if hasattr(infile
, 'read'):
523 # Save the current file position
524 current_position
= infile
.tell();
525 # Attempt to open the file object as a tar file
526 tar
= tarfile
.open(fileobj
=infile
);
528 # Restore the file position
529 infile
.seek(current_position
);
532 # Assume it's a filename
533 tar
= tarfile
.open(name
=infile
);
536 except tarfile
.TarError
:
539 # initial_value can be 0xFFFF or 0x0000
540 def crc16_ansi(msg
, initial_value
=0xFFFF):
541 # CRC-16-IBM / CRC-16-ANSI polynomial and initial value
542 poly
= 0x8005; # Polynomial for CRC-16-IBM / CRC-16-ANSI
543 crc
= initial_value
; # Initial value
545 crc ^
= b
<< 8; # XOR byte into CRC top byte
546 for _
in range(8): # Process each bit
547 if crc
& 0x8000: # If the top bit is set
548 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
550 crc
= crc
<< 1; # Just shift left
551 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
554 # initial_value can be 0xFFFF or 0x0000
555 def crc16_ibm(msg
, initial_value
=0xFFFF):
556 return crc16_ansi(msg
, initial_value
);
558 # initial_value is 0xFFFF
560 return crc16_ansi(msg
, 0xFFFF);
562 # initial_value can be 0xFFFF, 0x1D0F or 0x0000
563 def crc16_ccitt(msg
, initial_value
=0xFFFF):
564 # CRC-16-CCITT polynomial
565 poly
= 0x1021; # Polynomial for CRC-16-CCITT
566 # Use the specified initial value
569 crc ^
= b
<< 8; # XOR byte into CRC top byte
570 for _
in range(8): # Process each bit
571 if crc
& 0x8000: # If the top bit is set
572 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
574 crc
= crc
<< 1; # Just shift left
575 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
578 # initial_value can be 0x42F0E1EBA9EA3693 or 0x0000000000000000
579 def crc64_ecma(msg
, initial_value
=0x0000000000000000):
580 # CRC-64-ECMA polynomial and initial value
581 poly
= 0x42F0E1EBA9EA3693;
582 crc
= initial_value
; # Initial value for CRC-64-ECMA
584 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
585 for _
in range(8): # Process each bit
586 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
587 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
589 crc
<<= 1; # Just shift left if the MSB is 0
590 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
593 # initial_value can be 0x000000000000001B or 0xFFFFFFFFFFFFFFFF
594 def crc64_iso(msg
, initial_value
=0xFFFFFFFFFFFFFFFF):
595 # CRC-64-ISO polynomial and initial value
596 poly
= 0x000000000000001B;
597 crc
= initial_value
; # Common initial value for CRC-64-ISO
599 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
600 for _
in range(8): # Process each bit
601 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
602 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
604 crc
<<= 1; # Just shift left if the MSB is 0
605 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
608 def GetDataFromArray(data
, path
, default
=None):
612 element
= element
[key
];
614 except (KeyError, TypeError, IndexError):
617 def GetDataFromArrayAlt(structure
, path
, default
=None):
620 if isinstance(element
, dict) and key
in element
:
621 element
= element
[key
];
622 elif isinstance(element
, list) and isinstance(key
, int) and -len(element
) <= key
< len(element
):
623 element
= element
[key
];
628 def GetHeaderChecksum(inlist
=[], checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_dict__
):
629 formatspecs
= FormatSpecsListToDict(formatspecs
);
630 fileheader
= AppendNullBytes(inlist
, formatspecs
['format_delimiter']) if isinstance(inlist
, list) else AppendNullByte(inlist
, formatspecs
['format_delimiter']);
632 fileheader
= fileheader
.encode('UTF-8');
634 "crc16": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
635 "crc16_ansi": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
636 "crc16_ibm": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
637 "crc16_ccitt": lambda data
: format(crc16_ccitt(data
) & 0xffff, '04x').lower(),
638 "adler32": lambda data
: format(zlib
.adler32(data
) & 0xffffffff, '08x').lower(),
639 "crc32": lambda data
: format(crc32(data
) & 0xffffffff, '08x').lower(),
640 "crc64_ecma": lambda data
: format(crc64_ecma(data
) & 0xffffffffffffffff, '016x').lower(),
641 "crc64": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
642 "crc64_iso": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
644 if checksumtype
in checksum_methods
:
645 return checksum_methods
[checksumtype
](fileheader
);
646 elif CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
):
647 checksumoutstr
= hashlib
.new(checksumtype
);
648 checksumoutstr
.update(fileheader
);
649 return checksumoutstr
.hexdigest().lower();
650 return format(0, 'x').lower();
652 def GetFileChecksum(instr
, checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_dict__
):
653 formatspecs
= FormatSpecsListToDict(formatspecs
);
655 instr
= instr
.encode('UTF-8');
657 "crc16": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
658 "crc16_ansi": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
659 "crc16_ibm": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
660 "crc16_ccitt": lambda data
: format(crc16_ccitt(data
) & 0xffff, '04x').lower(),
661 "adler32": lambda data
: format(zlib
.adler32(data
) & 0xffffffff, '08x').lower(),
662 "crc32": lambda data
: format(crc32(data
) & 0xffffffff, '08x').lower(),
663 "crc64_ecma": lambda data
: format(crc64_ecma(data
) & 0xffffffffffffffff, '016x').lower(),
664 "crc64": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
665 "crc64_iso": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
667 if checksumtype
in checksum_methods
:
668 return checksum_methods
[checksumtype
](instr
);
669 elif CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
):
670 checksumoutstr
= hashlib
.new(checksumtype
);
671 checksumoutstr
.update(instr
);
672 return checksumoutstr
.hexdigest().lower();
673 return format(0, 'x').lower();
675 def ValidateHeaderChecksum(inlist
=[], checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_dict__
):
676 formatspecs
= FormatSpecsListToDict(formatspecs
);
677 catfileheadercshex
= GetHeaderChecksum(inlist
, checksumtype
, True, formatspecs
).lower();
678 return inchecksum
.lower() == catfileheadercshex
;
680 def ValidateFileChecksum(infile
, checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_dict__
):
681 formatspecs
= FormatSpecsListToDict(formatspecs
);
682 catinfilecshex
= GetFileChecksum(infile
, checksumtype
, True, formatspecs
).lower();
683 return inchecksum
.lower() == catinfilecshex
;
685 def ReadTillNullByteOld(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
688 nullbyte
= delimiter
.encode("UTF-8");
690 curbyte
= fp
.read(1);
691 if(curbyte
==nullbyte
or not curbyte
):
693 curfullbyte
= curfullbyte
+ curbyte
;
694 return curfullbyte
.decode('UTF-8');
696 def ReadUntilNullByteOld(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
697 return ReadTillNullByteOld(fp
, delimiter
);
699 def ReadTillNullByteAlt(fp
, delimiter
=__file_format_dict__
['format_delimiter'], chunk_size
=1024, max_read
=1024000):
700 delimiter
= delimiter
.encode('UTF-8') # Ensure the delimiter is in bytes
701 buffer = bytearray();
703 delimiter_length
= len(delimiter
);
705 chunk
= fp
.read(chunk_size
)
707 # End of file reached without finding the delimiter
709 buffer.extend(chunk
);
710 total_read
+= len(chunk
);
711 if delimiter
in buffer:
712 # Delimiter found, calculate where to reset the file pointer
713 index
= buffer.find(delimiter
);
714 # Calculate how many extra bytes were read after the delimiter
715 extra_bytes_read
= len(buffer) - (index
+ delimiter_length
);
716 # Move the file pointer back to just after the delimiter
717 fp
.seek(-extra_bytes_read
, 1);
718 buffer = buffer[:index
];
720 if total_read
>= max_read
:
721 # Stop reading if max limit is reached to prevent excessive memory usage
722 raise MemoryError("Maximum read limit reached without finding the delimiter.");
723 # Check for incomplete UTF-8 sequences at the end of the buffer
724 if len(buffer) > 1 and 128 <= buffer[-1] < 192:
725 # This suggests that the last byte might be the start of a multi-byte character
726 # Try to read one more byte to complete the character
727 extra_byte
= fp
.read(1);
729 buffer.extend(extra_byte
);
731 # No more data available
734 return buffer.decode('UTF-8', errors
='replace');
735 except UnicodeDecodeError:
736 return buffer.decode('UTF-8', errors
='replace');
738 def ReadUntilNullByteAlt(fp
, delimiter
=__file_format_dict__
['format_delimiter'], chunk_size
=1024, max_read
=1024000):
739 return ReadTillNullByteAlt(fp
, delimiter
, chunk_size
, max_read
);
741 def ReadTillNullByte(fp
, delimiter
=__file_format_dict__
['format_delimiter'], max_read
=1024000):
742 curfullbyte
= bytearray();
743 nullbyte
= delimiter
.encode("UTF-8");
744 total_read
= 0; # Track the total number of bytes read
746 curbyte
= fp
.read(1);
747 if curbyte
== nullbyte
or not curbyte
:
749 curfullbyte
.extend(curbyte
);
751 if total_read
>= max_read
:
752 raise MemoryError("Maximum read limit reached without finding the delimiter.");
753 # Decode the full byte array to string once out of the loop
755 return curfullbyte
.decode('UTF-8');
756 except UnicodeDecodeError:
757 # Handle potential partial UTF-8 characters
758 for i
in range(1, 4):
760 return curfullbyte
[:-i
].decode('UTF-8');
761 except UnicodeDecodeError:
763 raise; # Re-raise if decoding fails even after trimming
765 def ReadUntilNullByte(fp
, delimiter
=__file_format_dict__
['format_delimiter'], max_read
=1024000):
766 return ReadTillNullByte(fp
, delimiter
, max_read
);
768 def ReadTillNullByteByNum(fp
, delimiter
=__file_format_dict__
['format_delimiter'], num_delimiters
=1, chunk_size
=1024, max_read
=1024000):
769 delimiter
= delimiter
.encode('UTF-8'); # Ensure the delimiter is in bytes
770 buffer = bytearray();
772 delimiter_length
= len(delimiter
);
774 while len(results
) < num_delimiters
:
775 chunk
= fp
.read(chunk_size
);
777 # End of file reached; decode whatever is collected if it's the last needed part
779 results
.append(buffer.decode('UTF-8', errors
='replace'));
782 total_read
+= len(chunk
);
783 # Check if we have found the delimiter
784 while delimiter
in buffer:
785 index
= buffer.find(delimiter
);
786 # Decode the section before the delimiter
787 results
.append(buffer[:index
].decode('UTF-8', errors
='replace'));
788 # Remove the processed part from the buffer
789 buffer = buffer[index
+ delimiter_length
:];
790 if len(results
) == num_delimiters
:
791 # If reached the required number of delimiters, adjust the file pointer and stop
792 fp
.seek(-len(buffer), 1);
794 if total_read
>= max_read
:
795 # Stop reading if max limit is reached to prevent excessive memory usage
796 raise MemoryError("Maximum read limit reached without finding the delimiter.");
797 # Check for incomplete UTF-8 sequences at the end of the buffer
798 if len(buffer) > 1 and 128 <= buffer[-1] < 192:
799 # This suggests that the last byte might be the start of a multi-byte character
800 # Try to read one more byte to complete the character
801 extra_byte
= fp
.read(1);
803 buffer.extend(extra_byte
);
805 # No more data available
807 # Process remaining buffer if less than the required number of delimiters were found
808 if len(buffer) > 0 and len(results
) < num_delimiters
:
809 results
.append(buffer.decode('UTF-8', errors
='replace'));
812 def ReadUntilNullByteByNum(fp
, delimiter
=__file_format_dict__
['format_delimiter'], num_delimiters
=1, chunk_size
=1024, max_read
=1024000):
813 return ReadTillNullByteByNum(fp
, delimiter
, num_delimiters
, chunk_size
, max_read
);
815 def SeekToEndOfFile(fp
):
819 if(lasttell
==fp
.tell()):
821 lasttell
= fp
.tell();
824 def ReadFileHeaderData(fp
, rounds
=0, delimiter
=__file_format_dict__
['format_delimiter']):
828 while(rocount
<roend
):
829 HeaderOut
.append(ReadTillNullByte(fp
, delimiter
));
830 rocount
= rocount
+ 1;
833 def ReadFileHeaderDataBySize(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
834 headerpresize
= ReadTillNullByte(fp
, delimiter
);
835 headersize
= int(headerpresize
, 16);
838 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
841 roend
= int(len(headercontent
));
842 HeaderOut
= [headerpresize
];
843 while(rocount
<roend
):
844 HeaderOut
.append(headercontent
[rocount
]);
845 rocount
= rocount
+ 1;
848 def ReadFileHeaderDataWoSize(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
849 preheaderdata
= ReadFileHeaderData(fp
, 2, delimiter
);
850 headersize
= int(preheaderdata
[0], 16);
851 headernumfields
= int(preheaderdata
[1], 16);
852 if(headersize
<=0 or headernumfields
<=0):
854 headerdata
= ReadTillNullByteByNum(fp
, delimiter
, headernumfields
);
855 #headerdata = ReadFileHeaderData(fp, headernumfields, delimiter);
856 HeaderOut
= preheaderdata
+ headerdata
;
859 def ReadFileHeaderDataBySizeWithContent(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
860 formatspecs
= FormatSpecsListToDict(formatspecs
);
861 delimiter
= formatspecs
['format_delimiter'];
862 fheaderstart
= fp
.tell();
863 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
864 if(len(HeaderOut
)==0):
866 if(re
.findall(r
"^[.|/]", HeaderOut
[3])):
867 fname
= HeaderOut
[3];
869 fname
= "./"+HeaderOut
[3];
870 fcs
= HeaderOut
[-2].lower();
871 fccs
= HeaderOut
[-1].lower();
872 fsize
= int(HeaderOut
[5], 16);
873 fcompression
= HeaderOut
[12];
874 fcsize
= int(HeaderOut
[13], 16);
875 fseeknextfile
= HeaderOut
[25];
876 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-4].lower(), True, formatspecs
);
877 if(fcs
!=newfcs
and not skipchecksum
):
878 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
879 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
881 fhend
= fp
.tell() - 1;
882 fcontentstart
= fp
.tell();
883 fcontents
= BytesIO();
884 if(fsize
>0 and not listonly
):
885 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
886 fcontents
.write(fp
.read(fsize
));
888 fcontents
.write(fp
.read(fcsize
));
889 elif(fsize
>0 and listonly
):
890 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
894 fcontents
.seek(0, 0);
895 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
896 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
897 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
898 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
900 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
903 fcontents
.seek(0, 0);
905 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
906 fcontentend
= fp
.tell();
907 if(re
.findall(r
"^\+([0-9]+)", fseeknextfile
)):
908 fseeknextasnum
= int(fseeknextfile
.replace("+", ""));
909 if(abs(fseeknextasnum
)==0):
911 fp
.seek(fseeknextasnum
, 1);
912 elif(re
.findall(r
"^\-([0-9]+)", fseeknextfile
)):
913 fseeknextasnum
= int(fseeknextfile
);
914 if(abs(fseeknextasnum
)==0):
916 fp
.seek(fseeknextasnum
, 1);
917 elif(re
.findall(r
"^([0-9]+)", fseeknextfile
)):
918 fseeknextasnum
= int(fseeknextfile
);
919 if(abs(fseeknextasnum
)==0):
921 fp
.seek(fseeknextasnum
, 0);
924 HeaderOut
.append(fcontents
);
927 def ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
928 formatspecs
= FormatSpecsListToDict(formatspecs
);
929 delimiter
= formatspecs
['format_delimiter'];
930 fheaderstart
= fp
.tell();
931 if(formatspecs
['new_style']):
932 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
934 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
935 if(len(HeaderOut
)==0):
937 fheadsize
= int(HeaderOut
[0], 16);
938 fnumfields
= int(HeaderOut
[1], 16);
939 ftype
= int(HeaderOut
[2], 16);
940 if(re
.findall(r
"^[.|/]", HeaderOut
[3])):
941 fname
= HeaderOut
[3];
943 fname
= "./"+HeaderOut
[3];
944 fbasedir
= os
.path
.dirname(fname
);
945 flinkname
= HeaderOut
[4];
946 fsize
= int(HeaderOut
[5], 16);
947 fatime
= int(HeaderOut
[6], 16);
948 fmtime
= int(HeaderOut
[7], 16);
949 fctime
= int(HeaderOut
[8], 16);
950 fbtime
= int(HeaderOut
[9], 16);
951 fmode
= int(HeaderOut
[10], 16);
952 fchmode
= stat
.S_IMODE(fmode
);
953 ftypemod
= stat
.S_IFMT(fmode
);
954 fwinattributes
= int(HeaderOut
[11], 16);
955 fcompression
= HeaderOut
[12];
956 fcsize
= int(HeaderOut
[13], 16);
957 fuid
= int(HeaderOut
[14], 16);
958 funame
= HeaderOut
[15];
959 fgid
= int(HeaderOut
[16], 16);
960 fgname
= HeaderOut
[17];
961 fid
= int(HeaderOut
[18], 16);
962 finode
= int(HeaderOut
[19], 16);
963 flinkcount
= int(HeaderOut
[20], 16);
964 fdev_minor
= int(HeaderOut
[21], 16);
965 fdev_major
= int(HeaderOut
[22], 16);
966 frdev_minor
= int(HeaderOut
[23], 16);
967 frdev_major
= int(HeaderOut
[24], 16);
968 fseeknextfile
= HeaderOut
[25];
969 fextrasize
= int(HeaderOut
[26], 16);
970 fextrafields
= int(HeaderOut
[27], 16);
971 extrafieldslist
= [];
973 extraend
= extrastart
+ fextrafields
;
974 extrafieldslist
= [];
975 if(extrastart
<extraend
):
976 extrafieldslist
.append(HeaderOut
[extrastart
]);
977 extrastart
= extrastart
+ 1;
978 fcs
= HeaderOut
[-2].lower();
979 fccs
= HeaderOut
[-1].lower();
980 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-4].lower(), True, formatspecs
);
981 if(fcs
!=newfcs
and not skipchecksum
):
982 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
983 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
985 fhend
= fp
.tell() - 1;
986 fcontentstart
= fp
.tell();
987 fcontents
= BytesIO();
988 pyhascontents
= False;
989 if(fsize
>0 and not listonly
):
990 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
991 fcontents
.write(fp
.read(fsize
));
993 fcontents
.write(fp
.read(fcsize
));
994 pyhascontents
= True;
995 elif(fsize
>0 and listonly
):
996 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1000 pyhascontents
= False;
1001 fcontents
.seek(0, 0);
1002 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
1003 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
1004 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
1005 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
1007 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1010 fcontents
.seek(0, 0);
1012 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
1013 fcontents
.seek(0, 0);
1014 fccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
1015 fcontentend
= fp
.tell() - 1;
1016 if(re
.findall(r
"^\+([0-9]+)", fseeknextfile
)):
1017 fseeknextasnum
= int(fseeknextfile
.replace("+", ""));
1018 if(abs(fseeknextasnum
)==0):
1020 fp
.seek(fseeknextasnum
, 1);
1021 elif(re
.findall(r
"^\-([0-9]+)", fseeknextfile
)):
1022 fseeknextasnum
= int(fseeknextfile
);
1023 if(abs(fseeknextasnum
)==0):
1025 fp
.seek(fseeknextasnum
, 1);
1026 elif(re
.findall(r
"^([0-9]+)", fseeknextfile
)):
1027 fseeknextasnum
= int(fseeknextfile
);
1028 if(abs(fseeknextasnum
)==0):
1030 fp
.seek(fseeknextasnum
, 0);
1033 fcontents
.seek(0, 0);
1034 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
, 'fseeknextfile': fseeknextfile
, 'fheaderchecksumtype': HeaderOut
[-4], 'fcontentchecksumtype': HeaderOut
[-3], 'fnumfields': fnumfields
+ 2, 'frawheader': HeaderOut
, 'fextrafields': fextrafields
, 'fextrafieldsize': fextrasize
, 'fextralist': extrafieldslist
, 'fheaderchecksum': fcs
, 'fcontentchecksum': fccs
, 'fhascontents': pyhascontents
, 'fcontentstart': fcontentstart
, 'fcontentend': fcontentend
, 'fcontents': fcontents
};
1037 def ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1038 formatspecs
= FormatSpecsListToDict(formatspecs
);
1039 delimiter
= formatspecs
['format_delimiter'];
1040 fheaderstart
= fp
.tell();
1041 if(formatspecs
['new_style']):
1042 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
1044 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
1045 if(len(HeaderOut
)==0):
1047 fheadsize
= int(HeaderOut
[0], 16);
1048 fnumfields
= int(HeaderOut
[1], 16);
1049 ftype
= int(HeaderOut
[2], 16);
1050 if(re
.findall(r
"^[.|/]", HeaderOut
[3])):
1051 fname
= HeaderOut
[3];
1053 fname
= "./"+HeaderOut
[3];
1054 fbasedir
= os
.path
.dirname(fname
);
1055 flinkname
= HeaderOut
[4];
1056 fsize
= int(HeaderOut
[5], 16);
1057 fatime
= int(HeaderOut
[6], 16);
1058 fmtime
= int(HeaderOut
[7], 16);
1059 fctime
= int(HeaderOut
[8], 16);
1060 fbtime
= int(HeaderOut
[9], 16);
1061 fmode
= int(HeaderOut
[10], 16);
1062 fchmode
= stat
.S_IMODE(fmode
);
1063 ftypemod
= stat
.S_IFMT(fmode
);
1064 fwinattributes
= int(HeaderOut
[11], 16);
1065 fcompression
= HeaderOut
[12];
1066 fcsize
= int(HeaderOut
[13], 16);
1067 fuid
= int(HeaderOut
[14], 16);
1068 funame
= HeaderOut
[15];
1069 fgid
= int(HeaderOut
[16], 16);
1070 fgname
= HeaderOut
[17];
1071 fid
= int(HeaderOut
[18], 16);
1072 finode
= int(HeaderOut
[19], 16);
1073 flinkcount
= int(HeaderOut
[20], 16);
1074 fdev_minor
= int(HeaderOut
[21], 16);
1075 fdev_major
= int(HeaderOut
[22], 16);
1076 frdev_minor
= int(HeaderOut
[23], 16);
1077 frdev_major
= int(HeaderOut
[24], 16);
1078 fseeknextfile
= HeaderOut
[25];
1079 fextrasize
= int(HeaderOut
[26], 16);
1080 fextrafields
= int(HeaderOut
[27], 16);
1081 extrafieldslist
= [];
1083 extraend
= extrastart
+ fextrafields
;
1084 extrafieldslist
= [];
1085 if(extrastart
<extraend
):
1086 extrafieldslist
.append(HeaderOut
[extrastart
]);
1087 extrastart
= extrastart
+ 1;
1088 fheaderchecksumtype
= HeaderOut
[extrastart
].lower();
1089 fcontentchecksumtype
= HeaderOut
[extrastart
+ 1].lower();
1090 fcs
= HeaderOut
[-2].lower();
1091 fccs
= HeaderOut
[-1].lower();
1092 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-4].lower(), True, formatspecs
);
1093 if(fcs
!=newfcs
and not skipchecksum
):
1094 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
1095 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
1097 fhend
= fp
.tell() - 1;
1098 fcontentstart
= fp
.tell();
1099 fcontents
= BytesIO();
1100 pyhascontents
= False;
1101 if(fsize
>0 and not listonly
):
1102 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1103 fcontents
.write(fp
.read(fsize
));
1105 fcontents
.write(fp
.read(fcsize
));
1106 pyhascontents
= True;
1107 elif(fsize
>0 and listonly
):
1108 if(fcompression
=="none" or fcompression
=="" or fcompression
=="atuo"):
1112 pyhascontents
= False;
1113 fcontents
.seek(0, 0);
1114 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
1115 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
1116 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
1117 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
1119 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1122 fcontents
.seek(0, 0);
1124 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
1125 fcontents
.seek(0, 0);
1126 fcontentend
= fp
.tell() - 1;
1127 if(re
.findall(r
"^\+([0-9]+)", fseeknextfile
)):
1128 fseeknextasnum
= int(fseeknextfile
.replace("+", ""));
1129 if(abs(fseeknextasnum
)==0):
1131 fp
.seek(fseeknextasnum
, 1);
1132 elif(re
.findall(r
"^\-([0-9]+)", fseeknextfile
)):
1133 fseeknextasnum
= int(fseeknextfile
);
1134 if(abs(fseeknextasnum
)==0):
1136 fp
.seek(fseeknextasnum
, 1);
1137 elif(re
.findall(r
"^([0-9]+)", fseeknextfile
)):
1138 fseeknextasnum
= int(fseeknextfile
);
1139 if(abs(fseeknextasnum
)==0):
1141 fp
.seek(fseeknextasnum
, 0);
1144 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
, fseeknextfile
, extrafieldslist
, fheaderchecksumtype
, fcontentchecksumtype
, fcontents
];
1147 def ReadFileDataBySizeWithContent(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1148 formatspecs
= FormatSpecsListToDict(formatspecs
);
1149 delimiter
= formatspecs
['format_delimiter'];
1153 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1156 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1157 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1158 if(not headercheck
and not skipchecksum
):
1159 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1160 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1162 fnumfiles
= int(catheader
[1], 16);
1165 while(countnum
< fnumfiles
):
1166 HeaderOut
= ReadFileHeaderDataBySizeWithContent(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
)
1167 if(len(HeaderOut
)==0):
1169 flist
.append(HeaderOut
);
1170 countnum
= countnum
+ 1;
1173 def ReadFileDataBySizeWithContentToArray(fp
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1174 formatspecs
= FormatSpecsListToDict(formatspecs
);
1175 delimiter
= formatspecs
['format_delimiter'];
1179 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1182 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1183 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1184 if(not headercheck
and not skipchecksum
):
1185 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1186 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1188 catstring
= catheader
[0];
1189 catversion
= re
.findall(r
"([\d]+)", catstring
);
1190 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
1191 fprenumfiles
= catheader
[1];
1192 fnumfiles
= int(fprenumfiles
, 16);
1193 fprechecksumtype
= catheader
[2];
1194 fprechecksum
= catheader
[3];
1195 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': []};
1196 if(seekstart
<0 and seekstart
>fnumfiles
):
1198 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
1199 seekend
= fnumfiles
;
1200 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
1201 seekend
= fnumfiles
- abs(seekend
);
1204 while(il
< seekstart
):
1205 prefhstart
= fp
.tell();
1206 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
['format_delimiter']);
1207 if(len(preheaderdata
)==0):
1209 prefsize
= int(preheaderdata
[5], 16);
1210 prefseeknextfile
= preheaderdata
[25];
1211 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
1212 prefcs
= preheaderdata
[-2];
1213 if(prefcs
!=prenewfcs
and not skipchecksum
):
1214 VVerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
1215 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
1217 valid_archive
= False;
1218 invalid_archive
= True;
1219 prefhend
= fp
.tell() - 1;
1220 prefcontentstart
= fp
.tell();
1221 prefcontents
= BytesIO();
1222 pyhascontents
= False;
1224 prefcontents
.write(fp
.read(prefsize
));
1225 prefcontents
.seek(0, 0);
1226 prenewfccs
= GetFileChecksum(prefcontents
.read(), preheaderdata
[-3].lower(), False, formatspecs
);
1227 prefccs
= preheaderdata
[-1];
1228 pyhascontents
= True;
1229 if(prefccs
!=prenewfccs
and not skipchecksum
):
1230 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
1231 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
1233 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
1234 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
1235 if(abs(fseeknextasnum
)==0):
1237 fp
.seek(fseeknextasnum
, 1);
1238 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
1239 fseeknextasnum
= int(prefseeknextfile
);
1240 if(abs(fseeknextasnum
)==0):
1242 fp
.seek(fseeknextasnum
, 1);
1243 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
1244 fseeknextasnum
= int(prefseeknextfile
);
1245 if(abs(fseeknextasnum
)==0):
1247 fp
.seek(fseeknextasnum
, 0);
1252 countnum
= seekstart
;
1253 while(countnum
< seekend
):
1254 HeaderOut
= ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1255 if(len(HeaderOut
)==0):
1257 HeaderOut
.update({'fid': realidnum
, 'fidalt': realidnum
});
1258 catlist
['ffilelist'].append(HeaderOut
);
1259 countnum
= countnum
+ 1;
1260 realidnum
= realidnum
+ 1;
1263 def ReadFileDataBySizeWithContentToList(fp
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1264 formatspecs
= FormatSpecsListToDict(formatspecs
);
1265 delimiter
= formatspecs
['format_delimiter'];
1269 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1272 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1273 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1274 if(not headercheck
and not skipchecksum
):
1275 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1276 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1278 catstring
= catheader
[0];
1279 catversion
= re
.findall(r
"([\d]+)", catstring
);
1280 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
1281 fprenumfiles
= catheader
[1];
1282 fnumfiles
= int(fprenumfiles
, 16);
1283 fprechecksumtype
= catheader
[2];
1284 fprechecksum
= catheader
[3];
1286 if(seekstart
<0 and seekstart
>fnumfiles
):
1288 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
1289 seekend
= fnumfiles
;
1290 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
1291 seekend
= fnumfiles
- abs(seekend
);
1294 while(il
< seekstart
):
1295 prefhstart
= fp
.tell();
1296 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
['format_delimiter']);
1297 if(len(preheaderdata
)==0):
1299 prefsize
= int(preheaderdata
[5], 16);
1300 prefcompression
= preheaderdata
[12];
1301 prefcsize
= int(preheaderdata
[13], 16);
1302 prefseeknextfile
= HeaderOut
[25];
1303 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
1304 prefcs
= preheaderdata
[-2];
1305 if(prefcs
!=prenewfcs
and not skipchecksum
):
1306 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
1307 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
1309 valid_archive
= False;
1310 invalid_archive
= True;
1311 prefhend
= fp
.tell() - 1;
1312 prefcontentstart
= fp
.tell();
1314 pyhascontents
= False;
1316 if(prefcompression
=="none" or prefcompression
=="" or prefcompression
=="auto"):
1317 prefcontents
= catfp
.read(prefsize
);
1319 prefcontents
= catfp
.read(prefcsize
);
1320 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
1321 prefccs
= preheaderdata
[-1];
1322 pyhascontents
= True;
1323 if(prefccs
!=prenewfccs
and not skipchecksum
):
1324 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
1325 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
1327 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
1328 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
1329 if(abs(fseeknextasnum
)==0):
1331 catfp
.seek(fseeknextasnum
, 1);
1332 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
1333 fseeknextasnum
= int(prefseeknextfile
);
1334 if(abs(fseeknextasnum
)==0):
1336 catfp
.seek(fseeknextasnum
, 1);
1337 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
1338 fseeknextasnum
= int(prefseeknextfile
);
1339 if(abs(fseeknextasnum
)==0):
1341 catfp
.seek(fseeknextasnum
, 0);
1346 countnum
= seekstart
;
1347 while(countnum
< seekend
):
1348 HeaderOut
= ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1349 if(len(HeaderOut
)==0):
1351 catlist
.append(HeaderOut
);
1352 countnum
= countnum
+ 1;
1353 realidnum
= realidnum
+ 1;
1356 def ReadInFileBySizeWithContentToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1357 formatspecs
= FormatSpecsListToDict(formatspecs
);
1358 delimiter
= formatspecs
['format_delimiter'];
1359 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1362 fp
= UncompressArchiveFile(fp
, formatspecs
);
1363 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1364 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1371 if(hasattr(sys
.stdin
, "buffer")):
1372 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1374 shutil
.copyfileobj(sys
.stdin
, fp
);
1376 fp
= UncompressArchiveFile(fp
, formatspecs
);
1380 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1381 fp
= download_file_from_internet_file(infile
);
1382 fp
= UncompressArchiveFile(fp
, formatspecs
);
1388 infile
= RemoveWindowsPath(infile
);
1389 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
1390 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1392 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1393 if(not compresscheck
):
1394 fextname
= os
.path
.splitext(infile
)[1];
1395 if(fextname
==".gz"):
1396 compresscheck
= "gzip";
1397 elif(fextname
==".bz2"):
1398 compresscheck
= "bzip2";
1399 elif(fextname
==".zst"):
1400 compresscheck
= "zstd";
1401 elif(fextname
==".lz4" or fextname
==".clz4"):
1402 compresscheck
= "lz4";
1403 elif(fextname
==".lzo" or fextname
==".lzop"):
1404 compresscheck
= "lzo";
1405 elif(fextname
==".lzma" or fextname
==".xz"):
1406 compresscheck
= "lzma";
1409 if(not compresscheck
):
1411 fp
= UncompressFile(infile
, formatspecs
, "rb");
1412 return ReadFileDataBySizeWithContentToArray(fp
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1414 def ReadInFileBySizeWithContentToList(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1415 formatspecs
= FormatSpecsListToDict(formatspecs
);
1416 delimiter
= formatspecs
['format_delimiter'];
1417 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1420 fp
= UncompressArchiveFile(fp
, formatspecs
);
1421 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1422 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1429 if(hasattr(sys
.stdin
, "buffer")):
1430 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1432 shutil
.copyfileobj(sys
.stdin
, fp
);
1434 fp
= UncompressArchiveFile(fp
, formatspecs
);
1438 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1439 fp
= download_file_from_internet_file(infile
);
1440 fp
= UncompressArchiveFile(fp
, formatspecs
);
1446 infile
= RemoveWindowsPath(infile
);
1447 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
1448 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1450 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1451 if(not compresscheck
):
1452 fextname
= os
.path
.splitext(infile
)[1];
1453 if(fextname
==".gz"):
1454 compresscheck
= "gzip";
1455 elif(fextname
==".bz2"):
1456 compresscheck
= "bzip2";
1457 elif(fextname
==".zst"):
1458 compresscheck
= "zstd";
1459 elif(fextname
==".lz4" or fextname
==".clz4"):
1460 compresscheck
= "lz4";
1461 elif(fextname
==".lzo" or fextname
==".lzop"):
1462 compresscheck
= "lzo";
1463 elif(fextname
==".lzma" or fextname
==".xz"):
1464 compresscheck
= "lzma";
1467 if(not compresscheck
):
1469 fp
= UncompressFile(infile
, formatspecs
, "rb");
1470 return ReadFileDataBySizeWithContentToList(fp
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1472 def AppendNullByte(indata
, delimiter
=__file_format_dict__
['format_delimiter']):
1473 outdata
= str(indata
) + delimiter
;
1476 def AppendNullBytes(indata
=[], delimiter
=__file_format_dict__
['format_delimiter']):
1481 outdata
= outdata
+ AppendNullByte(indata
[inum
], delimiter
);
1485 def AppendFileHeader(fp
, numfiles
, checksumtype
="crc32", formatspecs
=__file_format_dict__
):
1486 formatspecs
= FormatSpecsListToDict(formatspecs
);
1487 delimiter
= formatspecs
['format_delimiter'];
1488 catver
= formatspecs
['format_ver'];
1489 fileheaderver
= str(int(catver
.replace(".", "")));
1490 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
1491 fp
.write(fileheader
.encode('UTF-8'));
1492 fnumfiles
= format(int(numfiles
), 'x').lower();
1493 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
['format_delimiter']);
1494 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
1495 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
1496 fp
.write(fnumfilesa
.encode('UTF-8'));
1499 os
.fsync(fp
.fileno());
1500 except io
.UnsupportedOperation
:
1502 except AttributeError:
1504 except OSError as e
:
1508 def MakeEmptyFilePointer(fp
, checksumtype
="crc32", formatspecs
=__file_format_dict__
):
1509 formatspecs
= FormatSpecsListToDict(formatspecs
);
1510 AppendFileHeader(fp
, 0, checksumtype
, formatspecs
);
1513 def MakeEmptyFile(outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", formatspecs
=__file_format_dict__
, returnfp
=False):
1514 formatspecs
= FormatSpecsListToDict(formatspecs
);
1515 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1516 if(os
.path
.exists(outfile
)):
1519 except OSError as e
:
1523 catfpfp
= BytesIO();
1524 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1526 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1529 fbasename
= os
.path
.splitext(outfile
)[0];
1530 fextname
= os
.path
.splitext(outfile
)[1];
1531 if(not compresswholefile
and fextname
in outextlistwd
):
1532 compresswholefile
= True;
1533 catfp
= CompressOpenFile(outfile
, True, compressionlevel
);
1534 catfp
= AppendFileHeader(catfp
, 0, checksumtype
, formatspecs
);
1535 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1536 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1539 os
.fsync(catfp
.fileno());
1540 except io
.UnsupportedOperation
:
1542 except AttributeError:
1544 except OSError as e
:
1548 if(hasattr(sys
.stdout
, "buffer")):
1549 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1551 shutil
.copyfileobj(catfp
, sys
.stdout
);
1552 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1553 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1555 upload_file_to_internet_file(catfp
, outfile
);
1563 def AppendFileHeaderWithContent(fp
, filevalues
=[], extradata
=[], filecontent
="", checksumtype
="crc32", formatspecs
=__file_format_dict__
):
1564 formatspecs
= FormatSpecsListToDict(formatspecs
);
1565 extrafields
= format(len(extradata
), 'x').lower();
1566 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
1567 if(len(extradata
)>0):
1568 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
1569 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1570 catoutlen
= len(filevalues
) + len(extradata
) + 5;
1571 catoutlenhex
= format(catoutlen
, 'x').lower();
1572 catoutlist
= filevalues
;
1573 catoutlist
.insert(0, catoutlenhex
);
1574 catoutlist
.append(extrasizelen
);
1575 catoutlist
.append(extrafields
);
1576 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
1577 if(len(extradata
)>0):
1578 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
1579 if(len(filecontent
)==0):
1580 checksumlist
= [checksumtype
, "none"];
1582 checksumlist
= [checksumtype
, checksumtype
];
1583 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
1584 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1585 if(len(filecontent
)==0):
1586 catfilecontentcshex
= GetFileChecksum(filecontent
, "none", False, formatspecs
);
1588 catfilecontentcshex
= GetFileChecksum(filecontent
, checksumtype
, False, formatspecs
);
1589 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
1590 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
1591 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
1592 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1593 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
1594 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1595 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
1596 catfileout
= catfileoutstrecd
+ filecontent
+ nullstrecd
;
1597 fp
.write(catfileout
);
1600 os
.fsync(fp
.fileno());
1601 except io
.UnsupportedOperation
:
1603 except AttributeError:
1605 except OSError as e
:
1609 def AppendFilesWithContent(infiles
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
1610 formatspecs
= FormatSpecsListToDict(formatspecs
);
1611 advancedlist
= formatspecs
['use_advanced_list'];
1612 altinode
= formatspecs
['use_alt_inode'];
1614 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1616 for line
in sys
.stdin
:
1617 infilelist
.append(line
.strip());
1618 infilelist
= list(filter(None, infilelist
));
1619 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
1620 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
1622 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
1623 for line
in finfile
:
1624 infilelist
.append(line
.strip());
1625 infilelist
= list(filter(None, infilelist
));
1627 if(isinstance(infiles
, (list, tuple, ))):
1628 infilelist
= list(filter(None, infiles
));
1629 elif(isinstance(infiles
, (str, ))):
1630 infilelist
= list(filter(None, [infiles
]));
1632 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
1634 GetDirList
= ListDir(infilelist
, followlink
, False);
1642 inodetocatinode
= {};
1643 numfiles
= int(len(GetDirList
));
1644 fnumfiles
= format(numfiles
, 'x').lower();
1645 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1646 for curfname
in GetDirList
:
1647 if(re
.findall(r
"^[.|/]", curfname
)):
1650 fname
= "./"+curfname
;
1652 VerbosePrintOut(fname
);
1653 if(not followlink
or followlink
is None):
1654 fstatinfo
= os
.lstat(fname
);
1656 fstatinfo
= os
.stat(fname
);
1657 fpremode
= fstatinfo
.st_mode
;
1658 finode
= fstatinfo
.st_ino
;
1659 flinkcount
= fstatinfo
.st_nlink
;
1661 if(stat
.S_ISREG(fpremode
)):
1663 elif(stat
.S_ISLNK(fpremode
)):
1665 elif(stat
.S_ISCHR(fpremode
)):
1667 elif(stat
.S_ISBLK(fpremode
)):
1669 elif(stat
.S_ISDIR(fpremode
)):
1671 elif(stat
.S_ISFIFO(fpremode
)):
1673 elif(stat
.S_ISSOCK(fpremode
)):
1675 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
1677 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
1679 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
1684 fcurfid
= format(int(curfid
), 'x').lower();
1685 if(not followlink
and finode
!=0):
1687 if(finode
in inodelist
):
1689 flinkname
= inodetofile
[finode
];
1691 fcurinode
= format(int(finode
), 'x').lower();
1693 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
1694 if(finode
not in inodelist
):
1695 inodelist
.append(finode
);
1696 inodetofile
.update({finode
: fname
});
1697 inodetocatinode
.update({finode
: curinode
});
1699 fcurinode
= format(int(finode
), 'x').lower();
1701 fcurinode
= format(int(curinode
), 'x').lower();
1702 curinode
= curinode
+ 1;
1704 fcurinode
= format(int(curinode
), 'x').lower();
1705 curinode
= curinode
+ 1;
1706 curfid
= curfid
+ 1;
1708 flinkname
= os
.readlink(fname
);
1709 fdev
= fstatinfo
.st_dev
;
1710 getfdev
= GetDevMajorMinor(fdev
);
1711 fdev_minor
= getfdev
[0];
1712 fdev_major
= getfdev
[1];
1713 frdev
= fstatinfo
.st_dev
;
1714 if(hasattr(fstatinfo
, "st_rdev")):
1715 frdev
= fstatinfo
.st_rdev
;
1717 frdev
= fstatinfo
.st_dev
;
1718 getfrdev
= GetDevMajorMinor(frdev
);
1719 frdev_minor
= getfrdev
[0];
1720 frdev_major
= getfrdev
[1];
1721 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1722 fsize
= format(int("0"), 'x').lower();
1723 elif(ftype
==0 or ftype
==7):
1724 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
1726 fsize
= format(int(fstatinfo
.st_size
)).lower();
1727 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
1728 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
1729 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1730 if(hasattr(fstatinfo
, "st_birthtime")):
1731 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
1733 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1734 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
1735 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
1736 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
1737 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
1738 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
1743 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
1744 funame
= userinfo
.pw_name
;
1753 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
1754 fgname
= groupinfo
.gr_name
;
1759 fdev_minor
= format(int(fdev_minor
), 'x').lower();
1760 fdev_major
= format(int(fdev_major
), 'x').lower();
1761 frdev_minor
= format(int(frdev_minor
), 'x').lower();
1762 frdev_major
= format(int(frdev_major
), 'x').lower();
1763 finode
= format(int(finode
), 'x').lower();
1764 flinkcount
= format(int(flinkcount
), 'x').lower();
1765 if(hasattr(fstatinfo
, "st_file_attributes")):
1766 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
1768 fwinattributes
= format(int(0), 'x').lower();
1770 fcsize
= format(int(0), 'x').lower();
1771 fcontents
= BytesIO();
1773 if(ftype
==0 or ftype
==7):
1774 with
open(fname
, "rb") as fpc
:
1775 shutil
.copyfileobj(fpc
, fcontents
);
1776 if(not compresswholefile
):
1777 fcontents
.seek(0, 2);
1778 ucfsize
= fcontents
.tell();
1779 fcontents
.seek(0, 0);
1780 if(compression
=="auto"):
1781 ilsize
= len(compressionlistalt
);
1784 while(ilmin
< ilsize
):
1785 cfcontents
= BytesIO();
1786 shutil
.copyfileobj(fcontents
, cfcontents
);
1787 fcontents
.seek(0, 0);
1788 cfcontents
.seek(0, 0);
1789 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
1791 cfcontents
.seek(0, 2);
1792 ilcsize
.append(cfcontents
.tell());
1796 ilcsize
.append(sys
.maxint
);
1797 except AttributeError:
1798 ilcsize
.append(sys
.maxsize
);
1800 ilcmin
= ilcsize
.index(min(ilcsize
));
1801 compression
= compressionlistalt
[ilcmin
];
1802 fcontents
.seek(0, 0);
1803 cfcontents
= BytesIO();
1804 shutil
.copyfileobj(fcontents
, cfcontents
);
1805 cfcontents
.seek(0, 0);
1806 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
1807 cfcontents
.seek(0, 2);
1808 cfsize
= cfcontents
.tell();
1809 if(ucfsize
> cfsize
):
1810 fcsize
= format(int(cfsize
), 'x').lower();
1811 fcompression
= compression
;
1813 fcontents
= cfcontents
;
1814 if(followlink
and (ftype
==1 or ftype
==2)):
1815 flstatinfo
= os
.stat(flinkname
);
1816 with
open(flinkname
, "rb") as fpc
:
1817 shutil
.copyfileobj(fpc
, fcontents
);
1818 if(not compresswholefile
):
1819 fcontents
.seek(0, 2);
1820 ucfsize
= fcontents
.tell();
1821 fcontents
.seek(0, 0);
1822 if(compression
=="auto"):
1823 ilsize
= len(compressionlistalt
);
1826 while(ilmin
< ilsize
):
1827 cfcontents
= BytesIO();
1828 shutil
.copyfileobj(fcontents
, cfcontents
);
1829 fcontents
.seek(0, 0);
1830 cfcontents
.seek(0, 0);
1831 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
1833 cfcontents
.seek(0, 2);
1834 ilcsize
.append(cfcontents
.tell());
1838 ilcsize
.append(sys
.maxint
);
1839 except AttributeError:
1840 ilcsize
.append(sys
.maxsize
);
1842 ilcmin
= ilcsize
.index(min(ilcsize
));
1843 compression
= compressionlistalt
[ilcmin
];
1844 fcontents
.seek(0, 0);
1845 cfcontents
= BytesIO();
1846 shutil
.copyfileobj(fcontents
, cfcontents
);
1847 cfcontents
.seek(0, 0);
1848 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
1849 cfcontents
.seek(0, 2);
1850 cfsize
= cfcontents
.tell();
1851 if(ucfsize
> cfsize
):
1852 fcsize
= format(int(cfsize
), 'x').lower();
1853 fcompression
= compression
;
1855 fcontents
= cfcontents
;
1856 if(fcompression
=="none"):
1858 fcontents
.seek(0, 0);
1859 ftypehex
= format(ftype
, 'x').lower();
1860 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
, "+1"];
1861 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
1863 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
1867 def AppendListsWithContent(inlist
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
1868 formatspecs
= FormatSpecsListToDict(formatspecs
);
1870 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1871 GetDirList
= inlist
;
1879 inodetocatinode
= {};
1880 numfiles
= int(len(GetDirList
));
1881 fnumfiles
= format(numfiles
, 'x').lower();
1882 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1883 for curfname
in GetDirList
:
1884 ftype
= format(curfname
[0], 'x').lower();
1885 if(re
.findall(r
"^[.|/]", curfname
[1])):
1886 fname
= curfname
[1];
1888 fname
= "./"+curfname
[1];
1889 fbasedir
= os
.path
.dirname(fname
);
1890 flinkname
= curfname
[2];
1891 fsize
= format(curfname
[3], 'x').lower();
1892 fatime
= format(curfname
[4], 'x').lower();
1893 fmtime
= format(curfname
[5], 'x').lower();
1894 fctime
= format(curfname
[6], 'x').lower();
1895 fbtime
= format(curfname
[7], 'x').lower();
1896 fmode
= format(curfname
[8], 'x').lower();
1897 fwinattributes
= format(curfname
[9], 'x').lower();
1898 fcompression
= curfname
[10];
1899 fcsize
= format(curfname
[11], 'x').lower();
1900 fuid
= format(curfname
[12], 'x').lower();
1901 funame
= curfname
[13];
1902 fgid
= format(curfname
[14], 'x').lower();
1903 fgname
= curfname
[15];
1904 fid
= format(curfname
[16], 'x').lower();
1905 finode
= format(curfname
[17], 'x').lower();
1906 flinkcount
= format(curfname
[18], 'x').lower();
1907 fdev_minor
= format(curfname
[19], 'x').lower();
1908 fdev_major
= format(curfname
[20], 'x').lower();
1909 frdev_minor
= format(curfname
[21], 'x').lower();
1910 frdev_major
= format(curfname
[22], 'x').lower();
1911 fseeknextfile
= curfname
[23];
1912 extradata
= curfname
[24];
1913 fheaderchecksumtype
= curfname
[25];
1914 fcontentchecksumtype
= curfname
[26];
1915 fcontents
= curfname
[27];
1916 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
, fseeknextfile
];
1917 fcontents
.seek(0, 0);
1918 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
1920 fp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
1923 def AppendInFileWithContent(infile
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
1924 formatspecs
= FormatSpecsListToDict(formatspecs
);
1925 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, True, False, formatspecs
);
1926 return AppendListsWithContent(inlist
, fp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1928 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):
1929 formatspecs
= FormatSpecsListToDict(formatspecs
);
1930 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1931 if(os
.path
.exists(outfile
)):
1934 except OSError as e
:
1938 catfpfp
= BytesIO();
1939 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1941 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1944 fbasename
= os
.path
.splitext(outfile
)[0];
1945 fextname
= os
.path
.splitext(outfile
)[1];
1946 if(not compresswholefile
and fextname
in outextlistwd
):
1947 compresswholefile
= True;
1948 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
1949 catfp
= AppendFilesWithContent(infiles
, catfp
, dirlistfromtxt
, filevalues
, extradata
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
);
1950 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1951 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1954 os
.fsync(catfp
.fileno());
1955 except io
.UnsupportedOperation
:
1957 except AttributeError:
1959 except OSError as e
:
1963 if(hasattr(sys
.stdout
, "buffer")):
1964 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1966 shutil
.copyfileobj(catfp
, sys
.stdout
);
1967 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1968 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
1970 upload_file_to_internet_file(catfp
, outfile
);
1978 def AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
=False, compression
="auto", compresswholefile
=True, compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
1979 formatspecs
= FormatSpecsListToDict(formatspecs
);
1980 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1981 if(os
.path
.exists(outfile
)):
1984 except OSError as e
:
1988 catfpfp
= BytesIO();
1989 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1991 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1994 fbasename
= os
.path
.splitext(outfile
)[0];
1995 fextname
= os
.path
.splitext(outfile
)[1];
1996 if(not compresswholefile
and fextname
in outextlistwd
):
1997 compresswholefile
= True;
1998 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
1999 catfp
= AppendListsWithContent(inlist
, catfp
, dirlistfromtxt
, filevalues
, extradata
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
);
2000 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2001 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2004 os
.fsync(catfp
.fileno());
2005 except io
.UnsupportedOperation
:
2007 except AttributeError:
2009 except OSError as e
:
2013 if(hasattr(sys
.stdout
, "buffer")):
2014 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2016 shutil
.copyfileobj(catfp
, sys
.stdout
);
2017 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2018 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2020 upload_file_to_internet_file(catfp
, outfile
);
2028 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):
2029 formatspecs
= FormatSpecsListToDict(formatspecs
);
2030 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, True, False, formatspecs
);
2031 return AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
, returnfp
);
2033 def PrintPermissionString(fchmode
, ftype
):
2034 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' } };
2036 for fmodval
in str(oct(fchmode
))[-3:]:
2037 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
2038 if(ftype
==0 or ftype
==7):
2039 permissionstr
= "-" + permissionstr
;
2041 permissionstr
= "h" + permissionstr
;
2043 permissionstr
= "l" + permissionstr
;
2045 permissionstr
= "c" + permissionstr
;
2047 permissionstr
= "b" + permissionstr
;
2049 permissionstr
= "d" + permissionstr
;
2051 permissionstr
= "f" + permissionstr
;
2053 permissionstr
= "D" + permissionstr
;
2055 permissionstr
= "p" + permissionstr
;
2057 permissionstr
= "w" + permissionstr
;
2059 permissionoutstr
= stat
.filemode(fchmode
);
2060 except AttributeError:
2061 permissionoutstr
= permissionstr
;
2063 permissionoutstr
= permissionstr
;
2064 return permissionoutstr
;
2066 def PrintPermissionStringAlt(fchmode
, ftype
):
2068 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
2069 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
2071 # Translate file mode into permission string
2072 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
2073 # Append file type indicator
2075 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
2076 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
2078 file_type
= type_indicators
.get(ftype
, '-');
2079 permissionstr
= file_type
+ permissionstr
;
2081 permissionoutstr
= stat
.filemode(fchmode
);
2082 except AttributeError:
2083 permissionoutstr
= permissionstr
;
2084 return permissionoutstr
;
2086 def CheckCompressionType(infile
, formatspecs
=__file_format_dict__
, closefp
=True):
2087 formatspecs
= FormatSpecsListToDict(formatspecs
);
2088 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2092 catfp
= open(infile
, "rb");
2093 except FileNotFoundError
:
2096 prefp
= catfp
.read(2);
2098 if(prefp
==binascii
.unhexlify("1f8b")):
2101 prefp
= catfp
.read(3);
2102 if(prefp
==binascii
.unhexlify("425a68")):
2104 if(prefp
==binascii
.unhexlify("5d0000")):
2107 prefp
= catfp
.read(4);
2108 if(prefp
==binascii
.unhexlify("28b52ffd")):
2110 if(prefp
==binascii
.unhexlify("04224d18")):
2112 if(prefp
==binascii
.unhexlify("504B0304")):
2113 filetype
= "zipfile";
2115 prefp
= catfp
.read(5);
2116 if(prefp
==binascii
.unhexlify("7573746172")):
2117 filetype
= "tarfile";
2119 prefp
= catfp
.read(6);
2120 if(prefp
==binascii
.unhexlify("fd377a585a00")):
2122 if(prefp
==binascii
.unhexlify("377abcaf271c")):
2123 filetype
= "7zipfile";
2125 prefp
= catfp
.read(7);
2126 if(prefp
==binascii
.unhexlify("526172211a0700")):
2127 filetype
= "rarfile";
2128 if(prefp
==binascii
.unhexlify("43617446696c65")):
2129 filetype
= "catfile";
2131 prefp
= catfp
.read(8);
2132 if(prefp
==binascii
.unhexlify("526172211a070100")):
2133 filetype
= "rarfile";
2135 prefp
= catfp
.read(formatspecs
['format_len']);
2136 if(prefp
==binascii
.unhexlify(formatspecs
['format_hex'])):
2137 filetype
= formatspecs
['format_lower'];
2139 prefp
= catfp
.read(9);
2140 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
2143 prefp
= catfp
.read(10);
2144 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2145 filetype
= "tarfile";
2147 if(filetype
=="gzip" or filetype
=="bzip2" or filetype
=="lzma" or filetype
=="zstd" or filetype
=="lz4"):
2148 if(TarFileCheck(catfp
)):
2149 filetype
= "tarfile";
2151 if(TarFileCheck(catfp
)):
2152 filetype
= "tarfile";
2153 elif(zipfile
.is_zipfile(catfp
)):
2154 filetype
= "zipfile";
2155 elif(rarfile
.is_rarfile(catfp
) or rarfile
.is_rarfile_sfx(catfp
)):
2156 filetype
= "rarile";
2164 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_dict__
, closefp
=True):
2165 formatspecs
= FormatSpecsListToDict(formatspecs
);
2167 instringsfile
= BytesIO(instring
);
2169 instringsfile
= BytesIO(instring
.encode("UTF-8"));
2170 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
2172 def GetCompressionMimeType(infile
, formatspecs
=__file_format_dict__
):
2173 formatspecs
= FormatSpecsListToDict(formatspecs
);
2174 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
2175 if(compresscheck
=="gzip" or compresscheck
=="gz"):
2176 return archivefile_gzip_mimetype
;
2177 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
2178 return archivefile_bzip2_mimetype
;
2179 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
2180 return archivefile_zstandard_mimetype
;
2181 if(compresscheck
=="lz4"):
2182 return archivefile_lz4_mimetype
;
2183 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
2184 return archivefile_lzop_mimetype
;
2185 if(compresscheck
=="lzma"):
2186 return archivefile_lzma_mimetype
;
2187 if(compresscheck
=="xz"):
2188 return archivefile_xz_mimetype
;
2189 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
['format_lower']):
2190 return archivefile_cat_mimetype
;
2191 if(not compresscheck
):
2195 def UncompressArchiveFile(fp
, formatspecs
=__file_format_dict__
):
2196 formatspecs
= FormatSpecsListToDict(formatspecs
);
2197 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2199 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
2200 if(compresscheck
=="gzip" and compresscheck
in compressionsupport
):
2201 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
2202 if(compresscheck
=="bzip2" and compresscheck
in compressionsupport
):
2204 catfp
.write(bz2
.decompress(fp
.read()));
2205 if(compresscheck
=="zstd" and compresscheck
in compressionsupport
):
2207 catfp
.write(zstandard
.decompress(fp
.read()));
2208 if(compresscheck
=="lz4" and compresscheck
in compressionsupport
):
2210 catfp
.write(lz4
.frame
.decompress(fp
.read()));
2211 if((compresscheck
=="lzo" or compresscheck
=="lzop") and compresscheck
in compressionsupport
):
2213 catfp
.write(lzo
.decompress(fp
.read()));
2214 if((compresscheck
=="lzma" or compresscheck
=="xz") and compresscheck
in compressionsupport
):
2216 catfp
.write(lzma
.decompress(fp
.read()));
2217 if(compresscheck
=="catfile" or compresscheck
==formatspecs
['format_lower']):
2219 if(not compresscheck
):
2224 from backports
import lzma
2228 with fp
as fpcontent
:
2230 catfp
.write(lzma
.decompress(fp
.read()));
2231 except lzma
.LZMAError
:
2233 if(compresscheck
!="catfile" or compresscheck
!=formatspecs
['format_lower']):
2237 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
2239 def UncompressFile(infile
, formatspecs
=__file_format_dict__
, mode
="rb"):
2240 formatspecs
= FormatSpecsListToDict(formatspecs
);
2241 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
2242 if(sys
.version_info
[0]==2 and compresscheck
):
2248 if(compresscheck
=="gzip" and compresscheck
in compressionsupport
):
2250 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
2251 except (ValueError, TypeError) as e
:
2252 filefp
= gzip
.open(infile
, mode
);
2253 if(compresscheck
=="bzip2" and compresscheck
in compressionsupport
):
2255 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
2256 except (ValueError, TypeError) as e
:
2257 filefp
= bz2
.open(infile
, mode
);
2258 if(compresscheck
=="zstd" and compresscheck
in compressionsupport
):
2260 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
2261 except (ValueError, TypeError) as e
:
2262 filefp
= zstandard
.open(infile
, mode
);
2263 if(compresscheck
=="lz4" and compresscheck
in compressionsupport
):
2265 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
2266 except (ValueError, TypeError) as e
:
2267 filefp
= lz4
.frame
.open(infile
, mode
);
2268 if((compresscheck
=="lzo" or compresscheck
=="lzop") and compresscheck
in compressionsupport
):
2270 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
2271 except (ValueError, TypeError) as e
:
2272 filefp
= lzo
.open(infile
, mode
);
2273 if((compresscheck
=="lzma" or compresscheck
=="xz") and compresscheck
in compressionsupport
):
2275 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
2276 except (ValueError, TypeError) as e
:
2277 filefp
= lzma
.open(infile
, mode
);
2278 if(compresscheck
=="catfile" or compresscheck
==formatspecs
['format_lower']):
2280 filefp
= open(infile
, mode
, encoding
="UTF-8");
2281 except (ValueError, TypeError) as e
:
2282 filefp
= open(infile
, mode
);
2283 if(not compresscheck
):
2285 filefp
= open(infile
, mode
, encoding
="UTF-8");
2286 except (ValueError, TypeError) as e
:
2287 filefp
= open(infile
, mode
);
2288 except FileNotFoundError
:
2292 def UncompressString(infile
):
2293 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
2294 if(compresscheck
=="gzip" and compresscheck
in compressionsupport
):
2295 fileuz
= gzip
.decompress(infile
);
2296 if(compresscheck
=="bzip2" and compresscheck
in compressionsupport
):
2297 fileuz
= bz2
.decompress(infile
);
2298 if(compresscheck
=="zstd" and compresscheck
in compressionsupport
):
2303 fileuz
= zstandard
.decompress(infile
);
2304 if(compresscheck
=="lz4" and compresscheck
in compressionsupport
):
2305 fileuz
= lz4
.frame
.decompress(infile
);
2306 if((compresscheck
=="lzo" or compresscheck
=="lzop") and compresscheck
in compressionsupport
):
2307 fileuz
= lzo
.decompress(infile
);
2308 if((compresscheck
=="lzma" or compresscheck
=="xz") and compresscheck
in compressionsupport
):
2309 fileuz
= lzma
.decompress(infile
);
2310 if(not compresscheck
):
2312 if(hasattr(fileuz
, 'decode')):
2313 fileuz
= fileuz
.decode("UTF-8");
2316 def UncompressStringAlt(infile
):
2317 filefp
= StringIO();
2318 outstring
= UncompressString(infile
);
2319 filefp
.write(outstring
);
2323 def CheckCompressionSubType(infile
, formatspecs
=__file_format_dict__
, closefp
=True):
2324 formatspecs
= FormatSpecsListToDict(formatspecs
);
2325 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
2326 if(not compresscheck
):
2327 fextname
= os
.path
.splitext(infile
)[1];
2328 if(fextname
==".gz"):
2329 compresscheck
= "gzip";
2330 elif(fextname
==".bz2"):
2331 compresscheck
= "bzip2";
2332 elif(fextname
==".zst"):
2333 compresscheck
= "zstd";
2334 elif(fextname
==".lz4"):
2335 compresscheck
= "lz4";
2336 elif(fextname
==".lzo" or fextname
==".lzop"):
2337 compresscheck
= "lzo";
2338 elif(fextname
==".lzma" or fextname
==".xz"):
2339 compresscheck
= "lzma";
2342 if(compresscheck
=="gzip" or compresscheck
=="bzip2" or compresscheck
=="lzma" or compresscheck
=="zstd" or compresscheck
=="lz4"):
2343 if(TarFileCheck(infile
)):
2344 filetype
= "tarfile";
2345 if(not compresscheck
):
2346 if(TarFileCheck(infile
)):
2348 elif(zipfile
.is_zipfile(infile
)):
2350 elif(rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
)):
2355 if(compresscheck
=="catfile"):
2357 if(compresscheck
==formatspecs
['format_lower']):
2358 return formatspecs
['format_lower'];
2359 if(compresscheck
=="tarfile"):
2361 if(compresscheck
=="zipfile"):
2363 if(rarfile_support
and compresscheck
=="rarfile"):
2365 if(py7zr_support
and compresscheck
=="7zipfile" and py7zr
.is_7zfile(infile
)):
2367 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2368 catfp
= UncompressArchiveFile(infile
, formatspecs
['format_lower']);
2371 if(compresscheck
=="gzip" and compresscheck
in compressionsupport
):
2372 catfp
= gzip
.GzipFile(infile
, "rb");
2373 if(compresscheck
=="bzip2" and compresscheck
in compressionsupport
):
2374 catfp
= bz2
.BZ2File(infile
, "rb");
2375 if(compresscheck
=="lz4" and compresscheck
in compressionsupport
):
2376 catfp
= lz4
.frame
.open(infile
, "rb");
2377 if(compresscheck
=="zstd" and compresscheck
in compressionsupport
):
2378 catfp
= zstandard
.open(infile
, "rb");
2379 if((compresscheck
=="lzo" or compresscheck
=="lzop") and compresscheck
in compressionsupport
):
2380 catfp
= lzo
.open(infile
, "rb");
2381 if((compresscheck
=="lzma" or compresscheck
=="xz") and compresscheck
in compressionsupport
):
2382 catfp
= lzma
.open(infile
, "rb");
2383 except FileNotFoundError
:
2386 prefp
= catfp
.read(5);
2387 if(prefp
==binascii
.unhexlify("7573746172")):
2388 filetype
= "tarfile";
2390 prefp
= catfp
.read(7);
2391 if(prefp
==binascii
.unhexlify("43617446696c65")):
2392 filetype
= "catfile";
2394 prefp
= catfp
.read(formatspecs
['format_len']);
2395 if(prefp
==binascii
.unhexlify(formatspecs
['format_hex'])):
2396 filetype
= formatspecs
['format_lower'];
2398 prefp
= catfp
.read(10);
2399 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2400 filetype
= "tarfile";
2406 def GZipCompress(data
, compresslevel
=9):
2407 if("gzip" not in compressionsupport
):
2409 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
2411 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
2415 catfp
= open(tmpfp
.name
, "rb");
2416 except FileNotFoundError
:
2418 catdata
= catfp
.read();
2422 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_dict__
):
2423 formatspecs
= FormatSpecsListToDict(formatspecs
);
2424 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2427 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
2428 compression
= "auto";
2429 if(compression
not in compressionlist
and compression
is None):
2430 compression
= "auto";
2431 if(compression
=="gzip" and compression
in compressionsupport
):
2433 if(compressionlevel
is None):
2434 compressionlevel
= 9;
2436 compressionlevel
= int(compressionlevel
);
2437 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
2438 if(compression
=="bzip2" and compression
in compressionsupport
):
2440 if(compressionlevel
is None):
2441 compressionlevel
= 9;
2443 compressionlevel
= int(compressionlevel
);
2444 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
2445 if(compression
=="lz4" and compression
in compressionsupport
):
2447 if(compressionlevel
is None):
2448 compressionlevel
= 9;
2450 compressionlevel
= int(compressionlevel
);
2451 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
2452 if((compression
=="lzo" or compression
=="lzop") and compression
in compressionsupport
):
2454 if(compressionlevel
is None):
2455 compressionlevel
= 9;
2457 compressionlevel
= int(compressionlevel
);
2458 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
2459 if(compression
=="zstd" and compression
in compressionsupport
):
2461 if(compressionlevel
is None):
2462 compressionlevel
= 10;
2464 compressionlevel
= int(compressionlevel
);
2465 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
2466 if(compression
=="lzma" and compression
in compressionsupport
):
2468 if(compressionlevel
is None):
2469 compressionlevel
= 9;
2471 compressionlevel
= int(compressionlevel
);
2472 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
2473 if(compression
=="xz" and compression
in compressionsupport
):
2475 if(compressionlevel
is None):
2476 compressionlevel
= 9;
2478 compressionlevel
= int(compressionlevel
);
2479 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
2480 if(compression
=="auto" or compression
is None):
2485 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
2487 def CompressOpenFile(outfile
, compressionenable
=True, compressionlevel
=None):
2488 if(outfile
is None):
2490 fbasename
= os
.path
.splitext(outfile
)[0];
2491 fextname
= os
.path
.splitext(outfile
)[1];
2492 if(compressionlevel
is None and fextname
!=".zst"):
2493 compressionlevel
= 9;
2494 elif(compressionlevel
is None and fextname
==".zst"):
2495 compressionlevel
= 10;
2497 compressionlevel
= int(compressionlevel
);
2498 if(sys
.version_info
[0]==2):
2503 if(fextname
not in outextlistwd
or not compressionenable
):
2505 outfp
= open(outfile
, "wb", encoding
="UTF-8");
2506 except (ValueError, TypeError) as e
:
2507 outfp
= open(outfile
, "wb");
2508 elif(fextname
==".gz" and "gzip" in compressionsupport
):
2510 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2511 except (ValueError, TypeError) as e
:
2512 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
2513 elif(fextname
==".bz2" and "bzip2" in compressionsupport
):
2515 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2516 except (ValueError, TypeError) as e
:
2517 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
2518 elif(fextname
==".zst" and "zstandard" in compressionsupport
):
2520 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
2521 except (ValueError, TypeError) as e
:
2522 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
2523 elif(fextname
==".xz" and "xz" in compressionsupport
):
2525 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
2526 except (ValueError, TypeError) as e
:
2527 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
2528 elif(fextname
==".lz4" and "lz4" in compressionsupport
):
2530 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
2531 except (ValueError, TypeError) as e
:
2532 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
2533 elif(fextname
==".lzo" and "lzop" in compressionsupport
):
2535 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
2536 except (ValueError, TypeError) as e
:
2537 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
2538 elif(fextname
==".lzma" and "lzma" in compressionsupport
):
2540 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
2541 except (ValueError, TypeError) as e
:
2542 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
2543 except FileNotFoundError
:
2547 def GetDevMajorMinor(fdev
):
2549 if(hasattr(os
, "minor")):
2550 retdev
.append(os
.minor(fdev
));
2553 if(hasattr(os
, "major")):
2554 retdev
.append(os
.major(fdev
));
2559 def CheckSumSupport(checkfor
, guaranteed
=True):
2562 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2563 except AttributeError:
2564 hash_list
= sorted(list(hashlib
.algorithms
));
2567 hash_list
= sorted(list(hashlib
.algorithms_available
));
2568 except AttributeError:
2569 hash_list
= sorted(list(hashlib
.algorithms
));
2570 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
2571 if(checkfor
in checklistout
):
2576 def CheckSumSupportAlt(checkfor
, guaranteed
=True):
2579 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2580 except AttributeError:
2581 hash_list
= sorted(list(hashlib
.algorithms
));
2584 hash_list
= sorted(list(hashlib
.algorithms_available
));
2585 except AttributeError:
2586 hash_list
= sorted(list(hashlib
.algorithms
));
2587 checklistout
= hash_list
;
2588 if(checkfor
in checklistout
):
2593 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):
2594 formatspecs
= FormatSpecsListToDict(formatspecs
);
2595 advancedlist
= formatspecs
['use_advanced_list'];
2596 altinode
= formatspecs
['use_alt_inode'];
2597 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2598 outfile
= RemoveWindowsPath(outfile
);
2599 checksumtype
= checksumtype
.lower();
2600 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2601 checksumtype
="crc32";
2602 if(checksumtype
=="none"):
2604 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
2605 compression
= "auto";
2606 if(compression
not in compressionlist
and compression
is None):
2607 compression
= "auto";
2609 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2610 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2611 if(os
.path
.exists(outfile
)):
2614 except OSError as e
:
2619 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2621 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2624 fbasename
= os
.path
.splitext(outfile
)[0];
2625 fextname
= os
.path
.splitext(outfile
)[1];
2626 if(not compresswholefile
and fextname
in outextlistwd
):
2627 compresswholefile
= True;
2628 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
2629 catver
= formatspecs
['format_ver'];
2630 fileheaderver
= str(int(catver
.replace(".", "")));
2633 for line
in sys
.stdin
:
2634 infilelist
.append(line
.strip());
2635 infilelist
= list(filter(None, infilelist
));
2636 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
2637 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
2639 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
2640 for line
in finfile
:
2641 infilelist
.append(line
.strip());
2642 infilelist
= list(filter(None, infilelist
));
2644 if(isinstance(infiles
, (list, tuple, ))):
2645 infilelist
= list(filter(None, infiles
));
2646 elif(isinstance(infiles
, (str, ))):
2647 infilelist
= list(filter(None, [infiles
]));
2649 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
2651 GetDirList
= ListDir(infilelist
, followlink
, False);
2659 inodetocatinode
= {};
2660 numfiles
= int(len(GetDirList
));
2661 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
2662 for curfname
in GetDirList
:
2663 if(re
.findall(r
"^[.|/]", curfname
)):
2666 fname
= "./"+curfname
;
2668 VerbosePrintOut(fname
);
2669 if(not followlink
or followlink
is None):
2670 fstatinfo
= os
.lstat(fname
);
2672 fstatinfo
= os
.stat(fname
);
2673 fpremode
= fstatinfo
.st_mode
;
2674 finode
= fstatinfo
.st_ino
;
2675 flinkcount
= fstatinfo
.st_nlink
;
2677 if(stat
.S_ISREG(fpremode
)):
2679 elif(stat
.S_ISLNK(fpremode
)):
2681 elif(stat
.S_ISCHR(fpremode
)):
2683 elif(stat
.S_ISBLK(fpremode
)):
2685 elif(stat
.S_ISDIR(fpremode
)):
2687 elif(stat
.S_ISFIFO(fpremode
)):
2689 elif(stat
.S_ISSOCK(fpremode
)):
2691 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
2693 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
2695 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
2700 fcurfid
= format(int(curfid
), 'x').lower();
2701 if(not followlink
and finode
!=0):
2703 if(finode
in inodelist
):
2705 flinkname
= inodetofile
[finode
];
2707 fcurinode
= format(int(finode
), 'x').lower();
2709 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
2710 if(finode
not in inodelist
):
2711 inodelist
.append(finode
);
2712 inodetofile
.update({finode
: fname
});
2713 inodetocatinode
.update({finode
: curinode
});
2715 fcurinode
= format(int(finode
), 'x').lower();
2717 fcurinode
= format(int(curinode
), 'x').lower();
2718 curinode
= curinode
+ 1;
2720 fcurinode
= format(int(curinode
), 'x').lower();
2721 curinode
= curinode
+ 1;
2722 curfid
= curfid
+ 1;
2724 flinkname
= os
.readlink(fname
);
2725 fdev
= fstatinfo
.st_dev
;
2726 getfdev
= GetDevMajorMinor(fdev
);
2727 fdev_minor
= getfdev
[0];
2728 fdev_major
= getfdev
[1];
2729 frdev
= fstatinfo
.st_dev
;
2730 if(hasattr(fstatinfo
, "st_rdev")):
2731 frdev
= fstatinfo
.st_rdev
;
2733 frdev
= fstatinfo
.st_dev
;
2734 getfrdev
= GetDevMajorMinor(frdev
);
2735 frdev_minor
= getfrdev
[0];
2736 frdev_major
= getfrdev
[1];
2737 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2738 fsize
= format(int("0"), 'x').lower();
2739 elif(ftype
==0 or ftype
==7):
2740 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
2742 fsize
= format(int(fstatinfo
.st_size
)).lower();
2743 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
2744 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
2745 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2746 if(hasattr(fstatinfo
, "st_birthtime")):
2747 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
2749 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2750 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
2751 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
2752 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
2753 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
2754 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
2759 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
2760 funame
= userinfo
.pw_name
;
2769 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
2770 fgname
= groupinfo
.gr_name
;
2775 fdev_minor
= format(int(fdev_minor
), 'x').lower();
2776 fdev_major
= format(int(fdev_major
), 'x').lower();
2777 frdev_minor
= format(int(frdev_minor
), 'x').lower();
2778 frdev_major
= format(int(frdev_major
), 'x').lower();
2779 finode
= format(int(finode
), 'x').lower();
2780 flinkcount
= format(int(flinkcount
), 'x').lower();
2781 if(hasattr(fstatinfo
, "st_file_attributes")):
2782 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
2784 fwinattributes
= format(int(0), 'x').lower();
2786 fcsize
= format(int(0), 'x').lower();
2787 fcontents
= BytesIO();
2788 if(ftype
==0 or ftype
==7):
2789 with
open(fname
, "rb") as fpc
:
2790 shutil
.copyfileobj(fpc
, fcontents
);
2791 if(not compresswholefile
):
2792 fcontents
.seek(0, 2);
2793 ucfsize
= fcontents
.tell();
2794 fcontents
.seek(0, 0);
2795 if(compression
=="auto"):
2796 ilsize
= len(compressionlistalt
);
2799 while(ilmin
< ilsize
):
2800 cfcontents
= BytesIO();
2801 shutil
.copyfileobj(fcontents
, cfcontents
);
2802 fcontents
.seek(0, 0);
2803 cfcontents
.seek(0, 0);
2804 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
2806 cfcontents
.seek(0, 2);
2807 ilcsize
.append(cfcontents
.tell());
2811 ilcsize
.append(sys
.maxint
);
2812 except AttributeError:
2813 ilcsize
.append(sys
.maxsize
);
2815 ilcmin
= ilcsize
.index(min(ilcsize
));
2816 compression
= compressionlistalt
[ilcmin
];
2817 fcontents
.seek(0, 0);
2818 cfcontents
= BytesIO();
2819 shutil
.copyfileobj(fcontents
, cfcontents
);
2820 cfcontents
.seek(0, 0);
2821 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
2822 cfcontents
.seek(0, 2);
2823 cfsize
= cfcontents
.tell();
2824 if(ucfsize
> cfsize
):
2825 fcsize
= format(int(cfsize
), 'x').lower();
2826 fcompression
= compression
;
2828 fcontents
= cfcontents
;
2829 if(fcompression
=="none"):
2831 if(followlink
and (ftype
==1 or ftype
==2)):
2832 flstatinfo
= os
.stat(flinkname
);
2833 with
open(flinkname
, "rb") as fpc
:
2834 shutil
.copyfileobj(fpc
, fcontents
);
2835 if(not compresswholefile
):
2836 fcontents
.seek(0, 2);
2837 ucfsize
= fcontents
.tell();
2838 fcontents
.seek(0, 0);
2839 if(compression
=="auto"):
2840 ilsize
= len(compressionlistalt
);
2843 while(ilmin
< ilsize
):
2844 cfcontents
= BytesIO();
2845 shutil
.copyfileobj(fcontents
, cfcontents
);
2846 fcontents
.seek(0, 0);
2847 cfcontents
.seek(0, 0);
2848 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
2850 cfcontents
.seek(0, 2);
2851 ilcsize
.append(cfcontents
.tell());
2855 ilcsize
.append(sys
.maxint
);
2856 except AttributeError:
2857 ilcsize
.append(sys
.maxsize
);
2859 ilcmin
= ilcsize
.index(min(ilcsize
));
2860 compression
= compressionlistalt
[ilcmin
];
2861 fcontents
.seek(0, 0);
2862 cfcontents
= BytesIO();
2863 shutil
.copyfileobj(fcontents
, cfcontents
);
2864 cfcontents
.seek(0, 0);
2865 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
2866 cfcontents
.seek(0, 2);
2867 cfsize
= cfcontents
.tell();
2868 if(ucfsize
> cfsize
):
2869 fcsize
= format(int(cfsize
), 'x').lower();
2870 fcompression
= compression
;
2872 fcontents
= cfcontents
;
2873 fcontents
.seek(0, 0);
2874 ftypehex
= format(ftype
, 'x').lower();
2875 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
, "+1"];
2876 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
2879 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
2880 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2881 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2884 os
.fsync(catfp
.fileno());
2885 except io
.UnsupportedOperation
:
2887 except AttributeError:
2889 except OSError as e
:
2893 if(hasattr(sys
.stdout
, "buffer")):
2894 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2896 shutil
.copyfileobj(catfp
, sys
.stdout
);
2897 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2898 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2900 upload_file_to_internet_file(catfp
, outfile
);
2908 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
2910 if(hasattr(shutil
, "register_archive_format")):
2911 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
2912 return PackArchiveFile(source_dir
, archive_name
, False, "auto", True, None, False, "crc32", [], __file_format_dict__
['format_delimiter'], False, False);
2913 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
2915 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):
2916 formatspecs
= FormatSpecsListToDict(formatspecs
);
2917 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
2919 create_alias_function("Pack", __file_format_name__
, "FromDirList", PackArchiveFileFromDirList
);
2921 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
2922 formatspecs
= FormatSpecsListToDict(formatspecs
);
2923 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2924 outfile
= RemoveWindowsPath(outfile
);
2925 checksumtype
= checksumtype
.lower();
2926 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2927 checksumtype
="crc32";
2928 if(checksumtype
=="none"):
2930 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
2931 compression
= "auto";
2932 if(compression
not in compressionlist
and compression
is None):
2933 compression
= "auto";
2935 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2936 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2937 if(os
.path
.exists(outfile
)):
2940 except OSError as e
:
2945 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2947 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2950 fbasename
= os
.path
.splitext(outfile
)[0];
2951 fextname
= os
.path
.splitext(outfile
)[1];
2952 if(not compresswholefile
and fextname
in outextlistwd
):
2953 compresswholefile
= True;
2954 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
2955 catver
= formatspecs
['format_ver'];
2956 fileheaderver
= str(int(catver
.replace(".", "")));
2962 inodetocatinode
= {};
2965 if(hasattr(sys
.stdin
, "buffer")):
2966 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
2968 shutil
.copyfileobj(sys
.stdin
, infile
);
2973 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
2974 infile
= download_file_from_internet_file(infile
);
2979 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2981 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
2983 if(not tarfile
.TarFileCheck(infile
)):
2985 except AttributeError:
2986 if(not TarFileCheck(infile
)):
2991 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2992 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
2994 tarfp
= tarfile
.open(infile
, "r");
2995 except FileNotFoundError
:
2997 numfiles
= int(len(tarfp
.getmembers()));
2998 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
2999 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
3000 if(re
.findall(r
"^[.|/]", member
.name
)):
3001 fname
= member
.name
;
3003 fname
= "./"+member
.name
;
3005 VerbosePrintOut(fname
);
3006 fpremode
= member
.mode
;
3007 ffullmode
= member
.mode
;
3011 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3013 elif(member
.isdev()):
3014 ffullmode
= member
.mode
;
3016 elif(member
.islnk()):
3017 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3019 elif(member
.issym()):
3020 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
3022 elif(member
.ischr()):
3023 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
3025 elif(member
.isblk()):
3026 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
3028 elif(member
.isdir()):
3029 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
3031 elif(member
.isfifo()):
3032 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
3034 elif(member
.issparse()):
3035 ffullmode
= member
.mode
;
3038 ffullmode
= member
.mode
;
3041 fcurfid
= format(int(curfid
), 'x').lower();
3042 fcurinode
= format(int(curfid
), 'x').lower();
3043 curfid
= curfid
+ 1;
3045 flinkname
= member
.linkname
;
3046 fdev_minor
= format(int(member
.devminor
), 'x').lower();
3047 fdev_major
= format(int(member
.devmajor
), 'x').lower();
3048 frdev_minor
= format(int(member
.devminor
), 'x').lower();
3049 frdev_major
= format(int(member
.devmajor
), 'x').lower();
3050 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3051 fsize
= format(int("0"), 'x').lower();
3052 elif(ftype
==0 or ftype
==7):
3053 fsize
= format(int(member
.size
), 'x').lower();
3055 fsize
= format(int(member
.size
), 'x').lower();
3056 fatime
= format(int(member
.mtime
), 'x').lower();
3057 fmtime
= format(int(member
.mtime
), 'x').lower();
3058 fctime
= format(int(member
.mtime
), 'x').lower();
3059 fbtime
= format(int(member
.mtime
), 'x').lower();
3060 fmode
= format(int(ffullmode
), 'x').lower();
3061 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
3062 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
3063 fuid
= format(int(member
.uid
), 'x').lower();
3064 fgid
= format(int(member
.gid
), 'x').lower();
3065 funame
= member
.uname
;
3066 fgname
= member
.gname
;
3067 flinkcount
= format(int(flinkcount
), 'x').lower();
3068 fwinattributes
= format(int(0), 'x').lower();
3070 fcsize
= format(int(0), 'x').lower();
3071 fcontents
= BytesIO();
3072 if(ftype
==0 or ftype
==7):
3073 with tarfp
.extractfile(member
) as fpc
:
3074 shutil
.copyfileobj(fpc
, fcontents
);
3075 if(not compresswholefile
):
3076 fcontents
.seek(0, 2);
3077 ucfsize
= fcontents
.tell();
3078 fcontents
.seek(0, 0);
3079 if(compression
=="auto"):
3080 ilsize
= len(compressionlistalt
);
3083 while(ilmin
< ilsize
):
3084 cfcontents
= BytesIO();
3085 shutil
.copyfileobj(fcontents
, cfcontents
);
3086 fcontents
.seek(0, 0);
3087 cfcontents
.seek(0, 0);
3088 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3090 cfcontents
.seek(0, 2);
3091 ilcsize
.append(cfcontents
.tell());
3095 ilcsize
.append(sys
.maxint
);
3096 except AttributeError:
3097 ilcsize
.append(sys
.maxsize
);
3099 ilcmin
= ilcsize
.index(min(ilcsize
));
3100 compression
= compressionlistalt
[ilcmin
];
3101 fcontents
.seek(0, 0);
3102 cfcontents
= BytesIO();
3103 shutil
.copyfileobj(fcontents
, cfcontents
);
3104 cfcontents
.seek(0, 0);
3105 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3106 cfcontents
.seek(0, 2);
3107 cfsize
= cfcontents
.tell();
3108 if(ucfsize
> cfsize
):
3109 fcsize
= format(int(cfsize
), 'x').lower();
3110 fcompression
= compression
;
3112 fcontents
= cfcontents
;
3113 if(fcompression
=="none"):
3115 fcontents
.seek(0, 0);
3116 ftypehex
= format(ftype
, 'x').lower();
3117 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
, "+1"];
3118 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3121 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3122 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3123 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3126 os
.fsync(catfp
.fileno());
3127 except io
.UnsupportedOperation
:
3129 except AttributeError:
3131 except OSError as e
:
3135 if(hasattr(sys
.stdout
, "buffer")):
3136 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3138 shutil
.copyfileobj(catfp
, sys
.stdout
);
3139 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3140 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3142 upload_file_to_internet_file(catfp
, outfile
);
3150 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
3152 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3153 formatspecs
= FormatSpecsListToDict(formatspecs
);
3154 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3155 outfile
= RemoveWindowsPath(outfile
);
3156 checksumtype
= checksumtype
.lower();
3157 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3158 checksumtype
="crc32";
3159 if(checksumtype
=="none"):
3161 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3162 compression
= "auto";
3163 if(compression
not in compressionlist
and compression
is None):
3164 compression
= "auto";
3166 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3167 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3168 if(os
.path
.exists(outfile
)):
3171 except OSError as e
:
3176 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3178 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3181 fbasename
= os
.path
.splitext(outfile
)[0];
3182 fextname
= os
.path
.splitext(outfile
)[1];
3183 if(not compresswholefile
and fextname
in outextlistwd
):
3184 compresswholefile
= True;
3185 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3186 catver
= formatspecs
['format_ver'];
3187 fileheaderver
= str(int(catver
.replace(".", "")));
3193 inodetocatinode
= {};
3196 if(hasattr(sys
.stdin
, "buffer")):
3197 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3199 shutil
.copyfileobj(sys
.stdin
, infile
);
3204 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3205 infile
= download_file_from_internet_file(infile
);
3210 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3214 if(not zipfile
.is_zipfile(infile
)):
3217 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
3218 except FileNotFoundError
:
3220 ziptest
= zipfp
.testzip();
3222 VerbosePrintOut("Bad file found!");
3223 numfiles
= int(len(zipfp
.infolist()));
3224 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3225 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
3226 if(re
.findall(r
"^[.|/]", member
.filename
)):
3227 fname
= member
.filename
;
3229 fname
= "./"+member
.filename
;
3230 zipinfo
= zipfp
.getinfo(member
.filename
);
3232 VerbosePrintOut(fname
);
3233 if(not member
.is_dir()):
3234 fpremode
= int(stat
.S_IFREG
+ 438);
3235 elif(member
.is_dir()):
3236 fpremode
= int(stat
.S_IFDIR
+ 511);
3239 if(not member
.is_dir()):
3241 elif(member
.is_dir()):
3244 fcurfid
= format(int(curfid
), 'x').lower();
3245 fcurinode
= format(int(curfid
), 'x').lower();
3246 curfid
= curfid
+ 1;
3247 fdev_minor
= format(int(0), 'x').lower();
3248 fdev_major
= format(int(0), 'x').lower();
3249 frdev_minor
= format(int(0), 'x').lower();
3250 frdev_major
= format(int(0), 'x').lower();
3252 fsize
= format(int("0"), 'x').lower();
3254 fsize
= format(int(member
.file_size
), 'x').lower();
3256 fsize
= format(int(member
.file_size
), 'x').lower();
3257 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3258 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3259 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3260 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3261 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
3262 fwinattributes
= format(int(zipinfo
.external_attr
), 'x').lower();
3263 if(not member
.is_dir()):
3264 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3265 fchmode
= stat
.S_IMODE(fmode
);
3266 ftypemod
= stat
.S_IFMT(fmode
);
3267 elif(member
.is_dir()):
3268 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3269 fchmode
= stat
.S_IMODE(fmode
);
3270 ftypemod
= stat
.S_IFMT(fmode
);
3271 elif(zipinfo
.create_system
==3):
3272 fwinattributes
= format(int(0), 'x').lower();
3273 fmode
= format(int(zipinfo
.external_attr
), 'x').lower();
3274 fchmode
= stat
.S_IMODE(fmode
);
3275 ftypemod
= stat
.S_IFMT(fmode
);
3277 fwinattributes
= format(int(0), 'x').lower();
3278 if(not member
.is_dir()):
3279 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3280 fchmode
= stat
.S_IMODE(fmode
);
3281 ftypemod
= stat
.S_IFMT(fmode
);
3282 elif(member
.is_dir()):
3283 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3284 fchmode
= stat
.S_IMODE(fmode
);
3285 ftypemod
= stat
.S_IFMT(fmode
);
3287 fcsize
= format(int(0), 'x').lower();
3289 fuid
= format(int(os
.getuid()), 'x').lower();
3290 except AttributeError:
3291 fuid
= format(int(0), 'x').lower();
3293 fuid
= format(int(0), 'x').lower();
3295 fgid
= format(int(os
.getgid()), 'x').lower();
3296 except AttributeError:
3297 fgid
= format(int(0), 'x').lower();
3299 fgid
= format(int(0), 'x').lower();
3303 userinfo
= pwd
.getpwuid(os
.getuid());
3304 funame
= userinfo
.pw_name
;
3307 except AttributeError:
3315 groupinfo
= grp
.getgrgid(os
.getgid());
3316 fgname
= groupinfo
.gr_name
;
3319 except AttributeError:
3323 fcontents
= BytesIO();
3325 fcontents
.write(zipfp
.read(member
.filename
));
3326 if(not compresswholefile
):
3327 fcontents
.seek(0, 2);
3328 ucfsize
= fcontents
.tell();
3329 fcontents
.seek(0, 0);
3330 if(compression
=="auto"):
3331 ilsize
= len(compressionlistalt
);
3334 while(ilmin
< ilsize
):
3335 cfcontents
= BytesIO();
3336 shutil
.copyfileobj(fcontents
, cfcontents
);
3337 fcontents
.seek(0, 0);
3338 cfcontents
.seek(0, 0);
3339 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3340 cfcontents
.seek(0, 2);
3341 ilcsize
.append(cfcontents
.tell());
3344 ilcmin
= ilcsize
.index(min(ilcsize
));
3345 compression
= compressionlistalt
[ilcmin
];
3346 fcontents
.seek(0, 0);
3347 cfcontents
= BytesIO();
3348 shutil
.copyfileobj(fcontents
, cfcontents
);
3349 cfcontents
.seek(0, 0);
3350 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3351 cfcontents
.seek(0, 2);
3352 cfsize
= cfcontents
.tell();
3353 if(ucfsize
> cfsize
):
3354 fcsize
= format(int(cfsize
), 'x').lower();
3355 fcompression
= compression
;
3357 fcontents
= cfcontents
;
3358 if(fcompression
=="none"):
3360 fcontents
.seek(0, 0);
3361 ftypehex
= format(ftype
, 'x').lower();
3362 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
, "+1"];
3363 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3366 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3367 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3368 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3371 os
.fsync(catfp
.fileno());
3372 except io
.UnsupportedOperation
:
3374 except AttributeError:
3376 except OSError as e
:
3380 if(hasattr(sys
.stdout
, "buffer")):
3381 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3383 shutil
.copyfileobj(catfp
, sys
.stdout
);
3384 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3385 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3387 upload_file_to_internet_file(catfp
, outfile
);
3395 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
3397 if(not rarfile_support
):
3398 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3401 if(rarfile_support
):
3402 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3403 formatspecs
= FormatSpecsListToDict(formatspecs
);
3404 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3405 outfile
= RemoveWindowsPath(outfile
);
3406 checksumtype
= checksumtype
.lower();
3407 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3408 checksumtype
="crc32";
3409 if(checksumtype
=="none"):
3411 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3412 compression
= "auto";
3413 if(compression
not in compressionlist
and compression
is None):
3414 compression
= "auto";
3416 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3417 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3418 if(os
.path
.exists(outfile
)):
3421 except OSError as e
:
3426 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3428 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3431 fbasename
= os
.path
.splitext(outfile
)[0];
3432 fextname
= os
.path
.splitext(outfile
)[1];
3433 if(not compresswholefile
and fextname
in outextlistwd
):
3434 compresswholefile
= True;
3435 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3436 catver
= formatspecs
['format_ver'];
3437 fileheaderver
= str(int(catver
.replace(".", "")));
3443 inodetocatinode
= {};
3444 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3446 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
3448 rarfp
= rarfile
.RarFile(infile
, "r");
3449 rartest
= rarfp
.testrar();
3451 VerbosePrintOut("Bad file found!");
3452 numfiles
= int(len(rarfp
.infolist()));
3453 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3456 os
.fsync(catfp
.fileno());
3457 except io
.UnsupportedOperation
:
3459 except AttributeError:
3461 except OSError as e
:
3463 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
3466 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
3469 member
.external_attr
3471 except AttributeError:
3473 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
3476 member
.external_attr
3478 except AttributeError:
3483 if(re
.findall(r
"^[.|/]", member
.filename
)):
3484 fname
= member
.filename
;
3486 fname
= "./"+member
.filename
;
3487 rarinfo
= rarfp
.getinfo(member
.filename
);
3489 VerbosePrintOut(fname
);
3490 if(is_unix
and member
.external_attr
!=0):
3491 fpremode
= int(member
.external_attr
);
3492 elif(member
.is_file()):
3493 fpremode
= int(stat
.S_IFREG
+ 438);
3494 elif(member
.is_symlink()):
3495 fpremode
= int(stat
.S_IFLNK
+ 438);
3496 elif(member
.is_dir()):
3497 fpremode
= int(stat
.S_IFDIR
+ 511);
3498 if(is_windows
and member
.external_attr
!=0):
3499 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
3501 fwinattributes
= format(int(0), 'x').lower();
3503 fcsize
= format(int(0), 'x').lower();
3506 if(member
.is_file()):
3508 elif(member
.is_symlink()):
3510 elif(member
.is_dir()):
3514 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
3515 fcurfid
= format(int(curfid
), 'x').lower();
3516 fcurinode
= format(int(curfid
), 'x').lower();
3517 curfid
= curfid
+ 1;
3518 fdev_minor
= format(int(0), 'x').lower();
3519 fdev_major
= format(int(0), 'x').lower();
3520 frdev_minor
= format(int(0), 'x').lower();
3521 frdev_major
= format(int(0), 'x').lower();
3523 fsize
= format(int("0"), 'x').lower();
3525 fsize
= format(int(member
.file_size
), 'x').lower();
3527 fsize
= format(int(member
.file_size
), 'x').lower();
3530 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
3532 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3533 except AttributeError:
3534 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3535 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3538 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
3540 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3541 except AttributeError:
3542 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3543 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3544 if(is_unix
and member
.external_attr
!=0):
3545 fmode
= format(int(member
.external_attr
), 'x').lower();
3546 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
3547 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
3548 elif(member
.is_file()):
3549 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3550 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3551 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3552 elif(member
.is_symlink()):
3553 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
3554 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3555 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3556 elif(member
.is_dir()):
3557 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3558 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3559 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3561 fuid
= format(int(os
.getuid()), 'x').lower();
3562 except AttributeError:
3563 fuid
= format(int(0), 'x').lower();
3565 fuid
= format(int(0), 'x').lower();
3567 fgid
= format(int(os
.getgid()), 'x').lower();
3568 except AttributeError:
3569 fgid
= format(int(0), 'x').lower();
3571 fgid
= format(int(0), 'x').lower();
3575 userinfo
= pwd
.getpwuid(os
.getuid());
3576 funame
= userinfo
.pw_name
;
3579 except AttributeError:
3587 groupinfo
= grp
.getgrgid(os
.getgid());
3588 fgname
= groupinfo
.gr_name
;
3591 except AttributeError:
3595 fcontents
= BytesIO();
3597 fcontents
.write(rarfp
.read(member
.filename
));
3598 if(not compresswholefile
):
3599 fcontents
.seek(0, 2);
3600 ucfsize
= fcontents
.tell();
3601 fcontents
.seek(0, 0);
3602 if(compression
=="auto"):
3603 ilsize
= len(compressionlistalt
);
3606 while(ilmin
< ilsize
):
3607 cfcontents
= BytesIO();
3608 shutil
.copyfileobj(fcontents
, cfcontents
);
3609 fcontents
.seek(0, 0);
3610 cfcontents
.seek(0, 0);
3611 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3613 cfcontents
.seek(0, 2);
3614 ilcsize
.append(cfcontents
.tell());
3618 ilcsize
.append(sys
.maxint
);
3619 except AttributeError:
3620 ilcsize
.append(sys
.maxsize
);
3622 ilcmin
= ilcsize
.index(min(ilcsize
));
3623 compression
= compressionlistalt
[ilcmin
];
3624 fcontents
.seek(0, 0);
3625 cfcontents
= BytesIO();
3626 shutil
.copyfileobj(fcontents
, cfcontents
);
3627 cfcontents
.seek(0, 0);
3628 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3629 cfcontents
.seek(0, 2);
3630 cfsize
= cfcontents
.tell();
3631 if(ucfsize
> cfsize
):
3632 fcsize
= format(int(cfsize
), 'x').lower();
3633 fcompression
= compression
;
3635 fcontents
= cfcontents
;
3636 if(fcompression
=="none"):
3638 fcontents
.seek(0, 0);
3639 ftypehex
= format(ftype
, 'x').lower();
3640 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
, "+1"];
3641 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3644 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3645 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3646 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
)
3649 os
.fsync(catfp
.fileno());
3650 except io
.UnsupportedOperation
:
3652 except AttributeError:
3654 except OSError as e
:
3658 if(hasattr(sys
.stdout
, "buffer")):
3659 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3661 shutil
.copyfileobj(catfp
, sys
.stdout
);
3662 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3663 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3665 upload_file_to_internet_file(catfp
, outfile
);
3673 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
3675 if(not py7zr_support
):
3676 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3680 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3681 formatspecs
= FormatSpecsListToDict(formatspecs
);
3682 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3683 outfile
= RemoveWindowsPath(outfile
);
3684 checksumtype
= checksumtype
.lower();
3685 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3686 checksumtype
="crc32";
3687 if(checksumtype
=="none"):
3689 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3690 compression
= "auto";
3691 if(compression
not in compressionlist
and compression
is None):
3692 compression
= "auto";
3694 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3695 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3696 if(os
.path
.exists(outfile
)):
3699 except OSError as e
:
3704 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3706 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3709 fbasename
= os
.path
.splitext(outfile
)[0];
3710 fextname
= os
.path
.splitext(outfile
)[1];
3711 if(not compresswholefile
and fextname
in outextlistwd
):
3712 compresswholefile
= True;
3713 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3714 catver
= formatspecs
['format_ver'];
3715 fileheaderver
= str(int(catver
.replace(".", "")));
3721 inodetocatinode
= {};
3722 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3724 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
3725 file_content
= szpfp
.readall();
3726 #sztest = szpfp.testzip();
3727 sztestalt
= szpfp
.test();
3729 VerbosePrintOut("Bad file found!");
3730 numfiles
= int(len(szpfp
.list()));
3731 AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3732 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
3733 if(re
.findall(r
"^[.|/]", member
.filename
)):
3734 fname
= member
.filename
;
3736 fname
= "./"+member
.filename
;
3738 VerbosePrintOut(fname
);
3739 if(not member
.is_directory
):
3740 fpremode
= int(stat
.S_IFREG
+ 438);
3741 elif(member
.is_directory
):
3742 fpremode
= int(stat
.S_IFDIR
+ 511);
3743 fwinattributes
= format(int(0), 'x').lower();
3745 fcsize
= format(int(0), 'x').lower();
3748 if(member
.is_directory
):
3753 fcurfid
= format(int(curfid
), 'x').lower();
3754 fcurinode
= format(int(curfid
), 'x').lower();
3755 curfid
= curfid
+ 1;
3756 fdev_minor
= format(int(0), 'x').lower();
3757 fdev_major
= format(int(0), 'x').lower();
3758 frdev_minor
= format(int(0), 'x').lower();
3759 frdev_major
= format(int(0), 'x').lower();
3761 fsize
= format(int("0"), 'x').lower();
3762 fatime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3763 fmtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3764 fctime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3765 fbtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3766 if(member
.is_directory
):
3767 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3768 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3769 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3771 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3772 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3773 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3775 fuid
= format(int(os
.getuid()), 'x').lower();
3776 except AttributeError:
3777 fuid
= format(int(0), 'x').lower();
3779 fuid
= format(int(0), 'x').lower();
3781 fgid
= format(int(os
.getgid()), 'x').lower();
3782 except AttributeError:
3783 fgid
= format(int(0), 'x').lower();
3785 fgid
= format(int(0), 'x').lower();
3789 userinfo
= pwd
.getpwuid(os
.getuid());
3790 funame
= userinfo
.pw_name
;
3793 except AttributeError:
3801 groupinfo
= grp
.getgrgid(os
.getgid());
3802 fgname
= groupinfo
.gr_name
;
3805 except AttributeError:
3809 fcontents
= BytesIO();
3811 fcontents
.write(file_content
[member
.filename
].read());
3812 fsize
= format(fcontents
.tell(), 'x').lower();
3813 file_content
[member
.filename
].close();
3814 if(not compresswholefile
):
3815 fcontents
.seek(0, 2);
3816 ucfsize
= fcontents
.tell();
3817 fcontents
.seek(0, 0);
3818 if(compression
=="auto"):
3819 ilsize
= len(compressionlistalt
);
3822 while(ilmin
< ilsize
):
3823 cfcontents
= BytesIO();
3824 shutil
.copyfileobj(fcontents
, cfcontents
);
3825 fcontents
.seek(0, 0);
3826 cfcontents
.seek(0, 0);
3827 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3829 cfcontents
.seek(0, 2);
3830 ilcsize
.append(cfcontents
.tell());
3834 ilcsize
.append(sys
.maxint
);
3835 except AttributeError:
3836 ilcsize
.append(sys
.maxsize
);
3838 ilcmin
= ilcsize
.index(min(ilcsize
));
3839 compression
= compressionlistalt
[ilcmin
];
3840 fcontents
.seek(0, 0);
3841 cfcontents
= BytesIO();
3842 shutil
.copyfileobj(fcontents
, cfcontents
);
3843 cfcontents
.seek(0, 0);
3844 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3845 cfcontents
.seek(0, 2);
3846 cfsize
= cfcontents
.tell();
3847 if(ucfsize
> cfsize
):
3848 fcsize
= format(int(cfsize
), 'x').lower();
3849 fcompression
= compression
;
3851 fcontents
= cfcontents
;
3852 if(fcompression
=="none"):
3854 fcontents
.seek(0, 0);
3855 ftypehex
= format(ftype
, 'x').lower();
3856 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
, "+1"];
3857 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3860 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3861 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3862 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
)
3865 os
.fsync(catfp
.fileno());
3866 except io
.UnsupportedOperation
:
3868 except AttributeError:
3870 except OSError as e
:
3874 if(hasattr(sys
.stdout
, "buffer")):
3875 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3877 shutil
.copyfileobj(catfp
, sys
.stdout
);
3878 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3879 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3881 upload_file_to_internet_file(catfp
, outfile
);
3889 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFile", PackArchiveFileFromSevenZipFile
);
3891 def PackArchiveFileFromInFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3892 formatspecs
= FormatSpecsListToDict(formatspecs
);
3893 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3895 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3896 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
3897 return PackArchiveFileFromTarFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3898 elif(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
3899 return PackArchiveFileFromZipFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3900 elif(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
3901 return PackArchiveFileFromRarFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3902 elif(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
3903 return PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3904 elif(checkcompressfile
=="catfile"):
3905 return RePackArchiveFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, False, 0, 0, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
3910 create_alias_function("Pack", __file_format_name__
, "FromInFile", PackArchiveFileFromInFile
);
3912 def ArchiveFileSeekToFileNum(infile
, seekto
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
3913 formatspecs
= FormatSpecsListToDict(formatspecs
);
3914 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3917 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3918 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
3919 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
3920 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3921 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
3922 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3923 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
3924 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3925 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
3926 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3927 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
3934 if(hasattr(sys
.stdin
, "buffer")):
3935 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
3937 shutil
.copyfileobj(sys
.stdin
, catfp
);
3939 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3943 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3944 catfp
= download_file_from_internet_file(infile
);
3946 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3951 infile
= RemoveWindowsPath(infile
);
3952 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3953 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
3954 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3955 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
3956 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3957 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
3958 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3959 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
3960 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3961 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
3963 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
3964 if(not compresscheck
):
3965 fextname
= os
.path
.splitext(infile
)[1];
3966 if(fextname
==".gz"):
3967 compresscheck
= "gzip";
3968 elif(fextname
==".bz2"):
3969 compresscheck
= "bzip2";
3970 elif(fextname
==".zst"):
3971 compresscheck
= "zstd";
3972 elif(fextname
==".lz4" or fextname
==".clz4"):
3973 compresscheck
= "lz4";
3974 elif(fextname
==".lzo" or fextname
==".lzop"):
3975 compresscheck
= "lzo";
3976 elif(fextname
==".lzma" or fextname
==".xz"):
3977 compresscheck
= "lzma";
3980 if(not compresscheck
):
3982 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3987 SeekToEndOfFile(catfp);
3989 SeekToEndOfFile(catfp);
3990 CatSize = catfp.tell();
3991 CatSizeEnd = CatSize;
3999 curloc
= catfp
.tell();
4002 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4004 catfp
.seek(curloc
, 0);
4005 catstring
= catheader
[0];
4006 catversion
= re
.findall(r
"([\d]+)", catstring
);
4007 fprenumfiles
= catheader
[1];
4008 fnumfiles
= int(fprenumfiles
, 16);
4009 fprechecksumtype
= catheader
[2];
4010 fprechecksum
= catheader
[3];
4011 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4012 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4013 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4014 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4015 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4016 fheadtell
= len(fileheader
);
4017 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4018 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4019 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4021 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4022 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4023 if(seekto
>=fnumfiles
):
4024 seekto
= fnumfiles
- 1;
4030 prefhstart
= catfp
.tell();
4031 if(formatspecs
['new_style']):
4032 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4034 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4035 if(len(preheaderdata
)==0):
4037 prefheadsize
= int(preheaderdata
[0], 16);
4038 prefnumfields
= int(preheaderdata
[1], 16);
4039 preftype
= int(preheaderdata
[2], 16);
4040 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
4041 prefname
= preheaderdata
[3];
4043 prefname
= "./"+preheaderdata
[3];
4044 prefbasedir
= os
.path
.dirname(prefname
);
4045 preflinkname
= preheaderdata
[4];
4046 prefsize
= int(preheaderdata
[5], 16);
4047 prefatime
= int(preheaderdata
[6], 16);
4048 prefmtime
= int(preheaderdata
[7], 16);
4049 prefctime
= int(preheaderdata
[8], 16);
4050 prefbtime
= int(preheaderdata
[9], 16);
4051 prefmode
= int(preheaderdata
[10], 16);
4052 prefchmode
= stat
.S_IMODE(prefmode
);
4053 preftypemod
= stat
.S_IFMT(prefmode
);
4054 prefwinattributes
= int(preheaderdata
[11], 16);
4055 prefcompression
= preheaderdata
[12];
4056 prefcsize
= int(preheaderdata
[13], 16);
4057 prefuid
= int(preheaderdata
[14], 16);
4058 prefuname
= preheaderdata
[15];
4059 prefgid
= int(preheaderdata
[16], 16);
4060 prefgname
= preheaderdata
[17];
4061 fid
= int(preheaderdata
[18], 16);
4062 finode
= int(preheaderdata
[19], 16);
4063 flinkcount
= int(preheaderdata
[20], 16);
4064 prefdev_minor
= int(preheaderdata
[21], 16);
4065 prefdev_major
= int(preheaderdata
[22], 16);
4066 prefrdev_minor
= int(preheaderdata
[23], 16);
4067 prefrdev_major
= int(preheaderdata
[24], 16);
4068 prefseeknextfile
= preheaderdata
[25];
4069 prefextrasize
= int(preheaderdata
[26], 16);
4070 prefextrafields
= int(preheaderdata
[27], 16);
4071 extrafieldslist
= [];
4073 extraend
= extrastart
+ prefextrafields
;
4074 extrafieldslist
= [];
4075 if(extrastart
<extraend
):
4076 extrafieldslist
.append(preheaderdata
[extrastart
]);
4077 extrastart
= extrastart
+ 1;
4078 prefcs
= preheaderdata
[-2].lower();
4079 prenewfcs
= preheaderdata
[-1].lower();
4080 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
4081 if(prefcs
!=prenewfcs
and not skipchecksum
):
4082 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4083 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4085 valid_archive
= False;
4086 invalid_archive
= True;
4087 prefhend
= catfp
.tell() - 1;
4088 prefcontentstart
= catfp
.tell();
4090 pyhascontents
= False;
4092 if(prefcompression
):
4093 prefcontents
= catfp
.read(prefsize
);
4095 prefcontents
= catfp
.read(prefcsize
);
4096 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4097 pyhascontents
= True;
4098 if(prefccs
!=prenewfccs
and not skipchecksum
):
4099 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4100 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4102 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
4103 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
4104 if(abs(fseeknextasnum
)==0):
4106 catfp
.seek(fseeknextasnum
, 1);
4107 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
4108 fseeknextasnum
= int(prefseeknextfile
);
4109 if(abs(fseeknextasnum
)==0):
4111 catfp
.seek(fseeknextasnum
, 1);
4112 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
4113 fseeknextasnum
= int(prefseeknextfile
);
4114 if(abs(fseeknextasnum
)==0):
4116 catfp
.seek(fseeknextasnum
, 0);
4120 catfp
.seek(seekstart
, 0);
4122 catfheadsize
= int(preheaderdata
[0], 16);
4123 catfnumfields
= int(preheaderdata
[1], 16);
4124 catftype
= int(preheaderdata
[2], 16);
4125 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
4126 catfname
= preheaderdata
[3];
4128 catfname
= "./"+preheaderdata
[3];
4129 catflinkname
= preheaderdata
[4];
4130 catfsize
= int(preheaderdata
[5], 16);
4131 catfbasedir
= os
.path
.dirname(catfname
);
4132 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4134 catlist
.update({'catfp': catfp
});
4139 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
4141 def ArchiveFileSeekToFileName(infile
, seekfile
=None, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4142 formatspecs
= FormatSpecsListToDict(formatspecs
);
4143 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4146 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4147 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4148 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4149 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4150 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4151 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4152 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4153 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4154 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4155 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4156 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4163 if(hasattr(sys
.stdin
, "buffer")):
4164 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4166 shutil
.copyfileobj(sys
.stdin
, catfp
);
4168 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4172 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4173 catfp
= download_file_from_internet_file(infile
);
4174 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4180 infile
= RemoveWindowsPath(infile
);
4181 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4182 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4183 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4184 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4185 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4186 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4187 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4188 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4189 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4190 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4192 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4193 if(not compresscheck
):
4194 fextname
= os
.path
.splitext(infile
)[1];
4195 if(fextname
==".gz"):
4196 compresscheck
= "gzip";
4197 elif(fextname
==".bz2"):
4198 compresscheck
= "bzip2";
4199 elif(fextname
==".zst"):
4200 compresscheck
= "zstd";
4201 elif(fextname
==".lz4" or fextname
==".clz4"):
4202 compresscheck
= "lz4";
4203 elif(fextname
==".lzo" or fextname
==".lzop"):
4204 compresscheck
= "lzo";
4205 elif(fextname
==".lzma" or fextname
==".xz"):
4206 compresscheck
= "lzma";
4209 if(not compresscheck
):
4211 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4216 SeekToEndOfFile(catfp);
4218 SeekToEndOfFile(catfp);
4219 CatSize = catfp.tell();
4220 CatSizeEnd = CatSize;
4228 curloc
= catfp
.tell();
4231 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4233 catfp
.seek(curloc
, 0);
4234 catstring
= catheader
[0];
4235 catversion
= re
.findall(r
"([\d]+)", catstring
);
4236 fprenumfiles
= catheader
[1];
4237 fnumfiles
= int(fprenumfiles
, 16);
4238 fprechecksumtype
= catheader
[2];
4239 fprechecksum
= catheader
[3];
4240 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4241 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4242 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4243 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4244 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4245 fheadtell
= len(fileheader
);
4246 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4247 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4248 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4250 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4251 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4252 seekto
= fnumfiles
- 1
4257 prefhstart
= catfp
.tell();
4258 if(formatspecs
['new_style']):
4259 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4261 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4262 if(len(preheaderdata
)==0):
4264 prefheadsize
= int(preheaderdata
[0], 16);
4265 prefnumfields
= int(preheaderdata
[1], 16);
4266 preftype
= int(preheaderdata
[2], 16);
4267 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
4268 prefname
= preheaderdata
[3];
4270 prefname
= "./"+preheaderdata
[3];
4271 prefbasedir
= os
.path
.dirname(prefname
);
4272 preflinkname
= preheaderdata
[4];
4273 prefsize
= int(preheaderdata
[5], 16);
4274 prefatime
= int(preheaderdata
[6], 16);
4275 prefmtime
= int(preheaderdata
[7], 16);
4276 prefctime
= int(preheaderdata
[8], 16);
4277 prefbtime
= int(preheaderdata
[9], 16);
4278 prefmode
= int(preheaderdata
[10], 16);
4279 prefchmode
= stat
.S_IMODE(prefmode
);
4280 preftypemod
= stat
.S_IFMT(prefmode
);
4281 prefwinattributes
= int(preheaderdata
[11], 16);
4282 prefcompression
= preheaderdata
[12];
4283 prefcsize
= int(preheaderdata
[13], 16);
4284 prefuid
= int(preheaderdata
[14], 16);
4285 prefuname
= preheaderdata
[15];
4286 prefgid
= int(preheaderdata
[16], 16);
4287 prefgname
= preheaderdata
[17];
4288 fid
= int(preheaderdata
[18], 16);
4289 finode
= int(preheaderdata
[19], 16);
4290 flinkcount
= int(preheaderdata
[20], 16);
4291 prefdev_minor
= int(preheaderdata
[21], 16);
4292 prefdev_major
= int(preheaderdata
[22], 16);
4293 prefrdev_minor
= int(preheaderdata
[23], 16);
4294 prefrdev_major
= int(preheaderdata
[24], 16);
4295 prefseeknextfile
= preheaderdata
[25];
4296 prefextrasize
= int(preheaderdata
[26], 16);
4297 prefextrafields
= int(preheaderdata
[27], 16);
4298 extrafieldslist
= [];
4300 extraend
= extrastart
+ prefextrafields
;
4301 extrafieldslist
= [];
4302 if(extrastart
<extraend
):
4303 extrafieldslist
.append(preheaderdata
[extrastart
]);
4304 extrastart
= extrastart
+ 1;
4305 prefcs
= preheaderdata
[-2].lower();
4306 prenewfcs
= preheaderdata
[-1].lower();
4307 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
4308 if(prefcs
!=prenewfcs
and not skipchecksum
):
4309 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4310 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4312 valid_archive
= False;
4313 invalid_archive
= True;
4314 prefhend
= catfp
.tell() - 1;
4315 prefcontentstart
= catfp
.tell();
4317 pyhascontents
= False;
4319 if(prefcompression
):
4320 prefcontents
= catfp
.read(prefsize
);
4322 prefcontents
= catfp
.read(prefcsize
);
4323 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4324 pyhascontents
= True;
4325 if(prefccs
!=prenewfccs
and not skipchecksum
):
4326 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4327 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4329 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
4330 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
4331 if(abs(fseeknextasnum
)==0):
4333 catfp
.seek(fseeknextasnum
, 1);
4334 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
4335 fseeknextasnum
= int(prefseeknextfile
);
4336 if(abs(fseeknextasnum
)==0):
4338 catfp
.seek(fseeknextasnum
, 1);
4339 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
4340 fseeknextasnum
= int(prefseeknextfile
);
4341 if(abs(fseeknextasnum
)==0):
4343 catfp
.seek(fseeknextasnum
, 0);
4348 prefname
= preheaderdata
[2];
4349 if(re
.findall(r
"^[.|/]", preheaderdata
[2])):
4350 prefname
= preheaderdata
[2];
4352 prefname
= "./"+preheaderdata
[2];
4353 if(prefname
==seekfile
):
4356 catfp
.seek(seekstart
, 0);
4358 catfheadsize
= int(preheaderdata
[0], 16);
4359 catfnumfields
= int(preheaderdata
[1], 16);
4360 catftype
= int(preheaderdata
[2], 16);
4361 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
4362 catfname
= preheaderdata
[3];
4364 catfname
= "./"+preheaderdata
[3];
4365 catflinkname
= preheaderdata
[4];
4366 catfsize
= int(preheaderdata
[5], 16);
4367 catfbasedir
= os
.path
.dirname(catfname
);
4369 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4373 catlist
.update({'catfp': catfp
});
4378 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
4380 def ArchiveFileValidate(infile
, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4381 formatspecs
= FormatSpecsListToDict(formatspecs
);
4383 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4384 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4387 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4388 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4389 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4390 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4391 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4392 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4393 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4394 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4395 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4396 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4397 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4404 if(hasattr(sys
.stdin
, "buffer")):
4405 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4407 shutil
.copyfileobj(sys
.stdin
, catfp
);
4409 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4413 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4414 catfp
= download_file_from_internet_file(infile
);
4415 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4421 infile
= RemoveWindowsPath(infile
);
4422 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4423 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4424 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4425 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4426 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4427 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4428 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4429 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4430 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4431 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4433 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4434 if(not compresscheck
):
4435 fextname
= os
.path
.splitext(infile
)[1];
4436 if(fextname
==".gz"):
4437 compresscheck
= "gzip";
4438 elif(fextname
==".bz2"):
4439 compresscheck
= "bzip2";
4440 elif(fextname
==".zst"):
4441 compresscheck
= "zstd";
4442 elif(fextname
==".lz4" or fextname
==".clz4"):
4443 compresscheck
= "lz4";
4444 elif(fextname
==".lzo" or fextname
==".lzop"):
4445 compresscheck
= "lzo";
4446 elif(fextname
==".lzma" or fextname
==".xz"):
4447 compresscheck
= "lzma";
4450 if(not compresscheck
):
4452 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4457 SeekToEndOfFile(catfp);
4459 SeekToEndOfFile(catfp);
4460 CatSize = catfp.tell();
4461 CatSizeEnd = CatSize;
4469 curloc
= catfp
.tell();
4472 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4474 catfp
.seek(curloc
, 0);
4475 catstring
= catheader
[0];
4476 catversion
= re
.findall(r
"([\d]+)", catstring
);
4477 fprenumfiles
= catheader
[1];
4478 fnumfiles
= int(fprenumfiles
, 16);
4479 fprechecksumtype
= catheader
[2];
4480 fprechecksum
= catheader
[3];
4482 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4483 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4484 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4485 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4486 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4487 valid_archive
= True;
4488 invalid_archive
= False;
4490 VerbosePrintOut(infile
);
4491 VerbosePrintOut("Number of Records " + str(fnumfiles
));
4492 if(fprechecksum
==catfileheadercshex
):
4494 VerbosePrintOut("File Header Checksum Passed at offset " + str(0));
4495 VerbosePrintOut("'" + str(fprechecksum
) + "' == " + "'" + str(catfileheadercshex
) + "'");
4498 VerbosePrintOut("File Header Checksum Failed at offset " + str(0));
4499 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4500 valid_archive
= False;
4501 invalid_archive
= True;
4503 VerbosePrintOut("");
4504 while(il
<fnumfiles
):
4505 catfhstart
= catfp
.tell();
4506 if(formatspecs
['new_style']):
4507 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4509 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4510 if(len(catheaderdata
)==0):
4512 catfheadsize
= int(catheaderdata
[0], 16);
4513 catfnumfields
= int(catheaderdata
[1], 16);
4514 catftype
= int(catheaderdata
[2], 16);
4515 if(re
.findall(r
"^[.|/]", catheaderdata
[3])):
4516 catfname
= catheaderdata
[3];
4518 catfname
= "./"+catheaderdata
[3];
4519 catfbasedir
= os
.path
.dirname(catfname
);
4520 catflinkname
= catheaderdata
[4];
4521 catfsize
= int(catheaderdata
[5], 16);
4522 catfatime
= int(catheaderdata
[6], 16);
4523 catfmtime
= int(catheaderdata
[7], 16);
4524 catfctime
= int(catheaderdata
[8], 16);
4525 catfbtime
= int(catheaderdata
[9], 16);
4526 catfmode
= int(catheaderdata
[10], 16);
4527 catfchmode
= stat
.S_IMODE(catfmode
);
4528 catftypemod
= stat
.S_IFMT(catfmode
);
4529 catfwinattributes
= int(catheaderdata
[11], 16);
4530 catfcompression
= catheaderdata
[12];
4531 catfcsize
= int(catheaderdata
[13], 16);
4532 catfuid
= int(catheaderdata
[14], 16);
4533 catfuname
= catheaderdata
[15];
4534 catfgid
= int(catheaderdata
[16], 16);
4535 catfgname
= catheaderdata
[17];
4536 fid
= int(catheaderdata
[18], 16);
4537 finode
= int(catheaderdata
[19], 16);
4538 flinkcount
= int(catheaderdata
[20], 16);
4539 catfdev_minor
= int(catheaderdata
[21], 16);
4540 catfdev_major
= int(catheaderdata
[22], 16);
4541 catfrdev_minor
= int(catheaderdata
[23], 16);
4542 catfrdev_major
= int(catheaderdata
[24], 16);
4543 catfseeknextfile
= catheaderdata
[25];
4544 catfextrasize
= int(catheaderdata
[26], 16);
4545 catfextrafields
= int(catheaderdata
[27], 16);
4546 extrafieldslist
= [];
4548 extraend
= extrastart
+ catfextrafields
;
4549 extrafieldslist
= [];
4550 if(extrastart
<extraend
):
4551 extrafieldslist
.append(catheaderdata
[extrastart
]);
4552 extrastart
= extrastart
+ 1;
4553 catfcs
= catheaderdata
[-2].lower();
4554 catfccs
= catheaderdata
[-1].lower();
4555 catnewfcs
= GetHeaderChecksum(catheaderdata
[:-2], catheaderdata
[-4].lower(), True, formatspecs
);
4557 VerbosePrintOut(catfname
);
4558 VerbosePrintOut("Record Number " + str(il
) + "; File ID " + str(fid
) + "; iNode Number " + str(finode
));
4559 if(catfcs
==catnewfcs
):
4561 VerbosePrintOut("File Header Checksum Passed at offset " + str(catfhstart
));
4562 VerbosePrintOut("'" + str(catfcs
) + "' == " + "'" + str(catnewfcs
) + "'");
4565 VerbosePrintOut("File Header Checksum Failed at offset " + str(catfhstart
));
4566 VerbosePrintOut("'" + str(catfcs
) + "' != " + "'" + str(catnewfcs
) + "'");
4567 valid_archive
= False;
4568 invalid_archive
= True;
4569 catfhend
= catfp
.tell() - 1;
4570 catfcontentstart
= catfp
.tell();
4572 pyhascontents
= False;
4574 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4575 catfcontents
= catfp
.read(catfsize
);
4577 catfcontents
= catfp
.read(catfcsize
);
4578 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
4579 pyhascontents
= True;
4580 if(catfccs
==catnewfccs
):
4582 VerbosePrintOut("File Content Checksum Passed at offset " + str(catfcontentstart
));
4583 VerbosePrintOut("'" + str(catfccs
) + "' == " + "'" + str(catnewfccs
) + "'");
4586 VerbosePrintOut("File Content Checksum Failed at offset " + str(catfcontentstart
));
4587 VerbosePrintOut("'" + str(catfccs
) + "' != " + "'" + str(catnewfccs
) + "'");
4588 valid_archive
= False;
4589 invalid_archive
= True;
4591 VerbosePrintOut("");
4592 if(re
.findall(r
"^\+([0-9]+)", catfseeknextfile
)):
4593 fseeknextasnum
= int(catfseeknextfile
.replace("+", ""));
4594 if(abs(fseeknextasnum
)==0):
4596 catfp
.seek(fseeknextasnum
, 1);
4597 elif(re
.findall(r
"^\-([0-9]+)", catfseeknextfile
)):
4598 fseeknextasnum
= int(catfseeknextfile
);
4599 if(abs(fseeknextasnum
)==0):
4601 catfp
.seek(fseeknextasnum
, 1);
4602 elif(re
.findall(r
"^([0-9]+)", catfseeknextfile
)):
4603 fseeknextasnum
= int(catfseeknextfile
);
4604 if(abs(fseeknextasnum
)==0):
4606 catfp
.seek(fseeknextasnum
, 0);
4620 create_alias_function("", __file_format_name__
, "Validate", ArchiveFileValidate
);
4622 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4623 formatspecs
= FormatSpecsListToDict(formatspecs
);
4624 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4627 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4628 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4629 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4630 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4631 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4632 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4633 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4634 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4635 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4636 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4637 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4644 if(hasattr(sys
.stdin
, "buffer")):
4645 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4647 shutil
.copyfileobj(sys
.stdin
, catfp
);
4649 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4653 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4654 catfp
= download_file_from_internet_file(infile
);
4655 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4661 infile
= RemoveWindowsPath(infile
);
4662 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4663 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4664 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4665 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4666 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4667 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4668 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4669 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4670 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4671 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4673 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4674 if(not compresscheck
):
4675 fextname
= os
.path
.splitext(infile
)[1];
4676 if(fextname
==".gz"):
4677 compresscheck
= "gzip";
4678 elif(fextname
==".bz2"):
4679 compresscheck
= "bzip2";
4680 elif(fextname
==".zst"):
4681 compresscheck
= "zstd";
4682 elif(fextname
==".lz4" or fextname
==".clz4"):
4683 compresscheck
= "lz4";
4684 elif(fextname
==".lzo" or fextname
==".lzop"):
4685 compresscheck
= "lzo";
4686 elif(fextname
==".lzma" or fextname
==".xz"):
4687 compresscheck
= "lzma";
4690 if(not compresscheck
):
4692 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4697 SeekToEndOfFile(catfp);
4699 SeekToEndOfFile(catfp);
4700 CatSize = catfp.tell();
4701 CatSizeEnd = CatSize;
4709 curloc
= catfp
.tell();
4712 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4714 catfp
.seek(curloc
, 0);
4715 catstring
= catheader
[0];
4716 catversion
= re
.findall(r
"([\d]+)", catstring
);
4717 fprenumfiles
= catheader
[1];
4718 fnumfiles
= int(fprenumfiles
, 16);
4719 fprechecksumtype
= catheader
[2];
4720 fprechecksum
= catheader
[3];
4721 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4722 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4723 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4724 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4725 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4726 fheadtell
= len(fileheader
);
4727 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4728 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
4729 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4731 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4732 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': []};
4733 if(seekstart
<0 and seekstart
>fnumfiles
):
4735 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
4736 seekend
= fnumfiles
;
4737 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
4738 seekend
= fnumfiles
- abs(seekend
);
4741 while(il
< seekstart
):
4742 prefhstart
= catfp
.tell();
4743 if(formatspecs
['new_style']):
4744 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4746 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4747 if(len(preheaderdata
)==0):
4749 prefheadsize
= int(preheaderdata
[0], 16);
4750 prefnumfields
= int(preheaderdata
[1], 16);
4751 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
4752 prefname
= preheaderdata
[3];
4754 prefname
= "./"+preheaderdata
[3];
4755 prefsize
= int(preheaderdata
[5], 16);
4756 prefcompression
= preheaderdata
[12];
4757 prefcsize
= int(preheaderdata
[13], 16);
4758 prefseeknextfile
= preheaderdata
[25];
4759 prefextrasize
= int(preheaderdata
[26], 16);
4760 prefextrafields
= int(preheaderdata
[27], 16);
4761 extrafieldslist
= [];
4763 extraend
= extrastart
+ prefextrafields
;
4764 extrafieldslist
= [];
4765 if(extrastart
<extraend
):
4766 extrafieldslist
.append(preheaderdata
[extrastart
]);
4767 extrastart
= extrastart
+ 1;
4768 prefcs
= preheaderdata
[-2].lower();
4769 prenewfcs
= preheaderdata
[-1].lower();
4770 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
4771 if(prefcs
!=prenewfcs
and not skipchecksum
):
4772 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4773 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4775 valid_archive
= False;
4776 invalid_archive
= True;
4777 prefhend
= catfp
.tell() - 1;
4778 prefcontentstart
= catfp
.tell();
4780 pyhascontents
= False;
4782 if(prefcompression
=="none" or prefcompression
=="" or prefcompression
=="auto"):
4783 prefcontents
= catfp
.read(prefsize
);
4785 prefcontents
= catfp
.read(prefcsize
);
4786 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4787 pyhascontents
= True;
4788 if(prefccs
!=prenewfccs
and not skipchecksum
):
4789 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4790 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4792 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
4793 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
4794 if(abs(fseeknextasnum
)==0):
4796 catfp
.seek(fseeknextasnum
, 1);
4797 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
4798 fseeknextasnum
= int(prefseeknextfile
);
4799 if(abs(fseeknextasnum
)==0):
4801 catfp
.seek(fseeknextasnum
, 1);
4802 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
4803 fseeknextasnum
= int(prefseeknextfile
);
4804 if(abs(fseeknextasnum
)==0):
4806 catfp
.seek(fseeknextasnum
, 0);
4810 fileidnum
= seekstart
;
4812 while(fileidnum
<seekend
):
4813 catfhstart
= catfp
.tell();
4814 if(formatspecs
['new_style']):
4815 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4817 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4818 if(len(catheaderdata
)==0):
4820 catfheadsize
= int(catheaderdata
[0], 16);
4821 catfnumfields
= int(catheaderdata
[1], 16);
4822 catftype
= int(catheaderdata
[2], 16);
4823 if(re
.findall(r
"^[.|/]", catheaderdata
[3])):
4824 catfname
= catheaderdata
[3];
4826 catfname
= "./"+catheaderdata
[3];
4827 catfbasedir
= os
.path
.dirname(catfname
);
4828 catflinkname
= catheaderdata
[4];
4829 catfsize
= int(catheaderdata
[5], 16);
4830 catfatime
= int(catheaderdata
[6], 16);
4831 catfmtime
= int(catheaderdata
[7], 16);
4832 catfctime
= int(catheaderdata
[8], 16);
4833 catfbtime
= int(catheaderdata
[9], 16);
4834 catfmode
= int(catheaderdata
[10], 16);
4835 catfchmode
= stat
.S_IMODE(catfmode
);
4836 catftypemod
= stat
.S_IFMT(catfmode
);
4837 catfwinattributes
= int(catheaderdata
[11], 16);
4838 catfcompression
= catheaderdata
[12];
4839 catfcsize
= int(catheaderdata
[13], 16);
4840 catfuid
= int(catheaderdata
[14], 16);
4841 catfuname
= catheaderdata
[15];
4842 catfgid
= int(catheaderdata
[16], 16);
4843 catfgname
= catheaderdata
[17];
4844 catfid
= int(catheaderdata
[18], 16);
4845 catfinode
= int(catheaderdata
[19], 16);
4846 catflinkcount
= int(catheaderdata
[20], 16);
4847 catfdev_minor
= int(catheaderdata
[21], 16);
4848 catfdev_major
= int(catheaderdata
[22], 16);
4849 catfrdev_minor
= int(catheaderdata
[23], 16);
4850 catfrdev_major
= int(catheaderdata
[24], 16);
4851 catfseeknextfile
= catheaderdata
[25];
4852 catfextrasize
= int(catheaderdata
[26], 16);
4853 catfextrafields
= int(catheaderdata
[27], 16);
4854 extrafieldslist
= [];
4856 extraend
= extrastart
+ catfextrafields
;
4857 extrafieldslist
= [];
4858 if(extrastart
<extraend
):
4859 extrafieldslist
.append(catheaderdata
[extrastart
]);
4860 extrastart
= extrastart
+ 1;
4861 catfcs
= catheaderdata
[-2].lower();
4862 catfccs
= catheaderdata
[-1].lower();
4863 catnewfcs
= GetHeaderChecksum(catheaderdata
[:-2], catheaderdata
[-4].lower(), True, formatspecs
);
4864 if(catfcs
!=catnewfcs
and not skipchecksum
):
4865 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
4866 VerbosePrintOut("'" + str(catfcs
) + "' != " + "'" + str(catnewfcs
) + "'");
4868 catfhend
= catfp
.tell() - 1;
4869 catfcontentstart
= catfp
.tell();
4870 catfcontents
= BytesIO();
4871 pyhascontents
= False;
4872 if(catfsize
>0 and not listonly
):
4873 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4874 catfcontents
.write(catfp
.read(catfsize
));
4876 catfcontents
.write(catfp
.read(catfcsize
));
4877 catfcontents
.seek(0, 0);
4878 catnewfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
4879 pyhascontents
= True;
4880 if(catfccs
!=catnewfccs
and skipchecksum
):
4881 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
4882 VerbosePrintOut("'" + str(catfccs
) + "' != " + "'" + str(catnewfccs
) + "'");
4884 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4887 catfcontents
.seek(0, 0);
4889 catfcontents
= UncompressArchiveFile(catfcontents
, formatspecs
);
4890 catfcontents
.seek(0, 0);
4891 catfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
4892 if(catfsize
>0 and listonly
):
4893 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
4894 catfp
.seek(catfsize
, 1);
4896 catfp
.seek(catfcsize
, 1);
4897 pyhascontents
= False;
4898 catfcontentend
= catfp
.tell();
4899 if(re
.findall(r
"^\+([0-9]+)", catfseeknextfile
)):
4900 fseeknextasnum
= int(catfseeknextfile
.replace("+", ""));
4901 if(abs(fseeknextasnum
)==0):
4903 catfp
.seek(fseeknextasnum
, 1);
4904 elif(re
.findall(r
"^\-([0-9]+)", catfseeknextfile
)):
4905 fseeknextasnum
= int(catfseeknextfile
);
4906 if(abs(fseeknextasnum
)==0):
4908 catfp
.seek(fseeknextasnum
, 1);
4909 elif(re
.findall(r
"^([0-9]+)", catfseeknextfile
)):
4910 fseeknextasnum
= int(catfseeknextfile
);
4911 if(abs(fseeknextasnum
)==0):
4913 catfp
.seek(fseeknextasnum
, 0);
4916 catfcontents
.seek(0, 0);
4917 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
, 'fseeknextfile': catfseeknextfile
, 'fheaderchecksumtype': catheaderdata
[-4], 'fcontentchecksumtype': catheaderdata
[-3], 'fnumfields': catfnumfields
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': catfextrasize
, 'fextralist': extrafieldslist
, 'fheaderchecksum': catfcs
, 'fcontentchecksum': catfccs
, 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': catfcontents
});
4918 fileidnum
= fileidnum
+ 1;
4919 realidnum
= realidnum
+ 1;
4921 catlist
.update({'catfp': catfp
});
4926 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
4928 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4929 formatspecs
= FormatSpecsListToDict(formatspecs
);
4930 catfp
= BytesIO(catstr
);
4931 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
4932 return listcatfiles
;
4934 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
4936 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4937 formatspecs
= FormatSpecsListToDict(formatspecs
);
4939 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
4940 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
4941 return listcatfiles
;
4943 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4944 formatspecs
= FormatSpecsListToDict(formatspecs
);
4946 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
4947 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
4948 return listcatfiles
;
4950 if(not rarfile_support
):
4951 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4954 if(rarfile_support
):
4955 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4956 formatspecs
= FormatSpecsListToDict(formatspecs
);
4958 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
4959 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
4960 return listcatfiles
;
4962 if(not py7zr_support
):
4963 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4967 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4968 formatspecs
= FormatSpecsListToDict(formatspecs
);
4970 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
4971 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
4972 return listcatfiles
;
4974 def InFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4975 formatspecs
= FormatSpecsListToDict(formatspecs
);
4976 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4977 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4978 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4979 elif(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4980 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4981 elif(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4982 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4983 elif(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4984 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4985 elif(checkcompressfile
=="catfile"):
4986 return ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
4991 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
4992 formatspecs
= FormatSpecsListToDict(formatspecs
);
4993 catver
= formatspecs
['format_ver'];
4994 fileheaderver
= str(int(catver
.replace(".", "")));
4995 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
4996 advancedlist
= formatspecs
['use_advanced_list'];
4997 altinode
= formatspecs
['use_alt_inode'];
5000 for line
in sys
.stdin
:
5001 infilelist
.append(line
.strip());
5002 infilelist
= list(filter(None, infilelist
));
5003 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
5004 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
5006 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
5007 for line
in finfile
:
5008 infilelist
.append(line
.strip());
5009 infilelist
= list(filter(None, infilelist
));
5011 if(isinstance(infiles
, (list, tuple, ))):
5012 infilelist
= list(filter(None, infiles
));
5013 elif(isinstance(infiles
, (str, ))):
5014 infilelist
= list(filter(None, [infiles
]));
5016 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
5018 GetDirList
= ListDir(infilelist
, followlink
, False);
5026 inodetocatinode
= {};
5028 fnumfiles
= int(len(GetDirList
));
5029 catver
= formatspecs
['format_ver'];
5030 fileheaderver
= str(int(catver
.replace(".", "")));
5031 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5032 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5033 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5034 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5035 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5036 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5037 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5038 fheadtell
= len(fileheader
);
5039 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5040 for curfname
in GetDirList
:
5041 catfhstart
= fheadtell
;
5042 if(re
.findall(r
"^[.|/]", curfname
)):
5045 fname
= "./"+curfname
;
5047 VerbosePrintOut(fname
);
5048 if(not followlink
or followlink
is None):
5049 fstatinfo
= os
.lstat(fname
);
5051 fstatinfo
= os
.stat(fname
);
5052 fpremode
= fstatinfo
.st_mode
;
5053 finode
= fstatinfo
.st_ino
;
5054 flinkcount
= fstatinfo
.st_nlink
;
5056 if(stat
.S_ISREG(fpremode
)):
5058 elif(stat
.S_ISLNK(fpremode
)):
5060 elif(stat
.S_ISCHR(fpremode
)):
5062 elif(stat
.S_ISBLK(fpremode
)):
5064 elif(stat
.S_ISDIR(fpremode
)):
5066 elif(stat
.S_ISFIFO(fpremode
)):
5068 elif(stat
.S_ISSOCK(fpremode
)):
5070 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
5072 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
5074 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
5079 fbasedir
= os
.path
.dirname(fname
);
5081 if(not followlink
and finode
!=0):
5083 if(finode
in inodelist
):
5085 flinkname
= inodetofile
[finode
];
5089 fcurinode
= inodetocatinode
[finode
];
5090 if(finode
not in inodelist
):
5091 inodelist
.append(finode
);
5092 inodetofile
.update({finode
: fname
});
5093 inodetocatinode
.update({finode
: curinode
});
5097 fcurinode
= curinode
;
5098 curinode
= curinode
+ 1;
5100 fcurinode
= curinode
;
5101 curinode
= curinode
+ 1;
5102 curfid
= curfid
+ 1;
5104 flinkname
= os
.readlink(fname
);
5105 fdev
= fstatinfo
.st_dev
;
5106 getfdev
= GetDevMajorMinor(fdev
);
5107 fdev_minor
= getfdev
[0];
5108 fdev_major
= getfdev
[1];
5109 frdev
= fstatinfo
.st_dev
;
5110 if(hasattr(fstatinfo
, "st_rdev")):
5111 frdev
= fstatinfo
.st_rdev
;
5113 frdev
= fstatinfo
.st_dev
;
5114 getfrdev
= GetDevMajorMinor(frdev
);
5115 frdev_minor
= getfrdev
[0];
5116 frdev_major
= getfrdev
[1];
5117 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5119 if(ftype
==0 or ftype
==7):
5120 fsize
= fstatinfo
.st_size
;
5121 fatime
= fstatinfo
.st_atime
;
5122 fmtime
= fstatinfo
.st_mtime
;
5123 fctime
= fstatinfo
.st_ctime
;
5124 if(hasattr(fstatinfo
, "st_birthtime")):
5125 fbtime
= fstatinfo
.st_birthtime
;
5127 fbtime
= fstatinfo
.st_ctime
;
5128 fmode
= fstatinfo
.st_mode
;
5129 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
5130 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
5131 fuid
= fstatinfo
.st_uid
;
5132 fgid
= fstatinfo
.st_gid
;
5137 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
5138 funame
= userinfo
.pw_name
;
5147 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
5148 fgname
= groupinfo
.gr_name
;
5153 fdev_minor
= fdev_minor
;
5154 fdev_major
= fdev_major
;
5155 frdev_minor
= frdev_minor
;
5156 frdev_major
= frdev_major
;
5157 flinkcount
= flinkcount
;
5158 if(hasattr(fstatinfo
, "st_file_attributes")):
5159 fwinattributes
= fstatinfo
.st_file_attributes
;
5164 fcontents
= BytesIO();
5165 if(ftype
==0 or ftype
==7):
5166 with
open(fname
, "rb") as fpc
:
5167 shutil
.copyfileobj(fpc
, fcontents
);
5168 if(followlink
and (ftype
==1 or ftype
==2)):
5169 flstatinfo
= os
.stat(flinkname
);
5170 with
open(flinkname
, "rb") as fpc
:
5171 shutil
.copyfileobj(fpc
, fcontents
);
5172 fcontents
.seek(0, 0);
5173 ftypehex
= format(ftype
, 'x').lower();
5174 extrafields
= len(extradata
);
5175 extrafieldslist
= extradata
;
5176 catfextrafields
= extrafields
;
5177 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5178 if(len(extradata
)>0):
5179 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5180 extrasizelen
= len(extrasizestr
);
5181 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5182 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(), "+1", extrasizelenhex
, format(catfextrafields
, 'x').lower()];
5183 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5184 catoutlenhex
= format(catoutlen
, 'x').lower();
5185 catoutlist
.insert(0, catoutlenhex
);
5186 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5187 catheaderdata
= catoutlist
;
5188 if(len(extradata
)>0):
5189 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5191 checksumlist
= [checksumtype
, "none"];
5193 checksumlist
= [checksumtype
, checksumtype
];
5194 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
5195 catfnumfields
= catoutlen
;
5196 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5197 fcontents
.seek(0, 0);
5199 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
5201 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5202 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5203 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5204 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5205 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5206 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5207 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5208 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5209 catfcontentstart
= fheadtell
;
5210 fheadtell
+= len(catfileoutstr
) + 1;
5211 catfcontentend
= fheadtell
- 1;
5212 catfhend
= catfcontentend
;
5213 fcontents
.seek(0, 0);
5214 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5215 pyhascontents
= False;
5216 if(int(fsize
)>0 and not listonly
):
5217 pyhascontents
= True;
5218 if(int(fsize
)>0 and listonly
):
5219 fcontents
= BytesIO();
5220 pyhascontents
= False;
5221 fcontents
.seek(0, 0);
5222 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
, 'fseeknextfile': "+1", 'fheaderchecksumtype': checksumtype
, 'fcontentchecksumtype': 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
});
5223 fileidnum
= fileidnum
+ 1;
5226 def TarFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5227 formatspecs
= FormatSpecsListToDict(formatspecs
);
5233 inodetocatinode
= {};
5237 if(hasattr(sys
.stdin
, "buffer")):
5238 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5240 shutil
.copyfileobj(sys
.stdin
, infile
);
5245 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5246 infile
= download_file_from_internet_file(infile
);
5251 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5253 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
5255 if(not tarfile
.TarFileCheck(infile
)):
5257 except AttributeError:
5258 if(not TarFileCheck(infile
)):
5263 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5264 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
5266 tarfp
= tarfile
.open(infile
, "r");
5267 except FileNotFoundError
:
5269 fnumfiles
= int(len(tarfp
.getmembers()));
5270 catver
= formatspecs
['format_ver'];
5271 fileheaderver
= str(int(catver
.replace(".", "")));
5272 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5273 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5274 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5275 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5276 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5277 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5278 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5279 fheadtell
= len(fileheader
);
5280 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5281 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
5282 catfhstart
= fheadtell
;
5283 if(re
.findall(r
"^[.|/]", member
.name
)):
5284 fname
= member
.name
;
5286 fname
= "./"+member
.name
;
5288 VerbosePrintOut(fname
);
5289 fpremode
= member
.mode
;
5290 ffullmode
= member
.mode
;
5294 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5296 elif(member
.isdev()):
5297 ffullmode
= member
.mode
;
5299 elif(member
.islnk()):
5300 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5302 elif(member
.issym()):
5303 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
5305 elif(member
.ischr()):
5306 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
5308 elif(member
.isblk()):
5309 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
5311 elif(member
.isdir()):
5312 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
5314 elif(member
.isfifo()):
5315 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
5317 elif(member
.issparse()):
5318 ffullmode
= member
.mode
;
5321 ffullmode
= member
.mode
;
5324 fbasedir
= os
.path
.dirname(fname
);
5328 curfid
= curfid
+ 1;
5330 flinkname
= member
.linkname
;
5331 fdev_minor
= member
.devminor
;
5332 fdev_major
= member
.devmajor
;
5333 frdev_minor
= member
.devminor
;
5334 frdev_major
= member
.devmajor
;
5335 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5337 elif(ftype
==0 or ftype
==7):
5338 fsize
= member
.size
;
5340 fsize
= member
.size
;
5341 fatime
= member
.mtime
;
5342 fmtime
= member
.mtime
;
5343 fctime
= member
.mtime
;
5344 fbtime
= member
.mtime
;
5346 fchmode
= stat
.S_IMODE(ffullmode
);
5347 ftypemod
= stat
.S_IFMT(ffullmode
);
5350 funame
= member
.uname
;
5351 fgname
= member
.gname
;
5352 flinkcount
= flinkcount
;
5353 fwinattributes
= int(0);
5356 fcontents
= BytesIO();
5357 if(ftype
==0 or ftype
==7):
5358 with tarfp
.extractfile(member
) as fpc
:
5359 shutil
.copyfileobj(fpc
, fcontents
);
5360 fcontents
.seek(0, 0);
5361 ftypehex
= format(ftype
, 'x').lower();
5362 extrafields
= len(extradata
);
5363 extrafieldslist
= extradata
;
5364 catfextrafields
= extrafields
;
5365 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5366 if(len(extradata
)>0):
5367 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5368 extrasizelen
= len(extrasizestr
);
5369 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5370 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(), "+1", extrasizelenhex
, format(catfextrafields
, 'x').lower()];
5371 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5372 catoutlenhex
= format(catoutlen
, 'x').lower();
5373 catoutlist
.insert(0, catoutlenhex
);
5374 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5375 catheaderdata
= catoutlist
;
5376 if(len(extradata
)>0):
5377 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5379 checksumlist
= [checksumtype
, "none"];
5381 checksumlist
= [checksumtype
, checksumtype
];
5382 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
5383 catfnumfields
= catoutlen
;
5384 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5385 fcontents
.seek(0, 0);
5387 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
5389 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5390 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5391 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5392 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5393 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5394 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5395 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5396 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5397 catfcontentstart
= fheadtell
;
5398 fheadtell
+= len(catfileoutstr
) + 1;
5399 catfcontentend
= fheadtell
- 1;
5400 catfhend
= catfcontentend
;
5401 fcontents
.seek(0, 0);
5402 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5403 pyhascontents
= False;
5404 if(int(fsize
)>0 and not listonly
):
5405 pyhascontents
= True;
5406 if(int(fsize
)>0 and listonly
):
5407 fcontents
= BytesIO();
5408 pyhascontents
= False;
5409 fcontents
.seek(0, 0);
5410 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
, 'fseeknextfile': "+1", 'fheaderchecksumtype': checksumtype
, 'fcontentchecksumtype': 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
});
5411 fileidnum
= fileidnum
+ 1;
5414 def ZipFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5415 formatspecs
= FormatSpecsListToDict(formatspecs
);
5421 inodetocatinode
= {};
5425 if(hasattr(sys
.stdin
, "buffer")):
5426 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5428 shutil
.copyfileobj(sys
.stdin
, infile
);
5433 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5434 infile
= download_file_from_internet_file(infile
);
5439 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5443 if(not zipfile
.is_zipfile(infile
)):
5446 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
5447 except FileNotFoundError
:
5449 ziptest
= zipfp
.testzip();
5451 VerbosePrintOut("Bad file found!");
5452 fnumfiles
= int(len(zipfp
.infolist()));
5453 catver
= formatspecs
['format_ver'];
5454 fileheaderver
= str(int(catver
.replace(".", "")));
5455 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5456 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5457 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5458 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5459 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5460 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5461 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5462 fheadtell
= len(fileheader
);
5463 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5464 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
5465 catfhstart
= fheadtell
;
5466 if(re
.findall(r
"^[.|/]", member
.filename
)):
5467 fname
= member
.filename
;
5469 fname
= "./"+member
.filename
;
5470 zipinfo
= zipfp
.getinfo(member
.filename
);
5472 VerbosePrintOut(fname
);
5473 if(not member
.is_dir()):
5474 fpremode
= stat
.S_IFREG
+ 438;
5475 elif(member
.is_dir()):
5476 fpremode
= stat
.S_IFDIR
+ 511;
5479 if(not member
.is_dir()):
5481 elif(member
.is_dir()):
5484 fbasedir
= os
.path
.dirname(fname
);
5488 curfid
= curfid
+ 1;
5496 fsize
= member
.file_size
;
5498 fsize
= member
.file_size
;
5499 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5500 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5501 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5502 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5503 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
5504 fwinattributes
= int(zipinfo
.external_attr
);
5505 if(not member
.is_dir()):
5506 fmode
= int(stat
.S_IFREG
+ 438);
5507 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5508 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5509 elif(member
.is_dir()):
5510 fmode
= int(stat
.S_IFDIR
+ 511);
5511 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5512 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5513 elif(zipinfo
.create_system
==3):
5514 fwinattributes
= int(0);
5515 fmode
= int(zipinfo
.external_attr
);
5517 fwinattributes
= int(0);
5518 if(not member
.is_dir()):
5519 fmode
= int(stat
.S_IFREG
+ 438);
5520 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5521 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5522 elif(member
.is_dir()):
5523 fmode
= int(stat
.S_IFDIR
+ 511);
5524 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5525 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5530 except AttributeError:
5536 except AttributeError:
5543 userinfo
= pwd
.getpwuid(os
.getuid());
5544 funame
= userinfo
.pw_name
;
5547 except AttributeError:
5555 groupinfo
= grp
.getgrgid(os
.getgid());
5556 fgname
= groupinfo
.gr_name
;
5559 except AttributeError:
5563 fcontents
= BytesIO();
5565 fcontents
.write(zipfp
.read(member
.filename
));
5566 fcontents
.seek(0, 0);
5567 ftypehex
= format(ftype
, 'x').lower();
5568 extrafields
= len(extradata
);
5569 extrafieldslist
= extradata
;
5570 catfextrafields
= extrafields
;
5571 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5572 if(len(extradata
)>0):
5573 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5574 extrasizelen
= len(extrasizestr
);
5575 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5576 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(), "+1", extrasizelenhex
, format(catfextrafields
, 'x').lower()];
5577 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5578 catoutlenhex
= format(catoutlen
, 'x').lower();
5579 catoutlist
.insert(0, catoutlenhex
);
5580 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5581 catheaderdata
= catoutlist
;
5582 if(len(extradata
)>0):
5583 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5585 checksumlist
= [checksumtype
, "none"];
5587 checksumlist
= [checksumtype
, checksumtype
];
5588 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
5589 catfnumfields
= catoutlen
;
5590 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5591 fcontents
.seek(0, 0);
5593 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
5595 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5596 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5597 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5598 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5599 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5600 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5601 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5602 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5603 catfcontentstart
= fheadtell
;
5604 fheadtell
+= len(catfileoutstr
) + 1;
5605 catfcontentend
= fheadtell
- 1;
5606 catfhend
= catfcontentend
;
5607 fcontents
.seek(0, 0);
5608 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5609 pyhascontents
= False;
5610 if(int(fsize
)>0 and not listonly
):
5611 pyhascontents
= True;
5612 if(int(fsize
)>0 and listonly
):
5613 fcontents
= BytesIO();
5614 pyhascontents
= False;
5615 fcontents
.seek(0, 0);
5616 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
, 'fseeknextfile': "+1", 'fheaderchecksumtype': checksumtype
, 'fcontentchecksumtype': 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
});
5617 fileidnum
= fileidnum
+ 1;
5620 if(not rarfile_support
):
5621 def RarFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5624 if(rarfile_support
):
5625 def RarFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5626 formatspecs
= FormatSpecsListToDict(formatspecs
);
5632 inodetocatinode
= {};
5634 if(not os
.path
.exists(infile
,) or not os
.path
.isfile(infile
,)):
5636 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5638 rarfp
= rarfile
.RarFile(infile
, "r");
5639 rartest
= rarfp
.testrar();
5641 VerbosePrintOut("Bad file found!");
5642 fnumfiles
= int(len(rarfp
.infolist()));
5643 catver
= formatspecs
['format_ver'];
5644 fileheaderver
= str(int(catver
.replace(".", "")));
5645 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5646 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5647 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5648 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5649 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5650 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5651 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5652 fheadtell
= len(fileheader
);
5653 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5654 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5655 catfhstart
= fheadtell
;
5658 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
5661 member
.external_attr
5663 except AttributeError:
5665 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
5668 member
.external_attr
5670 except AttributeError:
5675 if(re
.findall(r
"^[.|/]", member
.filename
)):
5676 fname
= member
.filename
;
5678 fname
= "./"+member
.filename
;
5679 rarinfo
= rarfp
.getinfo(member
.filename
);
5681 VerbosePrintOut(fname
);
5682 if(is_unix
and member
.external_attr
!=0):
5683 fpremode
= int(member
.external_attr
);
5684 elif(member
.is_file()):
5685 fpremode
= stat
.S_IFREG
+ 438;
5686 elif(member
.is_symlink()):
5687 fpremode
= stat
.S_IFLNK
+ 438;
5688 elif(member
.is_dir()):
5689 fpremode
= stat
.S_IFDIR
+ 511;
5690 if(is_windows
and member
.external_attr
!=0):
5691 fwinattributes
= int(member
.external_attr
);
5693 fwinattributes
= int(0);
5698 if(member
.is_file()):
5700 elif(member
.is_symlink()):
5702 elif(member
.is_dir()):
5706 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
5707 fbasedir
= os
.path
.dirname(fname
);
5711 curfid
= curfid
+ 1;
5719 fsize
= member
.file_size
;
5722 fatime
= int(member
.atime
.timestamp());
5724 fatime
= int(member
.mtime
.timestamp());
5725 except AttributeError:
5726 fatime
= int(member
.mtime
.timestamp());
5727 fmtime
= int(member
.mtime
.timestamp());
5730 fctime
= int(member
.ctime
.timestamp());
5732 fctime
= int(member
.mtime
.timestamp());
5733 except AttributeError:
5734 fctime
= int(member
.mtime
.timestamp());
5735 fbtime
= int(member
.mtime
.timestamp());
5736 if(is_unix
and member
.external_attr
!=0):
5737 fmode
= int(member
.external_attr
);
5738 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5739 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5740 elif(member
.is_file()):
5741 fmode
= int(stat
.S_IFREG
+ 438)
5742 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5743 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5744 elif(member
.is_symlink()):
5745 fmode
= int(stat
.S_IFLNK
+ 438)
5746 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5747 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5748 elif(member
.is_dir()):
5749 fmode
= int(stat
.S_IFDIR
+ 511)
5750 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5751 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5754 except AttributeError:
5760 except AttributeError:
5767 userinfo
= pwd
.getpwuid(os
.getuid());
5768 funame
= userinfo
.pw_name
;
5771 except AttributeError:
5779 groupinfo
= grp
.getgrgid(os
.getgid());
5780 fgname
= groupinfo
.gr_name
;
5783 except AttributeError:
5787 fcontents
= BytesIO();
5789 fcontents
.write(rarfp
.read(member
.filename
));
5790 fcontents
.seek(0, 0);
5791 ftypehex
= format(ftype
, 'x').lower();
5792 extrafields
= len(extradata
);
5793 extrafieldslist
= extradata
;
5794 catfextrafields
= extrafields
;
5795 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5796 if(len(extradata
)>0):
5797 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5798 extrasizelen
= len(extrasizestr
);
5799 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5800 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(), "+1", extrasizelenhex
, format(catfextrafields
, 'x').lower()];
5801 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5802 catoutlenhex
= format(catoutlen
, 'x').lower();
5803 catoutlist
.insert(0, catoutlenhex
);
5804 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5805 if(len(extradata
)>0):
5806 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5808 checksumlist
= [checksumtype
, "none"];
5810 checksumlist
= [checksumtype
, checksumtype
];
5811 ccatfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
5812 catfnumfields
= 24 + catfextrafields
;
5813 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5814 fcontents
.seek(0, 0);
5816 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
5818 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5819 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5820 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5821 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5822 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5823 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5824 catheaderdata
= catoutlist
;
5825 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5826 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5827 catfcontentstart
= fheadtell
;
5828 fheadtell
+= len(catfileoutstr
) + 1;
5829 catfcontentend
= fheadtell
- 1;
5830 catfhend
= catfcontentend
;
5831 fcontents
.seek(0, 0);
5832 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5833 pyhascontents
= False;
5834 if(int(fsize
)>0 and not listonly
):
5835 pyhascontents
= True;
5836 if(int(fsize
)>0 and listonly
):
5837 fcontents
= BytesIO();
5838 pyhascontents
= False;
5839 fcontents
.seek(0, 0);
5840 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
, 'fseeknextfile': "+1", 'fheaderchecksumtype': checksumtype
, 'fcontentchecksumtype': 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
});
5841 fileidnum
= fileidnum
+ 1;
5844 if(not py7zr_support
):
5845 def SevenZipFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5849 def SevenZipFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5850 formatspecs
= FormatSpecsListToDict(formatspecs
);
5856 inodetocatinode
= {};
5858 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
5859 file_content
= szpfp
.readall();
5860 #sztest = szpfp.testzip();
5861 sztestalt
= szpfp
.test();
5863 VerbosePrintOut("Bad file found!");
5864 numfiles
= int(len(szpfp
.list()));
5865 catver
= formatspecs
['format_ver'];
5866 fileheaderver
= str(int(catver
.replace(".", "")));
5867 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5868 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5869 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5870 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5871 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5872 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5873 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5874 fheadtell
= len(fileheader
);
5875 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5876 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
5877 catfhstart
= fheadtell
;
5878 if(re
.findall(r
"^[.|/]", member
.filename
)):
5879 fname
= member
.filename
;
5881 fname
= "./"+member
.filename
;
5882 if(not member
.is_directory
):
5883 fpremode
= int(stat
.S_IFREG
+ 438);
5884 elif(member
.is_directory
):
5885 fpremode
= int(stat
.S_IFDIR
+ 511);
5886 fwinattributes
= int(0);
5891 if(member
.is_directory
):
5896 fbasedir
= os
.path
.dirname(fname
);
5900 curfid
= curfid
+ 1;
5907 fatime
= int(member
.creationtime
.timestamp());
5908 fmtime
= int(member
.creationtime
.timestamp());
5909 fctime
= int(member
.creationtime
.timestamp());
5910 fbtime
= int(member
.creationtime
.timestamp());
5911 if(member
.is_directory
):
5912 fmode
= int(stat
.S_IFDIR
+ 511)
5913 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5914 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5916 fmode
= int(stat
.S_IFLNK
+ 438)
5917 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5918 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5921 except AttributeError:
5927 except AttributeError:
5934 userinfo
= pwd
.getpwuid(os
.getuid());
5935 funame
= userinfo
.pw_name
;
5938 except AttributeError:
5946 groupinfo
= grp
.getgrgid(os
.getgid());
5947 fgname
= groupinfo
.gr_name
;
5950 except AttributeError:
5954 fcontents
= BytesIO();
5956 fcontents
.write(file_content
[member
.filename
].read());
5957 fsize
= format(fcontents
.tell(), 'x').lower();
5959 fcontents
.seek(0, 0);
5960 ftypehex
= format(ftype
, 'x').lower();
5961 extrafields
= len(extradata
);
5962 extrafieldslist
= extradata
;
5963 catfextrafields
= extrafields
;
5964 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5965 if(len(extradata
)>0):
5966 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5967 extrasizelen
= len(extrasizestr
);
5968 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5969 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(), "+1", extrasizelenhex
, format(catfextrafields
, 'x').lower()];
5970 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5971 catoutlenhex
= format(catoutlen
, 'x').lower();
5972 catoutlist
.insert(0, catoutlenhex
);
5973 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5974 catheaderdata
= catoutlist
;
5975 if(len(extradata
)>0):
5976 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5978 checksumlist
= [checksumtype
, "none"];
5980 checksumlist
= [checksumtype
, checksumtype
];
5981 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
5982 catfnumfields
= 24 + catfextrafields
;
5983 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5984 fcontents
.seek(0, 0);
5986 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
5988 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5989 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5990 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5991 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5992 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5993 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5994 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5995 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5996 catfcontentstart
= fheadtell
;
5997 fheadtell
+= len(catfileoutstr
) + 1;
5998 catfcontentend
= fheadtell
- 1;
5999 catfhend
= catfcontentend
;
6000 fcontents
.seek(0, 0);
6001 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
6002 pyhascontents
= False;
6003 if(int(fsize
)>0 and not listonly
):
6004 pyhascontents
= True;
6005 if(int(fsize
)>0 and listonly
):
6006 fcontents
= BytesIO();
6007 pyhascontents
= False;
6008 fcontents
.seek(0, 0);
6009 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
, 'fseeknextfile': "+1", 'fheaderchecksumtype': checksumtype
, 'fcontentchecksumtype': 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
});
6010 fileidnum
= fileidnum
+ 1;
6013 def InFileToArrayAlt(infile
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6014 formatspecs
= FormatSpecsListToDict(formatspecs
);
6015 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
6016 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
6017 return TarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6018 elif(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
6019 return ZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6020 elif(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
6021 return RarFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6022 elif(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
6023 return SevenZipFileToArrayAlt(infile
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6024 elif(checkcompressfile
=="catfile"):
6025 return ArchiveFileToArray(infile
, 0, 0, listonly
, True, False, formatspecs
, False);
6030 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):
6031 formatspecs
= FormatSpecsListToDict(formatspecs
);
6032 outarray
= BytesIO();
6033 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6034 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6035 return listcatfiles
;
6037 def ArchiveFileArrayToArrayIndex(inarray
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6038 formatspecs
= FormatSpecsListToDict(formatspecs
);
6039 if(isinstance(inarray
, dict)):
6040 listcatfiles
= inarray
;
6043 if(not listcatfiles
):
6045 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': {}}}};
6047 catarray
.update({'catfp': listcatfiles
['catfp']});
6048 lenlist
= len(listcatfiles
['ffilelist']);
6050 lcfx
= int(listcatfiles
['fnumfiles']);
6051 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6052 lcfx
= int(lenlist
);
6054 lcfx
= int(listcatfiles
['fnumfiles']);
6056 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6057 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6058 catarray
['filetoid'].update(filetoidarray
);
6059 catarray
['idtofile'].update(idtofilearray
);
6060 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6061 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6062 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6063 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6064 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6065 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6066 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6067 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6068 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6069 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6070 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6071 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6072 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6073 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6074 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6075 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6076 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6077 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6078 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6079 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6080 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6081 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6082 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6083 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6084 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6085 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6086 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6087 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6088 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6089 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6090 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6094 create_alias_function("", __file_format_name__
, "ArrayToArrayIndex", ArchiveFileArrayToArrayIndex
);
6096 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):
6097 formatspecs
= FormatSpecsListToDict(formatspecs
);
6098 if(isinstance(infile
, dict)):
6099 listcatfiles
= infile
;
6101 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6102 infile
= RemoveWindowsPath(infile
);
6103 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6104 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
6105 outfile
= RemoveWindowsPath(outfile
);
6106 checksumtype
= checksumtype
.lower();
6107 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
6108 checksumtype
="crc32";
6109 if(checksumtype
=="none"):
6111 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
6112 compression
= "auto";
6113 if(compression
not in compressionlist
and compression
is None):
6114 compression
= "auto";
6116 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6117 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
6118 if(os
.path
.exists(outfile
)):
6121 except OSError as e
:
6123 if(not listcatfiles
):
6128 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6130 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6133 fbasename
= os
.path
.splitext(outfile
)[0];
6134 fextname
= os
.path
.splitext(outfile
)[1];
6135 if(not compresswholefile
and fextname
in outextlistwd
):
6136 compresswholefile
= True;
6137 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
6138 catver
= formatspecs
['format_ver'];
6139 fileheaderver
= str(int(catver
.replace(".", "")));
6140 lenlist
= len(listcatfiles
['ffilelist']);
6141 fnumfiles
= int(listcatfiles
['fnumfiles']);
6142 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
6143 fnumfiles
= lenlist
;
6144 AppendFileHeader(catfp
, fnumfiles
, checksumtype
, formatspecs
);
6145 lenlist
= len(listcatfiles
['ffilelist']);
6146 fnumfiles
= int(listcatfiles
['fnumfiles']);
6148 lcfx
= int(listcatfiles
['fnumfiles']);
6149 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6150 lcfx
= int(lenlist
);
6152 lcfx
= int(listcatfiles
['fnumfiles']);
6160 if(re
.findall(r
"^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
6161 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
6163 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
6165 VerbosePrintOut(fname
);
6166 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
6167 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
6168 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6169 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
6170 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
6171 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
6172 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
6173 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
6174 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
6175 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
6176 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
6177 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
6178 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
6179 finode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['finode']), 'x').lower();
6180 flinkcount
= format(int(listcatfiles
['ffilelist'][reallcfi
]['flinkcount']), 'x').lower();
6181 fwinattributes
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fwinattributes']), 'x').lower();
6182 fcompression
= listcatfiles
['ffilelist'][reallcfi
]['fcompression'];
6183 fcsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fcsize']), 'x').lower();
6184 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
6185 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
6186 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
6187 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
6188 fseeknextfile
= listcatfiles
['ffilelist'][reallcfi
]['fseeknextfile'];
6189 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
6190 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6191 if(not followlink
and len(extradata
)<0):
6192 extradata
= listcatfiles
['ffilelist'][reallcfi
]['fextralist'];
6193 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
6195 fcsize
= format(int(0), 'x').lower();
6196 if(not compresswholefile
):
6197 fcontents
.seek(0, 2);
6198 ucfsize
= fcontents
.tell();
6199 fcontents
.seek(0, 0);
6200 if(compression
=="auto"):
6201 ilsize
= len(compressionlistalt
);
6204 while(ilmin
< ilsize
):
6205 cfcontents
= BytesIO();
6206 shutil
.copyfileobj(fcontents
, cfcontents
);
6207 fcontents
.seek(0, 0);
6208 cfcontents
.seek(0, 0);
6209 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
6211 cfcontents
.seek(0, 2);
6212 ilcsize
.append(cfcontents
.tell());
6216 ilcsize
.append(sys
.maxint
);
6217 except AttributeError:
6218 ilcsize
.append(sys
.maxsize
);
6220 ilcmin
= ilcsize
.index(min(ilcsize
));
6221 compression
= compressionlistalt
[ilcmin
];
6222 fcontents
.seek(0, 0);
6223 cfcontents
= BytesIO();
6224 shutil
.copyfileobj(fcontents
, cfcontents
);
6225 cfcontents
.seek(0, 0);
6226 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
6227 cfcontents
.seek(0, 2);
6228 cfsize
= cfcontents
.tell();
6229 if(ucfsize
> cfsize
):
6230 fcsize
= format(int(cfsize
), 'x').lower();
6231 fcompression
= compression
;
6233 fcontents
= cfcontents
;
6235 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
6236 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6237 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6238 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6239 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
6240 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
6241 flinkname
= flinkinfo
['flinkname'];
6242 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
6243 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
6244 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
6245 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
6246 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
6247 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
6248 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
6249 funame
= flinkinfo
['funame'];
6250 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
6251 fgname
= flinkinfo
['fgname'];
6252 finode
= format(int(flinkinfo
['finode']), 'x').lower();
6253 flinkcount
= format(int(flinkinfo
['flinkcount']), 'x').lower();
6254 fwinattributes
= format(int(flinkinfo
['fwinattributes']), 'x').lower();
6255 fcompression
= flinkinfo
['fcompression'];
6256 fcsize
= format(int(flinkinfo
['fcsize']), 'x').lower();
6257 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
6258 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
6259 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
6260 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
6261 fseeknextfile
= flinkinfo
['fseeknextfile'];
6262 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
6263 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
6264 if(len(extradata
)<0):
6265 extradata
= flinkinfo
['fextralist'];
6266 fcontents
= flinkinfo
['fcontents'];
6267 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
6269 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
6270 fcurfid
= format(curfid
, 'x').lower();
6271 if(not followlink
and finode
!=0):
6272 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
6273 fcurinode
= format(int(curinode
), 'x').lower();
6274 inodetofile
.update({curinode
: fname
});
6275 filetoinode
.update({fname
: curinode
});
6276 curinode
= curinode
+ 1;
6278 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
6280 fcurinode
= format(int(curinode
), 'x').lower();
6281 curinode
= curinode
+ 1;
6282 curfid
= curfid
+ 1;
6283 if(fcompression
=="none"):
6285 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
, fseeknextfile
];
6286 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
6289 reallcfi
= reallcfi
+ 1;
6291 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
6292 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6293 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
6296 os
.fsync(catfp
.fileno());
6297 except io
.UnsupportedOperation
:
6299 except AttributeError:
6301 except OSError as e
:
6305 if(hasattr(sys
.stdout
, "buffer")):
6306 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
6308 shutil
.copyfileobj(catfp
, sys
.stdout
);
6309 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6310 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
6312 upload_file_to_internet_file(catfp
, outfile
);
6320 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
6322 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6323 formatspecs
= FormatSpecsListToDict(formatspecs
);
6324 catfp
= BytesIO(catstr
);
6325 listcatfiles
= RePackArchiveFile(catfp
, compression
, compresswholefile
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6326 return listcatfiles
;
6328 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
6330 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):
6331 formatspecs
= FormatSpecsListToDict(formatspecs
);
6332 outarray
= BytesIO();
6333 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6334 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6335 return listcatfiles
;
6337 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
6339 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):
6340 formatspecs
= FormatSpecsListToDict(formatspecs
);
6341 if(outdir
is not None):
6342 outdir
= RemoveWindowsPath(outdir
);
6344 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6345 if(isinstance(infile
, dict)):
6346 listcatfiles
= infile
;
6348 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6349 infile
= RemoveWindowsPath(infile
);
6350 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6351 if(not listcatfiles
):
6353 lenlist
= len(listcatfiles
['ffilelist']);
6354 fnumfiles
= int(listcatfiles
['fnumfiles']);
6356 lcfx
= int(listcatfiles
['fnumfiles']);
6357 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6358 lcfx
= int(lenlist
);
6360 lcfx
= int(listcatfiles
['fnumfiles']);
6366 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
6367 funame
= userinfo
.pw_name
;
6376 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
6377 fgname
= groupinfo
.gr_name
;
6383 VerbosePrintOut(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6384 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6385 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6386 listcatfiles
['ffilelist'][lcfi
]['fcontents'].seek(0, 0);
6387 shutil
.copyfileobj(listcatfiles
['ffilelist'][lcfi
]['fcontents'], fpc
);
6390 os
.fsync(fpc
.fileno());
6391 except io
.UnsupportedOperation
:
6393 except AttributeError:
6395 except OSError as e
:
6397 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6398 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6399 if(preservepermissions
):
6400 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6402 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6403 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6405 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6406 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6407 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6412 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6413 funame
= userinfo
.pw_name
;
6422 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6423 fgname
= groupinfo
.gr_name
;
6428 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6429 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6430 flinkinfo
['fcontents'].seek(0, 0);
6431 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6434 os
.fsync(fpc
.fileno());
6435 except io
.UnsupportedOperation
:
6437 except AttributeError:
6439 except OSError as e
:
6441 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6442 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6443 if(preservepermissions
):
6444 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6446 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6447 if(flinkinfo
['ftype']==1):
6448 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6449 if(flinkinfo
['ftype']==2):
6450 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6451 if(flinkinfo
['ftype']==5):
6452 if(preservepermissions
):
6453 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6455 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6456 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6457 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6458 if(preservepermissions
):
6459 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6461 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6462 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6463 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6465 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6466 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6468 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6469 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6470 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6475 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6476 funame
= userinfo
.pw_name
;
6485 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6486 fgname
= groupinfo
.gr_name
;
6491 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6492 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6493 flinkinfo
['fcontents'].seek(0, 0);
6494 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6497 os
.fsync(fpc
.fileno());
6498 except io
.UnsupportedOperation
:
6500 except AttributeError:
6502 except OSError as e
:
6504 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6505 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6506 if(preservepermissions
):
6507 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6509 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6510 if(flinkinfo
['ftype']==1):
6511 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6512 if(flinkinfo
['ftype']==2):
6513 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6514 if(flinkinfo
['ftype']==5):
6515 if(preservepermissions
):
6516 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6518 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6519 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6520 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6521 if(preservepermissions
):
6522 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6524 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6525 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6526 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6528 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6529 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6530 if(preservepermissions
):
6531 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6533 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6534 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6535 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6536 if(preservepermissions
):
6537 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6539 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6540 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
6541 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6544 return listcatfiles
['ffilelist']['catfp'];
6548 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
6550 if(hasattr(shutil
, "register_unpack_format")):
6551 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
6552 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_dict__
['format_delimiter'], False, False);
6553 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
6555 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6556 formatspecs
= FormatSpecsListToDict(formatspecs
);
6557 catfp
= BytesIO(catstr
);
6558 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6559 return listcatfiles
;
6561 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
6563 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6564 formatspecs
= FormatSpecsListToDict(formatspecs
);
6565 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6566 if(isinstance(infile
, dict)):
6567 listcatfiles
= infile
;
6569 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6570 infile
= RemoveWindowsPath(infile
);
6571 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, False, skipchecksum
, formatspecs
, returnfp
);
6572 if(not listcatfiles
):
6574 lenlist
= len(listcatfiles
['ffilelist']);
6575 fnumfiles
= int(listcatfiles
['fnumfiles']);
6577 lcfx
= int(listcatfiles
['fnumfiles']);
6578 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6579 lcfx
= int(lenlist
);
6581 lcfx
= int(listcatfiles
['fnumfiles']);
6584 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
6586 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
6588 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' } };
6589 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
6590 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6591 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6592 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6593 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6594 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
6595 if(len(fuprint
)<=0):
6596 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
6597 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
6598 if(len(fgprint
)<=0):
6599 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
6600 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
));
6603 return listcatfiles
['catfp'];
6607 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
6609 def ArchiveFileStringListFiles(catstr
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6610 formatspecs
= FormatSpecsListToDict(formatspecs
);
6611 catfp
= BytesIO(catstr
);
6612 listcatfiles
= ArchiveFileListFiles(catstr
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6613 return listcatfiles
;
6615 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileStringListFiles
);
6617 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
6618 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6621 if(hasattr(sys
.stdin
, "buffer")):
6622 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
6624 shutil
.copyfileobj(sys
.stdin
, infile
);
6629 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
6630 infile
= download_file_from_internet_file(infile
);
6635 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6637 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
6639 if(not tarfile
.TarFileCheck(infile
)):
6641 except AttributeError:
6642 if(not TarFileCheck(infile
)):
6647 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
6648 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
6650 tarfp
= tarfile
.open(infile
, "r");
6651 except FileNotFoundError
:
6655 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
6656 returnval
.update({lcfi
: member
.name
});
6657 fpremode
= member
.mode
;
6658 ffullmode
= member
.mode
;
6662 ffullmode
= member
.mode
+ stat
.S_IFREG
;
6664 elif(member
.isdev()):
6665 ffullmode
= member
.mode
;
6667 elif(member
.islnk()):
6668 ffullmode
= member
.mode
+ stat
.S_IFREG
;
6670 elif(member
.issym()):
6671 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
6673 elif(member
.ischr()):
6674 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
6676 elif(member
.isblk()):
6677 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
6679 elif(member
.isdir()):
6680 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
6682 elif(member
.isfifo()):
6683 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
6685 elif(member
.issparse()):
6686 ffullmode
= member
.mode
;
6689 VerbosePrintOut(member
.name
);
6691 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' } };
6692 printfname
= member
.name
;
6694 printfname
= member
.name
+ " link to " + member
.linkname
;
6695 elif(member
.issym()):
6696 printfname
= member
.name
+ " -> " + member
.linkname
;
6697 fuprint
= member
.uname
;
6698 if(len(fuprint
)<=0):
6699 fuprint
= member
.uid
;
6700 fgprint
= member
.gname
;
6701 if(len(fgprint
)<=0):
6702 fgprint
= member
.gid
;
6703 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
));
6706 return listcatfiles
['catfp'];
6710 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
6711 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6714 if(hasattr(sys
.stdin
, "buffer")):
6715 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
6717 shutil
.copyfileobj(sys
.stdin
, infile
);
6722 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
6723 infile
= download_file_from_internet_file(infile
);
6728 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6732 if(not zipfile
.is_zipfile(infile
)):
6735 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
6736 except FileNotFoundError
:
6740 ziptest
= zipfp
.testzip();
6742 VerbosePrintOut("Bad file found!");
6743 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
6744 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
6745 fwinattributes
= int(zipinfo
.external_attr
);
6746 if(not member
.is_dir()):
6747 fmode
= int(stat
.S_IFREG
+ 438);
6748 fchmode
= int(stat
.S_IMODE(fmode
));
6749 ftypemod
= int(stat
.S_IFMT(fmode
));
6750 elif(member
.is_dir()):
6751 fmode
= int(stat
.S_IFDIR
+ 511);
6752 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6753 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6754 elif(zipinfo
.create_system
==3):
6755 fwinattributes
=int(0);
6756 fmode
= int(zipinfo
.external_attr
);
6757 fchmode
= int(stat
.S_IMODE(fmode
));
6758 ftypemod
= int(stat
.S_IFMT(fmode
));
6760 fwinattributes
= int(0);
6761 if(not member
.is_dir()):
6762 fmode
= int(stat
.S_IFREG
+ 438);
6763 fchmode
= int(stat
.S_IMODE(fmode
));
6764 ftypemod
= int(stat
.S_IFMT(fmode
));
6765 elif(member
.is_dir()):
6766 fmode
= int(stat
.S_IFDIR
+ 511);
6767 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6768 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6769 returnval
.update({lcfi
: member
.filename
});
6771 VerbosePrintOut(member
.filename
);
6773 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' } };
6775 for fmodval
in str(oct(fmode
))[-3:]:
6776 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
6777 if(not member
.is_dir()):
6779 permissionstr
= "-" + permissionstr
;
6780 elif(member
.is_dir()):
6782 permissionstr
= "d" + permissionstr
;
6783 printfname
= member
.filename
;
6785 fuid
= int(os
.getuid());
6786 except AttributeError:
6791 fgid
= int(os
.getgid());
6792 except AttributeError:
6799 userinfo
= pwd
.getpwuid(os
.getuid());
6800 funame
= userinfo
.pw_name
;
6803 except AttributeError:
6811 groupinfo
= grp
.getgrgid(os
.getgid());
6812 fgname
= groupinfo
.gr_name
;
6815 except AttributeError:
6820 if(len(fuprint
)<=0):
6821 fuprint
= str(fuid
);
6823 if(len(fgprint
)<=0):
6824 fgprint
= str(fgid
);
6825 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
));
6828 return listcatfiles
['catfp'];
6832 if(not rarfile_support
):
6833 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
6834 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6835 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6838 if(rarfile_support
):
6839 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
6840 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6841 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6843 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
6847 rarfp
= rarfile
.RarFile(infile
, "r");
6848 rartest
= rarfp
.testrar();
6850 VerbosePrintOut("Bad file found!");
6851 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
6854 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
6857 member
.external_attr
6859 except AttributeError:
6861 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
6864 member
.external_attr
6866 except AttributeError:
6871 if(is_unix
and member
.external_attr
!=0):
6872 fpremode
= int(member
.external_attr
);
6873 elif(member
.is_file()):
6874 fpremode
= int(stat
.S_IFREG
+ 438);
6875 elif(member
.is_symlink()):
6876 fpremode
= int(stat
.S_IFLNK
+ 438);
6877 elif(member
.is_dir()):
6878 fpremode
= int(stat
.S_IFDIR
+ 511);
6879 if(is_windows
and member
.external_attr
!=0):
6880 fwinattributes
= int(member
.external_attr
);
6882 fwinattributes
= int(0);
6883 if(is_unix
and member
.external_attr
!=0):
6884 fmode
= int(member
.external_attr
);
6885 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
6886 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
6887 elif(member
.is_file()):
6888 fmode
= int(stat
.S_IFREG
+ 438);
6889 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
6890 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
6891 elif(member
.is_symlink()):
6892 fmode
= int(stat
.S_IFLNK
+ 438);
6893 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
6894 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
6895 elif(member
.is_dir()):
6896 fmode
= int(stat
.S_IFDIR
+ 511);
6897 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6898 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6899 returnval
.update({lcfi
: member
.filename
});
6901 VerbosePrintOut(member
.filename
);
6903 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' } };
6905 for fmodval
in str(oct(fmode
))[-3:]:
6906 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
6907 if(member
.is_file()):
6909 permissionstr
= "-" + permissionstr
;
6910 printfname
= member
.filename
;
6911 elif(member
.is_symlink()):
6913 permissionstr
= "l" + permissionstr
;
6914 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
6915 elif(member
.is_dir()):
6917 permissionstr
= "d" + permissionstr
;
6918 printfname
= member
.filename
;
6920 fuid
= int(os
.getuid());
6921 except AttributeError:
6926 fgid
= int(os
.getgid());
6927 except AttributeError:
6934 userinfo
= pwd
.getpwuid(os
.getuid());
6935 funame
= userinfo
.pw_name
;
6938 except AttributeError:
6946 groupinfo
= grp
.getgrgid(os
.getgid());
6947 fgname
= groupinfo
.gr_name
;
6950 except AttributeError:
6955 if(len(fuprint
)<=0):
6956 fuprint
= str(fuid
);
6958 if(len(fgprint
)<=0):
6959 fgprint
= str(fgid
);
6960 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
6963 return listcatfiles
['catfp'];
6967 if(not py7zr_support
):
6968 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
6969 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6970 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6974 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
6975 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6976 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6980 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
6981 file_content
= szpfp
.readall();
6982 #sztest = szpfp.testzip();
6983 sztestalt
= szpfp
.test();
6985 VerbosePrintOut("Bad file found!");
6986 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
6987 if(re
.findall(r
"^[.|/]", member
.filename
)):
6988 fname
= member
.filename
;
6990 fname
= "./"+member
.filename
;
6991 if(not member
.is_directory
):
6992 fpremode
= int(stat
.S_IFREG
+ 438);
6993 elif(member
.is_directory
):
6994 fpremode
= int(stat
.S_IFDIR
+ 511);
6995 fwinattributes
= int(0);
6996 if(member
.is_directory
):
6997 fmode
= int(stat
.S_IFDIR
+ 511);
6998 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6999 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7001 fmode
= int(stat
.S_IFLNK
+ 438);
7002 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7003 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7004 returnval
.update({lcfi
: member
.filename
});
7006 VerbosePrintOut(member
.filename
);
7008 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' } };
7010 for fmodval
in str(oct(fmode
))[-3:]:
7011 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7013 if(not member
.is_directory
):
7015 permissionstr
= "-" + permissionstr
;
7016 printfname
= member
.filename
;
7017 elif(member
.is_directory
):
7019 permissionstr
= "d" + permissionstr
;
7020 printfname
= member
.filename
;
7022 fsize
= len(file_content
[member
.filename
].read());
7023 file_content
[member
.filename
].close();
7025 fuid
= int(os
.getuid());
7026 except AttributeError:
7031 fgid
= int(os
.getgid());
7032 except AttributeError:
7039 userinfo
= pwd
.getpwuid(os
.getuid());
7040 funame
= userinfo
.pw_name
;
7043 except AttributeError:
7051 groupinfo
= grp
.getgrgid(os
.getgid());
7052 fgname
= groupinfo
.gr_name
;
7055 except AttributeError:
7060 if(len(fuprint
)<=0):
7061 fuprint
= str(fuid
);
7063 if(len(fgprint
)<=0):
7064 fgprint
= str(fgid
);
7065 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(fsize
).rjust(15) + " " + member
.creationtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7068 return listcatfiles
['catfp'];
7072 def InFileListFiles(infile
, verbose
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
7073 formatspecs
= FormatSpecsListToDict(formatspecs
);
7074 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7075 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
7076 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
7077 return TarFileListFiles(infile
, verbose
, returnfp
);
7078 elif(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
7079 return ZipFileListFiles(infile
, verbose
, returnfp
);
7080 elif(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
7081 return RarFileListFiles(infile
, verbose
, returnfp
);
7082 elif(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
7083 return SevenZipFileListFiles(infile
, verbose
, returnfp
);
7084 elif(checkcompressfile
=="catfile"):
7085 return ArchiveFileListFiles(infile
, 0, 0, False, formatspecs
, verbose
, returnfp
);
7090 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):
7091 formatspecs
= FormatSpecsListToDict(formatspecs
);
7092 outarray
= BytesIO();
7093 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
7094 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7095 return listcatfiles
;
7097 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):
7098 formatspecs
= FormatSpecsListToDict(formatspecs
);
7099 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
7100 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7101 return listcatfiles
;
7103 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):
7104 formatspecs
= FormatSpecsListToDict(formatspecs
);
7105 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
7106 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
7107 return listcatfiles
;
7109 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
7111 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7112 formatspecs
= FormatSpecsListToDict(formatspecs
);
7113 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7114 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7115 return listcatfiles
;
7117 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
7119 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7120 formatspecs
= FormatSpecsListToDict(formatspecs
);
7121 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7122 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7123 return listcatfiles
;
7125 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
7127 if(not rarfile_support
):
7128 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7131 if(rarfile_support
):
7132 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7133 formatspecs
= FormatSpecsListToDict(formatspecs
);
7134 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7135 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7136 return listcatfiles
;
7138 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
7140 if(not py7zr_support
):
7141 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7145 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7146 formatspecs
= FormatSpecsListToDict(formatspecs
);
7147 outarray
= SevenZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7148 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7149 return listcatfiles
;
7151 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFileAlt", PackArchiveFileFromSevenZipFileAlt
);
7153 def download_file_from_ftp_file(url
):
7154 urlparts
= urlparse(url
);
7155 file_name
= os
.path
.basename(urlparts
.path
);
7156 file_dir
= os
.path
.dirname(urlparts
.path
);
7157 if(urlparts
.username
is not None):
7158 ftp_username
= urlparts
.username
;
7160 ftp_username
= "anonymous";
7161 if(urlparts
.password
is not None):
7162 ftp_password
= urlparts
.password
;
7163 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7164 ftp_password
= "anonymous";
7167 if(urlparts
.scheme
=="ftp"):
7169 elif(urlparts
.scheme
=="ftps" and ftpssl
):
7173 if(urlparts
.scheme
=="sftp"):
7175 return download_file_from_pysftp_file(url
);
7177 return download_file_from_sftp_file(url
);
7178 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7179 return download_file_from_http_file(url
);
7180 ftp_port
= urlparts
.port
;
7181 if(urlparts
.port
is None):
7184 ftp
.connect(urlparts
.hostname
, ftp_port
);
7185 except socket
.gaierror
:
7186 log
.info("Error With URL "+url
);
7188 except socket
.timeout
:
7189 log
.info("Error With URL "+url
);
7191 ftp
.login(urlparts
.username
, urlparts
.password
);
7192 if(urlparts
.scheme
=="ftps"):
7194 ftpfile
= BytesIO();
7195 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
7196 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
7201 def download_file_from_ftp_string(url
):
7202 ftpfile
= download_file_from_ftp_file(url
);
7203 return ftpfile
.read();
7205 def upload_file_to_ftp_file(ftpfile
, url
):
7206 urlparts
= urlparse(url
);
7207 file_name
= os
.path
.basename(urlparts
.path
);
7208 file_dir
= os
.path
.dirname(urlparts
.path
);
7209 if(urlparts
.username
is not None):
7210 ftp_username
= urlparts
.username
;
7212 ftp_username
= "anonymous";
7213 if(urlparts
.password
is not None):
7214 ftp_password
= urlparts
.password
;
7215 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7216 ftp_password
= "anonymous";
7219 if(urlparts
.scheme
=="ftp"):
7221 elif(urlparts
.scheme
=="ftps" and ftpssl
):
7225 if(urlparts
.scheme
=="sftp"):
7227 return upload_file_to_pysftp_file(url
);
7229 return upload_file_to_sftp_file(url
);
7230 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7232 ftp_port
= urlparts
.port
;
7233 if(urlparts
.port
is None):
7236 ftp
.connect(urlparts
.hostname
, ftp_port
);
7237 except socket
.gaierror
:
7238 log
.info("Error With URL "+url
);
7240 except socket
.timeout
:
7241 log
.info("Error With URL "+url
);
7243 ftp
.login(urlparts
.username
, urlparts
.password
);
7244 if(urlparts
.scheme
=="ftps"):
7246 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
7251 def upload_file_to_ftp_string(ftpstring
, url
):
7252 ftpfileo
= BytesIO(ftpstring
);
7253 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
7257 def download_file_from_http_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7258 # Parse the URL to extract username and password if present
7259 urlparts
= urlparse(url
);
7260 username
= urlparts
.username
;
7261 password
= urlparts
.password
;
7262 # Rebuild the URL without the username and password
7263 netloc
= urlparts
.hostname
;
7264 if(urlparts
.scheme
=="sftp"):
7266 return download_file_from_pysftp_file(url
);
7268 return download_file_from_sftp_file(url
);
7269 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7270 return download_file_from_ftp_file(url
);
7272 netloc
+= ':' + str(urlparts
.port
);
7273 rebuilt_url
= urlunparse((urlparts
.scheme
, netloc
, urlparts
.path
, urlparts
.params
, urlparts
.query
, urlparts
.fragment
));
7274 # Create a temporary file object
7275 httpfile
= BytesIO();
7277 # Use the requests library if available
7278 if username
and password
:
7279 response
= requests
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
), stream
=True);
7281 response
= requests
.get(rebuilt_url
, headers
=headers
, stream
=True);
7282 response
.raw
.decode_content
= True
7283 shutil
.copyfileobj(response
.raw
, httpfile
);
7285 # Build a Request object for urllib
7286 request
= Request(rebuilt_url
, headers
=headers
);
7287 # Create an opener object for handling URLs
7288 if username
and password
:
7289 # Create a password manager
7290 password_mgr
= HTTPPasswordMgrWithDefaultRealm();
7291 # Add the username and password
7292 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
7293 # Create an authentication handler using the password manager
7294 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
7295 # Build the opener with the authentication handler
7296 opener
= build_opener(auth_handler
);
7298 opener
= build_opener();
7299 with opener
.open(request
) as response
:
7300 shutil
.copyfileobj(response
, httpfile
);
7301 # Reset file pointer to the start
7302 httpfile
.seek(0, 0);
7303 # Return the temporary file object
7306 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7307 httpfile
= download_file_from_http_file(url
, headers
);
7308 return ftpfile
.read();
7311 def download_file_from_sftp_file(url
):
7312 urlparts
= urlparse(url
);
7313 file_name
= os
.path
.basename(urlparts
.path
);
7314 file_dir
= os
.path
.dirname(urlparts
.path
);
7315 sftp_port
= urlparts
.port
;
7316 if(urlparts
.port
is None):
7319 sftp_port
= urlparts
.port
;
7320 if(urlparts
.username
is not None):
7321 sftp_username
= urlparts
.username
;
7323 sftp_username
= "anonymous";
7324 if(urlparts
.password
is not None):
7325 sftp_password
= urlparts
.password
;
7326 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7327 sftp_password
= "anonymous";
7330 if(urlparts
.scheme
=="ftp"):
7331 return download_file_from_ftp_file(url
);
7332 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7333 return download_file_from_http_file(url
);
7334 if(urlparts
.scheme
!="sftp"):
7336 ssh
= paramiko
.SSHClient();
7337 ssh
.load_system_host_keys();
7338 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7340 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7341 except paramiko
.ssh_exception
.SSHException
:
7343 except socket
.gaierror
:
7344 log
.info("Error With URL "+url
);
7346 except socket
.timeout
:
7347 log
.info("Error With URL "+url
);
7349 sftp
= ssh
.open_sftp();
7350 sftpfile
= BytesIO();
7351 sftp
.getfo(urlparts
.path
, sftpfile
);
7354 sftpfile
.seek(0, 0);
7357 def download_file_from_sftp_file(url
):
7361 def download_file_from_sftp_string(url
):
7362 sftpfile
= download_file_from_sftp_file(url
);
7363 return sftpfile
.read();
7365 def download_file_from_ftp_string(url
):
7369 def upload_file_to_sftp_file(sftpfile
, url
):
7370 urlparts
= urlparse(url
);
7371 file_name
= os
.path
.basename(urlparts
.path
);
7372 file_dir
= os
.path
.dirname(urlparts
.path
);
7373 sftp_port
= urlparts
.port
;
7374 if(urlparts
.port
is None):
7377 sftp_port
= urlparts
.port
;
7378 if(urlparts
.username
is not None):
7379 sftp_username
= urlparts
.username
;
7381 sftp_username
= "anonymous";
7382 if(urlparts
.password
is not None):
7383 sftp_password
= urlparts
.password
;
7384 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7385 sftp_password
= "anonymous";
7388 if(urlparts
.scheme
=="ftp"):
7389 return upload_file_to_ftp_file(url
);
7390 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7392 if(urlparts
.scheme
!="sftp"):
7394 ssh
= paramiko
.SSHClient();
7395 ssh
.load_system_host_keys();
7396 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7398 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7399 except paramiko
.ssh_exception
.SSHException
:
7401 except socket
.gaierror
:
7402 log
.info("Error With URL "+url
);
7404 except socket
.timeout
:
7405 log
.info("Error With URL "+url
);
7407 sftp
= ssh
.open_sftp();
7408 sftp
.putfo(sftpfile
, urlparts
.path
);
7411 sftpfile
.seek(0, 0);
7414 def upload_file_to_sftp_file(sftpfile
, url
):
7418 def upload_file_to_sftp_string(sftpstring
, url
):
7419 sftpfileo
= BytesIO(sftpstring
);
7420 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
7424 def upload_file_to_sftp_string(url
):
7428 def download_file_from_pysftp_file(url
):
7429 urlparts
= urlparse(url
);
7430 file_name
= os
.path
.basename(urlparts
.path
);
7431 file_dir
= os
.path
.dirname(urlparts
.path
);
7432 sftp_port
= urlparts
.port
;
7433 if(urlparts
.port
is None):
7436 sftp_port
= urlparts
.port
;
7437 if(urlparts
.username
is not None):
7438 sftp_username
= urlparts
.username
;
7440 sftp_username
= "anonymous";
7441 if(urlparts
.password
is not None):
7442 sftp_password
= urlparts
.password
;
7443 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7444 sftp_password
= "anonymous";
7447 if(urlparts
.scheme
=="ftp"):
7448 return download_file_from_ftp_file(url
);
7449 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7450 return download_file_from_http_file(url
);
7451 if(urlparts
.scheme
!="sftp"):
7454 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7455 except paramiko
.ssh_exception
.SSHException
:
7457 except socket
.gaierror
:
7458 log
.info("Error With URL "+url
);
7460 except socket
.timeout
:
7461 log
.info("Error With URL "+url
);
7463 sftp
= ssh
.open_sftp();
7464 sftpfile
= BytesIO();
7465 sftp
.getfo(urlparts
.path
, sftpfile
);
7468 sftpfile
.seek(0, 0);
7471 def download_file_from_pysftp_file(url
):
7475 def download_file_from_pysftp_string(url
):
7476 sftpfile
= download_file_from_pysftp_file(url
);
7477 return sftpfile
.read();
7479 def download_file_from_ftp_string(url
):
7483 def upload_file_to_pysftp_file(sftpfile
, url
):
7484 urlparts
= urlparse(url
);
7485 file_name
= os
.path
.basename(urlparts
.path
);
7486 file_dir
= os
.path
.dirname(urlparts
.path
);
7487 sftp_port
= urlparts
.port
;
7488 if(urlparts
.port
is None):
7491 sftp_port
= urlparts
.port
;
7492 if(urlparts
.username
is not None):
7493 sftp_username
= urlparts
.username
;
7495 sftp_username
= "anonymous";
7496 if(urlparts
.password
is not None):
7497 sftp_password
= urlparts
.password
;
7498 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7499 sftp_password
= "anonymous";
7502 if(urlparts
.scheme
=="ftp"):
7503 return upload_file_to_ftp_file(url
);
7504 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7506 if(urlparts
.scheme
!="sftp"):
7509 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7510 except paramiko
.ssh_exception
.SSHException
:
7512 except socket
.gaierror
:
7513 log
.info("Error With URL "+url
);
7515 except socket
.timeout
:
7516 log
.info("Error With URL "+url
);
7518 sftp
= ssh
.open_sftp();
7519 sftp
.putfo(sftpfile
, urlparts
.path
);
7522 sftpfile
.seek(0, 0);
7525 def upload_file_to_pysftp_file(sftpfile
, url
):
7529 def upload_file_to_pysftp_string(sftpstring
, url
):
7530 sftpfileo
= BytesIO(sftpstring
);
7531 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
7535 def upload_file_to_pysftp_string(url
):
7538 def download_file_from_internet_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7539 urlparts
= urlparse(url
);
7540 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7541 return download_file_from_http_file(url
, headers
);
7542 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7543 return download_file_from_ftp_file(url
);
7544 elif(urlparts
.scheme
=="sftp"):
7545 if(__use_pysftp__
and havepysftp
):
7546 return download_file_from_pysftp_file(url
);
7548 return download_file_from_sftp_file(url
);
7553 def download_file_from_internet_uncompress_file(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_dict__
):
7554 formatspecs
= FormatSpecsListToDict(formatspecs
);
7555 fp
= download_file_from_internet_file(url
);
7556 fp
= UncompressArchiveFile(fp
, formatspecs
);
7562 def download_file_from_internet_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7563 urlparts
= urlparse(url
);
7564 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7565 return download_file_from_http_string(url
, headers
);
7566 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7567 return download_file_from_ftp_string(url
);
7568 elif(urlparts
.scheme
=="sftp"):
7569 if(__use_pysftp__
and havepysftp
):
7570 return download_file_from_pysftp_string(url
);
7572 return download_file_from_sftp_string(url
);
7577 def download_file_from_internet_uncompress_string(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_dict__
):
7578 formatspecs
= FormatSpecsListToDict(formatspecs
);
7579 fp
= download_file_from_internet_string(url
);
7580 fp
= UncompressArchiveFile(fp
, formatspecs
);
7586 def upload_file_to_internet_file(ifp
, url
):
7587 urlparts
= urlparse(url
);
7588 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7590 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7591 return upload_file_to_ftp_file(ifp
, url
);
7592 elif(urlparts
.scheme
=="sftp"):
7593 if(__use_pysftp__
and havepysftp
):
7594 return upload_file_to_pysftp_file(ifp
, url
);
7596 return upload_file_to_sftp_file(ifp
, url
);
7601 def upload_file_to_internet_compress_file(ifp
, url
, formatspecs
=__file_format_dict__
):
7602 formatspecs
= FormatSpecsListToDict(formatspecs
);
7603 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
7607 upload_file_to_internet_file(catfp
, outfile
);
7610 def upload_file_to_internet_string(ifp
, url
):
7611 urlparts
= urlparse(url
);
7612 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7614 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7615 return upload_file_to_ftp_string(ifp
, url
);
7616 elif(urlparts
.scheme
=="sftp"):
7617 if(__use_pysftp__
and havepysftp
):
7618 return upload_file_to_pysftp_string(ifp
, url
);
7620 return upload_file_to_sftp_string(ifp
, url
);
7625 def upload_file_to_internet_compress_string(ifp
, url
, formatspecs
=__file_format_dict__
):
7626 formatspecs
= FormatSpecsListToDict(formatspecs
);
7627 catfp
= CompressArchiveFile(BytesIO(ifp
), compression
, compressionlevel
, formatspecs
);
7631 upload_file_to_internet_file(catfp
, outfile
);
7635 if(hasattr(shutil
, "register_archive_format")):
7636 # Register the packing format
7637 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
7638 except shutil
.RegistryError
:
7642 if(hasattr(shutil
, "register_unpack_format")):
7643 # Register the unpacking format
7644 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
7645 except shutil
.RegistryError
: