SMOLNET PORTAL home about changes
iinitial import from ~/bin - plstree - ps and ls displayed as a tree	Err	bitreich.org	70
hgit clone git://bitreich.org/plstree git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/plstree	URL:git://bitreich.org/plstree git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/plstree	bitreich.org	70
1Log	/scm/plstree/log.gph	bitreich.org	70
1Files	/scm/plstree/files.gph	bitreich.org	70
1Refs	/scm/plstree/refs.gph	bitreich.org	70
1Tags	/scm/plstree/tag	bitreich.org	70
1README	/scm/plstree/file/README.gph	bitreich.org	70
i---	Err	bitreich.org	70
1commit 35d52859f6fcd9f3d9e411584784f4ccd4b75b87	/scm/plstree/commit/35d52859f6fcd9f3d9e411584784f4ccd4b75b87.gph	bitreich.org	70
hAuthor: Josuah Demangeon <mail@josuah.net>	URL:mailto:mail@josuah.net	bitreich.org	70
iDate:   Thu, 19 Apr 2018 04:02:41 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iinitial import from ~/bin	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  A lstree                              |      98 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A pstree                              |     122 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A tree                                |      76 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i3 files changed, 296 insertions(+), 0 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/lstree b/lstree	/scm/plstree/file/lstree.gph	bitreich.org	70
i@@ -0,0 +1,98 @@	Err	bitreich.org	70
i+#!/usr/bin/awk -f	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# list paths in a tree with some stat infos	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Use find(1) walk the entire tree and then call ls -ld with all the	Err	bitreich.org	70
i+# result (ls sort the list itself) with the paths displayed as a tree:	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+#        drwxr-xr-x   2 josuah  josuah     512 Feb 16 13:19  |- .ssh	Err	bitreich.org	70
i+#        -rw-r--r--   1 josuah  josuah     870 Feb  9 02:24  |  `- config	Err	bitreich.org	70
i+#        drwxr-xr-x   2 josuah  josuah    1536 Feb 18 21:24  |- bin	Err	bitreich.org	70
i+#        -rwxr-xr-x   1 josuah  josuah    1351 Feb 18 22:30  |  |- lt	Err	bitreich.org	70
i+#        -rwxr-xr-x   1 josuah  josuah     565 Feb 17 19:53  |  |- mfilter	Err	bitreich.org	70
i+#        -rwxr-xr-x   1 josuah  josuah    5430 Feb 17 19:51  |  `- xdg-open	Err	bitreich.org	70
i+#        -rwxr-xr-x   1 josuah  josuah     468 Feb 17 19:55  ...	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+BEGIN {	Err	bitreich.org	70
i+        LINE = "|  ";	Err	bitreich.org	70
i+        NODE = "|- ";	Err	bitreich.org	70
i+        TAIL = "`- ";	Err	bitreich.org	70
i+        VOID = "   ";	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        num = list(entries, ARGC == 1 ? "." : ARGV[1]);	Err	bitreich.org	70
i+        tree(entries, num);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (l = 1; l <= num; l++) {	Err	bitreich.org	70
i+                for (i = 1; entries[l":"i] != ""; i++)	Err	bitreich.org	70
i+                        printf("%s", entries[l":"i]);	Err	bitreich.org	70
i+                printf("%s\n", entries[l"name"]);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Get a recursive list of all entries into entries[] with entries[i:j]	Err	bitreich.org	70
i+# holding the component j of the path i, and 0 has all the -l details,	Err	bitreich.org	70
i+# then return the number of entries in entries[].	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+#        [ 1:[ 0:"-rw-r--r-- 1  root root  341 Mar 13 10:50",	Err	bitreich.org	70
i+#              1:"etc" ],	Err	bitreich.org	70
i+#          2:[ 0:"drwxr-xr-x 28 root root 4096 Mar 13 10:50",	Err	bitreich.org	70
i+#              1:"etc",	Err	bitreich.org	70
i+#              2:"sv" ],	Err	bitreich.org	70
i+#          3:[ 0:"drwxr-xr-x  2 root root 4096 Mar 13 10:50",	Err	bitreich.org	70
i+#              1:"etc",	Err	bitreich.org	70
i+#              2:"tor" ] ]	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+# Only the leaves are present, the intermediates components are LINE or	Err	bitreich.org	70
i+# NODE if just before a leave	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+#        [ 1:[ 1:LINE, 2:LINE, 3:LINE, 4:LINE, 5:NODE, 6:"filename" ] ]	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+function list(entries, path)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        cmd = "cd '" path "' && exec find ."                                \	Err	bitreich.org	70
i+            " -name '*.git'        -prune -o"                                \	Err	bitreich.org	70
i+            " -name 'CVS'        -prune -o"                                \	Err	bitreich.org	70
i+            " -exec ls -ld {} +";	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (num = 0; cmd | getline; num++) {	Err	bitreich.org	70
i+                sub(" \\.$", "", $0);	Err	bitreich.org	70
i+                sub(" -> .*", "", $0);	Err	bitreich.org	70
i+                infos = $0;	Err	bitreich.org	70
i+                sub(" \\./.*", "", infos);	Err	bitreich.org	70
i+                sub(".* \\./", "./", $0);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                entries[num"path"] = $0;	Err	bitreich.org	70
i+                count = split($0, path_v, "/");	Err	bitreich.org	70
i+                for (i = 2; i < count; i++)	Err	bitreich.org	70
i+                        entries[num":"i] = LINE;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                entries[num":"count] = NODE;	Err	bitreich.org	70
i+                entries[num":"1] = infos "  ";	Err	bitreich.org	70
i+                entries[num"name"] = path_v[count];	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        close(cmd);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return num - 1;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Transform entries into a tree by replacing some LINE by VOID when needed.	Err	bitreich.org	70
i+# The tree is walked from the bottom to the top, and column by column	Err	bitreich.org	70
i+# toward the right until an empty column is met.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+function tree(entries, num)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        for (i = 2; !stop; i++) {	Err	bitreich.org	70
i+                stop = tail = 1;	Err	bitreich.org	70
i+                for (l = num; l > 0; l--) {	Err	bitreich.org	70
i+                        if (entries[l":"i] == LINE && tail) {	Err	bitreich.org	70
i+                                entries[l":"i] = VOID;	Err	bitreich.org	70
i+                                stop = 0;	Err	bitreich.org	70
i+                        } else if (entries[l":"i] == NODE && tail) {	Err	bitreich.org	70
i+                                entries[l":"i] = TAIL;	Err	bitreich.org	70
i+                                tail = stop = 0;	Err	bitreich.org	70
i+                        } else if (!entries[l":"i]) {	Err	bitreich.org	70
i+                                tail = 1;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/pstree b/pstree	/scm/plstree/file/pstree.gph	bitreich.org	70
i@@ -0,0 +1,122 @@	Err	bitreich.org	70
i+#!/usr/bin/awk -f	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# pstree implementation in awk	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Use ps(1) to generate a list of pid, ppid and other properties with	Err	bitreich.org	70
i+# the command name, displayed as a tree built from the pid-ppid pairs:	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+#        USER     TT        NI   PID STAT COMMAND	Err	bitreich.org	70
i+#        root     ?          0     1 Ss   runit	Err	bitreich.org	70
i+#        josuah   ?          0 22437 S    |- startx	Err	bitreich.org	70
i+#        josuah   ?          0 22451 S    |  `- xinit	Err	bitreich.org	70
i+#        root     tty7       0 22452 Rsl+ |     |- Xorg	Err	bitreich.org	70
i+#        josuah   ?          0 22457 S    |     `- dwm	Err	bitreich.org	70
i+#        josuah   ?          0 24882 S    `- runsvdir	Err	bitreich.org	70
i+#        josuah   ?          0 24884 S       |- runsv	Err	bitreich.org	70
i+#        josuah   ?          0 24887 S       |  |- svlogd	Err	bitreich.org	70
i+#        josuah   ?          0 24890 S       |  `- ratox	Err	bitreich.org	70
i+#        josuah   ?          0 24885 S       `- runsv	Err	bitreich.org	70
i+#        josuah   ?          0 24405 S          |- tor	Err	bitreich.org	70
i+#        josuah   ?          0 24889 S          `- svlogd	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+BEGIN {	Err	bitreich.org	70
i+        LINE = "|  ";	Err	bitreich.org	70
i+        NODE = "|- ";	Err	bitreich.org	70
i+        TAIL = "`- ";	Err	bitreich.org	70
i+        VOID = "   ";	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        list(entries);	Err	bitreich.org	70
i+        NUM = 1; fill(entries, 1, 0);	Err	bitreich.org	70
i+        tree(entries, NUM);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (i = 1; i < NUM; i++) {	Err	bitreich.org	70
i+                printf("%s", entries[i":info"]);	Err	bitreich.org	70
i+                for (j = 1; entries[i":"j] != ""; j++)	Err	bitreich.org	70
i+                        printf("%s", entries[i":"j]);	Err	bitreich.org	70
i+                printf("%s\n", entries[i":comm"]);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Build a relational database in <entries> from the output of ps: The	Err	bitreich.org	70
i+# parent pid (ppid) -> pid pairs are used to accumulate a list of child	Err	bitreich.org	70
i+# pid (serialized into a csv: ",234,532,454") later used for building	Err	bitreich.org	70
i+# the tree.	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+# For each pid, "info" and "comm" are saved as well.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+function list(entries)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        opt = "-o ppid,user,tty,pid,stat,comm"	Err	bitreich.org	70
i+        cmd = "exec ps -ax " opt " 2>/dev/null";	Err	bitreich.org	70
i+        if (!(cmd | getline)) {	Err	bitreich.org	70
i+                cmd = "exec ps " opt	Err	bitreich.org	70
i+                cmd | getline;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        sub(" *[^ ]+", "");	Err	bitreich.org	70
i+        print $0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (num = 0; cmd | getline; num++) {	Err	bitreich.org	70
i+                ppid = $1; pid = $4;	Err	bitreich.org	70
i+                entries[ppid"cpid"] = entries[ppid"cpid"] "," pid;	Err	bitreich.org	70
i+                sub(" *[^ ]+", "");	Err	bitreich.org	70
i+                sub(" *[^ ]+ + *[^ ]+ + *[^ ]+ + *[^ ]+ +", "&\t");	Err	bitreich.org	70
i+                split($0, info, "\t");	Err	bitreich.org	70
i+                entries[pid"info"] = info[1];	Err	bitreich.org	70
i+                entries[pid"comm"] = info[2];	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        close(cmd);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return num - 1;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Using the informations from the child pid in entries, build the absolute	Err	bitreich.org	70
i+# path from PID 1 to each pid:	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+#        [ 1:[ 1:"1" ],	Err	bitreich.org	70
i+#          2:[ 1:"1", 2:"456" ],	Err	bitreich.org	70
i+#          3:[ 1:"1", 2:"456", 3:"1623" ],	Err	bitreich.org	70
i+#          4:[ 1:"1", 2:"456", 3:"1721" ] ]	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+# With also ":info" and ":comm" for every row.	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+# Only the leaves are present, the intermediates components are LINE or	Err	bitreich.org	70
i+# NODE if just before a leave	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+#        [ 1:[ 1:LINE, 2:LINE, 3:LINE, 4:LINE, 5:NODE, 6:"filename" ] ]	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+function fill(entries, pid, lvl)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        for (j = 0; j < lvl; j++)	Err	bitreich.org	70
i+                entries[NUM":"j] = LINE;	Err	bitreich.org	70
i+        entries[NUM":"lvl] = NODE;	Err	bitreich.org	70
i+        entries[NUM":comm"] = entries[pid"comm"];	Err	bitreich.org	70
i+        entries[NUM":info"] = entries[pid"info"];	Err	bitreich.org	70
i+        NUM++;	Err	bitreich.org	70
i+        while (sub("[^,]*,", "", entries[pid"cpid"])) {	Err	bitreich.org	70
i+                cpid = entries[pid"cpid"];	Err	bitreich.org	70
i+                sub(",.*", "", cpid);	Err	bitreich.org	70
i+                fill(entries, cpid, lvl + 1);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Transform entries into a tree by replacing some LINE by VOID when needed.	Err	bitreich.org	70
i+# The tree is walked from the bottom to the top, and column by column	Err	bitreich.org	70
i+# toward the right until an empty column is met.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+function tree(entries, num)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        for (j = 0; !stop; j++) {	Err	bitreich.org	70
i+                stop = tail = 1;	Err	bitreich.org	70
i+                for (i = num; i > 0; i--) {	Err	bitreich.org	70
i+                        if (entries[i":"j] == LINE && tail) {	Err	bitreich.org	70
i+                                entries[i":"j] = VOID;	Err	bitreich.org	70
i+                                stop = 0;	Err	bitreich.org	70
i+                        } else if (entries[i":"j] == NODE && tail) {	Err	bitreich.org	70
i+                                entries[i":"j] = TAIL;	Err	bitreich.org	70
i+                                tail = stop = 0;	Err	bitreich.org	70
i+                        } else if (!entries[i":"j]) {	Err	bitreich.org	70
i+                                tail = 1;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/tree b/tree	/scm/plstree/file/tree.gph	bitreich.org	70
i@@ -0,0 +1,76 @@	Err	bitreich.org	70
i+#!/usr/bin/awk -f	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# convert a list of paths into a tree	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+BEGIN {	Err	bitreich.org	70
i+        LINE = "|  ";	Err	bitreich.org	70
i+        NODE = "|- ";	Err	bitreich.org	70
i+        TAIL = "`- ";	Err	bitreich.org	70
i+        VOID = "   ";	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        num = list(entries);	Err	bitreich.org	70
i+        tree(entries, num);	Err	bitreich.org	70
i+        display(entries, num);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Get a recursive list of all entries into entries[] with entries[i:j]	Err	bitreich.org	70
i+# holding the component j of the path i, and 0 has all the -l details,	Err	bitreich.org	70
i+# then return the number of entries in entries[].	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+#        [ 1:[ 1:"etc" ],	Err	bitreich.org	70
i+#          2:[ 1:"etc", 2:"sv" ],	Err	bitreich.org	70
i+#          3:[ 1:"etc", 2:"tor" ] ]	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+# Only the leaves are present, the intermediates components are LINE or	Err	bitreich.org	70
i+# NODE if just before a leave	Err	bitreich.org	70
i+#	Err	bitreich.org	70
i+#        [ 1:[ 1:LINE, 2:LINE, 3:LINE, 4:LINE, 5:NODE, 6:"filename" ],	Err	bitreich.org	70
i+#          2:[ 1:LINE, 2:LINE, 3:LINE, 4:NODE, 5:"filename" ] ]	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+function list(entries)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        for (num = 0; getline; num++) {	Err	bitreich.org	70
i+                sub("^/", "", $0);	Err	bitreich.org	70
i+                sub("/$", "", $0);	Err	bitreich.org	70
i+                count = split($0, nodelist, "/");	Err	bitreich.org	70
i+                for (i = 1; i < count; i++)	Err	bitreich.org	70
i+                        entries[num":"i] = LINE;	Err	bitreich.org	70
i+                entries[num":"count] = NODE;	Err	bitreich.org	70
i+                entries[num"name"] = nodelist[count];	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return num - 1;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Transform entries into a tree by replacing some LINE by VOID when needed.	Err	bitreich.org	70
i+# The tree is walked from the bottom to the top, and column by column	Err	bitreich.org	70
i+# toward the right until an empty column is met which stops the algorithm.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+function tree(entries, num)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        for (i = 1; !stop; i++) {	Err	bitreich.org	70
i+                stop = tail = 1;	Err	bitreich.org	70
i+                for (l = num; l > 0; l--) {	Err	bitreich.org	70
i+                        if (entries[l":"i] == LINE && tail) {	Err	bitreich.org	70
i+                                entries[l":"i] = VOID;	Err	bitreich.org	70
i+                                stop = 0;	Err	bitreich.org	70
i+                        } else if (entries[l":"i] == NODE && tail) {	Err	bitreich.org	70
i+                                entries[l":"i] = TAIL;	Err	bitreich.org	70
i+                                tail = stop = 0;	Err	bitreich.org	70
i+                        } else if (!entries[l":"i]) {	Err	bitreich.org	70
i+                                tail = 1;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Print all entries line by line.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+function display(entries, num)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        for (l = 1; l <= num; l++) {	Err	bitreich.org	70
i+                for (i = 1; entries[l":"i] != ""; i++)	Err	bitreich.org	70
i+                        printf("%s", entries[l":"i]);	Err	bitreich.org	70
i+                printf("%s\n", entries[l"name"]);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+}	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/plstree/commit/35d52859f6fcd9...
Content-Typetext/plain; charset=utf-8