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/30/2024 Ver. 0.9.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 if(sys
.version_info
[0]==2):
61 FileNotFoundError
= IOError;
63 rarfile_support
= False;
66 rarfile_support
= True;
68 rarfile_support
= False;
70 py7zr_support
= False;
75 py7zr_support
= False;
78 from safetar
import is_tarfile
;
81 from xtarfile
import is_tarfile
;
83 from tarfile
import is_tarfile
;
86 import safetar
as tarfile
;
89 import xtarfile
as tarfile
;
107 haverequests
= False;
112 haverequests
= False;
116 logging
.getLogger("urllib3").setLevel(logging
.WARNING
);
120 from urllib
.request
import Request
, build_opener
, HTTPBasicAuthHandler
;
121 from urllib
.parse
import urlparse
;
124 from urllib2
import Request
, build_opener
, HTTPBasicAuthHandler
;
125 from urlparse
import urlparse
;
127 if(sys
.version
[0]=="2"):
129 from io
import StringIO
, BytesIO
;
132 from cStringIO
import StringIO
;
133 from cStringIO
import StringIO
as BytesIO
;
135 from StringIO
import StringIO
;
136 from StringIO
import StringIO
as BytesIO
;
137 elif(sys
.version
[0]>="3"):
138 from io
import StringIO
, BytesIO
;
143 from cStringIO
import StringIO
as BytesIO
;
149 from StringIO
import StringIO
as BytesIO
;
155 from io
import BytesIO
;
160 __use_pysftp__
= False;
162 __use_pysftp__
= False;
163 __file_format_name__
= "CatFile";
164 __program_name__
= "Py"+__file_format_name__
;
165 __file_format_lower__
= __file_format_name__
.lower();
166 __file_format_magic__
= __file_format_name__
;
167 __file_format_len__
= len(__file_format_magic__
);
168 __file_format_hex__
= binascii
.hexlify(__file_format_magic__
.encode("UTF-8")).decode("UTF-8");
169 __file_format_delimiter__
= "\x00";
170 __file_format_ver__
= "001";
171 __use_new_style__
= True;
172 __use_advanced_list__
= True;
173 __use_alt_inode__
= False;
174 __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__
];
175 __project__
= __program_name__
;
176 __project_url__
= "https://github.com/GameMaker2k/PyCatFile";
177 __version_info__
= (0, 9, 2, "RC 1", 1);
178 __version_date_info__
= (2024, 4, 30, "RC 1", 1);
179 __version_date__
= str(__version_date_info__
[0]) + "." + str(__version_date_info__
[1]).zfill(2) + "." + str(__version_date_info__
[2]).zfill(2);
180 __revision__
= __version_info__
[3];
181 __revision_id__
= "$Id$";
182 if(__version_info__
[4] is not None):
183 __version_date_plusrc__
= __version_date__
+ "-" + str(__version_date_info__
[4]);
184 if(__version_info__
[4] is None):
185 __version_date_plusrc__
= __version_date__
;
186 if(__version_info__
[3] is not None):
187 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]) + " " + str(__version_info__
[3]);
188 if(__version_info__
[3] is None):
189 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]);
191 PyBitness
= platform
.architecture();
192 if(PyBitness
=="32bit" or PyBitness
=="32"):
194 elif(PyBitness
=="64bit" or PyBitness
=="64"):
199 geturls_ua_pycatfile_python
= "Mozilla/5.0 (compatible; {proname}/{prover}; +{prourl})".format(proname
=__project__
, prover
=__version__
, prourl
=__project_url__
);
200 if(platform
.python_implementation()!=""):
201 py_implementation
= platform
.python_implementation();
202 if(platform
.python_implementation()==""):
203 py_implementation
= "Python";
204 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__
);
205 geturls_ua_googlebot_google
= "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
206 geturls_ua_googlebot_google_old
= "Googlebot/2.1 (+http://www.google.com/bot.html)";
207 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
)};
208 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
)};
209 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"};
210 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"};
212 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
213 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
214 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
216 tarfile_mimetype
= "application/tar";
217 tarfile_tar_mimetype
= tarfile_mimetype
;
218 zipfile_mimetype
= "application/zip";
219 zipfile_zip_mimetype
= zipfile_mimetype
;
220 rarfile_mimetype
= "application/rar";
221 rarfile_rar_mimetype
= rarfile_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
, True);
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
, True);
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
, True);
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
, True);
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 MakeEmptyFilePointer(fp
, checksumtype
="crc32", formatspecs
=__file_format_list__
):
1206 AppendFileHeader(fp
, 0, checksumtype
, formatspecs
);
1209 def MakeEmptyFile(outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", formatspecs
=__file_format_list__
, returnfp
=False):
1210 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1211 if(os
.path
.exists(outfile
)):
1215 catfpfp
= BytesIO();
1216 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1218 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1221 fbasename
= os
.path
.splitext(outfile
)[0];
1222 fextname
= os
.path
.splitext(outfile
)[1];
1223 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1224 catfp
= AppendFileHeader(catfp
, 0, checksumtype
, formatspecs
);
1225 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1226 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1229 os
.fsync(catfp
.fileno());
1230 except io
.UnsupportedOperation
:
1232 except AttributeError:
1236 if(hasattr(sys
.stdout
, "buffer")):
1237 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1239 shutil
.copyfileobj(catfp
, sys
.stdout
);
1240 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1241 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1243 upload_file_to_internet_file(catfp
, outfile
);
1251 def AppendFileHeaderWithContent(fp
, filevalues
=[], extradata
=[], filecontent
="", checksumtype
="crc32", formatspecs
=__file_format_list__
):
1252 extrafields
= format(len(extradata
), 'x').lower();
1253 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
1254 if(len(extradata
)>0):
1255 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1256 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1257 catoutlen
= len(filevalues
) + len(extradata
) + 5;
1258 catoutlenhex
= format(catoutlen
, 'x').lower();
1259 catoutlist
= filevalues
;
1260 catoutlist
.insert(0, catoutlenhex
);
1261 catoutlist
.append(extrasizelen
);
1262 catoutlist
.append(extrafields
);
1263 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
1264 if(len(extradata
)>0):
1265 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1266 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
1267 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1268 catfilecontentcshex
= GetFileChecksum(filecontent
, checksumtype
, False, formatspecs
);
1269 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1270 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
1271 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
1272 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1273 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1274 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1275 nullstrecd
= formatspecs
[5].encode('UTF-8');
1276 catfileout
= catfileoutstrecd
+ filecontent
+ nullstrecd
;
1277 fp
.write(catfileout
);
1280 os
.fsync(fp
.fileno());
1281 except io
.UnsupportedOperation
:
1283 except AttributeError:
1287 def AppendFilesWithContent(infiles
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False):
1288 advancedlist
= formatspecs
[8];
1289 altinode
= formatspecs
[9];
1291 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1293 for line
in sys
.stdin
:
1294 infilelist
.append(line
.strip());
1295 infilelist
= list(filter(None, infilelist
));
1296 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
1297 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
1299 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
1300 for line
in finfile
:
1301 infilelist
.append(line
.strip());
1302 infilelist
= list(filter(None, infilelist
));
1304 if(isinstance(infiles
, (list, tuple, ))):
1305 infilelist
= list(filter(None, infiles
));
1306 elif(isinstance(infiles
, (str, ))):
1307 infilelist
= list(filter(None, [infiles
]));
1309 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
1311 GetDirList
= ListDir(infilelist
, followlink
, False);
1319 inodetocatinode
= {};
1320 numfiles
= int(len(GetDirList
));
1321 fnumfiles
= format(numfiles
, 'x').lower();
1322 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1323 for curfname
in GetDirList
:
1324 catfhstart
= fp
.tell();
1325 if(re
.findall("^[.|/]", curfname
)):
1328 fname
= "./"+curfname
;
1330 VerbosePrintOut(fname
);
1331 if(not followlink
or followlink
is None):
1332 fstatinfo
= os
.lstat(fname
);
1334 fstatinfo
= os
.stat(fname
);
1335 fpremode
= fstatinfo
.st_mode
;
1336 finode
= fstatinfo
.st_ino
;
1337 flinkcount
= fstatinfo
.st_nlink
;
1339 if(stat
.S_ISREG(fpremode
)):
1341 elif(stat
.S_ISLNK(fpremode
)):
1343 elif(stat
.S_ISCHR(fpremode
)):
1345 elif(stat
.S_ISBLK(fpremode
)):
1347 elif(stat
.S_ISDIR(fpremode
)):
1349 elif(stat
.S_ISFIFO(fpremode
)):
1351 elif(stat
.S_ISSOCK(fpremode
)):
1353 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
1355 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
1357 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
1362 fcurfid
= format(int(curfid
), 'x').lower();
1363 if(not followlink
and finode
!=0):
1365 if(finode
in inodelist
):
1367 flinkname
= inodetofile
[finode
];
1369 fcurinode
= format(int(finode
), 'x').lower();
1371 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
1372 if(finode
not in inodelist
):
1373 inodelist
.append(finode
);
1374 inodetofile
.update({finode
: fname
});
1375 inodetocatinode
.update({finode
: curinode
});
1377 fcurinode
= format(int(finode
), 'x').lower();
1379 fcurinode
= format(int(curinode
), 'x').lower();
1380 curinode
= curinode
+ 1;
1382 fcurinode
= format(int(curinode
), 'x').lower();
1383 curinode
= curinode
+ 1;
1384 curfid
= curfid
+ 1;
1386 flinkname
= os
.readlink(fname
);
1387 fdev
= fstatinfo
.st_dev
;
1388 getfdev
= GetDevMajorMinor(fdev
);
1389 fdev_minor
= getfdev
[0];
1390 fdev_major
= getfdev
[1];
1391 frdev
= fstatinfo
.st_dev
;
1392 if(hasattr(fstatinfo
, "st_rdev")):
1393 frdev
= fstatinfo
.st_rdev
;
1395 frdev
= fstatinfo
.st_dev
;
1396 getfrdev
= GetDevMajorMinor(frdev
);
1397 frdev_minor
= getfrdev
[0];
1398 frdev_major
= getfrdev
[1];
1399 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1400 fsize
= format(int("0"), 'x').lower();
1401 elif(ftype
==0 or ftype
==7):
1402 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
1404 fsize
= format(int(fstatinfo
.st_size
)).lower();
1405 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
1406 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
1407 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1408 if(hasattr(fstatinfo
, "st_birthtime")):
1409 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
1411 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1412 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
1413 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
1414 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
1415 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
1416 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
1421 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
1422 funame
= userinfo
.pw_name
;
1431 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
1432 fgname
= groupinfo
.gr_name
;
1437 fdev_minor
= format(int(fdev_minor
), 'x').lower();
1438 fdev_major
= format(int(fdev_major
), 'x').lower();
1439 frdev_minor
= format(int(frdev_minor
), 'x').lower();
1440 frdev_major
= format(int(frdev_major
), 'x').lower();
1441 finode
= format(int(finode
), 'x').lower();
1442 flinkcount
= format(int(flinkcount
), 'x').lower();
1443 if(hasattr(fstatinfo
, "st_file_attributes")):
1444 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
1446 fwinattributes
= format(int(0), 'x').lower();
1447 fcontents
= "".encode('UTF-8');
1449 if(ftype
==0 or ftype
==7):
1450 with
open(fname
, "rb") as fpc
:
1452 chunk
= fpc
.read(chunk_size
);
1456 if(followlink
and (ftype
==1 or ftype
==2)):
1457 flstatinfo
= os
.stat(flinkname
);
1458 with
open(flinkname
, "rb") as fpc
:
1460 chunk
= fpc
.read(chunk_size
);
1464 ftypehex
= format(ftype
, 'x').lower();
1465 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
];
1466 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
, checksumtype
, formatspecs
);
1468 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
1472 def AppendListsWithContent(inlist
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False):
1474 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1475 GetDirList
= inlist
;
1483 inodetocatinode
= {};
1484 numfiles
= int(len(GetDirList
));
1485 fnumfiles
= format(numfiles
, 'x').lower();
1486 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1487 for curfname
in GetDirList
:
1488 ftype
= format(curfname
[0], 'x').lower();
1489 if(re
.findall("^[.|/]", curfname
[1])):
1490 fname
= curfname
[1];
1492 fname
= "./"+curfname
[1];
1493 fbasedir
= os
.path
.dirname(fname
);
1494 flinkname
= curfname
[2];
1495 fsize
= format(curfname
[3], 'x').lower();
1496 fatime
= format(curfname
[4], 'x').lower();
1497 fmtime
= format(curfname
[5], 'x').lower();
1498 fctime
= format(curfname
[6], 'x').lower();
1499 fbtime
= format(curfname
[7], 'x').lower();
1500 fmode
= format(curfname
[8], 'x').lower();
1501 fwinattributes
= format(curfname
[9], 'x').lower();
1502 fuid
= format(curfname
[10], 'x').lower();
1503 funame
= curfname
[11];
1504 fgid
= format(curfname
[12], 'x').lower();
1505 fgname
= curfname
[13];
1506 fid
= format(curfname
[14], 'x').lower();
1507 finode
= format(curfname
[15], 'x').lower();
1508 flinkcount
= format(curfname
[16], 'x').lower();
1509 fdev_minor
= format(curfname
[17], 'x').lower();
1510 fdev_major
= format(curfname
[18], 'x').lower();
1511 frdev_minor
= format(curfname
[19], 'x').lower();
1512 frdev_major
= format(curfname
[20], 'x').lower();
1513 extradata
= curfname
[21];
1514 fchecksumtype
= curfname
[22];
1515 fcontents
= curfname
[23];
1516 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
];
1517 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
, checksumtype
, formatspecs
);
1519 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
1523 def AppendInFileWithContent(infile
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False):
1524 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, False, formatspecs
);
1525 return AppendListsWithContent(inlist
, fp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1527 def AppendFilesWithContentToOutFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1528 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1529 if(os
.path
.exists(outfile
)):
1533 catfpfp
= BytesIO();
1534 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1536 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1539 fbasename
= os
.path
.splitext(outfile
)[0];
1540 fextname
= os
.path
.splitext(outfile
)[1];
1541 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1542 catfp
= AppendFilesWithContent(infiles
, catfp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1543 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1544 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1547 os
.fsync(catfp
.fileno());
1548 except io
.UnsupportedOperation
:
1550 except AttributeError:
1554 if(hasattr(sys
.stdout
, "buffer")):
1555 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1557 shutil
.copyfileobj(catfp
, sys
.stdout
);
1558 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1559 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1561 upload_file_to_internet_file(catfp
, outfile
);
1569 def AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1570 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1571 if(os
.path
.exists(outfile
)):
1575 catfpfp
= BytesIO();
1576 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1578 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1581 fbasename
= os
.path
.splitext(outfile
)[0];
1582 fextname
= os
.path
.splitext(outfile
)[1];
1583 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1584 catfp
= AppendListsWithContent(inlist
, catfp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1585 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1586 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1589 os
.fsync(catfp
.fileno());
1590 except io
.UnsupportedOperation
:
1592 except AttributeError:
1596 if(hasattr(sys
.stdout
, "buffer")):
1597 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1599 shutil
.copyfileobj(catfp
, sys
.stdout
);
1600 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1601 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1603 upload_file_to_internet_file(catfp
, outfile
);
1611 def AppendInFileWithContentToOutFile(infile
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1612 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, False, formatspecs
);
1613 return AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
, returnfp
);
1615 def PrintPermissionString(fchmode
, ftype
):
1616 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' } };
1618 for fmodval
in str(oct(fchmode
))[-3:]:
1619 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
1620 if(ftype
==0 or ftype
==7):
1621 permissionstr
= "-" + permissionstr
;
1623 permissionstr
= "h" + permissionstr
;
1625 permissionstr
= "l" + permissionstr
;
1627 permissionstr
= "c" + permissionstr
;
1629 permissionstr
= "b" + permissionstr
;
1631 permissionstr
= "d" + permissionstr
;
1633 permissionstr
= "f" + permissionstr
;
1635 permissionstr
= "D" + permissionstr
;
1637 permissionstr
= "p" + permissionstr
;
1639 permissionstr
= "w" + permissionstr
;
1641 permissionoutstr
= stat
.filemode(fchmode
);
1642 except AttributeError:
1643 permissionoutstr
= permissionstr
;
1645 permissionoutstr
= permissionstr
;
1646 return permissionoutstr
;
1648 def PrintPermissionStringAlt(fchmode
, ftype
):
1650 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
1651 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
1653 # Translate file mode into permission string
1654 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
1655 # Append file type indicator
1657 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
1658 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
1660 file_type
= type_indicators
.get(ftype
, '-');
1661 permissionstr
= file_type
+ permissionstr
;
1663 permissionoutstr
= stat
.filemode(fchmode
);
1664 except AttributeError:
1665 permissionoutstr
= permissionstr
;
1666 return permissionoutstr
;
1668 def CompressionSupport():
1669 compression_list
= [];
1672 compression_list
.append("gz");
1673 compression_list
.append("gzip");
1678 compression_list
.append("bz2");
1679 compression_list
.append("bzip2");
1684 compression_list
.append("lz4");
1689 compression_list
.append("lzo");
1690 compression_list
.append("lzop");
1695 compression_list
.append("zstd");
1696 compression_list
.append("zstandard");
1701 compression_list
.append("lzma");
1702 compression_list
.append("xz");
1705 return compression_list
;
1707 def CheckCompressionType(infile
, formatspecs
=__file_format_list__
, closefp
=True):
1708 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1712 catfp
= open(infile
, "rb");
1713 except FileNotFoundError
:
1716 prefp
= catfp
.read(2);
1718 if(prefp
==binascii
.unhexlify("1f8b")):
1721 prefp
= catfp
.read(3);
1722 if(prefp
==binascii
.unhexlify("425a68")):
1724 if(prefp
==binascii
.unhexlify("5d0000")):
1727 prefp
= catfp
.read(4);
1728 if(prefp
==binascii
.unhexlify("28b52ffd")):
1730 if(prefp
==binascii
.unhexlify("04224d18")):
1732 if(prefp
==binascii
.unhexlify("504B0304")):
1733 filetype
= "zipfile";
1735 prefp
= catfp
.read(5);
1736 if(prefp
==binascii
.unhexlify("7573746172")):
1737 filetype
= "tarfile";
1739 prefp
= catfp
.read(6);
1740 if(prefp
==binascii
.unhexlify("fd377a585a00")):
1742 if(prefp
==binascii
.unhexlify("377abcaf271c")):
1743 filetype
= "7zipfile";
1745 prefp
= catfp
.read(7);
1746 if(prefp
==binascii
.unhexlify("526172211a0700")):
1747 filetype
= "rarfile";
1748 if(prefp
==binascii
.unhexlify("43617446696c65")):
1749 filetype
= "catfile";
1751 prefp
= catfp
.read(8);
1752 if(prefp
==binascii
.unhexlify("526172211a070100")):
1753 filetype
= "rarfile";
1755 prefp
= catfp
.read(formatspecs
[3]);
1756 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
1757 filetype
= formatspecs
[2];
1759 prefp
= catfp
.read(9);
1760 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
1763 prefp
= catfp
.read(10);
1764 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
1765 filetype
= "tarfile";
1771 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_list__
, closefp
=True):
1773 instringsfile
= BytesIO(instring
);
1775 instringsfile
= BytesIO(instring
.encode("UTF-8"));
1776 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
1778 def GetCompressionMimeType(infile
, formatspecs
=__file_format_list__
):
1779 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
1780 if(compresscheck
=="gzip" or compresscheck
=="gz"):
1781 return archivefile_gzip_mimetype
;
1782 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
1783 return archivefile_bzip2_mimetype
;
1784 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
1785 return archivefile_zstandard_mimetype
;
1786 if(compresscheck
=="lz4"):
1787 return archivefile_lz4_mimetype
;
1788 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
1789 return archivefile_lzop_mimetype
;
1790 if(compresscheck
=="lzma"):
1791 return archivefile_lzma_mimetype
;
1792 if(compresscheck
=="xz"):
1793 return archivefile_xz_mimetype
;
1794 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
[2]):
1795 return archivefile_cat_mimetype
;
1796 if(not compresscheck
):
1800 def UncompressArchiveFile(fp
, formatspecs
=__file_format_list__
):
1801 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
1803 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
1804 if(compresscheck
=="gzip"):
1809 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
1810 if(compresscheck
=="bzip2"):
1816 catfp
.write(bz2
.decompress(fp
.read()));
1817 if(compresscheck
=="zstd"):
1823 catfp
.write(zstandard
.decompress(fp
.read()));
1824 if(compresscheck
=="lz4"):
1830 catfp
.write(lz4
.frame
.decompress(fp
.read()));
1831 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
1837 catfp
.write(lzo
.decompress(fp
.read()));
1838 if(compresscheck
=="lzma" or compresscheck
=="xz"):
1844 catfp
.write(lzma
.decompress(fp
.read()));
1845 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
1847 if(not compresscheck
):
1853 with fp
as fpcontent
:
1855 catfp
.write(lzma
.decompress(fp
.read()));
1856 except lzma
.LZMAError
:
1860 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
1862 def UncompressFile(infile
, formatspecs
=__file_format_list__
, mode
="rb"):
1863 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
1864 if(sys
.version_info
[0]==2 and compresscheck
):
1870 if(compresscheck
=="gzip"):
1876 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
1877 except (ValueError, TypeError) as e
:
1878 filefp
= gzip
.open(infile
, mode
);
1879 if(compresscheck
=="bzip2"):
1885 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
1886 except (ValueError, TypeError) as e
:
1887 filefp
= bz2
.open(infile
, mode
);
1888 if(compresscheck
=="zstd"):
1894 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
1895 except (ValueError, TypeError) as e
:
1896 filefp
= zstandard
.open(infile
, mode
);
1897 if(compresscheck
=="lz4"):
1903 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
1904 except (ValueError, TypeError) as e
:
1905 filefp
= lz4
.frame
.open(infile
, mode
);
1906 if(compresscheck
=="lzo"):
1912 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
1913 except (ValueError, TypeError) as e
:
1914 filefp
= lzo
.open(infile
, mode
);
1915 if(compresscheck
=="lzma"):
1921 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
1922 except (ValueError, TypeError) as e
:
1923 filefp
= lzma
.open(infile
, mode
);
1924 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
1926 filefp
= open(infile
, mode
, encoding
="UTF-8");
1927 except (ValueError, TypeError) as e
:
1928 filefp
= open(infile
, mode
);
1929 if(not compresscheck
):
1931 filefp
= open(infile
, mode
, encoding
="UTF-8");
1932 except (ValueError, TypeError) as e
:
1933 filefp
= open(infile
, mode
);
1934 except FileNotFoundError
:
1938 def UncompressString(infile
):
1939 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
1940 if(compresscheck
=="gzip"):
1945 fileuz
= gzip
.decompress(infile
);
1946 if(compresscheck
=="bzip2"):
1951 fileuz
= bz2
.decompress(infile
);
1952 if(compresscheck
=="zstd"):
1957 fileuz
= zstandard
.decompress(infile
);
1958 if(compresscheck
=="lz4"):
1963 fileuz
= lz4
.frame
.decompress(infile
);
1964 if(compresscheck
=="lzo"):
1969 fileuz
= lzo
.decompress(infile
);
1970 if(compresscheck
=="lzma"):
1975 fileuz
= lzma
.decompress(infile
);
1976 if(not compresscheck
):
1978 if(hasattr(fileuz
, 'decode')):
1979 fileuz
= fileuz
.decode("UTF-8");
1982 def UncompressStringAlt(infile
):
1983 filefp
= StringIO();
1984 outstring
= UncompressString(infile
);
1985 filefp
.write(outstring
);
1989 def CheckCompressionSubType(infile
, formatspecs
=__file_format_list__
, closefp
=True):
1990 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
1991 if(not compresscheck
):
1992 fextname
= os
.path
.splitext(infile
)[1];
1993 if(fextname
==".gz"):
1994 compresscheck
= "gzip";
1995 elif(fextname
==".bz2"):
1996 compresscheck
= "bzip2";
1997 elif(fextname
==".zst"):
1998 compresscheck
= "zstd";
1999 elif(fextname
==".lz4"):
2000 compresscheck
= "lz4";
2001 elif(fextname
==".lzo" or fextname
==".lzop"):
2002 compresscheck
= "lzo";
2003 elif(fextname
==".lzma" or fextname
==".xz"):
2004 compresscheck
= "lzma";
2007 if(not compresscheck
):
2009 if(compresscheck
=="catfile"):
2011 if(compresscheck
==formatspecs
[2]):
2012 return formatspecs
[2];
2013 if(compresscheck
=="tarfile"):
2015 if(compresscheck
=="zipfile"):
2017 if(rarfile_support
and compresscheck
=="rarfile"):
2019 if(py7zr_support
and compresscheck
=="7zipfile"):
2021 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2022 catfp
= UncompressArchiveFile(infile
, formatspecs
[2]);
2025 if(compresscheck
=="gzip"):
2030 catfp
= gzip
.GzipFile(infile
, "rb");
2031 if(compresscheck
=="bzip2"):
2036 catfp
= bz2
.BZ2File(infile
, "rb");
2037 if(compresscheck
=="lz4"):
2042 catfp
= lz4
.frame
.open(infile
, "rb");
2043 if(compresscheck
=="zstd"):
2048 catfp
= zstandard
.open(infile
, "rb");
2049 if(compresscheck
=="lzma" or compresscheck
=="xz"):
2054 catfp
= lzma
.open(infile
, "rb");
2055 except FileNotFoundError
:
2058 prefp
= catfp
.read(5);
2059 if(prefp
==binascii
.unhexlify("7573746172")):
2060 filetype
= "tarfile";
2062 prefp
= catfp
.read(7);
2063 if(prefp
==binascii
.unhexlify("43617446696c65")):
2064 filetype
= "catfile";
2066 prefp
= catfp
.read(formatspecs
[3]);
2067 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
2068 filetype
= formatspecs
[2];
2070 prefp
= catfp
.read(10);
2071 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2072 filetype
= "tarfile";
2078 def GZipCompress(data
, compresslevel
=9):
2083 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
2085 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
2089 catfp
= open(tmpfp
.name
, "rb");
2090 except FileNotFoundError
:
2092 catdata
= catfp
.read();
2096 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_list__
):
2097 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2100 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2102 if(compression
not in compressionlist
and compression
is None):
2103 compression
= "auto";
2104 if(compression
=="gzip"):
2110 if(compressionlevel
is None):
2111 compressionlevel
= 9;
2113 compressionlevel
= int(compressionlevel
);
2114 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
2115 if(compression
=="bzip2"):
2121 if(compressionlevel
is None):
2122 compressionlevel
= 9;
2124 compressionlevel
= int(compressionlevel
);
2125 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
2126 if(compression
=="lz4"):
2132 if(compressionlevel
is None):
2133 compressionlevel
= 9;
2135 compressionlevel
= int(compressionlevel
);
2136 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
2137 if(compression
=="lzo" or compression
=="lzop"):
2143 if(compressionlevel
is None):
2144 compressionlevel
= 9;
2146 compressionlevel
= int(compressionlevel
);
2147 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
2148 if(compression
=="zstd"):
2154 if(compressionlevel
is None):
2155 compressionlevel
= 10;
2157 compressionlevel
= int(compressionlevel
);
2158 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
2159 if(compression
=="lzma"):
2165 if(compressionlevel
is None):
2166 compressionlevel
= 9;
2168 compressionlevel
= int(compressionlevel
);
2169 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
2170 if(compression
=="xz"):
2176 if(compressionlevel
is None):
2177 compressionlevel
= 9;
2179 compressionlevel
= int(compressionlevel
);
2180 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
2181 if(compression
=="auto" or compression
is None):
2186 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
2188 def CompressOpenFile(outfile
, compressionlevel
=None):
2189 if(outfile
is None):
2191 fbasename
= os
.path
.splitext(outfile
)[0];
2192 fextname
= os
.path
.splitext(outfile
)[1];
2193 if(compressionlevel
is None and fextname
!=".zst"):
2194 compressionlevel
= 9;
2195 elif(compressionlevel
is None and fextname
==".zst"):
2196 compressionlevel
= 10;
2198 compressionlevel
= int(compressionlevel
);
2199 if(sys
.version_info
[0]==2):
2204 if(fextname
not in outextlistwd
):
2206 outfp
= open(outfile
, "wb", encoding
="UTF-8");
2207 except (ValueError, TypeError) as e
:
2208 outfp
= open(outfile
, "wb");
2209 elif(fextname
==".gz"):
2215 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2216 except (ValueError, TypeError) as e
:
2217 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
2218 elif(fextname
==".bz2"):
2224 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2225 except (ValueError, TypeError) as e
:
2226 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
2227 elif(fextname
==".zst"):
2233 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
2234 except (ValueError, TypeError) as e
:
2235 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
2236 elif(fextname
==".xz"):
2242 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
2243 except (ValueError, TypeError) as e
:
2244 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
2245 elif(fextname
==".lz4"):
2251 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
2252 except (ValueError, TypeError) as e
:
2253 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
2254 elif(fextname
==".lzo"):
2260 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
2261 except (ValueError, TypeError) as e
:
2262 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
2263 elif(fextname
==".lzma"):
2269 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
2270 except (ValueError, TypeError) as e
:
2271 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
2272 except FileNotFoundError
:
2276 def GetDevMajorMinor(fdev
):
2278 if(hasattr(os
, "minor")):
2279 retdev
.append(os
.minor(fdev
));
2282 if(hasattr(os
, "major")):
2283 retdev
.append(os
.major(fdev
));
2288 def CheckSumSupport(checkfor
, guaranteed
=True):
2290 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2292 hash_list
= sorted(list(hashlib
.algorithms_available
));
2293 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
2294 if(checkfor
in checklistout
):
2299 def CheckSumSupportAlt(checkfor
, guaranteed
=True):
2301 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2303 hash_list
= sorted(list(hashlib
.algorithms_available
));
2304 checklistout
= hash_list
;
2305 if(checkfor
in checklistout
):
2310 def PackArchiveFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2311 advancedlist
= formatspecs
[8];
2312 altinode
= formatspecs
[9];
2313 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2314 outfile
= RemoveWindowsPath(outfile
);
2315 checksumtype
= checksumtype
.lower();
2316 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2317 checksumtype
="crc32";
2318 if(checksumtype
=="none"):
2320 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2322 if(compression
not in compressionlist
and compression
is None):
2323 compression
= "auto";
2325 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2326 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2327 if(os
.path
.exists(outfile
)):
2332 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2334 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2337 fbasename
= os
.path
.splitext(outfile
)[0];
2338 fextname
= os
.path
.splitext(outfile
)[1];
2339 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2340 catver
= formatspecs
[6];
2341 fileheaderver
= str(int(catver
.replace(".", "")));
2342 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2343 catfp
.write(fileheader
.encode('UTF-8'));
2346 for line
in sys
.stdin
:
2347 infilelist
.append(line
.strip());
2348 infilelist
= list(filter(None, infilelist
));
2349 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
2350 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
2352 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
2353 for line
in finfile
:
2354 infilelist
.append(line
.strip());
2355 infilelist
= list(filter(None, infilelist
));
2357 if(isinstance(infiles
, (list, tuple, ))):
2358 infilelist
= list(filter(None, infiles
));
2359 elif(isinstance(infiles
, (str, ))):
2360 infilelist
= list(filter(None, [infiles
]));
2362 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
2364 GetDirList
= ListDir(infilelist
, followlink
, False);
2372 inodetocatinode
= {};
2373 numfiles
= int(len(GetDirList
));
2374 fnumfiles
= format(int(len(GetDirList
)), 'x').lower();
2375 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2376 if(checksumtype
=="none" or checksumtype
==""):
2377 catfileheadercshex
= format(0, 'x').lower();
2378 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2379 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2380 elif(checksumtype
=="crc16_ccitt"):
2381 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2382 elif(checksumtype
=="adler32"):
2383 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2384 elif(checksumtype
=="crc32"):
2385 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2386 elif(checksumtype
=="crc64_ecma"):
2387 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2388 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2389 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2390 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2391 checksumoutstr
= hashlib
.new(checksumtype
);
2392 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
2393 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2395 catfileheadercshex
= format(0, 'x').lower
2396 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2397 catfp
.write(fnumfilesa
.encode('UTF-8'));
2400 os
.fsync(catfp
.fileno());
2401 except io
.UnsupportedOperation
:
2403 except AttributeError:
2405 for curfname
in GetDirList
:
2406 catfhstart
= catfp
.tell();
2407 if(re
.findall("^[.|/]", curfname
)):
2410 fname
= "./"+curfname
;
2412 VerbosePrintOut(fname
);
2413 if(not followlink
or followlink
is None):
2414 fstatinfo
= os
.lstat(fname
);
2416 fstatinfo
= os
.stat(fname
);
2417 fpremode
= fstatinfo
.st_mode
;
2418 finode
= fstatinfo
.st_ino
;
2419 flinkcount
= fstatinfo
.st_nlink
;
2421 if(stat
.S_ISREG(fpremode
)):
2423 elif(stat
.S_ISLNK(fpremode
)):
2425 elif(stat
.S_ISCHR(fpremode
)):
2427 elif(stat
.S_ISBLK(fpremode
)):
2429 elif(stat
.S_ISDIR(fpremode
)):
2431 elif(stat
.S_ISFIFO(fpremode
)):
2433 elif(stat
.S_ISSOCK(fpremode
)):
2435 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
2437 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
2439 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
2444 fcurfid
= format(int(curfid
), 'x').lower();
2445 if(not followlink
and finode
!=0):
2447 if(finode
in inodelist
):
2449 flinkname
= inodetofile
[finode
];
2451 fcurinode
= format(int(finode
), 'x').lower();
2453 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
2454 if(finode
not in inodelist
):
2455 inodelist
.append(finode
);
2456 inodetofile
.update({finode
: fname
});
2457 inodetocatinode
.update({finode
: curinode
});
2459 fcurinode
= format(int(finode
), 'x').lower();
2461 fcurinode
= format(int(curinode
), 'x').lower();
2462 curinode
= curinode
+ 1;
2464 fcurinode
= format(int(curinode
), 'x').lower();
2465 curinode
= curinode
+ 1;
2466 curfid
= curfid
+ 1;
2468 flinkname
= os
.readlink(fname
);
2469 fdev
= fstatinfo
.st_dev
;
2470 getfdev
= GetDevMajorMinor(fdev
);
2471 fdev_minor
= getfdev
[0];
2472 fdev_major
= getfdev
[1];
2473 frdev
= fstatinfo
.st_dev
;
2474 if(hasattr(fstatinfo
, "st_rdev")):
2475 frdev
= fstatinfo
.st_rdev
;
2477 frdev
= fstatinfo
.st_dev
;
2478 getfrdev
= GetDevMajorMinor(frdev
);
2479 frdev_minor
= getfrdev
[0];
2480 frdev_major
= getfrdev
[1];
2481 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2482 fsize
= format(int("0"), 'x').lower();
2483 elif(ftype
==0 or ftype
==7):
2484 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
2486 fsize
= format(int(fstatinfo
.st_size
)).lower();
2487 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
2488 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
2489 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2490 if(hasattr(fstatinfo
, "st_birthtime")):
2491 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
2493 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2494 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
2495 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
2496 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
2497 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
2498 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
2503 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
2504 funame
= userinfo
.pw_name
;
2513 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
2514 fgname
= groupinfo
.gr_name
;
2519 fdev_minor
= format(int(fdev_minor
), 'x').lower();
2520 fdev_major
= format(int(fdev_major
), 'x').lower();
2521 frdev_minor
= format(int(frdev_minor
), 'x').lower();
2522 frdev_major
= format(int(frdev_major
), 'x').lower();
2523 finode
= format(int(finode
), 'x').lower();
2524 flinkcount
= format(int(flinkcount
), 'x').lower();
2525 if(hasattr(fstatinfo
, "st_file_attributes")):
2526 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
2528 fwinattributes
= format(int(0), 'x').lower();
2529 fcontents
= "".encode('UTF-8');
2531 if(ftype
==0 or ftype
==7):
2532 with
open(fname
, "rb") as fpc
:
2534 chunk
= fpc
.read(chunk_size
);
2538 if(followlink
and (ftype
==1 or ftype
==2)):
2539 flstatinfo
= os
.stat(flinkname
);
2540 with
open(flinkname
, "rb") as fpc
:
2542 chunk
= fpc
.read(chunk_size
);
2546 ftypehex
= format(ftype
, 'x').lower();
2547 extrafields
= format(len(extradata
), 'x').lower();
2548 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2549 if(len(extradata
)>0):
2550 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2551 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2552 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
];
2553 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
2554 catoutlenhex
= format(catoutlen
, 'x').lower();
2555 catoutlist
.insert(0, catoutlenhex
);
2556 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
2557 if(len(extradata
)>0):
2558 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2559 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2560 if(checksumtype
=="none" or checksumtype
==""):
2561 catfileheadercshex
= format(0, 'x').lower();
2562 catfilecontentcshex
= format(0, 'x').lower();
2563 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2564 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
2565 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
2566 elif(checksumtype
=="crc16_ccitt"):
2567 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
2568 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
2569 elif(checksumtype
=="adler32"):
2570 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2571 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
2572 elif(checksumtype
=="crc32"):
2573 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2574 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
2575 elif(checksumtype
=="crc64_ecma"):
2576 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2577 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
2578 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2579 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2580 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
2581 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2582 checksumoutstr
= hashlib
.new(checksumtype
);
2583 checksumoutstr
.update("".encode('UTF-8'));
2584 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2585 checksumoutstr
= hashlib
.new(checksumtype
);
2586 checksumoutstr
.update(fcontents
);
2587 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
2589 catfileheadercshex
= format(0, 'x').lower();
2590 catfilecontentcshex
= format(0, 'x').lower();
2591 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2592 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2593 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
2594 if(checksumtype
=="none" or checksumtype
==""):
2595 catfileheadercshex
= format(0, 'x').lower();
2596 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2597 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2598 elif(checksumtype
=="crc16_ccitt"):
2599 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2600 elif(checksumtype
=="adler32"):
2601 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2602 elif(checksumtype
=="crc32"):
2603 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2604 elif(checksumtype
=="crc64_ecma"):
2605 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2606 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2607 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2608 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2609 checksumoutstr
= hashlib
.new(checksumtype
);
2610 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
2611 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2613 catfileheadercshex
= format(0, 'x').lower();
2614 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2615 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2616 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2617 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2618 nullstrecd
= formatspecs
[5].encode('UTF-8');
2619 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
2620 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2621 catfp
.write(catfileout
);
2624 os
.fsync(catfp
.fileno());
2625 except io
.UnsupportedOperation
:
2627 except AttributeError:
2630 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
2631 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2632 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2635 os
.fsync(catfp
.fileno());
2636 except io
.UnsupportedOperation
:
2638 except AttributeError:
2642 if(hasattr(sys
.stdout
, "buffer")):
2643 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2645 shutil
.copyfileobj(catfp
, sys
.stdout
);
2646 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2647 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2649 upload_file_to_internet_file(catfp
, outfile
);
2657 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
2659 if(hasattr(shutil
, "register_archive_format")):
2660 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
2661 return PackArchiveFile(source_dir
, archive_name
, False, "auto", None, False, "crc32", [], __file_format_delimiter__
, False, False);
2662 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
2664 def PackArchiveFileFromDirList(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2665 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
2667 create_alias_function("Pack", __file_format_name__
, "FromDirList", PackArchiveFileFromDirList
);
2669 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2670 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2671 outfile
= RemoveWindowsPath(outfile
);
2672 checksumtype
= checksumtype
.lower();
2673 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2674 checksumtype
="crc32";
2675 if(checksumtype
=="none"):
2677 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2679 if(compression
not in compressionlist
and compression
is None):
2680 compression
= "auto";
2682 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2683 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2684 if(os
.path
.exists(outfile
)):
2689 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2691 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2694 fbasename
= os
.path
.splitext(outfile
)[0];
2695 fextname
= os
.path
.splitext(outfile
)[1];
2696 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2697 catver
= formatspecs
[6];
2698 fileheaderver
= str(int(catver
.replace(".", "")));
2699 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2700 catfp
.write(fileheader
.encode('UTF-8'));
2706 inodetocatinode
= {};
2709 if(hasattr(sys
.stdin
, "buffer")):
2710 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
2712 shutil
.copyfileobj(sys
.stdin
, infile
);
2717 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
2718 infile
= download_file_from_internet_file(infile
);
2723 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2725 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
2727 if(not tarfile
.is_tarfile(infile
)):
2729 except AttributeError:
2730 if(not is_tarfile(infile
)):
2735 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2736 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
2738 tarfp
= tarfile
.open(infile
, "r");
2739 except FileNotFoundError
:
2741 numfiles
= int(len(tarfp
.getmembers()));
2742 fnumfiles
= format(int(len(tarfp
.getmembers())), 'x').lower();
2743 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2744 if(checksumtype
=="none" or checksumtype
==""):
2745 catfileheadercshex
= format(0, 'x').lower();
2746 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2747 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2748 elif(checksumtype
=="crc16_ccitt"):
2749 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2750 elif(checksumtype
=="adler32"):
2751 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2752 elif(checksumtype
=="crc32"):
2753 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2754 elif(checksumtype
=="crc64_ecma"):
2755 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2756 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2757 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2758 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2759 checksumoutstr
= hashlib
.new(checksumtype
);
2760 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
2761 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2763 catfileheadercshex
= format(0, 'x').lower();
2764 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2765 catfp
.write(fnumfilesa
.encode('UTF-8'));
2768 os
.fsync(catfp
.fileno());
2769 except io
.UnsupportedOperation
:
2771 except AttributeError:
2773 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
2774 catfhstart
= catfp
.tell();
2775 if(re
.findall("^[.|/]", member
.name
)):
2776 fname
= member
.name
;
2778 fname
= "./"+member
.name
;
2780 VerbosePrintOut(fname
);
2781 fpremode
= member
.mode
;
2782 ffullmode
= member
.mode
;
2786 ffullmode
= member
.mode
+ stat
.S_IFREG
;
2788 elif(member
.isdev()):
2789 ffullmode
= member
.mode
;
2791 elif(member
.islnk()):
2792 ffullmode
= member
.mode
+ stat
.S_IFREG
;
2794 elif(member
.issym()):
2795 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
2797 elif(member
.ischr()):
2798 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
2800 elif(member
.isblk()):
2801 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
2803 elif(member
.isdir()):
2804 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
2806 elif(member
.isfifo()):
2807 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
2809 elif(member
.issparse()):
2810 ffullmode
= member
.mode
;
2813 ffullmode
= member
.mode
;
2816 fcurfid
= format(int(curfid
), 'x').lower();
2817 fcurinode
= format(int(curfid
), 'x').lower();
2818 curfid
= curfid
+ 1;
2820 flinkname
= member
.linkname
;
2821 fdev_minor
= format(int(member
.devminor
), 'x').lower();
2822 fdev_major
= format(int(member
.devmajor
), 'x').lower();
2823 frdev_minor
= format(int(member
.devminor
), 'x').lower();
2824 frdev_major
= format(int(member
.devmajor
), 'x').lower();
2825 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2826 fsize
= format(int("0"), 'x').lower();
2827 elif(ftype
==0 or ftype
==7):
2828 fsize
= format(int(member
.size
), 'x').lower();
2830 fsize
= format(int(member
.size
), 'x').lower();
2831 fatime
= format(int(member
.mtime
), 'x').lower();
2832 fmtime
= format(int(member
.mtime
), 'x').lower();
2833 fctime
= format(int(member
.mtime
), 'x').lower();
2834 fbtime
= format(int(member
.mtime
), 'x').lower();
2835 fmode
= format(int(ffullmode
), 'x').lower();
2836 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
2837 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
2838 fuid
= format(int(member
.uid
), 'x').lower();
2839 fgid
= format(int(member
.gid
), 'x').lower();
2840 funame
= member
.uname
;
2841 fgname
= member
.gname
;
2842 flinkcount
= format(int(flinkcount
), 'x').lower();
2843 fwinattributes
= format(int(0), 'x').lower();
2844 fcontents
= "".encode('UTF-8');
2846 if(ftype
==0 or ftype
==7):
2847 with tarfp
.extractfile(member
) as fpc
:
2849 chunk
= fpc
.read(chunk_size
);
2853 ftypehex
= format(ftype
, 'x').lower();
2854 extrafields
= format(len(extradata
), 'x').lower();
2855 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2856 if(len(extradata
)>0):
2857 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2858 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2859 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
];
2860 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
2861 catoutlenhex
= format(catoutlen
, 'x').lower();
2862 catoutlist
.insert(0, catoutlenhex
);
2863 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
2864 if(len(extradata
)>0):
2865 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2866 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2867 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2868 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2869 if(checksumtype
=="none" or checksumtype
==""):
2870 catfileheadercshex
= format(0, 'x').lower();
2871 catfilecontentcshex
= format(0, 'x').lower();
2872 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2873 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
2874 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
2875 elif(checksumtype
=="crc16_ccitt"):
2876 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
2877 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
2878 elif(checksumtype
=="adler32"):
2879 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2880 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
2881 elif(checksumtype
=="crc32"):
2882 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2883 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
2884 elif(checksumtype
=="crc64_ecma"):
2885 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2886 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
2887 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2888 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2889 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
2890 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2891 checksumoutstr
= hashlib
.new(checksumtype
);
2892 checksumoutstr
.update("".encode('UTF-8'));
2893 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2894 checksumoutstr
= hashlib
.new(checksumtype
);
2895 checksumoutstr
.update(fcontents
);
2896 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
2898 catfileheadercshex
= format(0, 'x').lower();
2899 catfilecontentcshex
= format(0, 'x').lower();
2900 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2901 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2902 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
2903 if(checksumtype
=="none" or checksumtype
==""):
2904 catfileheadercshex
= format(0, 'x').lower();
2905 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2906 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2907 elif(checksumtype
=="crc16_ccitt"):
2908 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2909 elif(checksumtype
=="adler32"):
2910 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2911 elif(checksumtype
=="crc32"):
2912 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2913 elif(checksumtype
=="crc64_ecma"):
2914 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2915 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2916 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2917 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2918 checksumoutstr
= hashlib
.new(checksumtype
);
2919 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
2920 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2922 catfileheadercshex
= format(0, 'x').lower();
2923 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2924 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2925 nullstrecd
= formatspecs
[5].encode('UTF-8');
2926 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
2927 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2928 catfp
.write(catfileout
);
2931 os
.fsync(catfp
.fileno());
2932 except io
.UnsupportedOperation
:
2934 except AttributeError:
2937 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
2938 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2939 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2942 os
.fsync(catfp
.fileno());
2943 except io
.UnsupportedOperation
:
2945 except AttributeError:
2949 if(hasattr(sys
.stdout
, "buffer")):
2950 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2952 shutil
.copyfileobj(catfp
, sys
.stdout
);
2953 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2954 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2956 upload_file_to_internet_file(catfp
, outfile
);
2964 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
2966 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2967 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2968 outfile
= RemoveWindowsPath(outfile
);
2969 checksumtype
= checksumtype
.lower();
2970 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2971 checksumtype
="crc32";
2972 if(checksumtype
=="none"):
2974 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2976 if(compression
not in compressionlist
and compression
is None):
2977 compression
= "auto";
2979 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2980 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2981 if(os
.path
.exists(outfile
)):
2986 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2988 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2991 fbasename
= os
.path
.splitext(outfile
)[0];
2992 fextname
= os
.path
.splitext(outfile
)[1];
2993 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2994 catver
= formatspecs
[6];
2995 fileheaderver
= str(int(catver
.replace(".", "")));
2996 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2997 catfp
.write(fileheader
.encode('UTF-8'));
3003 inodetocatinode
= {};
3006 if(hasattr(sys
.stdin
, "buffer")):
3007 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3009 shutil
.copyfileobj(sys
.stdin
, infile
);
3014 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3015 infile
= download_file_from_internet_file(infile
);
3020 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3024 if(not zipfile
.is_zipfile(infile
)):
3027 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
3028 except FileNotFoundError
:
3030 ziptest
= zipfp
.testzip();
3032 VerbosePrintOut("Bad file found!");
3033 numfiles
= int(len(zipfp
.infolist()));
3034 fnumfiles
= format(int(len(zipfp
.infolist())), 'x').lower();
3035 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
3036 if(checksumtype
=="none" or checksumtype
==""):
3037 catfileheadercshex
= format(0, 'x').lower();
3038 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3039 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3040 elif(checksumtype
=="crc16_ccitt"):
3041 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3042 elif(checksumtype
=="adler32"):
3043 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3044 elif(checksumtype
=="crc32"):
3045 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3046 elif(checksumtype
=="crc64_ecma"):
3047 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3048 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3049 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3050 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3051 checksumoutstr
= hashlib
.new(checksumtype
);
3052 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
3053 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3055 catfileheadercshex
= format(0, 'x').lower();
3056 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3057 catfp
.write(fnumfilesa
.encode('UTF-8'));
3060 os
.fsync(catfp
.fileno());
3061 except io
.UnsupportedOperation
:
3063 except AttributeError:
3065 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
3066 catfhstart
= catfp
.tell();
3067 if(re
.findall("^[.|/]", member
.filename
)):
3068 fname
= member
.filename
;
3070 fname
= "./"+member
.filename
;
3071 zipinfo
= zipfp
.getinfo(member
.filename
);
3073 VerbosePrintOut(fname
);
3074 if(not member
.is_dir()):
3075 fpremode
= int(stat
.S_IFREG
+ 438);
3076 elif(member
.is_dir()):
3077 fpremode
= int(stat
.S_IFDIR
+ 511);
3080 if(not member
.is_dir()):
3082 elif(member
.is_dir()):
3085 fcurfid
= format(int(curfid
), 'x').lower();
3086 fcurinode
= format(int(curfid
), 'x').lower();
3087 curfid
= curfid
+ 1;
3088 fdev_minor
= format(int(0), 'x').lower();
3089 fdev_major
= format(int(0), 'x').lower();
3090 frdev_minor
= format(int(0), 'x').lower();
3091 frdev_major
= format(int(0), 'x').lower();
3093 fsize
= format(int("0"), 'x').lower();
3095 fsize
= format(int(member
.file_size
), 'x').lower();
3097 fsize
= format(int(member
.file_size
), 'x').lower();
3098 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3099 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3100 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3101 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
3102 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
3103 fwinattributes
= format(int(zipinfo
.external_attr
), 'x').lower();
3104 if(not member
.is_dir()):
3105 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3106 fchmode
= stat
.S_IMODE(fmode
);
3107 ftypemod
= stat
.S_IFMT(fmode
);
3108 elif(member
.is_dir()):
3109 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3110 fchmode
= stat
.S_IMODE(fmode
);
3111 ftypemod
= stat
.S_IFMT(fmode
);
3112 elif(zipinfo
.create_system
==3):
3113 fwinattributes
= format(int(0), 'x').lower();
3114 fmode
= format(int(zipinfo
.external_attr
), 'x').lower();
3115 fchmode
= stat
.S_IMODE(fmode
);
3116 ftypemod
= stat
.S_IFMT(fmode
);
3118 fwinattributes
= format(int(0), 'x').lower();
3119 if(not member
.is_dir()):
3120 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3121 fchmode
= stat
.S_IMODE(fmode
);
3122 ftypemod
= stat
.S_IFMT(fmode
);
3123 elif(member
.is_dir()):
3124 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3125 fchmode
= stat
.S_IMODE(fmode
);
3126 ftypemod
= stat
.S_IFMT(fmode
);
3128 fuid
= format(int(os
.getuid()), 'x').lower();
3129 except AttributeError:
3130 fuid
= format(int(0), 'x').lower();
3132 fuid
= format(int(0), 'x').lower();
3134 fgid
= format(int(os
.getgid()), 'x').lower();
3135 except AttributeError:
3136 fgid
= format(int(0), 'x').lower();
3138 fgid
= format(int(0), 'x').lower();
3142 userinfo
= pwd
.getpwuid(os
.getuid());
3143 funame
= userinfo
.pw_name
;
3146 except AttributeError:
3154 groupinfo
= grp
.getgrgid(os
.getgid());
3155 fgname
= groupinfo
.gr_name
;
3158 except AttributeError:
3162 fcontents
= "".encode('UTF-8');
3164 fcontents
= zipfp
.read(member
.filename
);
3165 ftypehex
= format(ftype
, 'x').lower();
3166 extrafields
= format(len(extradata
), 'x').lower();
3167 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3168 if(len(extradata
)>0):
3169 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3170 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3171 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
];
3172 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3173 catoutlenhex
= format(catoutlen
, 'x').lower();
3174 catoutlist
.insert(0, catoutlenhex
);
3175 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3176 if(len(extradata
)>0):
3177 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3178 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3179 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3180 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3181 if(checksumtype
=="none" or checksumtype
==""):
3182 catfileheadercshex
= format(0, 'x').lower();
3183 catfilecontentcshex
= format(0, 'x').lower();
3184 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3185 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3186 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3187 elif(checksumtype
=="crc16_ccitt"):
3188 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3189 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3190 elif(checksumtype
=="adler32"):
3191 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3192 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3193 elif(checksumtype
=="crc32"):
3194 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3195 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3196 elif(checksumtype
=="crc64_ecma"):
3197 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3198 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3199 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3200 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3201 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3202 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3203 checksumoutstr
= hashlib
.new(checksumtype
);
3204 checksumoutstr
.update("".encode('UTF-8'));
3205 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3206 checksumoutstr
= hashlib
.new(checksumtype
);
3207 checksumoutstr
.update(fcontents
);
3208 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3210 catfileheadercshex
= format(0, 'x').lower();
3211 catfilecontentcshex
= format(0, 'x').lower();
3212 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3213 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3214 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3215 if(checksumtype
=="none" or checksumtype
==""):
3216 catfileheadercshex
= format(0, 'x').lower();
3217 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3218 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3219 elif(checksumtype
=="crc16_ccitt"):
3220 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3221 elif(checksumtype
=="adler32"):
3222 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3223 elif(checksumtype
=="crc32"):
3224 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3225 elif(checksumtype
=="crc64_ecma"):
3226 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3227 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3228 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3229 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3230 checksumoutstr
= hashlib
.new(checksumtype
);
3231 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3232 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3234 catfileheadercshex
= format(0, 'x').lower();
3235 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3236 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3237 nullstrecd
= formatspecs
[5].encode('UTF-8');
3238 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3239 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
3240 catfp
.write(catfileout
);
3243 os
.fsync(catfp
.fileno());
3244 except io
.UnsupportedOperation
:
3246 except AttributeError:
3249 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3250 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3251 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3254 os
.fsync(catfp
.fileno());
3255 except io
.UnsupportedOperation
:
3257 except AttributeError:
3261 if(hasattr(sys
.stdout
, "buffer")):
3262 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3264 shutil
.copyfileobj(catfp
, sys
.stdout
);
3265 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3266 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3268 upload_file_to_internet_file(catfp
, outfile
);
3276 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
3278 if(not rarfile_support
):
3279 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3282 if(rarfile_support
):
3283 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3284 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3285 outfile
= RemoveWindowsPath(outfile
);
3286 checksumtype
= checksumtype
.lower();
3287 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3288 checksumtype
="crc32";
3289 if(checksumtype
=="none"):
3291 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
3293 if(compression
not in compressionlist
and compression
is None):
3294 compression
= "auto";
3296 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3297 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3298 if(os
.path
.exists(outfile
)):
3303 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3305 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3308 fbasename
= os
.path
.splitext(outfile
)[0];
3309 fextname
= os
.path
.splitext(outfile
)[1];
3310 catfp
= CompressOpenFile(outfile
, compressionlevel
);
3311 catver
= formatspecs
[6];
3312 fileheaderver
= str(int(catver
.replace(".", "")));
3313 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3314 catfp
.write(fileheader
.encode('UTF-8'));
3320 inodetocatinode
= {};
3321 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3323 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
3325 rarfp
= rarfile
.RarFile(infile
, "r");
3326 rartest
= rarfp
.testrar();
3328 VerbosePrintOut("Bad file found!");
3329 numfiles
= int(len(rarfp
.infolist()));
3330 fnumfiles
= format(int(len(rarfp
.infolist())), 'x').lower();
3331 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
3332 if(checksumtype
=="none" or checksumtype
==""):
3333 catfileheadercshex
= format(0, 'x').lower();
3334 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3335 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3336 elif(checksumtype
=="crc16_ccitt"):
3337 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3338 elif(checksumtype
=="adler32"):
3339 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3340 elif(checksumtype
=="crc32"):
3341 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3342 elif(checksumtype
=="crc64_ecma"):
3343 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3344 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3345 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3346 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3347 checksumoutstr
= hashlib
.new(checksumtype
);
3348 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
3349 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3351 catfileheadercshex
= format(0, 'x').lower();
3352 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3353 catfp
.write(fnumfilesa
.encode('UTF-8'));
3356 os
.fsync(catfp
.fileno());
3357 except io
.UnsupportedOperation
:
3359 except AttributeError:
3361 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
3364 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
3367 member
.external_attr
3369 except AttributeError:
3371 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
3374 member
.external_attr
3376 except AttributeError:
3381 catfhstart
= catfp
.tell();
3382 if(re
.findall("^[.|/]", member
.filename
)):
3383 fname
= member
.filename
;
3385 fname
= "./"+member
.filename
;
3386 rarinfo
= rarfp
.getinfo(member
.filename
);
3388 VerbosePrintOut(fname
);
3389 if(is_unix
and member
.external_attr
!=0):
3390 fpremode
= int(member
.external_attr
);
3391 elif(member
.is_file()):
3392 fpremode
= int(stat
.S_IFREG
+ 438);
3393 elif(member
.is_symlink()):
3394 fpremode
= int(stat
.S_IFLNK
+ 438);
3395 elif(member
.is_dir()):
3396 fpremode
= int(stat
.S_IFDIR
+ 511);
3397 if(is_windows
and member
.external_attr
!=0):
3398 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
3400 fwinattributes
= format(int(0), 'x').lower();
3403 if(member
.is_file()):
3405 elif(member
.is_symlink()):
3407 elif(member
.is_dir()):
3411 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
3412 fcurfid
= format(int(curfid
), 'x').lower();
3413 fcurinode
= format(int(curfid
), 'x').lower();
3414 curfid
= curfid
+ 1;
3415 fdev_minor
= format(int(0), 'x').lower();
3416 fdev_major
= format(int(0), 'x').lower();
3417 frdev_minor
= format(int(0), 'x').lower();
3418 frdev_major
= format(int(0), 'x').lower();
3420 fsize
= format(int("0"), 'x').lower();
3422 fsize
= format(int(member
.file_size
), 'x').lower();
3424 fsize
= format(int(member
.file_size
), 'x').lower();
3427 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
3429 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3430 except AttributeError:
3431 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3432 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3435 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
3437 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3438 except AttributeError:
3439 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3440 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3441 if(is_unix
and member
.external_attr
!=0):
3442 fmode
= format(int(member
.external_attr
), 'x').lower();
3443 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
3444 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
3445 elif(member
.is_file()):
3446 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3447 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3448 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3449 elif(member
.is_symlink()):
3450 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
3451 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3452 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3453 elif(member
.is_dir()):
3454 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3455 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3456 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3458 fuid
= format(int(os
.getuid()), 'x').lower();
3459 except AttributeError:
3460 fuid
= format(int(0), 'x').lower();
3462 fuid
= format(int(0), 'x').lower();
3464 fgid
= format(int(os
.getgid()), 'x').lower();
3465 except AttributeError:
3466 fgid
= format(int(0), 'x').lower();
3468 fgid
= format(int(0), 'x').lower();
3472 userinfo
= pwd
.getpwuid(os
.getuid());
3473 funame
= userinfo
.pw_name
;
3476 except AttributeError:
3484 groupinfo
= grp
.getgrgid(os
.getgid());
3485 fgname
= groupinfo
.gr_name
;
3488 except AttributeError:
3492 fcontents
= "".encode('UTF-8');
3494 fcontents
= rarfp
.read(member
.filename
);
3495 ftypehex
= format(ftype
, 'x').lower();
3496 extrafields
= format(len(extradata
), 'x').lower();
3497 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3498 if(len(extradata
)>0):
3499 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3500 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3501 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
];
3502 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3503 catoutlenhex
= format(catoutlen
, 'x').lower();
3504 catoutlist
.insert(0, catoutlenhex
);
3505 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3506 if(len(extradata
)>0):
3507 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3508 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3509 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3510 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3511 if(checksumtype
=="none" or checksumtype
==""):
3512 catfileheadercshex
= format(0, 'x').lower();
3513 catfilecontentcshex
= format(0, 'x').lower();
3514 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3515 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3516 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3517 elif(checksumtype
=="crc16_ccitt"):
3518 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3519 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3520 elif(checksumtype
=="adler32"):
3521 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3522 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3523 elif(checksumtype
=="crc32"):
3524 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3525 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3526 elif(checksumtype
=="crc64_ecma"):
3527 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3528 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3529 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3530 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3531 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3532 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3533 checksumoutstr
= hashlib
.new(checksumtype
);
3534 checksumoutstr
.update("".encode('UTF-8'));
3535 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3536 checksumoutstr
= hashlib
.new(checksumtype
);
3537 checksumoutstr
.update(fcontents
);
3538 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3540 catfileheadercshex
= format(0, 'x').lower();
3541 catfilecontentcshex
= format(0, 'x').lower();
3542 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3543 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3544 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
3545 if(checksumtype
=="none" or checksumtype
==""):
3546 catfileheadercshex
= format(0, 'x').lower()
3547 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3548 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
3549 elif(checksumtype
=="crc16_ccitt"):
3550 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
3551 elif(checksumtype
=="adler32"):
3552 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
3553 elif(checksumtype
=="crc32"):
3554 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
3555 elif(checksumtype
=="crc64_ecma"):
3556 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
3557 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3558 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
3559 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3560 checksumoutstr
= hashlib
.new(checksumtype
)
3561 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'))
3562 catfileheadercshex
= checksumoutstr
.hexdigest().lower()
3564 catfileheadercshex
= format(0, 'x').lower()
3565 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
3566 catfileoutstrecd
= catfileoutstr
.encode('UTF-8')
3567 nullstrecd
= formatspecs
[5].encode('UTF-8')
3568 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
3569 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
)
3570 catfp
.write(catfileout
)
3573 os
.fsync(catfp
.fileno())
3574 except io
.UnsupportedOperation
:
3576 except AttributeError:
3579 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3580 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3581 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
3584 os
.fsync(catfp
.fileno())
3585 except io
.UnsupportedOperation
:
3587 except AttributeError:
3591 if(hasattr(sys
.stdout
, "buffer")):
3592 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3594 shutil
.copyfileobj(catfp
, sys
.stdout
);
3595 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3596 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3598 upload_file_to_internet_file(catfp
, outfile
);
3606 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
3608 if(not py7zr_support
):
3609 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3613 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3614 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3615 outfile
= RemoveWindowsPath(outfile
);
3616 checksumtype
= checksumtype
.lower();
3617 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3618 checksumtype
="crc32";
3619 if(checksumtype
=="none"):
3621 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
3623 if(compression
not in compressionlist
and compression
is None):
3624 compression
= "auto";
3626 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3627 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3628 if(os
.path
.exists(outfile
)):
3633 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3635 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3638 fbasename
= os
.path
.splitext(outfile
)[0];
3639 fextname
= os
.path
.splitext(outfile
)[1];
3640 catfp
= CompressOpenFile(outfile
, compressionlevel
);
3641 catver
= formatspecs
[6];
3642 fileheaderver
= str(int(catver
.replace(".", "")));
3643 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3644 catfp
.write(fileheader
.encode('UTF-8'));
3650 inodetocatinode
= {};
3651 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3653 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
3654 file_content
= szpfp
.readall();
3655 #sztest = szpfp.testzip();
3656 sztestalt
= szpfp
.test();
3658 VerbosePrintOut("Bad file found!");
3659 numfiles
= int(len(szpfp
.list()));
3660 fnumfiles
= format(int(len(szpfp
.list())), 'x').lower();
3661 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
3662 if(checksumtype
=="none" or checksumtype
==""):
3663 catfileheadercshex
= format(0, 'x').lower();
3664 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3665 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3666 elif(checksumtype
=="crc16_ccitt"):
3667 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
3668 elif(checksumtype
=="adler32"):
3669 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3670 elif(checksumtype
=="crc32"):
3671 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
3672 elif(checksumtype
=="crc64_ecma"):
3673 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3674 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3675 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3676 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3677 checksumoutstr
= hashlib
.new(checksumtype
);
3678 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
3679 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3681 catfileheadercshex
= format(0, 'x').lower();
3682 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3683 catfp
.write(fnumfilesa
.encode('UTF-8'));
3686 os
.fsync(catfp
.fileno());
3687 except io
.UnsupportedOperation
:
3689 except AttributeError:
3691 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
3692 catfhstart
= catfp
.tell();
3693 if(re
.findall("^[.|/]", member
.filename
)):
3694 fname
= member
.filename
;
3696 fname
= "./"+member
.filename
;
3698 VerbosePrintOut(fname
);
3699 if(not member
.is_directory
):
3700 fpremode
= int(stat
.S_IFREG
+ 438);
3701 elif(member
.is_directory
):
3702 fpremode
= int(stat
.S_IFDIR
+ 511);
3703 fwinattributes
= format(int(0), 'x').lower();
3706 if(member
.is_directory
):
3711 fcurfid
= format(int(curfid
), 'x').lower();
3712 fcurinode
= format(int(curfid
), 'x').lower();
3713 curfid
= curfid
+ 1;
3714 fdev_minor
= format(int(0), 'x').lower();
3715 fdev_major
= format(int(0), 'x').lower();
3716 frdev_minor
= format(int(0), 'x').lower();
3717 frdev_major
= format(int(0), 'x').lower();
3719 fsize
= format(int("0"), 'x').lower();
3720 fatime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3721 fmtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3722 fctime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3723 fbtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3724 if(member
.is_directory
):
3725 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3726 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3727 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3729 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3730 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3731 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3733 fuid
= format(int(os
.getuid()), 'x').lower();
3734 except AttributeError:
3735 fuid
= format(int(0), 'x').lower();
3737 fuid
= format(int(0), 'x').lower();
3739 fgid
= format(int(os
.getgid()), 'x').lower();
3740 except AttributeError:
3741 fgid
= format(int(0), 'x').lower();
3743 fgid
= format(int(0), 'x').lower();
3747 userinfo
= pwd
.getpwuid(os
.getuid());
3748 funame
= userinfo
.pw_name
;
3751 except AttributeError:
3759 groupinfo
= grp
.getgrgid(os
.getgid());
3760 fgname
= groupinfo
.gr_name
;
3763 except AttributeError:
3767 fcontents
= "".encode('UTF-8');
3769 fcontents
= file_content
[member
.filename
].read();
3770 fsize
= format(len(fcontents
), 'x').lower();
3771 file_content
[member
.filename
].close();
3772 ftypehex
= format(ftype
, 'x').lower();
3773 extrafields
= format(len(extradata
), 'x').lower();
3774 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3775 if(len(extradata
)>0):
3776 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3777 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3778 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
];
3779 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3780 catoutlenhex
= format(catoutlen
, 'x').lower();
3781 catoutlist
.insert(0, catoutlenhex
);
3782 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3783 if(len(extradata
)>0):
3784 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3785 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3786 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3787 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3788 if(checksumtype
=="none" or checksumtype
==""):
3789 catfileheadercshex
= format(0, 'x').lower();
3790 catfilecontentcshex
= format(0, 'x').lower();
3791 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3792 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3793 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3794 elif(checksumtype
=="crc16_ccitt"):
3795 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3796 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3797 elif(checksumtype
=="adler32"):
3798 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3799 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3800 elif(checksumtype
=="crc32"):
3801 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3802 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3803 elif(checksumtype
=="crc64_ecma"):
3804 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3805 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3806 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3807 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3808 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3809 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3810 checksumoutstr
= hashlib
.new(checksumtype
);
3811 checksumoutstr
.update("".encode('UTF-8'));
3812 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3813 checksumoutstr
= hashlib
.new(checksumtype
);
3814 checksumoutstr
.update(fcontents
);
3815 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3817 catfileheadercshex
= format(0, 'x').lower();
3818 catfilecontentcshex
= format(0, 'x').lower();
3819 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3820 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3821 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
3822 if(checksumtype
=="none" or checksumtype
==""):
3823 catfileheadercshex
= format(0, 'x').lower()
3824 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3825 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
3826 elif(checksumtype
=="crc16_ccitt"):
3827 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
3828 elif(checksumtype
=="adler32"):
3829 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
3830 elif(checksumtype
=="crc32"):
3831 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
3832 elif(checksumtype
=="crc64_ecma"):
3833 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
3834 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3835 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
3836 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3837 checksumoutstr
= hashlib
.new(checksumtype
)
3838 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'))
3839 catfileheadercshex
= checksumoutstr
.hexdigest().lower()
3841 catfileheadercshex
= format(0, 'x').lower()
3842 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
3843 catfileoutstrecd
= catfileoutstr
.encode('UTF-8')
3844 nullstrecd
= formatspecs
[5].encode('UTF-8')
3845 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
3846 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
)
3847 catfp
.write(catfileout
)
3850 os
.fsync(catfp
.fileno())
3851 except io
.UnsupportedOperation
:
3853 except AttributeError:
3856 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3857 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3858 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
3861 os
.fsync(catfp
.fileno())
3862 except io
.UnsupportedOperation
:
3864 except AttributeError:
3868 if(hasattr(sys
.stdout
, "buffer")):
3869 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3871 shutil
.copyfileobj(catfp
, sys
.stdout
);
3872 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3873 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3875 upload_file_to_internet_file(catfp
, outfile
);
3883 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFile", PackArchiveFileFromSevenZipFile
);
3885 def PackArchiveFileFromInFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3886 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3888 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3889 if(checkcompressfile
=="tarfile"):
3890 return PackArchiveFileFromTarFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3891 elif(checkcompressfile
=="zipfile"):
3892 return PackArchiveFileFromZipFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3893 elif(checkcompressfile
=="catfile"):
3894 return RePackArchiveFile(infile
, outfile
, compression
, compressionlevel
, False, 0, 0, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
3895 elif(rarfile_support
and checkcompressfile
=="rarfile"):
3896 return PackArchiveFileFromRarFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3897 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
3898 return PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3903 create_alias_function("Pack", __file_format_name__
, "FromInFile", PackArchiveFileFromInFile
);
3905 def ArchiveFileSeekToFileNum(infile
, seekto
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3906 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3909 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3910 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
3911 if(checkcompressfile
=="tarfile"):
3912 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3913 if(checkcompressfile
=="zipfile"):
3914 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3915 if(rarfile_support
and checkcompressfile
=="rarfile"):
3916 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3917 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3918 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3919 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3926 if(hasattr(sys
.stdin
, "buffer")):
3927 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
3929 shutil
.copyfileobj(sys
.stdin
, catfp
);
3931 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3935 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3936 catfp
= download_file_from_internet_file(infile
);
3938 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3943 infile
= RemoveWindowsPath(infile
);
3944 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3945 if(checkcompressfile
=="tarfile"):
3946 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3947 if(checkcompressfile
=="zipfile"):
3948 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3949 if(rarfile_support
and checkcompressfile
=="rarfile"):
3950 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3951 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3952 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3953 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3955 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
3956 if(not compresscheck
):
3957 fextname
= os
.path
.splitext(infile
)[1];
3958 if(fextname
==".gz"):
3959 compresscheck
= "gzip";
3960 elif(fextname
==".bz2"):
3961 compresscheck
= "bzip2";
3962 elif(fextname
==".zst"):
3963 compresscheck
= "zstd";
3964 elif(fextname
==".lz4" or fextname
==".clz4"):
3965 compresscheck
= "lz4";
3966 elif(fextname
==".lzo" or fextname
==".lzop"):
3967 compresscheck
= "lzo";
3968 elif(fextname
==".lzma" or fextname
==".xz"):
3969 compresscheck
= "lzma";
3972 if(not compresscheck
):
3974 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3979 SeekToEndOfFile(catfp);
3981 SeekToEndOfFile(catfp);
3982 CatSize = catfp.tell();
3983 CatSizeEnd = CatSize;
3991 curloc
= catfp
.tell();
3994 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
3996 catfp
.seek(curloc
, 0);
3997 catstring
= catheader
[0];
3998 catversion
= re
.findall(r
"([\d]+)$", catstring
);
3999 fprenumfiles
= catheader
[1];
4000 fnumfiles
= int(fprenumfiles
, 16);
4001 fprechecksumtype
= catheader
[2];
4002 fprechecksum
= catheader
[3];
4003 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4004 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4005 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4006 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
4007 catfileheadercshex
= format(0, 'x').lower();
4008 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
4009 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4010 elif(fprechecksumtype
=="crc16_ccitt"):
4011 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4012 elif(fprechecksumtype
=="adler32"):
4013 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4014 elif(fprechecksumtype
=="crc32"):
4015 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4016 elif(fprechecksumtype
=="crc64_ecma"):
4017 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4018 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
4019 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4020 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
4021 checksumoutstr
= hashlib
.new(fprechecksumtype
);
4022 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4023 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4025 catfileheadercshex
= format(0, 'x').lower();
4026 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4027 fheadtell
= len(fileheader
);
4028 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4029 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4031 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4032 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4033 if(seekto
>=fnumfiles
):
4034 seekto
= fnumfiles
- 1;
4040 prefhstart
= catfp
.tell();
4042 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4044 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4045 if(len(preheaderdata
)==0):
4047 prefheadsize
= int(preheaderdata
[0], 16);
4048 prefnumfields
= int(preheaderdata
[1], 16);
4049 preftype
= int(preheaderdata
[2], 16);
4050 if(re
.findall("^[.|/]", preheaderdata
[3])):
4051 prefname
= preheaderdata
[3];
4053 prefname
= "./"+preheaderdata
[3];
4054 prefbasedir
= os
.path
.dirname(prefname
);
4055 preflinkname
= preheaderdata
[4];
4056 prefsize
= int(preheaderdata
[5], 16);
4057 prefatime
= int(preheaderdata
[6], 16);
4058 prefmtime
= int(preheaderdata
[7], 16);
4059 prefctime
= int(preheaderdata
[8], 16);
4060 prefbtime
= int(preheaderdata
[9], 16);
4061 prefmode
= int(preheaderdata
[10], 16);
4062 prefchmode
= stat
.S_IMODE(prefmode
);
4063 preftypemod
= stat
.S_IFMT(prefmode
);
4064 prefwinattributes
= int(preheaderdata
[11], 16);
4065 prefuid
= int(preheaderdata
[12], 16);
4066 prefuname
= preheaderdata
[13];
4067 prefgid
= int(preheaderdata
[14], 16);
4068 prefgname
= preheaderdata
[15];
4069 fid
= int(preheaderdata
[16], 16);
4070 finode
= int(preheaderdata
[17], 16);
4071 flinkcount
= int(preheaderdata
[18], 16);
4072 prefdev_minor
= int(preheaderdata
[19], 16);
4073 prefdev_major
= int(preheaderdata
[20], 16);
4074 prefrdev_minor
= int(preheaderdata
[22], 16);
4075 prefrdev_major
= int(preheaderdata
[23], 16);
4076 prefextrasize
= int(preheaderdata
[24], 16);
4077 prefextrafields
= int(preheaderdata
[25], 16);
4078 extrafieldslist
= [];
4080 extraend
= extrastart
+ prefextrafields
;
4081 extrafieldslist
= [];
4082 if(extrastart
<extraend
):
4083 extrafieldslist
.append(preheaderdata
[extrastart
]);
4084 extrastart
= extrastart
+ 1;
4085 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4086 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4087 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4089 hcmax
= len(preheaderdata
) - 2;
4092 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
4094 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4095 if(prefcs
!=prenewfcs
and not skipchecksum
):
4096 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4098 valid_archive
= False;
4099 invalid_archive
= True;
4100 prefhend
= catfp
.tell() - 1;
4101 prefcontentstart
= catfp
.tell();
4103 pyhascontents
= False;
4105 prefcontents
= catfp
.read(prefsize
);
4106 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4107 pyhascontents
= True;
4108 if(prefccs
!=prenewfccs
and not skipchecksum
):
4109 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4113 catfp
.seek(seekstart
, 0);
4115 catfheadsize
= int(preheaderdata
[0], 16);
4116 catfnumfields
= int(preheaderdata
[1], 16);
4117 catftype
= int(preheaderdata
[2], 16);
4118 if(re
.findall("^[.|/]", preheaderdata
[3])):
4119 catfname
= preheaderdata
[3];
4121 catfname
= "./"+preheaderdata
[3];
4122 catflinkname
= preheaderdata
[4];
4123 catfsize
= int(preheaderdata
[5], 16);
4124 catfbasedir
= os
.path
.dirname(catfname
);
4125 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4127 catlist
.update({'catfp': catfp
});
4132 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
4134 def ArchiveFileSeekToFileName(infile
, seekfile
=None, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4135 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4138 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4139 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4140 if(checkcompressfile
=="tarfile"):
4141 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4142 if(checkcompressfile
=="zipfile"):
4143 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4144 if(rarfile_support
and checkcompressfile
=="rarfile"):
4145 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4146 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4147 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4148 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4155 if(hasattr(sys
.stdin
, "buffer")):
4156 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4158 shutil
.copyfileobj(sys
.stdin
, catfp
);
4160 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4164 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4165 catfp
= download_file_from_internet_file(infile
);
4166 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4172 infile
= RemoveWindowsPath(infile
);
4173 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4174 if(checkcompressfile
=="tarfile"):
4175 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4176 if(checkcompressfile
=="zipfile"):
4177 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4178 if(rarfile_support
and checkcompressfile
=="rarfile"):
4179 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4180 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4181 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
4182 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4184 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4185 if(not compresscheck
):
4186 fextname
= os
.path
.splitext(infile
)[1];
4187 if(fextname
==".gz"):
4188 compresscheck
= "gzip";
4189 elif(fextname
==".bz2"):
4190 compresscheck
= "bzip2";
4191 elif(fextname
==".zst"):
4192 compresscheck
= "zstd";
4193 elif(fextname
==".lz4" or fextname
==".clz4"):
4194 compresscheck
= "lz4";
4195 elif(fextname
==".lzo" or fextname
==".lzop"):
4196 compresscheck
= "lzo";
4197 elif(fextname
==".lzma" or fextname
==".xz"):
4198 compresscheck
= "lzma";
4201 if(not compresscheck
):
4203 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4208 SeekToEndOfFile(catfp);
4210 SeekToEndOfFile(catfp);
4211 CatSize = catfp.tell();
4212 CatSizeEnd = CatSize;
4220 curloc
= catfp
.tell();
4223 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4225 catfp
.seek(curloc
, 0);
4226 catstring
= catheader
[0];
4227 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4228 fprenumfiles
= catheader
[1];
4229 fnumfiles
= int(fprenumfiles
, 16);
4230 fprechecksumtype
= catheader
[2];
4231 fprechecksum
= catheader
[3];
4232 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4233 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4234 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4235 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
4236 catfileheadercshex
= format(0, 'x').lower();
4237 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
4238 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4239 elif(fprechecksumtype
=="crc16_ccitt"):
4240 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4241 elif(fprechecksumtype
=="adler32"):
4242 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4243 elif(fprechecksumtype
=="crc32"):
4244 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4245 elif(fprechecksumtype
=="crc64_ecma"):
4246 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4247 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
4248 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4249 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
4250 checksumoutstr
= hashlib
.new(fprechecksumtype
);
4251 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4252 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4254 catfileheadercshex
= format(0, 'x').lower();
4255 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4256 fheadtell
= len(fileheader
);
4257 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4258 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4260 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4261 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4262 seekto
= fnumfiles
- 1
4267 prefhstart
= catfp
.tell();
4269 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4271 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4272 if(len(preheaderdata
)==0):
4274 prefheadsize
= int(preheaderdata
[0], 16);
4275 prefnumfields
= int(preheaderdata
[1], 16);
4276 preftype
= int(preheaderdata
[2], 16);
4277 if(re
.findall("^[.|/]", preheaderdata
[3])):
4278 prefname
= preheaderdata
[3];
4280 prefname
= "./"+preheaderdata
[3];
4281 prefbasedir
= os
.path
.dirname(prefname
);
4282 preflinkname
= preheaderdata
[4];
4283 prefsize
= int(preheaderdata
[5], 16);
4284 prefatime
= int(preheaderdata
[6], 16);
4285 prefmtime
= int(preheaderdata
[7], 16);
4286 prefctime
= int(preheaderdata
[8], 16);
4287 prefbtime
= int(preheaderdata
[9], 16);
4288 prefmode
= int(preheaderdata
[10], 16);
4289 prefchmode
= stat
.S_IMODE(prefmode
);
4290 preftypemod
= stat
.S_IFMT(prefmode
);
4291 prefwinattributes
= int(preheaderdata
[11], 16);
4292 prefuid
= int(preheaderdata
[12], 16);
4293 prefuname
= preheaderdata
[13];
4294 prefgid
= int(preheaderdata
[14], 16);
4295 prefgname
= preheaderdata
[15];
4296 fid
= int(preheaderdata
[16], 16);
4297 finode
= int(preheaderdata
[17], 16);
4298 flinkcount
= int(preheaderdata
[18], 16);
4299 prefdev_minor
= int(preheaderdata
[19], 16);
4300 prefdev_major
= int(preheaderdata
[20], 16);
4301 prefrdev_minor
= int(preheaderdata
[22], 16);
4302 prefrdev_major
= int(preheaderdata
[23], 16);
4303 prefextrasize
= int(preheaderdata
[24], 16);
4304 prefextrafields
= int(preheaderdata
[25], 16);
4305 extrafieldslist
= [];
4307 extraend
= extrastart
+ prefextrafields
;
4308 extrafieldslist
= [];
4309 if(extrastart
<extraend
):
4310 extrafieldslist
.append(preheaderdata
[extrastart
]);
4311 extrastart
= extrastart
+ 1;
4312 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4313 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4314 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4316 hcmax
= len(preheaderdata
) - 2;
4319 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
4321 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4322 if(prefcs
!=prenewfcs
and not skipchecksum
):
4323 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4325 valid_archive
= False;
4326 invalid_archive
= True;
4327 prefhend
= catfp
.tell() - 1;
4328 prefcontentstart
= catfp
.tell();
4330 pyhascontents
= False;
4332 prefcontents
= catfp
.read(prefsize
);
4333 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4334 pyhascontents
= True;
4335 if(prefccs
!=prenewfccs
and not skipchecksum
):
4336 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4341 prefname
= preheaderdata
[2];
4342 if(re
.findall("^[.|/]", preheaderdata
[2])):
4343 prefname
= preheaderdata
[2];
4345 prefname
= "./"+preheaderdata
[2];
4346 if(prefname
==seekfile
):
4349 catfp
.seek(seekstart
, 0);
4351 catfheadsize
= int(preheaderdata
[0], 16);
4352 catfnumfields
= int(preheaderdata
[1], 16);
4353 catftype
= int(preheaderdata
[2], 16);
4354 if(re
.findall("^[.|/]", preheaderdata
[3])):
4355 catfname
= preheaderdata
[3];
4357 catfname
= "./"+preheaderdata
[3];
4358 catflinkname
= preheaderdata
[4];
4359 catfsize
= int(preheaderdata
[5], 16);
4360 catfbasedir
= os
.path
.dirname(catfname
);
4362 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
4366 catlist
.update({'catfp': catfp
});
4371 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
4373 def ArchiveFileValidate(infile
, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4375 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4376 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4379 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4380 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4381 if(checkcompressfile
=="tarfile"):
4382 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4383 if(checkcompressfile
=="zipfile"):
4384 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4385 if(rarfile_support
and checkcompressfile
=="rarfile"):
4386 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4387 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4388 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4389 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4396 if(hasattr(sys
.stdin
, "buffer")):
4397 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4399 shutil
.copyfileobj(sys
.stdin
, catfp
);
4401 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4405 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4406 catfp
= download_file_from_internet_file(infile
);
4407 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4413 infile
= RemoveWindowsPath(infile
);
4414 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4415 if(checkcompressfile
=="tarfile"):
4416 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4417 if(checkcompressfile
=="zipfile"):
4418 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4419 if(rarfile_support
and checkcompressfile
=="rarfile"):
4420 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4421 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4422 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4423 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4425 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4426 if(not compresscheck
):
4427 fextname
= os
.path
.splitext(infile
)[1];
4428 if(fextname
==".gz"):
4429 compresscheck
= "gzip";
4430 elif(fextname
==".bz2"):
4431 compresscheck
= "bzip2";
4432 elif(fextname
==".zst"):
4433 compresscheck
= "zstd";
4434 elif(fextname
==".lz4" or fextname
==".clz4"):
4435 compresscheck
= "lz4";
4436 elif(fextname
==".lzo" or fextname
==".lzop"):
4437 compresscheck
= "lzo";
4438 elif(fextname
==".lzma" or fextname
==".xz"):
4439 compresscheck
= "lzma";
4442 if(not compresscheck
):
4444 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4449 SeekToEndOfFile(catfp);
4451 SeekToEndOfFile(catfp);
4452 CatSize = catfp.tell();
4453 CatSizeEnd = CatSize;
4461 curloc
= catfp
.tell();
4464 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4466 catfp
.seek(curloc
, 0);
4467 catstring
= catheader
[0];
4468 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4469 fprenumfiles
= catheader
[1];
4470 fnumfiles
= int(fprenumfiles
, 16);
4471 fprechecksumtype
= catheader
[2];
4472 fprechecksum
= catheader
[3];
4474 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4475 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4476 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4477 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
4478 catfileheadercshex
= format(0, 'x').lower();
4479 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
4480 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4481 elif(fprechecksumtype
=="crc16_ccitt"):
4482 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4483 elif(fprechecksumtype
=="adler32"):
4484 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4485 elif(fprechecksumtype
=="crc32"):
4486 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4487 elif(fprechecksumtype
=="crc64_ecma"):
4488 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4489 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
4490 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4491 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
4492 checksumoutstr
= hashlib
.new(fprechecksumtype
);
4493 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4494 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4496 catfileheadercshex
= format(0, 'x').lower();
4497 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4498 valid_archive
= True;
4499 invalid_archive
= False;
4501 VerbosePrintOut(infile
);
4502 VerbosePrintOut("Number of Records " + str(fnumfiles
));
4503 if(fprechecksum
==catfileheadercshex
):
4505 VerbosePrintOut("File Header Checksum Passed at offset " + str(0));
4508 VerbosePrintOut("File Header Checksum Failed at offset " + str(0));
4509 valid_archive
= False;
4510 invalid_archive
= True;
4512 VerbosePrintOut("");
4513 while(il
<fnumfiles
):
4514 catfhstart
= catfp
.tell();
4516 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4518 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4519 if(len(catheaderdata
)==0):
4521 catfheadsize
= int(catheaderdata
[0], 16);
4522 catfnumfields
= int(catheaderdata
[1], 16);
4523 catftype
= int(catheaderdata
[2], 16);
4524 if(re
.findall("^[.|/]", catheaderdata
[3])):
4525 catfname
= catheaderdata
[3];
4527 catfname
= "./"+catheaderdata
[3];
4528 catfbasedir
= os
.path
.dirname(catfname
);
4529 catflinkname
= catheaderdata
[4];
4530 catfsize
= int(catheaderdata
[5], 16);
4531 catfatime
= int(catheaderdata
[6], 16);
4532 catfmtime
= int(catheaderdata
[7], 16);
4533 catfctime
= int(catheaderdata
[8], 16);
4534 catfbtime
= int(catheaderdata
[9], 16);
4535 catfmode
= int(catheaderdata
[10], 16);
4536 catfchmode
= stat
.S_IMODE(catfmode
);
4537 catftypemod
= stat
.S_IFMT(catfmode
);
4538 prefwinattributes
= int(catheaderdata
[11], 16);
4539 catfuid
= int(catheaderdata
[12], 16);
4540 catfuname
= catheaderdata
[13];
4541 catfgid
= int(catheaderdata
[14], 16);
4542 catfgname
= catheaderdata
[15];
4543 fid
= int(catheaderdata
[16], 16);
4544 finode
= int(catheaderdata
[17], 16);
4545 flinkcount
= int(catheaderdata
[18], 16);
4546 catfdev_minor
= int(catheaderdata
[19], 16);
4547 catfdev_major
= int(catheaderdata
[20], 16);
4548 catfrdev_minor
= int(catheaderdata
[21], 16);
4549 catfrdev_major
= int(catheaderdata
[22], 16);
4550 catfextrasize
= int(catheaderdata
[23], 16);
4551 catfextrafields
= int(catheaderdata
[24], 16);
4552 extrafieldslist
= [];
4554 extraend
= extrastart
+ catfextrafields
;
4555 extrafieldslist
= [];
4556 if(extrastart
<extraend
):
4557 extrafieldslist
.append(catheaderdata
[extrastart
]);
4558 extrastart
= extrastart
+ 1;
4559 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4560 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4561 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4563 hcmax
= len(catheaderdata
) - 2;
4566 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
4568 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4570 VerbosePrintOut(catfname
);
4571 VerbosePrintOut("Record Number " + str(il
) + "; File ID " + str(fid
) + "; iNode Number " + str(finode
));
4572 if(catfcs
==catnewfcs
):
4574 VerbosePrintOut("File Header Checksum Passed at offset " + str(catfhstart
));
4577 VerbosePrintOut("File Header Checksum Failed at offset " + str(catfhstart
));
4578 valid_archive
= False;
4579 invalid_archive
= True;
4580 catfhend
= catfp
.tell() - 1;
4581 catfcontentstart
= catfp
.tell();
4583 pyhascontents
= False;
4585 catfcontents
= catfp
.read(catfsize
);
4586 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
4587 pyhascontents
= True;
4588 if(catfccs
==catnewfccs
):
4590 VerbosePrintOut("File Content Checksum Passed at offset " + str(catfcontentstart
));
4593 VerbosePrintOut("File Content Checksum Failed at offset " + str(catfcontentstart
));
4594 valid_archive
= False;
4595 invalid_archive
= True;
4597 VerbosePrintOut("");
4610 create_alias_function("", __file_format_name__
, "Validate", ArchiveFileValidate
);
4612 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4613 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4616 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4617 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4618 if(checkcompressfile
=="tarfile"):
4619 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4620 if(checkcompressfile
=="zipfile"):
4621 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4622 if(rarfile_support
and checkcompressfile
=="rarfile"):
4623 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4624 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4625 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4626 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4633 if(hasattr(sys
.stdin
, "buffer")):
4634 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4636 shutil
.copyfileobj(sys
.stdin
, catfp
);
4638 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4642 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4643 catfp
= download_file_from_internet_file(infile
);
4644 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4650 infile
= RemoveWindowsPath(infile
);
4651 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4652 if(checkcompressfile
=="tarfile"):
4653 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4654 if(checkcompressfile
=="zipfile"):
4655 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4656 if(rarfile_support
and checkcompressfile
=="rarfile"):
4657 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4658 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4659 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4660 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4662 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4663 if(not compresscheck
):
4664 fextname
= os
.path
.splitext(infile
)[1];
4665 if(fextname
==".gz"):
4666 compresscheck
= "gzip";
4667 elif(fextname
==".bz2"):
4668 compresscheck
= "bzip2";
4669 elif(fextname
==".zst"):
4670 compresscheck
= "zstd";
4671 elif(fextname
==".lz4" or fextname
==".clz4"):
4672 compresscheck
= "lz4";
4673 elif(fextname
==".lzo" or fextname
==".lzop"):
4674 compresscheck
= "lzo";
4675 elif(fextname
==".lzma" or fextname
==".xz"):
4676 compresscheck
= "lzma";
4679 if(not compresscheck
):
4681 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4686 SeekToEndOfFile(catfp);
4688 SeekToEndOfFile(catfp);
4689 CatSize = catfp.tell();
4690 CatSizeEnd = CatSize;
4698 curloc
= catfp
.tell();
4701 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4703 catfp
.seek(curloc
, 0);
4704 catstring
= catheader
[0];
4705 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4706 fprenumfiles
= catheader
[1];
4707 fnumfiles
= int(fprenumfiles
, 16);
4708 fprechecksumtype
= catheader
[2];
4709 fprechecksum
= catheader
[3];
4710 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4711 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4712 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4713 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
4714 catfileheadercshex
= format(0, 'x').lower();
4715 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
4716 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4717 elif(fprechecksumtype
=="crc16_ccitt"):
4718 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4719 elif(fprechecksumtype
=="adler32"):
4720 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4721 elif(fprechecksumtype
=="crc32"):
4722 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4723 elif(fprechecksumtype
=="crc64_ecma"):
4724 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4725 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
4726 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4727 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
4728 checksumoutstr
= hashlib
.new(fprechecksumtype
);
4729 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4730 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4732 catfileheadercshex
= format(0, 'x').lower();
4733 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4734 fheadtell
= len(fileheader
);
4735 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4736 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4738 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4739 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4740 if(seekstart
<0 and seekstart
>fnumfiles
):
4742 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
4743 seekend
= fnumfiles
;
4744 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
4745 seekend
= fnumfiles
- abs(seekend
);
4748 while(il
< seekstart
):
4749 prefhstart
= catfp
.tell();
4751 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4753 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4754 if(len(preheaderdata
)==0):
4756 prefheadsize
= int(preheaderdata
[0], 16);
4757 prefnumfields
= int(preheaderdata
[1], 16);
4758 if(re
.findall("^[.|/]", preheaderdata
[3])):
4759 prefname
= preheaderdata
[3];
4761 prefname
= "./"+preheaderdata
[3];
4762 prefsize
= int(preheaderdata
[5], 16);
4763 prefextrasize
= int(preheaderdata
[23], 16);
4764 prefextrafields
= int(preheaderdata
[24], 16);
4765 extrafieldslist
= [];
4767 extraend
= extrastart
+ prefextrafields
;
4768 extrafieldslist
= [];
4769 if(extrastart
<extraend
):
4770 extrafieldslist
.append(preheaderdata
[extrastart
]);
4771 extrastart
= extrastart
+ 1;
4772 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4773 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4774 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4776 hcmax
= len(preheaderdata
) - 2;
4779 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
4781 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4782 if(prefcs
!=prenewfcs
and not skipchecksum
):
4783 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4785 valid_archive
= False;
4786 invalid_archive
= True;
4787 prefhend
= catfp
.tell() - 1;
4788 prefcontentstart
= catfp
.tell();
4790 pyhascontents
= False;
4792 prefcontents
= catfp
.read(prefsize
);
4793 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4794 pyhascontents
= True;
4795 if(prefccs
!=prenewfccs
and not skipchecksum
):
4796 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4800 fileidnum
= seekstart
;
4802 while(fileidnum
<seekend
):
4803 catfhstart
= catfp
.tell();
4805 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4807 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4808 if(len(catheaderdata
)==0):
4810 catfheadsize
= int(catheaderdata
[0], 16);
4811 catfnumfields
= int(catheaderdata
[1], 16);
4812 catftype
= int(catheaderdata
[2], 16);
4813 if(re
.findall("^[.|/]", catheaderdata
[3])):
4814 catfname
= catheaderdata
[3];
4816 catfname
= "./"+catheaderdata
[3];
4817 catfbasedir
= os
.path
.dirname(catfname
);
4818 catflinkname
= catheaderdata
[4];
4819 catfsize
= int(catheaderdata
[5], 16);
4820 catfatime
= int(catheaderdata
[6], 16);
4821 catfmtime
= int(catheaderdata
[7], 16);
4822 catfctime
= int(catheaderdata
[8], 16);
4823 catfbtime
= int(catheaderdata
[9], 16);
4824 catfmode
= int(catheaderdata
[10], 16);
4825 catfchmode
= stat
.S_IMODE(catfmode
);
4826 catftypemod
= stat
.S_IFMT(catfmode
);
4827 catfwinattributes
= int(catheaderdata
[11], 16);
4828 catfuid
= int(catheaderdata
[12], 16);
4829 catfuname
= catheaderdata
[13];
4830 catfgid
= int(catheaderdata
[14], 16);
4831 catfgname
= catheaderdata
[15];
4832 fid
= int(catheaderdata
[16], 16);
4833 finode
= int(catheaderdata
[17], 16);
4834 flinkcount
= int(catheaderdata
[18], 16);
4835 catfdev_minor
= int(catheaderdata
[19], 16);
4836 catfdev_major
= int(catheaderdata
[20], 16);
4837 catfrdev_minor
= int(catheaderdata
[21], 16);
4838 catfrdev_major
= int(catheaderdata
[22], 16);
4839 catfextrasize
= int(catheaderdata
[23], 16);
4840 catfextrafields
= int(catheaderdata
[24], 16);
4841 extrafieldslist
= [];
4843 extraend
= extrastart
+ catfextrafields
;
4844 extrafieldslist
= [];
4845 if(extrastart
<extraend
):
4846 extrafieldslist
.append(catheaderdata
[extrastart
]);
4847 extrastart
= extrastart
+ 1;
4848 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4849 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4850 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4852 hcmax
= len(catheaderdata
) - 2;
4855 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
4857 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4858 if(catfcs
!=catnewfcs
and not skipchecksum
):
4859 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
4861 catfhend
= catfp
.tell() - 1;
4862 catfcontentstart
= catfp
.tell();
4864 pyhascontents
= False;
4865 if(catfsize
>0 and not listonly
):
4866 catfcontents
= catfp
.read(catfsize
);
4867 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
4868 pyhascontents
= True;
4869 if(catfccs
!=catnewfccs
and skipchecksum
):
4870 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
4872 if(catfsize
>0 and listonly
):
4873 catfp
.seek(catfsize
, 1);
4874 pyhascontents
= False;
4876 catfcontentend
= catfp
.tell() - 1;
4877 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
} });
4878 fileidnum
= fileidnum
+ 1;
4879 realidnum
= realidnum
+ 1;
4881 catlist
.update({'catfp': catfp
});
4886 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
4888 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4889 catfp
= BytesIO(catstr
);
4890 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4891 return listcatfiles
;
4893 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
4895 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4897 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4898 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4899 return listcatfiles
;
4901 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4903 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4904 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4905 return listcatfiles
;
4907 if(not rarfile_support
):
4908 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4911 if(rarfile_support
):
4912 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4914 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4915 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4916 return listcatfiles
;
4918 if(not py7zr_support
):
4919 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4923 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4925 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4926 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4927 return listcatfiles
;
4929 def InFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4930 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4931 if(checkcompressfile
=="tarfile"):
4932 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4933 elif(checkcompressfile
=="zipfile"):
4934 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4935 elif(checkcompressfile
=="catfile"):
4936 return ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4937 elif(rarfile_support
and checkcompressfile
=="rarfile"):
4938 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4939 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
4940 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4945 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4946 catver
= formatspecs
[6];
4947 fileheaderver
= str(int(catver
.replace(".", "")));
4948 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4949 advancedlist
= formatspecs
[8];
4950 altinode
= formatspecs
[9];
4953 for line
in sys
.stdin
:
4954 infilelist
.append(line
.strip());
4955 infilelist
= list(filter(None, infilelist
));
4956 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
4957 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
4959 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
4960 for line
in finfile
:
4961 infilelist
.append(line
.strip());
4962 infilelist
= list(filter(None, infilelist
));
4964 if(isinstance(infiles
, (list, tuple, ))):
4965 infilelist
= list(filter(None, infiles
));
4966 elif(isinstance(infiles
, (str, ))):
4967 infilelist
= list(filter(None, [infiles
]));
4969 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
4971 GetDirList
= ListDir(infilelist
, followlink
, False);
4979 inodetocatinode
= {};
4981 fnumfiles
= int(len(GetDirList
));
4982 catver
= formatspecs
[6];
4983 fileheaderver
= str(int(catver
.replace(".", "")));
4984 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4985 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4986 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4987 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4988 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4989 if(checksumtype
=="none" or checksumtype
==""):
4990 catfileheadercshex
= format(0, 'x').lower();
4991 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4992 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4993 elif(checksumtype
=="crc16_ccitt"):
4994 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4995 elif(checksumtype
=="adler32"):
4996 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4997 elif(checksumtype
=="crc32"):
4998 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4999 elif(checksumtype
=="crc64_ecma"):
5000 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5001 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5002 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5003 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5004 checksumoutstr
= hashlib
.new(checksumtype
);
5005 checksumoutstr
.update(fileheader
.encode('UTF-8'));
5006 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5008 catfileheadercshex
= format(0, 'x').lower();
5009 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5010 fheadtell
= len(fileheader
);
5011 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5012 for curfname
in GetDirList
:
5013 if(re
.findall("^[.|/]", curfname
)):
5016 fname
= "./"+curfname
;
5018 VerbosePrintOut(fname
);
5019 if(not followlink
or followlink
is None):
5020 fstatinfo
= os
.lstat(fname
);
5022 fstatinfo
= os
.stat(fname
);
5023 fpremode
= fstatinfo
.st_mode
;
5024 finode
= fstatinfo
.st_ino
;
5025 flinkcount
= fstatinfo
.st_nlink
;
5027 if(stat
.S_ISREG(fpremode
)):
5029 elif(stat
.S_ISLNK(fpremode
)):
5031 elif(stat
.S_ISCHR(fpremode
)):
5033 elif(stat
.S_ISBLK(fpremode
)):
5035 elif(stat
.S_ISDIR(fpremode
)):
5037 elif(stat
.S_ISFIFO(fpremode
)):
5039 elif(stat
.S_ISSOCK(fpremode
)):
5041 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
5043 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
5045 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
5050 fbasedir
= os
.path
.dirname(fname
);
5052 if(not followlink
and finode
!=0):
5054 if(finode
in inodelist
):
5056 flinkname
= inodetofile
[finode
];
5060 fcurinode
= inodetocatinode
[finode
];
5061 if(finode
not in inodelist
):
5062 inodelist
.append(finode
);
5063 inodetofile
.update({finode
: fname
});
5064 inodetocatinode
.update({finode
: curinode
});
5068 fcurinode
= curinode
;
5069 curinode
= curinode
+ 1;
5071 fcurinode
= curinode
;
5072 curinode
= curinode
+ 1;
5073 curfid
= curfid
+ 1;
5075 flinkname
= os
.readlink(fname
);
5076 fdev
= fstatinfo
.st_dev
;
5077 getfdev
= GetDevMajorMinor(fdev
);
5078 fdev_minor
= getfdev
[0];
5079 fdev_major
= getfdev
[1];
5080 frdev
= fstatinfo
.st_dev
;
5081 if(hasattr(fstatinfo
, "st_rdev")):
5082 frdev
= fstatinfo
.st_rdev
;
5084 frdev
= fstatinfo
.st_dev
;
5085 getfrdev
= GetDevMajorMinor(frdev
);
5086 frdev_minor
= getfrdev
[0];
5087 frdev_major
= getfrdev
[1];
5088 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5090 if(ftype
==0 or ftype
==7):
5091 fsize
= fstatinfo
.st_size
;
5092 fatime
= fstatinfo
.st_atime
;
5093 fmtime
= fstatinfo
.st_mtime
;
5094 fctime
= fstatinfo
.st_ctime
;
5095 if(hasattr(fstatinfo
, "st_birthtime")):
5096 fbtime
= fstatinfo
.st_birthtime
;
5098 fbtime
= fstatinfo
.st_ctime
;
5099 fmode
= fstatinfo
.st_mode
;
5100 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
5101 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
5102 fuid
= fstatinfo
.st_uid
;
5103 fgid
= fstatinfo
.st_gid
;
5108 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
5109 funame
= userinfo
.pw_name
;
5118 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
5119 fgname
= groupinfo
.gr_name
;
5124 fdev_minor
= fdev_minor
;
5125 fdev_major
= fdev_major
;
5126 frdev_minor
= frdev_minor
;
5127 frdev_major
= frdev_major
;
5129 flinkcount
= flinkcount
;
5130 if(hasattr(fstatinfo
, "st_file_attributes")):
5131 fwinattributes
= fstatinfo
.st_file_attributes
;
5134 fcontents
= "".encode('UTF-8');
5136 if(ftype
==0 or ftype
==7):
5137 with
open(fname
, "rb") as fpc
:
5139 chunk
= fpc
.read(chunk_size
);
5143 if(followlink
and (ftype
==1 or ftype
==2)):
5144 flstatinfo
= os
.stat(flinkname
);
5145 with
open(flinkname
, "rb") as fpc
:
5147 chunk
= fpc
.read(chunk_size
);
5151 ftypehex
= format(ftype
, 'x').lower();
5152 extrafields
= len(extradata
);
5153 extrafieldslist
= extradata
;
5154 catfextrafields
= extrafields
;
5155 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5156 if(len(extradata
)>0):
5157 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5158 extrasizelen
= len(extrasizestr
);
5159 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5160 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()];
5161 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5162 catoutlenhex
= format(catoutlen
, 'x').lower();
5163 catoutlist
.insert(0, catoutlenhex
);
5164 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5165 if(len(extradata
)>0):
5166 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5167 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5168 catfnumfields
= catoutlen
;
5169 if(checksumtype
=="none" or checksumtype
==""):
5170 catfileheadercshex
= format(0, 'x').lower();
5171 catfilecontentcshex
= format(0, 'x').lower();
5172 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5173 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
5174 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
5175 elif(checksumtype
=="crc16_ccitt"):
5176 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
5177 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
5178 elif(checksumtype
=="adler32"):
5179 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5180 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
5181 elif(checksumtype
=="crc32"):
5182 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5183 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
5184 elif(checksumtype
=="crc64_ecma"):
5185 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5186 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
5187 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5188 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5189 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
5190 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5191 checksumoutstr
= hashlib
.new(checksumtype
);
5192 checksumoutstr
.update("".encode('UTF-8'));
5193 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5194 checksumoutstr
= hashlib
.new(checksumtype
);
5195 checksumoutstr
.update(fcontents
);
5196 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
5198 catfileheadercshex
= format(0, 'x').lower();
5199 catfilecontentcshex
= format(0, 'x').lower();
5200 catfhstart
= fheadtell
;
5201 fheadtell
+= len(catfileoutstr
);
5202 catfhend
= fheadtell
- 1;
5203 catfcontentstart
= fheadtell
;
5204 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5205 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
5206 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5207 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
]
5208 if(checksumtype
=="none" or checksumtype
==""):
5209 catfileheadercshex
= format(0, 'x').lower();
5210 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5211 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5212 elif(checksumtype
=="crc16_ccitt"):
5213 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5214 elif(checksumtype
=="adler32"):
5215 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5216 elif(checksumtype
=="crc32"):
5217 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5218 elif(checksumtype
=="crc64_ecma"):
5219 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5220 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5221 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5222 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5223 checksumoutstr
= hashlib
.new(checksumtype
);
5224 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5225 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5227 catfileheadercshex
= format(0, 'x').lower();
5228 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5229 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5230 nullstrecd
= formatspecs
[5].encode('UTF-8');
5231 fheadtell
+= len(catfileoutstr
) + 1;
5232 catfcontentend
= fheadtell
- 1;
5233 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5234 pyhascontents
= False;
5235 if(int(fsize
)>0 and not listonly
):
5236 pyhascontents
= True;
5237 if(int(fsize
)>0 and listonly
):
5239 pyhascontents
= False;
5240 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
} });
5241 fileidnum
= fileidnum
+ 1;
5244 def TarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5250 inodetocatinode
= {};
5254 if(hasattr(sys
.stdin
, "buffer")):
5255 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5257 shutil
.copyfileobj(sys
.stdin
, infile
);
5262 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5263 infile
= download_file_from_internet_file(infile
);
5268 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5270 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
5272 if(not tarfile
.is_tarfile(infile
)):
5274 except AttributeError:
5275 if(not is_tarfile(infile
)):
5280 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5281 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
5283 tarfp
= tarfile
.open(infile
, "r");
5284 except FileNotFoundError
:
5286 fnumfiles
= int(len(tarfp
.getmembers()));
5287 catver
= formatspecs
[6];
5288 fileheaderver
= str(int(catver
.replace(".", "")));
5289 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5290 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5291 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5292 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5293 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5294 if(checksumtype
=="none" or checksumtype
==""):
5295 catfileheadercshex
= format(0, 'x').lower();
5296 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5297 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5298 elif(checksumtype
=="crc16_ccitt"):
5299 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5300 elif(checksumtype
=="adler32"):
5301 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5302 elif(checksumtype
=="crc32"):
5303 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5304 elif(checksumtype
=="crc64_ecma"):
5305 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5306 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5307 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5308 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5309 checksumoutstr
= hashlib
.new(checksumtype
);
5310 checksumoutstr
.update(fileheader
.encode('UTF-8'));
5311 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5313 catfileheadercshex
= format(0, 'x').lower();
5314 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5315 fheadtell
= len(fileheader
);
5316 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5317 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
5318 if(re
.findall("^[.|/]", member
.name
)):
5319 fname
= member
.name
;
5321 fname
= "./"+member
.name
;
5323 VerbosePrintOut(fname
);
5324 fpremode
= member
.mode
;
5325 ffullmode
= member
.mode
;
5329 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5331 elif(member
.isdev()):
5332 ffullmode
= member
.mode
;
5334 elif(member
.islnk()):
5335 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5337 elif(member
.issym()):
5338 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
5340 elif(member
.ischr()):
5341 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
5343 elif(member
.isblk()):
5344 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
5346 elif(member
.isdir()):
5347 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
5349 elif(member
.isfifo()):
5350 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
5352 elif(member
.issparse()):
5353 ffullmode
= member
.mode
;
5356 ffullmode
= member
.mode
;
5359 fbasedir
= os
.path
.dirname(fname
);
5363 curfid
= curfid
+ 1;
5365 flinkname
= member
.linkname
;
5366 fdev_minor
= member
.devminor
;
5367 fdev_major
= member
.devmajor
;
5368 frdev_minor
= member
.devminor
;
5369 frdev_major
= member
.devmajor
;
5370 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
5372 elif(ftype
==0 or ftype
==7):
5373 fsize
= member
.size
;
5375 fsize
= member
.size
;
5376 fatime
= member
.mtime
;
5377 fmtime
= member
.mtime
;
5378 fctime
= member
.mtime
;
5379 fbtime
= member
.mtime
;
5381 fchmode
= stat
.S_IMODE(ffullmode
);
5382 ftypemod
= stat
.S_IFMT(ffullmode
);
5385 funame
= member
.uname
;
5386 fgname
= member
.gname
;
5387 flinkcount
= flinkcount
;
5388 fwinattributes
= int(0);
5389 fcontents
= "".encode('UTF-8');
5391 if(ftype
==0 or ftype
==7):
5392 with tarfp
.extractfile(member
) as fpc
:
5394 chunk
= fpc
.read(chunk_size
);
5398 ftypehex
= format(ftype
, 'x').lower();
5399 extrafields
= len(extradata
);
5400 extrafieldslist
= extradata
;
5401 catfextrafields
= extrafields
;
5402 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5403 if(len(extradata
)>0):
5404 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5405 extrasizelen
= len(extrasizestr
);
5406 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5407 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()];
5408 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5409 catoutlenhex
= format(catoutlen
, 'x').lower();
5410 catoutlist
.insert(0, catoutlenhex
);
5411 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5412 if(len(extradata
)>0):
5413 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5414 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5415 catfnumfields
= catoutlen
;
5416 if(checksumtype
=="none" or checksumtype
==""):
5417 catfileheadercshex
= format(0, 'x').lower();
5418 catfilecontentcshex
= format(0, 'x').lower();
5419 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5420 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
5421 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
5422 elif(checksumtype
=="crc16_ccitt"):
5423 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
5424 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
5425 elif(checksumtype
=="adler32"):
5426 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5427 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
5428 elif(checksumtype
=="crc32"):
5429 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5430 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
5431 elif(checksumtype
=="crc64_ecma"):
5432 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5433 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
5434 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5435 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5436 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
5437 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5438 checksumoutstr
= hashlib
.new(checksumtype
);
5439 checksumoutstr
.update("".encode('UTF-8'));
5440 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5441 checksumoutstr
= hashlib
.new(checksumtype
);
5442 checksumoutstr
.update(fcontents
);
5443 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
5445 catfileheadercshex
= format(0, 'x').lower();
5446 catfilecontentcshex
= format(0, 'x').lower();
5447 catfhstart
= fheadtell
;
5448 fheadtell
+= len(catfileoutstr
);
5449 catfhend
= fheadtell
- 1;
5450 catfcontentstart
= fheadtell
;
5451 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5452 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
5453 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5454 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
]
5455 if(checksumtype
=="none" or checksumtype
==""):
5456 catfileheadercshex
= format(0, 'x').lower();
5457 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5458 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5459 elif(checksumtype
=="crc16_ccitt"):
5460 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5461 elif(checksumtype
=="adler32"):
5462 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5463 elif(checksumtype
=="crc32"):
5464 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5465 elif(checksumtype
=="crc64_ecma"):
5466 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5467 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5468 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5469 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5470 checksumoutstr
= hashlib
.new(checksumtype
);
5471 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5472 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5474 catfileheadercshex
= format(0, 'x').lower();
5475 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5476 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5477 nullstrecd
= formatspecs
[5].encode('UTF-8');
5478 fheadtell
+= len(catfileoutstr
) + 1;
5479 catfcontentend
= fheadtell
- 1;
5480 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5481 pyhascontents
= False;
5482 if(int(fsize
)>0 and not listonly
):
5483 pyhascontents
= True;
5484 if(int(fsize
)>0 and listonly
):
5486 pyhascontents
= False;
5487 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
} });
5488 fileidnum
= fileidnum
+ 1;
5491 def ZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5497 inodetocatinode
= {};
5501 if(hasattr(sys
.stdin
, "buffer")):
5502 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5504 shutil
.copyfileobj(sys
.stdin
, infile
);
5509 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
5510 infile
= download_file_from_internet_file(infile
);
5515 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5519 if(not zipfile
.is_zipfile(infile
)):
5522 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
5523 except FileNotFoundError
:
5525 ziptest
= zipfp
.testzip();
5527 VerbosePrintOut("Bad file found!");
5528 fnumfiles
= int(len(zipfp
.infolist()));
5529 catver
= formatspecs
[6];
5530 fileheaderver
= str(int(catver
.replace(".", "")));
5531 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5532 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5533 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5534 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5535 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5536 if(checksumtype
=="none" or checksumtype
==""):
5537 catfileheadercshex
= format(0, 'x').lower();
5538 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5539 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5540 elif(checksumtype
=="crc16_ccitt"):
5541 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5542 elif(checksumtype
=="adler32"):
5543 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5544 elif(checksumtype
=="crc32"):
5545 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5546 elif(checksumtype
=="crc64_ecma"):
5547 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5548 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5549 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5550 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5551 checksumoutstr
= hashlib
.new(checksumtype
);
5552 checksumoutstr
.update(fileheader
.encode('UTF-8'));
5553 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5555 catfileheadercshex
= format(0, 'x').lower();
5556 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5557 fheadtell
= len(fileheader
);
5558 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5559 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
5560 if(re
.findall("^[.|/]", member
.filename
)):
5561 fname
= member
.filename
;
5563 fname
= "./"+member
.filename
;
5564 zipinfo
= zipfp
.getinfo(member
.filename
);
5566 VerbosePrintOut(fname
);
5567 if(not member
.is_dir()):
5568 fpremode
= stat
.S_IFREG
+ 438;
5569 elif(member
.is_dir()):
5570 fpremode
= stat
.S_IFDIR
+ 511;
5573 if(not member
.is_dir()):
5575 elif(member
.is_dir()):
5578 fbasedir
= os
.path
.dirname(fname
);
5582 curfid
= curfid
+ 1;
5590 fsize
= member
.file_size
;
5592 fsize
= member
.file_size
;
5593 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5594 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5595 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5596 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5597 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
5598 fwinattributes
= int(zipinfo
.external_attr
);
5599 if(not member
.is_dir()):
5600 fmode
= int(stat
.S_IFREG
+ 438);
5601 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5602 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5603 elif(member
.is_dir()):
5604 fmode
= int(stat
.S_IFDIR
+ 511);
5605 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5606 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5607 elif(zipinfo
.create_system
==3):
5608 fwinattributes
= int(0);
5609 fmode
= int(zipinfo
.external_attr
);
5611 fwinattributes
= int(0);
5612 if(not member
.is_dir()):
5613 fmode
= int(stat
.S_IFREG
+ 438);
5614 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5615 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5616 elif(member
.is_dir()):
5617 fmode
= int(stat
.S_IFDIR
+ 511);
5618 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5619 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5622 except AttributeError:
5628 except AttributeError:
5635 userinfo
= pwd
.getpwuid(os
.getuid());
5636 funame
= userinfo
.pw_name
;
5639 except AttributeError:
5647 groupinfo
= grp
.getgrgid(os
.getgid());
5648 fgname
= groupinfo
.gr_name
;
5651 except AttributeError:
5655 fcontents
= "".encode('UTF-8');
5657 fcontents
= zipfp
.read(member
.filename
);
5658 ftypehex
= format(ftype
, 'x').lower();
5659 extrafields
= len(extradata
);
5660 extrafieldslist
= extradata
;
5661 catfextrafields
= extrafields
;
5662 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5663 if(len(extradata
)>0):
5664 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5665 extrasizelen
= len(extrasizestr
);
5666 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5667 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()];
5668 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5669 catoutlenhex
= format(catoutlen
, 'x').lower();
5670 catoutlist
.insert(0, catoutlenhex
);
5671 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5672 if(len(extradata
)>0):
5673 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5674 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5675 catfnumfields
= catoutlen
;
5676 if(checksumtype
=="none" or checksumtype
==""):
5677 catfileheadercshex
= format(0, 'x').lower();
5678 catfilecontentcshex
= format(0, 'x').lower();
5679 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5680 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
5681 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
5682 elif(checksumtype
=="crc16_ccitt"):
5683 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
5684 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
5685 elif(checksumtype
=="adler32"):
5686 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5687 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
5688 elif(checksumtype
=="crc32"):
5689 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5690 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
5691 elif(checksumtype
=="crc64_ecma"):
5692 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5693 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
5694 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5695 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5696 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
5697 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5698 checksumoutstr
= hashlib
.new(checksumtype
);
5699 checksumoutstr
.update("".encode('UTF-8'));
5700 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5701 checksumoutstr
= hashlib
.new(checksumtype
);
5702 checksumoutstr
.update(fcontents
);
5703 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
5705 catfileheadercshex
= format(0, 'x').lower();
5706 catfilecontentcshex
= format(0, 'x').lower();
5707 catfhstart
= fheadtell
;
5708 fheadtell
+= len(catfileoutstr
);
5709 catfhend
= fheadtell
- 1;
5710 catfcontentstart
= fheadtell
;
5711 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5712 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
5713 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5714 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
];
5715 if(checksumtype
=="none" or checksumtype
==""):
5716 catfileheadercshex
= format(0, 'x').lower();
5717 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5718 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5719 elif(checksumtype
=="crc16_ccitt"):
5720 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5721 elif(checksumtype
=="adler32"):
5722 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5723 elif(checksumtype
=="crc32"):
5724 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5725 elif(checksumtype
=="crc64_ecma"):
5726 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5727 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5728 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5729 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5730 checksumoutstr
= hashlib
.new(checksumtype
);
5731 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5732 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5734 catfileheadercshex
= format(0, 'x').lower();
5735 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5736 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5737 nullstrecd
= formatspecs
[5].encode('UTF-8');
5738 fheadtell
+= len(catfileoutstr
) + 1;
5739 catfcontentend
= fheadtell
- 1;
5740 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5741 pyhascontents
= False;
5742 if(int(fsize
)>0 and not listonly
):
5743 pyhascontents
= True;
5744 if(int(fsize
)>0 and listonly
):
5746 pyhascontents
= False;
5747 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
} });
5748 fileidnum
= fileidnum
+ 1;
5751 if(not rarfile_support
):
5752 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5755 if(rarfile_support
):
5756 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5762 inodetocatinode
= {};
5764 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
5766 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5768 rarfp
= rarfile
.RarFile(infile
, "r");
5769 rartest
= rarfp
.testrar();
5771 VerbosePrintOut("Bad file found!");
5772 fnumfiles
= int(len(rarfp
.infolist()));
5773 catver
= formatspecs
[6];
5774 fileheaderver
= str(int(catver
.replace(".", "")));
5775 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5776 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5777 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5778 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5779 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5780 if(checksumtype
=="none" or checksumtype
==""):
5781 catfileheadercshex
= format(0, 'x').lower();
5782 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5783 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5784 elif(checksumtype
=="crc16_ccitt"):
5785 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
5786 elif(checksumtype
=="adler32"):
5787 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5788 elif(checksumtype
=="crc32"):
5789 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5790 elif(checksumtype
=="crc64_ecma"):
5791 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5792 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5793 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5794 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5795 checksumoutstr
= hashlib
.new(checksumtype
);
5796 checksumoutstr
.update(fileheader
.encode('UTF-8'));
5797 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5799 catfileheadercshex
= format(0, 'x').lower();
5800 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5801 fheadtell
= len(fileheader
);
5802 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5803 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5806 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
5809 member
.external_attr
5811 except AttributeError:
5813 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
5816 member
.external_attr
5818 except AttributeError:
5823 if(re
.findall("^[.|/]", member
.filename
)):
5824 fname
= member
.filename
;
5826 fname
= "./"+member
.filename
;
5827 rarinfo
= rarfp
.getinfo(member
.filename
);
5829 VerbosePrintOut(fname
);
5830 if(is_unix
and member
.external_attr
!=0):
5831 fpremode
= int(member
.external_attr
);
5832 elif(member
.is_file()):
5833 fpremode
= stat
.S_IFREG
+ 438;
5834 elif(member
.is_symlink()):
5835 fpremode
= stat
.S_IFLNK
+ 438;
5836 elif(member
.is_dir()):
5837 fpremode
= stat
.S_IFDIR
+ 511;
5838 if(is_windows
and member
.external_attr
!=0):
5839 fwinattributes
= int(member
.external_attr
);
5841 fwinattributes
= int(0);
5844 if(member
.is_file()):
5846 elif(member
.is_symlink()):
5848 elif(member
.is_dir()):
5852 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
5853 fbasedir
= os
.path
.dirname(fname
);
5857 curfid
= curfid
+ 1;
5865 fsize
= member
.file_size
;
5868 fatime
= int(member
.atime
.timestamp());
5870 fatime
= int(member
.mtime
.timestamp());
5871 except AttributeError:
5872 fatime
= int(member
.mtime
.timestamp());
5873 fmtime
= int(member
.mtime
.timestamp());
5876 fctime
= int(member
.ctime
.timestamp());
5878 fctime
= int(member
.mtime
.timestamp());
5879 except AttributeError:
5880 fctime
= int(member
.mtime
.timestamp());
5881 fbtime
= int(member
.mtime
.timestamp());
5882 if(is_unix
and member
.external_attr
!=0):
5883 fmode
= int(member
.external_attr
);
5884 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5885 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5886 elif(member
.is_file()):
5887 fmode
= int(stat
.S_IFREG
+ 438)
5888 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5889 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5890 elif(member
.is_symlink()):
5891 fmode
= int(stat
.S_IFLNK
+ 438)
5892 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5893 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5894 elif(member
.is_dir()):
5895 fmode
= int(stat
.S_IFDIR
+ 511)
5896 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5897 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5900 except AttributeError:
5906 except AttributeError:
5913 userinfo
= pwd
.getpwuid(os
.getuid());
5914 funame
= userinfo
.pw_name
;
5917 except AttributeError:
5925 groupinfo
= grp
.getgrgid(os
.getgid());
5926 fgname
= groupinfo
.gr_name
;
5929 except AttributeError:
5933 fcontents
= "".encode('UTF-8');
5935 fcontents
= rarfp
.read(member
.filename
);
5936 ftypehex
= format(ftype
, 'x').lower();
5937 extrafields
= len(extradata
);
5938 extrafieldslist
= extradata
;
5939 catfextrafields
= extrafields
;
5940 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5941 if(len(extradata
)>0):
5942 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5943 extrasizelen
= len(extrasizestr
);
5944 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5945 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()];
5946 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5947 catoutlenhex
= format(catoutlen
, 'x').lower();
5948 catoutlist
.insert(0, catoutlenhex
);
5949 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5950 if(len(extradata
)>0):
5951 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5952 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5953 catfnumfields
= 24 + catfextrafields
;
5954 if(checksumtype
=="none" or checksumtype
==""):
5955 catfileheadercshex
= format(0, 'x').lower();
5956 catfilecontentcshex
= format(0, 'x').lower();
5957 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5958 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5959 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
5960 elif(checksumtype
=="crc16_ccitt"):
5961 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5962 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
5963 elif(checksumtype
=="adler32"):
5964 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5965 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
5966 elif(checksumtype
=="crc32"):
5967 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5968 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
5969 elif(checksumtype
=="crc64_ecma"):
5970 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5971 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
5972 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5973 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5974 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
5975 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5976 checksumoutstr
= hashlib
.new(checksumtype
);
5977 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5978 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5980 catfileheadercshex
= format(0, 'x').lower();
5981 catfilecontentcshex
= format(0, 'x').lower();
5982 catfhstart
= fheadtell
;
5983 fheadtell
+= len(catfileoutstr
);
5984 catfhend
= fheadtell
- 1;
5985 catfcontentstart
= fheadtell
;
5986 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5987 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
5988 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5989 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
];
5990 if(checksumtype
=="none" or checksumtype
==""):
5991 catfileheadercshex
= format(0, 'x').lower();
5992 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5993 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5994 elif(checksumtype
=="crc16_ccitt"):
5995 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5996 elif(checksumtype
=="adler32"):
5997 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5998 elif(checksumtype
=="crc32"):
5999 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6000 elif(checksumtype
=="crc64_ecma"):
6001 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6002 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6003 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6004 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6005 checksumoutstr
= hashlib
.new(checksumtype
);
6006 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
6007 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6009 catfileheadercshex
= format(0, 'x').lower();
6010 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6011 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6012 nullstrecd
= formatspecs
[5].encode('UTF-8');
6013 fheadtell
+= len(catfileoutstr
) + 1;
6014 catfcontentend
= fheadtell
- 1;
6015 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
6016 pyhascontents
= False;
6017 if(int(fsize
)>0 and not listonly
):
6018 pyhascontents
= True;
6019 if(int(fsize
)>0 and listonly
):
6021 pyhascontents
= False;
6022 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
} });
6023 fileidnum
= fileidnum
+ 1;
6026 if(not py7zr_support
):
6027 def SevenZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6031 def SevenZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6037 inodetocatinode
= {};
6039 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
6040 file_content
= szpfp
.readall();
6041 #sztest = szpfp.testzip();
6042 sztestalt
= szpfp
.test();
6044 VerbosePrintOut("Bad file found!");
6045 numfiles
= int(len(szpfp
.list()));
6046 catver
= formatspecs
[6];
6047 fileheaderver
= str(int(catver
.replace(".", "")));
6048 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
6049 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
6050 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
6051 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
6052 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
6053 if(checksumtype
=="none" or checksumtype
==""):
6054 catfileheadercshex
= format(0, 'x').lower();
6055 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6056 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
6057 elif(checksumtype
=="crc16_ccitt"):
6058 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
6059 elif(checksumtype
=="adler32"):
6060 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6061 elif(checksumtype
=="crc32"):
6062 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6063 elif(checksumtype
=="crc64_ecma"):
6064 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6065 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6066 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6067 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6068 checksumoutstr
= hashlib
.new(checksumtype
);
6069 checksumoutstr
.update(fileheader
.encode('UTF-8'));
6070 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6072 catfileheadercshex
= format(0, 'x').lower();
6073 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
6074 fheadtell
= len(fileheader
);
6075 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
6076 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
6077 if(re
.findall("^[.|/]", member
.filename
)):
6078 fname
= member
.filename
;
6080 fname
= "./"+member
.filename
;
6081 if(not member
.is_directory
):
6082 fpremode
= int(stat
.S_IFREG
+ 438);
6083 elif(member
.is_directory
):
6084 fpremode
= int(stat
.S_IFDIR
+ 511);
6085 fwinattributes
= int(0);
6088 if(member
.is_directory
):
6093 fbasedir
= os
.path
.dirname(fname
);
6097 curfid
= curfid
+ 1;
6104 fatime
= int(member
.creationtime
.timestamp());
6105 fmtime
= int(member
.creationtime
.timestamp());
6106 fctime
= int(member
.creationtime
.timestamp());
6107 fbtime
= int(member
.creationtime
.timestamp());
6108 if(member
.is_directory
):
6109 fmode
= int(stat
.S_IFDIR
+ 511)
6110 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
6111 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
6113 fmode
= int(stat
.S_IFLNK
+ 438)
6114 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
6115 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
6118 except AttributeError:
6124 except AttributeError:
6131 userinfo
= pwd
.getpwuid(os
.getuid());
6132 funame
= userinfo
.pw_name
;
6135 except AttributeError:
6143 groupinfo
= grp
.getgrgid(os
.getgid());
6144 fgname
= groupinfo
.gr_name
;
6147 except AttributeError:
6151 fcontents
= "".encode('UTF-8');
6153 fcontents
= file_content
[member
.filename
].read();
6154 fsize
= format(len(fcontents
), 'x').lower();
6156 ftypehex
= format(ftype
, 'x').lower();
6157 extrafields
= len(extradata
);
6158 extrafieldslist
= extradata
;
6159 catfextrafields
= extrafields
;
6160 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
6161 if(len(extradata
)>0):
6162 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6163 extrasizelen
= len(extrasizestr
);
6164 extrasizelenhex
= format(extrasizelen
, 'x').lower();
6165 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()];
6166 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6167 catoutlenhex
= format(catoutlen
, 'x').lower();
6168 catoutlist
.insert(0, catoutlenhex
);
6169 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
6170 if(len(extradata
)>0):
6171 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6172 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
6173 catfnumfields
= 24 + catfextrafields
;
6174 if(checksumtype
=="none" or checksumtype
==""):
6175 catfileheadercshex
= format(0, 'x').lower();
6176 catfilecontentcshex
= format(0, 'x').lower();
6177 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6178 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6179 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
6180 elif(checksumtype
=="crc16_ccitt"):
6181 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6182 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
6183 elif(checksumtype
=="adler32"):
6184 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6185 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
6186 elif(checksumtype
=="crc32"):
6187 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6188 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
6189 elif(checksumtype
=="crc64_ecma"):
6190 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6191 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
6192 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6193 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6194 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
6195 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6196 checksumoutstr
= hashlib
.new(checksumtype
);
6197 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
6198 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6200 catfileheadercshex
= format(0, 'x').lower();
6201 catfilecontentcshex
= format(0, 'x').lower();
6202 catfhstart
= fheadtell
;
6203 fheadtell
+= len(catfileoutstr
);
6204 catfhend
= fheadtell
- 1;
6205 catfcontentstart
= fheadtell
;
6206 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6207 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
6208 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
6209 catheaderdata
= [catheaersize
] + catoutlist
+ extradata
+ [checksumtype
, catfileheadercshex
, catfilecontentcshex
];
6210 if(checksumtype
=="none" or checksumtype
==""):
6211 catfileheadercshex
= format(0, 'x').lower();
6212 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6213 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6214 elif(checksumtype
=="crc16_ccitt"):
6215 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6216 elif(checksumtype
=="adler32"):
6217 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6218 elif(checksumtype
=="crc32"):
6219 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6220 elif(checksumtype
=="crc64_ecma"):
6221 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6222 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6223 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6224 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6225 checksumoutstr
= hashlib
.new(checksumtype
);
6226 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
6227 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6229 catfileheadercshex
= format(0, 'x').lower();
6230 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6231 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6232 nullstrecd
= formatspecs
[5].encode('UTF-8');
6233 fheadtell
+= len(catfileoutstr
) + 1;
6234 catfcontentend
= fheadtell
- 1;
6235 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
6236 pyhascontents
= False;
6237 if(int(fsize
)>0 and not listonly
):
6238 pyhascontents
= True;
6239 if(int(fsize
)>0 and listonly
):
6241 pyhascontents
= False;
6242 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
} });
6243 fileidnum
= fileidnum
+ 1;
6246 def InFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6247 checkcompressfile
= CheckCompressionSubType(infiles
, formatspecs
, True);
6248 if(checkcompressfile
=="tarfile"):
6249 return TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6250 elif(checkcompressfile
=="zipfile"):
6251 return ZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6252 elif(checkcompressfile
=="catfile"):
6253 return ArchiveFileToArray(infile
, 0, 0, listonly
, False, formatspecs
, False);
6254 elif(rarfile_support
and checkcompressfile
=="rarfile"):
6255 return RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6256 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
6257 return SevenZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6262 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):
6263 outarray
= BytesIO();
6264 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6265 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6266 return listcatfiles
;
6268 def ArchiveFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6269 if(isinstance(infile
, dict)):
6270 listcatfiles
= infile
;
6272 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6273 infile
= RemoveWindowsPath(infile
);
6274 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6275 if(not listcatfiles
):
6277 catarray
= {'list': listcatfiles
, 'filetoid': {}, 'idtofile': {}, 'filetypes': {'directories': {'filetoid': {}, 'idtofile': {}}, 'files': {'filetoid': {}, 'idtofile': {}}, 'links': {'filetoid': {}, 'idtofile': {}}, 'symlinks': {'filetoid': {}, 'idtofile': {}}, 'hardlinks': {'filetoid': {}, 'idtofile': {}}, 'character': {'filetoid': {}, 'idtofile': {}}, 'block': {'filetoid': {}, 'idtofile': {}}, 'fifo': {'filetoid': {}, 'idtofile': {}}, 'devices': {'filetoid': {}, 'idtofile': {}}}};
6279 catarray
.update({'catfp': listcatfiles
['catfp']});
6280 lenlist
= len(listcatfiles
['ffilelist']);
6282 lcfx
= int(listcatfiles
['fnumfiles']);
6283 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6284 lcfx
= int(lenlist
);
6286 lcfx
= int(listcatfiles
['fnumfiles']);
6288 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6289 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6290 catarray
['filetoid'].update(filetoidarray
);
6291 catarray
['idtofile'].update(idtofilearray
);
6292 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6293 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6294 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6295 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6296 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6297 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6298 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6299 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6300 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6301 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6302 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6303 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6304 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6305 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6306 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6307 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6308 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6309 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6310 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6311 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6312 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6313 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6314 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6315 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6316 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6317 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6318 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6319 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6320 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6321 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6322 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6326 create_alias_function("", __file_format_name__
, "ToArrayIndex", ArchiveFileToArrayIndex
);
6328 def ListDirToArrayIndexAlt(infiles
, dirlistfromtxt
=False, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6329 listcatfiles
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6330 if(not listcatfiles
):
6332 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': {}}}};
6333 lenlist
= len(listcatfiles
['ffilelist']);
6335 lcfx
= int(listcatfiles
['fnumfiles']);
6336 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6337 lcfx
= int(lenlist
);
6339 lcfx
= int(listcatfiles
['fnumfiles']);
6341 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6342 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6343 catarray
['filetoid'].update(filetoidarray
);
6344 catarray
['idtofile'].update(idtofilearray
);
6345 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6346 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6347 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6348 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6349 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6350 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6351 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6352 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6353 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6354 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6355 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6356 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6357 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6358 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6359 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6360 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6361 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6362 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6363 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6364 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6365 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6366 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6367 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6368 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6369 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6370 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6371 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6372 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6373 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6374 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6375 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6379 def TarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6380 listcatfiles
= TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6381 if(not listcatfiles
):
6383 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': {}}}};
6384 lenlist
= len(listcatfiles
['ffilelist']);
6386 lcfx
= int(listcatfiles
['fnumfiles']);
6387 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6388 lcfx
= int(lenlist
);
6390 lcfx
= int(listcatfiles
['fnumfiles']);
6392 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6393 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6394 catarray
['filetoid'].update(filetoidarray
);
6395 catarray
['idtofile'].update(idtofilearray
);
6396 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6397 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6398 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6399 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6400 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6401 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6402 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6403 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6404 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6405 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6406 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6407 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6408 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6409 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6410 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6411 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6412 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6413 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6414 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6415 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6416 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6417 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6418 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6419 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6420 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6421 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6422 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6423 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6424 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6425 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6426 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6430 def ZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6431 listcatfiles
= ZipFileToArrayAlt(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 if(not rarfile_support
):
6482 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6485 if(rarfile_support
):
6486 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6487 listcatfiles
= RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6488 if(not listcatfiles
):
6490 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': {}}}};
6491 lenlist
= len(listcatfiles
['ffilelist']);
6493 lcfx
= int(listcatfiles
['fnumfiles']);
6494 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6495 lcfx
= int(lenlist
);
6497 lcfx
= int(listcatfiles
['fnumfiles']);
6499 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6500 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6501 catarray
['filetoid'].update(filetoidarray
);
6502 catarray
['idtofile'].update(idtofilearray
);
6503 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6504 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6505 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6506 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6507 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6508 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6509 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6510 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6511 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6512 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6513 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6514 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6515 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6516 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6517 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6518 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6519 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6520 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6521 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6522 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6523 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6524 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6525 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6526 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6527 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6528 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6529 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6530 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6531 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6532 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6533 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6537 if(not py7zr_support
):
6538 def SevenZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6542 def SevenZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
6543 listcatfiles
= SevenZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
6544 if(not listcatfiles
):
6546 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': {}}}};
6547 lenlist
= len(listcatfiles
['ffilelist']);
6549 lcfx
= int(listcatfiles
['fnumfiles']);
6550 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6551 lcfx
= int(lenlist
);
6553 lcfx
= int(listcatfiles
['fnumfiles']);
6555 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
6556 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
6557 catarray
['filetoid'].update(filetoidarray
);
6558 catarray
['idtofile'].update(idtofilearray
);
6559 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6560 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
6561 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
6562 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6563 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
6564 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
6565 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6566 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6567 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6568 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6569 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6570 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
6571 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
6572 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
6573 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
6574 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
6575 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6576 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6577 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
6578 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
6579 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
6580 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6581 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6582 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6583 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
6584 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
6585 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
6586 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
6587 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
6588 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
6589 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
6593 def ArchiveFileStringToArrayIndex(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6594 catfp
= BytesIO(catstr
);
6595 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6596 return listcatfiles
;
6598 create_alias_function("", __file_format_name__
, "StringToArrayIndex", ArchiveFileStringToArrayIndex
);
6600 def TarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6602 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
6603 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6604 return listcatfiles
;
6606 def ZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6608 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
6609 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6610 return listcatfiles
;
6612 if(not rarfile_support
):
6613 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6616 if(rarfile_support
):
6617 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6619 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
6620 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6621 return listcatfiles
;
6623 if(not py7zr_support
):
6624 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6628 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6630 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
6631 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
6632 return listcatfiles
;
6634 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):
6635 outarray
= BytesIO();
6636 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
, True);
6637 listcatfiles
= ArchiveFileToArrayIndex(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
)
6638 return listcatfiles
;
6640 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):
6641 if(isinstance(infile
, dict)):
6642 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6643 listcatfiles
= prelistcatfiles
['list'];
6645 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6646 infile
= RemoveWindowsPath(infile
);
6648 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6649 listcatfiles
= prelistcatfiles
['list'];
6651 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6652 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
6653 outfile
= RemoveWindowsPath(outfile
);
6654 checksumtype
= checksumtype
.lower();
6655 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
6656 checksumtype
="crc32";
6657 if(checksumtype
=="none"):
6659 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
6661 if(compression
not in compressionlist
and compression
is None):
6662 compression
= "auto";
6664 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6665 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
6666 if(os
.path
.exists(outfile
)):
6668 if(not listcatfiles
):
6673 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6675 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6678 fbasename
= os
.path
.splitext(outfile
)[0];
6679 fextname
= os
.path
.splitext(outfile
)[1];
6680 catfp
= CompressOpenFile(outfile
, compressionlevel
);
6681 catver
= formatspecs
[6];
6682 fileheaderver
= str(int(catver
.replace(".", "")));
6683 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
6684 catfp
.write(fileheader
.encode('UTF-8'));
6685 lenlist
= len(listcatfiles
['ffilelist']);
6686 fnumfiles
= int(listcatfiles
['fnumfiles']);
6687 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
6688 fnumfiles
= lenlist
;
6689 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
6690 fnumfilesa
= AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
6691 if(checksumtype
=="none" or checksumtype
==""):
6692 catfileheadercshex
= format(0, 'x').lower();
6693 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6694 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
6695 elif(checksumtype
=="crc16_ccitt"):
6696 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
6697 elif(checksumtype
=="adler32"):
6698 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
6699 elif(checksumtype
=="crc32"):
6700 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
6701 elif(checksumtype
=="crc64_ecma"):
6702 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6703 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6704 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6705 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6706 checksumoutstr
= hashlib
.new(checksumtype
);
6707 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
6708 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6710 catfileheadercshex
= format(0, 'x').lower();
6711 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
6712 catfp
.write(fnumfilesa
.encode('UTF-8'));
6715 os
.fsync(catfp
.fileno());
6716 except io
.UnsupportedOperation
:
6718 except AttributeError:
6720 lenlist
= len(listcatfiles
['ffilelist']);
6721 fnumfiles
= int(listcatfiles
['fnumfiles']);
6723 lcfx
= int(listcatfiles
['fnumfiles']);
6724 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6725 lcfx
= int(lenlist
);
6727 lcfx
= int(listcatfiles
['fnumfiles']);
6735 catfhstart
= catfp
.tell();
6736 if(re
.findall("^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
6737 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
6739 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
6741 VerbosePrintOut(fname
);
6742 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
6743 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
6744 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6745 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
6746 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
6747 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
6748 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
6749 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
6750 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
6751 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
6752 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
6753 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
6754 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
6755 finode
= listcatfiles
['ffilelist'][reallcfi
]['finode'];
6756 flinkcount
= listcatfiles
['ffilelist'][reallcfi
]['flinkcount'];
6757 fwinattributes
= flinkinfo
['ffilelist'][reallcfi
]['fwinattributes'];
6758 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
6759 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
6760 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
6761 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
6762 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
6763 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6764 if(len(extradata
)>0):
6765 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(extradata
);
6766 listcatfiles
['ffilelist'][reallcfi
]['fextralist'] = extradata
;
6767 extrafields
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']), 'x').lower();
6768 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
6769 if(len(extradata
)>0):
6770 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6771 extrasizelen
= format(len(extrasizestr
), 'x').lower();
6772 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
6774 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
6775 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
6776 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6777 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6778 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
6779 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
6780 flinkname
= flinkinfo
['flinkname'];
6781 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
6782 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
6783 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
6784 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
6785 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
6786 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
6787 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
6788 funame
= flinkinfo
['funame'];
6789 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
6790 fgname
= flinkinfo
['fgname'];
6791 finode
= flinkinfo
['finode'];
6792 flinkcount
= flinkinfo
['flinkcount'];
6793 fwinattributes
= flinkinfo
['fwinattributes'];
6794 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
6795 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
6796 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
6797 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
6798 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
6799 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
6800 if(len(extradata
)>0):
6801 flinkinfo
['fextrafields'] = len(extradata
);
6802 flinkinfo
['fextralist'] = extradata
;
6803 extrafields
= format(int(flinkinfo
['fextrafields']), 'x').lower();
6804 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
6805 if(len(extradata
)>0):
6806 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6807 extrasizelen
= format(len(extrasizestr
), 'x').lower();
6808 fcontents
= flinkinfo
['fcontents'];
6809 if(flinkinfo
['ftype']!=0 and flinkinfo
['ftype']!=7):
6811 fcontents
= fcontents
.encode('UTF-8');
6812 except AttributeError:
6814 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
6816 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=0 and listcatfiles
['ffilelist'][reallcfi
]['ftype']!=7):
6818 fcontents
= fcontents
.encode('UTF-8');
6819 except AttributeError:
6821 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
6822 fcurfid
= format(curfid
, 'x').lower();
6823 if(not followlink
and finode
!=0):
6824 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
6825 fcurinode
= format(int(curinode
), 'x').lower();
6826 inodetofile
.update({curinode
: fname
});
6827 filetoinode
.update({fname
: curinode
});
6828 curinode
= curinode
+ 1;
6830 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
6832 fcurinode
= format(int(curinode
), 'x').lower();
6833 curinode
= curinode
+ 1;
6834 curfid
= curfid
+ 1;
6835 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
];
6836 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6837 catoutlenhex
= format(catoutlen
, 'x').lower();
6838 catoutlist
.insert(0, catoutlenhex
);
6839 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
6840 if(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']>0):
6841 extrafieldslist
= [];
6843 exil
= listcatfiles
['ffilelist'][reallcfi
]['fextrafields'];
6845 extrafieldslist
.append(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6847 catfileoutstr
+= AppendNullBytes([extrafieldslist
], formatspecs
[5]);
6848 catfileoutstr
+= AppendNullBytes([checksumtype
], formatspecs
[5]);
6849 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
6850 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
6851 if(checksumtype
=="none" or checksumtype
==""):
6852 catfileheadercshex
= format(0, 'x').lower();
6853 catfilecontentcshex
= format(0, 'x').lower();
6854 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6855 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
6856 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
6857 elif(checksumtype
=="crc16_ccitt"):
6858 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
6859 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
6860 elif(checksumtype
=="adler32"):
6861 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
6862 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
6863 elif(checksumtype
=="crc32"):
6864 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
6865 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
6866 elif(checksumtype
=="crc64_ecma"):
6867 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6868 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
6869 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6870 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6871 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
6872 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6873 checksumoutstr
= hashlib
.new(checksumtype
);
6874 checksumoutstr
.update("".encode('UTF-8'));
6875 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6876 checksumoutstr
= hashlib
.new(checksumtype
);
6877 checksumoutstr
.update(fcontents
);
6878 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
6880 catfileheadercshex
= format(0, 'x').lower();
6881 catfilecontentcshex
= format(0, 'x').lower();
6882 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6883 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
6884 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
6885 if(checksumtype
=="none" or checksumtype
==""):
6886 catfileheadercshex
= format(0, 'x').lower();
6887 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
6888 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6889 elif(checksumtype
=="crc16_ccitt"):
6890 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
6891 elif(checksumtype
=="adler32"):
6892 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6893 elif(checksumtype
=="crc32"):
6894 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
6895 elif(checksumtype
=="crc64_ecma"):
6896 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6897 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
6898 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
6899 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
6900 checksumoutstr
= hashlib
.new(checksumtype
);
6901 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
6902 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
6904 catfileheadercshex
= format(0, 'x').lower();
6905 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6906 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6907 nullstrecd
= formatspecs
[5].encode('UTF-8');
6908 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
6909 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
6910 catfp
.write(catfileout
);
6913 os
.fsync(catfp
.fileno());
6914 except io
.UnsupportedOperation
:
6916 except AttributeError:
6919 reallcfi
= reallcfi
+ 1;
6921 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
6922 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6923 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
6926 os
.fsync(catfp
.fileno());
6927 except io
.UnsupportedOperation
:
6929 except AttributeError:
6933 if(hasattr(sys
.stdout
, "buffer")):
6934 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
6936 shutil
.copyfileobj(catfp
, sys
.stdout
);
6937 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6938 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
6940 upload_file_to_internet_file(catfp
, outfile
);
6948 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
6950 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6951 catfp
= BytesIO(catstr
);
6952 listcatfiles
= RePackArchiveFile(catfp
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6953 return listcatfiles
;
6955 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
6957 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):
6958 outarray
= BytesIO();
6959 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6960 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6961 return listcatfiles
;
6963 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
6965 def ArchiveFileArrayBase64Encode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6967 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6968 if(isinstance(infile
, dict)):
6969 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6970 listcatfiles
= prelistcatfiles
['list'];
6972 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6973 infile
= RemoveWindowsPath(infile
);
6975 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6976 listcatfiles
= prelistcatfiles
['list'];
6978 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6979 if(not listcatfiles
):
6981 lenlist
= len(listcatfiles
['ffilelist']);
6982 fnumfiles
= int(listcatfiles
['fnumfiles']);
6984 lcfx
= int(listcatfiles
['fnumfiles']);
6985 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6986 lcfx
= int(lenlist
);
6988 lcfx
= int(listcatfiles
['fnumfiles']);
6990 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
6991 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64encode(listcatfiles
['ffilelist'][lcfi
]['fcontents']).decode("UTF-8");
6993 return listcatfiles
;
6995 create_alias_function("", __file_format_name__
, "ArrayBase64Encode", ArchiveFileArrayBase64Encode
);
6997 def ArchiveFileArrayBase64Decode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6999 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7000 if(isinstance(infile
, dict)):
7001 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
7002 listcatfiles
= prelistcatfiles
['list'];
7004 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
7005 infile
= RemoveWindowsPath(infile
);
7007 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
7008 listcatfiles
= prelistcatfiles
['list'];
7010 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
7011 if(not listcatfiles
):
7013 lenlist
= len(listcatfiles
['ffilelist']);
7014 fnumfiles
= int(listcatfiles
['fnumfiles']);
7016 lcfx
= int(listcatfiles
['fnumfiles']);
7017 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
7018 lcfx
= int(lenlist
);
7020 lcfx
= int(listcatfiles
['fnumfiles']);
7022 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
7023 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64decode(listcatfiles
['ffilelist'][lcfi
]['fcontents'].encode("UTF-8"));
7025 return listcatfiles
;
7027 create_alias_function("", __file_format_name__
, "ArrayBase64Decode", ArchiveFileArrayBase64Decode
);
7029 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):
7030 if(outdir
is not None):
7031 outdir
= RemoveWindowsPath(outdir
);
7033 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7034 if(isinstance(infile
, dict)):
7035 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
7036 listcatfiles
= prelistcatfiles
['list'];
7038 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
7039 infile
= RemoveWindowsPath(infile
);
7041 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
7042 listcatfiles
= prelistcatfiles
['list'];
7044 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
7045 if(not listcatfiles
):
7047 lenlist
= len(listcatfiles
['ffilelist']);
7048 fnumfiles
= int(listcatfiles
['fnumfiles']);
7050 lcfx
= int(listcatfiles
['fnumfiles']);
7051 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
7052 lcfx
= int(lenlist
);
7054 lcfx
= int(listcatfiles
['fnumfiles']);
7060 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
7061 funame
= userinfo
.pw_name
;
7070 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
7071 fgname
= groupinfo
.gr_name
;
7077 VerbosePrintOut(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7078 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
7079 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
7080 fpc
.write(listcatfiles
['ffilelist'][lcfi
]['fcontents'])
7083 os
.fsync(fpc
.fileno())
7084 except io
.UnsupportedOperation
:
7086 except AttributeError:
7088 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
7089 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
7090 if(preservepermissions
):
7091 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7093 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
7094 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
7096 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7097 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
7098 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
7103 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
7104 funame
= userinfo
.pw_name
;
7113 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
7114 fgname
= groupinfo
.gr_name
;
7119 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
7120 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
7121 fpc
.write(flinkinfo
['fcontents'])
7124 os
.fsync(fpc
.fileno())
7125 except io
.UnsupportedOperation
:
7127 except AttributeError:
7129 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7130 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7131 if(preservepermissions
):
7132 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7134 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7135 if(flinkinfo
['ftype']==1):
7136 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7137 if(flinkinfo
['ftype']==2):
7138 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7139 if(flinkinfo
['ftype']==5):
7140 if(preservepermissions
):
7141 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7143 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7144 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7145 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7146 if(preservepermissions
):
7147 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7149 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7150 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
7151 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7153 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7154 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
7156 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7157 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
7158 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
7163 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
7164 funame
= userinfo
.pw_name
;
7173 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
7174 fgname
= groupinfo
.gr_name
;
7179 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
7180 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
7181 fpc
.write(flinkinfo
['fcontents'])
7184 os
.fsync(fpc
.fileno())
7185 except io
.UnsupportedOperation
:
7187 except AttributeError:
7189 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7190 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7191 if(preservepermissions
):
7192 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7194 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7195 if(flinkinfo
['ftype']==1):
7196 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7197 if(flinkinfo
['ftype']==2):
7198 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7199 if(flinkinfo
['ftype']==5):
7200 if(preservepermissions
):
7201 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7203 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7204 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
7205 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
7206 if(preservepermissions
):
7207 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7209 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
7210 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
7211 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
7213 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7214 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
7215 if(preservepermissions
):
7216 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7218 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
7219 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
7220 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
7221 if(preservepermissions
):
7222 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7224 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
7225 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
7226 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
7229 return listcatfiles
['ffilelist']['catfp'];
7233 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
7235 if(hasattr(shutil
, "register_unpack_format")):
7236 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
7237 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_delimiter__
, False, False);
7238 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
7240 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7241 catfp
= BytesIO(catstr
);
7242 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7243 return listcatfiles
;
7245 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
7247 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7248 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7249 if(isinstance(infile
, dict)):
7250 listcatfiles
= infile
;
7252 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
7253 infile
= RemoveWindowsPath(infile
);
7254 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, skipchecksum
, formatspecs
, returnfp
);
7255 if(not listcatfiles
):
7257 lenlist
= len(listcatfiles
['ffilelist']);
7258 fnumfiles
= int(listcatfiles
['fnumfiles']);
7260 lcfx
= int(listcatfiles
['fnumfiles']);
7261 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
7262 lcfx
= int(lenlist
);
7264 lcfx
= int(listcatfiles
['fnumfiles']);
7267 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
7269 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
7271 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' } };
7272 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
7273 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
7274 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7275 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
7276 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
7277 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
7278 if(len(fuprint
)<=0):
7279 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
7280 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
7281 if(len(fgprint
)<=0):
7282 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
7283 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
));
7286 return listcatfiles
['catfp'];
7290 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
7292 def ArchiveFileStringListFiles(catstr
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7293 catfp
= BytesIO(catstr
);
7294 listcatfiles
= ArchiveFileListFiles(catstr
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7295 return listcatfiles
;
7297 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileStringListFiles
);
7299 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
7300 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7303 if(hasattr(sys
.stdin
, "buffer")):
7304 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7306 shutil
.copyfileobj(sys
.stdin
, infile
);
7311 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7312 infile
= download_file_from_internet_file(infile
);
7317 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7319 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
7321 if(not tarfile
.is_tarfile(infile
)):
7323 except AttributeError:
7324 if(not is_tarfile(infile
)):
7329 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
7330 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
7332 tarfp
= tarfile
.open(infile
, "r");
7333 except FileNotFoundError
:
7337 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
7338 returnval
.update({lcfi
: member
.name
});
7339 fpremode
= member
.mode
;
7340 ffullmode
= member
.mode
;
7344 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7346 elif(member
.isdev()):
7347 ffullmode
= member
.mode
;
7349 elif(member
.islnk()):
7350 ffullmode
= member
.mode
+ stat
.S_IFREG
;
7352 elif(member
.issym()):
7353 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
7355 elif(member
.ischr()):
7356 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
7358 elif(member
.isblk()):
7359 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
7361 elif(member
.isdir()):
7362 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
7364 elif(member
.isfifo()):
7365 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
7367 elif(member
.issparse()):
7368 ffullmode
= member
.mode
;
7371 VerbosePrintOut(member
.name
);
7373 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' } };
7374 printfname
= member
.name
;
7376 printfname
= member
.name
+ " link to " + member
.linkname
;
7377 elif(member
.issym()):
7378 printfname
= member
.name
+ " -> " + member
.linkname
;
7379 fuprint
= member
.uname
;
7380 if(len(fuprint
)<=0):
7381 fuprint
= member
.uid
;
7382 fgprint
= member
.gname
;
7383 if(len(fgprint
)<=0):
7384 fgprint
= member
.gid
;
7385 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
));
7388 return listcatfiles
['catfp'];
7392 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7393 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7396 if(hasattr(sys
.stdin
, "buffer")):
7397 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
7399 shutil
.copyfileobj(sys
.stdin
, infile
);
7404 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
7405 infile
= download_file_from_internet_file(infile
);
7410 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7414 if(not zipfile
.is_zipfile(infile
)):
7417 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
7418 except FileNotFoundError
:
7422 ziptest
= zipfp
.testzip();
7424 VerbosePrintOut("Bad file found!");
7425 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
7426 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
7427 fwinattributes
= int(zipinfo
.external_attr
);
7428 if(not member
.is_dir()):
7429 fmode
= int(stat
.S_IFREG
+ 438);
7430 fchmode
= int(stat
.S_IMODE(fmode
));
7431 ftypemod
= int(stat
.S_IFMT(fmode
));
7432 elif(member
.is_dir()):
7433 fmode
= int(stat
.S_IFDIR
+ 511);
7434 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7435 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7436 elif(zipinfo
.create_system
==3):
7437 fwinattributes
=int(0);
7438 fmode
= int(zipinfo
.external_attr
);
7439 fchmode
= int(stat
.S_IMODE(fmode
));
7440 ftypemod
= int(stat
.S_IFMT(fmode
));
7442 fwinattributes
= int(0);
7443 if(not member
.is_dir()):
7444 fmode
= int(stat
.S_IFREG
+ 438);
7445 fchmode
= int(stat
.S_IMODE(fmode
));
7446 ftypemod
= int(stat
.S_IFMT(fmode
));
7447 elif(member
.is_dir()):
7448 fmode
= int(stat
.S_IFDIR
+ 511);
7449 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7450 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7451 returnval
.update({lcfi
: member
.filename
});
7453 VerbosePrintOut(member
.filename
);
7455 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' } };
7457 for fmodval
in str(oct(fmode
))[-3:]:
7458 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7459 if(not member
.is_dir()):
7461 permissionstr
= "-" + permissionstr
;
7462 elif(member
.is_dir()):
7464 permissionstr
= "d" + permissionstr
;
7465 printfname
= member
.filename
;
7467 fuid
= int(os
.getuid());
7468 except AttributeError:
7473 fgid
= int(os
.getgid());
7474 except AttributeError:
7481 userinfo
= pwd
.getpwuid(os
.getuid());
7482 funame
= userinfo
.pw_name
;
7485 except AttributeError:
7493 groupinfo
= grp
.getgrgid(os
.getgid());
7494 fgname
= groupinfo
.gr_name
;
7497 except AttributeError:
7502 if(len(fuprint
)<=0):
7503 fuprint
= str(fuid
);
7505 if(len(fgprint
)<=0):
7506 fgprint
= str(fgid
);
7507 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
));
7510 return listcatfiles
['catfp'];
7514 if(not rarfile_support
):
7515 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7516 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7517 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7520 if(rarfile_support
):
7521 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
7522 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7523 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7525 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
7529 rarfp
= rarfile
.RarFile(infile
, "r");
7530 rartest
= rarfp
.testrar();
7532 VerbosePrintOut("Bad file found!");
7533 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
7536 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
7539 member
.external_attr
7541 except AttributeError:
7543 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
7546 member
.external_attr
7548 except AttributeError:
7553 if(is_unix
and member
.external_attr
!=0):
7554 fpremode
= int(member
.external_attr
);
7555 elif(member
.is_file()):
7556 fpremode
= int(stat
.S_IFREG
+ 438);
7557 elif(member
.is_symlink()):
7558 fpremode
= int(stat
.S_IFLNK
+ 438);
7559 elif(member
.is_dir()):
7560 fpremode
= int(stat
.S_IFDIR
+ 511);
7561 if(is_windows
and member
.external_attr
!=0):
7562 fwinattributes
= int(member
.external_attr
);
7564 fwinattributes
= int(0);
7565 if(is_unix
and member
.external_attr
!=0):
7566 fmode
= int(member
.external_attr
);
7567 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
7568 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
7569 elif(member
.is_file()):
7570 fmode
= int(stat
.S_IFREG
+ 438);
7571 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
7572 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
7573 elif(member
.is_symlink()):
7574 fmode
= int(stat
.S_IFLNK
+ 438);
7575 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7576 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7577 elif(member
.is_dir()):
7578 fmode
= int(stat
.S_IFDIR
+ 511);
7579 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7580 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7581 returnval
.update({lcfi
: member
.filename
});
7583 VerbosePrintOut(member
.filename
);
7585 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' } };
7587 for fmodval
in str(oct(fmode
))[-3:]:
7588 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7589 if(member
.is_file()):
7591 permissionstr
= "-" + permissionstr
;
7592 printfname
= member
.filename
;
7593 elif(member
.is_symlink()):
7595 permissionstr
= "l" + permissionstr
;
7596 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
7597 elif(member
.is_dir()):
7599 permissionstr
= "d" + permissionstr
;
7600 printfname
= member
.filename
;
7602 fuid
= int(os
.getuid());
7603 except AttributeError:
7608 fgid
= int(os
.getgid());
7609 except AttributeError:
7616 userinfo
= pwd
.getpwuid(os
.getuid());
7617 funame
= userinfo
.pw_name
;
7620 except AttributeError:
7628 groupinfo
= grp
.getgrgid(os
.getgid());
7629 fgname
= groupinfo
.gr_name
;
7632 except AttributeError:
7637 if(len(fuprint
)<=0):
7638 fuprint
= str(fuid
);
7640 if(len(fgprint
)<=0):
7641 fgprint
= str(fgid
);
7642 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7645 return listcatfiles
['catfp'];
7649 if(not py7zr_support
):
7650 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7651 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7652 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7656 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
7657 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7658 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
7662 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
7663 file_content
= szpfp
.readall();
7664 #sztest = szpfp.testzip();
7665 sztestalt
= szpfp
.test();
7667 VerbosePrintOut("Bad file found!");
7668 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
7669 if(re
.findall("^[.|/]", member
.filename
)):
7670 fname
= member
.filename
;
7672 fname
= "./"+member
.filename
;
7673 if(not member
.is_directory
):
7674 fpremode
= int(stat
.S_IFREG
+ 438);
7675 elif(member
.is_directory
):
7676 fpremode
= int(stat
.S_IFDIR
+ 511);
7677 fwinattributes
= int(0);
7678 if(member
.is_directory
):
7679 fmode
= int(stat
.S_IFDIR
+ 511);
7680 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
7681 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
7683 fmode
= int(stat
.S_IFLNK
+ 438);
7684 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
7685 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
7686 returnval
.update({lcfi
: member
.filename
});
7688 VerbosePrintOut(member
.filename
);
7690 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' } };
7692 for fmodval
in str(oct(fmode
))[-3:]:
7693 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
7695 if(not member
.is_directory
):
7697 permissionstr
= "-" + permissionstr
;
7698 printfname
= member
.filename
;
7699 elif(member
.is_directory
):
7701 permissionstr
= "d" + permissionstr
;
7702 printfname
= member
.filename
;
7704 fsize
= len(file_content
[member
.filename
].read());
7705 file_content
[member
.filename
].close();
7707 fuid
= int(os
.getuid());
7708 except AttributeError:
7713 fgid
= int(os
.getgid());
7714 except AttributeError:
7721 userinfo
= pwd
.getpwuid(os
.getuid());
7722 funame
= userinfo
.pw_name
;
7725 except AttributeError:
7733 groupinfo
= grp
.getgrgid(os
.getgid());
7734 fgname
= groupinfo
.gr_name
;
7737 except AttributeError:
7742 if(len(fuprint
)<=0):
7743 fuprint
= str(fuid
);
7745 if(len(fgprint
)<=0):
7746 fgprint
= str(fgid
);
7747 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(fsize
).rjust(15) + " " + member
.creationtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
7750 return listcatfiles
['catfp'];
7754 def InFileListFiles(infile
, verbose
=False, formatspecs
=__file_format_list__
, returnfp
=False):
7755 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
7756 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
7757 if(checkcompressfile
=="tarfile"):
7758 return TarFileListFiles(infile
, verbose
, returnfp
);
7759 elif(checkcompressfile
=="zipfile"):
7760 return ZipFileListFiles(infile
, verbose
, returnfp
);
7761 elif(checkcompressfile
=="catfile"):
7762 return ArchiveFileListFiles(infile
, 0, 0, False, formatspecs
, verbose
, returnfp
);
7763 elif(rarfile_support
and checkcompressfile
=="rarfile"):
7764 return RarFileListFiles(infile
, verbose
, returnfp
);
7765 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
7766 return SevenZipFileListFiles(infile
, verbose
, returnfp
);
7771 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):
7772 outarray
= BytesIO();
7773 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
7774 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7775 return listcatfiles
;
7777 def ListDirListFilesAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7778 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
7779 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
7780 return listcatfiles
;
7782 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):
7783 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
7784 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
7785 return listcatfiles
;
7787 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
7789 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7790 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7791 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7792 return listcatfiles
;
7794 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
7796 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7797 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7798 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7799 return listcatfiles
;
7801 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
7803 if(not rarfile_support
):
7804 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7807 if(rarfile_support
):
7808 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7809 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7810 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7811 return listcatfiles
;
7813 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
7815 if(not py7zr_support
):
7816 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7820 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
7821 outarray
= SevenZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
7822 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
7823 return listcatfiles
;
7825 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFileAlt", PackArchiveFileFromSevenZipFileAlt
);
7827 def download_file_from_ftp_file(url
):
7828 urlparts
= urlparse(url
);
7829 file_name
= os
.path
.basename(urlparts
.path
);
7830 file_dir
= os
.path
.dirname(urlparts
.path
);
7831 if(urlparts
.username
is not None):
7832 ftp_username
= urlparts
.username
;
7834 ftp_username
= "anonymous";
7835 if(urlparts
.password
is not None):
7836 ftp_password
= urlparts
.password
;
7837 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7838 ftp_password
= "anonymous";
7841 if(urlparts
.scheme
=="ftp"):
7843 elif(urlparts
.scheme
=="ftps"):
7847 if(urlparts
.scheme
=="sftp"):
7849 return download_file_from_pysftp_file(url
);
7851 return download_file_from_sftp_file(url
);
7852 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7853 return download_file_from_http_file(url
);
7854 ftp_port
= urlparts
.port
;
7855 if(urlparts
.port
is None):
7858 ftp
.connect(urlparts
.hostname
, ftp_port
);
7859 except socket
.gaierror
:
7860 log
.info("Error With URL "+url
);
7862 except socket
.timeout
:
7863 log
.info("Error With URL "+url
);
7865 ftp
.login(urlparts
.username
, urlparts
.password
);
7866 if(urlparts
.scheme
=="ftps"):
7868 ftpfile
= BytesIO();
7869 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
7870 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
7875 def download_file_from_ftp_string(url
):
7876 ftpfile
= download_file_from_ftp_file(url
);
7877 return ftpfile
.read();
7879 def upload_file_to_ftp_file(ftpfile
, url
):
7880 urlparts
= urlparse(url
);
7881 file_name
= os
.path
.basename(urlparts
.path
);
7882 file_dir
= os
.path
.dirname(urlparts
.path
);
7883 if(urlparts
.username
is not None):
7884 ftp_username
= urlparts
.username
;
7886 ftp_username
= "anonymous";
7887 if(urlparts
.password
is not None):
7888 ftp_password
= urlparts
.password
;
7889 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7890 ftp_password
= "anonymous";
7893 if(urlparts
.scheme
=="ftp"):
7895 elif(urlparts
.scheme
=="ftps"):
7899 if(urlparts
.scheme
=="sftp"):
7901 return upload_file_to_pysftp_file(url
);
7903 return upload_file_to_sftp_file(url
);
7904 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7906 ftp_port
= urlparts
.port
;
7907 if(urlparts
.port
is None):
7910 ftp
.connect(urlparts
.hostname
, ftp_port
);
7911 except socket
.gaierror
:
7912 log
.info("Error With URL "+url
);
7914 except socket
.timeout
:
7915 log
.info("Error With URL "+url
);
7917 ftp
.login(urlparts
.username
, urlparts
.password
);
7918 if(urlparts
.scheme
=="ftps"):
7920 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
7925 def upload_file_to_ftp_string(ftpstring
, url
):
7926 ftpfileo
= BytesIO(ftpstring
);
7927 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
7931 def download_file_from_http_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7932 # Parse the URL to extract username and password if present
7933 urlparts
= urlparse(url
);
7934 username
= urlparts
.username
;
7935 password
= urlparts
.password
;
7936 # Rebuild the URL without the username and password
7937 netloc
= urlparts
.hostname
;
7938 if(urlparts
.scheme
=="sftp"):
7940 return download_file_from_pysftp_file(url
);
7942 return download_file_from_sftp_file(url
);
7943 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7944 return download_file_from_ftp_file(url
);
7946 netloc
+= ':' + str(urlparts
.port
);
7947 rebuilt_url
= urlunparse((urlparts
.scheme
, netloc
, urlparts
.path
, urlparts
.params
, urlparts
.query
, urlparts
.fragment
));
7948 # Create a temporary file object
7949 httpfile
= BytesIO();
7951 # Use the requests library if available
7952 if username
and password
:
7953 response
= requests
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
), stream
=True);
7955 response
= requests
.get(rebuilt_url
, headers
=headers
, stream
=True);
7956 response
.raw
.decode_content
= True
7957 shutil
.copyfileobj(response
.raw
, httpfile
);
7959 # Build a Request object for urllib
7960 request
= Request(rebuilt_url
, headers
=headers
);
7961 # Create an opener object for handling URLs
7962 if username
and password
:
7963 # Create a password manager
7964 password_mgr
= HTTPPasswordMgrWithDefaultRealm();
7965 # Add the username and password
7966 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
7967 # Create an authentication handler using the password manager
7968 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
7969 # Build the opener with the authentication handler
7970 opener
= build_opener(auth_handler
);
7972 opener
= build_opener();
7973 with opener
.open(request
) as response
:
7974 shutil
.copyfileobj(response
, httpfile
);
7975 # Reset file pointer to the start
7976 httpfile
.seek(0, 0);
7977 # Return the temporary file object
7980 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7981 httpfile
= download_file_from_http_file(url
, headers
);
7982 return ftpfile
.read();
7985 def download_file_from_sftp_file(url
):
7986 urlparts
= urlparse(url
);
7987 file_name
= os
.path
.basename(urlparts
.path
);
7988 file_dir
= os
.path
.dirname(urlparts
.path
);
7989 sftp_port
= urlparts
.port
;
7990 if(urlparts
.port
is None):
7993 sftp_port
= urlparts
.port
;
7994 if(urlparts
.username
is not None):
7995 sftp_username
= urlparts
.username
;
7997 sftp_username
= "anonymous";
7998 if(urlparts
.password
is not None):
7999 sftp_password
= urlparts
.password
;
8000 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8001 sftp_password
= "anonymous";
8004 if(urlparts
.scheme
=="ftp"):
8005 return download_file_from_ftp_file(url
);
8006 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8007 return download_file_from_http_file(url
);
8008 if(urlparts
.scheme
!="sftp"):
8010 ssh
= paramiko
.SSHClient();
8011 ssh
.load_system_host_keys();
8012 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
8014 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8015 except paramiko
.ssh_exception
.SSHException
:
8017 except socket
.gaierror
:
8018 log
.info("Error With URL "+url
);
8020 except socket
.timeout
:
8021 log
.info("Error With URL "+url
);
8023 sftp
= ssh
.open_sftp();
8024 sftpfile
= BytesIO();
8025 sftp
.getfo(urlparts
.path
, sftpfile
);
8028 sftpfile
.seek(0, 0);
8031 def download_file_from_sftp_file(url
):
8035 def download_file_from_sftp_string(url
):
8036 sftpfile
= download_file_from_sftp_file(url
);
8037 return sftpfile
.read();
8039 def download_file_from_ftp_string(url
):
8043 def upload_file_to_sftp_file(sftpfile
, url
):
8044 urlparts
= urlparse(url
);
8045 file_name
= os
.path
.basename(urlparts
.path
);
8046 file_dir
= os
.path
.dirname(urlparts
.path
);
8047 sftp_port
= urlparts
.port
;
8048 if(urlparts
.port
is None):
8051 sftp_port
= urlparts
.port
;
8052 if(urlparts
.username
is not None):
8053 sftp_username
= urlparts
.username
;
8055 sftp_username
= "anonymous";
8056 if(urlparts
.password
is not None):
8057 sftp_password
= urlparts
.password
;
8058 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8059 sftp_password
= "anonymous";
8062 if(urlparts
.scheme
=="ftp"):
8063 return upload_file_to_ftp_file(url
);
8064 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8066 if(urlparts
.scheme
!="sftp"):
8068 ssh
= paramiko
.SSHClient();
8069 ssh
.load_system_host_keys();
8070 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
8072 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8073 except paramiko
.ssh_exception
.SSHException
:
8075 except socket
.gaierror
:
8076 log
.info("Error With URL "+url
);
8078 except socket
.timeout
:
8079 log
.info("Error With URL "+url
);
8081 sftp
= ssh
.open_sftp();
8082 sftp
.putfo(sftpfile
, urlparts
.path
);
8085 sftpfile
.seek(0, 0);
8088 def upload_file_to_sftp_file(sftpfile
, url
):
8092 def upload_file_to_sftp_string(sftpstring
, url
):
8093 sftpfileo
= BytesIO(sftpstring
);
8094 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
8098 def upload_file_to_sftp_string(url
):
8102 def download_file_from_pysftp_file(url
):
8103 urlparts
= urlparse(url
);
8104 file_name
= os
.path
.basename(urlparts
.path
);
8105 file_dir
= os
.path
.dirname(urlparts
.path
);
8106 sftp_port
= urlparts
.port
;
8107 if(urlparts
.port
is None):
8110 sftp_port
= urlparts
.port
;
8111 if(urlparts
.username
is not None):
8112 sftp_username
= urlparts
.username
;
8114 sftp_username
= "anonymous";
8115 if(urlparts
.password
is not None):
8116 sftp_password
= urlparts
.password
;
8117 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8118 sftp_password
= "anonymous";
8121 if(urlparts
.scheme
=="ftp"):
8122 return download_file_from_ftp_file(url
);
8123 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8124 return download_file_from_http_file(url
);
8125 if(urlparts
.scheme
!="sftp"):
8128 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8129 except paramiko
.ssh_exception
.SSHException
:
8131 except socket
.gaierror
:
8132 log
.info("Error With URL "+url
);
8134 except socket
.timeout
:
8135 log
.info("Error With URL "+url
);
8137 sftp
= ssh
.open_sftp();
8138 sftpfile
= BytesIO();
8139 sftp
.getfo(urlparts
.path
, sftpfile
);
8142 sftpfile
.seek(0, 0);
8145 def download_file_from_pysftp_file(url
):
8149 def download_file_from_pysftp_string(url
):
8150 sftpfile
= download_file_from_pysftp_file(url
);
8151 return sftpfile
.read();
8153 def download_file_from_ftp_string(url
):
8157 def upload_file_to_pysftp_file(sftpfile
, url
):
8158 urlparts
= urlparse(url
);
8159 file_name
= os
.path
.basename(urlparts
.path
);
8160 file_dir
= os
.path
.dirname(urlparts
.path
);
8161 sftp_port
= urlparts
.port
;
8162 if(urlparts
.port
is None):
8165 sftp_port
= urlparts
.port
;
8166 if(urlparts
.username
is not None):
8167 sftp_username
= urlparts
.username
;
8169 sftp_username
= "anonymous";
8170 if(urlparts
.password
is not None):
8171 sftp_password
= urlparts
.password
;
8172 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
8173 sftp_password
= "anonymous";
8176 if(urlparts
.scheme
=="ftp"):
8177 return upload_file_to_ftp_file(url
);
8178 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8180 if(urlparts
.scheme
!="sftp"):
8183 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
8184 except paramiko
.ssh_exception
.SSHException
:
8186 except socket
.gaierror
:
8187 log
.info("Error With URL "+url
);
8189 except socket
.timeout
:
8190 log
.info("Error With URL "+url
);
8192 sftp
= ssh
.open_sftp();
8193 sftp
.putfo(sftpfile
, urlparts
.path
);
8196 sftpfile
.seek(0, 0);
8199 def upload_file_to_pysftp_file(sftpfile
, url
):
8203 def upload_file_to_pysftp_string(sftpstring
, url
):
8204 sftpfileo
= BytesIO(sftpstring
);
8205 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
8209 def upload_file_to_pysftp_string(url
):
8212 def download_file_from_internet_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
8213 urlparts
= urlparse(url
);
8214 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8215 return download_file_from_http_file(url
, headers
);
8216 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8217 return download_file_from_ftp_file(url
);
8218 elif(urlparts
.scheme
=="sftp"):
8219 if(__use_pysftp__
and havepysftp
):
8220 return download_file_from_pysftp_file(url
);
8222 return download_file_from_sftp_file(url
);
8227 def download_file_from_internet_uncompress_file(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_list__
):
8228 fp
= download_file_from_internet_file(url
);
8229 fp
= UncompressArchiveFile(fp
, formatspecs
);
8235 def download_file_from_internet_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
8236 urlparts
= urlparse(url
);
8237 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8238 return download_file_from_http_string(url
, headers
);
8239 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8240 return download_file_from_ftp_string(url
);
8241 elif(urlparts
.scheme
=="sftp"):
8242 if(__use_pysftp__
and havepysftp
):
8243 return download_file_from_pysftp_string(url
);
8245 return download_file_from_sftp_string(url
);
8250 def download_file_from_internet_uncompress_string(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_list__
):
8251 fp
= download_file_from_internet_string(url
);
8252 fp
= UncompressArchiveFile(fp
, formatspecs
);
8258 def upload_file_to_internet_file(ifp
, url
):
8259 urlparts
= urlparse(url
);
8260 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8262 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8263 return upload_file_to_ftp_file(ifp
, url
);
8264 elif(urlparts
.scheme
=="sftp"):
8265 if(__use_pysftp__
and havepysftp
):
8266 return upload_file_to_pysftp_file(ifp
, url
);
8268 return upload_file_to_sftp_file(ifp
, url
);
8273 def upload_file_to_internet_compress_file(ifp
, url
, formatspecs
=__file_format_list__
):
8274 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
8278 upload_file_to_internet_file(catfp
, outfile
);
8281 def upload_file_to_internet_string(ifp
, url
):
8282 urlparts
= urlparse(url
);
8283 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
8285 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
8286 return upload_file_to_ftp_string(ifp
, url
);
8287 elif(urlparts
.scheme
=="sftp"):
8288 if(__use_pysftp__
and havepysftp
):
8289 return upload_file_to_pysftp_string(ifp
, url
);
8291 return upload_file_to_sftp_string(ifp
, url
);
8296 def upload_file_to_internet_compress_string(ifp
, url
, formatspecs
=__file_format_list__
):
8297 catfp
= CompressArchiveFile(BytesIO(ifp
), compression
, formatspecs
);
8301 upload_file_to_internet_file(catfp
, outfile
);
8305 if(hasattr(shutil
, "register_archive_format")):
8306 # Register the packing format
8307 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
8308 except shutil
.RegistryError
:
8312 if(hasattr(shutil
, "register_unpack_format")):
8313 # Register the unpacking format
8314 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
8315 except shutil
.RegistryError
: