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/26/2024 Ver. 0.13.12 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
;
46 from urllib
.parse
import urlparse
, urlunparse
;
48 from urlparse
import urlparse
, urlunparse
;
50 # Windows-specific setup
52 if sys
.version_info
[0] == 2:
54 sys
.stdout
= codecs
.getwriter('utf-8')(sys
.stdout
);
55 sys
.stderr
= codecs
.getwriter('utf-8')(sys
.stderr
);
57 sys
.stdout
= io
.TextIOWrapper(sys
.stdout
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
58 sys
.stderr
= io
.TextIOWrapper(sys
.stderr
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
60 hashlib_guaranteed
= False;
62 os
.environ
["PYTHONIOENCODING"] = "UTF-8";
63 os
.environ
["LC_CTYPE"] = "UTF-8";
65 # Reload sys to set default encoding to UTF-8 (Python 2 only)
66 if sys
.version_info
[0] == 2:
69 sys
.setdefaultencoding('UTF-8');
70 except (NameError, AttributeError):
75 from zlib
import crc32
;
77 from binascii
import crc32
;
79 # Define FileNotFoundError for Python 2
83 FileNotFoundError
= IOError;
86 rarfile_support
= False;
89 rarfile_support
= True;
94 py7zr_support
= False;
103 from xtarfile
import is_tarfile
;
106 from safetar
import is_tarfile
;
108 from tarfile
import is_tarfile
;
112 import xtarfile
as tarfile
;
115 import safetar
as tarfile
;
120 haveparamiko
= False;
136 haverequests
= False;
141 logging
.getLogger("urllib3").setLevel(logging
.WARNING
);
150 logging
.getLogger("httpx").setLevel(logging
.WARNING
);
151 logging
.getLogger("httpcore").setLevel(logging
.WARNING
);
155 # HTTP and URL parsing
157 from urllib
.request
import Request
, build_opener
, HTTPBasicAuthHandler
;
158 from urllib
.parse
import urlparse
;
160 from urllib2
import Request
, build_opener
, HTTPBasicAuthHandler
;
161 from urlparse
import urlparse
;
163 # StringIO and BytesIO
165 from io
import StringIO
, BytesIO
;
168 from cStringIO
import StringIO
;
169 from cStringIO
import StringIO
as BytesIO
;
171 from StringIO
import StringIO
;
172 from StringIO
import StringIO
as BytesIO
;
174 __use_pysftp__
= False;
175 __use_alt_format__
= False;
177 __use_pysftp__
= False;
178 __use_http_lib__
= "httpx";
179 if(__use_http_lib__
=="httpx" and haverequests
and not havehttpx
):
180 __use_http_lib__
= "requests";
181 if(__use_http_lib__
=="requests" and havehttpx
and not haverequests
):
182 __use_http_lib__
= "httpx";
183 if((__use_http_lib__
=="httpx" or __use_http_lib__
=="requests") and not havehttpx
and not haverequests
):
184 __use_http_lib__
= "urllib";
185 if(not __use_alt_format__
):
186 ''' Format Info by Kazuki Przyborowski '''
187 __file_format_name__
= "CatFile";
188 __program_name__
= "Py"+__file_format_name__
;
189 __file_format_lower__
= __file_format_name__
.lower();
190 __file_format_magic__
= __file_format_name__
;
191 __file_format_len__
= len(__file_format_magic__
);
192 __file_format_hex__
= binascii
.hexlify(__file_format_magic__
.encode("UTF-8")).decode("UTF-8");
193 __file_format_delimiter__
= "\x00";
194 __file_format_ver__
= "001";
195 __use_new_style__
= True;
196 __use_advanced_list__
= True;
197 __use_alt_inode__
= False;
198 __file_format_extension__
= ".cat";
200 ''' Format Info Generated by ChatGPT '''
201 __file_format_name__
= "FastArchive";
202 __program_name__
= "Py" + __file_format_name__
;
203 __file_format_lower__
= __file_format_name__
.lower();
204 __file_format_magic__
= "FstArch";
205 __file_format_len__
= len(__file_format_magic__
);
206 __file_format_hex__
= binascii
.hexlify(__file_format_magic__
.encode("UTF-8")).decode("UTF-8");
207 __file_format_delimiter__
= "\x1F"; # Using a non-printable ASCII character as delimiter
208 __file_format_ver__
= "001";
209 __use_new_style__
= True;
210 __use_advanced_list__
= False;
211 __use_alt_inode__
= False;
212 __file_format_extension__
= ".fast";
213 __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__
];
214 __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__
};
215 __project__
= __program_name__
;
216 __project_url__
= "https://github.com/GameMaker2k/PyCatFile";
217 __version_info__
= (0, 13, 12, "RC 1", 1);
218 __version_date_info__
= (2024, 6, 26, "RC 1", 1);
219 __version_date__
= str(__version_date_info__
[0]) + "." + str(__version_date_info__
[1]).zfill(2) + "." + str(__version_date_info__
[2]).zfill(2);
220 __revision__
= __version_info__
[3];
221 __revision_id__
= "$Id$";
222 if(__version_info__
[4] is not None):
223 __version_date_plusrc__
= __version_date__
+ "-" + str(__version_date_info__
[4]);
224 if(__version_info__
[4] is None):
225 __version_date_plusrc__
= __version_date__
;
226 if(__version_info__
[3] is not None):
227 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]) + " " + str(__version_info__
[3]);
228 if(__version_info__
[3] is None):
229 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]);
231 PyBitness
= platform
.architecture();
232 if(PyBitness
=="32bit" or PyBitness
=="32"):
234 elif(PyBitness
=="64bit" or PyBitness
=="64"):
239 geturls_ua_pycatfile_python
= "Mozilla/5.0 (compatible; {proname}/{prover}; +{prourl})".format(proname
=__project__
, prover
=__version__
, prourl
=__project_url__
);
240 if(platform
.python_implementation()!=""):
241 py_implementation
= platform
.python_implementation();
242 if(platform
.python_implementation()==""):
243 py_implementation
= "Python";
244 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__
);
245 geturls_ua_googlebot_google
= "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
246 geturls_ua_googlebot_google_old
= "Googlebot/2.1 (+http://www.google.com/bot.html)";
247 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
)};
248 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
)};
249 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"};
250 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"};
252 compressionsupport
= [];
255 compressionsupport
.append("gz");
256 compressionsupport
.append("gzip");
261 compressionsupport
.append("bz2");
262 compressionsupport
.append("bzip2");
266 import lz4
, lz4
.frame
;
267 compressionsupport
.append("lz4");
272 compressionsupport
.append("lzo");
273 compressionsupport
.append("lzop");
278 compressionsupport
.append("zstd");
279 compressionsupport
.append("zstandard");
284 compressionsupport
.append("lzma");
285 compressionsupport
.append("xz");
288 from backports
import lzma
;
289 compressionsupport
.append("lzma");
290 compressionsupport
.append("xz");
293 compressionsupport
.append("zlib");
295 compressionlist
= ['auto'];
296 compressionlistalt
= [];
299 if('gzip' in compressionsupport
):
300 compressionlist
.append('gzip');
301 compressionlistalt
.append('gzip');
302 outextlist
.append('gz');
303 outextlistwd
.append('.gz');
304 if('bzip2' in compressionsupport
):
305 compressionlist
.append('bzip2');
306 compressionlistalt
.append('bzip2');
307 outextlist
.append('bz2');
308 outextlistwd
.append('.bz2');
309 if('zstd' in compressionsupport
):
310 compressionlist
.append('zstd');
311 compressionlistalt
.append('zstd');
312 outextlist
.append('zst');
313 outextlistwd
.append('.zst');
314 if('lz4' in compressionsupport
):
315 compressionlist
.append('lz4');
316 compressionlistalt
.append('lz4');
317 outextlist
.append('lz4');
318 outextlistwd
.append('.lz4');
319 if('lzo' in compressionsupport
):
320 compressionlist
.append('lzo');
321 compressionlistalt
.append('lzo');
322 outextlist
.append('lzo');
323 outextlistwd
.append('.lzo');
324 if('lzop' in compressionsupport
):
325 compressionlist
.append('lzop');
326 compressionlistalt
.append('lzop');
327 outextlist
.append('lzop');
328 outextlistwd
.append('.lzop');
329 if('lzma' in compressionsupport
):
330 compressionlist
.append('lzma');
331 compressionlistalt
.append('lzma');
332 outextlist
.append('lzma');
333 outextlistwd
.append('.lzma');
334 if('xz' in compressionsupport
):
335 compressionlist
.append('xz');
336 compressionlistalt
.append('xz');
337 outextlist
.append('xz');
338 outextlistwd
.append('.xz');
339 if('zlib' in compressionsupport
):
340 compressionlist
.append('zlib');
341 compressionlistalt
.append('zlib');
342 outextlist
.append('zz');
343 outextlistwd
.append('.zz');
344 outextlist
.append('zl');
345 outextlistwd
.append('.zl');
346 outextlist
.append('zlib');
347 outextlistwd
.append('.zlib');
349 tarfile_mimetype
= "application/tar";
350 tarfile_tar_mimetype
= tarfile_mimetype
;
351 zipfile_mimetype
= "application/zip";
352 zipfile_zip_mimetype
= zipfile_mimetype
;
353 rarfile_mimetype
= "application/rar";
354 rarfile_rar_mimetype
= rarfile_mimetype
;
355 archivefile_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"";
356 archivefile_cat_mimetype
= archivefile_mimetype
;
357 archivefile_gzip_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+gzip";
358 archivefile_gz_mimetype
= archivefile_gzip_mimetype
;
359 archivefile_bzip2_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+bzip2";
360 archivefile_bz2_mimetype
= archivefile_bzip2_mimetype
;
361 archivefile_lz4_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lz4";
362 archivefile_lzop_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lzop";
363 archivefile_lzo_mimetype
= archivefile_lzop_mimetype
;
364 archivefile_zstandard_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+zstandard";
365 archivefile_zstd_mimetype
= archivefile_zstandard_mimetype
;
366 archivefile_lzma_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+lzma";
367 archivefile_xz_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+xz";
368 archivefile_zlib_mimetype
= "application/x-"+__file_format_dict__
['format_lower']+"+zlib";
369 archivefile_zz_mimetype
= archivefile_zlib_mimetype
;
370 archivefile_zl_mimetype
= archivefile_zlib_mimetype
;
371 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", __file_format_extension__
+".zz", __file_format_extension__
+".zl", __file_format_extension__
+".zlib"];
373 if __name__
== "__main__":
375 curscrpath
= os
.path
.dirname(sys
.argv
[0]);
379 curscrpath
= curscrpath
.replace(os
.sep
, "/");
380 curscrpath
= curscrpath
+ "/";
381 scrfile
= curscrpath
+ "catfile.py";
382 if(os
.path
.exists(scrfile
) and os
.path
.isfile(scrfile
)):
383 scrcmd
= subprocess
.Popen([sys
.executable
, scrfile
] + sys
.argv
[1:]);
386 def VerbosePrintOut(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
392 "warning": logging
.warning
,
393 "error": logging
.error
,
394 "critical": logging
.critical
,
395 "exception": logging
.exception
,
396 "logalt": lambda x
: logging
.log(dgblevel
, x
),
397 "debug": logging
.debug
399 log_function
= log_functions
.get(outtype
);
401 log_function(dbgtxt
);
405 def VerbosePrintOutReturn(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
406 VerbosePrintOut(dbgtxt
, outtype
, dbgenable
, dgblevel
);
409 def RemoveWindowsPath(dpath
):
413 dpath
= dpath
.replace(os
.path
.sep
, "/");
414 dpath
= dpath
.rstrip("/");
415 if(dpath
=="." or dpath
==".."):
419 def NormalizeRelativePath(inpath
):
420 inpath
= RemoveWindowsPath(inpath
);
421 if(os
.path
.isabs(inpath
)):
424 if(inpath
.startswith("./") or inpath
.startswith("../")):
427 outpath
= "./" + inpath
;
430 def PrependPath(base_dir
, child_path
):
431 # Check if base_dir is None or empty, if so, return child_path as is
434 # Ensure base_dir ends with exactly one slash
435 if not base_dir
.endswith('/'):
437 # Check if child_path starts with ./ or ../ (indicating a relative path)
438 if child_path
.startswith('./') or child_path
.startswith('../'):
439 # For relative paths, we don't alter the child_path
440 return base_dir
+ child_path
;
442 # For non-relative paths, ensure there's no starting slash on child_path to avoid double slashes
443 return base_dir
+ child_path
.lstrip('/');
445 def ListDir(dirpath
, followlink
=False, duplicates
=False):
446 if isinstance(dirpath
, (list, tuple, )):
447 dirpath
= list(filter(None, dirpath
));
448 elif isinstance(dirpath
, str):
449 dirpath
= list(filter(None, [dirpath
]));
451 fs_encoding
= sys
.getfilesystemencoding();
452 for mydirfile
in dirpath
:
453 if not os
.path
.exists(mydirfile
):
455 mydirfile
= NormalizeRelativePath(mydirfile
);
456 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
):
457 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
458 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
459 for root
, dirs
, filenames
in os
.walk(mydirfile
):
461 dpath
= RemoveWindowsPath(dpath
);
462 if fs_encoding
!= 'utf-8':
463 dpath
= dpath
.encode(fs_encoding
).decode('utf-8');
464 if dpath
not in retlist
and not duplicates
:
465 retlist
.append(dpath
);
467 retlist
.append(dpath
);
468 for file in filenames
:
469 fpath
= os
.path
.join(root
, file);
470 fpath
= RemoveWindowsPath(fpath
);
471 if fs_encoding
!= 'utf-8':
472 fpath
= fpath
.encode(fs_encoding
).decode('utf-8');
473 if fpath
not in retlist
and not duplicates
:
474 retlist
.append(fpath
);
476 retlist
.append(fpath
);
478 path
= RemoveWindowsPath(mydirfile
);
479 if fs_encoding
!= 'utf-8':
480 path
= path
.encode(fs_encoding
).decode('utf-8');
481 retlist
.append(path
);
484 def ListDirAdvanced(dirpath
, followlink
=False, duplicates
=False):
485 if isinstance(dirpath
, (list, tuple, )):
486 dirpath
= list(filter(None, dirpath
));
487 elif isinstance(dirpath
, str):
488 dirpath
= list(filter(None, [dirpath
]));
490 fs_encoding
= sys
.getfilesystemencoding();
491 for mydirfile
in dirpath
:
492 if not os
.path
.exists(mydirfile
):
494 mydirfile
= NormalizeRelativePath(mydirfile
);
495 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
) and followlink
:
496 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
497 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
498 for root
, dirs
, filenames
in os
.walk(mydirfile
):
499 # Sort dirs and filenames alphabetically in place
500 dirs
.sort(key
=lambda x
: x
.lower());
501 filenames
.sort(key
=lambda x
: x
.lower());
502 dpath
= RemoveWindowsPath(root
);
503 if fs_encoding
!= 'utf-8':
504 dpath
= dpath
.encode(fs_encoding
).decode('utf-8');
505 if not duplicates
and dpath
not in retlist
:
506 retlist
.append(dpath
);
508 retlist
.append(dpath
);
509 for file in filenames
:
510 fpath
= os
.path
.join(root
, file);
511 fpath
= RemoveWindowsPath(fpath
);
512 if fs_encoding
!= 'utf-8':
513 fpath
= fpath
.encode(fs_encoding
).decode('utf-8');
514 if not duplicates
and fpath
not in retlist
:
515 retlist
.append(fpath
);
517 retlist
.append(fpath
);
519 path
= RemoveWindowsPath(mydirfile
);
520 if fs_encoding
!= 'utf-8':
521 path
= path
.encode(fs_encoding
).decode('utf-8');
522 retlist
.append(path
);
525 def create_alias_function(prefix
, base_name
, suffix
, target_function
):
526 # Define a new function that wraps the target function
527 def alias_function(*args
, **kwargs
):
528 return target_function(*args
, **kwargs
);
529 # Create the function name by combining the prefix, base name, and the suffix
530 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
);
531 # Add the new function to the global namespace
532 globals()[function_name
] = alias_function
;
534 def create_alias_function_alt(prefix
, base_name
, suffix
, target_function
):
535 # Create the function name by combining the prefix, base name, and the suffix
536 # Use the format method for string formatting, compatible with Python 2 and 3
537 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
)
538 # Add the new function (alias of the target_function) to the global namespace
539 # This line is compatible as-is with both Python 2 and 3
540 globals()[function_name
] = target_function
542 def FormatSpecsListToDict(formatspecs
=__file_format_list__
):
543 if(isinstance(formatspecs
, (list, tuple, ))):
544 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]};
545 elif(isinstance(formatspecs
, (dict, ))):
548 return __file_format_dict__
;
549 return __file_format_dict__
;
552 def __init__(self
, file_path
=None, fileobj
=None, mode
='rb', level
=9, wbits
=15, encoding
=None, errors
=None, newline
=None):
553 if file_path
is None and fileobj
is None:
554 raise ValueError("Either file_path or fileobj must be provided");
555 if file_path
is not None and fileobj
is not None:
556 raise ValueError("Only one of file_path or fileobj should be provided");
558 self
.file_path
= file_path
;
559 self
.fileobj
= fileobj
;
563 self
.encoding
= encoding
;
564 self
.errors
= errors
;
565 self
.newline
= newline
;
566 self
._compressed
_data
= b
'';
567 self
._decompressed
_data
= b
'';
569 self
._text
_mode
= 't' in mode
;
571 # Force binary mode for internal handling
572 internal_mode
= mode
.replace('t', 'b');
574 if 'w' in mode
or 'a' in mode
or 'x' in mode
:
575 self
.file = open(file_path
, internal_mode
) if file_path
else fileobj
;
576 self
._compressor
= zlib
.compressobj(level
, zlib
.DEFLATED
, wbits
);
579 if os
.path
.exists(file_path
):
580 self
.file = open(file_path
, internal_mode
);
583 raise FileNotFoundError("No such file: '{}'".format(file_path
));
588 raise ValueError("Mode should be 'rb' or 'wb'");
590 def _load_file(self
):
592 self
._compressed
_data
= self
.file.read();
593 if not self
._compressed
_data
.startswith((b
'\x78\x01', b
'\x78\x5E', b
'\x78\x9C', b
'\x78\xDA')):
594 raise ValueError("Invalid zlib file header");
595 self
._decompressed
_data
= zlib
.decompress(self
._compressed
_data
, self
.wbits
);
597 self
._decompressed
_data
= self
._decompressed
_data
.decode(self
.encoding
or 'utf-8', self
.errors
or 'strict');
599 def write(self
, data
):
601 data
= data
.encode(self
.encoding
or 'utf-8', self
.errors
or 'strict');
602 compressed_data
= self
._compressor
.compress(data
) + self
._compressor
.flush(zlib
.Z_SYNC_FLUSH
);
603 self
.file.write(compressed_data
);
605 def read(self
, size
=-1):
607 size
= len(self
._decompressed
_data
) - self
._position
;
608 data
= self
._decompressed
_data
[self
._position
:self
._position
+ size
];
609 self
._position
+= size
;
612 def seek(self
, offset
, whence
=0):
613 if whence
== 0: # absolute file positioning
614 self
._position
= offset
;
615 elif whence
== 1: # seek relative to the current position
616 self
._position
+= offset
;
617 elif whence
== 2: # seek relative to the file's end
618 self
._position
= len(self
._decompressed
_data
) + offset
;
620 raise ValueError("Invalid value for whence");
622 # Ensure the position is within bounds
623 self
._position
= max(0, min(self
._position
, len(self
._decompressed
_data
)));
626 return self
._position
;
632 if hasattr(self
.file, 'fileno'):
633 return self
.file.fileno();
634 raise OSError("The underlying file object does not support fileno()");
637 if hasattr(self
.file, 'isatty'):
638 return self
.file.isatty();
641 def truncate(self
, size
=None):
642 if hasattr(self
.file, 'truncate'):
643 return self
.file.truncate(size
);
644 raise OSError("The underlying file object does not support truncate()");
647 if 'w' in self
.mode
or 'a' in self
.mode
or 'x' in self
.mode
:
648 self
.file.write(self
._compressor
.flush(zlib
.Z_FINISH
));
655 def __exit__(self
, exc_type
, exc_value
, traceback
):
659 def __init__(self
, file_path
=None, fileobj
=None, mode
='rb', compresslevel
=9, encoding
=None, errors
=None, newline
=None):
660 if file_path
is None and fileobj
is None:
661 raise ValueError("Either file_path or fileobj must be provided");
662 if file_path
is not None and fileobj
is not None:
663 raise ValueError("Only one of file_path or fileobj should be provided");
665 self
.file_path
= file_path
;
666 self
.fileobj
= fileobj
;
668 self
.compresslevel
= compresslevel
;
669 self
.encoding
= encoding
;
670 self
.errors
= errors
;
671 self
.newline
= newline
;
672 self
._compressed
_data
= b
'';
673 self
._decompressed
_data
= b
'';
675 self
._text
_mode
= 't' in mode
;
677 # Force binary mode for internal handling
678 internal_mode
= mode
.replace('t', 'b');
680 if 'w' in mode
or 'a' in mode
or 'x' in mode
:
681 self
.file = gzip
.open(file_path
, internal_mode
, compresslevel
=compresslevel
) if file_path
else gzip
.GzipFile(fileobj
=fileobj
, mode
=internal_mode
, compresslevel
=compresslevel
);
682 self
._compressor
= gzip
.GzipFile(fileobj
=self
.file, mode
=internal_mode
, compresslevel
=compresslevel
);
685 if os
.path
.exists(file_path
):
686 self
.file = gzip
.open(file_path
, internal_mode
);
689 raise FileNotFoundError("No such file: '{}'".format(file_path
));
691 self
.file = gzip
.GzipFile(fileobj
=fileobj
, mode
=internal_mode
);
694 raise ValueError("Mode should be 'rb' or 'wb'");
696 def _load_file(self
):
698 self
._compressed
_data
= self
.file.read();
699 if not self
._compressed
_data
.startswith(b
'\x1f\x8b'):
700 raise ValueError("Invalid gzip file header");
701 self
._decompressed
_data
= gzip
.decompress(self
._compressed
_data
);
703 self
._decompressed
_data
= self
._decompressed
_data
.decode(self
.encoding
or 'utf-8', self
.errors
or 'strict');
705 def write(self
, data
):
707 data
= data
.encode(self
.encoding
or 'utf-8', self
.errors
or 'strict');
708 compressed_data
= self
._compressor
.compress(data
);
709 self
.file.write(compressed_data
);
712 def read(self
, size
=-1):
714 size
= len(self
._decompressed
_data
) - self
._position
;
715 data
= self
._decompressed
_data
[self
._position
:self
._position
+ size
];
716 self
._position
+= size
;
719 def seek(self
, offset
, whence
=0):
720 if whence
== 0: # absolute file positioning
721 self
._position
= offset
;
722 elif whence
== 1: # seek relative to the current position
723 self
._position
+= offset
;
724 elif whence
== 2: # seek relative to the file's end
725 self
._position
= len(self
._decompressed
_data
) + offset
;
727 raise ValueError("Invalid value for whence");
729 # Ensure the position is within bounds
730 self
._position
= max(0, min(self
._position
, len(self
._decompressed
_data
)));
733 return self
._position
;
739 if hasattr(self
.file, 'fileno'):
740 return self
.file.fileno();
741 raise OSError("The underlying file object does not support fileno()");
744 if hasattr(self
.file, 'isatty'):
745 return self
.file.isatty();
748 def truncate(self
, size
=None):
749 if hasattr(self
.file, 'truncate'):
750 return self
.file.truncate(size
);
751 raise OSError("The underlying file object does not support truncate()");
754 if 'w' in self
.mode
or 'a' in self
.mode
or 'x' in self
.mode
:
755 self
.file.write(self
._compressor
.flush());
762 def __exit__(self
, exc_type
, exc_value
, traceback
):
767 def __init__(self, file_path=None, fileobj=None, mode='rb', level=9, encoding=None, errors=None, newline=None):
768 if file_path is None and fileobj is None:
769 raise ValueError("Either file_path or fileobj must be provided");
770 if file_path is not None and fileobj is not None:
771 raise ValueError("Only one of file_path or fileobj should be provided");
773 self.file_path = file_path;
774 self.fileobj = fileobj;
777 self.encoding = encoding;
778 self.errors = errors;
779 self.newline = newline;
780 self._compressed_data = b'';
781 self._decompressed_data = b'';
783 self._text_mode = 't' in mode;
785 # Force binary mode for internal handling
786 internal_mode = mode.replace('t', 'b');
788 if 'w' in mode or 'a' in mode or 'x' in mode:
789 self.file = open(file_path, internal_mode) if file_path else fileobj;
790 self._compressor = blosc.Blosc(level);
793 if os.path.exists(file_path):
794 self.file = open(file_path, internal_mode);
797 raise FileNotFoundError("No such file: '{}'".format(file_path));
802 raise ValueError("Mode should be 'rb' or 'wb'");
804 def _load_file(self):
806 self._compressed_data = self.file.read();
807 if not self._compressed_data:
808 raise ValueError("Invalid blosc file header");
809 self._decompressed_data = blosc.decompress(self._compressed_data);
811 self._decompressed_data = self._decompressed_data.decode(self.encoding or 'utf-8', self.errors or 'strict');
813 def write(self, data):
815 data = data.encode(self.encoding or 'utf-8', self.errors or 'strict');
816 compressed_data = blosc.compress(data, cname='blosclz', clevel=self.level);
817 self.file.write(compressed_data);
820 def read(self, size=-1):
822 size = len(self._decompressed_data) - self._position;
823 data = self._decompressed_data[self._position:self._position + size];
824 self._position += size;
827 def seek(self, offset, whence=0):
828 if whence == 0: # absolute file positioning
829 self._position = offset;
830 elif whence == 1: # seek relative to the current position
831 self._position += offset;
832 elif whence == 2: # seek relative to the file's end
833 self._position = len(self._decompressed_data) + offset;
835 raise ValueError("Invalid value for whence");
837 # Ensure the position is within bounds
838 self._position = max(0, min(self._position, len(self._decompressed_data)));
841 return self._position;
847 if hasattr(self.file, 'fileno'):
848 return self.file.fileno();
849 raise OSError("The underlying file object does not support fileno()");
852 if hasattr(self.file, 'isatty'):
853 return self.file.isatty();
856 def truncate(self, size=None):
857 if hasattr(self.file, 'truncate'):
858 return self.file.truncate(size);
859 raise OSError("The underlying file object does not support truncate()");
862 if 'w' in self.mode or 'a' in self.mode or 'x' in self.mode:
863 self.file.write(blosc.compress(self._compressor.flush(), cname='blosclz', clevel=self.level));
870 def __exit__(self, exc_type, exc_value, traceback):
874 def __init__(self, file_path=None, fileobj=None, mode='rb', level=11, encoding=None, errors=None, newline=None):
875 if file_path is None and fileobj is None:
876 raise ValueError("Either file_path or fileobj must be provided");
877 if file_path is not None and fileobj is not None:
878 raise ValueError("Only one of file_path or fileobj should be provided");
880 self.file_path = file_path;
881 self.fileobj = fileobj;
884 self.encoding = encoding;
885 self.errors = errors;
886 self.newline = newline;
887 self._compressed_data = b'';
888 self._decompressed_data = b'';
890 self._text_mode = 't' in mode;
892 # Force binary mode for internal handling
893 internal_mode = mode.replace('t', 'b');
895 if 'w' in mode or 'a' in mode or 'x' in mode:
896 self.file = open(file_path, internal_mode) if file_path else fileobj;
897 self._compressor = brotli.Compressor(quality=self.level);
900 if os.path.exists(file_path):
901 self.file = open(file_path, internal_mode);
904 raise FileNotFoundError("No such file: '{}'".format(file_path));
909 raise ValueError("Mode should be 'rb' or 'wb'");
911 def _load_file(self):
913 self._compressed_data = self.file.read();
914 if not self._compressed_data:
915 raise ValueError("Invalid brotli file header");
916 self._decompressed_data = brotli.decompress(self._compressed_data);
918 self._decompressed_data = self._decompressed_data.decode(self.encoding or 'utf-8', self.errors or 'strict');
920 def write(self, data):
922 data = data.encode(self.encoding or 'utf-8', self.errors or 'strict');
923 compressed_data = self._compressor.process(data);
924 self.file.write(compressed_data);
927 def read(self, size=-1):
929 size = len(self._decompressed_data) - self._position;
930 data = self._decompressed_data[self._position:self._position + size];
931 self._position += size;
934 def seek(self, offset, whence=0):
935 if whence == 0: # absolute file positioning
936 self._position = offset;
937 elif whence == 1: # seek relative to the current position
938 self._position += offset;
939 elif whence == 2: # seek relative to the file's end
940 self._position = len(self._decompressed_data) + offset;
942 raise ValueError("Invalid value for whence");
944 # Ensure the position is within bounds
945 self._position = max(0, min(self._position, len(self._decompressed_data)));
948 return self._position;
954 if hasattr(self.file, 'fileno'):
955 return self.file.fileno();
956 raise OSError("The underlying file object does not support fileno()");
959 if hasattr(self.file, 'isatty'):
960 return self.file.isatty();
963 def truncate(self, size=None):
964 if hasattr(self.file, 'truncate'):
965 return self.file.truncate(size);
966 raise OSError("The underlying file object does not support truncate()");
969 if 'w' in self.mode or 'a' in self.mode or 'x' in self.mode:
970 self.file.write(self._compressor.finish());
977 def __exit__(self, exc_type, exc_value, traceback):
981 def TarFileCheck(infile
):
983 if is_tarfile(infile
):
989 # Check if the input is a file object
990 if hasattr(infile
, 'read'):
991 # Save the current file position
992 current_position
= infile
.tell();
993 # Attempt to open the file object as a tar file
994 tar
= tarfile
.open(fileobj
=infile
);
996 # Restore the file position
997 infile
.seek(current_position
);
1000 # Assume it's a filename
1001 tar
= tarfile
.open(name
=infile
);
1004 except tarfile
.TarError
:
1007 def TarFileCheckAlt(infile
):
1009 if is_tarfile(infile
):
1014 # Check if the input is a file-like object
1015 if hasattr(infile
, 'read'):
1016 # Save the current file position
1017 current_position
= infile
.tell();
1018 # Attempt to open the file object as a tar file
1019 with tarfile
.open(fileobj
=infile
) as tar
:
1021 # Restore the file position
1022 infile
.seek(current_position
);
1024 # Assume it's a filename and attempt to open it as a tar file
1025 with tarfile
.open(name
=infile
) as tar
:
1028 except (tarfile
.TarError
, AttributeError, IOError):
1031 def ZipFileCheck(infile
):
1033 if zipfile
.is_zipfile(infile
):
1038 # Check if the input is a file-like object
1039 if hasattr(infile
, 'read'):
1040 # Save the current file position
1041 current_position
= infile
.tell();
1042 # Attempt to open the file object as a zip file
1043 with zipfile
.ZipFile(infile
) as zipf
:
1045 # Restore the file position
1046 infile
.seek(current_position
);
1048 # Assume it's a filename and attempt to open it as a zip file
1049 with zipfile
.ZipFile(infile
) as zipf
:
1052 except (zipfile
.BadZipFile
, AttributeError, IOError):
1055 def RarFileCheck(infile
):
1057 if rarfile
.is_rarfile(infile
):
1062 # Check if the input is a file-like object
1063 if hasattr(infile
, 'read'):
1064 # Save the current file position
1065 current_position
= infile
.tell();
1066 # Attempt to open the file object as a rar file
1067 with rarfile
.RarFile(infile
) as rarf
:
1069 # Restore the file position
1070 infile
.seek(current_position
);
1072 # Assume it's a filename and attempt to open it as a rar file
1073 with rarfile
.RarFile(infile
) as rarf
:
1076 except (rarfile
.Error
, AttributeError, IOError):
1079 def SevenZipFileCheck(infile
):
1081 # Check if the input is a file-like object
1082 if hasattr(infile
, 'read'):
1083 # Save the current file position
1084 current_position
= infile
.tell();
1085 # Attempt to open the file object as a 7z file
1086 with py7zr
.SevenZipFile(infile
, 'r') as archive
:
1088 # Restore the file position
1089 infile
.seek(current_position
);
1091 # Assume it's a filename and attempt to open it as a 7z file
1092 with py7zr
.SevenZipFile(infile
, 'r') as archive
:
1095 except (py7zr
.Bad7zFile
, AttributeError, IOError):
1098 # initial_value can be 0xFFFF or 0x0000
1099 def crc16_ansi(msg
, initial_value
=0xFFFF):
1100 # CRC-16-IBM / CRC-16-ANSI polynomial and initial value
1101 poly
= 0x8005; # Polynomial for CRC-16-IBM / CRC-16-ANSI
1102 crc
= initial_value
; # Initial value
1104 crc ^
= b
<< 8; # XOR byte into CRC top byte
1105 for _
in range(8): # Process each bit
1106 if crc
& 0x8000: # If the top bit is set
1107 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
1109 crc
= crc
<< 1; # Just shift left
1110 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
1113 # initial_value can be 0xFFFF or 0x0000
1114 def crc16_ibm(msg
, initial_value
=0xFFFF):
1115 return crc16_ansi(msg
, initial_value
);
1117 # initial_value is 0xFFFF
1119 return crc16_ansi(msg
, 0xFFFF);
1121 # initial_value can be 0xFFFF, 0x1D0F or 0x0000
1122 def crc16_ccitt(msg
, initial_value
=0xFFFF):
1123 # CRC-16-CCITT polynomial
1124 poly
= 0x1021; # Polynomial for CRC-16-CCITT
1125 # Use the specified initial value
1126 crc
= initial_value
;
1128 crc ^
= b
<< 8; # XOR byte into CRC top byte
1129 for _
in range(8): # Process each bit
1130 if crc
& 0x8000: # If the top bit is set
1131 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
1133 crc
= crc
<< 1; # Just shift left
1134 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
1137 # initial_value can be 0x42F0E1EBA9EA3693 or 0x0000000000000000
1138 def crc64_ecma(msg
, initial_value
=0x0000000000000000):
1139 # CRC-64-ECMA polynomial and initial value
1140 poly
= 0x42F0E1EBA9EA3693;
1141 crc
= initial_value
; # Initial value for CRC-64-ECMA
1143 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
1144 for _
in range(8): # Process each bit
1145 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
1146 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
1148 crc
<<= 1; # Just shift left if the MSB is 0
1149 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
1152 # initial_value can be 0x000000000000001B or 0xFFFFFFFFFFFFFFFF
1153 def crc64_iso(msg
, initial_value
=0xFFFFFFFFFFFFFFFF):
1154 # CRC-64-ISO polynomial and initial value
1155 poly
= 0x000000000000001B;
1156 crc
= initial_value
; # Common initial value for CRC-64-ISO
1158 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
1159 for _
in range(8): # Process each bit
1160 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
1161 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
1163 crc
<<= 1; # Just shift left if the MSB is 0
1164 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
1167 def GetDataFromArray(data
, path
, default
=None):
1171 element
= element
[key
];
1173 except (KeyError, TypeError, IndexError):
1176 def GetDataFromArrayAlt(structure
, path
, default
=None):
1177 element
= structure
;
1179 if isinstance(element
, dict) and key
in element
:
1180 element
= element
[key
];
1181 elif isinstance(element
, list) and isinstance(key
, int) and -len(element
) <= key
< len(element
):
1182 element
= element
[key
];
1187 def GetHeaderChecksum(inlist
=[], checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_dict__
):
1188 formatspecs
= FormatSpecsListToDict(formatspecs
);
1189 fileheader
= AppendNullBytes(inlist
, formatspecs
['format_delimiter']) if isinstance(inlist
, list) else AppendNullByte(inlist
, formatspecs
['format_delimiter']);
1191 fileheader
= fileheader
.encode('UTF-8');
1192 checksum_methods
= {
1193 "crc16": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
1194 "crc16_ansi": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
1195 "crc16_ibm": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
1196 "crc16_ccitt": lambda data
: format(crc16_ccitt(data
) & 0xffff, '04x').lower(),
1197 "adler32": lambda data
: format(zlib
.adler32(data
) & 0xffffffff, '08x').lower(),
1198 "crc32": lambda data
: format(crc32(data
) & 0xffffffff, '08x').lower(),
1199 "crc64_ecma": lambda data
: format(crc64_ecma(data
) & 0xffffffffffffffff, '016x').lower(),
1200 "crc64": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
1201 "crc64_iso": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
1203 if checksumtype
in checksum_methods
:
1204 return checksum_methods
[checksumtype
](fileheader
);
1205 elif CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
):
1206 checksumoutstr
= hashlib
.new(checksumtype
);
1207 checksumoutstr
.update(fileheader
);
1208 return checksumoutstr
.hexdigest().lower();
1209 return format(0, 'x').lower();
1211 def GetFileChecksum(instr
, checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_dict__
):
1212 formatspecs
= FormatSpecsListToDict(formatspecs
);
1214 instr
= instr
.encode('UTF-8');
1215 checksum_methods
= {
1216 "crc16": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
1217 "crc16_ansi": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
1218 "crc16_ibm": lambda data
: format(crc16(data
) & 0xffff, '04x').lower(),
1219 "crc16_ccitt": lambda data
: format(crc16_ccitt(data
) & 0xffff, '04x').lower(),
1220 "adler32": lambda data
: format(zlib
.adler32(data
) & 0xffffffff, '08x').lower(),
1221 "crc32": lambda data
: format(crc32(data
) & 0xffffffff, '08x').lower(),
1222 "crc64_ecma": lambda data
: format(crc64_ecma(data
) & 0xffffffffffffffff, '016x').lower(),
1223 "crc64": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
1224 "crc64_iso": lambda data
: format(crc64_iso(data
) & 0xffffffffffffffff, '016x').lower(),
1226 if checksumtype
in checksum_methods
:
1227 return checksum_methods
[checksumtype
](instr
);
1228 elif CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
):
1229 checksumoutstr
= hashlib
.new(checksumtype
);
1230 checksumoutstr
.update(instr
);
1231 return checksumoutstr
.hexdigest().lower();
1232 return format(0, 'x').lower();
1234 def ValidateHeaderChecksum(inlist
=[], checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_dict__
):
1235 formatspecs
= FormatSpecsListToDict(formatspecs
);
1236 catfileheadercshex
= GetHeaderChecksum(inlist
, checksumtype
, True, formatspecs
).lower();
1237 return inchecksum
.lower() == catfileheadercshex
;
1239 def ValidateFileChecksum(infile
, checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_dict__
):
1240 formatspecs
= FormatSpecsListToDict(formatspecs
);
1241 catinfilecshex
= GetFileChecksum(infile
, checksumtype
, True, formatspecs
).lower();
1242 return inchecksum
.lower() == catinfilecshex
;
1244 def ReadTillNullByteOld(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
1247 nullbyte
= delimiter
.encode("UTF-8");
1249 curbyte
= fp
.read(1);
1250 if(curbyte
==nullbyte
or not curbyte
):
1252 curfullbyte
= curfullbyte
+ curbyte
;
1253 return curfullbyte
.decode('UTF-8');
1255 def ReadUntilNullByteOld(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
1256 return ReadTillNullByteOld(fp
, delimiter
);
1258 def ReadTillNullByteAlt(fp
, delimiter
=__file_format_dict__
['format_delimiter'], chunk_size
=1024, max_read
=1024000):
1259 delimiter
= delimiter
.encode('UTF-8') # Ensure the delimiter is in bytes
1260 buffer = bytearray();
1262 delimiter_length
= len(delimiter
);
1264 chunk
= fp
.read(chunk_size
)
1266 # End of file reached without finding the delimiter
1268 buffer.extend(chunk
);
1269 total_read
+= len(chunk
);
1270 if delimiter
in buffer:
1271 # Delimiter found, calculate where to reset the file pointer
1272 index
= buffer.find(delimiter
);
1273 # Calculate how many extra bytes were read after the delimiter
1274 extra_bytes_read
= len(buffer) - (index
+ delimiter_length
);
1275 # Move the file pointer back to just after the delimiter
1276 fp
.seek(-extra_bytes_read
, 1);
1277 buffer = buffer[:index
];
1279 if total_read
>= max_read
:
1280 # Stop reading if max limit is reached to prevent excessive memory usage
1281 raise MemoryError("Maximum read limit reached without finding the delimiter.");
1282 # Check for incomplete UTF-8 sequences at the end of the buffer
1283 if len(buffer) > 1 and 128 <= buffer[-1] < 192:
1284 # This suggests that the last byte might be the start of a multi-byte character
1285 # Try to read one more byte to complete the character
1286 extra_byte
= fp
.read(1);
1288 buffer.extend(extra_byte
);
1290 # No more data available
1293 return buffer.decode('UTF-8', errors
='replace');
1294 except UnicodeDecodeError:
1295 return buffer.decode('UTF-8', errors
='replace');
1297 def ReadUntilNullByteAlt(fp
, delimiter
=__file_format_dict__
['format_delimiter'], chunk_size
=1024, max_read
=1024000):
1298 return ReadTillNullByteAlt(fp
, delimiter
, chunk_size
, max_read
);
1300 def ReadTillNullByte(fp
, delimiter
=__file_format_dict__
['format_delimiter'], max_read
=1024000):
1301 curfullbyte
= bytearray();
1302 nullbyte
= delimiter
.encode("UTF-8");
1303 total_read
= 0; # Track the total number of bytes read
1305 curbyte
= fp
.read(1);
1306 if curbyte
== nullbyte
or not curbyte
:
1308 curfullbyte
.extend(curbyte
);
1310 if total_read
>= max_read
:
1311 raise MemoryError("Maximum read limit reached without finding the delimiter.");
1312 # Decode the full byte array to string once out of the loop
1314 return curfullbyte
.decode('UTF-8');
1315 except UnicodeDecodeError:
1316 # Handle potential partial UTF-8 characters
1317 for i
in range(1, 4):
1319 return curfullbyte
[:-i
].decode('UTF-8');
1320 except UnicodeDecodeError:
1322 raise; # Re-raise if decoding fails even after trimming
1324 def ReadUntilNullByte(fp
, delimiter
=__file_format_dict__
['format_delimiter'], max_read
=1024000):
1325 return ReadTillNullByte(fp
, delimiter
, max_read
);
1327 def ReadTillNullByteByNum(fp
, delimiter
=__file_format_dict__
['format_delimiter'], num_delimiters
=1, chunk_size
=1024, max_read
=1024000):
1328 delimiter
= delimiter
.encode('UTF-8'); # Ensure the delimiter is in bytes
1329 buffer = bytearray();
1331 delimiter_length
= len(delimiter
);
1333 while len(results
) < num_delimiters
:
1334 chunk
= fp
.read(chunk_size
);
1336 # End of file reached; decode whatever is collected if it's the last needed part
1338 results
.append(buffer.decode('UTF-8', errors
='replace'));
1340 buffer.extend(chunk
)
1341 total_read
+= len(chunk
);
1342 # Check if we have found the delimiter
1343 while delimiter
in buffer:
1344 index
= buffer.find(delimiter
);
1345 # Decode the section before the delimiter
1346 results
.append(buffer[:index
].decode('UTF-8', errors
='replace'));
1347 # Remove the processed part from the buffer
1348 buffer = buffer[index
+ delimiter_length
:];
1349 if len(results
) == num_delimiters
:
1350 # If reached the required number of delimiters, adjust the file pointer and stop
1351 fp
.seek(-len(buffer), 1);
1353 if total_read
>= max_read
:
1354 # Stop reading if max limit is reached to prevent excessive memory usage
1355 raise MemoryError("Maximum read limit reached without finding the delimiter.");
1356 # Check for incomplete UTF-8 sequences at the end of the buffer
1357 if len(buffer) > 1 and 128 <= buffer[-1] < 192:
1358 # This suggests that the last byte might be the start of a multi-byte character
1359 # Try to read one more byte to complete the character
1360 extra_byte
= fp
.read(1);
1362 buffer.extend(extra_byte
);
1364 # No more data available
1366 # Process remaining buffer if less than the required number of delimiters were found
1367 if len(buffer) > 0 and len(results
) < num_delimiters
:
1368 results
.append(buffer.decode('UTF-8', errors
='replace'));
1371 def ReadUntilNullByteByNum(fp
, delimiter
=__file_format_dict__
['format_delimiter'], num_delimiters
=1, chunk_size
=1024, max_read
=1024000):
1372 return ReadTillNullByteByNum(fp
, delimiter
, num_delimiters
, chunk_size
, max_read
);
1374 def SeekToEndOfFile(fp
):
1378 if(lasttell
==fp
.tell()):
1380 lasttell
= fp
.tell();
1383 def ReadFileHeaderData(fp
, rounds
=0, delimiter
=__file_format_dict__
['format_delimiter']):
1385 roend
= int(rounds
);
1387 while(rocount
<roend
):
1388 HeaderOut
.append(ReadTillNullByte(fp
, delimiter
));
1389 rocount
= rocount
+ 1;
1392 def ReadFileHeaderDataBySize(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
1393 headerpresize
= ReadTillNullByte(fp
, delimiter
);
1394 headersize
= int(headerpresize
, 16);
1397 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
1400 roend
= int(len(headercontent
));
1401 HeaderOut
= [headerpresize
];
1402 while(rocount
<roend
):
1403 HeaderOut
.append(headercontent
[rocount
]);
1404 rocount
= rocount
+ 1;
1407 def ReadFileHeaderDataWoSize(fp
, delimiter
=__file_format_dict__
['format_delimiter']):
1408 preheaderdata
= ReadFileHeaderData(fp
, 2, delimiter
);
1409 headersize
= int(preheaderdata
[0], 16);
1410 headernumfields
= int(preheaderdata
[1], 16);
1411 if(headersize
<=0 or headernumfields
<=0):
1413 headerdata
= ReadTillNullByteByNum(fp
, delimiter
, headernumfields
);
1414 #headerdata = ReadFileHeaderData(fp, headernumfields, delimiter);
1415 HeaderOut
= preheaderdata
+ headerdata
;
1418 def ReadFileHeaderDataBySizeWithContent(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1419 formatspecs
= FormatSpecsListToDict(formatspecs
);
1420 delimiter
= formatspecs
['format_delimiter'];
1421 fheaderstart
= fp
.tell();
1422 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
1423 if(len(HeaderOut
)==0):
1425 if(re
.findall(r
"^[.|/]", HeaderOut
[3])):
1426 fname
= HeaderOut
[3];
1428 fname
= "./"+HeaderOut
[3];
1429 fcs
= HeaderOut
[-2].lower();
1430 fccs
= HeaderOut
[-1].lower();
1431 fsize
= int(HeaderOut
[5], 16);
1432 fcompression
= HeaderOut
[12];
1433 fcsize
= int(HeaderOut
[13], 16);
1434 fseeknextfile
= HeaderOut
[25];
1435 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-4].lower(), True, formatspecs
);
1436 if(fcs
!=newfcs
and not skipchecksum
):
1437 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
1438 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
1440 fhend
= fp
.tell() - 1;
1441 fcontentstart
= fp
.tell();
1442 fcontents
= BytesIO();
1443 if(fsize
>0 and not listonly
):
1444 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1445 fcontents
.write(fp
.read(fsize
));
1447 fcontents
.write(fp
.read(fcsize
));
1448 elif(fsize
>0 and listonly
):
1449 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1453 fcontents
.seek(0, 0);
1454 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
1455 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
1456 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
1457 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
1459 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1462 fcontents
.seek(0, 0);
1464 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
1465 fcontentend
= fp
.tell();
1466 if(re
.findall(r
"^\+([0-9]+)", fseeknextfile
)):
1467 fseeknextasnum
= int(fseeknextfile
.replace("+", ""));
1468 if(abs(fseeknextasnum
)==0):
1470 fp
.seek(fseeknextasnum
, 1);
1471 elif(re
.findall(r
"^\-([0-9]+)", fseeknextfile
)):
1472 fseeknextasnum
= int(fseeknextfile
);
1473 if(abs(fseeknextasnum
)==0):
1475 fp
.seek(fseeknextasnum
, 1);
1476 elif(re
.findall(r
"^([0-9]+)", fseeknextfile
)):
1477 fseeknextasnum
= int(fseeknextfile
);
1478 if(abs(fseeknextasnum
)==0):
1480 fp
.seek(fseeknextasnum
, 0);
1483 HeaderOut
.append(fcontents
);
1486 def ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
=False, contentasfile
=True, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1487 formatspecs
= FormatSpecsListToDict(formatspecs
);
1488 delimiter
= formatspecs
['format_delimiter'];
1489 fheaderstart
= fp
.tell();
1490 if(formatspecs
['new_style']):
1491 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
1493 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
1494 if(len(HeaderOut
)==0):
1496 fheadsize
= int(HeaderOut
[0], 16);
1497 fnumfields
= int(HeaderOut
[1], 16);
1498 ftype
= int(HeaderOut
[2], 16);
1499 if(re
.findall(r
"^[.|/]", HeaderOut
[3])):
1500 fname
= HeaderOut
[3];
1502 fname
= "./"+HeaderOut
[3];
1503 fbasedir
= os
.path
.dirname(fname
);
1504 flinkname
= HeaderOut
[4];
1505 fsize
= int(HeaderOut
[5], 16);
1506 fatime
= int(HeaderOut
[6], 16);
1507 fmtime
= int(HeaderOut
[7], 16);
1508 fctime
= int(HeaderOut
[8], 16);
1509 fbtime
= int(HeaderOut
[9], 16);
1510 fmode
= int(HeaderOut
[10], 16);
1511 fchmode
= stat
.S_IMODE(fmode
);
1512 ftypemod
= stat
.S_IFMT(fmode
);
1513 fwinattributes
= int(HeaderOut
[11], 16);
1514 fcompression
= HeaderOut
[12];
1515 fcsize
= int(HeaderOut
[13], 16);
1516 fuid
= int(HeaderOut
[14], 16);
1517 funame
= HeaderOut
[15];
1518 fgid
= int(HeaderOut
[16], 16);
1519 fgname
= HeaderOut
[17];
1520 fid
= int(HeaderOut
[18], 16);
1521 finode
= int(HeaderOut
[19], 16);
1522 flinkcount
= int(HeaderOut
[20], 16);
1523 fdev_minor
= int(HeaderOut
[21], 16);
1524 fdev_major
= int(HeaderOut
[22], 16);
1525 frdev_minor
= int(HeaderOut
[23], 16);
1526 frdev_major
= int(HeaderOut
[24], 16);
1527 fseeknextfile
= HeaderOut
[25];
1528 fextrasize
= int(HeaderOut
[26], 16);
1529 fextrafields
= int(HeaderOut
[27], 16);
1530 extrafieldslist
= [];
1532 extraend
= extrastart
+ fextrafields
;
1533 extrafieldslist
= [];
1534 if(extrastart
<extraend
):
1535 extrafieldslist
.append(HeaderOut
[extrastart
]);
1536 extrastart
= extrastart
+ 1;
1537 fcs
= HeaderOut
[-2].lower();
1538 fccs
= HeaderOut
[-1].lower();
1539 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-4].lower(), True, formatspecs
);
1540 if(fcs
!=newfcs
and not skipchecksum
):
1541 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
1542 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
1544 fhend
= fp
.tell() - 1;
1545 fcontentstart
= fp
.tell();
1546 fcontents
= BytesIO();
1547 pyhascontents
= False;
1548 if(fsize
>0 and not listonly
):
1549 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1550 fcontents
.write(fp
.read(fsize
));
1552 fcontents
.write(fp
.read(fcsize
));
1553 pyhascontents
= True;
1554 elif(fsize
>0 and listonly
):
1555 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1559 pyhascontents
= False;
1560 fcontents
.seek(0, 0);
1561 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
1562 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
1563 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
1564 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
1566 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1569 fcontents
.seek(0, 0);
1571 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
1572 fcontents
.seek(0, 0);
1573 fccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
1574 fcontentend
= fp
.tell() - 1;
1575 if(re
.findall(r
"^\+([0-9]+)", fseeknextfile
)):
1576 fseeknextasnum
= int(fseeknextfile
.replace("+", ""));
1577 if(abs(fseeknextasnum
)==0):
1579 fp
.seek(fseeknextasnum
, 1);
1580 elif(re
.findall(r
"^\-([0-9]+)", fseeknextfile
)):
1581 fseeknextasnum
= int(fseeknextfile
);
1582 if(abs(fseeknextasnum
)==0):
1584 fp
.seek(fseeknextasnum
, 1);
1585 elif(re
.findall(r
"^([0-9]+)", fseeknextfile
)):
1586 fseeknextasnum
= int(fseeknextfile
);
1587 if(abs(fseeknextasnum
)==0):
1589 fp
.seek(fseeknextasnum
, 0);
1592 fcontents
.seek(0, 0);
1593 if(not contentasfile
):
1594 fcontents
= fcontents
.read();
1595 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
, 'fcontentasfile': contentasfile
, 'fcontents': fcontents
};
1598 def ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1599 formatspecs
= FormatSpecsListToDict(formatspecs
);
1600 delimiter
= formatspecs
['format_delimiter'];
1601 fheaderstart
= fp
.tell();
1602 if(formatspecs
['new_style']):
1603 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
1605 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
1606 if(len(HeaderOut
)==0):
1608 fheadsize
= int(HeaderOut
[0], 16);
1609 fnumfields
= int(HeaderOut
[1], 16);
1610 ftype
= int(HeaderOut
[2], 16);
1611 if(re
.findall(r
"^[.|/]", HeaderOut
[3])):
1612 fname
= HeaderOut
[3];
1614 fname
= "./"+HeaderOut
[3];
1615 fbasedir
= os
.path
.dirname(fname
);
1616 flinkname
= HeaderOut
[4];
1617 fsize
= int(HeaderOut
[5], 16);
1618 fatime
= int(HeaderOut
[6], 16);
1619 fmtime
= int(HeaderOut
[7], 16);
1620 fctime
= int(HeaderOut
[8], 16);
1621 fbtime
= int(HeaderOut
[9], 16);
1622 fmode
= int(HeaderOut
[10], 16);
1623 fchmode
= stat
.S_IMODE(fmode
);
1624 ftypemod
= stat
.S_IFMT(fmode
);
1625 fwinattributes
= int(HeaderOut
[11], 16);
1626 fcompression
= HeaderOut
[12];
1627 fcsize
= int(HeaderOut
[13], 16);
1628 fuid
= int(HeaderOut
[14], 16);
1629 funame
= HeaderOut
[15];
1630 fgid
= int(HeaderOut
[16], 16);
1631 fgname
= HeaderOut
[17];
1632 fid
= int(HeaderOut
[18], 16);
1633 finode
= int(HeaderOut
[19], 16);
1634 flinkcount
= int(HeaderOut
[20], 16);
1635 fdev_minor
= int(HeaderOut
[21], 16);
1636 fdev_major
= int(HeaderOut
[22], 16);
1637 frdev_minor
= int(HeaderOut
[23], 16);
1638 frdev_major
= int(HeaderOut
[24], 16);
1639 fseeknextfile
= HeaderOut
[25];
1640 fextrasize
= int(HeaderOut
[26], 16);
1641 fextrafields
= int(HeaderOut
[27], 16);
1642 extrafieldslist
= [];
1644 extraend
= extrastart
+ fextrafields
;
1645 extrafieldslist
= [];
1646 if(extrastart
<extraend
):
1647 extrafieldslist
.append(HeaderOut
[extrastart
]);
1648 extrastart
= extrastart
+ 1;
1649 fheaderchecksumtype
= HeaderOut
[extrastart
].lower();
1650 fcontentchecksumtype
= HeaderOut
[extrastart
+ 1].lower();
1651 fcs
= HeaderOut
[-2].lower();
1652 fccs
= HeaderOut
[-1].lower();
1653 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-4].lower(), True, formatspecs
);
1654 if(fcs
!=newfcs
and not skipchecksum
):
1655 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
1656 VerbosePrintOut("'" + str(fcs
) + "' != " + "'" + str(newfcs
) + "'");
1658 fhend
= fp
.tell() - 1;
1659 fcontentstart
= fp
.tell();
1660 fcontents
= BytesIO();
1661 pyhascontents
= False;
1662 if(fsize
>0 and not listonly
):
1663 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1664 fcontents
.write(fp
.read(fsize
));
1666 fcontents
.write(fp
.read(fcsize
));
1667 pyhascontents
= True;
1668 elif(fsize
>0 and listonly
):
1669 if(fcompression
=="none" or fcompression
=="" or fcompression
=="atuo"):
1673 pyhascontents
= False;
1674 fcontents
.seek(0, 0);
1675 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
1676 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
1677 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
1678 VerbosePrintOut("'" + str(fccs
) + "' != " + "'" + str(newfccs
) + "'");
1680 if(fcompression
=="none" or fcompression
=="" or fcompression
=="auto"):
1683 fcontents
.seek(0, 0);
1685 fcontents
= UncompressArchiveFile(fcontents
, formatspecs
);
1686 fcontents
.seek(0, 0);
1687 fcontentend
= fp
.tell() - 1;
1688 if(re
.findall(r
"^\+([0-9]+)", fseeknextfile
)):
1689 fseeknextasnum
= int(fseeknextfile
.replace("+", ""));
1690 if(abs(fseeknextasnum
)==0):
1692 fp
.seek(fseeknextasnum
, 1);
1693 elif(re
.findall(r
"^\-([0-9]+)", fseeknextfile
)):
1694 fseeknextasnum
= int(fseeknextfile
);
1695 if(abs(fseeknextasnum
)==0):
1697 fp
.seek(fseeknextasnum
, 1);
1698 elif(re
.findall(r
"^([0-9]+)", fseeknextfile
)):
1699 fseeknextasnum
= int(fseeknextfile
);
1700 if(abs(fseeknextasnum
)==0):
1702 fp
.seek(fseeknextasnum
, 0);
1705 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
];
1708 def ReadFileDataBySizeWithContent(fp
, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1709 formatspecs
= FormatSpecsListToDict(formatspecs
);
1710 delimiter
= formatspecs
['format_delimiter'];
1714 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1717 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1718 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1719 if(not headercheck
and not skipchecksum
):
1720 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1721 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1723 fnumfiles
= int(catheader
[1], 16);
1726 while(countnum
< fnumfiles
):
1727 HeaderOut
= ReadFileHeaderDataBySizeWithContent(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
)
1728 if(len(HeaderOut
)==0):
1730 flist
.append(HeaderOut
);
1731 countnum
= countnum
+ 1;
1734 def ReadFileDataBySizeWithContentToArray(fp
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1735 formatspecs
= FormatSpecsListToDict(formatspecs
);
1736 delimiter
= formatspecs
['format_delimiter'];
1740 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1743 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1744 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1745 if(not headercheck
and not skipchecksum
):
1746 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1747 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1749 catstring
= catheader
[0];
1750 catversion
= re
.findall(r
"([\d]+)", catstring
);
1751 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
1752 fprenumfiles
= catheader
[1];
1753 fnumfiles
= int(fprenumfiles
, 16);
1754 fprechecksumtype
= catheader
[2];
1755 fprechecksum
= catheader
[3];
1756 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': []};
1757 if(seekstart
<0 and seekstart
>fnumfiles
):
1759 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
1760 seekend
= fnumfiles
;
1761 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
1762 seekend
= fnumfiles
- abs(seekend
);
1765 while(il
< seekstart
):
1766 prefhstart
= fp
.tell();
1767 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
['format_delimiter']);
1768 if(len(preheaderdata
)==0):
1770 prefsize
= int(preheaderdata
[5], 16);
1771 prefseeknextfile
= preheaderdata
[25];
1772 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
1773 prefcs
= preheaderdata
[-2];
1774 if(prefcs
!=prenewfcs
and not skipchecksum
):
1775 VVerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
1776 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
1778 valid_archive
= False;
1779 invalid_archive
= True;
1780 prefhend
= fp
.tell() - 1;
1781 prefcontentstart
= fp
.tell();
1782 prefcontents
= BytesIO();
1783 pyhascontents
= False;
1785 prefcontents
.write(fp
.read(prefsize
));
1786 prefcontents
.seek(0, 0);
1787 prenewfccs
= GetFileChecksum(prefcontents
.read(), preheaderdata
[-3].lower(), False, formatspecs
);
1788 prefccs
= preheaderdata
[-1];
1789 pyhascontents
= True;
1790 if(prefccs
!=prenewfccs
and not skipchecksum
):
1791 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
1792 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
1794 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
1795 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
1796 if(abs(fseeknextasnum
)==0):
1798 fp
.seek(fseeknextasnum
, 1);
1799 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
1800 fseeknextasnum
= int(prefseeknextfile
);
1801 if(abs(fseeknextasnum
)==0):
1803 fp
.seek(fseeknextasnum
, 1);
1804 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
1805 fseeknextasnum
= int(prefseeknextfile
);
1806 if(abs(fseeknextasnum
)==0):
1808 fp
.seek(fseeknextasnum
, 0);
1813 countnum
= seekstart
;
1814 while(countnum
< seekend
):
1815 HeaderOut
= ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
, contentasfile
, uncompress
, skipchecksum
, formatspecs
);
1816 if(len(HeaderOut
)==0):
1818 HeaderOut
.update({'fid': realidnum
, 'fidalt': realidnum
});
1819 catlist
['ffilelist'].append(HeaderOut
);
1820 countnum
= countnum
+ 1;
1821 realidnum
= realidnum
+ 1;
1824 def ReadFileDataBySizeWithContentToList(fp
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1825 formatspecs
= FormatSpecsListToDict(formatspecs
);
1826 delimiter
= formatspecs
['format_delimiter'];
1830 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
1833 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
1834 newfcs
= GetHeaderChecksum(catheader
[:-2], catheader
[2], True, formatspecs
);
1835 if(not headercheck
and not skipchecksum
):
1836 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
1837 VerbosePrintOut("'" + str(newfcs
) + "' != " + "'" + str(catheader
[3]) + "'");
1839 catstring
= catheader
[0];
1840 catversion
= re
.findall(r
"([\d]+)", catstring
);
1841 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
1842 fprenumfiles
= catheader
[1];
1843 fnumfiles
= int(fprenumfiles
, 16);
1844 fprechecksumtype
= catheader
[2];
1845 fprechecksum
= catheader
[3];
1847 if(seekstart
<0 and seekstart
>fnumfiles
):
1849 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
1850 seekend
= fnumfiles
;
1851 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
1852 seekend
= fnumfiles
- abs(seekend
);
1855 while(il
< seekstart
):
1856 prefhstart
= fp
.tell();
1857 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
['format_delimiter']);
1858 if(len(preheaderdata
)==0):
1860 prefsize
= int(preheaderdata
[5], 16);
1861 prefcompression
= preheaderdata
[12];
1862 prefcsize
= int(preheaderdata
[13], 16);
1863 prefseeknextfile
= HeaderOut
[25];
1864 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
1865 prefcs
= preheaderdata
[-2];
1866 if(prefcs
!=prenewfcs
and not skipchecksum
):
1867 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
1868 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
1870 valid_archive
= False;
1871 invalid_archive
= True;
1872 prefhend
= fp
.tell() - 1;
1873 prefcontentstart
= fp
.tell();
1875 pyhascontents
= False;
1877 if(prefcompression
=="none" or prefcompression
=="" or prefcompression
=="auto"):
1878 prefcontents
= catfp
.read(prefsize
);
1880 prefcontents
= catfp
.read(prefcsize
);
1881 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
1882 prefccs
= preheaderdata
[-1];
1883 pyhascontents
= True;
1884 if(prefccs
!=prenewfccs
and not skipchecksum
):
1885 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
1886 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
1888 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
1889 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
1890 if(abs(fseeknextasnum
)==0):
1892 catfp
.seek(fseeknextasnum
, 1);
1893 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
1894 fseeknextasnum
= int(prefseeknextfile
);
1895 if(abs(fseeknextasnum
)==0):
1897 catfp
.seek(fseeknextasnum
, 1);
1898 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
1899 fseeknextasnum
= int(prefseeknextfile
);
1900 if(abs(fseeknextasnum
)==0):
1902 catfp
.seek(fseeknextasnum
, 0);
1907 countnum
= seekstart
;
1908 while(countnum
< seekend
):
1909 HeaderOut
= ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
, uncompress
, skipchecksum
, formatspecs
);
1910 if(len(HeaderOut
)==0):
1912 catlist
.append(HeaderOut
);
1913 countnum
= countnum
+ 1;
1914 realidnum
= realidnum
+ 1;
1917 def ReadInFileBySizeWithContentToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1918 formatspecs
= FormatSpecsListToDict(formatspecs
);
1919 delimiter
= formatspecs
['format_delimiter'];
1920 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1923 fp
= UncompressArchiveFile(fp
, formatspecs
);
1924 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1925 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1932 if(hasattr(sys
.stdin
, "buffer")):
1933 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1935 shutil
.copyfileobj(sys
.stdin
, fp
);
1937 fp
= UncompressArchiveFile(fp
, formatspecs
);
1941 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1942 fp
= download_file_from_internet_file(infile
);
1943 fp
= UncompressArchiveFile(fp
, formatspecs
);
1949 infile
= RemoveWindowsPath(infile
);
1950 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
1951 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1953 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1954 if(not compresscheck
):
1955 fextname
= os
.path
.splitext(infile
)[1];
1956 if(fextname
==".gz"):
1957 compresscheck
= "gzip";
1958 elif(fextname
==".bz2"):
1959 compresscheck
= "bzip2";
1960 elif(fextname
==".zst"):
1961 compresscheck
= "zstd";
1962 elif(fextname
==".lz4" or fextname
==".clz4"):
1963 compresscheck
= "lz4";
1964 elif(fextname
==".lzo" or fextname
==".lzop"):
1965 compresscheck
= "lzo";
1966 elif(fextname
==".lzma"):
1967 compresscheck
= "lzma";
1968 elif(fextname
==".xz"):
1969 compresscheck
= "xz";
1970 elif(fextname
==".zz" or fextname
==".zl" or fextname
==".zlib"):
1971 compresscheck
= "zlib";
1974 if(not compresscheck
):
1976 fp
= UncompressFile(infile
, formatspecs
, "rb");
1977 return ReadFileDataBySizeWithContentToArray(fp
, seekstart
, seekend
, listonly
, contentasfile
, uncompress
, skipchecksum
, formatspecs
);
1979 def ReadInFileBySizeWithContentToList(infile
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
):
1980 formatspecs
= FormatSpecsListToDict(formatspecs
);
1981 delimiter
= formatspecs
['format_delimiter'];
1982 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1985 fp
= UncompressArchiveFile(fp
, formatspecs
);
1986 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1987 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
1994 if(hasattr(sys
.stdin
, "buffer")):
1995 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1997 shutil
.copyfileobj(sys
.stdin
, fp
);
1999 fp
= UncompressArchiveFile(fp
, formatspecs
);
2003 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
2004 fp
= download_file_from_internet_file(infile
);
2005 fp
= UncompressArchiveFile(fp
, formatspecs
);
2011 infile
= RemoveWindowsPath(infile
);
2012 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
2013 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
2015 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
2016 if(not compresscheck
):
2017 fextname
= os
.path
.splitext(infile
)[1];
2018 if(fextname
==".gz"):
2019 compresscheck
= "gzip";
2020 elif(fextname
==".bz2"):
2021 compresscheck
= "bzip2";
2022 elif(fextname
==".zst"):
2023 compresscheck
= "zstd";
2024 elif(fextname
==".lz4" or fextname
==".clz4"):
2025 compresscheck
= "lz4";
2026 elif(fextname
==".lzo" or fextname
==".lzop"):
2027 compresscheck
= "lzo";
2028 elif(fextname
==".lzma"):
2029 compresscheck
= "lzma";
2030 elif(fextname
==".xz"):
2031 compresscheck
= "xz";
2032 elif(fextname
==".zz" or fextname
==".zl" or fextname
==".zlib"):
2033 compresscheck
= "zlib";
2036 if(not compresscheck
):
2038 fp
= UncompressFile(infile
, formatspecs
, "rb");
2039 return ReadFileDataBySizeWithContentToList(fp
, seekstart
, seekend
, listonly
, uncompress
, skipchecksum
, formatspecs
);
2041 def AppendNullByte(indata
, delimiter
=__file_format_dict__
['format_delimiter']):
2042 outdata
= str(indata
) + delimiter
;
2045 def AppendNullBytes(indata
=[], delimiter
=__file_format_dict__
['format_delimiter']):
2050 outdata
= outdata
+ AppendNullByte(indata
[inum
], delimiter
);
2054 def AppendFileHeader(fp
, numfiles
, checksumtype
="crc32", formatspecs
=__file_format_dict__
):
2055 formatspecs
= FormatSpecsListToDict(formatspecs
);
2056 delimiter
= formatspecs
['format_delimiter'];
2057 catver
= formatspecs
['format_ver'];
2058 fileheaderver
= str(int(catver
.replace(".", "")));
2059 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
2060 fp
.write(fileheader
.encode('UTF-8'));
2061 fnumfiles
= format(int(numfiles
), 'x').lower();
2062 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
['format_delimiter']);
2063 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
2064 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
2065 fp
.write(fnumfilesa
.encode('UTF-8'));
2068 os
.fsync(fp
.fileno());
2069 except io
.UnsupportedOperation
:
2071 except AttributeError:
2073 except OSError as e
:
2077 def MakeEmptyFilePointer(fp
, checksumtype
="crc32", formatspecs
=__file_format_dict__
):
2078 formatspecs
= FormatSpecsListToDict(formatspecs
);
2079 AppendFileHeader(fp
, 0, checksumtype
, formatspecs
);
2082 def MakeEmptyFile(outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", formatspecs
=__file_format_dict__
, returnfp
=False):
2083 formatspecs
= FormatSpecsListToDict(formatspecs
);
2084 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2085 if(os
.path
.exists(outfile
)):
2088 except OSError as e
:
2092 catfpfp
= BytesIO();
2093 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2095 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2098 fbasename
= os
.path
.splitext(outfile
)[0];
2099 fextname
= os
.path
.splitext(outfile
)[1];
2100 if(not compresswholefile
and fextname
in outextlistwd
):
2101 compresswholefile
= True;
2102 catfp
= CompressOpenFile(outfile
, True, compressionlevel
);
2103 catfp
= AppendFileHeader(catfp
, 0, checksumtype
, formatspecs
);
2104 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2105 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2108 os
.fsync(catfp
.fileno());
2109 except io
.UnsupportedOperation
:
2111 except AttributeError:
2113 except OSError as e
:
2117 if(hasattr(sys
.stdout
, "buffer")):
2118 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2120 shutil
.copyfileobj(catfp
, sys
.stdout
);
2121 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2122 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2124 upload_file_to_internet_file(catfp
, outfile
);
2132 def AppendFileHeaderWithContent(fp
, filevalues
=[], extradata
=[], filecontent
="", checksumtype
="crc32", formatspecs
=__file_format_dict__
):
2133 formatspecs
= FormatSpecsListToDict(formatspecs
);
2134 extrafields
= format(len(extradata
), 'x').lower();
2135 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
2136 if(len(extradata
)>0):
2137 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
2138 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2139 catoutlen
= len(filevalues
) + len(extradata
) + 5;
2140 catoutlenhex
= format(catoutlen
, 'x').lower();
2141 catoutlist
= filevalues
;
2142 catoutlist
.insert(0, catoutlenhex
);
2143 catoutlist
.append(extrasizelen
);
2144 catoutlist
.append(extrafields
);
2145 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
2146 if(len(extradata
)>0):
2147 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
2148 if(len(filecontent
)==0):
2149 checksumlist
= [checksumtype
, "none"];
2151 checksumlist
= [checksumtype
, checksumtype
];
2152 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
2153 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
2154 if(len(filecontent
)==0):
2155 catfilecontentcshex
= GetFileChecksum(filecontent
, "none", False, formatspecs
);
2157 catfilecontentcshex
= GetFileChecksum(filecontent
, checksumtype
, False, formatspecs
);
2158 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
2159 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
2160 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
2161 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
2162 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
2163 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2164 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
2165 catfileout
= catfileoutstrecd
+ filecontent
+ nullstrecd
;
2166 fp
.write(catfileout
);
2169 os
.fsync(fp
.fileno());
2170 except io
.UnsupportedOperation
:
2172 except AttributeError:
2174 except OSError as e
:
2178 def AppendFilesWithContent(infiles
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
2179 formatspecs
= FormatSpecsListToDict(formatspecs
);
2180 advancedlist
= formatspecs
['use_advanced_list'];
2181 altinode
= formatspecs
['use_alt_inode'];
2183 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2185 for line
in sys
.stdin
:
2186 infilelist
.append(line
.strip());
2187 infilelist
= list(filter(None, infilelist
));
2188 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
2189 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
2191 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
2192 for line
in finfile
:
2193 infilelist
.append(line
.strip());
2194 infilelist
= list(filter(None, infilelist
));
2196 if(isinstance(infiles
, (list, tuple, ))):
2197 infilelist
= list(filter(None, infiles
));
2198 elif(isinstance(infiles
, (str, ))):
2199 infilelist
= list(filter(None, [infiles
]));
2201 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
2203 GetDirList
= ListDir(infilelist
, followlink
, False);
2211 inodetocatinode
= {};
2212 numfiles
= int(len(GetDirList
));
2213 fnumfiles
= format(numfiles
, 'x').lower();
2214 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
2215 for curfname
in GetDirList
:
2216 if(re
.findall(r
"^[.|/]", curfname
)):
2219 fname
= "./"+curfname
;
2221 VerbosePrintOut(fname
);
2222 if(not followlink
or followlink
is None):
2223 fstatinfo
= os
.lstat(fname
);
2225 fstatinfo
= os
.stat(fname
);
2226 fpremode
= fstatinfo
.st_mode
;
2227 finode
= fstatinfo
.st_ino
;
2228 flinkcount
= fstatinfo
.st_nlink
;
2230 if(stat
.S_ISREG(fpremode
)):
2232 elif(stat
.S_ISLNK(fpremode
)):
2234 elif(stat
.S_ISCHR(fpremode
)):
2236 elif(stat
.S_ISBLK(fpremode
)):
2238 elif(stat
.S_ISDIR(fpremode
)):
2240 elif(stat
.S_ISFIFO(fpremode
)):
2242 elif(stat
.S_ISSOCK(fpremode
)):
2244 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
2246 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
2248 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
2253 fcurfid
= format(int(curfid
), 'x').lower();
2254 if(not followlink
and finode
!=0):
2256 if(finode
in inodelist
):
2258 flinkname
= inodetofile
[finode
];
2260 fcurinode
= format(int(finode
), 'x').lower();
2262 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
2263 if(finode
not in inodelist
):
2264 inodelist
.append(finode
);
2265 inodetofile
.update({finode
: fname
});
2266 inodetocatinode
.update({finode
: curinode
});
2268 fcurinode
= format(int(finode
), 'x').lower();
2270 fcurinode
= format(int(curinode
), 'x').lower();
2271 curinode
= curinode
+ 1;
2273 fcurinode
= format(int(curinode
), 'x').lower();
2274 curinode
= curinode
+ 1;
2275 curfid
= curfid
+ 1;
2277 flinkname
= os
.readlink(fname
);
2278 fdev
= fstatinfo
.st_dev
;
2279 getfdev
= GetDevMajorMinor(fdev
);
2280 fdev_minor
= getfdev
[0];
2281 fdev_major
= getfdev
[1];
2282 frdev
= fstatinfo
.st_dev
;
2283 if(hasattr(fstatinfo
, "st_rdev")):
2284 frdev
= fstatinfo
.st_rdev
;
2286 frdev
= fstatinfo
.st_dev
;
2287 getfrdev
= GetDevMajorMinor(frdev
);
2288 frdev_minor
= getfrdev
[0];
2289 frdev_major
= getfrdev
[1];
2290 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2291 fsize
= format(int("0"), 'x').lower();
2292 elif(ftype
==0 or ftype
==7):
2293 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
2295 fsize
= format(int(fstatinfo
.st_size
)).lower();
2296 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
2297 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
2298 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2299 if(hasattr(fstatinfo
, "st_birthtime")):
2300 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
2302 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2303 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
2304 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
2305 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
2306 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
2307 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
2312 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
2313 funame
= userinfo
.pw_name
;
2322 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
2323 fgname
= groupinfo
.gr_name
;
2328 fdev_minor
= format(int(fdev_minor
), 'x').lower();
2329 fdev_major
= format(int(fdev_major
), 'x').lower();
2330 frdev_minor
= format(int(frdev_minor
), 'x').lower();
2331 frdev_major
= format(int(frdev_major
), 'x').lower();
2332 finode
= format(int(finode
), 'x').lower();
2333 flinkcount
= format(int(flinkcount
), 'x').lower();
2334 if(hasattr(fstatinfo
, "st_file_attributes")):
2335 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
2337 fwinattributes
= format(int(0), 'x').lower();
2339 fcsize
= format(int(0), 'x').lower();
2340 fcontents
= BytesIO();
2342 if(ftype
==0 or ftype
==7):
2343 with
open(fname
, "rb") as fpc
:
2344 shutil
.copyfileobj(fpc
, fcontents
);
2345 if(not compresswholefile
):
2346 fcontents
.seek(0, 2);
2347 ucfsize
= fcontents
.tell();
2348 fcontents
.seek(0, 0);
2349 if(compression
=="auto"):
2350 ilsize
= len(compressionlistalt
);
2353 while(ilmin
< ilsize
):
2354 cfcontents
= BytesIO();
2355 shutil
.copyfileobj(fcontents
, cfcontents
);
2356 fcontents
.seek(0, 0);
2357 cfcontents
.seek(0, 0);
2358 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
2360 cfcontents
.seek(0, 2);
2361 ilcsize
.append(cfcontents
.tell());
2365 ilcsize
.append(sys
.maxint
);
2366 except AttributeError:
2367 ilcsize
.append(sys
.maxsize
);
2369 ilcmin
= ilcsize
.index(min(ilcsize
));
2370 compression
= compressionlistalt
[ilcmin
];
2371 fcontents
.seek(0, 0);
2372 cfcontents
= BytesIO();
2373 shutil
.copyfileobj(fcontents
, cfcontents
);
2374 cfcontents
.seek(0, 0);
2375 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
2376 cfcontents
.seek(0, 2);
2377 cfsize
= cfcontents
.tell();
2378 if(ucfsize
> cfsize
):
2379 fcsize
= format(int(cfsize
), 'x').lower();
2380 fcompression
= compression
;
2382 fcontents
= cfcontents
;
2383 if(followlink
and (ftype
==1 or ftype
==2)):
2384 flstatinfo
= os
.stat(flinkname
);
2385 with
open(flinkname
, "rb") as fpc
:
2386 shutil
.copyfileobj(fpc
, fcontents
);
2387 if(not compresswholefile
):
2388 fcontents
.seek(0, 2);
2389 ucfsize
= fcontents
.tell();
2390 fcontents
.seek(0, 0);
2391 if(compression
=="auto"):
2392 ilsize
= len(compressionlistalt
);
2395 while(ilmin
< ilsize
):
2396 cfcontents
= BytesIO();
2397 shutil
.copyfileobj(fcontents
, cfcontents
);
2398 fcontents
.seek(0, 0);
2399 cfcontents
.seek(0, 0);
2400 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
2402 cfcontents
.seek(0, 2);
2403 ilcsize
.append(cfcontents
.tell());
2407 ilcsize
.append(sys
.maxint
);
2408 except AttributeError:
2409 ilcsize
.append(sys
.maxsize
);
2411 ilcmin
= ilcsize
.index(min(ilcsize
));
2412 compression
= compressionlistalt
[ilcmin
];
2413 fcontents
.seek(0, 0);
2414 cfcontents
= BytesIO();
2415 shutil
.copyfileobj(fcontents
, cfcontents
);
2416 cfcontents
.seek(0, 0);
2417 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
2418 cfcontents
.seek(0, 2);
2419 cfsize
= cfcontents
.tell();
2420 if(ucfsize
> cfsize
):
2421 fcsize
= format(int(cfsize
), 'x').lower();
2422 fcompression
= compression
;
2424 fcontents
= cfcontents
;
2425 if(fcompression
=="none"):
2427 fcontents
.seek(0, 0);
2428 ftypehex
= format(ftype
, 'x').lower();
2429 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"];
2430 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
2432 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
2436 def AppendListsWithContent(inlist
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], compression
="auto", compresswholefile
=True, compressionlevel
=None, followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
2437 formatspecs
= FormatSpecsListToDict(formatspecs
);
2439 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2440 GetDirList
= inlist
;
2448 inodetocatinode
= {};
2449 numfiles
= int(len(GetDirList
));
2450 fnumfiles
= format(numfiles
, 'x').lower();
2451 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
2452 for curfname
in GetDirList
:
2453 ftype
= format(curfname
[0], 'x').lower();
2454 if(re
.findall(r
"^[.|/]", curfname
[1])):
2455 fname
= curfname
[1];
2457 fname
= "./"+curfname
[1];
2458 fbasedir
= os
.path
.dirname(fname
);
2459 flinkname
= curfname
[2];
2460 fsize
= format(curfname
[3], 'x').lower();
2461 fatime
= format(curfname
[4], 'x').lower();
2462 fmtime
= format(curfname
[5], 'x').lower();
2463 fctime
= format(curfname
[6], 'x').lower();
2464 fbtime
= format(curfname
[7], 'x').lower();
2465 fmode
= format(curfname
[8], 'x').lower();
2466 fwinattributes
= format(curfname
[9], 'x').lower();
2467 fcompression
= curfname
[10];
2468 fcsize
= format(curfname
[11], 'x').lower();
2469 fuid
= format(curfname
[12], 'x').lower();
2470 funame
= curfname
[13];
2471 fgid
= format(curfname
[14], 'x').lower();
2472 fgname
= curfname
[15];
2473 fid
= format(curfname
[16], 'x').lower();
2474 finode
= format(curfname
[17], 'x').lower();
2475 flinkcount
= format(curfname
[18], 'x').lower();
2476 fdev_minor
= format(curfname
[19], 'x').lower();
2477 fdev_major
= format(curfname
[20], 'x').lower();
2478 frdev_minor
= format(curfname
[21], 'x').lower();
2479 frdev_major
= format(curfname
[22], 'x').lower();
2480 fseeknextfile
= curfname
[23];
2481 extradata
= curfname
[24];
2482 fheaderchecksumtype
= curfname
[25];
2483 fcontentchecksumtype
= curfname
[26];
2484 fcontents
= curfname
[27];
2485 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
];
2486 fcontents
.seek(0, 0);
2487 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
2489 fp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
2492 def AppendInFileWithContent(infile
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False):
2493 formatspecs
= FormatSpecsListToDict(formatspecs
);
2494 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, True, False, formatspecs
);
2495 return AppendListsWithContent(inlist
, fp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
2497 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):
2498 formatspecs
= FormatSpecsListToDict(formatspecs
);
2499 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2500 if(os
.path
.exists(outfile
)):
2503 except OSError as e
:
2507 catfpfp
= BytesIO();
2508 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2510 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2513 fbasename
= os
.path
.splitext(outfile
)[0];
2514 fextname
= os
.path
.splitext(outfile
)[1];
2515 if(not compresswholefile
and fextname
in outextlistwd
):
2516 compresswholefile
= True;
2517 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
2518 catfp
= AppendFilesWithContent(infiles
, catfp
, dirlistfromtxt
, filevalues
, extradata
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
);
2519 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2520 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2523 os
.fsync(catfp
.fileno());
2524 except io
.UnsupportedOperation
:
2526 except AttributeError:
2528 except OSError as e
:
2532 if(hasattr(sys
.stdout
, "buffer")):
2533 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2535 shutil
.copyfileobj(catfp
, sys
.stdout
);
2536 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2537 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2539 upload_file_to_internet_file(catfp
, outfile
);
2547 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):
2548 formatspecs
= FormatSpecsListToDict(formatspecs
);
2549 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2550 if(os
.path
.exists(outfile
)):
2553 except OSError as e
:
2557 catfpfp
= BytesIO();
2558 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2560 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2563 fbasename
= os
.path
.splitext(outfile
)[0];
2564 fextname
= os
.path
.splitext(outfile
)[1];
2565 if(not compresswholefile
and fextname
in outextlistwd
):
2566 compresswholefile
= True;
2567 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
2568 catfp
= AppendListsWithContent(inlist
, catfp
, dirlistfromtxt
, filevalues
, extradata
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
);
2569 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2570 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2573 os
.fsync(catfp
.fileno());
2574 except io
.UnsupportedOperation
:
2576 except AttributeError:
2578 except OSError as e
:
2582 if(hasattr(sys
.stdout
, "buffer")):
2583 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2585 shutil
.copyfileobj(catfp
, sys
.stdout
);
2586 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2587 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
2589 upload_file_to_internet_file(catfp
, outfile
);
2597 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):
2598 formatspecs
= FormatSpecsListToDict(formatspecs
);
2599 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, True, False, formatspecs
);
2600 return AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
, returnfp
);
2602 def PrintPermissionString(fchmode
, ftype
):
2603 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' } };
2605 for fmodval
in str(oct(fchmode
))[-3:]:
2606 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
2607 if(ftype
==0 or ftype
==7):
2608 permissionstr
= "-" + permissionstr
;
2610 permissionstr
= "h" + permissionstr
;
2612 permissionstr
= "l" + permissionstr
;
2614 permissionstr
= "c" + permissionstr
;
2616 permissionstr
= "b" + permissionstr
;
2618 permissionstr
= "d" + permissionstr
;
2620 permissionstr
= "f" + permissionstr
;
2622 permissionstr
= "D" + permissionstr
;
2624 permissionstr
= "p" + permissionstr
;
2626 permissionstr
= "w" + permissionstr
;
2628 permissionoutstr
= stat
.filemode(fchmode
);
2629 except AttributeError:
2630 permissionoutstr
= permissionstr
;
2632 permissionoutstr
= permissionstr
;
2633 return permissionoutstr
;
2635 def PrintPermissionStringAlt(fchmode
, ftype
):
2637 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
2638 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
2640 # Translate file mode into permission string
2641 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
2642 # Append file type indicator
2644 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
2645 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
2647 file_type
= type_indicators
.get(ftype
, '-');
2648 permissionstr
= file_type
+ permissionstr
;
2650 permissionoutstr
= stat
.filemode(fchmode
);
2651 except AttributeError:
2652 permissionoutstr
= permissionstr
;
2653 return permissionoutstr
;
2655 def CheckCompressionType(infile
, formatspecs
=__file_format_dict__
, closefp
=True):
2656 formatspecs
= FormatSpecsListToDict(formatspecs
);
2657 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2661 catfp
= open(infile
, "rb");
2662 except FileNotFoundError
:
2666 prefp
= catfp
.read(2);
2667 if(prefp
==binascii
.unhexlify("1f8b")):
2669 if(prefp
==binascii
.unhexlify("7801")):
2671 if(prefp
==binascii
.unhexlify("785e")):
2673 if(prefp
==binascii
.unhexlify("789c")):
2675 if(prefp
==binascii
.unhexlify("78da")):
2678 prefp
= catfp
.read(3);
2679 if(prefp
==binascii
.unhexlify("425a68")):
2681 if(prefp
==binascii
.unhexlify("5d0000")):
2684 prefp
= catfp
.read(4);
2685 if(prefp
==binascii
.unhexlify("28b52ffd")):
2687 if(prefp
==binascii
.unhexlify("04224d18")):
2689 if(prefp
==binascii
.unhexlify("504B0304")):
2690 filetype
= "zipfile";
2692 prefp
= catfp
.read(5);
2693 if(prefp
==binascii
.unhexlify("7573746172")):
2694 filetype
= "tarfile";
2696 prefp
= catfp
.read(6);
2697 if(prefp
==binascii
.unhexlify("fd377a585a00")):
2699 if(prefp
==binascii
.unhexlify("377abcaf271c")):
2700 filetype
= "7zipfile";
2702 prefp
= catfp
.read(7);
2703 if(prefp
==binascii
.unhexlify("526172211a0700")):
2704 filetype
= "rarfile";
2705 if(prefp
==binascii
.unhexlify("43617446696c65")):
2706 filetype
= "catfile";
2708 prefp
= catfp
.read(8);
2709 if(prefp
==binascii
.unhexlify("526172211a070100")):
2710 filetype
= "rarfile";
2712 prefp
= catfp
.read(formatspecs
['format_len']);
2713 if(prefp
==binascii
.unhexlify(formatspecs
['format_hex'])):
2714 filetype
= formatspecs
['format_lower'];
2716 prefp
= catfp
.read(9);
2717 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
2720 prefp
= catfp
.read(10);
2721 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2722 filetype
= "tarfile";
2724 if(filetype
=="gzip" or filetype
=="bzip2" or filetype
=="lzma" or filetype
=="zstd" or filetype
=="lz4" or filetype
=="zlib"):
2725 if(TarFileCheck(catfp
)):
2726 filetype
= "tarfile";
2728 if(TarFileCheck(catfp
)):
2729 filetype
= "tarfile";
2730 elif(zipfile
.is_zipfile(catfp
)):
2731 filetype
= "zipfile";
2732 elif(rarfile_support
and (rarfile
.is_rarfile(catfp
) or rarfile
.is_rarfile_sfx(catfp
))):
2733 filetype
= "rarile";
2734 elif(py7zr_support
and py7zr
.is_7zfile(catfp
)):
2743 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_dict__
, closefp
=True):
2744 formatspecs
= FormatSpecsListToDict(formatspecs
);
2746 instringsfile
= BytesIO(instring
);
2748 instringsfile
= BytesIO(instring
.encode("UTF-8"));
2749 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
2751 def GetCompressionMimeType(infile
, formatspecs
=__file_format_dict__
):
2752 formatspecs
= FormatSpecsListToDict(formatspecs
);
2753 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
2754 if(compresscheck
=="gzip" or compresscheck
=="gz"):
2755 return archivefile_gzip_mimetype
;
2756 if(compresscheck
=="zlib" or (compresscheck
=="zz" or compresscheck
=="zl" or compresscheck
=="zlib")):
2757 return archivefile_zlib_mimetype
;
2758 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
2759 return archivefile_bzip2_mimetype
;
2760 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
2761 return archivefile_zstandard_mimetype
;
2762 if(compresscheck
=="lz4"):
2763 return archivefile_lz4_mimetype
;
2764 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
2765 return archivefile_lzop_mimetype
;
2766 if(compresscheck
=="lzma"):
2767 return archivefile_lzma_mimetype
;
2768 if(compresscheck
=="xz"):
2769 return archivefile_xz_mimetype
;
2770 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
['format_lower']):
2771 return archivefile_cat_mimetype
;
2772 if(not compresscheck
):
2776 def UncompressArchiveFile(fp
, formatspecs
=__file_format_dict__
):
2777 formatspecs
= FormatSpecsListToDict(formatspecs
);
2778 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2780 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
2781 if(compresscheck
=="gzip" and compresscheck
in compressionsupport
):
2782 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
2783 elif(compresscheck
=="bzip2" and compresscheck
in compressionsupport
):
2784 catfp
= bz2
.BZ2File(fp
);
2785 elif(compresscheck
=="zstd" and compresscheck
in compressionsupport
):
2786 catfp
= zstd
.ZstdDecompressor().stream_reader(fp
);
2787 elif(compresscheck
=="lz4" and compresscheck
in compressionsupport
):
2788 catfp
= lz4
.frame
.open_fp(fp
, mode
='rb');
2789 elif((compresscheck
=="lzo" or compresscheck
=="lzop") and compresscheck
in compressionsupport
):
2791 catfp
.write(lzo
.decompress(fp
.read()));
2792 elif((compresscheck
=="lzma" or compresscheck
=="xz") and compresscheck
in compressionsupport
):
2793 catfp
= lzma
.LZMAFile(fp
);
2794 elif(compresscheck
=="zlib" and compresscheck
in compressionsupport
):
2795 catfp
= ZlibFile(fileobj
=fp
, mode
="rb");
2796 if(compresscheck
=="catfile" or compresscheck
==formatspecs
['format_lower']):
2798 if(not compresscheck
):
2803 from backports
import lzma
2807 with fp
as fpcontent
:
2809 catfp
.write(lzma
.decompress(fp
.read()));
2810 except lzma
.LZMAError
:
2812 if(compresscheck
!="catfile" or compresscheck
!=formatspecs
['format_lower']):
2816 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
2818 def UncompressFile(infile
, formatspecs
=__file_format_dict__
, mode
="rb"):
2819 formatspecs
= FormatSpecsListToDict(formatspecs
);
2820 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
2821 if(sys
.version_info
[0]==2 and compresscheck
):
2827 if(compresscheck
=="gzip" and compresscheck
in compressionsupport
):
2829 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
2830 except (ValueError, TypeError) as e
:
2831 filefp
= gzip
.open(infile
, mode
);
2832 if(compresscheck
=="bzip2" and compresscheck
in compressionsupport
):
2834 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
2835 except (ValueError, TypeError) as e
:
2836 filefp
= bz2
.open(infile
, mode
);
2837 if(compresscheck
=="zstd" and compresscheck
in compressionsupport
):
2839 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
2840 except (ValueError, TypeError) as e
:
2841 filefp
= zstandard
.open(infile
, mode
);
2842 if(compresscheck
=="lz4" and compresscheck
in compressionsupport
):
2844 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
2845 except (ValueError, TypeError) as e
:
2846 filefp
= lz4
.frame
.open(infile
, mode
);
2847 if((compresscheck
=="lzo" or compresscheck
=="lzop") and compresscheck
in compressionsupport
):
2849 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
2850 except (ValueError, TypeError) as e
:
2851 filefp
= lzo
.open(infile
, mode
);
2852 if((compresscheck
=="lzma" or compresscheck
=="xz") and compresscheck
in compressionsupport
):
2854 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
2855 except (ValueError, TypeError) as e
:
2856 filefp
= lzma
.open(infile
, mode
);
2857 if(compresscheck
=="zlib" and compresscheck
in compressionsupport
):
2858 filefp
= ZlibFile(infile
, mode
=mode
);
2859 if(compresscheck
=="catfile" or compresscheck
==formatspecs
['format_lower']):
2861 filefp
= open(infile
, mode
, encoding
="UTF-8");
2862 except (ValueError, TypeError) as e
:
2863 filefp
= open(infile
, mode
);
2864 if(not compresscheck
):
2866 filefp
= open(infile
, mode
, encoding
="UTF-8");
2867 except (ValueError, TypeError) as e
:
2868 filefp
= open(infile
, mode
);
2869 except FileNotFoundError
:
2872 filefp
.write_through
= True;
2873 except AttributeError:
2877 def UncompressString(infile
):
2878 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
2879 if(compresscheck
=="gzip" and compresscheck
in compressionsupport
):
2880 fileuz
= gzip
.decompress(infile
);
2881 if(compresscheck
=="bzip2" and compresscheck
in compressionsupport
):
2882 fileuz
= bz2
.decompress(infile
);
2883 if(compresscheck
=="zstd" and compresscheck
in compressionsupport
):
2888 fileuz
= zstandard
.decompress(infile
);
2889 if(compresscheck
=="lz4" and compresscheck
in compressionsupport
):
2890 fileuz
= lz4
.frame
.decompress(infile
);
2891 if((compresscheck
=="lzo" or compresscheck
=="lzop") and compresscheck
in compressionsupport
):
2892 fileuz
= lzo
.decompress(infile
);
2893 if((compresscheck
=="lzma" or compresscheck
=="xz") and compresscheck
in compressionsupport
):
2894 fileuz
= lzma
.decompress(infile
);
2895 if(compresscheck
=="zlib" and compresscheck
in compressionsupport
):
2896 fileuz
= zlib
.decompress(infile
);
2897 if(not compresscheck
):
2899 if(hasattr(fileuz
, 'decode')):
2900 fileuz
= fileuz
.decode("UTF-8");
2903 def UncompressStringAlt(infile
):
2904 filefp
= StringIO();
2905 outstring
= UncompressString(infile
);
2906 filefp
.write(outstring
);
2910 def CheckCompressionSubType(infile
, formatspecs
=__file_format_dict__
, closefp
=True):
2911 formatspecs
= FormatSpecsListToDict(formatspecs
);
2912 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
2913 if(not compresscheck
):
2914 fextname
= os
.path
.splitext(infile
)[1];
2915 if(fextname
==".gz"):
2916 compresscheck
= "gzip";
2917 elif(fextname
==".bz2"):
2918 compresscheck
= "bzip2";
2919 elif(fextname
==".zst"):
2920 compresscheck
= "zstd";
2921 elif(fextname
==".lz4"):
2922 compresscheck
= "lz4";
2923 elif(fextname
==".lzo" or fextname
==".lzop"):
2924 compresscheck
= "lzo";
2925 elif(fextname
==".lzma"):
2926 compresscheck
= "lzma";
2927 elif(fextname
==".xz"):
2928 compresscheck
= "xz";
2929 elif(fextname
==".zz" or fextname
==".zl" or fextname
==".zlib"):
2930 compresscheck
= "zlib";
2933 if(compresscheck
=="gzip" or compresscheck
=="bzip2" or compresscheck
=="lzma" or compresscheck
=="zstd" or compresscheck
=="lz4" or compresscheck
=="zlib"):
2934 if(TarFileCheck(infile
)):
2935 filetype
= "tarfile";
2936 if(not compresscheck
):
2937 if(TarFileCheck(infile
)):
2939 elif(zipfile
.is_zipfile(infile
)):
2941 elif(rarfile_support
and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
2943 elif(py7zr_support
and py7zr
.is_7zfile(infile
)):
2948 if(compresscheck
=="catfile"):
2950 if(compresscheck
==formatspecs
['format_lower']):
2951 return formatspecs
['format_lower'];
2952 if(compresscheck
=="tarfile"):
2954 if(compresscheck
=="zipfile"):
2956 if(rarfile_support
and compresscheck
=="rarfile"):
2958 if(py7zr_support
and compresscheck
=="7zipfile" and py7zr
.is_7zfile(infile
)):
2960 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2961 catfp
= UncompressArchiveFile(infile
, formatspecs
['format_lower']);
2964 if(compresscheck
=="gzip" and compresscheck
in compressionsupport
):
2965 catfp
= gzip
.GzipFile(infile
, "rb");
2966 elif(compresscheck
=="bzip2" and compresscheck
in compressionsupport
):
2967 catfp
= bz2
.BZ2File(infile
, "rb");
2968 elif(compresscheck
=="lz4" and compresscheck
in compressionsupport
):
2969 catfp
= lz4
.frame
.open(infile
, "rb");
2970 elif(compresscheck
=="zstd" and compresscheck
in compressionsupport
):
2971 catfp
= zstandard
.open(infile
, "rb");
2972 elif((compresscheck
=="lzo" or compresscheck
=="lzop") and compresscheck
in compressionsupport
):
2973 catfp
= lzo
.open(infile
, "rb");
2974 elif((compresscheck
=="lzma" or compresscheck
=="xz") and compresscheck
in compressionsupport
):
2975 catfp
= lzma
.open(infile
, "rb");
2976 elif(compresscheck
=="zlib" and compresscheck
in compressionsupport
):
2977 catfp
= ZlibFile(infile
, mode
="rb");
2979 catfp
= open(infile
, "rb");
2980 except FileNotFoundError
:
2983 prefp
= catfp
.read(5);
2984 if(prefp
==binascii
.unhexlify("7573746172")):
2985 filetype
= "tarfile";
2987 prefp
= catfp
.read(7);
2988 if(prefp
==binascii
.unhexlify("43617446696c65")):
2989 filetype
= "catfile";
2991 prefp
= catfp
.read(formatspecs
['format_len']);
2992 if(prefp
==binascii
.unhexlify(formatspecs
['format_hex'])):
2993 filetype
= formatspecs
['format_lower'];
2995 prefp
= catfp
.read(10);
2996 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2997 filetype
= "tarfile";
3003 def GZipCompress(data
, compresslevel
=9):
3004 if("gzip" not in compressionsupport
):
3006 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
3008 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
3012 catfp
= open(tmpfp
.name
, "rb");
3013 except FileNotFoundError
:
3015 catdata
= catfp
.read();
3019 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_dict__
):
3020 formatspecs
= FormatSpecsListToDict(formatspecs
);
3021 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
3024 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3025 compression
= "auto";
3026 if(compression
not in compressionlist
and compression
is None):
3027 compression
= "auto";
3028 if(compression
=="gzip" and compression
in compressionsupport
):
3030 if(compressionlevel
is None):
3031 compressionlevel
= 9;
3033 compressionlevel
= int(compressionlevel
);
3034 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
3035 if(compression
=="bzip2" and compression
in compressionsupport
):
3037 if(compressionlevel
is None):
3038 compressionlevel
= 9;
3040 compressionlevel
= int(compressionlevel
);
3041 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
3042 if(compression
=="lz4" and compression
in compressionsupport
):
3044 if(compressionlevel
is None):
3045 compressionlevel
= 9;
3047 compressionlevel
= int(compressionlevel
);
3048 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
3049 if((compression
=="lzo" or compression
=="lzop") and compression
in compressionsupport
):
3051 if(compressionlevel
is None):
3052 compressionlevel
= 9;
3054 compressionlevel
= int(compressionlevel
);
3055 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
3056 if(compression
=="zstd" and compression
in compressionsupport
):
3058 if(compressionlevel
is None):
3059 compressionlevel
= 10;
3061 compressionlevel
= int(compressionlevel
);
3062 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
3063 if(compression
=="lzma" and compression
in compressionsupport
):
3065 if(compressionlevel
is None):
3066 compressionlevel
= 9;
3068 compressionlevel
= int(compressionlevel
);
3069 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
3070 if(compression
=="xz" and compression
in compressionsupport
):
3072 if(compressionlevel
is None):
3073 compressionlevel
= 9;
3075 compressionlevel
= int(compressionlevel
);
3076 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
3077 if(compression
=="zlib" and compression
in compressionsupport
):
3079 if(compressionlevel
is None):
3080 compressionlevel
= 9;
3082 compressionlevel
= int(compressionlevel
);
3083 catfp
.write(zlib
.compress(fp
.read(), level
=compressionlevel
));
3084 if(compression
=="auto" or compression
is None):
3089 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
3091 def CompressOpenFile(outfile
, compressionenable
=True, compressionlevel
=None):
3092 if(outfile
is None):
3094 fbasename
= os
.path
.splitext(outfile
)[0];
3095 fextname
= os
.path
.splitext(outfile
)[1];
3096 if(compressionlevel
is None and fextname
!=".zst"):
3097 compressionlevel
= 9;
3098 elif(compressionlevel
is None and fextname
==".zst"):
3099 compressionlevel
= 10;
3101 compressionlevel
= int(compressionlevel
);
3102 if(sys
.version_info
[0]==2):
3107 if(fextname
not in outextlistwd
or not compressionenable
):
3109 outfp
= open(outfile
, "wb", encoding
="UTF-8");
3110 except (ValueError, TypeError) as e
:
3111 outfp
= open(outfile
, "wb");
3112 elif(fextname
==".gz" and "gzip" in compressionsupport
):
3114 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
3115 except (ValueError, TypeError) as e
:
3116 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
3117 elif(fextname
==".bz2" and "bzip2" in compressionsupport
):
3119 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
3120 except (ValueError, TypeError) as e
:
3121 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
3122 elif(fextname
==".zst" and "zstandard" in compressionsupport
):
3124 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
3125 except (ValueError, TypeError) as e
:
3126 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
3127 elif(fextname
==".xz" and "xz" in compressionsupport
):
3129 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
3130 except (ValueError, TypeError) as e
:
3131 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
3132 elif(fextname
==".lz4" and "lz4" in compressionsupport
):
3134 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
3135 except (ValueError, TypeError) as e
:
3136 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
3137 elif(fextname
==".lzo" and "lzop" in compressionsupport
):
3139 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
3140 except (ValueError, TypeError) as e
:
3141 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
3142 elif(fextname
==".lzma" and "lzma" in compressionsupport
):
3144 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
3145 except (ValueError, TypeError) as e
:
3146 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
3147 elif((fextname
==".zz" or fextname
==".zl" or fextname
==".zlib") and "zlib" in compressionsupport
):
3148 outfp
= ZlibFile(outfile
, mode
=mode
, level
=compressionlevel
);
3149 except FileNotFoundError
:
3152 outfp
.write_through
= True;
3153 except AttributeError:
3157 def GetDevMajorMinor(fdev
):
3159 if(hasattr(os
, "minor")):
3160 retdev
.append(os
.minor(fdev
));
3163 if(hasattr(os
, "major")):
3164 retdev
.append(os
.major(fdev
));
3169 def CheckSumSupport(checkfor
, guaranteed
=True):
3172 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
3173 except AttributeError:
3174 hash_list
= sorted(list(hashlib
.algorithms
));
3177 hash_list
= sorted(list(hashlib
.algorithms_available
));
3178 except AttributeError:
3179 hash_list
= sorted(list(hashlib
.algorithms
));
3180 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
3181 if(checkfor
in checklistout
):
3186 def CheckSumSupportAlt(checkfor
, guaranteed
=True):
3189 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
3190 except AttributeError:
3191 hash_list
= sorted(list(hashlib
.algorithms
));
3194 hash_list
= sorted(list(hashlib
.algorithms_available
));
3195 except AttributeError:
3196 hash_list
= sorted(list(hashlib
.algorithms
));
3197 checklistout
= hash_list
;
3198 if(checkfor
in checklistout
):
3203 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):
3204 formatspecs
= FormatSpecsListToDict(formatspecs
);
3205 advancedlist
= formatspecs
['use_advanced_list'];
3206 altinode
= formatspecs
['use_alt_inode'];
3207 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3208 outfile
= RemoveWindowsPath(outfile
);
3209 checksumtype
= checksumtype
.lower();
3210 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3211 checksumtype
="crc32";
3212 if(checksumtype
=="none"):
3214 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3215 compression
= "auto";
3216 if(compression
not in compressionlist
and compression
is None):
3217 compression
= "auto";
3219 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3220 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3221 if(os
.path
.exists(outfile
)):
3224 except OSError as e
:
3229 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3231 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3234 fbasename
= os
.path
.splitext(outfile
)[0];
3235 fextname
= os
.path
.splitext(outfile
)[1];
3236 if(not compresswholefile
and fextname
in outextlistwd
):
3237 compresswholefile
= True;
3238 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3239 catver
= formatspecs
['format_ver'];
3240 fileheaderver
= str(int(catver
.replace(".", "")));
3243 for line
in sys
.stdin
:
3244 infilelist
.append(line
.strip());
3245 infilelist
= list(filter(None, infilelist
));
3246 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
3247 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
3249 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
3250 for line
in finfile
:
3251 infilelist
.append(line
.strip());
3252 infilelist
= list(filter(None, infilelist
));
3254 if(isinstance(infiles
, (list, tuple, ))):
3255 infilelist
= list(filter(None, infiles
));
3256 elif(isinstance(infiles
, (str, ))):
3257 infilelist
= list(filter(None, [infiles
]));
3259 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
3261 GetDirList
= ListDir(infilelist
, followlink
, False);
3269 inodetocatinode
= {};
3270 numfiles
= int(len(GetDirList
));
3271 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3272 for curfname
in GetDirList
:
3273 if(re
.findall(r
"^[.|/]", curfname
)):
3276 fname
= "./"+curfname
;
3278 VerbosePrintOut(fname
);
3279 if(not followlink
or followlink
is None):
3280 fstatinfo
= os
.lstat(fname
);
3282 fstatinfo
= os
.stat(fname
);
3283 fpremode
= fstatinfo
.st_mode
;
3284 finode
= fstatinfo
.st_ino
;
3285 flinkcount
= fstatinfo
.st_nlink
;
3287 if(stat
.S_ISREG(fpremode
)):
3289 elif(stat
.S_ISLNK(fpremode
)):
3291 elif(stat
.S_ISCHR(fpremode
)):
3293 elif(stat
.S_ISBLK(fpremode
)):
3295 elif(stat
.S_ISDIR(fpremode
)):
3297 elif(stat
.S_ISFIFO(fpremode
)):
3299 elif(stat
.S_ISSOCK(fpremode
)):
3301 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
3303 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
3305 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
3310 fcurfid
= format(int(curfid
), 'x').lower();
3311 if(not followlink
and finode
!=0):
3313 if(finode
in inodelist
):
3315 flinkname
= inodetofile
[finode
];
3317 fcurinode
= format(int(finode
), 'x').lower();
3319 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
3320 if(finode
not in inodelist
):
3321 inodelist
.append(finode
);
3322 inodetofile
.update({finode
: fname
});
3323 inodetocatinode
.update({finode
: curinode
});
3325 fcurinode
= format(int(finode
), 'x').lower();
3327 fcurinode
= format(int(curinode
), 'x').lower();
3328 curinode
= curinode
+ 1;
3330 fcurinode
= format(int(curinode
), 'x').lower();
3331 curinode
= curinode
+ 1;
3332 curfid
= curfid
+ 1;
3334 flinkname
= os
.readlink(fname
);
3335 fdev
= fstatinfo
.st_dev
;
3336 getfdev
= GetDevMajorMinor(fdev
);
3337 fdev_minor
= getfdev
[0];
3338 fdev_major
= getfdev
[1];
3339 frdev
= fstatinfo
.st_dev
;
3340 if(hasattr(fstatinfo
, "st_rdev")):
3341 frdev
= fstatinfo
.st_rdev
;
3343 frdev
= fstatinfo
.st_dev
;
3344 getfrdev
= GetDevMajorMinor(frdev
);
3345 frdev_minor
= getfrdev
[0];
3346 frdev_major
= getfrdev
[1];
3347 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3348 fsize
= format(int("0"), 'x').lower();
3349 elif(ftype
==0 or ftype
==7):
3350 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
3352 fsize
= format(int(fstatinfo
.st_size
)).lower();
3353 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
3354 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
3355 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
3356 if(hasattr(fstatinfo
, "st_birthtime")):
3357 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
3359 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
3360 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
3361 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
3362 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
3363 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
3364 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
3369 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
3370 funame
= userinfo
.pw_name
;
3379 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
3380 fgname
= groupinfo
.gr_name
;
3385 fdev_minor
= format(int(fdev_minor
), 'x').lower();
3386 fdev_major
= format(int(fdev_major
), 'x').lower();
3387 frdev_minor
= format(int(frdev_minor
), 'x').lower();
3388 frdev_major
= format(int(frdev_major
), 'x').lower();
3389 finode
= format(int(finode
), 'x').lower();
3390 flinkcount
= format(int(flinkcount
), 'x').lower();
3391 if(hasattr(fstatinfo
, "st_file_attributes")):
3392 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
3394 fwinattributes
= format(int(0), 'x').lower();
3396 fcsize
= format(int(0), 'x').lower();
3397 fcontents
= BytesIO();
3398 if(ftype
==0 or ftype
==7):
3399 with
open(fname
, "rb") as fpc
:
3400 shutil
.copyfileobj(fpc
, fcontents
);
3401 if(not compresswholefile
):
3402 fcontents
.seek(0, 2);
3403 ucfsize
= fcontents
.tell();
3404 fcontents
.seek(0, 0);
3405 if(compression
=="auto"):
3406 ilsize
= len(compressionlistalt
);
3409 while(ilmin
< ilsize
):
3410 cfcontents
= BytesIO();
3411 shutil
.copyfileobj(fcontents
, cfcontents
);
3412 fcontents
.seek(0, 0);
3413 cfcontents
.seek(0, 0);
3414 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3416 cfcontents
.seek(0, 2);
3417 ilcsize
.append(cfcontents
.tell());
3421 ilcsize
.append(sys
.maxint
);
3422 except AttributeError:
3423 ilcsize
.append(sys
.maxsize
);
3425 ilcmin
= ilcsize
.index(min(ilcsize
));
3426 compression
= compressionlistalt
[ilcmin
];
3427 fcontents
.seek(0, 0);
3428 cfcontents
= BytesIO();
3429 shutil
.copyfileobj(fcontents
, cfcontents
);
3430 cfcontents
.seek(0, 0);
3431 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3432 cfcontents
.seek(0, 2);
3433 cfsize
= cfcontents
.tell();
3434 if(ucfsize
> cfsize
):
3435 fcsize
= format(int(cfsize
), 'x').lower();
3436 fcompression
= compression
;
3438 fcontents
= cfcontents
;
3439 if(fcompression
=="none"):
3441 if(followlink
and (ftype
==1 or ftype
==2)):
3442 flstatinfo
= os
.stat(flinkname
);
3443 with
open(flinkname
, "rb") as fpc
:
3444 shutil
.copyfileobj(fpc
, fcontents
);
3445 if(not compresswholefile
):
3446 fcontents
.seek(0, 2);
3447 ucfsize
= fcontents
.tell();
3448 fcontents
.seek(0, 0);
3449 if(compression
=="auto"):
3450 ilsize
= len(compressionlistalt
);
3453 while(ilmin
< ilsize
):
3454 cfcontents
= BytesIO();
3455 shutil
.copyfileobj(fcontents
, cfcontents
);
3456 fcontents
.seek(0, 0);
3457 cfcontents
.seek(0, 0);
3458 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3460 cfcontents
.seek(0, 2);
3461 ilcsize
.append(cfcontents
.tell());
3465 ilcsize
.append(sys
.maxint
);
3466 except AttributeError:
3467 ilcsize
.append(sys
.maxsize
);
3469 ilcmin
= ilcsize
.index(min(ilcsize
));
3470 compression
= compressionlistalt
[ilcmin
];
3471 fcontents
.seek(0, 0);
3472 cfcontents
= BytesIO();
3473 shutil
.copyfileobj(fcontents
, cfcontents
);
3474 cfcontents
.seek(0, 0);
3475 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3476 cfcontents
.seek(0, 2);
3477 cfsize
= cfcontents
.tell();
3478 if(ucfsize
> cfsize
):
3479 fcsize
= format(int(cfsize
), 'x').lower();
3480 fcompression
= compression
;
3482 fcontents
= cfcontents
;
3483 fcontents
.seek(0, 0);
3484 ftypehex
= format(ftype
, 'x').lower();
3485 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"];
3486 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3489 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3490 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3491 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3494 os
.fsync(catfp
.fileno());
3495 except io
.UnsupportedOperation
:
3497 except AttributeError:
3499 except OSError as e
:
3503 if(hasattr(sys
.stdout
, "buffer")):
3504 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3506 shutil
.copyfileobj(catfp
, sys
.stdout
);
3507 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3508 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3510 upload_file_to_internet_file(catfp
, outfile
);
3518 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
3520 if(hasattr(shutil
, "register_archive_format")):
3521 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
3522 return PackArchiveFile(source_dir
, archive_name
, False, "auto", True, None, False, "crc32", [], __file_format_dict__
['format_delimiter'], False, False);
3523 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
3525 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):
3526 formatspecs
= FormatSpecsListToDict(formatspecs
);
3527 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3529 create_alias_function("Pack", __file_format_name__
, "FromDirList", PackArchiveFileFromDirList
);
3531 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3532 formatspecs
= FormatSpecsListToDict(formatspecs
);
3533 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3534 outfile
= RemoveWindowsPath(outfile
);
3535 checksumtype
= checksumtype
.lower();
3536 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3537 checksumtype
="crc32";
3538 if(checksumtype
=="none"):
3540 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3541 compression
= "auto";
3542 if(compression
not in compressionlist
and compression
is None):
3543 compression
= "auto";
3545 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3546 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3547 if(os
.path
.exists(outfile
)):
3550 except OSError as e
:
3555 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3557 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3560 fbasename
= os
.path
.splitext(outfile
)[0];
3561 fextname
= os
.path
.splitext(outfile
)[1];
3562 if(not compresswholefile
and fextname
in outextlistwd
):
3563 compresswholefile
= True;
3564 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3565 catver
= formatspecs
['format_ver'];
3566 fileheaderver
= str(int(catver
.replace(".", "")));
3572 inodetocatinode
= {};
3575 if(hasattr(sys
.stdin
, "buffer")):
3576 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3578 shutil
.copyfileobj(sys
.stdin
, infile
);
3583 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3584 infile
= download_file_from_internet_file(infile
);
3589 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3591 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
3593 if(not tarfile
.TarFileCheck(infile
)):
3595 except AttributeError:
3596 if(not TarFileCheck(infile
)):
3599 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3600 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
3602 tarfp
= tarfile
.open(infile
, "r");
3603 except FileNotFoundError
:
3605 numfiles
= int(len(tarfp
.getmembers()));
3606 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3607 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
3608 if(re
.findall(r
"^[.|/]", member
.name
)):
3609 fname
= member
.name
;
3611 fname
= "./"+member
.name
;
3613 VerbosePrintOut(fname
);
3614 fpremode
= member
.mode
;
3615 ffullmode
= member
.mode
;
3619 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3621 elif(member
.isdev()):
3622 ffullmode
= member
.mode
;
3624 elif(member
.islnk()):
3625 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3627 elif(member
.issym()):
3628 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
3630 elif(member
.ischr()):
3631 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
3633 elif(member
.isblk()):
3634 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
3636 elif(member
.isdir()):
3637 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
3639 elif(member
.isfifo()):
3640 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
3642 elif(member
.issparse()):
3643 ffullmode
= member
.mode
;
3646 ffullmode
= member
.mode
;
3649 fcurfid
= format(int(curfid
), 'x').lower();
3650 fcurinode
= format(int(curfid
), 'x').lower();
3651 curfid
= curfid
+ 1;
3653 flinkname
= member
.linkname
;
3654 fdev_minor
= format(int(member
.devminor
), 'x').lower();
3655 fdev_major
= format(int(member
.devmajor
), 'x').lower();
3656 frdev_minor
= format(int(member
.devminor
), 'x').lower();
3657 frdev_major
= format(int(member
.devmajor
), 'x').lower();
3658 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3659 fsize
= format(int("0"), 'x').lower();
3660 elif(ftype
==0 or ftype
==7):
3661 fsize
= format(int(member
.size
), 'x').lower();
3663 fsize
= format(int(member
.size
), 'x').lower();
3664 fatime
= format(int(member
.mtime
), 'x').lower();
3665 fmtime
= format(int(member
.mtime
), 'x').lower();
3666 fctime
= format(int(member
.mtime
), 'x').lower();
3667 fbtime
= format(int(member
.mtime
), 'x').lower();
3668 fmode
= format(int(ffullmode
), 'x').lower();
3669 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
3670 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
3671 fuid
= format(int(member
.uid
), 'x').lower();
3672 fgid
= format(int(member
.gid
), 'x').lower();
3673 funame
= member
.uname
;
3674 fgname
= member
.gname
;
3675 flinkcount
= format(int(flinkcount
), 'x').lower();
3676 fwinattributes
= format(int(0), 'x').lower();
3678 fcsize
= format(int(0), 'x').lower();
3679 fcontents
= BytesIO();
3680 if(ftype
==0 or ftype
==7):
3681 with tarfp
.extractfile(member
) as fpc
:
3682 shutil
.copyfileobj(fpc
, fcontents
);
3683 if(not compresswholefile
):
3684 fcontents
.seek(0, 2);
3685 ucfsize
= fcontents
.tell();
3686 fcontents
.seek(0, 0);
3687 if(compression
=="auto"):
3688 ilsize
= len(compressionlistalt
);
3691 while(ilmin
< ilsize
):
3692 cfcontents
= BytesIO();
3693 shutil
.copyfileobj(fcontents
, cfcontents
);
3694 fcontents
.seek(0, 0);
3695 cfcontents
.seek(0, 0);
3696 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3698 cfcontents
.seek(0, 2);
3699 ilcsize
.append(cfcontents
.tell());
3703 ilcsize
.append(sys
.maxint
);
3704 except AttributeError:
3705 ilcsize
.append(sys
.maxsize
);
3707 ilcmin
= ilcsize
.index(min(ilcsize
));
3708 compression
= compressionlistalt
[ilcmin
];
3709 fcontents
.seek(0, 0);
3710 cfcontents
= BytesIO();
3711 shutil
.copyfileobj(fcontents
, cfcontents
);
3712 cfcontents
.seek(0, 0);
3713 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3714 cfcontents
.seek(0, 2);
3715 cfsize
= cfcontents
.tell();
3716 if(ucfsize
> cfsize
):
3717 fcsize
= format(int(cfsize
), 'x').lower();
3718 fcompression
= compression
;
3720 fcontents
= cfcontents
;
3721 if(fcompression
=="none"):
3723 fcontents
.seek(0, 0);
3724 ftypehex
= format(ftype
, 'x').lower();
3725 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"];
3726 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3729 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3730 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3731 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3734 os
.fsync(catfp
.fileno());
3735 except io
.UnsupportedOperation
:
3737 except AttributeError:
3739 except OSError as e
:
3743 if(hasattr(sys
.stdout
, "buffer")):
3744 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3746 shutil
.copyfileobj(catfp
, sys
.stdout
);
3747 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3748 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3750 upload_file_to_internet_file(catfp
, outfile
);
3758 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
3760 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
3761 formatspecs
= FormatSpecsListToDict(formatspecs
);
3762 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3763 outfile
= RemoveWindowsPath(outfile
);
3764 checksumtype
= checksumtype
.lower();
3765 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3766 checksumtype
="crc32";
3767 if(checksumtype
=="none"):
3769 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
3770 compression
= "auto";
3771 if(compression
not in compressionlist
and compression
is None):
3772 compression
= "auto";
3774 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3775 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3776 if(os
.path
.exists(outfile
)):
3779 except OSError as e
:
3784 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3786 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3789 fbasename
= os
.path
.splitext(outfile
)[0];
3790 fextname
= os
.path
.splitext(outfile
)[1];
3791 if(not compresswholefile
and fextname
in outextlistwd
):
3792 compresswholefile
= True;
3793 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
3794 catver
= formatspecs
['format_ver'];
3795 fileheaderver
= str(int(catver
.replace(".", "")));
3801 inodetocatinode
= {};
3804 if(hasattr(sys
.stdin
, "buffer")):
3805 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3807 shutil
.copyfileobj(sys
.stdin
, infile
);
3812 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3813 infile
= download_file_from_internet_file(infile
);
3818 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3820 if(not zipfile
.is_zipfile(infile
)):
3823 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
3824 except FileNotFoundError
:
3826 ziptest
= zipfp
.testzip();
3828 VerbosePrintOut("Bad file found!");
3829 numfiles
= int(len(zipfp
.infolist()));
3830 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
3831 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
3832 if(re
.findall(r
"^[.|/]", member
.filename
)):
3833 fname
= member
.filename
;
3835 fname
= "./"+member
.filename
;
3836 zipinfo
= zipfp
.getinfo(member
.filename
);
3838 VerbosePrintOut(fname
);
3839 if(not member
.is_dir()):
3840 fpremode
= int(stat
.S_IFREG
+ 438);
3841 elif(member
.is_dir()):
3842 fpremode
= int(stat
.S_IFDIR
+ 511);
3845 if(not member
.is_dir()):
3847 elif(member
.is_dir()):
3850 fcurfid
= format(int(curfid
), 'x').lower();
3851 fcurinode
= format(int(curfid
), 'x').lower();
3852 curfid
= curfid
+ 1;
3853 fdev_minor
= format(int(0), 'x').lower();
3854 fdev_major
= format(int(0), 'x').lower();
3855 frdev_minor
= format(int(0), 'x').lower();
3856 frdev_major
= format(int(0), 'x').lower();
3858 fsize
= format(int("0"), 'x').lower();
3860 fsize
= format(int(member
.file_size
), 'x').lower();
3862 fsize
= format(int(member
.file_size
), 'x').lower();
3863 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3864 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3865 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3866 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3867 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
3868 fwinattributes
= format(int(zipinfo
.external_attr
), 'x').lower();
3869 if(not member
.is_dir()):
3870 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3871 fchmode
= stat
.S_IMODE(int(stat
.S_IFREG
+ 438));
3872 ftypemod
= stat
.S_IFMT(int(stat
.S_IFREG
+ 438));
3873 elif(member
.is_dir()):
3874 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3875 fchmode
= stat
.S_IMODE(int(stat
.S_IFDIR
+ 511));
3876 ftypemod
= stat
.S_IFMT(int(stat
.S_IFDIR
+ 511));
3877 elif(zipinfo
.create_system
==3):
3878 fwinattributes
= format(int(0), 'x').lower();
3880 fmode
= format(int(zipinfo
.external_attr
), 'x').lower();
3881 prefmode
= int(zipinfo
.external_attr
);
3882 fchmode
= stat
.S_IMODE(prefmode
);
3883 ftypemod
= stat
.S_IFMT(prefmode
);
3884 except OverflowError:
3885 fmode
= format(int(zipinfo
.external_attr
>> 16), 'x').lower();
3886 prefmode
= int(zipinfo
.external_attr
>> 16);
3887 fchmode
= stat
.S_IMODE(prefmode
);
3888 ftypemod
= stat
.S_IFMT(prefmode
);
3890 fwinattributes
= format(int(0), 'x').lower();
3891 if(not member
.is_dir()):
3892 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3893 prefmode
= int(stat
.S_IFREG
+ 438);
3894 fchmode
= stat
.S_IMODE(prefmode
);
3895 ftypemod
= stat
.S_IFMT(prefmode
);
3896 elif(member
.is_dir()):
3897 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3898 prefmode
= int(stat
.S_IFDIR
+ 511);
3899 fchmode
= stat
.S_IMODE(prefmode
);
3900 ftypemod
= stat
.S_IFMT(prefmode
);
3902 fcsize
= format(int(0), 'x').lower();
3904 fuid
= format(int(os
.getuid()), 'x').lower();
3905 except AttributeError:
3906 fuid
= format(int(0), 'x').lower();
3908 fuid
= format(int(0), 'x').lower();
3910 fgid
= format(int(os
.getgid()), 'x').lower();
3911 except AttributeError:
3912 fgid
= format(int(0), 'x').lower();
3914 fgid
= format(int(0), 'x').lower();
3918 userinfo
= pwd
.getpwuid(os
.getuid());
3919 funame
= userinfo
.pw_name
;
3922 except AttributeError:
3930 groupinfo
= grp
.getgrgid(os
.getgid());
3931 fgname
= groupinfo
.gr_name
;
3934 except AttributeError:
3938 fcontents
= BytesIO();
3940 fcontents
.write(zipfp
.read(member
.filename
));
3941 if(not compresswholefile
):
3942 fcontents
.seek(0, 2);
3943 ucfsize
= fcontents
.tell();
3944 fcontents
.seek(0, 0);
3945 if(compression
=="auto"):
3946 ilsize
= len(compressionlistalt
);
3949 while(ilmin
< ilsize
):
3950 cfcontents
= BytesIO();
3951 shutil
.copyfileobj(fcontents
, cfcontents
);
3952 fcontents
.seek(0, 0);
3953 cfcontents
.seek(0, 0);
3954 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
3955 cfcontents
.seek(0, 2);
3956 ilcsize
.append(cfcontents
.tell());
3959 ilcmin
= ilcsize
.index(min(ilcsize
));
3960 compression
= compressionlistalt
[ilcmin
];
3961 fcontents
.seek(0, 0);
3962 cfcontents
= BytesIO();
3963 shutil
.copyfileobj(fcontents
, cfcontents
);
3964 cfcontents
.seek(0, 0);
3965 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
3966 cfcontents
.seek(0, 2);
3967 cfsize
= cfcontents
.tell();
3968 if(ucfsize
> cfsize
):
3969 fcsize
= format(int(cfsize
), 'x').lower();
3970 fcompression
= compression
;
3972 fcontents
= cfcontents
;
3973 if(fcompression
=="none"):
3975 fcontents
.seek(0, 0);
3976 ftypehex
= format(ftype
, 'x').lower();
3977 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"];
3978 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
3981 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
3982 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3983 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
3986 os
.fsync(catfp
.fileno());
3987 except io
.UnsupportedOperation
:
3989 except AttributeError:
3991 except OSError as e
:
3995 if(hasattr(sys
.stdout
, "buffer")):
3996 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3998 shutil
.copyfileobj(catfp
, sys
.stdout
);
3999 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
4000 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
4002 upload_file_to_internet_file(catfp
, outfile
);
4010 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
4012 if(not rarfile_support
):
4013 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4016 if(rarfile_support
):
4017 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4018 formatspecs
= FormatSpecsListToDict(formatspecs
);
4019 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
4020 outfile
= RemoveWindowsPath(outfile
);
4021 checksumtype
= checksumtype
.lower();
4022 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
4023 checksumtype
="crc32";
4024 if(checksumtype
=="none"):
4026 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
4027 compression
= "auto";
4028 if(compression
not in compressionlist
and compression
is None):
4029 compression
= "auto";
4031 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4032 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
4033 if(os
.path
.exists(outfile
)):
4036 except OSError as e
:
4041 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4043 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
4046 fbasename
= os
.path
.splitext(outfile
)[0];
4047 fextname
= os
.path
.splitext(outfile
)[1];
4048 if(not compresswholefile
and fextname
in outextlistwd
):
4049 compresswholefile
= True;
4050 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
4051 catver
= formatspecs
['format_ver'];
4052 fileheaderver
= str(int(catver
.replace(".", "")));
4058 inodetocatinode
= {};
4059 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
4061 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
4063 rarfp
= rarfile
.RarFile(infile
, "r");
4064 rartest
= rarfp
.testrar();
4066 VerbosePrintOut("Bad file found!");
4067 numfiles
= int(len(rarfp
.infolist()));
4068 catfp
= AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
4071 os
.fsync(catfp
.fileno());
4072 except io
.UnsupportedOperation
:
4074 except AttributeError:
4076 except OSError as e
:
4078 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
4081 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
4084 member
.external_attr
4086 except AttributeError:
4088 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
4091 member
.external_attr
4093 except AttributeError:
4098 if(re
.findall(r
"^[.|/]", member
.filename
)):
4099 fname
= member
.filename
;
4101 fname
= "./"+member
.filename
;
4102 rarinfo
= rarfp
.getinfo(member
.filename
);
4104 VerbosePrintOut(fname
);
4105 if(is_unix
and member
.external_attr
!=0):
4106 fpremode
= int(member
.external_attr
);
4107 elif(member
.is_file()):
4108 fpremode
= int(stat
.S_IFREG
+ 438);
4109 elif(member
.is_symlink()):
4110 fpremode
= int(stat
.S_IFLNK
+ 438);
4111 elif(member
.is_dir()):
4112 fpremode
= int(stat
.S_IFDIR
+ 511);
4113 if(is_windows
and member
.external_attr
!=0):
4114 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
4116 fwinattributes
= format(int(0), 'x').lower();
4118 fcsize
= format(int(0), 'x').lower();
4121 if(member
.is_file()):
4123 elif(member
.is_symlink()):
4125 elif(member
.is_dir()):
4129 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
4130 fcurfid
= format(int(curfid
), 'x').lower();
4131 fcurinode
= format(int(curfid
), 'x').lower();
4132 curfid
= curfid
+ 1;
4133 fdev_minor
= format(int(0), 'x').lower();
4134 fdev_major
= format(int(0), 'x').lower();
4135 frdev_minor
= format(int(0), 'x').lower();
4136 frdev_major
= format(int(0), 'x').lower();
4138 fsize
= format(int("0"), 'x').lower();
4140 fsize
= format(int(member
.file_size
), 'x').lower();
4142 fsize
= format(int(member
.file_size
), 'x').lower();
4145 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
4147 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
4148 except AttributeError:
4149 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
4150 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
4153 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
4155 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
4156 except AttributeError:
4157 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
4158 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
4159 if(is_unix
and member
.external_attr
!=0):
4160 fmode
= format(int(member
.external_attr
), 'x').lower();
4161 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
4162 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
4163 elif(member
.is_file()):
4164 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
4165 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
4166 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
4167 elif(member
.is_symlink()):
4168 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
4169 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
4170 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
4171 elif(member
.is_dir()):
4172 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
4173 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
4174 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
4176 fuid
= format(int(os
.getuid()), 'x').lower();
4177 except AttributeError:
4178 fuid
= format(int(0), 'x').lower();
4180 fuid
= format(int(0), 'x').lower();
4182 fgid
= format(int(os
.getgid()), 'x').lower();
4183 except AttributeError:
4184 fgid
= format(int(0), 'x').lower();
4186 fgid
= format(int(0), 'x').lower();
4190 userinfo
= pwd
.getpwuid(os
.getuid());
4191 funame
= userinfo
.pw_name
;
4194 except AttributeError:
4202 groupinfo
= grp
.getgrgid(os
.getgid());
4203 fgname
= groupinfo
.gr_name
;
4206 except AttributeError:
4210 fcontents
= BytesIO();
4212 fcontents
.write(rarfp
.read(member
.filename
));
4213 if(not compresswholefile
):
4214 fcontents
.seek(0, 2);
4215 ucfsize
= fcontents
.tell();
4216 fcontents
.seek(0, 0);
4217 if(compression
=="auto"):
4218 ilsize
= len(compressionlistalt
);
4221 while(ilmin
< ilsize
):
4222 cfcontents
= BytesIO();
4223 shutil
.copyfileobj(fcontents
, cfcontents
);
4224 fcontents
.seek(0, 0);
4225 cfcontents
.seek(0, 0);
4226 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
4228 cfcontents
.seek(0, 2);
4229 ilcsize
.append(cfcontents
.tell());
4233 ilcsize
.append(sys
.maxint
);
4234 except AttributeError:
4235 ilcsize
.append(sys
.maxsize
);
4237 ilcmin
= ilcsize
.index(min(ilcsize
));
4238 compression
= compressionlistalt
[ilcmin
];
4239 fcontents
.seek(0, 0);
4240 cfcontents
= BytesIO();
4241 shutil
.copyfileobj(fcontents
, cfcontents
);
4242 cfcontents
.seek(0, 0);
4243 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
4244 cfcontents
.seek(0, 2);
4245 cfsize
= cfcontents
.tell();
4246 if(ucfsize
> cfsize
):
4247 fcsize
= format(int(cfsize
), 'x').lower();
4248 fcompression
= compression
;
4250 fcontents
= cfcontents
;
4251 if(fcompression
=="none"):
4253 fcontents
.seek(0, 0);
4254 ftypehex
= format(ftype
, 'x').lower();
4255 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"];
4256 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
4259 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
4260 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4261 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
)
4264 os
.fsync(catfp
.fileno());
4265 except io
.UnsupportedOperation
:
4267 except AttributeError:
4269 except OSError as e
:
4273 if(hasattr(sys
.stdout
, "buffer")):
4274 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
4276 shutil
.copyfileobj(catfp
, sys
.stdout
);
4277 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
4278 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
4280 upload_file_to_internet_file(catfp
, outfile
);
4288 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
4290 if(not py7zr_support
):
4291 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4295 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4296 formatspecs
= FormatSpecsListToDict(formatspecs
);
4297 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
4298 outfile
= RemoveWindowsPath(outfile
);
4299 checksumtype
= checksumtype
.lower();
4300 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
4301 checksumtype
="crc32";
4302 if(checksumtype
=="none"):
4304 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
4305 compression
= "auto";
4306 if(compression
not in compressionlist
and compression
is None):
4307 compression
= "auto";
4309 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4310 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
4311 if(os
.path
.exists(outfile
)):
4314 except OSError as e
:
4319 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4321 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
4324 fbasename
= os
.path
.splitext(outfile
)[0];
4325 fextname
= os
.path
.splitext(outfile
)[1];
4326 if(not compresswholefile
and fextname
in outextlistwd
):
4327 compresswholefile
= True;
4328 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
4329 catver
= formatspecs
['format_ver'];
4330 fileheaderver
= str(int(catver
.replace(".", "")));
4336 inodetocatinode
= {};
4337 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
4339 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
4340 file_content
= szpfp
.readall();
4341 #sztest = szpfp.testzip();
4342 sztestalt
= szpfp
.test();
4344 VerbosePrintOut("Bad file found!");
4345 numfiles
= int(len(szpfp
.list()));
4346 AppendFileHeader(catfp
, numfiles
, checksumtype
, formatspecs
);
4347 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
4348 if(re
.findall(r
"^[.|/]", member
.filename
)):
4349 fname
= member
.filename
;
4351 fname
= "./"+member
.filename
;
4353 VerbosePrintOut(fname
);
4354 if(not member
.is_directory
):
4355 fpremode
= int(stat
.S_IFREG
+ 438);
4356 elif(member
.is_directory
):
4357 fpremode
= int(stat
.S_IFDIR
+ 511);
4358 fwinattributes
= format(int(0), 'x').lower();
4360 fcsize
= format(int(0), 'x').lower();
4363 if(member
.is_directory
):
4368 fcurfid
= format(int(curfid
), 'x').lower();
4369 fcurinode
= format(int(curfid
), 'x').lower();
4370 curfid
= curfid
+ 1;
4371 fdev_minor
= format(int(0), 'x').lower();
4372 fdev_major
= format(int(0), 'x').lower();
4373 frdev_minor
= format(int(0), 'x').lower();
4374 frdev_major
= format(int(0), 'x').lower();
4376 fsize
= format(int("0"), 'x').lower();
4377 fatime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
4378 fmtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
4379 fctime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
4380 fbtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
4381 if(member
.is_directory
):
4382 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
4383 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
4384 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
4386 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
4387 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
4388 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
4390 fuid
= format(int(os
.getuid()), 'x').lower();
4391 except AttributeError:
4392 fuid
= format(int(0), 'x').lower();
4394 fuid
= format(int(0), 'x').lower();
4396 fgid
= format(int(os
.getgid()), 'x').lower();
4397 except AttributeError:
4398 fgid
= format(int(0), 'x').lower();
4400 fgid
= format(int(0), 'x').lower();
4404 userinfo
= pwd
.getpwuid(os
.getuid());
4405 funame
= userinfo
.pw_name
;
4408 except AttributeError:
4416 groupinfo
= grp
.getgrgid(os
.getgid());
4417 fgname
= groupinfo
.gr_name
;
4420 except AttributeError:
4424 fcontents
= BytesIO();
4426 fcontents
.write(file_content
[member
.filename
].read());
4427 fsize
= format(fcontents
.tell(), 'x').lower();
4428 file_content
[member
.filename
].close();
4429 if(not compresswholefile
):
4430 fcontents
.seek(0, 2);
4431 ucfsize
= fcontents
.tell();
4432 fcontents
.seek(0, 0);
4433 if(compression
=="auto"):
4434 ilsize
= len(compressionlistalt
);
4437 while(ilmin
< ilsize
):
4438 cfcontents
= BytesIO();
4439 shutil
.copyfileobj(fcontents
, cfcontents
);
4440 fcontents
.seek(0, 0);
4441 cfcontents
.seek(0, 0);
4442 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
4444 cfcontents
.seek(0, 2);
4445 ilcsize
.append(cfcontents
.tell());
4449 ilcsize
.append(sys
.maxint
);
4450 except AttributeError:
4451 ilcsize
.append(sys
.maxsize
);
4453 ilcmin
= ilcsize
.index(min(ilcsize
));
4454 compression
= compressionlistalt
[ilcmin
];
4455 fcontents
.seek(0, 0);
4456 cfcontents
= BytesIO();
4457 shutil
.copyfileobj(fcontents
, cfcontents
);
4458 cfcontents
.seek(0, 0);
4459 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
4460 cfcontents
.seek(0, 2);
4461 cfsize
= cfcontents
.tell();
4462 if(ucfsize
> cfsize
):
4463 fcsize
= format(int(cfsize
), 'x').lower();
4464 fcompression
= compression
;
4466 fcontents
= cfcontents
;
4467 if(fcompression
=="none"):
4469 fcontents
.seek(0, 0);
4470 ftypehex
= format(ftype
, 'x').lower();
4471 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"];
4472 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
4475 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
4476 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4477 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
)
4480 os
.fsync(catfp
.fileno());
4481 except io
.UnsupportedOperation
:
4483 except AttributeError:
4485 except OSError as e
:
4489 if(hasattr(sys
.stdout
, "buffer")):
4490 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
4492 shutil
.copyfileobj(catfp
, sys
.stdout
);
4493 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
4494 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
4496 upload_file_to_internet_file(catfp
, outfile
);
4504 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFile", PackArchiveFileFromSevenZipFile
);
4506 def PackArchiveFileFromInFile(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
4507 formatspecs
= FormatSpecsListToDict(formatspecs
);
4508 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4510 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4511 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4512 return PackArchiveFileFromTarFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4513 elif(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4514 return PackArchiveFileFromZipFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4515 elif(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4516 return PackArchiveFileFromRarFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4517 elif(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4518 return PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
4519 elif(checkcompressfile
=="catfile"):
4520 return RePackArchiveFile(infile
, outfile
, compression
, compresswholefile
, compressionlevel
, False, 0, 0, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
4525 create_alias_function("Pack", __file_format_name__
, "FromInFile", PackArchiveFileFromInFile
);
4527 def ArchiveFileSeekToFileNum(infile
, seekto
=0, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4528 formatspecs
= FormatSpecsListToDict(formatspecs
);
4529 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4532 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4533 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4534 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4535 return TarFileToArray(infile
, seekto
, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4536 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4537 return ZipFileToArray(infile
, seekto
, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4538 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4539 return RarFileToArray(infile
, seekto
, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4540 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4541 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4542 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4549 if(hasattr(sys
.stdin
, "buffer")):
4550 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4552 shutil
.copyfileobj(sys
.stdin
, catfp
);
4554 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4558 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4559 catfp
= download_file_from_internet_file(infile
);
4561 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4566 infile
= RemoveWindowsPath(infile
);
4567 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4568 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4569 return TarFileToArray(infile
, seekto
, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4570 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4571 return ZipFileToArray(infile
, seekto
, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4572 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4573 return RarFileToArray(infile
, seekto
, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4574 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4575 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4576 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4578 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4579 if(not compresscheck
):
4580 fextname
= os
.path
.splitext(infile
)[1];
4581 if(fextname
==".gz"):
4582 compresscheck
= "gzip";
4583 elif(fextname
==".bz2"):
4584 compresscheck
= "bzip2";
4585 elif(fextname
==".zst"):
4586 compresscheck
= "zstd";
4587 elif(fextname
==".lz4" or fextname
==".clz4"):
4588 compresscheck
= "lz4";
4589 elif(fextname
==".lzo" or fextname
==".lzop"):
4590 compresscheck
= "lzo";
4591 elif(fextname
==".lzma"):
4592 compresscheck
= "lzma";
4593 elif(fextname
==".xz"):
4594 compresscheck
= "xz";
4595 elif(fextname
==".zz" or fextname
==".zl" or fextname
==".zlib"):
4596 compresscheck
= "zlib";
4599 if(not compresscheck
):
4601 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4606 SeekToEndOfFile(catfp);
4608 SeekToEndOfFile(catfp);
4609 CatSize = catfp.tell();
4610 CatSizeEnd = CatSize;
4618 curloc
= catfp
.tell();
4621 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4623 catfp
.seek(curloc
, 0);
4624 catstring
= catheader
[0];
4625 catversion
= re
.findall(r
"([\d]+)", catstring
);
4626 fprenumfiles
= catheader
[1];
4627 fnumfiles
= int(fprenumfiles
, 16);
4628 fprechecksumtype
= catheader
[2];
4629 fprechecksum
= catheader
[3];
4630 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4631 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4632 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4633 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4634 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4635 fheadtell
= len(fileheader
);
4636 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4637 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4638 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4640 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4641 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4642 if(seekto
>=fnumfiles
):
4643 seekto
= fnumfiles
- 1;
4649 prefhstart
= catfp
.tell();
4650 if(formatspecs
['new_style']):
4651 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4653 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4654 if(len(preheaderdata
)==0):
4656 prefheadsize
= int(preheaderdata
[0], 16);
4657 prefnumfields
= int(preheaderdata
[1], 16);
4658 preftype
= int(preheaderdata
[2], 16);
4659 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
4660 prefname
= preheaderdata
[3];
4662 prefname
= "./"+preheaderdata
[3];
4663 prefbasedir
= os
.path
.dirname(prefname
);
4664 preflinkname
= preheaderdata
[4];
4665 prefsize
= int(preheaderdata
[5], 16);
4666 prefatime
= int(preheaderdata
[6], 16);
4667 prefmtime
= int(preheaderdata
[7], 16);
4668 prefctime
= int(preheaderdata
[8], 16);
4669 prefbtime
= int(preheaderdata
[9], 16);
4670 prefmode
= int(preheaderdata
[10], 16);
4671 prefchmode
= stat
.S_IMODE(prefmode
);
4672 preftypemod
= stat
.S_IFMT(prefmode
);
4673 prefwinattributes
= int(preheaderdata
[11], 16);
4674 prefcompression
= preheaderdata
[12];
4675 prefcsize
= int(preheaderdata
[13], 16);
4676 prefuid
= int(preheaderdata
[14], 16);
4677 prefuname
= preheaderdata
[15];
4678 prefgid
= int(preheaderdata
[16], 16);
4679 prefgname
= preheaderdata
[17];
4680 fid
= int(preheaderdata
[18], 16);
4681 finode
= int(preheaderdata
[19], 16);
4682 flinkcount
= int(preheaderdata
[20], 16);
4683 prefdev_minor
= int(preheaderdata
[21], 16);
4684 prefdev_major
= int(preheaderdata
[22], 16);
4685 prefrdev_minor
= int(preheaderdata
[23], 16);
4686 prefrdev_major
= int(preheaderdata
[24], 16);
4687 prefseeknextfile
= preheaderdata
[25];
4688 prefextrasize
= int(preheaderdata
[26], 16);
4689 prefextrafields
= int(preheaderdata
[27], 16);
4690 extrafieldslist
= [];
4692 extraend
= extrastart
+ prefextrafields
;
4693 extrafieldslist
= [];
4694 if(extrastart
<extraend
):
4695 extrafieldslist
.append(preheaderdata
[extrastart
]);
4696 extrastart
= extrastart
+ 1;
4697 prefcs
= preheaderdata
[-2].lower();
4698 prenewfcs
= preheaderdata
[-1].lower();
4699 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
4700 if(prefcs
!=prenewfcs
and not skipchecksum
):
4701 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4702 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4704 valid_archive
= False;
4705 invalid_archive
= True;
4706 prefhend
= catfp
.tell() - 1;
4707 prefcontentstart
= catfp
.tell();
4709 pyhascontents
= False;
4711 if(prefcompression
):
4712 prefcontents
= catfp
.read(prefsize
);
4714 prefcontents
= catfp
.read(prefcsize
);
4715 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4716 pyhascontents
= True;
4717 if(prefccs
!=prenewfccs
and not skipchecksum
):
4718 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4719 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4721 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
4722 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
4723 if(abs(fseeknextasnum
)==0):
4725 catfp
.seek(fseeknextasnum
, 1);
4726 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
4727 fseeknextasnum
= int(prefseeknextfile
);
4728 if(abs(fseeknextasnum
)==0):
4730 catfp
.seek(fseeknextasnum
, 1);
4731 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
4732 fseeknextasnum
= int(prefseeknextfile
);
4733 if(abs(fseeknextasnum
)==0):
4735 catfp
.seek(fseeknextasnum
, 0);
4739 catfp
.seek(seekstart
, 0);
4741 catfheadsize
= int(preheaderdata
[0], 16);
4742 catfnumfields
= int(preheaderdata
[1], 16);
4743 catftype
= int(preheaderdata
[2], 16);
4744 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
4745 catfname
= preheaderdata
[3];
4747 catfname
= "./"+preheaderdata
[3];
4748 catflinkname
= preheaderdata
[4];
4749 catfsize
= int(preheaderdata
[5], 16);
4750 catfbasedir
= os
.path
.dirname(catfname
);
4751 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4753 catlist
.update({'catfp': catfp
});
4758 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
4760 def ArchiveFileSeekToFileName(infile
, seekfile
=None, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
4761 formatspecs
= FormatSpecsListToDict(formatspecs
);
4762 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4765 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4766 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4767 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4768 return TarFileToArray(infile
, 0, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4769 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4770 return ZipFileToArray(infile
, 0, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4771 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4772 return RarFileToArray(infile
, 0, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4773 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4774 return SevenZipFileToArray(infile
, 0, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4775 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4782 if(hasattr(sys
.stdin
, "buffer")):
4783 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4785 shutil
.copyfileobj(sys
.stdin
, catfp
);
4787 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4791 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4792 catfp
= download_file_from_internet_file(infile
);
4793 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4799 infile
= RemoveWindowsPath(infile
);
4800 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4801 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
4802 return TarFileToArray(infile
, 0, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4803 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
4804 return ZipFileToArray(infile
, 0, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4805 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
4806 return RarFileToArray(infile
, 0, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4807 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
4808 return SevenZipFileToArray(infile
, 0, 0, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
4809 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
4811 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4812 if(not compresscheck
):
4813 fextname
= os
.path
.splitext(infile
)[1];
4814 if(fextname
==".gz"):
4815 compresscheck
= "gzip";
4816 elif(fextname
==".bz2"):
4817 compresscheck
= "bzip2";
4818 elif(fextname
==".zst"):
4819 compresscheck
= "zstd";
4820 elif(fextname
==".lz4" or fextname
==".clz4"):
4821 compresscheck
= "lz4";
4822 elif(fextname
==".lzo" or fextname
==".lzop"):
4823 compresscheck
= "lzo";
4824 elif(fextname
==".lzma"):
4825 compresscheck
= "lzma";
4826 elif(fextname
==".xz"):
4827 compresscheck
= "xz";
4828 elif(fextname
==".zz" or fextname
==".zl" or fextname
==".zlib"):
4829 compresscheck
= "zlib";
4832 if(not compresscheck
):
4834 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4839 SeekToEndOfFile(catfp);
4841 SeekToEndOfFile(catfp);
4842 CatSize = catfp.tell();
4843 CatSizeEnd = CatSize;
4851 curloc
= catfp
.tell();
4854 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
4856 catfp
.seek(curloc
, 0);
4857 catstring
= catheader
[0];
4858 catversion
= re
.findall(r
"([\d]+)", catstring
);
4859 fprenumfiles
= catheader
[1];
4860 fnumfiles
= int(fprenumfiles
, 16);
4861 fprechecksumtype
= catheader
[2];
4862 fprechecksum
= catheader
[3];
4863 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
4864 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4865 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
4866 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4867 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
4868 fheadtell
= len(fileheader
);
4869 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4870 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4871 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
4873 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
4874 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4875 seekto
= fnumfiles
- 1
4880 prefhstart
= catfp
.tell();
4881 if(formatspecs
['new_style']):
4882 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
4884 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
4885 if(len(preheaderdata
)==0):
4887 prefheadsize
= int(preheaderdata
[0], 16);
4888 prefnumfields
= int(preheaderdata
[1], 16);
4889 preftype
= int(preheaderdata
[2], 16);
4890 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
4891 prefname
= preheaderdata
[3];
4893 prefname
= "./"+preheaderdata
[3];
4894 prefbasedir
= os
.path
.dirname(prefname
);
4895 preflinkname
= preheaderdata
[4];
4896 prefsize
= int(preheaderdata
[5], 16);
4897 prefatime
= int(preheaderdata
[6], 16);
4898 prefmtime
= int(preheaderdata
[7], 16);
4899 prefctime
= int(preheaderdata
[8], 16);
4900 prefbtime
= int(preheaderdata
[9], 16);
4901 prefmode
= int(preheaderdata
[10], 16);
4902 prefchmode
= stat
.S_IMODE(prefmode
);
4903 preftypemod
= stat
.S_IFMT(prefmode
);
4904 prefwinattributes
= int(preheaderdata
[11], 16);
4905 prefcompression
= preheaderdata
[12];
4906 prefcsize
= int(preheaderdata
[13], 16);
4907 prefuid
= int(preheaderdata
[14], 16);
4908 prefuname
= preheaderdata
[15];
4909 prefgid
= int(preheaderdata
[16], 16);
4910 prefgname
= preheaderdata
[17];
4911 fid
= int(preheaderdata
[18], 16);
4912 finode
= int(preheaderdata
[19], 16);
4913 flinkcount
= int(preheaderdata
[20], 16);
4914 prefdev_minor
= int(preheaderdata
[21], 16);
4915 prefdev_major
= int(preheaderdata
[22], 16);
4916 prefrdev_minor
= int(preheaderdata
[23], 16);
4917 prefrdev_major
= int(preheaderdata
[24], 16);
4918 prefseeknextfile
= preheaderdata
[25];
4919 prefextrasize
= int(preheaderdata
[26], 16);
4920 prefextrafields
= int(preheaderdata
[27], 16);
4921 extrafieldslist
= [];
4923 extraend
= extrastart
+ prefextrafields
;
4924 extrafieldslist
= [];
4925 if(extrastart
<extraend
):
4926 extrafieldslist
.append(preheaderdata
[extrastart
]);
4927 extrastart
= extrastart
+ 1;
4928 prefcs
= preheaderdata
[-2].lower();
4929 prenewfcs
= preheaderdata
[-1].lower();
4930 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
4931 if(prefcs
!=prenewfcs
and not skipchecksum
):
4932 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4933 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
4935 valid_archive
= False;
4936 invalid_archive
= True;
4937 prefhend
= catfp
.tell() - 1;
4938 prefcontentstart
= catfp
.tell();
4940 pyhascontents
= False;
4942 if(prefcompression
):
4943 prefcontents
= catfp
.read(prefsize
);
4945 prefcontents
= catfp
.read(prefcsize
);
4946 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4947 pyhascontents
= True;
4948 if(prefccs
!=prenewfccs
and not skipchecksum
):
4949 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4950 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
4952 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
4953 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
4954 if(abs(fseeknextasnum
)==0):
4956 catfp
.seek(fseeknextasnum
, 1);
4957 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
4958 fseeknextasnum
= int(prefseeknextfile
);
4959 if(abs(fseeknextasnum
)==0):
4961 catfp
.seek(fseeknextasnum
, 1);
4962 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
4963 fseeknextasnum
= int(prefseeknextfile
);
4964 if(abs(fseeknextasnum
)==0):
4966 catfp
.seek(fseeknextasnum
, 0);
4971 prefname
= preheaderdata
[2];
4972 if(re
.findall(r
"^[.|/]", preheaderdata
[2])):
4973 prefname
= preheaderdata
[2];
4975 prefname
= "./"+preheaderdata
[2];
4976 if(prefname
==seekfile
):
4979 catfp
.seek(seekstart
, 0);
4981 catfheadsize
= int(preheaderdata
[0], 16);
4982 catfnumfields
= int(preheaderdata
[1], 16);
4983 catftype
= int(preheaderdata
[2], 16);
4984 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
4985 catfname
= preheaderdata
[3];
4987 catfname
= "./"+preheaderdata
[3];
4988 catflinkname
= preheaderdata
[4];
4989 catfsize
= int(preheaderdata
[5], 16);
4990 catfbasedir
= os
.path
.dirname(catfname
);
4992 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4996 catlist
.update({'catfp': catfp
});
5001 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
5003 def ArchiveFileValidate(infile
, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
5004 formatspecs
= FormatSpecsListToDict(formatspecs
);
5006 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5007 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5010 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
5011 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
5012 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
5013 return TarFileToArray(infile
, 0, 0, False, True, False, formatspecs
, returnfp
);
5014 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
5015 return ZipFileToArray(infile
, 0, 0, False, True, False, formatspecs
, returnfp
);
5016 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
5017 return RarFileToArray(infile
, 0, 0, False, True, False, formatspecs
, returnfp
);
5018 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
5019 return SevenZipFileToArray(infile
, 0, 0, False, True, False, formatspecs
, returnfp
);
5020 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
5027 if(hasattr(sys
.stdin
, "buffer")):
5028 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
5030 shutil
.copyfileobj(sys
.stdin
, catfp
);
5032 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
5036 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5037 catfp
= download_file_from_internet_file(infile
);
5038 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
5044 infile
= RemoveWindowsPath(infile
);
5045 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
5046 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
5047 return TarFileToArray(infile
, 0, 0, False, True, False, formatspecs
, returnfp
);
5048 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
5049 return ZipFileToArray(infile
, 0, 0, False, True, False, formatspecs
, returnfp
);
5050 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
5051 return RarFileToArray(infile
, 0, 0, False, True, False, formatspecs
, returnfp
);
5052 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
5053 return SevenZipFileToArray(infile
, 0, 0, False, True, False, formatspecs
, returnfp
);
5054 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
5056 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
5057 if(not compresscheck
):
5058 fextname
= os
.path
.splitext(infile
)[1];
5059 if(fextname
==".gz"):
5060 compresscheck
= "gzip";
5061 elif(fextname
==".bz2"):
5062 compresscheck
= "bzip2";
5063 elif(fextname
==".zst"):
5064 compresscheck
= "zstd";
5065 elif(fextname
==".lz4" or fextname
==".clz4"):
5066 compresscheck
= "lz4";
5067 elif(fextname
==".lzo" or fextname
==".lzop"):
5068 compresscheck
= "lzo";
5069 elif(fextname
==".lzma"):
5070 compresscheck
= "lzma";
5071 elif(fextname
==".xz"):
5072 compresscheck
= "xz";
5073 elif(fextname
==".zz" or fextname
==".zl" or fextname
==".zlib"):
5074 compresscheck
= "zlib";
5077 if(not compresscheck
):
5079 catfp
= UncompressFile(infile
, formatspecs
, "rb");
5084 SeekToEndOfFile(catfp);
5086 SeekToEndOfFile(catfp);
5087 CatSize = catfp.tell();
5088 CatSizeEnd = CatSize;
5096 curloc
= catfp
.tell();
5099 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
5101 catfp
.seek(curloc
, 0);
5102 catstring
= catheader
[0];
5103 catversion
= re
.findall(r
"([\d]+)", catstring
);
5104 fprenumfiles
= catheader
[1];
5105 fnumfiles
= int(fprenumfiles
, 16);
5106 fprechecksumtype
= catheader
[2];
5107 fprechecksum
= catheader
[3];
5109 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
5110 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5111 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
5112 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
5113 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5114 valid_archive
= True;
5115 invalid_archive
= False;
5117 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5119 VerbosePrintOut(infile
.name
);
5120 except AttributeError:
5121 VerbosePrintOut(infile
);
5123 VerbosePrintOut(infile
);
5124 VerbosePrintOut("Number of Records " + str(fnumfiles
));
5125 if(fprechecksum
==catfileheadercshex
):
5127 VerbosePrintOut("File Header Checksum Passed at offset " + str(0));
5128 VerbosePrintOut("'" + str(fprechecksum
) + "' == " + "'" + str(catfileheadercshex
) + "'");
5131 VerbosePrintOut("File Header Checksum Failed at offset " + str(0));
5132 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
5133 valid_archive
= False;
5134 invalid_archive
= True;
5136 VerbosePrintOut("");
5137 while(il
<fnumfiles
):
5138 catfhstart
= catfp
.tell();
5139 if(formatspecs
['new_style']):
5140 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
5142 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
5143 if(len(catheaderdata
)==0):
5145 catfheadsize
= int(catheaderdata
[0], 16);
5146 catfnumfields
= int(catheaderdata
[1], 16);
5147 catftype
= int(catheaderdata
[2], 16);
5148 if(re
.findall(r
"^[.|/]", catheaderdata
[3])):
5149 catfname
= catheaderdata
[3];
5151 catfname
= "./"+catheaderdata
[3];
5152 catfbasedir
= os
.path
.dirname(catfname
);
5153 catflinkname
= catheaderdata
[4];
5154 catfsize
= int(catheaderdata
[5], 16);
5155 catfatime
= int(catheaderdata
[6], 16);
5156 catfmtime
= int(catheaderdata
[7], 16);
5157 catfctime
= int(catheaderdata
[8], 16);
5158 catfbtime
= int(catheaderdata
[9], 16);
5159 catfmode
= int(catheaderdata
[10], 16);
5160 catfchmode
= stat
.S_IMODE(catfmode
);
5161 catftypemod
= stat
.S_IFMT(catfmode
);
5162 catfwinattributes
= int(catheaderdata
[11], 16);
5163 catfcompression
= catheaderdata
[12];
5164 catfcsize
= int(catheaderdata
[13], 16);
5165 catfuid
= int(catheaderdata
[14], 16);
5166 catfuname
= catheaderdata
[15];
5167 catfgid
= int(catheaderdata
[16], 16);
5168 catfgname
= catheaderdata
[17];
5169 fid
= int(catheaderdata
[18], 16);
5170 finode
= int(catheaderdata
[19], 16);
5171 flinkcount
= int(catheaderdata
[20], 16);
5172 catfdev_minor
= int(catheaderdata
[21], 16);
5173 catfdev_major
= int(catheaderdata
[22], 16);
5174 catfrdev_minor
= int(catheaderdata
[23], 16);
5175 catfrdev_major
= int(catheaderdata
[24], 16);
5176 catfseeknextfile
= catheaderdata
[25];
5177 catfextrasize
= int(catheaderdata
[26], 16);
5178 catfextrafields
= int(catheaderdata
[27], 16);
5179 extrafieldslist
= [];
5181 extraend
= extrastart
+ catfextrafields
;
5182 extrafieldslist
= [];
5183 if(extrastart
<extraend
):
5184 extrafieldslist
.append(catheaderdata
[extrastart
]);
5185 extrastart
= extrastart
+ 1;
5186 catfcs
= catheaderdata
[-2].lower();
5187 catfccs
= catheaderdata
[-1].lower();
5188 catnewfcs
= GetHeaderChecksum(catheaderdata
[:-2], catheaderdata
[-4].lower(), True, formatspecs
);
5190 VerbosePrintOut(catfname
);
5191 VerbosePrintOut("Record Number " + str(il
) + "; File ID " + str(fid
) + "; iNode Number " + str(finode
));
5192 if(catfcs
==catnewfcs
):
5194 VerbosePrintOut("File Header Checksum Passed at offset " + str(catfhstart
));
5195 VerbosePrintOut("'" + str(catfcs
) + "' == " + "'" + str(catnewfcs
) + "'");
5198 VerbosePrintOut("File Header Checksum Failed at offset " + str(catfhstart
));
5199 VerbosePrintOut("'" + str(catfcs
) + "' != " + "'" + str(catnewfcs
) + "'");
5200 valid_archive
= False;
5201 invalid_archive
= True;
5202 catfhend
= catfp
.tell() - 1;
5203 catfcontentstart
= catfp
.tell();
5205 pyhascontents
= False;
5207 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
5208 catfcontents
= catfp
.read(catfsize
);
5210 catfcontents
= catfp
.read(catfcsize
);
5211 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
5212 pyhascontents
= True;
5213 if(catfccs
==catnewfccs
):
5215 VerbosePrintOut("File Content Checksum Passed at offset " + str(catfcontentstart
));
5216 VerbosePrintOut("'" + str(catfccs
) + "' == " + "'" + str(catnewfccs
) + "'");
5219 VerbosePrintOut("File Content Checksum Failed at offset " + str(catfcontentstart
));
5220 VerbosePrintOut("'" + str(catfccs
) + "' != " + "'" + str(catnewfccs
) + "'");
5221 valid_archive
= False;
5222 invalid_archive
= True;
5224 VerbosePrintOut("");
5225 if(re
.findall(r
"^\+([0-9]+)", catfseeknextfile
)):
5226 fseeknextasnum
= int(catfseeknextfile
.replace("+", ""));
5227 if(abs(fseeknextasnum
)==0):
5229 catfp
.seek(fseeknextasnum
, 1);
5230 elif(re
.findall(r
"^\-([0-9]+)", catfseeknextfile
)):
5231 fseeknextasnum
= int(catfseeknextfile
);
5232 if(abs(fseeknextasnum
)==0):
5234 catfp
.seek(fseeknextasnum
, 1);
5235 elif(re
.findall(r
"^([0-9]+)", catfseeknextfile
)):
5236 fseeknextasnum
= int(catfseeknextfile
);
5237 if(abs(fseeknextasnum
)==0):
5239 catfp
.seek(fseeknextasnum
, 0);
5253 create_alias_function("", __file_format_name__
, "Validate", ArchiveFileValidate
);
5255 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5256 formatspecs
= FormatSpecsListToDict(formatspecs
);
5257 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5260 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
5261 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
5262 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
5263 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
5264 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
5265 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
5266 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
5267 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
5268 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
5269 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
5270 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
5277 if(hasattr(sys
.stdin
, "buffer")):
5278 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
5280 shutil
.copyfileobj(sys
.stdin
, catfp
);
5282 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
5286 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5287 catfp
= download_file_from_internet_file(infile
);
5288 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
5294 infile
= RemoveWindowsPath(infile
);
5295 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
5296 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
5297 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5298 if(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
5299 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5300 if(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
5301 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5302 if(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
5303 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5304 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
['format_lower']):
5306 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
5307 if(not compresscheck
):
5308 fextname
= os
.path
.splitext(infile
)[1];
5309 if(fextname
==".gz"):
5310 compresscheck
= "gzip";
5311 elif(fextname
==".bz2"):
5312 compresscheck
= "bzip2";
5313 elif(fextname
==".zst"):
5314 compresscheck
= "zstd";
5315 elif(fextname
==".lz4" or fextname
==".clz4"):
5316 compresscheck
= "lz4";
5317 elif(fextname
==".lzo" or fextname
==".lzop"):
5318 compresscheck
= "lzo";
5319 elif(fextname
==".lzma"):
5320 compresscheck
= "lzma";
5321 elif(fextname
==".xz"):
5322 compresscheck
= "xz";
5323 elif(fextname
==".zz" or fextname
==".zl" or fextname
==".zlib"):
5324 compresscheck
= "zlib";
5327 if(not compresscheck
):
5329 catfp
= UncompressFile(infile
, formatspecs
, "rb");
5334 SeekToEndOfFile(catfp);
5336 SeekToEndOfFile(catfp);
5337 CatSize = catfp.tell();
5338 CatSizeEnd = CatSize;
5346 curloc
= catfp
.tell();
5349 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
['format_delimiter']);
5351 catfp
.seek(curloc
, 0);
5352 catstring
= catheader
[0];
5353 catversion
= re
.findall(r
"([\d]+)", catstring
);
5354 fprenumfiles
= catheader
[1];
5355 fnumfiles
= int(fprenumfiles
, 16);
5356 fprechecksumtype
= catheader
[2];
5357 fprechecksum
= catheader
[3];
5358 fileheader
= AppendNullByte(catstring
, formatspecs
['format_delimiter']);
5359 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5360 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
['format_delimiter']);
5361 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
5362 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5363 fheadtell
= len(fileheader
);
5364 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
5365 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
5366 VerbosePrintOut("'" + str(fprechecksum
) + "' != " + "'" + str(catfileheadercshex
) + "'");
5368 catversions
= re
.search(r
'(.*?)(\d+)', catstring
).groups();
5369 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': []};
5370 if(seekstart
<0 and seekstart
>fnumfiles
):
5372 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
5373 seekend
= fnumfiles
;
5374 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
5375 seekend
= fnumfiles
- abs(seekend
);
5378 while(il
< seekstart
):
5379 prefhstart
= catfp
.tell();
5380 if(formatspecs
['new_style']):
5381 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
5383 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
5384 if(len(preheaderdata
)==0):
5386 prefheadsize
= int(preheaderdata
[0], 16);
5387 prefnumfields
= int(preheaderdata
[1], 16);
5388 if(re
.findall(r
"^[.|/]", preheaderdata
[3])):
5389 prefname
= preheaderdata
[3];
5391 prefname
= "./"+preheaderdata
[3];
5392 prefsize
= int(preheaderdata
[5], 16);
5393 prefcompression
= preheaderdata
[12];
5394 prefcsize
= int(preheaderdata
[13], 16);
5395 prefseeknextfile
= preheaderdata
[25];
5396 prefextrasize
= int(preheaderdata
[26], 16);
5397 prefextrafields
= int(preheaderdata
[27], 16);
5398 extrafieldslist
= [];
5400 extraend
= extrastart
+ prefextrafields
;
5401 extrafieldslist
= [];
5402 if(extrastart
<extraend
):
5403 extrafieldslist
.append(preheaderdata
[extrastart
]);
5404 extrastart
= extrastart
+ 1;
5405 prefcs
= preheaderdata
[-2].lower();
5406 prenewfcs
= preheaderdata
[-1].lower();
5407 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-4].lower(), True, formatspecs
);
5408 if(prefcs
!=prenewfcs
and not skipchecksum
):
5409 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
5410 VerbosePrintOut("'" + str(prefcs
) + "' != " + "'" + str(prenewfcs
) + "'");
5412 valid_archive
= False;
5413 invalid_archive
= True;
5414 prefhend
= catfp
.tell() - 1;
5415 prefcontentstart
= catfp
.tell();
5417 pyhascontents
= False;
5419 if(prefcompression
=="none" or prefcompression
=="" or prefcompression
=="auto"):
5420 prefcontents
= catfp
.read(prefsize
);
5422 prefcontents
= catfp
.read(prefcsize
);
5423 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
5424 pyhascontents
= True;
5425 if(prefccs
!=prenewfccs
and not skipchecksum
):
5426 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
5427 VerbosePrintOut("'" + str(prefccs
) + "' != " + "'" + str(prenewfccs
) + "'");
5429 if(re
.findall(r
"^\+([0-9]+)", prefseeknextfile
)):
5430 fseeknextasnum
= int(prefseeknextfile
.replace("+", ""));
5431 if(abs(fseeknextasnum
)==0):
5433 catfp
.seek(fseeknextasnum
, 1);
5434 elif(re
.findall(r
"^\-([0-9]+)", prefseeknextfile
)):
5435 fseeknextasnum
= int(prefseeknextfile
);
5436 if(abs(fseeknextasnum
)==0):
5438 catfp
.seek(fseeknextasnum
, 1);
5439 elif(re
.findall(r
"^([0-9]+)", prefseeknextfile
)):
5440 fseeknextasnum
= int(prefseeknextfile
);
5441 if(abs(fseeknextasnum
)==0):
5443 catfp
.seek(fseeknextasnum
, 0);
5447 fileidnum
= seekstart
;
5449 while(fileidnum
<seekend
):
5450 catfhstart
= catfp
.tell();
5451 if(formatspecs
['new_style']):
5452 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
['format_delimiter']);
5454 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
['format_delimiter']);
5455 if(len(catheaderdata
)==0):
5457 catfheadsize
= int(catheaderdata
[0], 16);
5458 catfnumfields
= int(catheaderdata
[1], 16);
5459 catftype
= int(catheaderdata
[2], 16);
5460 if(re
.findall(r
"^[.|/]", catheaderdata
[3])):
5461 catfname
= catheaderdata
[3];
5463 catfname
= "./"+catheaderdata
[3];
5464 catfbasedir
= os
.path
.dirname(catfname
);
5465 catflinkname
= catheaderdata
[4];
5466 catfsize
= int(catheaderdata
[5], 16);
5467 catfatime
= int(catheaderdata
[6], 16);
5468 catfmtime
= int(catheaderdata
[7], 16);
5469 catfctime
= int(catheaderdata
[8], 16);
5470 catfbtime
= int(catheaderdata
[9], 16);
5471 catfmode
= int(catheaderdata
[10], 16);
5472 catfchmode
= stat
.S_IMODE(catfmode
);
5473 catftypemod
= stat
.S_IFMT(catfmode
);
5474 catfwinattributes
= int(catheaderdata
[11], 16);
5475 catfcompression
= catheaderdata
[12];
5476 catfcsize
= int(catheaderdata
[13], 16);
5477 catfuid
= int(catheaderdata
[14], 16);
5478 catfuname
= catheaderdata
[15];
5479 catfgid
= int(catheaderdata
[16], 16);
5480 catfgname
= catheaderdata
[17];
5481 catfid
= int(catheaderdata
[18], 16);
5482 catfinode
= int(catheaderdata
[19], 16);
5483 catflinkcount
= int(catheaderdata
[20], 16);
5484 catfdev_minor
= int(catheaderdata
[21], 16);
5485 catfdev_major
= int(catheaderdata
[22], 16);
5486 catfrdev_minor
= int(catheaderdata
[23], 16);
5487 catfrdev_major
= int(catheaderdata
[24], 16);
5488 catfseeknextfile
= catheaderdata
[25];
5489 catfextrasize
= int(catheaderdata
[26], 16);
5490 catfextrafields
= int(catheaderdata
[27], 16);
5491 extrafieldslist
= [];
5493 extraend
= extrastart
+ catfextrafields
;
5494 extrafieldslist
= [];
5495 if(extrastart
<extraend
):
5496 extrafieldslist
.append(catheaderdata
[extrastart
]);
5497 extrastart
= extrastart
+ 1;
5498 catfcs
= catheaderdata
[-2].lower();
5499 catfccs
= catheaderdata
[-1].lower();
5500 catnewfcs
= GetHeaderChecksum(catheaderdata
[:-2], catheaderdata
[-4].lower(), True, formatspecs
);
5501 if(catfcs
!=catnewfcs
and not skipchecksum
):
5502 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
5503 VerbosePrintOut("'" + str(catfcs
) + "' != " + "'" + str(catnewfcs
) + "'");
5505 catfhend
= catfp
.tell() - 1;
5506 catfcontentstart
= catfp
.tell();
5507 catfcontents
= BytesIO();
5508 pyhascontents
= False;
5509 if(catfsize
>0 and not listonly
):
5510 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
5511 catfcontents
.write(catfp
.read(catfsize
));
5513 catfcontents
.write(catfp
.read(catfcsize
));
5514 catfcontents
.seek(0, 0);
5515 catnewfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
5516 pyhascontents
= True;
5517 if(catfccs
!=catnewfccs
and skipchecksum
):
5518 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
5519 VerbosePrintOut("'" + str(catfccs
) + "' != " + "'" + str(catnewfccs
) + "'");
5521 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
5524 catfcontents
.seek(0, 0);
5526 catfcontents
= UncompressArchiveFile(catfcontents
, formatspecs
);
5527 catfcontents
.seek(0, 0);
5528 catfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
5529 if(catfsize
>0 and listonly
):
5530 if(catfcompression
=="none" or catfcompression
=="" or catfcompression
=="auto"):
5531 catfp
.seek(catfsize
, 1);
5533 catfp
.seek(catfcsize
, 1);
5534 pyhascontents
= False;
5535 catfcontentend
= catfp
.tell();
5536 if(re
.findall(r
"^\+([0-9]+)", catfseeknextfile
)):
5537 fseeknextasnum
= int(catfseeknextfile
.replace("+", ""));
5538 if(abs(fseeknextasnum
)==0):
5540 catfp
.seek(fseeknextasnum
, 1);
5541 elif(re
.findall(r
"^\-([0-9]+)", catfseeknextfile
)):
5542 fseeknextasnum
= int(catfseeknextfile
);
5543 if(abs(fseeknextasnum
)==0):
5545 catfp
.seek(fseeknextasnum
, 1);
5546 elif(re
.findall(r
"^([0-9]+)", catfseeknextfile
)):
5547 fseeknextasnum
= int(catfseeknextfile
);
5548 if(abs(fseeknextasnum
)==0):
5550 catfp
.seek(fseeknextasnum
, 0);
5553 catfcontents
.seek(0, 0);
5554 if(not contentasfile
):
5555 catfcontents
= catfcontents
.read();
5556 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
, 'fcontentasfile': contentasfile
, 'fcontents': catfcontents
});
5557 fileidnum
= fileidnum
+ 1;
5558 realidnum
= realidnum
+ 1;
5560 catlist
.update({'catfp': catfp
});
5565 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
5567 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5568 formatspecs
= FormatSpecsListToDict(formatspecs
);
5569 catfp
= BytesIO(catstr
);
5570 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, contentasfile
, True, skipchecksum
, formatspecs
, returnfp
);
5571 return listcatfiles
;
5573 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
5575 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5576 formatspecs
= FormatSpecsListToDict(formatspecs
);
5578 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5579 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, contentasfile
, True, skipchecksum
, formatspecs
, returnfp
);
5580 return listcatfiles
;
5582 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5583 formatspecs
= FormatSpecsListToDict(formatspecs
);
5585 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5586 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, contentasfile
, True, skipchecksum
, formatspecs
, returnfp
);
5587 return listcatfiles
;
5589 if(not rarfile_support
):
5590 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5593 if(rarfile_support
):
5594 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5595 formatspecs
= FormatSpecsListToDict(formatspecs
);
5597 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5598 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, contentasfile
, True, skipchecksum
, formatspecs
, returnfp
);
5599 return listcatfiles
;
5601 if(not py7zr_support
):
5602 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5606 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5607 formatspecs
= FormatSpecsListToDict(formatspecs
);
5609 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", True, None, "crc32", [], formatspecs
, False, True);
5610 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, contentasfile
, True, skipchecksum
, formatspecs
, returnfp
);
5611 return listcatfiles
;
5613 def InFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, contentasfile
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
5614 formatspecs
= FormatSpecsListToDict(formatspecs
);
5615 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
5616 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
5617 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
5618 elif(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
5619 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
5620 elif(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
5621 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
5622 elif(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
5623 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, contentasfile
, skipchecksum
, formatspecs
, returnfp
);
5624 elif(checkcompressfile
=="catfile"):
5625 return ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, contentasfile
, True, skipchecksum
, formatspecs
, returnfp
);
5630 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, contentasfile
=True, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5631 formatspecs
= FormatSpecsListToDict(formatspecs
);
5632 catver
= formatspecs
['format_ver'];
5633 fileheaderver
= str(int(catver
.replace(".", "")));
5634 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5635 advancedlist
= formatspecs
['use_advanced_list'];
5636 altinode
= formatspecs
['use_alt_inode'];
5639 for line
in sys
.stdin
:
5640 infilelist
.append(line
.strip());
5641 infilelist
= list(filter(None, infilelist
));
5642 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
5643 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
5645 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
5646 for line
in finfile
:
5647 infilelist
.append(line
.strip());
5648 infilelist
= list(filter(None, infilelist
));
5650 if(isinstance(infiles
, (list, tuple, ))):
5651 infilelist
= list(filter(None, infiles
));
5652 elif(isinstance(infiles
, (str, ))):
5653 infilelist
= list(filter(None, [infiles
]));
5655 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
5657 GetDirList
= ListDir(infilelist
, followlink
, False);
5665 inodetocatinode
= {};
5667 fnumfiles
= int(len(GetDirList
));
5668 catver
= formatspecs
['format_ver'];
5669 fileheaderver
= str(int(catver
.replace(".", "")));
5670 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5671 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5672 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5673 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5674 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5675 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5676 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5677 fheadtell
= len(fileheader
);
5678 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5679 for curfname
in GetDirList
:
5680 catfhstart
= fheadtell
;
5681 if(re
.findall(r
"^[.|/]", curfname
)):
5684 fname
= "./"+curfname
;
5686 VerbosePrintOut(fname
);
5687 if(not followlink
or followlink
is None):
5688 fstatinfo
= os
.lstat(fname
);
5690 fstatinfo
= os
.stat(fname
);
5691 fpremode
= fstatinfo
.st_mode
;
5692 finode
= fstatinfo
.st_ino
;
5693 flinkcount
= fstatinfo
.st_nlink
;
5695 if(stat
.S_ISREG(fpremode
)):
5697 elif(stat
.S_ISLNK(fpremode
)):
5699 elif(stat
.S_ISCHR(fpremode
)):
5701 elif(stat
.S_ISBLK(fpremode
)):
5703 elif(stat
.S_ISDIR(fpremode
)):
5705 elif(stat
.S_ISFIFO(fpremode
)):
5707 elif(stat
.S_ISSOCK(fpremode
)):
5709 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
5711 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
5713 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
5718 fbasedir
= os
.path
.dirname(fname
);
5720 if(not followlink
and finode
!=0):
5722 if(finode
in inodelist
):
5724 flinkname
= inodetofile
[finode
];
5728 fcurinode
= inodetocatinode
[finode
];
5729 if(finode
not in inodelist
):
5730 inodelist
.append(finode
);
5731 inodetofile
.update({finode
: fname
});
5732 inodetocatinode
.update({finode
: curinode
});
5736 fcurinode
= curinode
;
5737 curinode
= curinode
+ 1;
5739 fcurinode
= curinode
;
5740 curinode
= curinode
+ 1;
5741 curfid
= curfid
+ 1;
5743 flinkname
= os
.readlink(fname
);
5744 fdev
= fstatinfo
.st_dev
;
5745 getfdev
= GetDevMajorMinor(fdev
);
5746 fdev_minor
= getfdev
[0];
5747 fdev_major
= getfdev
[1];
5748 frdev
= fstatinfo
.st_dev
;
5749 if(hasattr(fstatinfo
, "st_rdev")):
5750 frdev
= fstatinfo
.st_rdev
;
5752 frdev
= fstatinfo
.st_dev
;
5753 getfrdev
= GetDevMajorMinor(frdev
);
5754 frdev_minor
= getfrdev
[0];
5755 frdev_major
= getfrdev
[1];
5756 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5758 if(ftype
==0 or ftype
==7):
5759 fsize
= fstatinfo
.st_size
;
5760 fatime
= fstatinfo
.st_atime
;
5761 fmtime
= fstatinfo
.st_mtime
;
5762 fctime
= fstatinfo
.st_ctime
;
5763 if(hasattr(fstatinfo
, "st_birthtime")):
5764 fbtime
= fstatinfo
.st_birthtime
;
5766 fbtime
= fstatinfo
.st_ctime
;
5767 fmode
= fstatinfo
.st_mode
;
5768 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
5769 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
5770 fuid
= fstatinfo
.st_uid
;
5771 fgid
= fstatinfo
.st_gid
;
5776 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
5777 funame
= userinfo
.pw_name
;
5786 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
5787 fgname
= groupinfo
.gr_name
;
5792 fdev_minor
= fdev_minor
;
5793 fdev_major
= fdev_major
;
5794 frdev_minor
= frdev_minor
;
5795 frdev_major
= frdev_major
;
5796 flinkcount
= flinkcount
;
5797 if(hasattr(fstatinfo
, "st_file_attributes")):
5798 fwinattributes
= fstatinfo
.st_file_attributes
;
5803 fcontents
= BytesIO();
5804 if(ftype
==0 or ftype
==7):
5805 with
open(fname
, "rb") as fpc
:
5806 shutil
.copyfileobj(fpc
, fcontents
);
5807 if(followlink
and (ftype
==1 or ftype
==2)):
5808 flstatinfo
= os
.stat(flinkname
);
5809 with
open(flinkname
, "rb") as fpc
:
5810 shutil
.copyfileobj(fpc
, fcontents
);
5811 fcontents
.seek(0, 0);
5812 ftypehex
= format(ftype
, 'x').lower();
5813 extrafields
= len(extradata
);
5814 extrafieldslist
= extradata
;
5815 catfextrafields
= extrafields
;
5816 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
5817 if(len(extradata
)>0):
5818 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5819 extrasizelen
= len(extrasizestr
);
5820 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5821 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()];
5822 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5823 catoutlenhex
= format(catoutlen
, 'x').lower();
5824 catoutlist
.insert(0, catoutlenhex
);
5825 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
5826 catheaderdata
= catoutlist
;
5827 if(len(extradata
)>0):
5828 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
5830 checksumlist
= [checksumtype
, "none"];
5832 checksumlist
= [checksumtype
, checksumtype
];
5833 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
5834 catfnumfields
= catoutlen
;
5835 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5836 fcontents
.seek(0, 0);
5838 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
5840 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5841 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5842 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5843 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
5844 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5845 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
5846 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5847 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
5848 catfcontentstart
= fheadtell
;
5849 fheadtell
+= len(catfileoutstr
) + 1;
5850 catfcontentend
= fheadtell
- 1;
5851 catfhend
= catfcontentend
;
5852 fcontents
.seek(0, 0);
5853 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5854 pyhascontents
= False;
5855 if(int(fsize
)>0 and not listonly
):
5856 pyhascontents
= True;
5857 if(int(fsize
)>0 and listonly
):
5858 fcontents
= BytesIO();
5859 pyhascontents
= False;
5860 fcontents
.seek(0, 0);
5861 if(not contentasfile
):
5862 fcontents
= fcontents
.read();
5863 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
, 'fcontentasfile': contentasfile
, 'fcontents': fcontents
});
5864 fileidnum
= fileidnum
+ 1;
5867 def TarFileToArrayAlt(infile
, listonly
=False, contentasfile
=True, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
5868 formatspecs
= FormatSpecsListToDict(formatspecs
);
5874 inodetocatinode
= {};
5878 if(hasattr(sys
.stdin
, "buffer")):
5879 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5881 shutil
.copyfileobj(sys
.stdin
, infile
);
5886 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5887 infile
= download_file_from_internet_file(infile
);
5892 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5894 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
5896 if(not tarfile
.TarFileCheck(infile
)):
5898 except AttributeError:
5899 if(not TarFileCheck(infile
)):
5902 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5903 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
5905 tarfp
= tarfile
.open(infile
, "r");
5906 except FileNotFoundError
:
5908 fnumfiles
= int(len(tarfp
.getmembers()));
5909 catver
= formatspecs
['format_ver'];
5910 fileheaderver
= str(int(catver
.replace(".", "")));
5911 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
5912 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5913 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
5914 catversion
= re
.findall(r
"([\d]+)", fileheader
);
5915 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
5916 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
5917 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
5918 fheadtell
= len(fileheader
);
5919 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
5920 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
5921 catfhstart
= fheadtell
;
5922 if(re
.findall(r
"^[.|/]", member
.name
)):
5923 fname
= member
.name
;
5925 fname
= "./"+member
.name
;
5927 VerbosePrintOut(fname
);
5928 fpremode
= member
.mode
;
5929 ffullmode
= member
.mode
;
5933 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5935 elif(member
.isdev()):
5936 ffullmode
= member
.mode
;
5938 elif(member
.islnk()):
5939 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5941 elif(member
.issym()):
5942 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
5944 elif(member
.ischr()):
5945 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
5947 elif(member
.isblk()):
5948 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
5950 elif(member
.isdir()):
5951 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
5953 elif(member
.isfifo()):
5954 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
5956 elif(member
.issparse()):
5957 ffullmode
= member
.mode
;
5960 ffullmode
= member
.mode
;
5963 fbasedir
= os
.path
.dirname(fname
);
5967 curfid
= curfid
+ 1;
5969 flinkname
= member
.linkname
;
5970 fdev_minor
= member
.devminor
;
5971 fdev_major
= member
.devmajor
;
5972 frdev_minor
= member
.devminor
;
5973 frdev_major
= member
.devmajor
;
5974 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5976 elif(ftype
==0 or ftype
==7):
5977 fsize
= member
.size
;
5979 fsize
= member
.size
;
5980 fatime
= member
.mtime
;
5981 fmtime
= member
.mtime
;
5982 fctime
= member
.mtime
;
5983 fbtime
= member
.mtime
;
5985 fchmode
= stat
.S_IMODE(ffullmode
);
5986 ftypemod
= stat
.S_IFMT(ffullmode
);
5989 funame
= member
.uname
;
5990 fgname
= member
.gname
;
5991 flinkcount
= flinkcount
;
5992 fwinattributes
= int(0);
5995 fcontents
= BytesIO();
5996 if(ftype
==0 or ftype
==7):
5997 with tarfp
.extractfile(member
) as fpc
:
5998 shutil
.copyfileobj(fpc
, fcontents
);
5999 fcontents
.seek(0, 0);
6000 ftypehex
= format(ftype
, 'x').lower();
6001 extrafields
= len(extradata
);
6002 extrafieldslist
= extradata
;
6003 catfextrafields
= extrafields
;
6004 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
6005 if(len(extradata
)>0):
6006 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6007 extrasizelen
= len(extrasizestr
);
6008 extrasizelenhex
= format(extrasizelen
, 'x').lower();
6009 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()];
6010 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6011 catoutlenhex
= format(catoutlen
, 'x').lower();
6012 catoutlist
.insert(0, catoutlenhex
);
6013 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
6014 catheaderdata
= catoutlist
;
6015 if(len(extradata
)>0):
6016 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6018 checksumlist
= [checksumtype
, "none"];
6020 checksumlist
= [checksumtype
, checksumtype
];
6021 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
6022 catfnumfields
= catoutlen
;
6023 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6024 fcontents
.seek(0, 0);
6026 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
6028 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
6029 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6030 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
6031 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
6032 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6033 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6034 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6035 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
6036 catfcontentstart
= fheadtell
;
6037 fheadtell
+= len(catfileoutstr
) + 1;
6038 catfcontentend
= fheadtell
- 1;
6039 catfhend
= catfcontentend
;
6040 fcontents
.seek(0, 0);
6041 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
6042 pyhascontents
= False;
6043 if(int(fsize
)>0 and not listonly
):
6044 pyhascontents
= True;
6045 if(int(fsize
)>0 and listonly
):
6046 fcontents
= BytesIO();
6047 pyhascontents
= False;
6048 fcontents
.seek(0, 0);
6049 if(not contentasfile
):
6050 fcontents
= fcontents
.read();
6051 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
, 'fcontentasfile': contentasfile
, 'fcontents': fcontents
});
6052 fileidnum
= fileidnum
+ 1;
6055 def ZipFileToArrayAlt(infile
, listonly
=False, contentasfile
=True, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6056 formatspecs
= FormatSpecsListToDict(formatspecs
);
6062 inodetocatinode
= {};
6066 if(hasattr(sys
.stdin
, "buffer")):
6067 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
6069 shutil
.copyfileobj(sys
.stdin
, infile
);
6074 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
6075 infile
= download_file_from_internet_file(infile
);
6080 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6082 if(not zipfile
.is_zipfile(infile
)):
6085 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
6086 except FileNotFoundError
:
6088 ziptest
= zipfp
.testzip();
6090 VerbosePrintOut("Bad file found!");
6091 fnumfiles
= int(len(zipfp
.infolist()));
6092 catver
= formatspecs
['format_ver'];
6093 fileheaderver
= str(int(catver
.replace(".", "")));
6094 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
6095 catversion
= re
.findall(r
"([\d]+)", fileheader
);
6096 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
6097 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
6098 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
6099 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
6100 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
6101 fheadtell
= len(fileheader
);
6102 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
6103 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
6104 catfhstart
= fheadtell
;
6105 if(re
.findall(r
"^[.|/]", member
.filename
)):
6106 fname
= member
.filename
;
6108 fname
= "./"+member
.filename
;
6109 zipinfo
= zipfp
.getinfo(member
.filename
);
6111 VerbosePrintOut(fname
);
6112 if(not member
.is_dir()):
6113 fpremode
= stat
.S_IFREG
+ 438;
6114 elif(member
.is_dir()):
6115 fpremode
= stat
.S_IFDIR
+ 511;
6118 if(not member
.is_dir()):
6120 elif(member
.is_dir()):
6123 fbasedir
= os
.path
.dirname(fname
);
6127 curfid
= curfid
+ 1;
6135 fsize
= member
.file_size
;
6137 fsize
= member
.file_size
;
6138 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
6139 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
6140 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
6141 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
6142 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
6143 fwinattributes
= int(zipinfo
.external_attr
);
6144 if(not member
.is_dir()):
6145 fmode
= int(stat
.S_IFREG
+ 438);
6146 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
6147 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
6148 elif(member
.is_dir()):
6149 fmode
= int(stat
.S_IFDIR
+ 511);
6150 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6151 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6152 elif(zipinfo
.create_system
==3):
6153 fwinattributes
= int(0);
6155 fmode
= int(zipinfo
.external_attr
);
6156 fchmode
= stat
.S_IMODE(fmode
);
6157 ftypemod
= stat
.S_IFMT(fmode
);
6158 except OverflowError:
6159 fmode
= int(zipinfo
.external_attr
>> 16);
6160 fchmode
= stat
.S_IMODE(fmode
);
6161 ftypemod
= stat
.S_IFMT(fmode
);
6163 fwinattributes
= int(0);
6164 if(not member
.is_dir()):
6165 fmode
= int(stat
.S_IFREG
+ 438);
6166 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
6167 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
6168 elif(member
.is_dir()):
6169 fmode
= int(stat
.S_IFDIR
+ 511);
6170 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6171 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6176 except AttributeError:
6182 except AttributeError:
6189 userinfo
= pwd
.getpwuid(os
.getuid());
6190 funame
= userinfo
.pw_name
;
6193 except AttributeError:
6201 groupinfo
= grp
.getgrgid(os
.getgid());
6202 fgname
= groupinfo
.gr_name
;
6205 except AttributeError:
6209 fcontents
= BytesIO();
6211 fcontents
.write(zipfp
.read(member
.filename
));
6212 fcontents
.seek(0, 0);
6213 ftypehex
= format(ftype
, 'x').lower();
6214 extrafields
= len(extradata
);
6215 extrafieldslist
= extradata
;
6216 catfextrafields
= extrafields
;
6217 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
6218 if(len(extradata
)>0):
6219 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6220 extrasizelen
= len(extrasizestr
);
6221 extrasizelenhex
= format(extrasizelen
, 'x').lower();
6222 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()];
6223 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6224 catoutlenhex
= format(catoutlen
, 'x').lower();
6225 catoutlist
.insert(0, catoutlenhex
);
6226 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
6227 catheaderdata
= catoutlist
;
6228 if(len(extradata
)>0):
6229 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6231 checksumlist
= [checksumtype
, "none"];
6233 checksumlist
= [checksumtype
, checksumtype
];
6234 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
6235 catfnumfields
= catoutlen
;
6236 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6237 fcontents
.seek(0, 0);
6239 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
6241 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
6242 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6243 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
6244 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
6245 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6246 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6247 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6248 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
6249 catfcontentstart
= fheadtell
;
6250 fheadtell
+= len(catfileoutstr
) + 1;
6251 catfcontentend
= fheadtell
- 1;
6252 catfhend
= catfcontentend
;
6253 fcontents
.seek(0, 0);
6254 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
6255 pyhascontents
= False;
6256 if(int(fsize
)>0 and not listonly
):
6257 pyhascontents
= True;
6258 if(int(fsize
)>0 and listonly
):
6259 fcontents
= BytesIO();
6260 pyhascontents
= False;
6261 fcontents
.seek(0, 0);
6262 if(not contentasfile
):
6263 fcontents
= fcontents
.read();
6264 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
, 'fcontentasfile': contentasfile
, 'fcontents': fcontents
});
6265 fileidnum
= fileidnum
+ 1;
6268 if(not rarfile_support
):
6269 def RarFileToArrayAlt(infile
, listonly
=False, contentasfile
=True, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6272 if(rarfile_support
):
6273 def RarFileToArrayAlt(infile
, listonly
=False, contentasfile
=True, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6274 formatspecs
= FormatSpecsListToDict(formatspecs
);
6280 inodetocatinode
= {};
6282 if(not os
.path
.exists(infile
,) or not os
.path
.isfile(infile
,)):
6284 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
6286 rarfp
= rarfile
.RarFile(infile
, "r");
6287 rartest
= rarfp
.testrar();
6289 VerbosePrintOut("Bad file found!");
6290 fnumfiles
= int(len(rarfp
.infolist()));
6291 catver
= formatspecs
['format_ver'];
6292 fileheaderver
= str(int(catver
.replace(".", "")));
6293 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
6294 catversion
= re
.findall(r
"([\d]+)", fileheader
);
6295 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
6296 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
6297 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
6298 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
6299 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
6300 fheadtell
= len(fileheader
);
6301 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
6302 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
6303 catfhstart
= fheadtell
;
6306 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
6309 member
.external_attr
6311 except AttributeError:
6313 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
6316 member
.external_attr
6318 except AttributeError:
6323 if(re
.findall(r
"^[.|/]", member
.filename
)):
6324 fname
= member
.filename
;
6326 fname
= "./"+member
.filename
;
6327 rarinfo
= rarfp
.getinfo(member
.filename
);
6329 VerbosePrintOut(fname
);
6330 if(is_unix
and member
.external_attr
!=0):
6331 fpremode
= int(member
.external_attr
);
6332 elif(member
.is_file()):
6333 fpremode
= stat
.S_IFREG
+ 438;
6334 elif(member
.is_symlink()):
6335 fpremode
= stat
.S_IFLNK
+ 438;
6336 elif(member
.is_dir()):
6337 fpremode
= stat
.S_IFDIR
+ 511;
6338 if(is_windows
and member
.external_attr
!=0):
6339 fwinattributes
= int(member
.external_attr
);
6341 fwinattributes
= int(0);
6346 if(member
.is_file()):
6348 elif(member
.is_symlink()):
6350 elif(member
.is_dir()):
6354 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
6355 fbasedir
= os
.path
.dirname(fname
);
6359 curfid
= curfid
+ 1;
6367 fsize
= member
.file_size
;
6370 fatime
= int(member
.atime
.timestamp());
6372 fatime
= int(member
.mtime
.timestamp());
6373 except AttributeError:
6374 fatime
= int(member
.mtime
.timestamp());
6375 fmtime
= int(member
.mtime
.timestamp());
6378 fctime
= int(member
.ctime
.timestamp());
6380 fctime
= int(member
.mtime
.timestamp());
6381 except AttributeError:
6382 fctime
= int(member
.mtime
.timestamp());
6383 fbtime
= int(member
.mtime
.timestamp());
6384 if(is_unix
and member
.external_attr
!=0):
6385 fmode
= int(member
.external_attr
);
6386 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
6387 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
6388 elif(member
.is_file()):
6389 fmode
= int(stat
.S_IFREG
+ 438)
6390 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
6391 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
6392 elif(member
.is_symlink()):
6393 fmode
= int(stat
.S_IFLNK
+ 438)
6394 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
6395 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
6396 elif(member
.is_dir()):
6397 fmode
= int(stat
.S_IFDIR
+ 511)
6398 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
6399 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
6402 except AttributeError:
6408 except AttributeError:
6415 userinfo
= pwd
.getpwuid(os
.getuid());
6416 funame
= userinfo
.pw_name
;
6419 except AttributeError:
6427 groupinfo
= grp
.getgrgid(os
.getgid());
6428 fgname
= groupinfo
.gr_name
;
6431 except AttributeError:
6435 fcontents
= BytesIO();
6437 fcontents
.write(rarfp
.read(member
.filename
));
6438 fcontents
.seek(0, 0);
6439 ftypehex
= format(ftype
, 'x').lower();
6440 extrafields
= len(extradata
);
6441 extrafieldslist
= extradata
;
6442 catfextrafields
= extrafields
;
6443 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
6444 if(len(extradata
)>0):
6445 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6446 extrasizelen
= len(extrasizestr
);
6447 extrasizelenhex
= format(extrasizelen
, 'x').lower();
6448 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()];
6449 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6450 catoutlenhex
= format(catoutlen
, 'x').lower();
6451 catoutlist
.insert(0, catoutlenhex
);
6452 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
6453 if(len(extradata
)>0):
6454 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6456 checksumlist
= [checksumtype
, "none"];
6458 checksumlist
= [checksumtype
, checksumtype
];
6459 ccatfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
6460 catfnumfields
= 24 + catfextrafields
;
6461 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6462 fcontents
.seek(0, 0);
6464 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
6466 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
6467 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6468 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
6469 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
6470 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6471 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6472 catheaderdata
= catoutlist
;
6473 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6474 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
6475 catfcontentstart
= fheadtell
;
6476 fheadtell
+= len(catfileoutstr
) + 1;
6477 catfcontentend
= fheadtell
- 1;
6478 catfhend
= catfcontentend
;
6479 fcontents
.seek(0, 0);
6480 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
6481 pyhascontents
= False;
6482 if(int(fsize
)>0 and not listonly
):
6483 pyhascontents
= True;
6484 if(int(fsize
)>0 and listonly
):
6485 fcontents
= BytesIO();
6486 pyhascontents
= False;
6487 fcontents
.seek(0, 0);
6488 if(not contentasfile
):
6489 fcontents
= fcontents
.read();
6490 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
, 'fcontentasfile': contentasfile
, 'fcontents': fcontents
});
6491 fileidnum
= fileidnum
+ 1;
6494 if(not py7zr_support
):
6495 def SevenZipFileToArrayAlt(infile
, listonly
=False, contentasfile
=True, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6499 def SevenZipFileToArrayAlt(infile
, listonly
=False, contentasfile
=True, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6500 formatspecs
= FormatSpecsListToDict(formatspecs
);
6506 inodetocatinode
= {};
6508 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
6509 file_content
= szpfp
.readall();
6510 #sztest = szpfp.testzip();
6511 sztestalt
= szpfp
.test();
6513 VerbosePrintOut("Bad file found!");
6514 numfiles
= int(len(szpfp
.list()));
6515 catver
= formatspecs
['format_ver'];
6516 fileheaderver
= str(int(catver
.replace(".", "")));
6517 fileheader
= AppendNullByte(formatspecs
['format_magic'] + fileheaderver
, formatspecs
['format_delimiter']);
6518 catversion
= re
.findall(r
"([\d]+)", fileheader
);
6519 catversions
= re
.search(r
'(.*?)(\d+)', fileheader
).groups();
6520 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
6521 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
['format_delimiter']);
6522 catfileheadercshex
= GetFileChecksum(fileheader
, checksumtype
, True, formatspecs
);
6523 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
['format_delimiter']);
6524 fheadtell
= len(fileheader
);
6525 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': []};
6526 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
6527 catfhstart
= fheadtell
;
6528 if(re
.findall(r
"^[.|/]", member
.filename
)):
6529 fname
= member
.filename
;
6531 fname
= "./"+member
.filename
;
6532 if(not member
.is_directory
):
6533 fpremode
= int(stat
.S_IFREG
+ 438);
6534 elif(member
.is_directory
):
6535 fpremode
= int(stat
.S_IFDIR
+ 511);
6536 fwinattributes
= int(0);
6541 if(member
.is_directory
):
6546 fbasedir
= os
.path
.dirname(fname
);
6550 curfid
= curfid
+ 1;
6557 fatime
= int(member
.creationtime
.timestamp());
6558 fmtime
= int(member
.creationtime
.timestamp());
6559 fctime
= int(member
.creationtime
.timestamp());
6560 fbtime
= int(member
.creationtime
.timestamp());
6561 if(member
.is_directory
):
6562 fmode
= int(stat
.S_IFDIR
+ 511)
6563 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
6564 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
6566 fmode
= int(stat
.S_IFLNK
+ 438)
6567 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
6568 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
6571 except AttributeError:
6577 except AttributeError:
6584 userinfo
= pwd
.getpwuid(os
.getuid());
6585 funame
= userinfo
.pw_name
;
6588 except AttributeError:
6596 groupinfo
= grp
.getgrgid(os
.getgid());
6597 fgname
= groupinfo
.gr_name
;
6600 except AttributeError:
6604 fcontents
= BytesIO();
6606 fcontents
.write(file_content
[member
.filename
].read());
6607 fsize
= format(fcontents
.tell(), 'x').lower();
6609 fcontents
.seek(0, 0);
6610 ftypehex
= format(ftype
, 'x').lower();
6611 extrafields
= len(extradata
);
6612 extrafieldslist
= extradata
;
6613 catfextrafields
= extrafields
;
6614 extrasizestr
= AppendNullByte(extrafields
, formatspecs
['format_delimiter']);
6615 if(len(extradata
)>0):
6616 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6617 extrasizelen
= len(extrasizestr
);
6618 extrasizelenhex
= format(extrasizelen
, 'x').lower();
6619 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()];
6620 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6621 catoutlenhex
= format(catoutlen
, 'x').lower();
6622 catoutlist
.insert(0, catoutlenhex
);
6623 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
['format_delimiter']);
6624 catheaderdata
= catoutlist
;
6625 if(len(extradata
)>0):
6626 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
['format_delimiter']);
6628 checksumlist
= [checksumtype
, "none"];
6630 checksumlist
= [checksumtype
, checksumtype
];
6631 catfileoutstr
= catfileoutstr
+ AppendNullBytes(checksumlist
, formatspecs
['format_delimiter']);
6632 catfnumfields
= 24 + catfextrafields
;
6633 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6634 fcontents
.seek(0, 0);
6636 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), "none", False, formatspecs
);
6638 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
6639 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6640 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
6641 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
['format_delimiter']) + catfileoutstr
;
6642 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6643 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
['format_delimiter']);
6644 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6645 nullstrecd
= formatspecs
['format_delimiter'].encode('UTF-8');
6646 catfcontentstart
= fheadtell
;
6647 fheadtell
+= len(catfileoutstr
) + 1;
6648 catfcontentend
= fheadtell
- 1;
6649 catfhend
= catfcontentend
;
6650 fcontents
.seek(0, 0);
6651 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
6652 pyhascontents
= False;
6653 if(int(fsize
)>0 and not listonly
):
6654 pyhascontents
= True;
6655 if(int(fsize
)>0 and listonly
):
6656 fcontents
= BytesIO();
6657 pyhascontents
= False;
6658 fcontents
.seek(0, 0);
6659 if(not contentasfile
):
6660 fcontents
= fcontents
.read();
6661 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
, 'fcontentasfile': contentasfile
, 'fcontents': fcontents
});
6662 fileidnum
= fileidnum
+ 1;
6665 def InFileToArrayAlt(infile
, listonly
=False, contentasfile
=True, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False):
6666 formatspecs
= FormatSpecsListToDict(formatspecs
);
6667 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
6668 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
6669 return TarFileToArrayAlt(infile
, listonly
, contentasfile
, checksumtype
, extradata
, formatspecs
, verbose
);
6670 elif(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
6671 return ZipFileToArrayAlt(infile
, listonly
, contentasfile
, checksumtype
, extradata
, formatspecs
, verbose
);
6672 elif(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
6673 return RarFileToArrayAlt(infile
, listonly
, contentasfile
, checksumtype
, extradata
, formatspecs
, verbose
);
6674 elif(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
6675 return SevenZipFileToArrayAlt(infile
, listonly
, contentasfile
, checksumtype
, extradata
, formatspecs
, verbose
);
6676 elif(checkcompressfile
=="catfile"):
6677 return ArchiveFileToArray(infile
, 0, 0, listonly
, contentasfile
, True, False, formatspecs
, False);
6682 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):
6683 formatspecs
= FormatSpecsListToDict(formatspecs
);
6684 outarray
= BytesIO();
6685 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6686 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, True, skipchecksum
, formatspecs
, returnfp
);
6687 return listcatfiles
;
6689 def ArchiveFileArrayToArrayIndex(inarray
, seekstart
=0, seekend
=0, listonly
=False, uncompress
=True, skipchecksum
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
6690 formatspecs
= FormatSpecsListToDict(formatspecs
);
6691 if(isinstance(inarray
, dict)):
6692 listcatfiles
= inarray
;
6695 if(not listcatfiles
):
6697 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': {}}}};
6699 catarray
.update({'catfp': listcatfiles
['catfp']});
6700 lenlist
= len(listcatfiles
['ffilelist']);
6702 lcfx
= int(listcatfiles
['fnumfiles']);
6703 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6704 lcfx
= int(lenlist
);
6706 lcfx
= int(listcatfiles
['fnumfiles']);
6708 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6709 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6710 catarray
['filetoid'].update(filetoidarray
);
6711 catarray
['idtofile'].update(idtofilearray
);
6712 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6713 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6714 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6715 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6716 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6717 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6718 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6719 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6720 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6721 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6722 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6723 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6724 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6725 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6726 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6727 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6728 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6729 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6730 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6731 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6732 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6733 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6734 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6735 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6736 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6737 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6738 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6739 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6740 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6741 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6742 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6746 create_alias_function("", __file_format_name__
, "ArrayToArrayIndex", ArchiveFileArrayToArrayIndex
);
6748 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):
6749 formatspecs
= FormatSpecsListToDict(formatspecs
);
6750 if(isinstance(infile
, dict)):
6751 listcatfiles
= infile
;
6753 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6754 infile
= RemoveWindowsPath(infile
);
6755 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
6756 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
6757 outfile
= RemoveWindowsPath(outfile
);
6758 checksumtype
= checksumtype
.lower();
6759 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
6760 checksumtype
="crc32";
6761 if(checksumtype
=="none"):
6763 if(not compression
or compression
=="catfile" or compression
==formatspecs
['format_lower']):
6764 compression
= "auto";
6765 if(compression
not in compressionlist
and compression
is None):
6766 compression
= "auto";
6768 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6769 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
6770 if(os
.path
.exists(outfile
)):
6773 except OSError as e
:
6775 if(not listcatfiles
):
6780 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6782 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6785 fbasename
= os
.path
.splitext(outfile
)[0];
6786 fextname
= os
.path
.splitext(outfile
)[1];
6787 if(not compresswholefile
and fextname
in outextlistwd
):
6788 compresswholefile
= True;
6789 catfp
= CompressOpenFile(outfile
, compresswholefile
, compressionlevel
);
6790 catver
= formatspecs
['format_ver'];
6791 fileheaderver
= str(int(catver
.replace(".", "")));
6792 lenlist
= len(listcatfiles
['ffilelist']);
6793 fnumfiles
= int(listcatfiles
['fnumfiles']);
6794 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
6795 fnumfiles
= lenlist
;
6796 AppendFileHeader(catfp
, fnumfiles
, checksumtype
, formatspecs
);
6797 lenlist
= len(listcatfiles
['ffilelist']);
6798 fnumfiles
= int(listcatfiles
['fnumfiles']);
6800 lcfx
= int(listcatfiles
['fnumfiles']);
6801 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6802 lcfx
= int(lenlist
);
6804 lcfx
= int(listcatfiles
['fnumfiles']);
6812 if(re
.findall(r
"^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
6813 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
6815 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
6817 VerbosePrintOut(fname
);
6818 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
6819 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
6820 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6821 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
6822 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
6823 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
6824 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
6825 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
6826 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
6827 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
6828 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
6829 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
6830 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
6831 finode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['finode']), 'x').lower();
6832 flinkcount
= format(int(listcatfiles
['ffilelist'][reallcfi
]['flinkcount']), 'x').lower();
6833 fwinattributes
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fwinattributes']), 'x').lower();
6834 fcompression
= listcatfiles
['ffilelist'][reallcfi
]['fcompression'];
6835 fcsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fcsize']), 'x').lower();
6836 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
6837 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
6838 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
6839 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
6840 fseeknextfile
= listcatfiles
['ffilelist'][reallcfi
]['fseeknextfile'];
6841 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
6842 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6843 if(not followlink
and len(extradata
)<0):
6844 extradata
= listcatfiles
['ffilelist'][reallcfi
]['fextralist'];
6845 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
6846 if(not listcatfiles
['ffilelist'][reallcfi
]['fcontentasfile']):
6847 fcontents
= BytesIO(fcontents
);
6849 fcsize
= format(int(0), 'x').lower();
6850 if(not compresswholefile
):
6851 fcontents
.seek(0, 2);
6852 ucfsize
= fcontents
.tell();
6853 fcontents
.seek(0, 0);
6854 if(compression
=="auto"):
6855 ilsize
= len(compressionlistalt
);
6858 while(ilmin
< ilsize
):
6859 cfcontents
= BytesIO();
6860 shutil
.copyfileobj(fcontents
, cfcontents
);
6861 fcontents
.seek(0, 0);
6862 cfcontents
.seek(0, 0);
6863 cfcontents
= CompressArchiveFile(cfcontents
, compressionlistalt
[ilmin
], compressionlevel
, formatspecs
);
6865 cfcontents
.seek(0, 2);
6866 ilcsize
.append(cfcontents
.tell());
6870 ilcsize
.append(sys
.maxint
);
6871 except AttributeError:
6872 ilcsize
.append(sys
.maxsize
);
6874 ilcmin
= ilcsize
.index(min(ilcsize
));
6875 compression
= compressionlistalt
[ilcmin
];
6876 fcontents
.seek(0, 0);
6877 cfcontents
= BytesIO();
6878 shutil
.copyfileobj(fcontents
, cfcontents
);
6879 cfcontents
.seek(0, 0);
6880 cfcontents
= CompressArchiveFile(cfcontents
, compression
, compressionlevel
, formatspecs
);
6881 cfcontents
.seek(0, 2);
6882 cfsize
= cfcontents
.tell();
6883 if(ucfsize
> cfsize
):
6884 fcsize
= format(int(cfsize
), 'x').lower();
6885 fcompression
= compression
;
6887 fcontents
= cfcontents
;
6889 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
6890 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6891 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6892 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6893 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
6894 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
6895 flinkname
= flinkinfo
['flinkname'];
6896 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
6897 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
6898 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
6899 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
6900 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
6901 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
6902 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
6903 funame
= flinkinfo
['funame'];
6904 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
6905 fgname
= flinkinfo
['fgname'];
6906 finode
= format(int(flinkinfo
['finode']), 'x').lower();
6907 flinkcount
= format(int(flinkinfo
['flinkcount']), 'x').lower();
6908 fwinattributes
= format(int(flinkinfo
['fwinattributes']), 'x').lower();
6909 fcompression
= flinkinfo
['fcompression'];
6910 fcsize
= format(int(flinkinfo
['fcsize']), 'x').lower();
6911 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
6912 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
6913 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
6914 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
6915 fseeknextfile
= flinkinfo
['fseeknextfile'];
6916 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
6917 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
6918 if(len(extradata
)<0):
6919 extradata
= flinkinfo
['fextralist'];
6920 fcontents
= flinkinfo
['fcontents'];
6921 if(not flinkinfo
['fcontentasfile']):
6922 fcontents
= BytesIO(fcontents
);
6923 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
6925 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
6926 fcurfid
= format(curfid
, 'x').lower();
6927 if(not followlink
and finode
!=0):
6928 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
6929 fcurinode
= format(int(curinode
), 'x').lower();
6930 inodetofile
.update({curinode
: fname
});
6931 filetoinode
.update({fname
: curinode
});
6932 curinode
= curinode
+ 1;
6934 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
6936 fcurinode
= format(int(curinode
), 'x').lower();
6937 curinode
= curinode
+ 1;
6938 curfid
= curfid
+ 1;
6939 if(fcompression
=="none"):
6941 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
];
6942 catfp
= AppendFileHeaderWithContent(catfp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
6945 reallcfi
= reallcfi
+ 1;
6947 catfp
.write(AppendNullBytes([0, 0], formatspecs
['format_delimiter']).encode("UTF-8"));
6948 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6949 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
6952 os
.fsync(catfp
.fileno());
6953 except io
.UnsupportedOperation
:
6955 except AttributeError:
6957 except OSError as e
:
6961 if(hasattr(sys
.stdout
, "buffer")):
6962 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
6964 shutil
.copyfileobj(catfp
, sys
.stdout
);
6965 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6966 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
6968 upload_file_to_internet_file(catfp
, outfile
);
6976 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
6978 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
6979 formatspecs
= FormatSpecsListToDict(formatspecs
);
6980 catfp
= BytesIO(catstr
);
6981 listcatfiles
= RePackArchiveFile(catfp
, compression
, compresswholefile
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6982 return listcatfiles
;
6984 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
6986 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):
6987 formatspecs
= FormatSpecsListToDict(formatspecs
);
6988 outarray
= BytesIO();
6989 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6990 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6991 return listcatfiles
;
6993 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
6995 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):
6996 formatspecs
= FormatSpecsListToDict(formatspecs
);
6997 if(outdir
is not None):
6998 outdir
= RemoveWindowsPath(outdir
);
7000 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7001 if(isinstance(infile
, dict)):
7002 listcatfiles
= infile
;
7004 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
7005 infile
= RemoveWindowsPath(infile
);
7006 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, True, skipchecksum
, formatspecs
, returnfp
);
7007 if(not listcatfiles
):
7009 lenlist
= len(listcatfiles
['ffilelist']);
7010 fnumfiles
= int(listcatfiles
['fnumfiles']);
7012 lcfx
= int(listcatfiles
['fnumfiles']);
7013 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
7014 lcfx
= int(lenlist
);
7016 lcfx
= int(listcatfiles
['fnumfiles']);
7022 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
7023 funame
= userinfo
.pw_name
;
7032 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
7033 fgname
= groupinfo
.gr_name
;
7039 VerbosePrintOut(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7040 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
7041 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
7042 if(not listcatfiles
['ffilelist'][lcfi
]['fcontentasfile']):
7043 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = BytesIO(listcatfiles
['ffilelist'][lcfi
]['fcontents']);
7044 listcatfiles
['ffilelist'][lcfi
]['fcontents'].seek(0, 0);
7045 shutil
.copyfileobj(listcatfiles
['ffilelist'][lcfi
]['fcontents'], fpc
);
7048 os
.fsync(fpc
.fileno());
7049 except io
.UnsupportedOperation
:
7051 except AttributeError:
7053 except OSError as e
:
7055 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
7056 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
7057 if(preservepermissions
):
7058 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7060 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
7061 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
7063 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7064 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
7065 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
7070 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
7071 funame
= userinfo
.pw_name
;
7080 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
7081 fgname
= groupinfo
.gr_name
;
7086 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
7087 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
7088 if(not flinkinfo
['fcontentasfile']):
7089 flinkinfo
['fcontents'] = BytesIO(flinkinfo
['fcontents']);
7090 flinkinfo
['fcontents'].seek(0, 0);
7091 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
7094 os
.fsync(fpc
.fileno());
7095 except io
.UnsupportedOperation
:
7097 except AttributeError:
7099 except OSError as e
:
7101 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7102 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7103 if(preservepermissions
):
7104 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7106 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7107 if(flinkinfo
['ftype']==1):
7108 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7109 if(flinkinfo
['ftype']==2):
7110 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7111 if(flinkinfo
['ftype']==5):
7112 if(preservepermissions
):
7113 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7115 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7116 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7117 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7118 if(preservepermissions
):
7119 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7121 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7122 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
7123 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7125 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7126 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
7128 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7129 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
7130 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
7135 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
7136 funame
= userinfo
.pw_name
;
7145 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
7146 fgname
= groupinfo
.gr_name
;
7151 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
7152 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
7153 if(not flinkinfo
['fcontentasfile']):
7154 flinkinfo
['fcontents'] = BytesIO(flinkinfo
['fcontents']);
7155 flinkinfo
['fcontents'].seek(0, 0);
7156 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
7159 os
.fsync(fpc
.fileno());
7160 except io
.UnsupportedOperation
:
7162 except AttributeError:
7164 except OSError as e
:
7166 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7167 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7168 if(preservepermissions
):
7169 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7171 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7172 if(flinkinfo
['ftype']==1):
7173 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7174 if(flinkinfo
['ftype']==2):
7175 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7176 if(flinkinfo
['ftype']==5):
7177 if(preservepermissions
):
7178 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7180 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7181 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7182 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7183 if(preservepermissions
):
7184 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7186 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7187 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
7188 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7190 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7191 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
7192 if(preservepermissions
):
7193 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7195 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7196 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
7197 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
7198 if(preservepermissions
):
7199 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7201 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
7202 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
7203 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7206 return listcatfiles
['ffilelist']['catfp'];
7210 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
7212 if(hasattr(shutil
, "register_unpack_format")):
7213 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
7214 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_dict__
['format_delimiter'], False, False);
7215 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
7217 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7218 formatspecs
= FormatSpecsListToDict(formatspecs
);
7219 catfp
= BytesIO(catstr
);
7220 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7221 return listcatfiles
;
7223 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
7225 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7226 formatspecs
= FormatSpecsListToDict(formatspecs
);
7227 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7228 if(isinstance(infile
, dict)):
7229 listcatfiles
= infile
;
7231 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
7232 infile
= RemoveWindowsPath(infile
);
7233 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, False, skipchecksum
, formatspecs
, returnfp
);
7234 if(not listcatfiles
):
7236 lenlist
= len(listcatfiles
['ffilelist']);
7237 fnumfiles
= int(listcatfiles
['fnumfiles']);
7239 lcfx
= int(listcatfiles
['fnumfiles']);
7240 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
7241 lcfx
= int(lenlist
);
7243 lcfx
= int(listcatfiles
['fnumfiles']);
7246 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
7248 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
7250 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' } };
7251 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
7252 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
7253 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7254 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
7255 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7256 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
7257 if(len(fuprint
)<=0):
7258 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
7259 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
7260 if(len(fgprint
)<=0):
7261 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
7262 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
));
7265 return listcatfiles
['catfp'];
7269 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
7271 def ArchiveFileStringListFiles(catstr
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7272 formatspecs
= FormatSpecsListToDict(formatspecs
);
7273 catfp
= BytesIO(catstr
);
7274 listcatfiles
= ArchiveFileListFiles(catstr
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7275 return listcatfiles
;
7277 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileStringListFiles
);
7279 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
7280 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7283 if(hasattr(sys
.stdin
, "buffer")):
7284 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7286 shutil
.copyfileobj(sys
.stdin
, infile
);
7291 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7292 infile
= download_file_from_internet_file(infile
);
7297 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7299 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
7301 if(not tarfile
.TarFileCheck(infile
)):
7303 except AttributeError:
7304 if(not TarFileCheck(infile
)):
7307 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
7308 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
7310 tarfp
= tarfile
.open(infile
, "r");
7311 except FileNotFoundError
:
7315 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
7316 returnval
.update({lcfi
: member
.name
});
7317 fpremode
= member
.mode
;
7318 ffullmode
= member
.mode
;
7322 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7324 elif(member
.isdev()):
7325 ffullmode
= member
.mode
;
7327 elif(member
.islnk()):
7328 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7330 elif(member
.issym()):
7331 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
7333 elif(member
.ischr()):
7334 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
7336 elif(member
.isblk()):
7337 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
7339 elif(member
.isdir()):
7340 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
7342 elif(member
.isfifo()):
7343 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
7345 elif(member
.issparse()):
7346 ffullmode
= member
.mode
;
7349 VerbosePrintOut(member
.name
);
7351 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' } };
7352 printfname
= member
.name
;
7354 printfname
= member
.name
+ " link to " + member
.linkname
;
7355 elif(member
.issym()):
7356 printfname
= member
.name
+ " -> " + member
.linkname
;
7357 fuprint
= member
.uname
;
7358 if(len(fuprint
)<=0):
7359 fuprint
= member
.uid
;
7360 fgprint
= member
.gname
;
7361 if(len(fgprint
)<=0):
7362 fgprint
= member
.gid
;
7363 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
));
7366 return listcatfiles
['catfp'];
7370 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7371 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7374 if(hasattr(sys
.stdin
, "buffer")):
7375 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7377 shutil
.copyfileobj(sys
.stdin
, infile
);
7382 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7383 infile
= download_file_from_internet_file(infile
);
7388 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7390 if(not zipfile
.is_zipfile(infile
)):
7393 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
7394 except FileNotFoundError
:
7395 print(6);return False;
7398 ziptest
= zipfp
.testzip();
7400 VerbosePrintOut("Bad file found!");
7401 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
7402 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
7403 fwinattributes
= int(zipinfo
.external_attr
);
7404 if(not member
.is_dir()):
7405 fmode
= int(stat
.S_IFREG
+ 438);
7406 fchmode
= int(stat
.S_IMODE(fmode
));
7407 ftypemod
= int(stat
.S_IFMT(fmode
));
7408 elif(member
.is_dir()):
7409 fmode
= int(stat
.S_IFDIR
+ 511);
7410 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7411 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7412 elif(zipinfo
.create_system
==3):
7413 fwinattributes
=int(0);
7415 fmode
= int(zipinfo
.external_attr
);
7416 fchmode
= stat
.S_IMODE(fmode
);
7417 ftypemod
= stat
.S_IFMT(fmode
);
7418 except OverflowError:
7419 fmode
= int(zipinfo
.external_attr
>> 16);
7420 fchmode
= stat
.S_IMODE(fmode
);
7421 ftypemod
= stat
.S_IFMT(fmode
);
7423 fwinattributes
= int(0);
7424 if(not member
.is_dir()):
7425 fmode
= int(stat
.S_IFREG
+ 438);
7426 fchmode
= int(stat
.S_IMODE(fmode
));
7427 ftypemod
= int(stat
.S_IFMT(fmode
));
7428 elif(member
.is_dir()):
7429 fmode
= int(stat
.S_IFDIR
+ 511);
7430 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7431 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7432 returnval
.update({lcfi
: member
.filename
});
7434 VerbosePrintOut(member
.filename
);
7436 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' } };
7438 for fmodval
in str(oct(fmode
))[-3:]:
7439 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7440 if(not member
.is_dir()):
7442 permissionstr
= "-" + permissionstr
;
7443 elif(member
.is_dir()):
7445 permissionstr
= "d" + permissionstr
;
7446 printfname
= member
.filename
;
7448 fuid
= int(os
.getuid());
7449 except AttributeError:
7454 fgid
= int(os
.getgid());
7455 except AttributeError:
7462 userinfo
= pwd
.getpwuid(os
.getuid());
7463 funame
= userinfo
.pw_name
;
7466 except AttributeError:
7474 groupinfo
= grp
.getgrgid(os
.getgid());
7475 fgname
= groupinfo
.gr_name
;
7478 except AttributeError:
7483 if(len(fuprint
)<=0):
7484 fuprint
= str(fuid
);
7486 if(len(fgprint
)<=0):
7487 fgprint
= str(fgid
);
7488 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
));
7491 return listcatfiles
['catfp'];
7495 if(not rarfile_support
):
7496 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7499 if(rarfile_support
):
7500 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7501 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7502 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7504 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
7508 rarfp
= rarfile
.RarFile(infile
, "r");
7509 rartest
= rarfp
.testrar();
7511 VerbosePrintOut("Bad file found!");
7512 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
7515 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
7518 member
.external_attr
7520 except AttributeError:
7522 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
7525 member
.external_attr
7527 except AttributeError:
7532 if(is_unix
and member
.external_attr
!=0):
7533 fpremode
= int(member
.external_attr
);
7534 elif(member
.is_file()):
7535 fpremode
= int(stat
.S_IFREG
+ 438);
7536 elif(member
.is_symlink()):
7537 fpremode
= int(stat
.S_IFLNK
+ 438);
7538 elif(member
.is_dir()):
7539 fpremode
= int(stat
.S_IFDIR
+ 511);
7540 if(is_windows
and member
.external_attr
!=0):
7541 fwinattributes
= int(member
.external_attr
);
7543 fwinattributes
= int(0);
7544 if(is_unix
and member
.external_attr
!=0):
7545 fmode
= int(member
.external_attr
);
7546 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
7547 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
7548 elif(member
.is_file()):
7549 fmode
= int(stat
.S_IFREG
+ 438);
7550 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
7551 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
7552 elif(member
.is_symlink()):
7553 fmode
= int(stat
.S_IFLNK
+ 438);
7554 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7555 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7556 elif(member
.is_dir()):
7557 fmode
= int(stat
.S_IFDIR
+ 511);
7558 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7559 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7560 returnval
.update({lcfi
: member
.filename
});
7562 VerbosePrintOut(member
.filename
);
7564 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' } };
7566 for fmodval
in str(oct(fmode
))[-3:]:
7567 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7568 if(member
.is_file()):
7570 permissionstr
= "-" + permissionstr
;
7571 printfname
= member
.filename
;
7572 elif(member
.is_symlink()):
7574 permissionstr
= "l" + permissionstr
;
7575 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
7576 elif(member
.is_dir()):
7578 permissionstr
= "d" + permissionstr
;
7579 printfname
= member
.filename
;
7581 fuid
= int(os
.getuid());
7582 except AttributeError:
7587 fgid
= int(os
.getgid());
7588 except AttributeError:
7595 userinfo
= pwd
.getpwuid(os
.getuid());
7596 funame
= userinfo
.pw_name
;
7599 except AttributeError:
7607 groupinfo
= grp
.getgrgid(os
.getgid());
7608 fgname
= groupinfo
.gr_name
;
7611 except AttributeError:
7616 if(len(fuprint
)<=0):
7617 fuprint
= str(fuid
);
7619 if(len(fgprint
)<=0):
7620 fgprint
= str(fgid
);
7621 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7624 return listcatfiles
['catfp'];
7628 if(not py7zr_support
):
7629 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7633 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7634 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7635 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7639 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
7640 file_content
= szpfp
.readall();
7641 #sztest = szpfp.testzip();
7642 sztestalt
= szpfp
.test();
7644 VerbosePrintOut("Bad file found!");
7645 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
7646 if(re
.findall(r
"^[.|/]", member
.filename
)):
7647 fname
= member
.filename
;
7649 fname
= "./"+member
.filename
;
7650 if(not member
.is_directory
):
7651 fpremode
= int(stat
.S_IFREG
+ 438);
7652 elif(member
.is_directory
):
7653 fpremode
= int(stat
.S_IFDIR
+ 511);
7654 fwinattributes
= int(0);
7655 if(member
.is_directory
):
7656 fmode
= int(stat
.S_IFDIR
+ 511);
7657 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7658 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7660 fmode
= int(stat
.S_IFLNK
+ 438);
7661 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7662 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7663 returnval
.update({lcfi
: member
.filename
});
7665 VerbosePrintOut(member
.filename
);
7667 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' } };
7669 for fmodval
in str(oct(fmode
))[-3:]:
7670 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7672 if(not member
.is_directory
):
7674 permissionstr
= "-" + permissionstr
;
7675 printfname
= member
.filename
;
7676 elif(member
.is_directory
):
7678 permissionstr
= "d" + permissionstr
;
7679 printfname
= member
.filename
;
7681 fsize
= len(file_content
[member
.filename
].read());
7682 file_content
[member
.filename
].close();
7684 fuid
= int(os
.getuid());
7685 except AttributeError:
7690 fgid
= int(os
.getgid());
7691 except AttributeError:
7698 userinfo
= pwd
.getpwuid(os
.getuid());
7699 funame
= userinfo
.pw_name
;
7702 except AttributeError:
7710 groupinfo
= grp
.getgrgid(os
.getgid());
7711 fgname
= groupinfo
.gr_name
;
7714 except AttributeError:
7719 if(len(fuprint
)<=0):
7720 fuprint
= str(fuid
);
7722 if(len(fgprint
)<=0):
7723 fgprint
= str(fgid
);
7724 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(fsize
).rjust(15) + " " + member
.creationtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7727 return listcatfiles
['catfp'];
7731 def InFileListFiles(infile
, verbose
=False, formatspecs
=__file_format_dict__
, returnfp
=False):
7732 formatspecs
= FormatSpecsListToDict(formatspecs
);
7733 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7734 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
7735 if(checkcompressfile
=="tarfile" and TarFileCheck(infile
)):
7736 return TarFileListFiles(infile
, verbose
, returnfp
);
7737 elif(checkcompressfile
=="zipfile" and zipfile
.is_zipfile(infile
)):
7738 return ZipFileListFiles(infile
, verbose
, returnfp
);
7739 elif(rarfile_support
and checkcompressfile
=="rarfile" and (rarfile
.is_rarfile(infile
) or rarfile
.is_rarfile_sfx(infile
))):
7740 return RarFileListFiles(infile
, verbose
, returnfp
);
7741 elif(py7zr_support
and checkcompressfile
=="7zipfile" and py7zr
.is_7zfile(infile
)):
7742 return SevenZipFileListFiles(infile
, verbose
, returnfp
);
7743 elif(checkcompressfile
=="catfile"):
7744 return ArchiveFileListFiles(infile
, 0, 0, False, formatspecs
, verbose
, returnfp
);
7749 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):
7750 formatspecs
= FormatSpecsListToDict(formatspecs
);
7751 outarray
= BytesIO();
7752 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
7753 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7754 return listcatfiles
;
7756 def ListDirListFilesAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, contentasfile
=True, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7757 formatspecs
= FormatSpecsListToDict(formatspecs
);
7758 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, contentasfile
, checksumtype
, formatspecs
, verbose
);
7759 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7760 return listcatfiles
;
7762 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):
7763 formatspecs
= FormatSpecsListToDict(formatspecs
);
7764 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, True, checksumtype
, extradata
, formatspecs
, False);
7765 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
7766 return listcatfiles
;
7768 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
7770 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7771 formatspecs
= FormatSpecsListToDict(formatspecs
);
7772 outarray
= TarFileToArrayAlt(infile
, False, True, checksumtype
, extradata
, formatspecs
, False);
7773 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7774 return listcatfiles
;
7776 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
7778 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7779 formatspecs
= FormatSpecsListToDict(formatspecs
);
7780 outarray
= ZipFileToArrayAlt(infile
, False, True, checksumtype
, extradata
, formatspecs
, False);
7781 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7782 return listcatfiles
;
7784 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
7786 if(not rarfile_support
):
7787 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7790 if(rarfile_support
):
7791 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7792 formatspecs
= FormatSpecsListToDict(formatspecs
);
7793 outarray
= RarFileToArrayAlt(infile
, False, True, checksumtype
, extradata
, formatspecs
, False);
7794 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7795 return listcatfiles
;
7797 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
7799 if(not py7zr_support
):
7800 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7804 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compresswholefile
=True, compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_dict__
, verbose
=False, returnfp
=False):
7805 formatspecs
= FormatSpecsListToDict(formatspecs
);
7806 outarray
= SevenZipFileToArrayAlt(infile
, False, True, checksumtype
, extradata
, formatspecs
, False);
7807 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compresswholefile
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7808 return listcatfiles
;
7810 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFileAlt", PackArchiveFileFromSevenZipFileAlt
);
7812 def download_file_from_ftp_file(url
):
7813 urlparts
= urlparse(url
);
7814 file_name
= os
.path
.basename(urlparts
.path
);
7815 file_dir
= os
.path
.dirname(urlparts
.path
);
7816 if(urlparts
.username
is not None):
7817 ftp_username
= urlparts
.username
;
7819 ftp_username
= "anonymous";
7820 if(urlparts
.password
is not None):
7821 ftp_password
= urlparts
.password
;
7822 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7823 ftp_password
= "anonymous";
7826 if(urlparts
.scheme
=="ftp"):
7828 elif(urlparts
.scheme
=="ftps" and ftpssl
):
7832 if(urlparts
.scheme
=="sftp"):
7834 return download_file_from_pysftp_file(url
);
7836 return download_file_from_sftp_file(url
);
7837 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7838 return download_file_from_http_file(url
);
7839 ftp_port
= urlparts
.port
;
7840 if(urlparts
.port
is None):
7843 ftp
.connect(urlparts
.hostname
, ftp_port
);
7844 except socket
.gaierror
:
7845 log
.info("Error With URL "+url
);
7847 except socket
.timeout
:
7848 log
.info("Error With URL "+url
);
7850 ftp
.login(urlparts
.username
, urlparts
.password
);
7851 if(urlparts
.scheme
=="ftps"):
7853 ftpfile
= BytesIO();
7854 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
7855 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
7860 def download_file_from_ftp_string(url
):
7861 ftpfile
= download_file_from_ftp_file(url
);
7862 return ftpfile
.read();
7864 def upload_file_to_ftp_file(ftpfile
, url
):
7865 urlparts
= urlparse(url
);
7866 file_name
= os
.path
.basename(urlparts
.path
);
7867 file_dir
= os
.path
.dirname(urlparts
.path
);
7868 if(urlparts
.username
is not None):
7869 ftp_username
= urlparts
.username
;
7871 ftp_username
= "anonymous";
7872 if(urlparts
.password
is not None):
7873 ftp_password
= urlparts
.password
;
7874 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7875 ftp_password
= "anonymous";
7878 if(urlparts
.scheme
=="ftp"):
7880 elif(urlparts
.scheme
=="ftps" and ftpssl
):
7884 if(urlparts
.scheme
=="sftp"):
7886 return upload_file_to_pysftp_file(url
);
7888 return upload_file_to_sftp_file(url
);
7889 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7891 ftp_port
= urlparts
.port
;
7892 if(urlparts
.port
is None):
7895 ftp
.connect(urlparts
.hostname
, ftp_port
);
7896 except socket
.gaierror
:
7897 log
.info("Error With URL "+url
);
7899 except socket
.timeout
:
7900 log
.info("Error With URL "+url
);
7902 ftp
.login(urlparts
.username
, urlparts
.password
);
7903 if(urlparts
.scheme
=="ftps"):
7905 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
7910 def upload_file_to_ftp_string(ftpstring
, url
):
7911 ftpfileo
= BytesIO(ftpstring
);
7912 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
7916 class RawIteratorWrapper
:
7917 def __init__(self
, iterator
):
7918 self
.iterator
= iterator
;
7920 self
._iterator
_exhausted
= False;
7921 def read(self
, size
=-1):
7922 if self
._iterator
_exhausted
:
7924 while size
< 0 or len(self
.buffer) < size
:
7926 chunk
= next(self
.iterator
);
7927 self
.buffer += chunk
;
7928 except StopIteration:
7929 self
._iterator
_exhausted
= True;
7932 size
= len(self
.buffer);
7933 result
, self
.buffer = self
.buffer[:size
], self
.buffer[size
:];
7936 def download_file_from_http_file(url
, headers
=None, usehttp
=__use_http_lib__
):
7939 # Parse the URL to extract username and password if present
7940 urlparts
= urlparse(url
);
7941 username
= urlparts
.username
;
7942 password
= urlparts
.password
;
7943 # Rebuild the URL without the username and password
7944 netloc
= urlparts
.hostname
;
7945 if urlparts
.scheme
== "sftp":
7947 return download_file_from_pysftp_file(url
);
7949 return download_file_from_sftp_file(url
);
7950 elif urlparts
.scheme
== "ftp" or urlparts
.scheme
== "ftps":
7951 return download_file_from_ftp_file(url
);
7953 netloc
+= ':' + str(urlparts
.port
);
7954 rebuilt_url
= urlunparse((urlparts
.scheme
, netloc
, urlparts
.path
, urlparts
.params
, urlparts
.query
, urlparts
.fragment
));
7955 # Create a temporary file object
7956 httpfile
= BytesIO();
7957 if usehttp
== 'requests' and haverequests
:
7958 # Use the requests library if selected and available
7959 if username
and password
:
7960 response
= requests
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
), stream
=True);
7962 response
= requests
.get(rebuilt_url
, headers
=headers
, stream
=True);
7963 response
.raw
.decode_content
= True
7964 shutil
.copyfileobj(response
.raw
, httpfile
);
7965 elif usehttp
== 'httpx' and havehttpx
:
7966 # Use httpx if selected and available
7967 with httpx
.Client(follow_redirects
=True) as client
:
7968 if username
and password
:
7969 response
= client
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
));
7971 response
= client
.get(rebuilt_url
, headers
=headers
);
7972 raw_wrapper
= RawIteratorWrapper(response
.iter_bytes());
7973 shutil
.copyfileobj(raw_wrapper
, httpfile
);
7975 # Use urllib as a fallback
7976 # Build a Request object for urllib
7977 request
= Request(rebuilt_url
, headers
=headers
);
7978 # Create an opener object for handling URLs
7979 if username
and password
:
7980 # Create a password manager
7981 password_mgr
= HTTPPasswordMgrWithDefaultRealm();
7982 # Add the username and password
7983 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
7984 # Create an authentication handler using the password manager
7985 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
7986 # Build the opener with the authentication handler
7987 opener
= build_opener(auth_handler
);
7989 opener
= build_opener();
7990 response
= opener
.open(request
);
7991 shutil
.copyfileobj(response
, httpfile
);
7992 # Reset file pointer to the start
7993 httpfile
.seek(0, 0);
7994 # Return the temporary file object
7997 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
, usehttp
=__use_http_lib__
):
7998 httpfile
= download_file_from_http_file(url
, headers
, usehttp
);
7999 return ftpfile
.read();
8002 def download_file_from_sftp_file(url
):
8003 urlparts
= urlparse(url
);
8004 file_name
= os
.path
.basename(urlparts
.path
);
8005 file_dir
= os
.path
.dirname(urlparts
.path
);
8006 sftp_port
= urlparts
.port
;
8007 if(urlparts
.port
is None):
8010 sftp_port
= urlparts
.port
;
8011 if(urlparts
.username
is not None):
8012 sftp_username
= urlparts
.username
;
8014 sftp_username
= "anonymous";
8015 if(urlparts
.password
is not None):
8016 sftp_password
= urlparts
.password
;
8017 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8018 sftp_password
= "anonymous";
8021 if(urlparts
.scheme
=="ftp"):
8022 return download_file_from_ftp_file(url
);
8023 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8024 return download_file_from_http_file(url
);
8025 if(urlparts
.scheme
!="sftp"):
8027 ssh
= paramiko
.SSHClient();
8028 ssh
.load_system_host_keys();
8029 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
8031 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8032 except paramiko
.ssh_exception
.SSHException
:
8034 except socket
.gaierror
:
8035 log
.info("Error With URL "+url
);
8037 except socket
.timeout
:
8038 log
.info("Error With URL "+url
);
8040 sftp
= ssh
.open_sftp();
8041 sftpfile
= BytesIO();
8042 sftp
.getfo(urlparts
.path
, sftpfile
);
8045 sftpfile
.seek(0, 0);
8048 def download_file_from_sftp_file(url
):
8052 def download_file_from_sftp_string(url
):
8053 sftpfile
= download_file_from_sftp_file(url
);
8054 return sftpfile
.read();
8056 def download_file_from_ftp_string(url
):
8060 def upload_file_to_sftp_file(sftpfile
, url
):
8061 urlparts
= urlparse(url
);
8062 file_name
= os
.path
.basename(urlparts
.path
);
8063 file_dir
= os
.path
.dirname(urlparts
.path
);
8064 sftp_port
= urlparts
.port
;
8065 if(urlparts
.port
is None):
8068 sftp_port
= urlparts
.port
;
8069 if(urlparts
.username
is not None):
8070 sftp_username
= urlparts
.username
;
8072 sftp_username
= "anonymous";
8073 if(urlparts
.password
is not None):
8074 sftp_password
= urlparts
.password
;
8075 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8076 sftp_password
= "anonymous";
8079 if(urlparts
.scheme
=="ftp"):
8080 return upload_file_to_ftp_file(url
);
8081 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8083 if(urlparts
.scheme
!="sftp"):
8085 ssh
= paramiko
.SSHClient();
8086 ssh
.load_system_host_keys();
8087 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
8089 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8090 except paramiko
.ssh_exception
.SSHException
:
8092 except socket
.gaierror
:
8093 log
.info("Error With URL "+url
);
8095 except socket
.timeout
:
8096 log
.info("Error With URL "+url
);
8098 sftp
= ssh
.open_sftp();
8099 sftp
.putfo(sftpfile
, urlparts
.path
);
8102 sftpfile
.seek(0, 0);
8105 def upload_file_to_sftp_file(sftpfile
, url
):
8109 def upload_file_to_sftp_string(sftpstring
, url
):
8110 sftpfileo
= BytesIO(sftpstring
);
8111 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
8115 def upload_file_to_sftp_string(url
):
8119 def download_file_from_pysftp_file(url
):
8120 urlparts
= urlparse(url
);
8121 file_name
= os
.path
.basename(urlparts
.path
);
8122 file_dir
= os
.path
.dirname(urlparts
.path
);
8123 sftp_port
= urlparts
.port
;
8124 if(urlparts
.port
is None):
8127 sftp_port
= urlparts
.port
;
8128 if(urlparts
.username
is not None):
8129 sftp_username
= urlparts
.username
;
8131 sftp_username
= "anonymous";
8132 if(urlparts
.password
is not None):
8133 sftp_password
= urlparts
.password
;
8134 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8135 sftp_password
= "anonymous";
8138 if(urlparts
.scheme
=="ftp"):
8139 return download_file_from_ftp_file(url
);
8140 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8141 return download_file_from_http_file(url
);
8142 if(urlparts
.scheme
!="sftp"):
8145 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8146 except paramiko
.ssh_exception
.SSHException
:
8148 except socket
.gaierror
:
8149 log
.info("Error With URL "+url
);
8151 except socket
.timeout
:
8152 log
.info("Error With URL "+url
);
8154 sftp
= ssh
.open_sftp();
8155 sftpfile
= BytesIO();
8156 sftp
.getfo(urlparts
.path
, sftpfile
);
8159 sftpfile
.seek(0, 0);
8162 def download_file_from_pysftp_file(url
):
8166 def download_file_from_pysftp_string(url
):
8167 sftpfile
= download_file_from_pysftp_file(url
);
8168 return sftpfile
.read();
8170 def download_file_from_ftp_string(url
):
8174 def upload_file_to_pysftp_file(sftpfile
, url
):
8175 urlparts
= urlparse(url
);
8176 file_name
= os
.path
.basename(urlparts
.path
);
8177 file_dir
= os
.path
.dirname(urlparts
.path
);
8178 sftp_port
= urlparts
.port
;
8179 if(urlparts
.port
is None):
8182 sftp_port
= urlparts
.port
;
8183 if(urlparts
.username
is not None):
8184 sftp_username
= urlparts
.username
;
8186 sftp_username
= "anonymous";
8187 if(urlparts
.password
is not None):
8188 sftp_password
= urlparts
.password
;
8189 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8190 sftp_password
= "anonymous";
8193 if(urlparts
.scheme
=="ftp"):
8194 return upload_file_to_ftp_file(url
);
8195 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8197 if(urlparts
.scheme
!="sftp"):
8200 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8201 except paramiko
.ssh_exception
.SSHException
:
8203 except socket
.gaierror
:
8204 log
.info("Error With URL "+url
);
8206 except socket
.timeout
:
8207 log
.info("Error With URL "+url
);
8209 sftp
= ssh
.open_sftp();
8210 sftp
.putfo(sftpfile
, urlparts
.path
);
8213 sftpfile
.seek(0, 0);
8216 def upload_file_to_pysftp_file(sftpfile
, url
):
8220 def upload_file_to_pysftp_string(sftpstring
, url
):
8221 sftpfileo
= BytesIO(sftpstring
);
8222 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
8226 def upload_file_to_pysftp_string(url
):
8229 def download_file_from_internet_file(url
, headers
=geturls_headers_pycatfile_python_alt
, usehttp
=__use_http_lib__
):
8230 urlparts
= urlparse(url
);
8231 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8232 return download_file_from_http_file(url
, headers
, usehttp
);
8233 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8234 return download_file_from_ftp_file(url
);
8235 elif(urlparts
.scheme
=="sftp"):
8236 if(__use_pysftp__
and havepysftp
):
8237 return download_file_from_pysftp_file(url
);
8239 return download_file_from_sftp_file(url
);
8244 def download_file_from_internet_uncompress_file(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_dict__
):
8245 formatspecs
= FormatSpecsListToDict(formatspecs
);
8246 fp
= download_file_from_internet_file(url
);
8247 fp
= UncompressArchiveFile(fp
, formatspecs
);
8253 def download_file_from_internet_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
8254 urlparts
= urlparse(url
);
8255 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8256 return download_file_from_http_string(url
, headers
);
8257 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8258 return download_file_from_ftp_string(url
);
8259 elif(urlparts
.scheme
=="sftp"):
8260 if(__use_pysftp__
and havepysftp
):
8261 return download_file_from_pysftp_string(url
);
8263 return download_file_from_sftp_string(url
);
8268 def download_file_from_internet_uncompress_string(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_dict__
):
8269 formatspecs
= FormatSpecsListToDict(formatspecs
);
8270 fp
= download_file_from_internet_string(url
);
8271 fp
= UncompressArchiveFile(fp
, formatspecs
);
8277 def upload_file_to_internet_file(ifp
, url
):
8278 urlparts
= urlparse(url
);
8279 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8281 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8282 return upload_file_to_ftp_file(ifp
, url
);
8283 elif(urlparts
.scheme
=="sftp"):
8284 if(__use_pysftp__
and havepysftp
):
8285 return upload_file_to_pysftp_file(ifp
, url
);
8287 return upload_file_to_sftp_file(ifp
, url
);
8292 def upload_file_to_internet_compress_file(ifp
, url
, formatspecs
=__file_format_dict__
):
8293 formatspecs
= FormatSpecsListToDict(formatspecs
);
8294 catfp
= CompressArchiveFile(catfp
, compression
, compressionlevel
, formatspecs
);
8298 upload_file_to_internet_file(catfp
, outfile
);
8301 def upload_file_to_internet_string(ifp
, url
):
8302 urlparts
= urlparse(url
);
8303 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8305 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8306 return upload_file_to_ftp_string(ifp
, url
);
8307 elif(urlparts
.scheme
=="sftp"):
8308 if(__use_pysftp__
and havepysftp
):
8309 return upload_file_to_pysftp_string(ifp
, url
);
8311 return upload_file_to_sftp_string(ifp
, url
);
8316 def upload_file_to_internet_compress_string(ifp
, url
, formatspecs
=__file_format_dict__
):
8317 formatspecs
= FormatSpecsListToDict(formatspecs
);
8318 catfp
= CompressArchiveFile(BytesIO(ifp
), compression
, compressionlevel
, formatspecs
);
8322 upload_file_to_internet_file(catfp
, outfile
);
8326 if(hasattr(shutil
, "register_archive_format")):
8327 # Register the packing format
8328 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
8329 except shutil
.RegistryError
:
8333 if(hasattr(shutil
, "register_unpack_format")):
8334 # Register the unpacking format
8335 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
8336 except shutil
.RegistryError
: