iumnlisting.dcgi - 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 iumnlisting.dcgi (5552B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #!/usr/bin/env python Err bitreich.org 70 i 2 # coding=utf-8 Err bitreich.org 70 i 3 # Err bitreich.org 70 i 4 # Dir listing like in UMN gopher. Err bitreich.org 70 i 5 # Err bitreich.org 70 i 6 # Files: .abstract, .names, .cap/$file, .Links Err bitreich.org 70 i 7 # Entries: Name=, Type=, Path=, Host=, Port=, Abstract=, Admin=, URL=, Err bitreich.org 70 i 8 # TTL= Err bitreich.org 70 i 9 # Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 import os Err bitreich.org 70 i 12 import sys Err bitreich.org 70 i 13 Err bitreich.org 70 i 14 def dcgifilterprint(lines): Err bitreich.org 70 i 15 for line in lines: Err bitreich.org 70 i 16 line = line.strip() Err bitreich.org 70 i 17 if line[0] == 't': Err bitreich.org 70 i 18 print("t%s" % (line)) Err bitreich.org 70 i 19 else: Err bitreich.org 70 i 20 print("%s" % (line)) Err bitreich.org 70 i 21 Err bitreich.org 70 i 22 def parselinksfile(filepath, link={}): Err bitreich.org 70 i 23 fd = open(filepath, "r") Err bitreich.org 70 i 24 links = {} Err bitreich.org 70 i 25 while 1: Err bitreich.org 70 i 26 line = fd.readline() Err bitreich.org 70 i 27 if not line: Err bitreich.org 70 i 28 if "path" in link: Err bitreich.org 70 i 29 links[link["path"]] = link Err bitreich.org 70 i 30 link = {} Err bitreich.org 70 i 31 break Err bitreich.org 70 i 32 line = line.strip() Err bitreich.org 70 i 33 if len(line) == 0 or line.startswith("#"): Err bitreich.org 70 i 34 if "path" in link: Err bitreich.org 70 i 35 links[link["path"]] = link Err bitreich.org 70 i 36 link = {} Err bitreich.org 70 i 37 continue Err bitreich.org 70 i 38 elif line.startswith("Type="): Err bitreich.org 70 i 39 link["type"] = line.split("=", 1)[1] Err bitreich.org 70 i 40 elif line.startswith("Name="): Err bitreich.org 70 i 41 link["name"] = line.split("=", 1)[1] Err bitreich.org 70 i 42 elif line.startswith("Path="): Err bitreich.org 70 i 43 link["path"] = line.split("=", 1)[1] Err bitreich.org 70 i 44 elif line.startswith("Host="): Err bitreich.org 70 i 45 link["host"] = line.split("=", 1)[1] Err bitreich.org 70 i 46 elif line.startswith("Port="): Err bitreich.org 70 i 47 link["port"] = line.split("=", 1)[1] Err bitreich.org 70 i 48 elif line.startswith("Numb="): Err bitreich.org 70 i 49 try: Err bitreich.org 70 i 50 link["number"] = int(line.split("=", 1)[1]) Err bitreich.org 70 i 51 except ValueError: Err bitreich.org 70 i 52 pass Err bitreich.org 70 i 53 elif line.startswith("Abstract="): Err bitreich.org 70 i 54 link["abstract"] = line.split("=", 1)[1] Err bitreich.org 70 i 55 while link["abstract"][-1] == "\\": Err bitreich.org 70 i 56 link["abstract"] = link["abstract"][:-1] Err bitreich.org 70 i 57 link["abstract"] += "\n" Err bitreich.org 70 i 58 link["abstract"] += fd.readline().strip() Err bitreich.org 70 i 59 Err bitreich.org 70 i 60 # Undefined case in UMN. Handle it nicely. Err bitreich.org 70 i 61 if link["abstract"][-1] == "\\": Err bitreich.org 70 i 62 link["abstract"][-1] = "\n" Err bitreich.org 70 i 63 elif line.startswith("Admin="): Err bitreich.org 70 i 64 link["admin"] = line.split("=", 1)[1] Err bitreich.org 70 i 65 elif line.startswith("URL="): Err bitreich.org 70 i 66 link["url"] = line.split("=", 1)[1] Err bitreich.org 70 i 67 elif line.startswith("TTL="): Err bitreich.org 70 i 68 link["ttl"] = line.split("=", 1)[1] Err bitreich.org 70 i 69 fd.close() Err bitreich.org 70 i 70 Err bitreich.org 70 i 71 return links Err bitreich.org 70 i 72 Err bitreich.org 70 i 73 def usage(app): Err bitreich.org 70 i 74 print("usage: %s search arguments host port" % (app), Err bitreich.org 70 i 75 file=sys.stderr) Err bitreich.org 70 i 76 sys.exit(1) Err bitreich.org 70 i 77 Err bitreich.org 70 i 78 def main(args): Err bitreich.org 70 i 79 scriptname = os.path.basename(args[0]) Err bitreich.org 70 i 80 if len(args) < 5: Err bitreich.org 70 i 81 usage(scriptname) Err bitreich.org 70 i 82 search = args[1] Err bitreich.org 70 i 83 arguments = args[2] Err bitreich.org 70 i 84 host = args[3] Err bitreich.org 70 i 85 port = args[4] Err bitreich.org 70 i 86 Err bitreich.org 70 i 87 basedir = "." Err bitreich.org 70 i 88 if len(arguments) > 0 and arguments[0] == "/": Err bitreich.org 70 i 89 basedir = arguments[0].split("?")[0] Err bitreich.org 70 i 90 Err bitreich.org 70 i 91 # First print every .abstract file content. Err bitreich.org 70 i 92 abstractpath = "%s/.abstract" % (basedir) Err bitreich.org 70 i 93 if os.path.exists(abstractpath): Err bitreich.org 70 i 94 fd = open(abstractpath, "r") Err bitreich.org 70 i 95 dcgifilterprint(fd.readlines()) Err bitreich.org 70 i 96 fd.close() Err bitreich.org 70 i 97 Err bitreich.org 70 i 98 outputlinks = {} Err bitreich.org 70 i 99 numblinks = {} Err bitreich.org 70 i 100 Err bitreich.org 70 i 101 linkspath = "%s/.Links" % (basedir) Err bitreich.org 70 i 102 if os.path.exists(linkspath): Err bitreich.org 70 i 103 linkslinks = parselinksfile(linkspath) Err bitreich.org 70 i 104 for linkkey in linkslinks.keys(): Err bitreich.org 70 i 105 outputlinks[linkkey] = linkslinks[linkkey] Err bitreich.org 70 i 106 if "number" in linkslinks[linkkey]: Err bitreich.org 70 i 107 numblinks[linkkey] = linkslinks[linkkey] Err bitreich.org 70 i 108 Err bitreich.org 70 i 109 entries = os.listdir(basedir) Err bitreich.org 70 i 110 for entry in entries: Err bitreich.org 70 i 111 entrylink = {} Err bitreich.org 70 i 112 entrylink["type"] = "9" Err bitreich.org 70 i 113 if os.path.isdir(entry): Err bitreich.org 70 i 114 entrylink["type"] = "1" Err bitreich.org 70 i 115 Err bitreich.org 70 i 116 entrylink["path"] = "./%s" % (entry) Err bitreich.org 70 i 117 entrylink["name"] = entry Err bitreich.org 70 i 118 capspath = "%s/.cap/%s" % (basedir, entry) Err bitreich.org 70 i 119 if os.path.exists(capspath): Err bitreich.org 70 i 120 caplink = parselinksfile(capspath, entrylink) Err bitreich.org 70 i 121 outputlinks[entrylink["path"]] = entrylink Err bitreich.org 70 i 122 if "number" in entrylink: Err bitreich.org 70 i 123 numblinks[entrylink["path"]] = entrylink Err bitreich.org 70 i 124 Err bitreich.org 70 i 125 namespath = "%s/.names" % (basedir) Err bitreich.org 70 i 126 if os.path.exists(namespath): Err bitreich.org 70 i 127 nameslinks = parselinksfile(namespath) Err bitreich.org 70 i 128 for namekey in nameslinks.keys(): Err bitreich.org 70 i 129 namelink = nameslinks[namekey] Err bitreich.org 70 i 130 if namekey in outputlinks.keys(): Err bitreich.org 70 i 131 for key in namelink: Err bitreich.org 70 i 132 outputlinks[namekey][key] = \ Err bitreich.org 70 i 133 namelink[key] Err bitreich.org 70 i 134 else: Err bitreich.org 70 i 135 outputlinks[namekey] = nameslinks[namekey] Err bitreich.org 70 i 136 if "number" in outputlinks[namekey]: Err bitreich.org 70 i 137 numblinks[namekey] = outputlinks[namekey] Err bitreich.org 70 i 138 Err bitreich.org 70 i 139 displaylinks = {} Err bitreich.org 70 i 140 for link in outputlinks.keys(): Err bitreich.org 70 i 141 if "name" in outputlinks[link]: Err bitreich.org 70 i 142 displaylinks[outputlinks[link]["name"]] = link Err bitreich.org 70 i 143 elif "path" in outputlinks[link]: Err bitreich.org 70 i 144 if outputlinks[link]["path"].startswith("./"): Err bitreich.org 70 i 145 displaylinks[outputlinks[link]["path"][2:]] = \ Err bitreich.org 70 i 146 link Err bitreich.org 70 i 147 else: Err bitreich.org 70 i 148 displaylinks[outputlinks[link]["path"]] = \ Err bitreich.org 70 i 149 link Err bitreich.org 70 i 150 else: Err bitreich.org 70 i 151 displaylinks[link] = link Err bitreich.org 70 i 152 Err bitreich.org 70 i 153 displaykeys = sorted(displaylinks) Err bitreich.org 70 i 154 for dotfile in [".Links", ".names", ".cap", ".abstract"]: Err bitreich.org 70 i 155 try: Err bitreich.org 70 i 156 displaykeys.remove(dotfile) Err bitreich.org 70 i 157 except ValueError: Err bitreich.org 70 i 158 pass Err bitreich.org 70 i 159 Err bitreich.org 70 i 160 # This is why the UMN format really sucks. Err bitreich.org 70 i 161 numbers = {} Err bitreich.org 70 i 162 for numb in numblinks.keys(): Err bitreich.org 70 i 163 link = outputlinks[numb] Err bitreich.org 70 i 164 numbers[link["number"]] = outputlinks[numb] Err bitreich.org 70 i 165 if "name" in link: Err bitreich.org 70 i 166 displaykeys.remove(link["name"]) Err bitreich.org 70 i 167 elif "path" in link: Err bitreich.org 70 i 168 if link["path"].startswith("./"): Err bitreich.org 70 i 169 displaykeys.remove(link["path"][2:]) Err bitreich.org 70 i 170 else: Err bitreich.org 70 i 171 displaykeys.remove(link["path"]) Err bitreich.org 70 i 172 Err bitreich.org 70 i 173 curnumber = 1 Err bitreich.org 70 i 174 while 1: Err bitreich.org 70 i 175 if curnumber in numbers.keys(): Err bitreich.org 70 i 176 path = numbers[curnumber]["path"] Err bitreich.org 70 i 177 numbers.pop(curnumber) Err bitreich.org 70 i 178 else: Err bitreich.org 70 i 179 key = displaykeys.pop() Err bitreich.org 70 i 180 path = displaylinks[key] Err bitreich.org 70 i 181 Err bitreich.org 70 i 182 # Work on the rest of the numbered links, when no display Err bitreich.org 70 i 183 # entries are left. Err bitreich.org 70 i 184 if len(displaykeys) == 0: Err bitreich.org 70 i 185 if len(numbers) == 0: Err bitreich.org 70 i 186 break Err bitreich.org 70 i 187 randnumb = numbers.pop() Err bitreich.org 70 i 188 path = randnumb["path"] Err bitreich.org 70 i 189 Err bitreich.org 70 i 190 link = outputlinks[path] Err bitreich.org 70 i 191 if "port" not in link: Err bitreich.org 70 i 192 link["port"] = "port" Err bitreich.org 70 i 193 if "host" not in link: Err bitreich.org 70 i 194 link["host"] = "server" Err bitreich.org 70 i 195 if "name" not in link: Err bitreich.org 70 i 196 if link["path"].startswith("./"): Err bitreich.org 70 i 197 link["name"] = link["path"][2:] Err bitreich.org 70 i 198 else: Err bitreich.org 70 i 199 link["name"] = link["path"] Err bitreich.org 70 i 200 if "type" not in link: Err bitreich.org 70 i 201 link["type"] = "9" Err bitreich.org 70 i 202 Err bitreich.org 70 i 203 # dcgi escaping. Err bitreich.org 70 i 204 link["name"].replace("|", "\\|") Err bitreich.org 70 i 205 Err bitreich.org 70 i 206 print("[%s|%s|%s|%s|%s]" % (link["type"][0],\ Err bitreich.org 70 i 207 link["name"], link["path"], link["host"],\ Err bitreich.org 70 i 208 link["port"])) Err bitreich.org 70 i 209 Err bitreich.org 70 i 210 if "abstract" in link: Err bitreich.org 70 i 211 dcgifilterprint(link["abstract"].split("\n")) Err bitreich.org 70 i 212 Err bitreich.org 70 i 213 curnumber += 1 Err bitreich.org 70 i 214 Err bitreich.org 70 i 215 return 0 Err bitreich.org 70 i 216 Err bitreich.org 70 i 217 if __name__ == "__main__": Err bitreich.org 70 i 218 sys.exit(main(sys.argv)) Err bitreich.org 70 i 219 Err bitreich.org 70 .