]>
Commit | Line | Data |
---|---|---|
1 | import threading\r | |
2 | import MySQLdb as db\r | |
3 | \r | |
4 | class Subsystem(object):\r | |
5 | #--------------------------------------------------------------#\r | |
6 | # i'm not entirely sure if this functionality is still\r | |
7 | # required, but it seems it was removed from this module\r | |
8 | # but not from cmd_admin, so I can only assume the removal\r | |
9 | # was not intentional.\r | |
10 | \r | |
11 | db_up = True\r | |
12 | \r | |
13 | @classmethod\r | |
14 | def set_db_up(cls, up):\r | |
15 | cls.db_up = up\r | |
16 | \r | |
17 | @classmethod\r | |
18 | def get_db_up(cls):\r | |
19 | return cls.db_up\r | |
20 | \r | |
21 | #--------------------------------------------------------------#\r | |
22 | \r | |
23 | def __init__(self, module, options, name):\r | |
24 | self.module = module\r | |
25 | self.__options = options\r | |
26 | self.__lock = threading.Lock()\r | |
27 | self.name = name\r | |
28 | self.__timer = None\r | |
29 | self.conn = None\r | |
30 | self.cursor = None\r | |
31 | self.reload()\r | |
32 | \r | |
33 | def db_open(self):\r | |
34 | self.conn = db.connect(\r | |
35 | host=self.module.config.get('database', 'host'),\r | |
36 | user=self.module.config.get('database', 'user'),\r | |
37 | passwd=self.module.config.get('database', 'passwd'),\r | |
38 | db=self.module.config.get('database', 'db'),\r | |
39 | unix_socket=self.module.config.get('database','sock')\r | |
40 | )\r | |
41 | self.conn.ping(True)\r | |
42 | self.conn.autocommit(True)\r | |
43 | self.cursor = self.conn.cursor()\r | |
44 | \r | |
45 | def db_close(self):\r | |
46 | if self.cursor != None:\r | |
47 | self.cursor.close()\r | |
48 | self.cursor = None\r | |
49 | \r | |
50 | if self.conn != None:\r | |
51 | self.conn.close()\r | |
52 | self.conn = None\r | |
53 | \r | |
54 | def reload(self):\r | |
55 | self.__delay = self.get_option('update_period', int, 120)\r | |
56 | \r | |
57 | if self.__timer != None:\r | |
58 | self.stop()\r | |
59 | self.on_reload()\r | |
60 | self.start()\r | |
61 | else:\r | |
62 | self.on_reload()\r | |
63 | \r | |
64 | def on_reload(self):\r | |
65 | pass\r | |
66 | \r | |
67 | def get_option(self, name, type, default):\r | |
68 | return self.__options.get('%s_%s' % (self.name, name), type, default)\r | |
69 | \r | |
70 | def set_option(self, name, value):\r | |
71 | return self.__options.set('%s_%s' % (self.name, name), value)\r | |
72 | \r | |
73 | def start(self):\r | |
74 | self.__timer = threading.Timer(self.__delay, self.worker)\r | |
75 | self.__timer.daemon = True\r | |
76 | self.__timer.start()\r | |
77 | \r | |
78 | def stop(self):\r | |
79 | self.__lock.acquire()\r | |
80 | \r | |
81 | try:\r | |
82 | if self.__timer != None:\r | |
83 | self.__timer.cancel()\r | |
84 | self.__timer = None\r | |
85 | finally:\r | |
86 | self.__lock.release()\r | |
87 | \r | |
88 | def update(self):\r | |
89 | self.__lock.acquire()\r | |
90 | \r | |
91 | try:\r | |
92 | self.commit()\r | |
93 | finally:\r | |
94 | self.__lock.release()\r | |
95 | \r | |
96 | def force(self):\r | |
97 | self.update()\r | |
98 | \r | |
99 | def commit(self):\r | |
100 | pass\r | |
101 | \r | |
102 | def worker(self):\r | |
103 | try:\r | |
104 | if self.conn != None:\r | |
105 | self.conn.ping(True)\r | |
106 | finally:\r | |
107 | pass\r | |
108 | \r | |
109 | if self.__class__.db_up:\r | |
110 | self.update()\r | |
111 | \r | |
112 | self.__timer = threading.Timer(self.__delay, self.worker)\r | |
113 | self.__timer.daemon = True\r | |
114 | self.__timer.start()\r | |
115 | \r |