5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 from __future__ import print_function
24 from cmframework.apis import cmmanage
25 from cmframework.apis import cmerror
26 from cmframework.utils import cmlogger
27 from cmframework.utils import cmalarm
30 class VerboseLogger(object):
31 def __call__(self, msg):
35 class CMAgent(object):
41 self.log_level = cmlogger.CMLogger.str_to_level('debug')
42 self.log_dest = cmlogger.CMLogger.str_to_dest('syslog')
44 self.verbose_logger = VerboseLogger()
47 def log_level_parser(level):
49 return cmlogger.CMLogger.str_to_level(level)
50 except cmerror.CMError as exp:
51 raise argparse.ArgumentTypeError(str(exp))
54 def log_dest_parser(dest):
56 return cmlogger.CMLogger.str_to_dest(dest)
57 except cmerror.CMError as exp:
58 raise argparse.ArgumentTypeError(str(exp))
60 def __call__(self, args):
61 parser = argparse.ArgumentParser(description='Configuration Management Agent',
63 parser.add_argument('--ip',
66 default='config-manager',
70 parser.add_argument('--port',
72 metavar='SERVER-PORT',
77 parser.add_argument('--client-lib',
80 default='cmframework.lib.CMClientImpl',
84 parser.add_argument('--log-level',
88 help=('The enabled logging level, possible values are '
89 '{debug, info, warn, error}'),
90 type=CMAgent.log_level_parser,
91 default=self.log_level,
94 parser.add_argument('--log-dest',
98 help='The logs destination, possible values are {console, syslog}',
99 type=CMAgent.log_dest_parser,
100 default=self.log_dest,
103 parser.add_argument('--verbose',
108 args = parser.parse_args(args)
112 def _init_api(self, ip, port, client_lib):
114 serverip = socket.gethostbyname(ip)
115 except socket.gaierror:
116 # use localhost in-case we cannot resolve the provided hostname
117 serverip = '127.0.0.1'
119 self.api = cmmanage.CMManage(serverip, port, client_lib, self.verbose_logger)
123 cmd = 'systemctl reboot'
125 process = subprocess.Popen(args)
126 return process.wait()
128 def process(self, args):
129 cmlogger.CMLogger(args.log_dest, args.verbose, args.log_level)
131 self._init_api(args.ip, args.port, args.client_lib)
133 node_name = socket.gethostname()
135 reboot_request_alarm = cmalarm.CMRebootRequestAlarm()
136 reboot_request_alarm.cancel_alarm_for_node(node_name)
138 reboot = self.api.activate_node(node_name)
140 logging.warn('Going to reboot this node')
141 res = self._reboot_node()
143 logging.error('Reboot failed')
151 except cmerror.CMError as exp:
152 print ('Failed with error: %s' % str(exp))
154 # TODO: catch all exceptions?
157 if __name__ == '__main__':