2 # -*- coding: utf-8 -*-
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the Revised BSD License.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 Revised BSD License for more details.
13 Copyright 2018-2024 Cool Dude 2k - http://idb.berlios.de/
14 Copyright 2018-2024 Game Maker 2k - http://intdb.sourceforge.net/
15 Copyright 2018-2024 Kazuki Przyborowski - https://github.com/KazukiPrzyborowski
17 $FileInfo: pycatfile.py - Last Update: 5/1/2024 Ver. 0.9.4 RC 1 - Author: cooldude2k $
20 from __future__
import absolute_import
, division
, print_function
, unicode_literals
;
21 import io
, os
, re
, sys
, time
, stat
, zlib
, base64
, shutil
, socket
, hashlib
, datetime
, logging
, binascii
, 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, 4, "RC 1", 1);
178 __version_date_info__
= (2024, 5, 1, "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
= BytesIO();
631 if(fsize
>0 and not listonly
):
632 fcontents
.write(fp
.read(fsize
));
633 elif(fsize
>0 and listonly
):
635 fcontents
.seek(0, 0);
636 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
637 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
638 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
641 fcontentend
= fp
.tell() - 1;
642 HeaderOut
.append(fcontents
);
645 def ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
646 delimiter
= formatspecs
[5];
647 fheaderstart
= fp
.tell();
649 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
651 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
652 if(len(HeaderOut
)==0):
654 fheadsize
= int(HeaderOut
[0], 16);
655 fnumfields
= int(HeaderOut
[1], 16);
656 ftype
= int(HeaderOut
[2], 16);
657 if(re
.findall("^[.|/]", HeaderOut
[3])):
658 fname
= HeaderOut
[3];
660 fname
= "./"+HeaderOut
[3];
661 fbasedir
= os
.path
.dirname(fname
);
662 flinkname
= HeaderOut
[4];
663 fsize
= int(HeaderOut
[5], 16);
664 fatime
= int(HeaderOut
[6], 16);
665 fmtime
= int(HeaderOut
[7], 16);
666 fctime
= int(HeaderOut
[8], 16);
667 fbtime
= int(HeaderOut
[9], 16);
668 fmode
= int(HeaderOut
[10], 16);
669 fchmode
= stat
.S_IMODE(fmode
);
670 ftypemod
= stat
.S_IFMT(fmode
);
671 fwinattributes
= int(HeaderOut
[11], 16);
672 fuid
= int(HeaderOut
[12], 16);
673 funame
= HeaderOut
[13];
674 fgid
= int(HeaderOut
[14], 16);
675 fgname
= HeaderOut
[15];
676 fid
= int(HeaderOut
[16], 16);
677 finode
= int(HeaderOut
[17], 16);
678 flinkcount
= int(HeaderOut
[18], 16);
679 fdev_minor
= int(HeaderOut
[19], 16);
680 fdev_major
= int(HeaderOut
[20], 16);
681 frdev_minor
= int(HeaderOut
[21], 16);
682 frdev_major
= int(HeaderOut
[22], 16);
683 fextrasize
= int(HeaderOut
[23], 16);
684 fextrafields
= int(HeaderOut
[24], 16);
685 extrafieldslist
= [];
687 extraend
= extrastart
+ fextrafields
;
688 extrafieldslist
= [];
689 if(extrastart
<extraend
):
690 extrafieldslist
.append(HeaderOut
[extrastart
]);
691 extrastart
= extrastart
+ 1;
692 fchecksumtype
= HeaderOut
[extrastart
].lower();
693 fcs
= HeaderOut
[extrastart
+ 1].lower();
694 fccs
= HeaderOut
[extrastart
+ 2].lower();
695 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
696 if(fcs
!=newfcs
and not skipchecksum
):
697 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
699 fhend
= fp
.tell() - 1;
700 fcontentstart
= fp
.tell();
701 fcontents
= BytesIO();
702 pyhascontents
= False;
703 if(fsize
>0 and not listonly
):
704 fcontents
.write(fp
.read(catfsize
));
705 pyhascontents
= True;
706 elif(fsize
>0 and listonly
):
708 pyhascontents
= False;
709 fcontents
.seek(0, 0);
710 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
711 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
712 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
715 fcontentend
= fp
.tell() - 1;
716 fcontents
.seek(0, 0);
717 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
};
720 def ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
721 delimiter
= formatspecs
[5];
722 fheaderstart
= fp
.tell();
724 HeaderOut
= ReadFileHeaderDataBySize(fp
, delimiter
);
726 HeaderOut
= ReadFileHeaderDataWoSize(fp
, delimiter
);
727 if(len(HeaderOut
)==0):
729 fheadsize
= int(HeaderOut
[0], 16);
730 fnumfields
= int(HeaderOut
[1], 16);
731 ftype
= int(HeaderOut
[2], 16);
732 if(re
.findall("^[.|/]", HeaderOut
[3])):
733 fname
= HeaderOut
[3];
735 fname
= "./"+HeaderOut
[3];
736 fbasedir
= os
.path
.dirname(fname
);
737 flinkname
= HeaderOut
[4];
738 fsize
= int(HeaderOut
[5], 16);
739 fatime
= int(HeaderOut
[6], 16);
740 fmtime
= int(HeaderOut
[7], 16);
741 fctime
= int(HeaderOut
[8], 16);
742 fbtime
= int(HeaderOut
[9], 16);
743 fmode
= int(HeaderOut
[10], 16);
744 fchmode
= stat
.S_IMODE(fmode
);
745 ftypemod
= stat
.S_IFMT(fmode
);
746 fwinattributes
= int(HeaderOut
[11], 16);
747 fuid
= int(HeaderOut
[12], 16);
748 funame
= HeaderOut
[13];
749 fgid
= int(HeaderOut
[14], 16);
750 fgname
= HeaderOut
[15];
751 fid
= int(HeaderOut
[16], 16);
752 finode
= int(HeaderOut
[17], 16);
753 flinkcount
= int(HeaderOut
[18], 16);
754 fdev_minor
= int(HeaderOut
[19], 16);
755 fdev_major
= int(HeaderOut
[20], 16);
756 frdev_minor
= int(HeaderOut
[21], 16);
757 frdev_major
= int(HeaderOut
[22], 16);
758 fextrasize
= int(HeaderOut
[23], 16);
759 fextrafields
= int(HeaderOut
[24], 16);
760 extrafieldslist
= [];
762 extraend
= extrastart
+ fextrafields
;
763 extrafieldslist
= [];
764 if(extrastart
<extraend
):
765 extrafieldslist
.append(HeaderOut
[extrastart
]);
766 extrastart
= extrastart
+ 1;
767 fchecksumtype
= HeaderOut
[extrastart
].lower();
768 fcs
= HeaderOut
[extrastart
+ 1].lower();
769 fccs
= HeaderOut
[extrastart
+ 2].lower();
770 newfcs
= GetHeaderChecksum(HeaderOut
[:-2], HeaderOut
[-3].lower(), True, formatspecs
);
771 if(fcs
!=newfcs
and not skipchecksum
):
772 VerbosePrintOut("File Header Checksum Error with file " + fname
+ " at offset " + str(fheaderstart
));
774 fhend
= fp
.tell() - 1;
775 fcontentstart
= fp
.tell();
776 fcontents
= BytesIO();
777 pyhascontents
= False;
778 if(fsize
>0 and not listonly
):
779 fcontents
.write(fp
.read(fsize
));
780 pyhascontents
= True;
781 elif(fsize
>0 and listonly
):
783 pyhascontents
= False;
784 fcontents
.seek(0, 0);
785 newfccs
= GetFileChecksum(fcontents
.read(), HeaderOut
[-3].lower(), False, formatspecs
);
786 if(fccs
!=newfccs
and not skipchecksum
and not listonly
):
787 VerbosePrintOut("File Content Checksum Error with file " + fname
+ " at offset " + str(fcontentstart
));
790 fcontentend
= fp
.tell() - 1;
791 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
];
794 def ReadFileDataBySizeWithContent(fp
, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
795 delimiter
= formatspecs
[5];
799 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
802 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
803 if(not headercheck
and not skipchecksum
):
804 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
806 fnumfiles
= int(catheader
[1], 16);
809 while(countnum
< fnumfiles
):
810 HeaderOut
= ReadFileHeaderDataBySizeWithContent(fp
, listonly
, skipchecksum
, formatspecs
)
811 if(len(HeaderOut
)==0):
813 flist
.append(HeaderOut
);
814 countnum
= countnum
+ 1;
817 def ReadFileDataBySizeWithContentToArray(fp
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
818 delimiter
= formatspecs
[5];
822 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
825 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
826 if(not headercheck
and not skipchecksum
):
827 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
829 catstring
= catheader
[0];
830 catversion
= re
.findall(r
"([\d]+)$", catstring
);
831 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
832 fprenumfiles
= catheader
[1];
833 fnumfiles
= int(fprenumfiles
, 16);
834 fprechecksumtype
= catheader
[2];
835 fprechecksum
= catheader
[3];
836 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
837 if(seekstart
<0 and seekstart
>fnumfiles
):
839 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
841 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
842 seekend
= fnumfiles
- abs(seekend
);
845 while(il
< seekstart
):
846 prefhstart
= fp
.tell();
847 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
[5]);
848 if(len(preheaderdata
)==0):
850 prefsize
= int(preheaderdata
[5], 16);
851 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-3].lower(), True, formatspecs
);
852 prefcs
= preheaderdata
[-2];
853 if(prefcs
!=prenewfcs
and not skipchecksum
):
854 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
856 valid_archive
= False;
857 invalid_archive
= True;
858 prefhend
= fp
.tell() - 1;
859 prefcontentstart
= fp
.tell();
860 prefcontents
= BytesIO();
861 pyhascontents
= False;
863 prefcontents
.write(fp
.read(prefsize
));
864 prefcontents
.seek(0, 0);
865 prenewfccs
= GetFileChecksum(prefcontents
.read(), preheaderdata
[-3].lower(), False, formatspecs
);
866 prefccs
= preheaderdata
[-1];
867 pyhascontents
= True;
868 if(prefccs
!=prenewfccs
and not skipchecksum
):
869 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
874 countnum
= seekstart
;
875 while(countnum
< seekend
):
876 catlist
['ffilelist'].update({realidnum
: {'fid': realidnum
, 'fidalt': realidnum
}});
877 HeaderOut
= ReadFileHeaderDataBySizeWithContentToArray(fp
, listonly
, skipchecksum
, formatspecs
);
880 catlist
['ffilelist'][realidnum
].update(HeaderOut
);
881 countnum
= countnum
+ 1;
882 realidnum
= realidnum
+ 1;
885 def ReadFileDataBySizeWithContentToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
886 if(isinstance(infile
, dict)):
887 listcatfiles
= infile
;
889 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
891 listcatfiles
= ReadFileDataBySizeWithContentToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
);
892 if(not listcatfiles
):
894 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': {}}}};
895 lenlist
= len(listcatfiles
['ffilelist']);
897 lcfx
= int(listcatfiles
['fnumfiles']);
898 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
901 lcfx
= int(listcatfiles
['fnumfiles']);
903 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
904 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
905 catarray
['filetoid'].update(filetoidarray
);
906 catarray
['idtofile'].update(idtofilearray
);
907 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
908 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
909 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
910 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
911 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
912 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
913 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
914 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
915 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
916 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
917 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
918 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
919 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
920 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
921 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
922 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
923 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
924 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
925 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
926 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
927 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
928 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
929 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
930 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
931 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
932 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
933 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
934 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
935 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
936 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
937 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
941 def ReadFileDataBySizeWithContentToList(fp
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
942 delimiter
= formatspecs
[5];
946 catheader
= ReadFileHeaderData(fp
, 4, delimiter
);
949 headercheck
= ValidateHeaderChecksum(catheader
[:-1], catheader
[2], catheader
[3], formatspecs
);
950 if(not headercheck
and not skipchecksum
):
951 VerbosePrintOut("File Header Checksum Error with file at offset " + str(0));
953 catstring
= catheader
[0];
954 catversion
= re
.findall(r
"([\d]+)$", catstring
);
955 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
956 fprenumfiles
= catheader
[1];
957 fnumfiles
= int(fprenumfiles
, 16);
958 fprechecksumtype
= catheader
[2];
959 fprechecksum
= catheader
[3];
961 if(seekstart
<0 and seekstart
>fnumfiles
):
963 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
965 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
966 seekend
= fnumfiles
- abs(seekend
);
969 while(il
< seekstart
):
970 prefhstart
= fp
.tell();
971 preheaderdata
= ReadFileHeaderDataBySize(fp
, formatspecs
[5]);
972 if(len(preheaderdata
)==0):
974 prefsize
= int(preheaderdata
[5], 16);
975 prenewfcs
= GetHeaderChecksum(preheaderdata
[:-2], preheaderdata
[-3].lower(), True, formatspecs
);
976 prefcs
= preheaderdata
[-2];
977 if(prefcs
!=prenewfcs
and not skipchecksum
):
978 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
980 valid_archive
= False;
981 invalid_archive
= True;
982 prefhend
= fp
.tell() - 1;
983 prefcontentstart
= fp
.tell();
985 pyhascontents
= False;
987 prefcontents
= fp
.read(prefsize
);
988 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
989 prefccs
= preheaderdata
[-1];
990 pyhascontents
= True;
991 if(prefccs
!=prenewfccs
and not skipchecksum
):
992 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
997 countnum
= seekstart
;
998 while(countnum
< seekend
):
999 HeaderOut
= ReadFileHeaderDataBySizeWithContentToList(fp
, listonly
, skipchecksum
, formatspecs
);
1002 catlist
.append(HeaderOut
);
1003 countnum
= countnum
+ 1;
1004 realidnum
= realidnum
+ 1;
1007 def ReadInFileBySizeWithContentToArray(infile
, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
1008 delimiter
= formatspecs
[5];
1009 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1012 fp
= UncompressArchiveFile(fp
, formatspecs
);
1013 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1014 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
1021 if(hasattr(sys
.stdin
, "buffer")):
1022 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1024 shutil
.copyfileobj(sys
.stdin
, fp
);
1026 fp
= UncompressArchiveFile(fp
, formatspecs
);
1030 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1031 fp
= download_file_from_internet_file(infile
);
1032 fp
= UncompressArchiveFile(fp
, formatspecs
);
1038 infile
= RemoveWindowsPath(infile
);
1039 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
1040 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
1042 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1043 if(not compresscheck
):
1044 fextname
= os
.path
.splitext(infile
)[1];
1045 if(fextname
==".gz"):
1046 compresscheck
= "gzip";
1047 elif(fextname
==".bz2"):
1048 compresscheck
= "bzip2";
1049 elif(fextname
==".zst"):
1050 compresscheck
= "zstd";
1051 elif(fextname
==".lz4" or fextname
==".clz4"):
1052 compresscheck
= "lz4";
1053 elif(fextname
==".lzo" or fextname
==".lzop"):
1054 compresscheck
= "lzo";
1055 elif(fextname
==".lzma" or fextname
==".xz"):
1056 compresscheck
= "lzma";
1059 if(not compresscheck
):
1061 fp
= UncompressFile(infile
, formatspecs
, "rb");
1062 return ReadFileDataBySizeWithContentToArray(fp
, listonly
, skipchecksum
, formatspecs
);
1064 def ReadInFileBySizeWithContentToList(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
1065 delimiter
= formatspecs
[5];
1066 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1069 fp
= UncompressArchiveFile(fp
, formatspecs
);
1070 checkcompressfile
= CheckCompressionSubType(fp
, formatspecs
, True);
1071 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
1078 if(hasattr(sys
.stdin
, "buffer")):
1079 shutil
.copyfileobj(sys
.stdin
.buffer, fp
);
1081 shutil
.copyfileobj(sys
.stdin
, fp
);
1083 fp
= UncompressArchiveFile(fp
, formatspecs
);
1087 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
1088 fp
= download_file_from_internet_file(infile
);
1089 fp
= UncompressArchiveFile(fp
, formatspecs
);
1095 infile
= RemoveWindowsPath(infile
);
1096 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
1097 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
1099 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
1100 if(not compresscheck
):
1101 fextname
= os
.path
.splitext(infile
)[1];
1102 if(fextname
==".gz"):
1103 compresscheck
= "gzip";
1104 elif(fextname
==".bz2"):
1105 compresscheck
= "bzip2";
1106 elif(fextname
==".zst"):
1107 compresscheck
= "zstd";
1108 elif(fextname
==".lz4" or fextname
==".clz4"):
1109 compresscheck
= "lz4";
1110 elif(fextname
==".lzo" or fextname
==".lzop"):
1111 compresscheck
= "lzo";
1112 elif(fextname
==".lzma" or fextname
==".xz"):
1113 compresscheck
= "lzma";
1116 if(not compresscheck
):
1118 fp
= UncompressFile(infile
, formatspecs
, "rb");
1119 return ReadFileDataBySizeWithContentToList(fp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
);
1121 def ReadInFileBySizeWithContentToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
):
1122 if(isinstance(infile
, dict)):
1123 listcatfiles
= infile
;
1125 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
1126 infile
= RemoveWindowsPath(infile
);
1127 listcatfiles
= ReadInFileBySizeWithContentToArray(infile
, listonly
, skipchecksum
, formatspecs
);
1128 if(not listcatfiles
):
1130 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': {}}}};
1131 lenlist
= len(listcatfiles
['ffilelist']);
1133 lcfx
= int(listcatfiles
['fnumfiles']);
1134 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
1135 lcfx
= int(lenlist
);
1137 lcfx
= int(listcatfiles
['fnumfiles']);
1139 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
1140 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
1141 catarray
['filetoid'].update(filetoidarray
);
1142 catarray
['idtofile'].update(idtofilearray
);
1143 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
1144 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
1145 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
1146 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
1147 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
1148 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
1149 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1150 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1151 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
1152 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1153 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1154 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
1155 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
1156 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
1157 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
1158 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
1159 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1160 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1161 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
1162 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
1163 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
1164 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1165 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1166 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
1167 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
1168 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
1169 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
1170 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
1171 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
1172 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
1173 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
1177 def AppendNullByte(indata
, delimiter
=__file_format_delimiter__
):
1178 outdata
= str(indata
) + delimiter
;
1181 def AppendNullBytes(indata
=[], delimiter
=__file_format_delimiter__
):
1186 outdata
= outdata
+ AppendNullByte(indata
[inum
], delimiter
);
1190 def AppendFileHeader(fp
, numfiles
, checksumtype
="crc32", formatspecs
=__file_format_list__
):
1191 delimiter
= formatspecs
[5];
1192 catver
= formatspecs
[6];
1193 fileheaderver
= str(int(catver
.replace(".", "")));
1194 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
1195 fp
.write(fileheader
.encode('UTF-8'));
1196 fnumfiles
= format(int(numfiles
), 'x').lower();
1197 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
1198 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
1199 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
1200 fp
.write(fnumfilesa
.encode('UTF-8'));
1203 os
.fsync(fp
.fileno());
1204 except io
.UnsupportedOperation
:
1206 except AttributeError:
1210 def MakeEmptyFilePointer(fp
, checksumtype
="crc32", formatspecs
=__file_format_list__
):
1211 AppendFileHeader(fp
, 0, checksumtype
, formatspecs
);
1214 def MakeEmptyFile(outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", formatspecs
=__file_format_list__
, returnfp
=False):
1215 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1216 if(os
.path
.exists(outfile
)):
1220 catfpfp
= BytesIO();
1221 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1223 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1226 fbasename
= os
.path
.splitext(outfile
)[0];
1227 fextname
= os
.path
.splitext(outfile
)[1];
1228 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1229 catfp
= AppendFileHeader(catfp
, 0, checksumtype
, formatspecs
);
1230 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1231 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1234 os
.fsync(catfp
.fileno());
1235 except io
.UnsupportedOperation
:
1237 except AttributeError:
1241 if(hasattr(sys
.stdout
, "buffer")):
1242 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1244 shutil
.copyfileobj(catfp
, sys
.stdout
);
1245 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1246 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1248 upload_file_to_internet_file(catfp
, outfile
);
1256 def AppendFileHeaderWithContent(fp
, filevalues
=[], extradata
=[], filecontent
="", checksumtype
="crc32", formatspecs
=__file_format_list__
):
1257 extrafields
= format(len(extradata
), 'x').lower();
1258 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
1259 if(len(extradata
)>0):
1260 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1261 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1262 catoutlen
= len(filevalues
) + len(extradata
) + 5;
1263 catoutlenhex
= format(catoutlen
, 'x').lower();
1264 catoutlist
= filevalues
;
1265 catoutlist
.insert(0, catoutlenhex
);
1266 catoutlist
.append(extrasizelen
);
1267 catoutlist
.append(extrafields
);
1268 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
1269 if(len(extradata
)>0):
1270 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1271 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
1272 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1273 catfilecontentcshex
= GetFileChecksum(filecontent
, checksumtype
, False, formatspecs
);
1274 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1275 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
1276 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
1277 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
1278 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1279 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1280 nullstrecd
= formatspecs
[5].encode('UTF-8');
1281 catfileout
= catfileoutstrecd
+ filecontent
+ nullstrecd
;
1282 fp
.write(catfileout
);
1285 os
.fsync(fp
.fileno());
1286 except io
.UnsupportedOperation
:
1288 except AttributeError:
1292 def AppendFilesWithContent(infiles
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False):
1293 advancedlist
= formatspecs
[8];
1294 altinode
= formatspecs
[9];
1296 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1298 for line
in sys
.stdin
:
1299 infilelist
.append(line
.strip());
1300 infilelist
= list(filter(None, infilelist
));
1301 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
1302 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
1304 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
1305 for line
in finfile
:
1306 infilelist
.append(line
.strip());
1307 infilelist
= list(filter(None, infilelist
));
1309 if(isinstance(infiles
, (list, tuple, ))):
1310 infilelist
= list(filter(None, infiles
));
1311 elif(isinstance(infiles
, (str, ))):
1312 infilelist
= list(filter(None, [infiles
]));
1314 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
1316 GetDirList
= ListDir(infilelist
, followlink
, False);
1324 inodetocatinode
= {};
1325 numfiles
= int(len(GetDirList
));
1326 fnumfiles
= format(numfiles
, 'x').lower();
1327 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1328 for curfname
in GetDirList
:
1329 catfhstart
= fp
.tell();
1330 if(re
.findall("^[.|/]", curfname
)):
1333 fname
= "./"+curfname
;
1335 VerbosePrintOut(fname
);
1336 if(not followlink
or followlink
is None):
1337 fstatinfo
= os
.lstat(fname
);
1339 fstatinfo
= os
.stat(fname
);
1340 fpremode
= fstatinfo
.st_mode
;
1341 finode
= fstatinfo
.st_ino
;
1342 flinkcount
= fstatinfo
.st_nlink
;
1344 if(stat
.S_ISREG(fpremode
)):
1346 elif(stat
.S_ISLNK(fpremode
)):
1348 elif(stat
.S_ISCHR(fpremode
)):
1350 elif(stat
.S_ISBLK(fpremode
)):
1352 elif(stat
.S_ISDIR(fpremode
)):
1354 elif(stat
.S_ISFIFO(fpremode
)):
1356 elif(stat
.S_ISSOCK(fpremode
)):
1358 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
1360 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
1362 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
1367 fcurfid
= format(int(curfid
), 'x').lower();
1368 if(not followlink
and finode
!=0):
1370 if(finode
in inodelist
):
1372 flinkname
= inodetofile
[finode
];
1374 fcurinode
= format(int(finode
), 'x').lower();
1376 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
1377 if(finode
not in inodelist
):
1378 inodelist
.append(finode
);
1379 inodetofile
.update({finode
: fname
});
1380 inodetocatinode
.update({finode
: curinode
});
1382 fcurinode
= format(int(finode
), 'x').lower();
1384 fcurinode
= format(int(curinode
), 'x').lower();
1385 curinode
= curinode
+ 1;
1387 fcurinode
= format(int(curinode
), 'x').lower();
1388 curinode
= curinode
+ 1;
1389 curfid
= curfid
+ 1;
1391 flinkname
= os
.readlink(fname
);
1392 fdev
= fstatinfo
.st_dev
;
1393 getfdev
= GetDevMajorMinor(fdev
);
1394 fdev_minor
= getfdev
[0];
1395 fdev_major
= getfdev
[1];
1396 frdev
= fstatinfo
.st_dev
;
1397 if(hasattr(fstatinfo
, "st_rdev")):
1398 frdev
= fstatinfo
.st_rdev
;
1400 frdev
= fstatinfo
.st_dev
;
1401 getfrdev
= GetDevMajorMinor(frdev
);
1402 frdev_minor
= getfrdev
[0];
1403 frdev_major
= getfrdev
[1];
1404 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1405 fsize
= format(int("0"), 'x').lower();
1406 elif(ftype
==0 or ftype
==7):
1407 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
1409 fsize
= format(int(fstatinfo
.st_size
)).lower();
1410 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
1411 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
1412 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1413 if(hasattr(fstatinfo
, "st_birthtime")):
1414 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
1416 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1417 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
1418 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
1419 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
1420 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
1421 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
1426 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
1427 funame
= userinfo
.pw_name
;
1436 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
1437 fgname
= groupinfo
.gr_name
;
1442 fdev_minor
= format(int(fdev_minor
), 'x').lower();
1443 fdev_major
= format(int(fdev_major
), 'x').lower();
1444 frdev_minor
= format(int(frdev_minor
), 'x').lower();
1445 frdev_major
= format(int(frdev_major
), 'x').lower();
1446 finode
= format(int(finode
), 'x').lower();
1447 flinkcount
= format(int(flinkcount
), 'x').lower();
1448 if(hasattr(fstatinfo
, "st_file_attributes")):
1449 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
1451 fwinattributes
= format(int(0), 'x').lower();
1452 fcontents
= BytesIO();
1454 if(ftype
==0 or ftype
==7):
1455 with
open(fname
, "rb") as fpc
:
1456 shutil
.copyfileobj(fpc
, fcontents
);
1457 if(followlink
and (ftype
==1 or ftype
==2)):
1458 flstatinfo
= os
.stat(flinkname
);
1459 with
open(flinkname
, "rb") as fpc
:
1460 shutil
.copyfileobj(fpc
, fcontents
);
1461 fcontents
.seek(0, 0);
1462 ftypehex
= format(ftype
, 'x').lower();
1463 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
];
1464 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
.read(), checksumtype
, formatspecs
);
1466 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
1470 def AppendListsWithContent(inlist
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False):
1472 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1473 GetDirList
= inlist
;
1481 inodetocatinode
= {};
1482 numfiles
= int(len(GetDirList
));
1483 fnumfiles
= format(numfiles
, 'x').lower();
1484 AppendFileHeader(fp
, fnumfiles
, checksumtype
, formatspecs
);
1485 for curfname
in GetDirList
:
1486 ftype
= format(curfname
[0], 'x').lower();
1487 if(re
.findall("^[.|/]", curfname
[1])):
1488 fname
= curfname
[1];
1490 fname
= "./"+curfname
[1];
1491 fbasedir
= os
.path
.dirname(fname
);
1492 flinkname
= curfname
[2];
1493 fsize
= format(curfname
[3], 'x').lower();
1494 fatime
= format(curfname
[4], 'x').lower();
1495 fmtime
= format(curfname
[5], 'x').lower();
1496 fctime
= format(curfname
[6], 'x').lower();
1497 fbtime
= format(curfname
[7], 'x').lower();
1498 fmode
= format(curfname
[8], 'x').lower();
1499 fwinattributes
= format(curfname
[9], 'x').lower();
1500 fuid
= format(curfname
[10], 'x').lower();
1501 funame
= curfname
[11];
1502 fgid
= format(curfname
[12], 'x').lower();
1503 fgname
= curfname
[13];
1504 fid
= format(curfname
[14], 'x').lower();
1505 finode
= format(curfname
[15], 'x').lower();
1506 flinkcount
= format(curfname
[16], 'x').lower();
1507 fdev_minor
= format(curfname
[17], 'x').lower();
1508 fdev_major
= format(curfname
[18], 'x').lower();
1509 frdev_minor
= format(curfname
[19], 'x').lower();
1510 frdev_major
= format(curfname
[20], 'x').lower();
1511 extradata
= curfname
[21];
1512 fchecksumtype
= curfname
[22];
1513 fcontents
= curfname
[23];
1514 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
];
1515 fp
= AppendFileHeaderWithContent(fp
, catoutlist
, extradata
, fcontents
, checksumtype
, formatspecs
);
1517 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
1521 def AppendInFileWithContent(infile
, fp
, dirlistfromtxt
=False, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False):
1522 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, False, formatspecs
);
1523 return AppendListsWithContent(inlist
, fp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1525 def AppendFilesWithContentToOutFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1526 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1527 if(os
.path
.exists(outfile
)):
1531 catfpfp
= BytesIO();
1532 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1534 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1537 fbasename
= os
.path
.splitext(outfile
)[0];
1538 fextname
= os
.path
.splitext(outfile
)[1];
1539 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1540 catfp
= AppendFilesWithContent(infiles
, catfp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1541 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1542 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1545 os
.fsync(catfp
.fileno());
1546 except io
.UnsupportedOperation
:
1548 except AttributeError:
1552 if(hasattr(sys
.stdout
, "buffer")):
1553 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1555 shutil
.copyfileobj(catfp
, sys
.stdout
);
1556 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1557 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1559 upload_file_to_internet_file(catfp
, outfile
);
1567 def AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1568 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1569 if(os
.path
.exists(outfile
)):
1573 catfpfp
= BytesIO();
1574 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1576 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1579 fbasename
= os
.path
.splitext(outfile
)[0];
1580 fextname
= os
.path
.splitext(outfile
)[1];
1581 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1582 catfp
= AppendListsWithContent(inlist
, catfp
, dirlistfromtxt
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
);
1583 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1584 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1587 os
.fsync(catfp
.fileno());
1588 except io
.UnsupportedOperation
:
1590 except AttributeError:
1594 if(hasattr(sys
.stdout
, "buffer")):
1595 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1597 shutil
.copyfileobj(catfp
, sys
.stdout
);
1598 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
1599 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1601 upload_file_to_internet_file(catfp
, outfile
);
1609 def AppendInFileWithContentToOutFile(infile
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, filevalues
=[], extradata
=[], followlink
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1610 inlist
= ReadInFileBySizeWithContentToList(infile
, 0, 0, False, False, formatspecs
);
1611 return AppendListsWithContentToOutFile(inlist
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, filevalues
, extradata
, followlink
, checksumtype
, formatspecs
, verbose
, returnfp
);
1613 def PrintPermissionString(fchmode
, ftype
):
1614 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' } };
1616 for fmodval
in str(oct(fchmode
))[-3:]:
1617 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
1618 if(ftype
==0 or ftype
==7):
1619 permissionstr
= "-" + permissionstr
;
1621 permissionstr
= "h" + permissionstr
;
1623 permissionstr
= "l" + permissionstr
;
1625 permissionstr
= "c" + permissionstr
;
1627 permissionstr
= "b" + permissionstr
;
1629 permissionstr
= "d" + permissionstr
;
1631 permissionstr
= "f" + permissionstr
;
1633 permissionstr
= "D" + permissionstr
;
1635 permissionstr
= "p" + permissionstr
;
1637 permissionstr
= "w" + permissionstr
;
1639 permissionoutstr
= stat
.filemode(fchmode
);
1640 except AttributeError:
1641 permissionoutstr
= permissionstr
;
1643 permissionoutstr
= permissionstr
;
1644 return permissionoutstr
;
1646 def PrintPermissionStringAlt(fchmode
, ftype
):
1648 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
1649 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
1651 # Translate file mode into permission string
1652 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
1653 # Append file type indicator
1655 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
1656 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
1658 file_type
= type_indicators
.get(ftype
, '-');
1659 permissionstr
= file_type
+ permissionstr
;
1661 permissionoutstr
= stat
.filemode(fchmode
);
1662 except AttributeError:
1663 permissionoutstr
= permissionstr
;
1664 return permissionoutstr
;
1666 def CompressionSupport():
1667 compression_list
= [];
1670 compression_list
.append("gz");
1671 compression_list
.append("gzip");
1676 compression_list
.append("bz2");
1677 compression_list
.append("bzip2");
1682 compression_list
.append("lz4");
1687 compression_list
.append("lzo");
1688 compression_list
.append("lzop");
1693 compression_list
.append("zstd");
1694 compression_list
.append("zstandard");
1699 compression_list
.append("lzma");
1700 compression_list
.append("xz");
1703 return compression_list
;
1705 def CheckCompressionType(infile
, formatspecs
=__file_format_list__
, closefp
=True):
1706 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1710 catfp
= open(infile
, "rb");
1711 except FileNotFoundError
:
1714 prefp
= catfp
.read(2);
1716 if(prefp
==binascii
.unhexlify("1f8b")):
1719 prefp
= catfp
.read(3);
1720 if(prefp
==binascii
.unhexlify("425a68")):
1722 if(prefp
==binascii
.unhexlify("5d0000")):
1725 prefp
= catfp
.read(4);
1726 if(prefp
==binascii
.unhexlify("28b52ffd")):
1728 if(prefp
==binascii
.unhexlify("04224d18")):
1730 if(prefp
==binascii
.unhexlify("504B0304")):
1731 filetype
= "zipfile";
1733 prefp
= catfp
.read(5);
1734 if(prefp
==binascii
.unhexlify("7573746172")):
1735 filetype
= "tarfile";
1737 prefp
= catfp
.read(6);
1738 if(prefp
==binascii
.unhexlify("fd377a585a00")):
1740 if(prefp
==binascii
.unhexlify("377abcaf271c")):
1741 filetype
= "7zipfile";
1743 prefp
= catfp
.read(7);
1744 if(prefp
==binascii
.unhexlify("526172211a0700")):
1745 filetype
= "rarfile";
1746 if(prefp
==binascii
.unhexlify("43617446696c65")):
1747 filetype
= "catfile";
1749 prefp
= catfp
.read(8);
1750 if(prefp
==binascii
.unhexlify("526172211a070100")):
1751 filetype
= "rarfile";
1753 prefp
= catfp
.read(formatspecs
[3]);
1754 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
1755 filetype
= formatspecs
[2];
1757 prefp
= catfp
.read(9);
1758 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
1761 prefp
= catfp
.read(10);
1762 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
1763 filetype
= "tarfile";
1769 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_list__
, closefp
=True):
1771 instringsfile
= BytesIO(instring
);
1773 instringsfile
= BytesIO(instring
.encode("UTF-8"));
1774 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
1776 def GetCompressionMimeType(infile
, formatspecs
=__file_format_list__
):
1777 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
1778 if(compresscheck
=="gzip" or compresscheck
=="gz"):
1779 return archivefile_gzip_mimetype
;
1780 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
1781 return archivefile_bzip2_mimetype
;
1782 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
1783 return archivefile_zstandard_mimetype
;
1784 if(compresscheck
=="lz4"):
1785 return archivefile_lz4_mimetype
;
1786 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
1787 return archivefile_lzop_mimetype
;
1788 if(compresscheck
=="lzma"):
1789 return archivefile_lzma_mimetype
;
1790 if(compresscheck
=="xz"):
1791 return archivefile_xz_mimetype
;
1792 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
[2]):
1793 return archivefile_cat_mimetype
;
1794 if(not compresscheck
):
1798 def UncompressArchiveFile(fp
, formatspecs
=__file_format_list__
):
1799 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
1801 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
1802 if(compresscheck
=="gzip"):
1807 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
1808 if(compresscheck
=="bzip2"):
1814 catfp
.write(bz2
.decompress(fp
.read()));
1815 if(compresscheck
=="zstd"):
1821 catfp
.write(zstandard
.decompress(fp
.read()));
1822 if(compresscheck
=="lz4"):
1828 catfp
.write(lz4
.frame
.decompress(fp
.read()));
1829 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
1835 catfp
.write(lzo
.decompress(fp
.read()));
1836 if(compresscheck
=="lzma" or compresscheck
=="xz"):
1842 catfp
.write(lzma
.decompress(fp
.read()));
1843 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
1845 if(not compresscheck
):
1851 with fp
as fpcontent
:
1853 catfp
.write(lzma
.decompress(fp
.read()));
1854 except lzma
.LZMAError
:
1858 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
1860 def UncompressFile(infile
, formatspecs
=__file_format_list__
, mode
="rb"):
1861 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
1862 if(sys
.version_info
[0]==2 and compresscheck
):
1868 if(compresscheck
=="gzip"):
1874 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
1875 except (ValueError, TypeError) as e
:
1876 filefp
= gzip
.open(infile
, mode
);
1877 if(compresscheck
=="bzip2"):
1883 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
1884 except (ValueError, TypeError) as e
:
1885 filefp
= bz2
.open(infile
, mode
);
1886 if(compresscheck
=="zstd"):
1892 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
1893 except (ValueError, TypeError) as e
:
1894 filefp
= zstandard
.open(infile
, mode
);
1895 if(compresscheck
=="lz4"):
1901 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
1902 except (ValueError, TypeError) as e
:
1903 filefp
= lz4
.frame
.open(infile
, mode
);
1904 if(compresscheck
=="lzo"):
1910 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
1911 except (ValueError, TypeError) as e
:
1912 filefp
= lzo
.open(infile
, mode
);
1913 if(compresscheck
=="lzma"):
1919 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
1920 except (ValueError, TypeError) as e
:
1921 filefp
= lzma
.open(infile
, mode
);
1922 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
1924 filefp
= open(infile
, mode
, encoding
="UTF-8");
1925 except (ValueError, TypeError) as e
:
1926 filefp
= open(infile
, mode
);
1927 if(not compresscheck
):
1929 filefp
= open(infile
, mode
, encoding
="UTF-8");
1930 except (ValueError, TypeError) as e
:
1931 filefp
= open(infile
, mode
);
1932 except FileNotFoundError
:
1936 def UncompressString(infile
):
1937 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
1938 if(compresscheck
=="gzip"):
1943 fileuz
= gzip
.decompress(infile
);
1944 if(compresscheck
=="bzip2"):
1949 fileuz
= bz2
.decompress(infile
);
1950 if(compresscheck
=="zstd"):
1955 fileuz
= zstandard
.decompress(infile
);
1956 if(compresscheck
=="lz4"):
1961 fileuz
= lz4
.frame
.decompress(infile
);
1962 if(compresscheck
=="lzo"):
1967 fileuz
= lzo
.decompress(infile
);
1968 if(compresscheck
=="lzma"):
1973 fileuz
= lzma
.decompress(infile
);
1974 if(not compresscheck
):
1976 if(hasattr(fileuz
, 'decode')):
1977 fileuz
= fileuz
.decode("UTF-8");
1980 def UncompressStringAlt(infile
):
1981 filefp
= StringIO();
1982 outstring
= UncompressString(infile
);
1983 filefp
.write(outstring
);
1987 def CheckCompressionSubType(infile
, formatspecs
=__file_format_list__
, closefp
=True):
1988 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
1989 if(not compresscheck
):
1990 fextname
= os
.path
.splitext(infile
)[1];
1991 if(fextname
==".gz"):
1992 compresscheck
= "gzip";
1993 elif(fextname
==".bz2"):
1994 compresscheck
= "bzip2";
1995 elif(fextname
==".zst"):
1996 compresscheck
= "zstd";
1997 elif(fextname
==".lz4"):
1998 compresscheck
= "lz4";
1999 elif(fextname
==".lzo" or fextname
==".lzop"):
2000 compresscheck
= "lzo";
2001 elif(fextname
==".lzma" or fextname
==".xz"):
2002 compresscheck
= "lzma";
2005 if(not compresscheck
):
2007 if(compresscheck
=="catfile"):
2009 if(compresscheck
==formatspecs
[2]):
2010 return formatspecs
[2];
2011 if(compresscheck
=="tarfile"):
2013 if(compresscheck
=="zipfile"):
2015 if(rarfile_support
and compresscheck
=="rarfile"):
2017 if(py7zr_support
and compresscheck
=="7zipfile"):
2019 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2020 catfp
= UncompressArchiveFile(infile
, formatspecs
[2]);
2023 if(compresscheck
=="gzip"):
2028 catfp
= gzip
.GzipFile(infile
, "rb");
2029 if(compresscheck
=="bzip2"):
2034 catfp
= bz2
.BZ2File(infile
, "rb");
2035 if(compresscheck
=="lz4"):
2040 catfp
= lz4
.frame
.open(infile
, "rb");
2041 if(compresscheck
=="zstd"):
2046 catfp
= zstandard
.open(infile
, "rb");
2047 if(compresscheck
=="lzma" or compresscheck
=="xz"):
2052 catfp
= lzma
.open(infile
, "rb");
2053 except FileNotFoundError
:
2056 prefp
= catfp
.read(5);
2057 if(prefp
==binascii
.unhexlify("7573746172")):
2058 filetype
= "tarfile";
2060 prefp
= catfp
.read(7);
2061 if(prefp
==binascii
.unhexlify("43617446696c65")):
2062 filetype
= "catfile";
2064 prefp
= catfp
.read(formatspecs
[3]);
2065 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
2066 filetype
= formatspecs
[2];
2068 prefp
= catfp
.read(10);
2069 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
2070 filetype
= "tarfile";
2076 def GZipCompress(data
, compresslevel
=9):
2081 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
2083 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
2087 catfp
= open(tmpfp
.name
, "rb");
2088 except FileNotFoundError
:
2090 catdata
= catfp
.read();
2094 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_list__
):
2095 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
2098 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2100 if(compression
not in compressionlist
and compression
is None):
2101 compression
= "auto";
2102 if(compression
=="gzip"):
2108 if(compressionlevel
is None):
2109 compressionlevel
= 9;
2111 compressionlevel
= int(compressionlevel
);
2112 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
2113 if(compression
=="bzip2"):
2119 if(compressionlevel
is None):
2120 compressionlevel
= 9;
2122 compressionlevel
= int(compressionlevel
);
2123 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
2124 if(compression
=="lz4"):
2130 if(compressionlevel
is None):
2131 compressionlevel
= 9;
2133 compressionlevel
= int(compressionlevel
);
2134 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
2135 if(compression
=="lzo" or compression
=="lzop"):
2141 if(compressionlevel
is None):
2142 compressionlevel
= 9;
2144 compressionlevel
= int(compressionlevel
);
2145 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
2146 if(compression
=="zstd"):
2152 if(compressionlevel
is None):
2153 compressionlevel
= 10;
2155 compressionlevel
= int(compressionlevel
);
2156 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
2157 if(compression
=="lzma"):
2163 if(compressionlevel
is None):
2164 compressionlevel
= 9;
2166 compressionlevel
= int(compressionlevel
);
2167 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
2168 if(compression
=="xz"):
2174 if(compressionlevel
is None):
2175 compressionlevel
= 9;
2177 compressionlevel
= int(compressionlevel
);
2178 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
2179 if(compression
=="auto" or compression
is None):
2184 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
2186 def CompressOpenFile(outfile
, compressionlevel
=None):
2187 if(outfile
is None):
2189 fbasename
= os
.path
.splitext(outfile
)[0];
2190 fextname
= os
.path
.splitext(outfile
)[1];
2191 if(compressionlevel
is None and fextname
!=".zst"):
2192 compressionlevel
= 9;
2193 elif(compressionlevel
is None and fextname
==".zst"):
2194 compressionlevel
= 10;
2196 compressionlevel
= int(compressionlevel
);
2197 if(sys
.version_info
[0]==2):
2202 if(fextname
not in outextlistwd
):
2204 outfp
= open(outfile
, "wb", encoding
="UTF-8");
2205 except (ValueError, TypeError) as e
:
2206 outfp
= open(outfile
, "wb");
2207 elif(fextname
==".gz"):
2213 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2214 except (ValueError, TypeError) as e
:
2215 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
2216 elif(fextname
==".bz2"):
2222 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
2223 except (ValueError, TypeError) as e
:
2224 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
2225 elif(fextname
==".zst"):
2231 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
2232 except (ValueError, TypeError) as e
:
2233 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
2234 elif(fextname
==".xz"):
2240 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
2241 except (ValueError, TypeError) as e
:
2242 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
2243 elif(fextname
==".lz4"):
2249 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
2250 except (ValueError, TypeError) as e
:
2251 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
2252 elif(fextname
==".lzo"):
2258 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
2259 except (ValueError, TypeError) as e
:
2260 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
2261 elif(fextname
==".lzma"):
2267 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
2268 except (ValueError, TypeError) as e
:
2269 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
2270 except FileNotFoundError
:
2274 def GetDevMajorMinor(fdev
):
2276 if(hasattr(os
, "minor")):
2277 retdev
.append(os
.minor(fdev
));
2280 if(hasattr(os
, "major")):
2281 retdev
.append(os
.major(fdev
));
2286 def CheckSumSupport(checkfor
, guaranteed
=True):
2288 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2290 hash_list
= sorted(list(hashlib
.algorithms_available
));
2291 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
2292 if(checkfor
in checklistout
):
2297 def CheckSumSupportAlt(checkfor
, guaranteed
=True):
2299 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
2301 hash_list
= sorted(list(hashlib
.algorithms_available
));
2302 checklistout
= hash_list
;
2303 if(checkfor
in checklistout
):
2308 def PackArchiveFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2309 advancedlist
= formatspecs
[8];
2310 altinode
= formatspecs
[9];
2311 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2312 outfile
= RemoveWindowsPath(outfile
);
2313 checksumtype
= checksumtype
.lower();
2314 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2315 checksumtype
="crc32";
2316 if(checksumtype
=="none"):
2318 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2320 if(compression
not in compressionlist
and compression
is None):
2321 compression
= "auto";
2323 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2324 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2325 if(os
.path
.exists(outfile
)):
2330 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2332 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2335 fbasename
= os
.path
.splitext(outfile
)[0];
2336 fextname
= os
.path
.splitext(outfile
)[1];
2337 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2338 catver
= formatspecs
[6];
2339 fileheaderver
= str(int(catver
.replace(".", "")));
2340 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2341 catfp
.write(fileheader
.encode('UTF-8'));
2344 for line
in sys
.stdin
:
2345 infilelist
.append(line
.strip());
2346 infilelist
= list(filter(None, infilelist
));
2347 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
2348 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
2350 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
2351 for line
in finfile
:
2352 infilelist
.append(line
.strip());
2353 infilelist
= list(filter(None, infilelist
));
2355 if(isinstance(infiles
, (list, tuple, ))):
2356 infilelist
= list(filter(None, infiles
));
2357 elif(isinstance(infiles
, (str, ))):
2358 infilelist
= list(filter(None, [infiles
]));
2360 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
2362 GetDirList
= ListDir(infilelist
, followlink
, False);
2370 inodetocatinode
= {};
2371 numfiles
= int(len(GetDirList
));
2372 fnumfiles
= format(int(len(GetDirList
)), 'x').lower();
2373 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2374 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
2375 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2376 catfp
.write(fnumfilesa
.encode('UTF-8'));
2379 os
.fsync(catfp
.fileno());
2380 except io
.UnsupportedOperation
:
2382 except AttributeError:
2384 for curfname
in GetDirList
:
2385 catfhstart
= catfp
.tell();
2386 if(re
.findall("^[.|/]", curfname
)):
2389 fname
= "./"+curfname
;
2391 VerbosePrintOut(fname
);
2392 if(not followlink
or followlink
is None):
2393 fstatinfo
= os
.lstat(fname
);
2395 fstatinfo
= os
.stat(fname
);
2396 fpremode
= fstatinfo
.st_mode
;
2397 finode
= fstatinfo
.st_ino
;
2398 flinkcount
= fstatinfo
.st_nlink
;
2400 if(stat
.S_ISREG(fpremode
)):
2402 elif(stat
.S_ISLNK(fpremode
)):
2404 elif(stat
.S_ISCHR(fpremode
)):
2406 elif(stat
.S_ISBLK(fpremode
)):
2408 elif(stat
.S_ISDIR(fpremode
)):
2410 elif(stat
.S_ISFIFO(fpremode
)):
2412 elif(stat
.S_ISSOCK(fpremode
)):
2414 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
2416 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
2418 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
2423 fcurfid
= format(int(curfid
), 'x').lower();
2424 if(not followlink
and finode
!=0):
2426 if(finode
in inodelist
):
2428 flinkname
= inodetofile
[finode
];
2430 fcurinode
= format(int(finode
), 'x').lower();
2432 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
2433 if(finode
not in inodelist
):
2434 inodelist
.append(finode
);
2435 inodetofile
.update({finode
: fname
});
2436 inodetocatinode
.update({finode
: curinode
});
2438 fcurinode
= format(int(finode
), 'x').lower();
2440 fcurinode
= format(int(curinode
), 'x').lower();
2441 curinode
= curinode
+ 1;
2443 fcurinode
= format(int(curinode
), 'x').lower();
2444 curinode
= curinode
+ 1;
2445 curfid
= curfid
+ 1;
2447 flinkname
= os
.readlink(fname
);
2448 fdev
= fstatinfo
.st_dev
;
2449 getfdev
= GetDevMajorMinor(fdev
);
2450 fdev_minor
= getfdev
[0];
2451 fdev_major
= getfdev
[1];
2452 frdev
= fstatinfo
.st_dev
;
2453 if(hasattr(fstatinfo
, "st_rdev")):
2454 frdev
= fstatinfo
.st_rdev
;
2456 frdev
= fstatinfo
.st_dev
;
2457 getfrdev
= GetDevMajorMinor(frdev
);
2458 frdev_minor
= getfrdev
[0];
2459 frdev_major
= getfrdev
[1];
2460 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2461 fsize
= format(int("0"), 'x').lower();
2462 elif(ftype
==0 or ftype
==7):
2463 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
2465 fsize
= format(int(fstatinfo
.st_size
)).lower();
2466 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
2467 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
2468 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2469 if(hasattr(fstatinfo
, "st_birthtime")):
2470 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
2472 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
2473 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
2474 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
2475 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
2476 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
2477 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
2482 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
2483 funame
= userinfo
.pw_name
;
2492 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
2493 fgname
= groupinfo
.gr_name
;
2498 fdev_minor
= format(int(fdev_minor
), 'x').lower();
2499 fdev_major
= format(int(fdev_major
), 'x').lower();
2500 frdev_minor
= format(int(frdev_minor
), 'x').lower();
2501 frdev_major
= format(int(frdev_major
), 'x').lower();
2502 finode
= format(int(finode
), 'x').lower();
2503 flinkcount
= format(int(flinkcount
), 'x').lower();
2504 if(hasattr(fstatinfo
, "st_file_attributes")):
2505 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
2507 fwinattributes
= format(int(0), 'x').lower();
2508 fcontents
= BytesIO();
2509 if(ftype
==0 or ftype
==7):
2510 with
open(fname
, "rb") as fpc
:
2511 shutil
.copyfileobj(fpc
, fcontents
);
2512 if(followlink
and (ftype
==1 or ftype
==2)):
2513 flstatinfo
= os
.stat(flinkname
);
2514 with
open(flinkname
, "rb") as fpc
:
2515 shutil
.copyfileobj(fpc
, fcontents
);
2516 fcontents
.seek(0, 0);
2517 ftypehex
= format(ftype
, 'x').lower();
2518 extrafields
= format(len(extradata
), 'x').lower();
2519 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2520 if(len(extradata
)>0):
2521 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2522 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2523 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
];
2524 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
2525 catoutlenhex
= format(catoutlen
, 'x').lower();
2526 catoutlist
.insert(0, catoutlenhex
);
2527 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
2528 if(len(extradata
)>0):
2529 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2530 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2531 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
2532 fcontents
.seek(0, 0);
2533 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
2534 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2535 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
2536 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
2537 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
2538 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2539 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2540 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2541 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2542 nullstrecd
= formatspecs
[5].encode('UTF-8');
2543 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
2544 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2545 catfp
.write(catfileout
);
2548 os
.fsync(catfp
.fileno());
2549 except io
.UnsupportedOperation
:
2551 except AttributeError:
2554 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
2555 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2556 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2559 os
.fsync(catfp
.fileno());
2560 except io
.UnsupportedOperation
:
2562 except AttributeError:
2566 if(hasattr(sys
.stdout
, "buffer")):
2567 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2569 shutil
.copyfileobj(catfp
, sys
.stdout
);
2570 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2571 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2573 upload_file_to_internet_file(catfp
, outfile
);
2581 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
2583 if(hasattr(shutil
, "register_archive_format")):
2584 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
2585 return PackArchiveFile(source_dir
, archive_name
, False, "auto", None, False, "crc32", [], __file_format_delimiter__
, False, False);
2586 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
2588 def PackArchiveFileFromDirList(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2589 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
2591 create_alias_function("Pack", __file_format_name__
, "FromDirList", PackArchiveFileFromDirList
);
2593 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2594 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2595 outfile
= RemoveWindowsPath(outfile
);
2596 checksumtype
= checksumtype
.lower();
2597 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2598 checksumtype
="crc32";
2599 if(checksumtype
=="none"):
2601 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2603 if(compression
not in compressionlist
and compression
is None):
2604 compression
= "auto";
2606 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2607 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2608 if(os
.path
.exists(outfile
)):
2613 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2615 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2618 fbasename
= os
.path
.splitext(outfile
)[0];
2619 fextname
= os
.path
.splitext(outfile
)[1];
2620 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2621 catver
= formatspecs
[6];
2622 fileheaderver
= str(int(catver
.replace(".", "")));
2623 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2624 catfp
.write(fileheader
.encode('UTF-8'));
2630 inodetocatinode
= {};
2633 if(hasattr(sys
.stdin
, "buffer")):
2634 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
2636 shutil
.copyfileobj(sys
.stdin
, infile
);
2641 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
2642 infile
= download_file_from_internet_file(infile
);
2647 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2649 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
2651 if(not tarfile
.is_tarfile(infile
)):
2653 except AttributeError:
2654 if(not is_tarfile(infile
)):
2659 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2660 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
2662 tarfp
= tarfile
.open(infile
, "r");
2663 except FileNotFoundError
:
2665 numfiles
= int(len(tarfp
.getmembers()));
2666 fnumfiles
= format(int(len(tarfp
.getmembers())), 'x').lower();
2667 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2668 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
2669 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2670 catfp
.write(fnumfilesa
.encode('UTF-8'));
2673 os
.fsync(catfp
.fileno());
2674 except io
.UnsupportedOperation
:
2676 except AttributeError:
2678 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
2679 catfhstart
= catfp
.tell();
2680 if(re
.findall("^[.|/]", member
.name
)):
2681 fname
= member
.name
;
2683 fname
= "./"+member
.name
;
2685 VerbosePrintOut(fname
);
2686 fpremode
= member
.mode
;
2687 ffullmode
= member
.mode
;
2691 ffullmode
= member
.mode
+ stat
.S_IFREG
;
2693 elif(member
.isdev()):
2694 ffullmode
= member
.mode
;
2696 elif(member
.islnk()):
2697 ffullmode
= member
.mode
+ stat
.S_IFREG
;
2699 elif(member
.issym()):
2700 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
2702 elif(member
.ischr()):
2703 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
2705 elif(member
.isblk()):
2706 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
2708 elif(member
.isdir()):
2709 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
2711 elif(member
.isfifo()):
2712 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
2714 elif(member
.issparse()):
2715 ffullmode
= member
.mode
;
2718 ffullmode
= member
.mode
;
2721 fcurfid
= format(int(curfid
), 'x').lower();
2722 fcurinode
= format(int(curfid
), 'x').lower();
2723 curfid
= curfid
+ 1;
2725 flinkname
= member
.linkname
;
2726 fdev_minor
= format(int(member
.devminor
), 'x').lower();
2727 fdev_major
= format(int(member
.devmajor
), 'x').lower();
2728 frdev_minor
= format(int(member
.devminor
), 'x').lower();
2729 frdev_major
= format(int(member
.devmajor
), 'x').lower();
2730 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2731 fsize
= format(int("0"), 'x').lower();
2732 elif(ftype
==0 or ftype
==7):
2733 fsize
= format(int(member
.size
), 'x').lower();
2735 fsize
= format(int(member
.size
), 'x').lower();
2736 fatime
= format(int(member
.mtime
), 'x').lower();
2737 fmtime
= format(int(member
.mtime
), 'x').lower();
2738 fctime
= format(int(member
.mtime
), 'x').lower();
2739 fbtime
= format(int(member
.mtime
), 'x').lower();
2740 fmode
= format(int(ffullmode
), 'x').lower();
2741 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
2742 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
2743 fuid
= format(int(member
.uid
), 'x').lower();
2744 fgid
= format(int(member
.gid
), 'x').lower();
2745 funame
= member
.uname
;
2746 fgname
= member
.gname
;
2747 flinkcount
= format(int(flinkcount
), 'x').lower();
2748 fwinattributes
= format(int(0), 'x').lower();
2749 fcontents
= BytesIO();
2750 if(ftype
==0 or ftype
==7):
2751 with tarfp
.extractfile(member
) as fpc
:
2752 shutil
.copyfileobj(fpc
, fcontents
);
2753 fcontents
.seek(0, 0);
2754 ftypehex
= format(ftype
, 'x').lower();
2755 extrafields
= format(len(extradata
), 'x').lower();
2756 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2757 if(len(extradata
)>0):
2758 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2759 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2760 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
];
2761 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
2762 catoutlenhex
= format(catoutlen
, 'x').lower();
2763 catoutlist
.insert(0, catoutlenhex
);
2764 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
2765 if(len(extradata
)>0):
2766 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2767 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2768 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2769 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2770 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
2771 fcontents
.seek(0, 0);
2772 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
2773 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2774 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
2775 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
2776 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
2777 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2778 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2779 nullstrecd
= formatspecs
[5].encode('UTF-8');
2780 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
2781 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2782 catfp
.write(catfileout
);
2785 os
.fsync(catfp
.fileno());
2786 except io
.UnsupportedOperation
:
2788 except AttributeError:
2791 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
2792 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2793 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2796 os
.fsync(catfp
.fileno());
2797 except io
.UnsupportedOperation
:
2799 except AttributeError:
2803 if(hasattr(sys
.stdout
, "buffer")):
2804 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2806 shutil
.copyfileobj(catfp
, sys
.stdout
);
2807 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2808 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2810 upload_file_to_internet_file(catfp
, outfile
);
2818 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
2820 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2821 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2822 outfile
= RemoveWindowsPath(outfile
);
2823 checksumtype
= checksumtype
.lower();
2824 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2825 checksumtype
="crc32";
2826 if(checksumtype
=="none"):
2828 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2830 if(compression
not in compressionlist
and compression
is None):
2831 compression
= "auto";
2833 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2834 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2835 if(os
.path
.exists(outfile
)):
2840 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2842 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2845 fbasename
= os
.path
.splitext(outfile
)[0];
2846 fextname
= os
.path
.splitext(outfile
)[1];
2847 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2848 catver
= formatspecs
[6];
2849 fileheaderver
= str(int(catver
.replace(".", "")));
2850 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2851 catfp
.write(fileheader
.encode('UTF-8'));
2857 inodetocatinode
= {};
2860 if(hasattr(sys
.stdin
, "buffer")):
2861 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
2863 shutil
.copyfileobj(sys
.stdin
, infile
);
2868 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
2869 infile
= download_file_from_internet_file(infile
);
2874 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2878 if(not zipfile
.is_zipfile(infile
)):
2881 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
2882 except FileNotFoundError
:
2884 ziptest
= zipfp
.testzip();
2886 VerbosePrintOut("Bad file found!");
2887 numfiles
= int(len(zipfp
.infolist()));
2888 fnumfiles
= format(int(len(zipfp
.infolist())), 'x').lower();
2889 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2890 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
2891 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2892 catfp
.write(fnumfilesa
.encode('UTF-8'));
2895 os
.fsync(catfp
.fileno());
2896 except io
.UnsupportedOperation
:
2898 except AttributeError:
2900 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
2901 catfhstart
= catfp
.tell();
2902 if(re
.findall("^[.|/]", member
.filename
)):
2903 fname
= member
.filename
;
2905 fname
= "./"+member
.filename
;
2906 zipinfo
= zipfp
.getinfo(member
.filename
);
2908 VerbosePrintOut(fname
);
2909 if(not member
.is_dir()):
2910 fpremode
= int(stat
.S_IFREG
+ 438);
2911 elif(member
.is_dir()):
2912 fpremode
= int(stat
.S_IFDIR
+ 511);
2915 if(not member
.is_dir()):
2917 elif(member
.is_dir()):
2920 fcurfid
= format(int(curfid
), 'x').lower();
2921 fcurinode
= format(int(curfid
), 'x').lower();
2922 curfid
= curfid
+ 1;
2923 fdev_minor
= format(int(0), 'x').lower();
2924 fdev_major
= format(int(0), 'x').lower();
2925 frdev_minor
= format(int(0), 'x').lower();
2926 frdev_major
= format(int(0), 'x').lower();
2928 fsize
= format(int("0"), 'x').lower();
2930 fsize
= format(int(member
.file_size
), 'x').lower();
2932 fsize
= format(int(member
.file_size
), 'x').lower();
2933 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2934 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2935 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2936 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2937 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
2938 fwinattributes
= format(int(zipinfo
.external_attr
), 'x').lower();
2939 if(not member
.is_dir()):
2940 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
2941 fchmode
= stat
.S_IMODE(fmode
);
2942 ftypemod
= stat
.S_IFMT(fmode
);
2943 elif(member
.is_dir()):
2944 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
2945 fchmode
= stat
.S_IMODE(fmode
);
2946 ftypemod
= stat
.S_IFMT(fmode
);
2947 elif(zipinfo
.create_system
==3):
2948 fwinattributes
= format(int(0), 'x').lower();
2949 fmode
= format(int(zipinfo
.external_attr
), 'x').lower();
2950 fchmode
= stat
.S_IMODE(fmode
);
2951 ftypemod
= stat
.S_IFMT(fmode
);
2953 fwinattributes
= format(int(0), 'x').lower();
2954 if(not member
.is_dir()):
2955 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
2956 fchmode
= stat
.S_IMODE(fmode
);
2957 ftypemod
= stat
.S_IFMT(fmode
);
2958 elif(member
.is_dir()):
2959 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
2960 fchmode
= stat
.S_IMODE(fmode
);
2961 ftypemod
= stat
.S_IFMT(fmode
);
2963 fuid
= format(int(os
.getuid()), 'x').lower();
2964 except AttributeError:
2965 fuid
= format(int(0), 'x').lower();
2967 fuid
= format(int(0), 'x').lower();
2969 fgid
= format(int(os
.getgid()), 'x').lower();
2970 except AttributeError:
2971 fgid
= format(int(0), 'x').lower();
2973 fgid
= format(int(0), 'x').lower();
2977 userinfo
= pwd
.getpwuid(os
.getuid());
2978 funame
= userinfo
.pw_name
;
2981 except AttributeError:
2989 groupinfo
= grp
.getgrgid(os
.getgid());
2990 fgname
= groupinfo
.gr_name
;
2993 except AttributeError:
2997 fcontents
= BytesIO();
2999 fcontents
.write(zipfp
.read(member
.filename
));
3000 fcontents
.seek(0, 0);
3001 ftypehex
= format(ftype
, 'x').lower();
3002 extrafields
= format(len(extradata
), 'x').lower();
3003 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3004 if(len(extradata
)>0):
3005 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3006 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3007 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
];
3008 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3009 catoutlenhex
= format(catoutlen
, 'x').lower();
3010 catoutlist
.insert(0, catoutlenhex
);
3011 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3012 if(len(extradata
)>0):
3013 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3014 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3015 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3016 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3017 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3018 fcontents
.seek(0, 0);
3019 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
3020 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3021 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
3022 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3023 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3024 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3025 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3026 nullstrecd
= formatspecs
[5].encode('UTF-8');
3027 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3028 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
3029 catfp
.write(catfileout
);
3032 os
.fsync(catfp
.fileno());
3033 except io
.UnsupportedOperation
:
3035 except AttributeError:
3038 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3039 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3040 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3043 os
.fsync(catfp
.fileno());
3044 except io
.UnsupportedOperation
:
3046 except AttributeError:
3050 if(hasattr(sys
.stdout
, "buffer")):
3051 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3053 shutil
.copyfileobj(catfp
, sys
.stdout
);
3054 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3055 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3057 upload_file_to_internet_file(catfp
, outfile
);
3065 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
3067 if(not rarfile_support
):
3068 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3071 if(rarfile_support
):
3072 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3073 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3074 outfile
= RemoveWindowsPath(outfile
);
3075 checksumtype
= checksumtype
.lower();
3076 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3077 checksumtype
="crc32";
3078 if(checksumtype
=="none"):
3080 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
3082 if(compression
not in compressionlist
and compression
is None):
3083 compression
= "auto";
3085 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3086 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3087 if(os
.path
.exists(outfile
)):
3092 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3094 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3097 fbasename
= os
.path
.splitext(outfile
)[0];
3098 fextname
= os
.path
.splitext(outfile
)[1];
3099 catfp
= CompressOpenFile(outfile
, compressionlevel
);
3100 catver
= formatspecs
[6];
3101 fileheaderver
= str(int(catver
.replace(".", "")));
3102 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3103 catfp
.write(fileheader
.encode('UTF-8'));
3109 inodetocatinode
= {};
3110 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3112 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
3114 rarfp
= rarfile
.RarFile(infile
, "r");
3115 rartest
= rarfp
.testrar();
3117 VerbosePrintOut("Bad file found!");
3118 numfiles
= int(len(rarfp
.infolist()));
3119 fnumfiles
= format(int(len(rarfp
.infolist())), 'x').lower();
3120 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
3121 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
3122 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3123 catfp
.write(fnumfilesa
.encode('UTF-8'));
3126 os
.fsync(catfp
.fileno());
3127 except io
.UnsupportedOperation
:
3129 except AttributeError:
3131 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
3134 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
3137 member
.external_attr
3139 except AttributeError:
3141 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
3144 member
.external_attr
3146 except AttributeError:
3151 catfhstart
= catfp
.tell();
3152 if(re
.findall("^[.|/]", member
.filename
)):
3153 fname
= member
.filename
;
3155 fname
= "./"+member
.filename
;
3156 rarinfo
= rarfp
.getinfo(member
.filename
);
3158 VerbosePrintOut(fname
);
3159 if(is_unix
and member
.external_attr
!=0):
3160 fpremode
= int(member
.external_attr
);
3161 elif(member
.is_file()):
3162 fpremode
= int(stat
.S_IFREG
+ 438);
3163 elif(member
.is_symlink()):
3164 fpremode
= int(stat
.S_IFLNK
+ 438);
3165 elif(member
.is_dir()):
3166 fpremode
= int(stat
.S_IFDIR
+ 511);
3167 if(is_windows
and member
.external_attr
!=0):
3168 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
3170 fwinattributes
= format(int(0), 'x').lower();
3173 if(member
.is_file()):
3175 elif(member
.is_symlink()):
3177 elif(member
.is_dir()):
3181 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
3182 fcurfid
= format(int(curfid
), 'x').lower();
3183 fcurinode
= format(int(curfid
), 'x').lower();
3184 curfid
= curfid
+ 1;
3185 fdev_minor
= format(int(0), 'x').lower();
3186 fdev_major
= format(int(0), 'x').lower();
3187 frdev_minor
= format(int(0), 'x').lower();
3188 frdev_major
= format(int(0), 'x').lower();
3190 fsize
= format(int("0"), 'x').lower();
3192 fsize
= format(int(member
.file_size
), 'x').lower();
3194 fsize
= format(int(member
.file_size
), 'x').lower();
3197 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
3199 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3200 except AttributeError:
3201 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3202 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3205 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
3207 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3208 except AttributeError:
3209 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3210 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3211 if(is_unix
and member
.external_attr
!=0):
3212 fmode
= format(int(member
.external_attr
), 'x').lower();
3213 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
3214 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
3215 elif(member
.is_file()):
3216 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3217 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3218 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3219 elif(member
.is_symlink()):
3220 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
3221 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3222 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3223 elif(member
.is_dir()):
3224 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3225 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3226 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3228 fuid
= format(int(os
.getuid()), 'x').lower();
3229 except AttributeError:
3230 fuid
= format(int(0), 'x').lower();
3232 fuid
= format(int(0), 'x').lower();
3234 fgid
= format(int(os
.getgid()), 'x').lower();
3235 except AttributeError:
3236 fgid
= format(int(0), 'x').lower();
3238 fgid
= format(int(0), 'x').lower();
3242 userinfo
= pwd
.getpwuid(os
.getuid());
3243 funame
= userinfo
.pw_name
;
3246 except AttributeError:
3254 groupinfo
= grp
.getgrgid(os
.getgid());
3255 fgname
= groupinfo
.gr_name
;
3258 except AttributeError:
3262 fcontents
= BytesIO();
3264 fcontents
.write(rarfp
.read(member
.filename
));
3265 fcontents
.seek(0, 0);
3266 ftypehex
= format(ftype
, 'x').lower();
3267 extrafields
= format(len(extradata
), 'x').lower();
3268 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3269 if(len(extradata
)>0):
3270 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3271 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3272 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
];
3273 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3274 catoutlenhex
= format(catoutlen
, 'x').lower();
3275 catoutlist
.insert(0, catoutlenhex
);
3276 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3277 if(len(extradata
)>0):
3278 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3279 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3280 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3281 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3282 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3283 fcontents
.seek(0, 0);
3284 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
3285 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3286 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
3287 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3288 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3289 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
3290 catfileoutstrecd
= catfileoutstr
.encode('UTF-8')
3291 nullstrecd
= formatspecs
[5].encode('UTF-8')
3292 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
3293 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
)
3294 catfp
.write(catfileout
)
3297 os
.fsync(catfp
.fileno());
3298 except io
.UnsupportedOperation
:
3300 except AttributeError:
3303 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3304 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3305 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
3308 os
.fsync(catfp
.fileno());
3309 except io
.UnsupportedOperation
:
3311 except AttributeError:
3315 if(hasattr(sys
.stdout
, "buffer")):
3316 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3318 shutil
.copyfileobj(catfp
, sys
.stdout
);
3319 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3320 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3322 upload_file_to_internet_file(catfp
, outfile
);
3330 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
3332 if(not py7zr_support
):
3333 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3337 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3338 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3339 outfile
= RemoveWindowsPath(outfile
);
3340 checksumtype
= checksumtype
.lower();
3341 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3342 checksumtype
="crc32";
3343 if(checksumtype
=="none"):
3345 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
3347 if(compression
not in compressionlist
and compression
is None):
3348 compression
= "auto";
3350 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3351 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3352 if(os
.path
.exists(outfile
)):
3357 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3359 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3362 fbasename
= os
.path
.splitext(outfile
)[0];
3363 fextname
= os
.path
.splitext(outfile
)[1];
3364 catfp
= CompressOpenFile(outfile
, compressionlevel
);
3365 catver
= formatspecs
[6];
3366 fileheaderver
= str(int(catver
.replace(".", "")));
3367 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3368 catfp
.write(fileheader
.encode('UTF-8'));
3374 inodetocatinode
= {};
3375 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3377 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
3378 file_content
= szpfp
.readall();
3379 #sztest = szpfp.testzip();
3380 sztestalt
= szpfp
.test();
3382 VerbosePrintOut("Bad file found!");
3383 numfiles
= int(len(szpfp
.list()));
3384 fnumfiles
= format(int(len(szpfp
.list())), 'x').lower();
3385 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
3386 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
3387 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3388 catfp
.write(fnumfilesa
.encode('UTF-8'));
3391 os
.fsync(catfp
.fileno());
3392 except io
.UnsupportedOperation
:
3394 except AttributeError:
3396 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
3397 catfhstart
= catfp
.tell();
3398 if(re
.findall("^[.|/]", member
.filename
)):
3399 fname
= member
.filename
;
3401 fname
= "./"+member
.filename
;
3403 VerbosePrintOut(fname
);
3404 if(not member
.is_directory
):
3405 fpremode
= int(stat
.S_IFREG
+ 438);
3406 elif(member
.is_directory
):
3407 fpremode
= int(stat
.S_IFDIR
+ 511);
3408 fwinattributes
= format(int(0), 'x').lower();
3411 if(member
.is_directory
):
3416 fcurfid
= format(int(curfid
), 'x').lower();
3417 fcurinode
= format(int(curfid
), 'x').lower();
3418 curfid
= curfid
+ 1;
3419 fdev_minor
= format(int(0), 'x').lower();
3420 fdev_major
= format(int(0), 'x').lower();
3421 frdev_minor
= format(int(0), 'x').lower();
3422 frdev_major
= format(int(0), 'x').lower();
3424 fsize
= format(int("0"), 'x').lower();
3425 fatime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3426 fmtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3427 fctime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3428 fbtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3429 if(member
.is_directory
):
3430 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3431 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3432 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3434 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3435 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3436 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3438 fuid
= format(int(os
.getuid()), 'x').lower();
3439 except AttributeError:
3440 fuid
= format(int(0), 'x').lower();
3442 fuid
= format(int(0), 'x').lower();
3444 fgid
= format(int(os
.getgid()), 'x').lower();
3445 except AttributeError:
3446 fgid
= format(int(0), 'x').lower();
3448 fgid
= format(int(0), 'x').lower();
3452 userinfo
= pwd
.getpwuid(os
.getuid());
3453 funame
= userinfo
.pw_name
;
3456 except AttributeError:
3464 groupinfo
= grp
.getgrgid(os
.getgid());
3465 fgname
= groupinfo
.gr_name
;
3468 except AttributeError:
3472 fcontents
= BytesIO();
3474 fcontents
.write(file_content
[member
.filename
].read());
3475 fsize
= format(fcontents
.tell(), 'x').lower();
3476 file_content
[member
.filename
].close();
3477 fcontents
.seek(0, 0);
3478 ftypehex
= format(ftype
, 'x').lower();
3479 extrafields
= format(len(extradata
), 'x').lower();
3480 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3481 if(len(extradata
)>0):
3482 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3483 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3484 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
];
3485 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3486 catoutlenhex
= format(catoutlen
, 'x').lower();
3487 catoutlist
.insert(0, catoutlenhex
);
3488 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3489 if(len(extradata
)>0):
3490 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3491 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3492 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3493 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3494 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3495 fcontents
.seek(0, 0);
3496 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
3497 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3498 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
3499 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3500 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3501 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
3502 catfileoutstrecd
= catfileoutstr
.encode('UTF-8')
3503 nullstrecd
= formatspecs
[5].encode('UTF-8')
3504 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
3505 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
)
3506 catfp
.write(catfileout
)
3509 os
.fsync(catfp
.fileno());
3510 except io
.UnsupportedOperation
:
3512 except AttributeError:
3515 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3516 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3517 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
3520 os
.fsync(catfp
.fileno());
3521 except io
.UnsupportedOperation
:
3523 except AttributeError:
3527 if(hasattr(sys
.stdout
, "buffer")):
3528 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3530 shutil
.copyfileobj(catfp
, sys
.stdout
);
3531 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3532 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3534 upload_file_to_internet_file(catfp
, outfile
);
3542 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFile", PackArchiveFileFromSevenZipFile
);
3544 def PackArchiveFileFromInFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3545 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3547 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3548 if(checkcompressfile
=="tarfile"):
3549 return PackArchiveFileFromTarFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3550 elif(checkcompressfile
=="zipfile"):
3551 return PackArchiveFileFromZipFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3552 elif(checkcompressfile
=="catfile"):
3553 return RePackArchiveFile(infile
, outfile
, compression
, compressionlevel
, False, 0, 0, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
3554 elif(rarfile_support
and checkcompressfile
=="rarfile"):
3555 return PackArchiveFileFromRarFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3556 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
3557 return PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3562 create_alias_function("Pack", __file_format_name__
, "FromInFile", PackArchiveFileFromInFile
);
3564 def ArchiveFileSeekToFileNum(infile
, seekto
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3565 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3568 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3569 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
3570 if(checkcompressfile
=="tarfile"):
3571 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3572 if(checkcompressfile
=="zipfile"):
3573 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3574 if(rarfile_support
and checkcompressfile
=="rarfile"):
3575 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3576 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3577 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3578 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3585 if(hasattr(sys
.stdin
, "buffer")):
3586 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
3588 shutil
.copyfileobj(sys
.stdin
, catfp
);
3590 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3594 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3595 catfp
= download_file_from_internet_file(infile
);
3597 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3602 infile
= RemoveWindowsPath(infile
);
3603 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3604 if(checkcompressfile
=="tarfile"):
3605 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3606 if(checkcompressfile
=="zipfile"):
3607 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3608 if(rarfile_support
and checkcompressfile
=="rarfile"):
3609 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3610 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3611 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3612 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3614 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
3615 if(not compresscheck
):
3616 fextname
= os
.path
.splitext(infile
)[1];
3617 if(fextname
==".gz"):
3618 compresscheck
= "gzip";
3619 elif(fextname
==".bz2"):
3620 compresscheck
= "bzip2";
3621 elif(fextname
==".zst"):
3622 compresscheck
= "zstd";
3623 elif(fextname
==".lz4" or fextname
==".clz4"):
3624 compresscheck
= "lz4";
3625 elif(fextname
==".lzo" or fextname
==".lzop"):
3626 compresscheck
= "lzo";
3627 elif(fextname
==".lzma" or fextname
==".xz"):
3628 compresscheck
= "lzma";
3631 if(not compresscheck
):
3633 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3638 SeekToEndOfFile(catfp);
3640 SeekToEndOfFile(catfp);
3641 CatSize = catfp.tell();
3642 CatSizeEnd = CatSize;
3650 curloc
= catfp
.tell();
3653 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
3655 catfp
.seek(curloc
, 0);
3656 catstring
= catheader
[0];
3657 catversion
= re
.findall(r
"([\d]+)$", catstring
);
3658 fprenumfiles
= catheader
[1];
3659 fnumfiles
= int(fprenumfiles
, 16);
3660 fprechecksumtype
= catheader
[2];
3661 fprechecksum
= catheader
[3];
3662 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
3663 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3664 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
3665 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
3666 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3667 fheadtell
= len(fileheader
);
3668 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
3669 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
3671 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3672 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
3673 if(seekto
>=fnumfiles
):
3674 seekto
= fnumfiles
- 1;
3680 prefhstart
= catfp
.tell();
3682 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
3684 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
3685 if(len(preheaderdata
)==0):
3687 prefheadsize
= int(preheaderdata
[0], 16);
3688 prefnumfields
= int(preheaderdata
[1], 16);
3689 preftype
= int(preheaderdata
[2], 16);
3690 if(re
.findall("^[.|/]", preheaderdata
[3])):
3691 prefname
= preheaderdata
[3];
3693 prefname
= "./"+preheaderdata
[3];
3694 prefbasedir
= os
.path
.dirname(prefname
);
3695 preflinkname
= preheaderdata
[4];
3696 prefsize
= int(preheaderdata
[5], 16);
3697 prefatime
= int(preheaderdata
[6], 16);
3698 prefmtime
= int(preheaderdata
[7], 16);
3699 prefctime
= int(preheaderdata
[8], 16);
3700 prefbtime
= int(preheaderdata
[9], 16);
3701 prefmode
= int(preheaderdata
[10], 16);
3702 prefchmode
= stat
.S_IMODE(prefmode
);
3703 preftypemod
= stat
.S_IFMT(prefmode
);
3704 prefwinattributes
= int(preheaderdata
[11], 16);
3705 prefuid
= int(preheaderdata
[12], 16);
3706 prefuname
= preheaderdata
[13];
3707 prefgid
= int(preheaderdata
[14], 16);
3708 prefgname
= preheaderdata
[15];
3709 fid
= int(preheaderdata
[16], 16);
3710 finode
= int(preheaderdata
[17], 16);
3711 flinkcount
= int(preheaderdata
[18], 16);
3712 prefdev_minor
= int(preheaderdata
[19], 16);
3713 prefdev_major
= int(preheaderdata
[20], 16);
3714 prefrdev_minor
= int(preheaderdata
[22], 16);
3715 prefrdev_major
= int(preheaderdata
[23], 16);
3716 prefextrasize
= int(preheaderdata
[24], 16);
3717 prefextrafields
= int(preheaderdata
[25], 16);
3718 extrafieldslist
= [];
3720 extraend
= extrastart
+ prefextrafields
;
3721 extrafieldslist
= [];
3722 if(extrastart
<extraend
):
3723 extrafieldslist
.append(preheaderdata
[extrastart
]);
3724 extrastart
= extrastart
+ 1;
3725 prefchecksumtype
= preheaderdata
[extrastart
].lower();
3726 prefcs
= preheaderdata
[extrastart
+ 1].lower();
3727 prefccs
= preheaderdata
[extrastart
+ 2].lower();
3729 hcmax
= len(preheaderdata
) - 2;
3732 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
3734 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
3735 if(prefcs
!=prenewfcs
and not skipchecksum
):
3736 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
3738 valid_archive
= False;
3739 invalid_archive
= True;
3740 prefhend
= catfp
.tell() - 1;
3741 prefcontentstart
= catfp
.tell();
3743 pyhascontents
= False;
3745 prefcontents
= catfp
.read(prefsize
);
3746 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
3747 pyhascontents
= True;
3748 if(prefccs
!=prenewfccs
and not skipchecksum
):
3749 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
3753 catfp
.seek(seekstart
, 0);
3755 catfheadsize
= int(preheaderdata
[0], 16);
3756 catfnumfields
= int(preheaderdata
[1], 16);
3757 catftype
= int(preheaderdata
[2], 16);
3758 if(re
.findall("^[.|/]", preheaderdata
[3])):
3759 catfname
= preheaderdata
[3];
3761 catfname
= "./"+preheaderdata
[3];
3762 catflinkname
= preheaderdata
[4];
3763 catfsize
= int(preheaderdata
[5], 16);
3764 catfbasedir
= os
.path
.dirname(catfname
);
3765 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
3767 catlist
.update({'catfp': catfp
});
3772 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
3774 def ArchiveFileSeekToFileName(infile
, seekfile
=None, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3775 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3778 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3779 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
3780 if(checkcompressfile
=="tarfile"):
3781 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3782 if(checkcompressfile
=="zipfile"):
3783 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3784 if(rarfile_support
and checkcompressfile
=="rarfile"):
3785 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3786 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3787 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3788 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3795 if(hasattr(sys
.stdin
, "buffer")):
3796 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
3798 shutil
.copyfileobj(sys
.stdin
, catfp
);
3800 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3804 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3805 catfp
= download_file_from_internet_file(infile
);
3806 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3812 infile
= RemoveWindowsPath(infile
);
3813 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3814 if(checkcompressfile
=="tarfile"):
3815 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3816 if(checkcompressfile
=="zipfile"):
3817 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3818 if(rarfile_support
and checkcompressfile
=="rarfile"):
3819 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3820 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3821 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3822 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3824 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
3825 if(not compresscheck
):
3826 fextname
= os
.path
.splitext(infile
)[1];
3827 if(fextname
==".gz"):
3828 compresscheck
= "gzip";
3829 elif(fextname
==".bz2"):
3830 compresscheck
= "bzip2";
3831 elif(fextname
==".zst"):
3832 compresscheck
= "zstd";
3833 elif(fextname
==".lz4" or fextname
==".clz4"):
3834 compresscheck
= "lz4";
3835 elif(fextname
==".lzo" or fextname
==".lzop"):
3836 compresscheck
= "lzo";
3837 elif(fextname
==".lzma" or fextname
==".xz"):
3838 compresscheck
= "lzma";
3841 if(not compresscheck
):
3843 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3848 SeekToEndOfFile(catfp);
3850 SeekToEndOfFile(catfp);
3851 CatSize = catfp.tell();
3852 CatSizeEnd = CatSize;
3860 curloc
= catfp
.tell();
3863 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
3865 catfp
.seek(curloc
, 0);
3866 catstring
= catheader
[0];
3867 catversion
= re
.findall(r
"([\d]+)$", catstring
);
3868 fprenumfiles
= catheader
[1];
3869 fnumfiles
= int(fprenumfiles
, 16);
3870 fprechecksumtype
= catheader
[2];
3871 fprechecksum
= catheader
[3];
3872 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
3873 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3874 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
3875 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
3876 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3877 fheadtell
= len(fileheader
);
3878 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
3879 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
3881 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3882 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
3883 seekto
= fnumfiles
- 1
3888 prefhstart
= catfp
.tell();
3890 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
3892 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
3893 if(len(preheaderdata
)==0):
3895 prefheadsize
= int(preheaderdata
[0], 16);
3896 prefnumfields
= int(preheaderdata
[1], 16);
3897 preftype
= int(preheaderdata
[2], 16);
3898 if(re
.findall("^[.|/]", preheaderdata
[3])):
3899 prefname
= preheaderdata
[3];
3901 prefname
= "./"+preheaderdata
[3];
3902 prefbasedir
= os
.path
.dirname(prefname
);
3903 preflinkname
= preheaderdata
[4];
3904 prefsize
= int(preheaderdata
[5], 16);
3905 prefatime
= int(preheaderdata
[6], 16);
3906 prefmtime
= int(preheaderdata
[7], 16);
3907 prefctime
= int(preheaderdata
[8], 16);
3908 prefbtime
= int(preheaderdata
[9], 16);
3909 prefmode
= int(preheaderdata
[10], 16);
3910 prefchmode
= stat
.S_IMODE(prefmode
);
3911 preftypemod
= stat
.S_IFMT(prefmode
);
3912 prefwinattributes
= int(preheaderdata
[11], 16);
3913 prefuid
= int(preheaderdata
[12], 16);
3914 prefuname
= preheaderdata
[13];
3915 prefgid
= int(preheaderdata
[14], 16);
3916 prefgname
= preheaderdata
[15];
3917 fid
= int(preheaderdata
[16], 16);
3918 finode
= int(preheaderdata
[17], 16);
3919 flinkcount
= int(preheaderdata
[18], 16);
3920 prefdev_minor
= int(preheaderdata
[19], 16);
3921 prefdev_major
= int(preheaderdata
[20], 16);
3922 prefrdev_minor
= int(preheaderdata
[22], 16);
3923 prefrdev_major
= int(preheaderdata
[23], 16);
3924 prefextrasize
= int(preheaderdata
[24], 16);
3925 prefextrafields
= int(preheaderdata
[25], 16);
3926 extrafieldslist
= [];
3928 extraend
= extrastart
+ prefextrafields
;
3929 extrafieldslist
= [];
3930 if(extrastart
<extraend
):
3931 extrafieldslist
.append(preheaderdata
[extrastart
]);
3932 extrastart
= extrastart
+ 1;
3933 prefchecksumtype
= preheaderdata
[extrastart
].lower();
3934 prefcs
= preheaderdata
[extrastart
+ 1].lower();
3935 prefccs
= preheaderdata
[extrastart
+ 2].lower();
3937 hcmax
= len(preheaderdata
) - 2;
3940 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
3942 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
3943 if(prefcs
!=prenewfcs
and not skipchecksum
):
3944 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
3946 valid_archive
= False;
3947 invalid_archive
= True;
3948 prefhend
= catfp
.tell() - 1;
3949 prefcontentstart
= catfp
.tell();
3951 pyhascontents
= False;
3953 prefcontents
= catfp
.read(prefsize
);
3954 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
3955 pyhascontents
= True;
3956 if(prefccs
!=prenewfccs
and not skipchecksum
):
3957 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
3962 prefname
= preheaderdata
[2];
3963 if(re
.findall("^[.|/]", preheaderdata
[2])):
3964 prefname
= preheaderdata
[2];
3966 prefname
= "./"+preheaderdata
[2];
3967 if(prefname
==seekfile
):
3970 catfp
.seek(seekstart
, 0);
3972 catfheadsize
= int(preheaderdata
[0], 16);
3973 catfnumfields
= int(preheaderdata
[1], 16);
3974 catftype
= int(preheaderdata
[2], 16);
3975 if(re
.findall("^[.|/]", preheaderdata
[3])):
3976 catfname
= preheaderdata
[3];
3978 catfname
= "./"+preheaderdata
[3];
3979 catflinkname
= preheaderdata
[4];
3980 catfsize
= int(preheaderdata
[5], 16);
3981 catfbasedir
= os
.path
.dirname(catfname
);
3983 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
3987 catlist
.update({'catfp': catfp
});
3992 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
3994 def ArchiveFileValidate(infile
, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3996 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3997 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4000 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4001 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4002 if(checkcompressfile
=="tarfile"):
4003 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4004 if(checkcompressfile
=="zipfile"):
4005 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4006 if(rarfile_support
and checkcompressfile
=="rarfile"):
4007 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4008 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4009 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4010 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4017 if(hasattr(sys
.stdin
, "buffer")):
4018 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4020 shutil
.copyfileobj(sys
.stdin
, catfp
);
4022 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4026 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4027 catfp
= download_file_from_internet_file(infile
);
4028 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4034 infile
= RemoveWindowsPath(infile
);
4035 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4036 if(checkcompressfile
=="tarfile"):
4037 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4038 if(checkcompressfile
=="zipfile"):
4039 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4040 if(rarfile_support
and checkcompressfile
=="rarfile"):
4041 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4042 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4043 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4044 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4046 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4047 if(not compresscheck
):
4048 fextname
= os
.path
.splitext(infile
)[1];
4049 if(fextname
==".gz"):
4050 compresscheck
= "gzip";
4051 elif(fextname
==".bz2"):
4052 compresscheck
= "bzip2";
4053 elif(fextname
==".zst"):
4054 compresscheck
= "zstd";
4055 elif(fextname
==".lz4" or fextname
==".clz4"):
4056 compresscheck
= "lz4";
4057 elif(fextname
==".lzo" or fextname
==".lzop"):
4058 compresscheck
= "lzo";
4059 elif(fextname
==".lzma" or fextname
==".xz"):
4060 compresscheck
= "lzma";
4063 if(not compresscheck
):
4065 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4070 SeekToEndOfFile(catfp);
4072 SeekToEndOfFile(catfp);
4073 CatSize = catfp.tell();
4074 CatSizeEnd = CatSize;
4082 curloc
= catfp
.tell();
4085 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4087 catfp
.seek(curloc
, 0);
4088 catstring
= catheader
[0];
4089 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4090 fprenumfiles
= catheader
[1];
4091 fnumfiles
= int(fprenumfiles
, 16);
4092 fprechecksumtype
= catheader
[2];
4093 fprechecksum
= catheader
[3];
4095 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4096 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4097 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4098 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4099 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4100 valid_archive
= True;
4101 invalid_archive
= False;
4103 VerbosePrintOut(infile
);
4104 VerbosePrintOut("Number of Records " + str(fnumfiles
));
4105 if(fprechecksum
==catfileheadercshex
):
4107 VerbosePrintOut("File Header Checksum Passed at offset " + str(0));
4110 VerbosePrintOut("File Header Checksum Failed at offset " + str(0));
4111 valid_archive
= False;
4112 invalid_archive
= True;
4114 VerbosePrintOut("");
4115 while(il
<fnumfiles
):
4116 catfhstart
= catfp
.tell();
4118 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4120 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4121 if(len(catheaderdata
)==0):
4123 catfheadsize
= int(catheaderdata
[0], 16);
4124 catfnumfields
= int(catheaderdata
[1], 16);
4125 catftype
= int(catheaderdata
[2], 16);
4126 if(re
.findall("^[.|/]", catheaderdata
[3])):
4127 catfname
= catheaderdata
[3];
4129 catfname
= "./"+catheaderdata
[3];
4130 catfbasedir
= os
.path
.dirname(catfname
);
4131 catflinkname
= catheaderdata
[4];
4132 catfsize
= int(catheaderdata
[5], 16);
4133 catfatime
= int(catheaderdata
[6], 16);
4134 catfmtime
= int(catheaderdata
[7], 16);
4135 catfctime
= int(catheaderdata
[8], 16);
4136 catfbtime
= int(catheaderdata
[9], 16);
4137 catfmode
= int(catheaderdata
[10], 16);
4138 catfchmode
= stat
.S_IMODE(catfmode
);
4139 catftypemod
= stat
.S_IFMT(catfmode
);
4140 prefwinattributes
= int(catheaderdata
[11], 16);
4141 catfuid
= int(catheaderdata
[12], 16);
4142 catfuname
= catheaderdata
[13];
4143 catfgid
= int(catheaderdata
[14], 16);
4144 catfgname
= catheaderdata
[15];
4145 fid
= int(catheaderdata
[16], 16);
4146 finode
= int(catheaderdata
[17], 16);
4147 flinkcount
= int(catheaderdata
[18], 16);
4148 catfdev_minor
= int(catheaderdata
[19], 16);
4149 catfdev_major
= int(catheaderdata
[20], 16);
4150 catfrdev_minor
= int(catheaderdata
[21], 16);
4151 catfrdev_major
= int(catheaderdata
[22], 16);
4152 catfextrasize
= int(catheaderdata
[23], 16);
4153 catfextrafields
= int(catheaderdata
[24], 16);
4154 extrafieldslist
= [];
4156 extraend
= extrastart
+ catfextrafields
;
4157 extrafieldslist
= [];
4158 if(extrastart
<extraend
):
4159 extrafieldslist
.append(catheaderdata
[extrastart
]);
4160 extrastart
= extrastart
+ 1;
4161 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4162 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4163 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4165 hcmax
= len(catheaderdata
) - 2;
4168 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
4170 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4172 VerbosePrintOut(catfname
);
4173 VerbosePrintOut("Record Number " + str(il
) + "; File ID " + str(fid
) + "; iNode Number " + str(finode
));
4174 if(catfcs
==catnewfcs
):
4176 VerbosePrintOut("File Header Checksum Passed at offset " + str(catfhstart
));
4179 VerbosePrintOut("File Header Checksum Failed at offset " + str(catfhstart
));
4180 valid_archive
= False;
4181 invalid_archive
= True;
4182 catfhend
= catfp
.tell() - 1;
4183 catfcontentstart
= catfp
.tell();
4185 pyhascontents
= False;
4187 catfcontents
= catfp
.read(catfsize
);
4188 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
4189 pyhascontents
= True;
4190 if(catfccs
==catnewfccs
):
4192 VerbosePrintOut("File Content Checksum Passed at offset " + str(catfcontentstart
));
4195 VerbosePrintOut("File Content Checksum Failed at offset " + str(catfcontentstart
));
4196 valid_archive
= False;
4197 invalid_archive
= True;
4199 VerbosePrintOut("");
4212 create_alias_function("", __file_format_name__
, "Validate", ArchiveFileValidate
);
4214 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4215 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4218 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4219 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4220 if(checkcompressfile
=="tarfile"):
4221 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4222 if(checkcompressfile
=="zipfile"):
4223 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4224 if(rarfile_support
and checkcompressfile
=="rarfile"):
4225 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4226 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4227 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4228 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4235 if(hasattr(sys
.stdin
, "buffer")):
4236 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4238 shutil
.copyfileobj(sys
.stdin
, catfp
);
4240 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4244 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4245 catfp
= download_file_from_internet_file(infile
);
4246 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4252 infile
= RemoveWindowsPath(infile
);
4253 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4254 if(checkcompressfile
=="tarfile"):
4255 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4256 if(checkcompressfile
=="zipfile"):
4257 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4258 if(rarfile_support
and checkcompressfile
=="rarfile"):
4259 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4260 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4261 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4262 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4264 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4265 if(not compresscheck
):
4266 fextname
= os
.path
.splitext(infile
)[1];
4267 if(fextname
==".gz"):
4268 compresscheck
= "gzip";
4269 elif(fextname
==".bz2"):
4270 compresscheck
= "bzip2";
4271 elif(fextname
==".zst"):
4272 compresscheck
= "zstd";
4273 elif(fextname
==".lz4" or fextname
==".clz4"):
4274 compresscheck
= "lz4";
4275 elif(fextname
==".lzo" or fextname
==".lzop"):
4276 compresscheck
= "lzo";
4277 elif(fextname
==".lzma" or fextname
==".xz"):
4278 compresscheck
= "lzma";
4281 if(not compresscheck
):
4283 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4288 SeekToEndOfFile(catfp);
4290 SeekToEndOfFile(catfp);
4291 CatSize = catfp.tell();
4292 CatSizeEnd = CatSize;
4300 curloc
= catfp
.tell();
4303 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4305 catfp
.seek(curloc
, 0);
4306 catstring
= catheader
[0];
4307 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4308 fprenumfiles
= catheader
[1];
4309 fnumfiles
= int(fprenumfiles
, 16);
4310 fprechecksumtype
= catheader
[2];
4311 fprechecksum
= catheader
[3];
4312 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4313 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4314 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4315 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4316 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4317 fheadtell
= len(fileheader
);
4318 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4319 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4321 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4322 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4323 if(seekstart
<0 and seekstart
>fnumfiles
):
4325 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
4326 seekend
= fnumfiles
;
4327 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
4328 seekend
= fnumfiles
- abs(seekend
);
4331 while(il
< seekstart
):
4332 prefhstart
= catfp
.tell();
4334 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4336 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4337 if(len(preheaderdata
)==0):
4339 prefheadsize
= int(preheaderdata
[0], 16);
4340 prefnumfields
= int(preheaderdata
[1], 16);
4341 if(re
.findall("^[.|/]", preheaderdata
[3])):
4342 prefname
= preheaderdata
[3];
4344 prefname
= "./"+preheaderdata
[3];
4345 prefsize
= int(preheaderdata
[5], 16);
4346 prefextrasize
= int(preheaderdata
[23], 16);
4347 prefextrafields
= int(preheaderdata
[24], 16);
4348 extrafieldslist
= [];
4350 extraend
= extrastart
+ prefextrafields
;
4351 extrafieldslist
= [];
4352 if(extrastart
<extraend
):
4353 extrafieldslist
.append(preheaderdata
[extrastart
]);
4354 extrastart
= extrastart
+ 1;
4355 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4356 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4357 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4359 hcmax
= len(preheaderdata
) - 2;
4362 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
4364 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4365 if(prefcs
!=prenewfcs
and not skipchecksum
):
4366 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4368 valid_archive
= False;
4369 invalid_archive
= True;
4370 prefhend
= catfp
.tell() - 1;
4371 prefcontentstart
= catfp
.tell();
4373 pyhascontents
= False;
4375 prefcontents
= catfp
.read(prefsize
);
4376 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4377 pyhascontents
= True;
4378 if(prefccs
!=prenewfccs
and not skipchecksum
):
4379 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4383 fileidnum
= seekstart
;
4385 while(fileidnum
<seekend
):
4386 catfhstart
= catfp
.tell();
4388 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4390 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4391 if(len(catheaderdata
)==0):
4393 catfheadsize
= int(catheaderdata
[0], 16);
4394 catfnumfields
= int(catheaderdata
[1], 16);
4395 catftype
= int(catheaderdata
[2], 16);
4396 if(re
.findall("^[.|/]", catheaderdata
[3])):
4397 catfname
= catheaderdata
[3];
4399 catfname
= "./"+catheaderdata
[3];
4400 catfbasedir
= os
.path
.dirname(catfname
);
4401 catflinkname
= catheaderdata
[4];
4402 catfsize
= int(catheaderdata
[5], 16);
4403 catfatime
= int(catheaderdata
[6], 16);
4404 catfmtime
= int(catheaderdata
[7], 16);
4405 catfctime
= int(catheaderdata
[8], 16);
4406 catfbtime
= int(catheaderdata
[9], 16);
4407 catfmode
= int(catheaderdata
[10], 16);
4408 catfchmode
= stat
.S_IMODE(catfmode
);
4409 catftypemod
= stat
.S_IFMT(catfmode
);
4410 catfwinattributes
= int(catheaderdata
[11], 16);
4411 catfuid
= int(catheaderdata
[12], 16);
4412 catfuname
= catheaderdata
[13];
4413 catfgid
= int(catheaderdata
[14], 16);
4414 catfgname
= catheaderdata
[15];
4415 fid
= int(catheaderdata
[16], 16);
4416 finode
= int(catheaderdata
[17], 16);
4417 flinkcount
= int(catheaderdata
[18], 16);
4418 catfdev_minor
= int(catheaderdata
[19], 16);
4419 catfdev_major
= int(catheaderdata
[20], 16);
4420 catfrdev_minor
= int(catheaderdata
[21], 16);
4421 catfrdev_major
= int(catheaderdata
[22], 16);
4422 catfextrasize
= int(catheaderdata
[23], 16);
4423 catfextrafields
= int(catheaderdata
[24], 16);
4424 extrafieldslist
= [];
4426 extraend
= extrastart
+ catfextrafields
;
4427 extrafieldslist
= [];
4428 if(extrastart
<extraend
):
4429 extrafieldslist
.append(catheaderdata
[extrastart
]);
4430 extrastart
= extrastart
+ 1;
4431 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4432 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4433 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4435 hcmax
= len(catheaderdata
) - 2;
4438 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
4440 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4441 if(catfcs
!=catnewfcs
and not skipchecksum
):
4442 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
4444 catfhend
= catfp
.tell() - 1;
4445 catfcontentstart
= catfp
.tell();
4446 catfcontents
= BytesIO();
4447 pyhascontents
= False;
4448 catfcontents
.seek(0, 0);
4449 if(catfsize
>0 and not listonly
):
4450 catfcontents
.write(catfp
.read(catfsize
));
4451 catnewfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
4452 pyhascontents
= True;
4453 if(catfccs
!=catnewfccs
and skipchecksum
):
4454 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
4456 if(catfsize
>0 and listonly
):
4457 catfp
.seek(catfsize
, 1);
4458 pyhascontents
= False;
4460 catfcontentend
= catfp
.tell() - 1;
4461 catfcontents
.seek(0, 0);
4462 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
} });
4463 fileidnum
= fileidnum
+ 1;
4464 realidnum
= realidnum
+ 1;
4466 catlist
.update({'catfp': catfp
});
4471 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
4473 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4474 catfp
= BytesIO(catstr
);
4475 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4476 return listcatfiles
;
4478 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
4480 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4482 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4483 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4484 return listcatfiles
;
4486 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4488 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4489 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4490 return listcatfiles
;
4492 if(not rarfile_support
):
4493 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4496 if(rarfile_support
):
4497 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4499 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4500 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4501 return listcatfiles
;
4503 if(not py7zr_support
):
4504 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4508 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4510 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4511 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4512 return listcatfiles
;
4514 def InFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4515 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4516 if(checkcompressfile
=="tarfile"):
4517 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4518 elif(checkcompressfile
=="zipfile"):
4519 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4520 elif(checkcompressfile
=="catfile"):
4521 return ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4522 elif(rarfile_support
and checkcompressfile
=="rarfile"):
4523 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4524 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
4525 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4530 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4531 catver
= formatspecs
[6];
4532 fileheaderver
= str(int(catver
.replace(".", "")));
4533 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4534 advancedlist
= formatspecs
[8];
4535 altinode
= formatspecs
[9];
4538 for line
in sys
.stdin
:
4539 infilelist
.append(line
.strip());
4540 infilelist
= list(filter(None, infilelist
));
4541 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
4542 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
4544 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
4545 for line
in finfile
:
4546 infilelist
.append(line
.strip());
4547 infilelist
= list(filter(None, infilelist
));
4549 if(isinstance(infiles
, (list, tuple, ))):
4550 infilelist
= list(filter(None, infiles
));
4551 elif(isinstance(infiles
, (str, ))):
4552 infilelist
= list(filter(None, [infiles
]));
4554 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
4556 GetDirList
= ListDir(infilelist
, followlink
, False);
4564 inodetocatinode
= {};
4566 fnumfiles
= int(len(GetDirList
));
4567 catver
= formatspecs
[6];
4568 fileheaderver
= str(int(catver
.replace(".", "")));
4569 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4570 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4571 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4572 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4573 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4574 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4575 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4576 fheadtell
= len(fileheader
);
4577 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4578 for curfname
in GetDirList
:
4579 if(re
.findall("^[.|/]", curfname
)):
4582 fname
= "./"+curfname
;
4584 VerbosePrintOut(fname
);
4585 if(not followlink
or followlink
is None):
4586 fstatinfo
= os
.lstat(fname
);
4588 fstatinfo
= os
.stat(fname
);
4589 fpremode
= fstatinfo
.st_mode
;
4590 finode
= fstatinfo
.st_ino
;
4591 flinkcount
= fstatinfo
.st_nlink
;
4593 if(stat
.S_ISREG(fpremode
)):
4595 elif(stat
.S_ISLNK(fpremode
)):
4597 elif(stat
.S_ISCHR(fpremode
)):
4599 elif(stat
.S_ISBLK(fpremode
)):
4601 elif(stat
.S_ISDIR(fpremode
)):
4603 elif(stat
.S_ISFIFO(fpremode
)):
4605 elif(stat
.S_ISSOCK(fpremode
)):
4607 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
4609 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
4611 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
4616 fbasedir
= os
.path
.dirname(fname
);
4618 if(not followlink
and finode
!=0):
4620 if(finode
in inodelist
):
4622 flinkname
= inodetofile
[finode
];
4626 fcurinode
= inodetocatinode
[finode
];
4627 if(finode
not in inodelist
):
4628 inodelist
.append(finode
);
4629 inodetofile
.update({finode
: fname
});
4630 inodetocatinode
.update({finode
: curinode
});
4634 fcurinode
= curinode
;
4635 curinode
= curinode
+ 1;
4637 fcurinode
= curinode
;
4638 curinode
= curinode
+ 1;
4639 curfid
= curfid
+ 1;
4641 flinkname
= os
.readlink(fname
);
4642 fdev
= fstatinfo
.st_dev
;
4643 getfdev
= GetDevMajorMinor(fdev
);
4644 fdev_minor
= getfdev
[0];
4645 fdev_major
= getfdev
[1];
4646 frdev
= fstatinfo
.st_dev
;
4647 if(hasattr(fstatinfo
, "st_rdev")):
4648 frdev
= fstatinfo
.st_rdev
;
4650 frdev
= fstatinfo
.st_dev
;
4651 getfrdev
= GetDevMajorMinor(frdev
);
4652 frdev_minor
= getfrdev
[0];
4653 frdev_major
= getfrdev
[1];
4654 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
4656 if(ftype
==0 or ftype
==7):
4657 fsize
= fstatinfo
.st_size
;
4658 fatime
= fstatinfo
.st_atime
;
4659 fmtime
= fstatinfo
.st_mtime
;
4660 fctime
= fstatinfo
.st_ctime
;
4661 if(hasattr(fstatinfo
, "st_birthtime")):
4662 fbtime
= fstatinfo
.st_birthtime
;
4664 fbtime
= fstatinfo
.st_ctime
;
4665 fmode
= fstatinfo
.st_mode
;
4666 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
4667 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
4668 fuid
= fstatinfo
.st_uid
;
4669 fgid
= fstatinfo
.st_gid
;
4674 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
4675 funame
= userinfo
.pw_name
;
4684 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
4685 fgname
= groupinfo
.gr_name
;
4690 fdev_minor
= fdev_minor
;
4691 fdev_major
= fdev_major
;
4692 frdev_minor
= frdev_minor
;
4693 frdev_major
= frdev_major
;
4695 flinkcount
= flinkcount
;
4696 if(hasattr(fstatinfo
, "st_file_attributes")):
4697 fwinattributes
= fstatinfo
.st_file_attributes
;
4700 fcontents
= BytesIO();
4701 if(ftype
==0 or ftype
==7):
4702 with
open(fname
, "rb") as fpc
:
4703 shutil
.copyfileobj(fpc
, fcontents
);
4704 if(followlink
and (ftype
==1 or ftype
==2)):
4705 flstatinfo
= os
.stat(flinkname
);
4706 with
open(flinkname
, "rb") as fpc
:
4707 shutil
.copyfileobj(fpc
, fcontents
);
4708 fcontents
.seek(0, 0);
4709 ftypehex
= format(ftype
, 'x').lower();
4710 extrafields
= len(extradata
);
4711 extrafieldslist
= extradata
;
4712 catfextrafields
= extrafields
;
4713 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
4714 if(len(extradata
)>0):
4715 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4716 extrasizelen
= len(extrasizestr
);
4717 extrasizelenhex
= format(extrasizelen
, 'x').lower();
4718 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()];
4719 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
4720 catoutlenhex
= format(catoutlen
, 'x').lower();
4721 catoutlist
.insert(0, catoutlenhex
);
4722 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
4723 if(len(extradata
)>0):
4724 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4725 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
4726 catfnumfields
= catoutlen
;
4727 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
4728 fcontents
.seek(0, 0);
4729 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
4730 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4731 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
4732 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
4733 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
4734 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4735 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4736 nullstrecd
= formatspecs
[5].encode('UTF-8');
4737 fheadtell
+= len(catfileoutstr
) + 1;
4738 catfcontentend
= fheadtell
- 1;
4739 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
4740 pyhascontents
= False;
4741 if(int(fsize
)>0 and not listonly
):
4742 pyhascontents
= True;
4743 if(int(fsize
)>0 and listonly
):
4744 fcontents
= BytesIO();
4745 pyhascontents
= False;
4746 fcontents
.seek(0, 0);
4747 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
} });
4748 fileidnum
= fileidnum
+ 1;
4751 def TarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4757 inodetocatinode
= {};
4761 if(hasattr(sys
.stdin
, "buffer")):
4762 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
4764 shutil
.copyfileobj(sys
.stdin
, infile
);
4769 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4770 infile
= download_file_from_internet_file(infile
);
4775 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
4777 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
4779 if(not tarfile
.is_tarfile(infile
)):
4781 except AttributeError:
4782 if(not is_tarfile(infile
)):
4787 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4788 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
4790 tarfp
= tarfile
.open(infile
, "r");
4791 except FileNotFoundError
:
4793 fnumfiles
= int(len(tarfp
.getmembers()));
4794 catver
= formatspecs
[6];
4795 fileheaderver
= str(int(catver
.replace(".", "")));
4796 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4797 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4798 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4799 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4800 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4801 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4802 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4803 fheadtell
= len(fileheader
);
4804 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4805 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
4806 if(re
.findall("^[.|/]", member
.name
)):
4807 fname
= member
.name
;
4809 fname
= "./"+member
.name
;
4811 VerbosePrintOut(fname
);
4812 fpremode
= member
.mode
;
4813 ffullmode
= member
.mode
;
4817 ffullmode
= member
.mode
+ stat
.S_IFREG
;
4819 elif(member
.isdev()):
4820 ffullmode
= member
.mode
;
4822 elif(member
.islnk()):
4823 ffullmode
= member
.mode
+ stat
.S_IFREG
;
4825 elif(member
.issym()):
4826 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
4828 elif(member
.ischr()):
4829 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
4831 elif(member
.isblk()):
4832 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
4834 elif(member
.isdir()):
4835 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
4837 elif(member
.isfifo()):
4838 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
4840 elif(member
.issparse()):
4841 ffullmode
= member
.mode
;
4844 ffullmode
= member
.mode
;
4847 fbasedir
= os
.path
.dirname(fname
);
4851 curfid
= curfid
+ 1;
4853 flinkname
= member
.linkname
;
4854 fdev_minor
= member
.devminor
;
4855 fdev_major
= member
.devmajor
;
4856 frdev_minor
= member
.devminor
;
4857 frdev_major
= member
.devmajor
;
4858 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
4860 elif(ftype
==0 or ftype
==7):
4861 fsize
= member
.size
;
4863 fsize
= member
.size
;
4864 fatime
= member
.mtime
;
4865 fmtime
= member
.mtime
;
4866 fctime
= member
.mtime
;
4867 fbtime
= member
.mtime
;
4869 fchmode
= stat
.S_IMODE(ffullmode
);
4870 ftypemod
= stat
.S_IFMT(ffullmode
);
4873 funame
= member
.uname
;
4874 fgname
= member
.gname
;
4875 flinkcount
= flinkcount
;
4876 fwinattributes
= int(0);
4877 fcontents
= BytesIO();
4878 if(ftype
==0 or ftype
==7):
4879 with tarfp
.extractfile(member
) as fpc
:
4880 shutil
.copyfileobj(fpc
, fcontents
);
4881 fcontents
.seek(0, 0);
4882 ftypehex
= format(ftype
, 'x').lower();
4883 extrafields
= len(extradata
);
4884 extrafieldslist
= extradata
;
4885 catfextrafields
= extrafields
;
4886 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
4887 if(len(extradata
)>0):
4888 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4889 extrasizelen
= len(extrasizestr
);
4890 extrasizelenhex
= format(extrasizelen
, 'x').lower();
4891 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()];
4892 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
4893 catoutlenhex
= format(catoutlen
, 'x').lower();
4894 catoutlist
.insert(0, catoutlenhex
);
4895 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
4896 if(len(extradata
)>0):
4897 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4898 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
4899 catfnumfields
= catoutlen
;
4900 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
4901 fcontents
.seek(0, 0);
4902 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
4903 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4904 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
4905 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
4906 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
4907 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4908 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4909 nullstrecd
= formatspecs
[5].encode('UTF-8');
4910 fheadtell
+= len(catfileoutstr
) + 1;
4911 catfcontentend
= fheadtell
- 1;
4912 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
4913 pyhascontents
= False;
4914 if(int(fsize
)>0 and not listonly
):
4915 pyhascontents
= True;
4916 if(int(fsize
)>0 and listonly
):
4918 pyhascontents
= False;
4919 fcontents
.seek(0, 0);
4920 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
} });
4921 fileidnum
= fileidnum
+ 1;
4924 def ZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4930 inodetocatinode
= {};
4934 if(hasattr(sys
.stdin
, "buffer")):
4935 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
4937 shutil
.copyfileobj(sys
.stdin
, infile
);
4942 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4943 infile
= download_file_from_internet_file(infile
);
4948 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
4952 if(not zipfile
.is_zipfile(infile
)):
4955 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
4956 except FileNotFoundError
:
4958 ziptest
= zipfp
.testzip();
4960 VerbosePrintOut("Bad file found!");
4961 fnumfiles
= int(len(zipfp
.infolist()));
4962 catver
= formatspecs
[6];
4963 fileheaderver
= str(int(catver
.replace(".", "")));
4964 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4965 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4966 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4967 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4968 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4969 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4970 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4971 fheadtell
= len(fileheader
);
4972 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4973 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
4974 if(re
.findall("^[.|/]", member
.filename
)):
4975 fname
= member
.filename
;
4977 fname
= "./"+member
.filename
;
4978 zipinfo
= zipfp
.getinfo(member
.filename
);
4980 VerbosePrintOut(fname
);
4981 if(not member
.is_dir()):
4982 fpremode
= stat
.S_IFREG
+ 438;
4983 elif(member
.is_dir()):
4984 fpremode
= stat
.S_IFDIR
+ 511;
4987 if(not member
.is_dir()):
4989 elif(member
.is_dir()):
4992 fbasedir
= os
.path
.dirname(fname
);
4996 curfid
= curfid
+ 1;
5004 fsize
= member
.file_size
;
5006 fsize
= member
.file_size
;
5007 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5008 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5009 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5010 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5011 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
5012 fwinattributes
= int(zipinfo
.external_attr
);
5013 if(not member
.is_dir()):
5014 fmode
= int(stat
.S_IFREG
+ 438);
5015 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5016 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5017 elif(member
.is_dir()):
5018 fmode
= int(stat
.S_IFDIR
+ 511);
5019 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5020 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5021 elif(zipinfo
.create_system
==3):
5022 fwinattributes
= int(0);
5023 fmode
= int(zipinfo
.external_attr
);
5025 fwinattributes
= int(0);
5026 if(not member
.is_dir()):
5027 fmode
= int(stat
.S_IFREG
+ 438);
5028 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5029 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5030 elif(member
.is_dir()):
5031 fmode
= int(stat
.S_IFDIR
+ 511);
5032 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5033 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5036 except AttributeError:
5042 except AttributeError:
5049 userinfo
= pwd
.getpwuid(os
.getuid());
5050 funame
= userinfo
.pw_name
;
5053 except AttributeError:
5061 groupinfo
= grp
.getgrgid(os
.getgid());
5062 fgname
= groupinfo
.gr_name
;
5065 except AttributeError:
5069 fcontents
= BytesIO();
5071 fcontents
.write(zipfp
.read(member
.filename
));
5072 fcontents
.seek(0, 0);
5073 ftypehex
= format(ftype
, 'x').lower();
5074 extrafields
= len(extradata
);
5075 extrafieldslist
= extradata
;
5076 catfextrafields
= extrafields
;
5077 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5078 if(len(extradata
)>0):
5079 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5080 extrasizelen
= len(extrasizestr
);
5081 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5082 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()];
5083 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5084 catoutlenhex
= format(catoutlen
, 'x').lower();
5085 catoutlist
.insert(0, catoutlenhex
);
5086 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5087 if(len(extradata
)>0):
5088 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5089 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5090 catfnumfields
= catoutlen
;
5091 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5092 fcontents
.seek(0, 0);
5093 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5094 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5095 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5096 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5097 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5098 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5099 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5100 nullstrecd
= formatspecs
[5].encode('UTF-8');
5101 fheadtell
+= len(catfileoutstr
) + 1;
5102 catfcontentend
= fheadtell
- 1;
5103 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5104 pyhascontents
= False;
5105 if(int(fsize
)>0 and not listonly
):
5106 pyhascontents
= True;
5107 if(int(fsize
)>0 and listonly
):
5108 fcontents
= BytesIO();
5109 pyhascontents
= False;
5110 fcontents
.seek(0, 0);
5111 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
} });
5112 fileidnum
= fileidnum
+ 1;
5115 if(not rarfile_support
):
5116 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5119 if(rarfile_support
):
5120 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5126 inodetocatinode
= {};
5128 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
5130 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5132 rarfp
= rarfile
.RarFile(infile
, "r");
5133 rartest
= rarfp
.testrar();
5135 VerbosePrintOut("Bad file found!");
5136 fnumfiles
= int(len(rarfp
.infolist()));
5137 catver
= formatspecs
[6];
5138 fileheaderver
= str(int(catver
.replace(".", "")));
5139 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5140 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5141 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5142 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5143 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5144 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
5145 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5146 fheadtell
= len(fileheader
);
5147 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5148 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5151 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
5154 member
.external_attr
5156 except AttributeError:
5158 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
5161 member
.external_attr
5163 except AttributeError:
5168 if(re
.findall("^[.|/]", member
.filename
)):
5169 fname
= member
.filename
;
5171 fname
= "./"+member
.filename
;
5172 rarinfo
= rarfp
.getinfo(member
.filename
);
5174 VerbosePrintOut(fname
);
5175 if(is_unix
and member
.external_attr
!=0):
5176 fpremode
= int(member
.external_attr
);
5177 elif(member
.is_file()):
5178 fpremode
= stat
.S_IFREG
+ 438;
5179 elif(member
.is_symlink()):
5180 fpremode
= stat
.S_IFLNK
+ 438;
5181 elif(member
.is_dir()):
5182 fpremode
= stat
.S_IFDIR
+ 511;
5183 if(is_windows
and member
.external_attr
!=0):
5184 fwinattributes
= int(member
.external_attr
);
5186 fwinattributes
= int(0);
5189 if(member
.is_file()):
5191 elif(member
.is_symlink()):
5193 elif(member
.is_dir()):
5197 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
5198 fbasedir
= os
.path
.dirname(fname
);
5202 curfid
= curfid
+ 1;
5210 fsize
= member
.file_size
;
5213 fatime
= int(member
.atime
.timestamp());
5215 fatime
= int(member
.mtime
.timestamp());
5216 except AttributeError:
5217 fatime
= int(member
.mtime
.timestamp());
5218 fmtime
= int(member
.mtime
.timestamp());
5221 fctime
= int(member
.ctime
.timestamp());
5223 fctime
= int(member
.mtime
.timestamp());
5224 except AttributeError:
5225 fctime
= int(member
.mtime
.timestamp());
5226 fbtime
= int(member
.mtime
.timestamp());
5227 if(is_unix
and member
.external_attr
!=0):
5228 fmode
= int(member
.external_attr
);
5229 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5230 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5231 elif(member
.is_file()):
5232 fmode
= int(stat
.S_IFREG
+ 438)
5233 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5234 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5235 elif(member
.is_symlink()):
5236 fmode
= int(stat
.S_IFLNK
+ 438)
5237 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5238 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5239 elif(member
.is_dir()):
5240 fmode
= int(stat
.S_IFDIR
+ 511)
5241 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5242 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5245 except AttributeError:
5251 except AttributeError:
5258 userinfo
= pwd
.getpwuid(os
.getuid());
5259 funame
= userinfo
.pw_name
;
5262 except AttributeError:
5270 groupinfo
= grp
.getgrgid(os
.getgid());
5271 fgname
= groupinfo
.gr_name
;
5274 except AttributeError:
5278 fcontents
= BytesIO();
5280 fcontents
.write(rarfp
.read(member
.filename
));
5281 fcontents
.seek(0, 0);
5282 ftypehex
= format(ftype
, 'x').lower();
5283 extrafields
= len(extradata
);
5284 extrafieldslist
= extradata
;
5285 catfextrafields
= extrafields
;
5286 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5287 if(len(extradata
)>0):
5288 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5289 extrasizelen
= len(extrasizestr
);
5290 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5291 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()];
5292 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5293 catoutlenhex
= format(catoutlen
, 'x').lower();
5294 catoutlist
.insert(0, catoutlenhex
);
5295 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5296 if(len(extradata
)>0):
5297 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5298 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5299 catfnumfields
= 24 + catfextrafields
;
5300 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5301 fcontents
.seek(0, 0);
5302 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5303 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5304 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5305 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5306 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5307 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5308 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5309 nullstrecd
= formatspecs
[5].encode('UTF-8');
5310 fheadtell
+= len(catfileoutstr
) + 1;
5311 catfcontentend
= fheadtell
- 1;
5312 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5313 pyhascontents
= False;
5314 if(int(fsize
)>0 and not listonly
):
5315 pyhascontents
= True;
5316 if(int(fsize
)>0 and listonly
):
5317 fcontents
= BytesIO();
5318 pyhascontents
= False;
5319 fcontents
.seek(0, 0);
5320 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
} });
5321 fileidnum
= fileidnum
+ 1;
5324 if(not py7zr_support
):
5325 def SevenZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5329 def SevenZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5335 inodetocatinode
= {};
5337 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
5338 file_content
= szpfp
.readall();
5339 #sztest = szpfp.testzip();
5340 sztestalt
= szpfp
.test();
5342 VerbosePrintOut("Bad file found!");
5343 numfiles
= int(len(szpfp
.list()));
5344 catver
= formatspecs
[6];
5345 fileheaderver
= str(int(catver
.replace(".", "")));
5346 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5347 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5348 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5349 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5350 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5351 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
5352 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5353 fheadtell
= len(fileheader
);
5354 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5355 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
5356 if(re
.findall("^[.|/]", member
.filename
)):
5357 fname
= member
.filename
;
5359 fname
= "./"+member
.filename
;
5360 if(not member
.is_directory
):
5361 fpremode
= int(stat
.S_IFREG
+ 438);
5362 elif(member
.is_directory
):
5363 fpremode
= int(stat
.S_IFDIR
+ 511);
5364 fwinattributes
= int(0);
5367 if(member
.is_directory
):
5372 fbasedir
= os
.path
.dirname(fname
);
5376 curfid
= curfid
+ 1;
5383 fatime
= int(member
.creationtime
.timestamp());
5384 fmtime
= int(member
.creationtime
.timestamp());
5385 fctime
= int(member
.creationtime
.timestamp());
5386 fbtime
= int(member
.creationtime
.timestamp());
5387 if(member
.is_directory
):
5388 fmode
= int(stat
.S_IFDIR
+ 511)
5389 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5390 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5392 fmode
= int(stat
.S_IFLNK
+ 438)
5393 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5394 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5397 except AttributeError:
5403 except AttributeError:
5410 userinfo
= pwd
.getpwuid(os
.getuid());
5411 funame
= userinfo
.pw_name
;
5414 except AttributeError:
5422 groupinfo
= grp
.getgrgid(os
.getgid());
5423 fgname
= groupinfo
.gr_name
;
5426 except AttributeError:
5430 fcontents
= BytesIO();
5432 fcontents
.write(file_content
[member
.filename
].read());
5433 fsize
= format(fcontents
.tell(), 'x').lower();
5435 fcontents
.seek(0, 0);
5436 ftypehex
= format(ftype
, 'x').lower();
5437 extrafields
= len(extradata
);
5438 extrafieldslist
= extradata
;
5439 catfextrafields
= extrafields
;
5440 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5441 if(len(extradata
)>0):
5442 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5443 extrasizelen
= len(extrasizestr
);
5444 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5445 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()];
5446 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5447 catoutlenhex
= format(catoutlen
, 'x').lower();
5448 catoutlist
.insert(0, catoutlenhex
);
5449 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5450 if(len(extradata
)>0):
5451 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5452 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5453 catfnumfields
= 24 + catfextrafields
;
5454 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5455 fcontents
.seek(0, 0);
5456 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5457 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5458 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5459 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5460 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5461 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5462 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5463 nullstrecd
= formatspecs
[5].encode('UTF-8');
5464 fheadtell
+= len(catfileoutstr
) + 1;
5465 catfcontentend
= fheadtell
- 1;
5466 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5467 pyhascontents
= False;
5468 if(int(fsize
)>0 and not listonly
):
5469 pyhascontents
= True;
5470 if(int(fsize
)>0 and listonly
):
5472 pyhascontents
= False;
5473 fcontents
.seek(0, 0);
5474 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
} });
5475 fileidnum
= fileidnum
+ 1;
5478 def InFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5479 checkcompressfile
= CheckCompressionSubType(infiles
, formatspecs
, True);
5480 if(checkcompressfile
=="tarfile"):
5481 return TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5482 elif(checkcompressfile
=="zipfile"):
5483 return ZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5484 elif(checkcompressfile
=="catfile"):
5485 return ArchiveFileToArray(infile
, 0, 0, listonly
, False, formatspecs
, False);
5486 elif(rarfile_support
and checkcompressfile
=="rarfile"):
5487 return RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5488 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
5489 return SevenZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5494 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):
5495 outarray
= BytesIO();
5496 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
5497 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5498 return listcatfiles
;
5500 def ArchiveFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5501 if(isinstance(infile
, dict)):
5502 listcatfiles
= infile
;
5504 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5505 infile
= RemoveWindowsPath(infile
);
5506 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5507 if(not listcatfiles
):
5509 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': {}}}};
5511 catarray
.update({'catfp': listcatfiles
['catfp']});
5512 lenlist
= len(listcatfiles
['ffilelist']);
5514 lcfx
= int(listcatfiles
['fnumfiles']);
5515 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5516 lcfx
= int(lenlist
);
5518 lcfx
= int(listcatfiles
['fnumfiles']);
5520 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5521 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5522 catarray
['filetoid'].update(filetoidarray
);
5523 catarray
['idtofile'].update(idtofilearray
);
5524 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5525 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5526 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5527 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5528 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5529 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5530 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5531 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5532 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5533 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5534 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5535 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5536 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5537 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5538 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5539 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5540 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5541 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5542 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5543 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5544 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5545 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5546 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5547 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5548 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5549 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5550 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5551 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5552 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5553 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5554 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5558 create_alias_function("", __file_format_name__
, "ToArrayIndex", ArchiveFileToArrayIndex
);
5560 def ListDirToArrayIndexAlt(infiles
, dirlistfromtxt
=False, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5561 listcatfiles
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5562 if(not listcatfiles
):
5564 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': {}}}};
5565 lenlist
= len(listcatfiles
['ffilelist']);
5567 lcfx
= int(listcatfiles
['fnumfiles']);
5568 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5569 lcfx
= int(lenlist
);
5571 lcfx
= int(listcatfiles
['fnumfiles']);
5573 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5574 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5575 catarray
['filetoid'].update(filetoidarray
);
5576 catarray
['idtofile'].update(idtofilearray
);
5577 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5578 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5579 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5580 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5581 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5582 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5583 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5584 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5585 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5586 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5587 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5588 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5589 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5590 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5591 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5592 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5593 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5594 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5595 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5596 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5597 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5598 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5599 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5600 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5601 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5602 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5603 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5604 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5605 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5606 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5607 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5611 def TarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5612 listcatfiles
= TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5613 if(not listcatfiles
):
5615 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': {}}}};
5616 lenlist
= len(listcatfiles
['ffilelist']);
5618 lcfx
= int(listcatfiles
['fnumfiles']);
5619 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5620 lcfx
= int(lenlist
);
5622 lcfx
= int(listcatfiles
['fnumfiles']);
5624 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5625 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5626 catarray
['filetoid'].update(filetoidarray
);
5627 catarray
['idtofile'].update(idtofilearray
);
5628 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5629 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5630 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5631 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5632 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5633 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5634 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5635 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5636 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5637 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5638 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5639 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5640 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5641 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5642 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5643 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5644 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5645 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5646 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5647 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5648 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5649 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5650 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5651 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5652 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5653 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5654 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5655 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5656 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5657 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5658 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5662 def ZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5663 listcatfiles
= ZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5664 if(not listcatfiles
):
5666 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': {}}}};
5667 lenlist
= len(listcatfiles
['ffilelist']);
5669 lcfx
= int(listcatfiles
['fnumfiles']);
5670 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5671 lcfx
= int(lenlist
);
5673 lcfx
= int(listcatfiles
['fnumfiles']);
5675 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5676 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5677 catarray
['filetoid'].update(filetoidarray
);
5678 catarray
['idtofile'].update(idtofilearray
);
5679 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5680 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5681 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5682 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5683 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5684 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5685 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5686 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5687 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5688 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5689 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5690 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5691 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5692 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5693 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5694 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5695 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5696 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5697 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5698 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5699 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5700 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5701 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5702 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5703 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5704 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5705 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5706 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5707 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5708 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5709 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5713 if(not rarfile_support
):
5714 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5717 if(rarfile_support
):
5718 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5719 listcatfiles
= RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5720 if(not listcatfiles
):
5722 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': {}}}};
5723 lenlist
= len(listcatfiles
['ffilelist']);
5725 lcfx
= int(listcatfiles
['fnumfiles']);
5726 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5727 lcfx
= int(lenlist
);
5729 lcfx
= int(listcatfiles
['fnumfiles']);
5731 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5732 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5733 catarray
['filetoid'].update(filetoidarray
);
5734 catarray
['idtofile'].update(idtofilearray
);
5735 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5736 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5737 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5738 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5739 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5740 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5741 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5742 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5743 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5744 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5745 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5746 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5747 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5748 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5749 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5750 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5751 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5752 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5753 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5754 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5755 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5756 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5757 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5758 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5759 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5760 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5761 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5762 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5763 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5764 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5765 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5769 if(not py7zr_support
):
5770 def SevenZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5774 def SevenZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5775 listcatfiles
= SevenZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5776 if(not listcatfiles
):
5778 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': {}}}};
5779 lenlist
= len(listcatfiles
['ffilelist']);
5781 lcfx
= int(listcatfiles
['fnumfiles']);
5782 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5783 lcfx
= int(lenlist
);
5785 lcfx
= int(listcatfiles
['fnumfiles']);
5787 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5788 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5789 catarray
['filetoid'].update(filetoidarray
);
5790 catarray
['idtofile'].update(idtofilearray
);
5791 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5792 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5793 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5794 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5795 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5796 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5797 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5798 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5799 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5800 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5801 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5802 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5803 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5804 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5805 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5806 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5807 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5808 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5809 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5810 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5811 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5812 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5813 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5814 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5815 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5816 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5817 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5818 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5819 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5820 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5821 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5825 def ArchiveFileStringToArrayIndex(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5826 catfp
= BytesIO(catstr
);
5827 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5828 return listcatfiles
;
5830 create_alias_function("", __file_format_name__
, "StringToArrayIndex", ArchiveFileStringToArrayIndex
);
5832 def TarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5834 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
5835 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5836 return listcatfiles
;
5838 def ZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5840 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
5841 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5842 return listcatfiles
;
5844 if(not rarfile_support
):
5845 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5848 if(rarfile_support
):
5849 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5851 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
5852 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5853 return listcatfiles
;
5855 if(not py7zr_support
):
5856 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5860 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5862 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
5863 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5864 return listcatfiles
;
5866 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):
5867 outarray
= BytesIO();
5868 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
, True);
5869 listcatfiles
= ArchiveFileToArrayIndex(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
)
5870 return listcatfiles
;
5872 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):
5873 if(isinstance(infile
, dict)):
5874 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5875 listcatfiles
= prelistcatfiles
['list'];
5877 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5878 infile
= RemoveWindowsPath(infile
);
5880 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5881 listcatfiles
= prelistcatfiles
['list'];
5883 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5884 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
5885 outfile
= RemoveWindowsPath(outfile
);
5886 checksumtype
= checksumtype
.lower();
5887 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
5888 checksumtype
="crc32";
5889 if(checksumtype
=="none"):
5891 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
5893 if(compression
not in compressionlist
and compression
is None):
5894 compression
= "auto";
5896 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5897 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
5898 if(os
.path
.exists(outfile
)):
5900 if(not listcatfiles
):
5905 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
5907 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
5910 fbasename
= os
.path
.splitext(outfile
)[0];
5911 fextname
= os
.path
.splitext(outfile
)[1];
5912 catfp
= CompressOpenFile(outfile
, compressionlevel
);
5913 catver
= formatspecs
[6];
5914 fileheaderver
= str(int(catver
.replace(".", "")));
5915 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5916 catfp
.write(fileheader
.encode('UTF-8'));
5917 lenlist
= len(listcatfiles
['ffilelist']);
5918 fnumfiles
= int(listcatfiles
['fnumfiles']);
5919 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
5920 fnumfiles
= lenlist
;
5921 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5922 fnumfilesa
= AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5923 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
5924 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5925 catfp
.write(fnumfilesa
.encode('UTF-8'));
5928 os
.fsync(catfp
.fileno());
5929 except io
.UnsupportedOperation
:
5931 except AttributeError:
5933 lenlist
= len(listcatfiles
['ffilelist']);
5934 fnumfiles
= int(listcatfiles
['fnumfiles']);
5936 lcfx
= int(listcatfiles
['fnumfiles']);
5937 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5938 lcfx
= int(lenlist
);
5940 lcfx
= int(listcatfiles
['fnumfiles']);
5948 catfhstart
= catfp
.tell();
5949 if(re
.findall("^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
5950 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
5952 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
5954 VerbosePrintOut(fname
);
5955 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
5956 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
5957 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
5958 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
5959 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
5960 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
5961 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
5962 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
5963 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
5964 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
5965 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
5966 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
5967 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
5968 finode
= listcatfiles
['ffilelist'][reallcfi
]['finode'];
5969 flinkcount
= listcatfiles
['ffilelist'][reallcfi
]['flinkcount'];
5970 fwinattributes
= flinkinfo
['ffilelist'][reallcfi
]['fwinattributes'];
5971 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
5972 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
5973 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
5974 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
5975 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
5976 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
5977 if(len(extradata
)>0):
5978 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(extradata
);
5979 listcatfiles
['ffilelist'][reallcfi
]['fextralist'] = extradata
;
5980 extrafields
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']), 'x').lower();
5981 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5982 if(len(extradata
)>0):
5983 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5984 extrasizelen
= format(len(extrasizestr
), 'x').lower();
5985 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
5987 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
5988 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
5989 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
5990 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
5991 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
5992 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
5993 flinkname
= flinkinfo
['flinkname'];
5994 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
5995 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
5996 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
5997 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
5998 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
5999 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
6000 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
6001 funame
= flinkinfo
['funame'];
6002 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
6003 fgname
= flinkinfo
['fgname'];
6004 finode
= flinkinfo
['finode'];
6005 flinkcount
= flinkinfo
['flinkcount'];
6006 fwinattributes
= flinkinfo
['fwinattributes'];
6007 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
6008 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
6009 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
6010 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
6011 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
6012 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
6013 if(len(extradata
)>0):
6014 flinkinfo
['fextrafields'] = len(extradata
);
6015 flinkinfo
['fextralist'] = extradata
;
6016 extrafields
= format(int(flinkinfo
['fextrafields']), 'x').lower();
6017 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
6018 if(len(extradata
)>0):
6019 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6020 extrasizelen
= format(len(extrasizestr
), 'x').lower();
6021 fcontents
= flinkinfo
['fcontents'];
6022 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
6024 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
6025 fcurfid
= format(curfid
, 'x').lower();
6026 if(not followlink
and finode
!=0):
6027 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
6028 fcurinode
= format(int(curinode
), 'x').lower();
6029 inodetofile
.update({curinode
: fname
});
6030 filetoinode
.update({fname
: curinode
});
6031 curinode
= curinode
+ 1;
6033 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
6035 fcurinode
= format(int(curinode
), 'x').lower();
6036 curinode
= curinode
+ 1;
6037 curfid
= curfid
+ 1;
6038 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
];
6039 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6040 catoutlenhex
= format(catoutlen
, 'x').lower();
6041 catoutlist
.insert(0, catoutlenhex
);
6042 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
6043 if(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']>0):
6044 extrafieldslist
= [];
6046 exil
= listcatfiles
['ffilelist'][reallcfi
]['fextrafields'];
6048 extrafieldslist
.append(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6050 catfileoutstr
+= AppendNullBytes([extrafieldslist
], formatspecs
[5]);
6051 catfileoutstr
+= AppendNullBytes([checksumtype
], formatspecs
[5]);
6052 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
6053 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
6054 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6055 fcontents
.seek(0, 0);
6056 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
6057 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6058 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
6059 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
6060 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6061 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6062 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6063 nullstrecd
= formatspecs
[5].encode('UTF-8');
6064 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
6065 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
6066 catfp
.write(catfileout
);
6069 os
.fsync(catfp
.fileno());
6070 except io
.UnsupportedOperation
:
6072 except AttributeError:
6075 reallcfi
= reallcfi
+ 1;
6077 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
6078 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6079 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
6082 os
.fsync(catfp
.fileno());
6083 except io
.UnsupportedOperation
:
6085 except AttributeError:
6089 if(hasattr(sys
.stdout
, "buffer")):
6090 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
6092 shutil
.copyfileobj(catfp
, sys
.stdout
);
6093 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6094 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
6096 upload_file_to_internet_file(catfp
, outfile
);
6104 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
6106 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6107 catfp
= BytesIO(catstr
);
6108 listcatfiles
= RePackArchiveFile(catfp
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6109 return listcatfiles
;
6111 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
6113 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):
6114 outarray
= BytesIO();
6115 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6116 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6117 return listcatfiles
;
6119 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
6121 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):
6122 if(outdir
is not None):
6123 outdir
= RemoveWindowsPath(outdir
);
6125 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6126 if(isinstance(infile
, dict)):
6127 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6128 listcatfiles
= prelistcatfiles
['list'];
6130 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6131 infile
= RemoveWindowsPath(infile
);
6133 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6134 listcatfiles
= prelistcatfiles
['list'];
6136 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6137 if(not listcatfiles
):
6139 lenlist
= len(listcatfiles
['ffilelist']);
6140 fnumfiles
= int(listcatfiles
['fnumfiles']);
6142 lcfx
= int(listcatfiles
['fnumfiles']);
6143 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6144 lcfx
= int(lenlist
);
6146 lcfx
= int(listcatfiles
['fnumfiles']);
6152 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
6153 funame
= userinfo
.pw_name
;
6162 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
6163 fgname
= groupinfo
.gr_name
;
6169 VerbosePrintOut(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6170 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6171 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6172 listcatfiles
['ffilelist'][lcfi
]['fcontents'].seek(0, 0);
6173 shutil
.copyfileobj(listcatfiles
['ffilelist'][lcfi
]['fcontents'], fpc
);
6176 os
.fsync(fpc
.fileno());
6177 except io
.UnsupportedOperation
:
6179 except AttributeError:
6181 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6182 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6183 if(preservepermissions
):
6184 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6186 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6187 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6189 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6190 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6191 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6196 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6197 funame
= userinfo
.pw_name
;
6206 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6207 fgname
= groupinfo
.gr_name
;
6212 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6213 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6214 flinkinfo
['fcontents'].seek(0, 0);
6215 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6218 os
.fsync(fpc
.fileno());
6219 except io
.UnsupportedOperation
:
6221 except AttributeError:
6223 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6224 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6225 if(preservepermissions
):
6226 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6228 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6229 if(flinkinfo
['ftype']==1):
6230 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6231 if(flinkinfo
['ftype']==2):
6232 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6233 if(flinkinfo
['ftype']==5):
6234 if(preservepermissions
):
6235 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6237 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6238 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6239 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6240 if(preservepermissions
):
6241 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6243 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6244 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6245 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6247 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6248 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6250 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6251 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6252 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6257 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6258 funame
= userinfo
.pw_name
;
6267 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6268 fgname
= groupinfo
.gr_name
;
6273 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6274 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6275 flinkinfo
['fcontents'].seek(0, 0);
6276 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6279 os
.fsync(fpc
.fileno());
6280 except io
.UnsupportedOperation
:
6282 except AttributeError:
6284 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6285 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6286 if(preservepermissions
):
6287 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6289 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6290 if(flinkinfo
['ftype']==1):
6291 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6292 if(flinkinfo
['ftype']==2):
6293 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6294 if(flinkinfo
['ftype']==5):
6295 if(preservepermissions
):
6296 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6298 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6299 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6300 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6301 if(preservepermissions
):
6302 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6304 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6305 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6306 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6308 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6309 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6310 if(preservepermissions
):
6311 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6313 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6314 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6315 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6316 if(preservepermissions
):
6317 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6319 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6320 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
6321 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6324 return listcatfiles
['ffilelist']['catfp'];
6328 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
6330 if(hasattr(shutil
, "register_unpack_format")):
6331 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
6332 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_delimiter__
, False, False);
6333 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
6335 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6336 catfp
= BytesIO(catstr
);
6337 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6338 return listcatfiles
;
6340 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
6342 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6343 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6344 if(isinstance(infile
, dict)):
6345 listcatfiles
= infile
;
6347 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6348 infile
= RemoveWindowsPath(infile
);
6349 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, skipchecksum
, formatspecs
, returnfp
);
6350 if(not listcatfiles
):
6352 lenlist
= len(listcatfiles
['ffilelist']);
6353 fnumfiles
= int(listcatfiles
['fnumfiles']);
6355 lcfx
= int(listcatfiles
['fnumfiles']);
6356 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6357 lcfx
= int(lenlist
);
6359 lcfx
= int(listcatfiles
['fnumfiles']);
6362 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
6364 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
6366 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' } };
6367 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
6368 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6369 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6370 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6371 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6372 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
6373 if(len(fuprint
)<=0):
6374 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
6375 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
6376 if(len(fgprint
)<=0):
6377 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
6378 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
));
6381 return listcatfiles
['catfp'];
6385 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
6387 def ArchiveFileStringListFiles(catstr
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6388 catfp
= BytesIO(catstr
);
6389 listcatfiles
= ArchiveFileListFiles(catstr
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6390 return listcatfiles
;
6392 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileStringListFiles
);
6394 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
6395 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6398 if(hasattr(sys
.stdin
, "buffer")):
6399 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
6401 shutil
.copyfileobj(sys
.stdin
, infile
);
6406 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
6407 infile
= download_file_from_internet_file(infile
);
6412 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6414 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
6416 if(not tarfile
.is_tarfile(infile
)):
6418 except AttributeError:
6419 if(not is_tarfile(infile
)):
6424 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
6425 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
6427 tarfp
= tarfile
.open(infile
, "r");
6428 except FileNotFoundError
:
6432 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
6433 returnval
.update({lcfi
: member
.name
});
6434 fpremode
= member
.mode
;
6435 ffullmode
= member
.mode
;
6439 ffullmode
= member
.mode
+ stat
.S_IFREG
;
6441 elif(member
.isdev()):
6442 ffullmode
= member
.mode
;
6444 elif(member
.islnk()):
6445 ffullmode
= member
.mode
+ stat
.S_IFREG
;
6447 elif(member
.issym()):
6448 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
6450 elif(member
.ischr()):
6451 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
6453 elif(member
.isblk()):
6454 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
6456 elif(member
.isdir()):
6457 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
6459 elif(member
.isfifo()):
6460 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
6462 elif(member
.issparse()):
6463 ffullmode
= member
.mode
;
6466 VerbosePrintOut(member
.name
);
6468 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' } };
6469 printfname
= member
.name
;
6471 printfname
= member
.name
+ " link to " + member
.linkname
;
6472 elif(member
.issym()):
6473 printfname
= member
.name
+ " -> " + member
.linkname
;
6474 fuprint
= member
.uname
;
6475 if(len(fuprint
)<=0):
6476 fuprint
= member
.uid
;
6477 fgprint
= member
.gname
;
6478 if(len(fgprint
)<=0):
6479 fgprint
= member
.gid
;
6480 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
));
6483 return listcatfiles
['catfp'];
6487 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
6488 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6491 if(hasattr(sys
.stdin
, "buffer")):
6492 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
6494 shutil
.copyfileobj(sys
.stdin
, infile
);
6499 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
6500 infile
= download_file_from_internet_file(infile
);
6505 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6509 if(not zipfile
.is_zipfile(infile
)):
6512 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
6513 except FileNotFoundError
:
6517 ziptest
= zipfp
.testzip();
6519 VerbosePrintOut("Bad file found!");
6520 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
6521 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
6522 fwinattributes
= int(zipinfo
.external_attr
);
6523 if(not member
.is_dir()):
6524 fmode
= int(stat
.S_IFREG
+ 438);
6525 fchmode
= int(stat
.S_IMODE(fmode
));
6526 ftypemod
= int(stat
.S_IFMT(fmode
));
6527 elif(member
.is_dir()):
6528 fmode
= int(stat
.S_IFDIR
+ 511);
6529 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6530 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6531 elif(zipinfo
.create_system
==3):
6532 fwinattributes
=int(0);
6533 fmode
= int(zipinfo
.external_attr
);
6534 fchmode
= int(stat
.S_IMODE(fmode
));
6535 ftypemod
= int(stat
.S_IFMT(fmode
));
6537 fwinattributes
= int(0);
6538 if(not member
.is_dir()):
6539 fmode
= int(stat
.S_IFREG
+ 438);
6540 fchmode
= int(stat
.S_IMODE(fmode
));
6541 ftypemod
= int(stat
.S_IFMT(fmode
));
6542 elif(member
.is_dir()):
6543 fmode
= int(stat
.S_IFDIR
+ 511);
6544 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6545 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6546 returnval
.update({lcfi
: member
.filename
});
6548 VerbosePrintOut(member
.filename
);
6550 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' } };
6552 for fmodval
in str(oct(fmode
))[-3:]:
6553 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
6554 if(not member
.is_dir()):
6556 permissionstr
= "-" + permissionstr
;
6557 elif(member
.is_dir()):
6559 permissionstr
= "d" + permissionstr
;
6560 printfname
= member
.filename
;
6562 fuid
= int(os
.getuid());
6563 except AttributeError:
6568 fgid
= int(os
.getgid());
6569 except AttributeError:
6576 userinfo
= pwd
.getpwuid(os
.getuid());
6577 funame
= userinfo
.pw_name
;
6580 except AttributeError:
6588 groupinfo
= grp
.getgrgid(os
.getgid());
6589 fgname
= groupinfo
.gr_name
;
6592 except AttributeError:
6597 if(len(fuprint
)<=0):
6598 fuprint
= str(fuid
);
6600 if(len(fgprint
)<=0):
6601 fgprint
= str(fgid
);
6602 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
));
6605 return listcatfiles
['catfp'];
6609 if(not rarfile_support
):
6610 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
6611 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6612 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6615 if(rarfile_support
):
6616 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
6617 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6618 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6620 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
6624 rarfp
= rarfile
.RarFile(infile
, "r");
6625 rartest
= rarfp
.testrar();
6627 VerbosePrintOut("Bad file found!");
6628 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
6631 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
6634 member
.external_attr
6636 except AttributeError:
6638 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
6641 member
.external_attr
6643 except AttributeError:
6648 if(is_unix
and member
.external_attr
!=0):
6649 fpremode
= int(member
.external_attr
);
6650 elif(member
.is_file()):
6651 fpremode
= int(stat
.S_IFREG
+ 438);
6652 elif(member
.is_symlink()):
6653 fpremode
= int(stat
.S_IFLNK
+ 438);
6654 elif(member
.is_dir()):
6655 fpremode
= int(stat
.S_IFDIR
+ 511);
6656 if(is_windows
and member
.external_attr
!=0):
6657 fwinattributes
= int(member
.external_attr
);
6659 fwinattributes
= int(0);
6660 if(is_unix
and member
.external_attr
!=0):
6661 fmode
= int(member
.external_attr
);
6662 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
6663 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
6664 elif(member
.is_file()):
6665 fmode
= int(stat
.S_IFREG
+ 438);
6666 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
6667 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
6668 elif(member
.is_symlink()):
6669 fmode
= int(stat
.S_IFLNK
+ 438);
6670 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
6671 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
6672 elif(member
.is_dir()):
6673 fmode
= int(stat
.S_IFDIR
+ 511);
6674 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6675 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6676 returnval
.update({lcfi
: member
.filename
});
6678 VerbosePrintOut(member
.filename
);
6680 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' } };
6682 for fmodval
in str(oct(fmode
))[-3:]:
6683 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
6684 if(member
.is_file()):
6686 permissionstr
= "-" + permissionstr
;
6687 printfname
= member
.filename
;
6688 elif(member
.is_symlink()):
6690 permissionstr
= "l" + permissionstr
;
6691 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
6692 elif(member
.is_dir()):
6694 permissionstr
= "d" + permissionstr
;
6695 printfname
= member
.filename
;
6697 fuid
= int(os
.getuid());
6698 except AttributeError:
6703 fgid
= int(os
.getgid());
6704 except AttributeError:
6711 userinfo
= pwd
.getpwuid(os
.getuid());
6712 funame
= userinfo
.pw_name
;
6715 except AttributeError:
6723 groupinfo
= grp
.getgrgid(os
.getgid());
6724 fgname
= groupinfo
.gr_name
;
6727 except AttributeError:
6732 if(len(fuprint
)<=0):
6733 fuprint
= str(fuid
);
6735 if(len(fgprint
)<=0):
6736 fgprint
= str(fgid
);
6737 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
6740 return listcatfiles
['catfp'];
6744 if(not py7zr_support
):
6745 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
6746 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6747 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6751 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
6752 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6753 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6757 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
6758 file_content
= szpfp
.readall();
6759 #sztest = szpfp.testzip();
6760 sztestalt
= szpfp
.test();
6762 VerbosePrintOut("Bad file found!");
6763 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
6764 if(re
.findall("^[.|/]", member
.filename
)):
6765 fname
= member
.filename
;
6767 fname
= "./"+member
.filename
;
6768 if(not member
.is_directory
):
6769 fpremode
= int(stat
.S_IFREG
+ 438);
6770 elif(member
.is_directory
):
6771 fpremode
= int(stat
.S_IFDIR
+ 511);
6772 fwinattributes
= int(0);
6773 if(member
.is_directory
):
6774 fmode
= int(stat
.S_IFDIR
+ 511);
6775 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6776 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6778 fmode
= int(stat
.S_IFLNK
+ 438);
6779 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
6780 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
6781 returnval
.update({lcfi
: member
.filename
});
6783 VerbosePrintOut(member
.filename
);
6785 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' } };
6787 for fmodval
in str(oct(fmode
))[-3:]:
6788 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
6790 if(not member
.is_directory
):
6792 permissionstr
= "-" + permissionstr
;
6793 printfname
= member
.filename
;
6794 elif(member
.is_directory
):
6796 permissionstr
= "d" + permissionstr
;
6797 printfname
= member
.filename
;
6799 fsize
= len(file_content
[member
.filename
].read());
6800 file_content
[member
.filename
].close();
6802 fuid
= int(os
.getuid());
6803 except AttributeError:
6808 fgid
= int(os
.getgid());
6809 except AttributeError:
6816 userinfo
= pwd
.getpwuid(os
.getuid());
6817 funame
= userinfo
.pw_name
;
6820 except AttributeError:
6828 groupinfo
= grp
.getgrgid(os
.getgid());
6829 fgname
= groupinfo
.gr_name
;
6832 except AttributeError:
6837 if(len(fuprint
)<=0):
6838 fuprint
= str(fuid
);
6840 if(len(fgprint
)<=0):
6841 fgprint
= str(fgid
);
6842 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(fsize
).rjust(15) + " " + member
.creationtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
6845 return listcatfiles
['catfp'];
6849 def InFileListFiles(infile
, verbose
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6850 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6851 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
6852 if(checkcompressfile
=="tarfile"):
6853 return TarFileListFiles(infile
, verbose
, returnfp
);
6854 elif(checkcompressfile
=="zipfile"):
6855 return ZipFileListFiles(infile
, verbose
, returnfp
);
6856 elif(checkcompressfile
=="catfile"):
6857 return ArchiveFileListFiles(infile
, 0, 0, False, formatspecs
, verbose
, returnfp
);
6858 elif(rarfile_support
and checkcompressfile
=="rarfile"):
6859 return RarFileListFiles(infile
, verbose
, returnfp
);
6860 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
6861 return SevenZipFileListFiles(infile
, verbose
, returnfp
);
6866 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):
6867 outarray
= BytesIO();
6868 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
6869 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6870 return listcatfiles
;
6872 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):
6873 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
6874 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6875 return listcatfiles
;
6877 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):
6878 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
6879 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6880 return listcatfiles
;
6882 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
6884 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6885 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
6886 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
6887 return listcatfiles
;
6889 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
6891 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6892 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
6893 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
6894 return listcatfiles
;
6896 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
6898 if(not rarfile_support
):
6899 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6902 if(rarfile_support
):
6903 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6904 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
6905 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
6906 return listcatfiles
;
6908 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
6910 if(not py7zr_support
):
6911 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6915 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6916 outarray
= SevenZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
6917 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
6918 return listcatfiles
;
6920 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFileAlt", PackArchiveFileFromSevenZipFileAlt
);
6922 def download_file_from_ftp_file(url
):
6923 urlparts
= urlparse(url
);
6924 file_name
= os
.path
.basename(urlparts
.path
);
6925 file_dir
= os
.path
.dirname(urlparts
.path
);
6926 if(urlparts
.username
is not None):
6927 ftp_username
= urlparts
.username
;
6929 ftp_username
= "anonymous";
6930 if(urlparts
.password
is not None):
6931 ftp_password
= urlparts
.password
;
6932 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6933 ftp_password
= "anonymous";
6936 if(urlparts
.scheme
=="ftp"):
6938 elif(urlparts
.scheme
=="ftps"):
6942 if(urlparts
.scheme
=="sftp"):
6944 return download_file_from_pysftp_file(url
);
6946 return download_file_from_sftp_file(url
);
6947 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
6948 return download_file_from_http_file(url
);
6949 ftp_port
= urlparts
.port
;
6950 if(urlparts
.port
is None):
6953 ftp
.connect(urlparts
.hostname
, ftp_port
);
6954 except socket
.gaierror
:
6955 log
.info("Error With URL "+url
);
6957 except socket
.timeout
:
6958 log
.info("Error With URL "+url
);
6960 ftp
.login(urlparts
.username
, urlparts
.password
);
6961 if(urlparts
.scheme
=="ftps"):
6963 ftpfile
= BytesIO();
6964 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
6965 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
6970 def download_file_from_ftp_string(url
):
6971 ftpfile
= download_file_from_ftp_file(url
);
6972 return ftpfile
.read();
6974 def upload_file_to_ftp_file(ftpfile
, url
):
6975 urlparts
= urlparse(url
);
6976 file_name
= os
.path
.basename(urlparts
.path
);
6977 file_dir
= os
.path
.dirname(urlparts
.path
);
6978 if(urlparts
.username
is not None):
6979 ftp_username
= urlparts
.username
;
6981 ftp_username
= "anonymous";
6982 if(urlparts
.password
is not None):
6983 ftp_password
= urlparts
.password
;
6984 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6985 ftp_password
= "anonymous";
6988 if(urlparts
.scheme
=="ftp"):
6990 elif(urlparts
.scheme
=="ftps"):
6994 if(urlparts
.scheme
=="sftp"):
6996 return upload_file_to_pysftp_file(url
);
6998 return upload_file_to_sftp_file(url
);
6999 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7001 ftp_port
= urlparts
.port
;
7002 if(urlparts
.port
is None):
7005 ftp
.connect(urlparts
.hostname
, ftp_port
);
7006 except socket
.gaierror
:
7007 log
.info("Error With URL "+url
);
7009 except socket
.timeout
:
7010 log
.info("Error With URL "+url
);
7012 ftp
.login(urlparts
.username
, urlparts
.password
);
7013 if(urlparts
.scheme
=="ftps"):
7015 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
7020 def upload_file_to_ftp_string(ftpstring
, url
):
7021 ftpfileo
= BytesIO(ftpstring
);
7022 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
7026 def download_file_from_http_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7027 # Parse the URL to extract username and password if present
7028 urlparts
= urlparse(url
);
7029 username
= urlparts
.username
;
7030 password
= urlparts
.password
;
7031 # Rebuild the URL without the username and password
7032 netloc
= urlparts
.hostname
;
7033 if(urlparts
.scheme
=="sftp"):
7035 return download_file_from_pysftp_file(url
);
7037 return download_file_from_sftp_file(url
);
7038 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7039 return download_file_from_ftp_file(url
);
7041 netloc
+= ':' + str(urlparts
.port
);
7042 rebuilt_url
= urlunparse((urlparts
.scheme
, netloc
, urlparts
.path
, urlparts
.params
, urlparts
.query
, urlparts
.fragment
));
7043 # Create a temporary file object
7044 httpfile
= BytesIO();
7046 # Use the requests library if available
7047 if username
and password
:
7048 response
= requests
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
), stream
=True);
7050 response
= requests
.get(rebuilt_url
, headers
=headers
, stream
=True);
7051 response
.raw
.decode_content
= True
7052 shutil
.copyfileobj(response
.raw
, httpfile
);
7054 # Build a Request object for urllib
7055 request
= Request(rebuilt_url
, headers
=headers
);
7056 # Create an opener object for handling URLs
7057 if username
and password
:
7058 # Create a password manager
7059 password_mgr
= HTTPPasswordMgrWithDefaultRealm();
7060 # Add the username and password
7061 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
7062 # Create an authentication handler using the password manager
7063 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
7064 # Build the opener with the authentication handler
7065 opener
= build_opener(auth_handler
);
7067 opener
= build_opener();
7068 with opener
.open(request
) as response
:
7069 shutil
.copyfileobj(response
, httpfile
);
7070 # Reset file pointer to the start
7071 httpfile
.seek(0, 0);
7072 # Return the temporary file object
7075 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7076 httpfile
= download_file_from_http_file(url
, headers
);
7077 return ftpfile
.read();
7080 def download_file_from_sftp_file(url
):
7081 urlparts
= urlparse(url
);
7082 file_name
= os
.path
.basename(urlparts
.path
);
7083 file_dir
= os
.path
.dirname(urlparts
.path
);
7084 sftp_port
= urlparts
.port
;
7085 if(urlparts
.port
is None):
7088 sftp_port
= urlparts
.port
;
7089 if(urlparts
.username
is not None):
7090 sftp_username
= urlparts
.username
;
7092 sftp_username
= "anonymous";
7093 if(urlparts
.password
is not None):
7094 sftp_password
= urlparts
.password
;
7095 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7096 sftp_password
= "anonymous";
7099 if(urlparts
.scheme
=="ftp"):
7100 return download_file_from_ftp_file(url
);
7101 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7102 return download_file_from_http_file(url
);
7103 if(urlparts
.scheme
!="sftp"):
7105 ssh
= paramiko
.SSHClient();
7106 ssh
.load_system_host_keys();
7107 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7109 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7110 except paramiko
.ssh_exception
.SSHException
:
7112 except socket
.gaierror
:
7113 log
.info("Error With URL "+url
);
7115 except socket
.timeout
:
7116 log
.info("Error With URL "+url
);
7118 sftp
= ssh
.open_sftp();
7119 sftpfile
= BytesIO();
7120 sftp
.getfo(urlparts
.path
, sftpfile
);
7123 sftpfile
.seek(0, 0);
7126 def download_file_from_sftp_file(url
):
7130 def download_file_from_sftp_string(url
):
7131 sftpfile
= download_file_from_sftp_file(url
);
7132 return sftpfile
.read();
7134 def download_file_from_ftp_string(url
):
7138 def upload_file_to_sftp_file(sftpfile
, url
):
7139 urlparts
= urlparse(url
);
7140 file_name
= os
.path
.basename(urlparts
.path
);
7141 file_dir
= os
.path
.dirname(urlparts
.path
);
7142 sftp_port
= urlparts
.port
;
7143 if(urlparts
.port
is None):
7146 sftp_port
= urlparts
.port
;
7147 if(urlparts
.username
is not None):
7148 sftp_username
= urlparts
.username
;
7150 sftp_username
= "anonymous";
7151 if(urlparts
.password
is not None):
7152 sftp_password
= urlparts
.password
;
7153 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7154 sftp_password
= "anonymous";
7157 if(urlparts
.scheme
=="ftp"):
7158 return upload_file_to_ftp_file(url
);
7159 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7161 if(urlparts
.scheme
!="sftp"):
7163 ssh
= paramiko
.SSHClient();
7164 ssh
.load_system_host_keys();
7165 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7167 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7168 except paramiko
.ssh_exception
.SSHException
:
7170 except socket
.gaierror
:
7171 log
.info("Error With URL "+url
);
7173 except socket
.timeout
:
7174 log
.info("Error With URL "+url
);
7176 sftp
= ssh
.open_sftp();
7177 sftp
.putfo(sftpfile
, urlparts
.path
);
7180 sftpfile
.seek(0, 0);
7183 def upload_file_to_sftp_file(sftpfile
, url
):
7187 def upload_file_to_sftp_string(sftpstring
, url
):
7188 sftpfileo
= BytesIO(sftpstring
);
7189 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
7193 def upload_file_to_sftp_string(url
):
7197 def download_file_from_pysftp_file(url
):
7198 urlparts
= urlparse(url
);
7199 file_name
= os
.path
.basename(urlparts
.path
);
7200 file_dir
= os
.path
.dirname(urlparts
.path
);
7201 sftp_port
= urlparts
.port
;
7202 if(urlparts
.port
is None):
7205 sftp_port
= urlparts
.port
;
7206 if(urlparts
.username
is not None):
7207 sftp_username
= urlparts
.username
;
7209 sftp_username
= "anonymous";
7210 if(urlparts
.password
is not None):
7211 sftp_password
= urlparts
.password
;
7212 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7213 sftp_password
= "anonymous";
7216 if(urlparts
.scheme
=="ftp"):
7217 return download_file_from_ftp_file(url
);
7218 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7219 return download_file_from_http_file(url
);
7220 if(urlparts
.scheme
!="sftp"):
7223 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7224 except paramiko
.ssh_exception
.SSHException
:
7226 except socket
.gaierror
:
7227 log
.info("Error With URL "+url
);
7229 except socket
.timeout
:
7230 log
.info("Error With URL "+url
);
7232 sftp
= ssh
.open_sftp();
7233 sftpfile
= BytesIO();
7234 sftp
.getfo(urlparts
.path
, sftpfile
);
7237 sftpfile
.seek(0, 0);
7240 def download_file_from_pysftp_file(url
):
7244 def download_file_from_pysftp_string(url
):
7245 sftpfile
= download_file_from_pysftp_file(url
);
7246 return sftpfile
.read();
7248 def download_file_from_ftp_string(url
):
7252 def upload_file_to_pysftp_file(sftpfile
, url
):
7253 urlparts
= urlparse(url
);
7254 file_name
= os
.path
.basename(urlparts
.path
);
7255 file_dir
= os
.path
.dirname(urlparts
.path
);
7256 sftp_port
= urlparts
.port
;
7257 if(urlparts
.port
is None):
7260 sftp_port
= urlparts
.port
;
7261 if(urlparts
.username
is not None):
7262 sftp_username
= urlparts
.username
;
7264 sftp_username
= "anonymous";
7265 if(urlparts
.password
is not None):
7266 sftp_password
= urlparts
.password
;
7267 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7268 sftp_password
= "anonymous";
7271 if(urlparts
.scheme
=="ftp"):
7272 return upload_file_to_ftp_file(url
);
7273 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7275 if(urlparts
.scheme
!="sftp"):
7278 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7279 except paramiko
.ssh_exception
.SSHException
:
7281 except socket
.gaierror
:
7282 log
.info("Error With URL "+url
);
7284 except socket
.timeout
:
7285 log
.info("Error With URL "+url
);
7287 sftp
= ssh
.open_sftp();
7288 sftp
.putfo(sftpfile
, urlparts
.path
);
7291 sftpfile
.seek(0, 0);
7294 def upload_file_to_pysftp_file(sftpfile
, url
):
7298 def upload_file_to_pysftp_string(sftpstring
, url
):
7299 sftpfileo
= BytesIO(sftpstring
);
7300 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
7304 def upload_file_to_pysftp_string(url
):
7307 def download_file_from_internet_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7308 urlparts
= urlparse(url
);
7309 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7310 return download_file_from_http_file(url
, headers
);
7311 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7312 return download_file_from_ftp_file(url
);
7313 elif(urlparts
.scheme
=="sftp"):
7314 if(__use_pysftp__
and havepysftp
):
7315 return download_file_from_pysftp_file(url
);
7317 return download_file_from_sftp_file(url
);
7322 def download_file_from_internet_uncompress_file(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_list__
):
7323 fp
= download_file_from_internet_file(url
);
7324 fp
= UncompressArchiveFile(fp
, formatspecs
);
7330 def download_file_from_internet_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7331 urlparts
= urlparse(url
);
7332 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7333 return download_file_from_http_string(url
, headers
);
7334 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7335 return download_file_from_ftp_string(url
);
7336 elif(urlparts
.scheme
=="sftp"):
7337 if(__use_pysftp__
and havepysftp
):
7338 return download_file_from_pysftp_string(url
);
7340 return download_file_from_sftp_string(url
);
7345 def download_file_from_internet_uncompress_string(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_list__
):
7346 fp
= download_file_from_internet_string(url
);
7347 fp
= UncompressArchiveFile(fp
, formatspecs
);
7353 def upload_file_to_internet_file(ifp
, url
):
7354 urlparts
= urlparse(url
);
7355 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7357 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7358 return upload_file_to_ftp_file(ifp
, url
);
7359 elif(urlparts
.scheme
=="sftp"):
7360 if(__use_pysftp__
and havepysftp
):
7361 return upload_file_to_pysftp_file(ifp
, url
);
7363 return upload_file_to_sftp_file(ifp
, url
);
7368 def upload_file_to_internet_compress_file(ifp
, url
, formatspecs
=__file_format_list__
):
7369 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
7373 upload_file_to_internet_file(catfp
, outfile
);
7376 def upload_file_to_internet_string(ifp
, url
):
7377 urlparts
= urlparse(url
);
7378 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7380 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7381 return upload_file_to_ftp_string(ifp
, url
);
7382 elif(urlparts
.scheme
=="sftp"):
7383 if(__use_pysftp__
and havepysftp
):
7384 return upload_file_to_pysftp_string(ifp
, url
);
7386 return upload_file_to_sftp_string(ifp
, url
);
7391 def upload_file_to_internet_compress_string(ifp
, url
, formatspecs
=__file_format_list__
):
7392 catfp
= CompressArchiveFile(BytesIO(ifp
), compression
, formatspecs
);
7396 upload_file_to_internet_file(catfp
, outfile
);
7400 if(hasattr(shutil
, "register_archive_format")):
7401 # Register the packing format
7402 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
7403 except shutil
.RegistryError
:
7407 if(hasattr(shutil
, "register_unpack_format")):
7408 # Register the unpacking format
7409 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
7410 except shutil
.RegistryError
: