title: Arcgis Server Write properties of all services to a CSV file
body: <p>I have 36 Services running on ArcGIS Server and would like export all properties for each service in a csv file. I managed to write a code by the help of ESRI Helpdesk <a href="http://resources.arcgis.com/en/help/main/10.2/index.html#//0154000005wt000000" rel="nofollow">http://resources.arcgis.com/en/help/main/10.2/index.html#//0154000005wt000000</a> adding the properties "maxImageHeight" and "maxImageWidth" to the request. However if I run the code it starts to work, writes properties of the first 22 services, but than it stopps suddenly and returns </p>
  
  <p>Traceback (most recent call last):
    File "D:\SCRIPTS\Py-scripts\ArcPy\AGS - ArcPy\AGS_service_report_as_csv2.py", line 436, in 
      sys.exit(main(sys.argv[1:]))
    File "D:\SCRIPTS\Py-scripts\ArcPy\AGS - ArcPy\AGS_service_report_as_csv2.py", line 201, in main
      + "NA" + "\n"
  KeyError: 'maxImageHeight'</p>
  
  <p>It's odd because it delivered allready the "maxImageHeight" property for the first services.</p>
  
  <p>Code:</p>
  
  <pre><code># Reads the following properties from services and writes them to a comma-delimited file:
  #  ServiceName, Folder, Type, Status, Min Instances, Max Instances, Max Wainting Time,Max Startup Time,Max Idle Time,Max Usage Time, KML,
  #  WMS, WFS, WCS, Max Records, Cluster, Cache Directory, Jobs Directory, Output Directory
  
  # For HTTP calls
  import httplib, urllib, json
  
  # For system tools
  import sys
  
  # For reading passwords without echoing
  import getpass
  
  def main(argv=None):
  
      # Ask for admin/publisher user name and password
      username = raw_input("Enter user name: ")
      password = getpass.getpass("Enter password: ")
  
      # Ask for server name &amp; port
      serverName = raw_input("Enter server name: ")
      serverPort = 6080
  
      # Get the location and the name of the file to be created
      resultFile = raw_input("Output File (get the location and the name of the file to be created): ")
  
      # Get a token
      token = getToken(username, password, serverName, serverPort)
  
      # Get the root info
      serverURL = "/arcgis/admin/services/"
      #serverURL = "/arcgis/manager/services/"
  
      # This request only needs the token and the response formatting parameter
      params = urllib.urlencode({'token': token, 'f': 'json'})
  
      headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
  
      # Connect to URL and post parameters
      httpConn = httplib.HTTPConnection(serverName, serverPort)
      httpConn.request("POST", serverURL, params, headers)
  
      # Read response
      response = httpConn.getresponse()
      if (response.status != 200):
          httpConn.close()
          print "Could not read folder information."
          return
      else:
          data = response.read()
  
          # Check that data returned is not an error object
          if not assertJsonSuccess(data):
              print "Error when reading server information. " + str(data)
              return
          else:
              print "Processed server information successfully. Now processing folders..."
  
          # Deserialize response into Python object
          dataObj = json.loads(data)
          httpConn.close()
  
          #Store the Folders in a list to loop on
          folders = dataObj["folders"]
  
          #Remove the System and Utilities folders
          folders.remove("System")
          #folders.remove("Utilities")
  
          #Add an entry for the root folder
          folders.append("")
  
          #Create the summary file of services
          serviceResultFile = open(resultFile,'w')
          #serviceResultFile.write("ServiceName,Folder,Type,Status,Min Instances,Max Instances,FeatureService,kml,wms,Max Records,Cluster,Cache Directory,Jobs Directory,Output Directory" + "\n")
          serviceResultFile.write("\
              ServiceName,\
              Folder,\
              Type,\
              MaxImageHeight,\
              MaxImageWidth,\
              Status,\
              Min Instances,\
              Max Instances,\
              Max Wainting Time,\
              Max Startup Time,\
              Max Idle Time,\
              Max Usage Time,\
              FeatureService,\
              kml,\
              wms,\
              wfs,\
              wcs,\
              Max Records,\
              Cluster,\
              Cache Directory,\
              Jobs Directory,\
              Output Directory" + "\n")
  
          #Loop on the found folders and discover the services and write the service information
          for folder in folders:
  
              # Determine if the loop is working on the root folder or not
              if folder != "":
                  folder += "/"
  
              # Build the URL for the current folder
              folderURL = "/arcgis/admin/services/" + folder
              params = urllib.urlencode({'token': token, 'f': 'json'})
              headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
  
              # Connect to URL and post parameters
              httpConn = httplib.HTTPConnection(serverName, serverPort)
              httpConn.request("POST", folderURL, params, headers)
  
              # Read response
              response = httpConn.getresponse()
              if (response.status != 200):
                  httpConn.close()
                  print "Could not read folder information."
                  return
              else:
                  data = response.read()
  
                  # Check that data returned is not an error object
                  if not assertJsonSuccess(data):
                      print "Error when reading folder information. " + str(data)
                  else:
                      print "Processed folder information successfully. Now processing services..."
  
                  # Deserialize response into Python object
                  dataObj = json.loads(data)
                  httpConn.close()
  
                  # Loop through each service in the folder
                  for item in dataObj['services']:
  
                      if item["type"] == "GeometryServer":# and folder == "":
                          # Build the Service URL
                          if folder:
                              sUrl = "/arcgis/admin/services/%s%s.%s" %(folder,item["serviceName"], item["type"])
                              statusUrl = "/arcgis/admin/services/%s%s.%s/status" %(folder,item["serviceName"], item["type"])
                          else:
                              sUrl = "/arcgis/admin/services/%s.%s" %(item["serviceName"], item["type"])
                              statusUrl = "/arcgis/admin/services/%s.%s/status" %(item["serviceName"], item["type"])
  
  
  
                          httpConn.request("POST", sUrl, params, headers)
  
                          # Get the response
                          servResponse = httpConn.getresponse()
                          readData = servResponse.read()
                          jsonOBJ = json.loads(readData)
  
                          # Build the Service URL to test the running status
  
  
                          # Submit the request to the server
                          httpConn.request("POST", statusUrl, params, headers)
                          servStatusResponse = httpConn.getresponse()
  
                          # Obtain the data from the response
                          readData = servStatusResponse.read()
                          jsonOBJStatus = json.loads(readData)
  
                          # Build the line to write to the output file
  
                          ln = str(jsonOBJ["serviceName"]) + ","\
                          + folder + ","\
                          + str(item["type"]) + ","\
                          + str(jsonOBJ["properties"]["maxImageHeight"]) + ","\
                          + str(jsonOBJ["properties"]["maxImageWidth"]) + ","\
                          + jsonOBJStatus['realTimeState'] + ","\
                          + str(jsonOBJ["minInstancesPerNode"]) + ","\
                          + str(jsonOBJ["maxInstancesPerNode"]) + ","\
                          + str(jsonOBJ["maxWaitTime"]) + ","\
                          + str(jsonOBJ["maxStartupTime"]) + ","\
                          + str(jsonOBJ["maxIdleTime"]) + ","\
                          + str(jsonOBJ["maxUsageTime"]) + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + str(jsonOBJ["clusterName"]) + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + "\n"
  
                          # Write the results to the file
                          serviceResultFile.write(ln)
  
                          httpConn.close()
  
                      elif item["type"] == "SearchServer":# and folder == "":
                          if folder:
                              sUrl = "/arcgis/admin/services/%s%s.%s" %(folder,item["serviceName"], item["type"])
                              statusUrl = "/arcgis/admin/services/%s%s.%s/status" %(folder,item["serviceName"], item["type"])
                          else:
                              sUrl = "/arcgis/admin/services/%s.%s" %(item["serviceName"], item["type"])
                              statusUrl = "/arcgis/admin/services/%s.%s/status" %(item["serviceName"], item["type"])
  
  
                          httpConn.request("POST", sUrl, params, headers)
  
                          # Get the response
                          servResponse = httpConn.getresponse()
                          readData = servResponse.read()
                          jsonOBJ = json.loads(readData)
  
  
                          # Submit the request to the server
                          httpConn.request("POST", statusUrl, params, headers)
  
                          # Get the response
                          servStatusResponse = httpConn.getresponse()
                          readData = servStatusResponse.read()
                          jsonOBJStatus = json.loads(readData)
  
                          # Build the line to write to the output file
  
                          ln = str(jsonOBJ["serviceName"]) + ","\
                          + folder + ","\
                          + str(item["type"]) + ","\
                          + str(jsonOBJ["properties"]["maxImageHeight"]) + ","\
                          + str(jsonOBJ["properties"]["maxImageWidth"]) + ","\
                          + jsonOBJStatus['realTimeState'] + ","\
                          + str(jsonOBJ["minInstancesPerNode"]) + ","\
                          + str(jsonOBJ["maxInstancesPerNode"]) + ","\
                          + str(jsonOBJ["maxWaitTime"]) + ","\
                          + str(jsonOBJ["maxStartupTime"]) + ","\
                          + str(jsonOBJ["maxIdleTime"]) + ","\
                          + str(jsonOBJ["maxUsageTime"]) + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + str(jsonOBJ["clusterName"]) + ","\
                          + "NA" + ","\
                          + "NA" + ","\
                          + "NA" + "\n"
  
                          # Write the results to the file
                          serviceResultFile.write(ln)
  
                          httpConn.close()
  
  #####MapServer########################################
  
                      elif item["type"] == "MapServer":
  
                          # Build the Service URL
                          if folder:
                              sUrl = "/arcgis/admin/services/%s%s.%s" %(folder,item["serviceName"], item["type"])
                          else:
                              sUrl = "/arcgis/admin/services/%s.%s" %(item["serviceName"], item["type"])
  
                          # Submit the request to the server
                          httpConn.request("POST", sUrl, params, headers)
  
                          # Get the response
                          servResponse = httpConn.getresponse()
                          readData = servResponse.read()
                          jsonOBJ = json.loads(readData)
  
                          # Build the Service URL to test the running status
                          if folder:
                              statusUrl = "/arcgis/admin/services/%s%s.%s/status" %(folder,item["serviceName"], item["type"])
                          else:
                              statusUrl = "/arcgis/admin/services/%s.%s/status" %(item["serviceName"], item["type"])
  
                          # Submit the request to the server
                          httpConn.request("POST", statusUrl, params, headers)
  
                          # Get the response
                          servStatusResponse = httpConn.getresponse()
                          readData = servStatusResponse.read()
                          jsonOBJStatus = json.loads(readData)
  
                          # Check for Map Cache
                          isCached = jsonOBJ["properties"]["isCached"]
                          if isCached == "true":
                              cacheDir = str(jsonOBJ["properties"]["cacheDir"])
                          else:
                              cacheDir = jsonOBJ["properties"]["isCached"]
  
                          if len(jsonOBJ["extensions"]) == 0:
                              # Build the line to write to the output file
                              ln = str(jsonOBJ["serviceName"]) + ","\
                              + folder + ","\
                              + str(item["type"]) + ","\
                              + str(jsonOBJ["properties"]["maxImageHeight"]) + ","\
                              + str(jsonOBJ["properties"]["maxImageWidth"]) + ","\
                              + jsonOBJStatus['realTimeState'] + ","\
                              + str(jsonOBJ["minInstancesPerNode"]) + ","\
                              + str(jsonOBJ["maxInstancesPerNode"]) + ","\
                              + "FeatServHolder" + ","\
                              + "Disabled" + ","\
                              + "Disabled" +","\
                              + str(jsonOBJ["properties"]["maxRecordCount"]) + ","\
                              + str(jsonOBJ["clusterName"]) + ","\
                              + cacheDir + ","\
                              + "NA" + ","\
                              + str(jsonOBJ["properties"]["outputDir"]) + "\n"
                          else:
                              # Extract the KML properties from the response
                              kmlProps = [mapKML for mapKML in jsonOBJ["extensions"] if mapKML["typeName"] == 'KmlServer']#.items()[0][1] == 'KmlServer']
  
                              # Extract the WMS properties from the response
                              wmsProps = [mapWMS for mapWMS in jsonOBJ["extensions"] if mapWMS["typeName"] == 'WMSServer']#.items()[0][1] == 'WMSServer']
  
                                Extract the WFS properties from the response
                              wfsProps = [mapWFS for mapWFS in jsonOBJ["extensions"] if mapWFS["typeName"] == 'WFSServer']#.items()[0][1] == 'WFSServer']
  
                               Extract the WCS properties from the response
                              wcsProps = [mapWCS for mapWCS in jsonOBJ["extensions"] if mapWCS["typeName"] == 'WCSServer']#.items()[0][1] == 'WCSServer']
  
                              # Extract the FeatureService properties from the response
                              featServProps = [featServ for featServ in jsonOBJ["extensions"] if featServ["typeName"] == 'FeatureServer']#.items()[0][1] == 'FeatureServer']
  
                              if len(featServProps) &gt; 0:
                                  featureStatus = str(featServProps[0]["enabled"])
                              else:
                                  featureStatus = "NA"
  
                              if len(kmlProps) &gt; 0:
                                  kmlStatus = str(kmlProps[0]["enabled"])
                              else:
                                  kmlStatus = "NA"
  
                              if len(wmsProps) &gt; 0:
                                  wmsStatus = str(wmsProps[0]["enabled"])
                              else:
                                  wmsStatus = "NA"
  #MZ#
                              if len(wfsProps) &gt; 0:
                                  wfsStatus = str(wfsProps[0]["enabled"])
                              else:
                                  wfsStatus = "NA"
  #MZ#
                              if len(wcsProps) &gt; 0:
                                  wcsStatus = str(wcsProps[0]["enabled"])
                              else:
                                  wcsStatus = "NA"
  
                           ln = str(jsonOBJ["serviceName"]) + ","\
                              + folder + ","\
                              + str(item["type"]) + ","\
                              + str(jsonOBJ["properties"]["maxImageHeight"]) + ","\
                              + str(jsonOBJ["properties"]["maxImageWidth"]) + ","\
                              + jsonOBJStatus['realTimeState'] + ","\
                              + str(jsonOBJ["minInstancesPerNode"]) + ","\
                              + str(jsonOBJ["maxInstancesPerNode"]) + ","\
                              + str(jsonOBJ["maxWaitTime"]) + ","\
                              + str(jsonOBJ["maxStartupTime"]) + ","\
                              + str(jsonOBJ["maxIdleTime"]) + ","\
                              + str(jsonOBJ["maxUsageTime"]) + ","\
                              + featureStatus + ","\
                              + kmlStatus + ","\
                              + wmsStatus + ","\
                              + wfsStatus + ","\
                              + wcsStatus + ","\
                              + str(jsonOBJ["properties"]["maxRecordCount"]) + ","\
                              + str(jsonOBJ["clusterName"]) + ","\
                              + cacheDir + "," + "NA" + ","\
                              + str(jsonOBJ["properties"]["outputDir"]) + "\n"
  
                          # Write the results to the file
                          serviceResultFile.write(ln)
  
                      else:
                          # Close the connection to the current service
                          httpConn.close()
  
          # Close the file
          serviceResultFile.close()
  
  def getToken(username, password, serverName, serverPort):
      # Token URL is typically http://server[:port]/arcgis/admin/generateToken
      tokenURL = "/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"}
  
      # Connect to URL and post parameters
      httpConn = httplib.HTTPConnection(serverName, serverPort)
      httpConn.request("POST", tokenURL, params, headers)
  
      # Read response
      response = httpConn.getresponse()
      if (response.status != 200):
          httpConn.close()
          print "Error while fetching tokens from admin URL. Please check the URL and try again."
          return
      else:
          data = response.read()
          httpConn.close()
  
          # Check that data returned is not an error object
          if not assertJsonSuccess(data):
              return
  
          # Extract the token from it
          token = json.loads(data)
          return token['token']
  
  
  # A function that checks that the input JSON object
  #  is not an error object.
  def assertJsonSuccess(data):
      obj = json.loads(data)
      if 'status' in obj and obj['status'] == "error":
          print "Error: JSON object returns an error. " + str(obj)
          return False
      else:
          return True
  
  if __name__ == "__main__":
      sys.exit(main(sys.argv[1:]))`
  </code></pre>