iAdd UMN .Links etc. directory parsing example. - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit a541c4f4710d4e11847d082a623e11ab8fca6c31 /scm/geomyidae/commit/a541c4f4710d4e11847d082a623e11ab8fca6c31.gph bitreich.org 70 1parent 27c94c92d5fdf7294ee1905c381d0ce2f4ccebca /scm/geomyidae/commit/27c94c92d5fdf7294ee1905c381d0ce2f4ccebca.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sun, 3 Apr 2022 12:22:57 +0200 Err bitreich.org 70 i Err bitreich.org 70 iAdd UMN .Links etc. directory parsing example. Err bitreich.org 70 i Err bitreich.org 70 iReduce dirlisting.dcgi to bare example. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M cgi-examples/dirlisting.dcgi | 22 +--------------------- Err bitreich.org 70 i A cgi-examples/umnlisting.dcgi | 181 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 182 insertions(+), 21 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/cgi-examples/dirlisting.dcgi b/cgi-examples/dirlisting.dcgi /scm/geomyidae/file/cgi-examples/dirlisting.dcgi.gph bitreich.org 70 i@@ -2,11 +2,6 @@ Err bitreich.org 70 i # Err bitreich.org 70 i # Dir listing example. Err bitreich.org 70 i # Err bitreich.org 70 i-# Entry definition in .Links, .cap/$file or .names: Err bitreich.org 70 i-# Name=, Type=, Path=, Host=, Port=, Numb=, Abstract=, Admin=, URL=, TTL= Err bitreich.org 70 i-# Err bitreich.org 70 i- Err bitreich.org 70 i-[ -f .abstract ] && cat .abstract | sed 's/^t/&&/' Err bitreich.org 70 i Err bitreich.org 70 i find . -maxdepth 1 \ Err bitreich.org 70 i | sort -r \ Err bitreich.org 70 i@@ -14,26 +9,11 @@ find . -maxdepth 1 \ Err bitreich.org 70 i | grep -v "^\." \ Err bitreich.org 70 i | while read -r entry; Err bitreich.org 70 i do Err bitreich.org 70 i- [ "${entry}" == ".cap" ] && continue Err bitreich.org 70 i- [ "${entry}" == ".Links" ] && continue Err bitreich.org 70 i- [ "${entry}" == ".names" ] && continue Err bitreich.org 70 i- Err bitreich.org 70 i entrytype="9" Err bitreich.org 70 i [ -d "${entry}" ] && entrytype="1" Err bitreich.org 70 i Err bitreich.org 70 i- entryserver="server" Err bitreich.org 70 i- entryport="port" Err bitreich.org 70 i- entryname="%f" Err bitreich.org 70 i- if [ -f ".cap/$entry" ]; Err bitreich.org 70 i- then Err bitreich.org 70 i- entryname="$(cat ".cap/$entry" \ Err bitreich.org 70 i- | grep "^Name=" \ Err bitreich.org 70 i- | cut -d'=' -f 2-)" Err bitreich.org 70 i- fi Err bitreich.org 70 i- [ -z "${entryname}" ] && entryname="%f" Err bitreich.org 70 i- Err bitreich.org 70 i find "${entry}" \ Err bitreich.org 70 i -maxdepth 0 \ Err bitreich.org 70 i- -printf "[${entrytype}|%TY-%Tm-%Td ${entryname}|%f|${entryserver}|${entryport}]\r\n" Err bitreich.org 70 i+ -printf "[${entrytype}|%TY-%Tm-%Td %f|%f|server|port]\r\n" Err bitreich.org 70 i done Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/cgi-examples/umnlisting.dcgi b/cgi-examples/umnlisting.dcgi /scm/geomyidae/file/cgi-examples/umnlisting.dcgi.gph bitreich.org 70 i@@ -0,0 +1,181 @@ Err bitreich.org 70 i+#!/usr/bin/env python Err bitreich.org 70 i+# coding=utf-8 Err bitreich.org 70 i+# Err bitreich.org 70 i+# Dir listing like in UMN gopher. Err bitreich.org 70 i+# Err bitreich.org 70 i+# Files: .abstract, .names, .cap/$file, .Links Err bitreich.org 70 i+# Entries: Name=, Type=, Path=, Host=, Port=, Abstract=, Admin=, URL=, Err bitreich.org 70 i+# TTL= Err bitreich.org 70 i+# Err bitreich.org 70 i+ Err bitreich.org 70 i+import os Err bitreich.org 70 i+import sys Err bitreich.org 70 i+ Err bitreich.org 70 i+def dcgifilterprint(lines): Err bitreich.org 70 i+ for line in lines: Err bitreich.org 70 i+ line = line.strip() Err bitreich.org 70 i+ if line[0] == 't': Err bitreich.org 70 i+ print("t%s" % (line)) Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ print("%s" % (line)) Err bitreich.org 70 i+ Err bitreich.org 70 i+def parselinksfile(filepath, link={}): Err bitreich.org 70 i+ fd = open(filepath, "r") Err bitreich.org 70 i+ links = {} Err bitreich.org 70 i+ while 1: Err bitreich.org 70 i+ line = fd.readline() Err bitreich.org 70 i+ if not line: Err bitreich.org 70 i+ if "path" in link: Err bitreich.org 70 i+ links[link["path"]] = link Err bitreich.org 70 i+ link = {} Err bitreich.org 70 i+ break Err bitreich.org 70 i+ line = line.strip() Err bitreich.org 70 i+ if len(line) == 0 or line.startswith("#"): Err bitreich.org 70 i+ if "path" in link: Err bitreich.org 70 i+ links[link["path"]] = link Err bitreich.org 70 i+ link = {} Err bitreich.org 70 i+ continue Err bitreich.org 70 i+ elif line.startswith("Type="): Err bitreich.org 70 i+ link["type"] = line.split("=", 1)[1] Err bitreich.org 70 i+ elif line.startswith("Name="): Err bitreich.org 70 i+ link["name"] = line.split("=", 1)[1] Err bitreich.org 70 i+ elif line.startswith("Path="): Err bitreich.org 70 i+ link["path"] = line.split("=", 1)[1] Err bitreich.org 70 i+ elif line.startswith("Host="): Err bitreich.org 70 i+ link["host"] = line.split("=", 1)[1] Err bitreich.org 70 i+ elif line.startswith("Port="): Err bitreich.org 70 i+ link["port"] = line.split("=", 1)[1] Err bitreich.org 70 i+ elif line.startswith("Numb="): Err bitreich.org 70 i+ try: Err bitreich.org 70 i+ link["number"] = int(line.split("=", 1)[1]) Err bitreich.org 70 i+ except ValueError: Err bitreich.org 70 i+ pass Err bitreich.org 70 i+ elif line.startswith("Abstract="): Err bitreich.org 70 i+ link["abstract"] = line.split("=", 1)[1] Err bitreich.org 70 i+ while link["abstract"][-1] == "\\": Err bitreich.org 70 i+ link["abstract"] = link["abstract"][:-1] Err bitreich.org 70 i+ link["abstract"] += "\n" Err bitreich.org 70 i+ link["abstract"] += fd.readline().strip() Err bitreich.org 70 i+ Err bitreich.org 70 i+ # Undefined case in UMN. Handle it nicely. Err bitreich.org 70 i+ if link["abstract"][-1] == "\\": Err bitreich.org 70 i+ link["abstract"][-1] = "\n" Err bitreich.org 70 i+ elif line.startswith("Admin="): Err bitreich.org 70 i+ link["admin"] = line.split("=", 1)[1] Err bitreich.org 70 i+ elif line.startswith("URL="): Err bitreich.org 70 i+ link["url"] = line.split("=", 1)[1] Err bitreich.org 70 i+ elif line.startswith("TTL="): Err bitreich.org 70 i+ link["ttl"] = line.split("=", 1)[1] Err bitreich.org 70 i+ fd.close() Err bitreich.org 70 i+ Err bitreich.org 70 i+ return links Err bitreich.org 70 i+ Err bitreich.org 70 i+def usage(app): Err bitreich.org 70 i+ print("usage: %s search arguments host port" % (app), Err bitreich.org 70 i+ file=sys.stderr) Err bitreich.org 70 i+ sys.exit(1) Err bitreich.org 70 i+ Err bitreich.org 70 i+def main(args): Err bitreich.org 70 i+ scriptname = os.path.basename(args[0]) Err bitreich.org 70 i+ if len(args) < 5: Err bitreich.org 70 i+ usage(scriptname) Err bitreich.org 70 i+ search = args[1] Err bitreich.org 70 i+ arguments = args[2] Err bitreich.org 70 i+ host = args[3] Err bitreich.org 70 i+ port = args[4] Err bitreich.org 70 i+ Err bitreich.org 70 i+ basedir = "." Err bitreich.org 70 i+ if len(arguments) > 0 and arguments[0] == "/": Err bitreich.org 70 i+ basedir = arguments[0].split("?")[0] Err bitreich.org 70 i+ Err bitreich.org 70 i+ # First print every .abstract file content. Err bitreich.org 70 i+ abstractpath = "%s/.abstract" % (basedir) Err bitreich.org 70 i+ if os.path.exists(abstractpath): Err bitreich.org 70 i+ fd = open(abstractpath, "r") Err bitreich.org 70 i+ dcgifilterprint(fd.readlines()) Err bitreich.org 70 i+ fd.close() Err bitreich.org 70 i+ Err bitreich.org 70 i+ outputlinks = {} Err bitreich.org 70 i+ Err bitreich.org 70 i+ linkspath = "%s/.Links" % (basedir) Err bitreich.org 70 i+ if os.path.exists(linkspath): Err bitreich.org 70 i+ linkslinks = parselinksfile(linkspath) Err bitreich.org 70 i+ for linkkey in linkslinks.keys(): Err bitreich.org 70 i+ outputlinks[linkkey] = linkslinks[linkkey] Err bitreich.org 70 i+ Err bitreich.org 70 i+ entries = os.listdir(basedir) Err bitreich.org 70 i+ for entry in entries: Err bitreich.org 70 i+ entrylink = {} Err bitreich.org 70 i+ entrylink["type"] = "9" Err bitreich.org 70 i+ if os.path.isdir(entry): Err bitreich.org 70 i+ entrylink["type"] = "1" Err bitreich.org 70 i+ Err bitreich.org 70 i+ entrylink["path"] = "./%s" % (entry) Err bitreich.org 70 i+ entrylink["name"] = entry Err bitreich.org 70 i+ capspath = "%s/.cap/%s" % (basedir, entry) Err bitreich.org 70 i+ if os.path.exists(capspath): Err bitreich.org 70 i+ caplink = parselinksfile(capspath, entrylink) Err bitreich.org 70 i+ outputlinks[entrylink["path"]] = entrylink Err bitreich.org 70 i+ Err bitreich.org 70 i+ namespath = "%s/.names" % (basedir) Err bitreich.org 70 i+ if os.path.exists(namespath): Err bitreich.org 70 i+ nameslinks = parselinksfile(namespath) Err bitreich.org 70 i+ for namekey in nameslinks.keys(): Err bitreich.org 70 i+ namelink = nameslinks[namekey] Err bitreich.org 70 i+ if namekey in outputlinks.keys(): Err bitreich.org 70 i+ for key in namelink: Err bitreich.org 70 i+ outputlinks[namekey][key] = \ Err bitreich.org 70 i+ namelink[key] Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ outputlinks[namekey] = nameslinks[namekey] Err bitreich.org 70 i+ displaylinks = {} Err bitreich.org 70 i+ for link in outputlinks.keys(): Err bitreich.org 70 i+ if "name" in outputlinks[link]: Err bitreich.org 70 i+ displaylinks[outputlinks[link]["name"]] = link Err bitreich.org 70 i+ elif "path" in outputlinks[link]: Err bitreich.org 70 i+ if outputlinks[link]["path"].startswith("./"): Err bitreich.org 70 i+ displaylinks[outputlinks[link]["path"][2:]] = \ Err bitreich.org 70 i+ link Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ displaylinks[outputlinks[link]["path"]] = \ Err bitreich.org 70 i+ link Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ displaylinks[link] = link Err bitreich.org 70 i+ Err bitreich.org 70 i+ displaykeys = sorted(displaylinks) Err bitreich.org 70 i+ for key in displaykeys: Err bitreich.org 70 i+ path = displaylinks[key] Err bitreich.org 70 i+ if path == "./.Links" or \ Err bitreich.org 70 i+ path == "./.cap" or \ Err bitreich.org 70 i+ path == "./.names" or \ Err bitreich.org 70 i+ path == "./.abstract": Err bitreich.org 70 i+ continue Err bitreich.org 70 i+ Err bitreich.org 70 i+ link = outputlinks[path] Err bitreich.org 70 i+ if "port" not in link: Err bitreich.org 70 i+ link["port"] = "port" Err bitreich.org 70 i+ if "host" not in link: Err bitreich.org 70 i+ link["host"] = "server" Err bitreich.org 70 i+ if "name" not in link: Err bitreich.org 70 i+ if link["path"].startswith("./"): Err bitreich.org 70 i+ link["name"] = link["path"][2:] Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ link["name"] = link["path"] Err bitreich.org 70 i+ if "type" not in link: Err bitreich.org 70 i+ link["type"] = "9" Err bitreich.org 70 i+ Err bitreich.org 70 i+ # dcgi escaping. Err bitreich.org 70 i+ link["name"].replace("|", "\\|") Err bitreich.org 70 i+ Err bitreich.org 70 i+ print("[%s|%s|%s|%s|%s]" % (link["type"][0],\ Err bitreich.org 70 i+ link["name"], link["path"], link["host"],\ Err bitreich.org 70 i+ link["port"])) Err bitreich.org 70 i+ Err bitreich.org 70 i+ if "abstract" in link: Err bitreich.org 70 i+ dcgifilterprint(link["abstract"].split("\n")) Err bitreich.org 70 i+ Err bitreich.org 70 i+ return 0 Err bitreich.org 70 i+ Err bitreich.org 70 i+if __name__ == "__main__": Err bitreich.org 70 i+ sys.exit(main(sys.argv)) Err bitreich.org 70 i+ Err bitreich.org 70 .