#!/usr/bin/env python # -*- encoding: utf-8; py-indent-offset: 4 -*- # +------------------------------------------------------------------+ # | ____ _ _ __ __ _ __ | # | / ___| |__ ___ ___| | __ | \/ | |/ / | # | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / | # | | |___| | | | __/ (__| < | | | | . \ | # | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ | # | | # | Copyright Mathias Kettner 2020 mk@mathias-kettner.de | # +------------------------------------------------------------------+ # # This file is part of Check_MK. # The official homepage is at http://mathias-kettner.de/check_mk. # # check_mk is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation in version 2. check_mk is distributed # in the hope that it will be useful, but WITHOUT ANY WARRANTY; with- # out even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. See the GNU General Public License for more de- # tails. You should have received a copy of the GNU General Public # License along with GNU Make; see the file COPYING. If not, write # to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, # Boston, MA 02110-1301 USA. import sys import getopt import pprint import json #from requests.packages.urllib3.exceptions import InsecureRequestWarning def usage(): sys.stderr.write("""Check_MK Hitachi VSP USAGE: agent_hitachivsp [OPTIONS] HOST OPTIONS: -h, --help Show this help message and exit --address Host address --user Username --password Password --no-cert-check Disable certificate check """) sys.exit(1) short_options = "h" long_options = ["help", "username=", "password=", "address=", "demo", "no-cert-check"] try: opts, args = getopt.getopt(sys.argv[1:], short_options, long_options) except getopt.GetoptError as err: sys.stderr.write("%s\n" % err) sys.exit(1) opt_demo = True opt_cert = True args_dict = {} for o,a in opts: if o in [ "--address" ]: args_dict["address"] = a elif o in [ "--username" ]: args_dict["username"] = a elif o in [ "--password" ]: args_dict["password"] = a elif o in [ "--demo" ]: opt_demo = True elif o in [ "--no-cert-check" ]: opt_cert = False elif o in [ "-h", "--help" ]: usage() def query(url): if opt_cert == False: requests.packages.urllib3.disable_warnings(InsecureRequestWarning) response = requests.get(url, auth = (args_dict["username"], args_dict["password"]), verify=opt_cert) raw_json = response.text return raw_json output_lines = [] def output(line): if type(line) not in [str]: output_lines.append(pprint.pprint(line)) else: output_lines.append(line) def get_storage_info(): if opt_demo: raw_json = storage_info return raw_json url = "https://%(address)s/ConfigurationManager/v1/objects/storages/instance" % args_dict return query(url) def get_storage_pools(): if opt_demo: raw_json = storage_pools return raw_json url = "https://%(address)s/ConfigurationManager/v1/objects/pools" % args_dict return query(url) def get_storage_clprs(): if opt_demo: raw_json = storage_clprs return raw_json url = "https://%(address)s/ConfigurationManager/v1/objects/clprs" % args_dict return query(url) def process_storage_clprs(): output("<<>>") raw_json = get_storage_clprs() full_data = json.loads(raw_json) data = full_data["data"] output("clprId\tcacheMemoryCapacity\tcacheMemoryUsedCapacity\twritePendingDataCapacity\t" "writePendingDataCapacity\tcacheUsageRate") for clpr in data: output("%s\t%s\t%s\t%s\t%s" % (clpr["clprId"], clpr["cacheMemoryCapacity"], clpr["cacheMemoryUsedCapacity"], clpr["writePendingDataCapacity"], clpr["cacheUsageRate"])) def process_storage_pools (): output("<<>>") raw_json = get_storage_pools() full_data = json.loads(raw_json) data = full_data["data"] output("poolID\tpoolType\tpoolName\ttotalPhysicalCapacity\ttotalPoolCapacity\tavailableVolumeCapacity\tusedCapacityRate\tpoolStatus") for pool in data: output("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s" % (pool["poolId"], pool["poolType"], pool["poolName"], pool["totalPhysicalCapacity"], pool["totalPoolCapacity"], pool["availableVolumeCapacity"], pool["usedCapacityRate"], pool["poolStatus"],)) def process_storage_info(): output("<<>>") raw_json = get_storage_info() data = json.loads(raw_json) output("%s\t%s\t%s\t%s" % (data["serialNumber"], data["storageDeviceId"], data["dkcMicroVersion"], data["model"])) def main(): try: process_storage_info() process_storage_pools() process_storage_clprs() sys.stdout.write("\n".join(output_lines) + "\n") except Exception as e: sys.stderr.write("Connection error: %s" % e) sys.exit(1) storage_info = """{ "storageDeviceId": "666666666666", "model": "VSP G700", "serialNumber": 666666, "ctl1Ip": "192.168.223.69", "ctl2Ip": "192.168.223.70", "dkcMicroVersion": "88-04-03/00", "communicationModes": [ { "communicationMode": "lanConnectionMode" } ], "isSecure": true }""" storage_clprs="""{ "data": [ { "clprId": 0, "clprName": "CLPR0", "cacheMemoryCapacity": 924672, "cacheMemoryUsedCapacity": 901454, "writePendingDataCapacity": 44959, "sideFilesCapacity": 0, "cacheUsageRate": 99, "writePendingDataRate": 5, "sideFilesUsageRate": 0 } ] }""" storage_pools = """ { "data" : [ { "poolId" : 0, "poolStatus" : "POLN", "usedCapacityRate" : 47, "usedPhysicalCapacityRate" : 47, "poolName" : "RAID6_HDT_01", "availableVolumeCapacity" : 208964826, "availablePhysicalVolumeCapacity" : 208964826, "totalPoolCapacity" : 397630296, "totalPhysicalCapacity" : 397630296, "numOfLdevs" : 136, "firstLdevId" : 3, "warningThreshold" : 80, "depletionThreshold" : 90, "virtualVolumeCapacityRate" : -1, "isMainframe" : false, "isShrinking" : true, "locatedVolumeCount" : 242, "totalLocatedCapacity" : 234976098, "blockingMode" : "NB", "totalReservedCapacity" : 0, "reservedVolumeCount" : 0, "poolActionMode" : "AUT", "tierOperationStatus" : "MON", "dat" : "VAL", "poolType" : "RT", "monitoringMode" : "CM", "tiers" : [ { "tierNumber" : 1, "tierLevelRange" : "00000001", "tierDeltaRange" : "00000005", "tierUsedCapacity" : 31524696, "tierTotalCapacity" : 37087848, "tablespaceRate" : 10, "performanceRate" : 4, "progressOfReplacing" : 100, "bufferRate" : 5 }, { "tierNumber" : 2, "tierLevelRange" : "00000000", "tierDeltaRange" : "00000005", "tierUsedCapacity" : 98679336, "tierTotalCapacity" : 116093208, "tablespaceRate" : 10, "performanceRate" : 12, "progressOfReplacing" : 100, "bufferRate" : 5 }, { "tierNumber" : 3, "tierLevelRange" : "00000000", "tierDeltaRange" : "00000000", "tierUsedCapacity" : 58461480, "tierTotalCapacity" : 244449240, "tablespaceRate" : 10, "performanceRate" : 62, "progressOfReplacing" : 100, "bufferRate" : 5 } ], "dataReductionAccelerateCompCapacity" : 0, "dataReductionAccelerateCompRate" : 0, "compressionRate" : 0, "dataReductionAccelerateCompIncludingSystemData" : { "isReductionCapacityAvailable" : true, "reductionCapacity" : 0, "isReductionRateAvailable" : true, "reductionRate" : 0 }, "capacitiesExcludingSystemData" : { "usedVirtualVolumeCapacity" : 386386968576 } }, { "poolId" : 1, "poolStatus" : "POLN", "usedCapacityRate" : 0, "usedPhysicalCapacityRate" : 0, "snapshotCount" : 0, "poolName" : "THIN_IMAGE_POOL", "availableVolumeCapacity" : 46453344, "availablePhysicalVolumeCapacity" : 46453344, "totalPoolCapacity" : 46453344, "totalPhysicalCapacity" : 46453344, "numOfLdevs" : 16, "firstLdevId" : 22, "warningThreshold" : 80, "virtualVolumeCapacityRate" : -1, "isMainframe" : false, "isShrinking" : false, "poolType" : "HTI", "dataReductionAccelerateCompCapacity" : 0, "dataReductionAccelerateCompRate" : 0, "compressionRate" : 0, "dataReductionAccelerateCompIncludingSystemData" : { "isReductionCapacityAvailable" : true, "reductionCapacity" : 0, "isReductionRateAvailable" : false }, "capacitiesExcludingSystemData" : { "usedVirtualVolumeCapacity" : 0 } } ] }""" if __name__ == "__main__": main()