OSDN Git Service

c5085920c194e5fea6994b2c4ed78948dc601ce0
[karesansui/karesansui.git] / karesansui / lib / parser / collectdplugin.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #
4 # This file is part of Karesansui Core.
5 #
6 # Copyright (C) 2009-2010 HDE, Inc.
7 #
8 # This program is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU Lesser General Public
10 # License as published by the Free Software Foundation; either
11 # version 2.1 of the License, or (at your option) any later version.
12 #
13
14 import os
15 import re
16 import sys
17 import glob
18
19 from karesansui.lib.dict_op import DictOp
20 from karesansui.lib.parser.base.xml_like_conf_parser import xmlLikeConfParser as Parser
21 from karesansui.lib.utils import preprint_r, r_chgrp, r_chmod
22 from karesansui.lib.const import VENDOR_SYSCONF_DIR, \
23                                  COLLECTD_DATA_DIR, KARESANSUI_GROUP
24
25
26 """
27 Define Variables for This Parser
28 """
29 PARSER_COLLECTD_PLUGIN_DIR = "%s/collectd.d" % VENDOR_SYSCONF_DIR
30
31 class collectdpluginParser:
32
33     _module = "collectdplugin"
34
35     def __init__(self):
36         self.dop = DictOp()
37         self.dop.addconf(self._module,{})
38
39         self.parser = Parser()
40         self.parser.set_delim("[ \t]+")
41         self.parser.set_new_delim("\t")
42         self.parser.set_comment("#")
43         self.base_parser_name = self.parser.__class__.__name__
44
45         from karesansui.lib.parser.collectd import collectdParser
46         collectdp = collectdParser()
47
48         self.parser.set_opt_uni(collectdp.opt_uni)
49         self.parser.set_opt_multi(collectdp.opt_multi)
50         self.parser.set_opt_sect(collectdp.opt_sect)
51
52         pass
53
54     def set_footer(self, footer=""):
55         self.parser.set_footer(footer)
56
57     def source_file(self):
58         retval = []
59
60         glob_str = "%s/*.conf" % (PARSER_COLLECTD_PLUGIN_DIR,)
61         for _afile in glob.glob(glob_str):
62             retval.append(_afile)
63
64         return retval
65
66     def read_conf(self,extra_args=None):
67         retval = {}
68
69         for _afile in self.source_file():
70
71             plugin_name = re.sub("\.conf$","",os.path.basename(_afile))
72
73             try:
74                 extra_args['include']
75                 if not re.search(extra_args['include'],plugin_name):
76                     continue
77             except:
78                 pass
79
80             self.parser.set_source_file([_afile])
81             conf_arr = self.parser.read_conf()
82             try:
83                 self.dop.set(self._module,[plugin_name],conf_arr[_afile]['value'])
84             except:
85                 pass
86
87         self.dop.set(self._module,['@BASE_PARSER'],self.base_parser_name)
88         #self.dop.preprint_r(self._module)
89         return self.dop.getconf(self._module)
90
91     def _pre_write_conf(self,conf_arr={}):
92
93         # Change permission to be able to read/write data kss group.
94         if os.path.exists(COLLECTD_DATA_DIR):
95             if os.getuid() == 0:
96                 r_chgrp(COLLECTD_DATA_DIR,KARESANSUI_GROUP)
97                 r_chmod(COLLECTD_DATA_DIR,"g+rwx")
98                 r_chmod(COLLECTD_DATA_DIR,"o-rwx")
99
100         dop = DictOp()
101         dop.addconf("__",conf_arr)
102
103         if dop.isset("__",["python"]) is True:
104             dop.cdp_unset("__",["python","Plugin","python","@ORDERS"],multiple_file=True)
105             orders = []
106             orders.append(['Encoding'])
107             orders.append(['LogTraces'])
108             orders.append(['Interactive'])
109             orders.append(['ModulePath'])
110             orders.append(['Import'])
111             orders.append(['Module'])
112             dop.cdp_set("__",["python","Plugin","python","@ORDERS"],orders,is_opt_multi=True,multiple_file=True)
113
114         return dop.getconf("__")
115
116     def write_conf(self,conf_arr={},extra_args=None,dryrun=False):
117         retval = True
118
119         conf_arr = self._pre_write_conf(conf_arr)
120
121         for plugin_name,_v in conf_arr.iteritems():
122
123             _afile = "%s/%s.conf" % (PARSER_COLLECTD_PLUGIN_DIR,plugin_name,)
124             try:
125                 _v['action']
126                 if _v['action'] == "delete":
127                     if os.path.exists(_afile):
128                         os.unlink(_afile)
129                         continue
130             except:
131                 pass
132                 #continue
133
134             try:
135                 _v['value']
136
137                 self.dop.addconf("parser",{})
138                 self.dop.set("parser",[_afile],_v['value'])
139                 #self.dop.preprint_r("parser")
140                 arr = self.dop.getconf("parser")
141                 self.parser.write_conf(arr,dryrun=dryrun)
142             except:
143                 pass
144
145         return retval
146
147 """
148 """
149 if __name__ == '__main__':
150     """Testing
151     """
152
153     parser = collectdpluginParser()
154
155     # 読み込み
156     dop = DictOp()
157     dop.addconf("dum",parser.read_conf())
158
159     new_plugin_name = "takuma"
160
161     ##########################################################
162     # Uniオプション (一箇所しか設定できないオプション) の追加
163     ##########################################################
164     # 'Foo foo' を追加(設定値リスト形式モードよる addメソッド)
165     dop.add("dum",[new_plugin_name,"Foo"],["foo",[["comment foo1","comment foo2"],"comment foo3"]])
166
167     # 'Bar bar' を追加(設定値文字列形式モードによる cdp_setメソッド)
168     dop.cdp_set("dum",[new_plugin_name,"Bar"],"bar",multiple_file=True)
169     dop.cdp_set_pre_comment("dum",[new_plugin_name,"Bar"],["","comment bar1","comment bar2"],multiple_file=True)
170     dop.cdp_set_post_comment("dum",[new_plugin_name,"Bar"],"comment bar3",multiple_file=True)
171
172     ##########################################################
173     # Multiオプション (複数設定できるオプション) の追加
174     ##########################################################
175     # 'LoadPlugin target_hoge' を追加
176     dop.cdp_set("dum",[new_plugin_name,"LoadPlugin","target_hoge"],"target_hoge",multiple_file=True,is_opt_multi=True)
177     #import pdb; pdb.set_trace()
178     dop.cdp_set_pre_comment("dum",[new_plugin_name,"LoadPlugin","target_hoge"],["","Dis is target_hoge"],multiple_file=True)
179
180     ##########################################################
181     # Sectオプション (<ブラケット>ディレクティブオプション) の追加
182     ##########################################################
183     # 下記 を追加
184     # <Plugin "foobar">
185     #        <View "hoge">
186     #                SubOpt1         gege # post
187     #        </View>
188     #        Option2         false
189     #        Option1         true
190     # </Plugin>
191     dop.cdp_set("dum",[new_plugin_name,"Plugin","foobar","Option1"],"true",multiple_file=True)
192     dop.cdp_set("dum",[new_plugin_name,"Plugin","foobar","Option2"],"false",multiple_file=True)
193     dop.cdp_set_pre_comment("dum",[new_plugin_name,"Plugin","foobar","Option2"],"pre comment",multiple_file=True)
194     dop.cdp_set_post_comment("dum",[new_plugin_name,"Plugin","foobar","Option2"],"post comment",multiple_file=True)
195     dop.cdp_set("dum",[new_plugin_name,"Plugin","foobar","View","hoge","SubOpt1"],"gege",multiple_file=True)
196     dop.cdp_set_post_comment("dum",[new_plugin_name,"Plugin","foobar","View","hoge","SubOpt1"],"post",multiple_file=True)
197
198     print dop.get("dum",["filter","@ORDERS"],multiple_file=True)
199
200     # 複数ファイルを読み込むパーサーの場合は、is_parent_parser=Trueにすること
201     # '<Plugin foobar>' を 先頭にする
202     key = [new_plugin_name,"Plugin","foobar"]
203     dop.insert_order("dum",key,0,is_parent_parser=True)
204
205     # 'LoadPlugin target_hoge' を 先頭にする => '<Plugin foobar>' は2番目になる
206     key = [new_plugin_name,"LoadPlugin","target_hoge"]
207     dop.insert_order("dum",key,0,is_parent_parser=True)
208
209     # 'Foo foo' を 先頭にする => 'LoadPlugin target_hoge' は2番目になる
210     key = [new_plugin_name,"Foo"]
211     dop.insert_order("dum",key,0,is_parent_parser=True)
212
213     #print dop.get("dum",[new_plugin_name,"@ORDERS"],multiple_file=True)
214     #sys.exit()
215
216     # 配列確認
217     conf = dop.getconf("dum")
218     preprint_r(conf)
219
220     parser.write_conf(conf,dryrun=True)