Exemple : arrêt ou démarrage de tous les services d'un dossier
Cet exemple illustre l'exploration d'un dossier spécifié du serveur ArcGIS et l'arrêt ou le démarrage de tous les services qu'il contient sur la base d'un paramètre fourni par l'utilisateur. Si l'utilisateur tente de démarrer un service actif, ou d'arrêter un service qui l'est déjà, le script passe au service suivant dans le dossier.
Lors de l'exécution de ce script, vous êtes invité à fournir un nom d'utilisateur et un mot de passe disposant d'autorisations administratives sur ArcGIS Server. Un jeton est récupéré sur la base de ces informations. Il vous permet d'effectuer des appels de service Web afin de lire le dossier et d'arrêter ou de démarrer les services.
Vous êtes également invité à indiquer le nom du serveur, ainsi que le dossier dont les services doivent être arrêtés ou démarrés. Vous pouvez indiquer root comme dossier racine. Sachez toutefois que l'itération du dossier racine affectera les services de recherche et de géométrie préconfigurés.
Un dernier paramètre vous demande si vous souhaitez arrêter ou démarrer tous les services du dossier. Les appels de service Web portant sur l'arrêt et le démarrage d'un service à l'aide de l'API REST d'ArcGIS présentent de nombreuses similitudes. Il est donc aisé d'autoriser les deux actions dans ce script.
Lorsque vous émettez la demande initiale portant sur la liste des services du dossier, la réponse est renvoyée au format JSON (JavaScript Object Notation). La fonction json.loads() de Python convertit l'objet JSON en objet Python que vous pouvez parcourir.
Bien que ce script comporte certaines fonctions de génération de rapports et de contrôle des erreurs, d'autres vérifications ont été omises dans un souci de concision.
# Demonstrates how to stop or start all services in a folder
# For Http calls
import httplib, urllib, json
# For system tools
import sys
# For reading passwords without echoing
import getpass
# Defines the entry point into the script
def main(argv=None):
# Print some info
print
print "This tool is a sample script that stops or starts all services in a folder."
print
# Ask for admin/publisher user name and password
username = raw_input("Enter user name: ")
password = getpass.getpass("Enter password: ")
# Ask for server name
serverName = raw_input("Enter server name: ")
serverPort = 6080
folder = raw_input("Enter the folder name or ROOT for the root location: ")
stopOrStart = raw_input("Enter whether you want to START or STOP all services: ")
# Check to make sure stop/start parameter is a valid value
if str.upper(stopOrStart) != "START" and str.upper(stopOrStart) != "STOP":
print "Invalid STOP/START parameter entered"
return
# Get a token
token = getToken(username, password, serverName, serverPort)
if token == "":
print "Could not generate a token with the username and password provided."
return
# Construct URL to read folder
if str.upper(folder) == "ROOT":
folder = ""
else:
folder += "/"
folderURL = "/arcgis/admin/services/" + folder
# 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", 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 and stop or start it
for item in dataObj['services']:
fullSvcName = item['serviceName'] + "." + item['type']
# Construct URL to stop or start service, then make the request
stopOrStartURL = "/arcgis/admin/services/" + folder + fullSvcName + "/" + stopOrStart
httpConn.request("POST", stopOrStartURL, params, headers)
# Read stop or start response
stopStartResponse = httpConn.getresponse()
if (stopStartResponse.status != 200):
httpConn.close()
print "Error while executing stop or start. Please check the URL and try again."
return
else:
stopStartData = stopStartResponse.read()
# Check that data returned is not an error object
if not assertJsonSuccess(stopStartData):
if str.upper(stopOrStart) == "START":
print "Error returned when starting service " + fullSvcName + "."
else:
print "Error returned when stopping service " + fullSvcName + "."
print str(stopStartData)
else:
print "Service " + fullSvcName + " processed successfully."
httpConn.close()
return
# A function to generate a token given username, password and the adminURL.
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
# Script start
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
Vous avez un commentaire à formuler concernant cette rubrique ?