Example: Logging in and logging out using Python

The following example shows the parts of a Python program that handle the following:

  • Logging in

  • Logging out

  • Response codes

  • Disabling server certificate verification

  • Storing and passing the session cookie


# library to take inline args
import sys

# library to make REST requests
import requests

# regular expressions library
import re

# disable warnings that Web UI site is "insecure"
# needed to avoid connection timeout due to inability to verify server certificate
from requests.packages.urllib3 import disable_warnings
from requests.packages.urllib3.exceptions import InsecureRequestWarning
disable_warnings(InsecureRequestWarning)

if len(sys.argv) is not 4:
    print("usage: 8400rest.py <switch_ip> <username> <password>")
    print("note: admin access is required to edit data")
    exit(0)

# parameters
ver = 'v1'
sw_ip = sys.argv[1]
usr = sys.argv[2]
pswd = sys.argv[3]

def main():
    # class instance
    sw = sw_rest(ip=sw_ip, ver=ver)

    # only perform actions if login is successful
    if (sw.login(user=usr, passwd=pswd)):
        # 
        # Script action calls go here 
        #
        sw.logout()


# class for rest calls to ArubaOS-CX switch
class sw_rest:

    def __init__(self, ip=None, ver=None):
        """
        init class function

        :param str ip: ip address of switch to access (required)
        :param str ver: version of ArubaOS-CX REST (default 'v1')
        """
        # check and set ip address
        if (ip is None):
            print("Switch IP address is required")
            exit(1)
        else: self.ip = ip

        # check and set REST version
        if (ver is None):
            print("REST version not specified... using v1")
            self.ver = 'v1'
        else: self.ver = ver

        # create base address for REST requests (https://<ip>/rest/<ver>/)
        self.base_url = '/'.join(['https:/', self.ip])
        self.base_uri = '/'.join(['', 'rest', self.ver, ''])
        self.base = self.base_url + self.base_uri

        # cookie jar to store cookies after login
        self.cookie = requests.cookies.RequestsCookieJar()

    def login(self, user=None, passwd=None):
        """
        login to switch

        :param str user: username for login (required)
        :param str passwd: password for login (required)
        :return: whether login was successful
        :rtype: bool
        """
        self.login = {'username': user, 'password': passwd}
        # url = https://<ip>/rest/<ver>/login
        url = self.base + 'login'

        print("Logging in...")
        response = requests.post(
                url=url,
                params=self.login,
                verify=False,
            )
        print(response)

        # determine if login was successful
        status = self.status_handler(response.status_code)

        # set cookie if login is successful
        if (status):
            self.cookie.set('id', response.cookies['id'], domain=self.ip)

        return status

    def logout(self):
        """
        logout of switch

        :return: whether logout was successful
        :rtype: bool
        """
        # url = https://<ip>/rest/<ver>/logout
        url = self.base + 'logout'

        print("Logging out...")
        response = requests.post(
                url=url,
                cookies=self.cookie,
                verify=False,
            )
        print(response)

        return self.status_handler(response.status_code)



    def status_handler(self, status_code):
        """
        determine if the response is good or bad

        :param int status_code: status code of response
        :return: whether response is good
        :rtype: bool
        """
        return (status_code == requests.codes.ok)

if __name__ == "__main__":
    main()