From: Ralph Ronnquist Date: Fri, 23 Apr 2021 02:13:15 +0000 (+1000) Subject: added X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=ae0a0fd04881faf263a8e0e58067001323630020;p=rrq%2Fnewlisp-ftw.git added --- diff --git a/un-merge-usr.lsp b/un-merge-usr.lsp new file mode 100644 index 0000000..4cb58f0 --- /dev/null +++ b/un-merge-usr.lsp @@ -0,0 +1,80 @@ +#!/usr/bin/newlisp +# +# This script undo the "merged usr" directories; i.e., replace any +# toplevel links /bin, /sbin, /lib, /lib32, /libx32, or /lib64 with +# proper directories of their content according to installation paths. +# +# + +(signal 2 (fn (x) (exit 1))) + +(define (replace-file A B) + (delete-file A) + (rename-file B A)) + +(define (installs-as PATH) + (= (! (format "/usr/bin/dpkg -S \"%s\" > /dev/null 2>&1" PATH)))) + +(define (delete-file-exist PATH) + (and (file? PATH) (delete-file PATH))) + +(setf UNSURE "/var/log/UNSURE" TELL true) +(define (unsure PATH) + (when TELL + (println (format "Adding paths to %s with unsure pathnames" UNSURE)) + (setf TELL nil) + ) + (append-file UNSURE (string PATH "\n"))) + +(define (delete-empty-dirs D) + (! (format "/usr/bin/find %s /usr%s -depth -type d -delete 2>/dev/null" D D)) + ) + +#### Un-merging process starts here +(setf DIRS '("/bin" "/sbin" "/lib" "/lib32" "/libx32" "/lib64") + CP (if (file? "/bin/cp") "/bin/cp" "/usr/bin/cp") ) + +(println (date)) + +# Make target directories as copies of their /usr linking +(dolist (D DIRS) + (when (and (= 41471 (file-info D 1)) (directory? D)) + (println "copying " D) + (let ((Dx (format "%s-tobe" D))) + (and (make-dir Dx) + (= (! (format "%s -a /usr%s/. %s/." CP D Dx))) + (replace-file D Dx))))) + +# Rebuild library cache +(= (! "/sbin/ldconfig")) + +# Remove counterpart of known installed file(s), then remove any empty +# directories +(dolist (D DIRS) + (when (directory? (string "/usr" D)) + (let ((N 0) (FILES (exec (format "/usr/bin/find /usr%s -type f" D)))) + (println "checking " (length FILES) " files for " D) + (dolist (F FILES) + (when (= (% (inc N) 100)) + (print (format "checked %d of %d files for %s\r" + N (length FILES) D)) + (setf TELL true)) + (if (installs-as F) (delete-file-exist (4 F)) + (installs-as (4 F)) (delete-file F) + (unsure F))) + (delete-empty-dirs D) + ) + (println) + )) + +# Rebuild library cache +(= (! "/sbin/ldconfig")) + +# Ensure the root directories still/again exist +(dolist (D DIRS) + (! (format "/bin/touch %s /usr%s" D D))) + +(print "Push enter to reboot: ") +(read-line) +(! "/usr/sbin/reboot") +(exit 0)