~ubuntu-core-dev/update-notifier/ubuntu

159 by mvo
* data/hooks.py:
1
#!/usr/bin/python2.4
2
3
from optparse import OptionParser
4
import user, string, dircache, sys, os.path
5
6
    
7
class HookFiles(object):
8
    """ represents all hook files """
9
10
    # the hooks are stored here
11
    hookDir = "/var/lib/update-notifier/user.d/"
12
    
13
    class HookFile(object):
14
        """ represents a single hook file """
15
        __slots__ = [ "filename", "mtime", "cmd_run", "seen" ]
16
        
17
        def __init__(self, filename):
18
            self.filename = filename
19
            self.mtime = os.stat(HookFiles.hookDir+filename).st_mtime
20
            self.cmd_run = False
21
            self.seen = False
22
23
        def summary(self):
24
            """ show the summary for the notification """
25
            # FIXME: read rfc822 style file and get the i18n version of
26
            # "Name"
27
	    pass
28
        summary = property(summary)
29
30
        def description(self):
31
            """ show a long description for the notification """
32
            # FIXME: read rfc822 style file and get the i18n version of
33
            # "Description", convert "\n" -> " " and strstrip it afterwards
34
	    pass
35
        description = property(description)
36
37
38
    def __init__(self):
39
        self._hooks = {}
40
        self._readSeenFile()
41
        self._update()
42
43
    def _readSeenFile(self):
44
        """ read the users config file that stores what hook files are
591 by Michael Vogt
apply xdg patches by Sebastian Geiger, many thanks
45
            already seen
46
        """
47
        data_home = os.getenv("XDG_CONFIG_HOME", os.path.join(user.home, '.config'))
48
        hooks_seen = os.path.join(data_home, 'update-notifier', 'hooks_seen')
159 by mvo
* data/hooks.py:
49
        if os.path.exists(hooks_seen):
50
            for line in open(hooks_seen):
51
                filename, mtime, cmd_run = string.split(line)
52
                if os.path.exists(self.hookDir+filename) and \
53
                   not self._hooks.has_key(filename):
54
                    h = self.HookFile(filename)
55
                    h.mtime = mtime
56
                    h.cmd_run = cmd_run
57
                    h.seen = True
58
                    # check if file was motified since we last saw it
59
                    if os.stat(self.hookDir+filename).st_mtime > int(mtime):
60
                        h.seen = False
61
                    self._hooks[filename] = h
62
63
    def _update(self):
64
        """ update hook dict with the current state on the fs """
65
        for hook in dircache.listdir(self.hookDir):
66
            if self._hooks.has_key(hook):
67
                # we have it already, check if it was motified since
68
                # we last saw it
69
                h = self._hooks[hook]
70
                if os.stat(self.hookDir+hook).st_mtime > int(h.mtime):
71
                        h.seen = False
72
            else:
73
                self._hooks[hook] = self.HookFile(hook)
74
75
    def checkNew(self):
76
        """ return the list of unseen hook files """
77
        new = []
78
        self._update()
79
        for hook in self._hooks:
80
            if not self._hooks[hook].seen:
81
                new.append(self._hooks[hook])
82
        return new
83
    
84
85
def check():
86
    hooks = HookFiles()
87
    new = hooks.checkNew()
88
    return len(new)
89
90
def test():
91
    hooks = HookFiles()
92
    new = hooks.checkNew()
93
    print "Hooks: %s" % len(new)
94
    for hook in hooks._hooks:
95
        print hooks._hooks[hook].notification
96
97
98
if __name__ == "__main__":
99
    parser = OptionParser()
100
    parser.add_option("-c", "--check", action="store_true", dest="check",
101
                      default=False, help="check for new hooks")
102
    parser.add_option("-r", "--run", action="store_true", dest="run",
103
                      default=False, help="run interactive hook view")
104
    parser.add_option("-t", "--test", action="store_true", dest="test",
105
                      default=False, help="run test")
106
    (options, args) = parser.parse_args()
107
108
109
    if options.check:
110
        sys.exit(check())
111
    elif options.run:
112
        run()
113
    elif options.test:
114
        test()