2 # -*- coding: utf-8 -*-
4 # This file is part of Karesansui Core.
6 # Copyright (C) 2009-2010 HDE, Inc.
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.
18 from karesansui.lib.utils import preprint_r
36 def set_order_key(self, string="@ORDERS"):
37 self.orders_key = string
39 def preprint_r(self, module, key=None ,indent=2,depth=None):
41 pp = pprint.PrettyPrinter(indent=indent,depth=depth)
43 pp.pprint(self.getconf(module))
45 pp.pprint(self.get(module,key))
47 def addconf(self, module, conf_array={}):
48 self.ModuleNames.append(module)
49 self.ConfigArray[module] = conf_array
52 def getconf(self, module):
54 return self.ConfigArray[module]
58 def set(self, module, key, value, is_cdp=False, multiple_file=False):
59 return self._set(module,key,value,action='set',is_cdp=is_cdp,multiple_file=multiple_file)
61 def add(self, module, key, value, is_cdp=False, multiple_file=False):
62 return self._set(module,key,value,action='add',is_cdp=is_cdp,multiple_file=multiple_file)
64 def _set(self, module, key, value, action='set', is_cdp=False, multiple_file=False):
67 self.ConfigArray[module]
71 conf = self.ConfigArray[module]
75 elif type(key) == str:
82 new_key.append(_k.replace("'","\\'"))
88 _k = _k.replace("'","\\'")
89 eval_str = "%s['%s']" % (eval_str,_k,)
91 exec("%s" % (eval_str,))
93 exec("%s['action'] = '%s'" % (eval_str,str(action)))
97 val_str = "{'value':{},'action':action,'comment':False}"
98 exec("%s = %s" % (eval_str,val_str))
100 eval_str = "%s['value']" % (eval_str,)
102 exec("%s" % (eval_str,))
105 exec("%s = %s" % (eval_str,val_str))
107 eval_str = "conf['%s']" % "']['value']['".join(new_key)
108 eval_str_value = "%s['value']" % eval_str
110 #print "%s = value" % (eval_str_value,)
111 exec("%s = value" % (eval_str_value,))
113 self.ConfigArray[module] = conf
118 eval_str_value = "conf"
120 if multiple_file is True:
121 file_name = new_key.pop(0)
122 eval_str = eval_str_value + "['%s']" % file_name
123 eval_str_value += "['%s']['value']" % file_name
125 exec("%s" % (eval_str_value,))
128 exec("%s" % (eval_str,))
131 exec("%s = %s" % (eval_str,val_str))
133 exec("%s = %s" % (eval_str_value,val_str))
137 eval_str_value += "['%s']" % _k
139 exec("%s" % (eval_str_value,))
142 exec("%s = %s" % (eval_str_value,val_str))
144 eval_str_value_base = eval_str_value
145 eval_str_value += "['value']"
147 exec("%s" % (eval_str_value,))
150 val_str = "{'value':[{},[[],None]],'action':action,'comment':False}"
152 val_str = "{'value':{},'action':action,'comment':False}"
153 exec("%s = %s" % (eval_str_value_base,val_str))
156 eval_str_value += "[0]"
158 exec("%s = value" % (eval_str_value,))
160 is_dict = not is_dict
163 exec("%s = value" % (eval_str_value,))
164 self.ConfigArray[module] = conf
168 def unset(self, module, key, is_cdp=False, multiple_file=False):
172 self.ConfigArray[module]
176 conf = self.ConfigArray[module]
178 if type(key) == list:
180 elif type(key) == str:
187 new_key.append(_k.replace("'","\\'"))
190 eval_str = "conf['%s']" % "']['value']['".join(new_key)
193 exec("del %s" % (eval_str,))
202 if multiple_file is True:
203 eval_str += "['%s']['value']" % new_key.pop(0)
210 eval_str += "['%s']" % _k
213 eval_str += "['value']"
216 is_dict = not is_dict
219 exec("del %s" % (eval_str,))
225 def get(self, module, key, with_attr=False, is_cdp=False, multiple_file=False):
229 self.ConfigArray[module]
233 conf = self.ConfigArray[module]
235 if type(key) == list:
237 elif type(key) == str:
244 new_key.append(_k.replace("'","\\'"))
247 eval_str = "conf['%s']" % "']['value']['".join(new_key)
248 if with_attr is True:
249 eval_str_value = "%s" % eval_str
251 eval_str_value = "%s['value']" % eval_str
254 exec("retval = %s" % (eval_str_value,))
263 eval_str_value = "conf"
265 if multiple_file is True:
266 eval_str_value += "['%s']['value']" % new_key.pop(0)
269 eval_str_value += "['%s']" % _k
272 eval_str_value += "['value']"
274 if with_attr is False:
275 eval_str_value += "['value']"
277 eval_str_value += "[0]"
278 is_dict = not is_dict
281 exec("retval = %s" % (eval_str_value,))
287 def delete(self, module, key, is_cdp=False, multiple_file=False):
291 self.ConfigArray[module]
295 conf = self.ConfigArray[module]
297 if type(key) == list:
299 elif type(key) == str:
306 new_key.append(_k.replace("'","\\'"))
309 eval_str = "conf['%s']" % "']['value']['".join(new_key)
310 eval_str_value = "%s['value']" % eval_str
313 exec("%s" % (eval_str,))
314 eval_str_action = "%s['action']" % eval_str
315 exec("%s = 'delete'" % (eval_str_action,))
319 self.ConfigArray[module] = conf
325 if multiple_file is True:
326 eval_str += "['%s']['value']" % new_key.pop(0)
332 eval_str += "['%s']" % _k
335 eval_str += "['value']"
338 is_dict = not is_dict
341 exec("%s" % (eval_str,))
342 eval_str_action = "%s['action']" % eval_str
343 exec("%s = 'delete'" % (eval_str_action,))
347 self.ConfigArray[module] = conf
351 def comment(self, module, key, recursive=False, is_cdp=False, multiple_file=False):
352 return self._comment(module,key,flag=True, recursive=recursive,is_cdp=is_cdp,multiple_file=multiple_file)
354 def uncomment(self, module, key, recursive=False, is_cdp=False, multiple_file=False):
355 return self._comment(module,key,flag=False,recursive=recursive,is_cdp=is_cdp,multiple_file=multiple_file)
357 def _comment(self, module, key, flag=True, recursive=False, is_cdp=False, multiple_file=False):
361 self.ConfigArray[module]
365 conf = self.ConfigArray[module]
367 if type(key) == list:
369 elif type(key) == str:
376 new_key.append(_k.replace("'","\\'"))
379 eval_str = "conf['%s']" % "']['value']['".join(new_key)
380 eval_str_value = "%s['value']" % eval_str
383 exec("%s" % (eval_str,))
384 eval_str_comment = "%s['comment']" % eval_str
385 exec("%s = flag" % (eval_str_comment,))
389 self.ConfigArray[module] = conf
395 if multiple_file is True:
396 eval_str += "['%s']['value']" % new_key.pop(0)
402 eval_str += "['%s']" % _k
405 eval_str += "['value']"
408 is_dict = not is_dict
411 exec("%s" % (eval_str,))
412 eval_str_comment = "%s['comment']" % eval_str
413 exec("%s = %s" % (eval_str_comment,str(flag),))
415 if recursive is True:
416 eval_str_value = "%s['value']" % eval_str
417 exec("_value = %s" % (eval_str_value,))
418 if type(_value) == list:
419 for _value2 in _value:
420 if type(_value2) == dict:
421 for _k2,_v2 in _value2.iteritems():
423 self._comment(module, r_key, flag, recursive, is_cdp, multiple_file)
424 elif type(_value) == dict:
425 for _k2,_v2 in _value.iteritems():
427 self._comment(module, r_key, flag, recursive, is_cdp, multiple_file)
432 self.ConfigArray[module] = conf
436 def forceset(self, module, key, value, is_cdp=False, multiple_file=False):
437 retval1 = self._set(module,key,value,action='set',is_cdp=is_cdp,multiple_file=multiple_file)
438 retval2 = self._comment(module,key,value,flag=False)
439 return retval1 & retval2
441 def query(self, module, key, regex=".*"):
442 retval = self.get(module,key)
443 if type(retval) is dict:
445 for _k,_v in retval.iteritems():
446 new_retval.append(_k)
449 if type(retval) is str:
452 if type(retval) is list:
455 if re.search(r"%s" % regex, _k):
456 new_retval.append(_k)
461 def action(self, module, key, is_cdp=False, multiple_file=False):
465 self.ConfigArray[module]
469 conf = self.ConfigArray[module]
471 if type(key) == list:
473 elif type(key) == str:
480 new_key.append(_k.replace("'","\\'"))
483 eval_str = "conf['%s']" % "']['value']['".join(new_key)
484 eval_str_action = "%s['action']" % eval_str
487 exec("retval = %s" % (eval_str_action,))
496 if multiple_file is True:
497 eval_str += "['%s']['value']" % new_key.pop(0)
503 eval_str += "['%s']" % _k
506 eval_str += "['value']"
509 is_dict = not is_dict
512 exec("%s" % (eval_str,))
513 eval_str_action = "%s['action']" % eval_str
514 exec("retval = %s" % (eval_str_action,))
520 def iscomment(self, module, key, is_cdp=False, multiple_file=False):
524 self.ConfigArray[module]
528 conf = self.ConfigArray[module]
530 if type(key) == list:
532 elif type(key) == str:
539 new_key.append(_k.replace("'","\\'"))
542 eval_str = "conf['%s']" % "']['value']['".join(new_key)
543 eval_str_comment = "%s['comment']" % eval_str
546 exec("retval = %s" % (eval_str_comment,))
555 if multiple_file is True:
556 eval_str += "['%s']['value']" % new_key.pop(0)
562 eval_str += "['%s']" % _k
565 eval_str += "['value']"
568 is_dict = not is_dict
571 exec("%s" % (eval_str,))
572 eval_str_comment = "%s['comment']" % eval_str
573 exec("retval = %s" % (eval_str_comment,))
579 def isset(self, module, key, is_cdp=False, multiple_file=False):
583 if self.get(module,key) is not False:
586 if self.get(module, key, is_cdp=True, multiple_file=multiple_file) is not False:
591 def order(self, module, key, is_parent_parser=False):
595 if type(key) == list:
596 if is_parent_parser is True:
598 search_key.append(_sk)
599 elif type(key) == str:
602 search_key.append(self.orders_key)
605 orders = self.get(module, search_key)
607 return orders.index(key)
613 def insert_order(self, module, key, num=None, is_parent_parser=False):
617 if type(key) == list:
618 if is_parent_parser is True:
620 search_key.append(_sk)
621 elif type(key) == str:
624 search_key.append(self.orders_key)
627 orders = self.get(module, search_key)
629 return orders.index(key)
633 orders.insert(num,key)
634 self.set(module, search_key, orders)
637 self.set(module, search_key, [key])
643 def change_order(self, module, key, num=None, is_parent_parser=False):
644 self.delete_order(module, key, is_parent_parser=is_parent_parser)
645 return self.insert_order(module, key, num, is_parent_parser=is_parent_parser)
647 def append_order(self, module, key, is_parent_parser=False):
648 return self.insert_order(module, key, num=None, is_parent_parser=is_parent_parser)
650 def delete_order(self, module, key, is_parent_parser=False):
654 if type(key) == list:
655 if is_parent_parser is True:
657 search_key.append(_sk)
658 elif type(key) == str:
661 search_key.append(self.orders_key)
664 orders = self.get(module, search_key)
666 num = orders.index(key)
668 self.set(module, search_key, orders)
675 def cdp_isset(self, module, key, force=False, multiple_file=False):
678 isCommentDeal = False
680 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
681 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
686 if isCommentDeal is False and force is False:
689 retval = self.isset(module,key,is_cdp=True,multiple_file=multiple_file)
693 def cdp_get(self, module, key, force=False, multiple_file=False):
696 isCommentDeal = False
698 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
699 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
704 if isCommentDeal is False and force is False:
707 ret = self.get(module, key, is_cdp=True, multiple_file=multiple_file)
708 if type(ret) == list:
713 def cdp_get_comment(self, module, key, force=False, multiple_file=False):
716 isCommentDeal = False
718 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
719 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
724 if isCommentDeal is False and force is False:
727 ret = self.get(module, key, is_cdp=True, multiple_file=multiple_file)
728 if type(ret) == list:
733 def cdp_get_pre_comment(self, module, key, force=False, multiple_file=False):
736 ret = self.cdp_get_comment(module, key, force, multiple_file)
737 if type(ret) == list:
742 def cdp_get_post_comment(self, module, key, force=False, multiple_file=False):
745 ret = self.cdp_get_comment(module, key, force, multiple_file)
746 if type(ret) == list:
752 is_opt_multi: if parameter is multidefine-able, is_opt_multi should be True
754 def cdp_set(self, module, key, value, force=False, multiple_file=False, is_opt_multi=False):
757 isCommentDeal = False
759 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
760 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
765 if isCommentDeal is False and force is False:
768 ret = self.get(module, key, is_cdp=True, multiple_file=multiple_file)
769 if type(ret) == list:
772 if is_opt_multi is True:
775 ret = [value,[[],None]]
777 return self.set(module, key, ret, is_cdp=True, multiple_file=multiple_file)
780 is_opt_multi: if parameter is multidefine-able, is_opt_multi should be True
782 def cdp_add(self, module, key, value, force=False, multiple_file=False, is_opt_multi=False):
785 isCommentDeal = False
787 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
788 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
793 if isCommentDeal is False and force is False:
796 ret = self.get(module, key, is_cdp=True, multiple_file=multiple_file)
797 if type(ret) == list:
800 if is_opt_multi is True:
803 ret = [value,[[],None]]
805 return self.add(module, key, ret, is_cdp=True, multiple_file=multiple_file)
807 def cdp_set_pre_comment(self, module, key, value, force=False, multiple_file=False):
810 isCommentDeal = False
812 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
813 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
818 if isCommentDeal is False and force is False:
821 if type(value) == list:
823 elif type(value) == str:
828 ret = self.get(module, key, is_cdp=True, multiple_file=multiple_file)
829 if type(ret) == list:
831 elif type(ret) == str:
834 ret = [ret,[value,None]]
838 return self.set(module, key, ret, is_cdp=True, multiple_file=multiple_file)
840 def cdp_set_post_comment(self, module, key, value, force=False, multiple_file=False):
843 isCommentDeal = False
845 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
846 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
851 if isCommentDeal is False and force is False:
854 if type(value) == list:
855 value = " ".join(value)
856 elif type(value) == str:
861 ret = self.get(module, key, is_cdp=True, multiple_file=multiple_file)
862 if type(ret) == list:
864 elif type(ret) == str:
867 ret = [ret,[[],value]]
871 return self.set(module, key, ret, is_cdp=True, multiple_file=multiple_file)
873 def cdp_unset(self, module, key, force=False, multiple_file=False):
876 isCommentDeal = False
878 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
879 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
884 if isCommentDeal is False and force is False:
887 return self.unset(module, key, is_cdp=True, multiple_file=multiple_file)
890 def cdp_action(self, module, key, force=False, multiple_file=False):
893 isCommentDeal = False
895 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
896 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
901 if isCommentDeal is False and force is False:
904 retval = self.action(module, key, is_cdp=True, multiple_file=multiple_file)
908 def cdp_delete(self, module, key, force=False, multiple_file=False):
911 isCommentDeal = False
913 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
914 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
919 if isCommentDeal is False and force is False:
922 retval = self.delete(module, key, is_cdp=True, multiple_file=multiple_file)
926 def cdp_iscomment(self, module, key, force=False, multiple_file=False):
929 isCommentDeal = False
931 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
932 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
937 if isCommentDeal is False and force is False:
940 retval = self.iscomment(module, key, is_cdp=True, multiple_file=multiple_file)
944 def cdp_comment(self, module, key, recursive=False, force=False, multiple_file=False):
947 isCommentDeal = False
949 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
950 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
955 if isCommentDeal is False and force is False:
958 retval = self.comment(module, key, recursive=recursive, is_cdp=True, multiple_file=multiple_file)
962 def cdp_uncomment(self, module, key, recursive=False, force=False, multiple_file=False):
965 isCommentDeal = False
967 base_parser_name = self.ConfigArray[module]['@BASE_PARSER']['value']
968 if base_parser_name == "commentDealParser" or base_parser_name == "xmlLikeConfParser":
973 if isCommentDeal is False and force is False:
976 retval = self.uncomment(module, key, recursive=recursive, is_cdp=True, multiple_file=multiple_file)
982 aop.addconf("foo",{})
983 aop.set("foo",["h'oge1","hoge2","hoge3-0"],"fuga1")
984 aop.set("foo",["h'oge1","hoge2","hoge3-1"],"fuga2")
985 aop.add("foo",["h'oge1","hoge2","hoge3-2"],"fuga2")
986 aop.delete("foo",["h'oge1","hoge2","hoge3-2"])
987 aop.uncomment("foo",["h'oge1","hoge2","hoge3-2"])
988 aop.comment("foo",["h'oge1","hoge2","hoge3-2"])
989 aop.preprint_r("foo")
990 aop.preprint_r("foo",["h'oge1"])
991 print aop.query("foo",["h'oge1","hoge2"],"^oge3-[01]")
992 print aop.action("foo",["h'oge1","hoge2","hoge3-2"])
993 print aop.iscomment("foo",["h'oge1","hoge2","hoge3-2"])
994 print aop.isset("foo",["h'oge1","hoge2","hoge3-2"])
995 print aop.isset("foo",["h'oge1","hoge2","hoge3-5"])
996 print aop.isset("foo",["h'oge1","hoge3","hoge3-2"])
997 print aop.isset("foo",["h'oge1","hoge2"])
998 print aop.getconf("foo")
999 print aop.getconf("bar")