source: client/engine/RsyncLib.py @ af9a1d9

ogClonningEnginetest-python-scriptsticket-585ticket-693ticket-700
Last change on this file since af9a1d9 was 7260bdc2, checked in by Antonio Emmanuel Guerrero Silva <aguerrero@…>, 9 months ago

refs #585 Libraries convert to Python3

  • Property mode set to 100644
File size: 25.8 KB
Line 
1import subprocess
2import sys
3import os
4import shutil
5import time
6
7from engine.DiskLib import *
8from engine.FileSystemLib import *
9from engine.FileLib import *
10from engine.NetLib import *
11
12# Example usage:
13#rsync("-a", "-v", "source/", "destination/")
14def rsync(*args):
15    RSYNC = subprocess.check_output(["which", "rsync"]).decode().strip()
16    if sys.platform == "linux" and sys.maxsize <= 2**32 and RSYNC == "":
17        RSYNC = "/opt/opengnsys/bin/rsync"
18    subprocess.run([RSYNC] + list(args))
19
20def ogCreateFileImage():
21    SIZEREQUIRED = int(sys.argv[4])
22    if SIZEREQUIRED < 300000:
23        SIZEREQUIRED = 300000
24    KERNELVERSION = ".".join([str(int(num)) for num in platform.release().split(".")])
25
26    if sys.argv[1] == "CACHE" or sys.argv[1] == "cache":
27        IMGDIR = ogGetParentPath(sys.argv[1], "/" + sys.argv[2])
28        if sys.argv[3] == "img":
29            IMGEXT = "img"
30        else:
31            IMGEXT = "img.diff"
32        IMGFILE = f"{IMGDIR}/{os.path.basename('/' + sys.argv[2])}.{IMGEXT}"
33        if not os.path.exists(IMGDIR):
34            ogEcho("log session", f"      {MSG_HELP_ogMakeDir} \"{sys.argv[1]} {os.path.dirname('/' + sys.argv[2])}.\"")
35            ogMakeDir(sys.argv[1], os.path.dirname('/' + sys.argv[2]))
36            IMGDIR = ogGetParentPath(sys.argv[1], "/" + sys.argv[2])
37        DIRMOUNT = f"/tmp/{ogGetMountImageDir(sys.argv[2], sys.argv[3])}"
38        os.makedirs(DIRMOUNT, exist_ok=True)
39        LOOPDEVICE = subprocess.run(["losetup", "-f"], capture_output=True, text=True).stdout.strip()
40
41        if os.path.isfile(IMGFILE):
42            if os.path.isfile(f"{IMGFILE}.ant"):
43                if BACKUP == "true" or BACKUP == "TRUE":
44                    ogEcho("log session", f"     {MSG_SCRIPTS_FILE_RENAME} \"{IMGFILE}\" ->  \"{IMGFILE}.ant\".")
45                    shutil.copy2(IMGFILE, f"{IMGFILE}.ant")
46                    os.rename(f"{IMGFILE}.torrent", f"{IMGFILE}.torrent.ant")
47                    os.remove(f"{IMGFILE}.sum")
48            IMGSIZE = os.path.getsize(IMGFILE)
49            if IMGSIZE < SIZEREQUIRED:
50                ogEcho("log session", f"      {MSG_SYNC_RESIZE}")
51                print(f"      truncate --size=>{SIZEREQUIRED}k {IMGFILE}")
52                subprocess.run(["truncate", f"--size={SIZEREQUIRED}k", IMGFILE], capture_output=True, text=True)
53                if "ext4 filesystem" in subprocess.run(["file", IMGFILE], capture_output=True, text=True).stdout.lower():
54                    subprocess.run(["losetup", LOOPDEVICE, IMGFILE])
55                    print(f"      resize2fs -f {LOOPDEVICE}")
56                    subprocess.run(["resize2fs", "-f", LOOPDEVICE], capture_output=True, text=True)
57                else:
58                    print(f"      ogMountImage {sys.argv[1]} {sys.argv[2]} {sys.argv[3]}")
59                    ogMountImage(sys.argv[1], sys.argv[2], sys.argv[3])
60                    print(f"      btrfs filesystem resize max {DIRMOUNT}")
61                    subprocess.run(["btrfs", "filesystem", "resize", "max", DIRMOUNT], capture_output=True, text=True)
62        else:
63            open(IMGFILE, "w").close()
64            print(f"      truncate --size=>{SIZEREQUIRED}k {IMGFILE}")
65            subprocess.run(["truncate", f"--size={SIZEREQUIRED}k", IMGFILE], capture_output=True, text=True)
66            subprocess.run(["losetup", LOOPDEVICE, IMGFILE])
67            if KERNELVERSION < "3.07":
68                IMGFS = "EXT4"
69            else:
70                IMGFS = os.environ.get("IMGFS", "BTRFS")
71            if IMGFS == "EXT4":
72                print(f"      mkfs.ext4 -i 4096  -b 4096 -L {os.path.basename(sys.argv[2])} {LOOPDEVICE}")
73                subprocess.run(["mkfs.ext4", "-i", "4096", "-b", "4096", "-L", os.path.basename(sys.argv[2]), LOOPDEVICE], capture_output=True, text=True)
74            else:
75                print(f"      mkfs.btrfs  -L {os.path.basename(sys.argv[2])} {LOOPDEVICE}")
76                subprocess.run(["mkfs.btrfs", "-L", os.path.basename(sys.argv[2]), LOOPDEVICE], capture_output=True, text=True)
77        ogMountImage(sys.argv[1], sys.argv[2], sys.argv[3])
78        if not os.path.exists(IMGFILE + ".lock"):
79            open(IMGFILE + ".lock", "w").write("mounted")
80        if LOOPDEVICE:
81            subprocess.run(["losetup", "-d", LOOPDEVICE], capture_output=True, text=True)
82    else:
83        REPOIP = ogGetRepoIp()
84        print(f"      hose {REPOIP} 2009 --out sh -c \"echo -ne CREATE_IMAGE {sys.argv[2]} {sys.argv[3]} {SIZEREQUIRED} \"")
85        subprocess.run(["hose", REPOIP, "2009", "--out", "sh", "-c", f"echo -ne CREATE_IMAGE \"{sys.argv[2]}\" {sys.argv[3]} {SIZEREQUIRED}\""], capture_output=True, text=True)
86
87def ogCreateInfoImage():
88    FUNCNAME = ogCreateInfoImage.__name__
89    IMGTYPE = None
90    IMGDIRAUX = None
91    DIRMOUNT = None
92    DESTRSYNC = None
93    PASSWORD = None
94    USERRSYNC = None
95    ORIG = None
96    FSTYPE = None
97    PART = None
98    DIREMPTY = None
99    IMGLIST = None
100    IMGINFO = None
101    IMGACL = None
102    KERNELVERSION = None
103
104    if len(sys.argv) < 5 or (len(sys.argv) < 6 and sys.argv[3] != "img"):
105        ogHelp(FUNCNAME, f"{FUNCNAME} num_disk num_part [ REPO|CACHE ] [ base_image_name ] extension", f"base image -> {FUNCNAME} 1 2 img", f"diff image -> {FUNCNAME} 1 1 CACHE Windows7 diff")
106        return
107
108    if len(sys.argv) < 3:
109        ogRaiseError(OG_ERR_FORMAT, f"{MSG_FORMAT}: {FUNCNAME}  num_disk num_part [ REPO|CACHE ] [ base_image_name]  extension")
110        return
111
112    PART = ogDiskToDev(sys.argv[1], sys.argv[2])
113    if not PART:
114        return
115
116    ORIG = ogMount(sys.argv[1], sys.argv[2])
117    if not ORIG:
118        return
119
120    if sys.argv[3] == "img":
121        IMGTYPE = "img"
122    else:
123        if not ogCheckStringInGroup(sys.argv[5], "img diff"):
124            ogRaiseError(OG_ERR_FORMAT, MSG_SYNC_EXTENSION)
125            return
126        IMGTYPE = sys.argv[5]
127        if IMGTYPE == "diff":
128            IMGDIRAUX = ogGetMountImageDir(sys.argv[4], "img")
129            if sys.argv[3] == "CACHE" or sys.argv[3] == "cache":
130                DIRMOUNT = f"/tmp/{IMGDIRAUX}"
131                DESTRSYNC = DIRMOUNT
132            else:
133                if not REPOIP:
134                    REPOIP = ogGetRepoIp()
135                DIRMOUNT = f"{OGIMG}/{IMGDIRAUX}"
136                USERRSYNC = "opengnsys"
137                PASSWORD = "--password-file=/scripts/passrsync"
138                DESTRSYNC = f"{USERRSYNC}@{REPOIP}::ogimages/{IMGDIRAUX}"
139
140    FSTYPE = ogGetFsType(sys.argv[1], sys.argv[2])
141
142    DIREMPTY = "/tmp/empty$$"
143    IMGLIST = "/tmp/ogimg.list"
144    IMGINFO = "/tmp/ogimg.info"
145    IMGACL = "/tmp/ogimg.acl"
146
147    os.system(f"rm -f /tmp/ogimg.* 2>/dev/null")
148    os.system(f"rm -f {ORIG}/ogimg.* 2>/dev/null")
149
150    SIZEDATA = os.environ.get("SIZEDATA", "SIZEDATA")
151
152    KERNELVERSION = ".".join([str(int(num)) for num in platform.release().split(".")])
153    if KERNELVERSION < "3.07":
154        IMGFS = "EXT4"
155    else:
156        IMGFS = os.environ.get("IMGFS", "BTRFS")
157    with open(IMGINFO, "w") as f:
158        f.write(f"#{IMGFS}:NO:{FSTYPE}:{SIZEDATA}\n")
159
160    if IMGTYPE == "img":
161        print(f"      rsync -aHAXWvn --delete {ORIG}/ {DIREMPTY} >> {IMGINFO}")
162        subprocess.run(["rsync", "-aHAXWvn", "--delete", f"{ORIG}/", DIREMPTY], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
163        os.system(f"sed -i -e s/\"^sent.*.bytes\\/sec\"//g -e s/^total.*.speedup.*.$//g -e s/\"sending.*.list\"//g {IMGINFO}")
164        os.system(f"sed -i '/^\\.\\//d' {IMGINFO}")
165    else:
166        print(f"      rsync -aHAXWvn --delete {ORIG}/ {DESTRSYNC} a {IMGLIST}")
167        subprocess.run(["rsync", "-aHAXWvn", "--delete", f"{ORIG}/", DESTRSYNC], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
168        os.system(f"sed -i -e s/\"^sent.*.bytes\\/sec\"//g -e s/^total.*.speedup.*.$//g -e s/\"sending.*.list\"//g {IMGLIST}")
169        os.system(f"sed -i '/^\\.\\//d' {IMGLIST}")
170
171        with open(IMGINFO, "a") as f:
172            subprocess.run(["grep", "-e", "\\->", "-e", "\\=>", IMGLIST], stdout=f)
173            subprocess.run(["grep", "-e", "^deleting", IMGLIST], stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.decode().replace("deleting ", "").split("\n")
174            subprocess.run(["grep", "-v", "-e", "\\->", "-e", "\\=>", "-e", "^deleting", "-e", "^created", IMGLIST], stdout=f)
175
176        os.system(f"rm -f {IMGLIST}")
177
178        if subprocess.run(["grep", "-v", "-e", "^$", "-e", "^#", IMGINFO, "/tmp/ogimg.ln", "/tmp/ogimg.rm"], stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.decode().count("\n") == 0:
179            ogRaiseError(OG_ERR_NOTDIFFERENT, " ".join(sys.argv[1:]))
180            return
181
182    if FSTYPE == "NTFS":
183        print(f"      ntfs-3g.secaudit -b {PART} /")
184        subprocess.run(["ntfs-3g.secaudit", "-b", PART, "/"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
185
186def ogAclFilter():
187    FUNCNAME = ogAclFilter.__name__
188    IMGACL = "/tmp/ogimg.acl"
189    IMGINFO = "/tmp/ogimg.info"
190    FILES = "/tmp/files$$"
191    ACLTMP = "/tmp/acl$$.tmp"
192    ACLFILES = "/tmp/aclfiles$$"
193
194    # Ayuda
195    if len(sys.argv) == 2 and sys.argv[1] == "help":
196        ogHelp(FUNCNAME, FUNCNAME)
197        return
198
199    # comprobamos que existan los archivos de origen. Si no salimos sin error.
200    if not (os.path.isfile(IMGACL) and os.path.isfile(IMGINFO)):
201        return
202
203    with open(ACLTMP, "w") as f:
204        with open(IMGINFO, "r") as info_file:
205            for line in info_file:
206                line = line.strip()
207                if line.startswith("#") or line == "":
208                    continue
209                line_number = line.split(":")[0]
210                acl_lines = []
211                with open(ACLFILES, "r") as acl_file:
212                    acl_lines = acl_file.readlines()
213                end_line, start_line = None, None
214                for i, acl_line in enumerate(acl_lines):
215                    acl_line = acl_line.strip()
216                    if acl_line == "File" or acl_line == "Directory":
217                        if acl_lines[i-1].startswith(line_number):
218                            start_line = i
219                        if acl_lines[i+1].startswith(line_number):
220                            end_line = i
221                            break
222                if start_line is not None and end_line is not None:
223                    acl_lines = acl_lines[start_line+1:end_line]
224                    f.writelines(acl_lines)
225                    ogEcho("aclfilter", line)
226
227    shutil.copy2(ACLTMP, IMGACL)
228    os.remove(FILES)
229    os.remove(ACLTMP)
230    os.remove(ACLFILES)
231
232def ogRestoreInfoImage():
233    FUNCNAME = ogRestoreInfoImage.__name__
234    DEST = None
235    PART = None
236    IMGACL = "ogimg.acl"
237    IMGLN = "ogimg.ln"
238    IMGINFO = "ogimg.info"
239
240    # Ayuda o menos de 5 parametros y la imagen no es basica
241    if len(sys.argv) < 3 or (len(sys.argv) < 4 and sys.argv[3] != "img"):
242        ogHelp(FUNCNAME, f"{FUNCNAME} num_disk num_part", f"base image -> {FUNCNAME} 1 2", f"diff image -> {FUNCNAME} 1 1")
243        return
244
245    PART = ogDiskToDev(sys.argv[1], sys.argv[2])
246    if not PART:
247        return
248
249    DEST = ogMount(sys.argv[1], sys.argv[2])
250    if not DEST:
251        return
252
253    # Copiamos informacion de la imagen a /tmp (para basicas)
254    if os.path.isfile(f"{DEST}/{IMGINFO}"):
255        shutil.copy2(f"{DEST}/ogimg.*", "/tmp")
256
257    # Creamos o modificamos los enlaces.
258    # La imagen diferencial tiene ogimg.ln
259    # para la completa lo generamos con los enlaces que contengan /mnt/
260    if not os.path.isfile(f"/tmp/{IMGLN}"):
261        with open(f"/tmp/{IMGINFO}", "r") as info_file:
262            for line in info_file:
263                line = line.strip()
264                if "->" in line or "=>" in line:
265                    if "/mnt/" in line:
266                        with open(f"/tmp/{IMGLN}", "a") as ln_file:
267                            ln_file.write(line.split(">")[0] + "\n")
268
269    if os.path.isfile(f"/tmp/{IMGLN}"):
270        with open(f"/tmp/{IMGLN}", "r") as ln_file:
271            for line in ln_file:
272                line = line.strip()
273                ORIGLN = line.split("> ")[1]
274                if "/mnt/" in ORIGLN:
275                    ORIGLN = f"{DEST}/{ORIGLN.replace('/mnt/*/', '')}"
276                TYPELN = line.split(" ")[-1]
277                DESTLN = line.split(" ")[0]
278
279                if TYPELN == "-":
280                    OPTLN = "-s"
281                else:
282                    OPTLN = ""
283
284                os.chdir(f"{DEST}/{os.path.dirname(DESTLN)}")
285                os.remove(os.path.basename(DESTLN))
286                os.symlink(ORIGLN, os.path.basename(DESTLN))
287                print(".", end="")
288        print("")
289
290    os.chdir("/")
291
292def ogRestoreAclImage():
293    PART = None
294    IMGACL = "ogimg.acl"
295
296    if len(sys.argv) < 3 or (len(sys.argv) < 4 and sys.argv[3] != "img"):
297        ogHelp(FUNCNAME, f"{FUNCNAME} num_disk num_part", f"base image -> {FUNCNAME} 1 2", f"diff image -> {FUNCNAME} 1 1")
298        return
299
300    PART = ogDiskToDev(sys.argv[1], sys.argv[2])
301    if not PART:
302        return
303
304    # Restauramos acl
305    if ogGetFsType(sys.argv[1], sys.argv[2]) == "NTFS" and os.path.isfile(f"/tmp/{IMGACL}"):
306        os.chdir("/")
307        ogUnmount(sys.argv[1], sys.argv[2])
308        print(f"      ntfs-3g.secaudit -se {PART} /tmp/{IMGACL}")
309        subprocess.run(["ntfs-3g.secaudit", "-se", PART, f"/tmp/{IMGACL}"], capture_output=True, text=True)
310        # Para evitar que de falso error
311        print("")
312
313def ogSyncCreate():
314    ORIG = ogMount(sys.argv[1], sys.argv[2])
315    DIRAUX = ogGetMountImageDir(sys.argv[4], sys.argv[5])
316    DIRMOUNT = f"/tmp/{DIRAUX}"
317    DESTRSYNC = None
318    USERRSYNC = None
319    PASSWORD = None
320    OPTRSYNC = None
321    RETVAL = None
322
323    if sys.argv[3] == "CACHE" or sys.argv[3] == "cache":
324        DESTRSYNC = DIRMOUNT
325    else:
326        if not REPOIP:
327            REPOIP = ogGetRepoIp()
328        PASSWORD = "--password-file=/scripts/passrsync"
329        if ogrsyncz == "true":
330            OPTRSYNC = "z "
331        if ogrsyncw == "true":
332            OPTRSYNC = f"W{OPTRSYNC}"
333        USERRSYNC = "opengnsys"
334        DESTRSYNC = f"{USERRSYNC}@{REPOIP}::ogimages/{DIRMOUNT}"
335
336    print(f"      rsync -aHAX{OPTRSYNC} --progress --inplace --delete {ORIG}/ {DESTRSYNC}")
337    subprocess.run(["rsync", "-aHAX" + OPTRSYNC, "--progress", "--inplace", "--delete", f"{ORIG}/", DESTRSYNC], stderr=subprocess.PIPE, shell=True)
338
339    print(f"      rsync -aHAX{OPTRSYNC} --inplace /tmp/ogimg* {DESTRSYNC}")
340    subprocess.run(["rsync", "-aHAX" + OPTRSYNC, "--inplace", "/tmp/ogimg*", DESTRSYNC], stderr=subprocess.PIPE, shell=True)
341
342    return RETVAL
343
344def ogSyncRestore():
345    DIRMOUNT = ogGetMountImageDir(sys.argv[2], sys.argv[3])
346    DESTRSYNC = ogGetMountPoint(sys.argv[4], sys.argv[5])
347
348    # Borramos ficheros de informacion de restauraciones antiguas
349    os.system(f"rm -rf {DESTRSYNC}/ogimg.*")
350    os.system("rm -rf /tmp/ogimg.*")
351
352    # Origen y destino de la sincronizacion y en REPO opciones rsync
353    if sys.argv[1] == "CACHE" or sys.argv[1] == "cache":
354        ORIG = f"/tmp/{DIRMOUNT}"
355    else:
356        REPOIP = ogGetRepoIp()
357        PASSWORD = "--password-file=/scripts/passrsync"
358        OPTRSYNC = ""
359        if ogrsyncz == "true":
360            OPTRSYNC += "z "
361        if ogrsyncw == "true":
362            OPTRSYNC += "W" + OPTRSYNC
363        USERRSYNC = "opengnsys"
364        ORIG = f"{USERRSYNC}@{REPOIP}::ogimages/{DIRMOUNT}"
365
366    # Opciones rsync en cache y repo
367    # Para la imagen basica, opcion de borrar archivos de la particion que no existen en la imagen
368    if sys.argv[3] == "img" and ogrsyncdel != "false":
369        OPTRSYNC += "--delete"
370
371    # Nos traemos listado ficheros y bajamos la imagen
372    ogEcho("log session", f"      {MSG_SYNC_RESTORE}")
373
374    # Si la imagen es diferencial nos traemos los archivos de informacion de la imagen.
375    if sys.argv[3] == "diff":
376        # Lista de archivos a copiar:
377        IMGINFO = "ogimg.info"
378        FILESFROM = f"--files-from=/tmp/{IMGINFO}"
379
380        print(f"      rsync -aHAX{OPTRSYNC} --progress {ORIG}/ogimg* /tmp")
381        subprocess.run(["rsync", "-aHAX" + OPTRSYNC, "--progress", f"{ORIG}/ogimg*", "/tmp"])
382
383        # Borramos linea de información de la imagen, sino busca un fichero con ese nombre
384        os.system("sed -i '/^#/d' /tmp/{IMGINFO}")
385
386        os.chdir(DESTRSYNC)
387        # Diferencial: Borramos archivos sobrantes.
388        ogEcho("log session", f"      {MSG_SYNC_DELETE}")
389        os.system(f"sed -e s/^/\"/g -e s/$/\"/g \"/tmp/ogimg.rm\" 2>/dev/null | xargs rm -rf")
390
391    print(f"      rsync -aHAX{OPTRSYNC} --progress {FILESFROM} {ORIG}/ {DESTRSYNC}")
392    subprocess.run(["rsync", "-aHAX" + OPTRSYNC, "--progress", FILESROM, f"{ORIG}/", DESTRSYNC], stderr=subprocess.PIPE, shell=True)
393    RETVAL = subprocess.PIPESTATUS[0]
394    os.chdir("/")
395
396def ogMountImage(repo_cache, image_name, extension=None):
397    FUNCNAME = ogMountImage.__name__
398    if repo_cache == "help":
399        ogHelp(FUNCNAME, f"{FUNCNAME} [ REPO|CACHE ] image_name [ extension ]", f"{FUNCNAME} REPO Ubuntu12", f"{FUNCNAME} CACHE Windows7 diff")
400        return
401
402    if len(sys.argv) < 2:
403        ogRaiseError(OG_ERR_FORMAT, f"{MSG_FORMAT}: {FUNCNAME} [ REPO|CACHE ]  image_name [ extension ]")
404        return
405
406    if not extension or extension == "img":
407        IMGEXT = "img"
408    else:
409        IMGEXT = "img.diff"
410
411    DIRMOUNT = ogGetMountImageDir(image_name, IMGEXT.split(".")[1])
412
413    if repo_cache == "REPO" or repo_cache == "repo":
414        REPOIP = ogGetRepoIp()
415        print(f"      hose {REPOIP} 2009 --out sh -c \"echo -ne MOUNT_IMAGE {image_name} {IMGEXT.split('.')[1]}\"")
416        return f"{OGIMG}/{DIRMOUNT}"
417    else:
418        # Check if already mounted
419        if subprocess.run(["df"], capture_output=True, text=True).stdout.count(f"{DIRMOUNT}\n") > 0:
420            return f"/tmp/{DIRMOUNT}"
421
422        IMGFILE = ogGetPath(repo_cache, f"/{image_name}.{IMGEXT}")
423        if not IMGFILE:
424            ogRaiseError(OG_ERR_NOTFOUND, f"{repo_cache} {image_name}.{IMGEXT}")
425            return
426
427        os.makedirs(f"/tmp/{DIRMOUNT}", exist_ok=True)
428
429        if "ext4 filesystem" in subprocess.run(["file", IMGFILE], capture_output=True, text=True).stdout.lower():
430            print(f"      mount -t ext4 -o loop {IMGFILE} /tmp/{DIRMOUNT}")
431            subprocess.run(["mount", "-t", "ext4", "-o", "loop", IMGFILE, f"/tmp/{DIRMOUNT}"], capture_output=True, text=True)
432        else:
433            print(f"      mount -o compress=lzo {IMGFILE} /tmp/{DIRMOUNT}")
434            subprocess.run(["mount", "-o", "compress=lzo", IMGFILE, f"/tmp/{DIRMOUNT}"], capture_output=True, text=True)
435
436        if subprocess.run(["mount"], capture_output=True, text=True).stdout.count(f"/tmp/{DIRMOUNT}\n") == 0:
437            ogRaiseError(OG_ERR_DONTMOUNT_IMAGE, f"{repo_cache} {image_name} {extension}")
438            return
439
440        return f"/tmp/{DIRMOUNT}"
441   
442def ogUnmountImage():
443    FUNCNAME = ogUnmountImage.__name__
444    IMGTYPE = None
445    DIRMOUNT = None
446
447    if len(sys.argv) < 2 or (len(sys.argv) < 3 and sys.argv[2] != "img"):
448        ogHelp(FUNCNAME, f"{FUNCNAME} [ REPO|CACHE ] image_name [ extension ]", f"{FUNCNAME} REPO Ubuntu12", f"{FUNCNAME} CACHE Windows7 diff")
449        return
450
451    if not sys.argv[3] or sys.argv[3] == "img":
452        IMGTYPE = "img"
453    else:
454        IMGTYPE = sys.argv[3]
455
456    if sys.argv[1] == "CACHE" or sys.argv[1] == "cache":
457        DIRMOUNT = f"/tmp/{ogGetMountImageDir(sys.argv[2], IMGTYPE)}"
458        subprocess.run(["umount", DIRMOUNT], capture_output=True, text=True)
459        subprocess.run(["rmdir", DIRMOUNT], capture_output=True, text=True)
460        if os.path.exists(f"{IMGFILE}.lock"):
461            os.system(f"sed -i s/\"mounted\"//g {IMGFILE}.lock")
462    else:
463        if not REPOIP:
464            REPOIP = ogGetRepoIp()
465        print(f"      hose {REPOIP} 2009 --out sh -c \"echo -ne UMOUNT_IMAGE {sys.argv[2]} {IMGTYPE}\"")
466        subprocess.run(["hose", REPOIP, "2009", "--out", "sh", "-c", f"echo -ne UMOUNT_IMAGE \"{sys.argv[2]}\" {IMGTYPE}\""], capture_output=True, text=True)
467
468def ogGetMountImageDir(image_name, extension=None):
469    FUNCNAME = ogGetMountImageDir.__name__
470    if image_name == "help":
471        ogHelp(FUNCNAME, f"{FUNCNAME} image_name [ extension ]", f"{FUNCNAME} Ubuntu12", f"{FUNCNAME} Windows7 diff")
472        return
473
474    if len(sys.argv) < 2:
475        ogRaiseError(OG_ERR_FORMAT, f"{MSG_FORMAT}: {FUNCNAME} image_name [ extension ]")
476        return
477
478    DIRMOUNT = f"mount/{image_name}"
479    if extension == "diff":
480        DIRMOUNT = f"{DIRMOUNT}.diff"
481
482    return DIRMOUNT
483
484def ogWaitSyncImage():
485    SIZE = int(sys.argv[5]) if len(sys.argv) >= 6 else 300000
486    STATE = sys.argv[4]
487    ogCheckStringInGroup(STATE, "mounted reduced") or return ogRaiseError(OG_ERR_FORMAT, "STATE = [ mounted | reduced ]")
488
489    IMGDIR = ogGetParentPath(sys.argv[1], f"/{sys.argv[2]}")
490    IMGEXT = "img" if sys.argv[3] == "img" else "img.diff"
491    LOCKFILE = f"{IMGDIR}/{os.path.basename(f'/{sys.argv[2]}')}.{IMGEXT}.lock"
492
493    if sys.argv[1] == "CACHE" or sys.argv[1] == "cache":
494        DIRMOUNT = f"/tmp/{ogGetMountImageDir(sys.argv[2], sys.argv[3])}"
495    else:
496        DIRMOUNT = f"{OGIMG}/{ogGetMountImageDir(sys.argv[2], sys.argv[3])}"
497
498    print(f"      {MSG_SYNC_SLEEP}: {DIRMOUNT}")
499    print("      #")
500
501    TIMEOUT = SIZE // CREATESPEED
502    if TIMEOUT < 60:
503        TIMEOUT = 60
504
505    while True:
506        if STATE == "mounted" and os.path.isfile(f"{DIRMOUNT}/ogimg.info"):
507            ogEcho("log session", "")
508            return 0
509
510        TIMEAUX = SECONDS - TIME
511        if TIMEAUX >= TIMEOUT:
512            return ogRaiseError(OG_ERR_DONTMOUNT_IMAGE, f"{sys.argv[3]} {sys.argv[4]} {IMGEXT}: time_out.")
513
514        print("#")
515        time.sleep(5)
516
517    print("")
518
519def ogReduceImage():
520    FUNCNAME = ogReduceImage.__name__
521    IMGEXT = None
522    DIRMOUNT = None
523    AVAILABLE = None
524    USED = None
525    IMGDIR = None
526    IMGFILE = None
527    ENDSIZE = None
528    LOOPDEVICE = None
529
530    if len(sys.argv) < 2 or (len(sys.argv) < 3 and sys.argv[3] != "img"):
531        ogHelp(FUNCNAME, f"{FUNCNAME} [ REPO|CACHE ] image_name [ extension ]", f"{FUNCNAME} REPO Ubuntu12", f"{FUNCNAME} CACHE Windows7 diff")
532        return
533
534    if not sys.argv[3] or sys.argv[3] == "img":
535        IMGEXT = "img"
536    else:
537        IMGEXT = sys.argv[3]
538
539    IMGDIR = ogGetParentPath(sys.argv[1], f"/{sys.argv[2]}")
540    IMGFILE = f"{IMGDIR}/{os.path.basename(f'/{sys.argv[2]}')}.{IMGEXT}"
541
542    if sys.argv[1] == "CACHE" or sys.argv[1] == "cache":
543        if "ext4 filesystem" in subprocess.run(["file", IMGFILE], capture_output=True, text=True).stdout.lower():
544            DIRMOUNT = ogMountImage(sys.argv[1], sys.argv[2], IMGEXT.split(".")[1])
545            AVAILABLE = int(subprocess.run(["df", "-k"], capture_output=True, text=True).stdout.split(f"{DIRMOUNT}\n")[1].split()[3])
546            if AVAILABLE < 200000:
547                ogUnmountImage(sys.argv[1], sys.argv[2], IMGEXT.split(".")[1])
548                os.system(f"echo \"reduced\" > \"{IMGFILE}.lock\"")
549                return 0
550
551            EXTSIZE = int(subprocess.run(["ls", "-l", "--block-size=1024", IMGFILE], capture_output=True, text=True).stdout.split()[4])
552            INTSIZE = int(subprocess.run(["df", "-k"], capture_output=True, text=True).stdout.split(f"{DIRMOUNT}\n")[1].split()[1])
553            EDGESIZE = EXTSIZE - INTSIZE
554            ogUnmountImage(sys.argv[1], sys.argv[2], IMGEXT.split(".")[1])
555            LOOPDEVICE = subprocess.run(["losetup", "-f"], capture_output=True, text=True).stdout.strip()
556            os.system(f"losetup {LOOPDEVICE} \"{IMGFILE}\"")
557            os.system(f"resize2fs -fpM {LOOPDEVICE}")
558            ogMountImage(sys.argv[1], sys.argv[2], IMGEXT.split(".")[1])
559            INTSIZE = int(subprocess.run(["df", "-k"], capture_output=True, text=True).stdout.split(f"{DIRMOUNT}\n")[1].split()[1])
560            EXTSIZE = INTSIZE + EDGESIZE
561            os.system(f"umount \"{DIRMOUNT}\"")
562            if LOOPDEVICE:
563                os.system(f"losetup -d {LOOPDEVICE}")
564            os.system(f"truncate --size=\"{EXTSIZE}\"k \"{IMGFILE}\"")
565        else:
566            os.system(f"umount \"{DIRMOUNT}\"")
567   
568    os.system(f"echo \"reduced\" > \"{IMGFILE}.lock\"")
569    os.system(f"rmdir \"{DIRMOUNT}\"")
570
571def ogIsSyncImage():
572    FUNCNAME = ogIsSyncImage.__name__
573    IMGEXT = None
574    IMGDIR = None
575    IMGFILE = None
576
577    if len(sys.argv) < 2 or (len(sys.argv) < 3 and sys.argv[3] != "img"):
578        ogHelp(FUNCNAME, f"{FUNCNAME} [ REPO|CACHE ] image_name [ extension ]", f"{FUNCNAME} REPO Ubuntu12", f"{FUNCNAME} CACHE Windows7 diff")
579        return
580
581    if not sys.argv[3] or sys.argv[3] == "img":
582        IMGEXT = "img"
583    else:
584        IMGEXT = sys.argv[3]
585
586    IMGDIR = ogGetParentPath(sys.argv[1], f"/{sys.argv[2]}")
587    IMGFILE = f"{IMGDIR}/{os.path.basename(f'/{sys.argv[2]}')}.{IMGEXT}"
588
589    if "BTRFS Filesystem" in subprocess.run(["file", IMGFILE], capture_output=True, text=True).stdout.lower() or "ext4 filesystem" in subprocess.run(["file", IMGFILE], capture_output=True, text=True).stdout.lower():
590        return 0
591    else:
592        return OG_ERR_DONTSYNC_IMAGE
593   
594def ogCheckSyncImage():
595    FUNCNAME = ogCheckSyncImage.__name__
596    IMGEXT = None
597    IMGDIR = None
598    IMGFILE = None
599    DIRMOUNT = None
600    ISMOUNT = None
601    RETVAL = None
602
603    if len(sys.argv) < 2 or (len(sys.argv) < 3 and sys.argv[3] != "img"):
604        ogHelp(FUNCNAME, f"{FUNCNAME} [ REPO|CACHE ] image_name [ extension ]", f"{FUNCNAME} REPO Ubuntu12", f"{FUNCNAME} CACHE Windows7 diff")
605        return
606
607    if not sys.argv[3] or sys.argv[3] == "img":
608        IMGEXT = "img"
609    else:
610        IMGEXT = sys.argv[3]
611
612    IMGDIR = ogGetParentPath(sys.argv[1], f"/{sys.argv[2]}")
613    IMGFILE = f"{IMGDIR}/{os.path.basename(f'/{sys.argv[2]}')}.{IMGEXT}"
614
615    if "ext4 filesystem" in subprocess.run(["file", IMGFILE], capture_output=True, text=True).stdout.lower():
616        DIRMOUNT = f"/tmp/ogCheckImage$$"
617        os.makedirs(DIRMOUNT, exist_ok=True)
618        subprocess.run(["mount", "-t", "ext4", "-o", "loop", IMGFILE, DIRMOUNT], capture_output=True, text=True)
619        RETVAL = subprocess.PIPESTATUS[0]
620    else:
621        DIRMOUNT = f"/tmp/ogCheckImage$$"
622        os.makedirs(DIRMOUNT, exist_ok=True)
623        subprocess.run(["mount", "-o", "compress=lzo", IMGFILE, DIRMOUNT], capture_output=True, text=True)
624        RETVAL = subprocess.PIPESTATUS[0]
625
626    print("\n".join(os.listdir(DIRMOUNT)))
627
628    subprocess.run(["umount", DIRMOUNT], capture_output=True, text=True)
629    os.rmdir(DIRMOUNT)
630
631    return RETVAL
Note: See TracBrowser for help on using the repository browser.