Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5b2a2f4

Browse files
committed
Add chroot-in and chroot-out
1 parentf525e83 commit5b2a2f4

File tree

3 files changed

+75
-25
lines changed

3 files changed

+75
-25
lines changed

‎src/ashpk_core.py‎

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,18 @@ def chroot_check():
191191
ifstr("/.snapshots btrfs")inbuf:
192192
chroot=False
193193
# for line in mounts: if str("/.snapshots btrfs") in str(line): chroot = False ### REVIEW NEWER
194-
return(chroot)
194+
returnchroot
195+
196+
defchroot_in(path):
197+
real_root=os.open("/",os.O_RDONLY)
198+
os.chroot(path)
199+
returnreal_root
200+
201+
defchroot_out(rr):
202+
os.fchdir(rr)
203+
os.chroot(".")
204+
# Back to old root
205+
os.close(rr)
195206

196207
# Clone tree
197208
defclone_as_tree(desc,snap):
@@ -279,18 +290,19 @@ def clone_under(snap, branch):
279290
returni
280291

281292
# Delete tree or branch
282-
defdelete_node(snaps,quiet):
293+
defdelete_node(snaps,quiet,nuke):
283294
forsnapinsnaps:
284-
ifnotos.path.exists(f"/.snapshots/rootfs/snapshot-{snap}"):
285-
print(f"F: Cannot delete as snapshot{snap} doesn't exist.")
286-
elifsnap==0:
295+
ifsnap==0:
287296
print("F: Changing base snapshot is not allowed.")
288-
elifsnap==get_current_snapshot():
289-
print("F: Cannot delete booted snapshot.")
290-
elifsnap==get_next_snapshot():
291-
print("F: Cannot delete deployed snapshot.")
292-
elifnotquietandnotyes_no(f"Are you sure you want to delete snapshot{snap}?"):
293-
sys.exit("Aborted")
297+
ifnotnuke:
298+
ifnotos.path.exists(f"/.snapshots/rootfs/snapshot-{snap}"):
299+
print(f"F: Cannot delete as snapshot{snap} doesn't exist.")
300+
elifsnap==get_current_snapshot():
301+
print("F: Cannot delete booted snapshot.")
302+
elifsnap==get_next_snapshot():
303+
print("F: Cannot delete deployed snapshot.")
304+
elifnotquietandnotyes_no(f"Are you sure you want to delete snapshot{snap}?"):
305+
sys.exit("Aborted")
294306
else:
295307
children=return_children(fstree,snap)
296308
write_desc("",snap)# Clear description # Why have this? REVIEW 2023
@@ -315,6 +327,19 @@ def delete_node(snaps, quiet):
315327
write_tree(fstree)
316328
print(f"Snapshot{snap} removed.")
317329

330+
# Delete tree or branch
331+
defdelete_deploys():
332+
forsnapin ("deploy","deploy-aux"):
333+
os.system(f"btrfs sub del /.snapshots/boot/boot-{snap}{DEBUG}")
334+
os.system(f"btrfs sub del /.snapshots/etc/etc-{snap}{DEBUG}")
335+
os.system(f"btrfs sub del /.snapshots/rootfs/snapshot-{snap}{DEBUG}")
336+
# Make sure temporary chroot directories are deleted as well
337+
if (os.path.exists(f"/.snapshots/rootfs/snapshot-chr{snap}")):
338+
os.system(f"btrfs sub del /.snapshots/boot/boot-chr{snap}{DEBUG}")
339+
os.system(f"btrfs sub del /.snapshots/etc/etc-chr{snap}{DEBUG}")
340+
os.system(f"btrfs sub del /.snapshots/rootfs/snapshot-chr{snap}{DEBUG}")
341+
print(f"Snapshot{snap} removed.")
342+
318343
# Deploy snapshot
319344
defdeploy(snap,secondary=False):
320345
ifnotos.path.exists(f"/.snapshots/rootfs/snapshot-{snap}"):
@@ -379,7 +404,7 @@ def find_new():
379404
whileTrue:
380405
i+=1
381406
ifstr(f"snapshot-{i}")notinsnapshotsandstr(f"etc-{i}")notinsnapshotsandstr(f"var-{i}")notinsnapshotsandstr(f"boot-{i}")notinsnapshots:
382-
return(i)
407+
returni
383408

384409
# Get aux tmp
385410
defget_aux_tmp(tmp,secondary=False):
@@ -418,7 +443,8 @@ def get_next_snapshot(secondary=False):
418443
# Get parent
419444
defget_parent(tree,id):
420445
par= (find(tree,filter_=lambdanode: ("x"+str(node.name)+"x")in ("x"+str(id)+"x")))
421-
return(par.parent.name)
446+
ifpar:
447+
returnpar.parent.name
422448

423449
# Get drive partition
424450
defget_part():
@@ -772,7 +798,7 @@ def recurse_tree(tree, cid):
772798
ifchild!=cid:
773799
order.append(par)
774800
order.append(child)
775-
return(order)
801+
returnorder
776802

