]>
Commit | Line | Data |
---|---|---|
00ec24d0 JF |
1 | #!/usr/bin/python |
2 | ||
3 | from optparse import OptionParser | |
4 | ||
0e5943eb JF |
5 | import sys |
6 | import os.path | |
7 | ||
00ec24d0 JF |
8 | try: |
9 | import apt_pkg | |
10 | except ImportError: | |
11 | print "Error importing apt_pkg, is python-apt installed?" | |
0e5943eb | 12 | sys.exit(1) |
00ec24d0 JF |
13 | |
14 | actions = { "markauto" : 1, | |
15 | "unmarkauto": 0 | |
16 | } | |
17 | ||
0e5943eb JF |
18 | def show_automatic(filename): |
19 | if not os.path.exists(STATE_FILE): | |
20 | return | |
21 | auto = set() | |
22 | tagfile = apt_pkg.ParseTagFile(open(STATE_FILE)) | |
23 | while tagfile.Step(): | |
24 | pkgname = tagfile.Section.get("Package") | |
25 | autoInst = tagfile.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.ParseTagFile(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 | while tagfile.Step(): | |
42 | pkgname = tagfile.Section.get("Package") | |
43 | autoInst = tagfile.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.RewriteSection(tagfile.Section, | |
48 | [], | |
49 | [ ("Auto-Installed",str(action)) ]) | |
50 | pkgs.remove(pkgname) | |
51 | outfile.write(newsec+"\n") | |
52 | else: | |
53 | outfile.write(str(tagfile.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 | ||
00ec24d0 JF |
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.add_option("-f", "--file", action="store", type="string", | |
72 | dest="filename", | |
73 | help="read/write a different file") | |
74 | parser.add_option("-v", "--verbose", | |
75 | action="store_true", dest="verbose", default=False, | |
76 | help="print verbose status messages to stdout") | |
77 | (options, args) = parser.parse_args() | |
00ec24d0 JF |
78 | |
79 | # get the state-file | |
80 | if not options.filename: | |
81 | STATE_FILE = apt_pkg.Config.FindDir("Dir::State") + "extended_states" | |
82 | else: | |
83 | STATE_FILE=options.filename | |
84 | ||
0e5943eb JF |
85 | if args[0] == "showauto": |
86 | show_automatic(STATE_FILE) | |
87 | else: | |
88 | # get pkgs to change | |
89 | if args[0] not in actions.keys(): | |
90 | parser.error("first argument must be 'markauto', 'unmarkauto' or 'showauto'") | |
91 | pkgs = args[1:] | |
92 | action = actions[args[0]] | |
93 | mark_unmark_automatic(STATE_FILE, action, pkgs) |