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.6 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, 6, "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 fcontents
.seek(0, 0);
2544 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
2545 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2546 catfp
.write(catfileout
);
2549 os
.fsync(catfp
.fileno());
2550 except io
.UnsupportedOperation
:
2552 except AttributeError:
2555 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
2556 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2557 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2560 os
.fsync(catfp
.fileno());
2561 except io
.UnsupportedOperation
:
2563 except AttributeError:
2567 if(hasattr(sys
.stdout
, "buffer")):
2568 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2570 shutil
.copyfileobj(catfp
, sys
.stdout
);
2571 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2572 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2574 upload_file_to_internet_file(catfp
, outfile
);
2582 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
2584 if(hasattr(shutil
, "register_archive_format")):
2585 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
2586 return PackArchiveFile(source_dir
, archive_name
, False, "auto", None, False, "crc32", [], __file_format_delimiter__
, False, False);
2587 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
2589 def PackArchiveFileFromDirList(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2590 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
2592 create_alias_function("Pack", __file_format_name__
, "FromDirList", PackArchiveFileFromDirList
);
2594 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2595 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2596 outfile
= RemoveWindowsPath(outfile
);
2597 checksumtype
= checksumtype
.lower();
2598 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2599 checksumtype
="crc32";
2600 if(checksumtype
=="none"):
2602 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2604 if(compression
not in compressionlist
and compression
is None):
2605 compression
= "auto";
2607 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2608 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2609 if(os
.path
.exists(outfile
)):
2614 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2616 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2619 fbasename
= os
.path
.splitext(outfile
)[0];
2620 fextname
= os
.path
.splitext(outfile
)[1];
2621 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2622 catver
= formatspecs
[6];
2623 fileheaderver
= str(int(catver
.replace(".", "")));
2624 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2625 catfp
.write(fileheader
.encode('UTF-8'));
2631 inodetocatinode
= {};
2634 if(hasattr(sys
.stdin
, "buffer")):
2635 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
2637 shutil
.copyfileobj(sys
.stdin
, infile
);
2642 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
2643 infile
= download_file_from_internet_file(infile
);
2648 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2650 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
2652 if(not tarfile
.is_tarfile(infile
)):
2654 except AttributeError:
2655 if(not is_tarfile(infile
)):
2660 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2661 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
2663 tarfp
= tarfile
.open(infile
, "r");
2664 except FileNotFoundError
:
2666 numfiles
= int(len(tarfp
.getmembers()));
2667 fnumfiles
= format(int(len(tarfp
.getmembers())), 'x').lower();
2668 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2669 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
2670 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2671 catfp
.write(fnumfilesa
.encode('UTF-8'));
2674 os
.fsync(catfp
.fileno());
2675 except io
.UnsupportedOperation
:
2677 except AttributeError:
2679 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
2680 catfhstart
= catfp
.tell();
2681 if(re
.findall("^[.|/]", member
.name
)):
2682 fname
= member
.name
;
2684 fname
= "./"+member
.name
;
2686 VerbosePrintOut(fname
);
2687 fpremode
= member
.mode
;
2688 ffullmode
= member
.mode
;
2692 ffullmode
= member
.mode
+ stat
.S_IFREG
;
2694 elif(member
.isdev()):
2695 ffullmode
= member
.mode
;
2697 elif(member
.islnk()):
2698 ffullmode
= member
.mode
+ stat
.S_IFREG
;
2700 elif(member
.issym()):
2701 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
2703 elif(member
.ischr()):
2704 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
2706 elif(member
.isblk()):
2707 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
2709 elif(member
.isdir()):
2710 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
2712 elif(member
.isfifo()):
2713 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
2715 elif(member
.issparse()):
2716 ffullmode
= member
.mode
;
2719 ffullmode
= member
.mode
;
2722 fcurfid
= format(int(curfid
), 'x').lower();
2723 fcurinode
= format(int(curfid
), 'x').lower();
2724 curfid
= curfid
+ 1;
2726 flinkname
= member
.linkname
;
2727 fdev_minor
= format(int(member
.devminor
), 'x').lower();
2728 fdev_major
= format(int(member
.devmajor
), 'x').lower();
2729 frdev_minor
= format(int(member
.devminor
), 'x').lower();
2730 frdev_major
= format(int(member
.devmajor
), 'x').lower();
2731 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
2732 fsize
= format(int("0"), 'x').lower();
2733 elif(ftype
==0 or ftype
==7):
2734 fsize
= format(int(member
.size
), 'x').lower();
2736 fsize
= format(int(member
.size
), 'x').lower();
2737 fatime
= format(int(member
.mtime
), 'x').lower();
2738 fmtime
= format(int(member
.mtime
), 'x').lower();
2739 fctime
= format(int(member
.mtime
), 'x').lower();
2740 fbtime
= format(int(member
.mtime
), 'x').lower();
2741 fmode
= format(int(ffullmode
), 'x').lower();
2742 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
2743 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
2744 fuid
= format(int(member
.uid
), 'x').lower();
2745 fgid
= format(int(member
.gid
), 'x').lower();
2746 funame
= member
.uname
;
2747 fgname
= member
.gname
;
2748 flinkcount
= format(int(flinkcount
), 'x').lower();
2749 fwinattributes
= format(int(0), 'x').lower();
2750 fcontents
= BytesIO();
2751 if(ftype
==0 or ftype
==7):
2752 with tarfp
.extractfile(member
) as fpc
:
2753 shutil
.copyfileobj(fpc
, fcontents
);
2754 fcontents
.seek(0, 0);
2755 ftypehex
= format(ftype
, 'x').lower();
2756 extrafields
= format(len(extradata
), 'x').lower();
2757 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2758 if(len(extradata
)>0):
2759 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2760 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2761 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
];
2762 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
2763 catoutlenhex
= format(catoutlen
, 'x').lower();
2764 catoutlist
.insert(0, catoutlenhex
);
2765 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
2766 if(len(extradata
)>0):
2767 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2768 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2769 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2770 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2771 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
2772 fcontents
.seek(0, 0);
2773 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
2774 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2775 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
2776 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
2777 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
2778 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2779 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2780 nullstrecd
= formatspecs
[5].encode('UTF-8');
2781 fcontents
.seek(0, 0);
2782 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
2783 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2784 catfp
.write(catfileout
);
2787 os
.fsync(catfp
.fileno());
2788 except io
.UnsupportedOperation
:
2790 except AttributeError:
2793 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
2794 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2795 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2798 os
.fsync(catfp
.fileno());
2799 except io
.UnsupportedOperation
:
2801 except AttributeError:
2805 if(hasattr(sys
.stdout
, "buffer")):
2806 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2808 shutil
.copyfileobj(catfp
, sys
.stdout
);
2809 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2810 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2812 upload_file_to_internet_file(catfp
, outfile
);
2820 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
2822 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2823 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2824 outfile
= RemoveWindowsPath(outfile
);
2825 checksumtype
= checksumtype
.lower();
2826 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2827 checksumtype
="crc32";
2828 if(checksumtype
=="none"):
2830 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2832 if(compression
not in compressionlist
and compression
is None):
2833 compression
= "auto";
2835 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2836 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2837 if(os
.path
.exists(outfile
)):
2842 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2844 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
2847 fbasename
= os
.path
.splitext(outfile
)[0];
2848 fextname
= os
.path
.splitext(outfile
)[1];
2849 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2850 catver
= formatspecs
[6];
2851 fileheaderver
= str(int(catver
.replace(".", "")));
2852 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2853 catfp
.write(fileheader
.encode('UTF-8'));
2859 inodetocatinode
= {};
2862 if(hasattr(sys
.stdin
, "buffer")):
2863 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
2865 shutil
.copyfileobj(sys
.stdin
, infile
);
2870 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
2871 infile
= download_file_from_internet_file(infile
);
2876 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2880 if(not zipfile
.is_zipfile(infile
)):
2883 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
2884 except FileNotFoundError
:
2886 ziptest
= zipfp
.testzip();
2888 VerbosePrintOut("Bad file found!");
2889 numfiles
= int(len(zipfp
.infolist()));
2890 fnumfiles
= format(int(len(zipfp
.infolist())), 'x').lower();
2891 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2892 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
2893 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2894 catfp
.write(fnumfilesa
.encode('UTF-8'));
2897 os
.fsync(catfp
.fileno());
2898 except io
.UnsupportedOperation
:
2900 except AttributeError:
2902 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
2903 catfhstart
= catfp
.tell();
2904 if(re
.findall("^[.|/]", member
.filename
)):
2905 fname
= member
.filename
;
2907 fname
= "./"+member
.filename
;
2908 zipinfo
= zipfp
.getinfo(member
.filename
);
2910 VerbosePrintOut(fname
);
2911 if(not member
.is_dir()):
2912 fpremode
= int(stat
.S_IFREG
+ 438);
2913 elif(member
.is_dir()):
2914 fpremode
= int(stat
.S_IFDIR
+ 511);
2917 if(not member
.is_dir()):
2919 elif(member
.is_dir()):
2922 fcurfid
= format(int(curfid
), 'x').lower();
2923 fcurinode
= format(int(curfid
), 'x').lower();
2924 curfid
= curfid
+ 1;
2925 fdev_minor
= format(int(0), 'x').lower();
2926 fdev_major
= format(int(0), 'x').lower();
2927 frdev_minor
= format(int(0), 'x').lower();
2928 frdev_major
= format(int(0), 'x').lower();
2930 fsize
= format(int("0"), 'x').lower();
2932 fsize
= format(int(member
.file_size
), 'x').lower();
2934 fsize
= format(int(member
.file_size
), 'x').lower();
2935 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2936 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2937 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2938 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2939 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
2940 fwinattributes
= format(int(zipinfo
.external_attr
), 'x').lower();
2941 if(not member
.is_dir()):
2942 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
2943 fchmode
= stat
.S_IMODE(fmode
);
2944 ftypemod
= stat
.S_IFMT(fmode
);
2945 elif(member
.is_dir()):
2946 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
2947 fchmode
= stat
.S_IMODE(fmode
);
2948 ftypemod
= stat
.S_IFMT(fmode
);
2949 elif(zipinfo
.create_system
==3):
2950 fwinattributes
= format(int(0), 'x').lower();
2951 fmode
= format(int(zipinfo
.external_attr
), 'x').lower();
2952 fchmode
= stat
.S_IMODE(fmode
);
2953 ftypemod
= stat
.S_IFMT(fmode
);
2955 fwinattributes
= format(int(0), 'x').lower();
2956 if(not member
.is_dir()):
2957 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
2958 fchmode
= stat
.S_IMODE(fmode
);
2959 ftypemod
= stat
.S_IFMT(fmode
);
2960 elif(member
.is_dir()):
2961 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
2962 fchmode
= stat
.S_IMODE(fmode
);
2963 ftypemod
= stat
.S_IFMT(fmode
);
2965 fuid
= format(int(os
.getuid()), 'x').lower();
2966 except AttributeError:
2967 fuid
= format(int(0), 'x').lower();
2969 fuid
= format(int(0), 'x').lower();
2971 fgid
= format(int(os
.getgid()), 'x').lower();
2972 except AttributeError:
2973 fgid
= format(int(0), 'x').lower();
2975 fgid
= format(int(0), 'x').lower();
2979 userinfo
= pwd
.getpwuid(os
.getuid());
2980 funame
= userinfo
.pw_name
;
2983 except AttributeError:
2991 groupinfo
= grp
.getgrgid(os
.getgid());
2992 fgname
= groupinfo
.gr_name
;
2995 except AttributeError:
2999 fcontents
= BytesIO();
3001 fcontents
.write(zipfp
.read(member
.filename
));
3002 fcontents
.seek(0, 0);
3003 ftypehex
= format(ftype
, 'x').lower();
3004 extrafields
= format(len(extradata
), 'x').lower();
3005 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3006 if(len(extradata
)>0):
3007 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3008 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3009 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
];
3010 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3011 catoutlenhex
= format(catoutlen
, 'x').lower();
3012 catoutlist
.insert(0, catoutlenhex
);
3013 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3014 if(len(extradata
)>0):
3015 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3016 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3017 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3018 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3019 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3020 fcontents
.seek(0, 0);
3021 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
3022 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3023 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
3024 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3025 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3026 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3027 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3028 nullstrecd
= formatspecs
[5].encode('UTF-8');
3029 fcontents
.seek(0, 0);
3030 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
3031 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
3032 catfp
.write(catfileout
);
3035 os
.fsync(catfp
.fileno());
3036 except io
.UnsupportedOperation
:
3038 except AttributeError:
3041 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3042 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3043 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3046 os
.fsync(catfp
.fileno());
3047 except io
.UnsupportedOperation
:
3049 except AttributeError:
3053 if(hasattr(sys
.stdout
, "buffer")):
3054 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3056 shutil
.copyfileobj(catfp
, sys
.stdout
);
3057 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3058 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3060 upload_file_to_internet_file(catfp
, outfile
);
3068 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
3070 if(not rarfile_support
):
3071 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3074 if(rarfile_support
):
3075 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3076 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3077 outfile
= RemoveWindowsPath(outfile
);
3078 checksumtype
= checksumtype
.lower();
3079 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3080 checksumtype
="crc32";
3081 if(checksumtype
=="none"):
3083 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
3085 if(compression
not in compressionlist
and compression
is None):
3086 compression
= "auto";
3088 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3089 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3090 if(os
.path
.exists(outfile
)):
3095 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3097 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3100 fbasename
= os
.path
.splitext(outfile
)[0];
3101 fextname
= os
.path
.splitext(outfile
)[1];
3102 catfp
= CompressOpenFile(outfile
, compressionlevel
);
3103 catver
= formatspecs
[6];
3104 fileheaderver
= str(int(catver
.replace(".", "")));
3105 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3106 catfp
.write(fileheader
.encode('UTF-8'));
3112 inodetocatinode
= {};
3113 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3115 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
3117 rarfp
= rarfile
.RarFile(infile
, "r");
3118 rartest
= rarfp
.testrar();
3120 VerbosePrintOut("Bad file found!");
3121 numfiles
= int(len(rarfp
.infolist()));
3122 fnumfiles
= format(int(len(rarfp
.infolist())), 'x').lower();
3123 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
3124 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
3125 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3126 catfp
.write(fnumfilesa
.encode('UTF-8'));
3129 os
.fsync(catfp
.fileno());
3130 except io
.UnsupportedOperation
:
3132 except AttributeError:
3134 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
3137 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
3140 member
.external_attr
3142 except AttributeError:
3144 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
3147 member
.external_attr
3149 except AttributeError:
3154 catfhstart
= catfp
.tell();
3155 if(re
.findall("^[.|/]", member
.filename
)):
3156 fname
= member
.filename
;
3158 fname
= "./"+member
.filename
;
3159 rarinfo
= rarfp
.getinfo(member
.filename
);
3161 VerbosePrintOut(fname
);
3162 if(is_unix
and member
.external_attr
!=0):
3163 fpremode
= int(member
.external_attr
);
3164 elif(member
.is_file()):
3165 fpremode
= int(stat
.S_IFREG
+ 438);
3166 elif(member
.is_symlink()):
3167 fpremode
= int(stat
.S_IFLNK
+ 438);
3168 elif(member
.is_dir()):
3169 fpremode
= int(stat
.S_IFDIR
+ 511);
3170 if(is_windows
and member
.external_attr
!=0):
3171 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
3173 fwinattributes
= format(int(0), 'x').lower();
3176 if(member
.is_file()):
3178 elif(member
.is_symlink()):
3180 elif(member
.is_dir()):
3184 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
3185 fcurfid
= format(int(curfid
), 'x').lower();
3186 fcurinode
= format(int(curfid
), 'x').lower();
3187 curfid
= curfid
+ 1;
3188 fdev_minor
= format(int(0), 'x').lower();
3189 fdev_major
= format(int(0), 'x').lower();
3190 frdev_minor
= format(int(0), 'x').lower();
3191 frdev_major
= format(int(0), 'x').lower();
3193 fsize
= format(int("0"), 'x').lower();
3195 fsize
= format(int(member
.file_size
), 'x').lower();
3197 fsize
= format(int(member
.file_size
), 'x').lower();
3200 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
3202 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3203 except AttributeError:
3204 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3205 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3208 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
3210 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3211 except AttributeError:
3212 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3213 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
3214 if(is_unix
and member
.external_attr
!=0):
3215 fmode
= format(int(member
.external_attr
), 'x').lower();
3216 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
3217 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
3218 elif(member
.is_file()):
3219 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3220 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3221 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3222 elif(member
.is_symlink()):
3223 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
3224 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3225 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3226 elif(member
.is_dir()):
3227 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3228 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3229 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3231 fuid
= format(int(os
.getuid()), 'x').lower();
3232 except AttributeError:
3233 fuid
= format(int(0), 'x').lower();
3235 fuid
= format(int(0), 'x').lower();
3237 fgid
= format(int(os
.getgid()), 'x').lower();
3238 except AttributeError:
3239 fgid
= format(int(0), 'x').lower();
3241 fgid
= format(int(0), 'x').lower();
3245 userinfo
= pwd
.getpwuid(os
.getuid());
3246 funame
= userinfo
.pw_name
;
3249 except AttributeError:
3257 groupinfo
= grp
.getgrgid(os
.getgid());
3258 fgname
= groupinfo
.gr_name
;
3261 except AttributeError:
3265 fcontents
= BytesIO();
3267 fcontents
.write(rarfp
.read(member
.filename
));
3268 fcontents
.seek(0, 0);
3269 ftypehex
= format(ftype
, 'x').lower();
3270 extrafields
= format(len(extradata
), 'x').lower();
3271 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3272 if(len(extradata
)>0):
3273 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3274 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3275 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
];
3276 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3277 catoutlenhex
= format(catoutlen
, 'x').lower();
3278 catoutlist
.insert(0, catoutlenhex
);
3279 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3280 if(len(extradata
)>0):
3281 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3282 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3283 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3284 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3285 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3286 fcontents
.seek(0, 0);
3287 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
3288 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3289 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
3290 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3291 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3292 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
3293 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3294 nullstrecd
= formatspecs
[5].encode('UTF-8');
3295 fcontents
.seek(0, 0);
3296 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
3297 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
3298 catfp
.write(catfileout
);
3301 os
.fsync(catfp
.fileno());
3302 except io
.UnsupportedOperation
:
3304 except AttributeError:
3307 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3308 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3309 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
3312 os
.fsync(catfp
.fileno());
3313 except io
.UnsupportedOperation
:
3315 except AttributeError:
3319 if(hasattr(sys
.stdout
, "buffer")):
3320 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3322 shutil
.copyfileobj(catfp
, sys
.stdout
);
3323 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3324 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3326 upload_file_to_internet_file(catfp
, outfile
);
3334 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
3336 if(not py7zr_support
):
3337 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3341 def PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3342 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3343 outfile
= RemoveWindowsPath(outfile
);
3344 checksumtype
= checksumtype
.lower();
3345 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
3346 checksumtype
="crc32";
3347 if(checksumtype
=="none"):
3349 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
3351 if(compression
not in compressionlist
and compression
is None):
3352 compression
= "auto";
3354 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3355 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
3356 if(os
.path
.exists(outfile
)):
3361 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3363 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3366 fbasename
= os
.path
.splitext(outfile
)[0];
3367 fextname
= os
.path
.splitext(outfile
)[1];
3368 catfp
= CompressOpenFile(outfile
, compressionlevel
);
3369 catver
= formatspecs
[6];
3370 fileheaderver
= str(int(catver
.replace(".", "")));
3371 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3372 catfp
.write(fileheader
.encode('UTF-8'));
3378 inodetocatinode
= {};
3379 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3381 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
3382 file_content
= szpfp
.readall();
3383 #sztest = szpfp.testzip();
3384 sztestalt
= szpfp
.test();
3386 VerbosePrintOut("Bad file found!");
3387 numfiles
= int(len(szpfp
.list()));
3388 fnumfiles
= format(int(len(szpfp
.list())), 'x').lower();
3389 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
3390 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
3391 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3392 catfp
.write(fnumfilesa
.encode('UTF-8'));
3395 os
.fsync(catfp
.fileno());
3396 except io
.UnsupportedOperation
:
3398 except AttributeError:
3400 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
3401 catfhstart
= catfp
.tell();
3402 if(re
.findall("^[.|/]", member
.filename
)):
3403 fname
= member
.filename
;
3405 fname
= "./"+member
.filename
;
3407 VerbosePrintOut(fname
);
3408 if(not member
.is_directory
):
3409 fpremode
= int(stat
.S_IFREG
+ 438);
3410 elif(member
.is_directory
):
3411 fpremode
= int(stat
.S_IFDIR
+ 511);
3412 fwinattributes
= format(int(0), 'x').lower();
3415 if(member
.is_directory
):
3420 fcurfid
= format(int(curfid
), 'x').lower();
3421 fcurinode
= format(int(curfid
), 'x').lower();
3422 curfid
= curfid
+ 1;
3423 fdev_minor
= format(int(0), 'x').lower();
3424 fdev_major
= format(int(0), 'x').lower();
3425 frdev_minor
= format(int(0), 'x').lower();
3426 frdev_major
= format(int(0), 'x').lower();
3428 fsize
= format(int("0"), 'x').lower();
3429 fatime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3430 fmtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3431 fctime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3432 fbtime
= format(int(member
.creationtime
.timestamp()), 'x').lower();
3433 if(member
.is_directory
):
3434 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
3435 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3436 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
3438 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
3439 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
3440 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
3442 fuid
= format(int(os
.getuid()), 'x').lower();
3443 except AttributeError:
3444 fuid
= format(int(0), 'x').lower();
3446 fuid
= format(int(0), 'x').lower();
3448 fgid
= format(int(os
.getgid()), 'x').lower();
3449 except AttributeError:
3450 fgid
= format(int(0), 'x').lower();
3452 fgid
= format(int(0), 'x').lower();
3456 userinfo
= pwd
.getpwuid(os
.getuid());
3457 funame
= userinfo
.pw_name
;
3460 except AttributeError:
3468 groupinfo
= grp
.getgrgid(os
.getgid());
3469 fgname
= groupinfo
.gr_name
;
3472 except AttributeError:
3476 fcontents
= BytesIO();
3478 fcontents
.write(file_content
[member
.filename
].read());
3479 fsize
= format(fcontents
.tell(), 'x').lower();
3480 file_content
[member
.filename
].close();
3481 fcontents
.seek(0, 0);
3482 ftypehex
= format(ftype
, 'x').lower();
3483 extrafields
= format(len(extradata
), 'x').lower();
3484 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3485 if(len(extradata
)>0):
3486 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3487 extrasizelen
= format(len(extrasizestr
), 'x').lower();
3488 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
];
3489 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
3490 catoutlenhex
= format(catoutlen
, 'x').lower();
3491 catoutlist
.insert(0, catoutlenhex
);
3492 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
3493 if(len(extradata
)>0):
3494 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3495 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3496 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
3497 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
3498 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3499 fcontents
.seek(0, 0);
3500 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
3501 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3502 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
3503 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3504 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
3505 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
3506 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3507 nullstrecd
= formatspecs
[5].encode('UTF-8');
3508 fcontents
.seek(0, 0);
3509 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
3510 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
3511 catfp
.write(catfileout
);
3514 os
.fsync(catfp
.fileno());
3515 except io
.UnsupportedOperation
:
3517 except AttributeError:
3520 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
3521 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
3522 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
3525 os
.fsync(catfp
.fileno());
3526 except io
.UnsupportedOperation
:
3528 except AttributeError:
3532 if(hasattr(sys
.stdout
, "buffer")):
3533 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
3535 shutil
.copyfileobj(catfp
, sys
.stdout
);
3536 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
3537 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
3539 upload_file_to_internet_file(catfp
, outfile
);
3547 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFile", PackArchiveFileFromSevenZipFile
);
3549 def PackArchiveFileFromInFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
3550 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3552 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
3553 if(checkcompressfile
=="tarfile"):
3554 return PackArchiveFileFromTarFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3555 elif(checkcompressfile
=="zipfile"):
3556 return PackArchiveFileFromZipFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3557 elif(checkcompressfile
=="catfile"):
3558 return RePackArchiveFile(infile
, outfile
, compression
, compressionlevel
, False, 0, 0, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
3559 elif(rarfile_support
and checkcompressfile
=="rarfile"):
3560 return PackArchiveFileFromRarFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3561 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
3562 return PackArchiveFileFromSevenZipFile(infile
, outfile
, compression
, compressionlevel
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
3567 create_alias_function("Pack", __file_format_name__
, "FromInFile", PackArchiveFileFromInFile
);
3569 def ArchiveFileSeekToFileNum(infile
, seekto
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3570 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3573 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3574 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
3575 if(checkcompressfile
=="tarfile"):
3576 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3577 if(checkcompressfile
=="zipfile"):
3578 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3579 if(rarfile_support
and checkcompressfile
=="rarfile"):
3580 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3581 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3582 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3583 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3590 if(hasattr(sys
.stdin
, "buffer")):
3591 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
3593 shutil
.copyfileobj(sys
.stdin
, catfp
);
3595 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3599 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3600 catfp
= download_file_from_internet_file(infile
);
3602 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3607 infile
= RemoveWindowsPath(infile
);
3608 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3609 if(checkcompressfile
=="tarfile"):
3610 return TarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3611 if(checkcompressfile
=="zipfile"):
3612 return ZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3613 if(rarfile_support
and checkcompressfile
=="rarfile"):
3614 return RarFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3615 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3616 return SevenZipFileToArray(infile
, seekto
, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3617 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3619 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
3620 if(not compresscheck
):
3621 fextname
= os
.path
.splitext(infile
)[1];
3622 if(fextname
==".gz"):
3623 compresscheck
= "gzip";
3624 elif(fextname
==".bz2"):
3625 compresscheck
= "bzip2";
3626 elif(fextname
==".zst"):
3627 compresscheck
= "zstd";
3628 elif(fextname
==".lz4" or fextname
==".clz4"):
3629 compresscheck
= "lz4";
3630 elif(fextname
==".lzo" or fextname
==".lzop"):
3631 compresscheck
= "lzo";
3632 elif(fextname
==".lzma" or fextname
==".xz"):
3633 compresscheck
= "lzma";
3636 if(not compresscheck
):
3638 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3643 SeekToEndOfFile(catfp);
3645 SeekToEndOfFile(catfp);
3646 CatSize = catfp.tell();
3647 CatSizeEnd = CatSize;
3655 curloc
= catfp
.tell();
3658 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
3660 catfp
.seek(curloc
, 0);
3661 catstring
= catheader
[0];
3662 catversion
= re
.findall(r
"([\d]+)$", catstring
);
3663 fprenumfiles
= catheader
[1];
3664 fnumfiles
= int(fprenumfiles
, 16);
3665 fprechecksumtype
= catheader
[2];
3666 fprechecksum
= catheader
[3];
3667 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
3668 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3669 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
3670 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
3671 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3672 fheadtell
= len(fileheader
);
3673 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
3674 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
3676 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3677 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
3678 if(seekto
>=fnumfiles
):
3679 seekto
= fnumfiles
- 1;
3685 prefhstart
= catfp
.tell();
3687 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
3689 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
3690 if(len(preheaderdata
)==0):
3692 prefheadsize
= int(preheaderdata
[0], 16);
3693 prefnumfields
= int(preheaderdata
[1], 16);
3694 preftype
= int(preheaderdata
[2], 16);
3695 if(re
.findall("^[.|/]", preheaderdata
[3])):
3696 prefname
= preheaderdata
[3];
3698 prefname
= "./"+preheaderdata
[3];
3699 prefbasedir
= os
.path
.dirname(prefname
);
3700 preflinkname
= preheaderdata
[4];
3701 prefsize
= int(preheaderdata
[5], 16);
3702 prefatime
= int(preheaderdata
[6], 16);
3703 prefmtime
= int(preheaderdata
[7], 16);
3704 prefctime
= int(preheaderdata
[8], 16);
3705 prefbtime
= int(preheaderdata
[9], 16);
3706 prefmode
= int(preheaderdata
[10], 16);
3707 prefchmode
= stat
.S_IMODE(prefmode
);
3708 preftypemod
= stat
.S_IFMT(prefmode
);
3709 prefwinattributes
= int(preheaderdata
[11], 16);
3710 prefuid
= int(preheaderdata
[12], 16);
3711 prefuname
= preheaderdata
[13];
3712 prefgid
= int(preheaderdata
[14], 16);
3713 prefgname
= preheaderdata
[15];
3714 fid
= int(preheaderdata
[16], 16);
3715 finode
= int(preheaderdata
[17], 16);
3716 flinkcount
= int(preheaderdata
[18], 16);
3717 prefdev_minor
= int(preheaderdata
[19], 16);
3718 prefdev_major
= int(preheaderdata
[20], 16);
3719 prefrdev_minor
= int(preheaderdata
[22], 16);
3720 prefrdev_major
= int(preheaderdata
[23], 16);
3721 prefextrasize
= int(preheaderdata
[24], 16);
3722 prefextrafields
= int(preheaderdata
[25], 16);
3723 extrafieldslist
= [];
3725 extraend
= extrastart
+ prefextrafields
;
3726 extrafieldslist
= [];
3727 if(extrastart
<extraend
):
3728 extrafieldslist
.append(preheaderdata
[extrastart
]);
3729 extrastart
= extrastart
+ 1;
3730 prefchecksumtype
= preheaderdata
[extrastart
].lower();
3731 prefcs
= preheaderdata
[extrastart
+ 1].lower();
3732 prefccs
= preheaderdata
[extrastart
+ 2].lower();
3734 hcmax
= len(preheaderdata
) - 2;
3737 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
3739 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
3740 if(prefcs
!=prenewfcs
and not skipchecksum
):
3741 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
3743 valid_archive
= False;
3744 invalid_archive
= True;
3745 prefhend
= catfp
.tell() - 1;
3746 prefcontentstart
= catfp
.tell();
3748 pyhascontents
= False;
3750 prefcontents
= catfp
.read(prefsize
);
3751 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
3752 pyhascontents
= True;
3753 if(prefccs
!=prenewfccs
and not skipchecksum
):
3754 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
3758 catfp
.seek(seekstart
, 0);
3760 catfheadsize
= int(preheaderdata
[0], 16);
3761 catfnumfields
= int(preheaderdata
[1], 16);
3762 catftype
= int(preheaderdata
[2], 16);
3763 if(re
.findall("^[.|/]", preheaderdata
[3])):
3764 catfname
= preheaderdata
[3];
3766 catfname
= "./"+preheaderdata
[3];
3767 catflinkname
= preheaderdata
[4];
3768 catfsize
= int(preheaderdata
[5], 16);
3769 catfbasedir
= os
.path
.dirname(catfname
);
3770 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
3772 catlist
.update({'catfp': catfp
});
3777 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
3779 def ArchiveFileSeekToFileName(infile
, seekfile
=None, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3780 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3783 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3784 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
3785 if(checkcompressfile
=="tarfile"):
3786 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3787 if(checkcompressfile
=="zipfile"):
3788 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3789 if(rarfile_support
and checkcompressfile
=="rarfile"):
3790 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3791 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3792 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3793 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3800 if(hasattr(sys
.stdin
, "buffer")):
3801 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
3803 shutil
.copyfileobj(sys
.stdin
, catfp
);
3805 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3809 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
3810 catfp
= download_file_from_internet_file(infile
);
3811 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3817 infile
= RemoveWindowsPath(infile
);
3818 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
3819 if(checkcompressfile
=="tarfile"):
3820 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3821 if(checkcompressfile
=="zipfile"):
3822 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3823 if(rarfile_support
and checkcompressfile
=="rarfile"):
3824 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3825 if(py7zr_support
and checkcompressfile
=="7zipfile"):
3826 return SevenZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
3827 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3829 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
3830 if(not compresscheck
):
3831 fextname
= os
.path
.splitext(infile
)[1];
3832 if(fextname
==".gz"):
3833 compresscheck
= "gzip";
3834 elif(fextname
==".bz2"):
3835 compresscheck
= "bzip2";
3836 elif(fextname
==".zst"):
3837 compresscheck
= "zstd";
3838 elif(fextname
==".lz4" or fextname
==".clz4"):
3839 compresscheck
= "lz4";
3840 elif(fextname
==".lzo" or fextname
==".lzop"):
3841 compresscheck
= "lzo";
3842 elif(fextname
==".lzma" or fextname
==".xz"):
3843 compresscheck
= "lzma";
3846 if(not compresscheck
):
3848 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3853 SeekToEndOfFile(catfp);
3855 SeekToEndOfFile(catfp);
3856 CatSize = catfp.tell();
3857 CatSizeEnd = CatSize;
3865 curloc
= catfp
.tell();
3868 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
3870 catfp
.seek(curloc
, 0);
3871 catstring
= catheader
[0];
3872 catversion
= re
.findall(r
"([\d]+)$", catstring
);
3873 fprenumfiles
= catheader
[1];
3874 fnumfiles
= int(fprenumfiles
, 16);
3875 fprechecksumtype
= catheader
[2];
3876 fprechecksum
= catheader
[3];
3877 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
3878 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3879 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
3880 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
3881 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3882 fheadtell
= len(fileheader
);
3883 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
3884 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
3886 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3887 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
3888 seekto
= fnumfiles
- 1
3893 prefhstart
= catfp
.tell();
3895 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
3897 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
3898 if(len(preheaderdata
)==0):
3900 prefheadsize
= int(preheaderdata
[0], 16);
3901 prefnumfields
= int(preheaderdata
[1], 16);
3902 preftype
= int(preheaderdata
[2], 16);
3903 if(re
.findall("^[.|/]", preheaderdata
[3])):
3904 prefname
= preheaderdata
[3];
3906 prefname
= "./"+preheaderdata
[3];
3907 prefbasedir
= os
.path
.dirname(prefname
);
3908 preflinkname
= preheaderdata
[4];
3909 prefsize
= int(preheaderdata
[5], 16);
3910 prefatime
= int(preheaderdata
[6], 16);
3911 prefmtime
= int(preheaderdata
[7], 16);
3912 prefctime
= int(preheaderdata
[8], 16);
3913 prefbtime
= int(preheaderdata
[9], 16);
3914 prefmode
= int(preheaderdata
[10], 16);
3915 prefchmode
= stat
.S_IMODE(prefmode
);
3916 preftypemod
= stat
.S_IFMT(prefmode
);
3917 prefwinattributes
= int(preheaderdata
[11], 16);
3918 prefuid
= int(preheaderdata
[12], 16);
3919 prefuname
= preheaderdata
[13];
3920 prefgid
= int(preheaderdata
[14], 16);
3921 prefgname
= preheaderdata
[15];
3922 fid
= int(preheaderdata
[16], 16);
3923 finode
= int(preheaderdata
[17], 16);
3924 flinkcount
= int(preheaderdata
[18], 16);
3925 prefdev_minor
= int(preheaderdata
[19], 16);
3926 prefdev_major
= int(preheaderdata
[20], 16);
3927 prefrdev_minor
= int(preheaderdata
[22], 16);
3928 prefrdev_major
= int(preheaderdata
[23], 16);
3929 prefextrasize
= int(preheaderdata
[24], 16);
3930 prefextrafields
= int(preheaderdata
[25], 16);
3931 extrafieldslist
= [];
3933 extraend
= extrastart
+ prefextrafields
;
3934 extrafieldslist
= [];
3935 if(extrastart
<extraend
):
3936 extrafieldslist
.append(preheaderdata
[extrastart
]);
3937 extrastart
= extrastart
+ 1;
3938 prefchecksumtype
= preheaderdata
[extrastart
].lower();
3939 prefcs
= preheaderdata
[extrastart
+ 1].lower();
3940 prefccs
= preheaderdata
[extrastart
+ 2].lower();
3942 hcmax
= len(preheaderdata
) - 2;
3945 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
3947 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
3948 if(prefcs
!=prenewfcs
and not skipchecksum
):
3949 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
3951 valid_archive
= False;
3952 invalid_archive
= True;
3953 prefhend
= catfp
.tell() - 1;
3954 prefcontentstart
= catfp
.tell();
3956 pyhascontents
= False;
3958 prefcontents
= catfp
.read(prefsize
);
3959 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
3960 pyhascontents
= True;
3961 if(prefccs
!=prenewfccs
and not skipchecksum
):
3962 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
3967 prefname
= preheaderdata
[2];
3968 if(re
.findall("^[.|/]", preheaderdata
[2])):
3969 prefname
= preheaderdata
[2];
3971 prefname
= "./"+preheaderdata
[2];
3972 if(prefname
==seekfile
):
3975 catfp
.seek(seekstart
, 0);
3977 catfheadsize
= int(preheaderdata
[0], 16);
3978 catfnumfields
= int(preheaderdata
[1], 16);
3979 catftype
= int(preheaderdata
[2], 16);
3980 if(re
.findall("^[.|/]", preheaderdata
[3])):
3981 catfname
= preheaderdata
[3];
3983 catfname
= "./"+preheaderdata
[3];
3984 catflinkname
= preheaderdata
[4];
3985 catfsize
= int(preheaderdata
[5], 16);
3986 catfbasedir
= os
.path
.dirname(catfname
);
3988 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
3992 catlist
.update({'catfp': catfp
});
3997 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
3999 def ArchiveFileValidate(infile
, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
4001 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4002 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4005 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4006 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4007 if(checkcompressfile
=="tarfile"):
4008 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4009 if(checkcompressfile
=="zipfile"):
4010 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4011 if(rarfile_support
and checkcompressfile
=="rarfile"):
4012 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4013 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4014 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4015 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4022 if(hasattr(sys
.stdin
, "buffer")):
4023 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4025 shutil
.copyfileobj(sys
.stdin
, catfp
);
4027 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4031 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4032 catfp
= download_file_from_internet_file(infile
);
4033 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4039 infile
= RemoveWindowsPath(infile
);
4040 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4041 if(checkcompressfile
=="tarfile"):
4042 return TarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4043 if(checkcompressfile
=="zipfile"):
4044 return ZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4045 if(rarfile_support
and checkcompressfile
=="rarfile"):
4046 return RarFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4047 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4048 return SevenZipFileToArray(infile
, 0, 0, False, False, formatspecs
, returnfp
);
4049 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4051 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4052 if(not compresscheck
):
4053 fextname
= os
.path
.splitext(infile
)[1];
4054 if(fextname
==".gz"):
4055 compresscheck
= "gzip";
4056 elif(fextname
==".bz2"):
4057 compresscheck
= "bzip2";
4058 elif(fextname
==".zst"):
4059 compresscheck
= "zstd";
4060 elif(fextname
==".lz4" or fextname
==".clz4"):
4061 compresscheck
= "lz4";
4062 elif(fextname
==".lzo" or fextname
==".lzop"):
4063 compresscheck
= "lzo";
4064 elif(fextname
==".lzma" or fextname
==".xz"):
4065 compresscheck
= "lzma";
4068 if(not compresscheck
):
4070 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4075 SeekToEndOfFile(catfp);
4077 SeekToEndOfFile(catfp);
4078 CatSize = catfp.tell();
4079 CatSizeEnd = CatSize;
4087 curloc
= catfp
.tell();
4090 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4092 catfp
.seek(curloc
, 0);
4093 catstring
= catheader
[0];
4094 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4095 fprenumfiles
= catheader
[1];
4096 fnumfiles
= int(fprenumfiles
, 16);
4097 fprechecksumtype
= catheader
[2];
4098 fprechecksum
= catheader
[3];
4100 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4101 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4102 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4103 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4104 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4105 valid_archive
= True;
4106 invalid_archive
= False;
4108 VerbosePrintOut(infile
);
4109 VerbosePrintOut("Number of Records " + str(fnumfiles
));
4110 if(fprechecksum
==catfileheadercshex
):
4112 VerbosePrintOut("File Header Checksum Passed at offset " + str(0));
4115 VerbosePrintOut("File Header Checksum Failed at offset " + str(0));
4116 valid_archive
= False;
4117 invalid_archive
= True;
4119 VerbosePrintOut("");
4120 while(il
<fnumfiles
):
4121 catfhstart
= catfp
.tell();
4123 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4125 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4126 if(len(catheaderdata
)==0):
4128 catfheadsize
= int(catheaderdata
[0], 16);
4129 catfnumfields
= int(catheaderdata
[1], 16);
4130 catftype
= int(catheaderdata
[2], 16);
4131 if(re
.findall("^[.|/]", catheaderdata
[3])):
4132 catfname
= catheaderdata
[3];
4134 catfname
= "./"+catheaderdata
[3];
4135 catfbasedir
= os
.path
.dirname(catfname
);
4136 catflinkname
= catheaderdata
[4];
4137 catfsize
= int(catheaderdata
[5], 16);
4138 catfatime
= int(catheaderdata
[6], 16);
4139 catfmtime
= int(catheaderdata
[7], 16);
4140 catfctime
= int(catheaderdata
[8], 16);
4141 catfbtime
= int(catheaderdata
[9], 16);
4142 catfmode
= int(catheaderdata
[10], 16);
4143 catfchmode
= stat
.S_IMODE(catfmode
);
4144 catftypemod
= stat
.S_IFMT(catfmode
);
4145 prefwinattributes
= int(catheaderdata
[11], 16);
4146 catfuid
= int(catheaderdata
[12], 16);
4147 catfuname
= catheaderdata
[13];
4148 catfgid
= int(catheaderdata
[14], 16);
4149 catfgname
= catheaderdata
[15];
4150 fid
= int(catheaderdata
[16], 16);
4151 finode
= int(catheaderdata
[17], 16);
4152 flinkcount
= int(catheaderdata
[18], 16);
4153 catfdev_minor
= int(catheaderdata
[19], 16);
4154 catfdev_major
= int(catheaderdata
[20], 16);
4155 catfrdev_minor
= int(catheaderdata
[21], 16);
4156 catfrdev_major
= int(catheaderdata
[22], 16);
4157 catfextrasize
= int(catheaderdata
[23], 16);
4158 catfextrafields
= int(catheaderdata
[24], 16);
4159 extrafieldslist
= [];
4161 extraend
= extrastart
+ catfextrafields
;
4162 extrafieldslist
= [];
4163 if(extrastart
<extraend
):
4164 extrafieldslist
.append(catheaderdata
[extrastart
]);
4165 extrastart
= extrastart
+ 1;
4166 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4167 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4168 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4170 hcmax
= len(catheaderdata
) - 2;
4173 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
4175 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4177 VerbosePrintOut(catfname
);
4178 VerbosePrintOut("Record Number " + str(il
) + "; File ID " + str(fid
) + "; iNode Number " + str(finode
));
4179 if(catfcs
==catnewfcs
):
4181 VerbosePrintOut("File Header Checksum Passed at offset " + str(catfhstart
));
4184 VerbosePrintOut("File Header Checksum Failed at offset " + str(catfhstart
));
4185 valid_archive
= False;
4186 invalid_archive
= True;
4187 catfhend
= catfp
.tell() - 1;
4188 catfcontentstart
= catfp
.tell();
4190 pyhascontents
= False;
4192 catfcontents
= catfp
.read(catfsize
);
4193 catnewfccs
= GetFileChecksum(catfcontents
, catheaderdata
[-3].lower(), False, formatspecs
);
4194 pyhascontents
= True;
4195 if(catfccs
==catnewfccs
):
4197 VerbosePrintOut("File Content Checksum Passed at offset " + str(catfcontentstart
));
4200 VerbosePrintOut("File Content Checksum Failed at offset " + str(catfcontentstart
));
4201 valid_archive
= False;
4202 invalid_archive
= True;
4204 VerbosePrintOut("");
4217 create_alias_function("", __file_format_name__
, "Validate", ArchiveFileValidate
);
4219 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4220 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4223 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4224 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
, True);
4225 if(checkcompressfile
=="tarfile"):
4226 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4227 if(checkcompressfile
=="zipfile"):
4228 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4229 if(rarfile_support
and checkcompressfile
=="rarfile"):
4230 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4231 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4232 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4233 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4240 if(hasattr(sys
.stdin
, "buffer")):
4241 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
4243 shutil
.copyfileobj(sys
.stdin
, catfp
);
4245 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4249 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4250 catfp
= download_file_from_internet_file(infile
);
4251 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
4257 infile
= RemoveWindowsPath(infile
);
4258 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4259 if(checkcompressfile
=="tarfile"):
4260 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4261 if(checkcompressfile
=="zipfile"):
4262 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4263 if(rarfile_support
and checkcompressfile
=="rarfile"):
4264 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4265 if(py7zr_support
and checkcompressfile
=="7zipfile"):
4266 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4267 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
4269 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
4270 if(not compresscheck
):
4271 fextname
= os
.path
.splitext(infile
)[1];
4272 if(fextname
==".gz"):
4273 compresscheck
= "gzip";
4274 elif(fextname
==".bz2"):
4275 compresscheck
= "bzip2";
4276 elif(fextname
==".zst"):
4277 compresscheck
= "zstd";
4278 elif(fextname
==".lz4" or fextname
==".clz4"):
4279 compresscheck
= "lz4";
4280 elif(fextname
==".lzo" or fextname
==".lzop"):
4281 compresscheck
= "lzo";
4282 elif(fextname
==".lzma" or fextname
==".xz"):
4283 compresscheck
= "lzma";
4286 if(not compresscheck
):
4288 catfp
= UncompressFile(infile
, formatspecs
, "rb");
4293 SeekToEndOfFile(catfp);
4295 SeekToEndOfFile(catfp);
4296 CatSize = catfp.tell();
4297 CatSizeEnd = CatSize;
4305 curloc
= catfp
.tell();
4308 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
4310 catfp
.seek(curloc
, 0);
4311 catstring
= catheader
[0];
4312 catversion
= re
.findall(r
"([\d]+)$", catstring
);
4313 fprenumfiles
= catheader
[1];
4314 fnumfiles
= int(fprenumfiles
, 16);
4315 fprechecksumtype
= catheader
[2];
4316 fprechecksum
= catheader
[3];
4317 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
4318 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4319 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
4320 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4321 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4322 fheadtell
= len(fileheader
);
4323 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
4324 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
4326 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4327 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
4328 if(seekstart
<0 and seekstart
>fnumfiles
):
4330 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
4331 seekend
= fnumfiles
;
4332 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
4333 seekend
= fnumfiles
- abs(seekend
);
4336 while(il
< seekstart
):
4337 prefhstart
= catfp
.tell();
4339 preheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4341 preheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4342 if(len(preheaderdata
)==0):
4344 prefheadsize
= int(preheaderdata
[0], 16);
4345 prefnumfields
= int(preheaderdata
[1], 16);
4346 if(re
.findall("^[.|/]", preheaderdata
[3])):
4347 prefname
= preheaderdata
[3];
4349 prefname
= "./"+preheaderdata
[3];
4350 prefsize
= int(preheaderdata
[5], 16);
4351 prefextrasize
= int(preheaderdata
[23], 16);
4352 prefextrafields
= int(preheaderdata
[24], 16);
4353 extrafieldslist
= [];
4355 extraend
= extrastart
+ prefextrafields
;
4356 extrafieldslist
= [];
4357 if(extrastart
<extraend
):
4358 extrafieldslist
.append(preheaderdata
[extrastart
]);
4359 extrastart
= extrastart
+ 1;
4360 prefchecksumtype
= preheaderdata
[extrastart
].lower();
4361 prefcs
= preheaderdata
[extrastart
+ 1].lower();
4362 prefccs
= preheaderdata
[extrastart
+ 2].lower();
4364 hcmax
= len(preheaderdata
) - 2;
4367 hout
= hout
+ AppendNullByte(preheaderdata
[hc
], formatspecs
[5]);
4369 prenewfcs
= GetFileChecksum(hout
, preheaderdata
[-3].lower(), True, formatspecs
);
4370 if(prefcs
!=prenewfcs
and not skipchecksum
):
4371 VerbosePrintOut("File Header Checksum Error with file " + prefname
+ " at offset " + str(prefhstart
));
4373 valid_archive
= False;
4374 invalid_archive
= True;
4375 prefhend
= catfp
.tell() - 1;
4376 prefcontentstart
= catfp
.tell();
4378 pyhascontents
= False;
4380 prefcontents
= catfp
.read(prefsize
);
4381 prenewfccs
= GetFileChecksum(prefcontents
, preheaderdata
[-3].lower(), False, formatspecs
);
4382 pyhascontents
= True;
4383 if(prefccs
!=prenewfccs
and not skipchecksum
):
4384 VerbosePrintOut("File Content Checksum Error with file " + prefname
+ " at offset " + str(prefcontentstart
));
4388 fileidnum
= seekstart
;
4390 while(fileidnum
<seekend
):
4391 catfhstart
= catfp
.tell();
4393 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
4395 catheaderdata
= ReadFileHeaderDataWoSize(catfp
, formatspecs
[5]);
4396 if(len(catheaderdata
)==0):
4398 catfheadsize
= int(catheaderdata
[0], 16);
4399 catfnumfields
= int(catheaderdata
[1], 16);
4400 catftype
= int(catheaderdata
[2], 16);
4401 if(re
.findall("^[.|/]", catheaderdata
[3])):
4402 catfname
= catheaderdata
[3];
4404 catfname
= "./"+catheaderdata
[3];
4405 catfbasedir
= os
.path
.dirname(catfname
);
4406 catflinkname
= catheaderdata
[4];
4407 catfsize
= int(catheaderdata
[5], 16);
4408 catfatime
= int(catheaderdata
[6], 16);
4409 catfmtime
= int(catheaderdata
[7], 16);
4410 catfctime
= int(catheaderdata
[8], 16);
4411 catfbtime
= int(catheaderdata
[9], 16);
4412 catfmode
= int(catheaderdata
[10], 16);
4413 catfchmode
= stat
.S_IMODE(catfmode
);
4414 catftypemod
= stat
.S_IFMT(catfmode
);
4415 catfwinattributes
= int(catheaderdata
[11], 16);
4416 catfuid
= int(catheaderdata
[12], 16);
4417 catfuname
= catheaderdata
[13];
4418 catfgid
= int(catheaderdata
[14], 16);
4419 catfgname
= catheaderdata
[15];
4420 fid
= int(catheaderdata
[16], 16);
4421 finode
= int(catheaderdata
[17], 16);
4422 flinkcount
= int(catheaderdata
[18], 16);
4423 catfdev_minor
= int(catheaderdata
[19], 16);
4424 catfdev_major
= int(catheaderdata
[20], 16);
4425 catfrdev_minor
= int(catheaderdata
[21], 16);
4426 catfrdev_major
= int(catheaderdata
[22], 16);
4427 catfextrasize
= int(catheaderdata
[23], 16);
4428 catfextrafields
= int(catheaderdata
[24], 16);
4429 extrafieldslist
= [];
4431 extraend
= extrastart
+ catfextrafields
;
4432 extrafieldslist
= [];
4433 if(extrastart
<extraend
):
4434 extrafieldslist
.append(catheaderdata
[extrastart
]);
4435 extrastart
= extrastart
+ 1;
4436 catfchecksumtype
= catheaderdata
[extrastart
].lower();
4437 catfcs
= catheaderdata
[extrastart
+ 1].lower();
4438 catfccs
= catheaderdata
[extrastart
+ 2].lower();
4440 hcmax
= len(catheaderdata
) - 2;
4443 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
4445 catnewfcs
= GetFileChecksum(hout
, catheaderdata
[-3].lower(), True, formatspecs
);
4446 if(catfcs
!=catnewfcs
and not skipchecksum
):
4447 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
4449 catfhend
= catfp
.tell() - 1;
4450 catfcontentstart
= catfp
.tell();
4451 catfcontents
= BytesIO();
4452 pyhascontents
= False;
4453 catfcontents
.seek(0, 0);
4454 if(catfsize
>0 and not listonly
):
4455 catfcontents
.write(catfp
.read(catfsize
));
4456 catnewfccs
= GetFileChecksum(catfcontents
.read(), catheaderdata
[-3].lower(), False, formatspecs
);
4457 pyhascontents
= True;
4458 if(catfccs
!=catnewfccs
and skipchecksum
):
4459 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
4461 if(catfsize
>0 and listonly
):
4462 catfp
.seek(catfsize
, 1);
4463 pyhascontents
= False;
4465 catfcontentend
= catfp
.tell() - 1;
4466 catfcontents
.seek(0, 0);
4467 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
} });
4468 fileidnum
= fileidnum
+ 1;
4469 realidnum
= realidnum
+ 1;
4471 catlist
.update({'catfp': catfp
});
4476 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
4478 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4479 catfp
= BytesIO(catstr
);
4480 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4481 return listcatfiles
;
4483 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
4485 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4487 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4488 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4489 return listcatfiles
;
4491 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4493 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4494 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4495 return listcatfiles
;
4497 if(not rarfile_support
):
4498 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4501 if(rarfile_support
):
4502 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4504 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4505 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4506 return listcatfiles
;
4508 if(not py7zr_support
):
4509 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4513 def SevenZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4515 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4516 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4517 return listcatfiles
;
4519 def InFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4520 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
4521 if(checkcompressfile
=="tarfile"):
4522 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4523 elif(checkcompressfile
=="zipfile"):
4524 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4525 elif(checkcompressfile
=="catfile"):
4526 return ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4527 elif(rarfile_support
and checkcompressfile
=="rarfile"):
4528 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4529 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
4530 return SevenZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4535 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4536 catver
= formatspecs
[6];
4537 fileheaderver
= str(int(catver
.replace(".", "")));
4538 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4539 advancedlist
= formatspecs
[8];
4540 altinode
= formatspecs
[9];
4543 for line
in sys
.stdin
:
4544 infilelist
.append(line
.strip());
4545 infilelist
= list(filter(None, infilelist
));
4546 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
4547 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
4549 with
UncompressFile(infiles
, formatspecs
, "r") as finfile
:
4550 for line
in finfile
:
4551 infilelist
.append(line
.strip());
4552 infilelist
= list(filter(None, infilelist
));
4554 if(isinstance(infiles
, (list, tuple, ))):
4555 infilelist
= list(filter(None, infiles
));
4556 elif(isinstance(infiles
, (str, ))):
4557 infilelist
= list(filter(None, [infiles
]));
4559 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
4561 GetDirList
= ListDir(infilelist
, followlink
, False);
4569 inodetocatinode
= {};
4571 fnumfiles
= int(len(GetDirList
));
4572 catver
= formatspecs
[6];
4573 fileheaderver
= str(int(catver
.replace(".", "")));
4574 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4575 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4576 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4577 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4578 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4579 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4580 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4581 fheadtell
= len(fileheader
);
4582 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4583 for curfname
in GetDirList
:
4584 if(re
.findall("^[.|/]", curfname
)):
4587 fname
= "./"+curfname
;
4589 VerbosePrintOut(fname
);
4590 if(not followlink
or followlink
is None):
4591 fstatinfo
= os
.lstat(fname
);
4593 fstatinfo
= os
.stat(fname
);
4594 fpremode
= fstatinfo
.st_mode
;
4595 finode
= fstatinfo
.st_ino
;
4596 flinkcount
= fstatinfo
.st_nlink
;
4598 if(stat
.S_ISREG(fpremode
)):
4600 elif(stat
.S_ISLNK(fpremode
)):
4602 elif(stat
.S_ISCHR(fpremode
)):
4604 elif(stat
.S_ISBLK(fpremode
)):
4606 elif(stat
.S_ISDIR(fpremode
)):
4608 elif(stat
.S_ISFIFO(fpremode
)):
4610 elif(stat
.S_ISSOCK(fpremode
)):
4612 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
4614 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
4616 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
4621 fbasedir
= os
.path
.dirname(fname
);
4623 if(not followlink
and finode
!=0):
4625 if(finode
in inodelist
):
4627 flinkname
= inodetofile
[finode
];
4631 fcurinode
= inodetocatinode
[finode
];
4632 if(finode
not in inodelist
):
4633 inodelist
.append(finode
);
4634 inodetofile
.update({finode
: fname
});
4635 inodetocatinode
.update({finode
: curinode
});
4639 fcurinode
= curinode
;
4640 curinode
= curinode
+ 1;
4642 fcurinode
= curinode
;
4643 curinode
= curinode
+ 1;
4644 curfid
= curfid
+ 1;
4646 flinkname
= os
.readlink(fname
);
4647 fdev
= fstatinfo
.st_dev
;
4648 getfdev
= GetDevMajorMinor(fdev
);
4649 fdev_minor
= getfdev
[0];
4650 fdev_major
= getfdev
[1];
4651 frdev
= fstatinfo
.st_dev
;
4652 if(hasattr(fstatinfo
, "st_rdev")):
4653 frdev
= fstatinfo
.st_rdev
;
4655 frdev
= fstatinfo
.st_dev
;
4656 getfrdev
= GetDevMajorMinor(frdev
);
4657 frdev_minor
= getfrdev
[0];
4658 frdev_major
= getfrdev
[1];
4659 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
4661 if(ftype
==0 or ftype
==7):
4662 fsize
= fstatinfo
.st_size
;
4663 fatime
= fstatinfo
.st_atime
;
4664 fmtime
= fstatinfo
.st_mtime
;
4665 fctime
= fstatinfo
.st_ctime
;
4666 if(hasattr(fstatinfo
, "st_birthtime")):
4667 fbtime
= fstatinfo
.st_birthtime
;
4669 fbtime
= fstatinfo
.st_ctime
;
4670 fmode
= fstatinfo
.st_mode
;
4671 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
4672 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
4673 fuid
= fstatinfo
.st_uid
;
4674 fgid
= fstatinfo
.st_gid
;
4679 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
4680 funame
= userinfo
.pw_name
;
4689 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
4690 fgname
= groupinfo
.gr_name
;
4695 fdev_minor
= fdev_minor
;
4696 fdev_major
= fdev_major
;
4697 frdev_minor
= frdev_minor
;
4698 frdev_major
= frdev_major
;
4700 flinkcount
= flinkcount
;
4701 if(hasattr(fstatinfo
, "st_file_attributes")):
4702 fwinattributes
= fstatinfo
.st_file_attributes
;
4705 fcontents
= BytesIO();
4706 if(ftype
==0 or ftype
==7):
4707 with
open(fname
, "rb") as fpc
:
4708 shutil
.copyfileobj(fpc
, fcontents
);
4709 if(followlink
and (ftype
==1 or ftype
==2)):
4710 flstatinfo
= os
.stat(flinkname
);
4711 with
open(flinkname
, "rb") as fpc
:
4712 shutil
.copyfileobj(fpc
, fcontents
);
4713 fcontents
.seek(0, 0);
4714 ftypehex
= format(ftype
, 'x').lower();
4715 extrafields
= len(extradata
);
4716 extrafieldslist
= extradata
;
4717 catfextrafields
= extrafields
;
4718 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
4719 if(len(extradata
)>0):
4720 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4721 extrasizelen
= len(extrasizestr
);
4722 extrasizelenhex
= format(extrasizelen
, 'x').lower();
4723 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()];
4724 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
4725 catoutlenhex
= format(catoutlen
, 'x').lower();
4726 catoutlist
.insert(0, catoutlenhex
);
4727 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
4728 if(len(extradata
)>0):
4729 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4730 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
4731 catfnumfields
= catoutlen
;
4732 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
4733 fcontents
.seek(0, 0);
4734 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
4735 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4736 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
4737 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
4738 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
4739 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4740 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4741 nullstrecd
= formatspecs
[5].encode('UTF-8');
4742 fheadtell
+= len(catfileoutstr
) + 1;
4743 catfcontentend
= fheadtell
- 1;
4744 fcontents
.seek(0, 0);
4745 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
4746 pyhascontents
= False;
4747 if(int(fsize
)>0 and not listonly
):
4748 pyhascontents
= True;
4749 if(int(fsize
)>0 and listonly
):
4750 fcontents
= BytesIO();
4751 pyhascontents
= False;
4752 fcontents
.seek(0, 0);
4753 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
} });
4754 fileidnum
= fileidnum
+ 1;
4757 def TarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4763 inodetocatinode
= {};
4767 if(hasattr(sys
.stdin
, "buffer")):
4768 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
4770 shutil
.copyfileobj(sys
.stdin
, infile
);
4775 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4776 infile
= download_file_from_internet_file(infile
);
4781 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
4783 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
4785 if(not tarfile
.is_tarfile(infile
)):
4787 except AttributeError:
4788 if(not is_tarfile(infile
)):
4793 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
4794 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
4796 tarfp
= tarfile
.open(infile
, "r");
4797 except FileNotFoundError
:
4799 fnumfiles
= int(len(tarfp
.getmembers()));
4800 catver
= formatspecs
[6];
4801 fileheaderver
= str(int(catver
.replace(".", "")));
4802 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4803 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4804 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4805 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4806 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4807 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4808 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4809 fheadtell
= len(fileheader
);
4810 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4811 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
4812 if(re
.findall("^[.|/]", member
.name
)):
4813 fname
= member
.name
;
4815 fname
= "./"+member
.name
;
4817 VerbosePrintOut(fname
);
4818 fpremode
= member
.mode
;
4819 ffullmode
= member
.mode
;
4823 ffullmode
= member
.mode
+ stat
.S_IFREG
;
4825 elif(member
.isdev()):
4826 ffullmode
= member
.mode
;
4828 elif(member
.islnk()):
4829 ffullmode
= member
.mode
+ stat
.S_IFREG
;
4831 elif(member
.issym()):
4832 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
4834 elif(member
.ischr()):
4835 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
4837 elif(member
.isblk()):
4838 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
4840 elif(member
.isdir()):
4841 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
4843 elif(member
.isfifo()):
4844 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
4846 elif(member
.issparse()):
4847 ffullmode
= member
.mode
;
4850 ffullmode
= member
.mode
;
4853 fbasedir
= os
.path
.dirname(fname
);
4857 curfid
= curfid
+ 1;
4859 flinkname
= member
.linkname
;
4860 fdev_minor
= member
.devminor
;
4861 fdev_major
= member
.devmajor
;
4862 frdev_minor
= member
.devminor
;
4863 frdev_major
= member
.devmajor
;
4864 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
4866 elif(ftype
==0 or ftype
==7):
4867 fsize
= member
.size
;
4869 fsize
= member
.size
;
4870 fatime
= member
.mtime
;
4871 fmtime
= member
.mtime
;
4872 fctime
= member
.mtime
;
4873 fbtime
= member
.mtime
;
4875 fchmode
= stat
.S_IMODE(ffullmode
);
4876 ftypemod
= stat
.S_IFMT(ffullmode
);
4879 funame
= member
.uname
;
4880 fgname
= member
.gname
;
4881 flinkcount
= flinkcount
;
4882 fwinattributes
= int(0);
4883 fcontents
= BytesIO();
4884 if(ftype
==0 or ftype
==7):
4885 with tarfp
.extractfile(member
) as fpc
:
4886 shutil
.copyfileobj(fpc
, fcontents
);
4887 fcontents
.seek(0, 0);
4888 ftypehex
= format(ftype
, 'x').lower();
4889 extrafields
= len(extradata
);
4890 extrafieldslist
= extradata
;
4891 catfextrafields
= extrafields
;
4892 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
4893 if(len(extradata
)>0):
4894 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4895 extrasizelen
= len(extrasizestr
);
4896 extrasizelenhex
= format(extrasizelen
, 'x').lower();
4897 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()];
4898 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
4899 catoutlenhex
= format(catoutlen
, 'x').lower();
4900 catoutlist
.insert(0, catoutlenhex
);
4901 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
4902 if(len(extradata
)>0):
4903 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4904 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
4905 catfnumfields
= catoutlen
;
4906 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
4907 fcontents
.seek(0, 0);
4908 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
4909 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4910 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
4911 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
4912 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
4913 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4914 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4915 nullstrecd
= formatspecs
[5].encode('UTF-8');
4916 fheadtell
+= len(catfileoutstr
) + 1;
4917 catfcontentend
= fheadtell
- 1;
4918 fcontents
.seek(0, 0);
4919 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
4920 pyhascontents
= False;
4921 if(int(fsize
)>0 and not listonly
):
4922 pyhascontents
= True;
4923 if(int(fsize
)>0 and listonly
):
4925 pyhascontents
= False;
4926 fcontents
.seek(0, 0);
4927 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
} });
4928 fileidnum
= fileidnum
+ 1;
4931 def ZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4937 inodetocatinode
= {};
4941 if(hasattr(sys
.stdin
, "buffer")):
4942 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
4944 shutil
.copyfileobj(sys
.stdin
, infile
);
4949 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
4950 infile
= download_file_from_internet_file(infile
);
4955 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
4959 if(not zipfile
.is_zipfile(infile
)):
4962 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
4963 except FileNotFoundError
:
4965 ziptest
= zipfp
.testzip();
4967 VerbosePrintOut("Bad file found!");
4968 fnumfiles
= int(len(zipfp
.infolist()));
4969 catver
= formatspecs
[6];
4970 fileheaderver
= str(int(catver
.replace(".", "")));
4971 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4972 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4973 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4974 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4975 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4976 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
4977 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4978 fheadtell
= len(fileheader
);
4979 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4980 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
4981 if(re
.findall("^[.|/]", member
.filename
)):
4982 fname
= member
.filename
;
4984 fname
= "./"+member
.filename
;
4985 zipinfo
= zipfp
.getinfo(member
.filename
);
4987 VerbosePrintOut(fname
);
4988 if(not member
.is_dir()):
4989 fpremode
= stat
.S_IFREG
+ 438;
4990 elif(member
.is_dir()):
4991 fpremode
= stat
.S_IFDIR
+ 511;
4994 if(not member
.is_dir()):
4996 elif(member
.is_dir()):
4999 fbasedir
= os
.path
.dirname(fname
);
5003 curfid
= curfid
+ 1;
5011 fsize
= member
.file_size
;
5013 fsize
= member
.file_size
;
5014 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5015 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5016 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5017 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
5018 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
5019 fwinattributes
= int(zipinfo
.external_attr
);
5020 if(not member
.is_dir()):
5021 fmode
= int(stat
.S_IFREG
+ 438);
5022 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5023 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5024 elif(member
.is_dir()):
5025 fmode
= int(stat
.S_IFDIR
+ 511);
5026 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5027 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5028 elif(zipinfo
.create_system
==3):
5029 fwinattributes
= int(0);
5030 fmode
= int(zipinfo
.external_attr
);
5032 fwinattributes
= int(0);
5033 if(not member
.is_dir()):
5034 fmode
= int(stat
.S_IFREG
+ 438);
5035 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5036 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5037 elif(member
.is_dir()):
5038 fmode
= int(stat
.S_IFDIR
+ 511);
5039 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5040 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5043 except AttributeError:
5049 except AttributeError:
5056 userinfo
= pwd
.getpwuid(os
.getuid());
5057 funame
= userinfo
.pw_name
;
5060 except AttributeError:
5068 groupinfo
= grp
.getgrgid(os
.getgid());
5069 fgname
= groupinfo
.gr_name
;
5072 except AttributeError:
5076 fcontents
= BytesIO();
5078 fcontents
.write(zipfp
.read(member
.filename
));
5079 fcontents
.seek(0, 0);
5080 ftypehex
= format(ftype
, 'x').lower();
5081 extrafields
= len(extradata
);
5082 extrafieldslist
= extradata
;
5083 catfextrafields
= extrafields
;
5084 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5085 if(len(extradata
)>0):
5086 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5087 extrasizelen
= len(extrasizestr
);
5088 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5089 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()];
5090 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5091 catoutlenhex
= format(catoutlen
, 'x').lower();
5092 catoutlist
.insert(0, catoutlenhex
);
5093 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5094 if(len(extradata
)>0):
5095 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5096 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5097 catfnumfields
= catoutlen
;
5098 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5099 fcontents
.seek(0, 0);
5100 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5101 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5102 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5103 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5104 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5105 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5106 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5107 nullstrecd
= formatspecs
[5].encode('UTF-8');
5108 fheadtell
+= len(catfileoutstr
) + 1;
5109 catfcontentend
= fheadtell
- 1;
5110 fcontents
.seek(0, 0);
5111 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5112 pyhascontents
= False;
5113 if(int(fsize
)>0 and not listonly
):
5114 pyhascontents
= True;
5115 if(int(fsize
)>0 and listonly
):
5116 fcontents
= BytesIO();
5117 pyhascontents
= False;
5118 fcontents
.seek(0, 0);
5119 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
} });
5120 fileidnum
= fileidnum
+ 1;
5123 if(not rarfile_support
):
5124 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5127 if(rarfile_support
):
5128 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5134 inodetocatinode
= {};
5136 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
5138 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5140 rarfp
= rarfile
.RarFile(infile
, "r");
5141 rartest
= rarfp
.testrar();
5143 VerbosePrintOut("Bad file found!");
5144 fnumfiles
= int(len(rarfp
.infolist()));
5145 catver
= formatspecs
[6];
5146 fileheaderver
= str(int(catver
.replace(".", "")));
5147 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5148 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5149 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5150 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5151 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5152 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
5153 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5154 fheadtell
= len(fileheader
);
5155 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5156 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5159 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
5162 member
.external_attr
5164 except AttributeError:
5166 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
5169 member
.external_attr
5171 except AttributeError:
5176 if(re
.findall("^[.|/]", member
.filename
)):
5177 fname
= member
.filename
;
5179 fname
= "./"+member
.filename
;
5180 rarinfo
= rarfp
.getinfo(member
.filename
);
5182 VerbosePrintOut(fname
);
5183 if(is_unix
and member
.external_attr
!=0):
5184 fpremode
= int(member
.external_attr
);
5185 elif(member
.is_file()):
5186 fpremode
= stat
.S_IFREG
+ 438;
5187 elif(member
.is_symlink()):
5188 fpremode
= stat
.S_IFLNK
+ 438;
5189 elif(member
.is_dir()):
5190 fpremode
= stat
.S_IFDIR
+ 511;
5191 if(is_windows
and member
.external_attr
!=0):
5192 fwinattributes
= int(member
.external_attr
);
5194 fwinattributes
= int(0);
5197 if(member
.is_file()):
5199 elif(member
.is_symlink()):
5201 elif(member
.is_dir()):
5205 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
5206 fbasedir
= os
.path
.dirname(fname
);
5210 curfid
= curfid
+ 1;
5218 fsize
= member
.file_size
;
5221 fatime
= int(member
.atime
.timestamp());
5223 fatime
= int(member
.mtime
.timestamp());
5224 except AttributeError:
5225 fatime
= int(member
.mtime
.timestamp());
5226 fmtime
= int(member
.mtime
.timestamp());
5229 fctime
= int(member
.ctime
.timestamp());
5231 fctime
= int(member
.mtime
.timestamp());
5232 except AttributeError:
5233 fctime
= int(member
.mtime
.timestamp());
5234 fbtime
= int(member
.mtime
.timestamp());
5235 if(is_unix
and member
.external_attr
!=0):
5236 fmode
= int(member
.external_attr
);
5237 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5238 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5239 elif(member
.is_file()):
5240 fmode
= int(stat
.S_IFREG
+ 438)
5241 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5242 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5243 elif(member
.is_symlink()):
5244 fmode
= int(stat
.S_IFLNK
+ 438)
5245 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5246 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5247 elif(member
.is_dir()):
5248 fmode
= int(stat
.S_IFDIR
+ 511)
5249 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5250 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5253 except AttributeError:
5259 except AttributeError:
5266 userinfo
= pwd
.getpwuid(os
.getuid());
5267 funame
= userinfo
.pw_name
;
5270 except AttributeError:
5278 groupinfo
= grp
.getgrgid(os
.getgid());
5279 fgname
= groupinfo
.gr_name
;
5282 except AttributeError:
5286 fcontents
= BytesIO();
5288 fcontents
.write(rarfp
.read(member
.filename
));
5289 fcontents
.seek(0, 0);
5290 ftypehex
= format(ftype
, 'x').lower();
5291 extrafields
= len(extradata
);
5292 extrafieldslist
= extradata
;
5293 catfextrafields
= extrafields
;
5294 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5295 if(len(extradata
)>0):
5296 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5297 extrasizelen
= len(extrasizestr
);
5298 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5299 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()];
5300 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5301 catoutlenhex
= format(catoutlen
, 'x').lower();
5302 catoutlist
.insert(0, catoutlenhex
);
5303 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5304 if(len(extradata
)>0):
5305 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5306 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5307 catfnumfields
= 24 + catfextrafields
;
5308 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5309 fcontents
.seek(0, 0);
5310 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5311 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5312 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5313 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5314 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5315 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5316 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5317 nullstrecd
= formatspecs
[5].encode('UTF-8');
5318 fheadtell
+= len(catfileoutstr
) + 1;
5319 catfcontentend
= fheadtell
- 1;
5320 fcontents
.seek(0, 0);
5321 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5322 pyhascontents
= False;
5323 if(int(fsize
)>0 and not listonly
):
5324 pyhascontents
= True;
5325 if(int(fsize
)>0 and listonly
):
5326 fcontents
= BytesIO();
5327 pyhascontents
= False;
5328 fcontents
.seek(0, 0);
5329 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
} });
5330 fileidnum
= fileidnum
+ 1;
5333 if(not py7zr_support
):
5334 def SevenZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5338 def SevenZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5344 inodetocatinode
= {};
5346 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
5347 file_content
= szpfp
.readall();
5348 #sztest = szpfp.testzip();
5349 sztestalt
= szpfp
.test();
5351 VerbosePrintOut("Bad file found!");
5352 numfiles
= int(len(szpfp
.list()));
5353 catver
= formatspecs
[6];
5354 fileheaderver
= str(int(catver
.replace(".", "")));
5355 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5356 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
5357 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
5358 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5359 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5360 catfileheadercshex
= GetFileChecksum(fileheader
, fprechecksumtype
, True, formatspecs
);
5361 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5362 fheadtell
= len(fileheader
);
5363 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
5364 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
5365 if(re
.findall("^[.|/]", member
.filename
)):
5366 fname
= member
.filename
;
5368 fname
= "./"+member
.filename
;
5369 if(not member
.is_directory
):
5370 fpremode
= int(stat
.S_IFREG
+ 438);
5371 elif(member
.is_directory
):
5372 fpremode
= int(stat
.S_IFDIR
+ 511);
5373 fwinattributes
= int(0);
5376 if(member
.is_directory
):
5381 fbasedir
= os
.path
.dirname(fname
);
5385 curfid
= curfid
+ 1;
5392 fatime
= int(member
.creationtime
.timestamp());
5393 fmtime
= int(member
.creationtime
.timestamp());
5394 fctime
= int(member
.creationtime
.timestamp());
5395 fbtime
= int(member
.creationtime
.timestamp());
5396 if(member
.is_directory
):
5397 fmode
= int(stat
.S_IFDIR
+ 511)
5398 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
5399 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
5401 fmode
= int(stat
.S_IFLNK
+ 438)
5402 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
5403 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
5406 except AttributeError:
5412 except AttributeError:
5419 userinfo
= pwd
.getpwuid(os
.getuid());
5420 funame
= userinfo
.pw_name
;
5423 except AttributeError:
5431 groupinfo
= grp
.getgrgid(os
.getgid());
5432 fgname
= groupinfo
.gr_name
;
5435 except AttributeError:
5439 fcontents
= BytesIO();
5441 fcontents
.write(file_content
[member
.filename
].read());
5442 fsize
= format(fcontents
.tell(), 'x').lower();
5444 fcontents
.seek(0, 0);
5445 ftypehex
= format(ftype
, 'x').lower();
5446 extrafields
= len(extradata
);
5447 extrafieldslist
= extradata
;
5448 catfextrafields
= extrafields
;
5449 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5450 if(len(extradata
)>0):
5451 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5452 extrasizelen
= len(extrasizestr
);
5453 extrasizelenhex
= format(extrasizelen
, 'x').lower();
5454 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()];
5455 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
5456 catoutlenhex
= format(catoutlen
, 'x').lower();
5457 catoutlist
.insert(0, catoutlenhex
);
5458 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
5459 if(len(extradata
)>0):
5460 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5461 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
5462 catfnumfields
= 24 + catfextrafields
;
5463 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5464 fcontents
.seek(0, 0);
5465 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
5466 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5467 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
5468 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5469 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
5470 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5471 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5472 nullstrecd
= formatspecs
[5].encode('UTF-8');
5473 fheadtell
+= len(catfileoutstr
) + 1;
5474 catfcontentend
= fheadtell
- 1;
5475 fcontents
.seek(0, 0);
5476 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
5477 pyhascontents
= False;
5478 if(int(fsize
)>0 and not listonly
):
5479 pyhascontents
= True;
5480 if(int(fsize
)>0 and listonly
):
5482 pyhascontents
= False;
5483 fcontents
.seek(0, 0);
5484 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
} });
5485 fileidnum
= fileidnum
+ 1;
5488 def InFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5489 checkcompressfile
= CheckCompressionSubType(infiles
, formatspecs
, True);
5490 if(checkcompressfile
=="tarfile"):
5491 return TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5492 elif(checkcompressfile
=="zipfile"):
5493 return ZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5494 elif(checkcompressfile
=="catfile"):
5495 return ArchiveFileToArray(infile
, 0, 0, listonly
, False, formatspecs
, False);
5496 elif(rarfile_support
and checkcompressfile
=="rarfile"):
5497 return RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5498 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
5499 return SevenZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5504 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):
5505 outarray
= BytesIO();
5506 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
5507 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5508 return listcatfiles
;
5510 def ArchiveFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5511 if(isinstance(infile
, dict)):
5512 listcatfiles
= infile
;
5514 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5515 infile
= RemoveWindowsPath(infile
);
5516 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5517 if(not listcatfiles
):
5519 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': {}}}};
5521 catarray
.update({'catfp': listcatfiles
['catfp']});
5522 lenlist
= len(listcatfiles
['ffilelist']);
5524 lcfx
= int(listcatfiles
['fnumfiles']);
5525 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5526 lcfx
= int(lenlist
);
5528 lcfx
= int(listcatfiles
['fnumfiles']);
5530 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5531 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5532 catarray
['filetoid'].update(filetoidarray
);
5533 catarray
['idtofile'].update(idtofilearray
);
5534 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5535 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5536 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5537 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5538 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5539 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5540 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5541 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5542 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5543 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5544 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5545 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5546 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5547 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5548 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5549 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5550 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5551 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5552 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5553 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5554 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5555 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5556 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5557 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5558 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5559 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5560 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5561 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5562 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5563 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5564 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5568 create_alias_function("", __file_format_name__
, "ToArrayIndex", ArchiveFileToArrayIndex
);
5570 def ListDirToArrayIndexAlt(infiles
, dirlistfromtxt
=False, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5571 listcatfiles
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5572 if(not listcatfiles
):
5574 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': {}}}};
5575 lenlist
= len(listcatfiles
['ffilelist']);
5577 lcfx
= int(listcatfiles
['fnumfiles']);
5578 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5579 lcfx
= int(lenlist
);
5581 lcfx
= int(listcatfiles
['fnumfiles']);
5583 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5584 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5585 catarray
['filetoid'].update(filetoidarray
);
5586 catarray
['idtofile'].update(idtofilearray
);
5587 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5588 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5589 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5590 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5591 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5592 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5593 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5594 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5595 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5596 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5597 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5598 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5599 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5600 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5601 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5602 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5603 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5604 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5605 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5606 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5607 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5608 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5609 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5610 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5611 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5612 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5613 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5614 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5615 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5616 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5617 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5621 def TarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5622 listcatfiles
= TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5623 if(not listcatfiles
):
5625 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': {}}}};
5626 lenlist
= len(listcatfiles
['ffilelist']);
5628 lcfx
= int(listcatfiles
['fnumfiles']);
5629 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5630 lcfx
= int(lenlist
);
5632 lcfx
= int(listcatfiles
['fnumfiles']);
5634 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5635 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5636 catarray
['filetoid'].update(filetoidarray
);
5637 catarray
['idtofile'].update(idtofilearray
);
5638 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5639 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5640 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5641 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5642 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5643 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5644 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5645 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5646 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5647 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5648 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5649 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5650 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5651 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5652 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5653 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5654 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5655 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5656 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5657 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5658 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5659 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5660 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5661 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5662 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5663 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5664 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5665 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5666 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5667 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5668 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5672 def ZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5673 listcatfiles
= ZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5674 if(not listcatfiles
):
5676 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': {}}}};
5677 lenlist
= len(listcatfiles
['ffilelist']);
5679 lcfx
= int(listcatfiles
['fnumfiles']);
5680 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5681 lcfx
= int(lenlist
);
5683 lcfx
= int(listcatfiles
['fnumfiles']);
5685 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5686 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5687 catarray
['filetoid'].update(filetoidarray
);
5688 catarray
['idtofile'].update(idtofilearray
);
5689 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5690 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5691 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5692 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5693 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5694 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5695 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5696 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5697 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5698 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5699 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5700 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5701 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5702 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5703 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5704 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5705 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5706 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5707 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5708 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5709 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5710 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5711 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5712 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5713 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5714 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5715 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5716 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5717 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5718 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5719 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5723 if(not rarfile_support
):
5724 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5727 if(rarfile_support
):
5728 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5729 listcatfiles
= RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5730 if(not listcatfiles
):
5732 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': {}}}};
5733 lenlist
= len(listcatfiles
['ffilelist']);
5735 lcfx
= int(listcatfiles
['fnumfiles']);
5736 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5737 lcfx
= int(lenlist
);
5739 lcfx
= int(listcatfiles
['fnumfiles']);
5741 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5742 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5743 catarray
['filetoid'].update(filetoidarray
);
5744 catarray
['idtofile'].update(idtofilearray
);
5745 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5746 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5747 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5748 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5749 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5750 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5751 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5752 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5753 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5754 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5755 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5756 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5757 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5758 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5759 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5760 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5761 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5762 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5763 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5764 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5765 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5766 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5767 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5768 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5769 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5770 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5771 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5772 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5773 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5774 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5775 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5779 if(not py7zr_support
):
5780 def SevenZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5784 def SevenZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
5785 listcatfiles
= SevenZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
5786 if(not listcatfiles
):
5788 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': {}}}};
5789 lenlist
= len(listcatfiles
['ffilelist']);
5791 lcfx
= int(listcatfiles
['fnumfiles']);
5792 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5793 lcfx
= int(lenlist
);
5795 lcfx
= int(listcatfiles
['fnumfiles']);
5797 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
5798 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
5799 catarray
['filetoid'].update(filetoidarray
);
5800 catarray
['idtofile'].update(idtofilearray
);
5801 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5802 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
5803 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
5804 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5805 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
5806 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
5807 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5808 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5809 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5810 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5811 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5812 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
5813 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
5814 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
5815 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
5816 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
5817 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5818 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5819 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
5820 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
5821 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
5822 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5823 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5824 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5825 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
5826 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
5827 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
5828 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
5829 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
5830 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
5831 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
5835 def ArchiveFileStringToArrayIndex(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5836 catfp
= BytesIO(catstr
);
5837 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5838 return listcatfiles
;
5840 create_alias_function("", __file_format_name__
, "StringToArrayIndex", ArchiveFileStringToArrayIndex
);
5842 def TarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5844 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
5845 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5846 return listcatfiles
;
5848 def ZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5850 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
5851 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5852 return listcatfiles
;
5854 if(not rarfile_support
):
5855 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5858 if(rarfile_support
):
5859 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5861 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
5862 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5863 return listcatfiles
;
5865 if(not py7zr_support
):
5866 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5870 def SevenZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
5872 catfp
= PackArchiveFileFromSevenZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
5873 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
5874 return listcatfiles
;
5876 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):
5877 outarray
= BytesIO();
5878 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
, True);
5879 listcatfiles
= ArchiveFileToArrayIndex(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
)
5880 return listcatfiles
;
5882 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):
5883 if(isinstance(infile
, dict)):
5884 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5885 listcatfiles
= prelistcatfiles
['list'];
5887 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5888 infile
= RemoveWindowsPath(infile
);
5890 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5891 listcatfiles
= prelistcatfiles
['list'];
5893 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5894 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
5895 outfile
= RemoveWindowsPath(outfile
);
5896 checksumtype
= checksumtype
.lower();
5897 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
5898 checksumtype
="crc32";
5899 if(checksumtype
=="none"):
5901 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
5903 if(compression
not in compressionlist
and compression
is None):
5904 compression
= "auto";
5906 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5907 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
5908 if(os
.path
.exists(outfile
)):
5910 if(not listcatfiles
):
5915 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
5917 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
5920 fbasename
= os
.path
.splitext(outfile
)[0];
5921 fextname
= os
.path
.splitext(outfile
)[1];
5922 catfp
= CompressOpenFile(outfile
, compressionlevel
);
5923 catver
= formatspecs
[6];
5924 fileheaderver
= str(int(catver
.replace(".", "")));
5925 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
5926 catfp
.write(fileheader
.encode('UTF-8'));
5927 lenlist
= len(listcatfiles
['ffilelist']);
5928 fnumfiles
= int(listcatfiles
['fnumfiles']);
5929 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
5930 fnumfiles
= lenlist
;
5931 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
5932 fnumfilesa
= AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
5933 catfileheadercshex
= GetFileChecksum(fileheader
+ fnumfilesa
, checksumtype
, True, formatspecs
);
5934 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
5935 catfp
.write(fnumfilesa
.encode('UTF-8'));
5938 os
.fsync(catfp
.fileno());
5939 except io
.UnsupportedOperation
:
5941 except AttributeError:
5943 lenlist
= len(listcatfiles
['ffilelist']);
5944 fnumfiles
= int(listcatfiles
['fnumfiles']);
5946 lcfx
= int(listcatfiles
['fnumfiles']);
5947 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5948 lcfx
= int(lenlist
);
5950 lcfx
= int(listcatfiles
['fnumfiles']);
5958 catfhstart
= catfp
.tell();
5959 if(re
.findall("^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
5960 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
5962 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
5964 VerbosePrintOut(fname
);
5965 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
5966 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
5967 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
5968 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
5969 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
5970 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
5971 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
5972 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
5973 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
5974 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
5975 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
5976 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
5977 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
5978 finode
= listcatfiles
['ffilelist'][reallcfi
]['finode'];
5979 flinkcount
= listcatfiles
['ffilelist'][reallcfi
]['flinkcount'];
5980 fwinattributes
= flinkinfo
['ffilelist'][reallcfi
]['fwinattributes'];
5981 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
5982 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
5983 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
5984 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
5985 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
5986 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
5987 if(len(extradata
)>0):
5988 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(extradata
);
5989 listcatfiles
['ffilelist'][reallcfi
]['fextralist'] = extradata
;
5990 extrafields
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']), 'x').lower();
5991 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5992 if(len(extradata
)>0):
5993 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5994 extrasizelen
= format(len(extrasizestr
), 'x').lower();
5995 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
5997 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
5998 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
5999 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6000 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6001 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
6002 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
6003 flinkname
= flinkinfo
['flinkname'];
6004 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
6005 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
6006 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
6007 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
6008 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
6009 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
6010 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
6011 funame
= flinkinfo
['funame'];
6012 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
6013 fgname
= flinkinfo
['fgname'];
6014 finode
= flinkinfo
['finode'];
6015 flinkcount
= flinkinfo
['flinkcount'];
6016 fwinattributes
= flinkinfo
['fwinattributes'];
6017 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
6018 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
6019 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
6020 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
6021 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
6022 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
6023 if(len(extradata
)>0):
6024 flinkinfo
['fextrafields'] = len(extradata
);
6025 flinkinfo
['fextralist'] = extradata
;
6026 extrafields
= format(int(flinkinfo
['fextrafields']), 'x').lower();
6027 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
6028 if(len(extradata
)>0):
6029 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
6030 extrasizelen
= format(len(extrasizestr
), 'x').lower();
6031 fcontents
= flinkinfo
['fcontents'];
6032 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
6034 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
6035 fcurfid
= format(curfid
, 'x').lower();
6036 if(not followlink
and finode
!=0):
6037 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
6038 fcurinode
= format(int(curinode
), 'x').lower();
6039 inodetofile
.update({curinode
: fname
});
6040 filetoinode
.update({fname
: curinode
});
6041 curinode
= curinode
+ 1;
6043 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
6045 fcurinode
= format(int(curinode
), 'x').lower();
6046 curinode
= curinode
+ 1;
6047 curfid
= curfid
+ 1;
6048 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
];
6049 catoutlen
= len(catoutlist
) + len(extradata
) + 3;
6050 catoutlenhex
= format(catoutlen
, 'x').lower();
6051 catoutlist
.insert(0, catoutlenhex
);
6052 catfileoutstr
= AppendNullBytes(catoutlist
, formatspecs
[5]);
6053 if(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']>0):
6054 extrafieldslist
= [];
6056 exil
= listcatfiles
['ffilelist'][reallcfi
]['fextrafields'];
6058 extrafieldslist
.append(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
6060 catfileoutstr
+= AppendNullBytes([extrafieldslist
], formatspecs
[5]);
6061 catfileoutstr
+= AppendNullBytes([checksumtype
], formatspecs
[5]);
6062 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
6063 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
6064 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6065 fcontents
.seek(0, 0);
6066 catfilecontentcshex
= GetFileChecksum(fcontents
.read(), checksumtype
, False, formatspecs
);
6067 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6068 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower();
6069 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
6070 catfileheadercshex
= GetFileChecksum(catfileoutstr
, checksumtype
, True, formatspecs
);
6071 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
6072 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
6073 nullstrecd
= formatspecs
[5].encode('UTF-8');
6074 fcontents
.seek(0, 0);
6075 catfileout
= catfileoutstrecd
+ fcontents
.read() + nullstrecd
;
6076 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
6077 catfp
.write(catfileout
);
6080 os
.fsync(catfp
.fileno());
6081 except io
.UnsupportedOperation
:
6083 except AttributeError:
6086 reallcfi
= reallcfi
+ 1;
6088 catfp
.write(AppendNullBytes([0, 0], formatspecs
[5]).encode("UTF-8"));
6089 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
6090 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
6093 os
.fsync(catfp
.fileno());
6094 except io
.UnsupportedOperation
:
6096 except AttributeError:
6100 if(hasattr(sys
.stdout
, "buffer")):
6101 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
6103 shutil
.copyfileobj(catfp
, sys
.stdout
);
6104 elif(re
.findall(r
"^(ftp|ftps|sftp)\:\/\/", str(outfile
))):
6105 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
6107 upload_file_to_internet_file(catfp
, outfile
);
6115 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
6117 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6118 catfp
= BytesIO(catstr
);
6119 listcatfiles
= RePackArchiveFile(catfp
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6120 return listcatfiles
;
6122 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
6124 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):
6125 outarray
= BytesIO();
6126 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
6127 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6128 return listcatfiles
;
6130 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
6132 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):
6133 if(outdir
is not None):
6134 outdir
= RemoveWindowsPath(outdir
);
6136 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6137 if(isinstance(infile
, dict)):
6138 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6139 listcatfiles
= prelistcatfiles
['list'];
6141 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6142 infile
= RemoveWindowsPath(infile
);
6144 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6145 listcatfiles
= prelistcatfiles
['list'];
6147 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
6148 if(not listcatfiles
):
6150 lenlist
= len(listcatfiles
['ffilelist']);
6151 fnumfiles
= int(listcatfiles
['fnumfiles']);
6153 lcfx
= int(listcatfiles
['fnumfiles']);
6154 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6155 lcfx
= int(lenlist
);
6157 lcfx
= int(listcatfiles
['fnumfiles']);
6163 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
6164 funame
= userinfo
.pw_name
;
6173 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
6174 fgname
= groupinfo
.gr_name
;
6180 VerbosePrintOut(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6181 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
6182 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6183 listcatfiles
['ffilelist'][lcfi
]['fcontents'].seek(0, 0);
6184 shutil
.copyfileobj(listcatfiles
['ffilelist'][lcfi
]['fcontents'], fpc
);
6187 os
.fsync(fpc
.fileno());
6188 except io
.UnsupportedOperation
:
6190 except AttributeError:
6192 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6193 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6194 if(preservepermissions
):
6195 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6197 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6198 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6200 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6201 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6202 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6207 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6208 funame
= userinfo
.pw_name
;
6217 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6218 fgname
= groupinfo
.gr_name
;
6223 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6224 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6225 flinkinfo
['fcontents'].seek(0, 0);
6226 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6229 os
.fsync(fpc
.fileno());
6230 except io
.UnsupportedOperation
:
6232 except AttributeError:
6234 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6235 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6236 if(preservepermissions
):
6237 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6239 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6240 if(flinkinfo
['ftype']==1):
6241 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6242 if(flinkinfo
['ftype']==2):
6243 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6244 if(flinkinfo
['ftype']==5):
6245 if(preservepermissions
):
6246 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6248 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6249 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6250 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6251 if(preservepermissions
):
6252 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6254 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6255 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6256 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6258 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6259 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6261 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6262 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
6263 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
6268 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
6269 funame
= userinfo
.pw_name
;
6278 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
6279 fgname
= groupinfo
.gr_name
;
6284 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
6285 with
open(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), "wb") as fpc
:
6286 flinkinfo
['fcontents'].seek(0, 0);
6287 shutil
.copyfileobj(flinkinfo
['fcontents'], fpc
);
6290 os
.fsync(fpc
.fileno());
6291 except io
.UnsupportedOperation
:
6293 except AttributeError:
6295 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6296 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6297 if(preservepermissions
):
6298 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6300 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6301 if(flinkinfo
['ftype']==1):
6302 os
.link(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6303 if(flinkinfo
['ftype']==2):
6304 os
.symlink(flinkinfo
['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6305 if(flinkinfo
['ftype']==5):
6306 if(preservepermissions
):
6307 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6309 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6310 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
6311 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fuid'], flinkinfo
['fgid']);
6312 if(preservepermissions
):
6313 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6315 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (flinkinfo
['fatime'], flinkinfo
['fmtime']));
6316 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
6317 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), flinkinfo
['fchmode']);
6319 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6320 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
6321 if(preservepermissions
):
6322 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6324 os
.mkdir(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']));
6325 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
6326 os
.chown(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
6327 if(preservepermissions
):
6328 os
.chmod(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6330 os
.utime(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
6331 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
6332 os
.mkfifo(PrependPath(outdir
, listcatfiles
['ffilelist'][lcfi
]['fname']), listcatfiles
['ffilelist'][lcfi
]['fchmode']);
6335 return listcatfiles
['ffilelist']['catfp'];
6339 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
6341 if(hasattr(shutil
, "register_unpack_format")):
6342 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
6343 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_delimiter__
, False, False);
6344 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
6346 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6347 catfp
= BytesIO(catstr
);
6348 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6349 return listcatfiles
;
6351 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
6353 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6354 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6355 if(isinstance(infile
, dict)):
6356 listcatfiles
= infile
;
6358 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
6359 infile
= RemoveWindowsPath(infile
);
6360 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, skipchecksum
, formatspecs
, returnfp
);
6361 if(not listcatfiles
):
6363 lenlist
= len(listcatfiles
['ffilelist']);
6364 fnumfiles
= int(listcatfiles
['fnumfiles']);
6366 lcfx
= int(listcatfiles
['fnumfiles']);
6367 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
6368 lcfx
= int(lenlist
);
6370 lcfx
= int(listcatfiles
['fnumfiles']);
6373 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
6375 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
6377 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' } };
6378 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
6379 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
6380 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6381 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
6382 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
6383 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
6384 if(len(fuprint
)<=0):
6385 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
6386 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
6387 if(len(fgprint
)<=0):
6388 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
6389 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
));
6392 return listcatfiles
['catfp'];
6396 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
6398 def ArchiveFileStringListFiles(catstr
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6399 catfp
= BytesIO(catstr
);
6400 listcatfiles
= ArchiveFileListFiles(catstr
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6401 return listcatfiles
;
6403 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileStringListFiles
);
6405 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
6406 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6409 if(hasattr(sys
.stdin
, "buffer")):
6410 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
6412 shutil
.copyfileobj(sys
.stdin
, infile
);
6417 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
6418 infile
= download_file_from_internet_file(infile
);
6423 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6425 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
6427 if(not tarfile
.is_tarfile(infile
)):
6429 except AttributeError:
6430 if(not is_tarfile(infile
)):
6435 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
6436 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
6438 tarfp
= tarfile
.open(infile
, "r");
6439 except FileNotFoundError
:
6443 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
6444 returnval
.update({lcfi
: member
.name
});
6445 fpremode
= member
.mode
;
6446 ffullmode
= member
.mode
;
6450 ffullmode
= member
.mode
+ stat
.S_IFREG
;
6452 elif(member
.isdev()):
6453 ffullmode
= member
.mode
;
6455 elif(member
.islnk()):
6456 ffullmode
= member
.mode
+ stat
.S_IFREG
;
6458 elif(member
.issym()):
6459 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
6461 elif(member
.ischr()):
6462 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
6464 elif(member
.isblk()):
6465 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
6467 elif(member
.isdir()):
6468 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
6470 elif(member
.isfifo()):
6471 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
6473 elif(member
.issparse()):
6474 ffullmode
= member
.mode
;
6477 VerbosePrintOut(member
.name
);
6479 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' } };
6480 printfname
= member
.name
;
6482 printfname
= member
.name
+ " link to " + member
.linkname
;
6483 elif(member
.issym()):
6484 printfname
= member
.name
+ " -> " + member
.linkname
;
6485 fuprint
= member
.uname
;
6486 if(len(fuprint
)<=0):
6487 fuprint
= member
.uid
;
6488 fgprint
= member
.gname
;
6489 if(len(fgprint
)<=0):
6490 fgprint
= member
.gid
;
6491 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
));
6494 return listcatfiles
['catfp'];
6498 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
6499 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6502 if(hasattr(sys
.stdin
, "buffer")):
6503 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
6505 shutil
.copyfileobj(sys
.stdin
, infile
);
6510 elif(re
.findall(r
"^(http|https|ftp|ftps|sftp)\:\/\/", str(infile
))):
6511 infile
= download_file_from_internet_file(infile
);
6516 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6520 if(not zipfile
.is_zipfile(infile
)):
6523 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
6524 except FileNotFoundError
:
6528 ziptest
= zipfp
.testzip();
6530 VerbosePrintOut("Bad file found!");
6531 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
6532 if(zipinfo
.create_system
==0 or zipinfo
.create_system
==10):
6533 fwinattributes
= int(zipinfo
.external_attr
);
6534 if(not member
.is_dir()):
6535 fmode
= int(stat
.S_IFREG
+ 438);
6536 fchmode
= int(stat
.S_IMODE(fmode
));
6537 ftypemod
= int(stat
.S_IFMT(fmode
));
6538 elif(member
.is_dir()):
6539 fmode
= int(stat
.S_IFDIR
+ 511);
6540 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6541 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6542 elif(zipinfo
.create_system
==3):
6543 fwinattributes
=int(0);
6544 fmode
= int(zipinfo
.external_attr
);
6545 fchmode
= int(stat
.S_IMODE(fmode
));
6546 ftypemod
= int(stat
.S_IFMT(fmode
));
6548 fwinattributes
= int(0);
6549 if(not member
.is_dir()):
6550 fmode
= int(stat
.S_IFREG
+ 438);
6551 fchmode
= int(stat
.S_IMODE(fmode
));
6552 ftypemod
= int(stat
.S_IFMT(fmode
));
6553 elif(member
.is_dir()):
6554 fmode
= int(stat
.S_IFDIR
+ 511);
6555 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6556 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6557 returnval
.update({lcfi
: member
.filename
});
6559 VerbosePrintOut(member
.filename
);
6561 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' } };
6563 for fmodval
in str(oct(fmode
))[-3:]:
6564 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
6565 if(not member
.is_dir()):
6567 permissionstr
= "-" + permissionstr
;
6568 elif(member
.is_dir()):
6570 permissionstr
= "d" + permissionstr
;
6571 printfname
= member
.filename
;
6573 fuid
= int(os
.getuid());
6574 except AttributeError:
6579 fgid
= int(os
.getgid());
6580 except AttributeError:
6587 userinfo
= pwd
.getpwuid(os
.getuid());
6588 funame
= userinfo
.pw_name
;
6591 except AttributeError:
6599 groupinfo
= grp
.getgrgid(os
.getgid());
6600 fgname
= groupinfo
.gr_name
;
6603 except AttributeError:
6608 if(len(fuprint
)<=0):
6609 fuprint
= str(fuid
);
6611 if(len(fgprint
)<=0):
6612 fgprint
= str(fgid
);
6613 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
));
6616 return listcatfiles
['catfp'];
6620 if(not rarfile_support
):
6621 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
6622 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6623 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6626 if(rarfile_support
):
6627 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
6628 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6629 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6631 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
6635 rarfp
= rarfile
.RarFile(infile
, "r");
6636 rartest
= rarfp
.testrar();
6638 VerbosePrintOut("Bad file found!");
6639 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
6642 if(member
.host_os
==rarfile
.RAR_OS_UNIX
):
6645 member
.external_attr
6647 except AttributeError:
6649 elif(member
.host_os
==rarfile
.RAR_OS_WIN32
):
6652 member
.external_attr
6654 except AttributeError:
6659 if(is_unix
and member
.external_attr
!=0):
6660 fpremode
= int(member
.external_attr
);
6661 elif(member
.is_file()):
6662 fpremode
= int(stat
.S_IFREG
+ 438);
6663 elif(member
.is_symlink()):
6664 fpremode
= int(stat
.S_IFLNK
+ 438);
6665 elif(member
.is_dir()):
6666 fpremode
= int(stat
.S_IFDIR
+ 511);
6667 if(is_windows
and member
.external_attr
!=0):
6668 fwinattributes
= int(member
.external_attr
);
6670 fwinattributes
= int(0);
6671 if(is_unix
and member
.external_attr
!=0):
6672 fmode
= int(member
.external_attr
);
6673 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
6674 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
6675 elif(member
.is_file()):
6676 fmode
= int(stat
.S_IFREG
+ 438);
6677 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
6678 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
6679 elif(member
.is_symlink()):
6680 fmode
= int(stat
.S_IFLNK
+ 438);
6681 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
6682 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
6683 elif(member
.is_dir()):
6684 fmode
= int(stat
.S_IFDIR
+ 511);
6685 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6686 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6687 returnval
.update({lcfi
: member
.filename
});
6689 VerbosePrintOut(member
.filename
);
6691 permissions
= { 'access': { '0': ('---'), '1': ('--x'), '2': ('-w-'), '3': ('-wx'), '4': ('r--'), '5': ('r-x'), '6': ('rw-'), '7': ('rwx') }, 'roles': { 0: 'owner', 1: 'group', 2: 'other' } };
6693 for fmodval
in str(oct(fmode
))[-3:]:
6694 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
6695 if(member
.is_file()):
6697 permissionstr
= "-" + permissionstr
;
6698 printfname
= member
.filename
;
6699 elif(member
.is_symlink()):
6701 permissionstr
= "l" + permissionstr
;
6702 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
6703 elif(member
.is_dir()):
6705 permissionstr
= "d" + permissionstr
;
6706 printfname
= member
.filename
;
6708 fuid
= int(os
.getuid());
6709 except AttributeError:
6714 fgid
= int(os
.getgid());
6715 except AttributeError:
6722 userinfo
= pwd
.getpwuid(os
.getuid());
6723 funame
= userinfo
.pw_name
;
6726 except AttributeError:
6734 groupinfo
= grp
.getgrgid(os
.getgid());
6735 fgname
= groupinfo
.gr_name
;
6738 except AttributeError:
6743 if(len(fuprint
)<=0):
6744 fuprint
= str(fuid
);
6746 if(len(fgprint
)<=0):
6747 fgprint
= str(fgid
);
6748 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
6751 return listcatfiles
['catfp'];
6755 if(not py7zr_support
):
6756 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
6757 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6758 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6762 def SevenZipFileListFiles(infile
, verbose
=False, returnfp
=False):
6763 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6764 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
6768 szpfp
= py7zr
.SevenZipFile(infile
, mode
="r");
6769 file_content
= szpfp
.readall();
6770 #sztest = szpfp.testzip();
6771 sztestalt
= szpfp
.test();
6773 VerbosePrintOut("Bad file found!");
6774 for member
in sorted(szpfp
.list(), key
=lambda x
: x
.filename
):
6775 if(re
.findall("^[.|/]", member
.filename
)):
6776 fname
= member
.filename
;
6778 fname
= "./"+member
.filename
;
6779 if(not member
.is_directory
):
6780 fpremode
= int(stat
.S_IFREG
+ 438);
6781 elif(member
.is_directory
):
6782 fpremode
= int(stat
.S_IFDIR
+ 511);
6783 fwinattributes
= int(0);
6784 if(member
.is_directory
):
6785 fmode
= int(stat
.S_IFDIR
+ 511);
6786 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
6787 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
6789 fmode
= int(stat
.S_IFLNK
+ 438);
6790 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
6791 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
6792 returnval
.update({lcfi
: member
.filename
});
6794 VerbosePrintOut(member
.filename
);
6796 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' } };
6798 for fmodval
in str(oct(fmode
))[-3:]:
6799 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
6801 if(not member
.is_directory
):
6803 permissionstr
= "-" + permissionstr
;
6804 printfname
= member
.filename
;
6805 elif(member
.is_directory
):
6807 permissionstr
= "d" + permissionstr
;
6808 printfname
= member
.filename
;
6810 fsize
= len(file_content
[member
.filename
].read());
6811 file_content
[member
.filename
].close();
6813 fuid
= int(os
.getuid());
6814 except AttributeError:
6819 fgid
= int(os
.getgid());
6820 except AttributeError:
6827 userinfo
= pwd
.getpwuid(os
.getuid());
6828 funame
= userinfo
.pw_name
;
6831 except AttributeError:
6839 groupinfo
= grp
.getgrgid(os
.getgid());
6840 fgname
= groupinfo
.gr_name
;
6843 except AttributeError:
6848 if(len(fuprint
)<=0):
6849 fuprint
= str(fuid
);
6851 if(len(fgprint
)<=0):
6852 fgprint
= str(fgid
);
6853 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(fsize
).rjust(15) + " " + member
.creationtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
6856 return listcatfiles
['catfp'];
6860 def InFileListFiles(infile
, verbose
=False, formatspecs
=__file_format_list__
, returnfp
=False):
6861 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
6862 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
, True);
6863 if(checkcompressfile
=="tarfile"):
6864 return TarFileListFiles(infile
, verbose
, returnfp
);
6865 elif(checkcompressfile
=="zipfile"):
6866 return ZipFileListFiles(infile
, verbose
, returnfp
);
6867 elif(checkcompressfile
=="catfile"):
6868 return ArchiveFileListFiles(infile
, 0, 0, False, formatspecs
, verbose
, returnfp
);
6869 elif(rarfile_support
and checkcompressfile
=="rarfile"):
6870 return RarFileListFiles(infile
, verbose
, returnfp
);
6871 elif(py7zr_support
and checkcompressfile
=="7zipfile"):
6872 return SevenZipFileListFiles(infile
, verbose
, returnfp
);
6877 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):
6878 outarray
= BytesIO();
6879 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
6880 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6881 return listcatfiles
;
6883 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):
6884 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
6885 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
6886 return listcatfiles
;
6888 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):
6889 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
6890 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
6891 return listcatfiles
;
6893 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
6895 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6896 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
6897 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
6898 return listcatfiles
;
6900 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
6902 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6903 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
6904 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
6905 return listcatfiles
;
6907 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
6909 if(not rarfile_support
):
6910 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6913 if(rarfile_support
):
6914 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6915 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
6916 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
6917 return listcatfiles
;
6919 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
6921 if(not py7zr_support
):
6922 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6926 def PackArchiveFileFromSevenZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
6927 outarray
= SevenZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
6928 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
6929 return listcatfiles
;
6931 create_alias_function("Pack", __file_format_name__
, "FromSevenZipFileAlt", PackArchiveFileFromSevenZipFileAlt
);
6933 def download_file_from_ftp_file(url
):
6934 urlparts
= urlparse(url
);
6935 file_name
= os
.path
.basename(urlparts
.path
);
6936 file_dir
= os
.path
.dirname(urlparts
.path
);
6937 if(urlparts
.username
is not None):
6938 ftp_username
= urlparts
.username
;
6940 ftp_username
= "anonymous";
6941 if(urlparts
.password
is not None):
6942 ftp_password
= urlparts
.password
;
6943 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6944 ftp_password
= "anonymous";
6947 if(urlparts
.scheme
=="ftp"):
6949 elif(urlparts
.scheme
=="ftps"):
6953 if(urlparts
.scheme
=="sftp"):
6955 return download_file_from_pysftp_file(url
);
6957 return download_file_from_sftp_file(url
);
6958 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
6959 return download_file_from_http_file(url
);
6960 ftp_port
= urlparts
.port
;
6961 if(urlparts
.port
is None):
6964 ftp
.connect(urlparts
.hostname
, ftp_port
);
6965 except socket
.gaierror
:
6966 log
.info("Error With URL "+url
);
6968 except socket
.timeout
:
6969 log
.info("Error With URL "+url
);
6971 ftp
.login(urlparts
.username
, urlparts
.password
);
6972 if(urlparts
.scheme
=="ftps"):
6974 ftpfile
= BytesIO();
6975 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
6976 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
6981 def download_file_from_ftp_string(url
):
6982 ftpfile
= download_file_from_ftp_file(url
);
6983 return ftpfile
.read();
6985 def upload_file_to_ftp_file(ftpfile
, url
):
6986 urlparts
= urlparse(url
);
6987 file_name
= os
.path
.basename(urlparts
.path
);
6988 file_dir
= os
.path
.dirname(urlparts
.path
);
6989 if(urlparts
.username
is not None):
6990 ftp_username
= urlparts
.username
;
6992 ftp_username
= "anonymous";
6993 if(urlparts
.password
is not None):
6994 ftp_password
= urlparts
.password
;
6995 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6996 ftp_password
= "anonymous";
6999 if(urlparts
.scheme
=="ftp"):
7001 elif(urlparts
.scheme
=="ftps"):
7005 if(urlparts
.scheme
=="sftp"):
7007 return upload_file_to_pysftp_file(url
);
7009 return upload_file_to_sftp_file(url
);
7010 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7012 ftp_port
= urlparts
.port
;
7013 if(urlparts
.port
is None):
7016 ftp
.connect(urlparts
.hostname
, ftp_port
);
7017 except socket
.gaierror
:
7018 log
.info("Error With URL "+url
);
7020 except socket
.timeout
:
7021 log
.info("Error With URL "+url
);
7023 ftp
.login(urlparts
.username
, urlparts
.password
);
7024 if(urlparts
.scheme
=="ftps"):
7026 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
7031 def upload_file_to_ftp_string(ftpstring
, url
):
7032 ftpfileo
= BytesIO(ftpstring
);
7033 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
7037 def download_file_from_http_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7038 # Parse the URL to extract username and password if present
7039 urlparts
= urlparse(url
);
7040 username
= urlparts
.username
;
7041 password
= urlparts
.password
;
7042 # Rebuild the URL without the username and password
7043 netloc
= urlparts
.hostname
;
7044 if(urlparts
.scheme
=="sftp"):
7046 return download_file_from_pysftp_file(url
);
7048 return download_file_from_sftp_file(url
);
7049 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7050 return download_file_from_ftp_file(url
);
7052 netloc
+= ':' + str(urlparts
.port
);
7053 rebuilt_url
= urlunparse((urlparts
.scheme
, netloc
, urlparts
.path
, urlparts
.params
, urlparts
.query
, urlparts
.fragment
));
7054 # Create a temporary file object
7055 httpfile
= BytesIO();
7057 # Use the requests library if available
7058 if username
and password
:
7059 response
= requests
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
), stream
=True);
7061 response
= requests
.get(rebuilt_url
, headers
=headers
, stream
=True);
7062 response
.raw
.decode_content
= True
7063 shutil
.copyfileobj(response
.raw
, httpfile
);
7065 # Build a Request object for urllib
7066 request
= Request(rebuilt_url
, headers
=headers
);
7067 # Create an opener object for handling URLs
7068 if username
and password
:
7069 # Create a password manager
7070 password_mgr
= HTTPPasswordMgrWithDefaultRealm();
7071 # Add the username and password
7072 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
7073 # Create an authentication handler using the password manager
7074 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
7075 # Build the opener with the authentication handler
7076 opener
= build_opener(auth_handler
);
7078 opener
= build_opener();
7079 with opener
.open(request
) as response
:
7080 shutil
.copyfileobj(response
, httpfile
);
7081 # Reset file pointer to the start
7082 httpfile
.seek(0, 0);
7083 # Return the temporary file object
7086 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7087 httpfile
= download_file_from_http_file(url
, headers
);
7088 return ftpfile
.read();
7091 def download_file_from_sftp_file(url
):
7092 urlparts
= urlparse(url
);
7093 file_name
= os
.path
.basename(urlparts
.path
);
7094 file_dir
= os
.path
.dirname(urlparts
.path
);
7095 sftp_port
= urlparts
.port
;
7096 if(urlparts
.port
is None):
7099 sftp_port
= urlparts
.port
;
7100 if(urlparts
.username
is not None):
7101 sftp_username
= urlparts
.username
;
7103 sftp_username
= "anonymous";
7104 if(urlparts
.password
is not None):
7105 sftp_password
= urlparts
.password
;
7106 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7107 sftp_password
= "anonymous";
7110 if(urlparts
.scheme
=="ftp"):
7111 return download_file_from_ftp_file(url
);
7112 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7113 return download_file_from_http_file(url
);
7114 if(urlparts
.scheme
!="sftp"):
7116 ssh
= paramiko
.SSHClient();
7117 ssh
.load_system_host_keys();
7118 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7120 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7121 except paramiko
.ssh_exception
.SSHException
:
7123 except socket
.gaierror
:
7124 log
.info("Error With URL "+url
);
7126 except socket
.timeout
:
7127 log
.info("Error With URL "+url
);
7129 sftp
= ssh
.open_sftp();
7130 sftpfile
= BytesIO();
7131 sftp
.getfo(urlparts
.path
, sftpfile
);
7134 sftpfile
.seek(0, 0);
7137 def download_file_from_sftp_file(url
):
7141 def download_file_from_sftp_string(url
):
7142 sftpfile
= download_file_from_sftp_file(url
);
7143 return sftpfile
.read();
7145 def download_file_from_ftp_string(url
):
7149 def upload_file_to_sftp_file(sftpfile
, url
):
7150 urlparts
= urlparse(url
);
7151 file_name
= os
.path
.basename(urlparts
.path
);
7152 file_dir
= os
.path
.dirname(urlparts
.path
);
7153 sftp_port
= urlparts
.port
;
7154 if(urlparts
.port
is None):
7157 sftp_port
= urlparts
.port
;
7158 if(urlparts
.username
is not None):
7159 sftp_username
= urlparts
.username
;
7161 sftp_username
= "anonymous";
7162 if(urlparts
.password
is not None):
7163 sftp_password
= urlparts
.password
;
7164 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7165 sftp_password
= "anonymous";
7168 if(urlparts
.scheme
=="ftp"):
7169 return upload_file_to_ftp_file(url
);
7170 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7172 if(urlparts
.scheme
!="sftp"):
7174 ssh
= paramiko
.SSHClient();
7175 ssh
.load_system_host_keys();
7176 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
7178 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7179 except paramiko
.ssh_exception
.SSHException
:
7181 except socket
.gaierror
:
7182 log
.info("Error With URL "+url
);
7184 except socket
.timeout
:
7185 log
.info("Error With URL "+url
);
7187 sftp
= ssh
.open_sftp();
7188 sftp
.putfo(sftpfile
, urlparts
.path
);
7191 sftpfile
.seek(0, 0);
7194 def upload_file_to_sftp_file(sftpfile
, url
):
7198 def upload_file_to_sftp_string(sftpstring
, url
):
7199 sftpfileo
= BytesIO(sftpstring
);
7200 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
7204 def upload_file_to_sftp_string(url
):
7208 def download_file_from_pysftp_file(url
):
7209 urlparts
= urlparse(url
);
7210 file_name
= os
.path
.basename(urlparts
.path
);
7211 file_dir
= os
.path
.dirname(urlparts
.path
);
7212 sftp_port
= urlparts
.port
;
7213 if(urlparts
.port
is None):
7216 sftp_port
= urlparts
.port
;
7217 if(urlparts
.username
is not None):
7218 sftp_username
= urlparts
.username
;
7220 sftp_username
= "anonymous";
7221 if(urlparts
.password
is not None):
7222 sftp_password
= urlparts
.password
;
7223 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7224 sftp_password
= "anonymous";
7227 if(urlparts
.scheme
=="ftp"):
7228 return download_file_from_ftp_file(url
);
7229 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7230 return download_file_from_http_file(url
);
7231 if(urlparts
.scheme
!="sftp"):
7234 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7235 except paramiko
.ssh_exception
.SSHException
:
7237 except socket
.gaierror
:
7238 log
.info("Error With URL "+url
);
7240 except socket
.timeout
:
7241 log
.info("Error With URL "+url
);
7243 sftp
= ssh
.open_sftp();
7244 sftpfile
= BytesIO();
7245 sftp
.getfo(urlparts
.path
, sftpfile
);
7248 sftpfile
.seek(0, 0);
7251 def download_file_from_pysftp_file(url
):
7255 def download_file_from_pysftp_string(url
):
7256 sftpfile
= download_file_from_pysftp_file(url
);
7257 return sftpfile
.read();
7259 def download_file_from_ftp_string(url
):
7263 def upload_file_to_pysftp_file(sftpfile
, url
):
7264 urlparts
= urlparse(url
);
7265 file_name
= os
.path
.basename(urlparts
.path
);
7266 file_dir
= os
.path
.dirname(urlparts
.path
);
7267 sftp_port
= urlparts
.port
;
7268 if(urlparts
.port
is None):
7271 sftp_port
= urlparts
.port
;
7272 if(urlparts
.username
is not None):
7273 sftp_username
= urlparts
.username
;
7275 sftp_username
= "anonymous";
7276 if(urlparts
.password
is not None):
7277 sftp_password
= urlparts
.password
;
7278 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
7279 sftp_password
= "anonymous";
7282 if(urlparts
.scheme
=="ftp"):
7283 return upload_file_to_ftp_file(url
);
7284 elif(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7286 if(urlparts
.scheme
!="sftp"):
7289 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
7290 except paramiko
.ssh_exception
.SSHException
:
7292 except socket
.gaierror
:
7293 log
.info("Error With URL "+url
);
7295 except socket
.timeout
:
7296 log
.info("Error With URL "+url
);
7298 sftp
= ssh
.open_sftp();
7299 sftp
.putfo(sftpfile
, urlparts
.path
);
7302 sftpfile
.seek(0, 0);
7305 def upload_file_to_pysftp_file(sftpfile
, url
):
7309 def upload_file_to_pysftp_string(sftpstring
, url
):
7310 sftpfileo
= BytesIO(sftpstring
);
7311 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
7315 def upload_file_to_pysftp_string(url
):
7318 def download_file_from_internet_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
7319 urlparts
= urlparse(url
);
7320 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7321 return download_file_from_http_file(url
, headers
);
7322 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7323 return download_file_from_ftp_file(url
);
7324 elif(urlparts
.scheme
=="sftp"):
7325 if(__use_pysftp__
and havepysftp
):
7326 return download_file_from_pysftp_file(url
);
7328 return download_file_from_sftp_file(url
);
7333 def download_file_from_internet_uncompress_file(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_list__
):
7334 fp
= download_file_from_internet_file(url
);
7335 fp
= UncompressArchiveFile(fp
, formatspecs
);
7341 def download_file_from_internet_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
7342 urlparts
= urlparse(url
);
7343 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7344 return download_file_from_http_string(url
, headers
);
7345 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7346 return download_file_from_ftp_string(url
);
7347 elif(urlparts
.scheme
=="sftp"):
7348 if(__use_pysftp__
and havepysftp
):
7349 return download_file_from_pysftp_string(url
);
7351 return download_file_from_sftp_string(url
);
7356 def download_file_from_internet_uncompress_string(url
, headers
=geturls_headers_pycatfile_python_alt
, formatspecs
=__file_format_list__
):
7357 fp
= download_file_from_internet_string(url
);
7358 fp
= UncompressArchiveFile(fp
, formatspecs
);
7364 def upload_file_to_internet_file(ifp
, url
):
7365 urlparts
= urlparse(url
);
7366 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7368 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7369 return upload_file_to_ftp_file(ifp
, url
);
7370 elif(urlparts
.scheme
=="sftp"):
7371 if(__use_pysftp__
and havepysftp
):
7372 return upload_file_to_pysftp_file(ifp
, url
);
7374 return upload_file_to_sftp_file(ifp
, url
);
7379 def upload_file_to_internet_compress_file(ifp
, url
, formatspecs
=__file_format_list__
):
7380 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
7384 upload_file_to_internet_file(catfp
, outfile
);
7387 def upload_file_to_internet_string(ifp
, url
):
7388 urlparts
= urlparse(url
);
7389 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
7391 elif(urlparts
.scheme
=="ftp" or urlparts
.scheme
=="ftps"):
7392 return upload_file_to_ftp_string(ifp
, url
);
7393 elif(urlparts
.scheme
=="sftp"):
7394 if(__use_pysftp__
and havepysftp
):
7395 return upload_file_to_pysftp_string(ifp
, url
);
7397 return upload_file_to_sftp_string(ifp
, url
);
7402 def upload_file_to_internet_compress_string(ifp
, url
, formatspecs
=__file_format_list__
):
7403 catfp
= CompressArchiveFile(BytesIO(ifp
), compression
, formatspecs
);
7407 upload_file_to_internet_file(catfp
, outfile
);
7411 if(hasattr(shutil
, "register_archive_format")):
7412 # Register the packing format
7413 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
7414 except shutil
.RegistryError
:
7418 if(hasattr(shutil
, "register_unpack_format")):
7419 # Register the unpacking format
7420 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
7421 except shutil
.RegistryError
: