mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-11-04 12:48:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			318 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			318 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
'''
 | 
						|
NAME: lf_json_api.py
 | 
						|
 | 
						|
PURPOSE:
 | 
						|
 | 
						|
 This script will is an example of using LANforge JSON API to use GET Requests to LANforge. 
 | 
						|
 
 | 
						|
 | 
						|
EXAMPLE:
 | 
						|
 | 
						|
    This will run through the module test:
 | 
						|
    ./lf_json_api.py --lf_mgr 192.168.100.178 --lf_port 8080 --resource 1 --log_level debug --port wlan3 --lf_user lanforge --lf_passwd lanforge --get_request 'port radio
 | 
						|
 | 
						|
NOTE:
 | 
						|
    LANforge GUI , click on info -> API Help  look under GET Requests  use similiar format to what is being done below.
 | 
						|
'''
 | 
						|
 | 
						|
import argparse
 | 
						|
import sys
 | 
						|
import os
 | 
						|
import logging
 | 
						|
import importlib
 | 
						|
import requests
 | 
						|
import pandas as pd
 | 
						|
import json
 | 
						|
 | 
						|
 | 
						|
if sys.version_info[0] != 3:
 | 
						|
    print("This script requires Python 3")
 | 
						|
    exit(1)
 | 
						|
 | 
						|
sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../")))
 | 
						|
 | 
						|
logger = logging.getLogger(__name__)
 | 
						|
