环境: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()