2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-30 17:46:38 +00:00

Merge pull request #4847 from xuweibj/rspconfig_gard_passwd

rspconfig gard&admin_passwd&ntpservers in python
This commit is contained in:
zet809 2018-03-01 16:37:31 +08:00 committed by GitHub
commit 6d633af336
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 136 additions and 18 deletions

View File

@ -25,6 +25,9 @@ class BmcConfigInterface(object):
def dump_process(self, task):
return task.run("dump_process")
def gard_clear(self, task):
return task.run("gard_clear")
def set_sshcfg(self, task):
return task.run("set_sshcfg")

View File

@ -23,7 +23,7 @@ from scp import SCPClient
import logging
logger = logging.getLogger('xcatagent')
RSPCONFIG_GET_NETINFO=['ip', 'netmask', 'gateway', 'vlan', 'ipsrc', 'hostname']
RSPCONFIG_GET_NETINFO=['ip', 'netmask', 'gateway', 'vlan', 'ipsrc', 'hostname', 'ntpservers']
RSPCONFIG_SET_NETINFO=['ip', 'netmask', 'gateway', 'vlan']
XCAT_LOG_DUMP_DIR = "/var/log/xcat/dump/"
@ -179,6 +179,20 @@ class OpenBMCBmcConfigTask(ParallelNodesCommand):
except SelfServerException as e:
self.callback.info('%s: %s' % (node, e.message))
def gard_clear(self, **kw):
node = kw['node']
obmc = openbmc.OpenBMCRest(name=node, nodeinfo=kw['nodeinfo'], messager=self.callback,
debugmode=self.debugmode, verbose=self.verbose)
try:
obmc.login()
obmc.clear_gard()
self.callback.info('%s: GARD cleared' % node)
except SelfServerException as e:
self.callback.info('%s: %s' % (node, e.message))
def pre_set_sshcfg(self, *arg, **kw):
local_home_dir=os.path.expanduser('~')
self.local_ssh_dir = local_home_dir + "/.ssh/"
@ -261,7 +275,8 @@ rmdir \"/tmp/$userid\" \n")
if len(netinfo_dict):
self._get_netinfo(ip=netinfo_dict.get('ip', False), ipsrc=netinfo_dict.get('ipsrc', False), netmask=netinfo_dict.get('netmask', False),
gateway=netinfo_dict.get('gateway', False),vlan= netinfo_dict.get('vlan', False),
hostname=netinfo_dict.get('hostname', False), **kw)
hostname=netinfo_dict.get('hostname', False),
ntpservers=netinfo_dict.get('ntpservers', False), **kw)
def set_attributes(self, attributes, **kw):
netinfo_dict={'vlan':False}
@ -271,6 +286,10 @@ rmdir \"/tmp/$userid\" \n")
netinfo_dict[k] = v
elif k == 'hostname':
self._set_hostname(v, **kw)
elif k == 'admin_passwd':
self._set_admin_password(v, **kw)
elif k == 'ntpservers':
self._set_ntp_servers(v, **kw)
elif k in openbmc.RSPCONFIG_APIS:
self._set_apis_values(k, v, **kw)
else:
@ -292,7 +311,66 @@ rmdir \"/tmp/$userid\" \n")
self._set_apis_values("hostname", hostname, **kw)
self._get_netinfo(hostname=True, ntpserver=False, **kw)
return
def _set_ntp_servers(self, servers, **kw):
node = kw['node']
node_info = kw['nodeinfo']
obmc = openbmc.OpenBMCRest(name=node, nodeinfo=node_info, messager=self.callback,
debugmode=self.debugmode, verbose=self.verbose)
try:
obmc.login()
netinfo = obmc.get_netinfo()
except (SelfServerException, SelfClientException) as e:
self.callback.info('%s: %s' % (node, e.message))
return
if not netinfo:
return self.callback.error("%s: No network information get" % node)
bmcip = node_info['bmcip']
nic = self._get_facing_nic(bmcip, netinfo)
if not nic:
return self.callback.error('%s: Can not get facing NIC for %s' % (node, bmcip))
try:
obmc.set_ntp_servers(nic, servers)
self.callback.info('%s: BMC Setting NTPServers...' % node)
netinfo = obmc.get_netinfo()
except (SelfServerException, SelfClientException) as e:
self.callback.info('%s: %s' % (node, e.message))
return
ntpservers = None
if nic in netinfo:
ntpservers = netinfo[nic]['ntpservers']
self.callback.info('%s: BMC NTP Servers: %s' % (node, ntpservers))
def _get_facing_nic(self, bmcip, netinfo):
for k,v in netinfo.items():
if 'ip' in v and v['ip'] == bmcip:
return k
return None
def _set_admin_password(self, admin_passwd, **kw):
node = kw['node']
node_info = kw['nodeinfo']
origin_passwd, new_passwd = admin_passwd.split(',')
if origin_passwd != node_info['password']:
self.callback.info('%s: Current BMC password is incorrect, cannot set the new password.' % node)
return
obmc = openbmc.OpenBMCRest(name=node, nodeinfo=node_info, messager=self.callback,
debugmode=self.debugmode, verbose=self.verbose)
try:
obmc.login()
obmc.set_admin_passwd(new_passwd)
self.callback.info("%s: BMC Setting Password..." % node)
except (SelfServerException, SelfClientException) as e:
self.callback.info("%s: %s" % (node, e.message))
def _set_apis_values(self, key, value, **kw):
node = kw['node']
obmc = openbmc.OpenBMCRest(name=node, nodeinfo=kw['nodeinfo'], messager=self.callback,
@ -327,7 +405,7 @@ rmdir \"/tmp/$userid\" \n")
result = "set net(%s, %s, %s) for eth0" % (ip, netmask, gateway)
return self.callback.info("set_netinfo %s" % result)
def _get_netinfo(self, ip=False, ipsrc=False, netmask=False, gateway=False, vlan=False, hostname=False, ntpserver=True, **kw):
def _get_netinfo(self, ip=False, ipsrc=False, netmask=False, gateway=False, vlan=False, hostname=False, ntpservers=False, **kw):
node = kw['node']
obmc = openbmc.OpenBMCRest(name=node, nodeinfo=kw['nodeinfo'], messager=self.callback,
debugmode=self.debugmode, verbose=self.verbose)
@ -352,7 +430,7 @@ rmdir \"/tmp/$userid\" \n")
self.callback.info("%s: BMC Hostname: %s" %(node, bmchostname))
dic_length = len(netinfo)
netinfodict = {'ip':[], 'netmask':[], 'gateway':[],
'vlan':[], 'ipsrc':[], 'ntpserver':[]}
'vlan':[], 'ipsrc':[], 'ntpservers':[]}
for nic,attrs in netinfo.items():
addon_string = ''
if dic_length > 1:
@ -362,7 +440,7 @@ rmdir \"/tmp/$userid\" \n")
netinfodict['gateway'].append("BMC Gateway"+addon_string+": %s (default: %s)" % (attrs["gateway"], defaultgateway))
netinfodict['vlan'].append("BMC VLAN ID"+addon_string+": %s" % attrs["vlanid"])
netinfodict['ipsrc'].append("BMC IP Source"+addon_string+": %s" % attrs["ipsrc"])
netinfodict['ntpserver'].append("BMC NTP Servers"+addon_string+": %s" % attrs["ntpservers"])
netinfodict['ntpservers'].append("BMC NTP Servers"+addon_string+": %s" % attrs["ntpservers"])
if ip:
for i in netinfodict['ip']:
self.callback.info("%s: %s" % (node, i))
@ -378,7 +456,7 @@ rmdir \"/tmp/$userid\" \n")
if vlan:
for i in netinfodict['vlan']:
self.callback.info("%s: %s" % (node, i))
if ntpserver:
for i in netinfodict['netserver']:
if ntpservers:
for i in netinfodict['ntpservers']:
self.callback.info("%s: %s" % (node, i))
return netinfo