lf_logger_config = importlib.import_module("py-scripts.lf_logger_config")
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class lf_json_api():
 | 
						|
    def __init__(self,
 | 
						|
                lf_mgr,
 | 
						|
                lf_port,
 | 
						|
                lf_user,
 | 
						|
                lf_passwd,
 | 
						|
                resource,
 | 
						|
                port):                
 | 
						|
        self.lf_mgr = lf_mgr
 | 
						|
        self.lf_port = lf_port
 | 
						|
        self.lf_user = lf_user
 | 
						|
        self.lf_passwd = lf_passwd
 | 
						|
        self.resource = resource
 | 
						|
        self.port = port
 | 
						|
        # the request can change
 | 
						|
        self.request = ''
 | 
						|
 | 
						|
 | 
						|
    def get_request_port_information(self):
 | 
						|
        # https://docs.python-requests.org/en/latest/
 | 
						|
        # https://stackoverflow.com/questions/26000336/execute-curl-command-within-a-python-script - use requests
 | 
						|
        # station command
 | 
						|
        # curl -H 'Accept: application/json' 'http://localhost:8080/port/1/1/wlan3' | json_pp
 | 
						|
        # a radio command
 | 
						|
        # curl --user "lanforge:lanforge" -H 'Accept: application/json'
 | 
						|
        # http://192.168.100.116:8080/port/1/1/wlan3 | json_pp  , where --user
 | 
						|
        # "USERNAME:PASSWORD"
 | 
						|
        request_command = 'http://{lfmgr}:{lfport}/port/1/{resource}/{port}'.format(
 | 
						|
            lfmgr=self.lf_mgr, lfport=self.lf_port, resource=self.resource, port=self.port)
 | 
						|
        request = requests.get(
 | 
						|
            request_command, auth=(
 | 
						|
                self.lf_user, self.lf_passwd))
 | 
						|
        logger.info(
 | 
						|
            "port request command: {request_command}".format(
 | 
						|
                request_command=request_command))
 | 
						|
        logger.info(
 | 
						|
            "port request status_code {status}".format(
 | 
						|
                status=request.status_code))
 | 
						|
        lanforge_port_json = request.json()
 | 
						|
        logger.debug("port request.json: {json}".format(json=lanforge_port_json))
 | 
						|
        lanforge_port_text = request.text
 | 
						|
        logger.debug("port request.text: {text}".format(text=lanforge_port_text))
 | 
						|
        lanforge_port_json_formatted = json.dumps(lanforge_port_json, indent=4)
 | 
						|
        logger.debug("lanforge_port_json_formatted: {json}".format(json=lanforge_port_json_formatted))
 | 
						|
 | 
						|
        return lanforge_port_json, lanforge_port_text, lanforge_port_json_formatted
 | 
						|
 | 
						|
    def get_request_wifi_stats_information(self):
 | 
						|
        # https://docs.python-requests.org/en/latest/
 | 
						|
        # https://stackoverflow.com/questions/26000336/execute-curl-command-within-a-python-script - use requests
 | 
						|
        # station command
 | 
						|
        # curl -H 'Accept: application/json' 'http://localhost:8080/wifi-stats/1/1/wlan4' | json_pp
 | 
						|
        # a radio command
 | 
						|
        # curl --user "lanforge:lanforge" -H 'Accept: application/json'
 | 
						|
        # http://192.168.100.116:8080/wifi-stats/1/1/wlan4 | json_pp  , where --user
 | 
						|
        # "USERNAME:PASSWORD"
 | 
						|
        request_command = 'http://{lfmgr}:{lfport}/wifi-stats/1/{resource}/{port}'.format(
 | 
						|
            lfmgr=self.lf_mgr, lfport=self.lf_port, resource=self.resource, port=self.port)
 | 
						|
        request = requests.get(
 | 
						|
            request_command, auth=(
 | 
						|
                self.lf_user, self.lf_passwd))
 | 
						|
        logger.info(
 | 
						|
            "wifi-stats request command: {request_command}".format(
 | 
						|
                request_command=request_command))
 | 
						|
        logger.info(
 | 
						|
            "wifi-stats request status_code {status}".format(
 | 
						|
                status=request.status_code))
 | 
						|
        lanforge_wifi_stats_json = request.json()
 | 
						|
        logger.debug("wifi-stats request.json: {json}".format(json=lanforge_wifi_stats_json))
 | 
						|
        lanforge_wifi_stats_text = request.text
 | 
						|
        logger.debug("wifi-stats request.text: {text}".format(text=lanforge_wifi_stats_text))
 | 
						|
        lanforge_wifi_stats_json_formatted = json.dumps(lanforge_wifi_stats_json, indent=4)
 | 
						|
        logger.debug("lanforge_wifi_stats_json_formatted: {json}".format(json=lanforge_wifi_stats_json_formatted))
 | 
						|
        # TODO just return lanforge_json and lanforge_txt, lanfore_json_formated to is may be the same for all commands
 | 
						|
        return lanforge_wifi_stats_json, lanforge_wifi_stats_text, lanforge_wifi_stats_json_formatted
 | 
						|
 | 
						|
    # TODO this is a generic one.
 | 
						|
    def get_request_information(self):
 | 
						|
        # https://docs.python-requests.org/en/latest/
 | 
						|
        # https://stackoverflow.com/questions/26000336/execute-curl-command-within-a-python-script - use requests
 | 
						|
        # station command
 | 
						|
        # curl -H 'Accept: application/json' 'http://localhost:8080/{request}/1/1/wlan4' | json_pp
 | 
						|
        # a radio command
 | 
						|
        # curl --user "lanforge:lanforge" -H 'Accept: application/json'
 | 
						|
        # http://192.168.100.116:8080//1/1/wlan4 | json_pp  , where --user
 | 
						|
        # "USERNAME:PASSWORD"
 | 
						|
        request_command = 'http://{lfmgr}:{lfport}/{request}/1/{resource}/{port}'.format(
 | 
						|
            lfmgr=self.lf_mgr, lfport=self.lf_port,request=self.request, resource=self.resource, port=self.port)
 | 
						|
        request = requests.get(
 | 
						|
            request_command, auth=(
 | 
						|
                self.lf_user, self.lf_passwd))
 | 
						|
        logger.info(
 | 
						|
            "{request} request command: {request_command}".format(request=self.request,
 | 
						|
                request_command=request_command))
 | 
						|
        logger.info(
 | 
						|
            "{request} request status_code {status}".format(request=self.request,
 | 
						|
                status=request.status_code))
 | 
						|
        lanforge_json = request.json()
 | 
						|
        logger.debug("{request} request.json: {json}".format(request=self.request,json=lanforge_json))
 | 
						|
        lanforge_text = request.text
 | 
						|
        logger.debug("{request} request.text: {text}".format(request=self.request,text=lanforge_text))
 | 
						|
        lanforge_json_formatted = json.dumps(lanforge_json, indent=4)
 | 
						|
        logger.debug("lanforge_json_formatted: {json}".format(json=lanforge_json_formatted))
 | 
						|
        # TODO just return lanforge_json and lanforge_txt, lanfore_json_formated to is may be the same for all commands
 | 
						|
        return lanforge_json, lanforge_text, lanforge_json_formatted
 | 
						|
 | 
						|
 | 
						|
    # TODO This method is left in for an example it was taken from
 | 
						|
    def get_request_radio_information(self):
 | 
						|
        # https://docs.python-requests.org/en/latest/
 | 
						|
        # https://stackoverflow.com/questions/26000336/execute-curl-command-within-a-python-script - use requests
 | 
						|
        # curl --user "lanforge:lanforge" -H 'Accept: application/json'
 | 
						|
        # http://192.168.100.116:8080/radiostatus/all | json_pp  , where --user
 | 
						|
        # "USERNAME:PASSWORD"
 | 
						|
        request_command = 'http://{lfmgr}:{port}/radiostatus/all'.format(lfmgr=self.lf_mgr, port=self.lf_port)
 | 
						|
        request = requests.get(
 | 
						|
            request_command, auth=(
 | 
						|
                self.lf_user, self.lf_passwd))
 | 
						|
        logger.info(
 | 
						|
            "radio request command: {request_command}".format(
 | 
						|
                request_command=request_command))
 | 
						|
        logger.info(
 | 
						|
            "radio request status_code {status}".format(
 | 
						|
                status=request.status_code))
 | 
						|
        lanforge_radio_json = request.json()
 | 
						|
        logger.info("radio request.json: {json}".format(json=lanforge_radio_json))
 | 
						|
        lanforge_radio_text = request.text
 | 
						|
        logger.info("radio request.text: {text}".format(text=lanforge_radio_text))
 | 
						|
        return lanforge_radio_json, lanforge_radio_text
 | 
						|
 | 
						|
    def post_wifi_cli_cmd(self, wifi_cli_cmd):
 | 
						|
 | 
						|
        # request_command = 'http://{lfmgr}:{port}/{wifi_cli_cmd}'.format(lfmgr=self.lf_mgr, port=self.lf_port, wifi_cli_cmd=json.dumps(wifi_cli_cmd).encode("utf-8"))
 | 
						|
        request_command = 'http://{lfmgr}:{port}/{wifi_cli_cmd}'.format(lfmgr=self.lf_mgr, port=self.lf_port, wifi_cli_cmd=wifi_cli_cmd)
 | 
						|
        # request_command = 'http://{lfmgr}:{port}/set_wifi_radio 1 1 wiphy1 NA NA NA NA NA NA NA NA NA 4'.format(lfmgr=self.lf_mgr, port=self.lf_port)
 | 
						|
        request = requests.post(request_command, auth=(self.lf_user, self.lf_passwd))
 | 
						|
        logger.info(
 | 
						|
            "wifi_cli_cmd request command: {request_command}".format(
 | 
						|
                request_command=request_command))
 | 
						|
        logger.info(
 | 
						|
            "wifi_cli_cmd request status_code {status}".format(
 | 
						|
                status=request.status_code))
 | 
						|
        lanforge_wifi_cli_cmd_json = request.json()
 | 
						|
        logger.info("radio request.json: {json}".format(json=lanforge_wifi_cli_cmd_json))
 | 
						|
 | 
						|
 | 
						|
