# This file is part of the sos project: https://github.com/sosreport/sos
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# version 2 of the GNU General Public License.
#
# See the LICENSE file in the source distribution for further information.
from sos.report.plugins import Plugin, RedHatPlugin
class Sapnw(Plugin, RedHatPlugin):
short_desc = 'SAP NetWeaver'
plugin_name = 'sapnw'
profiles = ('sap',)
files = ('/usr/sap',)
def collect_list_instances(self):
""" Collect data on installed instances """
inst_list = self.collect_cmd_output(
"/usr/sap/hostctrl/exe/saphostctrl -function ListInstances",
suggest_filename="SAPInstances"
)
if inst_list['status'] != 0:
return
sidsunique = set()
# Cycle through all the instances, get 'sid', 'instance_number'
# and 'vhost' to determine the proper profile
for inst_line in inst_list['output'].splitlines():
if ("DAA" not in inst_line and not
inst_line.startswith("No instances found")):
fields = inst_line.strip().split()
if len(fields) < 8:
continue
sid = fields[3]
inst = fields[5]
vhost = fields[7]
sidsunique.add(sid)
path = f"/usr/sap/{sid}/SYS/profile/"
if not self.path_exists(path):
continue
for line in self.listdir(path):
if all(f in line for f in [sid, inst, vhost]):
ldenv = f'LD_LIBRARY_PATH=/usr/sap/{sid}/SYS/exe/run'
# Unicode is assumed here
# nuc should be accounted
path = f'/usr/sap/{sid}/SYS/exe/uc/linuxx86_64'
profile = line.strip()
# collect profiles
self.add_cmd_output(
f"env -i {ldenv} {path}/sappfpar all "
f"pf=/usr/sap/{sid}/SYS/profile/{profile}",
suggest_filename=f"{profile}_parameters"
)
# collect instance status
self.add_cmd_output(
f"env -i {ldenv} {path}/sapcontrol -nr {inst} "
"-function GetProcessList",
suggest_filename=f"{sid}_{inst}_GetProcList"
)
# collect version info for the various components
self.add_cmd_output(
f"env -i {ldenv} {path}/sapcontrol -nr {inst} "
"-function GetVersionInfo",
suggest_filename=f"{sid}_{inst}_GetVersInfo"
)
# collect