777803
# Refresh snapshot
778804
defrefresh(snap):
@@ -820,7 +846,8 @@ def remove_from_tree(tree, tname, pkg, prof):
820846
# Remove node from tree
821847
defremove_node(tree,id):
822848
par= (find(tree,filter_=lambdanode: ("x"+str(node.name)+"x")in ("x"+str(id)+"x")))
823-
par.parent=None
849+
ifpar:
850+
par.parent=None
824851

825852
# Return all children for node
826853
defreturn_children(tree,id):
@@ -830,7 +857,7 @@ def return_children(tree, id):
830857
children.append(child.name)
831858
ifidinchildren:
832859
children.remove(id)
833-
return(children)
860+
returnchildren
834861

835862
# Rollback last booted deployment
836863
defrollback():
@@ -891,7 +918,7 @@ def snapshot_config_edit(snap, skip_prep=False, skip_post=False):
891918
ifnotskip_post:
892919
post_transactions(snap)
893920

894-
# Get per-snapshot configuration options from /etc/ast.conf
921+
# Get per-snapshot configuration options from /etc/ash.conf
895922
defsnapshot_config_get(snap):
896923
options= {"aur":"False","mutable_dirs":"","mutable_dirs_shared":""}# defaults here ### REVIEW This is not distro-generic
897924
ifnotos.path.exists(f"/.snapshots/etc/etc-{snap}/ash.conf"):
@@ -947,10 +974,12 @@ def switch_tmp(secondary=False):
947974
distro_suffix=get_distro_suffix()
948975
part=get_part()
949976
tmp_boot=subprocess.check_output("mktemp -d -p /.snapshots/tmp boot.XXXXXXXXXXXXXXXX",shell=True).decode('utf-8').strip()
977+
###TODO with TemporaryDirectory(dir="/.snapshots/tmp", prefix="boot.") as tmp_boot:
950978
os.system(f"mount{part} -o subvol=@boot{distro_suffix}{tmp_boot}")# Mount boot partition for writing
951979
# Swap deployment subvolumes: deploy <-> deploy-aux
952980
source_dep=get_tmp()
953-
target_dep=get_aux_tmp(get_tmp(),secondary)
981+
#target_dep = get_aux_tmp(get_tmp(), secondary)
982+
target_dep=get_aux_tmp(source_dep,secondary)
954983
os.system(f"cp -r --reflink=auto /.snapshots/rootfs/snapshot-{target_dep}/boot/.{tmp_boot}")
955984
os.system(f"sed -i 's|@.snapshots{distro_suffix}/rootfs/snapshot-{source_dep}|@.snapshots{distro_suffix}/rootfs/snapshot-{target_dep}|g'{tmp_boot}/{GRUB}/grub.cfg")# Overwrite grub config boot subvolume
956985
os.system(f"sed -i 's|@.snapshots{distro_suffix}/rootfs/snapshot-{source_dep}|@.snapshots{distro_suffix}/rootfs/snapshot-{target_dep}|g' /.snapshots/rootfs/snapshot-{target_dep}/boot/{GRUB}/grub.cfg")
@@ -972,7 +1001,7 @@ def switch_tmp(secondary=False):
9721001
line=grubconf.readline()
9731002
if"snapshot-deploy-aux"ingconf:
9741003
gconf=gconf.replace("snapshot-deploy-aux","snapshot-deploy")
975-
else:
1004+
elif"snapshot-deploy"ingconf:### REVIEW 2023 add others as well (secondary etc) ### Before: else
9761005
gconf=gconf.replace("snapshot-deploy","snapshot-deploy-aux")
9771006
ifdistro_nameingconf:
9781007
gconf=sub('snapshot\\d','',gconf)### IMPORTANT REVIEW 2023
@@ -1164,7 +1193,6 @@ def update_boot(snap, secondary = False): ### TODO Other bootloaders
11641193
os.system(f"cp /boot/{GRUB}/grub.cfg /boot/{GRUB}/BAK/grub.cfg.`date '+%Y%m%d-%H%M%S'`")
11651194
os.system(f"chroot /.snapshots/rootfs/snapshot-chr{snap}{GRUB}-mkconfig{part} -o /boot/{GRUB}/grub.cfg")
11661195
os.system(f"chroot /.snapshots/rootfs/snapshot-chr{snap} sed -i 's|snapshot-chr{snap}|snapshot-{tmp}|g' /boot/{GRUB}/grub.cfg")
1167-
#### os.system(f"chroot /.snapshots/rootfs/snapshot-chr{snap} sed -i '0,\|{distro_name}| s||{distro_name} snapshot {snap}|' /boot/{GRUB}/grub.cfg")
11681196
os.system(f"chroot /.snapshots/rootfs/snapshot-chr{snap} sed -i '0,\\|{distro_name}| s||{distro_name} snapshot{snap}|' /boot/{GRUB}/grub.cfg")
11691197
post_transactions(snap)
11701198