# unit test
 | 
						|
def main():
 | 
						|
    lfjson_host = "localhost"
 | 
						|
    lfjson_port = 8080
 | 
						|
    parser = argparse.ArgumentParser(
 | 
						|
        prog="lf_json_api.py",
 | 
						|
        formatter_class=argparse.RawTextHelpFormatter,
 | 
						|
        description="""
 | 
						|
        example
 | 
						|
        """)
 | 
						|
 | 
						|
    parser.add_argument("--lf_mgr", type=str, help="address of the LANforge GUI machine (localhost is default)",
 | 
						|
                        default='localhost')
 | 
						|
    parser.add_argument("--lf_port", help="IP Port the LANforge GUI is listening on (8080 is default)",
 | 
						|
                        default=8080)
 | 
						|
    parser.add_argument("--lf_user", type=str, help="user: lanforge")
 | 
						|
    parser.add_argument("--lf_passwd", type=str, help="passwd: lanforge")
 | 
						|
    parser.add_argument("--port", type=str, help=" port : wlan3")
 | 
						|
    parser.add_argument("--radio", type=str, help=" --radio wiphy0")
 | 
						|
    # TODO should be parsed from EID
 | 
						|
    parser.add_argument("--resource", type=str, help="--resource LANforge, Station resource ID to use, default is 1", default=1)
 | 
						|
    parser.add_argument('--log_level', default=None, help='Set logging level: debug | info | warning | error | critical')
 | 
						|
    # logging configuration
 | 
						|
    parser.add_argument(
 | 
						|
        "--lf_logger_config_json",
 | 
						|
        help="--lf_logger_config_json <json file> , json configuration of logger")
 | 
						|
    # TODO check command 
 | 
						|
    # TODO make generic so any request may be passed in
 | 
						|
    parser.add_argument("--get_requests", type=str, help="perform get request may be a list:  port | radio | port_rssi | wifi-stats")
 | 
						|
    parser.add_argument("--post_requests", type=str, help="perform set request may be a list:  nss ")
 | 
						|
    parser.add_argument("--nss", type=str, help="--nss 4  set the number of spatial streams for a speific antenna ")
 | 
						|
 | 
						|
 | 
						|
    args = parser.parse_args()
 | 
						|
 | 
						|
    # set up logger
 | 
						|
    logger_config = lf_logger_config.lf_logger_config()
 | 
						|
 | 
						|
    if args.log_level:
 | 
						|
        logger_config.set_level(level=args.log_level)
 | 
						|
 | 
						|
    # lf_logger_config_json will take presidence to changing debug levels
 | 
						|
    if args.lf_logger_config_json:
 | 
						|
        # logger_config.lf_logger_config_json = "lf_logger_config.json"
 | 
						|
        logger_config.lf_logger_config_json = args.lf_logger_config_json
 | 
						|
        logger_config.load_lf_logger_config()
 | 
						|
 | 
						|
 | 
						|
    lf_json = lf_json_api( args.lf_mgr,
 | 
						|
                            args.lf_port,
 | 
						|
                            args.lf_user,
 | 
						|
                            args.lf_passwd,
 | 
						|
                            args.resource,
 | 
						|
                            args.port)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    if args.get_requests:
 | 
						|
        get_requests = args.get_requests.split()
 | 
						|
 | 
						|
        for get_request in get_requests:
 | 
						|
            if get_request == "radio":
 | 
						|
                lf_json.get_request_radio_information()
 | 
						|
 | 
						|
            if get_request == "port":
 | 
						|
                lanforge_port_json, lanforge_port_text, lanforge_port_json_formatted = lf_json.get_request_port_information()
 | 
						|
 | 
						|
                logger.info("lanforge_port_json = {lanforge_port_json}".format(lanforge_port_json=lanforge_port_json))
 | 
						|
                logger.info("lanforge_port_text = {lanforge_port_text}".format(lanforge_port_text=lanforge_port_text))
 | 
						|
                logger.info("lanforge_port_text = {lanforge_port_text}".format(lanforge_port_text=lanforge_port_text))
 | 
						|
 | 
						|
            if get_request == "port_rssi":
 | 
						|
                lanforge_port_json, lanforge_port_text, lanforge_port_json_formatted = lf_json.get_request_port_information()
 | 
						|
                logger.info("lanforge_port_json = {lanforge_port_json}".format(lanforge_port_json=lanforge_port_json))
 | 
						|
                logger.info("lanforge_port_json_formatted = {lanforge_port_json_formatted}".format(lanforge_port_json_formatted=lanforge_port_json_formatted))
 | 
						|
 | 
						|
                for key in lanforge_port_json:
 | 
						|
                    if 'interface' in key:
 | 
						|
                        avg_chain_rssi = lanforge_port_json[key]['avg chain rssi']
 | 
						|
                        logger.info("avg chain rssi = {avg_chain_rssi}".format(avg_chain_rssi=avg_chain_rssi))
 | 
						|
                        chain_rssi = lanforge_port_json[key]['chain rssi']
 | 
						|
                        logger.info("chain rssi = {chain_rssi}".format(chain_rssi=chain_rssi))
 | 
						|
                        signal = lanforge_port_json[key]['signal']
 | 
						|
                        logger.info("signal = {signal}".format(signal=signal))
 | 
						|
 | 
						|
            if get_request == "alerts":
 | 
						|
                lanforge_alerts_json = lf_json.get_alerts_information()
 | 
						|
 | 
						|
            if get_request == "wifi-stats":
 | 
						|
                lanforge_wifi_stats_json, lanforge_wifi_stats_text, lanforge_wifi_stats_json_formatted = lf_json.get_request_wifi_stats_information()
 | 
						|
 | 
						|
                logger.info("lanforge_wifi_stats_json = {lanforge_wifi_stats_json}".format(lanforge_wifi_stats_json=lanforge_wifi_stats_json))
 | 
						|
                logger.info("lanforge_wifi_stats_text = {lanforge_wifi_stats_text}".format(lanforge_wifi_stats_text=lanforge_wifi_stats_text))
 | 
						|
                logger.info("lanforge_wifi_stats_json_formatted = {lanforge_wifi_stats_json_formatted}".format(lanforge_wifi_stats_json_formatted=lanforge_wifi_stats_json_formatted))
 | 
						|
 | 
						|
            # Generic so can do any query
 | 
						|
            else:
 | 
						|
                # set the generic request
 | 
						|
                lf_json.request = get_request
 | 
						|
                lanforge_json, lanforge_text, lanforge_json_formatted = lf_json.get_request_information()
 | 
						|
                logger.info("{request} : lanforge_json = {lanforge_json}".format(request=get_request,lanforge_json=lanforge_json))
 | 
						|
                logger.info("{request} : lanforge__text = {lanforge_text}".format(request=get_request,lanforge_text=lanforge_text))
 | 
						|
                logger.info("{request} : lanforge_json_formatted = {lanforge_json_formatted}".format(request=get_request,lanforge_json_formatted=lanforge_json_formatted))
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    if args.post_requests:
 | 
						|
        post_requests = args.post_requests.split()
 | 
						|
 | 
						|
        for post_request in post_requests:
 | 
						|
            if post_request == "nss":
 | 
						|
                nss = int(args.nss)
 | 
						|
                if (nss == 1):
 | 
						|
                    antennas_set = 1
 | 
						|
                if (nss == 2):
 | 
						|
                    antennas_set = 4
 | 
						|
                if (nss == 3):
 | 
						|
                    antennas_set = 7
 | 
						|
                if (nss == 4):
 | 
						|
                    antennas_set = 8
 | 
						|
 | 
						|
                wifi_cli_cmd = 'set_wifi_radio 1 {resource} {radio} NA NA NA NA NA NA NA NA NA {antennas}'.format(
 | 
						|
                    resource=args.resource, radio=args.radio,antennas=antennas_set)
 | 
						|
                lf_json.post_wifi_cli_cmd(wifi_cli_cmd=wifi_cli_cmd)
 | 
						|
         
 | 
						|
 | 
						|
    # sample of creating layer 3 
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    main()
 |