View File

@ -47,6 +47,8 @@ DUMP_URLS = {
"list" : "/dump/enumerate",
}
GARD_CLEAR_URL = "/org/open_power/control/gard/action/Reset"
INVENTORY_URL = "/inventory/enumerate"
LEDS_URL = "/led/physical/enumerate"
@ -164,9 +166,11 @@ RSPCONFIG_NETINFO_URL = {
'nic_ip': "/network/#NIC#/action/IP",
'vlan': "/network/action/VLAN",
'ipdhcp': "/network/action/Reset",
'ntpserver': "/network/#NIC#/attr/NTPServers",
'ntpservers': "/network/#NIC#/attr/NTPServers",
}
PASSWD_URL = '/user/root/action/SetPassword'
RSPCONFIG_APIS = {
'hostname': {
'baseurl': "/network/config/",
@ -670,6 +674,17 @@ class OpenBMCRest(object):
data={"data": attr_info['get_data']}
return self.request(method, get_url, payload=data, cmd="get_%s" % key)
def set_admin_passwd(self, passwd):
payload = { "data": [passwd] }
self.request('POST', PASSWD_URL, payload=payload, cmd='set_admin_password')
def set_ntp_servers(self, nic, servers):
payload = { "data": [servers] }
url = RSPCONFIG_NETINFO_URL['ntpservers'].replace('#NIC#', nic)
self.request('PUT', url, payload=payload, cmd='set_ntp_servers')
def clear_dump(self, clear_arg):
if clear_arg == 'all':
@ -711,6 +726,12 @@ class OpenBMCRest(object):
path = DUMP_URLS['download'].replace('#ID#', download_id)
self.download('GET', path, file_path, headers=headers, cmd='download_dump')
def clear_gard(self):
payload = { "data": [] }
url = HTTP_PROTOCOL + self.bmcip + GARD_CLEAR_URL
return self.request('POST', url, payload=payload, cmd='clear_gard')
def get_netinfo(self):
data = self.request('GET', RSPCONFIG_NETINFO_URL['get_netinfo'], cmd="get_netinfo")
try:
@ -743,7 +764,11 @@ class OpenBMCRest(object):
info = data[dev]
utils.update2Ddict(netinfo, nicid, "vlanid", info.get("Id", "Disable"))
utils.update2Ddict(netinfo, nicid, "mac", info["MACAddress"])
utils.update2Ddict(netinfo, nicid, "ntpservers", info["NTPServers"])
ntpservers = None
tmp_ntpservers = ''.join(info["NTPServers"])
if tmp_ntpservers:
ntpservers = tmp_ntpservers
utils.update2Ddict(netinfo, nicid, "ntpservers", ntpservers)
return netinfo
except KeyError:
error = 'Error: Received wrong format response: %s' % data

View File

@ -82,24 +82,27 @@ RFLASH_URLS = {
}
}
RSPCONFIG_GET_OPTIONS = ['ip','ipsrc','netmask','gateway','vlan','hostname','bootmode','autoreboot','powersupplyredundancy','powerrestorepolicy']
RSPCONFIG_GET_OPTIONS = ['ip','ipsrc','netmask','gateway','vlan','ntpservers','hostname','bootmode','autoreboot','powersupplyredundancy','powerrestorepolicy']
RSPCONFIG_SET_OPTIONS = {
'ip':'.*',
'netmask':'.*',
'gateway':'.*',
'vlan':'\d+',
'hostname':"\*|.*",
'ntpservers':'.*',
'autoreboot':"^0|1$",
'powersupplyredundancy':"^enabled$|^disabled$",
'powerrestorepolicy':"^always_on$|^always_off$|^restore$",
'bootmode':"^regular$|^safe$|^setup$",
'admin_passwd':'.*,.*',
}
RSPCONFIG_USAGE = """
Handle rspconfig operations.
Usage:
rspconfig -h|--help
rspconfig dump [[-l|--list] | [-g|--generate] | [-c|--clear <arg>] | [-d|--download <arg>]] [-V|--verbose]
rspconfig dump [[-l|--list] | [-g|--generate] | [-c|--clear --id <arg>] | [-d|--download --id <arg>]] [-V|--verbose]
rspconfig gard -c|--clear [-V|--verbose]
rspconfig sshcfg [-V|--verbose]
rspconfig ip=dhcp [-V|--verbose]
rspconfig get [<args>...] [-V|--verbose]
@ -109,8 +112,9 @@ Options:
-V,--verbose Show verbose message
-l,--list List are dump files
-g,--generate Trigger a new dump file
-c,--clear <arg> The id of file to clear or all if specify 'all'
-d,--download <arg> The id of file to download or all if specify 'all'
-c,--clear To clear the specified dump file
-d,--download To download specified dump file
--id <arg> The dump file id or 'all'
The supported attributes to get are: %s
@ -729,11 +733,14 @@ class OpenBMCManager(base.BaseManager):
elif opts['--generate']:
DefaultBmcConfigManager().dump_generate(runner)
elif opts['--clear']:
DefaultBmcConfigManager().dump_clear(runner, opts['--clear'][0])
DefaultBmcConfigManager().dump_clear(runner, opts['--id'])
elif opts['--download']:
DefaultBmcConfigManager().dump_download(runner, opts['--download'][0])
DefaultBmcConfigManager().dump_download(runner, opts['--id'])
else:
DefaultBmcConfigManager().dump_process(runner)
elif opts['gard']:
if opts['--clear']:
DefaultBmcConfigManager().gard_clear(runner)
elif opts['sshcfg']:
DefaultBmcConfigManager().set_sshcfg(runner)
elif opts['ip=dhcp']:

View File

@ -367,16 +367,21 @@ sub refactor_args {
my $request = shift;
my $command = $request->{command}->[0];
my $extrargs = $request->{arg};
my $subcommand;
my $subcommand;
if ($command eq "rspconfig") {
$subcommand = $extrargs->[0];
if ($subcommand !~ /^dump$|^sshcfg$|^ip=dhcp$/) {
if ($subcommand !~ /^dump$|^sshcfg$|^ip=dhcp$|^gard$/) {
if (grep /=/, @$extrargs) {
unshift @$extrargs, "set";
} else {
unshift @$extrargs, "get";
}
}
if ($subcommand eq "dump") {
if (defined($extrargs->[1]) and $extrargs->[1] =~ /-c|--clear|-d|--download/){
splice(@$extrargs, 2, 0, "--id");
}
}
}
if ($command eq "reventlog") {
if (!defined($extrargs->[0])) {