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: 4/24/2024 Ver. 0.8.2 RC 1 - Author: cooldude2k $
20 from __future__
import absolute_import
, division
, print_function
, unicode_literals
;
21 import io
, os
, re
, sys
, time
, stat
, zlib
, base64
, shutil
, socket
, hashlib
, datetime
, logging
, binascii
, tempfile
, zipfile
, platform
;
22 from ftplib
import FTP
, FTP_TLS
;
23 if(sys
.version
[0]=="2"):
24 from urlparse
import urlparse
, urlunparse
;
25 elif(sys
.version
[0]>="3"):
26 from urllib
.parse
import urlunparse
;
27 from urllib
.parse
import urlparse
;
29 if os
.name
== 'nt': # Only modify if on Windows
30 if sys
.version
[0] == "2":
32 sys
.stdout
= codecs
.getwriter('utf-8')(sys
.stdout
);
33 sys
.stderr
= codecs
.getwriter('utf-8')(sys
.stderr
);
36 sys
.stdout
= io
.TextIOWrapper(sys
.stdout
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
37 sys
.stderr
= io
.TextIOWrapper(sys
.stderr
.buffer, encoding
='utf-8', errors
='replace', line_buffering
=True);
39 hashlib_guaranteed
= False;
40 os
.environ
["PYTHONIOENCODING"] = "UTF-8";
41 os
.environ
["LC_CTYPE"] = "UTF-8";
45 sys
.setdefaultencoding('UTF-8');
48 except AttributeError:
52 except AttributeError:
56 from zlib
import crc32
;
58 from binascii
import crc32
;
60 rarfile_support
= False;
63 rarfile_support
= True;
65 rarfile_support
= False;
67 py7zr_support
= False;
72 py7zr_support
= False;
75 from safetar
import is_tarfile
;
78 from xtarfile
import is_tarfile
;
80 from tarfile
import is_tarfile
;
83 import safetar
as tarfile
;
86 import xtarfile
as tarfile
;
104 haverequests
= False;
109 haverequests
= False;
113 logging
.getLogger("urllib3").setLevel(logging
.WARNING
);
117 from urllib
.request
import Request
, build_opener
, HTTPBasicAuthHandler
;
118 from urllib
.parse
import urlparse
;
121 from urllib2
import Request
, build_opener
, HTTPBasicAuthHandler
;
122 from urlparse
import urlparse
;
124 if(sys
.version
[0]=="2"):
126 from io
import StringIO
, BytesIO
;
129 from cStringIO
import StringIO
;
130 from cStringIO
import StringIO
as BytesIO
;
132 from StringIO
import StringIO
;
133 from StringIO
import StringIO
as BytesIO
;
134 elif(sys
.version
[0]>="3"):
135 from io
import StringIO
, BytesIO
;
140 from cStringIO
import StringIO
as BytesIO
;
146 from StringIO
import StringIO
as BytesIO
;
152 from io
import BytesIO
;
157 __use_pysftp__
= False;
159 __use_pysftp__
= False;
160 __file_format_name__
= "CatFile";
161 __program_name__
= "Py"+__file_format_name__
;
162 __file_format_lower__
= __file_format_name__
.lower();
163 __file_format_magic__
= __file_format_name__
;
164 __file_format_len__
= len(__file_format_magic__
);
165 __file_format_hex__
= binascii
.hexlify(__file_format_magic__
.encode("UTF-8")).decode("UTF-8");
166 __file_format_delimiter__
= "\x00";
167 __file_format_ver__
= "001";
168 __use_new_style__
= True;
169 __use_advanced_list__
= True;
170 __use_alt_inode__
= False;
171 __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__
];
172 __project__
= __program_name__
;
173 __project_url__
= "https://github.com/GameMaker2k/PyCatFile";
174 __version_info__
= (0, 8, 2, "RC 1", 1);
175 __version_date_info__
= (2024, 4, 24, "RC 1", 1);
176 __version_date__
= str(__version_date_info__
[0]) + "." + str(__version_date_info__
[1]).zfill(2) + "." + str(__version_date_info__
[2]).zfill(2);
177 __revision__
= __version_info__
[3];
178 __revision_id__
= "$Id$";
179 if(__version_info__
[4] is not None):
180 __version_date_plusrc__
= __version_date__
+ "-" + str(__version_date_info__
[4]);
181 if(__version_info__
[4] is None):
182 __version_date_plusrc__
= __version_date__
;
183 if(__version_info__
[3] is not None):
184 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]) + " " + str(__version_info__
[3]);
185 if(__version_info__
[3] is None):
186 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]);
188 PyBitness
= platform
.architecture();
189 if(PyBitness
=="32bit" or PyBitness
=="32"):
191 elif(PyBitness
=="64bit" or PyBitness
=="64"):
196 geturls_ua_pycatfile_python
= "Mozilla/5.0 (compatible; {proname}/{prover}; +{prourl})".format(proname
=__project__
, prover
=__version__
, prourl
=__project_url__
);
197 if(platform
.python_implementation()!=""):
198 py_implementation
= platform
.python_implementation();
199 if(platform
.python_implementation()==""):
200 py_implementation
= "Python";
201 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__
);
202 geturls_ua_googlebot_google
= "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
203 geturls_ua_googlebot_google_old
= "Googlebot/2.1 (+http://www.google.com/bot.html)";
204 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
)};
205 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
)};
206 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"};
207 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"};
209 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
210 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
211 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
213 tarfile_mimetype
= "application/tar";
214 tarfile_tar_mimetype
= tarfile_mimetype
;
215 zipfile_mimetype
= "application/zip";
216 zipfile_zip_mimetype
= zipfile_mimetype
;
217 rarfile_mimetype
= "application/rar";
218 rarfile_rar_mimetype
= rarfile_mimetype
;
219 sevenzipfile_mimetype
= "application/x-7z-compressed";
220 sevenzipfile_7z_mimetype
= sevenzipfile_mimetype
;
221 sevenzipfile_7zip_mimetype
= sevenzipfile_mimetype
;
222 archivefile_mimetype
= "application/x-"+__file_format_list__
[1]+"";
223 archivefile_cat_mimetype
= archivefile_mimetype
;
224 archivefile_gzip_mimetype
= "application/x-"+__file_format_list__
[1]+"+gzip";
225 archivefile_gz_mimetype
= archivefile_gzip_mimetype
;
226 archivefile_bzip2_mimetype
= "application/x-"+__file_format_list__
[1]+"+bzip2";
227 archivefile_bz2_mimetype
= archivefile_bzip2_mimetype
;
228 archivefile_lz4_mimetype
= "application/x-"+__file_format_list__
[1]+"+lz4";
229 archivefile_lzop_mimetype
= "application/x-"+__file_format_list__
[1]+"+lzop";
230 archivefile_lzo_mimetype
= archivefile_lzop_mimetype
;
231 archivefile_zstandard_mimetype
= "application/x-"+__file_format_list__
[1]+"+zstandard";
232 archivefile_zstd_mimetype
= archivefile_zstandard_mimetype
;
233 archivefile_lzma_mimetype
= "application/x-"+__file_format_list__
[1]+"+lzma";
234 archivefile_xz_mimetype
= "application/x-"+__file_format_list__
[1]+"+xz";
235 archivefile_extensions
= ['.cat', '.cat.gz', '.cat.bz2', '.cat.zst', '.cat.lz4', '.cat.lzo', '.cat.lzop', '.cat.lzma', '.cat.xz'];
237 if __name__
== "__main__":
239 curscrpath
= os
.path
.dirname(sys
.argv
[0]);
243 curscrpath
= curscrpath
.replace(os
.sep
, "/");
244 curscrpath
= curscrpath
+ "/";
245 scrfile
= curscrpath
+ "catfile.py";
246 if(os
.path
.exists(scrfile
) and os
.path
.isfile(scrfile
)):
247 scrcmd
= subprocess
.Popen([sys
.executable
, scrfile
] + sys
.argv
[1:]);
250 def VerbosePrintOut(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
256 "warning": logging
.warning
,
257 "error": logging
.error
,
258 "critical": logging
.critical
,
259 "exception": logging
.exception
,
260 "logalt": lambda x
: logging
.log(dgblevel
, x
),
261 "debug": logging
.debug
263 log_function
= log_functions
.get(outtype
);
265 log_function(dbgtxt
);
269 def VerbosePrintOutReturn(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
270 VerbosePrintOut(dbgtxt
, outtype
, dbgenable
, dgblevel
);
273 def RemoveWindowsPath(dpath
):
277 dpath
= dpath
.replace(os
.path
.sep
, "/");
278 dpath
= dpath
.rstrip("/");
279 if(dpath
=="." or dpath
==".."):
283 def NormalizeRelativePath(inpath
):
284 inpath
= RemoveWindowsPath(inpath
);
285 if(os
.path
.isabs(inpath
)):
288 if(inpath
.startswith("./") or inpath
.startswith("../")):
291 outpath
= "./" + inpath
;
294 def PrependPath(base_dir
, child_path
):
295 # Check if base_dir is None or empty, if so, return child_path as is
298 # Ensure base_dir ends with exactly one slash
299 if not base_dir
.endswith('/'):
301 # Check if child_path starts with ./ or ../ (indicating a relative path)
302 if child_path
.startswith('./') or child_path
.startswith('../'):
303 # For relative paths, we don't alter the child_path
304 return base_dir
+ child_path
;
306 # For non-relative paths, ensure there's no starting slash on child_path to avoid double slashes
307 return base_dir
+ child_path
.lstrip('/');
309 def ListDir(dirpath
, followlink
=False, duplicates
=False):
310 if(isinstance(dirpath
, (list, tuple, ))):
311 dirpath
= list(filter(None, dirpath
));
312 elif(isinstance(dirpath
, (str, ))):
313 dirpath
= list(filter(None, [dirpath
]));
315 for mydirfile
in dirpath
:
316 if(not os
.path
.exists(mydirfile
)):
318 mydirfile
= NormalizeRelativePath(mydirfile
);
319 if(os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
)):
320 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
321 if(os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
)):
322 for root
, dirs
, filenames
in os
.walk(mydirfile
):
324 dpath
= RemoveWindowsPath(dpath
);
325 if(dpath
not in retlist
and not duplicates
):
326 retlist
.append(dpath
);
328 retlist
.append(dpath
);
329 for file in filenames
:
330 fpath
= os
.path
.join(root
, file);
331 fpath
= RemoveWindowsPath(fpath
);
332 if(fpath
not in retlist
and not duplicates
):
333 retlist
.append(fpath
);
335 retlist
.append(fpath
);
337 retlist
.append(RemoveWindowsPath(mydirfile
));
340 def ListDirAdvanced(dirpath
, followlink
=False, duplicates
=False):
341 if isinstance(dirpath
, (list, tuple)):
342 dirpath
= list(filter(None, dirpath
));
343 elif isinstance(dirpath
, str):
344 dirpath
= list(filter(None, [dirpath
]));
346 for mydirfile
in dirpath
:
347 if not os
.path
.exists(mydirfile
):
349 mydirfile
= NormalizeRelativePath(mydirfile
);
350 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
) and followlink
:
351 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
))
352 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
353 for root
, dirs
, filenames
in os
.walk(mydirfile
):
354 # Sort dirs and filenames alphabetically in place
355 dirs
.sort(key
=lambda x
: x
.lower());
356 filenames
.sort(key
=lambda x
: x
.lower());
357 dpath
= RemoveWindowsPath(root
);
358 if not duplicates
and dpath
not in retlist
:
359 retlist
.append(dpath
);
361 retlist
.append(dpath
);
362 for file in filenames
:
363 fpath
= os
.path
.join(root
, file);
364 fpath
= RemoveWindowsPath(fpath
);
365 if not duplicates
and fpath
not in retlist
:
366 retlist
.append(fpath
);
368 retlist
.append(fpath
);
370 retlist
.append(RemoveWindowsPath(mydirfile
));
373 def create_alias_function(prefix
, base_name
, suffix
, target_function
):
374 # Define a new function that wraps the target function
375 def alias_function(*args
, **kwargs
):
376 return target_function(*args
, **kwargs
);
378 # Create the function name by combining the prefix, base name, and the suffix
379 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
);
381 # Add the new function to the global namespace
382 globals()[function_name
] = alias_function
;
384 def create_alias_function_alt(prefix
, base_name
, suffix
, target_function
):
385 # Create the function name by combining the prefix, base name, and the suffix
386 # Use the format method for string formatting, compatible with Python 2 and 3
387 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
)
388 # Add the new function (alias of the target_function) to the global namespace
389 # This line is compatible as-is with both Python 2 and 3
390 globals()[function_name
] = target_function
392 # initial_value can be 0xFFFF or 0x0000
393 def crc16_ansi(msg
, initial_value
=0xFFFF):
394 # CRC-16-IBM / CRC-16-ANSI polynomial and initial value
395 poly
= 0x8005; # Polynomial for CRC-16-IBM / CRC-16-ANSI
396 crc
= initial_value
; # Initial value
398 crc ^
= b
<< 8; # XOR byte into CRC top byte
399 for _
in range(8): # Process each bit
400 if crc
& 0x8000: # If the top bit is set
401 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
403 crc
= crc
<< 1; # Just shift left
404 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
407 # initial_value can be 0xFFFF or 0x0000
408 def crc16_ibm(msg
, initial_value
=0xFFFF):
409 return crc16_ansi(msg
, initial_value
);
411 # initial_value is 0xFFFF
413 return crc16_ansi(msg
, 0xFFFF);
415 # initial_value can be 0xFFFF, 0x1D0F or 0x0000
416 def crc16_ccitt(msg
, initial_value
=0xFFFF):
417 # CRC-16-CCITT polynomial
418 poly
= 0x1021; # Polynomial for CRC-16-CCITT
419 # Use the specified initial value
422 crc ^
= b
<< 8; # XOR byte into CRC top byte
423 for _
in range(8): # Process each bit
424 if crc
& 0x8000: # If the top bit is set
425 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
427 crc
= crc
<< 1; # Just shift left
428 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
431 # initial_value can be 0x42F0E1EBA9EA3693 or 0x0000000000000000
432 def crc64_ecma(msg
, initial_value
=0x0000000000000000):
433 # CRC-64-ECMA polynomial and initial value
434 poly
= 0x42F0E1EBA9EA3693;
435 crc
= initial_value
; # Initial value for CRC-64-ECMA
437 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
438 for _
in range(8): # Process each bit
439 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
440 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
442 crc
<<= 1; # Just shift left if the MSB is 0
443 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
446 # initial_value can be 0x000000000000001B or 0xFFFFFFFFFFFFFFFF
447 def crc64_iso(msg
, initial_value
=0xFFFFFFFFFFFFFFFF):
448 # CRC-64-ISO polynomial and initial value
449 poly
= 0x000000000000001B;
450 crc
= initial_value
; # Common initial value for CRC-64-ISO
452 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
453 for _
in range(8): # Process each bit
454 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
455 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
457 crc
<<= 1; # Just shift left if the MSB is 0
458 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
461 def GetDataFromArray(data
, path
, default
=None):
465 element
= element
[key
];
467 except (KeyError, TypeError, IndexError):
470 def GetDataFromArrayAlt(structure
, path
, default
=None):
473 if isinstance(element
, dict) and key
in element
:
474 element
= element
[key
];
475 elif isinstance(element
, list) and isinstance(key
, int) and -len(element
) <= key
< len(element
):
476 element
= element
[key
];
481 def GetHeaderChecksum(inlist
=[], checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_list__
):
482 if isinstance(inlist
, list):
483 fileheader
= AppendNullBytes(inlist
, formatspecs
[5]);
485 fileheader
= AppendNullByte(inlist
, formatspecs
[5]);
487 fileheader
= fileheader
.encode('UTF-8');
488 if(checksumtype
=="none" or checksumtype
==""):
489 catfileheadercshex
= format(0, 'x').lower();
490 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
491 catfileheadercshex
= format(crc16(fileheader
) & 0xffff, '04x').lower();
492 elif(checksumtype
=="crc16_ccitt"):
493 catfileheadercshex
= format(crc16_ccitt(fileheader
) & 0xffff, '04x').lower();
494 elif(checksumtype
=="adler32"):
495 catfileheadercshex
= format(zlib
.adler32(fileheader
) & 0xffffffff, '08x').lower();
496 elif(checksumtype
=="crc32"):
497 catfileheadercshex
= format(crc32(fileheader
) & 0xffffffff, '08x').lower();
498 elif(checksumtype
=="crc64_ecma"):
499 catfileheadercshex
= format(crc64_ecma(fileheader
) & 0xffffffffffffffff, '016x').lower();
500 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
501 catfileheadercshex
= format(crc64_iso(fileheader
) & 0xffffffffffffffff, '016x').lower();
502 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
503 checksumoutstr
= hashlib
.new(checksumtype
);
504 checksumoutstr
.update(fileheader
);
505 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
507 catfileheadercshex
= format(0, 'x').lower();
508 return catfileheadercshex
;
510 def GetFileChecksum(instr
, checksumtype
="crc32", encodedata
=True, formatspecs
=__file_format_list__
):
512 instr
= instr
.encode('UTF-8');
513 if(checksumtype
=="none" or checksumtype
==""):
514 catinstrcshex
= format(0, 'x').lower();
515 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
516 catinstrcshex
= format(crc16(instr
) & 0xffff, '04x').lower();
517 elif(checksumtype
=="crc16_ccitt"):
518 catinstrcshex
= format(crc16_ccitt(instr
) & 0xffff, '04x').lower();
519 elif(checksumtype
=="adler32"):
520 catinstrcshex
= format(zlib
.adler32(instr
) & 0xffffffff, '08x').lower();
521 elif(checksumtype
=="crc32"):
522 catinstrcshex
= format(crc32(instr
) & 0xffffffff, '08x').lower();
523 elif(checksumtype
=="crc64_ecma"):
524 catinstrcshex
= format(crc64_ecma(instr
) & 0xffffffffffffffff, '016x').lower();
525 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
526 catinstrcshex
= format(crc64_iso(instr
) & 0xffffffffffffffff, '016x').lower();
527 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
528 checksumoutstr
= hashlib
.new(checksumtype
);
529 checksumoutstr
.update(instr
);
530 catinstrcshex
= checksumoutstr
.hexdigest().lower();
532 catinstrcshex
= format(0, 'x').lower();
533 return catinstrcshex
;
535 def ValidateHeaderChecksum(inlist
=[], checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_list__
):
536 catfileheadercshex
= GetHeaderChecksum(inlist
, checksumtype
, True, formatspecs
);
537 inchecksum
= inchecksum
.lower();
538 catfileheadercshex
= catfileheadercshex
.lower();
539 if(inchecksum
==catfileheadercshex
):
544 def ValidateFileChecksum(infile
, checksumtype
="crc32", inchecksum
="0", formatspecs
=__file_format_list__
):
545 catinfilecshex
= GetFileChecksum(infile
, checksumtype
, True, formatspecs
);
546 inchecksum
= inchecksum
.lower();
547 catinfilecshex
= catinfilecshex
.lower();
548 if(inchecksum
==catinfilecshex
):
553 def ReadTillNullByte(fp
, delimiter
=__file_format_delimiter__
):
556 nullbyte
= delimiter
.encode("UTF-8");
558 curbyte
= fp
.read(1);
559 if(curbyte
==nullbyte
or not curbyte
):
561 curfullbyte
= curfullbyte
+ curbyte
;
562 return curfullbyte
.decode('UTF-8');
564 def ReadUntilNullByte(fp
, delimiter
=__file_format_delimiter__
):
565 return ReadTillNullByte(fp
, delimiter
);
567 def SeekToEndOfFile(fp
):
571 if(lasttell
==fp
.tell()):
573 lasttell
= fp
.tell();
576 def ReadFileHeaderData(fp
, rounds
=0, delimiter
=__file_format_delimiter__
):
580 while(rocount
<roend
):
581 HeaderOut
.append(ReadTillNullByte(fp
, delimiter
));
582 rocount
= rocount
+ 1;
585 def ReadFileHeaderDataBySize(fp
, delimiter
=__file_format_delimiter__
):
586 headerpresize
= ReadTillNullByte(fp
, delimiter
);
587 headersize
= int(headerpresize
, 16);
590 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
593 roend
= int(len(headercontent
));
594 HeaderOut
= [headerpresize
];
595 while(rocount
<roend
):
596 HeaderOut
.append(headercontent
[rocount
]);
597 rocount
= rocount
+ 1;
600 def ReadFileHeaderDataWoSize(fp
, delimiter
=__file_format_delimiter__
):
601 preheaderdata
= ReadFileHeaderData(fp
, 2, delimiter
);
602 headersize
= int(preheaderdata
[0], 16);
603 headernumfields
= int(preheaderdata
[1], 16);
604 if(headersize
<=0 or headernumfields
<=0):
606 headerdata
= ReadFileHeaderData(fp
, headernumfields
, delimiter
);
607 HeaderOut
= preheaderdata
+ headerdata
;
610 def ReadFileHeaderDataBySizeWithContent(fp
, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
611 delimiter
= formatspecs
[5];
612 fheaderstart
= fp
.tell();
613 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
614 if(len(HeaderOut
)==0):
616 if(re
.findall("^[.|/]", HeaderOut
[3])):
617 fname
= HeaderOut
[3];
619 fname
= "./"+HeaderOut
[3];
620 fchecksumtype
= HeaderOut
[-3].lower();
621 fcs
= HeaderOut
[-2].lower();
622 fccs
= HeaderOut
[-1].lower();
623 fsize
= int(HeaderOut
[5], 16);
624 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
625 if(fcs
!=newfcs
and not skipchecksum
):
626 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
628 fhend
= fp
.tell() - 1;
629 fcontentstart
= fp
.tell();
630 fcontents
= "".encode('UTF-8');
631 if(fsize
>0 and not listonly
):
632 fcontents
= fp
.read(fsize
);
633 elif(fsize
>0 and listonly
):
635 newfccs
= GetFileChecksum(fcontents
, HeaderOut
[-3].lower(), False, formatspecs
);
636 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
637 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
640 fcontentend
= fp
.tell() - 1;
641 HeaderOut
.append(fcontents
);
644 def ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
645 delimiter
= formatspecs
[5];
646 fheaderstart
= fp
.tell();
648 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
650 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
651 if(len(HeaderOut
)==0):
653 fheadsize
= int(HeaderOut
[0], 16);
654 fnumfields
= int(HeaderOut
[1], 16);
655 ftype
= int(HeaderOut
[2], 16);
656 if(re
.findall("^[.|/]", HeaderOut
[3])):
657 fname
= HeaderOut
[3];
659 fname
= "./"+HeaderOut
[3];
660 fbasedir
= os
.path
.dirname(fname
);
661 flinkname
= HeaderOut
[4];
662 fsize
= int(HeaderOut
[5], 16);
663 fatime
= int(HeaderOut
[6], 16);
664 fmtime
= int(HeaderOut
[7], 16);
665 fctime
= int(HeaderOut
[8], 16);
666 fbtime
= int(HeaderOut
[9], 16);
667 fmode
= int(HeaderOut
[10], 16);
668 fchmode
= stat
.S_IMODE(fmode
);
669 ftypemod
= stat
.S_IFMT(fmode
);
670 fwinattributes
= int(HeaderOut
[11], 16);
671 fuid
= int(HeaderOut
[12], 16);
672 funame
= HeaderOut
[13];
673 fgid
= int(HeaderOut
[14], 16);
674 fgname
= HeaderOut
[15];
675 fid
= int(HeaderOut
[16], 16);
676 finode
= int(HeaderOut
[17], 16);
677 flinkcount
= int(HeaderOut
[18], 16);
678 fdev_minor
= int(HeaderOut
[19], 16);
679 fdev_major
= int(HeaderOut
[20], 16);
680 frdev_minor
= int(HeaderOut
[21], 16);
681 frdev_major
= int(HeaderOut
[22], 16);
682 fextrasize
= int(HeaderOut
[23], 16);
683 fextrafields
= int(HeaderOut
[24], 16);
684 extrafieldslist
= [];
686 extraend
= extrastart
+ fextrafields
;
687 extrafieldslist
= [];
688 if(extrastart
<extraend
):
689 extrafieldslist
.append(HeaderOut
[extrastart
]);
690 extrastart
= extrastart
+ 1;
691 fchecksumtype
= HeaderOut
[extrastart
].lower();
692 fcs
= HeaderOut
[extrastart
+ 1].lower();
693 fccs
= HeaderOut
[extrastart
+ 2].lower();
694 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
695 if(fcs
!=newfcs
and not skipchecksum
):
696 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
698 fhend
= fp
.tell() - 1;
699 fcontentstart
= fp
.tell();
700 fcontents
= "".encode('UTF-8');
701 pyhascontents
= False;
702 if(fsize
>0 and not listonly
):
703 fcontents
= fp
.read(fsize
);
704 pyhascontents
= True;
705 elif(fsize
>0 and listonly
):
707 pyhascontents
= False;
708 newfccs
= GetFileChecksum(fcontents
, HeaderOut
[-3].lower(), False, formatspecs
);
709 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
710 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
713 fcontentend
= fp
.tell() - 1;
714 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
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': fchecksumtype
, 'fnumfields': fnumfields
+ 2, 'frawheader': HeaderOut
, 'fextrafields': fextrafields
, 'fextrafieldsize': fextrasize
, 'fextralist': extrafieldslist
, 'fheaderchecksum': fcs
, 'fcontentchecksum': fccs
, 'fhascontents': pyhascontents
, 'fcontentstart': fcontentstart
, 'fcontentend': fcontentend
, 'fcontents': fcontents
};
717 def ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
718 delimiter
= formatspecs
[5];
719 fheaderstart
= fp
.tell();
721 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
723 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
724 if(len(HeaderOut
)==0):
726 fheadsize
= int(HeaderOut
[0], 16);
727 fnumfields
= int(HeaderOut
[1], 16);
728 ftype
= int(HeaderOut
[2], 16);
729 if(re
.findall("^[.|/]", HeaderOut
[3])):
730 fname
= HeaderOut
[3];
732 fname
= "./"+HeaderOut
[3];
733 fbasedir
= os
.path
.dirname(fname
);
734 flinkname
= HeaderOut
[4];
735 fsize
= int(HeaderOut
[5], 16);
736 fatime
= int(HeaderOut
[6], 16);
737 fmtime
= int(HeaderOut
[7], 16);
738 fctime
= int(HeaderOut
[8], 16);
739 fbtime
= int(HeaderOut
[9], 16);
740 fmode
= int(HeaderOut
[10], 16);
741 fchmode
= stat
.S_IMODE(fmode
);
742 ftypemod
= stat
.S_IFMT(fmode
);
743 fwinattributes
= int(HeaderOut
[11], 16);
744 fuid
= int(HeaderOut
[12], 16);
745 funame
= HeaderOut
[13];
746 fgid
= int(HeaderOut
[14], 16);
747 fgname
= HeaderOut
[15];
748 fid
= int(HeaderOut
[16], 16);
749 finode
= int(HeaderOut
[17], 16);
750 flinkcount
= int(HeaderOut
[18], 16);
751 fdev_minor
= int(HeaderOut
[19], 16);
752 fdev_major
= int(HeaderOut
[20], 16);
753 frdev_minor
= int(HeaderOut
[21], 16);
754 frdev_major
= int(HeaderOut
[22], 16);
755 fextrasize
= int(HeaderOut
[23], 16);
756 fextrafields
= int(HeaderOut
[24], 16);
757 extrafieldslist
= [];
759 extraend
= extrastart
+ fextrafields
;
760 extrafieldslist
= [];
761 if(extrastart
<extraend
):
762 extrafieldslist
.append(HeaderOut
[extrastart
]);
763 extrastart
= extrastart
+ 1;
764 fchecksumtype
= HeaderOut
[extrastart
].lower();
765 fcs
= HeaderOut
[extrastart
+ 1].lower();
766 fccs
= HeaderOut
[extrastart
+ 2].lower();
767 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
768 if(fcs
!=newfcs
and not skipchecksum
):
769 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
771 fhend
= fp
.tell() - 1;
772 fcontentstart
= fp
.tell();
773 fcontents
= "".encode('UTF-8');
774 pyhascontents
= False;
775 if(fsize
>0 and not listonly
):
776 fcontents
= fp
.read(fsize
);
777 pyhascontents
= True;
778 elif(fsize
>0 and listonly
):
780 pyhascontents
= False;
781 newfccs
= GetFileChecksum(fcontents
, HeaderOut
[-3].lower(), False, formatspecs
);
782 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
783 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
786 fcontentend
= fp
.tell() - 1;
787 catlist
= [ftype
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fuid
, funame
, fgid
, fgname
, fid
, finode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrafieldslist
, fchecksumtype
, fcontents
];
790 def ReadFileDataBySizeWithContent(fp
, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
791 delimiter
= formatspecs
[5];
795 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
798 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
799 if(not headercheck
and not skipchecksum
):
800 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
802 fnumfiles
= int(catheader
[1], 16);
805 while(countnum
< fnumfiles
):
806 HeaderOut
= ReadFileHeaderDataBySizeWithContent(fp
, listonly
, skipchecksum
, formatspecs
)
807 if(len(HeaderOut
)==0):
809 flist
.append(HeaderOut
);
810 countnum
= countnum
+ 1;
813 def ReadFileDataBySizeWithContentToArray(fp
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
814 delimiter
= formatspecs
[5];
818 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
821 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
822 if(not headercheck
and not skipchecksum
):
823 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
825 catstring
= catheader
[0];
826 catversion
= re
.findall(r
"([\d]+)$", catstring
);
827 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
828 fprenumfiles
= catheader
[1];
829 fnumfiles
= int(fprenumfiles
, 16);
830 fprechecksumtype
= catheader
[2];
831 fprechecksum
= catheader
[3];
832 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
833 if(seekstart
<0 and seekstart
>fnumfiles
):
835 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
837 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
838 seekend
= fnumfiles
- abs(seekend
);
841 while(il
< seekstart
):
842 prefhstart
= fp
.tell();
843 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
[5]);
844 if(len(preheaderdata
)==0):
846 prefsize
= int(preheaderdata
[5], 16);
847 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-3].lower(), True, formatspecs
);
848 prefcs
= preheaderdata
[-2];
849 if(prefcs
!=prenewfcs
and not skipchecksum
):
850 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
852 valid_archive
= False;
853 invalid_archive
= True;
854 prefhend
= fp
.tell() - 1;
855 prefcontentstart
= fp
.tell();
857 pyhascontents
= False;
859 prefcontents
= fp
.read(prefsize
);
860 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
861 prefccs
= preheaderdata
[-1];
862 pyhascontents
= True;
863 if(prefccs
!=prenewfccs
and not skipchecksum
):
864 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
869 countnum
= seekstart
;
870 while(countnum
< seekend
):
871 catlist
['ffilelist'].update({realidnum
: {'fid': realidnum
, 'fidalt': realidnum
}});
872 HeaderOut
= ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
, skipchecksum
, formatspecs
);
875 catlist
['ffilelist'][realidnum
].update(HeaderOut
);
876 countnum
= countnum
+ 1;
877 realidnum
= realidnum
+ 1;
880 def ReadFileDataBySizeWithContentToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
881 if(isinstance(infile
, dict)):
882 listcatfiles
= infile
;
884 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
886 listcatfiles
= ReadFileDataBySizeWithContentToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
);
887 if(not listcatfiles
):
889 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': {}}}};
890 lenlist
= len(listcatfiles
['ffilelist']);
892 lcfx
= int(listcatfiles
['fnumfiles']);
893 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
896 lcfx
= int(listcatfiles
['fnumfiles']);
898 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
899 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
900 catarray
['filetoid'].update(filetoidarray
);
901 catarray
['idtofile'].update(idtofilearray
);
902 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
903 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
904 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
905 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
906 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
907 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
908 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
909 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
910 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
911 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
912 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
913 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
914 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
915 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
916 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
917 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
918 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
919 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
920 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
921 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
922 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
923 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
924 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
925 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
926 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
927 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
928 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
929 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
930 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
931 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
932 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
936 def ReadFileDataBySizeWithContentToList(fp
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
937 delimiter
= formatspecs
[5];
941 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
944 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
945 if(not headercheck
and not skipchecksum
):
946 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
948 catstring
= catheader
[0];
949 catversion
= re
.findall(r
"([\d]+)$", catstring
);
950 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
951 fprenumfiles
= catheader
[1];
952 fnumfiles
= int(fprenumfiles
, 16);
953 fprechecksumtype
= catheader
[2];
954 fprechecksum
= catheader
[3];
956 if(seekstart
<0 and seekstart
>fnumfiles
):
958 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
960 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
961 seekend
= fnumfiles
- abs(seekend
);
964 while(il
< seekstart
):
965 prefhstart
= fp
.tell();
966 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
[5]);
967 if(len(preheaderdata
)==0):
969 prefsize
= int(preheaderdata
[5], 16);
970 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-3].lower(), True, formatspecs
);
971 prefcs
= preheaderdata
[-2];
972 if(prefcs
!=prenewfcs
and not skipchecksum
):
973 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
975 valid_archive
= False;
976 invalid_archive
= True;
977 prefhend
= fp
.tell() - 1;
978 prefcontentstart
= fp
.tell();
980 pyhascontents
= False;
982 prefcontents
= fp
.read(prefsize
);
983 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
984 prefccs
= preheaderdata
[-1];
985 pyhascontents
= True;
986 if(prefccs
!=prenewfccs
and not skipchecksum
):
987 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
992 countnum
= seekstart
;
993 while(countnum
< seekend
):
994 HeaderOut
= ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
, skipchecksum
, formatspecs
);
997 catlist
.append(HeaderOut
);
998 countnum
= countnum
+ 1;
999 realidnum
= realidnum
+ 1;
1002 def ReadInFileBySizeWithContentToArray(infile
, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
1003 delimiter
= formatspecs
[5];
1004 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1007 fp
= UncompressArchiveFile(fp
, formatspecs
);
1008 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
);
1009 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
1016 if(hasattr(sys
.stdin
, "buffer")):
1017 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1019 shutil
.copyfileobj(sys
.stdin
, fp
);
1021 fp
= UncompressArchiveFile(fp
, formatspecs
);
1025 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1026 fp
= download_file_from_internet_file(infile
);
1027 fp
= UncompressArchiveFile(fp
, formatspecs
);
1033 infile
= RemoveWindowsPath(infile
);
1034 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
1035 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
1037 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1038 if(not compresscheck
):
1039 fextname
= os
.path
.splitext(infile
)[1];
1040 if(fextname
==".gz"):
1041 compresscheck
= "gzip";
1042 elif(fextname
==".bz2"):
1043 compresscheck
= "bzip2";
1044 elif(fextname
==".zst"):
1045 compresscheck
= "zstd";
1046 elif(fextname
==".lz4" or fextname
==".clz4"):
1047 compresscheck
= "lz4";
1048 elif(fextname
==".lzo" or fextname
==".lzop"):
1049 compresscheck
= "lzo";
1050 elif(fextname
==".lzma" or fextname
==".xz"):
1051 compresscheck
= "lzma";
1054 if(not compresscheck
):
1056 fp
= UncompressFile(infile
, formatspecs
, "rb");
1057 return ReadFileDataBySizeWithContentToArray(fp
, listonly
, skipchecksum
, formatspecs
);
1059 def ReadInFileBySizeWithContentToList(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
1060 delimiter
= formatspecs
[5];
1061 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1064 fp
= UncompressArchiveFile(fp
, formatspecs
);
1065 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
);
1066 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
1073 if(hasattr(sys
.stdin
, "buffer")):
1074 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1076 shutil
.copyfileobj(sys
.stdin
, fp
);
1078 fp
= UncompressArchiveFile(fp
, formatspecs
);
1082 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1083 fp
= download_file_from_internet_file(infile
);
1084 fp
= UncompressArchiveFile(fp
, formatspecs
);
1090 infile
= RemoveWindowsPath(infile
);
1091 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
1092 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
1094 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1095 if(not compresscheck
):
1096 fextname
= os
.path
.splitext(infile
)[1];
1097 if(fextname
==".gz"):
1098 compresscheck
= "gzip";
1099 elif(fextname
==".bz2"):
1100 compresscheck
= "bzip2";
1101 elif(fextname
==".zst"):
1102 compresscheck
= "zstd";
1103 elif(fextname
==".lz4" or fextname
==".clz4"):
1104 compresscheck
= "lz4";
1105 elif(fextname
==".lzo" or fextname
==".lzop"):
1106 compresscheck
= "lzo";
1107 elif(fextname
==".lzma" or fextname
==".xz"):
1108 compresscheck
= "lzma";
1111 if(not compresscheck
):
1113 fp
= UncompressFile(infile
, formatspecs
, "rb");
1114 return ReadFileDataBySizeWithContentToList(fp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
);
1116 def ReadInFileBySizeWithContentToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
1117 if(isinstance(infile
, dict)):
1118 listcatfiles
= infile
;
1120 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
1121 infile
= RemoveWindowsPath(infile
);
1122 listcatfiles
= ReadInFileBySizeWithContentToArray(infile
, listonly
, skipchecksum
, formatspecs
);
1123 if(not listcatfiles
):
1125 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': {}}}};
1126 lenlist
= len(listcatfiles
['ffilelist']);
1128 lcfx
= int(listcatfiles
['fnumfiles']);
1129 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
1130 lcfx
= int(lenlist
);
1132 lcfx
= int(listcatfiles
['fnumfiles']);
1134 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
1135 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
1136 catarray
['filetoid'].update(filetoidarray
);
1137 catarray
['idtofile'].update(idtofilearray
);
1138 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
1139 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
1140 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
1141 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
1142 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
1143 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
1144 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1145 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1146 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
1147 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1148 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1149 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1150 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1151 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
1152 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
1153 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
1154 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1155 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1156 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
1157 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
1158 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
1159 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1160 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1161 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
1162 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
1163 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
1164 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
1165 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1166 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1167 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1168 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1172 def AppendNullByte(indata
, delimiter
=__file_format_delimiter__
):
1173 outdata
= str(indata
) + delimiter
;
1176 def AppendNullBytes(indata
=[], delimiter
=__file_format_delimiter__
):
1181 outdata
= outdata
+ AppendNullByte(indata
[inum
], delimiter
);
1185 def AppendFileHeader(fp
, numfiles
, checksumtype
="crc32", formatspecs
=__file_format_list__
):
1186 delimiter
= formatspecs
[5];
1187 catver
= formatspecs
[6];
1188 fileheaderver
= str(int(catver
.replace(".", "")));
1189 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
1190 fp
.write(fileheader
.encode('UTF-8'));
1191 fnumfiles
= format(int(numfiles
), 'x').lower();
1192 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
1193 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
1194 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
1195 fp
.write(fnumfilesa
.encode('UTF-8'));
1198 os
.fsync(fp
.fileno());
1199 except io
.UnsupportedOperation
:
1201 except AttributeError:
1205 def AppendFileHeaderWithContent(fp
, filevalues
=[], extradata
=[], filecontent
="", checksumtype
="crc32", formatspecs
=__file_format_list__
):
1206 extrafields
= format(len(extradata
), 'x').lower();
1207 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
1208 if(len(extradata
)>0):
1209 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1210 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1211 catoutlen
= len(filevalues
) + len(extradata
) + 5;
1212 catoutlenhex
= format(catoutlen
, 'x').lower();
1213 catoutlist
= filevalues
;
1214 catoutlist
.insert(0, catoutlenhex
);
1215 catoutlist
.append(extrasizelen
);
1216 catoutlist
.append(extrafields
);
1217 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
1218 if(len(extradata
)>0):
1219 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1220 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
1221 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1222 catfilecontentcshex
= GetFileChecksum(filecontent
, checksumtype
, False, formatspecs
);
1223 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1224 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
1225 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
1226 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1227 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1228 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1229 nullstrecd
= formatspecs
[5].encode('UTF-8');
1230 catfileout
= catfileoutstrecd
+ filecontent
+ nullstrecd
;
1231 fp
.write(catfileout
);
1234 os
.fsync(fp
.fileno());
1235 except io
.UnsupportedOperation
:
1237 except AttributeError:
1241 def AppendFilesWithContent(infiles
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False):
1242 advancedlist
= formatspecs
[8];
1243 altinode
= formatspecs
[9];
1245 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1247 for line
in sys
.stdin
:
1248 infilelist
.append(line
.strip());
1249 infilelist
= list(filter(None, infilelist
));
1250 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
1251 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
1253 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
1254 for line
in finfile
:
1255 infilelist
.append(line
.strip());
1256 infilelist
= list(filter(None, infilelist
));
1258 if(isinstance(infiles
, (list, tuple, ))):
1259 infilelist
= list(filter(None, infiles
));
1260 elif(isinstance(infiles
, (str, ))):
1261 infilelist
= list(filter(None, [infiles
]));
1263 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
1265 GetDirList
= ListDir(infilelist
, followlink
, False);
1273 inodetocatinode
= {};
1274 numfiles
= int(len(GetDirList
));
1275 fnumfiles
= format(numfiles
, 'x').lower();
1276 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1277 for curfname
in GetDirList
:
1278 catfhstart
= fp
.tell();
1279 if(re
.findall("^[.|/]", curfname
)):
1282 fname
= "./"+curfname
;
1284 VerbosePrintOut(fname
);
1285 if(not followlink
or followlink
is None):
1286 fstatinfo
= os
.lstat(fname
);
1288 fstatinfo
= os
.stat(fname
);
1289 fpremode
= fstatinfo
.st_mode
;
1290 finode
= fstatinfo
.st_ino
;
1291 flinkcount
= fstatinfo
.st_nlink
;
1293 if(stat
.S_ISREG(fpremode
)):
1295 elif(stat
.S_ISLNK(fpremode
)):
1297 elif(stat
.S_ISCHR(fpremode
)):
1299 elif(stat
.S_ISBLK(fpremode
)):
1301 elif(stat
.S_ISDIR(fpremode
)):
1303 elif(stat
.S_ISFIFO(fpremode
)):
1305 elif(stat
.S_ISSOCK(fpremode
)):
1307 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
1309 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
1311 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
1316 fcurfid
= format(int(curfid
), 'x').lower();
1317 if(not followlink
and finode
!=0):
1319 if(finode
in inodelist
):
1321 flinkname
= inodetofile
[finode
];
1323 fcurinode
= format(int(finode
), 'x').lower();
1325 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
1326 if(finode
not in inodelist
):
1327 inodelist
.append(finode
);
1328 inodetofile
.update({finode
: fname
});
1329 inodetocatinode
.update({finode
: curinode
});
1331 fcurinode
= format(int(finode
), 'x').lower();
1333 fcurinode
= format(int(curinode
), 'x').lower();
1334 curinode
= curinode
+ 1;
1336 fcurinode
= format(int(curinode
), 'x').lower();
1337 curinode
= curinode
+ 1;
1338 curfid
= curfid
+ 1;
1340 flinkname
= os
.readlink(fname
);
1341 fdev
= fstatinfo
.st_dev
;
1342 getfdev
= GetDevMajorMinor(fdev
);
1343 fdev_minor
= getfdev
[0];
1344 fdev_major
= getfdev
[1];
1345 frdev
= fstatinfo
.st_dev
;
1346 if(hasattr(fstatinfo
, "st_rdev")):
1347 frdev
= fstatinfo
.st_rdev
;
1349 frdev
= fstatinfo
.st_dev
;
1350 getfrdev
= GetDevMajorMinor(frdev
);
1351 frdev_minor
= getfrdev
[0];
1352 frdev_major
= getfrdev
[1];
1353 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1354 fsize
= format(int("0"), 'x').lower();
1355 elif(ftype
==0 or ftype
==7):
1356 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
1358 fsize
= format(int(fstatinfo
.st_size
)).lower();
1359 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
1360 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
1361 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1362 if(hasattr(fstatinfo
, "st_birthtime")):
1363 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
1365 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1366 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
1367 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
1368 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
1369 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
1370 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
1375 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
1376 funame
= userinfo
.pw_name
;
1385 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
1386 fgname
= groupinfo
.gr_name
;
1391 fdev_minor
= format(int(fdev_minor
), 'x').lower();
1392 fdev_major
= format(int(fdev_major
), 'x').lower();
1393 frdev_minor
= format(int(frdev_minor
), 'x').lower();
1394 frdev_major
= format(int(frdev_major
), 'x').lower();
1395 finode
= format(int(finode
), 'x').lower();
1396 flinkcount
= format(int(flinkcount
), 'x').lower();
1397 if(hasattr(fstatinfo
, "st_file_attributes")):
1398 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
1400 fwinattributes
= format(int(0), 'x').lower();
1401 fcontents
= "".encode('UTF-8');
1403 if(ftype
==0 or ftype
==7):
1404 with
open(fname
, "rb") as fpc
:
1406 chunk
= fpc
.read(chunk_size
);
1410 if(followlink
and (ftype
==1 or ftype
==2)):
1411 flstatinfo
= os
.stat(flinkname
);
1412 with
open(flinkname
, "rb") as fpc
:
1414 chunk
= fpc
.read(chunk_size
);
1418 ftypehex
= format(ftype
, 'x').lower();
1419 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
1420 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
, checksumtype
, formatspecs
);
1422 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
1426 def AppendListsWithContent(inlist
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False):
1428 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1429 GetDirList
= inlist
;
1437 inodetocatinode
= {};
1438 numfiles
= int(len(GetDirList
));
1439 fnumfiles
= format(numfiles
, 'x').lower();
1440 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1441 for curfname
in GetDirList
:
1442 ftype
= format(curfname
[0], 'x').lower();
1443 if(re
.findall("^[.|/]", curfname
[1])):
1444 fname
= curfname
[1];
1446 fname
= "./"+curfname
[1];
1447 fbasedir
= os
.path
.dirname(fname
);
1448 flinkname
= curfname
[2];
1449 fsize
= format(curfname
[3], 'x').lower();
1450 fatime
= format(curfname
[4], 'x').lower();
1451 fmtime
= format(curfname
[5], 'x').lower();
1452 fctime
= format(curfname
[6], 'x').lower();
1453 fbtime
= format(curfname
[7], 'x').lower();
1454 fmode
= format(curfname
[8], 'x').lower();
1455 fwinattributes
= format(curfname
[9], 'x').lower();
1456 fuid
= format(curfname
[10], 'x').lower();
1457 funame
= curfname
[11];
1458 fgid
= format(curfname
[12], 'x').lower();
1459 fgname
= curfname
[13];
1460 fid
= format(curfname
[14], 'x').lower();
1461 finode
= format(curfname
[15], 'x').lower();
1462 flinkcount
= format(curfname
[16], 'x').lower();
1463 fdev_minor
= format(curfname
[17], 'x').lower();
1464 fdev_major
= format(curfname
[18], 'x').lower();
1465 frdev_minor
= format(curfname
[19], 'x').lower();
1466 frdev_major
= format(curfname
[20], 'x').lower();
1467 extradata
= curfname
[21];
1468 fchecksumtype
= curfname
[22];
1469 fcontents
= curfname
[23];
1470 catoutlist
= [ftype
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fuid
, funame
, fgid
, fgname
, fid
, finode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
];
1471 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
, checksumtype
, formatspecs
);
1473 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
1477 def AppendInFileWithContent(infile
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False):
1478 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, False, formatspecs
);
1479 return AppendListsWithContent(inlist
, fp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1481 def AppendFilesWithContentToOutFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1482 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1483 if(os
.path
.exists(outfile
)):
1487 catfpfp
= BytesIO();
1488 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1490 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1493 fbasename
= os
.path
.splitext(outfile
)[0];
1494 fextname
= os
.path
.splitext(outfile
)[1];
1495 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1496 catfp
= AppendFilesWithContent(infiles
, catfp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1497 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1498 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1501 os
.fsync(catfp
.fileno());
1502 except io
.UnsupportedOperation
:
1504 except AttributeError:
1508 if(hasattr(sys
.stdout
, "buffer")):
1509 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1511 shutil
.copyfileobj(catfp
, sys
.stdout
);
1512 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1513 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1515 upload_file_to_internet_file(catfp
, outfile
);
1523 def AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1524 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1525 if(os
.path
.exists(outfile
)):
1529 catfpfp
= BytesIO();
1530 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1532 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1535 fbasename
= os
.path
.splitext(outfile
)[0];
1536 fextname
= os
.path
.splitext(outfile
)[1];
1537 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1538 catfp
= AppendListsWithContent(inlist
, catfp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1539 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1540 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1543 os
.fsync(catfp
.fileno());
1544 except io
.UnsupportedOperation
:
1546 except AttributeError:
1550 if(hasattr(sys
.stdout
, "buffer")):
1551 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1553 shutil
.copyfileobj(catfp
, sys
.stdout
);
1554 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1555 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1557 upload_file_to_internet_file(catfp
, outfile
);
1565 def AppendInFileWithContentToOutFile(infile
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1566 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, False, formatspecs
);
1567 return AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
, returnfp
);
1569 def PrintPermissionString(fchmode
, ftype
):
1570 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' } };
1572 for fmodval
in str(oct(fchmode
))[-3:]:
1573 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
1574 if(ftype
==0 or ftype
==7):
1575 permissionstr
= "-" + permissionstr
;
1577 permissionstr
= "h" + permissionstr
;
1579 permissionstr
= "l" + permissionstr
;
1581 permissionstr
= "c" + permissionstr
;
1583 permissionstr
= "b" + permissionstr
;
1585 permissionstr
= "d" + permissionstr
;
1587 permissionstr
= "f" + permissionstr
;
1589 permissionstr
= "D" + permissionstr
;
1591 permissionstr
= "p" + permissionstr
;
1593 permissionstr
= "w" + permissionstr
;
1595 permissionoutstr
= stat
.filemode(fchmode
);
1596 except AttributeError:
1597 permissionoutstr
= permissionstr
;
1599 permissionoutstr
= permissionstr
;
1600 return permissionoutstr
;
1602 def PrintPermissionStringAlt(fchmode
, ftype
):
1604 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
1605 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
1607 # Translate file mode into permission string
1608 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
1609 # Append file type indicator
1611 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
1612 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
1614 file_type
= type_indicators
.get(ftype
, '-');
1615 permissionstr
= file_type
+ permissionstr
;
1617 permissionoutstr
= stat
.filemode(fchmode
);
1618 except AttributeError:
1619 permissionoutstr
= permissionstr
;
1620 return permissionoutstr
;
1622 def CompressionSupport():
1623 compression_list
= [];
1626 compression_list
.append("gz");
1627 compression_list
.append("gzip");
1632 compression_list
.append("bz2");
1633 compression_list
.append("bzip2");
1638 compression_list
.append("lz4");
1643 compression_list
.append("lzo");
1644 compression_list
.append("lzop");
1649 compression_list
.append("zstd");
1650 compression_list
.append("zstandard");
1655 compression_list
.append("lzma");
1656 compression_list
.append("xz");
1659 return compression_list
;
1661 def CheckCompressionType(infile
, formatspecs
=__file_format_list__
, closefp
=True):
1662 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1666 catfp
= open(infile
, "rb");
1667 except FileNotFoundError
:
1670 prefp
= catfp
.read(2);
1672 if(prefp
==binascii
.unhexlify("1f8b")):
1675 prefp
= catfp
.read(3);
1676 if(prefp
==binascii
.unhexlify("425a68")):
1678 if(prefp
==binascii
.unhexlify("5d0000")):
1681 prefp
= catfp
.read(4);
1682 if(prefp
==binascii
.unhexlify("28b52ffd")):
1684 if(prefp
==binascii
.unhexlify("04224d18")):
1686 if(prefp
==binascii
.unhexlify("504B0304")):
1687 filetype
= "zipfile";
1689 prefp
= catfp
.read(5);
1690 if(prefp
==binascii
.unhexlify("7573746172")):
1691 filetype
= "tarfile";
1693 prefp
= catfp
.read(6);
1694 if(prefp
==binascii
.unhexlify("fd377a585a00")):
1696 if(prefp
==binascii
.unhexlify("377abcaf271c")):
1697 filetype
= "7zipfile";
1699 prefp
= catfp
.read(7);
1700 if(prefp
==binascii
.unhexlify("526172211a0700")):
1701 filetype
= "rarfile";
1702 if(prefp
==binascii
.unhexlify("43617446696c65")):
1703 filetype
= "catfile";
1705 prefp
= catfp
.read(8);
1706 if(prefp
==binascii
.unhexlify("526172211a070100")):
1707 filetype
= "rarfile";
1709 prefp
= catfp
.read(formatspecs
[3]);
1710 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
1711 filetype
= formatspecs
[2];
1713 prefp
= catfp
.read(9);
1714 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
1717 prefp
= catfp
.read(10);
1718 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
1719 filetype
= "tarfile";
1725 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_list__
, closefp
=True):
1727 instringsfile
= BytesIO(instring
);
1729 instringsfile
= BytesIO(instring
.encode("UTF-8"));
1730 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
1732 def GetCompressionMimeType(infile
, formatspecs
=__file_format_list__
):
1733 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
1734 if(compresscheck
=="gzip" or compresscheck
=="gz"):
1735 return archivefile_gzip_mimetype
;
1736 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
1737 return archivefile_bzip2_mimetype
;
1738 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
1739 return archivefile_zstandard_mimetype
;
1740 if(compresscheck
=="lz4"):
1741 return archivefile_lz4_mimetype
;
1742 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
1743 return archivefile_lzop_mimetype
;
1744 if(compresscheck
=="lzma"):
1745 return archivefile_lzma_mimetype
;
1746 if(compresscheck
=="xz"):
1747 return archivefile_xz_mimetype
;
1748 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
[2]):
1749 return archivefile_cat_mimetype
;
1750 if(not compresscheck
):
1754 def UncompressArchiveFile(fp
, formatspecs
=__file_format_list__
):
1755 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
1757 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
1758 if(compresscheck
=="gzip"):
1763 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
1764 if(compresscheck
=="bzip2"):
1770 catfp
.write(bz2
.decompress(fp
.read()));
1771 if(compresscheck
=="zstd"):
1777 catfp
.write(zstandard
.decompress(fp
.read()));
1778 if(compresscheck
=="lz4"):
1784 catfp
.write(lz4
.frame
.decompress(fp
.read()));
1785 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
1791 catfp
.write(lzo
.decompress(fp
.read()));
1792 if(compresscheck
=="lzma" or compresscheck
=="xz"):
1798 catfp
.write(lzma
.decompress(fp
.read()));
1799 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
1801 if(not compresscheck
):
1807 with fp
as fpcontent
:
1809 catfp
.write(lzma
.decompress(fp
.read()));
1810 except lzma
.LZMAError
:
1814 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
1816 def UncompressFile(infile
, formatspecs
=__file_format_list__
, mode
="rb"):
1817 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
1818 if(sys
.version_info
[0]==2 and compresscheck
):
1824 if(compresscheck
=="gzip"):
1830 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
1831 except (ValueError, TypeError) as e
:
1832 filefp
= gzip
.open(infile
, mode
);
1833 if(compresscheck
=="bzip2"):
1839 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
1840 except (ValueError, TypeError) as e
:
1841 filefp
= bz2
.open(infile
, mode
);
1842 if(compresscheck
=="zstd"):
1848 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
1849 except (ValueError, TypeError) as e
:
1850 filefp
= zstandard
.open(infile
, mode
);
1851 if(compresscheck
=="lz4"):
1857 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
1858 except (ValueError, TypeError) as e
:
1859 filefp
= lz4
.frame
.open(infile
, mode
);
1860 if(compresscheck
=="lzo"):
1866 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
1867 except (ValueError, TypeError) as e
:
1868 filefp
= lzo
.open(infile
, mode
);
1869 if(compresscheck
=="lzma"):
1875 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
1876 except (ValueError, TypeError) as e
:
1877 filefp
= lzma
.open(infile
, mode
);
1878 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
1880 filefp
= open(infile
, mode
, encoding
="UTF-8");
1881 except (ValueError, TypeError) as e
:
1882 filefp
= open(infile
, mode
);
1883 if(not compresscheck
):
1885 filefp
= open(infile
, mode
, encoding
="UTF-8");
1886 except (ValueError, TypeError) as e
:
1887 filefp
= open(infile
, mode
);
1888 except FileNotFoundError
:
1892 def UncompressString(infile
):
1893 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
1894 if(compresscheck
=="gzip"):
1899 fileuz
= gzip
.decompress(infile
);
1900 if(compresscheck
=="bzip2"):
1905 fileuz
= bz2
.decompress(infile
);
1906 if(compresscheck
=="zstd"):
1911 fileuz
= zstandard
.decompress(infile
);
1912 if(compresscheck
=="lz4"):
1917 fileuz
= lz4
.frame
.decompress(infile
);
1918 if(compresscheck
=="lzo"):
1923 fileuz
= lzo
.decompress(infile
);
1924 if(compresscheck
=="lzma"):
1929 fileuz
= lzma
.decompress(infile
);
1930 if(not compresscheck
):
1932 if(hasattr(fileuz
, 'decode')):
1933 fileuz
= fileuz
.decode("UTF-8");
1936 def UncompressStringAlt(infile
):
1937 filefp
= StringIO();
1938 outstring
= UncompressString(infile
);
1939 filefp
.write(outstring
);
1943 def CheckCompressionSubType(infile
, formatspecs
=__file_format_list__
):
1944 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
1945 if(not compresscheck
):
1946 fextname
= os
.path
.splitext(infile
)[1];
1947 if(fextname
==".gz"):
1948 compresscheck
= "gzip";
1949 elif(fextname
==".bz2"):
1950 compresscheck
= "bzip2";
1951 elif(fextname
==".zst"):
1952 compresscheck
= "zstd";
1953 elif(fextname
==".lz4"):
1954 compresscheck
= "lz4";
1955 elif(fextname
==".lzo" or fextname
==".lzop"):
1956 compresscheck
= "lzo";
1957 elif(fextname
==".lzma" or fextname
==".xz"):
1958 compresscheck
= "lzma";
1961 if(not compresscheck
):
1963 if(compresscheck
=="catfile"):
1965 if(compresscheck
==formatspecs
[2]):
1966 return formatspecs
[2];
1967 if(compresscheck
=="tarfile"):
1969 if(compresscheck
=="zipfile"):
1971 if(rarfile_support
and compresscheck
=="rarfile"):
1973 if(py7zr_support
and compresscheck
=="7zipfile"):
1975 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1976 catfp
= UncompressArchiveFile(infile
, formatspecs
[2]);
1979 if(compresscheck
=="gzip"):
1984 catfp
= gzip
.GzipFile(infile
, "rb");
1985 if(compresscheck
=="bzip2"):
1990 catfp
= bz2
.BZ2File(infile
, "rb");
1991 if(compresscheck
=="lz4"):
1996 catfp
= lz4
.frame
.open(infile
, "rb");
1997 if(compresscheck
=="zstd"):
2002 catfp
= zstandard
.open(infile
, "rb");
2003 if(compresscheck
=="lzma" or compresscheck
=="xz"):
2008 catfp
= lzma
.open(infile
, "rb");
2009 except FileNotFoundError
:
2012 prefp
= catfp
.read(5);
2013 if(prefp
==binascii
.unhexlify("7573746172")):
2014 filetype
= "tarfile";
2016 prefp
= catfp
.read(7);
2017 if(prefp
==binascii
.unhexlify("43617446696c65")):
2018 filetype
= "catfile";
2020 prefp
= catfp
.read(formatspecs
[3]);
2021 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
2022 filetype
= formatspecs
[2];
2024 prefp
= catfp
.read(10);
2025 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2026 filetype
= "tarfile";
2031 def GZipCompress(data
, compresslevel
=9):
2036 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
2038 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
2042 catfp
= open(tmpfp
.name
, "rb");
2043 except FileNotFoundError
:
2045 catdata
= catfp
.read();
2049 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_list__
):
2050 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2053 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2055 if(compression
not in compressionlist
and compression
is None):
2056 compression
= "auto";
2057 if(compression
=="gzip"):
2063 if(compressionlevel
is None):
2064 compressionlevel
= 9;
2066 compressionlevel
= int(compressionlevel
);
2067 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
2068 if(compression
=="bzip2"):
2074 if(compressionlevel
is None):
2075 compressionlevel
= 9;
2077 compressionlevel
= int(compressionlevel
);
2078 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
2079 if(compression
=="lz4"):
2085 if(compressionlevel
is None):
2086 compressionlevel
= 9;
2088 compressionlevel
= int(compressionlevel
);
2089 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
2090 if(compression
=="lzo" or compression
=="lzop"):
2096 if(compressionlevel
is None):
2097 compressionlevel
= 9;
2099 compressionlevel
= int(compressionlevel
);
2100 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
2101 if(compression
=="zstd"):
2107 if(compressionlevel
is None):
2108 compressionlevel
= 10;
2110 compressionlevel
= int(compressionlevel
);
2111 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
2112 if(compression
=="lzma"):
2118 if(compressionlevel
is None):
2119 compressionlevel
= 9;
2121 compressionlevel
= int(compressionlevel
);
2122 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
2123 if(compression
=="xz"):
2129 if(compressionlevel
is None):
2130 compressionlevel
= 9;
2132 compressionlevel
= int(compressionlevel
);
2133 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
2134 if(compression
=="auto" or compression
is None):
2139 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
2141 def CompressOpenFile(outfile
, compressionlevel
=None):
2142 if(outfile
is None):
2144 fbasename
= os
.path
.splitext(outfile
)[0];
2145 fextname
= os
.path
.splitext(outfile
)[1];
2146 if(compressionlevel
is None and fextname
!=".zst"):
2147 compressionlevel
= 9;
2148 elif(compressionlevel
is None and fextname
==".zst"):
2149 compressionlevel
= 10;
2151 compressionlevel
= int(compressionlevel
);
2152 if(sys
.version_info
[0]==2):
2157 if(fextname
not in outextlistwd
):
2159 outfp
= open(outfile
, "wb", encoding
="UTF-8");
2160 except (ValueError, TypeError) as e
:
2161 outfp
= open(outfile
, "wb");
2162 elif(fextname
==".gz"):
2168 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2169 except (ValueError, TypeError) as e
:
2170 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
2171 elif(fextname
==".bz2"):
2177 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2178 except (ValueError, TypeError) as e
:
2179 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
2180 elif(fextname
==".zst"):
2186 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
2187 except (ValueError, TypeError) as e
:
2188 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
2189 elif(fextname
==".xz"):
2195 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
2196 except (ValueError, TypeError) as e
:
2197 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
2198 elif(fextname
==".lz4"):
2204 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
2205 except (ValueError, TypeError) as e
:
2206 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
2207 elif(fextname
==".lzo"):
2213 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
2214 except (ValueError, TypeError) as e
:
2215 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
2216 elif(fextname
==".lzma"):
2222 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
2223 except (ValueError, TypeError) as e
:
2224 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
2225 except FileNotFoundError
:
2229 def GetDevMajorMinor(fdev
):
2231 if(hasattr(os
, "minor")):
2232 retdev
.append(os
.minor(fdev
));
2235 if(hasattr(os
, "major")):
2236 retdev
.append(os
.major(fdev
));
2241 def CheckSumSupport(checkfor
, guaranteed
=True):
2243 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2245 hash_list
= sorted(list(hashlib
.algorithms_available
));
2246 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
2247 if(checkfor
in checklistout
):
2252 def CheckSumSupportAlt(checkfor
, guaranteed
=True):
2254 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2256 hash_list
= sorted(list(hashlib
.algorithms_available
));
2257 checklistout
= hash_list
;
2258 if(checkfor
in checklistout
):
2263 def PackArchiveFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2264 advancedlist
= formatspecs
[8];
2265 altinode
= formatspecs
[9];
2266 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2267 outfile
= RemoveWindowsPath(outfile
);
2268 checksumtype
= checksumtype
.lower();
2269 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2270 checksumtype
="crc32";
2271 if(checksumtype
=="none"):
2273 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2275 if(compression
not in compressionlist
and compression
is None):
2276 compression
= "auto";
2278 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2279 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2280 if(os
.path
.exists(outfile
)):
2285 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2287 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2290 fbasename
= os
.path
.splitext(outfile
)[0];
2291 fextname
= os
.path
.splitext(outfile
)[1];
2292 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2293 catver
= formatspecs
[6];
2294 fileheaderver
= str(int(catver
.replace(".", "")));
2295 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2296 catfp
.write(fileheader
.encode('UTF-8'));
2299 for line
in sys
.stdin
:
2300 infilelist
.append(line
.strip());
2301 infilelist
= list(filter(None, infilelist
));
2302 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
2303 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
2305 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
2306 for line
in finfile
:
2307 infilelist
.append(line
.strip());
2308 infilelist
= list(filter(None, infilelist
));
2310 if(isinstance(infiles
, (list, tuple, ))):
2311 infilelist
= list(filter(None, infiles
));
2312 elif(isinstance(infiles
, (str, ))):
2313 infilelist
= list(filter(None, [infiles
]));
2315 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
2317 GetDirList
= ListDir(infilelist
, followlink
, False);
2325 inodetocatinode
= {};
2326 numfiles
= int(len(GetDirList
));
2327 fnumfiles
= format(int(len(GetDirList
)), 'x').lower();
2328 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2329 if(checksumtype
=="none" or checksumtype
==""):
2330 catfileheadercshex
= format(0, 'x').lower();
2331 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2332 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2333 elif(checksumtype
=="crc16_ccitt"):
2334 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2335 elif(checksumtype
=="adler32"):
2336 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2337 elif(checksumtype
=="crc32"):
2338 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2339 elif(checksumtype
=="crc64_ecma"):
2340 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2341 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2342 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2343 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2344 checksumoutstr
= hashlib
.new(checksumtype
);
2345 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
2346 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2348 catfileheadercshex
= format(0, 'x').lower
2349 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2350 catfp
.write(fnumfilesa
.encode('UTF-8'));
2353 os
.fsync(catfp
.fileno());
2354 except io
.UnsupportedOperation
:
2356 except AttributeError:
2358 for curfname
in GetDirList
:
2359 catfhstart
= catfp
.tell();
2360 if(re
.findall("^[.|/]", curfname
)):
2363 fname
= "./"+curfname
;
2365 VerbosePrintOut(fname
);
2366 if(not followlink
or followlink
is None):
2367 fstatinfo
= os
.lstat(fname
);
2369 fstatinfo
= os
.stat(fname
);
2370 fpremode
= fstatinfo
.st_mode
;
2371 finode
= fstatinfo
.st_ino
;
2372 flinkcount
= fstatinfo
.st_nlink
;
2374 if(stat
.S_ISREG(fpremode
)):
2376 elif(stat
.S_ISLNK(fpremode
)):
2378 elif(stat
.S_ISCHR(fpremode
)):
2380 elif(stat
.S_ISBLK(fpremode
)):
2382 elif(stat
.S_ISDIR(fpremode
)):
2384 elif(stat
.S_ISFIFO(fpremode
)):
2386 elif(stat
.S_ISSOCK(fpremode
)):
2388 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
2390 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
2392 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
2397 fcurfid
= format(int(curfid
), 'x').lower();
2398 if(not followlink
and finode
!=0):
2400 if(finode
in inodelist
):
2402 flinkname
= inodetofile
[finode
];
2404 fcurinode
= format(int(finode
), 'x').lower();
2406 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
2407 if(finode
not in inodelist
):
2408 inodelist
.append(finode
);
2409 inodetofile
.update({finode
: fname
});
2410 inodetocatinode
.update({finode
: curinode
});
2412 fcurinode
= format(int(finode
), 'x').lower();
2414 fcurinode
= format(int(curinode
), 'x').lower();
2415 curinode
= curinode
+ 1;
2417 fcurinode
= format(int(curinode
), 'x').lower();
2418 curinode
= curinode
+ 1;
2419 curfid
= curfid
+ 1;
2421 flinkname
= os
.readlink(fname
);
2422 fdev
= fstatinfo
.st_dev
;
2423 getfdev
= GetDevMajorMinor(fdev
);
2424 fdev_minor
= getfdev
[0];
2425 fdev_major
= getfdev
[1];
2426 frdev
= fstatinfo
.st_dev
;
2427 if(hasattr(fstatinfo
, "st_rdev")):
2428 frdev
= fstatinfo
.st_rdev
;
2430 frdev
= fstatinfo
.st_dev
;
2431 getfrdev
= GetDevMajorMinor(frdev
);
2432 frdev_minor
= getfrdev
[0];
2433 frdev_major
= getfrdev
[1];
2434 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2435 fsize
= format(int("0"), 'x').lower();
2436 elif(ftype
==0 or ftype
==7):
2437 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
2439 fsize
= format(int(fstatinfo
.st_size
)).lower();
2440 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
2441 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
2442 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2443 if(hasattr(fstatinfo
, "st_birthtime")):
2444 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
2446 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2447 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
2448 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
2449 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
2450 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
2451 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
2456 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
2457 funame
= userinfo
.pw_name
;
2466 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
2467 fgname
= groupinfo
.gr_name
;
2472 fdev_minor
= format(int(fdev_minor
), 'x').lower();
2473 fdev_major
= format(int(fdev_major
), 'x').lower();
2474 frdev_minor
= format(int(frdev_minor
), 'x').lower();
2475 frdev_major
= format(int(frdev_major
), 'x').lower();
2476 finode
= format(int(finode
), 'x').lower();
2477 flinkcount
= format(int(flinkcount
), 'x').lower();
2478 if(hasattr(fstatinfo
, "st_file_attributes")):
2479 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
2481 fwinattributes
= format(int(0), 'x').lower();
2482 fcontents
= "".encode('UTF-8');
2484 if(ftype
==0 or ftype
==7):
2485 with
open(fname
, "rb") as fpc
:
2487 chunk
= fpc
.read(chunk_size
);
2491 if(followlink
and (ftype
==1 or ftype
==2)):
2492 flstatinfo
= os
.stat(flinkname
);
2493 with
open(flinkname
, "rb") as fpc
:
2495 chunk
= fpc
.read(chunk_size
);
2499 ftypehex
= format(ftype
, 'x').lower();
2500 extrafields
= format(len(extradata
), 'x').lower();
2501 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2502 if(len(extradata
)>0):
2503 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2504 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2505 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
];
2506 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
2507 catoutlenhex
= format(catoutlen
, 'x').lower();
2508 catoutlist
.insert(0, catoutlenhex
);
2509 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
2510 if(len(extradata
)>0):
2511 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2512 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2513 if(checksumtype
=="none" or checksumtype
==""):
2514 catfileheadercshex
= format(0, 'x').lower();
2515 catfilecontentcshex
= format(0, 'x').lower();
2516 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2517 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
2518 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
2519 elif(checksumtype
=="crc16_ccitt"):
2520 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
2521 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
2522 elif(checksumtype
=="adler32"):
2523 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2524 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
2525 elif(checksumtype
=="crc32"):
2526 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2527 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
2528 elif(checksumtype
=="crc64_ecma"):
2529 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2530 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
2531 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2532 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2533 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
2534 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2535 checksumoutstr
= hashlib
.new(checksumtype
);
2536 checksumoutstr
.update("".encode('UTF-8'));
2537 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2538 checksumoutstr
= hashlib
.new(checksumtype
);
2539 checksumoutstr
.update(fcontents
);
2540 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
2542 catfileheadercshex
= format(0, 'x').lower();
2543 catfilecontentcshex
= format(0, 'x').lower();
2544 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2545 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2546 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
2547 if(checksumtype
=="none" or checksumtype
==""):
2548 catfileheadercshex
= format(0, 'x').lower();
2549 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2550 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2551 elif(checksumtype
=="crc16_ccitt"):
2552 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2553 elif(checksumtype
=="adler32"):
2554 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2555 elif(checksumtype
=="crc32"):
2556 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2557 elif(checksumtype
=="crc64_ecma"):
2558 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2559 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2560 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2561 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2562 checksumoutstr
= hashlib
.new(checksumtype
);
2563 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
2564 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2566 catfileheadercshex
= format(0, 'x').lower();
2567 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2568 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2569 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2570 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2571 nullstrecd
= formatspecs
[5].encode('UTF-8');
2572 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
2573 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2574 catfp
.write(catfileout
);
2577 os
.fsync(catfp
.fileno());
2578 except io
.UnsupportedOperation
:
2580 except AttributeError:
2583 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
2584 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2585 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2588 os
.fsync(catfp
.fileno());
2589 except io
.UnsupportedOperation
:
2591 except AttributeError:
2595 if(hasattr(sys
.stdout
, "buffer")):
2596 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2598 shutil
.copyfileobj(catfp
, sys
.stdout
);
2599 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2600 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2602 upload_file_to_internet_file(catfp
, outfile
);
2610 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
2612 if(hasattr(shutil
, "register_archive_format")):
2613 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
2614 return PackArchiveFile(source_dir
, archive_name
, False, "auto", None, False, "crc32", [], __file_format_delimiter__
, False, False);
2615 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
2617 def PackArchiveFileFromDirList(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2618 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
2620 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2621 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2622 outfile
= RemoveWindowsPath(outfile
);
2623 checksumtype
= checksumtype
.lower();
2624 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2625 checksumtype
="crc32";
2626 if(checksumtype
=="none"):
2628 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2630 if(compression
not in compressionlist
and compression
is None):
2631 compression
= "auto";
2633 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2634 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2635 if(os
.path
.exists(outfile
)):
2640 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2642 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2645 fbasename
= os
.path
.splitext(outfile
)[0];
2646 fextname
= os
.path
.splitext(outfile
)[1];
2647 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2648 catver
= formatspecs
[6];
2649 fileheaderver
= str(int(catver
.replace(".", "")));
2650 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2651 catfp
.write(fileheader
.encode('UTF-8'));
2657 inodetocatinode
= {};
2660 if(hasattr(sys
.stdin
, "buffer")):
2661 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
2663 shutil
.copyfileobj(sys
.stdin
, infile
);
2668 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
2669 infile
= download_file_from_internet_file(infile
);
2674 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2676 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
2678 if(not tarfile
.is_tarfile(infile
)):
2680 except AttributeError:
2681 if(not is_tarfile(infile
)):
2686 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2687 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
2689 tarfp
= tarfile
.open(infile
, "r");
2690 except FileNotFoundError
:
2692 numfiles
= int(len(tarfp
.getmembers()));
2693 fnumfiles
= format(int(len(tarfp
.getmembers())), 'x').lower();
2694 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2695 if(checksumtype
=="none" or checksumtype
==""):
2696 catfileheadercshex
= format(0, 'x').lower();
2697 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2698 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2699 elif(checksumtype
=="crc16_ccitt"):
2700 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2701 elif(checksumtype
=="adler32"):
2702 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2703 elif(checksumtype
=="crc32"):
2704 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2705 elif(checksumtype
=="crc64_ecma"):
2706 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2707 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2708 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2709 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2710 checksumoutstr
= hashlib
.new(checksumtype
);
2711 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
2712 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2714 catfileheadercshex
= format(0, 'x').lower();
2715 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2716 catfp
.write(fnumfilesa
.encode('UTF-8'));
2719 os
.fsync(catfp
.fileno());
2720 except io
.UnsupportedOperation
:
2722 except AttributeError:
2724 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
2725 catfhstart
= catfp
.tell();
2726 if(re
.findall("^[.|/]", member
.name
)):
2727 fname
= member
.name
;
2729 fname
= "./"+member
.name
;
2731 VerbosePrintOut(fname
);
2732 fpremode
= member
.mode
;
2733 ffullmode
= member
.mode
;
2737 ffullmode
= member
.mode
+ stat
.S_IFREG
;
2739 elif(member
.isdev()):
2740 ffullmode
= member
.mode
;
2742 elif(member
.islnk()):
2743 ffullmode
= member
.mode
+ stat
.S_IFREG
;
2745 elif(member
.issym()):
2746 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
2748 elif(member
.ischr()):
2749 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
2751 elif(member
.isblk()):
2752 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
2754 elif(member
.isdir()):
2755 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
2757 elif(member
.isfifo()):
2758 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
2760 elif(member
.issparse()):
2761 ffullmode
= member
.mode
;
2764 ffullmode
= member
.mode
;
2767 fcurfid
= format(int(curfid
), 'x').lower();
2768 fcurinode
= format(int(curfid
), 'x').lower();
2769 curfid
= curfid
+ 1;
2771 flinkname
= member
.linkname
;
2772 fdev_minor
= format(int(member
.devminor
), 'x').lower();
2773 fdev_major
= format(int(member
.devmajor
), 'x').lower();
2774 frdev_minor
= format(int(member
.devminor
), 'x').lower();
2775 frdev_major
= format(int(member
.devmajor
), 'x').lower();
2776 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2777 fsize
= format(int("0"), 'x').lower();
2778 elif(ftype
==0 or ftype
==7):
2779 fsize
= format(int(member
.size
), 'x').lower();
2781 fsize
= format(int(member
.size
), 'x').lower();
2782 fatime
= format(int(member
.mtime
), 'x').lower();
2783 fmtime
= format(int(member
.mtime
), 'x').lower();
2784 fctime
= format(int(member
.mtime
), 'x').lower();
2785 fbtime
= format(int(member
.mtime
), 'x').lower();
2786 fmode
= format(int(ffullmode
), 'x').lower();
2787 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
2788 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
2789 fuid
= format(int(member
.uid
), 'x').lower();
2790 fgid
= format(int(member
.gid
), 'x').lower();
2791 funame
= member
.uname
;
2792 fgname
= member
.gname
;
2793 flinkcount
= format(int(flinkcount
), 'x').lower();
2794 fwinattributes
= format(int(0), 'x').lower();
2795 fcontents
= "".encode('UTF-8');
2797 if(ftype
==0 or ftype
==7):
2798 with tarfp
.extractfile(member
) as fpc
:
2800 chunk
= fpc
.read(chunk_size
);
2804 ftypehex
= format(ftype
, 'x').lower();
2805 extrafields
= format(len(extradata
), 'x').lower();
2806 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2807 if(len(extradata
)>0):
2808 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2809 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2810 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
];
2811 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
2812 catoutlenhex
= format(catoutlen
, 'x').lower();
2813 catoutlist
.insert(0, catoutlenhex
);
2814 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
2815 if(len(extradata
)>0):
2816 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2817 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2818 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2819 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2820 if(checksumtype
=="none" or checksumtype
==""):
2821 catfileheadercshex
= format(0, 'x').lower();
2822 catfilecontentcshex
= format(0, 'x').lower();
2823 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2824 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
2825 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
2826 elif(checksumtype
=="crc16_ccitt"):
2827 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
2828 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
2829 elif(checksumtype
=="adler32"):
2830 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2831 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
2832 elif(checksumtype
=="crc32"):
2833 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2834 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
2835 elif(checksumtype
=="crc64_ecma"):
2836 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2837 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
2838 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2839 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2840 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
2841 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2842 checksumoutstr
= hashlib
.new(checksumtype
);
2843 checksumoutstr
.update("".encode('UTF-8'));
2844 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2845 checksumoutstr
= hashlib
.new(checksumtype
);
2846 checksumoutstr
.update(fcontents
);
2847 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
2849 catfileheadercshex
= format(0, 'x').lower();
2850 catfilecontentcshex
= format(0, 'x').lower();
2851 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2852 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2853 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
2854 if(checksumtype
=="none" or checksumtype
==""):
2855 catfileheadercshex
= format(0, 'x').lower();
2856 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2857 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2858 elif(checksumtype
=="crc16_ccitt"):
2859 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2860 elif(checksumtype
=="adler32"):
2861 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2862 elif(checksumtype
=="crc32"):
2863 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2864 elif(checksumtype
=="crc64_ecma"):
2865 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2866 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2867 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2868 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2869 checksumoutstr
= hashlib
.new(checksumtype
);
2870 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
2871 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2873 catfileheadercshex
= format(0, 'x').lower();
2874 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2875 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2876 nullstrecd
= formatspecs
[5].encode('UTF-8');
2877 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
2878 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2879 catfp
.write(catfileout
);
2882 os
.fsync(catfp
.fileno());
2883 except io
.UnsupportedOperation
:
2885 except AttributeError:
2888 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
2889 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2890 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2893 os
.fsync(catfp
.fileno());
2894 except io
.UnsupportedOperation
:
2896 except AttributeError:
2900 if(hasattr(sys
.stdout
, "buffer")):
2901 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2903 shutil
.copyfileobj(catfp
, sys
.stdout
);
2904 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2905 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2907 upload_file_from_internet_file(catfp
, outfile
);
2915 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
2917 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2918 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2919 outfile
= RemoveWindowsPath(outfile
);
2920 checksumtype
= checksumtype
.lower();
2921 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2922 checksumtype
="crc32";
2923 if(checksumtype
=="none"):
2925 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2927 if(compression
not in compressionlist
and compression
is None):
2928 compression
= "auto";
2930 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2931 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2932 if(os
.path
.exists(outfile
)):
2937 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2939 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2942 fbasename
= os
.path
.splitext(outfile
)[0];
2943 fextname
= os
.path
.splitext(outfile
)[1];
2944 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2945 catver
= formatspecs
[6];
2946 fileheaderver
= str(int(catver
.replace(".", "")));
2947 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2948 catfp
.write(fileheader
.encode('UTF-8'));
2954 inodetocatinode
= {};
2957 if(hasattr(sys
.stdin
, "buffer")):
2958 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
2960 shutil
.copyfileobj(sys
.stdin
, infile
);
2965 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
2966 infile
= download_file_from_internet_file(infile
);
2971 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2975 if(not zipfile
.is_zipfile(infile
)):
2978 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
2979 except FileNotFoundError
:
2981 ziptest
= zipfp
.testzip();
2983 VerbosePrintOut("Bad file found!");
2984 numfiles
= int(len(zipfp
.infolist()));
2985 fnumfiles
= format(int(len(zipfp
.infolist())), 'x').lower();
2986 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2987 if(checksumtype
=="none" or checksumtype
==""):
2988 catfileheadercshex
= format(0, 'x').lower();
2989 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2990 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2991 elif(checksumtype
=="crc16_ccitt"):
2992 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2993 elif(checksumtype
=="adler32"):
2994 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2995 elif(checksumtype
=="crc32"):
2996 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2997 elif(checksumtype
=="crc64_ecma"):
2998 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2999 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3000 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3001 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3002 checksumoutstr
= hashlib
.new(checksumtype
);
3003 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
3004 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3006 catfileheadercshex
= format(0, 'x').lower();
3007 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3008 catfp
.write(fnumfilesa
.encode('UTF-8'));
3011 os
.fsync(catfp
.fileno());
3012 except io
.UnsupportedOperation
:
3014 except AttributeError:
3016 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
3017 catfhstart
= catfp
.tell();
3018 if(re
.findall("^[.|/]", member
.filename
)):
3019 fname
= member
.filename
;
3021 fname
= "./"+member
.filename
;
3022 zipinfo
= zipfp
.getinfo(member
.filename
);
3024 VerbosePrintOut(fname
);
3025 if(not member
.is_dir()):
3026 fpremode
= int(stat
.S_IFREG
+ 438);
3027 elif(member
.is_dir()):
3028 fpremode
= int(stat
.S_IFDIR
+ 511);
3031 if(not member
.is_dir()):
3033 elif(member
.is_dir()):
3036 fcurfid
= format(int(curfid
), 'x').lower();
3037 fcurinode
= format(int(curfid
), 'x').lower();
3038 curfid
= curfid
+ 1;
3039 fdev_minor
= format(int(0), 'x').lower();
3040 fdev_major
= format(int(0), 'x').lower();
3041 frdev_minor
= format(int(0), 'x').lower();
3042 frdev_major
= format(int(0), 'x').lower();
3044 fsize
= format(int("0"), 'x').lower();
3046 fsize
= format(int(member
.file_size
), 'x').lower();
3048 fsize
= format(int(member
.file_size
), 'x').lower();
3049 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3050 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3051 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3052 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3053 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
3054 fwinattributes
= format(int(zipinfo
.external_attr
), 'x').lower();
3055 if(not member
.is_dir()):
3056 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3057 fchmode
= stat
.S_IMODE(fmode
);
3058 ftypemod
= stat
.S_IFMT(fmode
);
3059 elif(member
.is_dir()):
3060 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3061 fchmode
= stat
.S_IMODE(fmode
);
3062 ftypemod
= stat
.S_IFMT(fmode
);
3063 elif(zipinfo
.create_system
==3):
3064 fwinattributes
= format(int(0), 'x').lower();
3065 fmode
= format(int(zipinfo
.external_attr
), 'x').lower();
3066 fchmode
= stat
.S_IMODE(fmode
);
3067 ftypemod
= stat
.S_IFMT(fmode
);
3069 fwinattributes
= format(int(0), 'x').lower();
3070 if(not member
.is_dir()):
3071 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3072 fchmode
= stat
.S_IMODE(fmode
);
3073 ftypemod
= stat
.S_IFMT(fmode
);
3074 elif(member
.is_dir()):
3075 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3076 fchmode
= stat
.S_IMODE(fmode
);
3077 ftypemod
= stat
.S_IFMT(fmode
);
3079 fuid
= format(int(os
.getuid()), 'x').lower();
3080 except AttributeError:
3081 fuid
= format(int(0), 'x').lower();
3083 fuid
= format(int(0), 'x').lower();
3085 fgid
= format(int(os
.getgid()), 'x').lower();
3086 except AttributeError:
3087 fgid
= format(int(0), 'x').lower();
3089 fgid
= format(int(0), 'x').lower();
3093 userinfo
= pwd
.getpwuid(os
.getuid());
3094 funame
= userinfo
.pw_name
;
3097 except AttributeError:
3105 groupinfo
= grp
.getgrgid(os
.getgid());
3106 fgname
= groupinfo
.gr_name
;
3109 except AttributeError:
3113 fcontents
= "".encode('UTF-8');
3115 fcontents
= zipfp
.read(member
.filename
);
3116 ftypehex
= format(ftype
, 'x').lower();
3117 extrafields
= format(len(extradata
), 'x').lower();
3118 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3119 if(len(extradata
)>0):
3120 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3121 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3122 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
];
3123 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3124 catoutlenhex
= format(catoutlen
, 'x').lower();
3125 catoutlist
.insert(0, catoutlenhex
);
3126 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3127 if(len(extradata
)>0):
3128 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3129 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3130 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3131 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3132 if(checksumtype
=="none" or checksumtype
==""):
3133 catfileheadercshex
= format(0, 'x').lower();
3134 catfilecontentcshex
= format(0, 'x').lower();
3135 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3136 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3137 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3138 elif(checksumtype
=="crc16_ccitt"):
3139 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3140 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3141 elif(checksumtype
=="adler32"):
3142 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3143 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3144 elif(checksumtype
=="crc32"):
3145 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3146 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3147 elif(checksumtype
=="crc64_ecma"):
3148 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3149 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3150 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3151 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3152 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3153 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3154 checksumoutstr
= hashlib
.new(checksumtype
);
3155 checksumoutstr
.update("".encode('UTF-8'));
3156 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3157 checksumoutstr
= hashlib
.new(checksumtype
);
3158 checksumoutstr
.update(fcontents
);
3159 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3161 catfileheadercshex
= format(0, 'x').lower();
3162 catfilecontentcshex
= format(0, 'x').lower();
3163 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3164 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3165 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3166 if(checksumtype
=="none" or checksumtype
==""):
3167 catfileheadercshex
= format(0, 'x').lower();
3168 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3169 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3170 elif(checksumtype
=="crc16_ccitt"):
3171 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3172 elif(checksumtype
=="adler32"):
3173 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3174 elif(checksumtype
=="crc32"):
3175 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3176 elif(checksumtype
=="crc64_ecma"):
3177 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3178 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3179 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3180 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3181 checksumoutstr
= hashlib
.new(checksumtype
);
3182 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3183 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3185 catfileheadercshex
= format(0, 'x').lower();
3186 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3187 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3188 nullstrecd
= formatspecs
[5].encode('UTF-8');
3189 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3190 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
3191 catfp
.write(catfileout
);
3194 os
.fsync(catfp
.fileno());
3195 except io
.UnsupportedOperation
:
3197 except AttributeError:
3200 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3201 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3202 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3205 os
.fsync(catfp
.fileno());
3206 except io
.UnsupportedOperation
:
3208 except AttributeError:
3212 if(hasattr(sys
.stdout
, "buffer")):
3213 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3215 shutil
.copyfileobj(catfp
, sys
.stdout
);
3216 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3217 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3219 upload_file_to_internet_file(catfp
, outfile
);
3227 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
3229 if(not rarfile_support
):
3230 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3233 if(rarfile_support
):
3234 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3235 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3236 outfile
= RemoveWindowsPath(outfile
);
3237 checksumtype
= checksumtype
.lower();
3238 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3239 checksumtype
="crc32";
3240 if(checksumtype
=="none"):
3242 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
3244 if(compression
not in compressionlist
and compression
is None):
3245 compression
= "auto";
3247 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3248 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3249 if(os
.path
.exists(outfile
)):
3254 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3256 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3259 fbasename
= os
.path
.splitext(outfile
)[0];
3260 fextname
= os
.path
.splitext(outfile
)[1];
3261 catfp
= CompressOpenFile(outfile
, compressionlevel
);
3262 catver
= formatspecs
[6];
3263 fileheaderver
= str(int(catver
.replace(".", "")));
3264 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3265 catfp
.write(fileheader
.encode('UTF-8'));
3271 inodetocatinode
= {};
3272 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3274 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
3276 rarfp
= rarfile
.RarFile(infile
, "r");
3277 rartest
= rarfp
.testrar();
3279 VerbosePrintOut("Bad file found!");
3280 numfiles
= int(len(rarfp
.infolist()));
3281 fnumfiles
= format(int(len(rarfp
.infolist())), 'x').lower();
3282 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
3283 if(checksumtype
=="none" or checksumtype
==""):
3284 catfileheadercshex
= format(0, 'x').lower();
3285 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3286 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3287 elif(checksumtype
=="crc16_ccitt"):
3288 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3289 elif(checksumtype
=="adler32"):
3290 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3291 elif(checksumtype
=="crc32"):
3292 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3293 elif(checksumtype
=="crc64_ecma"):
3294 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3295 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3296 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3297 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3298 checksumoutstr
= hashlib
.new(checksumtype
);
3299 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
3300 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3302 catfileheadercshex
= format(0, 'x').lower();
3303 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3304 catfp
.write(fnumfilesa
.encode('UTF-8'));
3307 os
.fsync(catfp
.fileno());
3308 except io
.UnsupportedOperation
:
3310 except AttributeError:
3312 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
3315 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
3318 member
.external_attr
3320 except AttributeError:
3322 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
3325 member
.external_attr
3327 except AttributeError:
3332 catfhstart
= catfp
.tell();
3333 if(re
.findall("^[.|/]", member
.filename
)):
3334 fname
= member
.filename
;
3336 fname
= "./"+member
.filename
;
3337 rarinfo
= rarfp
.getinfo(member
.filename
);
3339 VerbosePrintOut(fname
);
3340 if(is_unix
and member
.external_attr
!=0):
3341 fpremode
= int(member
.external_attr
);
3342 elif(member
.is_file()):
3343 fpremode
= int(stat
.S_IFREG
+ 438);
3344 elif(member
.is_symlink()):
3345 fpremode
= int(stat
.S_IFLNK
+ 438);
3346 elif(member
.is_dir()):
3347 fpremode
= int(stat
.S_IFDIR
+ 511);
3348 if(is_windows
and member
.external_attr
!=0):
3349 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
3351 fwinattributes
= format(int(0), 'x').lower();
3354 if(member
.is_file()):
3356 elif(member
.is_symlink()):
3358 elif(member
.is_dir()):
3362 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
3363 fcurfid
= format(int(curfid
), 'x').lower();
3364 fcurinode
= format(int(curfid
), 'x').lower();
3365 curfid
= curfid
+ 1;
3366 fdev_minor
= format(int(0), 'x').lower();
3367 fdev_major
= format(int(0), 'x').lower();
3368 frdev_minor
= format(int(0), 'x').lower();
3369 frdev_major
= format(int(0), 'x').lower();
3371 fsize
= format(int("0"), 'x').lower();
3373 fsize
= format(int(member
.file_size
), 'x').lower();
3375 fsize
= format(int(member
.file_size
), 'x').lower();
3378 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
3380 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3381 except AttributeError:
3382 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3383 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3386 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
3388 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3389 except AttributeError:
3390 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3391 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3392 if(is_unix
and member
.external_attr
!=0):
3393 fmode
= format(int(member
.external_attr
), 'x').lower();
3394 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
3395 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
3396 elif(member
.is_file()):
3397 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3398 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3399 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3400 elif(member
.is_symlink()):
3401 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
3402 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3403 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3404 elif(member
.is_dir()):
3405 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3406 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3407 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3409 fuid
= format(int(os
.getuid()), 'x').lower();
3410 except AttributeError:
3411 fuid
= format(int(0), 'x').lower();
3413 fuid
= format(int(0), 'x').lower();
3415 fgid
= format(int(os
.getgid()), 'x').lower();
3416 except AttributeError:
3417 fgid
= format(int(0), 'x').lower();
3419 fgid
= format(int(0), 'x').lower();
3423 userinfo
= pwd
.getpwuid(os
.getuid());
3424 funame
= userinfo
.pw_name
;
3427 except AttributeError:
3435 groupinfo
= grp
.getgrgid(os
.getgid());
3436 fgname
= groupinfo
.gr_name
;
3439 except AttributeError:
3443 fcontents
= "".encode('UTF-8');
3445 fcontents
= rarfp
.read(member
.filename
);
3446 ftypehex
= format(ftype
, 'x').lower();
3447 extrafields
= format(len(extradata
), 'x').lower();
3448 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3449 if(len(extradata
)>0):
3450 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3451 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3452 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
];
3453 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3454 catoutlenhex
= format(catoutlen
, 'x').lower();
3455 catoutlist
.insert(0, catoutlenhex
);
3456 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3457 if(len(extradata
)>0):
3458 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3459 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3460 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3461 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3462 if(checksumtype
=="none" or checksumtype
==""):
3463 catfileheadercshex
= format(0, 'x').lower();
3464 catfilecontentcshex
= format(0, 'x').lower();
3465 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3466 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3467 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3468 elif(checksumtype
=="crc16_ccitt"):
3469 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3470 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3471 elif(checksumtype
=="adler32"):
3472 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3473 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3474 elif(checksumtype
=="crc32"):
3475 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3476 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3477 elif(checksumtype
=="crc64_ecma"):
3478 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3479 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3480 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3481 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3482 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3483 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3484 checksumoutstr
= hashlib
.new(checksumtype
);
3485 checksumoutstr
.update("".encode('UTF-8'));
3486 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3487 checksumoutstr
= hashlib
.new(checksumtype
);
3488 checksumoutstr
.update(fcontents
);
3489 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3491 catfileheadercshex
= format(0, 'x').lower();
3492 catfilecontentcshex
= format(0, 'x').lower();
3493 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3494 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3495 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
3496 if(checksumtype
=="none" or checksumtype
==""):
3497 catfileheadercshex
= format(0, 'x').lower()
3498 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3499 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
3500 elif(checksumtype
=="crc16_ccitt"):
3501 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
3502 elif(checksumtype
=="adler32"):
3503 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
3504 elif(checksumtype
=="crc32"):
3505 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
3506 elif(checksumtype
=="crc64_ecma"):
3507 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
3508 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3509 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
3510 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3511 checksumoutstr
= hashlib
.new(checksumtype
)
3512 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'))
3513 catfileheadercshex
= checksumoutstr
.hexdigest().lower()
3515 catfileheadercshex
= format(0, 'x').lower()
3516 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
3517 catfileoutstrecd
= catfileoutstr
.encode('UTF-8')
3518 nullstrecd
= formatspecs
[5].encode('UTF-8')
3519 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
3520 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
)
3521 catfp
.write(catfileout
)
3524 os
.fsync(catfp
.fileno())
3525 except io
.UnsupportedOperation
:
3527 except AttributeError:
3530 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3531 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3532 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
3535 os
.fsync(catfp
.fileno())
3536 except io
.UnsupportedOperation
:
3538 except AttributeError:
3542 if(hasattr(sys
.stdout
, "buffer")):
3543 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3545 shutil
.copyfileobj(catfp
, sys
.stdout
);
3546 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3547 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3549 upload_file_to_internet_file(catfp
, outfile
);
3557 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
3559 if(not py7zr_support
):
3560 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3564 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3565 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3566 outfile
= RemoveWindowsPath(outfile
);
3567 checksumtype
= checksumtype
.lower();
3568 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3569 checksumtype
="crc32";
3570 if(checksumtype
=="none"):
3572 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
3574 if(compression
not in compressionlist
and compression
is None):
3575 compression
= "auto";
3577 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3578 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3579 if(os
.path
.exists(outfile
)):
3584 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3586 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3589 fbasename
= os
.path
.splitext(outfile
)[0];
3590 fextname
= os
.path
.splitext(outfile
)[1];
3591 catfp
= CompressOpenFile(outfile
, compressionlevel
);
3592 catver
= formatspecs
[6];
3593 fileheaderver
= str(int(catver
.replace(".", "")));
3594 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3595 catfp
.write(fileheader
.encode('UTF-8'));
3601 inodetocatinode
= {};
3602 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3604 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
3605 file_content
= szpfp
.readall();
3606 #sztest = szpfp.testzip();
3607 sztestalt
= szpfp
.test();
3609 VerbosePrintOut("Bad file found!");
3610 numfiles
= int(len(szpfp
.list()));
3611 fnumfiles
= format(int(len(szpfp
.list())), 'x').lower();
3612 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
3613 if(checksumtype
=="none" or checksumtype
==""):
3614 catfileheadercshex
= format(0, 'x').lower();
3615 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3616 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3617 elif(checksumtype
=="crc16_ccitt"):
3618 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3619 elif(checksumtype
=="adler32"):
3620 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3621 elif(checksumtype
=="crc32"):
3622 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3623 elif(checksumtype
=="crc64_ecma"):
3624 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3625 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3626 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3627 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3628 checksumoutstr
= hashlib
.new(checksumtype
);
3629 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
3630 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3632 catfileheadercshex
= format(0, 'x').lower();
3633 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3634 catfp
.write(fnumfilesa
.encode('UTF-8'));
3637 os
.fsync(catfp
.fileno());
3638 except io
.UnsupportedOperation
:
3640 except AttributeError:
3642 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
3643 catfhstart
= catfp
.tell();
3644 if(re
.findall("^[.|/]", member
.filename
)):
3645 fname
= member
.filename
;
3647 fname
= "./"+member
.filename
;
3649 VerbosePrintOut(fname
);
3650 if(not member
.is_directory
):
3651 fpremode
= int(stat
.S_IFREG
+ 438);
3652 elif(member
.is_directory
):
3653 fpremode
= int(stat
.S_IFDIR
+ 511);
3654 fwinattributes
= format(int(0), 'x').lower();
3657 if(member
.is_directory
):
3662 fcurfid
= format(int(curfid
), 'x').lower();
3663 fcurinode
= format(int(curfid
), 'x').lower();
3664 curfid
= curfid
+ 1;
3665 fdev_minor
= format(int(0), 'x').lower();
3666 fdev_major
= format(int(0), 'x').lower();
3667 frdev_minor
= format(int(0), 'x').lower();
3668 frdev_major
= format(int(0), 'x').lower();
3670 fsize
= format(int("0"), 'x').lower();
3671 fatime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3672 fmtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3673 fctime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3674 fbtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3675 if(member
.is_directory
):
3676 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3677 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3678 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3680 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3681 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3682 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3684 fuid
= format(int(os
.getuid()), 'x').lower();
3685 except AttributeError:
3686 fuid
= format(int(0), 'x').lower();
3688 fuid
= format(int(0), 'x').lower();
3690 fgid
= format(int(os
.getgid()), 'x').lower();
3691 except AttributeError:
3692 fgid
= format(int(0), 'x').lower();
3694 fgid
= format(int(0), 'x').lower();
3698 userinfo
= pwd
.getpwuid(os
.getuid());
3699 funame
= userinfo
.pw_name
;
3702 except AttributeError:
3710 groupinfo
= grp
.getgrgid(os
.getgid());
3711 fgname
= groupinfo
.gr_name
;
3714 except AttributeError:
3718 fcontents
= "".encode('UTF-8');
3720 fcontents
= file_content
[member
.filename
].read();
3721 fsize
= format(len(fcontents
), 'x').lower();
3722 file_content
[member
.filename
].close();
3723 ftypehex
= format(ftype
, 'x').lower();
3724 extrafields
= format(len(extradata
), 'x').lower();
3725 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3726 if(len(extradata
)>0):
3727 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3728 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3729 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
];
3730 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3731 catoutlenhex
= format(catoutlen
, 'x').lower();
3732 catoutlist
.insert(0, catoutlenhex
);
3733 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3734 if(len(extradata
)>0):
3735 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3736 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3737 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3738 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3739 if(checksumtype
=="none" or checksumtype
==""):
3740 catfileheadercshex
= format(0, 'x').lower();
3741 catfilecontentcshex
= format(0, 'x').lower();
3742 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3743 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3744 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3745 elif(checksumtype
=="crc16_ccitt"):
3746 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3747 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3748 elif(checksumtype
=="adler32"):
3749 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3750 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3751 elif(checksumtype
=="crc32"):
3752 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3753 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3754 elif(checksumtype
=="crc64_ecma"):
3755 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3756 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3757 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3758 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3759 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3760 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3761 checksumoutstr
= hashlib
.new(checksumtype
);
3762 checksumoutstr
.update("".encode('UTF-8'));
3763 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3764 checksumoutstr
= hashlib
.new(checksumtype
);
3765 checksumoutstr
.update(fcontents
);
3766 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3768 catfileheadercshex
= format(0, 'x').lower();
3769 catfilecontentcshex
= format(0, 'x').lower();
3770 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3771 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3772 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
3773 if(checksumtype
=="none" or checksumtype
==""):
3774 catfileheadercshex
= format(0, 'x').lower()
3775 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3776 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
3777 elif(checksumtype
=="crc16_ccitt"):
3778 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
3779 elif(checksumtype
=="adler32"):
3780 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
3781 elif(checksumtype
=="crc32"):
3782 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
3783 elif(checksumtype
=="crc64_ecma"):
3784 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
3785 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3786 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
3787 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3788 checksumoutstr
= hashlib
.new(checksumtype
)
3789 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'))
3790 catfileheadercshex
= checksumoutstr
.hexdigest().lower()
3792 catfileheadercshex
= format(0, 'x').lower()
3793 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
3794 catfileoutstrecd
= catfileoutstr
.encode('UTF-8')
3795 nullstrecd
= formatspecs
[5].encode('UTF-8')
3796 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
3797 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
)
3798 catfp
.write(catfileout
)
3801 os
.fsync(catfp
.fileno())
3802 except io
.UnsupportedOperation
:
3804 except AttributeError:
3807 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3808 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3809 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
3812 os
.fsync(catfp
.fileno())
3813 except io
.UnsupportedOperation
:
3815 except AttributeError:
3819 if(hasattr(sys
.stdout
, "buffer")):
3820 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3822 shutil
.copyfileobj(catfp
, sys
.stdout
);
3823 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3824 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3826 upload_file_to_internet_file(catfp
, outfile
);
3834 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFile", PackArchiveFileFromSevenZipFile
);
3836 def ArchiveFileSeekToFileNum(infile
, seekto
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3837 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3840 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3841 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
3842 if(checkcompressfile
=="tarfile"):
3843 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3844 if(checkcompressfile
=="zipfile"):
3845 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3846 if(rarfile_support
and checkcompressfile
=="rarfile"):
3847 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3848 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3849 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3850 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3857 if(hasattr(sys
.stdin
, "buffer")):
3858 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
3860 shutil
.copyfileobj(sys
.stdin
, catfp
);
3862 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3866 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3867 catfp
= download_file_from_internet_file(infile
);
3869 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3874 infile
= RemoveWindowsPath(infile
);
3875 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
3876 if(checkcompressfile
=="tarfile"):
3877 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3878 if(checkcompressfile
=="zipfile"):
3879 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3880 if(rarfile_support
and checkcompressfile
=="rarfile"):
3881 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3882 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3883 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3884 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3886 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
3887 if(not compresscheck
):
3888 fextname
= os
.path
.splitext(infile
)[1];
3889 if(fextname
==".gz"):
3890 compresscheck
= "gzip";
3891 elif(fextname
==".bz2"):
3892 compresscheck
= "bzip2";
3893 elif(fextname
==".zst"):
3894 compresscheck
= "zstd";
3895 elif(fextname
==".lz4" or fextname
==".clz4"):
3896 compresscheck
= "lz4";
3897 elif(fextname
==".lzo" or fextname
==".lzop"):
3898 compresscheck
= "lzo";
3899 elif(fextname
==".lzma" or fextname
==".xz"):
3900 compresscheck
= "lzma";
3903 if(not compresscheck
):
3905 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3910 SeekToEndOfFile(catfp);
3912 SeekToEndOfFile(catfp);
3913 CatSize = catfp.tell();
3914 CatSizeEnd = CatSize;
3922 curloc
= catfp
.tell();
3925 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
3927 catfp
.seek(curloc
, 0);
3928 catstring
= catheader
[0];
3929 catversion
= re
.findall(r
"([\d]+)$", catstring
);
3930 fprenumfiles
= catheader
[1];
3931 fnumfiles
= int(fprenumfiles
, 16);
3932 fprechecksumtype
= catheader
[2];
3933 fprechecksum
= catheader
[3];
3934 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
3935 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3936 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
3937 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
3938 catfileheadercshex
= format(0, 'x').lower();
3939 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
3940 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3941 elif(fprechecksumtype
=="crc16_ccitt"):
3942 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3943 elif(fprechecksumtype
=="adler32"):
3944 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3945 elif(fprechecksumtype
=="crc32"):
3946 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3947 elif(fprechecksumtype
=="crc64_ecma"):
3948 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3949 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
3950 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3951 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
3952 checksumoutstr
= hashlib
.new(fprechecksumtype
);
3953 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3954 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3956 catfileheadercshex
= format(0, 'x').lower();
3957 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3958 fheadtell
= len(fileheader
);
3959 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
3960 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
3962 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3963 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
3964 if(seekto
>=fnumfiles
):
3965 seekto
= fnumfiles
- 1;
3971 prefhstart
= catfp
.tell();
3973 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
3975 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
3976 if(len(preheaderdata
)==0):
3978 prefheadsize
= int(preheaderdata
[0], 16);
3979 prefnumfields
= int(preheaderdata
[1], 16);
3980 preftype
= int(preheaderdata
[2], 16);
3981 if(re
.findall("^[.|/]", preheaderdata
[3])):
3982 prefname
= preheaderdata
[3];
3984 prefname
= "./"+preheaderdata
[3];
3985 prefbasedir
= os
.path
.dirname(prefname
);
3986 preflinkname
= preheaderdata
[4];
3987 prefsize
= int(preheaderdata
[5], 16);
3988 prefatime
= int(preheaderdata
[6], 16);
3989 prefmtime
= int(preheaderdata
[7], 16);
3990 prefctime
= int(preheaderdata
[8], 16);
3991 prefbtime
= int(preheaderdata
[9], 16);
3992 prefmode
= int(preheaderdata
[10], 16);
3993 prefchmode
= stat
.S_IMODE(prefmode
);
3994 preftypemod
= stat
.S_IFMT(prefmode
);
3995 prefwinattributes
= int(preheaderdata
[11], 16);
3996 prefuid
= int(preheaderdata
[12], 16);
3997 prefuname
= preheaderdata
[13];
3998 prefgid
= int(preheaderdata
[14], 16);
3999 prefgname
= preheaderdata
[15];
4000 fid
= int(preheaderdata
[16], 16);
4001 finode
= int(preheaderdata
[17], 16);
4002 flinkcount
= int(preheaderdata
[18], 16);
4003 prefdev_minor
= int(preheaderdata
[19], 16);
4004 prefdev_major
= int(preheaderdata
[20], 16);
4005 prefrdev_minor
= int(preheaderdata
[22], 16);
4006 prefrdev_major
= int(preheaderdata
[23], 16);
4007 prefextrasize
= int(preheaderdata
[24], 16);
4008 prefextrafields
= int(preheaderdata
[25], 16);
4009 extrafieldslist
= [];
4011 extraend
= extrastart
+ prefextrafields
;
4012 extrafieldslist
= [];
4013 if(extrastart
<extraend
):
4014 extrafieldslist
.append(preheaderdata
[extrastart
]);
4015 extrastart
= extrastart
+ 1;
4016 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4017 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4018 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4020 hcmax
= len(preheaderdata
) - 2;
4023 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
4025 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4026 if(prefcs
!=prenewfcs
and not skipchecksum
):
4027 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4029 valid_archive
= False;
4030 invalid_archive
= True;
4031 prefhend
= catfp
.tell() - 1;
4032 prefcontentstart
= catfp
.tell();
4034 pyhascontents
= False;
4036 prefcontents
= catfp
.read(prefsize
);
4037 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4038 pyhascontents
= True;
4039 if(prefccs
!=prenewfccs
and not skipchecksum
):
4040 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4044 catfp
.seek(seekstart
, 0);
4046 catfheadsize
= int(preheaderdata
[0], 16);
4047 catfnumfields
= int(preheaderdata
[1], 16);
4048 catftype
= int(preheaderdata
[2], 16);
4049 if(re
.findall("^[.|/]", preheaderdata
[3])):
4050 catfname
= preheaderdata
[3];
4052 catfname
= "./"+preheaderdata
[3];
4053 catflinkname
= preheaderdata
[4];
4054 catfsize
= int(preheaderdata
[5], 16);
4055 catfbasedir
= os
.path
.dirname(catfname
);
4056 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4058 catlist
.update({'catfp': catfp
});
4063 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
4065 def ArchiveFileSeekToFileName(infile
, seekfile
=None, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4066 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4069 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4070 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
4071 if(checkcompressfile
=="tarfile"):
4072 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4073 if(checkcompressfile
=="zipfile"):
4074 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4075 if(rarfile_support
and checkcompressfile
=="rarfile"):
4076 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4077 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4078 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4079 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4086 if(hasattr(sys
.stdin
, "buffer")):
4087 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4089 shutil
.copyfileobj(sys
.stdin
, catfp
);
4091 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4095 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4096 catfp
= download_file_from_internet_file(infile
);
4097 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4103 infile
= RemoveWindowsPath(infile
);
4104 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
4105 if(checkcompressfile
=="tarfile"):
4106 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4107 if(checkcompressfile
=="zipfile"):
4108 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4109 if(rarfile_support
and checkcompressfile
=="rarfile"):
4110 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4111 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4112 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4113 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4115 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4116 if(not compresscheck
):
4117 fextname
= os
.path
.splitext(infile
)[1];
4118 if(fextname
==".gz"):
4119 compresscheck
= "gzip";
4120 elif(fextname
==".bz2"):
4121 compresscheck
= "bzip2";
4122 elif(fextname
==".zst"):
4123 compresscheck
= "zstd";
4124 elif(fextname
==".lz4" or fextname
==".clz4"):
4125 compresscheck
= "lz4";
4126 elif(fextname
==".lzo" or fextname
==".lzop"):
4127 compresscheck
= "lzo";
4128 elif(fextname
==".lzma" or fextname
==".xz"):
4129 compresscheck
= "lzma";
4132 if(not compresscheck
):
4134 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4139 SeekToEndOfFile(catfp);
4141 SeekToEndOfFile(catfp);
4142 CatSize = catfp.tell();
4143 CatSizeEnd = CatSize;
4151 curloc
= catfp
.tell();
4154 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4156 catfp
.seek(curloc
, 0);
4157 catstring
= catheader
[0];
4158 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4159 fprenumfiles
= catheader
[1];
4160 fnumfiles
= int(fprenumfiles
, 16);
4161 fprechecksumtype
= catheader
[2];
4162 fprechecksum
= catheader
[3];
4163 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4164 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4165 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4166 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
4167 catfileheadercshex
= format(0, 'x').lower();
4168 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
4169 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4170 elif(fprechecksumtype
=="crc16_ccitt"):
4171 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4172 elif(fprechecksumtype
=="adler32"):
4173 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4174 elif(fprechecksumtype
=="crc32"):
4175 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4176 elif(fprechecksumtype
=="crc64_ecma"):
4177 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4178 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
4179 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4180 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
4181 checksumoutstr
= hashlib
.new(fprechecksumtype
);
4182 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4183 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4185 catfileheadercshex
= format(0, 'x').lower();
4186 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4187 fheadtell
= len(fileheader
);
4188 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4189 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4191 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4192 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4193 seekto
= fnumfiles
- 1
4198 prefhstart
= catfp
.tell();
4200 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4202 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4203 if(len(preheaderdata
)==0):
4205 prefheadsize
= int(preheaderdata
[0], 16);
4206 prefnumfields
= int(preheaderdata
[1], 16);
4207 preftype
= int(preheaderdata
[2], 16);
4208 if(re
.findall("^[.|/]", preheaderdata
[3])):
4209 prefname
= preheaderdata
[3];
4211 prefname
= "./"+preheaderdata
[3];
4212 prefbasedir
= os
.path
.dirname(prefname
);
4213 preflinkname
= preheaderdata
[4];
4214 prefsize
= int(preheaderdata
[5], 16);
4215 prefatime
= int(preheaderdata
[6], 16);
4216 prefmtime
= int(preheaderdata
[7], 16);
4217 prefctime
= int(preheaderdata
[8], 16);
4218 prefbtime
= int(preheaderdata
[9], 16);
4219 prefmode
= int(preheaderdata
[10], 16);
4220 prefchmode
= stat
.S_IMODE(prefmode
);
4221 preftypemod
= stat
.S_IFMT(prefmode
);
4222 prefwinattributes
= int(preheaderdata
[11], 16);
4223 prefuid
= int(preheaderdata
[12], 16);
4224 prefuname
= preheaderdata
[13];
4225 prefgid
= int(preheaderdata
[14], 16);
4226 prefgname
= preheaderdata
[15];
4227 fid
= int(preheaderdata
[16], 16);
4228 finode
= int(preheaderdata
[17], 16);
4229 flinkcount
= int(preheaderdata
[18], 16);
4230 prefdev_minor
= int(preheaderdata
[19], 16);
4231 prefdev_major
= int(preheaderdata
[20], 16);
4232 prefrdev_minor
= int(preheaderdata
[22], 16);
4233 prefrdev_major
= int(preheaderdata
[23], 16);
4234 prefextrasize
= int(preheaderdata
[24], 16);
4235 prefextrafields
= int(preheaderdata
[25], 16);
4236 extrafieldslist
= [];
4238 extraend
= extrastart
+ prefextrafields
;
4239 extrafieldslist
= [];
4240 if(extrastart
<extraend
):
4241 extrafieldslist
.append(preheaderdata
[extrastart
]);
4242 extrastart
= extrastart
+ 1;
4243 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4244 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4245 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4247 hcmax
= len(preheaderdata
) - 2;
4250 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
4252 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4253 if(prefcs
!=prenewfcs
and not skipchecksum
):
4254 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4256 valid_archive
= False;
4257 invalid_archive
= True;
4258 prefhend
= catfp
.tell() - 1;
4259 prefcontentstart
= catfp
.tell();
4261 pyhascontents
= False;
4263 prefcontents
= catfp
.read(prefsize
);
4264 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4265 pyhascontents
= True;
4266 if(prefccs
!=prenewfccs
and not skipchecksum
):
4267 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4272 prefname
= preheaderdata
[2];
4273 if(re
.findall("^[.|/]", preheaderdata
[2])):
4274 prefname
= preheaderdata
[2];
4276 prefname
= "./"+preheaderdata
[2];
4277 if(prefname
==seekfile
):
4280 catfp
.seek(seekstart
, 0);
4282 catfheadsize
= int(preheaderdata
[0], 16);
4283 catfnumfields
= int(preheaderdata
[1], 16);
4284 catftype
= int(preheaderdata
[2], 16);
4285 if(re
.findall("^[.|/]", preheaderdata
[3])):
4286 catfname
= preheaderdata
[3];
4288 catfname
= "./"+preheaderdata
[3];
4289 catflinkname
= preheaderdata
[4];
4290 catfsize
= int(preheaderdata
[5], 16);
4291 catfbasedir
= os
.path
.dirname(catfname
);
4293 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4297 catlist
.update({'catfp': catfp
});
4302 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
4304 def ArchiveFileValidate(infile
, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4306 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4307 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4310 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4311 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
4312 if(checkcompressfile
=="tarfile"):
4313 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4314 if(checkcompressfile
=="zipfile"):
4315 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4316 if(rarfile_support
and checkcompressfile
=="rarfile"):
4317 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4318 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4319 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4320 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4327 if(hasattr(sys
.stdin
, "buffer")):
4328 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4330 shutil
.copyfileobj(sys
.stdin
, catfp
);
4332 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4336 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4337 catfp
= download_file_from_internet_file(infile
);
4338 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4344 infile
= RemoveWindowsPath(infile
);
4345 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
4346 if(checkcompressfile
=="tarfile"):
4347 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4348 if(checkcompressfile
=="zipfile"):
4349 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4350 if(rarfile_support
and checkcompressfile
=="rarfile"):
4351 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4352 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4353 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4354 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4356 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4357 if(not compresscheck
):
4358 fextname
= os
.path
.splitext(infile
)[1];
4359 if(fextname
==".gz"):
4360 compresscheck
= "gzip";
4361 elif(fextname
==".bz2"):
4362 compresscheck
= "bzip2";
4363 elif(fextname
==".zst"):
4364 compresscheck
= "zstd";
4365 elif(fextname
==".lz4" or fextname
==".clz4"):
4366 compresscheck
= "lz4";
4367 elif(fextname
==".lzo" or fextname
==".lzop"):
4368 compresscheck
= "lzo";
4369 elif(fextname
==".lzma" or fextname
==".xz"):
4370 compresscheck
= "lzma";
4373 if(not compresscheck
):
4375 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4380 SeekToEndOfFile(catfp);
4382 SeekToEndOfFile(catfp);
4383 CatSize = catfp.tell();
4384 CatSizeEnd = CatSize;
4392 curloc
= catfp
.tell();
4395 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4397 catfp
.seek(curloc
, 0);
4398 catstring
= catheader
[0];
4399 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4400 fprenumfiles
= catheader
[1];
4401 fnumfiles
= int(fprenumfiles
, 16);
4402 fprechecksumtype
= catheader
[2];
4403 fprechecksum
= catheader
[3];
4405 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4406 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4407 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4408 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
4409 catfileheadercshex
= format(0, 'x').lower();
4410 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
4411 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4412 elif(fprechecksumtype
=="crc16_ccitt"):
4413 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4414 elif(fprechecksumtype
=="adler32"):
4415 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4416 elif(fprechecksumtype
=="crc32"):
4417 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4418 elif(fprechecksumtype
=="crc64_ecma"):
4419 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4420 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
4421 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4422 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
4423 checksumoutstr
= hashlib
.new(fprechecksumtype
);
4424 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4425 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4427 catfileheadercshex
= format(0, 'x').lower();
4428 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4429 valid_archive
= True;
4430 invalid_archive
= False;
4432 VerbosePrintOut(infile
);
4433 VerbosePrintOut("Number of Records " + str(fnumfiles
));
4434 if(fprechecksum
==catfileheadercshex
):
4436 VerbosePrintOut("File Header Checksum Passed at offset " + str(0));
4439 VerbosePrintOut("File Header Checksum Failed at offset " + str(0));
4440 valid_archive
= False;
4441 invalid_archive
= True;
4443 VerbosePrintOut("");
4444 while(il
<fnumfiles
):
4445 catfhstart
= catfp
.tell();
4447 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4449 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4450 if(len(catheaderdata
)==0):
4452 catfheadsize
= int(catheaderdata
[0], 16);
4453 catfnumfields
= int(catheaderdata
[1], 16);
4454 catftype
= int(catheaderdata
[2], 16);
4455 if(re
.findall("^[.|/]", catheaderdata
[3])):
4456 catfname
= catheaderdata
[3];
4458 catfname
= "./"+catheaderdata
[3];
4459 catfbasedir
= os
.path
.dirname(catfname
);
4460 catflinkname
= catheaderdata
[4];
4461 catfsize
= int(catheaderdata
[5], 16);
4462 catfatime
= int(catheaderdata
[6], 16);
4463 catfmtime
= int(catheaderdata
[7], 16);
4464 catfctime
= int(catheaderdata
[8], 16);
4465 catfbtime
= int(catheaderdata
[9], 16);
4466 catfmode
= int(catheaderdata
[10], 16);
4467 catfchmode
= stat
.S_IMODE(catfmode
);
4468 catftypemod
= stat
.S_IFMT(catfmode
);
4469 prefwinattributes
= int(catheaderdata
[11], 16);
4470 catfuid
= int(catheaderdata
[12], 16);
4471 catfuname
= catheaderdata
[13];
4472 catfgid
= int(catheaderdata
[14], 16);
4473 catfgname
= catheaderdata
[15];
4474 fid
= int(catheaderdata
[16], 16);
4475 finode
= int(catheaderdata
[17], 16);
4476 flinkcount
= int(catheaderdata
[18], 16);
4477 catfdev_minor
= int(catheaderdata
[19], 16);
4478 catfdev_major
= int(catheaderdata
[20], 16);
4479 catfrdev_minor
= int(catheaderdata
[21], 16);
4480 catfrdev_major
= int(catheaderdata
[22], 16);
4481 catfextrasize
= int(catheaderdata
[23], 16);
4482 catfextrafields
= int(catheaderdata
[24], 16);
4483 extrafieldslist
= [];
4485 extraend
= extrastart
+ catfextrafields
;
4486 extrafieldslist
= [];
4487 if(extrastart
<extraend
):
4488 extrafieldslist
.append(catheaderdata
[extrastart
]);
4489 extrastart
= extrastart
+ 1;
4490 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4491 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4492 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4494 hcmax
= len(catheaderdata
) - 2;
4497 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
4499 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4501 VerbosePrintOut(catfname
);
4502 VerbosePrintOut("Record Number " + str(il
) + "; File ID " + str(fid
) + "; iNode Number " + str(finode
));
4503 if(catfcs
==catnewfcs
):
4505 VerbosePrintOut("File Header Checksum Passed at offset " + str(catfhstart
));
4508 VerbosePrintOut("File Header Checksum Failed at offset " + str(catfhstart
));
4509 valid_archive
= False;
4510 invalid_archive
= True;
4511 catfhend
= catfp
.tell() - 1;
4512 catfcontentstart
= catfp
.tell();
4514 pyhascontents
= False;
4516 catfcontents
= catfp
.read(catfsize
);
4517 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
4518 pyhascontents
= True;
4519 if(catfccs
==catnewfccs
):
4521 VerbosePrintOut("File Content Checksum Passed at offset " + str(catfcontentstart
));
4524 VerbosePrintOut("File Content Checksum Failed at offset " + str(catfcontentstart
));
4525 valid_archive
= False;
4526 invalid_archive
= True;
4528 VerbosePrintOut("");
4541 create_alias_function("", __file_format_name__
, "Validate", ArchiveFileValidate
);
4543 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4544 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4547 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4548 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
4549 if(checkcompressfile
=="tarfile"):
4550 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4551 if(checkcompressfile
=="zipfile"):
4552 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4553 if(rarfile_support
and checkcompressfile
=="rarfile"):
4554 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4555 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4556 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4557 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4564 if(hasattr(sys
.stdin
, "buffer")):
4565 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4567 shutil
.copyfileobj(sys
.stdin
, catfp
);
4569 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4573 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4574 catfp
= download_file_from_internet_file(infile
);
4575 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4581 infile
= RemoveWindowsPath(infile
);
4582 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
4583 if(checkcompressfile
=="tarfile"):
4584 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4585 if(checkcompressfile
=="zipfile"):
4586 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4587 if(rarfile_support
and checkcompressfile
=="rarfile"):
4588 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4589 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4590 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4591 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4593 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4594 if(not compresscheck
):
4595 fextname
= os
.path
.splitext(infile
)[1];
4596 if(fextname
==".gz"):
4597 compresscheck
= "gzip";
4598 elif(fextname
==".bz2"):
4599 compresscheck
= "bzip2";
4600 elif(fextname
==".zst"):
4601 compresscheck
= "zstd";
4602 elif(fextname
==".lz4" or fextname
==".clz4"):
4603 compresscheck
= "lz4";
4604 elif(fextname
==".lzo" or fextname
==".lzop"):
4605 compresscheck
= "lzo";
4606 elif(fextname
==".lzma" or fextname
==".xz"):
4607 compresscheck
= "lzma";
4610 if(not compresscheck
):
4612 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4617 SeekToEndOfFile(catfp);
4619 SeekToEndOfFile(catfp);
4620 CatSize = catfp.tell();
4621 CatSizeEnd = CatSize;
4629 curloc
= catfp
.tell();
4632 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4634 catfp
.seek(curloc
, 0);
4635 catstring
= catheader
[0];
4636 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4637 fprenumfiles
= catheader
[1];
4638 fnumfiles
= int(fprenumfiles
, 16);
4639 fprechecksumtype
= catheader
[2];
4640 fprechecksum
= catheader
[3];
4641 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4642 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4643 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4644 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
4645 catfileheadercshex
= format(0, 'x').lower();
4646 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
4647 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4648 elif(fprechecksumtype
=="crc16_ccitt"):
4649 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4650 elif(fprechecksumtype
=="adler32"):
4651 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4652 elif(fprechecksumtype
=="crc32"):
4653 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4654 elif(fprechecksumtype
=="crc64_ecma"):
4655 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4656 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
4657 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4658 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
4659 checksumoutstr
= hashlib
.new(fprechecksumtype
);
4660 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4661 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4663 catfileheadercshex
= format(0, 'x').lower();
4664 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4665 fheadtell
= len(fileheader
);
4666 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4667 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4669 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4670 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4671 if(seekstart
<0 and seekstart
>fnumfiles
):
4673 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
4674 seekend
= fnumfiles
;
4675 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
4676 seekend
= fnumfiles
- abs(seekend
);
4679 while(il
< seekstart
):
4680 prefhstart
= catfp
.tell();
4682 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4684 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4685 if(len(preheaderdata
)==0):
4687 prefheadsize
= int(preheaderdata
[0], 16);
4688 prefnumfields
= int(preheaderdata
[1], 16);
4689 if(re
.findall("^[.|/]", preheaderdata
[3])):
4690 prefname
= preheaderdata
[3];
4692 prefname
= "./"+preheaderdata
[3];
4693 prefsize
= int(preheaderdata
[5], 16);
4694 prefextrasize
= int(preheaderdata
[23], 16);
4695 prefextrafields
= int(preheaderdata
[24], 16);
4696 extrafieldslist
= [];
4698 extraend
= extrastart
+ prefextrafields
;
4699 extrafieldslist
= [];
4700 if(extrastart
<extraend
):
4701 extrafieldslist
.append(preheaderdata
[extrastart
]);
4702 extrastart
= extrastart
+ 1;
4703 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4704 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4705 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4707 hcmax
= len(preheaderdata
) - 2;
4710 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
4712 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4713 if(prefcs
!=prenewfcs
and not skipchecksum
):
4714 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4716 valid_archive
= False;
4717 invalid_archive
= True;
4718 prefhend
= catfp
.tell() - 1;
4719 prefcontentstart
= catfp
.tell();
4721 pyhascontents
= False;
4723 prefcontents
= catfp
.read(prefsize
);
4724 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4725 pyhascontents
= True;
4726 if(prefccs
!=prenewfccs
and not skipchecksum
):
4727 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4731 fileidnum
= seekstart
;
4733 while(fileidnum
<seekend
):
4734 catfhstart
= catfp
.tell();
4736 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4738 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4739 if(len(catheaderdata
)==0):
4741 catfheadsize
= int(catheaderdata
[0], 16);
4742 catfnumfields
= int(catheaderdata
[1], 16);
4743 catftype
= int(catheaderdata
[2], 16);
4744 if(re
.findall("^[.|/]", catheaderdata
[3])):
4745 catfname
= catheaderdata
[3];
4747 catfname
= "./"+catheaderdata
[3];
4748 catfbasedir
= os
.path
.dirname(catfname
);
4749 catflinkname
= catheaderdata
[4];
4750 catfsize
= int(catheaderdata
[5], 16);
4751 catfatime
= int(catheaderdata
[6], 16);
4752 catfmtime
= int(catheaderdata
[7], 16);
4753 catfctime
= int(catheaderdata
[8], 16);
4754 catfbtime
= int(catheaderdata
[9], 16);
4755 catfmode
= int(catheaderdata
[10], 16);
4756 catfchmode
= stat
.S_IMODE(catfmode
);
4757 catftypemod
= stat
.S_IFMT(catfmode
);
4758 catfwinattributes
= int(catheaderdata
[11], 16);
4759 catfuid
= int(catheaderdata
[12], 16);
4760 catfuname
= catheaderdata
[13];
4761 catfgid
= int(catheaderdata
[14], 16);
4762 catfgname
= catheaderdata
[15];
4763 fid
= int(catheaderdata
[16], 16);
4764 finode
= int(catheaderdata
[17], 16);
4765 flinkcount
= int(catheaderdata
[18], 16);
4766 catfdev_minor
= int(catheaderdata
[19], 16);
4767 catfdev_major
= int(catheaderdata
[20], 16);
4768 catfrdev_minor
= int(catheaderdata
[21], 16);
4769 catfrdev_major
= int(catheaderdata
[22], 16);
4770 catfextrasize
= int(catheaderdata
[23], 16);
4771 catfextrafields
= int(catheaderdata
[24], 16);
4772 extrafieldslist
= [];
4774 extraend
= extrastart
+ catfextrafields
;
4775 extrafieldslist
= [];
4776 if(extrastart
<extraend
):
4777 extrafieldslist
.append(catheaderdata
[extrastart
]);
4778 extrastart
= extrastart
+ 1;
4779 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4780 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4781 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4783 hcmax
= len(catheaderdata
) - 2;
4786 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
4788 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4789 if(catfcs
!=catnewfcs
and not skipchecksum
):
4790 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
4792 catfhend
= catfp
.tell() - 1;
4793 catfcontentstart
= catfp
.tell();
4795 pyhascontents
= False;
4796 if(catfsize
>0 and not listonly
):
4797 catfcontents
= catfp
.read(catfsize
);
4798 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
4799 pyhascontents
= True;
4800 if(catfccs
!=catnewfccs
and skipchecksum
):
4801 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
4803 if(catfsize
>0 and listonly
):
4804 catfp
.seek(catfsize
, 1);
4805 pyhascontents
= False;
4807 catfcontentend
= catfp
.tell() - 1;
4808 catlist
['ffilelist'].update({realidnum
: {'fid': realidnum
, 'fidalt': fileidnum
, 'fheadersize': catfheadsize
, 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
, 'fatime': catfatime
, 'fmtime': catfmtime
, 'fctime': catfctime
, 'fbtime': catfbtime
, 'fmode': catfmode
, 'fchmode': catfchmode
, 'ftypemod': catftypemod
, 'fwinattributes': catfwinattributes
, 'fuid': catfuid
, 'funame': catfuname
, 'fgid': catfgid
, 'fgname': catfgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': catfdev_minor
, 'fmajor': catfdev_major
, 'frminor': catfrdev_minor
, 'frmajor': catfrdev_major
, 'fchecksumtype': catfchecksumtype
, 'fnumfields': catfnumfields
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': catfextrasize
, 'fextralist': extrafieldslist
, 'fheaderchecksum': catfcs
, 'fcontentchecksum': catfccs
, 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': catfcontents
} });
4809 fileidnum
= fileidnum
+ 1;
4810 realidnum
= realidnum
+ 1;
4812 catlist
.update({'catfp': catfp
});
4817 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
4819 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4820 catfp
= BytesIO(catstr
);
4821 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4822 return listcatfiles
;
4824 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
4826 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4828 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4829 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4830 return listcatfiles
;
4832 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4834 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4835 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4836 return listcatfiles
;
4838 if(not rarfile_support
):
4839 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4842 if(rarfile_support
):
4843 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4845 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4846 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4847 return listcatfiles
;
4849 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4850 catver
= formatspecs
[6];
4851 fileheaderver
= str(int(catver
.replace(".", "")));
4852 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4853 advancedlist
= formatspecs
[8];
4854 altinode
= formatspecs
[9];
4857 for line
in sys
.stdin
:
4858 infilelist
.append(line
.strip());
4859 infilelist
= list(filter(None, infilelist
));
4860 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
4861 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
4863 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
4864 for line
in finfile
:
4865 infilelist
.append(line
.strip());
4866 infilelist
= list(filter(None, infilelist
));
4868 if(isinstance(infiles
, (list, tuple, ))):
4869 infilelist
= list(filter(None, infiles
));
4870 elif(isinstance(infiles
, (str, ))):
4871 infilelist
= list(filter(None, [infiles
]));
4873 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
4875 GetDirList
= ListDir(infilelist
, followlink
, False);
4883 inodetocatinode
= {};
4885 fnumfiles
= int(len(GetDirList
));
4886 catver
= formatspecs
[6];
4887 fileheaderver
= str(int(catver
.replace(".", "")));
4888 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4889 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4890 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4891 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4892 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4893 if(checksumtype
=="none" or checksumtype
==""):
4894 catfileheadercshex
= format(0, 'x').lower();
4895 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4896 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4897 elif(checksumtype
=="crc16_ccitt"):
4898 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4899 elif(checksumtype
=="adler32"):
4900 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4901 elif(checksumtype
=="crc32"):
4902 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4903 elif(checksumtype
=="crc64_ecma"):
4904 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4905 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4906 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4907 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4908 checksumoutstr
= hashlib
.new(checksumtype
);
4909 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4910 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4912 catfileheadercshex
= format(0, 'x').lower();
4913 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4914 fheadtell
= len(fileheader
);
4915 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4916 for curfname
in GetDirList
:
4917 if(re
.findall("^[.|/]", curfname
)):
4920 fname
= "./"+curfname
;
4922 VerbosePrintOut(fname
);
4923 if(not followlink
or followlink
is None):
4924 fstatinfo
= os
.lstat(fname
);
4926 fstatinfo
= os
.stat(fname
);
4927 fpremode
= fstatinfo
.st_mode
;
4928 finode
= fstatinfo
.st_ino
;
4929 flinkcount
= fstatinfo
.st_nlink
;
4931 if(stat
.S_ISREG(fpremode
)):
4933 elif(stat
.S_ISLNK(fpremode
)):
4935 elif(stat
.S_ISCHR(fpremode
)):
4937 elif(stat
.S_ISBLK(fpremode
)):
4939 elif(stat
.S_ISDIR(fpremode
)):
4941 elif(stat
.S_ISFIFO(fpremode
)):
4943 elif(stat
.S_ISSOCK(fpremode
)):
4945 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
4947 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
4949 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
4954 fbasedir
= os
.path
.dirname(fname
);
4956 if(not followlink
and finode
!=0):
4958 if(finode
in inodelist
):
4960 flinkname
= inodetofile
[finode
];
4964 fcurinode
= inodetocatinode
[finode
];
4965 if(finode
not in inodelist
):
4966 inodelist
.append(finode
);
4967 inodetofile
.update({finode
: fname
});
4968 inodetocatinode
.update({finode
: curinode
});
4972 fcurinode
= curinode
;
4973 curinode
= curinode
+ 1;
4975 fcurinode
= curinode
;
4976 curinode
= curinode
+ 1;
4977 curfid
= curfid
+ 1;
4979 flinkname
= os
.readlink(fname
);
4980 fdev
= fstatinfo
.st_dev
;
4981 getfdev
= GetDevMajorMinor(fdev
);
4982 fdev_minor
= getfdev
[0];
4983 fdev_major
= getfdev
[1];
4984 frdev
= fstatinfo
.st_dev
;
4985 if(hasattr(fstatinfo
, "st_rdev")):
4986 frdev
= fstatinfo
.st_rdev
;
4988 frdev
= fstatinfo
.st_dev
;
4989 getfrdev
= GetDevMajorMinor(frdev
);
4990 frdev_minor
= getfrdev
[0];
4991 frdev_major
= getfrdev
[1];
4992 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
4994 if(ftype
==0 or ftype
==7):
4995 fsize
= fstatinfo
.st_size
;
4996 fatime
= fstatinfo
.st_atime
;
4997 fmtime
= fstatinfo
.st_mtime
;
4998 fctime
= fstatinfo
.st_ctime
;
4999 if(hasattr(fstatinfo
, "st_birthtime")):
5000 fbtime
= fstatinfo
.st_birthtime
;
5002 fbtime
= fstatinfo
.st_ctime
;
5003 fmode
= fstatinfo
.st_mode
;
5004 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
5005 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
5006 fuid
= fstatinfo
.st_uid
;
5007 fgid
= fstatinfo
.st_gid
;
5012 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
5013 funame
= userinfo
.pw_name
;
5022 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
5023 fgname
= groupinfo
.gr_name
;
5028 fdev_minor
= fdev_minor
;
5029 fdev_major
= fdev_major
;
5030 frdev_minor
= frdev_minor
;
5031 frdev_major
= frdev_major
;
5033 flinkcount
= flinkcount
;
5034 if(hasattr(fstatinfo
, "st_file_attributes")):
5035 fwinattributes
= fstatinfo
.st_file_attributes
;
5038 fcontents
= "".encode('UTF-8');
5040 if(ftype
==0 or ftype
==7):
5041 with
open(fname
, "rb") as fpc
:
5043 chunk
= fpc
.read(chunk_size
);
5047 if(followlink
and (ftype
==1 or ftype
==2)):
5048 flstatinfo
= os
.stat(flinkname
);
5049 with
open(flinkname
, "rb") as fpc
:
5051 chunk
= fpc
.read(chunk_size
);
5055 ftypehex
= format(ftype
, 'x').lower();
5056 extrafields
= len(extradata
);
5057 extrafieldslist
= extradata
;
5058 catfextrafields
= extrafields
;
5059 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5060 if(len(extradata
)>0):
5061 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5062 extrasizelen
= len(extrasizestr
);
5063 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5064 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(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()];
5065 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5066 catoutlenhex
= format(catoutlen
, 'x').lower();
5067 catoutlist
.insert(0, catoutlenhex
);
5068 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5069 if(len(extradata
)>0):
5070 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5071 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5072 catfnumfields
= catoutlen
;
5073 if(checksumtype
=="none" or checksumtype
==""):
5074 catfileheadercshex
= format(0, 'x').lower();
5075 catfilecontentcshex
= format(0, 'x').lower();
5076 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5077 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
5078 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
5079 elif(checksumtype
=="crc16_ccitt"):
5080 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
5081 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
5082 elif(checksumtype
=="adler32"):
5083 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5084 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
5085 elif(checksumtype
=="crc32"):
5086 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5087 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
5088 elif(checksumtype
=="crc64_ecma"):
5089 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5090 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
5091 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5092 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5093 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
5094 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5095 checksumoutstr
= hashlib
.new(checksumtype
);
5096 checksumoutstr
.update("".encode('UTF-8'));
5097 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5098 checksumoutstr
= hashlib
.new(checksumtype
);
5099 checksumoutstr
.update(fcontents
);
5100 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
5102 catfileheadercshex
= format(0, 'x').lower();
5103 catfilecontentcshex
= format(0, 'x').lower();
5104 catfhstart
= fheadtell
;
5105 fheadtell
+= len(catfileoutstr
);
5106 catfhend
= fheadtell
- 1;
5107 catfcontentstart
= fheadtell
;
5108 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5109 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
5110 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5111 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
]
5112 if(checksumtype
=="none" or checksumtype
==""):
5113 catfileheadercshex
= format(0, 'x').lower();
5114 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5115 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5116 elif(checksumtype
=="crc16_ccitt"):
5117 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5118 elif(checksumtype
=="adler32"):
5119 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5120 elif(checksumtype
=="crc32"):
5121 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5122 elif(checksumtype
=="crc64_ecma"):
5123 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5124 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5125 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5126 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5127 checksumoutstr
= hashlib
.new(checksumtype
);
5128 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5129 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5131 catfileheadercshex
= format(0, 'x').lower();
5132 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5133 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5134 nullstrecd
= formatspecs
[5].encode('UTF-8');
5135 fheadtell
+= len(catfileoutstr
) + 1;
5136 catfcontentend
= fheadtell
- 1;
5137 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5138 pyhascontents
= False;
5139 if(int(fsize
)>0 and not listonly
):
5140 pyhascontents
= True;
5141 if(int(fsize
)>0 and listonly
):
5143 pyhascontents
= False;
5144 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fwinattributes': fwinattributes
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
5145 fileidnum
= fileidnum
+ 1;
5148 def TarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5154 inodetocatinode
= {};
5158 if(hasattr(sys
.stdin
, "buffer")):
5159 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5161 shutil
.copyfileobj(sys
.stdin
, infile
);
5166 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5167 infile
= download_file_from_internet_file(infile
);
5172 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5174 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
5176 if(not tarfile
.is_tarfile(infile
)):
5178 except AttributeError:
5179 if(not is_tarfile(infile
)):
5184 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5185 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
5187 tarfp
= tarfile
.open(infile
, "r");
5188 except FileNotFoundError
:
5190 fnumfiles
= int(len(tarfp
.getmembers()));
5191 catver
= formatspecs
[6];
5192 fileheaderver
= str(int(catver
.replace(".", "")));
5193 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5194 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5195 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5196 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5197 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5198 if(checksumtype
=="none" or checksumtype
==""):
5199 catfileheadercshex
= format(0, 'x').lower();
5200 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5201 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5202 elif(checksumtype
=="crc16_ccitt"):
5203 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5204 elif(checksumtype
=="adler32"):
5205 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5206 elif(checksumtype
=="crc32"):
5207 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5208 elif(checksumtype
=="crc64_ecma"):
5209 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5210 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5211 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5212 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5213 checksumoutstr
= hashlib
.new(checksumtype
);
5214 checksumoutstr
.update(fileheader
.encode('UTF-8'));
5215 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5217 catfileheadercshex
= format(0, 'x').lower();
5218 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5219 fheadtell
= len(fileheader
);
5220 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5221 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
5222 if(re
.findall("^[.|/]", member
.name
)):
5223 fname
= member
.name
;
5225 fname
= "./"+member
.name
;
5227 VerbosePrintOut(fname
);
5228 fpremode
= member
.mode
;
5229 ffullmode
= member
.mode
;
5233 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5235 elif(member
.isdev()):
5236 ffullmode
= member
.mode
;
5238 elif(member
.islnk()):
5239 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5241 elif(member
.issym()):
5242 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
5244 elif(member
.ischr()):
5245 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
5247 elif(member
.isblk()):
5248 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
5250 elif(member
.isdir()):
5251 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
5253 elif(member
.isfifo()):
5254 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
5256 elif(member
.issparse()):
5257 ffullmode
= member
.mode
;
5260 ffullmode
= member
.mode
;
5263 fbasedir
= os
.path
.dirname(fname
);
5267 curfid
= curfid
+ 1;
5269 flinkname
= member
.linkname
;
5270 fdev_minor
= member
.devminor
;
5271 fdev_major
= member
.devmajor
;
5272 frdev_minor
= member
.devminor
;
5273 frdev_major
= member
.devmajor
;
5274 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5276 elif(ftype
==0 or ftype
==7):
5277 fsize
= member
.size
;
5279 fsize
= member
.size
;
5280 fatime
= member
.mtime
;
5281 fmtime
= member
.mtime
;
5282 fctime
= member
.mtime
;
5283 fbtime
= member
.mtime
;
5285 fchmode
= stat
.S_IMODE(ffullmode
);
5286 ftypemod
= stat
.S_IFMT(ffullmode
);
5289 funame
= member
.uname
;
5290 fgname
= member
.gname
;
5291 flinkcount
= flinkcount
;
5292 fwinattributes
= int(0);
5293 fcontents
= "".encode('UTF-8');
5295 if(ftype
==0 or ftype
==7):
5296 with tarfp
.extractfile(member
) as fpc
:
5298 chunk
= fpc
.read(chunk_size
);
5302 ftypehex
= format(ftype
, 'x').lower();
5303 extrafields
= len(extradata
);
5304 extrafieldslist
= extradata
;
5305 catfextrafields
= extrafields
;
5306 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5307 if(len(extradata
)>0):
5308 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5309 extrasizelen
= len(extrasizestr
);
5310 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5311 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(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()];
5312 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5313 catoutlenhex
= format(catoutlen
, 'x').lower();
5314 catoutlist
.insert(0, catoutlenhex
);
5315 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5316 if(len(extradata
)>0):
5317 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5318 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5319 catfnumfields
= catoutlen
;
5320 if(checksumtype
=="none" or checksumtype
==""):
5321 catfileheadercshex
= format(0, 'x').lower();
5322 catfilecontentcshex
= format(0, 'x').lower();
5323 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5324 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
5325 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
5326 elif(checksumtype
=="crc16_ccitt"):
5327 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
5328 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
5329 elif(checksumtype
=="adler32"):
5330 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5331 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
5332 elif(checksumtype
=="crc32"):
5333 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5334 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
5335 elif(checksumtype
=="crc64_ecma"):
5336 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5337 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
5338 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5339 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5340 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
5341 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5342 checksumoutstr
= hashlib
.new(checksumtype
);
5343 checksumoutstr
.update("".encode('UTF-8'));
5344 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5345 checksumoutstr
= hashlib
.new(checksumtype
);
5346 checksumoutstr
.update(fcontents
);
5347 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
5349 catfileheadercshex
= format(0, 'x').lower();
5350 catfilecontentcshex
= format(0, 'x').lower();
5351 catfhstart
= fheadtell
;
5352 fheadtell
+= len(catfileoutstr
);
5353 catfhend
= fheadtell
- 1;
5354 catfcontentstart
= fheadtell
;
5355 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5356 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
5357 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5358 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
]
5359 if(checksumtype
=="none" or checksumtype
==""):
5360 catfileheadercshex
= format(0, 'x').lower();
5361 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5362 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5363 elif(checksumtype
=="crc16_ccitt"):
5364 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5365 elif(checksumtype
=="adler32"):
5366 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5367 elif(checksumtype
=="crc32"):
5368 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5369 elif(checksumtype
=="crc64_ecma"):
5370 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5371 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5372 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5373 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5374 checksumoutstr
= hashlib
.new(checksumtype
);
5375 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5376 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5378 catfileheadercshex
= format(0, 'x').lower();
5379 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5380 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5381 nullstrecd
= formatspecs
[5].encode('UTF-8');
5382 fheadtell
+= len(catfileoutstr
) + 1;
5383 catfcontentend
= fheadtell
- 1;
5384 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5385 pyhascontents
= False;
5386 if(int(fsize
)>0 and not listonly
):
5387 pyhascontents
= True;
5388 if(int(fsize
)>0 and listonly
):
5390 pyhascontents
= False;
5391 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fwinattributes': fwinattributes
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
5392 fileidnum
= fileidnum
+ 1;
5395 def ZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5401 inodetocatinode
= {};
5405 if(hasattr(sys
.stdin
, "buffer")):
5406 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5408 shutil
.copyfileobj(sys
.stdin
, infile
);
5413 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5414 infile
= download_file_from_internet_file(infile
);
5419 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5423 if(not zipfile
.is_zipfile(infile
)):
5426 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
5427 except FileNotFoundError
:
5429 ziptest
= zipfp
.testzip();
5431 VerbosePrintOut("Bad file found!");
5432 fnumfiles
= int(len(zipfp
.infolist()));
5433 catver
= formatspecs
[6];
5434 fileheaderver
= str(int(catver
.replace(".", "")));
5435 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5436 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5437 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5438 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5439 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5440 if(checksumtype
=="none" or checksumtype
==""):
5441 catfileheadercshex
= format(0, 'x').lower();
5442 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5443 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5444 elif(checksumtype
=="crc16_ccitt"):
5445 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5446 elif(checksumtype
=="adler32"):
5447 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5448 elif(checksumtype
=="crc32"):
5449 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5450 elif(checksumtype
=="crc64_ecma"):
5451 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5452 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5453 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5454 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5455 checksumoutstr
= hashlib
.new(checksumtype
);
5456 checksumoutstr
.update(fileheader
.encode('UTF-8'));
5457 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5459 catfileheadercshex
= format(0, 'x').lower();
5460 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5461 fheadtell
= len(fileheader
);
5462 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5463 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
5464 if(re
.findall("^[.|/]", member
.filename
)):
5465 fname
= member
.filename
;
5467 fname
= "./"+member
.filename
;
5468 zipinfo
= zipfp
.getinfo(member
.filename
);
5470 VerbosePrintOut(fname
);
5471 if(not member
.is_dir()):
5472 fpremode
= stat
.S_IFREG
+ 438;
5473 elif(member
.is_dir()):
5474 fpremode
= stat
.S_IFDIR
+ 511;
5477 if(not member
.is_dir()):
5479 elif(member
.is_dir()):
5482 fbasedir
= os
.path
.dirname(fname
);
5486 curfid
= curfid
+ 1;
5494 fsize
= member
.file_size
;
5496 fsize
= member
.file_size
;
5497 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5498 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5499 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5500 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5501 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
5502 fwinattributes
= int(zipinfo
.external_attr
);
5503 if(not member
.is_dir()):
5504 fmode
= int(stat
.S_IFREG
+ 438);
5505 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5506 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5507 elif(member
.is_dir()):
5508 fmode
= int(stat
.S_IFDIR
+ 511);
5509 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5510 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5511 elif(zipinfo
.create_system
==3):
5512 fwinattributes
= int(0);
5513 fmode
= int(zipinfo
.external_attr
);
5515 fwinattributes
= int(0);
5516 if(not member
.is_dir()):
5517 fmode
= int(stat
.S_IFREG
+ 438);
5518 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5519 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5520 elif(member
.is_dir()):
5521 fmode
= int(stat
.S_IFDIR
+ 511);
5522 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5523 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5526 except AttributeError:
5532 except AttributeError:
5539 userinfo
= pwd
.getpwuid(os
.getuid());
5540 funame
= userinfo
.pw_name
;
5543 except AttributeError:
5551 groupinfo
= grp
.getgrgid(os
.getgid());
5552 fgname
= groupinfo
.gr_name
;
5555 except AttributeError:
5559 fcontents
= "".encode('UTF-8');
5561 fcontents
= zipfp
.read(member
.filename
);
5562 ftypehex
= format(ftype
, 'x').lower();
5563 extrafields
= len(extradata
);
5564 extrafieldslist
= extradata
;
5565 catfextrafields
= extrafields
;
5566 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5567 if(len(extradata
)>0):
5568 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5569 extrasizelen
= len(extrasizestr
);
5570 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5571 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(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()];
5572 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5573 catoutlenhex
= format(catoutlen
, 'x').lower();
5574 catoutlist
.insert(0, catoutlenhex
);
5575 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5576 if(len(extradata
)>0):
5577 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5578 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5579 catfnumfields
= catoutlen
;
5580 if(checksumtype
=="none" or checksumtype
==""):
5581 catfileheadercshex
= format(0, 'x').lower();
5582 catfilecontentcshex
= format(0, 'x').lower();
5583 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5584 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
5585 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
5586 elif(checksumtype
=="crc16_ccitt"):
5587 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
5588 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
5589 elif(checksumtype
=="adler32"):
5590 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5591 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
5592 elif(checksumtype
=="crc32"):
5593 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5594 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
5595 elif(checksumtype
=="crc64_ecma"):
5596 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5597 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
5598 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5599 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5600 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
5601 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5602 checksumoutstr
= hashlib
.new(checksumtype
);
5603 checksumoutstr
.update("".encode('UTF-8'));
5604 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5605 checksumoutstr
= hashlib
.new(checksumtype
);
5606 checksumoutstr
.update(fcontents
);
5607 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
5609 catfileheadercshex
= format(0, 'x').lower();
5610 catfilecontentcshex
= format(0, 'x').lower();
5611 catfhstart
= fheadtell
;
5612 fheadtell
+= len(catfileoutstr
);
5613 catfhend
= fheadtell
- 1;
5614 catfcontentstart
= fheadtell
;
5615 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5616 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
5617 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5618 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
];
5619 if(checksumtype
=="none" or checksumtype
==""):
5620 catfileheadercshex
= format(0, 'x').lower();
5621 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5622 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5623 elif(checksumtype
=="crc16_ccitt"):
5624 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5625 elif(checksumtype
=="adler32"):
5626 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5627 elif(checksumtype
=="crc32"):
5628 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5629 elif(checksumtype
=="crc64_ecma"):
5630 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5631 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5632 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5633 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5634 checksumoutstr
= hashlib
.new(checksumtype
);
5635 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5636 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5638 catfileheadercshex
= format(0, 'x').lower();
5639 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5640 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5641 nullstrecd
= formatspecs
[5].encode('UTF-8');
5642 fheadtell
+= len(catfileoutstr
) + 1;
5643 catfcontentend
= fheadtell
- 1;
5644 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5645 pyhascontents
= False;
5646 if(int(fsize
)>0 and not listonly
):
5647 pyhascontents
= True;
5648 if(int(fsize
)>0 and listonly
):
5650 pyhascontents
= False;
5651 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fwinattributes': fwinattributes
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
5652 fileidnum
= fileidnum
+ 1;
5655 if(not rarfile_support
):
5656 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5659 if(rarfile_support
):
5660 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5666 inodetocatinode
= {};
5668 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
5670 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5672 rarfp
= rarfile
.RarFile(infile
, "r");
5673 rartest
= rarfp
.testrar();
5675 VerbosePrintOut("Bad file found!");
5676 fnumfiles
= int(len(rarfp
.infolist()));
5677 catver
= formatspecs
[6];
5678 fileheaderver
= str(int(catver
.replace(".", "")));
5679 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5680 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5681 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5682 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5683 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5684 if(checksumtype
=="none" or checksumtype
==""):
5685 catfileheadercshex
= format(0, 'x').lower();
5686 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5687 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5688 elif(checksumtype
=="crc16_ccitt"):
5689 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5690 elif(checksumtype
=="adler32"):
5691 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5692 elif(checksumtype
=="crc32"):
5693 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5694 elif(checksumtype
=="crc64_ecma"):
5695 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5696 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5697 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5698 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5699 checksumoutstr
= hashlib
.new(checksumtype
);
5700 checksumoutstr
.update(fileheader
.encode('UTF-8'));
5701 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5703 catfileheadercshex
= format(0, 'x').lower();
5704 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5705 fheadtell
= len(fileheader
);
5706 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5707 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5710 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
5713 member
.external_attr
5715 except AttributeError:
5717 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
5720 member
.external_attr
5722 except AttributeError:
5727 if(re
.findall("^[.|/]", member
.filename
)):
5728 fname
= member
.filename
;
5730 fname
= "./"+member
.filename
;
5731 rarinfo
= rarfp
.getinfo(member
.filename
);
5733 VerbosePrintOut(fname
);
5734 if(is_unix
and member
.external_attr
!=0):
5735 fpremode
= int(member
.external_attr
);
5736 elif(member
.is_file()):
5737 fpremode
= stat
.S_IFREG
+ 438;
5738 elif(member
.is_symlink()):
5739 fpremode
= stat
.S_IFLNK
+ 438;
5740 elif(member
.is_dir()):
5741 fpremode
= stat
.S_IFDIR
+ 511;
5742 if(is_windows
and member
.external_attr
!=0):
5743 fwinattributes
= int(member
.external_attr
);
5745 fwinattributes
= int(0);
5748 if(member
.is_file()):
5750 elif(member
.is_symlink()):
5752 elif(member
.is_dir()):
5756 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
5757 fbasedir
= os
.path
.dirname(fname
);
5761 curfid
= curfid
+ 1;
5769 fsize
= member
.file_size
;
5772 fatime
= int(member
.atime
.timestamp());
5774 fatime
= int(member
.mtime
.timestamp());
5775 except AttributeError:
5776 fatime
= int(member
.mtime
.timestamp());
5777 fmtime
= int(member
.mtime
.timestamp());
5780 fctime
= int(member
.ctime
.timestamp());
5782 fctime
= int(member
.mtime
.timestamp());
5783 except AttributeError:
5784 fctime
= int(member
.mtime
.timestamp());
5785 fbtime
= int(member
.mtime
.timestamp());
5786 if(is_unix
and member
.external_attr
!=0):
5787 fmode
= int(member
.external_attr
);
5788 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5789 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5790 elif(member
.is_file()):
5791 fmode
= int(stat
.S_IFREG
+ 438)
5792 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5793 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5794 elif(member
.is_symlink()):
5795 fmode
= int(stat
.S_IFLNK
+ 438)
5796 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5797 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5798 elif(member
.is_dir()):
5799 fmode
= int(stat
.S_IFDIR
+ 511)
5800 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5801 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5804 except AttributeError:
5810 except AttributeError:
5817 userinfo
= pwd
.getpwuid(os
.getuid());
5818 funame
= userinfo
.pw_name
;
5821 except AttributeError:
5829 groupinfo
= grp
.getgrgid(os
.getgid());
5830 fgname
= groupinfo
.gr_name
;
5833 except AttributeError:
5837 fcontents
= "".encode('UTF-8');
5839 fcontents
= rarfp
.read(member
.filename
);
5840 ftypehex
= format(ftype
, 'x').lower();
5841 extrafields
= len(extradata
);
5842 extrafieldslist
= extradata
;
5843 catfextrafields
= extrafields
;
5844 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5845 if(len(extradata
)>0):
5846 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5847 extrasizelen
= len(extrasizestr
);
5848 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5849 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(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()];
5850 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5851 catoutlenhex
= format(catoutlen
, 'x').lower();
5852 catoutlist
.insert(0, catoutlenhex
);
5853 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5854 if(len(extradata
)>0):
5855 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5856 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5857 catfnumfields
= 24 + catfextrafields
;
5858 if(checksumtype
=="none" or checksumtype
==""):
5859 catfileheadercshex
= format(0, 'x').lower();
5860 catfilecontentcshex
= format(0, 'x').lower();
5861 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5862 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5863 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
5864 elif(checksumtype
=="crc16_ccitt"):
5865 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5866 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
5867 elif(checksumtype
=="adler32"):
5868 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5869 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
5870 elif(checksumtype
=="crc32"):
5871 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5872 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
5873 elif(checksumtype
=="crc64_ecma"):
5874 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5875 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
5876 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5877 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5878 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
5879 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5880 checksumoutstr
= hashlib
.new(checksumtype
);
5881 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5882 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5884 catfileheadercshex
= format(0, 'x').lower();
5885 catfilecontentcshex
= format(0, 'x').lower();
5886 catfhstart
= fheadtell
;
5887 fheadtell
+= len(catfileoutstr
);
5888 catfhend
= fheadtell
- 1;
5889 catfcontentstart
= fheadtell
;
5890 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5891 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
5892 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5893 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
];
5894 if(checksumtype
=="none" or checksumtype
==""):
5895 catfileheadercshex
= format(0, 'x').lower();
5896 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5897 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5898 elif(checksumtype
=="crc16_ccitt"):
5899 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5900 elif(checksumtype
=="adler32"):
5901 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5902 elif(checksumtype
=="crc32"):
5903 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5904 elif(checksumtype
=="crc64_ecma"):
5905 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5906 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5907 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5908 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5909 checksumoutstr
= hashlib
.new(checksumtype
);
5910 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5911 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5913 catfileheadercshex
= format(0, 'x').lower();
5914 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5915 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5916 nullstrecd
= formatspecs
[5].encode('UTF-8');
5917 fheadtell
+= len(catfileoutstr
) + 1;
5918 catfcontentend
= fheadtell
- 1;
5919 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5920 pyhascontents
= False;
5921 if(int(fsize
)>0 and not listonly
):
5922 pyhascontents
= True;
5923 if(int(fsize
)>0 and listonly
):
5925 pyhascontents
= False;
5926 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fwinattributes': fwinattributes
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
5927 fileidnum
= fileidnum
+ 1;
5930 if(not py7zr_support
):
5931 def SevenZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5935 def SevenZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5941 inodetocatinode
= {};
5943 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
5944 file_content
= szpfp
.readall();
5945 #sztest = szpfp.testzip();
5946 sztestalt
= szpfp
.test();
5948 VerbosePrintOut("Bad file found!");
5949 numfiles
= int(len(szpfp
.list()));
5950 catver
= formatspecs
[6];
5951 fileheaderver
= str(int(catver
.replace(".", "")));
5952 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5953 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5954 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5955 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5956 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5957 if(checksumtype
=="none" or checksumtype
==""):
5958 catfileheadercshex
= format(0, 'x').lower();
5959 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5960 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5961 elif(checksumtype
=="crc16_ccitt"):
5962 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5963 elif(checksumtype
=="adler32"):
5964 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5965 elif(checksumtype
=="crc32"):
5966 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5967 elif(checksumtype
=="crc64_ecma"):
5968 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5969 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5970 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5971 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5972 checksumoutstr
= hashlib
.new(checksumtype
);
5973 checksumoutstr
.update(fileheader
.encode('UTF-8'));
5974 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5976 catfileheadercshex
= format(0, 'x').lower();
5977 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5978 fheadtell
= len(fileheader
);
5979 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5980 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
5981 if(re
.findall("^[.|/]", member
.filename
)):
5982 fname
= member
.filename
;
5984 fname
= "./"+member
.filename
;
5985 if(not member
.is_directory
):
5986 fpremode
= int(stat
.S_IFREG
+ 438);
5987 elif(member
.is_directory
):
5988 fpremode
= int(stat
.S_IFDIR
+ 511);
5989 fwinattributes
= int(0);
5992 if(member
.is_directory
):
5997 fbasedir
= os
.path
.dirname(fname
);
6001 curfid
= curfid
+ 1;
6008 fatime
= int(member
.creationtime
.timestamp());
6009 fmtime
= int(member
.creationtime
.timestamp());
6010 fctime
= int(member
.creationtime
.timestamp());
6011 fbtime
= int(member
.creationtime
.timestamp());
6012 if(member
.is_directory
):
6013 fmode
= int(stat
.S_IFDIR
+ 511)
6014 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
6015 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
6017 fmode
= int(stat
.S_IFLNK
+ 438)
6018 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
6019 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
6022 except AttributeError:
6028 except AttributeError:
6035 userinfo
= pwd
.getpwuid(os
.getuid());
6036 funame
= userinfo
.pw_name
;
6039 except AttributeError:
6047 groupinfo
= grp
.getgrgid(os
.getgid());
6048 fgname
= groupinfo
.gr_name
;
6051 except AttributeError:
6055 fcontents
= "".encode('UTF-8');
6057 fcontents
= file_content
[member
.filename
].read();
6058 fsize
= format(len(fcontents
), 'x').lower();
6060 ftypehex
= format(ftype
, 'x').lower();
6061 extrafields
= len(extradata
);
6062 extrafieldslist
= extradata
;
6063 catfextrafields
= extrafields
;
6064 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
6065 if(len(extradata
)>0):
6066 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6067 extrasizelen
= len(extrasizestr
);
6068 extrasizelenhex
= format(extrasizelen
, 'x').lower();
6069 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(), format(int(fuid
), 'x').lower(), funame
, format(int(fgid
), 'x').lower(), fgname
, format(int(fcurfid
), 'x').lower(), format(int(fcurinode
), 'x').lower(), format(int(flinkcount
), 'x').lower(), format(int(fdev_minor
), 'x').lower(), format(int(fdev_major
), 'x').lower(), format(int(frdev_minor
), 'x').lower(), format(int(frdev_major
), 'x').lower(), extrasizelenhex
, format(catfextrafields
, 'x').lower()];
6070 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6071 catoutlenhex
= format(catoutlen
, 'x').lower();
6072 catoutlist
.insert(0, catoutlenhex
);
6073 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
6074 if(len(extradata
)>0):
6075 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6076 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
6077 catfnumfields
= 24 + catfextrafields
;
6078 if(checksumtype
=="none" or checksumtype
==""):
6079 catfileheadercshex
= format(0, 'x').lower();
6080 catfilecontentcshex
= format(0, 'x').lower();
6081 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6082 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6083 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
6084 elif(checksumtype
=="crc16_ccitt"):
6085 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6086 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
6087 elif(checksumtype
=="adler32"):
6088 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6089 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
6090 elif(checksumtype
=="crc32"):
6091 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6092 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
6093 elif(checksumtype
=="crc64_ecma"):
6094 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6095 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
6096 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6097 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6098 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
6099 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6100 checksumoutstr
= hashlib
.new(checksumtype
);
6101 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
6102 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6104 catfileheadercshex
= format(0, 'x').lower();
6105 catfilecontentcshex
= format(0, 'x').lower();
6106 catfhstart
= fheadtell
;
6107 fheadtell
+= len(catfileoutstr
);
6108 catfhend
= fheadtell
- 1;
6109 catfcontentstart
= fheadtell
;
6110 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6111 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
6112 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
6113 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
];
6114 if(checksumtype
=="none" or checksumtype
==""):
6115 catfileheadercshex
= format(0, 'x').lower();
6116 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6117 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6118 elif(checksumtype
=="crc16_ccitt"):
6119 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6120 elif(checksumtype
=="adler32"):
6121 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6122 elif(checksumtype
=="crc32"):
6123 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6124 elif(checksumtype
=="crc64_ecma"):
6125 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6126 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6127 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6128 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6129 checksumoutstr
= hashlib
.new(checksumtype
);
6130 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
6131 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6133 catfileheadercshex
= format(0, 'x').lower();
6134 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6135 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6136 nullstrecd
= formatspecs
[5].encode('UTF-8');
6137 fheadtell
+= len(catfileoutstr
) + 1;
6138 catfcontentend
= fheadtell
- 1;
6139 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
6140 pyhascontents
= False;
6141 if(int(fsize
)>0 and not listonly
):
6142 pyhascontents
= True;
6143 if(int(fsize
)>0 and listonly
):
6145 pyhascontents
= False;
6146 catlist
['ffilelist'].update({fileidnum
: {'fid': fileidnum
, 'fidalt': fileidnum
, 'fheadersize': int(catheaersize
, 16), 'fhstart': catfhstart
, 'fhend': catfhend
, 'ftype': ftype
, 'fname': fname
, 'fbasedir': fbasedir
, 'flinkname': flinkname
, 'fsize': fsize
, 'fatime': fatime
, 'fmtime': fmtime
, 'fctime': fctime
, 'fbtime': fbtime
, 'fmode': fmode
, 'fchmode': fchmode
, 'ftypemod': ftypemod
, 'fwinattributes': fwinattributes
, 'fuid': fuid
, 'funame': funame
, 'fgid': fgid
, 'fgname': fgname
, 'finode': finode
, 'flinkcount': flinkcount
, 'fminor': fdev_minor
, 'fmajor': fdev_major
, 'frminor': frdev_minor
, 'frmajor': frdev_major
, 'fchecksumtype': checksumtype
, 'fnumfields': catfnumfields
+ 2, 'frawheader': catheaderdata
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
6147 fileidnum
= fileidnum
+ 1;
6150 def ListDirToArray(infiles
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6151 outarray
= BytesIO();
6152 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6153 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6154 return listcatfiles
;
6156 def ArchiveFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6157 if(isinstance(infile
, dict)):
6158 listcatfiles
= infile
;
6160 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6161 infile
= RemoveWindowsPath(infile
);
6162 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6163 if(not listcatfiles
):
6165 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': {}}}};
6167 catarray
.update({'catfp': listcatfiles
['catfp']});
6168 lenlist
= len(listcatfiles
['ffilelist']);
6170 lcfx
= int(listcatfiles
['fnumfiles']);
6171 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6172 lcfx
= int(lenlist
);
6174 lcfx
= int(listcatfiles
['fnumfiles']);
6176 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6177 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6178 catarray
['filetoid'].update(filetoidarray
);
6179 catarray
['idtofile'].update(idtofilearray
);
6180 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6181 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6182 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6183 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6184 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6185 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6186 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6187 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6188 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6189 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6190 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6191 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6192 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6193 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6194 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6195 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6196 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6197 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6198 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6199 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6200 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6201 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6202 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6203 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6204 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6205 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6206 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6207 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6208 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6209 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6210 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6214 create_alias_function("", __file_format_name__
, "ToArrayIndex", ArchiveFileToArrayIndex
);
6216 def ListDirToArrayIndexAlt(infiles
, dirlistfromtxt
=False, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6217 listcatfiles
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6218 if(not listcatfiles
):
6220 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': {}}}};
6221 lenlist
= len(listcatfiles
['ffilelist']);
6223 lcfx
= int(listcatfiles
['fnumfiles']);
6224 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6225 lcfx
= int(lenlist
);
6227 lcfx
= int(listcatfiles
['fnumfiles']);
6229 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6230 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6231 catarray
['filetoid'].update(filetoidarray
);
6232 catarray
['idtofile'].update(idtofilearray
);
6233 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6234 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6235 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6236 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6237 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6238 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6239 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6240 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6241 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6242 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6243 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6244 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6245 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6246 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6247 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6248 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6249 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6250 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6251 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6252 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6253 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6254 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6255 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6256 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6257 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6258 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6259 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6260 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6261 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6262 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6263 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6267 def TarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6268 listcatfiles
= TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6269 if(not listcatfiles
):
6271 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': {}}}};
6272 lenlist
= len(listcatfiles
['ffilelist']);
6274 lcfx
= int(listcatfiles
['fnumfiles']);
6275 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6276 lcfx
= int(lenlist
);
6278 lcfx
= int(listcatfiles
['fnumfiles']);
6280 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6281 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6282 catarray
['filetoid'].update(filetoidarray
);
6283 catarray
['idtofile'].update(idtofilearray
);
6284 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6285 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6286 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6287 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6288 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6289 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6290 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6291 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6292 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6293 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6294 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6295 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6296 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6297 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6298 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6299 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6300 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6301 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6302 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6303 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6304 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6305 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6306 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6307 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6308 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6309 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6310 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6311 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6312 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6313 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6314 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6318 def ZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6319 listcatfiles
= ZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6320 if(not listcatfiles
):
6322 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': {}}}};
6323 lenlist
= len(listcatfiles
['ffilelist']);
6325 lcfx
= int(listcatfiles
['fnumfiles']);
6326 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6327 lcfx
= int(lenlist
);
6329 lcfx
= int(listcatfiles
['fnumfiles']);
6331 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6332 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6333 catarray
['filetoid'].update(filetoidarray
);
6334 catarray
['idtofile'].update(idtofilearray
);
6335 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6336 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6337 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6338 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6339 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6340 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6341 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6342 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6343 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6344 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6345 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6346 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6347 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6348 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6349 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6350 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6351 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6352 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6353 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6354 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6355 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6356 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6357 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6358 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6359 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6360 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6361 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6362 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6363 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6364 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6365 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6369 if(not rarfile_support
):
6370 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6373 if(rarfile_support
):
6374 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6375 listcatfiles
= RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6376 if(not listcatfiles
):
6378 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': {}}}};
6379 lenlist
= len(listcatfiles
['ffilelist']);
6381 lcfx
= int(listcatfiles
['fnumfiles']);
6382 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6383 lcfx
= int(lenlist
);
6385 lcfx
= int(listcatfiles
['fnumfiles']);
6387 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6388 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6389 catarray
['filetoid'].update(filetoidarray
);
6390 catarray
['idtofile'].update(idtofilearray
);
6391 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6392 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6393 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6394 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6395 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6396 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6397 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6398 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6399 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6400 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6401 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6402 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6403 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6404 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6405 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6406 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6407 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6408 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6409 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6410 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6411 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6412 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6413 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6414 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6415 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6416 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6417 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6418 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6419 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6420 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6421 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6425 if(not py7zr_support
):
6426 def SevenZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6430 def SevenZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6431 listcatfiles
= SevenZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6432 if(not listcatfiles
):
6434 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': {}}}};
6435 lenlist
= len(listcatfiles
['ffilelist']);
6437 lcfx
= int(listcatfiles
['fnumfiles']);
6438 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6439 lcfx
= int(lenlist
);
6441 lcfx
= int(listcatfiles
['fnumfiles']);
6443 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6444 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6445 catarray
['filetoid'].update(filetoidarray
);
6446 catarray
['idtofile'].update(idtofilearray
);
6447 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6448 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6449 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6450 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6451 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6452 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6453 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6454 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6455 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6456 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6457 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6458 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6459 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6460 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6461 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6462 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6463 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6464 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6465 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6466 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6467 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6468 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6469 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6470 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6471 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6472 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6473 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6474 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6475 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6476 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6477 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6481 def ArchiveFileStringToArrayIndex(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6482 catfp
= BytesIO(catstr
);
6483 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6484 return listcatfiles
;
6486 create_alias_function("", __file_format_name__
, "StringToArrayIndex", ArchiveFileStringToArrayIndex
);
6488 def TarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6490 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
6491 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6492 return listcatfiles
;
6494 def ZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6496 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
6497 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6498 return listcatfiles
;
6500 if(not rarfile_support
):
6501 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6504 if(rarfile_support
):
6505 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6507 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
6508 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6509 return listcatfiles
;
6511 if(not rarfile_support
):
6512 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6515 if(rarfile_support
):
6516 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6518 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
6519 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6520 return listcatfiles
;
6522 def ListDirToArrayIndex(infiles
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6523 outarray
= BytesIO();
6524 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
, True);
6525 listcatfiles
= ArchiveFileToArrayIndex(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
)
6526 return listcatfiles
;
6528 def RePackArchiveFile(infile
, outfile
, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6529 if(isinstance(infile
, dict)):
6530 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6531 listcatfiles
= prelistcatfiles
['list'];
6533 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6534 infile
= RemoveWindowsPath(infile
);
6536 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6537 listcatfiles
= prelistcatfiles
['list'];
6539 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6540 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
6541 outfile
= RemoveWindowsPath(outfile
);
6542 checksumtype
= checksumtype
.lower();
6543 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
6544 checksumtype
="crc32";
6545 if(checksumtype
=="none"):
6547 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
6549 if(compression
not in compressionlist
and compression
is None):
6550 compression
= "auto";
6552 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6553 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
6554 if(os
.path
.exists(outfile
)):
6556 if(not listcatfiles
):
6561 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6563 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6566 fbasename
= os
.path
.splitext(outfile
)[0];
6567 fextname
= os
.path
.splitext(outfile
)[1];
6568 catfp
= CompressOpenFile(outfile
, compressionlevel
);
6569 catver
= formatspecs
[6];
6570 fileheaderver
= str(int(catver
.replace(".", "")));
6571 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
6572 catfp
.write(fileheader
.encode('UTF-8'));
6573 lenlist
= len(listcatfiles
['ffilelist']);
6574 fnumfiles
= int(listcatfiles
['fnumfiles']);
6575 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
6576 fnumfiles
= lenlist
;
6577 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
6578 fnumfilesa
= AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
6579 if(checksumtype
=="none" or checksumtype
==""):
6580 catfileheadercshex
= format(0, 'x').lower();
6581 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6582 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
6583 elif(checksumtype
=="crc16_ccitt"):
6584 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
6585 elif(checksumtype
=="adler32"):
6586 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
6587 elif(checksumtype
=="crc32"):
6588 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
6589 elif(checksumtype
=="crc64_ecma"):
6590 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6591 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6592 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6593 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6594 checksumoutstr
= hashlib
.new(checksumtype
);
6595 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
6596 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6598 catfileheadercshex
= format(0, 'x').lower();
6599 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
6600 catfp
.write(fnumfilesa
.encode('UTF-8'));
6603 os
.fsync(catfp
.fileno());
6604 except io
.UnsupportedOperation
:
6606 except AttributeError:
6608 lenlist
= len(listcatfiles
['ffilelist']);
6609 fnumfiles
= int(listcatfiles
['fnumfiles']);
6611 lcfx
= int(listcatfiles
['fnumfiles']);
6612 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6613 lcfx
= int(lenlist
);
6615 lcfx
= int(listcatfiles
['fnumfiles']);
6623 catfhstart
= catfp
.tell();
6624 if(re
.findall("^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
6625 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
6627 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
6629 VerbosePrintOut(fname
);
6630 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
6631 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
6632 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6633 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
6634 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
6635 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
6636 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
6637 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
6638 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
6639 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
6640 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
6641 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
6642 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
6643 finode
= listcatfiles
['ffilelist'][reallcfi
]['finode'];
6644 flinkcount
= listcatfiles
['ffilelist'][reallcfi
]['flinkcount'];
6645 fwinattributes
= flinkinfo
['ffilelist'][reallcfi
]['fwinattributes'];
6646 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
6647 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
6648 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
6649 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
6650 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
6651 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6652 if(len(extradata
)>0):
6653 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(extradata
);
6654 listcatfiles
['ffilelist'][reallcfi
]['fextralist'] = extradata
;
6655 extrafields
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']), 'x').lower();
6656 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
6657 if(len(extradata
)>0):
6658 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6659 extrasizelen
= format(len(extrasizestr
), 'x').lower();
6660 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
6662 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
6663 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6664 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6665 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6666 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
6667 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
6668 flinkname
= flinkinfo
['flinkname'];
6669 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
6670 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
6671 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
6672 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
6673 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
6674 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
6675 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
6676 funame
= flinkinfo
['funame'];
6677 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
6678 fgname
= flinkinfo
['fgname'];
6679 finode
= flinkinfo
['finode'];
6680 flinkcount
= flinkinfo
['flinkcount'];
6681 fwinattributes
= flinkinfo
['fwinattributes'];
6682 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
6683 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
6684 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
6685 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
6686 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
6687 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
6688 if(len(extradata
)>0):
6689 flinkinfo
['fextrafields'] = len(extradata
);
6690 flinkinfo
['fextralist'] = extradata
;
6691 extrafields
= format(int(flinkinfo
['fextrafields']), 'x').lower();
6692 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
6693 if(len(extradata
)>0):
6694 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6695 extrasizelen
= format(len(extrasizestr
), 'x').lower();
6696 fcontents
= flinkinfo
['fcontents'];
6697 if(flinkinfo
['ftype']!=0 and flinkinfo
['ftype']!=7):
6699 fcontents
= fcontents
.encode('UTF-8');
6700 except AttributeError:
6702 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
6704 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=0 and listcatfiles
['ffilelist'][reallcfi
]['ftype']!=7):
6706 fcontents
= fcontents
.encode('UTF-8');
6707 except AttributeError:
6709 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
6710 fcurfid
= format(curfid
, 'x').lower();
6711 if(not followlink
and finode
!=0):
6712 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
6713 fcurinode
= format(int(curinode
), 'x').lower();
6714 inodetofile
.update({curinode
: fname
});
6715 filetoinode
.update({fname
: curinode
});
6716 curinode
= curinode
+ 1;
6718 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
6720 fcurinode
= format(int(curinode
), 'x').lower();
6721 curinode
= curinode
+ 1;
6722 curfid
= curfid
+ 1;
6723 catoutlist
= [ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fwinattributes
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
];
6724 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6725 catoutlenhex
= format(catoutlen
, 'x').lower();
6726 catoutlist
.insert(0, catoutlenhex
);
6727 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
6728 if(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']>0):
6729 extrafieldslist
= [];
6731 exil
= listcatfiles
['ffilelist'][reallcfi
]['fextrafields'];
6733 extrafieldslist
.append(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6735 catfileoutstr
+= AppendNullBytes([extrafieldslist
], formatspecs
[5]);
6736 catfileoutstr
+= AppendNullBytes([checksumtype
], formatspecs
[5]);
6737 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
6738 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
6739 if(checksumtype
=="none" or checksumtype
==""):
6740 catfileheadercshex
= format(0, 'x').lower();
6741 catfilecontentcshex
= format(0, 'x').lower();
6742 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6743 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
6744 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
6745 elif(checksumtype
=="crc16_ccitt"):
6746 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
6747 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
6748 elif(checksumtype
=="adler32"):
6749 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
6750 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
6751 elif(checksumtype
=="crc32"):
6752 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
6753 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
6754 elif(checksumtype
=="crc64_ecma"):
6755 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6756 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
6757 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6758 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6759 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
6760 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6761 checksumoutstr
= hashlib
.new(checksumtype
);
6762 checksumoutstr
.update("".encode('UTF-8'));
6763 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6764 checksumoutstr
= hashlib
.new(checksumtype
);
6765 checksumoutstr
.update(fcontents
);
6766 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
6768 catfileheadercshex
= format(0, 'x').lower();
6769 catfilecontentcshex
= format(0, 'x').lower();
6770 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6771 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
6772 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
6773 if(checksumtype
=="none" or checksumtype
==""):
6774 catfileheadercshex
= format(0, 'x').lower();
6775 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6776 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6777 elif(checksumtype
=="crc16_ccitt"):
6778 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6779 elif(checksumtype
=="adler32"):
6780 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6781 elif(checksumtype
=="crc32"):
6782 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6783 elif(checksumtype
=="crc64_ecma"):
6784 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6785 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6786 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6787 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6788 checksumoutstr
= hashlib
.new(checksumtype
);
6789 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
6790 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6792 catfileheadercshex
= format(0, 'x').lower();
6793 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6794 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6795 nullstrecd
= formatspecs
[5].encode('UTF-8');
6796 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
6797 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
6798 catfp
.write(catfileout
);
6801 os
.fsync(catfp
.fileno());
6802 except io
.UnsupportedOperation
:
6804 except AttributeError:
6807 reallcfi
= reallcfi
+ 1;
6809 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
6810 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6811 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
6814 os
.fsync(catfp
.fileno());
6815 except io
.UnsupportedOperation
:
6817 except AttributeError:
6821 if(hasattr(sys
.stdout
, "buffer")):
6822 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
6824 shutil
.copyfileobj(catfp
, sys
.stdout
);
6825 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6826 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
6828 upload_file_to_internet_file(catfp
, outfile
);
6836 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
6838 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6839 catfp
= BytesIO(catstr
);
6840 listcatfiles
= RePackArchiveFile(catfp
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6841 return listcatfiles
;
6843 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
6845 def PackArchiveFileFromListDir(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6846 outarray
= BytesIO();
6847 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6848 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6849 return listcatfiles
;
6851 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
6853 def ArchiveFileArrayBase64Encode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6855 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6856 if(isinstance(infile
, dict)):
6857 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6858 listcatfiles
= prelistcatfiles
['list'];
6860 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6861 infile
= RemoveWindowsPath(infile
);
6863 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6864 listcatfiles
= prelistcatfiles
['list'];
6866 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6867 if(not listcatfiles
):
6869 lenlist
= len(listcatfiles
['ffilelist']);
6870 fnumfiles
= int(listcatfiles
['fnumfiles']);
6872 lcfx
= int(listcatfiles
['fnumfiles']);
6873 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6874 lcfx
= int(lenlist
);
6876 lcfx
= int(listcatfiles
['fnumfiles']);
6878 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
6879 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64encode(listcatfiles
['ffilelist'][lcfi
]['fcontents']).decode("UTF-8");
6881 return listcatfiles
;
6883 create_alias_function("", __file_format_name__
, "ArrayBase64Encode", ArchiveFileArrayBase64Encode
);
6885 def ArchiveFileArrayBase64Decode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6887 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6888 if(isinstance(infile
, dict)):
6889 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6890 listcatfiles
= prelistcatfiles
['list'];
6892 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6893 infile
= RemoveWindowsPath(infile
);
6895 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6896 listcatfiles
= prelistcatfiles
['list'];
6898 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6899 if(not listcatfiles
):
6901 lenlist
= len(listcatfiles
['ffilelist']);
6902 fnumfiles
= int(listcatfiles
['fnumfiles']);
6904 lcfx
= int(listcatfiles
['fnumfiles']);
6905 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6906 lcfx
= int(lenlist
);
6908 lcfx
= int(listcatfiles
['fnumfiles']);
6910 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
6911 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64decode(listcatfiles
['ffilelist'][lcfi
]['fcontents'].encode("UTF-8"));
6913 return listcatfiles
;
6915 create_alias_function("", __file_format_name__
, "ArrayBase64Decode", ArchiveFileArrayBase64Decode
);
6917 def UnPackArchiveFile(infile
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, preservepermissions
=True, preservetime
=True, verbose
=False, returnfp
=False):
6918 if(outdir
is not None):
6919 outdir
= RemoveWindowsPath(outdir
);
6921 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6922 if(isinstance(infile
, dict)):
6923 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6924 listcatfiles
= prelistcatfiles
['list'];
6926 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6927 infile
= RemoveWindowsPath(infile
);
6929 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6930 listcatfiles
= prelistcatfiles
['list'];
6932 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6933 if(not listcatfiles
):
6935 lenlist
= len(listcatfiles
['ffilelist']);
6936 fnumfiles
= int(listcatfiles
['fnumfiles']);
6938 lcfx
= int(listcatfiles
['fnumfiles']);
6939 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6940 lcfx
= int(lenlist
);
6942 lcfx
= int(listcatfiles
['fnumfiles']);
6948 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
6949 funame
= userinfo
.pw_name
;
6958 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
6959 fgname
= groupinfo
.gr_name
;
6965 VerbosePrintOut(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6966 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6967 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6968 fpc
.write(listcatfiles
['ffilelist'][lcfi
]['fcontents'])
6971 os
.fsync(fpc
.fileno())
6972 except io
.UnsupportedOperation
:
6974 except AttributeError:
6976 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6977 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6978 if(preservepermissions
):
6979 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6981 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6982 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6984 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6985 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6986 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6991 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6992 funame
= userinfo
.pw_name
;
7001 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
7002 fgname
= groupinfo
.gr_name
;
7007 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
7008 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
7009 fpc
.write(flinkinfo
['fcontents'])
7012 os
.fsync(fpc
.fileno())
7013 except io
.UnsupportedOperation
:
7015 except AttributeError:
7017 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7018 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7019 if(preservepermissions
):
7020 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7022 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7023 if(flinkinfo
['ftype']==1):
7024 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7025 if(flinkinfo
['ftype']==2):
7026 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7027 if(flinkinfo
['ftype']==5):
7028 if(preservepermissions
):
7029 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7031 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7032 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7033 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7034 if(preservepermissions
):
7035 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7037 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7038 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
7039 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7041 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7042 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
7044 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7045 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
7046 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
7051 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
7052 funame
= userinfo
.pw_name
;
7061 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
7062 fgname
= groupinfo
.gr_name
;
7067 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
7068 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
7069 fpc
.write(flinkinfo
['fcontents'])
7072 os
.fsync(fpc
.fileno())
7073 except io
.UnsupportedOperation
:
7075 except AttributeError:
7077 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7078 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7079 if(preservepermissions
):
7080 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7082 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7083 if(flinkinfo
['ftype']==1):
7084 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7085 if(flinkinfo
['ftype']==2):
7086 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7087 if(flinkinfo
['ftype']==5):
7088 if(preservepermissions
):
7089 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7091 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7092 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7093 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7094 if(preservepermissions
):
7095 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7097 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7098 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
7099 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7101 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7102 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
7103 if(preservepermissions
):
7104 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7106 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7107 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
7108 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
7109 if(preservepermissions
):
7110 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7112 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
7113 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
7114 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7117 return listcatfiles
['ffilelist']['catfp'];
7121 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
7123 if(hasattr(shutil
, "register_unpack_format")):
7124 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
7125 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_delimiter__
, False, False);
7126 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
7128 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7129 catfp
= BytesIO(catstr
);
7130 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7131 return listcatfiles
;
7133 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
7135 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7136 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7137 if(isinstance(infile
, dict)):
7138 listcatfiles
= infile
;
7140 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
7141 infile
= RemoveWindowsPath(infile
);
7142 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, skipchecksum
, formatspecs
, returnfp
);
7143 if(not listcatfiles
):
7145 lenlist
= len(listcatfiles
['ffilelist']);
7146 fnumfiles
= int(listcatfiles
['fnumfiles']);
7148 lcfx
= int(listcatfiles
['fnumfiles']);
7149 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
7150 lcfx
= int(lenlist
);
7152 lcfx
= int(listcatfiles
['fnumfiles']);
7155 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
7157 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
7159 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
7160 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
7161 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
7162 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7163 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
7164 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7165 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
7166 if(len(fuprint
)<=0):
7167 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
7168 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
7169 if(len(fgprint
)<=0):
7170 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
7171 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
));
7174 return listcatfiles
['catfp'];
7178 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
7180 def ArchiveFileStringListFiles(catstr
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7181 catfp
= BytesIO(catstr
);
7182 listcatfiles
= ArchiveFileListFiles(catstr
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7183 return listcatfiles
;
7185 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileListFiles
);
7187 def ArchiveFileListFilesAlt(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7188 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7189 if(isinstance(infile
, dict)):
7190 listcatfiles
= infile
;
7192 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
7193 infile
= RemoveWindowsPath(infile
);
7194 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, skipchecksum
, formatspecs
, returnfp
);
7195 if(not listcatfiles
):
7197 lenlist
= len(listcatfiles
['ffilelist']);
7198 fnumfiles
= int(listcatfiles
['fnumfiles']);
7200 lcfx
= int(listcatfiles
['fnumfiles']);
7201 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
7202 lcfx
= int(lenlist
);
7204 lcfx
= int(listcatfiles
['fnumfiles']);
7207 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
7209 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
7211 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' } };
7212 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
7213 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
7214 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7215 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
7216 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7217 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
7218 if(len(fuprint
)<=0):
7219 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
7220 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
7221 if(len(fgprint
)<=0):
7222 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
7223 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
));
7226 return listcatfiles
['catfp'];
7230 create_alias_function("", __file_format_name__
, "ListFilesAlt", ArchiveFileListFilesAlt
);
7232 def ArchiveFileStringListFilesAlt(catstr
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7233 catfp
= BytesIO(catstr
);
7234 listcatfiles
= ArchiveFileListFilesAlt(catstr
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7235 return listcatfiles
;
7237 create_alias_function("", __file_format_name__
, "StringListFilesAlt", ArchiveFileListFilesAlt
);
7239 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
7240 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7243 if(hasattr(sys
.stdin
, "buffer")):
7244 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7246 shutil
.copyfileobj(sys
.stdin
, infile
);
7251 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7252 infile
= download_file_from_internet_file(infile
);
7257 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7259 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
7261 if(not tarfile
.is_tarfile(infile
)):
7263 except AttributeError:
7264 if(not is_tarfile(infile
)):
7269 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
7270 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
7272 tarfp
= tarfile
.open(infile
, "r");
7273 except FileNotFoundError
:
7277 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
7278 returnval
.update({lcfi
: member
.name
});
7279 fpremode
= member
.mode
;
7280 ffullmode
= member
.mode
;
7284 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7286 elif(member
.isdev()):
7287 ffullmode
= member
.mode
;
7289 elif(member
.islnk()):
7290 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7292 elif(member
.issym()):
7293 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
7295 elif(member
.ischr()):
7296 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
7298 elif(member
.isblk()):
7299 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
7301 elif(member
.isdir()):
7302 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
7304 elif(member
.isfifo()):
7305 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
7307 elif(member
.issparse()):
7308 ffullmode
= member
.mode
;
7311 VerbosePrintOut(member
.name
);
7313 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' } };
7314 printfname
= member
.name
;
7316 printfname
= member
.name
+ " link to " + member
.linkname
;
7317 elif(member
.issym()):
7318 printfname
= member
.name
+ " -> " + member
.linkname
;
7319 fuprint
= member
.uname
;
7320 if(len(fuprint
)<=0):
7321 fuprint
= member
.uid
;
7322 fgprint
= member
.gname
;
7323 if(len(fgprint
)<=0):
7324 fgprint
= member
.gid
;
7325 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
));
7328 return listcatfiles
['catfp'];
7332 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7333 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7336 if(hasattr(sys
.stdin
, "buffer")):
7337 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7339 shutil
.copyfileobj(sys
.stdin
, infile
);
7344 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7345 infile
= download_file_from_internet_file(infile
);
7350 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7354 if(not zipfile
.is_zipfile(infile
)):
7357 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
7358 except FileNotFoundError
:
7362 ziptest
= zipfp
.testzip();
7364 VerbosePrintOut("Bad file found!");
7365 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
7366 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
7367 fwinattributes
= int(zipinfo
.external_attr
);
7368 if(not member
.is_dir()):
7369 fmode
= int(stat
.S_IFREG
+ 438);
7370 fchmode
= int(stat
.S_IMODE(fmode
));
7371 ftypemod
= int(stat
.S_IFMT(fmode
));
7372 elif(member
.is_dir()):
7373 fmode
= int(stat
.S_IFDIR
+ 511);
7374 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7375 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7376 elif(zipinfo
.create_system
==3):
7377 fwinattributes
=int(0);
7378 fmode
= int(zipinfo
.external_attr
);
7379 fchmode
= int(stat
.S_IMODE(fmode
));
7380 ftypemod
= int(stat
.S_IFMT(fmode
));
7382 fwinattributes
= int(0);
7383 if(not member
.is_dir()):
7384 fmode
= int(stat
.S_IFREG
+ 438);
7385 fchmode
= int(stat
.S_IMODE(fmode
));
7386 ftypemod
= int(stat
.S_IFMT(fmode
));
7387 elif(member
.is_dir()):
7388 fmode
= int(stat
.S_IFDIR
+ 511);
7389 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7390 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7391 returnval
.update({lcfi
: member
.filename
});
7393 VerbosePrintOut(member
.filename
);
7395 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' } };
7397 for fmodval
in str(oct(fmode
))[-3:]:
7398 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7399 if(not member
.is_dir()):
7401 permissionstr
= "-" + permissionstr
;
7402 elif(member
.is_dir()):
7404 permissionstr
= "d" + permissionstr
;
7405 printfname
= member
.filename
;
7407 fuid
= int(os
.getuid());
7408 except AttributeError:
7413 fgid
= int(os
.getgid());
7414 except AttributeError:
7421 userinfo
= pwd
.getpwuid(os
.getuid());
7422 funame
= userinfo
.pw_name
;
7425 except AttributeError:
7433 groupinfo
= grp
.getgrgid(os
.getgid());
7434 fgname
= groupinfo
.gr_name
;
7437 except AttributeError:
7442 if(len(fuprint
)<=0):
7443 fuprint
= str(fuid
);
7445 if(len(fgprint
)<=0):
7446 fgprint
= str(fgid
);
7447 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
));
7450 return listcatfiles
['catfp'];
7454 if(not rarfile_support
):
7455 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7456 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7457 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7460 if(rarfile_support
):
7461 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7462 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7463 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7465 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
7469 rarfp
= rarfile
.RarFile(infile
, "r");
7470 rartest
= rarfp
.testrar();
7472 VerbosePrintOut("Bad file found!");
7473 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
7476 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
7479 member
.external_attr
7481 except AttributeError:
7483 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
7486 member
.external_attr
7488 except AttributeError:
7493 if(is_unix
and member
.external_attr
!=0):
7494 fpremode
= int(member
.external_attr
);
7495 elif(member
.is_file()):
7496 fpremode
= int(stat
.S_IFREG
+ 438);
7497 elif(member
.is_symlink()):
7498 fpremode
= int(stat
.S_IFLNK
+ 438);
7499 elif(member
.is_dir()):
7500 fpremode
= int(stat
.S_IFDIR
+ 511);
7501 if(is_windows
and member
.external_attr
!=0):
7502 fwinattributes
= int(member
.external_attr
);
7504 fwinattributes
= int(0);
7505 if(is_unix
and member
.external_attr
!=0):
7506 fmode
= int(member
.external_attr
);
7507 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
7508 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
7509 elif(member
.is_file()):
7510 fmode
= int(stat
.S_IFREG
+ 438);
7511 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
7512 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
7513 elif(member
.is_symlink()):
7514 fmode
= int(stat
.S_IFLNK
+ 438);
7515 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7516 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7517 elif(member
.is_dir()):
7518 fmode
= int(stat
.S_IFDIR
+ 511);
7519 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7520 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7521 returnval
.update({lcfi
: member
.filename
});
7523 VerbosePrintOut(member
.filename
);
7525 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' } };
7527 for fmodval
in str(oct(fmode
))[-3:]:
7528 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7529 if(member
.is_file()):
7531 permissionstr
= "-" + permissionstr
;
7532 printfname
= member
.filename
;
7533 elif(member
.is_symlink()):
7535 permissionstr
= "l" + permissionstr
;
7536 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
7537 elif(member
.is_dir()):
7539 permissionstr
= "d" + permissionstr
;
7540 printfname
= member
.filename
;
7542 fuid
= int(os
.getuid());
7543 except AttributeError:
7548 fgid
= int(os
.getgid());
7549 except AttributeError:
7556 userinfo
= pwd
.getpwuid(os
.getuid());
7557 funame
= userinfo
.pw_name
;
7560 except AttributeError:
7568 groupinfo
= grp
.getgrgid(os
.getgid());
7569 fgname
= groupinfo
.gr_name
;
7572 except AttributeError:
7577 if(len(fuprint
)<=0):
7578 fuprint
= str(fuid
);
7580 if(len(fgprint
)<=0):
7581 fgprint
= str(fgid
);
7582 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7585 return listcatfiles
['catfp'];
7589 if(not py7zr_support
):
7590 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7591 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7592 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7596 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7597 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7598 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7602 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
7603 file_content
= szpfp
.readall();
7604 #sztest = szpfp.testzip();
7605 sztestalt
= szpfp
.test();
7607 VerbosePrintOut("Bad file found!");
7608 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
7609 if(re
.findall("^[.|/]", member
.filename
)):
7610 fname
= member
.filename
;
7612 fname
= "./"+member
.filename
;
7613 if(not member
.is_directory
):
7614 fpremode
= int(stat
.S_IFREG
+ 438);
7615 elif(member
.is_directory
):
7616 fpremode
= int(stat
.S_IFDIR
+ 511);
7617 fwinattributes
= int(0);
7618 if(member
.is_directory
):
7619 fmode
= int(stat
.S_IFDIR
+ 511);
7620 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7621 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7623 fmode
= int(stat
.S_IFLNK
+ 438);
7624 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7625 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7626 returnval
.update({lcfi
: member
.filename
});
7628 VerbosePrintOut(member
.filename
);
7630 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' } };
7632 for fmodval
in str(oct(fmode
))[-3:]:
7633 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7635 if(not member
.is_directory
):
7637 permissionstr
= "-" + permissionstr
;
7638 printfname
= member
.filename
;
7639 elif(member
.is_directory
):
7641 permissionstr
= "d" + permissionstr
;
7642 printfname
= member
.filename
;
7644 fsize
= len(file_content
[member
.filename
].read());
7645 file_content
[member
.filename
].close();
7647 fuid
= int(os
.getuid());
7648 except AttributeError:
7653 fgid
= int(os
.getgid());
7654 except AttributeError:
7661 userinfo
= pwd
.getpwuid(os
.getuid());
7662 funame
= userinfo
.pw_name
;
7665 except AttributeError:
7673 groupinfo
= grp
.getgrgid(os
.getgid());
7674 fgname
= groupinfo
.gr_name
;
7677 except AttributeError:
7682 if(len(fuprint
)<=0):
7683 fuprint
= str(fuid
);
7685 if(len(fgprint
)<=0):
7686 fgprint
= str(fgid
);
7687 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(fsize
).rjust(15) + " " + member
.creationtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7690 return listcatfiles
['catfp'];
7694 def ListDirListFiles(infiles
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7695 outarray
= BytesIO();
7696 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
7697 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7698 return listcatfiles
;
7700 def ListDirListFilesAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=True, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7701 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
7702 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7703 return listcatfiles
;
7705 def PackArchiveFileFromListDirAlt(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, skipchecksum
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7706 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
7707 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
7708 return listcatfiles
;
7710 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
7712 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7713 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7714 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7715 return listcatfiles
;
7717 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
7719 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7720 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7721 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7722 return listcatfiles
;
7724 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
7726 if(not rarfile_support
):
7727 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7730 if(rarfile_support
):
7731 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7732 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7733 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7734 return listcatfiles
;
7736 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
7738 def download_file_from_ftp_file(url
):
7739 urlparts
= urlparse(url
);
7740 file_name
= os
.path
.basename(urlparts
.path
);
7741 file_dir
= os
.path
.dirname(urlparts
.path
);
7742 if(urlparts
.username
is not None):
7743 ftp_username
= urlparts
.username
;
7745 ftp_username
= "anonymous";
7746 if(urlparts
.password
is not None):
7747 ftp_password
= urlparts
.password
;
7748 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7749 ftp_password
= "anonymous";
7752 if(urlparts
.scheme
=="ftp"):
7754 elif(urlparts
.scheme
=="ftps"):
7758 if(urlparts
.scheme
=="sftp"):
7760 return download_file_from_pysftp_file(url
);
7762 return download_file_from_sftp_file(url
);
7763 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7764 return download_file_from_http_file(url
);
7765 ftp_port
= urlparts
.port
;
7766 if(urlparts
.port
is None):
7769 ftp
.connect(urlparts
.hostname
, ftp_port
);
7770 except socket
.gaierror
:
7771 log
.info("Error With URL "+url
);
7773 except socket
.timeout
:
7774 log
.info("Error With URL "+url
);
7776 ftp
.login(urlparts
.username
, urlparts
.password
);
7777 if(urlparts
.scheme
=="ftps"):
7779 ftpfile
= BytesIO();
7780 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
7781 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
7786 def download_file_from_ftp_string(url
):
7787 ftpfile
= download_file_from_ftp_file(url
);
7788 return ftpfile
.read();
7790 def upload_file_to_ftp_file(ftpfile
, url
):
7791 urlparts
= urlparse(url
);
7792 file_name
= os
.path
.basename(urlparts
.path
);
7793 file_dir
= os
.path
.dirname(urlparts
.path
);
7794 if(urlparts
.username
is not None):
7795 ftp_username
= urlparts
.username
;
7797 ftp_username
= "anonymous";
7798 if(urlparts
.password
is not None):
7799 ftp_password
= urlparts
.password
;
7800 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7801 ftp_password
= "anonymous";
7804 if(urlparts
.scheme
=="ftp"):
7806 elif(urlparts
.scheme
=="ftps"):
7810 if(urlparts
.scheme
=="sftp"):
7812 return upload_file_from_pysftp_file(url
);
7814 return upload_file_from_sftp_file(url
);
7815 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7817 ftp_port
= urlparts
.port
;
7818 if(urlparts
.port
is None):
7821 ftp
.connect(urlparts
.hostname
, ftp_port
);
7822 except socket
.gaierror
:
7823 log
.info("Error With URL "+url
);
7825 except socket
.timeout
:
7826 log
.info("Error With URL "+url
);
7828 ftp
.login(urlparts
.username
, urlparts
.password
);
7829 if(urlparts
.scheme
=="ftps"):
7831 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
7836 def upload_file_to_ftp_string(ftpstring
, url
):
7837 ftpfileo
= BytesIO(ftpstring
);
7838 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
7842 def download_file_from_http_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7843 # Parse the URL to extract username and password if present
7844 urlparts
= urlparse(url
);
7845 username
= urlparts
.username
;
7846 password
= urlparts
.password
;
7847 # Rebuild the URL without the username and password
7848 netloc
= urlparts
.hostname
;
7849 if(urlparts
.scheme
=="sftp"):
7851 return download_file_from_pysftp_file(url
);
7853 return download_file_from_sftp_file(url
);
7854 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7855 return download_file_from_ftp_file(url
);
7857 netloc
+= ':' + str(urlparts
.port
);
7858 rebuilt_url
= urlunparse((urlparts
.scheme
, netloc
, urlparts
.path
, urlparts
.params
, urlparts
.query
, urlparts
.fragment
));
7859 # Create a temporary file object
7860 httpfile
= BytesIO();
7862 # Use the requests library if available
7863 if username
and password
:
7864 response
= requests
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
), stream
=True);
7866 response
= requests
.get(rebuilt_url
, headers
=headers
, stream
=True);
7867 response
.raw
.decode_content
= True
7868 shutil
.copyfileobj(response
.raw
, httpfile
);
7870 # Build a Request object for urllib
7871 request
= Request(rebuilt_url
, headers
=headers
);
7872 # Create an opener object for handling URLs
7873 if username
and password
:
7874 # Create a password manager
7875 password_mgr
= HTTPPasswordMgrWithDefaultRealm();
7876 # Add the username and password
7877 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
7878 # Create an authentication handler using the password manager
7879 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
7880 # Build the opener with the authentication handler
7881 opener
= build_opener(auth_handler
);
7883 opener
= build_opener();
7884 with opener
.open(request
) as response
:
7885 shutil
.copyfileobj(response
, httpfile
);
7886 # Reset file pointer to the start
7887 httpfile
.seek(0, 0);
7888 # Return the temporary file object
7891 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7892 httpfile
= download_file_from_http_file(url
, headers
);
7893 return ftpfile
.read();
7896 def download_file_from_sftp_file(url
):
7897 urlparts
= urlparse(url
);
7898 file_name
= os
.path
.basename(urlparts
.path
);
7899 file_dir
= os
.path
.dirname(urlparts
.path
);
7900 sftp_port
= urlparts
.port
;
7901 if(urlparts
.port
is None):
7904 sftp_port
= urlparts
.port
;
7905 if(urlparts
.username
is not None):
7906 sftp_username
= urlparts
.username
;
7908 sftp_username
= "anonymous";
7909 if(urlparts
.password
is not None):
7910 sftp_password
= urlparts
.password
;
7911 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7912 sftp_password
= "anonymous";
7915 if(urlparts
.scheme
=="ftp"):
7916 return download_file_from_ftp_file(url
);
7917 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7918 return download_file_from_http_file(url
);
7919 if(urlparts
.scheme
!="sftp"):
7921 ssh
= paramiko
.SSHClient();
7922 ssh
.load_system_host_keys();
7923 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7925 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7926 except paramiko
.ssh_exception
.SSHException
:
7928 except socket
.gaierror
:
7929 log
.info("Error With URL "+url
);
7931 except socket
.timeout
:
7932 log
.info("Error With URL "+url
);
7934 sftp
= ssh
.open_sftp();
7935 sftpfile
= BytesIO();
7936 sftp
.getfo(urlparts
.path
, sftpfile
);
7939 sftpfile
.seek(0, 0);
7942 def download_file_from_sftp_file(url
):
7946 def download_file_from_sftp_string(url
):
7947 sftpfile
= download_file_from_sftp_file(url
);
7948 return sftpfile
.read();
7950 def download_file_from_ftp_string(url
):
7954 def upload_file_to_sftp_file(sftpfile
, url
):
7955 urlparts
= urlparse(url
);
7956 file_name
= os
.path
.basename(urlparts
.path
);
7957 file_dir
= os
.path
.dirname(urlparts
.path
);
7958 sftp_port
= urlparts
.port
;
7959 if(urlparts
.port
is None):
7962 sftp_port
= urlparts
.port
;
7963 if(urlparts
.username
is not None):
7964 sftp_username
= urlparts
.username
;
7966 sftp_username
= "anonymous";
7967 if(urlparts
.password
is not None):
7968 sftp_password
= urlparts
.password
;
7969 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7970 sftp_password
= "anonymous";
7973 if(urlparts
.scheme
=="ftp"):
7974 return upload_file_from_ftp_file(url
);
7975 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7977 if(urlparts
.scheme
!="sftp"):
7979 ssh
= paramiko
.SSHClient();
7980 ssh
.load_system_host_keys();
7981 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7983 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7984 except paramiko
.ssh_exception
.SSHException
:
7986 except socket
.gaierror
:
7987 log
.info("Error With URL "+url
);
7989 except socket
.timeout
:
7990 log
.info("Error With URL "+url
);
7992 sftp
= ssh
.open_sftp();
7993 sftp
.putfo(sftpfile
, urlparts
.path
);
7996 sftpfile
.seek(0, 0);
7999 def upload_file_to_sftp_file(sftpfile
, url
):
8003 def upload_file_to_sftp_string(sftpstring
, url
):
8004 sftpfileo
= BytesIO(sftpstring
);
8005 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
8009 def upload_file_to_sftp_string(url
):
8013 def download_file_from_pysftp_file(url
):
8014 urlparts
= urlparse(url
);
8015 file_name
= os
.path
.basename(urlparts
.path
);
8016 file_dir
= os
.path
.dirname(urlparts
.path
);
8017 sftp_port
= urlparts
.port
;
8018 if(urlparts
.port
is None):
8021 sftp_port
= urlparts
.port
;
8022 if(urlparts
.username
is not None):
8023 sftp_username
= urlparts
.username
;
8025 sftp_username
= "anonymous";
8026 if(urlparts
.password
is not None):
8027 sftp_password
= urlparts
.password
;
8028 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8029 sftp_password
= "anonymous";
8032 if(urlparts
.scheme
=="ftp"):
8033 return download_file_from_ftp_file(url
);
8034 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8035 return download_file_from_http_file(url
);
8036 if(urlparts
.scheme
!="sftp"):
8039 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8040 except paramiko
.ssh_exception
.SSHException
:
8042 except socket
.gaierror
:
8043 log
.info("Error With URL "+url
);
8045 except socket
.timeout
:
8046 log
.info("Error With URL "+url
);
8048 sftp
= ssh
.open_sftp();
8049 sftpfile
= BytesIO();
8050 sftp
.getfo(urlparts
.path
, sftpfile
);
8053 sftpfile
.seek(0, 0);
8056 def download_file_from_pysftp_file(url
):
8060 def download_file_from_pysftp_string(url
):
8061 sftpfile
= download_file_from_pysftp_file(url
);
8062 return sftpfile
.read();
8064 def download_file_from_ftp_string(url
):
8068 def upload_file_to_pysftp_file(sftpfile
, url
):
8069 urlparts
= urlparse(url
);
8070 file_name
= os
.path
.basename(urlparts
.path
);
8071 file_dir
= os
.path
.dirname(urlparts
.path
);
8072 sftp_port
= urlparts
.port
;
8073 if(urlparts
.port
is None):
8076 sftp_port
= urlparts
.port
;
8077 if(urlparts
.username
is not None):
8078 sftp_username
= urlparts
.username
;
8080 sftp_username
= "anonymous";
8081 if(urlparts
.password
is not None):
8082 sftp_password
= urlparts
.password
;
8083 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8084 sftp_password
= "anonymous";
8087 if(urlparts
.scheme
=="ftp"):
8088 return upload_file_from_ftp_file(url
);
8089 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8091 if(urlparts
.scheme
!="sftp"):
8094 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8095 except paramiko
.ssh_exception
.SSHException
:
8097 except socket
.gaierror
:
8098 log
.info("Error With URL "+url
);
8100 except socket
.timeout
:
8101 log
.info("Error With URL "+url
);
8103 sftp
= ssh
.open_sftp();
8104 sftp
.putfo(sftpfile
, urlparts
.path
);
8107 sftpfile
.seek(0, 0);
8110 def upload_file_to_pysftp_file(sftpfile
, url
):
8114 def upload_file_to_pysftp_string(sftpstring
, url
):
8115 sftpfileo
= BytesIO(sftpstring
);
8116 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
8120 def upload_file_to_pysftp_string(url
):
8123 def download_file_from_internet_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
8124 urlparts
= urlparse(url
);
8125 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8126 return download_file_from_http_file(url
, headers
);
8127 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8128 return download_file_from_ftp_file(url
);
8129 elif(urlparts
.scheme
=="sftp"):
8130 if(__use_pysftp__
and havepysftp
):
8131 return download_file_from_pysftp_file(url
);
8133 return download_file_from_sftp_file(url
);
8138 def download_file_from_internet_uncompress_file(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_list__
):
8139 fp
= download_file_from_internet_file(url
);
8140 fp
= UncompressArchiveFile(fp
, formatspecs
);
8146 def download_file_from_internet_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
8147 urlparts
= urlparse(url
);
8148 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8149 return download_file_from_http_string(url
, headers
);
8150 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8151 return download_file_from_ftp_string(url
);
8152 elif(urlparts
.scheme
=="sftp"):
8153 if(__use_pysftp__
and havepysftp
):
8154 return download_file_from_pysftp_string(url
);
8156 return download_file_from_sftp_string(url
);
8161 def download_file_from_internet_uncompress_string(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_list__
):
8162 fp
= download_file_from_internet_string(url
);
8163 fp
= UncompressArchiveFile(fp
, formatspecs
);
8169 def upload_file_to_internet_file(ifp
, url
):
8170 urlparts
= urlparse(url
);
8171 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8173 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8174 return upload_file_from_ftp_file(ifp
, url
);
8175 elif(urlparts
.scheme
=="sftp"):
8176 if(__use_pysftp__
and havepysftp
):
8177 return upload_file_from_pysftp_file(ifp
, url
);
8179 return download_file_from_sftp_file(ifp
, url
);
8184 def upload_file_to_internet_compress_file(ifp
, url
, formatspecs
=__file_format_list__
):
8185 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
8189 upload_file_to_internet_file(catfp
, outfile
);
8192 def upload_file_to_internet_string(ifp
, url
):
8193 urlparts
= urlparse(url
);
8194 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8196 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8197 return upload_file_from_ftp_string(ifp
, url
);
8198 elif(urlparts
.scheme
=="sftp"):
8199 if(__use_pysftp__
and havepysftp
):
8200 return upload_file_from_pysftp_string(ifp
, url
);
8202 return download_file_from_sftp_string(ifp
, url
);
8207 def upload_file_to_internet_compress_string(ifp
, url
, formatspecs
=__file_format_list__
):
8208 catfp
= CompressArchiveFile(BytesIO(ifp
), compression
, formatspecs
);
8212 upload_file_to_internet_file(catfp
, outfile
);
8216 if(hasattr(shutil
, "register_archive_format")):
8217 # Register the packing format
8218 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
8219 except shutil
.RegistryError
:
8223 if(hasattr(shutil
, "register_unpack_format")):
8224 # Register the unpacking format
8225 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
8226 except shutil
.RegistryError
: