#!/bin/python # Adam's CD indexing tool. # ats@offog.org import os, sys, getopt # The prefix for generating CD IDs. id_prefix = "A" # The shared index directory. This must contain "contents" and "titles" # subdirectories. index_dir = "/5g/cdindex" # ---- def die(s): print s sys.exit(1) def format(width, data): o = "" for i in range(len(width)): o += (data[i] + " " * width[i])[:width[i]] print o try: optlist, args = getopt.getopt(sys.argv[1:], "p:au:s:t:nh") except getopt.GetoptError: die("Use cdcatalog -h for help.") operation = None oparg = None title = None index = 1 for o, a in optlist: if o == "-h": print "Usage: cdcatalog [-p prefix] [-a] [-u id] [-s string] [-h] [-n] [-t title] [mountpoint]" print "-a Add new disc (-n: don't index, -t: set title)" print "-u Update disc" print "-s Search for file" print "-h Show this help" sys.exit(0) elif o in ("-a", "-u", "-s"): if operation is not None: die("More than one operation specified.") (operation, oparg) = (o, a) elif o == "-n": index = 0 elif o == "-t": title = a elif o == "-p": id_prefix = a if operation is None: print "Nothing to do." elif operation in ("-a", "-u"): if o == "-u": id = oparg else: n = 1 discs = os.listdir(index_dir + "/titles") while id_prefix + str(n) in discs: n += 1 id = id_prefix + str(n) if title is None: title = "Disc " + id if index: if len(args) != 1: die("Must specify exactly one mountpoint for -a/-u.") mountpoint = args[0] while mountpoint[-1] == "/": mountpoint = mountpoint[:-1] os.system("mount '" + mountpoint + "'") f = os.popen("find '" + mountpoint + "' -type f -print") files = map(lambda x: x[:-1], f.readlines()) f.close() size = {} for x in files: size[x] = os.stat(x).st_size os.system("umount '" + mountpoint + "'") if len(files) == 0: die("Failed to find any files to catalogue.") else: files = {} print "Disc " + id + ":" print "Title " + title + "." print "Found " + str(len(files)) + " files." print >>open(index_dir + "/titles/" + id, "w"), title f = open(index_dir + "/contents/" + id, "w") for x in files: print >>f, str(size[x]) + ":" + x[len(mountpoint) + 1:] f.close() elif operation == "-s": key = oparg.lower() results = [] discs = os.listdir(index_dir + "/contents") for d in discs: for f in open(index_dir + "/contents/" + d).readlines(): (size, name) = f[:-1].split(":", 1) if name.lower().find(key) != -1: results.append((d, name, size)) titles = {} for (disc, name, size) in results: if not titles.has_key(disc): titles[disc] = open(index_dir + "/titles/" + disc).read()[:-1] results.sort(lambda a, b: cmp(a[1], b[1])) f = (7, 15, 40, 10) format(f, ("ID", "Title", "Filename", "Size")) for (disc, name, size) in results: format(f, (disc, titles[disc], name, size))