Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import uctypes
- import os
- import time
- # http://www.gnu.org/software/tar/manual/html_node/Standard.html
- TAR_HEADER = {
- "name": (uctypes.ARRAY | 0, uctypes.UINT8 | 100),
- "size": (uctypes.ARRAY | 124, uctypes.UINT8 | 11),
- }
- DIRTYPE = "adresar"
- REGTYPE = "soubor "
- def roundup(val, align):
- return (val + align - 1) & ~(align - 1)
- class FileSection:
- def __init__(self, f, content_len, aligned_len):
- self.f = f
- self.content_len = content_len
- self.align = aligned_len - content_len
- def read(self, sz=65536):
- if self.content_len == 0:
- return b""
- if sz > self.content_len:
- sz = self.content_len
- data = self.f.read(sz)
- sz = len(data)
- self.content_len -= sz
- return data
- def readinto(self, buf):
- if self.content_len == 0:
- return 0
- if len(buf) > self.content_len:
- buf = memoryview(buf)[: self.content_len]
- sz = self.f.readinto(buf)
- self.content_len -= sz
- return sz
- def skip(self):
- sz = self.content_len + self.align
- if sz:
- buf = bytearray(16)
- while sz:
- s = min(sz, 16)
- self.f.readinto(buf, s)
- sz -= s
- class TarInfo:
- def __str__(self):
- return "TarInfo(%r, %s, %d)" % (self.name, self.type, self.size)
- class TarFile:
- def __init__(self, name=None, fileobj=None):
- if fileobj:
- self.f = fileobj
- else:
- self.f = open(name, "rb")
- self.subf = None
- def next(self):
- if self.subf:
- self.subf.skip()
- buf = self.f.read(512)
- if not buf:
- return None
- h = uctypes.struct(uctypes.addressof(buf), TAR_HEADER, uctypes.LITTLE_ENDIAN)
- # Empty block means end of archive
- if h.name[0] == 0:
- return None
- d = TarInfo()
- d.name = str(h.name, "utf-8").rstrip("\0")
- d.size = int(bytes(h.size), 8)
- d.type = [REGTYPE, DIRTYPE][d.name[-1] == "/"]
- self.subf = d.subf = FileSection(self.f, d.size, roundup(d.size, 512))
- return d
- def __iter__(self):
- return self
- def __next__(self):
- v = self.next()
- if v is None:
- raise StopIteration
- return v
- def extractfile(self, tarinfo):
- return tarinfo.subf
- def unpack(tar_path):
- def copyfileobj(src, dest, length=512):
- if hasattr(src, "readinto"):
- buf = bytearray(length)
- while True:
- sz = src.readinto(buf)
- if not sz:
- break
- if sz == length:
- dest.write(buf)
- else:
- b = memoryview(buf)[:sz]
- dest.write(b)
- else:
- while True:
- buf = src.read(length)
- if not buf:
- break
- dest.write(buf)
- def exists(path):
- try:
- os.stat(path)
- return True
- except:
- return False
- t = TarFile(tar_path)
- for f in t:
- print("Rozbaluji {}: {}".format(f.type, f.name))
- if f.type == DIRTYPE:
- if f.name[-1:] == '/':
- name = f.name[:-1]
- else:
- name = f.name
- if not exists(name):
- os.mkdir(name)
- else:
- extracted = t.extractfile(f)
- with open(f.name, "wb") as fobj:
- copyfileobj(extracted, fobj)
- print("*****************************")
- print("*** Instalace Web IDE ***")
- print("*** v1.9.0 ***")
- print("*** ***")
- print("*** Milan Spacek 2024 ***")
- print("*** ***")
- print("*****************************")
- print()
- try:
- unpack("ide_1_20.tar")
- except:
- print("Chyba pri rozbalovani souboru")
- try:
- os.remove("ide_1_20.tar")
- os.remove("install_1_20.py")
- except:
- print("Nepodarilo se vymazat instalacni soubory")
- print()
- print("*******************************")
- print("*** Hotovo restartuji desku ***")
- print("*******************************")
- time.sleep_ms(1000)
- from machine import reset
- reset()
Advertisement
Add Comment
Please, Sign In to add comment