#!/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 get_storage_ldevs():
    if opt_demo:
        raw_json = storage_ldevs
        return raw_json
    url = "https://%(address)s/ConfigurationManager/v1/objects/ldevs" % args_dict
    return query(url)


def process_storage_ldevs():
    output("<<<hitachi_storage_ldevs:sep(9)>>>")
    raw_json = get_storage_ldevs()
    full_data = json.loads(raw_json)
    data = full_data["data"]
    output("ldevId\tclprId\tbyteFormatCapacity\tblockCapacity\t"
          "label\tstatus")
    for ldev in data:
        output("%s\t%s\t%s\t%s\t%s\t%s" % (ldev["ldevId"], ldev["clprId"], ldev["byteFormatCapacity"],
                                   ldev["blockCapacity"], ldev["label"], ldev["status"]))


def process_storage_clprs():
    output("<<<hitachi_storage_clprs:sep(9)>>>")
    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("<<<hitachi_storage_pools:sep(9)>>>")
    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("<<<hitachi_storage_info:sep(9)>>>")
    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()
        process_storage_ldevs()
        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
    }
  } ]
}"""

storage_ldevs = """ {
  "data" : [ {
    "ldevId" : 0,
    "clprId" : 0,
    "emulationType" : "OPEN-V-CVS",
    "byteFormatCapacity" : "500.00 G",
    "blockCapacity" : 1048576000,
    "numOfPorts" : 4,
    "ports" : [ {
      "portId" : "CL2-B",
      "hostGroupNumber" : 1,
      "hostGroupName" : "demosrv.example.com",
      "lun" : 1
    }, {
      "portId" : "CL1-B",
      "hostGroupNumber" : 1,
      "hostGroupName" : "demosrv.example.com",
      "lun" : 1
    }, {
      "portId" : "CL2-A",
      "hostGroupNumber" : 1,
      "hostGroupName" : "demosrv.example.com",
      "lun" : 1
    }, {
      "portId" : "CL1-A",
      "hostGroupNumber" : 1,
      "hostGroupName" : "demosrv.example.com",
      "lun" : 1
    } ],
    "attributes" : [ "CVS", "HDP" ],
    "label" : "vg_test0",
    "status" : "NML",
    "mpBladeId" : 0,
    "ssid" : "0004",
    "poolId" : 0,
    "numOfUsedBlock" : 0,
    "isFullAllocationEnabled" : false,
    "resourceGroupId" : 0,
    "dataReductionStatus" : "DISABLED",
    "dataReductionMode" : "disabled",
    "isAluaEnabled" : false
  }, {
    "ldevId" : 1,
    "clprId" : 0,
    "emulationType" : "OPEN-V-CVS",
    "byteFormatCapacity" : "400.00 G",
    "blockCapacity" : 838860800,
    "numOfPorts" : 4,
    "ports" : [ {
      "portId" : "CL2-B",
      "hostGroupNumber" : 1,
      "hostGroupName" : "demosrv.example.com",
      "lun" : 2
    }, {
      "portId" : "CL1-B",
      "hostGroupNumber" : 1,
      "hostGroupName" : "demosrv.example.com",
      "lun" : 2
    }, {
      "portId" : "CL2-A",
      "hostGroupNumber" : 1,
      "hostGroupName" : "demosrv.example.com",
      "lun" : 2
    }, {
      "portId" : "CL1-A",
      "hostGroupNumber" : 1,
      "hostGroupName" : "demosrv.example.com",
      "lun" : 2
    } ],
    "attributes" : [ "CVS", "HDP" ],
    "label" : "vg_test1",
    "status" : "NML",
    "mpBladeId" : 1,
    "ssid" : "0004",
    "poolId" : 0,
    "numOfUsedBlock" : 0,
    "isFullAllocationEnabled" : false,
    "resourceGroupId" : 0,
    "dataReductionStatus" : "DISABLED",
    "dataReductionMode" : "disabled",
    "isAluaEnabled" : false
  }, {
    "ldevId" : 2,
    "clprId" : 0,
    "emulationType" : "OPEN-V-CVS",
    "byteFormatCapacity" : "10.00 T",
    "blockCapacity" : 21474836480,
    "numOfPorts" : 52,
    "ports" : [ {
      "portId" : "CL2-B",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 6
    }, {
      "portId" : "CL1-B",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 6
    }, {
      "portId" : "CL2-A",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 6
    }, {
      "portId" : "CL1-A",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 6
    } ],
    "attributes" : [ "CVS", "HDP" ],
    "label" : "vmware_legacy_ssd0",
    "status" : "NML",
    "mpBladeId" : 0,
    "ssid" : "0004",
    "poolId" : 0,
    "numOfUsedBlock" : 9604460544,
    "isFullAllocationEnabled" : false,
    "resourceGroupId" : 0,
    "dataReductionStatus" : "DISABLED",
    "dataReductionMode" : "disabled",
    "isAluaEnabled" : false
  }, {
    "ldevId" : 3,
    "clprId" : 0,
    "emulationType" : "OPEN-V-CVS",
    "byteFormatCapacity" : "10.00 T",
    "blockCapacity" : 21474836480,
    "numOfPorts" : 52,
    "ports" : [ {
      "portId" : "CL2-B",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 5
    }, {
      "portId" : "CL1-B",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 5
    }, {
      "portId" : "CL2-A",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 5
    }, {
      "portId" : "CL1-A",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 5
    } ],
    "attributes" : [ "CVS", "HDP" ],
    "label" : "vmware_legacy_ssd1",
    "status" : "NML",
    "mpBladeId" : 1,
    "ssid" : "0004",
    "poolId" : 0,
    "numOfUsedBlock" : 7754084352,
    "isFullAllocationEnabled" : false,
    "resourceGroupId" : 0,
    "dataReductionStatus" : "DISABLED",
    "dataReductionMode" : "disabled",
    "isAluaEnabled" : false
  }, {
    "ldevId" : 4,
    "clprId" : 0,
    "emulationType" : "OPEN-V-CVS",
    "byteFormatCapacity" : "5.00 T",
    "blockCapacity" : 10737418240,
    "numOfPorts" : 52,
    "ports" : [ {
      "portId" : "CL2-B",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 4
    }, {
      "portId" : "CL1-B",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 4
    }, {
      "portId" : "CL2-A",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 4
    }, {
      "portId" : "CL1-A",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 4
    } ],
    "attributes" : [ "CVS", "HDP" ],
    "label" : "vmware_legacy_ssd2",
    "status" : "NML",
    "mpBladeId" : 0,
    "ssid" : "0004",
    "poolId" : 0,
    "numOfUsedBlock" : 5074944,
    "isFullAllocationEnabled" : false,
    "resourceGroupId" : 0,
    "dataReductionStatus" : "DISABLED",
    "dataReductionMode" : "disabled",
    "isAluaEnabled" : false
  }, {
    "ldevId" : 5,
    "clprId" : 0,
    "emulationType" : "OPEN-V-CVS",
    "byteFormatCapacity" : "5.00 T",
    "blockCapacity" : 10737418240,
    "numOfPorts" : 52,
    "ports" : [ {
      "portId" : "CL2-B",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 3
    }, {
      "portId" : "CL1-B",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 3
    }, {
      "portId" : "CL2-A",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 3
    }, {
      "portId" : "CL1-A",
      "hostGroupNumber" : 2,
      "hostGroupName" : "demosrv0803",
      "lun" : 3
    } ],
    "attributes" : [ "CVS", "HDP" ],
    "label" : "vmware_legacy_ssd3",
    "status" : "NML",
    "mpBladeId" : 1,
    "ssid" : "0004",
    "poolId" : 0,
    "numOfUsedBlock" : 1014042624,
    "isFullAllocationEnabled" : false,
    "resourceGroupId" : 0,
    "dataReductionStatus" : "DISABLED",
    "dataReductionMode" : "disabled",
    "isAluaEnabled" : false
  } ]
}"""
if __name__ == "__main__":
    main()