Skip To Content

Ejemplo: Detener o iniciar todos los servicios de una carpeta

Este ejemplo lee a través de una carpeta del servidor SIG especificada y detiene o inicia todos los servicios contenidos en ella basándose en un parámetro suministrado por el usuario. Si el usuario intenta iniciar un servicio que ya está iniciado, o detener un servicio que ya está detenido, el script pasa al siguiente servicio de la carpeta.

Cuando se ejecuta este script, se le pide que proporcione un nombre de usuario y una contraseña que tenga permiso administrativo para ArcGIS Server. Con esta información, se recupera un token que permite realizar llamadas al servicio web para leer la carpeta y detener e iniciar los servicios.

También se le pide que proporcione el nombre del servidor, así como la carpeta cuyos servicios deben detenerse o iniciarse. Puede proporcionar la raíz para la carpeta raíz, si bien debe tener en cuenta que la iteración a través de la carpeta raíz afectará a los servicios de geometría y búsqueda preconfigurados.

Un último parámetro le pregunta si desea detener o iniciar todos los servicios de la carpeta. Las llamadas al servicio web para detener e iniciar un servicio mediante la API REST de ArcGIS son muy similares, por lo que no es difícil permitir ambas acciones en este script.

Cuando se realiza la solicitud inicial de la lista de servicios de la carpeta, la respuesta llega como Notación de objetos de JavaScript (JSON). La función json.loads() de Python convierte el JSON en un objeto de Python por el que se puede iterar.

Aunque este script tiene algunas comprobaciones e informes de errores, se han omitido otras comprobaciones por razones de brevedad.

# 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:]))