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