diff --git a/plugins/ipmi.py b/plugins/ipmi.py new file mode 100644 index 00000000..3fdb13c7 --- /dev/null +++ b/plugins/ipmi.py @@ -0,0 +1,86 @@ +import eventlet +console = eventlet.import_patched('pyghmi.ipmi.console') +ipmisession = eventlet.import_patched('pyghmi.ipmi.private.session') + +_loopthread = None + + +def _ipmi_evtloop(): + while (1): + ipmisession.Session.wait_for_rsp(timeout=600) + + +def get_conn_params(node, config): + if 'secret.ipmiuser' in configdata: + username = configdata['secret.ipmiuser']['value'] + elif 'secret.managementuser' in configdata: + username = configdata['secret.managementuser']['value'] + else: + username = 'USERID' + if 'secret.ipmipassphrase' in configdata: + passphrase = configddata['secret.ipmi.passphrase']['value'] + elif 'secret.managementpassphrase' in configdata + passphrase = configdata['secret.managementpassphrase'] + else: + passphrase = 'PASSW0RD' # for lack of a better guess + if configdata['hardwaremanagement.manager']: + bmc = configdata['hardwaremanagement.manager'] + else: + bmc = node + if 'secret.ipmikg' in configdata: + kg = configdata['secret.ipmikg']['value'] + else: + kg = passphrase + #TODO(jbjohnso): check if the end has some number after a : without [] + #for non default port + return { + 'username': username, + 'passphrase': passphrase, + 'kg': kg, + 'bmc': bmc, + 'port': 623, + } + + +class Console(object): + def __init__(node, config, **kwargs): + crypt = config.decrypt + config.decrypt = True + configdata = config.get_node_attributes([node], + ['secret.ipmiuser', 'secret.ipmipassphrase', + 'secret.managementuser', 'secret.managementpassphrase', + 'hardwaremanagement.manager']) + connparams = get_conn_params(node, configdata) + self.username = connparams['username'] + self.password = connparams['passphrase'] + self.kg = connparams['kg'] + self.bmc = connparams['bmc'] + self.port = connparams['port'] + # Cannot actually create console until 'connect', when we get callback + + def connect(callback, **kwargs): + self.solconnection = console.Console(bmc=self.bmc, + port=self.port, + username=self.username, + password=self.password, + kg=self.kg, + iohandler=callback) + if _loopthread is None: + _loopthread = eventlet.spawn(_ipmi_evtloop) + + def write(self, data, **kwargs): + self.solconnection.send_data(data) + + +def create(nodes, element, configmanager, **kwargs): + if element == '_console/session': + if len(nodes) > 1: + raise Exception("_console/session does not support multiple nodes") + return Console(nodes[0], configmanager) + else: + raise Exception( + "TODO(jbjohnso): ipmi api implementation of %s" % element) + + +def retrieve(nodes, element, configmanager, **kwargs): + raise Exception("TODO(jbjohnso): ipmi get implementation of %s" % element)