使用python获取 arcgis server 服务的状态并转存到文件中

环境:python2.7、arcgis server 10.1、windows10

工具:pycharm

代码如下:

# coding=utf-8
"""
@author: TanShengtao
@contact: 1643506641@qq.com
@csdn blog: Ricardo.M.Tan
@software: PyCharm 
@file: service_property.py 
@create: 2020/12/4 11:20 
"""
import httplib, urllib, json
import getpass
import sys

a, b, c = sys.stdin, sys.stdout, sys.stderr
reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdin, sys.stdout, sys.stderr = a, b, c


def get_token(username, password, ser_name, ser_port):
    """
    获取令牌
    :param username: 用户名
    :param password: 密码
    :param ser_name: 服务名称(IP)
    :param ser_port: 端口
    :return:
    """
    token_url = "/arcgis/admin/generateToken"
    params = urllib.urlencode({
        "username": username,
        "password": password,
        "client": "requestip",
        "f": "json"
    })

    headers = {
        "Content-type": "application/x-www-form-urlencoded",
        "Accept": "text/plain"
    }

    http_conn = httplib.HTTPConnection(ser_name, ser_port)
    http_conn.request("POST", token_url, params, headers)

    response = http_conn.getresponse()
    if response.status != 200:
        http_conn.close()
        print("Error while fetching tokens from admin url, please check the url and try again.")
        return
    else:
        data = response.read()
        http_conn.close()

        if not assert_json_success(data):
            return
        token = json.loads(data)
        return token["token"]


def assert_json_success(data):
    """
    校验json数据合理性
    :param data:json数据
    :return:
    """
    obj = json.loads(data)
    if "status" in obj and obj["status"] == "error":
        print("Error: Json object returns an error. {obj}".format(obj=str(obj)))
        return False
    else:
        return True


