]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/python | |
2 | ||
3 | from optparse import OptionParser | |
4 | ||
5 | import sys | |
6 | import os.path | |
7 | ||
8 | try: | |
9 | import apt_pkg | |
10 | except ImportError: | |
11 | print >> sys.stderr, "Error importing apt_pkg, is python-apt installed?" | |
12 | sys.exit(1) | |
13 | ||
14 | actions = { "markauto" : 1, | |
15 | "unmarkauto": 0 | |
16 | } | |
17 | ||
18 | def show_automatic(filename): | |
19 | if not os.path.exists(STATE_FILE): | |
20 | return | |
21 | auto = set() | |
22 | tagfile = apt_pkg.TagFile(open(STATE_FILE)) | |
23 | for section in tagfile: | |
24 | pkgname = section.get("Package") | |
25 | autoInst = section.get("Auto-Installed") | |
26 | if int(autoInst): | |
27 | auto.add(pkgname) | |
28 | print "\n".join(sorted(auto)) | |
29 | ||
30 | ||
31 | def mark_unmark_automatic(filename, action, pkgs): | |
32 | " mark or unmark automatic flag" | |
33 | # open the statefile | |
34 | if os.path.exists(STATE_FILE): | |
35 | try: | |
36 | tagfile = apt_pkg.TagFile(open(STATE_FILE)) | |
37 | outfile = open(STATE_FILE+".tmp","w") | |
38 | except IOError, msg: | |
39 | print "%s, are you root?" % (msg) | |
40 | sys.exit(1) | |
41 | for section in tagfile: | |
42 | pkgname = section.get("Package") | |
43 | autoInst = section.get("Auto-Installed") | |
44 | if pkgname in pkgs: | |
45 | if options.verbose: | |
46 | print "changing %s to %s" % (pkgname,action) | |
47 | newsec = apt_pkg.rewrite_section(section, | |
48 | [], | |
49 | [ ("Auto-Installed",str(action)) ]) | |
50 | pkgs.remove(pkgname) | |
51 | outfile.write(newsec+"\n") | |
52 | else: | |
53 | outfile.write(str(section)+"\n") | |
54 | if action == 1: | |
55 | for pkgname in pkgs: | |
56 | if options.verbose: | |
57 | print "changing %s to %s" % (pkgname,action) | |
58 | outfile.write("Package: %s\nAuto-Installed: %d\n\n" % (pkgname, action)) | |
59 | # all done, rename the tmpfile | |
60 | os.chmod(outfile.name, 0644) | |
61 | os.rename(outfile.name, STATE_FILE) | |
62 | os.chmod(STATE_FILE, 0644) | |
63 | ||
64 | ||
65 | if __name__ == "__main__": | |
66 | apt_pkg.init() | |
67 | ||
68 | # option parsing | |
69 | parser = OptionParser() | |
70 | parser.usage = "%prog [options] {markauto|unmarkauto} packages..." | |
71 | parser.epilog = "apt-mark is deprecated, use apt-get markauto/unmarkauto." | |
72 | parser.add_option("-f", "--file", action="store", type="string", | |
73 | dest="filename", | |
74 | help="read/write a different file") | |
75 | parser.add_option("-v", "--verbose", | |
76 | action="store_true", dest="verbose", default=False, | |
77 | help="print verbose status messages to stdout") | |
78 | (options, args) = parser.parse_args() | |
79 | ||
80 | if not args: | |
81 | parser.print_help() | |
82 | sys.exit(1) | |
83 | ||
84 | # get the state-file | |
85 | if not options.filename: | |
86 | STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states" | |
87 | else: | |
88 | STATE_FILE=options.filename | |
89 | ||
90 | if len(args) == 0: | |
91 | parser.error("first argument must be 'markauto', 'unmarkauto' or 'showauto'") | |
92 | ||
93 | if args[0] == "showauto": | |
94 | show_automatic(STATE_FILE) | |
95 | else: | |
96 | # get pkgs to change | |
97 | if args[0] not in actions.keys(): | |
98 | parser.error("first argument must be 'markauto', 'unmarkauto' or 'showauto'") | |
99 | pkgs = args[1:] | |
100 | action = actions[args[0]] | |
101 | mark_unmark_automatic(STATE_FILE, action, pkgs) |