/usr/lib/python3/dist-packages/provisioningserver/drivers/power/moonshot.py is in python3-maas-provisioningserver 2.4.0~beta2-6865-gec43e47e6-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | # Copyright 2015-2016 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""Moonshot IPMI Power Driver."""
__all__ = []
import re
from provisioningserver.drivers import (
make_ip_extractor,
make_setting_field,
SETTING_SCOPE,
)
from provisioningserver.drivers.power import (
PowerActionError,
PowerDriver,
)
from provisioningserver.utils import shell
from provisioningserver.utils.shell import (
call_and_check,
ExternalProcessError,
get_env_with_locale,
)
class MoonshotIPMIPowerDriver(PowerDriver):
name = 'moonshot'
description = "HP Moonshot - iLO4 (IPMI)"
settings = [
make_setting_field('power_address', "Power address", required=True),
make_setting_field('power_user', "Power user"),
make_setting_field(
'power_pass', "Power password", field_type='password'),
make_setting_field(
'power_hwaddress', "Power hardware address",
scope=SETTING_SCOPE.NODE, required=True),
]
ip_extractor = make_ip_extractor('power_address')
def detect_missing_packages(self):
if not shell.has_command_available('ipmitool'):
return ['ipmitool']
return []
def _issue_ipmitool_command(
self, power_change, power_address=None, power_user=None,
power_pass=None, power_hwaddress=None, **extra):
"""Issue ipmitool command for HP Moonshot cartridge."""
command = (
'ipmitool', '-I', 'lanplus', '-H', power_address,
'-U', power_user, '-P', power_pass
) + tuple(power_hwaddress.split())
if power_change == 'pxe':
command += ('chassis', 'bootdev', 'pxe')
else:
command += ('power', power_change)
try:
stdout = call_and_check(command, env=get_env_with_locale())
stdout = stdout.decode('utf-8')
except ExternalProcessError as e:
raise PowerActionError(
"Failed to execute %s for cartridge %s at %s: %s" % (
command, power_hwaddress,
power_address, e.output_as_unicode))
else:
# Return output if power query
if power_change == 'status':
match = re.search(r'\b(on|off)\b$', stdout)
return stdout if match is None else match.group(0)
def power_on(self, system_id, context):
self._issue_ipmitool_command('pxe', **context)
self._issue_ipmitool_command('on', **context)
def power_off(self, system_id, context):
self._issue_ipmitool_command('off', **context)
def power_query(self, system_id, context):
return self._issue_ipmitool_command('status', **context)
|