def server_property_read_to_csv(argv=None):
    """
    获取arcgis server的Utilities目录下的服务状态
    :param argv:
    """
    username = input("Enter username: ")
    password = getpass.getpass("Enter password: ")
    ser_name = input("Enter server name: ")
    # ser_name="192.168.1.105"
    ser_port = 6080
    result_file = input("Output File: ")
    # result_file = r"C:\Users\Administrator\Desktop\property.csv"
    token = get_token(username, password, ser_name, ser_port)
    ser_url = "/arcgis/admin/services/"
    params = urllib.urlencode({
        "token": token,
        "f": "json"
    })

    headers = {
        "Content-type": "application/x-www-form-urlencoded",
        "Accept": "text/plain"
    }

    http_conn = httplib.HTTPConnection(ser_name, ser_port)
    http_conn.request("POST", ser_url, params, headers)

    response = http_conn.getresponse()
    if response.status != 200:
        http_conn.close()
        print("Error")
        return
    else:
        data = response.read()
        if not assert_json_success(data):
            print("Json error.{data}".format(data=str(data)))
            return
        else:
            print("go.")

        data_obj = json.loads(data)
        http_conn.close()

        folders = data_obj["folders"]
        folders.remove("System")

        folders.append("")

        ser_pro_file = open(result_file, "w")
        ser_pro_file.write("ServiceName,Folder,Type,Status,Min Instances,Max Instances,FeatureService,kml,wms,Max Records,Cluster,Cache Directory,Jobs Directory,Output Directory\n")

        for folder in folders:
            if folder != "":
                fld_url = "{ser}/{fld}/".format(ser="/arcgis/admin/services/", fld=folder)
                params = urllib.urlencode({
                    "token": token,
                    "f": "json"
                })

                headers = {
                    "Content-type": "application/x-www-form-urlencoded",
                    "Accept": "text/plain"
                }

                http_conn = httplib.HTTPConnection(ser_name, ser_port)
                http_conn.request("POST", fld_url, params, headers)
                response = http_conn.getresponse()
                if response.status != 200:
                    http_conn.close()
                    print("Could not read folder information.")
                    return
                else:
                    data = response.read()
                    if not assert_json_success(data):
                        return

                    data_obj = json.loads(data)
                    http_conn.close()

                    print("len of data_obj: {len}".format(len=len(data_obj)))
                    for item in data_obj["services"]:
                        if item["type"] == "GeometryServer":
                            if folder:
                                str_url = "/arcgis/admin/services/{fld}/{ser_name}.{type}".format(
                                    fld=folder, ser_name=item["serviceName"], type=item["type"])
                                status_url = "{url}/status".format(url=str_url)
                            else:
                                str_url = "/arcgis/admin/services/{ser_name}.{type}".format(
                                    ser_name=item["serviceName"], type=item["type"])
                                status_url = "{url}/status".format(url=str_url)

                            http_conn.request("POST", str_url, params, headers)
                            response = http_conn.getresponse()
                            read_data = response.read()
                            json_obj = json.loads(read_data)

                            http_conn.request("POST", status_url, params, headers)
                            response_status = http_conn.getresponse()
                            read_data = response_status.read()
                            json_status = json.loads(read_data)

                            line = "{ser_name},{fld},{type},{real_time_state},{min_inst_per_node},{max_inst_per_node},NA,NA,NA,NA,{cluster_name},NA,NA,NA\n".format(
                                ser_name=str(json_obj["serviceName"]), fld=folder, type=str(item["type"]),
                                real_time_state=json_status["realTimeState"],
                                min_inst_per_node=str(json_obj["minInstancesPerNode"]),
                                max_inst_per_node=str(json_obj["maxInstancesPerNode"]),
                                cluster_name=str(json_obj["clusterName"]))
                            ser_pro_file.write(line)
                            http_conn.close()
                        elif item["type"] == "SearchServer":
                            if folder:
                                str_url = "/arcgis/admin/services/{fld}/{ser_name}.{type}".format(
                                    fld=folder, ser_name=item["serviceName"], type=item["type"])
                                status_url = "{url}/status".format(url=str_url)
                            else:
                                str_url = "/arcgis/admin/services/{ser_name}.{type}".format(
                                    ser_name=item["serviceName"], type=item["type"])
                                status_url = "{url}/status".format(url=str_url)

                            http_conn.request("POST", str_url, params, headers)
                            response = http_conn.getresponse()
                            read_data = response.read()
                            json_obj = json.loads(read_data)

                            http_conn.request("POST", status_url, params, headers)
                            response_status = http_conn.getresponse()
                            read_data = response_status.read()
                            json_status = json.loads(read_data)

                            line = "{ser_name},{fld},{type},{real_time_state},{min_inst_per_node},{max_inst_per_node},NA,NA,NA,NA,{cluster_name},NA,{jobs_dir},{output_dir}\n".format(
                                ser_name=str(json_obj["serviceName"]), fld=folder, type=str(item["type"]),
                                real_time_state=json_status["realTimeState"],
                                min_inst_per_node=str(json_obj["minInstancesPerNode"]),
                                max_inst_per_node=str(json_obj["maxInstancesPerNode"]),
                                cluster_name=str(json_obj["clusterName"]),
                                jobs_dir=str(json_obj["properties"]["jobsDirectory"]),
                                output_dir=str(json_obj["properties"]["outputDir"]))
                            ser_pro_file.write(line)
                            http_conn.close()
                        elif item["type"] == "ImageServer":
                            if folder:
                                str_url = "/arcgis/admin/services/{fld}/{ser_name}.{type}".format(
                                    fld=folder, ser_name=item["serviceName"], type=item["type"])
                                status_url = "{url}/status".format(url=str_url)
                            else:
                                str_url = "/arcgis/admin/services/{ser_name}.{type}".format(
                                    ser_name=item["serviceName"], type=item["type"])

                            http_conn.request("POST", str_url, params, headers)
                            response = http_conn.getresponse()
                            read_data = response.read()
                            json_obj = json.loads(read_data)

                            http_conn.request("POST", status_url, params, headers)
                            response_status = http_conn.getresponse()
                            read_data = response_status.read()
                            json_status = json.loads(read_data)

                            vms_props = [image_wms for image_wms in json_obj["extensions"] if
                                         image_wms["typeName"] == "WMSServer"]
                            if len(vms_props) > 0:
                                vms_status = str(vms_props[0]["enabled"])
                            else:
                                vms_status = "NA"

                            line = "{ser_name},{fld},{type},{real_time_state},{min_inst_per_node},{max_inst_per_node},NA,NA,{vms_status},NA,{cluster_name},{cache_dir},NA,{output_dir}\n".format(
                                ser_name=str(json_obj["serviceName"]), fld=folder, type=str(item["type"]),
                                real_time_state=json_status["realTimeState"],
                                min_inst_per_node=str(json_obj["minInstancesPerNode"]),
                                max_inst_per_node=str(json_obj["maxInstancesPerNode"]),
                                vms_status=vms_status,
                                cluster_name=str(json_obj["clusterName"]),
                                cache_dir=str(json_obj["properties"]["jobsDirectory"]),
                                output_dir=str(json_obj["properties"]["outputDir"]))
                            ser_pro_file.write(line)
                            http_conn.close()
                        elif item["type"] == "GlobeServer":
                            pass
                        elif item["type"] == "GPServer":
                            pass
                        elif item["type"] == "GeocodeServer":
                            pass
                        elif item["type"] == "GeoDataServer":
                            pass
                        elif item["type"] == "MapServer":
                            if folder:
                                str_url = "/arcgis/admin/services/{fld}/{ser_name}.{type}".format(
                                    fld=folder, ser_name=item["serviceName"], type=item["type"])
                                status_url = "{url}/status".format(url=str_url)
                                print("str_url: {str_url}".format(str_url=str_url))
                                print("status_url: {status_url}".format(status_url=status_url))
                            else:
                                str_url = "/arcgis/admin/services/{ser_name}.{type}".format(
                                    ser_name=item["serviceName"], type=item["type"])

                            http_conn.request("POST", str_url, params, headers)
                            response = http_conn.getresponse()
                            read_data = response.read()
                            json_obj = json.loads(read_data)

                            http_conn.request("POST", status_url, params, headers)
                            response_status = http_conn.getresponse()
                            read_data = response_status.read()
                            json_status = json.loads(read_data)

                            print(json_obj)
                            is_cached = json_obj["properties"]["isCached"]
                            if is_cached:
                                cache_dir = str(json_obj["properties"]["cacheDir"])
                            else:
                                cache_dir = json_obj["properties"]["isCached"]

                            if len(json_obj["extensions"]) == 0:
                                line = "{ser_name},{fld},{type},{real_time_state},{min_inst_per_node},{max_inst_per_node},FeatServHolder,Disabled,Disabled,{max_record_count},{cluster_name},{cache_dir},NA,{output_dir}\n".format(
                                    ser_name=str(json_obj["serviceName"]), fld=folder,
                                    type=str(item["type"]),
                                    real_time_state=json_status["realTimeState"],
                                    min_inst_per_node=str(json_obj["minInstancesPerNode"]),
                                    max_inst_per_node=str(json_obj["maxInstancesPerNode"]),
                                    max_record_count=str(json_obj["properties"]["maxRecordCount"]),
                                    cluster_name=str(json_obj["clusterName"]),
                                    cache_dir=cache_dir,
                                    output_dir=str(json_obj["properties"]["outputDir"]))
                            else:
                                kml_props = [map_kml for map_kml in json_obj["extensions"] if
                                             map_kml["typeName"] == "kmlServer"]

                                vms_props = [map_wms for map_wms in json_obj["extensions"] if
                                             map_wms["typeName"] == "WMSServer"]

                                feature_server_props = [feature_server for feature_server in json_obj["extensions"]
                                                        if feature_server["typeName"] == "FeatureServer"]
                                if len(vms_props) > 0:
                                    kml_status = str(kml_props[0]["enabled"])
                                else:
                                    kml_status = "NA"

                                if len(vms_props) > 0:
                                    vms_status = str(vms_props[0]["enabled"])
                                else:
                                    vms_status = "NA"

                                if len(feature_server_props) > 0:
                                    feature_status = str(feature_server_props[0]["enabled"])
                                else:
                                    feature_status = "NA"

                                line = "{ser_name},{fld},{type},{real_time_state},{min_inst_per_node},{max_inst_per_node},{feature_status},{kml_status},{vms_status},{max_record_count},{cluster_name},{cache_dir},NA,{output_dir}\n".format(
                                    ser_name=str(json_obj["serviceName"]), fld=folder,
                                    type=str(item["type"]),
                                    real_time_state=json_status["realTimeState"],
                                    min_inst_per_node=str(json_obj["minInstancesPerNode"]),
                                    max_inst_per_node=str(json_obj["maxInstancesPerNode"]),
                                    feature_status=feature_status,
                                    kml_status=kml_status,
                                    vms_status=vms_status,
                                    max_record_count=str(json_obj["properties"]["maxRecordCount"]),
                                    cluster_name=str(json_obj["clusterName"]),
                                    cache_dir=cache_dir,
                                    output_dir=str(json_obj["properties"]["outputDir"]))
                            ser_pro_file.write(line)
                            http_conn.close()
                    else:
                        http_conn.close()

        ser_pro_file.close()


server_property_read_to_csv()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值