@@ -1302,6 +1330,7 @@ def main():
13021330
del_par=subparsers.add_parser("del",aliases=["delete","rm","rem","remove","rm-snapshot"],allow_abbrev=True,help="Remove snapshot(s)/tree(s) and any branches recursively")
13031331
del_par.add_argument("--snaps","--snapshots","-s",nargs='+',type=int,required=True,help="snapshot number")
13041332
del_par.add_argument('--quiet','-q',action='store_true',required=False,help='Force delete snapshot(s)')
1333+
del_par.add_argument('--nuke',action='store_true',required=False,help='Nuke everything leftover from snapshot(s)')
13051334
del_par.set_defaults(func=delete_node)
13061335
# Deploy
13071336
dep_par=subparsers.add_parser("deploy",aliases=['dep','d'],allow_abbrev=True,help='Deploy a snapshot for next boot')

‎src/distros/arch/ashpk.py‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,29 @@ def init_system_copy(snap, FROM):
148148

149149
# Install atomic-operation
150150
definstall_package(pkg,snap):
151+
prepare(snap)
152+
excode=os.system(f"chroot /.snapshots/rootfs/snapshot-chr{snap} pacman -S{pkg} --needed --overwrite '/var/*'")
153+
ifexcode:
154+
aur=aur_install(snap,True,True)### TODO: do a paru -Si {pkg} check to avoid setup_aur if package already installed!
155+
ifaur:
156+
returnos.system(f"chroot /.snapshots/rootfs/snapshot-chr{snap} su aur -c\"paru -S{pkg} --needed --overwrite '/var/*'\"")
157+
else:
158+
print("F: AUR is not enabled!")
159+
ifyes_no("Enable AUR?"):
160+
print("Opening snapshot's config file... Please change AUR to True")
161+
snapshot_config_edit(snap,True,False)### TODO move to core.py ? Run prepare but skip post transaction (Optimize code) Update: post_tran need to run too
162+
aur=aur_install(snap,True,False)
163+
returnaur
164+
else:
165+
return1
166+
else:
167+
return0
168+
169+
# Install atomic-operation
170+
definstall_package_old(pkg,snap):
151171
try:
152172
# This extra pacman check is to avoid unwantedly triggering AUR if package is official but user answers no to prompt
173+
### TODO IMPORTANT this doesn't work for a package group e.g. "lxqt" errors out even though it's not in AUR, which makes following code malfunction!
153174
subprocess.check_output(f"pacman -Si{pkg}",shell=True,stderr=subprocess.PIPE)# --sysroot ### do not print if pkg not found
154175
exceptsubprocess.CalledProcessError:
155176
aur=aur_install(snap)### TODO: do a paru -Si {pkg} check to avoid setup_aur if package already installed!

‎src/installer_core.py‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ def deploy_to_common():
5858
ifis_efi:
5959
os.system(f"{SUDO} umount /mnt/boot/efi")
6060
os.system(f"{SUDO} umount /mnt/boot")
61-
os.system(f'{SUDO} mount{bpifis_boot_externalelseos_root} -o{"subvol="+f"@boot{distro_suffix}"+","ifnotis_boot_externalelse""}compress=zstd,noatime /mnt/.snapshots/boot/boot-deploy')### REVIEW_LATER A similar line for is_home_external needed?
62-
### if is_boot_external: # easier to read
63-
### os.system(f"{SUDO} mount {bp} -o compress=zstd,noatime /mnt/.snapshots/boot/boot-deploy")
64-
### else:
65-
### os.system(ff"{SUDO} mount {os_root} -o subvol=@boot{distro_suffix},compress=zstd,noatime /mnt/.snapshots/boot/boot-deploy")
61+
### os.system(f'{SUDO} mount {bp if is_boot_external else os_root} -o {"subvol="+f"@boot{distro_suffix}"+"," if not is_boot_external else ""}compress=zstd,noatime /mnt/.snapshots/boot/boot-deploy') ### REVIEW_LATER A similar line for is_home_external needed?
62+
ifis_boot_external:
63+
os.system(f"{SUDO} mount{bp} -o compress=zstd,noatime /mnt/.snapshots/boot/boot-deploy")
64+
else:
65+
os.system(f"{SUDO} mount{os_root} -o subvol=@boot{distro_suffix},compress=zstd,noatime /mnt/.snapshots/boot/boot-deploy")
6666
os.system(f"{SUDO} cp -r --reflink=auto /mnt/.snapshots/boot/boot-deploy/. /mnt/boot/")
6767
os.system(f"{SUDO} umount /mnt/etc")
6868
os.system(f"{SUDO} mount{os_root} -o subvol=@etc{distro_suffix},compress=zstd,noatime /mnt/.snapshots/etc/etc-deploy")

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp