Skip To Content

Exemple : arrêter ou démarrer tous les services d’un dossier

Cet exemple illustre l’exploration d’un dossier donné du serveur SIG et le démarrage ou l’arrêt de tous les processus 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 du dossier.

Lors de l’exécution de ce script, vous êtes invité à fournir un nom d’utilisateur et un mot de passe disposant d’une autorisation administrative sur le serveur ArcGIS. Un jeton est récupéré sur la base de ces informations. Il vous permet d’effectuer des appels de service Web afin de parcourir le dossier et d’arrêter ou de démarrer les services.

Vous serez également amené à 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 aura un effet sur la géométrie préconfigurée et les services de recherche.

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’ArcGIS REST API 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 == None:
        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:]))