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: 3/15/2024 Ver. 0.5.0 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
, ftplib
, platform
;
22 from ftplib
import FTP
, FTP_TLS
;
23 if(sys
.version
[0]=="2"):
24 from urlparse
import urlparse
, urlunparse
, urlsplit
, urlunsplit
, urljoin
;
25 elif(sys
.version
[0]>="3"):
26 from urllib
.parse
import urlunparse
, urlsplit
, urlunsplit
, urljoin
, urlencode
;
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 import simplejson
as json
;
61 from zlib
import crc32
;
63 from binascii
import crc32
;
65 rarfile_support
= False;
68 rarfile_support
= True;
70 rarfile_support
= False;
73 from safetar
import is_tarfile
;
76 from xtarfile
import is_tarfile
;
78 from tarfile
import is_tarfile
;
81 import safetar
as tarfile
;
84 import xtarfile
as tarfile
;
102 haverequests
= False;
107 haverequests
= False;
111 logging
.getLogger("urllib3").setLevel(logging
.WARNING
);
115 from urllib
.request
import Request
, build_opener
, HTTPBasicAuthHandler
;
116 from urllib
.parse
import urlparse
;
119 from urllib2
import Request
, build_opener
, HTTPBasicAuthHandler
;
120 from urlparse
import urlparse
;
122 if(sys
.version
[0]=="2"):
124 from io
import StringIO
, BytesIO
;
127 from cStringIO
import StringIO
;
128 from cStringIO
import StringIO
as BytesIO
;
130 from StringIO
import StringIO
;
131 from StringIO
import StringIO
as BytesIO
;
132 elif(sys
.version
[0]>="3"):
133 from io
import StringIO
, BytesIO
;
138 from cStringIO
import StringIO
as BytesIO
;
144 from StringIO
import StringIO
as BytesIO
;
150 from io
import BytesIO
;
155 __use_pysftp__
= False;
157 __use_pysftp__
= False;
158 __file_format_name__
= "CatFile";
159 __program_name__
= "Py"+__file_format_name__
;
160 __file_format_lower__
= __file_format_name__
.lower();
161 __file_format_magic__
= __file_format_name__
;
162 __file_format_len__
= len(__file_format_magic__
);
163 __file_format_hex__
= binascii
.hexlify(__file_format_magic__
.encode("UTF-8")).decode("UTF-8");
164 __file_format_delimiter__
= "\x00";
165 __file_format_ver__
= "001";
166 __use_new_style__
= True;
167 __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__
];
168 __project__
= __program_name__
;
169 __project_url__
= "https://github.com/GameMaker2k/PyCatFile";
170 __version_info__
= (0, 5, 0, "RC 1", 1);
171 __version_date_info__
= (2024, 3, 15, "RC 1", 1);
172 __version_date__
= str(__version_date_info__
[0]) + "." + str(__version_date_info__
[1]).zfill(2) + "." + str(__version_date_info__
[2]).zfill(2);
173 __revision__
= __version_info__
[3];
174 __revision_id__
= "$Id$";
175 if(__version_info__
[4] is not None):
176 __version_date_plusrc__
= __version_date__
+ "-" + str(__version_date_info__
[4]);
177 if(__version_info__
[4] is None):
178 __version_date_plusrc__
= __version_date__
;
179 if(__version_info__
[3] is not None):
180 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]) + " " + str(__version_info__
[3]);
181 if(__version_info__
[3] is None):
182 __version__
= str(__version_info__
[0]) + "." + str(__version_info__
[1]) + "." + str(__version_info__
[2]);
184 PyBitness
= platform
.architecture();
185 if(PyBitness
=="32bit" or PyBitness
=="32"):
187 elif(PyBitness
=="64bit" or PyBitness
=="64"):
192 geturls_ua_pycatfile_python
= "Mozilla/5.0 (compatible; {proname}/{prover}; +{prourl})".format(proname
=__project__
, prover
=__version__
, prourl
=__project_url__
);
193 if(platform
.python_implementation()!=""):
194 py_implementation
= platform
.python_implementation();
195 if(platform
.python_implementation()==""):
196 py_implementation
= "Python";
197 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__
);
198 geturls_ua_googlebot_google
= "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
199 geturls_ua_googlebot_google_old
= "Googlebot/2.1 (+http://www.google.com/bot.html)";
200 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
)};
201 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
)};
202 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"};
203 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"};
205 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'xz', 'lz4', 'lzo', 'lzma'];
206 outextlist
= ['gz', 'bz2', 'zst', 'xz', 'lz4', 'lzo', 'lzma'];
207 outextlistwd
= ['.gz', '.bz2', '.zst', '.xz', '.lz4', '.lzo', '.lzma'];
209 tarfile_mimetype
= "application/tar";
210 tarfile_tar_mimetype
= tarfile_mimetype
;
211 zipfile_mimetype
= "application/zip";
212 zipfile_zip_mimetype
= zipfile_mimetype
;
213 rarfile_mimetype
= "application/rar";
214 rarfile_rar_mimetype
= rarfile_mimetype
;
215 archivefile_mimetype
= "application/x-"+__file_format_list__
[1]+"";
216 archivefile_cat_mimetype
= archivefile_mimetype
;
217 archivefile_gzip_mimetype
= "application/x-"+__file_format_list__
[1]+"+gzip";
218 archivefile_gz_mimetype
= archivefile_gzip_mimetype
;
219 archivefile_bzip2_mimetype
= "application/x-"+__file_format_list__
[1]+"+bzip2";
220 archivefile_bz2_mimetype
= archivefile_bzip2_mimetype
;
221 archivefile_lz4_mimetype
= "application/x-"+__file_format_list__
[1]+"+lz4";
222 archivefile_lzop_mimetype
= "application/x-"+__file_format_list__
[1]+"+lzop";
223 archivefile_lzo_mimetype
= archivefile_lzop_mimetype
;
224 archivefile_zstandard_mimetype
= "application/x-"+__file_format_list__
[1]+"+zstandard";
225 archivefile_zstd_mimetype
= archivefile_zstandard_mimetype
;
226 archivefile_lzma_mimetype
= "application/x-"+__file_format_list__
[1]+"+lzma";
227 archivefile_xz_mimetype
= "application/x-"+__file_format_list__
[1]+"+xz";
228 archivefile_extensions
= ['.cat', '.cat.gz', '.cat.bz2', '.cat.zst', '.cat.lz4', '.cat.lzo', '.cat.lzop', '.cat.lzma', '.cat.xz'];
230 if __name__
== "__main__":
232 curscrpath
= os
.path
.dirname(sys
.argv
[0]);
236 curscrpath
= curscrpath
.replace(os
.sep
, "/");
237 curscrpath
= curscrpath
+ "/";
238 scrfile
= curscrpath
+ "catfile.py";
239 if(os
.path
.exists(scrfile
) and os
.path
.isfile(scrfile
)):
240 scrcmd
= subprocess
.Popen([sys
.executable
, scrfile
] + sys
.argv
[1:]);
243 def VerbosePrintOut(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
249 "warning": logging
.warning
,
250 "error": logging
.error
,
251 "critical": logging
.critical
,
252 "exception": logging
.exception
,
253 "logalt": lambda x
: logging
.log(dgblevel
, x
),
254 "debug": logging
.debug
256 log_function
= log_functions
.get(outtype
);
258 log_function(dbgtxt
);
262 def VerbosePrintOutReturn(dbgtxt
, outtype
="log", dbgenable
=True, dgblevel
=20):
263 VerbosePrintOut(dbgtxt
, outtype
, dbgenable
, dgblevel
);
266 def RemoveWindowsPath(dpath
):
270 dpath
= dpath
.replace(os
.path
.sep
, "/");
271 dpath
= dpath
.rstrip("/");
272 if(dpath
=="." or dpath
==".."):
276 def NormalizeRelativePath(inpath
):
277 inpath
= RemoveWindowsPath(inpath
);
278 if(os
.path
.isabs(inpath
)):
281 if(inpath
.startswith("./") or inpath
.startswith("../")):
284 outpath
= "./" + inpath
;
287 def ListDir(dirpath
, followlink
=False, duplicates
=False):
288 if(isinstance(dirpath
, (list, tuple, ))):
289 dirpath
= list(filter(None, dirpath
));
290 elif(isinstance(dirpath
, (str, ))):
291 dirpath
= list(filter(None, [dirpath
]));
293 for mydirfile
in dirpath
:
294 if(not os
.path
.exists(mydirfile
)):
296 mydirfile
= NormalizeRelativePath(mydirfile
);
297 if(os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
)):
298 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
));
299 if(os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
)):
300 for root
, dirs
, filenames
in os
.walk(mydirfile
):
302 dpath
= RemoveWindowsPath(dpath
);
303 if(dpath
not in retlist
and not duplicates
):
304 retlist
.append(dpath
);
306 retlist
.append(dpath
);
307 for file in filenames
:
308 fpath
= os
.path
.join(root
, file);
309 fpath
= RemoveWindowsPath(fpath
);
310 if(fpath
not in retlist
and not duplicates
):
311 retlist
.append(fpath
);
313 retlist
.append(fpath
);
315 retlist
.append(RemoveWindowsPath(mydirfile
));
318 def ListDirAdvanced(dirpath
, followlink
=False, duplicates
=False):
319 if isinstance(dirpath
, (list, tuple)):
320 dirpath
= list(filter(None, dirpath
));
321 elif isinstance(dirpath
, str):
322 dirpath
= list(filter(None, [dirpath
]));
324 for mydirfile
in dirpath
:
325 if not os
.path
.exists(mydirfile
):
327 mydirfile
= NormalizeRelativePath(mydirfile
);
328 if os
.path
.exists(mydirfile
) and os
.path
.islink(mydirfile
) and followlink
:
329 mydirfile
= RemoveWindowsPath(os
.path
.realpath(mydirfile
))
330 if os
.path
.exists(mydirfile
) and os
.path
.isdir(mydirfile
):
331 for root
, dirs
, filenames
in os
.walk(mydirfile
):
332 # Sort dirs and filenames alphabetically in place
333 dirs
.sort(key
=lambda x
: x
.lower());
334 filenames
.sort(key
=lambda x
: x
.lower());
335 dpath
= RemoveWindowsPath(root
);
336 if not duplicates
and dpath
not in retlist
:
337 retlist
.append(dpath
);
339 retlist
.append(dpath
);
340 for file in filenames
:
341 fpath
= os
.path
.join(root
, file);
342 fpath
= RemoveWindowsPath(fpath
);
343 if not duplicates
and fpath
not in retlist
:
344 retlist
.append(fpath
);
346 retlist
.append(fpath
);
348 retlist
.append(RemoveWindowsPath(mydirfile
));
351 def create_alias_function(prefix
, base_name
, suffix
, target_function
):
352 # Define a new function that wraps the target function
353 def alias_function(*args
, **kwargs
):
354 return target_function(*args
, **kwargs
);
356 # Create the function name by combining the prefix, base name, and the suffix
357 function_name
= "{}{}{}".format(prefix
, base_name
, suffix
);
359 # Add the new function to the global namespace
360 globals()[function_name
] = alias_function
;
362 # initial_value can be 0xFFFF or 0x0000
363 def crc16_ansi(msg
, initial_value
=0xFFFF):
364 # CRC-16-IBM / CRC-16-ANSI polynomial and initial value
365 poly
= 0x8005; # Polynomial for CRC-16-IBM / CRC-16-ANSI
366 crc
= initial_value
; # Initial value
368 crc ^
= b
<< 8; # XOR byte into CRC top byte
369 for _
in range(8): # Process each bit
370 if crc
& 0x8000: # If the top bit is set
371 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
373 crc
= crc
<< 1; # Just shift left
374 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
377 # initial_value can be 0xFFFF or 0x0000
378 def crc16_ibm(msg
, initial_value
=0xFFFF):
379 return crc16_ansi(msg
, initial_value
);
381 # initial_value is 0xFFFF
383 return crc16_ansi(msg
, 0xFFFF);
385 # initial_value can be 0xFFFF, 0x1D0F or 0x0000
386 def crc16_ccitt(msg
, initial_value
=0xFFFF):
387 # CRC-16-CCITT polynomial
388 poly
= 0x1021; # Polynomial for CRC-16-CCITT
389 # Use the specified initial value
392 crc ^
= b
<< 8; # XOR byte into CRC top byte
393 for _
in range(8): # Process each bit
394 if crc
& 0x8000: # If the top bit is set
395 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with the polynomial
397 crc
= crc
<< 1; # Just shift left
398 crc
&= 0xFFFF; # Ensure CRC remains 16-bit
401 # initial_value can be 0x42F0E1EBA9EA3693 or 0x0000000000000000
402 def crc64_ecma(msg
, initial_value
=0x0000000000000000):
403 # CRC-64-ECMA polynomial and initial value
404 poly
= 0x42F0E1EBA9EA3693;
405 crc
= initial_value
; # Initial value for CRC-64-ECMA
407 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
408 for _
in range(8): # Process each bit
409 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
410 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
412 crc
<<= 1; # Just shift left if the MSB is 0
413 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
416 # initial_value can be 0x000000000000001B or 0xFFFFFFFFFFFFFFFF
417 def crc64_iso(msg
, initial_value
=0xFFFFFFFFFFFFFFFF):
418 # CRC-64-ISO polynomial and initial value
419 poly
= 0x000000000000001B;
420 crc
= initial_value
; # Common initial value for CRC-64-ISO
422 crc ^
= b
<< 56; # XOR byte into the most significant byte of the CRC
423 for _
in range(8): # Process each bit
424 if crc
& (1 << 63): # Check if the leftmost (most significant) bit is set
425 crc
= (crc
<< 1) ^ poly
; # Shift left and XOR with poly if the MSB is 1
427 crc
<<= 1; # Just shift left if the MSB is 0
428 crc
&= 0xFFFFFFFFFFFFFFFF; # Ensure CRC remains 64-bit
431 def GetDataFromArray(data
, path
, default
=None):
435 element
= element
[key
];
437 except (KeyError, TypeError, IndexError):
440 def GetDataFromArrayAlt(structure
, path
, default
=None):
443 if isinstance(element
, dict) and key
in element
:
444 element
= element
[key
];
445 elif isinstance(element
, list) and isinstance(key
, int) and -len(element
) <= key
< len(element
):
446 element
= element
[key
];
451 def ReadTillNullByte(fp
, delimiter
=__file_format_delimiter__
):
454 nullbyte
= delimiter
.encode("UTF-8");
456 curbyte
= fp
.read(1);
457 if(curbyte
==nullbyte
or not curbyte
):
459 curfullbyte
= curfullbyte
+ curbyte
;
460 return curfullbyte
.decode('UTF-8');
462 def ReadUntilNullByte(fp
, delimiter
=__file_format_delimiter__
):
463 return ReadTillNullByte(fp
, delimiter
);
465 def SeekToEndOfFile(fp
):
469 if(lasttell
==fp
.tell()):
471 lasttell
= fp
.tell();
474 def ReadFileHeaderData(fp
, rounds
=0, delimiter
=__file_format_delimiter__
):
478 while(rocount
<roend
):
479 HeaderOut
.append(ReadTillNullByte(fp
, delimiter
));
480 rocount
= rocount
+ 1;
483 def ReadFileHeaderDataBySize(fp
, delimiter
=__file_format_delimiter__
):
484 headerpresize
= ReadTillNullByte(fp
, delimiter
);
485 headersize
= int(headerpresize
, 16);
486 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
489 roend
= int(len(headercontent
));
490 HeaderOut
= [headerpresize
];
491 while(rocount
<roend
):
492 HeaderOut
.append(headercontent
[rocount
]);
493 rocount
= rocount
+ 1;
496 def ReadFileHeaderDataByList(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
498 roend
= int(len(listval
));
500 while(rocount
<roend
):
501 RoundArray
= {listval
[rocount
]: ReadTillNullByte(fp
, delimiter
)};
502 HeaderOut
.update(RoundArray
);
503 rocount
= rocount
+ 1;
506 def ReadFileHeaderDataByListSize(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
507 headerpresize
= ReadTillNullByte(fp
, delimiter
);
508 headersize
= int(headerpresize
, 16);
509 headercontent
= str(fp
.read(headersize
).decode('UTF-8')).split(delimiter
);
513 roend
= int(len(headercontent
));
514 HeaderOut
= {listval
[0]: headerpresize
};
515 while(rocount
<roend
):
516 RoundArray
= {listval
[rocount
]: headercontent
[rocount
]};
517 HeaderOut
.update(RoundArray
);
518 rocount
= rocount
+ 1;
519 listcount
= listcount
+ 1;
522 def AppendNullByte(indata
, delimiter
=__file_format_delimiter__
):
523 outdata
= str(indata
) + delimiter
;
526 def AppendNullBytes(indata
=[], delimiter
=__file_format_delimiter__
):
531 outdata
= outdata
+ AppendNullByte(indata
[inum
], delimiter
);
535 def ReadTillNullByteAlt(fp
, delimiter
=__file_format_delimiter__
):
536 """Read bytes from file pointer until a null byte is encountered."""
537 bytes_list
= [] # Use list for efficient append operation.
539 cur_byte
= fp
.read(1);
540 if cur_byte
== delimiter
.encode() or not cur_byte
:
542 bytes_list
.append(cur_byte
);
543 return b
''.join(bytes_list
).decode('UTF-8');
545 def ReadUntilNullByteAlt(fp
, delimiter
=__file_format_delimiter__
):
546 return ReadTillNullByteAlt(fp
, delimiter
);
548 def ReadFileHeaderDataAlt(fp
, rounds
=0, delimiter
=__file_format_delimiter__
):
549 """Read multiple null-byte terminated strings from a file."""
551 for round_count
in range(rounds
):
552 header_out
[round_count
] = ReadTillNullByteAlt(fp
, delimiter
);
555 def ReadFileHeaderDataBySizeAlt(fp
, delimiter
=__file_format_delimiter__
):
556 # Read and convert header size from hexadecimal to integer
557 header_pre_size
= ReadTillNullByte(fp
, delimiter
);
558 header_size
= int(header_pre_size
, 16);
559 # Read and split the header content
560 header_content
= str(fp
.read(header_size
).decode('UTF-8')).split(delimiter
);
562 # Prepend the pre-size and return the combined list
563 return [header_pre_size
] + header_content
;
565 def ReadFileHeaderDataByListSizeAlt(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
566 # Read the size and content from the header
567 header_pre_size
= ReadTillNullByte(fp
, delimiter
);
568 header_size
= int(header_pre_size
, 16);
569 header_content
= str(fp
.read(header_size
).decode('UTF-8')).split(delimiter
);
571 # Initialize HeaderOut with the header pre-size if listval is not empty
572 HeaderOut
= {listval
[0]: header_pre_size
} if listval
else {};
573 # Map the remaining listval items to their corresponding header content, starting from the second item
574 for i
in range(1, min(len(header_content
) + 1, len(listval
))):
575 HeaderOut
[listval
[i
]] = header_content
[i
- 1]; # -1 because header_content is 0-indexed
578 def ReadFileHeaderDataByListAlt(fp
, listval
=[], delimiter
=__file_format_delimiter__
):
579 """Read multiple null-byte terminated strings from a file."""
581 for round_count
in listval
:
582 header_out
.append(ReadTillNullByteAlt(fp
, delimiter
));
585 def AppendNullByteAlt(indata
, delimiter
=__file_format_delimiter__
):
586 """Append a null byte to the given data."""
587 return str(indata
) + delimiter
;
589 def AppendNullBytesAlt(indata
=[], delimiter
=__file_format_delimiter__
):
590 """Append a null byte to each element in the list and concatenate."""
591 return delimiter
.join(map(str, indata
)) + delimiter
; # Efficient concatenation with null byte.
593 def PrintPermissionString(fchmode
, ftype
):
594 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' } };
596 for fmodval
in str(oct(fchmode
))[-3:]:
597 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
598 if(ftype
==0 or ftype
==7):
599 permissionstr
= "-" + permissionstr
;
601 permissionstr
= "h" + permissionstr
;
603 permissionstr
= "l" + permissionstr
;
605 permissionstr
= "c" + permissionstr
;
607 permissionstr
= "b" + permissionstr
;
609 permissionstr
= "d" + permissionstr
;
611 permissionstr
= "f" + permissionstr
;
613 permissionstr
= "D" + permissionstr
;
615 permissionstr
= "p" + permissionstr
;
617 permissionstr
= "w" + permissionstr
;
619 permissionoutstr
= stat
.filemode(fchmode
);
620 except AttributeError:
621 permissionoutstr
= permissionstr
;
623 permissionoutstr
= permissionstr
;
624 return permissionoutstr
;
626 def PrintPermissionStringAlt(fchmode
, ftype
):
628 '0': '---', '1': '--x', '2': '-w-', '3': '-wx',
629 '4': 'r--', '5': 'r-x', '6': 'rw-', '7': 'rwx'
631 # Translate file mode into permission string
632 permissionstr
= ''.join([permissions
[i
] for i
in str(oct(fchmode
))[-3:]]);
633 # Append file type indicator
635 0: '-', 1: 'h', 2: 'l', 3: 'c', 4: 'b',
636 5: 'd', 6: 'f', 8: 'D', 9: 'p', 10: 'w'
638 file_type
= type_indicators
.get(ftype
, '-');
639 permissionstr
= file_type
+ permissionstr
;
641 permissionoutstr
= stat
.filemode(fchmode
);
642 except AttributeError:
643 permissionoutstr
= permissionstr
;
644 return permissionoutstr
;
646 def CompressionSupport():
647 compression_list
= [];
650 compression_list
.append("gz");
651 compression_list
.append("gzip");
656 compression_list
.append("bz2");
657 compression_list
.append("bzip2");
662 compression_list
.append("lz4");
667 compression_list
.append("lzo");
668 compression_list
.append("lzop");
673 compression_list
.append("zstd");
674 compression_list
.append("zstandard");
679 compression_list
.append("lzma");
680 compression_list
.append("xz");
683 return compression_list
;
685 def CheckCompressionType(infile
, formatspecs
=__file_format_list__
, closefp
=True):
686 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
690 catfp
= open(infile
, "rb");
691 except FileNotFoundError
:
694 prefp
= catfp
.read(2);
696 if(prefp
==binascii
.unhexlify("1f8b")):
699 prefp
= catfp
.read(3);
700 if(prefp
==binascii
.unhexlify("425a68")):
702 if(prefp
==binascii
.unhexlify("5d0000")):
705 prefp
= catfp
.read(4);
706 if(prefp
==binascii
.unhexlify("28b52ffd")):
708 if(prefp
==binascii
.unhexlify("04224d18")):
710 if(prefp
==binascii
.unhexlify("504B0304")):
711 filetype
= "zipfile";
713 prefp
= catfp
.read(5);
714 if(prefp
==binascii
.unhexlify("7573746172")):
715 filetype
= "tarfile";
717 prefp
= catfp
.read(6);
718 if(prefp
==binascii
.unhexlify("fd377a585a00")):
721 prefp
= catfp
.read(7);
722 if(prefp
==binascii
.unhexlify("526172211a0700")):
723 filetype
= "rarfile";
724 if(prefp
==binascii
.unhexlify("43617446696c65")):
725 filetype
= "catfile";
727 prefp
= catfp
.read(8);
728 if(prefp
==binascii
.unhexlify("526172211a070100")):
729 filetype
= "rarfile";
731 prefp
= catfp
.read(formatspecs
[3]);
732 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
733 filetype
= formatspecs
[2];
735 prefp
= catfp
.read(9);
736 if(prefp
==binascii
.unhexlify("894c5a4f000d0a1a0a")):
739 prefp
= catfp
.read(10);
740 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
741 filetype
= "tarfile";
747 def CheckCompressionTypeFromString(instring
, formatspecs
=__file_format_list__
, closefp
=True):
749 instringsfile
= BytesIO(instring
);
751 instringsfile
= BytesIO(instring
.encode("UTF-8"));
752 return CheckCompressionType(instringsfile
, formatspecs
, closefp
);
754 def GetCompressionMimeType(infile
, formatspecs
=__file_format_list__
):
755 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
756 if(compresscheck
=="gzip" or compresscheck
=="gz"):
757 return archivefile_gzip_mimetype
;
758 if(compresscheck
=="bzip2" or compresscheck
=="bz2"):
759 return archivefile_bzip2_mimetype
;
760 if(compresscheck
=="zstd" or compresscheck
=="zstandard"):
761 return archivefile_zstandard_mimetype
;
762 if(compresscheck
=="lz4"):
763 return archivefile_lz4_mimetype
;
764 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
765 return archivefile_lzop_mimetype
;
766 if(compresscheck
=="lzma"):
767 return archivefile_lzma_mimetype
;
768 if(compresscheck
=="xz"):
769 return archivefile_xz_mimetype
;
770 if(compresscheck
=="catfile" or compresscheck
=="cat" or compresscheck
==formatspecs
[2]):
771 return archivefile_cat_mimetype
;
772 if(not compresscheck
):
776 def UncompressArchiveFile(fp
, formatspecs
=__file_format_list__
):
777 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
779 compresscheck
= CheckCompressionType(fp
, formatspecs
, False);
780 if(compresscheck
=="gzip"):
785 catfp
= gzip
.GzipFile(fileobj
=fp
, mode
="rb");
786 if(compresscheck
=="bzip2"):
792 catfp
.write(bz2
.decompress(fp
.read()));
793 if(compresscheck
=="zstd"):
799 catfp
.write(zstandard
.decompress(fp
.read()));
800 if(compresscheck
=="lz4"):
806 catfp
.write(lz4
.frame
.decompress(fp
.read()));
807 if(compresscheck
=="lzo" or compresscheck
=="lzop"):
813 catfp
.write(lzo
.decompress(fp
.read()));
814 if(compresscheck
=="lzma" or compresscheck
=="xz"):
820 catfp
.write(lzma
.decompress(fp
.read()));
821 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
823 if(not compresscheck
):
829 with fp
as fpcontent
:
831 catfp
.write(lzma
.decompress(fp
.read()));
832 except lzma
.LZMAError
:
836 create_alias_function("Uncompress", __file_format_name__
, "", UncompressArchiveFile
);
838 def UncompressFile(infile
, formatspecs
=__file_format_list__
, mode
="rb"):
839 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
840 if(sys
.version_info
[0]==2 and compresscheck
):
846 if(compresscheck
=="gzip"):
852 filefp
= gzip
.open(infile
, mode
, encoding
="UTF-8");
853 except (ValueError, TypeError) as e
:
854 filefp
= gzip
.open(infile
, mode
);
855 if(compresscheck
=="bzip2"):
861 filefp
= bz2
.open(infile
, mode
, encoding
="UTF-8");
862 except (ValueError, TypeError) as e
:
863 filefp
= bz2
.open(infile
, mode
);
864 if(compresscheck
=="zstd"):
870 filefp
= zstandard
.open(infile
, mode
, encoding
="UTF-8");
871 except (ValueError, TypeError) as e
:
872 filefp
= zstandard
.open(infile
, mode
);
873 if(compresscheck
=="lz4"):
879 filefp
= lz4
.frame
.open(infile
, mode
, encoding
="UTF-8");
880 except (ValueError, TypeError) as e
:
881 filefp
= lz4
.frame
.open(infile
, mode
);
882 if(compresscheck
=="lzo"):
888 filefp
= lzo
.open(infile
, mode
, encoding
="UTF-8");
889 except (ValueError, TypeError) as e
:
890 filefp
= lzo
.open(infile
, mode
);
891 if(compresscheck
=="lzma"):
897 filefp
= lzma
.open(infile
, mode
, encoding
="UTF-8");
898 except (ValueError, TypeError) as e
:
899 filefp
= lzma
.open(infile
, mode
);
900 if(compresscheck
=="catfile" or compresscheck
==formatspecs
[2]):
902 filefp
= open(infile
, mode
, encoding
="UTF-8");
903 except (ValueError, TypeError) as e
:
904 filefp
= open(infile
, mode
);
905 if(not compresscheck
):
907 filefp
= open(infile
, mode
, encoding
="UTF-8");
908 except (ValueError, TypeError) as e
:
909 filefp
= open(infile
, mode
);
910 except FileNotFoundError
:
914 def UncompressString(infile
):
915 compresscheck
= CheckCompressionTypeFromString(infile
, formatspecs
, False);
916 if(compresscheck
=="gzip"):
921 fileuz
= gzip
.decompress(infile
);
922 if(compresscheck
=="bzip2"):
927 fileuz
= bz2
.decompress(infile
);
928 if(compresscheck
=="zstd"):
933 fileuz
= zstandard
.decompress(infile
);
934 if(compresscheck
=="lz4"):
939 fileuz
= lz4
.frame
.decompress(infile
);
940 if(compresscheck
=="lzo"):
945 fileuz
= lzo
.decompress(infile
);
946 if(compresscheck
=="lzma"):
951 fileuz
= lzma
.decompress(infile
);
952 if(not compresscheck
):
954 if(hasattr(fileuz
, 'decode')):
955 fileuz
= fileuz
.decode("UTF-8");
958 def UncompressStringAlt(infile
):
960 outstring
= UncompressString(infile
);
961 filefp
.write(outstring
);
965 def CheckCompressionSubType(infile
, formatspecs
=__file_format_list__
):
966 compresscheck
= CheckCompressionType(infile
, formatspecs
, False);
967 if(not compresscheck
):
968 fextname
= os
.path
.splitext(infile
)[1];
970 compresscheck
= "gzip";
971 if(fextname
==".bz2"):
972 compresscheck
= "bzip2";
973 if(fextname
==".zst"):
974 compresscheck
= "zstd";
975 if(fextname
==".lz4"):
976 compresscheck
= "lz4";
977 if(fextname
==".lzo" or fextname
==".lzop"):
978 compresscheck
= "lzo";
979 if(fextname
==".lzma" or fextname
==".xz"):
980 compresscheck
= "lzma";
981 if(not compresscheck
):
983 if(compresscheck
=="catfile"):
985 if(compresscheck
==formatspecs
[2]):
986 return formatspecs
[2];
987 if(compresscheck
=="tarfile"):
989 if(compresscheck
=="zipfile"):
991 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
992 catfp
= UncompressArchiveFile(infile
, formatspecs
[2]);
995 if(compresscheck
=="gzip"):
1000 catfp
= gzip
.GzipFile(infile
, "rb");
1001 if(compresscheck
=="bzip2"):
1006 catfp
= bz2
.BZ2File(infile
, "rb");
1007 if(compresscheck
=="lz4"):
1012 catfp
= lz4
.frame
.open(infile
, "rb");
1013 if(compresscheck
=="zstd"):
1018 catfp
= zstandard
.open(infile
, "rb");
1019 if(compresscheck
=="lzma" or compresscheck
=="xz"):
1024 catfp
= lzma
.open(infile
, "rb");
1025 except FileNotFoundError
:
1028 prefp
= catfp
.read(5);
1029 if(prefp
==binascii
.unhexlify("7573746172")):
1030 filetype
= "tarfile";
1032 prefp
= catfp
.read(7);
1033 if(prefp
==binascii
.unhexlify("43617446696c65")):
1034 filetype
= "catfile";
1036 prefp
= catfp
.read(formatspecs
[3]);
1037 if(prefp
==binascii
.unhexlify(formatspecs
[4])):
1038 filetype
= formatspecs
[2];
1040 prefp
= catfp
.read(10);
1041 if(prefp
==binascii
.unhexlify("7061785f676c6f62616c")):
1042 filetype
= "tarfile";
1047 def GZipCompress(data
, compresslevel
=9):
1052 tmpfp
= tempfile
.NamedTemporaryFile("wb", delete
=False);
1054 tmpfp
= gzip
.GzipFile(tmpfp
.name
, mode
="wb", compresslevel
=compresslevel
);
1058 catfp
= open(tmpfp
.name
, "rb");
1059 except FileNotFoundError
:
1061 catdata
= catfp
.read();
1065 def CompressArchiveFile(fp
, compression
="auto", compressionlevel
=None, formatspecs
=__file_format_list__
):
1066 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1067 if(not hasattr(fp
, "read") and not hasattr(fp
, "write")):
1070 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
1072 if(compression
not in compressionlist
and compression
is None):
1073 compression
= "auto";
1074 if(compression
=="gzip"):
1080 if(compressionlevel
is None):
1081 compressionlevel
= 9;
1083 compressionlevel
= int(compressionlevel
);
1084 catfp
.write(gzip
.compress(fp
.read(), compresslevel
=compressionlevel
));
1085 if(compression
=="bzip2"):
1091 if(compressionlevel
is None):
1092 compressionlevel
= 9;
1094 compressionlevel
= int(compressionlevel
);
1095 catfp
.write(bz2
.compress(fp
.read(), compresslevel
=compressionlevel
));
1096 if(compression
=="lz4"):
1102 if(compressionlevel
is None):
1103 compressionlevel
= 9;
1105 compressionlevel
= int(compressionlevel
);
1106 catfp
.write(lz4
.frame
.compress(fp
.read(), compression_level
=compressionlevel
));
1107 if(compression
=="lzo" or compression
=="lzop"):
1113 if(compressionlevel
is None):
1114 compressionlevel
= 9;
1116 compressionlevel
= int(compressionlevel
);
1117 catfp
.write(lzo
.compress(fp
.read(), compresslevel
=compressionlevel
));
1118 if(compression
=="zstd"):
1124 if(compressionlevel
is None):
1125 compressionlevel
= 10;
1127 compressionlevel
= int(compressionlevel
);
1128 catfp
.write(zstandard
.compress(fp
.read(), level
=compressionlevel
));
1129 if(compression
=="lzma"):
1135 if(compressionlevel
is None):
1136 compressionlevel
= 9;
1138 compressionlevel
= int(compressionlevel
);
1139 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]));
1140 if(compression
=="xz"):
1146 if(compressionlevel
is None):
1147 compressionlevel
= 9;
1149 compressionlevel
= int(compressionlevel
);
1150 catfp
.write(lzma
.compress(fp
.read(), format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]));
1151 if(compression
=="auto" or compression
is None):
1156 create_alias_function("Compress", __file_format_name__
, "", CompressArchiveFile
);
1158 def CompressOpenFile(outfile
, compressionlevel
=None):
1159 if(outfile
is None):
1161 fbasename
= os
.path
.splitext(outfile
)[0];
1162 fextname
= os
.path
.splitext(outfile
)[1];
1163 if(compressionlevel
is None and fextname
!=".zst"):
1164 compressionlevel
= 9;
1165 elif(compressionlevel
is None and fextname
==".zst"):
1166 compressionlevel
= 10;
1168 compressionlevel
= int(compressionlevel
);
1169 if(sys
.version_info
[0]==2):
1174 if(fextname
not in outextlistwd
):
1176 outfp
= open(outfile
, "wb", encoding
="UTF-8");
1177 except (ValueError, TypeError) as e
:
1178 outfp
= open(outfile
, "wb");
1179 elif(fextname
==".gz"):
1185 outfp
= gzip
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
1186 except (ValueError, TypeError) as e
:
1187 outfp
= gzip
.open(outfile
, mode
, compressionlevel
);
1188 elif(fextname
==".bz2"):
1194 outfp
= bz2
.open(outfile
, mode
, compressionlevel
, encoding
="UTF-8");
1195 except (ValueError, TypeError) as e
:
1196 outfp
= bz2
.open(outfile
, mode
, compressionlevel
);
1197 elif(fextname
==".zst"):
1203 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
), encoding
="UTF-8");
1204 except (ValueError, TypeError) as e
:
1205 outfp
= zstandard
.open(outfile
, mode
, zstandard
.ZstdCompressor(level
=compressionlevel
));
1206 elif(fextname
==".xz"):
1212 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}], encoding
="UTF-8");
1213 except (ValueError, TypeError) as e
:
1214 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_XZ
, filters
=[{"id": lzma
.FILTER_LZMA2
, "preset": compressionlevel
}]);
1215 elif(fextname
==".lz4"):
1221 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
, encoding
="UTF-8");
1222 except (ValueError, TypeError) as e
:
1223 outfp
= lz4
.frame
.open(outfile
, mode
, compression_level
=compressionlevel
);
1224 elif(fextname
==".lzo"):
1230 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
, encoding
="UTF-8");
1231 except (ValueError, TypeError) as e
:
1232 outfp
= lzo
.open(outfile
, mode
, compresslevel
=compressionlevel
);
1233 elif(fextname
==".lzma"):
1239 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}], encoding
="UTF-8");
1240 except (ValueError, TypeError) as e
:
1241 outfp
= lzma
.open(outfile
, mode
, format
=lzma
.FORMAT_ALONE
, filters
=[{"id": lzma
.FILTER_LZMA1
, "preset": compressionlevel
}]);
1242 except FileNotFoundError
:
1246 def GetDevMajorMinor(fdev
):
1248 if(hasattr(os
, "minor")):
1249 retdev
.append(os
.minor(fdev
));
1252 if(hasattr(os
, "major")):
1253 retdev
.append(os
.major(fdev
));
1258 def CheckSumSupport(checkfor
, guaranteed
=True):
1260 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
1262 hash_list
= sorted(list(hashlib
.algorithms_available
));
1263 checklistout
= sorted(hash_list
+ ['adler32', 'crc16', 'crc16_ansi', 'crc16_ibm', 'crc16_ccitt', 'crc32', 'crc64', 'crc64_ecma', 'crc64_iso', 'none']);
1264 if(checkfor
in checklistout
):
1269 def CheckSumSupportAlt(checkfor
, guaranteed
=True):
1271 hash_list
= sorted(list(hashlib
.algorithms_guaranteed
));
1273 hash_list
= sorted(list(hashlib
.algorithms_available
));
1274 checklistout
= hash_list
;
1275 if(checkfor
in checklistout
):
1280 def PackArchiveFile(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1281 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1282 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1283 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
1284 advancedlist
= True;
1285 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1286 outfile
= RemoveWindowsPath(outfile
);
1287 checksumtype
= checksumtype
.lower();
1288 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
1289 checksumtype
="crc32";
1290 if(checksumtype
=="none"):
1292 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
1294 if(compression
not in compressionlist
and compression
is None):
1295 compression
= "auto";
1297 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1298 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1299 if(os
.path
.exists(outfile
)):
1304 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1306 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1308 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1311 fbasename
= os
.path
.splitext(outfile
)[0];
1312 fextname
= os
.path
.splitext(outfile
)[1];
1313 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1314 catver
= formatspecs
[6];
1315 fileheaderver
= str(int(catver
.replace(".", "")));
1316 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
1317 catfp
.write(fileheader
.encode('UTF-8'));
1320 for line
in sys
.stdin
:
1321 infilelist
.append(line
.strip());
1322 infilelist
= list(filter(None, infilelist
));
1323 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
1324 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
1326 with
open(infiles
, "r") as finfile
:
1327 for line
in finfile
:
1328 infilelist
.append(line
.strip());
1329 infilelist
= list(filter(None, infilelist
));
1331 if(isinstance(infiles
, (list, tuple, ))):
1332 infilelist
= list(filter(None, infiles
));
1333 elif(isinstance(infiles
, (str, ))):
1334 infilelist
= list(filter(None, [infiles
]));
1336 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
1338 GetDirList
= ListDir(infilelist
, followlink
, False);
1346 inodetocatinode
= {};
1347 fnumfiles
= format(int(len(GetDirList
)), 'x').lower();
1348 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
1349 if(checksumtype
=="none" or checksumtype
==""):
1350 catfileheadercshex
= format(0, 'x').lower();
1351 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1352 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1353 elif(checksumtype
=="crc16_ccitt"):
1354 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1355 elif(checksumtype
=="adler32"):
1356 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1357 elif(checksumtype
=="crc32"):
1358 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1359 elif(checksumtype
=="crc64_ecma"):
1360 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1361 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1362 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1363 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1364 checksumoutstr
= hashlib
.new(checksumtype
);
1365 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
1366 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1368 catfileheadercshex
= format(0, 'x').lower
1369 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
1370 catfp
.write(fnumfilesa
.encode('UTF-8'));
1373 os
.fsync(catfp
.fileno());
1374 except io
.UnsupportedOperation
:
1376 except AttributeError:
1378 for curfname
in GetDirList
:
1379 catfhstart
= catfp
.tell();
1380 if(re
.findall("^[.|/]", curfname
)):
1383 fname
= "./"+curfname
;
1385 VerbosePrintOut(fname
);
1386 if(not followlink
or followlink
is None):
1387 fstatinfo
= os
.lstat(fname
);
1389 fstatinfo
= os
.stat(fname
);
1390 fpremode
= fstatinfo
.st_mode
;
1391 finode
= fstatinfo
.st_ino
;
1392 flinkcount
= fstatinfo
.st_nlink
;
1394 if(stat
.S_ISREG(fpremode
)):
1396 elif(stat
.S_ISLNK(fpremode
)):
1398 elif(stat
.S_ISCHR(fpremode
)):
1400 elif(stat
.S_ISBLK(fpremode
)):
1402 elif(stat
.S_ISDIR(fpremode
)):
1404 elif(stat
.S_ISFIFO(fpremode
)):
1406 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
1408 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
1410 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
1415 fcurfid
= format(int(curfid
), 'x').lower();
1416 if(not followlink
and finode
!=0):
1418 if(finode
in inodelist
):
1420 flinkname
= inodetofile
[finode
];
1421 fcurinode
= format(int(inodetocatinode
[finode
]), 'x').lower();
1422 if(finode
not in inodelist
):
1423 inodelist
.append(finode
);
1424 inodetofile
.update({finode
: fname
});
1425 inodetocatinode
.update({finode
: curinode
});
1426 fcurinode
= format(int(curinode
), 'x').lower();
1427 curinode
= curinode
+ 1;
1429 fcurinode
= format(int(curinode
), 'x').lower();
1430 curinode
= curinode
+ 1;
1431 curfid
= curfid
+ 1;
1433 flinkname
= os
.readlink(fname
);
1434 fdev
= fstatinfo
.st_dev
;
1435 getfdev
= GetDevMajorMinor(fdev
);
1436 fdev_minor
= getfdev
[0];
1437 fdev_major
= getfdev
[1];
1438 frdev
= fstatinfo
.st_dev
;
1439 if(hasattr(fstatinfo
, "st_rdev")):
1440 frdev
= fstatinfo
.st_rdev
;
1442 frdev
= fstatinfo
.st_dev
;
1443 getfrdev
= GetDevMajorMinor(frdev
);
1444 frdev_minor
= getfrdev
[0];
1445 frdev_major
= getfrdev
[1];
1446 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1447 fsize
= format(int("0"), 'x').lower();
1448 elif(ftype
==0 or ftype
==7):
1449 fsize
= format(int(fstatinfo
.st_size
), 'x').lower();
1451 fsize
= format(int(fstatinfo
.st_size
)).lower();
1452 fatime
= format(int(fstatinfo
.st_atime
), 'x').lower();
1453 fmtime
= format(int(fstatinfo
.st_mtime
), 'x').lower();
1454 fctime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1455 if(hasattr(fstatinfo
, "st_birthtime")):
1456 fbtime
= format(int(fstatinfo
.st_birthtime
), 'x').lower();
1458 fbtime
= format(int(fstatinfo
.st_ctime
), 'x').lower();
1459 fmode
= format(int(fstatinfo
.st_mode
), 'x').lower();
1460 fchmode
= format(int(stat
.S_IMODE(fstatinfo
.st_mode
)), 'x').lower();
1461 ftypemod
= format(int(stat
.S_IFMT(fstatinfo
.st_mode
)), 'x').lower();
1462 fuid
= format(int(fstatinfo
.st_uid
), 'x').lower();
1463 fgid
= format(int(fstatinfo
.st_gid
), 'x').lower();
1468 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
1469 funame
= userinfo
.pw_name
;
1478 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
1479 fgname
= groupinfo
.gr_name
;
1484 fdev_minor
= format(int(fdev_minor
), 'x').lower();
1485 fdev_major
= format(int(fdev_major
), 'x').lower();
1486 frdev_minor
= format(int(frdev_minor
), 'x').lower();
1487 frdev_major
= format(int(frdev_major
), 'x').lower();
1488 finode
= format(int(finode
), 'x').lower();
1489 flinkcount
= format(int(flinkcount
), 'x').lower();
1490 if(hasattr(fstatinfo
, "st_file_attributes")):
1491 fwinattributes
= format(int(fstatinfo
.st_file_attributes
), 'x').lower();
1493 fwinattributes
= format(int(0), 'x').lower();
1494 fcontents
= "".encode('UTF-8');
1496 if(ftype
== 0 or ftype
== 7):
1497 with
open(fname
, "rb") as fpc
:
1499 chunk
= fpc
.read(chunk_size
);
1503 if(followlink
and (ftype
== 1 or ftype
== 2)):
1504 flstatinfo
= os
.stat(flinkname
);
1505 with
open(flinkname
, "rb") as fpc
:
1507 chunk
= fpc
.read(chunk_size
);
1511 ftypehex
= format(ftype
, 'x').lower();
1512 extrafields
= format(len(extradata
), 'x').lower();
1513 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
1514 if(len(extradata
)>0):
1515 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1516 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1517 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
1518 if(len(extradata
)>0):
1519 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1520 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
1521 if(checksumtype
=="none" or checksumtype
==""):
1522 catfileheadercshex
= format(0, 'x').lower();
1523 catfilecontentcshex
= format(0, 'x').lower();
1524 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1525 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
1526 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
1527 elif(checksumtype
=="crc16_ccitt"):
1528 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
1529 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
1530 elif(checksumtype
=="adler32"):
1531 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1532 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
1533 elif(checksumtype
=="crc32"):
1534 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1535 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
1536 elif(checksumtype
=="crc64_ecma"):
1537 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1538 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
1539 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1540 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1541 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
1542 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1543 checksumoutstr
= hashlib
.new(checksumtype
);
1544 checksumoutstr
.update("".encode('UTF-8'));
1545 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1546 checksumoutstr
= hashlib
.new(checksumtype
);
1547 checksumoutstr
.update(fcontents
);
1548 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
1550 catfileheadercshex
= format(0, 'x').lower();
1551 catfilecontentcshex
= format(0, 'x').lower();
1552 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1553 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
1554 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
1555 if(checksumtype
=="none" or checksumtype
==""):
1556 catfileheadercshex
= format(0, 'x').lower();
1557 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1558 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1559 elif(checksumtype
=="crc16_ccitt"):
1560 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1561 elif(checksumtype
=="adler32"):
1562 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1563 elif(checksumtype
=="crc32"):
1564 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1565 elif(checksumtype
=="crc64_ecma"):
1566 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1567 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1568 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1569 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1570 checksumoutstr
= hashlib
.new(checksumtype
);
1571 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
1572 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1574 catfileheadercshex
= format(0, 'x').lower();
1575 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1576 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
1577 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
1578 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1579 nullstrecd
= formatspecs
[5].encode('UTF-8');
1580 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
1581 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
1582 catfp
.write(catfileout
);
1585 os
.fsync(catfp
.fileno());
1586 except io
.UnsupportedOperation
:
1588 except AttributeError:
1590 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1591 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1594 os
.fsync(catfp
.fileno());
1595 except io
.UnsupportedOperation
:
1597 except AttributeError:
1601 if(hasattr(sys
.stdout
, "buffer")):
1602 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1604 shutil
.copyfileobj(catfp
, sys
.stdout
);
1605 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1606 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1608 upload_file_to_ftp_file(catfp
, outfile
);
1609 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1610 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1613 upload_file_to_pysftp_file(catfp
, outfile
);
1615 upload_file_to_sftp_file(catfp
, outfile
);
1623 create_alias_function("Pack", __file_format_name__
, "", PackArchiveFile
);
1625 if(hasattr(shutil
, "register_archive_format")):
1626 def PackArchiveFileFunc(archive_name
, source_dir
, **kwargs
):
1627 return PackArchiveFile(source_dir
, archive_name
, False, "auto", None, False, "crc32", [], __file_format_delimiter__
, False, False);
1628 create_alias_function("Pack", __file_format_name__
, "Func", PackArchiveFileFunc
);
1630 def PackArchiveFileFromDirList(infiles
, outfile
, dirlistfromtxt
=False, compression
="auto", compressionlevel
=None, followlink
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1631 return PackArchiveFile(infiles
, outfile
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, returnfp
);
1633 def PackArchiveFileFromTarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1634 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1635 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1636 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
1637 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1638 outfile
= RemoveWindowsPath(outfile
);
1639 checksumtype
= checksumtype
.lower();
1640 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
1641 checksumtype
="crc32";
1642 if(checksumtype
=="none"):
1644 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
1646 if(compression
not in compressionlist
and compression
is None):
1647 compression
= "auto";
1649 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1650 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1651 if(os
.path
.exists(outfile
)):
1656 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1658 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1660 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1663 fbasename
= os
.path
.splitext(outfile
)[0];
1664 fextname
= os
.path
.splitext(outfile
)[1];
1665 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1666 catver
= formatspecs
[6];
1667 fileheaderver
= str(int(catver
.replace(".", "")));
1668 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
1669 catfp
.write(fileheader
.encode('UTF-8'));
1675 inodetocatinode
= {};
1678 if(hasattr(sys
.stdin
, "buffer")):
1679 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
1681 shutil
.copyfileobj(sys
.stdin
, infile
);
1686 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
1687 infile
= download_file_from_http_file(infile
);
1692 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
1693 infile
= download_file_from_ftp_file(infile
);
1698 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
1700 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
1702 if(not tarfile
.is_tarfile(infile
)):
1704 except AttributeError:
1705 if(not is_tarfile(infile
)):
1710 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
1711 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
1713 tarfp
= tarfile
.open(infile
, "r");
1714 except FileNotFoundError
:
1716 fnumfiles
= format(int(len(tarfp
.getmembers())), 'x').lower();
1717 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
1718 if(checksumtype
=="none" or checksumtype
==""):
1719 catfileheadercshex
= format(0, 'x').lower();
1720 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1721 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1722 elif(checksumtype
=="crc16_ccitt"):
1723 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
1724 elif(checksumtype
=="adler32"):
1725 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1726 elif(checksumtype
=="crc32"):
1727 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
1728 elif(checksumtype
=="crc64_ecma"):
1729 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1730 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1731 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1732 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1733 checksumoutstr
= hashlib
.new(checksumtype
);
1734 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
1735 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1737 catfileheadercshex
= format(0, 'x').lower();
1738 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
1739 catfp
.write(fnumfilesa
.encode('UTF-8'));
1742 os
.fsync(catfp
.fileno());
1743 except io
.UnsupportedOperation
:
1745 except AttributeError:
1747 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
1748 catfhstart
= catfp
.tell();
1749 if(re
.findall("^[.|/]", member
.name
)):
1750 fname
= member
.name
;
1752 fname
= "./"+member
.name
;
1754 VerbosePrintOut(fname
);
1755 fpremode
= member
.mode
;
1756 ffullmode
= member
.mode
;
1760 ffullmode
= member
.mode
+ stat
.S_IFREG
;
1762 elif(member
.isdev()):
1763 ffullmode
= member
.mode
;
1765 elif(member
.islnk()):
1766 ffullmode
= member
.mode
+ stat
.S_IFREG
;
1768 elif(member
.issym()):
1769 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
1771 elif(member
.ischr()):
1772 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
1774 elif(member
.isblk()):
1775 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
1777 elif(member
.isdir()):
1778 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
1780 elif(member
.isfifo()):
1781 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
1783 elif(member
.issparse()):
1784 ffullmode
= member
.mode
;
1787 ffullmode
= member
.mode
;
1790 fcurfid
= format(int(curfid
), 'x').lower();
1791 fcurinode
= format(int(0), 'x').lower();
1792 curfid
= curfid
+ 1;
1794 flinkname
= member
.linkname
;
1795 fdev_minor
= format(int(member
.devminor
), 'x').lower();
1796 fdev_major
= format(int(member
.devmajor
), 'x').lower();
1797 frdev_minor
= format(int(member
.devminor
), 'x').lower();
1798 frdev_major
= format(int(member
.devmajor
), 'x').lower();
1799 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
1800 fsize
= format(int("0"), 'x').lower();
1801 elif(ftype
==0 or ftype
==7):
1802 fsize
= format(int(member
.size
), 'x').lower();
1804 fsize
= format(int(member
.size
), 'x').lower();
1805 fatime
= format(int(member
.mtime
), 'x').lower();
1806 fmtime
= format(int(member
.mtime
), 'x').lower();
1807 fctime
= format(int(member
.mtime
), 'x').lower();
1808 fbtime
= format(int(member
.mtime
), 'x').lower();
1809 fmode
= format(int(ffullmode
), 'x').lower();
1810 fchmode
= format(int(stat
.S_IMODE(ffullmode
)), 'x').lower();
1811 ftypemod
= format(int(stat
.S_IFMT(ffullmode
)), 'x').lower();
1812 fuid
= format(int(member
.uid
), 'x').lower();
1813 fgid
= format(int(member
.gid
), 'x').lower();
1814 funame
= member
.uname
;
1815 fgname
= member
.gname
;
1816 flinkcount
= format(int(flinkcount
), 'x').lower();
1817 fcontents
= "".encode('UTF-8');
1819 if(ftype
== 0 or ftype
== 7):
1820 with tarfp
.extractfile(member
) as fpc
:
1822 chunk
= fpc
.read(chunk_size
);
1826 ftypehex
= format(ftype
, 'x').lower();
1827 extrafields
= format(len(extradata
), 'x').lower();
1828 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
1829 if(len(extradata
)>0):
1830 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1831 extrasizelen
= format(len(extrasizestr
), 'x').lower();
1832 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
1833 if(len(extradata
)>0):
1834 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
1835 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
1836 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
1837 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
1838 if(checksumtype
=="none" or checksumtype
==""):
1839 catfileheadercshex
= format(0, 'x').lower();
1840 catfilecontentcshex
= format(0, 'x').lower();
1841 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1842 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
1843 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
1844 elif(checksumtype
=="crc16_ccitt"):
1845 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
1846 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
1847 elif(checksumtype
=="adler32"):
1848 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1849 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
1850 elif(checksumtype
=="crc32"):
1851 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
1852 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
1853 elif(checksumtype
=="crc64_ecma"):
1854 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1855 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
1856 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1857 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1858 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
1859 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1860 checksumoutstr
= hashlib
.new(checksumtype
);
1861 checksumoutstr
.update("".encode('UTF-8'));
1862 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1863 checksumoutstr
= hashlib
.new(checksumtype
);
1864 checksumoutstr
.update(fcontents
);
1865 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
1867 catfileheadercshex
= format(0, 'x').lower();
1868 catfilecontentcshex
= format(0, 'x').lower();
1869 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1870 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
1871 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
1872 if(checksumtype
=="none" or checksumtype
==""):
1873 catfileheadercshex
= format(0, 'x').lower();
1874 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
1875 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1876 elif(checksumtype
=="crc16_ccitt"):
1877 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
1878 elif(checksumtype
=="adler32"):
1879 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1880 elif(checksumtype
=="crc32"):
1881 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
1882 elif(checksumtype
=="crc64_ecma"):
1883 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1884 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
1885 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
1886 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
1887 checksumoutstr
= hashlib
.new(checksumtype
);
1888 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
1889 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
1891 catfileheadercshex
= format(0, 'x').lower();
1892 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
1893 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
1894 nullstrecd
= formatspecs
[5].encode('UTF-8');
1895 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
1896 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
1897 catfp
.write(catfileout
);
1900 os
.fsync(catfp
.fileno());
1901 except io
.UnsupportedOperation
:
1903 except AttributeError:
1905 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1906 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1909 os
.fsync(catfp
.fileno());
1910 except io
.UnsupportedOperation
:
1912 except AttributeError:
1916 if(hasattr(sys
.stdout
, "buffer")):
1917 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
1919 shutil
.copyfileobj(catfp
, sys
.stdout
);
1920 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1921 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1923 upload_file_to_ftp_file(catfp
, outfile
);
1924 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1925 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
1928 upload_file_to_pysftp_file(catfp
, outfile
);
1930 upload_file_to_sftp_file(catfp
, outfile
);
1938 create_alias_function("Pack", __file_format_name__
, "FromTarFile", PackArchiveFileFromTarFile
);
1940 def PackArchiveFileFromZipFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
1941 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1942 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
1943 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
1944 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1945 outfile
= RemoveWindowsPath(outfile
);
1946 checksumtype
= checksumtype
.lower();
1947 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
1948 checksumtype
="crc32";
1949 if(checksumtype
=="none"):
1951 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
1953 if(compression
not in compressionlist
and compression
is None):
1954 compression
= "auto";
1956 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
1957 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
1958 if(os
.path
.exists(outfile
)):
1963 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
1965 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
1967 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
1970 fbasename
= os
.path
.splitext(outfile
)[0];
1971 fextname
= os
.path
.splitext(outfile
)[1];
1972 catfp
= CompressOpenFile(outfile
, compressionlevel
);
1973 catver
= formatspecs
[6];
1974 fileheaderver
= str(int(catver
.replace(".", "")));
1975 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
1976 catfp
.write(fileheader
.encode('UTF-8'));
1982 inodetocatinode
= {};
1985 if(hasattr(sys
.stdin
, "buffer")):
1986 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
1988 shutil
.copyfileobj(sys
.stdin
, infile
);
1993 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
1994 infile
= download_file_from_http_file(infile
);
1999 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
2000 infile
= download_file_from_ftp_file(infile
);
2005 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2009 if(not zipfile
.is_zipfile(infile
)):
2012 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
2013 except FileNotFoundError
:
2015 ziptest
= zipfp
.testzip();
2017 VerbosePrintOut("Bad file found!");
2018 fnumfiles
= format(int(len(zipfp
.infolist())), 'x').lower();
2019 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2020 if(checksumtype
=="none" or checksumtype
==""):
2021 catfileheadercshex
= format(0, 'x').lower();
2022 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2023 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2024 elif(checksumtype
=="crc16_ccitt"):
2025 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2026 elif(checksumtype
=="adler32"):
2027 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2028 elif(checksumtype
=="crc32"):
2029 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2030 elif(checksumtype
=="crc64_ecma"):
2031 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2032 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2033 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2034 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2035 checksumoutstr
= hashlib
.new(checksumtype
);
2036 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
2037 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2039 catfileheadercshex
= format(0, 'x').lower();
2040 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2041 catfp
.write(fnumfilesa
.encode('UTF-8'));
2044 os
.fsync(catfp
.fileno());
2045 except io
.UnsupportedOperation
:
2047 except AttributeError:
2049 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
2050 catfhstart
= catfp
.tell();
2051 if(re
.findall("^[.|/]", member
.filename
)):
2052 fname
= member
.filename
;
2054 fname
= "./"+member
.filename
;
2055 zipinfo
= zipfp
.getinfo(member
.filename
);
2057 VerbosePrintOut(fname
);
2058 if(not member
.is_dir()):
2059 fpremode
= int(stat
.S_IFREG
+ 438);
2060 elif(member
.is_dir()):
2061 fpremode
= int(stat
.S_IFDIR
+ 511);
2064 if(not member
.is_dir()):
2066 elif(member
.is_dir()):
2069 fcurfid
= format(int(curfid
), 'x').lower();
2070 fcurinode
= format(int(0), 'x').lower();
2071 curfid
= curfid
+ 1;
2072 fdev_minor
= format(int(0), 'x').lower();
2073 fdev_major
= format(int(0), 'x').lower();
2074 frdev_minor
= format(int(0), 'x').lower();
2075 frdev_major
= format(int(0), 'x').lower();
2077 fsize
= format(int("0"), 'x').lower();
2079 fsize
= format(int(member
.file_size
), 'x').lower();
2081 fsize
= format(int(member
.file_size
), 'x').lower();
2082 fatime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2083 fmtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2084 fctime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2085 fbtime
= format(int(time
.mktime(member
.date_time
+ (0, 0, -1))), 'x').lower();
2086 if(not member
.is_dir()):
2087 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
2088 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
2089 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
2090 if(member
.is_dir()):
2091 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
2092 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2093 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2095 fuid
= format(int(os
.getuid()), 'x').lower();
2096 except AttributeError:
2097 fuid
= format(int(0), 'x').lower();
2099 fuid
= format(int(0), 'x').lower();
2101 fgid
= format(int(os
.getgid()), 'x').lower();
2102 except AttributeError:
2103 fgid
= format(int(0), 'x').lower();
2105 fgid
= format(int(0), 'x').lower();
2109 userinfo
= pwd
.getpwuid(os
.getuid());
2110 funame
= userinfo
.pw_name
;
2113 except AttributeError:
2121 groupinfo
= grp
.getgrgid(os
.getgid());
2122 fgname
= groupinfo
.gr_name
;
2125 except AttributeError:
2129 fcontents
= "".encode('UTF-8');
2131 fcontents
= zipfp
.read(member
.filename
);
2132 ftypehex
= format(ftype
, 'x').lower();
2133 extrafields
= format(len(extradata
), 'x').lower();
2134 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2135 if(len(extradata
)>0):
2136 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2137 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2138 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
2139 if(len(extradata
)>0):
2140 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2141 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2142 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2143 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2144 if(checksumtype
=="none" or checksumtype
==""):
2145 catfileheadercshex
= format(0, 'x').lower();
2146 catfilecontentcshex
= format(0, 'x').lower();
2147 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2148 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
2149 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
2150 elif(checksumtype
=="crc16_ccitt"):
2151 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
2152 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
2153 elif(checksumtype
=="adler32"):
2154 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2155 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
2156 elif(checksumtype
=="crc32"):
2157 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2158 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
2159 elif(checksumtype
=="crc64_ecma"):
2160 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2161 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
2162 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2163 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2164 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
2165 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2166 checksumoutstr
= hashlib
.new(checksumtype
);
2167 checksumoutstr
.update("".encode('UTF-8'));
2168 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2169 checksumoutstr
= hashlib
.new(checksumtype
);
2170 checksumoutstr
.update(fcontents
);
2171 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
2173 catfileheadercshex
= format(0, 'x').lower();
2174 catfilecontentcshex
= format(0, 'x').lower();
2175 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2176 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2177 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
2178 if(checksumtype
=="none" or checksumtype
==""):
2179 catfileheadercshex
= format(0, 'x').lower();
2180 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2181 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2182 elif(checksumtype
=="crc16_ccitt"):
2183 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
2184 elif(checksumtype
=="adler32"):
2185 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2186 elif(checksumtype
=="crc32"):
2187 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2188 elif(checksumtype
=="crc64_ecma"):
2189 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2190 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2191 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2192 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2193 checksumoutstr
= hashlib
.new(checksumtype
);
2194 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
2195 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2197 catfileheadercshex
= format(0, 'x').lower();
2198 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2199 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
2200 nullstrecd
= formatspecs
[5].encode('UTF-8');
2201 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
2202 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
2203 catfp
.write(catfileout
);
2206 os
.fsync(catfp
.fileno());
2207 except io
.UnsupportedOperation
:
2209 except AttributeError:
2211 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2212 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2215 os
.fsync(catfp
.fileno());
2216 except io
.UnsupportedOperation
:
2218 except AttributeError:
2222 if(hasattr(sys
.stdout
, "buffer")):
2223 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2225 shutil
.copyfileobj(catfp
, sys
.stdout
);
2226 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
2227 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2229 upload_file_to_ftp_file(catfp
, outfile
);
2230 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
2231 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2234 upload_file_to_pysftp_file(catfp
, outfile
);
2236 upload_file_to_sftp_file(catfp
, outfile
);
2244 create_alias_function("Pack", __file_format_name__
, "FromZipFile", PackArchiveFileFromZipFile
);
2246 if(not rarfile_support
):
2247 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2250 if(rarfile_support
):
2251 def PackArchiveFileFromRarFile(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2252 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
2253 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
2254 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', '.lzo', '.lzop', '.lzma', '.xz'];
2255 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2256 outfile
= RemoveWindowsPath(outfile
);
2257 checksumtype
= checksumtype
.lower();
2258 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
2259 checksumtype
="crc32";
2260 if(checksumtype
=="none"):
2262 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
2264 if(compression
not in compressionlist
and compression
is None):
2265 compression
= "auto";
2267 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2268 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
2269 if(os
.path
.exists(outfile
)):
2274 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2276 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
2278 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
2281 fbasename
= os
.path
.splitext(outfile
)[0];
2282 fextname
= os
.path
.splitext(outfile
)[1];
2283 catfp
= CompressOpenFile(outfile
, compressionlevel
);
2284 catver
= formatspecs
[6];
2285 fileheaderver
= str(int(catver
.replace(".", "")));
2286 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
2287 catfp
.write(fileheader
.encode('UTF-8'));
2293 inodetocatinode
= {};
2294 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
2296 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
2298 rarfp
= rarfile
.RarFile(infile
, "r");
2299 rartest
= rarfp
.testrar();
2301 VerbosePrintOut("Bad file found!");
2302 fnumfiles
= format(int(len(rarfp
.infolist())), 'x').lower();
2303 fnumfilesa
= AppendNullBytes([fnumfiles
, checksumtype
], formatspecs
[5]);
2304 if(checksumtype
=="none" or checksumtype
==""):
2305 catfileheadercshex
= format(0, 'x').lower();
2306 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2307 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2308 elif(checksumtype
=="crc16_ccitt"):
2309 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
2310 elif(checksumtype
=="adler32"):
2311 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2312 elif(checksumtype
=="crc32"):
2313 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
2314 elif(checksumtype
=="crc64_ecma"):
2315 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2316 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2317 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2318 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2319 checksumoutstr
= hashlib
.new(checksumtype
);
2320 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
2321 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2323 catfileheadercshex
= format(0, 'x').lower();
2324 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2325 catfp
.write(fnumfilesa
.encode('UTF-8'));
2328 os
.fsync(catfp
.fileno());
2329 except io
.UnsupportedOperation
:
2331 except AttributeError:
2333 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
2336 if(member
.host_os
== rarfile
.RAR_OS_UNIX
):
2339 member
.external_attr
2341 except AttributeError:
2343 elif(member
.host_os
== rarfile
.RAR_OS_WIN32
):
2346 member
.external_attr
2348 except AttributeError:
2353 catfhstart
= catfp
.tell();
2354 if(re
.findall("^[.|/]", member
.filename
)):
2355 fname
= member
.filename
;
2357 fname
= "./"+member
.filename
;
2358 rarinfo
= rarfp
.getinfo(member
.filename
);
2360 VerbosePrintOut(fname
);
2361 if(is_unix
and member
.external_attr
!=0):
2362 fpremode
= int(member
.external_attr
);
2363 elif(member
.is_file()):
2364 fpremode
= int(stat
.S_IFREG
+ 438);
2365 elif(member
.is_symlink()):
2366 fpremode
= int(stat
.S_IFLNK
+ 438);
2367 elif(member
.is_dir()):
2368 fpremode
= int(stat
.S_IFDIR
+ 511);
2369 if(is_windows
and member
.external_attr
!=0):
2370 fwinattributes
= format(int(member
.external_attr
), 'x').lower();
2372 fwinattributes
= format(int(0), 'x').lower();
2375 if(member
.is_file()):
2377 elif(member
.is_symlink()):
2379 elif(member
.is_dir()):
2383 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
2384 fcurfid
= format(int(curfid
), 'x').lower();
2385 fcurinode
= format(int(0), 'x').lower();
2386 curfid
= curfid
+ 1;
2387 fdev_minor
= format(int(0), 'x').lower();
2388 fdev_major
= format(int(0), 'x').lower();
2389 frdev_minor
= format(int(0), 'x').lower();
2390 frdev_major
= format(int(0), 'x').lower();
2392 fsize
= format(int("0"), 'x').lower();
2394 fsize
= format(int(member
.file_size
), 'x').lower();
2396 fsize
= format(int(member
.file_size
), 'x').lower();
2399 fatime
= format(int(member
.atime
.timestamp()), 'x').lower();
2401 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2402 except AttributeError:
2403 fatime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2404 fmtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2407 fctime
= format(int(member
.ctime
.timestamp()), 'x').lower();
2409 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2410 except AttributeError:
2411 fctime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2412 fbtime
= format(int(member
.mtime
.timestamp()), 'x').lower();
2413 if(is_unix
and member
.external_attr
!=0):
2414 fmode
= format(int(member
.external_attr
), 'x').lower();
2415 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
2416 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
2417 elif(member
.is_file()):
2418 fmode
= format(int(stat
.S_IFREG
+ 438), 'x').lower();
2419 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
2420 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
2421 elif(member
.is_symlink()):
2422 fmode
= format(int(stat
.S_IFLNK
+ 438), 'x').lower();
2423 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438))), 'x').lower();
2424 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438))), 'x').lower();
2425 elif(member
.is_dir()):
2426 fmode
= format(int(stat
.S_IFDIR
+ 511), 'x').lower();
2427 fchmode
= format(int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2428 ftypemod
= format(int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511))), 'x').lower();
2430 fuid
= format(int(os
.getuid()), 'x').lower();
2431 except AttributeError:
2432 fuid
= format(int(0), 'x').lower();
2434 fuid
= format(int(0), 'x').lower();
2436 fgid
= format(int(os
.getgid()), 'x').lower();
2437 except AttributeError:
2438 fgid
= format(int(0), 'x').lower();
2440 fgid
= format(int(0), 'x').lower();
2444 userinfo
= pwd
.getpwuid(os
.getuid());
2445 funame
= userinfo
.pw_name
;
2448 except AttributeError:
2456 groupinfo
= grp
.getgrgid(os
.getgid());
2457 fgname
= groupinfo
.gr_name
;
2460 except AttributeError:
2464 fcontents
= "".encode('UTF-8');
2466 fcontents
= rarfp
.read(member
.filename
);
2467 ftypehex
= format(ftype
, 'x').lower();
2468 extrafields
= format(len(extradata
), 'x').lower();
2469 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
2470 if(len(extradata
)>0):
2471 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2472 extrasizelen
= format(len(extrasizestr
), 'x').lower();
2473 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
2474 if(len(extradata
)>0):
2475 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
2476 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
2477 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
2478 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
2479 if(checksumtype
=="none" or checksumtype
==""):
2480 catfileheadercshex
= format(0, 'x').lower();
2481 catfilecontentcshex
= format(0, 'x').lower();
2482 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2483 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
2484 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
2485 elif(checksumtype
=="crc16_ccitt"):
2486 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
2487 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
2488 elif(checksumtype
=="adler32"):
2489 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2490 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
2491 elif(checksumtype
=="crc32"):
2492 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
2493 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
2494 elif(checksumtype
=="crc64_ecma"):
2495 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2496 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
2497 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2498 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2499 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
2500 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2501 checksumoutstr
= hashlib
.new(checksumtype
);
2502 checksumoutstr
.update("".encode('UTF-8'));
2503 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2504 checksumoutstr
= hashlib
.new(checksumtype
);
2505 checksumoutstr
.update(fcontents
);
2506 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
2508 catfileheadercshex
= format(0, 'x').lower();
2509 catfilecontentcshex
= format(0, 'x').lower();
2510 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
2511 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
2512 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
2513 if(checksumtype
=="none" or checksumtype
==""):
2514 catfileheadercshex
= format(0, 'x').lower()
2515 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
2516 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
2517 elif(checksumtype
=="crc16_ccitt"):
2518 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower()
2519 elif(checksumtype
=="adler32"):
2520 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
2521 elif(checksumtype
=="crc32"):
2522 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower()
2523 elif(checksumtype
=="crc64_ecma"):
2524 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
2525 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
2526 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower()
2527 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
2528 checksumoutstr
= hashlib
.new(checksumtype
)
2529 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'))
2530 catfileheadercshex
= checksumoutstr
.hexdigest().lower()
2532 catfileheadercshex
= format(0, 'x').lower()
2533 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5])
2534 catfileoutstrecd
= catfileoutstr
.encode('UTF-8')
2535 nullstrecd
= formatspecs
[5].encode('UTF-8')
2536 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
2537 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
)
2538 catfp
.write(catfileout
)
2541 os
.fsync(catfp
.fileno())
2542 except io
.UnsupportedOperation
:
2544 except AttributeError:
2546 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
2547 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
)
2550 os
.fsync(catfp
.fileno())
2551 except io
.UnsupportedOperation
:
2553 except AttributeError:
2557 if(hasattr(sys
.stdout
, "buffer")):
2558 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
2560 shutil
.copyfileobj(catfp
, sys
.stdout
);
2561 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
2562 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2564 upload_file_to_ftp_file(catfp
, outfile
);
2565 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
2566 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
2569 upload_file_to_pysftp_file(catfp
, outfile
);
2571 upload_file_to_sftp_file(catfp
, outfile
);
2579 create_alias_function("Pack", __file_format_name__
, "FromRarFile", PackArchiveFileFromRarFile
);
2581 def ArchiveFileSeekToFileNum(infile
, seekto
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2582 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2585 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2586 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
2587 if(checkcompressfile
=="tarfile"):
2588 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2589 if(checkcompressfile
=="zipfile"):
2590 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2591 if(rarfile_support
and checkcompressfile
=="rarfile"):
2592 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2593 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2600 if(hasattr(sys
.stdin
, "buffer")):
2601 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
2603 shutil
.copyfileobj(sys
.stdin
, catfp
);
2605 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2609 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
2610 catfp
= download_file_from_http_file(infile
);
2612 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2616 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
2617 catfp
= download_file_from_ftp_file(infile
);
2619 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2623 elif(re
.findall(r
"^(sftp)\:\/\/", infile
) and haveparamiko
):
2625 catfp
= download_file_from_pysftp_file(infile
);
2627 catfp
= download_file_from_sftp_file(infile
);
2629 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2634 infile
= RemoveWindowsPath(infile
);
2635 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
2636 if(checkcompressfile
=="tarfile"):
2637 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2638 if(checkcompressfile
=="zipfile"):
2639 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2640 if(rarfile_support
and checkcompressfile
=="rarfile"):
2641 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2642 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2644 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
2645 if(not compresscheck
):
2646 fextname
= os
.path
.splitext(infile
)[1];
2647 if(fextname
==".gz"):
2648 compresscheck
= "gzip";
2649 if(fextname
==".bz2"):
2650 compresscheck
= "bzip2";
2651 if(fextname
==".zst"):
2652 compresscheck
= "zstd";
2653 if(fextname
==".lz4" or fextname
==".clz4"):
2654 compresscheck
= "lz4";
2655 if(fextname
==".lzo" or fextname
==".lzop"):
2656 compresscheck
= "lzo";
2657 if(fextname
==".lzma" or fextname
==".xz"):
2658 compresscheck
= "lzma";
2659 if(not compresscheck
):
2661 catfp
= UncompressFile(infile
, formatspecs
, "rb");
2666 SeekToEndOfFile(catfp);
2668 SeekToEndOfFile(catfp);
2669 CatSize = catfp.tell();
2670 CatSizeEnd = CatSize;
2678 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
2679 catstring
= catheader
[0];
2680 catversion
= re
.findall(r
"([\d]+)$", catstring
);
2681 fprenumfiles
= catheader
[1];
2682 fnumfiles
= int(fprenumfiles
, 16);
2683 fprechecksumtype
= catheader
[2];
2684 fprechecksum
= catheader
[3];
2685 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
2686 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
2687 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
2688 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
2689 catfileheadercshex
= format(0, 'x').lower();
2690 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
2691 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2692 elif(fprechecksumtype
=="crc16_ccitt"):
2693 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2694 elif(fprechecksumtype
=="adler32"):
2695 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2696 elif(fprechecksumtype
=="crc32"):
2697 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2698 elif(fprechecksumtype
=="crc64_ecma"):
2699 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2700 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
2701 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2702 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
2703 checksumoutstr
= hashlib
.new(fprechecksumtype
);
2704 checksumoutstr
.update(fileheader
.encode('UTF-8'));
2705 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2707 catfileheadercshex
= format(0, 'x').lower();
2708 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2709 fheadtell
= len(fileheader
);
2710 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
2711 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(catfp
.tell()));
2713 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
2714 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
2715 if(seekto
>=fnumfiles
):
2716 seekto
= fnumfiles
- 1;
2722 seekstart
= catfp
.tell();
2723 preheaderdata
= ReadFileHeaderData(catfp
, 5, formatspecs
[5]);
2724 prefheadsize
= int(preheaderdata
[0], 16);
2725 prefseek
= prefheadsize
- (int(len(preheaderdata
[1]) + 1) + int(len(preheaderdata
[2]) + 1) + int(len(preheaderdata
[3]) + 1) + int(len(preheaderdata
[4]) + 1));
2726 preftype
= int(preheaderdata
[1], 16);
2727 prefsize
= int(preheaderdata
[4], 16);
2728 catfp
.seek(prefseek
, 1);
2730 catfp
.seek(prefsize
, 1);
2733 catfp
.seek(seekstart
, 0);
2735 catfheadsize
= int(preheaderdata
[0], 16);
2736 catftype
= int(preheaderdata
[1], 16);
2737 if(re
.findall("^[.|/]", preheaderdata
[2])):
2738 catfname
= preheaderdata
[2];
2740 catfname
= "./"+preheaderdata
[2];
2741 catflinkname
= preheaderdata
[3];
2742 catfsize
= int(preheaderdata
[4], 16);
2743 catfbasedir
= os
.path
.dirname(catfname
);
2744 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
2746 catlist
.update({'catfp': catfp
});
2751 create_alias_function("", __file_format_name__
, "SeekToFileNum", ArchiveFileSeekToFileNum
);
2753 def ArchiveFileSeekToFileName(infile
, seekfile
=None, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
2754 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2757 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2758 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
2759 if(checkcompressfile
=="tarfile"):
2760 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2761 if(checkcompressfile
=="zipfile"):
2762 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2763 if(rarfile_support
and checkcompressfile
=="rarfile"):
2764 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2765 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2772 if(hasattr(sys
.stdin
, "buffer")):
2773 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
2775 shutil
.copyfileobj(sys
.stdin
, catfp
);
2777 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2781 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
2782 catfp
= download_file_from_http_file(infile
);
2784 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2788 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
2789 catfp
= download_file_from_ftp_file(infile
);
2791 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2795 elif(re
.findall(r
"^(sftp)\:\/\/", infile
) and haveparamiko
):
2797 catfp
= download_file_from_pysftp_file(infile
);
2799 catfp
= download_file_from_sftp_file(infile
);
2801 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2806 infile
= RemoveWindowsPath(infile
);
2807 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
2808 if(checkcompressfile
=="tarfile"):
2809 return TarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2810 if(checkcompressfile
=="zipfile"):
2811 return ZipFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2812 if(rarfile_support
and checkcompressfile
=="rarfile"):
2813 return RarFileToArray(infile
, 0, 0, listonly
, skipchecksum
, formatspecs
, returnfp
);
2814 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2816 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
2817 if(not compresscheck
):
2818 fextname
= os
.path
.splitext(infile
)[1];
2819 if(fextname
==".gz"):
2820 compresscheck
= "gzip";
2821 if(fextname
==".bz2"):
2822 compresscheck
= "bzip2";
2823 if(fextname
==".zst"):
2824 compresscheck
= "zstd";
2825 if(fextname
==".lz4" or fextname
==".clz4"):
2826 compresscheck
= "lz4";
2827 if(fextname
==".lzo" or fextname
==".lzop"):
2828 compresscheck
= "lzo";
2829 if(fextname
==".lzma" or fextname
==".xz"):
2830 compresscheck
= "lzma";
2831 if(not compresscheck
):
2833 catfp
= UncompressFile(infile
, formatspecs
, "rb");
2838 SeekToEndOfFile(catfp);
2840 SeekToEndOfFile(catfp);
2841 CatSize = catfp.tell();
2842 CatSizeEnd = CatSize;
2850 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
2851 catstring
= catheader
[0];
2852 catversion
= re
.findall(r
"([\d]+)$", catstring
);
2853 fprenumfiles
= catheader
[1];
2854 fnumfiles
= int(fprenumfiles
, 16);
2855 fprechecksumtype
= catheader
[2];
2856 fprechecksum
= catheader
[3];
2857 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
2858 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
2859 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
2860 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
2861 catfileheadercshex
= format(0, 'x').lower();
2862 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
2863 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2864 elif(fprechecksumtype
=="crc16_ccitt"):
2865 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
2866 elif(fprechecksumtype
=="adler32"):
2867 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2868 elif(fprechecksumtype
=="crc32"):
2869 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
2870 elif(fprechecksumtype
=="crc64_ecma"):
2871 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2872 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
2873 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
2874 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
2875 checksumoutstr
= hashlib
.new(fprechecksumtype
);
2876 checksumoutstr
.update(fileheader
.encode('UTF-8'));
2877 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
2879 catfileheadercshex
= format(0, 'x').lower();
2880 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
2881 fheadtell
= len(fileheader
);
2882 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
2883 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(catfp
.tell()));
2885 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
2886 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
2887 seekto
= fnumfiles
- 1
2892 seekstart
= catfp
.tell();
2893 preheaderdata
= ReadFileHeaderData(catfp
, 5, formatspecs
[5]);
2894 prefheadsize
= int(preheaderdata
[0], 16);
2895 prefseek
= prefheadsize
- (int(len(preheaderdata
[1]) + 1) + int(len(preheaderdata
[2]) + 1) + int(len(preheaderdata
[3]) + 1) + int(len(preheaderdata
[4]) + 1));
2896 preftype
= int(preheaderdata
[1], 16);
2897 prefsize
= int(preheaderdata
[4], 16);
2898 catfp
.seek(prefseek
, 1);
2900 catfp
.seek(prefsize
, 1);
2904 prefname
= preheaderdata
[2];
2905 if(re
.findall("^[.|/]", preheaderdata
[2])):
2906 prefname
= preheaderdata
[2];
2908 prefname
= "./"+preheaderdata
[2];
2909 if(prefname
==seekfile
):
2912 catfp
.seek(seekstart
, 0);
2914 catfheadsize
= int(preheaderdata
[0], 16);
2915 catftype
= int(preheaderdata
[1], 16);
2916 if(re
.findall("^[.|/]", preheaderdata
[2])):
2917 catfname
= preheaderdata
[2];
2919 catfname
= "./"+preheaderdata
[2];
2920 catflinkname
= preheaderdata
[3];
2921 catfsize
= int(preheaderdata
[4], 16);
2922 catfbasedir
= os
.path
.dirname(catfname
);
2924 catlist
= {'fid': fileidnum
, 'foffset': catfp
.tell(), 'ftype': catftype
, 'fname': catfname
, 'fbasedir': catfbasedir
, 'flinkname': catflinkname
, 'fsize': catfsize
};
2928 catlist
.update({'catfp': catfp
});
2933 create_alias_function("", __file_format_name__
, "SeekToFileName", ArchiveFileSeekToFileName
);
2935 def ArchiveFileValidate(infile
, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
2937 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
2938 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
2941 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2942 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
2943 if(checkcompressfile
=="tarfile"):
2944 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2945 if(checkcompressfile
=="zipfile"):
2946 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2947 if(rarfile_support
and checkcompressfile
=="rarfile"):
2948 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2949 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
2956 if(hasattr(sys
.stdin
, "buffer")):
2957 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
2959 shutil
.copyfileobj(sys
.stdin
, catfp
);
2961 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2965 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
2966 catfp
= download_file_from_http_file(infile
);
2968 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2972 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
2973 catfp
= download_file_from_ftp_file(infile
);
2975 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2979 elif(re
.findall(r
"^(sftp)\:\/\/", infile
) and haveparamiko
):
2981 catfp
= download_file_from_pysftp_file(infile
);
2983 catfp
= download_file_from_sftp_file(infile
);
2985 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
2990 infile
= RemoveWindowsPath(infile
);
2991 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
2992 if(checkcompressfile
=="tarfile"):
2993 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2994 if(checkcompressfile
=="zipfile"):
2995 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2996 if(rarfile_support
and checkcompressfile
=="rarfile"):
2997 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
2998 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3000 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
3001 if(not compresscheck
):
3002 fextname
= os
.path
.splitext(infile
)[1];
3003 if(fextname
==".gz"):
3004 compresscheck
= "gzip";
3005 if(fextname
==".bz2"):
3006 compresscheck
= "bzip2";
3007 if(fextname
==".zst"):
3008 compresscheck
= "zstd";
3009 if(fextname
==".lz4" or fextname
==".clz4"):
3010 compresscheck
= "lz4";
3011 if(fextname
==".lzo" or fextname
==".lzop"):
3012 compresscheck
= "lzo";
3013 if(fextname
==".lzma" or fextname
==".xz"):
3014 compresscheck
= "lzma";
3015 if(not compresscheck
):
3017 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3022 SeekToEndOfFile(catfp);
3024 SeekToEndOfFile(catfp);
3025 CatSize = catfp.tell();
3026 CatSizeEnd = CatSize;
3034 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
3035 catstring
= catheader
[0];
3036 catversion
= re
.findall(r
"([\d]+)$", catstring
);
3037 fprenumfiles
= catheader
[1];
3038 fnumfiles
= int(fprenumfiles
, 16);
3039 fprechecksumtype
= catheader
[2];
3040 fprechecksum
= catheader
[3];
3042 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
3043 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3044 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
3045 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
3046 catfileheadercshex
= format(0, 'x').lower();
3047 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
3048 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3049 elif(fprechecksumtype
=="crc16_ccitt"):
3050 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3051 elif(fprechecksumtype
=="adler32"):
3052 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3053 elif(fprechecksumtype
=="crc32"):
3054 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3055 elif(fprechecksumtype
=="crc64_ecma"):
3056 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3057 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
3058 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3059 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
3060 checksumoutstr
= hashlib
.new(fprechecksumtype
);
3061 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3062 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3064 catfileheadercshex
= format(0, 'x').lower();
3065 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3066 valid_archive
= True;
3067 invalid_archive
= False;
3069 VerbosePrintOut("Checking File Header Checksum of file " + infile
+ " at offset " + str(0));
3070 if(fprechecksum
!=catfileheadercshex
):
3071 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
3072 valid_archive
= False;
3073 invalid_archive
= True;
3074 while(il
<fnumfiles
):
3075 catfhstart
= catfp
.tell();
3077 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
3079 catheaderdata
= ReadFileHeaderData(catfp
, 23, formatspecs
[5]);
3080 catfheadsize
= int(catheaderdata
[0], 16);
3081 catftype
= int(catheaderdata
[1], 16);
3082 if(re
.findall("^[.|/]", catheaderdata
[2])):
3083 catfname
= catheaderdata
[2];
3085 catfname
= "./"+catheaderdata
[2];
3086 catfbasedir
= os
.path
.dirname(catfname
);
3087 catflinkname
= catheaderdata
[3];
3088 catfsize
= int(catheaderdata
[4], 16);
3089 catfatime
= int(catheaderdata
[5], 16);
3090 catfmtime
= int(catheaderdata
[6], 16);
3091 catfctime
= int(catheaderdata
[7], 16);
3092 catfbtime
= int(catheaderdata
[8], 16);
3093 catfmode
= int(catheaderdata
[9], 16);
3094 catfchmode
= stat
.S_IMODE(catfmode
);
3095 catftypemod
= stat
.S_IFMT(catfmode
);
3096 catfuid
= int(catheaderdata
[10], 16);
3097 catfuname
= catheaderdata
[11];
3098 catfgid
= int(catheaderdata
[12], 16);
3099 catfgname
= catheaderdata
[13];
3100 fid
= int(catheaderdata
[14], 16);
3101 finode
= int(catheaderdata
[15], 16);
3102 flinkcount
= int(catheaderdata
[16], 16);
3103 catfdev_minor
= int(catheaderdata
[17], 16);
3104 catfdev_major
= int(catheaderdata
[18], 16);
3105 catfrdev_minor
= int(catheaderdata
[19], 16);
3106 catfrdev_major
= int(catheaderdata
[20], 16);
3107 catfextrasize
= int(catheaderdata
[21], 16);
3108 catfextrafields
= int(catheaderdata
[22], 16);
3109 extrafieldslist
= [];
3112 extraend
= extrastart
+ catfextrafields
;
3113 extrafieldslist
= [];
3114 if(extrastart
<extraend
):
3115 extrafieldslist
.append(catheaderdata
[extrastart
]);
3116 extrastart
= extrastart
+ 1;
3117 catfchecksumtype
= catheaderdata
[extrastart
].lower();
3118 catfcs
= catheaderdata
[extrastart
+ 1].lower();
3119 catfccs
= catheaderdata
[extrastart
+ 2].lower();
3121 extrafieldslist
= [];
3123 extrafieldslist
= ReadFileHeaderData(catfp
, catfextrafields
, formatspecs
[5]);
3124 checksumsval
= ReadFileHeaderData(catfp
, 3, formatspecs
[5]);
3125 catfchecksumtype
= checksumsval
[0].lower();
3126 catfcs
= checksumsval
[1].lower();
3127 catfccs
= checksumsval
[2].lower();
3130 hcmax
= len(catheaderdata
) - 2;
3132 hcmax
= len(catheaderdata
);
3135 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
3137 catfnumfields
= 24 + catfextrafields
;
3138 if(catfchecksumtype
=="none" or catfchecksumtype
==""):
3140 elif(catfchecksumtype
=="crc16" or catfchecksumtype
=="crc16_ansi" or catfchecksumtype
=="crc16_ibm"):
3141 catnewfcs
= format(crc16(hout
.encode('UTF-8')) & 0xffff, '04x').lower();
3142 elif(catfchecksumtype
=="adler32"):
3143 catnewfcs
= format(zlib
.adler32(hout
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3144 elif(catfchecksumtype
=="crc32"):
3145 catnewfcs
= format(crc32(hout
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3146 elif(catfchecksumtype
=="crc64_ecma"):
3147 catnewfcs
= format(crc64_ecma(hout
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3148 elif(catfchecksumtype
=="crc64" or catfchecksumtype
=="crc64_iso"):
3149 catnewfcs
= format(crc64_iso(hout
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3150 elif(CheckSumSupportAlt(catfchecksumtype
, hashlib_guaranteed
)):
3151 checksumoutstr
= hashlib
.new(catfchecksumtype
);
3152 checksumoutstr
.update(hout
.encode('UTF-8'));
3153 catnewfcs
= checksumoutstr
.hexdigest().lower();
3155 VerbosePrintOut("Checking File Header Checksum of file " + catfname
+ " at offset " + str(catfhstart
));
3156 if(catfcs
!=catnewfcs
):
3157 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
3158 valid_archive
= False;
3159 invalid_archive
= True;
3160 catfhend
= catfp
.tell() - 1;
3161 catfcontentstart
= catfp
.tell();
3163 pyhascontents
= False;
3165 catfcontents
= catfp
.read(catfsize
);
3166 if(catfchecksumtype
=="none" or catfchecksumtype
==""):
3168 elif(catfchecksumtype
=="crc16" or catfchecksumtype
=="crc16_ansi" or catfchecksumtype
=="crc16_ibm"):
3169 catnewfccs
= format(crc16(catfcontents
) & 0xffff, '04x').lower();
3170 elif(catfchecksumtype
=="crc16_ccitt"):
3171 catnewfcs
= format(crc16_ccitt(catfcontents
) & 0xffff, '04x').lower();
3172 elif(catfchecksumtype
=="adler32"):
3173 catnewfccs
= format(zlib
.adler32(catfcontents
) & 0xffffffff, '08x').lower();
3174 elif(catfchecksumtype
=="crc32"):
3175 catnewfccs
= format(crc32(catfcontents
) & 0xffffffff, '08x').lower();
3176 elif(catfchecksumtype
=="crc64_ecma"):
3177 catnewfcs
= format(crc64_ecma(catfcontents
) & 0xffffffffffffffff, '016x').lower();
3178 elif(catfchecksumtype
=="crc64" or catfchecksumtype
=="crc64_iso"):
3179 catnewfcs
= format(crc64_iso(catfcontents
) & 0xffffffffffffffff, '016x').lower();
3180 elif(CheckSumSupportAlt(catfchecksumtype
, hashlib_guaranteed
)):
3181 checksumoutstr
= hashlib
.new(catfchecksumtype
);
3182 checksumoutstr
.update(catfcontents
);
3183 catnewfccs
= checksumoutstr
.hexdigest().lower();
3184 pyhascontents
= True;
3186 VerbosePrintOut("Checking File Content Checksum of file " + catfname
+ " at offset " + str(catfcontentstart
));
3187 if(catfccs
!=catnewfccs
):
3188 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
3189 valid_archive
= False;
3190 invalid_archive
= True;
3203 create_alias_function("", __file_format_name__
, "Validate", ArchiveFileValidate
);
3205 def ArchiveFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3206 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3209 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3210 checkcompressfile
= CheckCompressionSubType(catfp
, formatspecs
);
3211 if(checkcompressfile
=="tarfile"):
3212 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3213 if(checkcompressfile
=="zipfile"):
3214 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3215 if(rarfile_support
and checkcompressfile
=="rarfile"):
3216 return RarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3217 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3224 if(hasattr(sys
.stdin
, "buffer")):
3225 shutil
.copyfileobj(sys
.stdin
.buffer, catfp
);
3227 shutil
.copyfileobj(sys
.stdin
, catfp
);
3229 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3233 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
3234 catfp
= download_file_from_http_file(infile
);
3236 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3240 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
3241 catfp
= download_file_from_ftp_file(infile
);
3243 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3247 elif(re
.findall(r
"^(sftp)\:\/\/", infile
) and haveparamiko
):
3249 catfp
= download_file_from_pysftp_file(infile
);
3251 catfp
= download_file_from_sftp_file(infile
);
3253 catfp
= UncompressArchiveFile(catfp
, formatspecs
);
3258 infile
= RemoveWindowsPath(infile
);
3259 checkcompressfile
= CheckCompressionSubType(infile
, formatspecs
);
3260 if(checkcompressfile
=="tarfile"):
3261 return TarFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3262 if(checkcompressfile
=="zipfile"):
3263 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3264 if(rarfile_support
and checkcompressfile
=="rarfile"):
3265 return ZipFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3266 if(checkcompressfile
!="catfile" and checkcompressfile
!=formatspecs
[2]):
3268 compresscheck
= CheckCompressionType(infile
, formatspecs
, True);
3269 if(not compresscheck
):
3270 fextname
= os
.path
.splitext(infile
)[1];
3271 if(fextname
==".gz"):
3272 compresscheck
= "gzip";
3273 if(fextname
==".bz2"):
3274 compresscheck
= "bzip2";
3275 if(fextname
==".zst"):
3276 compresscheck
= "zstd";
3277 if(fextname
==".lz4" or fextname
==".clz4"):
3278 compresscheck
= "lz4";
3279 if(fextname
==".lzo" or fextname
==".lzop"):
3280 compresscheck
= "lzo";
3281 if(fextname
==".lzma" or fextname
==".xz"):
3282 compresscheck
= "lzma";
3283 if(not compresscheck
):
3285 catfp
= UncompressFile(infile
, formatspecs
, "rb");
3290 SeekToEndOfFile(catfp);
3292 SeekToEndOfFile(catfp);
3293 CatSize = catfp.tell();
3294 CatSizeEnd = CatSize;
3302 catheader
= ReadFileHeaderData(catfp
, 4, formatspecs
[5]);
3303 catstring
= catheader
[0];
3304 catversion
= re
.findall(r
"([\d]+)$", catstring
);
3305 fprenumfiles
= catheader
[1];
3306 fnumfiles
= int(fprenumfiles
, 16);
3307 fprechecksumtype
= catheader
[2];
3308 fprechecksum
= catheader
[3];
3309 fileheader
= AppendNullByte(catstring
, formatspecs
[5]);
3310 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3311 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, fprechecksumtype
], formatspecs
[5]);
3312 if(fprechecksumtype
=="none" or fprechecksumtype
==""):
3313 catfileheadercshex
= format(0, 'x').lower();
3314 elif(fprechecksumtype
=="crc16" or fprechecksumtype
=="crc16_ansi" or fprechecksumtype
=="crc16_ibm"):
3315 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3316 elif(fprechecksumtype
=="crc16_ccitt"):
3317 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3318 elif(fprechecksumtype
=="adler32"):
3319 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3320 elif(fprechecksumtype
=="crc32"):
3321 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3322 elif(fprechecksumtype
=="crc64_ecma"):
3323 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3324 elif(fprechecksumtype
=="crc64" or fprechecksumtype
=="crc64_iso"):
3325 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3326 elif(CheckSumSupportAlt(fprechecksumtype
, hashlib_guaranteed
)):
3327 checksumoutstr
= hashlib
.new(fprechecksumtype
);
3328 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3329 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3331 catfileheadercshex
= format(0, 'x').lower();
3332 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3333 fheadtell
= len(fileheader
);
3334 if(fprechecksum
!=catfileheadercshex
and not skipchecksum
):
3335 VerbosePrintOut("File Header Checksum Error with file " + infile
+ " at offset " + str(0));
3337 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3338 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': fprechecksumtype
, 'fheaderchecksum': fprechecksum
, 'ffilelist': {}};
3339 if(seekstart
<0 and seekstart
>fnumfiles
):
3341 if(seekend
==0 or seekend
>fnumfiles
and seekend
<seekstart
):
3342 seekend
= fnumfiles
;
3343 elif(seekend
<0 and abs(seekend
)<=fnumfiles
and abs(seekend
)>=seekstart
):
3344 seekend
= fnumfiles
- abs(seekend
);
3347 while(il
< seekstart
):
3348 preheaderdata
= ReadFileHeaderData(catfp
, 5, formatspecs
[5]);
3349 prefheadsize
= int(preheaderdata
[0], 16);
3350 prefseek
= prefheadsize
- (int(len(preheaderdata
[1]) + 1) + int(len(preheaderdata
[2]) + 1) + int(len(preheaderdata
[3]) + 1) + int(len(preheaderdata
[4]) + 1));
3351 preftype
= int(preheaderdata
[1], 16);
3352 prefsize
= int(preheaderdata
[4], 16);
3353 catfp
.seek(prefseek
, 1);
3355 catfp
.seek(prefsize
, 1);
3358 fileidnum
= seekstart
;
3360 while(fileidnum
<seekend
):
3361 catfhstart
= catfp
.tell();
3363 catheaderdata
= ReadFileHeaderDataBySize(catfp
, formatspecs
[5]);
3365 catheaderdata
= ReadFileHeaderData(catfp
, 23, formatspecs
[5]);
3366 catfheadsize
= int(catheaderdata
[0], 16);
3367 catftype
= int(catheaderdata
[1], 16);
3368 if(re
.findall("^[.|/]", catheaderdata
[2])):
3369 catfname
= catheaderdata
[2];
3371 catfname
= "./"+catheaderdata
[2];
3372 catfbasedir
= os
.path
.dirname(catfname
);
3373 catflinkname
= catheaderdata
[3];
3374 catfsize
= int(catheaderdata
[4], 16);
3375 catfatime
= int(catheaderdata
[5], 16);
3376 catfmtime
= int(catheaderdata
[6], 16);
3377 catfctime
= int(catheaderdata
[7], 16);
3378 catfbtime
= int(catheaderdata
[8], 16);
3379 catfmode
= int(catheaderdata
[9], 16);
3380 catfchmode
= stat
.S_IMODE(catfmode
);
3381 catftypemod
= stat
.S_IFMT(catfmode
);
3382 catfuid
= int(catheaderdata
[10], 16);
3383 catfuname
= catheaderdata
[11];
3384 catfgid
= int(catheaderdata
[12], 16);
3385 catfgname
= catheaderdata
[13];
3386 fid
= int(catheaderdata
[14], 16);
3387 finode
= int(catheaderdata
[15], 16);
3388 flinkcount
= int(catheaderdata
[16], 16);
3389 catfdev_minor
= int(catheaderdata
[17], 16);
3390 catfdev_major
= int(catheaderdata
[18], 16);
3391 catfrdev_minor
= int(catheaderdata
[19], 16);
3392 catfrdev_major
= int(catheaderdata
[20], 16);
3393 catfextrasize
= int(catheaderdata
[21], 16);
3394 catfextrafields
= int(catheaderdata
[22], 16);
3395 extrafieldslist
= [];
3398 extraend
= extrastart
+ catfextrafields
;
3399 extrafieldslist
= [];
3400 if(extrastart
<extraend
):
3401 extrafieldslist
.append(catheaderdata
[extrastart
]);
3402 extrastart
= extrastart
+ 1;
3403 catfchecksumtype
= catheaderdata
[extrastart
].lower();
3404 catfcs
= catheaderdata
[extrastart
+ 1].lower();
3405 catfccs
= catheaderdata
[extrastart
+ 2].lower();
3407 extrafieldslist
= [];
3409 extrafieldslist
= ReadFileHeaderData(catfp
, catfextrafields
, formatspecs
[5]);
3410 checksumsval
= ReadFileHeaderData(catfp
, 3, formatspecs
[5]);
3411 catfchecksumtype
= checksumsval
[0].lower();
3412 catfcs
= checksumsval
[1].lower();
3413 catfccs
= checksumsval
[2].lower();
3416 hcmax
= len(catheaderdata
) - 2;
3418 hcmax
= len(catheaderdata
);
3421 hout
= hout
+ AppendNullByte(catheaderdata
[hc
], formatspecs
[5]);
3423 catfnumfields
= 24 + catfextrafields
;
3424 if(catfchecksumtype
=="none" or catfchecksumtype
==""):
3426 elif(catfchecksumtype
=="crc16" or catfchecksumtype
=="crc16_ansi" or catfchecksumtype
=="crc16_ibm"):
3427 catnewfcs
= format(crc16(hout
.encode('UTF-8')) & 0xffff, '04x').lower();
3428 elif(catfchecksumtype
=="adler32"):
3429 catnewfcs
= format(zlib
.adler32(hout
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3430 elif(catfchecksumtype
=="crc32"):
3431 catnewfcs
= format(crc32(hout
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3432 elif(catfchecksumtype
=="crc64_ecma"):
3433 catnewfcs
= format(crc64_ecma(hout
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3434 elif(catfchecksumtype
=="crc64" or catfchecksumtype
=="crc64_iso"):
3435 catnewfcs
= format(crc64_iso(hout
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3436 elif(CheckSumSupportAlt(catfchecksumtype
, hashlib_guaranteed
)):
3437 checksumoutstr
= hashlib
.new(catfchecksumtype
);
3438 checksumoutstr
.update(hout
.encode('UTF-8'));
3439 catnewfcs
= checksumoutstr
.hexdigest().lower();
3440 if(catfcs
!=catnewfcs
and not skipchecksum
):
3441 VerbosePrintOut("File Header Checksum Error with file " + catfname
+ " at offset " + str(catfhstart
));
3443 catfhend
= catfp
.tell() - 1;
3444 catfcontentstart
= catfp
.tell();
3446 pyhascontents
= False;
3447 if(catfsize
>0 and not listonly
):
3448 catfcontents
= catfp
.read(catfsize
);
3449 if(catfchecksumtype
=="none" or catfchecksumtype
==""):
3451 elif(catfchecksumtype
=="crc16" or catfchecksumtype
=="crc16_ansi" or catfchecksumtype
=="crc16_ibm"):
3452 catnewfccs
= format(crc16(catfcontents
) & 0xffff, '04x').lower();
3453 elif(catfchecksumtype
=="crc16_ccitt"):
3454 catnewfcs
= format(crc16_ccitt(catfcontents
) & 0xffff, '04x').lower();
3455 elif(catfchecksumtype
=="adler32"):
3456 catnewfccs
= format(zlib
.adler32(catfcontents
) & 0xffffffff, '08x').lower();
3457 elif(catfchecksumtype
=="crc32"):
3458 catnewfccs
= format(crc32(catfcontents
) & 0xffffffff, '08x').lower();
3459 elif(catfchecksumtype
=="crc64_ecma"):
3460 catnewfcs
= format(crc64_ecma(catfcontents
) & 0xffffffffffffffff, '016x').lower();
3461 elif(catfchecksumtype
=="crc64" or catfchecksumtype
=="crc64_iso"):
3462 catnewfcs
= format(crc64_iso(catfcontents
) & 0xffffffffffffffff, '016x').lower();
3463 elif(CheckSumSupportAlt(catfchecksumtype
, hashlib_guaranteed
)):
3464 checksumoutstr
= hashlib
.new(catfchecksumtype
);
3465 checksumoutstr
.update(catfcontents
);
3466 catnewfccs
= checksumoutstr
.hexdigest().lower();
3467 pyhascontents
= True;
3468 if(catfccs
!=catnewfccs
and skipchecksum
):
3469 VerbosePrintOut("File Content Checksum Error with file " + catfname
+ " at offset " + str(catfcontentstart
));
3471 if(catfsize
>0 and listonly
):
3472 catfp
.seek(catfsize
, 1);
3473 pyhascontents
= False;
3475 catfcontentend
= catfp
.tell() - 1;
3476 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
, '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
, 'fextrafields': catfextrafields
, 'fextrafieldsize': catfextrasize
, 'fextralist': extrafieldslist
, 'fheaderchecksum': catfcs
, 'fcontentchecksum': catfccs
, 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': catfcontents
} });
3477 fileidnum
= fileidnum
+ 1;
3478 realidnum
= realidnum
+ 1;
3480 catlist
.update({'catfp': catfp
});
3485 create_alias_function("", __file_format_name__
, "ToArray", ArchiveFileToArray
);
3487 def ArchiveFileStringToArray(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3488 catfp
= BytesIO(catstr
);
3489 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3490 return listcatfiles
;
3492 create_alias_function("", __file_format_name__
, "StringToArray", ArchiveFileStringToArray
);
3494 def TarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3496 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
3497 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3498 return listcatfiles
;
3500 def ZipFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3502 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
3503 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3504 return listcatfiles
;
3506 if(not rarfile_support
):
3507 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3510 if(rarfile_support
):
3511 def RarFileToArray(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
3513 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
3514 listcatfiles
= ArchiveFileToArray(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
3515 return listcatfiles
;
3517 def ListDirToArrayAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
3518 catver
= formatspecs
[6];
3519 fileheaderver
= str(int(catver
.replace(".", "")));
3520 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3521 advancedlist
= True;
3524 for line
in sys
.stdin
:
3525 infilelist
.append(line
.strip());
3526 infilelist
= list(filter(None, infilelist
));
3527 elif(infiles
!="-" and dirlistfromtxt
and os
.path
.exists(infiles
) and (os
.path
.isfile(infiles
) or infiles
=="/dev/null" or infiles
=="NUL")):
3528 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
3530 with
open(infiles
, "r") as finfile
:
3531 for line
in finfile
:
3532 infilelist
.append(line
.strip());
3533 infilelist
= list(filter(None, infilelist
));
3535 if(isinstance(infiles
, (list, tuple, ))):
3536 infilelist
= list(filter(None, infiles
));
3537 elif(isinstance(infiles
, (str, ))):
3538 infilelist
= list(filter(None, [infiles
]));
3540 GetDirList
= ListDirAdvanced(infilelist
, followlink
, False);
3542 GetDirList
= ListDir(infilelist
, followlink
, False);
3550 inodetocatinode
= {};
3552 fnumfiles
= int(len(GetDirList
));
3553 catver
= formatspecs
[6];
3554 fileheaderver
= str(int(catver
.replace(".", "")));
3555 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3556 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3557 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
3558 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
3559 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3560 if(checksumtype
=="none" or checksumtype
==""):
3561 catfileheadercshex
= format(0, 'x').lower();
3562 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3563 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3564 elif(checksumtype
=="crc16_ccitt"):
3565 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3566 elif(checksumtype
=="adler32"):
3567 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3568 elif(checksumtype
=="crc32"):
3569 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3570 elif(checksumtype
=="crc64_ecma"):
3571 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3572 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3573 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3574 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3575 checksumoutstr
= hashlib
.new(checksumtype
);
3576 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3577 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3579 catfileheadercshex
= format(0, 'x').lower();
3580 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3581 fheadtell
= len(fileheader
);
3582 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
3583 for curfname
in GetDirList
:
3584 if(re
.findall("^[.|/]", curfname
)):
3587 fname
= "./"+curfname
;
3589 VerbosePrintOut(fname
);
3590 if(not followlink
or followlink
is None):
3591 fstatinfo
= os
.lstat(fname
);
3593 fstatinfo
= os
.stat(fname
);
3594 fpremode
= fstatinfo
.st_mode
;
3595 finode
= fstatinfo
.st_ino
;
3596 flinkcount
= fstatinfo
.st_nlink
;
3598 if(stat
.S_ISREG(fpremode
)):
3600 elif(stat
.S_ISLNK(fpremode
)):
3602 elif(stat
.S_ISCHR(fpremode
)):
3604 elif(stat
.S_ISBLK(fpremode
)):
3606 elif(stat
.S_ISDIR(fpremode
)):
3608 elif(stat
.S_ISFIFO(fpremode
)):
3610 elif(hasattr(stat
, "S_ISDOOR") and stat
.S_ISDOOR(fpremode
)):
3612 elif(hasattr(stat
, "S_ISPORT") and stat
.S_ISPORT(fpremode
)):
3614 elif(hasattr(stat
, "S_ISWHT") and stat
.S_ISWHT(fpremode
)):
3619 fbasedir
= os
.path
.dirname(fname
);
3621 if(not followlink
and finode
!=0):
3623 if(finode
in inodelist
):
3625 flinkname
= inodetofile
[finode
];
3626 fcurinode
= inodetocatinode
[finode
];
3627 if(finode
not in inodelist
):
3628 inodelist
.append(finode
);
3629 inodetofile
.update({finode
: fname
});
3630 inodetocatinode
.update({finode
: curinode
});
3631 fcurinode
= curinode
;
3632 curinode
= curinode
+ 1;
3634 fcurinode
= curinode
;
3635 curinode
= curinode
+ 1;
3636 curfid
= curfid
+ 1;
3638 flinkname
= os
.readlink(fname
);
3639 fdev
= fstatinfo
.st_dev
;
3640 getfdev
= GetDevMajorMinor(fdev
);
3641 fdev_minor
= getfdev
[0];
3642 fdev_major
= getfdev
[1];
3643 frdev
= fstatinfo
.st_dev
;
3644 if(hasattr(fstatinfo
, "st_rdev")):
3645 frdev
= fstatinfo
.st_rdev
;
3647 frdev
= fstatinfo
.st_dev
;
3648 getfrdev
= GetDevMajorMinor(frdev
);
3649 frdev_minor
= getfrdev
[0];
3650 frdev_major
= getfrdev
[1];
3651 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3653 if(ftype
==0 or ftype
==7):
3654 fsize
= fstatinfo
.st_size
;
3655 fatime
= fstatinfo
.st_atime
;
3656 fmtime
= fstatinfo
.st_mtime
;
3657 fctime
= fstatinfo
.st_ctime
;
3658 if(hasattr(fstatinfo
, "st_birthtime")):
3659 fbtime
= fstatinfo
.st_birthtime
;
3661 fbtime
= fstatinfo
.st_ctime
;
3662 fmode
= fstatinfo
.st_mode
;
3663 fchmode
= stat
.S_IMODE(fstatinfo
.st_mode
);
3664 ftypemod
= stat
.S_IFMT(fstatinfo
.st_mode
);
3665 fuid
= fstatinfo
.st_uid
;
3666 fgid
= fstatinfo
.st_gid
;
3671 userinfo
= pwd
.getpwuid(fstatinfo
.st_uid
);
3672 funame
= userinfo
.pw_name
;
3681 groupinfo
= grp
.getgrgid(fstatinfo
.st_gid
);
3682 fgname
= groupinfo
.gr_name
;
3687 fdev_minor
= fdev_minor
;
3688 fdev_major
= fdev_major
;
3689 frdev_minor
= frdev_minor
;
3690 frdev_major
= frdev_major
;
3692 flinkcount
= flinkcount
;
3693 if(hasattr(fstatinfo
, "st_file_attributes")):
3694 fwinattributes
= fstatinfo
.st_file_attributes
;
3697 fcontents
= "".encode('UTF-8');
3699 if(ftype
== 0 or ftype
== 7):
3700 with
open(fname
, "rb") as fpc
:
3702 chunk
= fpc
.read(chunk_size
);
3706 if(followlink
and (ftype
== 1 or ftype
== 2)):
3707 flstatinfo
= os
.stat(flinkname
);
3708 with
open(flinkname
, "rb") as fpc
:
3710 chunk
= fpc
.read(chunk_size
);
3714 ftypehex
= format(ftype
, 'x').lower();
3715 extrafields
= len(extradata
);
3716 extrafieldslist
= extradata
;
3717 catfextrafields
= extrafields
;
3718 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3719 if(len(extradata
)>0):
3720 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3721 extrasizelen
= len(extrasizestr
);
3722 extrasizelenhex
= format(extrasizelen
, 'x').lower();
3723 catfileoutstr
= AppendNullBytes([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(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()], formatspecs
[5]);
3724 if(len(extradata
)>0):
3725 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3726 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3727 catfnumfields
= 24 + catfextrafields
;
3728 if(checksumtype
=="none" or checksumtype
==""):
3729 catfileheadercshex
= format(0, 'x').lower();
3730 catfilecontentcshex
= format(0, 'x').lower();
3731 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3732 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3733 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3734 elif(checksumtype
=="crc16_ccitt"):
3735 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3736 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3737 elif(checksumtype
=="adler32"):
3738 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3739 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3740 elif(checksumtype
=="crc32"):
3741 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3742 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3743 elif(checksumtype
=="crc64_ecma"):
3744 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3745 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3746 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3747 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3748 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3749 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3750 checksumoutstr
= hashlib
.new(checksumtype
);
3751 checksumoutstr
.update("".encode('UTF-8'));
3752 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3753 checksumoutstr
= hashlib
.new(checksumtype
);
3754 checksumoutstr
.update(fcontents
);
3755 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
3757 catfileheadercshex
= format(0, 'x').lower();
3758 catfilecontentcshex
= format(0, 'x').lower();
3759 catfhstart
= fheadtell
;
3760 fheadtell
+= len(catfileoutstr
);
3761 catfhend
= fheadtell
- 1;
3762 catfcontentstart
= fheadtell
;
3763 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3764 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
3765 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
3766 if(checksumtype
=="none" or checksumtype
==""):
3767 catfileheadercshex
= format(0, 'x').lower();
3768 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3769 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3770 elif(checksumtype
=="crc16_ccitt"):
3771 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
3772 elif(checksumtype
=="adler32"):
3773 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3774 elif(checksumtype
=="crc32"):
3775 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3776 elif(checksumtype
=="crc64_ecma"):
3777 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3778 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3779 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3780 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3781 checksumoutstr
= hashlib
.new(checksumtype
);
3782 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
3783 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3785 catfileheadercshex
= format(0, 'x').lower();
3786 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
3787 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
3788 nullstrecd
= formatspecs
[5].encode('UTF-8');
3789 fheadtell
+= len(catfileoutstr
) + 1;
3790 catfcontentend
= fheadtell
- 1;
3791 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
3792 pyhascontents
= False;
3793 if(int(fsize
)>0 and not listonly
):
3794 pyhascontents
= True;
3795 if(int(fsize
)>0 and listonly
):
3797 pyhascontents
= False;
3798 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
, '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
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
3799 fileidnum
= fileidnum
+ 1;
3802 def TarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
3808 inodetocatinode
= {};
3812 if(hasattr(sys
.stdin
, "buffer")):
3813 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
3815 shutil
.copyfileobj(sys
.stdin
, infile
);
3820 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
3821 infile
= download_file_from_http_file(infile
);
3826 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
3827 infile
= download_file_from_ftp_file(infile
);
3832 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
3834 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
3836 if(not tarfile
.is_tarfile(infile
)):
3838 except AttributeError:
3839 if(not is_tarfile(infile
)):
3844 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
3845 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
3847 tarfp
= tarfile
.open(infile
, "r");
3848 except FileNotFoundError
:
3850 fnumfiles
= int(len(tarfp
.getmembers()));
3851 catver
= formatspecs
[6];
3852 fileheaderver
= str(int(catver
.replace(".", "")));
3853 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
3854 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
3855 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
3856 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
3857 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
3858 if(checksumtype
=="none" or checksumtype
==""):
3859 catfileheadercshex
= format(0, 'x').lower();
3860 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3861 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3862 elif(checksumtype
=="crc16_ccitt"):
3863 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
3864 elif(checksumtype
=="adler32"):
3865 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3866 elif(checksumtype
=="crc32"):
3867 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
3868 elif(checksumtype
=="crc64_ecma"):
3869 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3870 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3871 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3872 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3873 checksumoutstr
= hashlib
.new(checksumtype
);
3874 checksumoutstr
.update(fileheader
.encode('UTF-8'));
3875 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
3877 catfileheadercshex
= format(0, 'x').lower();
3878 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
3879 fheadtell
= len(fileheader
);
3880 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
3881 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
3882 if(re
.findall("^[.|/]", member
.name
)):
3883 fname
= member
.name
;
3885 fname
= "./"+member
.name
;
3887 VerbosePrintOut(fname
);
3888 fpremode
= member
.mode
;
3889 ffullmode
= member
.mode
;
3893 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3895 elif(member
.isdev()):
3896 ffullmode
= member
.mode
;
3898 elif(member
.islnk()):
3899 ffullmode
= member
.mode
+ stat
.S_IFREG
;
3901 elif(member
.issym()):
3902 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
3904 elif(member
.ischr()):
3905 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
3907 elif(member
.isblk()):
3908 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
3910 elif(member
.isdir()):
3911 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
3913 elif(member
.isfifo()):
3914 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
3916 elif(member
.issparse()):
3917 ffullmode
= member
.mode
;
3920 ffullmode
= member
.mode
;
3923 fbasedir
= os
.path
.dirname(fname
);
3927 curfid
= curfid
+ 1;
3929 flinkname
= member
.linkname
;
3930 fdev_minor
= member
.devminor
;
3931 fdev_major
= member
.devmajor
;
3932 frdev_minor
= member
.devminor
;
3933 frdev_major
= member
.devmajor
;
3934 if(ftype
==1 or ftype
==2 or ftype
==3 or ftype
==4 or ftype
==5 or ftype
==6):
3936 elif(ftype
==0 or ftype
==7):
3937 fsize
= member
.size
;
3939 fsize
= member
.size
;
3940 fatime
= member
.mtime
;
3941 fmtime
= member
.mtime
;
3942 fctime
= member
.mtime
;
3943 fbtime
= member
.mtime
;
3945 fchmode
= stat
.S_IMODE(ffullmode
);
3946 ftypemod
= stat
.S_IFMT(ffullmode
);
3949 funame
= member
.uname
;
3950 fgname
= member
.gname
;
3951 flinkcount
= flinkcount
;
3952 fcontents
= "".encode('UTF-8');
3954 if(ftype
== 0 or ftype
== 7):
3955 with tarfp
.extractfile(member
) as fpc
:
3957 chunk
= fpc
.read(chunk_size
);
3961 ftypehex
= format(ftype
, 'x').lower();
3962 extrafields
= len(extradata
);
3963 extrafieldslist
= extradata
;
3964 catfextrafields
= extrafields
;
3965 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
3966 if(len(extradata
)>0):
3967 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3968 extrasizelen
= len(extrasizestr
);
3969 extrasizelenhex
= format(extrasizelen
, 'x').lower();
3970 catfileoutstr
= AppendNullBytes([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(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()], formatspecs
[5]);
3971 if(len(extradata
)>0):
3972 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
3973 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
3974 catfnumfields
= 24 + catfextrafields
;
3975 if(checksumtype
=="none" or checksumtype
==""):
3976 catfileheadercshex
= format(0, 'x').lower();
3977 catfilecontentcshex
= format(0, 'x').lower();
3978 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
3979 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
3980 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
3981 elif(checksumtype
=="crc16_ccitt"):
3982 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
3983 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
3984 elif(checksumtype
=="adler32"):
3985 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3986 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
3987 elif(checksumtype
=="crc32"):
3988 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
3989 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
3990 elif(checksumtype
=="crc64_ecma"):
3991 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3992 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
3993 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
3994 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
3995 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
3996 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
3997 checksumoutstr
= hashlib
.new(checksumtype
);
3998 checksumoutstr
.update("".encode('UTF-8'));
3999 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4000 checksumoutstr
= hashlib
.new(checksumtype
);
4001 checksumoutstr
.update(fcontents
);
4002 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
4004 catfileheadercshex
= format(0, 'x').lower();
4005 catfilecontentcshex
= format(0, 'x').lower();
4006 catfhstart
= fheadtell
;
4007 fheadtell
+= len(catfileoutstr
);
4008 catfhend
= fheadtell
- 1;
4009 catfcontentstart
= fheadtell
;
4010 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4011 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
4012 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
4013 if(checksumtype
=="none" or checksumtype
==""):
4014 catfileheadercshex
= format(0, 'x').lower();
4015 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4016 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4017 elif(checksumtype
=="crc16_ccitt"):
4018 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4019 elif(checksumtype
=="adler32"):
4020 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4021 elif(checksumtype
=="crc32"):
4022 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4023 elif(checksumtype
=="crc64_ecma"):
4024 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4025 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4026 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4027 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4028 checksumoutstr
= hashlib
.new(checksumtype
);
4029 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
4030 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4032 catfileheadercshex
= format(0, 'x').lower();
4033 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4034 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4035 nullstrecd
= formatspecs
[5].encode('UTF-8');
4036 fheadtell
+= len(catfileoutstr
) + 1;
4037 catfcontentend
= fheadtell
- 1;
4038 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
4039 pyhascontents
= False;
4040 if(int(fsize
)>0 and not listonly
):
4041 pyhascontents
= True;
4042 if(int(fsize
)>0 and listonly
):
4044 pyhascontents
= False;
4045 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
, '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
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
4046 fileidnum
= fileidnum
+ 1;
4049 def ZipFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4050 advancedlist
= True;
4056 inodetocatinode
= {};
4060 if(hasattr(sys
.stdin
, "buffer")):
4061 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
4063 shutil
.copyfileobj(sys
.stdin
, infile
);
4068 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
4069 infile
= download_file_from_http_file(infile
);
4074 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
4075 infile
= download_file_from_ftp_file(infile
);
4080 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
4084 if(not zipfile
.is_zipfile(infile
)):
4087 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
4088 except FileNotFoundError
:
4090 ziptest
= zipfp
.testzip();
4092 VerbosePrintOut("Bad file found!");
4093 fnumfiles
= int(len(zipfp
.infolist()));
4094 catver
= formatspecs
[6];
4095 fileheaderver
= str(int(catver
.replace(".", "")));
4096 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4097 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4098 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4099 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4100 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4101 if(checksumtype
=="none" or checksumtype
==""):
4102 catfileheadercshex
= format(0, 'x').lower();
4103 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4104 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4105 elif(checksumtype
=="crc16_ccitt"):
4106 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4107 elif(checksumtype
=="adler32"):
4108 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4109 elif(checksumtype
=="crc32"):
4110 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4111 elif(checksumtype
=="crc64_ecma"):
4112 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4113 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4114 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4115 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4116 checksumoutstr
= hashlib
.new(checksumtype
);
4117 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4118 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4120 catfileheadercshex
= format(0, 'x').lower();
4121 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4122 fheadtell
= len(fileheader
);
4123 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4124 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
4125 if(re
.findall("^[.|/]", member
.filename
)):
4126 fname
= member
.filename
;
4128 fname
= "./"+member
.filename
;
4129 zipinfo
= zipfp
.getinfo(member
.filename
);
4131 VerbosePrintOut(fname
);
4132 if(not member
.is_dir()):
4133 fpremode
= stat
.S_IFREG
+ 438;
4134 elif(member
.is_dir()):
4135 fpremode
= stat
.S_IFDIR
+ 511;
4138 if(not member
.is_dir()):
4140 elif(member
.is_dir()):
4143 fbasedir
= os
.path
.dirname(fname
);
4147 curfid
= curfid
+ 1;
4155 fsize
= member
.file_size
;
4157 fsize
= member
.file_size
;
4158 fatime
= time
.mktime(member
.date_time
+ (0, 0, -1));
4159 fmtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
4160 fctime
= time
.mktime(member
.date_time
+ (0, 0, -1));
4161 fbtime
= time
.mktime(member
.date_time
+ (0, 0, -1));
4162 if(not member
.is_dir()):
4163 fmode
= stat
.S_IFREG
+ 438;
4164 fchmode
= stat
.S_IMODE(int(stat
.S_IFREG
+ 438));
4165 ftypemod
= stat
.S_IFMT(int(stat
.S_IFREG
+ 438));
4166 if(member
.is_dir()):
4167 fmode
= stat
.S_IFDIR
+ 511;
4168 fchmode
= stat
.S_IMODE(int(stat
.S_IFDIR
+ 511));
4169 ftypemod
= stat
.S_IFMT(int(stat
.S_IFDIR
+ 511));
4172 except AttributeError:
4178 except AttributeError:
4185 userinfo
= pwd
.getpwuid(os
.getuid());
4186 funame
= userinfo
.pw_name
;
4189 except AttributeError:
4197 groupinfo
= grp
.getgrgid(os
.getgid());
4198 fgname
= groupinfo
.gr_name
;
4201 except AttributeError:
4205 fcontents
= "".encode('UTF-8');
4207 fcontents
= zipfp
.read(member
.filename
);
4208 ftypehex
= format(ftype
, 'x').lower();
4209 extrafields
= len(extradata
);
4210 extrafieldslist
= extradata
;
4211 catfextrafields
= extrafields
;
4212 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
4213 if(len(extradata
)>0):
4214 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4215 extrasizelen
= len(extrasizestr
);
4216 extrasizelenhex
= format(extrasizelen
, 'x').lower();
4217 catfileoutstr
= AppendNullBytes([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(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()], formatspecs
[5]);
4218 if(len(extradata
)>0):
4219 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4220 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
4221 catfnumfields
= 24 + catfextrafields
;
4222 if(checksumtype
=="none" or checksumtype
==""):
4223 catfileheadercshex
= format(0, 'x').lower();
4224 catfilecontentcshex
= format(0, 'x').lower();
4225 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4226 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
4227 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
4228 elif(checksumtype
=="crc16_ccitt"):
4229 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
4230 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
4231 elif(checksumtype
=="adler32"):
4232 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
4233 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
4234 elif(checksumtype
=="crc32"):
4235 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
4236 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
4237 elif(checksumtype
=="crc64_ecma"):
4238 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4239 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
4240 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4241 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4242 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
4243 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4244 checksumoutstr
= hashlib
.new(checksumtype
);
4245 checksumoutstr
.update("".encode('UTF-8'));
4246 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4247 checksumoutstr
= hashlib
.new(checksumtype
);
4248 checksumoutstr
.update(fcontents
);
4249 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
4251 catfileheadercshex
= format(0, 'x').lower();
4252 catfilecontentcshex
= format(0, 'x').lower();
4253 catfhstart
= fheadtell
;
4254 fheadtell
+= len(catfileoutstr
);
4255 catfhend
= fheadtell
- 1;
4256 catfcontentstart
= fheadtell
;
4257 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4258 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
4259 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
4260 if(checksumtype
=="none" or checksumtype
==""):
4261 catfileheadercshex
= format(0, 'x').lower();
4262 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4263 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4264 elif(checksumtype
=="crc16_ccitt"):
4265 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4266 elif(checksumtype
=="adler32"):
4267 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4268 elif(checksumtype
=="crc32"):
4269 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4270 elif(checksumtype
=="crc64_ecma"):
4271 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4272 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4273 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4274 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4275 checksumoutstr
= hashlib
.new(checksumtype
);
4276 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
4277 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4279 catfileheadercshex
= format(0, 'x').lower();
4280 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4281 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4282 nullstrecd
= formatspecs
[5].encode('UTF-8');
4283 fheadtell
+= len(catfileoutstr
) + 1;
4284 catfcontentend
= fheadtell
- 1;
4285 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
4286 pyhascontents
= False;
4287 if(int(fsize
)>0 and not listonly
):
4288 pyhascontents
= True;
4289 if(int(fsize
)>0 and listonly
):
4291 pyhascontents
= False;
4292 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
, '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
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
4293 fileidnum
= fileidnum
+ 1;
4296 if(not rarfile_support
):
4297 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4300 if(rarfile_support
):
4301 def RarFileToArrayAlt(infiles
, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4302 advancedlist
= True;
4308 inodetocatinode
= {};
4310 if(not os
.path
.exists(infiles
) or not os
.path
.isfile(infiles
)):
4312 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
4314 rarfp
= rarfile
.RarFile(infile
, "r");
4315 rartest
= rarfp
.testrar();
4317 VerbosePrintOut("Bad file found!");
4318 fnumfiles
= int(len(rarfp
.infolist()));
4319 catver
= formatspecs
[6];
4320 fileheaderver
= str(int(catver
.replace(".", "")));
4321 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4322 catversion
= re
.findall(r
"([\d]+)$", fileheader
);
4323 catversions
= re
.search(r
'(.*?)(\d+)$', catstring
).groups();
4324 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4325 fileheader
= fileheader
+ AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4326 if(checksumtype
=="none" or checksumtype
==""):
4327 catfileheadercshex
= format(0, 'x').lower();
4328 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4329 catfileheadercshex
= format(crc16(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4330 elif(checksumtype
=="crc16_ccitt"):
4331 catfileheadercshex
= format(crc16_ccitt(fileheader
.encode('UTF-8')) & 0xffff, '04x').lower();
4332 elif(checksumtype
=="adler32"):
4333 catfileheadercshex
= format(zlib
.adler32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4334 elif(checksumtype
=="crc32"):
4335 catfileheadercshex
= format(crc32(fileheader
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4336 elif(checksumtype
=="crc64_ecma"):
4337 catfileheadercshex
= format(crc64_ecma(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4338 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4339 catfileheadercshex
= format(crc64_iso(fileheader
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4340 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4341 checksumoutstr
= hashlib
.new(checksumtype
);
4342 checksumoutstr
.update(fileheader
.encode('UTF-8'));
4343 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4345 catfileheadercshex
= format(0, 'x').lower();
4346 fileheader
= fileheader
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4347 fheadtell
= len(fileheader
);
4348 catlist
= {'fnumfiles': fnumfiles
, 'fformat': catversions
[0], 'fversion': catversions
[1], 'fformatspecs': formatspecs
, 'fchecksumtype': checksumtype
, 'fheaderchecksum': catfileheadercshex
, 'ffilelist': {}};
4349 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
4352 if(member
.host_os
== rarfile
.RAR_OS_UNIX
):
4355 member
.external_attr
4357 except AttributeError:
4359 elif(member
.host_os
== rarfile
.RAR_OS_WIN32
):
4362 member
.external_attr
4364 except AttributeError:
4369 if(re
.findall("^[.|/]", member
.filename
)):
4370 fname
= member
.filename
;
4372 fname
= "./"+member
.filename
;
4373 rarinfo
= rarfp
.getinfo(member
.filename
);
4375 VerbosePrintOut(fname
);
4376 if(is_unix
and member
.external_attr
!=0):
4377 fpremode
= int(member
.external_attr
);
4378 elif(member
.is_file()):
4379 fpremode
= stat
.S_IFREG
+ 438;
4380 elif(member
.is_symlink()):
4381 fpremode
= stat
.S_IFLNK
+ 438;
4382 elif(member
.is_dir()):
4383 fpremode
= stat
.S_IFDIR
+ 511;
4384 if(is_windows
and member
.external_attr
!=0):
4385 fwinattributes
= int(member
.external_attr
);
4387 fwinattributes
= int(0);
4390 if(member
.is_file()):
4392 elif(member
.is_symlink()):
4394 elif(member
.is_dir()):
4398 flinkname
= rarfp
.read(member
.filename
).decode("UTF-8");
4399 fbasedir
= os
.path
.dirname(fname
);
4403 curfid
= curfid
+ 1;
4411 fsize
= member
.file_size
;
4414 fatime
= int(member
.atime
.timestamp());
4416 fatime
= int(member
.mtime
.timestamp());
4417 except AttributeError:
4418 fatime
= int(member
.mtime
.timestamp());
4419 fmtime
= int(member
.mtime
.timestamp());
4422 fctime
= int(member
.ctime
.timestamp());
4424 fctime
= int(member
.mtime
.timestamp());
4425 except AttributeError:
4426 fctime
= int(member
.mtime
.timestamp());
4427 fbtime
= int(member
.mtime
.timestamp());
4428 if(is_unix
and member
.external_attr
!=0):
4429 fmode
= format(int(member
.external_attr
), 'x').lower();
4430 fchmode
= format(int(stat
.S_IMODE(member
.external_attr
)), 'x').lower();
4431 ftypemod
= format(int(stat
.S_IFMT(member
.external_attr
)), 'x').lower();
4432 elif(member
.is_file()):
4433 fmode
= int(stat
.S_IFREG
+ 438)
4434 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
4435 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
4436 elif(member
.is_symlink()):
4437 fmode
= int(stat
.S_IFLNK
+ 438)
4438 fchmode
= int(stat
.S_IMODE(stat
.S_IFREG
+ 438));
4439 ftypemod
= int(stat
.S_IFMT(stat
.S_IFREG
+ 438));
4440 elif(member
.is_dir()):
4441 fmode
= int(stat
.S_IFDIR
+ 511)
4442 fchmode
= int(stat
.S_IMODE(stat
.S_IFDIR
+ 511));
4443 ftypemod
= int(stat
.S_IFMT(stat
.S_IFDIR
+ 511));
4446 except AttributeError:
4452 except AttributeError:
4459 userinfo
= pwd
.getpwuid(os
.getuid());
4460 funame
= userinfo
.pw_name
;
4463 except AttributeError:
4471 groupinfo
= grp
.getgrgid(os
.getgid());
4472 fgname
= groupinfo
.gr_name
;
4475 except AttributeError:
4479 fcontents
= "".encode('UTF-8');
4481 fcontents
= rarfp
.read(member
.filename
);
4482 ftypehex
= format(ftype
, 'x').lower();
4483 extrafields
= len(extradata
);
4484 extrafieldslist
= extradata
;
4485 catfextrafields
= extrafields
;
4486 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
4487 if(len(extradata
)>0):
4488 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4489 extrasizelen
= len(extrasizestr
);
4490 extrasizelenhex
= format(extrasizelen
, 'x').lower();
4491 catfileoutstr
= AppendNullBytes([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(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()], formatspecs
[5]);
4492 if(len(extradata
)>0):
4493 catfileoutstr
= catfileoutstr
+ AppendNullBytes(extradata
, formatspecs
[5]);
4494 catfileoutstr
= catfileoutstr
+ AppendNullByte(checksumtype
, formatspecs
[5]);
4495 catfnumfields
= 24 + catfextrafields
;
4496 if(checksumtype
=="none" or checksumtype
==""):
4497 catfileheadercshex
= format(0, 'x').lower();
4498 catfilecontentcshex
= format(0, 'x').lower();
4499 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4500 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4501 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
4502 elif(checksumtype
=="crc16_ccitt"):
4503 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4504 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
4505 elif(checksumtype
=="adler32"):
4506 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4507 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
4508 elif(checksumtype
=="crc32"):
4509 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4510 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
4511 elif(checksumtype
=="crc64_ecma"):
4512 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4513 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
4514 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4515 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4516 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
4517 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4518 checksumoutstr
= hashlib
.new(checksumtype
);
4519 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
4520 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4522 catfileheadercshex
= format(0, 'x').lower();
4523 catfilecontentcshex
= format(0, 'x').lower();
4524 catfhstart
= fheadtell
;
4525 fheadtell
+= len(catfileoutstr
);
4526 catfhend
= fheadtell
- 1;
4527 catfcontentstart
= fheadtell
;
4528 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4529 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
4530 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
4531 if(checksumtype
=="none" or checksumtype
==""):
4532 catfileheadercshex
= format(0, 'x').lower();
4533 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4534 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4535 elif(checksumtype
=="crc16_ccitt"):
4536 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
4537 elif(checksumtype
=="adler32"):
4538 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4539 elif(checksumtype
=="crc32"):
4540 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
4541 elif(checksumtype
=="crc64_ecma"):
4542 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4543 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4544 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4545 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4546 checksumoutstr
= hashlib
.new(checksumtype
);
4547 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
4548 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4550 catfileheadercshex
= format(0, 'x').lower();
4551 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
4552 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
4553 nullstrecd
= formatspecs
[5].encode('UTF-8');
4554 fheadtell
+= len(catfileoutstr
) + 1;
4555 catfcontentend
= fheadtell
- 1;
4556 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
4557 pyhascontents
= False;
4558 if(int(fsize
)>0 and not listonly
):
4559 pyhascontents
= True;
4560 if(int(fsize
)>0 and listonly
):
4562 pyhascontents
= False;
4563 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
, '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
, 'fextrafields': catfextrafields
, 'fextrafieldsize': extrasizelen
, 'fextralist': extrafieldslist
, 'fheaderchecksum': int(catfileheadercshex
, 16), 'fcontentchecksum': int(catfilecontentcshex
, 16), 'fhascontents': pyhascontents
, 'fcontentstart': catfcontentstart
, 'fcontentend': catfcontentend
, 'fcontents': fcontents
} });
4564 fileidnum
= fileidnum
+ 1;
4567 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):
4568 outarray
= BytesIO();
4569 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
4570 listcatfiles
= ArchiveFileToArray(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4571 return listcatfiles
;
4573 def ArchiveFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4574 if(isinstance(infile
, dict)):
4575 listcatfiles
= infile
;
4577 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4578 infile
= RemoveWindowsPath(infile
);
4579 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4580 if(not listcatfiles
):
4582 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': {}}}};
4584 catarray
.update({'catfp': listcatfiles
['catfp']});
4585 lenlist
= len(listcatfiles
['ffilelist']);
4590 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4593 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4594 lcfx
= listcatfiles
['fnumfiles'];
4596 lcfx
= int(listcatfiles
['fnumfiles']);
4598 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4599 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4600 catarray
['filetoid'].update(filetoidarray
);
4601 catarray
['idtofile'].update(idtofilearray
);
4602 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4603 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4604 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4605 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4606 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4607 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4608 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4609 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4610 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4611 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4612 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4613 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4614 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4615 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4616 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4617 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4618 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4619 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4620 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4621 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4622 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4623 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4624 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4625 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4626 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4627 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4628 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4629 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4630 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4631 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4632 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4636 create_alias_function("", __file_format_name__
, "ToArrayIndex", ArchiveFileToArrayIndex
);
4638 def ListDirToArrayIndexAlt(infiles
, dirlistfromtxt
=False, followlink
=False, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4639 listcatfiles
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4640 if(not listcatfiles
):
4642 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': {}}}};
4643 lenlist
= len(listcatfiles
['ffilelist']);
4648 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4651 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4652 lcfx
= listcatfiles
['fnumfiles'];
4654 lcfx
= int(listcatfiles
['fnumfiles']);
4656 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4657 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4658 catarray
['filetoid'].update(filetoidarray
);
4659 catarray
['idtofile'].update(idtofilearray
);
4660 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4661 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4662 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4663 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4664 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4665 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4666 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4667 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4668 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4669 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4670 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4671 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4672 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4673 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4674 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4675 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4676 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4677 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4678 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4679 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4680 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4681 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4682 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4683 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4684 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4685 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4686 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4687 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4688 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4689 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4690 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4694 def TarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4695 listcatfiles
= TarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4696 if(not listcatfiles
):
4698 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': {}}}};
4699 lenlist
= len(listcatfiles
['ffilelist']);
4704 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4707 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4708 lcfx
= listcatfiles
['fnumfiles'];
4710 lcfx
= int(listcatfiles
['fnumfiles']);
4712 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4713 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4714 catarray
['filetoid'].update(filetoidarray
);
4715 catarray
['idtofile'].update(idtofilearray
);
4716 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4717 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4718 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4719 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4720 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4721 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4722 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4723 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4724 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4725 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4726 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4727 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4728 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4729 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4730 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4731 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4732 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4733 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4734 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4735 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4736 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4737 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4738 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4739 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4740 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4741 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4742 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4743 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4744 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4745 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4746 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4750 def ZipFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4751 listcatfiles
= ZipFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4752 if(not listcatfiles
):
4754 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': {}}}};
4755 lenlist
= len(listcatfiles
['ffilelist']);
4760 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4763 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4764 lcfx
= listcatfiles
['fnumfiles'];
4766 lcfx
= int(listcatfiles
['fnumfiles']);
4768 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4769 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4770 catarray
['filetoid'].update(filetoidarray
);
4771 catarray
['idtofile'].update(idtofilearray
);
4772 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4773 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4774 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4775 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4776 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4777 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4778 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4779 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4780 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4781 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4782 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4783 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4784 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4785 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4786 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4787 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4788 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4789 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4790 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4791 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4792 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4793 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4794 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4795 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4796 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4797 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4798 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4799 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4800 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4801 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4802 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4806 if(not rarfile_support
):
4807 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4810 if(rarfile_support
):
4811 def RarFileToArrayIndexAlt(infiles
, seekstart
=0, seekend
=0, listonly
=False, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False):
4812 listcatfiles
= RarFileToArrayAlt(infiles
, listonly
, checksumtype
, extradata
, formatspecs
, verbose
);
4813 if(not listcatfiles
):
4815 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': {}}}};
4816 lenlist
= len(listcatfiles
['ffilelist']);
4821 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4824 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
4825 lcfx
= listcatfiles
['fnumfiles'];
4827 lcfx
= int(listcatfiles
['fnumfiles']);
4829 filetoidarray
= {listcatfiles
['ffilelist'][lcfi
]['fname']: listcatfiles
['ffilelist'][lcfi
]['fid']};
4830 idtofilearray
= {listcatfiles
['ffilelist'][lcfi
]['fid']: listcatfiles
['ffilelist'][lcfi
]['fname']};
4831 catarray
['filetoid'].update(filetoidarray
);
4832 catarray
['idtofile'].update(idtofilearray
);
4833 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
4834 catarray
['filetypes']['files']['filetoid'].update(filetoidarray
);
4835 catarray
['filetypes']['files']['idtofile'].update(idtofilearray
);
4836 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
4837 catarray
['filetypes']['hardlinks']['filetoid'].update(filetoidarray
);
4838 catarray
['filetypes']['hardlinks']['idtofile'].update(idtofilearray
);
4839 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4840 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4841 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
4842 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4843 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4844 catarray
['filetypes']['links']['filetoid'].update(filetoidarray
);
4845 catarray
['filetypes']['links']['idtofile'].update(idtofilearray
);
4846 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==3):
4847 catarray
['filetypes']['character']['filetoid'].update(filetoidarray
);
4848 catarray
['filetypes']['character']['idtofile'].update(idtofilearray
);
4849 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4850 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4851 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==4):
4852 catarray
['filetypes']['block']['filetoid'].update(filetoidarray
);
4853 catarray
['filetypes']['block']['idtofile'].update(idtofilearray
);
4854 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4855 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4856 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
4857 catarray
['filetypes']['directories']['filetoid'].update(filetoidarray
);
4858 catarray
['filetypes']['directories']['idtofile'].update(idtofilearray
);
4859 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6):
4860 catarray
['filetypes']['symlinks']['filetoid'].update(filetoidarray
);
4861 catarray
['filetypes']['symlinks']['idtofile'].update(idtofilearray
);
4862 catarray
['filetypes']['devices']['filetoid'].update(filetoidarray
);
4863 catarray
['filetypes']['devices']['idtofile'].update(idtofilearray
);
4867 def ArchiveFileStringToArrayIndex(catstr
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4868 catfp
= BytesIO(catstr
);
4869 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4870 return listcatfiles
;
4872 create_alias_function("", __file_format_name__
, "StringToArrayIndex", ArchiveFileStringToArrayIndex
);
4874 def TarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4876 catfp
= PackArchiveFileFromTarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4877 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4878 return listcatfiles
;
4880 def ZipFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4882 catfp
= PackArchiveFileFromZipFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4883 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4884 return listcatfiles
;
4886 if(not rarfile_support
):
4887 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4890 if(rarfile_support
):
4891 def RarFileToArrayIndex(infile
, seekstart
=0, seekend
=0, listonly
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, returnfp
=False):
4893 catfp
= PackArchiveFileFromRarFile(infile
, catfp
, "auto", None, "crc32", [], formatspecs
, False, True);
4894 listcatfiles
= ArchiveFileToArrayIndex(catfp
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
);
4895 return listcatfiles
;
4897 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):
4898 outarray
= BytesIO();
4899 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, verbose
, True);
4900 listcatfiles
= ArchiveFileToArrayIndex(outarray
, seekstart
, seekend
, listonly
, skipchecksum
, formatspecs
, returnfp
)
4901 return listcatfiles
;
4903 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):
4904 compressionlist
= ['auto', 'gzip', 'bzip2', 'zstd', 'lz4', 'lzo', 'lzop', 'lzma', 'xz'];
4905 outextlist
= ['gz', 'bz2', 'zst', 'lz4', 'lzop', 'lzo', 'lzma', 'xz'];
4906 outextlistwd
= ['.gz', '.bz2', '.zst', '.lz4', 'lzop', '.lzo', '.lzma', '.xz'];
4907 if(isinstance(infile
, dict)):
4908 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4909 listcatfiles
= prelistcatfiles
['list'];
4911 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
4912 infile
= RemoveWindowsPath(infile
);
4914 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4915 listcatfiles
= prelistcatfiles
['list'];
4917 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
4918 if(outfile
!="-" and not hasattr(infile
, "read") and not hasattr(outfile
, "write")):
4919 outfile
= RemoveWindowsPath(outfile
);
4920 checksumtype
= checksumtype
.lower();
4921 if(not CheckSumSupport(checksumtype
, hashlib_guaranteed
)):
4922 checksumtype
="crc32";
4923 if(checksumtype
=="none"):
4925 if(not compression
or compression
or compression
=="catfile" or compression
==formatspecs
[2]):
4927 if(compression
not in compressionlist
and compression
is None):
4928 compression
= "auto";
4930 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
4931 if(outfile
!="-" and not hasattr(outfile
, "read") and not hasattr(outfile
, "write")):
4932 if(os
.path
.exists(outfile
)):
4934 if(not listcatfiles
):
4939 elif(hasattr(outfile
, "read") or hasattr(outfile
, "write")):
4941 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
4943 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
4946 fbasename
= os
.path
.splitext(outfile
)[0];
4947 fextname
= os
.path
.splitext(outfile
)[1];
4948 catfp
= CompressOpenFile(outfile
, compressionlevel
);
4949 catver
= formatspecs
[6];
4950 fileheaderver
= str(int(catver
.replace(".", "")));
4951 fileheader
= AppendNullByte(formatspecs
[1] + fileheaderver
, formatspecs
[5]);
4952 catfp
.write(fileheader
.encode('UTF-8'));
4953 lenlist
= len(listcatfiles
['ffilelist']);
4954 fnumfiles
= int(listcatfiles
['fnumfiles']);
4955 if(lenlist
>fnumfiles
or lenlist
<fnumfiles
):
4956 fnumfiles
= lenlist
;
4957 fnumfileshex
= format(int(fnumfiles
), 'x').lower();
4958 fnumfilesa
= AppendNullBytes([fnumfileshex
, checksumtype
], formatspecs
[5]);
4959 if(checksumtype
=="none" or checksumtype
==""):
4960 catfileheadercshex
= format(0, 'x').lower();
4961 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
4962 catfileheadercshex
= format(crc16(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
4963 elif(checksumtype
=="crc16_ccitt"):
4964 catfileheadercshex
= format(crc16_ccitt(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffff, '04x').lower();
4965 elif(checksumtype
=="adler32"):
4966 catfileheadercshex
= format(zlib
.adler32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
4967 elif(checksumtype
=="crc32"):
4968 catfileheadercshex
= format(crc32(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffff, '08x').lower();
4969 elif(checksumtype
=="crc64_ecma"):
4970 catfileheadercshex
= format(crc64_ecma(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4971 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
4972 catfileheadercshex
= format(crc64_iso(str(fileheader
+ fnumfilesa
).encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
4973 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
4974 checksumoutstr
= hashlib
.new(checksumtype
);
4975 checksumoutstr
.update(str(fileheader
+ fnumfilesa
).encode('UTF-8'));
4976 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
4978 catfileheadercshex
= format(0, 'x').lower();
4979 fnumfilesa
= fnumfilesa
+ AppendNullByte(catfileheadercshex
, formatspecs
[5]);
4980 catfp
.write(fnumfilesa
.encode('UTF-8'));
4983 os
.fsync(catfp
.fileno());
4984 except io
.UnsupportedOperation
:
4986 except AttributeError:
4992 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
4995 lcfx
= int(listcatfiles
['fnumfiles']);
5003 catfhstart
= catfp
.tell();
5004 if(re
.findall("^[.|/]", listcatfiles
['ffilelist'][reallcfi
]['fname'])):
5005 fname
= listcatfiles
['ffilelist'][reallcfi
]['fname'];
5007 fname
= "./"+listcatfiles
['ffilelist'][reallcfi
]['fname'];
5009 VerbosePrintOut(fname
);
5010 fheadersize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fheadersize']), 'x').lower();
5011 fsize
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fsize']), 'x').lower();
5012 flinkname
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
5013 fatime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fatime']), 'x').lower();
5014 fmtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmtime']), 'x').lower();
5015 fctime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fctime']), 'x').lower();
5016 fbtime
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fbtime']), 'x').lower();
5017 fmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmode']), 'x').lower();
5018 fchmode
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fchmode']), 'x').lower();
5019 fuid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fuid']), 'x').lower();
5020 funame
= listcatfiles
['ffilelist'][reallcfi
]['funame'];
5021 fgid
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fgid']), 'x').lower();
5022 fgname
= listcatfiles
['ffilelist'][reallcfi
]['fgname'];
5023 finode
= listcatfiles
['ffilelist'][reallcfi
]['finode'];
5024 flinkcount
= listcatfiles
['ffilelist'][reallcfi
]['flinkcount'];
5025 fdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fminor']), 'x').lower();
5026 fdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fmajor']), 'x').lower();
5027 frdev_minor
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frminor']), 'x').lower();
5028 frdev_major
= format(int(listcatfiles
['ffilelist'][reallcfi
]['frmajor']), 'x').lower();
5029 if(len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] and len(listcatfiles
['ffilelist'][reallcfi
]['fextralist'])>0):
5030 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
5031 if(len(extradata
) > 0):
5032 listcatfiles
['ffilelist'][reallcfi
]['fextrafields'] = len(extradata
);
5033 listcatfiles
['ffilelist'][reallcfi
]['fextralist'] = extradata
;
5034 extrafields
= format(int(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']), 'x').lower();
5035 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5036 if(len(extradata
)>0):
5037 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5038 extrasizelen
= format(len(extrasizestr
), 'x').lower();
5039 fcontents
= listcatfiles
['ffilelist'][reallcfi
]['fcontents'];
5041 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']==1 or listcatfiles
['ffilelist'][reallcfi
]['ftype']==2):
5042 getflinkpath
= listcatfiles
['ffilelist'][reallcfi
]['flinkname'];
5043 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
5044 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
5045 fheadersize
= format(int(flinkinfo
['fheadersize']), 'x').lower();
5046 fsize
= format(int(flinkinfo
['fsize']), 'x').lower();
5047 flinkname
= flinkinfo
['flinkname'];
5048 fatime
= format(int(flinkinfo
['fatime']), 'x').lower();
5049 fmtime
= format(int(flinkinfo
['fmtime']), 'x').lower();
5050 fctime
= format(int(flinkinfo
['fctime']), 'x').lower();
5051 fbtime
= format(int(flinkinfo
['fbtime']), 'x').lower();
5052 fmode
= format(int(flinkinfo
['fmode']), 'x').lower();
5053 fchmode
= format(int(flinkinfo
['fchmode']), 'x').lower();
5054 fuid
= format(int(flinkinfo
['fuid']), 'x').lower();
5055 funame
= flinkinfo
['funame'];
5056 fgid
= format(int(flinkinfo
['fgid']), 'x').lower();
5057 fgname
= flinkinfo
['fgname'];
5058 finode
= flinkinfo
['finode'];
5059 flinkcount
= flinkinfo
['flinkcount'];
5060 fdev_minor
= format(int(flinkinfo
['fminor']), 'x').lower();
5061 fdev_major
= format(int(flinkinfo
['fmajor']), 'x').lower();
5062 frdev_minor
= format(int(flinkinfo
['frminor']), 'x').lower();
5063 frdev_major
= format(int(flinkinfo
['frmajor']), 'x').lower();
5064 if(len(flinkinfo
['fextralist'])>flinkinfo
['fextrafields'] and len(flinkinfo
['fextralist'])>0):
5065 flinkinfo
['fextrafields'] = len(flinkinfo
['fextralist']);
5066 if(len(extradata
) > 0):
5067 flinkinfo
['fextrafields'] = len(extradata
);
5068 flinkinfo
['fextralist'] = extradata
;
5069 extrafields
= format(int(flinkinfo
['fextrafields']), 'x').lower();
5070 extrasizestr
= AppendNullByte(extrafields
, formatspecs
[5]);
5071 if(len(extradata
)>0):
5072 extrasizestr
= extrasizestr
+ AppendNullBytes(extradata
, formatspecs
[5]);
5073 extrasizelen
= format(len(extrasizestr
), 'x').lower();
5074 fcontents
= flinkinfo
['fcontents'];
5075 if(flinkinfo
['ftype']!=0 and flinkinfo
['ftype']!=7):
5077 fcontents
= fcontents
.encode('UTF-8');
5078 except AttributeError:
5080 ftypehex
= format(flinkinfo
['ftype'], 'x').lower();
5082 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=0 and listcatfiles
['ffilelist'][reallcfi
]['ftype']!=7):
5084 fcontents
= fcontents
.encode('UTF-8');
5085 except AttributeError:
5087 ftypehex
= format(listcatfiles
['ffilelist'][reallcfi
]['ftype'], 'x').lower();
5088 fcurfid
= format(curfid
, 'x').lower();
5089 if(not followlink
and finode
!=0):
5090 if(listcatfiles
['ffilelist'][reallcfi
]['ftype']!=1):
5091 fcurinode
= format(int(curinode
), 'x').lower();
5092 inodetofile
.update({curinode
: fname
});
5093 filetoinode
.update({fname
: curinode
});
5094 curinode
= curinode
+ 1;
5096 fcurinode
= format(int(filetoinode
[flinkname
]), 'x').lower();
5098 fcurinode
= format(int(curinode
), 'x').lower();
5099 curinode
= curinode
+ 1;
5100 curfid
= curfid
+ 1;
5101 catfileoutstr
= AppendNullBytes([ftypehex
, fname
, flinkname
, fsize
, fatime
, fmtime
, fctime
, fbtime
, fmode
, fuid
, funame
, fgid
, fgname
, fcurfid
, fcurinode
, flinkcount
, fdev_minor
, fdev_major
, frdev_minor
, frdev_major
, extrasizelen
, extrafields
], formatspecs
[5]);
5102 if(listcatfiles
['ffilelist'][reallcfi
]['fextrafields']>0):
5103 extrafieldslist
= [];
5105 exil
= listcatfiles
['ffilelist'][reallcfi
]['fextrafields'];
5107 extrafieldslist
.append(listcatfiles
['ffilelist'][reallcfi
]['fextralist']);
5109 catfileoutstr
+= AppendNullBytes([extrafieldslist
], formatspecs
[5]);
5110 catfileoutstr
+= AppendNullBytes([checksumtype
], formatspecs
[5]);
5111 catfhend
= (catfp
.tell() - 1) + len(catfileoutstr
);
5112 catfcontentstart
= catfp
.tell() + len(catfileoutstr
);
5113 if(checksumtype
=="none" or checksumtype
==""):
5114 catfileheadercshex
= format(0, 'x').lower();
5115 catfilecontentcshex
= format(0, 'x').lower();
5116 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5117 catfileheadercshex
= format(crc16("".encode('UTF-8')) & 0xffff, '04x').lower();
5118 catfilecontentcshex
= format(crc16(fcontents
) & 0xffff, '04x').lower();
5119 elif(checksumtype
=="crc16_ccitt"):
5120 catfileheadercshex
= format(crc16_ccitt("".encode('UTF-8')) & 0xffff, '04x').lower();
5121 catfilecontentcshex
= format(crc16_ccitt(fcontents
) & 0xffff, '04x').lower();
5122 elif(checksumtype
=="adler32"):
5123 catfileheadercshex
= format(zlib
.adler32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5124 catfilecontentcshex
= format(zlib
.adler32(fcontents
) & 0xffffffff, '08x').lower();
5125 elif(checksumtype
=="crc32"):
5126 catfileheadercshex
= format(crc32("".encode('UTF-8')) & 0xffffffff, '08x').lower();
5127 catfilecontentcshex
= format(crc32(fcontents
) & 0xffffffff, '08x').lower();
5128 elif(checksumtype
=="crc64_ecma"):
5129 catfileheadercshex
= format(crc64_ecma("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5130 catfilecontentcshex
= format(crc64_ecma(fcontents
) & 0xffffffffffffffff, '016x').lower();
5131 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5132 catfileheadercshex
= format(crc64_iso("".encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5133 catfilecontentcshex
= format(crc64_iso(fcontents
) & 0xffffffffffffffff, '016x').lower();
5134 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5135 checksumoutstr
= hashlib
.new(checksumtype
);
5136 checksumoutstr
.update("".encode('UTF-8'));
5137 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5138 checksumoutstr
= hashlib
.new(checksumtype
);
5139 checksumoutstr
.update(fcontents
);
5140 catfilecontentcshex
= checksumoutstr
.hexdigest().lower();
5142 catfileheadercshex
= format(0, 'x').lower();
5143 catfilecontentcshex
= format(0, 'x').lower();
5144 tmpfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5145 catheaersize
= format(int(len(tmpfileoutstr
) - 1), 'x').lower()
5146 catfileoutstr
= AppendNullByte(catheaersize
, formatspecs
[5]) + catfileoutstr
;
5147 if(checksumtype
=="none" or checksumtype
==""):
5148 catfileheadercshex
= format(0, 'x').lower();
5149 elif(checksumtype
=="crc16" or checksumtype
=="crc16_ansi" or checksumtype
=="crc16_ibm"):
5150 catfileheadercshex
= format(crc16(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5151 elif(checksumtype
=="crc16_ccitt"):
5152 catfileheadercshex
= format(crc16_ccitt(catfileoutstr
.encode('UTF-8')) & 0xffff, '04x').lower();
5153 elif(checksumtype
=="adler32"):
5154 catfileheadercshex
= format(zlib
.adler32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5155 elif(checksumtype
=="crc32"):
5156 catfileheadercshex
= format(crc32(catfileoutstr
.encode('UTF-8')) & 0xffffffff, '08x').lower();
5157 elif(checksumtype
=="crc64_ecma"):
5158 catfileheadercshex
= format(crc64_ecma(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5159 elif(checksumtype
=="crc64" or checksumtype
=="crc64_iso"):
5160 catfileheadercshex
= format(crc64_iso(catfileoutstr
.encode('UTF-8')) & 0xffffffffffffffff, '016x').lower();
5161 elif(CheckSumSupportAlt(checksumtype
, hashlib_guaranteed
)):
5162 checksumoutstr
= hashlib
.new(checksumtype
);
5163 checksumoutstr
.update(catfileoutstr
.encode('UTF-8'));
5164 catfileheadercshex
= checksumoutstr
.hexdigest().lower();
5166 catfileheadercshex
= format(0, 'x').lower();
5167 catfileoutstr
= catfileoutstr
+ AppendNullBytes([catfileheadercshex
, catfilecontentcshex
], formatspecs
[5]);
5168 catfileoutstrecd
= catfileoutstr
.encode('UTF-8');
5169 nullstrecd
= formatspecs
[5].encode('UTF-8');
5170 catfileout
= catfileoutstrecd
+ fcontents
+ nullstrecd
;
5171 catfcontentend
= (catfp
.tell() - 1) + len(catfileout
);
5172 catfp
.write(catfileout
);
5175 os
.fsync(catfp
.fileno());
5176 except io
.UnsupportedOperation
:
5178 except AttributeError:
5181 reallcfi
= reallcfi
+ 1;
5182 if(outfile
=="-" or hasattr(outfile
, "read") or hasattr(outfile
, "write")):
5183 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
5186 os
.fsync(catfp
.fileno());
5187 except io
.UnsupportedOperation
:
5189 except AttributeError:
5193 if(hasattr(sys
.stdout
, "buffer")):
5194 shutil
.copyfileobj(catfp
, sys
.stdout
.buffer);
5196 shutil
.copyfileobj(catfp
, sys
.stdout
);
5197 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", outfile
)):
5198 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
5200 upload_file_to_ftp_file(catfp
, outfile
);
5201 elif(re
.findall(r
"^(sftp)\:\/\/", outfile
) and haveparamiko
):
5202 catfp
= CompressArchiveFile(catfp
, compression
, formatspecs
);
5205 upload_file_to_pysftp_file(catfp
, outfile
);
5207 upload_file_to_sftp_file(catfp
, outfile
);
5215 create_alias_function("RePack", __file_format_name__
, "", RePackArchiveFile
);
5217 def RePackArchiveFileFromString(catstr
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", skipchecksum
=False, extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5218 catfp
= BytesIO(catstr
);
5219 listcatfiles
= RePackArchiveFile(catfp
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
5220 return listcatfiles
;
5222 create_alias_function("RePack", __file_format_name__
, "FromString", RePackArchiveFileFromString
);
5224 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):
5225 outarray
= BytesIO();
5226 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, extradata
, formatspecs
, verbose
, True);
5227 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
5228 return listcatfiles
;
5230 create_alias_function("Pack", __file_format_name__
, "FromListDir", PackArchiveFileFromListDir
);
5232 def ArchiveFileArrayBase64Encode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5234 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5235 if(isinstance(infile
, dict)):
5236 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5237 listcatfiles
= prelistcatfiles
['list'];
5239 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5240 infile
= RemoveWindowsPath(infile
);
5242 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5243 listcatfiles
= prelistcatfiles
['list'];
5245 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5246 if(not listcatfiles
):
5248 lenlist
= len(listcatfiles
['ffilelist']);
5253 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
5256 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5257 lcfx
= listcatfiles
['fnumfiles'];
5259 lcfx
= int(listcatfiles
['fnumfiles']);
5260 if(lenlist
>lcfx
or lenlist
<lcfx
):
5263 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
5264 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64encode(listcatfiles
['ffilelist'][lcfi
]['fcontents']).decode("UTF-8");
5266 return listcatfiles
;
5268 create_alias_function("", __file_format_name__
, "ArrayBase64Encode", ArchiveFileArrayBase64Encode
);
5270 def ArchiveFileArrayBase64Decode(infile
, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5272 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5273 if(isinstance(infile
, dict)):
5274 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5275 listcatfiles
= prelistcatfiles
['list'];
5277 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5278 infile
= RemoveWindowsPath(infile
);
5280 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5281 listcatfiles
= prelistcatfiles
['list'];
5283 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5284 if(not listcatfiles
):
5286 lenlist
= len(listcatfiles
['ffilelist']);
5291 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
5294 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5295 lcfx
= listcatfiles
['fnumfiles'];
5297 lcfx
= int(listcatfiles
['fnumfiles']);
5298 if(lenlist
>lcfx
or lenlist
<lcfx
):
5301 if(listcatfiles
['ffilelist'][lcfi
]['fhascontents']):
5302 listcatfiles
['ffilelist'][lcfi
]['fcontents'] = base64
.b64decode(listcatfiles
['ffilelist'][lcfi
]['fcontents'].encode("UTF-8"));
5304 return listcatfiles
;
5306 create_alias_function("", __file_format_name__
, "ArrayBase64Decode", ArchiveFileArrayBase64Decode
);
5308 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):
5309 if(outdir
is not None):
5310 outdir
= RemoveWindowsPath(outdir
);
5312 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5313 if(isinstance(infile
, dict)):
5314 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5315 listcatfiles
= prelistcatfiles
['list'];
5317 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5318 infile
= RemoveWindowsPath(infile
);
5320 prelistcatfiles
= ArchiveFileToArrayIndex(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5321 listcatfiles
= prelistcatfiles
['list'];
5323 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, False, skipchecksum
, formatspecs
, returnfp
);
5324 if(not listcatfiles
):
5326 lenlist
= len(listcatfiles
['ffilelist']);
5331 if(seekend
>0 and seekend
<listcatfiles
['fnumfiles']):
5334 if(lenlist
>listcatfiles
['fnumfiles'] or lenlist
<listcatfiles
['fnumfiles']):
5335 lcfx
= listcatfiles
['fnumfiles'];
5337 lcfx
= int(listcatfiles
['fnumfiles']);
5338 if(lenlist
>lcfx
or lenlist
<lcfx
):
5345 userinfo
= pwd
.getpwuid(listcatfiles
['ffilelist'][lcfi
]['fuid']);
5346 funame
= userinfo
.pw_name
;
5355 groupinfo
= grp
.getgrgid(listcatfiles
['ffilelist'][lcfi
]['fgid']);
5356 fgname
= groupinfo
.gr_name
;
5362 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
5363 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==0 or listcatfiles
['ffilelist'][lcfi
]['ftype']==7):
5364 with
open(listcatfiles
['ffilelist'][lcfi
]['fname'], "wb") as fpc
:
5365 fpc
.write(listcatfiles
['ffilelist'][lcfi
]['fcontents'])
5368 os
.fsync(fpc
.fileno())
5369 except io
.UnsupportedOperation
:
5371 except AttributeError:
5373 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
5374 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
5375 if(preservepermissions
):
5376 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fchmode']);
5378 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
5379 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5381 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
5382 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
5383 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
5388 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
5389 funame
= userinfo
.pw_name
;
5398 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
5399 fgname
= groupinfo
.gr_name
;
5404 if(flinkinfo
['ftype'] == 0 or flinkinfo
['ftype'] == 7):
5405 with
open(listcatfiles
['ffilelist'][lcfi
]['fname'], "wb") as fpc
:
5406 fpc
.write(flinkinfo
['fcontents'])
5409 os
.fsync(fpc
.fileno())
5410 except io
.UnsupportedOperation
:
5412 except AttributeError:
5414 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
5415 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
5416 if(preservepermissions
):
5417 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5419 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
5420 if(flinkinfo
['ftype']==1):
5421 os
.link(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5422 if(flinkinfo
['ftype']==2):
5423 os
.symlink(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5424 if(flinkinfo
['ftype']==5):
5425 if(preservepermissions
):
5426 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5428 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname']);
5429 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
5430 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
5431 if(preservepermissions
):
5432 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5434 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
5435 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
5436 os
.mkfifo(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5438 os
.link(listcatfiles
['ffilelist'][lcfi
]['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5439 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5441 getflinkpath
= listcatfiles
['ffilelist'][lcfi
]['flinkname'];
5442 flinkid
= prelistcatfiles
['filetoid'][getflinkpath
];
5443 flinkinfo
= listcatfiles
['ffilelist'][flinkid
];
5448 userinfo
= pwd
.getpwuid(flinkinfo
['fuid']);
5449 funame
= userinfo
.pw_name
;
5458 groupinfo
= grp
.getgrgid(flinkinfo
['fgid']);
5459 fgname
= groupinfo
.gr_name
;
5464 if(flinkinfo
['ftype']==0 or flinkinfo
['ftype']==7):
5465 with
open(listcatfiles
['ffilelist'][lcfi
]['fname'], "wb") as fpc
:
5466 fpc
.write(flinkinfo
['fcontents'])
5469 os
.fsync(fpc
.fileno())
5470 except io
.UnsupportedOperation
:
5472 except AttributeError:
5474 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
5475 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
5476 if(preservepermissions
):
5477 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5479 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
5480 if(flinkinfo
['ftype']==1):
5481 os
.link(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5482 if(flinkinfo
['ftype']==2):
5483 os
.symlink(flinkinfo
['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5484 if(flinkinfo
['ftype']==5):
5485 if(preservepermissions
):
5486 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5488 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname']);
5489 if(hasattr(os
, "chown") and funame
==flinkinfo
['funame'] and fgname
==flinkinfo
['fgname'] and preservepermissions
):
5490 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fuid'], flinkinfo
['fgid']);
5491 if(preservepermissions
):
5492 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5494 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (flinkinfo
['fatime'], flinkinfo
['fmtime']));
5495 if(flinkinfo
['ftype']==6 and hasattr(os
, "mkfifo")):
5496 os
.mkfifo(listcatfiles
['ffilelist'][lcfi
]['fname'], flinkinfo
['fchmode']);
5498 os
.symlink(listcatfiles
['ffilelist'][lcfi
]['flinkname'], listcatfiles
['ffilelist'][lcfi
]['fname']);
5499 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==5):
5500 if(preservepermissions
):
5501 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fchmode']);
5503 os
.mkdir(listcatfiles
['ffilelist'][lcfi
]['fname']);
5504 if(hasattr(os
, "chown") and funame
==listcatfiles
['ffilelist'][lcfi
]['funame'] and fgname
==listcatfiles
['ffilelist'][lcfi
]['fgname'] and preservepermissions
):
5505 os
.chown(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fuid'], listcatfiles
['ffilelist'][lcfi
]['fgid']);
5506 if(preservepermissions
):
5507 os
.chmod(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fchmode']);
5509 os
.utime(listcatfiles
['ffilelist'][lcfi
]['fname'], (listcatfiles
['ffilelist'][lcfi
]['fatime'], listcatfiles
['ffilelist'][lcfi
]['fmtime']));
5510 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==6 and hasattr(os
, "mkfifo")):
5511 os
.mkfifo(listcatfiles
['ffilelist'][lcfi
]['fname'], listcatfiles
['ffilelist'][lcfi
]['fchmode']);
5514 return listcatfiles
['ffilelist']['catfp'];
5518 create_alias_function("UnPack", __file_format_name__
, "", UnPackArchiveFile
);
5520 if(hasattr(shutil
, "register_unpack_format")):
5521 def UnPackArchiveFileFunc(archive_name
, extract_dir
=None, **kwargs
):
5522 return UnPackArchiveFile(archive_name
, extract_dir
, False, 0, 0, False, __file_format_delimiter__
, False, False);
5523 create_alias_function("UnPack", __file_format_name__
, "Func", UnPackArchiveFileFunc
);
5525 def UnPackArchiveFileString(catstr
, outdir
=None, followlink
=False, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5526 catfp
= BytesIO(catstr
);
5527 listcatfiles
= UnPackArchiveFile(catfp
, outdir
, followlink
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5528 return listcatfiles
;
5530 create_alias_function("UnPack", __file_format_name__
, "String", UnPackArchiveFileString
);
5532 def ArchiveFileListFiles(infile
, seekstart
=0, seekend
=0, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5533 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5534 if(isinstance(infile
, dict)):
5535 listcatfiles
= infile
;
5537 if(infile
!="-" and not hasattr(infile
, "read") and not hasattr(infile
, "write")):
5538 infile
= RemoveWindowsPath(infile
);
5539 listcatfiles
= ArchiveFileToArray(infile
, seekstart
, seekend
, True, skipchecksum
, formatspecs
, returnfp
);
5540 if(not listcatfiles
):
5542 lenlist
= len(listcatfiles
['ffilelist']);
5547 returnval
.update({lcfi
: listcatfiles
['ffilelist'][lcfi
]['fname']});
5549 VerbosePrintOut(listcatfiles
['ffilelist'][lcfi
]['fname']);
5551 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' } };
5552 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'];
5553 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==1):
5554 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " link to " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
5555 if(listcatfiles
['ffilelist'][lcfi
]['ftype']==2):
5556 printfname
= listcatfiles
['ffilelist'][lcfi
]['fname'] + " -> " + listcatfiles
['ffilelist'][lcfi
]['flinkname'];
5557 fuprint
= listcatfiles
['ffilelist'][lcfi
]['funame'];
5558 if(len(fuprint
)<=0):
5559 fuprint
= listcatfiles
['ffilelist'][lcfi
]['fuid'];
5560 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgname'];
5561 if(len(fgprint
)<=0):
5562 fgprint
= listcatfiles
['ffilelist'][lcfi
]['fgid'];
5563 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
));
5566 return listcatfiles
['catfp'];
5570 create_alias_function("", __file_format_name__
, "ListFiles", ArchiveFileListFiles
);
5572 def ArchiveFileStringListFiles(catstr
, followlink
=False, skipchecksum
=False, formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5573 catfp
= BytesIO(catstr
);
5574 listcatfiles
= UnPackArchiveFile(catfp
, None, followlink
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5575 return listcatfiles
;
5577 create_alias_function("", __file_format_name__
, "StringListFiles", ArchiveFileListFiles
);
5579 def TarFileListFiles(infile
, verbose
=False, returnfp
=False):
5580 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5583 if(hasattr(sys
.stdin
, "buffer")):
5584 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5586 shutil
.copyfileobj(sys
.stdin
, infile
);
5591 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
5592 infile
= download_file_from_http_file(infile
);
5597 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
5598 infile
= download_file_from_ftp_file(infile
);
5603 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5605 elif(os
.path
.exists(infile
) and os
.path
.isfile(infile
)):
5607 if(not tarfile
.is_tarfile(infile
)):
5609 except AttributeError:
5610 if(not is_tarfile(infile
)):
5615 if(hasattr(infile
, "read") or hasattr(infile
, "write")):
5616 tarfp
= tarfile
.open(fileobj
=infile
, mode
="r");
5618 tarfp
= tarfile
.open(infile
, "r");
5619 except FileNotFoundError
:
5621 for member
in sorted(tarfp
.getmembers(), key
=lambda x
: x
.name
):
5622 returnval
.update({lcfi
: member
.name
});
5623 fpremode
= member
.mode
;
5624 ffullmode
= member
.mode
;
5628 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5630 elif(member
.isdev()):
5631 ffullmode
= member
.mode
;
5633 elif(member
.islnk()):
5634 ffullmode
= member
.mode
+ stat
.S_IFREG
;
5636 elif(member
.issym()):
5637 ffullmode
= member
.mode
+ stat
.S_IFLNK
;
5639 elif(member
.ischr()):
5640 ffullmode
= member
.mode
+ stat
.S_IFCHR
;
5642 elif(member
.isblk()):
5643 ffullmode
= member
.mode
+ stat
.S_IFBLK
;
5645 elif(member
.isdir()):
5646 ffullmode
= member
.mode
+ stat
.S_IFDIR
;
5648 elif(member
.isfifo()):
5649 ffullmode
= member
.mode
+ stat
.S_IFIFO
;
5651 elif(member
.issparse()):
5652 ffullmode
= member
.mode
;
5655 VerbosePrintOut(member
.name
);
5657 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' } };
5658 printfname
= member
.name
;
5660 printfname
= member
.name
+ " link to " + member
.linkname
;
5661 elif(member
.issym()):
5662 printfname
= member
.name
+ " -> " + member
.linkname
;
5663 fuprint
= member
.uname
;
5664 if(len(fuprint
)<=0):
5665 fuprint
= member
.uid
;
5666 fgprint
= member
.gname
;
5667 if(len(fgprint
)<=0):
5668 fgprint
= member
.gid
;
5669 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
));
5672 return listcatfiles
['catfp'];
5676 def ZipFileListFiles(infile
, verbose
=False, returnfp
=False):
5677 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5680 if(hasattr(sys
.stdin
, "buffer")):
5681 shutil
.copyfileobj(sys
.stdin
.buffer, infile
);
5683 shutil
.copyfileobj(sys
.stdin
, infile
);
5688 elif(re
.findall(r
"^(http|https)\:\/\/", infile
)):
5689 infile
= download_file_from_http_file(infile
);
5694 elif(re
.findall(r
"^(ftp|ftps)\:\/\/", infile
)):
5695 infile
= download_file_from_ftp_file(infile
);
5700 elif(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5704 if(not zipfile
.is_zipfile(infile
)):
5707 zipfp
= zipfile
.ZipFile(infile
, "r", allowZip64
=True);
5708 except FileNotFoundError
:
5712 ziptest
= zipfp
.testzip();
5714 VerbosePrintOut("Bad file found!");
5715 for member
in sorted(zipfp
.infolist(), key
=lambda x
: x
.filename
):
5716 if(not member
.is_dir()):
5717 fpremode
= int(stat
.S_IFREG
+ 438);
5718 elif(member
.is_dir()):
5719 fpremode
= int(stat
.S_IFDIR
+ 511);
5720 if(not member
.is_dir()):
5721 fmode
= int(stat
.S_IFREG
+ 438);
5722 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5723 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5724 elif(member
.is_dir()):
5725 fmode
= int(stat
.S_IFDIR
+ 511);
5726 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5727 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5728 returnval
.update({lcfi
: member
.filename
});
5730 VerbosePrintOut(member
.filename
);
5732 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' } };
5734 for fmodval
in str(oct(fmode
))[-3:]:
5735 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
5736 if(not member
.is_dir()):
5738 permissionstr
= "-" + permissionstr
;
5739 elif(member
.is_dir()):
5741 permissionstr
= "d" + permissionstr
;
5742 printfname
= member
.filename
;
5744 fuid
= int(os
.getuid());
5745 except AttributeError:
5750 fgid
= int(os
.getgid());
5751 except AttributeError:
5758 userinfo
= pwd
.getpwuid(os
.getuid());
5759 funame
= userinfo
.pw_name
;
5762 except AttributeError:
5770 groupinfo
= grp
.getgrgid(os
.getgid());
5771 fgname
= groupinfo
.gr_name
;
5774 except AttributeError:
5779 if(len(fuprint
)<=0):
5780 fuprint
= str(fuid
);
5782 if(len(fgprint
)<=0):
5783 fgprint
= str(fgid
);
5784 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
));
5787 return listcatfiles
['catfp'];
5791 if(not rarfile_support
):
5792 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
5793 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5794 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5797 if(rarfile_support
):
5798 def RarFileListFiles(infile
, verbose
=False, returnfp
=False):
5799 logging
.basicConfig(format
="%(message)s", stream
=sys
.stdout
, level
=logging
.DEBUG
);
5800 if(not os
.path
.exists(infile
) or not os
.path
.isfile(infile
)):
5802 if(not rarfile
.is_rarfile(infile
) and not rarfile
.is_rarfile_sfx(infile
)):
5806 rarfp
= rarfile
.RarFile(infile
, "r");
5807 rartest
= rarfp
.testrar();
5809 VerbosePrintOut("Bad file found!");
5810 for member
in sorted(rarfp
.infolist(), key
=lambda x
: x
.filename
):
5813 if(member
.host_os
== rarfile
.RAR_OS_UNIX
):
5816 member
.external_attr
5818 except AttributeError:
5820 elif(member
.host_os
== rarfile
.RAR_OS_WIN32
):
5823 member
.external_attr
5825 except AttributeError:
5830 if(is_unix
and member
.external_attr
!=0):
5831 fpremode
= int(member
.external_attr
);
5832 elif(member
.is_file()):
5833 fpremode
= int(stat
.S_IFREG
+ 438);
5834 elif(member
.is_symlink()):
5835 fpremode
= int(stat
.S_IFLNK
+ 438);
5836 elif(member
.is_dir()):
5837 fpremode
= int(stat
.S_IFDIR
+ 511);
5838 if(is_windows
and member
.external_attr
!=0):
5839 fwinattributes
= int(member
.external_attr
);
5841 fwinattributes
= int(0);
5842 if(is_unix
and member
.external_attr
!=0):
5843 fmode
= int(member
.external_attr
);
5844 fchmode
= int(stat
.S_IMODE(member
.external_attr
));
5845 ftypemod
= int(stat
.S_IFMT(member
.external_attr
));
5846 elif(member
.is_file()):
5847 fmode
= int(stat
.S_IFREG
+ 438);
5848 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFREG
+ 438)));
5849 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFREG
+ 438)));
5850 elif(member
.is_symlink()):
5851 fmode
= int(stat
.S_IFLNK
+ 438);
5852 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFLNK
+ 438)));
5853 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFLNK
+ 438)));
5854 elif(member
.is_dir()):
5855 fmode
= int(stat
.S_IFDIR
+ 511);
5856 fchmode
= int(stat
.S_IMODE(int(stat
.S_IFDIR
+ 511)));
5857 ftypemod
= int(stat
.S_IFMT(int(stat
.S_IFDIR
+ 511)));
5858 returnval
.update({lcfi
: member
.filename
});
5860 VerbosePrintOut(member
.filename
);
5862 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' } };
5864 for fmodval
in str(oct(fmode
))[-3:]:
5865 permissionstr
= permissionstr
+ permissions
['access'].get(fmodval
, '---');
5866 if(member
.is_file()):
5868 permissionstr
= "-" + permissionstr
;
5869 printfname
= member
.filename
;
5870 elif(member
.is_symlink()):
5872 permissionstr
= "l" + permissionstr
;
5873 printfname
= member
.name
+ " -> " + member
.read().decode("UTF-8");
5874 elif(member
.is_dir()):
5876 permissionstr
= "d" + permissionstr
;
5877 printfname
= member
.filename
;
5879 fuid
= int(os
.getuid());
5880 except AttributeError:
5885 fgid
= int(os
.getgid());
5886 except AttributeError:
5893 userinfo
= pwd
.getpwuid(os
.getuid());
5894 funame
= userinfo
.pw_name
;
5897 except AttributeError:
5905 groupinfo
= grp
.getgrgid(os
.getgid());
5906 fgname
= groupinfo
.gr_name
;
5909 except AttributeError:
5914 if(len(fuprint
)<=0):
5915 fuprint
= str(fuid
);
5917 if(len(fgprint
)<=0):
5918 fgprint
= str(fgid
);
5919 VerbosePrintOut(PrintPermissionString(fmode
, ftype
) + " " + str(str(fuprint
) + "/" + str(fgprint
) + " " + str(member
.file_size
).rjust(15) + " " + member
.mtime
.strftime('%Y-%m-%d %H:%M') + " " + printfname
));
5922 return listcatfiles
['catfp'];
5926 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):
5927 outarray
= BytesIO();
5928 packcat
= PackArchiveFile(infiles
, outarray
, dirlistfromtxt
, compression
, compressionlevel
, followlink
, checksumtype
, formatspecs
, False, True);
5929 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5930 return listcatfiles
;
5932 def ListDirListFilesAlt(infiles
, dirlistfromtxt
=False, followlink
=False, listonly
=True, seekstart
=0, seekend
=0, skipchecksum
=False, checksumtype
="crc32", formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5933 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, listonly
, checksumtype
, formatspecs
, verbose
);
5934 listcatfiles
= ArchiveFileListFiles(outarray
, seekstart
, seekend
, skipchecksum
, formatspecs
, verbose
, returnfp
);
5935 return listcatfiles
;
5937 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):
5938 outarray
= ListDirToArrayAlt(infiles
, dirlistfromtxt
, followlink
, False, checksumtype
, extradata
, formatspecs
, False);
5939 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, followlink
, checksumtype
, skipchecksum
, extradata
, formatspecs
, verbose
, returnfp
);
5940 return listcatfiles
;
5942 create_alias_function("Pack", __file_format_name__
, "FromListDirAlt", PackArchiveFileFromListDirAlt
);
5944 def PackArchiveFileFromTarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5945 outarray
= TarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
5946 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
5947 return listcatfiles
;
5949 create_alias_function("Pack", __file_format_name__
, "FromTarFileAlt", PackArchiveFileFromTarFileAlt
);
5951 def PackArchiveFileFromZipFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5952 outarray
= ZipFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
5953 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
5954 return listcatfiles
;
5956 create_alias_function("Pack", __file_format_name__
, "FromZipFileAlt", PackArchiveFileFromZipFileAlt
);
5958 if(not rarfile_support
):
5959 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5962 if(rarfile_support
):
5963 def PackArchiveFileFromRarFileAlt(infile
, outfile
, compression
="auto", compressionlevel
=None, checksumtype
="crc32", extradata
=[], formatspecs
=__file_format_list__
, verbose
=False, returnfp
=False):
5964 outarray
= RarFileToArrayAlt(infile
, False, checksumtype
, extradata
, formatspecs
, False);
5965 listcatfiles
= RePackArchiveFile(outarray
, outfile
, compression
, compressionlevel
, False, checksumtype
, False, extradata
, formatspecs
, verbose
, returnfp
);
5966 return listcatfiles
;
5968 create_alias_function("Pack", __file_format_name__
, "FromRarFileAlt", PackArchiveFileFromRarFileAlt
);
5970 def download_file_from_ftp_file(url
):
5971 urlparts
= urlparse(url
);
5972 file_name
= os
.path
.basename(urlparts
.path
);
5973 file_dir
= os
.path
.dirname(urlparts
.path
);
5974 if(urlparts
.username
is not None):
5975 ftp_username
= urlparts
.username
;
5977 ftp_username
= "anonymous";
5978 if(urlparts
.password
is not None):
5979 ftp_password
= urlparts
.password
;
5980 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
5981 ftp_password
= "anonymous";
5984 if(urlparts
.scheme
=="ftp"):
5986 elif(urlparts
.scheme
=="ftps"):
5990 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
5992 ftp_port
= urlparts
.port
;
5993 if(urlparts
.port
is None):
5996 ftp
.connect(urlparts
.hostname
, ftp_port
);
5997 except socket
.gaierror
:
5998 log
.info("Error With URL "+url
);
6000 except socket
.timeout
:
6001 log
.info("Error With URL "+url
);
6003 ftp
.login(urlparts
.username
, urlparts
.password
);
6004 if(urlparts
.scheme
=="ftps"):
6006 ftpfile
= BytesIO();
6007 ftp
.retrbinary("RETR "+urlparts
.path
, ftpfile
.write
);
6008 #ftp.storbinary("STOR "+urlparts.path, ftpfile.write);
6013 def download_file_from_ftp_string(url
):
6014 ftpfile
= download_file_from_ftp_file(url
);
6015 return ftpfile
.read();
6017 def upload_file_to_ftp_file(ftpfile
, url
):
6018 urlparts
= urlparse(url
);
6019 file_name
= os
.path
.basename(urlparts
.path
);
6020 file_dir
= os
.path
.dirname(urlparts
.path
);
6021 if(urlparts
.username
is not None):
6022 ftp_username
= urlparts
.username
;
6024 ftp_username
= "anonymous";
6025 if(urlparts
.password
is not None):
6026 ftp_password
= urlparts
.password
;
6027 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6028 ftp_password
= "anonymous";
6031 if(urlparts
.scheme
=="ftp"):
6033 elif(urlparts
.scheme
=="ftps"):
6037 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
6039 ftp_port
= urlparts
.port
;
6040 if(urlparts
.port
is None):
6043 ftp
.connect(urlparts
.hostname
, ftp_port
);
6044 except socket
.gaierror
:
6045 log
.info("Error With URL "+url
);
6047 except socket
.timeout
:
6048 log
.info("Error With URL "+url
);
6050 ftp
.login(urlparts
.username
, urlparts
.password
);
6051 if(urlparts
.scheme
=="ftps"):
6053 ftp
.storbinary("STOR "+urlparts
.path
, ftpfile
);
6058 def upload_file_to_ftp_string(ftpstring
, url
):
6059 ftpfileo
= BytesIO(ftpstring
);
6060 ftpfile
= upload_file_to_ftp_file(ftpfileo
, url
);
6064 def download_file_from_http_file(url
, headers
=geturls_headers_pycatfile_python_alt
):
6065 # Parse the URL to extract username and password if present
6066 parsed_url
= urlparse(url
);
6067 username
= parsed_url
.username
;
6068 password
= parsed_url
.password
;
6069 # Rebuild the URL without the username and password
6070 netloc
= parsed_url
.hostname
;
6072 netloc
+= ':' + str(parsed_url
.port
);
6073 rebuilt_url
= urlunparse((parsed_url
.scheme
, netloc
, parsed_url
.path
, parsed_url
.params
, parsed_url
.query
, parsed_url
.fragment
));
6075 # Use the requests library if available
6076 if username
and password
:
6077 response
= requests
.get(rebuilt_url
, headers
=headers
, auth
=(username
, password
));
6079 response
= requests
.get(rebuilt_url
, headers
=headers
);
6080 # Open a temporary file object and write the data
6081 temp_file
= BytesIO(response
.content
);
6083 # Build a Request object for urllib
6084 request
= Request(rebuilt_url
, headers
=headers
);
6085 # Create an opener object for handling URLs
6086 if username
and password
:
6087 # Create a password manager
6088 password_mgr
= HTTPPasswordMgrWithDefaultRealm();
6089 # Add the username and password
6090 password_mgr
.add_password(None, rebuilt_url
, username
, password
);
6091 # Create an authentication handler using the password manager
6092 auth_handler
= HTTPBasicAuthHandler(password_mgr
);
6093 # Build the opener with the authentication handler
6094 opener
= build_opener(auth_handler
);
6096 opener
= build_opener();
6097 # Open the URL using the custom opener
6098 response
= opener
.open(request
);
6099 data
= response
.read();
6100 # Write the data to a temporary file object
6101 temp_file
= BytesIO(data
);
6102 # Reset file pointer to the start
6104 # Return the temporary file object
6107 def download_file_from_http_string(url
, headers
=geturls_headers_pycatfile_python_alt
):
6108 httpfile
= download_file_from_http_file(url
, headers
);
6109 return ftpfile
.read();
6112 def download_file_from_sftp_file(url
):
6113 urlparts
= urlparse(url
);
6114 file_name
= os
.path
.basename(urlparts
.path
);
6115 file_dir
= os
.path
.dirname(urlparts
.path
);
6116 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
6118 sftp_port
= urlparts
.port
;
6119 if(urlparts
.port
is None):
6122 sftp_port
= urlparts
.port
;
6123 if(urlparts
.username
is not None):
6124 sftp_username
= urlparts
.username
;
6126 sftp_username
= "anonymous";
6127 if(urlparts
.password
is not None):
6128 sftp_password
= urlparts
.password
;
6129 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6130 sftp_password
= "anonymous";
6133 if(urlparts
.scheme
!="sftp"):
6135 ssh
= paramiko
.SSHClient();
6136 ssh
.load_system_host_keys();
6137 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
6139 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
6140 except paramiko
.ssh_exception
.SSHException
:
6142 except socket
.gaierror
:
6143 log
.info("Error With URL "+url
);
6145 except socket
.timeout
:
6146 log
.info("Error With URL "+url
);
6148 sftp
= ssh
.open_sftp();
6149 sftpfile
= BytesIO();
6150 sftp
.getfo(urlparts
.path
, sftpfile
);
6153 sftpfile
.seek(0, 0);
6156 def download_file_from_sftp_file(url
):
6160 def download_file_from_sftp_string(url
):
6161 sftpfile
= download_file_from_sftp_file(url
);
6162 return sftpfile
.read();
6164 def download_file_from_ftp_string(url
):
6168 def upload_file_to_sftp_file(sftpfile
, url
):
6169 urlparts
= urlparse(url
);
6170 file_name
= os
.path
.basename(urlparts
.path
);
6171 file_dir
= os
.path
.dirname(urlparts
.path
);
6172 sftp_port
= urlparts
.port
;
6173 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
6175 if(urlparts
.port
is None):
6178 sftp_port
= urlparts
.port
;
6179 if(urlparts
.username
is not None):
6180 sftp_username
= urlparts
.username
;
6182 sftp_username
= "anonymous";
6183 if(urlparts
.password
is not None):
6184 sftp_password
= urlparts
.password
;
6185 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6186 sftp_password
= "anonymous";
6189 if(urlparts
.scheme
!="sftp"):
6191 ssh
= paramiko
.SSHClient();
6192 ssh
.load_system_host_keys();
6193 ssh
.set_missing_host_key_policy(paramiko
.AutoAddPolicy());
6195 ssh
.connect(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
6196 except paramiko
.ssh_exception
.SSHException
:
6198 except socket
.gaierror
:
6199 log
.info("Error With URL "+url
);
6201 except socket
.timeout
:
6202 log
.info("Error With URL "+url
);
6204 sftp
= ssh
.open_sftp();
6205 sftp
.putfo(sftpfile
, urlparts
.path
);
6208 sftpfile
.seek(0, 0);
6211 def upload_file_to_sftp_file(sftpfile
, url
):
6215 def upload_file_to_sftp_string(sftpstring
, url
):
6216 sftpfileo
= BytesIO(sftpstring
);
6217 sftpfile
= upload_file_to_sftp_files(ftpfileo
, url
);
6221 def upload_file_to_sftp_string(url
):
6225 def download_file_from_pysftp_file(url
):
6226 urlparts
= urlparse(url
);
6227 file_name
= os
.path
.basename(urlparts
.path
);
6228 file_dir
= os
.path
.dirname(urlparts
.path
);
6229 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
6231 sftp_port
= urlparts
.port
;
6232 if(urlparts
.port
is None):
6235 sftp_port
= urlparts
.port
;
6236 if(urlparts
.username
is not None):
6237 sftp_username
= urlparts
.username
;
6239 sftp_username
= "anonymous";
6240 if(urlparts
.password
is not None):
6241 sftp_password
= urlparts
.password
;
6242 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6243 sftp_password
= "anonymous";
6246 if(urlparts
.scheme
!="sftp"):
6249 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
6250 except paramiko
.ssh_exception
.SSHException
:
6252 except socket
.gaierror
:
6253 log
.info("Error With URL "+url
);
6255 except socket
.timeout
:
6256 log
.info("Error With URL "+url
);
6258 sftp
= ssh
.open_sftp();
6259 sftpfile
= BytesIO();
6260 sftp
.getfo(urlparts
.path
, sftpfile
);
6263 sftpfile
.seek(0, 0);
6266 def download_file_from_pysftp_file(url
):
6270 def download_file_from_pysftp_string(url
):
6271 sftpfile
= download_file_from_pysftp_file(url
);
6272 return sftpfile
.read();
6274 def download_file_from_ftp_string(url
):
6278 def upload_file_to_pysftp_file(sftpfile
, url
):
6279 urlparts
= urlparse(url
);
6280 file_name
= os
.path
.basename(urlparts
.path
);
6281 file_dir
= os
.path
.dirname(urlparts
.path
);
6282 sftp_port
= urlparts
.port
;
6283 if(urlparts
.scheme
=="http" or urlparts
.scheme
=="https"):
6285 if(urlparts
.port
is None):
6288 sftp_port
= urlparts
.port
;
6289 if(urlparts
.username
is not None):
6290 sftp_username
= urlparts
.username
;
6292 sftp_username
= "anonymous";
6293 if(urlparts
.password
is not None):
6294 sftp_password
= urlparts
.password
;
6295 elif(urlparts
.password
is None and urlparts
.username
=="anonymous"):
6296 sftp_password
= "anonymous";
6299 if(urlparts
.scheme
!="sftp"):
6302 pysftp
.Connection(urlparts
.hostname
, port
=sftp_port
, username
=urlparts
.username
, password
=urlparts
.password
);
6303 except paramiko
.ssh_exception
.SSHException
:
6305 except socket
.gaierror
:
6306 log
.info("Error With URL "+url
);
6308 except socket
.timeout
:
6309 log
.info("Error With URL "+url
);
6311 sftp
= ssh
.open_sftp();
6312 sftp
.putfo(sftpfile
, urlparts
.path
);
6315 sftpfile
.seek(0, 0);
6318 def upload_file_to_pysftp_file(sftpfile
, url
):
6322 def upload_file_to_pysftp_string(sftpstring
, url
):
6323 sftpfileo
= BytesIO(sftpstring
);
6324 sftpfile
= upload_file_to_pysftp_files(ftpfileo
, url
);
6328 def upload_file_to_pysftp_string(url
):
6332 if(hasattr(shutil
, "register_archive_format")):
6333 # Register the packing format
6334 shutil
.register_archive_format(__file_format_name__
, PackArchiveFileFunc
, description
='Pack concatenated files');
6335 except shutil
.RegistryError
:
6339 if(hasattr(shutil
, "register_unpack_format")):
6340 # Register the unpacking format
6341 shutil
.register_unpack_format(__file_format_name__
, archivefile_extensions
, UnPackArchiveFileFunc
, description
='UnPack concatenated files');
6342 except shutil
.RegistryError
: