#!/usr/bin/env python3 """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Generated by LANforge JsonApiPythonGenerator, Fri Aug 13 12:39:58 PDT 2021 - - WORK IN PROGRESS - - The API this library provides is actively being changed. This file expects to live in py-json/LANforge directory. ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" # import keyword # import pprint # import time from enum import Enum from enum import IntFlag # from . import LFRequest from .lfcli_base import LFCliBase class LFJsonGet(LFCliBase): def __init__(self, lfclient_host='localhost', lfclient_port=8080, debug_=False, _exit_on_error=False, _exit_on_fail=False, _proxy_str=None, _capture_signal_list=()): super().__init__(_lfjson_host=lfclient_host, _lfjson_port=lfclient_port, _debug=debug_, _exit_on_error=_exit_on_error, _exit_on_fail=_exit_on_fail, _proxy_str=_proxy_str, _capture_signal_list=_capture_signal_list) @staticmethod def extract_values(response: dict = None, singular_key: str = None, plural_key: str = None) -> list: """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Extract fields from this response using the expected keys: ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if (singular_key is None) or (plural_key is None) or (not singular_key) or (not plural_key): raise ValueError("extract_values wants non-empty response, singular_key and plural_key") if (singular_key in response) and (not response[singular_key]): return [] elif (singular_key in response) and (type(response[singular_key]) is dict): return [response[singular_key]] elif (plural_key in response) and (not response[plural_key]): return [] else: return response[plural_key] # TODO: rename me to make_port_eid_url @staticmethod def make_eid_url(eid_list=()): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Convert a list of EIDs into a URL: ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if not len(eid_list): return "/list" url = "/" if isinstance(eid_list, str): return url + eid_list.replace('.', '/') # The first in a series has to define the resource number, # but the remainder of a series has to match that resource number for i in range(0, len(eid_list)): eid = eid_list[i] if i == 0: url += eid.replace('.', '/') elif eid.find('.') > 0: url += ',' + eid.split('.')[-1] else: url += ','+eid return url """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /attenuator/ /attenuator/$shelf_id /attenuator/$shelf_id/$resource_id /attenuator/$shelf_id/$resource_id/$port_id /attenuators/ /attenuators/$shelf_id /attenuators/$shelf_id/$resource_id /attenuators/$shelf_id/$resource_id/$port_id When requesting specific column names, they need to be URL Encoded. entity+id, module+1, module+2, module+3, module+4, module+5, module+6, module+7, module+8, name, script, state, temperature Example URL: /attenuator?fields=entity+id,module+1 Example py-json call: record = LFJsonGet.get_attenuator( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'entity id': X 'module 1': X 'module 2': X 'module 3': X 'module 4': X 'module 5': X 'module 6': X 'module 7': X 'module 8': X 'name': X 'script': X 'state': X 'temperature': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_attenuator(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/attenuator" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="attenuator", plural_key="attenuators") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /chamber/ /chamber/$chamber_name When requesting specific column names, they need to be URL Encoded. chamber, chamber+connections, chamber+resources, chamber+type, duts, entity+id, flags, hide, isolation, marked, open, reported+rotation+%28deg%29, reported+rpm, reported+tilt+%28deg%29, resource, rotation+%28deg%29, rpm, smas, tilt+%28deg%29, turntable, turntable+type, virtual Example URL: /chamber?fields=chamber,chamber+connections Example py-json call: record = LFJsonGet.get_chamber( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'chamber': X 'chamber connections': X 'chamber resources': X 'chamber type': X 'duts': X 'entity id': X 'flags': X 'hide': X 'isolation': X 'marked': X 'open': X 'reported rotation (deg)': X 'reported rpm ': X 'reported tilt (deg)': X 'resource': X 'rotation (deg)': X 'rpm': X 'smas': X 'tilt (deg)': X 'turntable': X 'turntable type': X 'virtual': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_chamber(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/chamber" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="chamber", plural_key="chambers") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /control/$command When requesting specific column names, they need to be URL Encoded. na Example py-json call: record = LFJsonGet.get_control( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'na': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_control(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/control" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="", plural_key="") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /cx/ /cx/$cx_id When requesting specific column names, they need to be URL Encoded. avg+rtt, bps+rx+a, bps+rx+b, drop+pkts+a, drop+pkts+b, eid, endpoints+%28a%C2%A0%E2%86%94%C2%A0b%29, entity+id, name, pkt+rx+a, pkt+rx+b, rpt+timer, rx+drop+%25+a, rx+drop+%25+b, state, type Example URL: /cx?fields=avg+rtt,bps+rx+a Example py-json call: record = LFJsonGet.get_cx( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'avg rtt': X 'bps rx a': X 'bps rx b': X 'drop pkts a': X 'drop pkts b': X 'eid': X 'endpoints (a ↔ b)': X 'entity id': X 'name': X 'pkt rx a': X 'pkt rx b': X 'rpt timer': X 'rx drop % a': X 'rx drop % b': X 'state': X 'type': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_cx(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/cx" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="", plural_key="") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /dut/ /dut/$name When requesting specific column names, they need to be URL Encoded. api+version, bssid-1, bssid-2, bssid-3, bssid-4, bssid-5, bssid-6, bssid-7, bssid-8, dut, eap-id, entity+id, hw+info, image+file, lan, mgt+ip, model+number, notes, num+ant+radio+1, num+ant+radio+2, num+ant+radio+3, password-1, password-2, password-3, password-4, password-5, password-6, password-7, password-8, serial+number, serial+port, ssid-1, ssid-2, ssid-3, ssid-4, ssid-5, ssid-6, ssid-7, ssid-8, sw+info, wan Example URL: /dut?fields=api+version,bssid-1 Example py-json call: record = LFJsonGet.get_dut( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'api version': X 'bssid-1': X 'bssid-2': X 'bssid-3': X 'bssid-4': X 'bssid-5': X 'bssid-6': X 'bssid-7': X 'bssid-8': X 'dut': X 'eap-id': X 'entity id': X 'hw info': X 'image file': X 'lan': X 'mgt ip': X 'model number': X 'notes': X 'num ant radio 1': X 'num ant radio 2': X 'num ant radio 3': X 'password-1': X 'password-2': X 'password-3': X 'password-4': X 'password-5': X 'password-6': X 'password-7': X 'password-8': X 'serial number': X 'serial port': X 'ssid-1': X 'ssid-2': X 'ssid-3': X 'ssid-4': X 'ssid-5': X 'ssid-6': X 'ssid-7': X 'ssid-8': X 'sw info': X 'wan': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_dut(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/dut" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="dut", plural_key="duts") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /endp/ /endp/$endp_id When requesting specific column names, they need to be URL Encoded. 1st+rx, a%2Fb, bursty, crc+fail, cwnd, cx+active, cx+estab, cx+estab%2Fs, cx+to, delay, destination+addr, dropped, dup+pkts, eid, elapsed, entity+id, jitter, max+pdu, max+rate, min+pdu, min+rate, mng, name, ooo+pkts, pattern, pdu%2Fs+rx, pdu%2Fs+tx, pps+rx+ll, pps+tx+ll, rcv+buf, replays, run, rx+ber, rx+bytes, rx+drop+%25, rx+dup+%25, rx+ooo+%25, rx+pdus, rx+pkts+ll, rx+rate, rx+rate+%281%C2%A0min%29, rx+rate+%28last%29, rx+rate+ll, rx+wrong+dev, script, send+buf, source+addr, tcp+mss, tcp+rtx, tx+bytes, tx+pdus, tx+pkts+ll, tx+rate, tx+rate+%281%C2%A0min%29, tx+rate+%28last%29, tx+rate+ll # hidden columns: drop-count-5m, latency-5m, rt-latency-5m, rx-silence-5m Example URL: /endp?fields=1st+rx,a%2Fb Example py-json call: record = LFJsonGet.get_endp( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { '1st rx': X 'a/b': X 'bursty': X 'crc fail': X 'cwnd': X 'cx active': X 'cx estab': X 'cx estab/s': X 'cx to': X 'delay': X 'destination addr': X 'dropped': X 'dup pkts': X 'eid': X 'elapsed': X 'entity id': X 'jitter': X 'max pdu': X 'max rate': X 'min pdu': X 'min rate': X 'mng': X 'name': X 'ooo pkts': X 'pattern': X 'pdu/s rx': X 'pdu/s tx': X 'pps rx ll': X 'pps tx ll': X 'rcv buf': X 'replays': X 'run': X 'rx ber': X 'rx bytes': X 'rx drop %': X 'rx dup %': X 'rx ooo %': X 'rx pdus': X 'rx pkts ll': X 'rx rate': X 'rx rate (1 min)': X 'rx rate (last)': X 'rx rate ll': X 'rx wrong dev': X 'script': X 'send buf': X 'source addr': X 'tcp mss': X 'tcp rtx': X 'tx bytes': X 'tx pdus': X 'tx pkts ll': X 'tx rate': X 'tx rate (1 min)': X 'tx rate (last)': X 'tx rate ll': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_endp(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/endp" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="endpoint", plural_key="endpoint") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /events/ /events/$event_id /events/before/$event_id /events/between/$start_event_id/$end_event_id /events/last/$event_count /events/since/$event_id When requesting specific column names, they need to be URL Encoded. eid, entity+id, event, event+description, id, name, priority, time-stamp, type Example URL: /events?fields=eid,entity+id Example py-json call: record = LFJsonGet.get_events( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'eid': X 'entity id': X 'event': X 'event description': X 'id': X 'name': X 'priority': X 'time-stamp': X 'type': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_events(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/events" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="alert", plural_key="alerts") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /fileio/ /fileio/$endp_id When requesting specific column names, they need to be URL Encoded. buf-rd, buf-wr, bytes-rd, bytes-wr, crc+fail, eid, entity+id, files+%23, files-read, files-wr, io+fail, max-file-sz, max-rd-bps, max-rw-sz, max-wr-bps, min-file-sz, min-rd-bps, min-rw-sz, min-wr-bps, name, read-bps, rpt+timer, rx-bps-20s, status, tx-bps-20s, type, write-bps Example URL: /fileio?fields=buf-rd,buf-wr Example py-json call: record = LFJsonGet.get_fileio( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'buf-rd': X 'buf-wr': X 'bytes-rd': X 'bytes-wr': X 'crc fail': X 'eid': X 'entity id': X 'files #': X 'files-read': X 'files-wr': X 'io fail': X 'max-file-sz': X 'max-rd-bps': X 'max-rw-sz': X 'max-wr-bps': X 'min-file-sz': X 'min-rd-bps': X 'min-rw-sz': X 'min-wr-bps': X 'name': X 'read-bps': X 'rpt timer': X 'rx-bps-20s': X 'status': X 'tx-bps-20s': X 'type': X 'write-bps': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_fileio(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/fileio" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="endpoint", plural_key="endpoint") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /generic/ /generic/$endp_id When requesting specific column names, they need to be URL Encoded. bps+rx, bps+tx, command, dropped, eid, elapsed, entity+id, last+results, name, pdu%2Fs+rx, pdu%2Fs+tx, rpt+timer, rpt%23, rx+bytes, rx+pkts, status, tx+bytes, tx+pkts, type Example URL: /generic?fields=bps+rx,bps+tx Example py-json call: record = LFJsonGet.get_generic( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'bps rx': X 'bps tx': X 'command': X 'dropped': X 'eid': X 'elapsed': X 'entity id': X 'last results': X 'name': X 'pdu/s rx': X 'pdu/s tx': X 'rpt timer': X 'rpt#': X 'rx bytes': X 'rx pkts': X 'status': X 'tx bytes': X 'tx pkts': X 'type': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_generic(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/generic" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="endpoint", plural_key="endpoints") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /gui-cli/ When requesting specific column names, they need to be URL Encoded. na Example py-json call: record = LFJsonGet.get_gui_cli( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'na': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_gui_cli(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/gui-cli" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="", plural_key="") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /layer4/ /layer4/$endp_id When requesting specific column names, they need to be URL Encoded. %21conn, acc.+denied, bad-proto, bad-url, bytes-rd, bytes-wr, dns-avg, dns-max, dns-min, eid, elapsed, entity+id, fb-avg, fb-max, fb-min, ftp-host, ftp-port, ftp-stor, http-p, http-r, http-t, login-denied, name, nf+%284xx%29, other-err, read, redir, rpt+timer, rslv-h, rslv-p, rx+rate, rx+rate+%281%C2%A0min%29, status, timeout, total-err, total-urls, tx+rate, tx+rate+%281%C2%A0min%29, type, uc-avg, uc-max, uc-min, urls%2Fs, write # hidden columns: rpt-time Example URL: /layer4?fields=%21conn,acc.+denied Example py-json call: record = LFJsonGet.get_layer4( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { '!conn': X 'acc. denied': X 'bad-proto': X 'bad-url': X 'bytes-rd': X 'bytes-wr': X 'dns-avg': X 'dns-max': X 'dns-min': X 'eid': X 'elapsed': X 'entity id': X 'fb-avg': X 'fb-max': X 'fb-min': X 'ftp-host': X 'ftp-port': X 'ftp-stor': X 'http-p': X 'http-r': X 'http-t': X 'login-denied': X 'name': X 'nf (4xx)': X 'other-err': X 'read': X 'redir': X 'rpt timer': X 'rslv-h': X 'rslv-p': X 'rx rate': X 'rx rate (1 min)': X 'status': X 'timeout': X 'total-err': X 'total-urls': X 'tx rate': X 'tx rate (1 min)': X 'type': X 'uc-avg': X 'uc-max': X 'uc-min': X 'urls/s': X 'write': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_layer4(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/layer4" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="endpoint", plural_key="endpoint") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /port/ /port/$shelf_id /port/$shelf_id/$resource_id /port/$shelf_id/$resource_id/$port_id /ports/ /ports/$shelf_id /ports/$shelf_id/$resource_id /ports/$shelf_id/$resource_id/$port_id When requesting specific column names, they need to be URL Encoded. 4way+time+%28us%29, activity, alias, anqp+time+%28us%29, ap, beacon, bps+rx, bps+rx+ll, bps+tx, bps+tx+ll, bytes+rx+ll, bytes+tx+ll, channel, collisions, connections, crypt, cx+ago, cx+time+%28us%29, device, dhcp+%28ms%29, down, entity+id, gateway+ip, ip, ipv6+address, ipv6+gateway, key%2Fphrase, login-fail, login-ok, logout-fail, logout-ok, mac, mask, misc, mode, mtu, no+cx+%28us%29, noise, parent+dev, phantom, port, port+type, pps+rx, pps+tx, qlen, reset, retry+failed, rx+bytes, rx+crc, rx+drop, rx+errors, rx+fifo, rx+frame, rx+length, rx+miss, rx+over, rx+pkts, rx-rate, sec, signal, ssid, status, time-stamp, tx+abort, tx+bytes, tx+crr, tx+errors, tx+fifo, tx+hb, tx+pkts, tx+wind, tx-failed+%25, tx-rate, wifi+retries, # hidden columns: beacon_rx_signal, port_cur_flags_h, port_cur_flags_l, port_supported_flags_h, port_supported_flags_l, resource, rx_multicast, tx_dropped Example URL: /port?fields=4way+time+%28us%29,activity Example py-json call: record = LFJsonGet.get_port( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { '4way time (us)': X 'activity': X 'alias': X 'anqp time (us)': X 'ap': X 'beacon': X 'bps rx': X 'bps rx ll': X 'bps tx': X 'bps tx ll': X 'bytes rx ll': X 'bytes tx ll': X 'channel': X 'collisions': X 'connections': X 'crypt': X 'cx ago': X 'cx time (us)': X 'device': X 'dhcp (ms)': X 'down': X 'entity id': X 'gateway ip': X 'ip': X 'ipv6 address': X 'ipv6 gateway': X 'key/phrase': X 'login-fail': X 'login-ok': X 'logout-fail': X 'logout-ok': X 'mac': X 'mask': X 'misc': X 'mode': X 'mtu': X 'no cx (us)': X 'noise': X 'parent dev': X 'phantom': X 'port': X 'port type': X 'pps rx': X 'pps tx': X 'qlen': X 'reset': X 'retry failed': X 'rx bytes': X 'rx crc': X 'rx drop': X 'rx errors': X 'rx fifo': X 'rx frame': X 'rx length': X 'rx miss': X 'rx over': X 'rx pkts': X 'rx-rate': X 'sec': X 'signal': X 'ssid': X 'status': X 'time-stamp': X 'tx abort': X 'tx bytes': X 'tx crr': X 'tx errors': X 'tx fifo': X 'tx hb': X 'tx pkts': X 'tx wind': X 'tx-failed %': X 'tx-rate': X 'wifi retries': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_port(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/port" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="interface", plural_key="interfaces") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /quit When requesting specific column names, they need to be URL Encoded. na Example py-json call: record = LFJsonGet.get_quit( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'na': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_quit(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/quit" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="", plural_key="") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /radiostatus/ /radiostatus/$eid /radiostatus/$shelf_id/$resource_id/$port_id When requesting specific column names, they need to be URL Encoded. _links, antenna, ap, capabilities, channel, country, driver, entity+id, firmware+version, frag, frequency, max_sta, max_vap, max_vifs, monitors_down, monitors_up, phantom, port, resource, rts, stations_down, stations_up, tx-power, vaps_down, vaps_up, verbose+debug Example URL: /radiostatus?fields=_links,antenna Example py-json call: record = LFJsonGet.get_radiostatus( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { '_links': X 'antenna': X 'ap': X 'capabilities': X 'channel': X 'country': X 'driver': X 'entity id': X 'firmware version': X 'frag': X 'frequency': X 'max_sta': X 'max_vap': X 'max_vifs': X 'monitors_down': X 'monitors_up': X 'phantom': X 'port': X 'resource': X 'rts': X 'stations_down': X 'stations_up': X 'tx-power': X 'vaps_down': X 'vaps_up': X 'verbose debug': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_radiostatus(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/radiostatus" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="radio", plural_key="radios") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /resource/ /resource/$shelf_id /resource/$shelf_id/$resource_id When requesting specific column names, they need to be URL Encoded. bps-rx-3s, bps-tx-3s, cli-port, cpu, ctrl-ip, ctrl-port, eid, entity+id, free+mem, free+swap, gps, hostname, hw+version, load, max+if-up, max+staged, mem, phantom, ports, rx+bytes, shelf, sta+up, sw+version, swap, tx+bytes, # hidden columns: timestamp Example URL: /resource?fields=bps-rx-3s,bps-tx-3s Example py-json call: record = LFJsonGet.get_resource( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'bps-rx-3s': X 'bps-tx-3s': X 'cli-port': X 'cpu': X 'ctrl-ip': X 'ctrl-port': X 'eid': X 'entity id': X 'free mem': X 'free swap': X 'gps': X 'hostname': X 'hw version': X 'load': X 'max if-up': X 'max staged': X 'mem': X 'phantom': X 'ports': X 'rx bytes': X 'shelf': X 'sta up': X 'sw version': X 'swap': X 'tx bytes': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_resource(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/resource" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="resource", plural_key="resources") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /scan-results/ /scan-results/$shelf_id/$resource_id/$port_id /scan-results/$shelf_id/$resource_id/$port_id/$bssid /scan/ /scan/$shelf_id/$resource_id/$port_id /scan/$shelf_id/$resource_id/$port_id/$bssid /scanresults/ /scanresults/$shelf_id/$resource_id/$port_id /scanresults/$shelf_id/$resource_id/$port_id/$bssid When requesting specific column names, they need to be URL Encoded. na Example py-json call: record = LFJsonGet.get_scan( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'na': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_scan(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/scan" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="scan-results", plural_key="scan-results") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /stations/ /stations/$mac When requesting specific column names, they need to be URL Encoded. ap, auth-for, capabilities, entity+id, idle, roam-duration, rx+bytes, rx+pkts, rx+rate, signal, station+bssid, tx+bytes, tx+pkts, tx+rate, tx+retries, tx-failed, Example URL: /stations?fields=ap,auth-for Example py-json call: record = LFJsonGet.get_stations( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'ap': X 'auth-for': X 'capabilities': X 'entity id': X 'idle': X 'roam-duration': X 'rx bytes': X 'rx pkts': X 'rx rate': X 'signal': X 'station bssid': X 'tx bytes': X 'tx pkts': X 'tx rate': X 'tx retries': X 'tx-failed': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_stations(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/stations" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="station", plural_key="stations") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /status-msg/ /status-msg/$session /status-msg/$session/$id /status-msg/$session/$id/ws-msg,... /status-msg/$session/all /status-msg/$session/this /status-msg/sessions When requesting specific column names, they need to be URL Encoded. na Example py-json call: record = LFJsonGet.get_status_msg( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'na': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_status_msg(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/status-msg" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="sessions/messages", plural_key="sessions/messages") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /test-group/ /test-group/$id /test-groups/ /test-groups/$id When requesting specific column names, they need to be URL Encoded. cross+connects, entity+id, name, run, script Example URL: /test-group?fields=cross+connects,entity+id Example py-json call: record = LFJsonGet.get_test_group( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'cross connects': X 'entity id': X 'name': X 'run': X 'script': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_test_group(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/test-group" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="groups", plural_key="groups") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /text/ /text/$group /text/$group/$class /text/$group/$class/$key When requesting specific column names, they need to be URL Encoded. eid, name, text, type Example URL: /text?fields=eid,name Example py-json call: record = LFJsonGet.get_text( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'eid': X 'name': X 'text': X 'type': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_text(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/text" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="record", plural_key="records") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /voip-endp/ /voip-endp/$endp_id /voip-ep/ /voip-ep/$endp_id /voip/ /voip/$cx_id /voip_endp/ /voip_endp/$endp_id /voip_ep/ /voip_ep/$endp_id When requesting specific column names, they need to be URL Encoded. bps+rx+a, bps+rx+b, delay+a+%E2%86%90+b, delay+a+%E2%86%92+b, eid, endpoints+%28a%C2%A0%E2%86%94%C2%A0b%29, entity+id, jitter+a+%E2%86%90+b, jitter+a+%E2%86%92+b, name, pkt+tx+a%C2%A0%E2%86%90%C2%A0b, pkt+tx+a%C2%A0%E2%86%92%C2%A0b, rpt+timer, rx+drop+%25+a, rx+drop+%25+b, state, type Example URL: /voip?fields=bps+rx+a,bps+rx+b Example py-json call: record = LFJsonGet.get_voip( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'bps rx a': X 'bps rx b': X 'delay a ← b': X 'delay a → b': X 'eid': X 'endpoints (a ↔ b)': X 'entity id': X 'jitter a ← b': X 'jitter a → b': X 'name': X 'pkt tx a ← b': X 'pkt tx a → b': X 'rpt timer': X 'rx drop % a': X 'rx drop % b': X 'state': X 'type': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_voip(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/voip" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="connection", plural_key="connections") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /voip-endp/ /voip-endp/$endp_id When requesting specific column names, they need to be URL Encoded. calls+answered, calls+attempted, calls+completed, calls+failed, cf+404, cf+408, cf+busy, cf+canceled, delay, destination+addr, dropped, dup+pkts, eid, elapsed, entity+id, jb+cur, jb+over, jb+silence, jb+under, jitter, mng, name, ooo+pkts, pesq, pesq+bklg, pesq%23, reg+state, rst, rtp+rtt, run, rx+bytes, rx+pkts, source+addr, state, tx+bytes, tx+pkts, vad+pkts Example URL: /voip-endp?fields=calls+answered,calls+attempted Example py-json call: record = LFJsonGet.get_voip_endp( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'calls answered': X 'calls attempted': X 'calls completed': X 'calls failed': X 'cf 404': X 'cf 408': X 'cf busy': X 'cf canceled': X 'delay': X 'destination addr': X 'dropped': X 'dup pkts': X 'eid': X 'elapsed': X 'entity id': X 'jb cur': X 'jb over': X 'jb silence': X 'jb under': X 'jitter': X 'mng': X 'name': X 'ooo pkts': X 'pesq': X 'pesq bklg': X 'pesq#': X 'reg state': X 'rst': X 'rtp rtt': X 'run': X 'rx bytes': X 'rx pkts': X 'source addr': X 'state': X 'tx bytes': X 'tx pkts': X 'vad pkts': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_voip_endp(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/voip-endp" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="endpoint", plural_key="endpoints") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /vr-cx/ /vr-cx/$shelf_id/$resource_id/$port_id /vr/ /vr/$shelf_id/$resource_id /vrcx/ /vrcx/$shelf_id/$resource_id/$port_id When requesting specific column names, they need to be URL Encoded. active+ipv6+router, bgp+4byte+as, bgp+damping, bgp+peers, cluster+id, collision+domain+id, confederation+id, damping+half+life, damping+max+suppress, damping+reuse, damping+suppress, entity+id, height, ipv6+radv, is+bgp+reflector, local+as, multicast+routing, name, netsmith-state, notes, pad, ripv2, router+connections, router+id, router+id, use+confederation, use+existing+cfg, use+ospf, use+rip+dft+route, using+bgp, using+olsr, width, x, xorp+sha, y Example URL: /vr?fields=active+ipv6+router,bgp+4byte+as Example py-json call: record = LFJsonGet.get_vr( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'active ipv6 router': X 'bgp 4byte as': X 'bgp damping': X 'bgp peers': X 'cluster id': X 'collision domain id': X 'confederation id': X 'damping half life': X 'damping max suppress': X 'damping reuse': X 'damping suppress': X 'entity id': X 'height': X 'ipv6 radv': X 'is bgp reflector': X 'local as': X 'multicast routing': X 'name': X 'netsmith-state': X 'notes': X 'pad': X 'ripv2': X 'router connections': X 'router id': X 'router id': X 'use confederation ': X 'use existing cfg': X 'use ospf': X 'use rip dft route': X 'using bgp': X 'using olsr': X 'width': X 'x': X 'xorp sha': X 'y': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_vr(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/vr" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="virtual-routers", plural_key="virtual-routers") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /vrcx/ /vrcx/$shelf_id/$resource_id/$port_id When requesting specific column names, they need to be URL Encoded. entity+id, height, interface+cost, local-a, local-b, netsmith-state, remote-a, remote-b, resource, rip+metric, vrrp+id, vrrp+interval, vrrp+ip, vrrp+ip-prefix, vrrp+priority, wan+link, width, x, y Example URL: /vrcx?fields=entity+id,height Example py-json call: record = LFJsonGet.get_vrcx( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'entity id': X 'height': X 'interface cost': X 'local-a': X 'local-b': X 'netsmith-state': X 'remote-a': X 'remote-b': X 'resource': X 'rip metric': X 'vrrp id': X 'vrrp interval': X 'vrrp ip': X 'vrrp ip-prefix': X 'vrrp priority': X 'wan link': X 'width': X 'x': X 'y': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_vrcx(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/vrcx" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="router-connections", plural_key="router-connections") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /wl-endp/ /wl-endp/$wl_ep_id /wl-ep/ /wl-ep/$wl_ep_id /wl/ /wl/$wl_id /wl_endp/ /wl_endp/$wl_ep_id /wl_ep/ /wl_ep/$wl_ep_id /wlendp/$wl_ep_id When requesting specific column names, they need to be URL Encoded. bps+rx+a, bps+rx+b, eid, endpoints+%28a%C2%A0%E2%86%94%C2%A0b%29, entity+id, k-m, name, pkt+tx+a%C2%A0%E2%86%90%C2%A0b, pkt+tx+a%C2%A0%E2%86%92%C2%A0b, rpt+timer, state Example URL: /wl?fields=bps+rx+a,bps+rx+b Example py-json call: record = LFJsonGet.get_wl( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'bps rx a': X 'bps rx b': X 'eid': X 'endpoints (a ↔ b)': X 'entity id': X 'k-m': X 'name': X 'pkt tx a ← b': X 'pkt tx a → b': X 'rpt timer': X 'state': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_wl(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/wl" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="", plural_key="") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /wl-endp/ /wl-endp/$wl_ep_id When requesting specific column names, they need to be URL Encoded. buffer, corrupt+1, corrupt+2, corrupt+3, corrupt+4, corrupt+5, corrupt+6, delay, dropfreq+%25, dropped, dup+pkts, dupfreq+%25, eid, elapsed, extrabuf, failed-late, jitfreq+%25, max+rate, maxjitter, maxlate, name, ooo+pkts, qdisc, reordfrq+%25, run, rx+bytes, rx+pkts, script, serdelay, tx+bytes, tx+drop+%25, tx+pkts, tx+rate, tx-failed, wps Example URL: /wl-endp?fields=buffer,corrupt+1 Example py-json call: record = LFJsonGet.get_wl_endp( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'buffer': X 'corrupt 1': X 'corrupt 2': X 'corrupt 3': X 'corrupt 4': X 'corrupt 5': X 'corrupt 6': X 'delay': X 'dropfreq %': X 'dropped': X 'dup pkts': X 'dupfreq %': X 'eid': X 'elapsed': X 'extrabuf': X 'failed-late': X 'jitfreq %': X 'max rate': X 'maxjitter': X 'maxlate': X 'name': X 'ooo pkts': X 'qdisc': X 'reordfrq %': X 'run': X 'rx bytes': X 'rx pkts': X 'script': X 'serdelay': X 'tx bytes': X 'tx drop %': X 'tx pkts': X 'tx rate': X 'tx-failed': X 'wps': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_wl_endp(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/wl-endp" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="endpoint", plural_key="endpoint") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests ...examples how to call method(s) here... Request one of these URLs: /ws-msg/ /ws-msg/$sessionid When requesting specific column names, they need to be URL Encoded. na Example py-json call: record = LFJsonGet.get_ws_msg( eid_list=['1.234', '1.344'], requested_col_names=['all'], debug_=True) The data returned is going to look like: { 'na': X } ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def get_ws_msg(self, eid_list=None, requested_col_names='list', debug_=False): debug_ |= self.debug url = "/ws-msg" if (eid_list is None) or (len(eid_list) < 1): raise ValueError("no entity id in request") trimmed_fields = [] if isinstance(requested_col_names, str): if not requested_col_names.strip(): raise ValueError("column name cannot be blank") trimmed_fields.append(requested_col_names.strip()) if isinstance(requested_col_names, list): for field in requested_col_names: if not field.strip(): raise ValueError("column names cannot be blank") field = field.strip() if field.find(" ") > -1: raise ValueError("field should be URL encoded: [%s]" % field) trimmed_fields.append(field) url += self.make_eid_url(eid_list=eid_list) if len(trimmed_fields) > 0: url += "?fields=%s" % (",".join(trimmed_fields)) response = self.json_get(url, debug_=debug_) if response is None: return None return self.extract_values(response=response, singular_key="", plural_key="") # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- These are POST requests ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class LFJsonPost(LFCliBase): def __init__(self, lfclient_host='localhost', lfclient_port=8080, debug_=False, _exit_on_error=False, _exit_on_fail=False, _proxy_str=None, _capture_signal_list=()): super().__init__(_lfjson_host=lfclient_host, _lfjson_port=lfclient_port, _debug=debug_, _exit_on_error=_exit_on_error, _exit_on_fail=_exit_on_fail, _proxy_str=_proxy_str, _capture_signal_list=_capture_signal_list) """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_arm_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_arm_endp(self, alias=None, # Name of endpoint. cpu_id=None, # Preferred CPU ID on which this endpoint should run. mx_pkt_sz=None, # Maximum packet size, including all Ethernet headers. pkt_sz=None, # Minimum packet size, including all Ethernet headers. port=None, # Port number. pps=None, # Packets per second to generate. resource=None, # Resource number. shelf=None, # Shelf name/id. tos=None, # The Type of Service, can be HEX. See set_endp_tos for details. p_type=None, # Endpoint Type : arm_udp debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_arm_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "cpu_id": cpu_id, "mx_pkt_sz": mx_pkt_sz, "pkt_sz": pkt_sz, "port": port, "pps": pps, "resource": resource, "shelf": shelf, "tos": tos, "type": p_type, } response = self.json_post("/cli-json/add_arm_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_bgp_peer ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddBgpPeerFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddBgpPeerFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" ENABLE_PEER = 0x1 # Set this to zero if you don't want this peer enabled. PEER_CLIENT = 0x2 # Sets corresponding Xorp flag in BGP Peer section. PEER_CONFED_MEMBER = 0x4 # Sets corresponding Xorp flag in BGP Peer section. PEER_UNICAST_V4 = 0x8 # Sets corresponding Xorp flag in BGP Peer section. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddBgpPeerFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddBgpPeerFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddBgpPeerFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddBgpPeerFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddBgpPeerFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_bgp_peer(self, p_as=None, # BGP Peer Autonomous System number, 0-65535 delay_open_time=None, # BGP Peer delay open time. flags=None, # Virtual router BGP Peer flags, see above for definitions. holdtime=None, # BGP Peer hold-time. local_dev=None, # BGP Peer Local interface. nexthop=None, # BGP Peer Nexthop, IPv4 Address. nexthop6=None, # BGP Peer IPv6 Nexthop address. peer_id=None, # BGP Peer Identifier: IPv4 Address peer_index=None, # Peer index in this virtual router (0-7). resource=None, # Resource number. shelf=None, # Shelf name/id. vr_id=None, # Name of virtual router. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_bgp_peer(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "as": p_as, "delay_open_time": delay_open_time, "flags": flags, "holdtime": holdtime, "local_dev": local_dev, "nexthop": nexthop, "nexthop6": nexthop6, "peer_id": peer_id, "peer_index": peer_index, "resource": resource, "shelf": shelf, "vr_id": vr_id, } response = self.json_post("/cli-json/add_bgp_peer", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_bond ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_bond(self, network_devs=None, # Comma-separated list of network devices: eth1,eth2,eth3... port=None, # Name of the bond device. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_bond(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "network_devs": network_devs, "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/add_bond", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_br ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddBrBrFlags(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddBrBrFlags.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddBrBrFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" none = 0 # no features stp_enabled = 1 # Enable Spanning Tree Protocol (STP) def post_add_br(self, br_aging_time=None, # MAC aging time, in seconds, 32-bit number. br_flags=None, # Bridge flags, see above. br_forwarding_delay=None, # How long to wait until the bridge will start forwarding packets. br_hello_time=None, # How often does the bridge send out STP hello packets. br_max_age=None, # How long until STP considers a non-responsive bridge dead. br_priority=None, # Bridge priority, 16-bit number. network_devs=None, # Comma-separated list of network devices: eth1,eth2,eth3... port=None, # Name of the bridge device. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_br(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "br_aging_time": br_aging_time, "br_flags": br_flags, "br_forwarding_delay": br_forwarding_delay, "br_hello_time": br_hello_time, "br_max_age": br_max_age, "br_priority": br_priority, "network_devs": network_devs, "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/add_br", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_cd ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddCdFlags(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddCdFlags.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddCdFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" ERR = 2 # Set to kernel mode. RUNNING = 1 # Set to running state. def post_add_cd(self, alias=None, # Name of Collision Domain. bps=None, # Maximum speed at which this collision domain can run. flags=None, # See above. Leave blank or use 'NA' for no default values. report_timer=None, # How often to report stats. resource=None, # Resource number. shelf=None, # Shelf name/id. state=None, # RUNNING or STOPPED (default is RUNNING). Use this to start/stop. p_type=None, # CD Type: WIFI, WISER_SURFACE, WISER_SURFACE_AIR, WISER_AIR_AIR, # WISER_NCW debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_cd(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "bps": bps, "flags": flags, "report_timer": report_timer, "resource": resource, "shelf": shelf, "state": state, "type": p_type, } response = self.json_post("/cli-json/add_cd", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_cd_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_cd_endp(self, cd=None, # Name of Collision Domain. endp=None, # Endpoint name/id. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_cd_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cd": cd, "endp": endp, } response = self.json_post("/cli-json/add_cd_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_cd_vr ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_cd_vr(self, cd=None, # Name of Collision Domain. vr=None, # Virtual-Router name/ID. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_cd_vr(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cd": cd, "vr": vr, } response = self.json_post("/cli-json/add_cd_vr", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_chamber ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddChamberChamberFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddChamberChamberFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" OPEN = 0x4 # (3) Door is open, no real isolation right now. PHANTOM = 0x1 # (1) Chamber is not actually here right now. VIRTUAL = 0x2 # (2) No real chamber, open-air grouping of equipment. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddChamberChamberFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddChamberChamberFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddChamberChamberFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddChamberChamberFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddChamberChamberFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_chamber(self, chamber_type=None, # Chamber type, see above. Use 1 for Medium if uncertain. dut_name1=None, # Name of first DUT in this chamber or NA dut_name2=None, # Name of second DUT in this chamber or NA dut_name3=None, # Name of third DUT in this chamber or NA dut_name4=None, # Name of fourth DUT in this chamber or NA flags=None, # Flag field for Chamber, see above. flags_mask=None, # Mask of what flags to pay attention to, or NA for all. height=None, # Height to be used when drawn in the LANforge-GUI. isolation=None, # Estimated isolation in db for this chamber. lanforge1=None, # EID of first LANforge Resource in this chamber or NA lanforge2=None, # EID of second LANforge Resource in this chamber or NA lanforge3=None, # EID of third LANforge Resource in this chamber or NA lanforge4=None, # EID of fourth LANforge Resource in this chamber or NA name=None, # Name of Chamber, unique identifier. resource=None, # LANforge Resource ID for controlling turn-table via serial # protocol. sma_count=None, # Number of SMA connectors on this chamber, default is 16. turntable_type=None, # Turn-Table type: see above. width=None, # Width to be used when drawn in the LANforge-GUI. x=None, # X coordinate to be used when drawn in the LANforge-GUI. y=None, # Y coordinate to be used when drawn in the LANforge-GUI. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_chamber(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "chamber_type": chamber_type, "dut_name1": dut_name1, "dut_name2": dut_name2, "dut_name3": dut_name3, "dut_name4": dut_name4, "flags": flags, "flags_mask": flags_mask, "height": height, "isolation": isolation, "lanforge1": lanforge1, "lanforge2": lanforge2, "lanforge3": lanforge3, "lanforge4": lanforge4, "name": name, "resource": resource, "sma_count": sma_count, "turntable_type": turntable_type, "width": width, "x": x, "y": y, } response = self.json_post("/cli-json/add_chamber", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_chamber_cx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddChamberCxChamberCxFlags(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddChamberCxChamberCxFlags.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddChamberCxChamberCxFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" CONNECTED = 1 # (1) Connected to something. If flag is not set, connection is open to the air # +(maybe with antenna) TERMINATED = 2 # (2) Connection is terminated, signal shall not pass! def post_add_chamber_cx(self, a_id=None, # EidAntenna in string format for A side connection. atten_id=None, # EID for the Attenuator module if one is inline on this # connection. b_id=None, # EidAntenna in string format for B side connection. connection_idx=None, # Connection index, currently up to 32 connections supported # (0-31) flags=None, # Flag field for Chamber Connection, see above. flags_mask=None, # Mask of what flags to pay attention to, or NA for all. internal=None, # Internal (1) or not (0): Internal connections are no longer # supported. min_atten=None, # Specify minimum attenuation in 10ths of a db. Distance logic # will not set atten below this. name=None, # Name of Chamber, unique identifier. zrssi2=None, # Specify 2.4Ghz zero-attenuation RSSI in 10ths of a db. # Distance logic will consider this in its calculations. zrssi5=None, # Specify 5Ghz zero-attenuation RSSI in 10ths of a db. Distance # logic will consider this in its calculations. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_chamber_cx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "a_id": a_id, "atten_id": atten_id, "b_id": b_id, "connection_idx": connection_idx, "flags": flags, "flags_mask": flags_mask, "internal": internal, "min_atten": min_atten, "name": name, "zrssi2": zrssi2, "zrssi5": zrssi5, } response = self.json_post("/cli-json/add_chamber_cx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_chamber_path ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_chamber_path(self, chamber=None, # Chamber Name. content=None, # [BLANK] will erase all content, any other text will be appended # to existing text. Unescaped Value path=None, # Path Name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_chamber_path(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "chamber": chamber, "content": content, "path": path, } response = self.json_post("/cli-json/add_chamber_path", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_channel_group ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddChannelGroupTypes(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddChannelGroupTypes.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddChannelGroupTypes.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" clear = "clear" # Channel(s) are bundled into a single span. No conversion or e_m = "e&m" # Channel(s) are signalled using E&M signalling (specific fcshdlc = "fcshdlc" # The zapdel driver performs HDLC encoding and decoding on the fxogs = "fxogs" # Channel(s) are signalled using FXO Groundstart protocol. fxoks = "fxoks" # Channel(s) are signalled using FXO Koolstart protocol. fxols = "fxols" # Channel(s) are signalled using FXO Loopstart protocol. fxsgs = "fxsgs" # Channel(s) are signalled using FXS Groundstart protocol. fxsks = "fxsks" # Channel(s) are signalled using FXS Koolstart protocol. fxsls = "fxsls" # Channel(s) are signalled using FXS Loopstart protocol. indclear = "indclear" # Like 'clear' except all channels are treated individually and nethdlc = "nethdlc" # The zaptel driver bundles the channels together into an rawhdlc = "rawhdlc" # The zaptel driver performs HDLC encoding and decoding on the unused = "unused" # No signalling is performed, each channel in the list remains idle def post_add_channel_group(self, alias=None, # Name for this Channel Group. channels=None, # List of channels to add to this group. idle_flag=None, # Idle flag (byte) for this channel group, for instance: 0x7e mtu=None, # MTU (and MRU) for this channel group. Must be a multiple of # the number of channels if configuring a T1 WanLink. resource=None, # Resource number. shelf=None, # Shelf name/id. span_num=None, # The span number. First span is 1, second is 2... p_type=None, # The channel-type. Use 'clear' for PPP links. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_channel_group(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "channels": channels, "idle_flag": idle_flag, "mtu": mtu, "resource": resource, "shelf": shelf, "span_num": span_num, "type": p_type, } response = self.json_post("/cli-json/add_channel_group", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_cx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_cx(self, alias=None, # Name of the Cross Connect to create. rx_endp=None, # Name of Receiving endpoint. test_mgr=None, # Name of test-manager to create the CX on. tx_endp=None, # Name of Transmitting endpoint. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_cx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "rx_endp": rx_endp, "test_mgr": test_mgr, "tx_endp": tx_endp, } response = self.json_post("/cli-json/add_cx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_dut ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddDutDutFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddDutDutFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_11r = 0x200 # Use .11r connection logic on all ssids, deprecated, see add_dut_ssid. AP_MODE = 0x2 # (2) DUT acts as AP. DHCPD_LAN = 0x40 # Provides DHCP server on LAN port DHCPD_WAN = 0x80 # Provides DHCP server on WAN port EAP_PEAP = 0x800 # Use EAP-PEAP connection logic on all ssids, deprecated, see add_dut_ssid. EAP_TTLS = 0x400 # Use EAP-TTLS connection logic on all ssids, deprecated, see add_dut_ssid. INACTIVE = 0x4 # (3) Ignore this in ChamberView, etc NOT_DHCPCD = 0x1000 # Station/edge device that is NOT using DHCP. STA_MODE = 0x1 # (1) DUT acts as Station. WEP = 0x8 # Use WEP encryption on all ssids, deprecated, see add_dut_ssid. WPA = 0x10 # Use WPA encryption on all ssids, deprecated, see add_dut_ssid. WPA2 = 0x20 # Use WPA2 encryption on all ssids, deprecated, see add_dut_ssid. WPA3 = 0x100 # Use WPA3 encryption on all ssids, deprecated, see add_dut_extras. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddDutDutFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddDutDutFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddDutDutFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddDutDutFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddDutDutFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_dut(self, antenna_count1=None, # Antenna count for first radio. antenna_count2=None, # Antenna count for second radio. antenna_count3=None, # Antenna count for third radio. api_id=None, # DUT API Identifier (none specified yet) bssid1=None, # BSSID for first radio. bssid2=None, # BSSID for second radio. bssid3=None, # BSSID for third radio. eap_id=None, # EAP Identifier, for EAP-PEAP. flags=None, # Flag field for DUT, see above. flags_mask=None, # Optional mask to specify what DUT flags are being set. hw_version=None, # DUT Hardware Version information img_file=None, # File-Name for image to represent DUT. lan_port=None, # IP/Mask for LAN port mgt_ip=None, # Management IP Address to access DUT model_num=None, # DUT Model information name=None, # Name of DUT, cannot contain '.' passwd1=None, # WiFi Password that can be used to connect to DUT passwd2=None, # WiFi Password that can be used to connect to DUT passwd3=None, # WiFi Password that can be used to connect to DUT serial_num=None, # DUT Identifier (serial-number, etc) serial_port=None, # Resource and Serial port name on LANforge that connects to DUT # (1.2.ttyS0). Serial port does not need to be on resource holding # wan_port or lan_port ssid1=None, # WiFi SSID that can be used to connect to DUT ssid2=None, # WiFi SSID that can be used to connect to DUT ssid3=None, # WiFi SSID that can be used to connect to DUT sw_version=None, # DUT Software Version information top_left_x=None, # X Location for Chamber View. top_left_y=None, # X Location for Chamber View. wan_port=None, # IP/Mask for WAN port debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_dut(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "antenna_count1": antenna_count1, "antenna_count2": antenna_count2, "antenna_count3": antenna_count3, "api_id": api_id, "bssid1": bssid1, "bssid2": bssid2, "bssid3": bssid3, "eap_id": eap_id, "flags": flags, "flags_mask": flags_mask, "hw_version": hw_version, "img_file": img_file, "lan_port": lan_port, "mgt_ip": mgt_ip, "model_num": model_num, "name": name, "passwd1": passwd1, "passwd2": passwd2, "passwd3": passwd3, "serial_num": serial_num, "serial_port": serial_port, "ssid1": ssid1, "ssid2": ssid2, "ssid3": ssid3, "sw_version": sw_version, "top_left_x": top_left_x, "top_left_y": top_left_y, "wan_port": wan_port, } response = self.json_post("/cli-json/add_dut", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_dut_notes ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_dut_notes(self, dut=None, # DUT Name. text=None, # [BLANK] will erase all, any other text will be appended to existing # text. Unescaped Value debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_dut_notes(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "dut": dut, "text": text, } response = self.json_post("/cli-json/add_dut_notes", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_dut_ssid ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddDutSsidDutFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddDutSsidDutFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_11r = 0x200 # Use .11r connection logic EAP_PEAP = 0x800 # Use EAP-PEAP connection logic EAP_TTLS = 0x400 # Use EAP-TTLS connection logic WEP = 0x8 # Use WEP encryption WPA = 0x10 # Use WPA encryption WPA2 = 0x20 # Use WPA2 encryption WPA3 = 0x100 # Use WPA3 encryption @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddDutSsidDutFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddDutSsidDutFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddDutSsidDutFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddDutSsidDutFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddDutSsidDutFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_dut_ssid(self, bssid=None, # BSSID for cooresponding SSID. name=None, # Name of DUT, cannot contain '.' passwd=None, # WiFi Password that can be used to connect to DUT ssid=None, # WiFi SSID that can be used to connect to DUT ssid_flags=None, # SSID flags, see above. ssid_flags_mask=None, # SSID flags mask ssid_idx=None, # Index of the SSID. Zero-based indexing: (0 - 7) debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_dut_ssid(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "bssid": bssid, "name": name, "passwd": passwd, "ssid": ssid, "ssid_flags": ssid_flags, "ssid_flags_mask": ssid_flags_mask, "ssid_idx": ssid_idx, } response = self.json_post("/cli-json/add_dut_ssid", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddEndpPayloadPattern(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddEndpPayloadPattern.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddEndpPayloadPattern.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" PRBS_11_8_10 = "PRBS_11_8_10" # PRBS (see above) PRBS_15_0_14 = "PRBS_15_0_14" # PRBS (see above) PRBS_4_0_3 = "PRBS_4_0_3" # Use linear feedback shift register to generate pseudo random sequence. PRBS_7_0_6 = "PRBS_7_0_6" # PRBS (see above) custom = "custom" # Enter your own payload with the set_endp_payload cmd. decreasing = "decreasing" # bytes start at FF and decrease, wrapping if needed increasing = "increasing" # bytes start at 00 and increase, wrapping if needed ones = "ones" # payload is all ones (FF) random = "random" # generate a new random payload each time sent random_fixed = "random_fixed" # means generate one random payload, and send it over and over again. zeros = "zeros" # payload is all zeros (00) class AddEndpType(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddEndpType.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddEndpType.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" custom_ether = "custom_ether" # LF frames with custom options, use with playback custom_mc_udp = "custom_mc_udp" # LF Multicast UDP IPv4 custom_tcp = "custom_tcp" # LF TCP IPv4 frame with custom options custom_udp = "custom_udp" # LF UDP IPv4 frame with custom options lf = "lf" # LF protocol lf_sctp = "lf_sctp" # SCTP IPv4 protocol lf_sctp6 = "lf_sctp6" # SCTP IPv6 protocol lf_tcp = "lf_tcp" # TCP IPv4 connection lf_tcp6 = "lf_tcp6" # TCP IPv6 connection lf_udp = "lf_udp" # UDP IPv4 connection lf_udp6 = "lf_udp6" # UDP IPv6 connection mc_udp = "mc_udp" # LF Multicast IPv4 def post_add_endp(self, alias=None, # Name of endpoint. ip_port=None, # IP Port: IP port for layer three endpoints. Use -1 to let the # LANforge server automatically configure the ip_port. Layer 2 # endpoints will ignore is_pkt_sz_random=None, # Yes means use random sized packets, anything else means NO. is_rate_bursty=None, # Yes means bursty, anything else means NO. max_pkt=None, # Maximum packet size, including all headers. 0 means 'same', -1 # means AUTO (5.3.2+) max_rate=None, # Maximum transmit rate (bps), used if in bursty mode. min_pkt=None, # Minimum packet size, including all headers. -1 means AUTO # (5.3.2+) min_rate=None, # Minimum transmit rate (bps), or only rate if not bursty. multi_conn=None, # If > 0, will create separate process with this many connections # per endpoint. See AUTO_HELPER flag payload_pattern=None, # Payload pattern, see above. port=None, # Port/Interface name or number. resource=None, # Resource number. send_bad_crc_per_million=None, # If NIC supports it, will randomly send X per million packets # with bad ethernet Frame Check Sum. shelf=None, # Shelf name/id. ttl=None, # Time-to-live, used by UDP Multicast Endpoints only. p_type=None, # Endpoint Type: See above. use_checksum=None, # Yes means checksum the payload, anything else means NO. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "ip_port": ip_port, "is_pkt_sz_random": is_pkt_sz_random, "is_rate_bursty": is_rate_bursty, "max_pkt": max_pkt, "max_rate": max_rate, "min_pkt": min_pkt, "min_rate": min_rate, "multi_conn": multi_conn, "payload_pattern": payload_pattern, "port": port, "resource": resource, "send_bad_crc_per_million": send_bad_crc_per_million, "shelf": shelf, "ttl": ttl, "type": p_type, "use_checksum": use_checksum, } response = self.json_post("/cli-json/add_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_event ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_event(self, details=None, # Event text description. Cannot include double-quote characters. event_id=None, # Numeric ID for the event to modify, or 'new' if creating a new one. name=None, # Event entity name. priority=None, # See set_event_priority for available priorities. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_event(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "details": details, "event_id": event_id, "name": name, "priority": priority, } response = self.json_post("/cli-json/add_event", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_file_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddFileEndpFioFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddFileEndpFioFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" AUTO_MOUNT = 0x2 # (2) Attempt to mount with the provided information if not already mounted. AUTO_UNMOUNT = 0x4 # (4) Attempt to un-mount when stopping test. CHECK_MOUNT = 0x1 # (1) Attempt to verify NFS and SMB mounts match the configured values. O_APPEND = 0x200 # (512) Open files for writing with O_APPEND instead O_DIRECT = 0x8 # (8) Open file with O_DIRECT flag, disables caching. Must use block-size # +read/write calls. O_LARGEFILE = 0x20 # (32) Open files with O_LARGEFILE. This allows greater than 2GB files on # +32-bit systems. UNLINK_BW = 0x10 # (16) Unlink file before writing. This works around issues with CIFS for some # +file-servers. UNMOUNT_FORCE = 0x40 # (64) Use -f flag when calling umount UNMOUNT_LAZY = 0x80 # (128) Use -l flag when calling umount USE_FSTATFS = 0x100 # (256) Use fstatfs system call to verify file-system type when opening files. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddFileEndpFioFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddFileEndpFioFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddFileEndpFioFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddFileEndpFioFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddFileEndpFioFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class AddFileEndpPayloadPattern(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddFileEndpPayloadPattern.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddFileEndpPayloadPattern.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" PRBS_11_8_10 = "PRBS_11_8_10" # PRBS (see above) PRBS_15_0_14 = "PRBS_15_0_14" # PRBS (see above) PRBS_4_0_3 = "PRBS_4_0_3" # Use linear feedback shift register to generate pseudo random sequence. PRBS_7_0_6 = "PRBS_7_0_6" # PRBS (see above) custom = "custom" # Enter your own payload with the set_endp_payload cmd. decreasing = "decreasing" # bytes start at FF and decrease, wrapping if needed. increasing = "increasing" # bytes start at 00 and increase, wrapping if needed. ones = "ones" # Payload is all ones (FF). random = "random" # generate a new random payload each time sent. random_fixed = "random_fixed" # Means generate one random payload, and send it over zeros = "zeros" # Payload is all zeros (00). def post_add_file_endp(self, alias=None, # Name of endpoint. directory=None, # The directory to read/write in. Absolute path suggested. fio_flags=None, # File-IO flags, see above for details. max_read_rate=None, # Maximum read rate, bits-per-second. max_write_rate=None, # Maximum write rate, bits-per-second. min_read_rate=None, # Minimum read rate, bits-per-second. min_write_rate=None, # Minimum write rate, bits-per-second. mount_dir=None, # Directory to mount/unmount (if blank, will use 'directory'). mount_options=None, # Optional mount options, passed to the mount command. 'NONE' # clears. payload_pattern=None, # Payload pattern, see above. port=None, # Port number. prefix=None, # The prefix of the file(s) to read/write. resource=None, # Resource number. retry_timer=None, # Number of miliseconds to retry errored IO calls before giving # up. server_mount=None, # The server to mount, ex: 192.168.100.5/exports/test1 shelf=None, # Shelf name/id. p_type=None, # Endpoint Type : fe_generic, fe_nfs, fe_nfs4, fe_cifs, fe_iscsi, # fe_cifs/ip6, fe_nfs/ip6, fe_nfs4/ip6, fe_smb2, fe_smb2/ip6 # fe_smb21 fe_smb21/ip6 fe_smb30 fe_smb30/ip6 volume=None, # iSCSI volume to mount debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_file_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "directory": directory, "fio_flags": fio_flags, "max_read_rate": max_read_rate, "max_write_rate": max_write_rate, "min_read_rate": min_read_rate, "min_write_rate": min_write_rate, "mount_dir": mount_dir, "mount_options": mount_options, "payload_pattern": payload_pattern, "port": port, "prefix": prefix, "resource": resource, "retry_timer": retry_timer, "server_mount": server_mount, "shelf": shelf, "type": p_type, "volume": volume, } response = self.json_post("/cli-json/add_file_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_gen_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_gen_endp(self, alias=None, # Name of endpoint. port=None, # Port number. resource=None, # Resource number. shelf=None, # Shelf name/id. p_type=None, # Endpoint Type : gen_generic debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_gen_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "port": port, "resource": resource, "shelf": shelf, "type": p_type, } response = self.json_post("/cli-json/add_gen_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_gre ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_gre(self, local_lower_ip=None, # The local lower-level IP to use. port=None, # Name of the GRE to create, suggested to start with 'gre' remote_lower_ip=None, # The remote lower-level IP to use. report_timer=None, # Report timer for this port, leave blank or use NA for defaults. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_gre(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "local_lower_ip": local_lower_ip, "port": port, "remote_lower_ip": remote_lower_ip, "report_timer": report_timer, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/add_gre", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_group ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddGroupFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddGroupFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" group_total_rates = 0x4 # Set rates as total for group. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddGroupFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddGroupFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddGroupFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddGroupFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddGroupFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_group(self, flags=None, # Flags for this group, see above. flags_mask=None, # Mask for flags that we care about, use 0xFFFFFFFF or leave blank for # all. name=None, # The name of the test group. Must be unique across all groups. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_group(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "flags": flags, "flags_mask": flags_mask, "name": name, } response = self.json_post("/cli-json/add_group", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_l4_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddL4EndpHttpAuthType(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddL4EndpHttpAuthType.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" BASIC = 0x1 # Basic authentication DIGEST = 0x2 # Digest (MD5) authentication GSSNEGOTIATE = 0x4 # GSS authentication NTLM = 0x8 # NTLM authentication @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddL4EndpHttpAuthType.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddL4EndpHttpAuthType.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddL4EndpHttpAuthType has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddL4EndpHttpAuthType has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddL4EndpHttpAuthType has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class AddL4EndpProxyAuthType(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddL4EndpProxyAuthType.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" BASIC = 0x1 # 1 Basic authentication BIND_DNS = 0x200 # 512 Make DNS requests go out endpoints Port. DIGEST = 0x2 # 2 Digest (MD5) authentication DISABLE_EPSV = 0x1000 # 4096 Disable FTP EPSV option DISABLE_PASV = 0x800 # 2048 Disable FTP PASV option (will use PORT command) GSSNEGOTIATE = 0x4 # 4 GSS authentication INCLUDE_HEADERS = 0x100 # 256 especially for IMAP NTLM = 0x8 # 8 NTLM authentication USE_DEFLATE_COMPRESSION = 0x80 # 128 Use deflate compression USE_GZIP_COMPRESSION = 0x40 # 64 Use gzip compression USE_IPV6 = 0x400 # 1024 Resolve URL is IPv6. Will use IPv4 if not selected. USE_PROXY_CACHE = 0x20 # 32 Use proxy cache @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddL4EndpProxyAuthType.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddL4EndpProxyAuthType.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddL4EndpProxyAuthType has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddL4EndpProxyAuthType has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddL4EndpProxyAuthType has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class AddL4EndpType(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddL4EndpType.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" l4_generic = 0x0 # Layer 4 type @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddL4EndpType.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddL4EndpType.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddL4EndpType has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddL4EndpType has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddL4EndpType has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_l4_endp(self, alias=None, # Name of endpoint. block_size=None, # TFTP Block size, in bytes. dns_cache_timeout=None, # In seconds, how long to cache DNS lookups. 0 means no caching at # all. http_auth_type=None, # Bit-field for allowable http-authenticate methods. ip_addr=None, # Local IP address, for binding to specific secondary IP. max_speed=None, # In bits-per-second, can rate limit upload or download speed of # the URL contents. 0 means infinite. port=None, # Port number. proxy_auth_type=None, # Bit-field for allowable proxy-authenticate methods. proxy_port=None, # HTTP Proxy port if you are using a proxy. proxy_server=None, # The name of our proxy server if using one. proxy_userpwd=None, # The user-name and password for proxy authentication, format: # user:passwd. quiesce_after=None, # Quiesce test after this many URLs have been processed. resource=None, # Resource number. shelf=None, # Shelf name/id. smtp_from=None, # SMTP From address. ssl_cert_fname=None, # Name of SSL Certs file. timeout=None, # How long to wait for a connection, in milliseconds p_type=None, # Endpoint Type : l4_generic url=None, # The URL, see syntax above. Can also be a local file. url_rate=None, # How often should we process the URL(s), per 10 # minutes.
  • 600: 1/s
  • 1200: 2/s
  • 1800: 3/s
  • 2400: # 4/s
user_agent=None, # User-Agent string. Leave blank for default. Also SMTP-TO: # <a@b.com><c@d.com>...<q@x.com> debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_l4_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "block_size": block_size, "dns_cache_timeout": dns_cache_timeout, "http_auth_type": http_auth_type, "ip_addr": ip_addr, "max_speed": max_speed, "port": port, "proxy_auth_type": proxy_auth_type, "proxy_port": proxy_port, "proxy_server": proxy_server, "proxy_userpwd": proxy_userpwd, "quiesce_after": quiesce_after, "resource": resource, "shelf": shelf, "smtp_from": smtp_from, "ssl_cert_fname": ssl_cert_fname, "timeout": timeout, "type": p_type, "url": url, "url_rate": url_rate, "user_agent": user_agent, } response = self.json_post("/cli-json/add_l4_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_monitor ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddMonitorFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddMonitorFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" disable_ht40 = 0x800 # Disable HT-40 even if hardware and AP support it. disable_ht80 = 0x8000000 # Disable HT80 (for AC chipset NICs only) ht160_enable = 0x100000000 # Enable HT160 mode. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddMonitorFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddMonitorFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddMonitorFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddMonitorFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddMonitorFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_monitor(self, aid=None, # AID, may be used when sniffing on /AX radios. ap_name=None, # Name for this Monitor interface, for example: moni0 bssid=None, # BSSID to use when sniffing on /AX radios, optional. flags=None, # Flags for this monitor interface. flags_mask=None, # Flags mask for this monitor interface. radio=None, # Name of the physical radio interface, for example: wiphy0 resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_monitor(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aid": aid, "ap_name": ap_name, "bssid": bssid, "flags": flags, "flags_mask": flags_mask, "radio": radio, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/add_monitor", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_mvlan ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_mvlan(self, flags=None, # 0x1: Create admin-down. index=None, # Optional: The index of the VLAN, (the 4 in eth0#4) mac=None, # The MAC address, can also use parent-pattern in 5.3.8 and higher: # xx:xx:xx:*:*:xx old_name=None, # The temporary name, used for configuring un-discovered hardware. port=None, # Port number of an existing Ethernet interface. report_timer=None, # Report timer for this port, leave blank or use NA for defaults. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_mvlan(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "flags": flags, "index": index, "mac": mac, "old_name": old_name, "port": port, "report_timer": report_timer, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/add_mvlan", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_ppp_link ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_ppp_link(self, auth=None, # YES if you want to authenticate. Default is NO. channel_groups=None, # List of channel groups, see above. debug=None, # YES for debug, otherwise debugging for the ppp connection is # off. down_time_max_ms=None, # Maximum length of downtime (ms) for PPP link between runs, or # 0 for the link to be always up. down_time_min_ms=None, # Minimum length of downtime (ms) for PPP link between runs, or # 0 for the link to be always up. dst_ip=None, # Destination IP address for this PPP connection. extra_args=None, # Extra arguments to be passed directly to the pppd server. holdoff=None, # Seconds between attempt to bring link back up if it dies, # suggest 1. lcp_echo_failure=None, # LCP echo failures before we determine links is dead, suggest # 5. lcp_echo_interval=None, # Seconds between LCP echos, suggest 1. mlppp_descriptor=None, # A unique key for use with multi-link PPP connections. persist=None, # YES if you want to persist the connection. This is suggested. pppoe_transport_port=None, # Port number (or name) for underlying PPPoE transport. resource=None, # Resource (machine) number. run_time_max_ms=None, # Maximum uptime (ms) for PPP link during an experiment, or 0 # for the link to be always up. run_time_min_ms=None, # Minimum uptime (ms) for PPP link during an experiment, or 0 # for the link to be always up. shelf=None, # Shelf name/id. src_ip=None, # Source IP address for this PPP connection. transport_type=None, # What sort of transport this ppp link uses. tty_transport_device=None, # TTY device for PPP links associated with TTYs. unit=None, # Unit number for the PPP link. ie, the 7 in ppp7. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_ppp_link(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "auth": auth, "channel_groups": channel_groups, "debug": debug, "down_time_max_ms": down_time_max_ms, "down_time_min_ms": down_time_min_ms, "dst_ip": dst_ip, "extra_args": extra_args, "holdoff": holdoff, "lcp_echo_failure": lcp_echo_failure, "lcp_echo_interval": lcp_echo_interval, "mlppp_descriptor": mlppp_descriptor, "persist": persist, "pppoe_transport_port": pppoe_transport_port, "resource": resource, "run_time_max_ms": run_time_max_ms, "run_time_min_ms": run_time_min_ms, "shelf": shelf, "src_ip": src_ip, "transport_type": transport_type, "tty_transport_device": tty_transport_device, "unit": unit, } response = self.json_post("/cli-json/add_ppp_link", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_profile ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddProfileProfileFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddProfileProfileFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_11r = 0x40 # Use 802.11r roaming setup. BSS_TRANS = 0x400 # Enable BSS Transition logic DHCP_SERVER = 0x1 # This should provide DHCP server. EAP_PEAP = 0x200 # Enable EAP-PEAP EAP_TTLS = 0x80 # Use 802.1x EAP-TTLS NAT = 0x100 # Enable NAT if this object is in a virtual router SKIP_DHCP_ROAM = 0x10 # Ask station to not re-do DHCP on roam. WEP = 0x2 # Use WEP encryption WPA = 0x4 # Use WPA encryption WPA2 = 0x8 # Use WPA2 encryption WPA3 = 0x20 # Use WPA3 encryption @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddProfileProfileFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddProfileProfileFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddProfileProfileFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddProfileProfileFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddProfileProfileFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class AddProfileWifiMode(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddProfileWifiMode.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddProfileWifiMode.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_802_11a = "802.11a" # 802.11a AUTO = "AUTO" # 802.11g aAX = "aAX" # 802.11a-AX (6E disables /n and /ac) abg = "abg" # 802.11abg abgn = "abgn" # 802.11abgn abgnAC = "abgnAC" # 802.11abgn-AC abgnAX = "abgnAX" # 802.11abgn-AX an = "an" # 802.11an anAC = "anAC" # 802.11an-AC anAX = "anAX" # 802.11an-AX as_is = "as_is" # Make no changes to current configuration b = "b" # 802.11b bg = "bg" # 802.11bg bgn = "bgn" # 802.11bgn bgnAC = "bgnAC" # 802.11bgn-AC bgnAX = "bgnAX" # 802.11bgn-AX bond = "bond" # Bonded pair of Ethernet ports. bridged_ap = "bridged_ap" # AP device in bridged mode. The EIDs may specify radio and bridged port. client = "client" # Client-side non-WiFi device (Ethernet port, for instance). g = "g" # 802.11g mobile_sta = "mobile_sta" # Mobile station device. Expects to connect to DUT AP(s) and upstream # +LANforge. monitor = "monitor" # Monitor device/sniffer. The EIDs may specify which radios to use. peer = "peer" # Edge device, client or server (Ethernet port, for instance). rdd = "rdd" # Pair of redirect devices, typically associated with VR to act as traffic # +endpoint routed_ap = "routed_ap" # AP in routed mode. The EIDs may specify radio and upstream port. sta = "sta" # Station device, most likely non mobile. The EIDs may specify radio(s) to # +use. uplink = "uplink" # Uplink towards rest of network (can go in virtual router and do NAT) upstream = "upstream" # Upstream server device. The EIDs may specify which ports to use. vlan = "vlan" # 802.1q VLAN. Specify VID with the 'freq' option. def post_add_profile(self, alias_prefix=None, # Port alias prefix, aka hostname prefix. antenna=None, # Antenna count for this profile. bandwidth=None, # 0 (auto), 20, 40, 80 or 160 eap_id=None, # EAP Identifier flags_mask=None, # Specify what flags to set. freq=None, # WiFi frequency to be used, 0 means default. instance_count=None, # Number of devices (stations, vdevs, etc) mac_pattern=None, # Optional MAC-Address pattern, for instance: xx:xx:xx:*:*:xx name=None, # Profile Name. passwd=None, # WiFi Password to be used (AP Mode), [BLANK] means no password. profile_flags=None, # Flags for this profile, see above. profile_type=None, # Profile type: See above. ssid=None, # WiFi SSID to be used, [BLANK] means any. vid=None, # Vlan-ID (only valid for vlan profiles). wifi_mode=None, # WiFi Mode for this profile. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_profile(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias_prefix": alias_prefix, "antenna": antenna, "bandwidth": bandwidth, "eap_id": eap_id, "flags_mask": flags_mask, "freq": freq, "instance_count": instance_count, "mac_pattern": mac_pattern, "name": name, "passwd": passwd, "profile_flags": profile_flags, "profile_type": profile_type, "ssid": ssid, "vid": vid, "wifi_mode": wifi_mode, } response = self.json_post("/cli-json/add_profile", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_profile_notes ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_profile_notes(self, dut=None, # Profile Name. text=None, # [BLANK] will erase all, any other text will be appended to # existing text. Unescaped Value debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_profile_notes(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "dut": dut, "text": text, } response = self.json_post("/cli-json/add_profile_notes", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_rdd ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_rdd(self, peer_ifname=None, # The peer (other) RedirectDevice in this pair. port=None, # Name of the Redirect Device to create. report_timer=None, # Report timer for this port, leave blank or use NA for defaults. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_rdd(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "peer_ifname": peer_ifname, "port": port, "report_timer": report_timer, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/add_rdd", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_sec_ip ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_sec_ip(self, ip_list=None, # IP1/prefix,IP2/prefix,...IPZ/prefix. port=None, # Name of network device (Port) to which these IPs will be added. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_sec_ip(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "ip_list": ip_list, "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/add_sec_ip", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_sta ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddStaFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddStaFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_80211r_pmska_cache = 0x4000000 # Enable oportunistic PMSKA caching for WPA2 (Related to # +802.11r). p_80211u_additional = 0x100000 # AP requires additional step for access (802.11u Interworking) p_80211u_auto = 0x40000 # Enable 802.11u (Interworking) Auto-internetworking feature. # +Always enabled currently. p_80211u_e911 = 0x200000 # AP claims emergency services reachable (802.11u Interworking) p_80211u_e911_unauth = 0x400000 # AP provides Unauthenticated emergency services (802.11u # +Interworking) p_80211u_enable = 0x20000 # Enable 802.11u (Interworking) feature. p_80211u_gw = 0x80000 # AP Provides access to internet (802.11u Interworking) p_8021x_radius = 0x2000000 # Use 802.1x (RADIUS for AP). create_admin_down = 0x1000000000 # Station should be created admin-down. custom_conf = 0x20 # Use Custom wpa_supplicant config file. disable_twt = 0x100000000000 # Disable TWT mode disable_fast_reauth = 0x200000000 # Disable fast_reauth option for virtual stations. disable_gdaf = 0x1000000 # AP: Disable DGAF (used by HotSpot 2.0). disable_ht80 = 0x8000000 # Disable HT80 (for AC chipset NICs only) disable_roam = 0x80000000 # Disable automatic station roaming based on scan results. disable_sgi = 0x4000 # Disable SGI (Short Guard Interval). hs20_enable = 0x800000 # Enable Hotspot 2.0 (HS20) feature. Requires WPA-2. ht160_enable = 0x100000000 # Enable HT160 mode. ht40_disable = 0x800 # Disable HT-40 even if hardware and AP support it. ibss_mode = 0x20000000 # Station should be in IBSS mode. lf_sta_migrate = 0x8000 # OK-To-Migrate (Allow station migration between LANforge # +radios) mesh_mode = 0x400000000 # Station should be in MESH mode. no_supp_op_class_ie = 0x4000000000 # Do not include supported-oper-class-IE in assoc requests. May # +work around AP bugs. osen_enable = 0x40000000 # Enable OSEN protocol (OSU Server-only Authentication) passive_scan = 0x2000 # Use passive scanning (don't send probe requests). power_save_enable = 0x800000000 # Station should enable power-save. May not work in all # +drivers/configurations. scan_ssid = 0x1000 # Enable SCAN-SSID flag in wpa_supplicant. txo_enable = 0x8000000000 # Enable/disable tx-offloads, typically managed by set_wifi_txo # +command use_bss_transition = 0x80000000000 # Enable BSS transition. use_wpa3 = 0x10000000000 # Enable WPA-3 (SAE Personal) mode. verbose = 0x10000 # Verbose-Debug: Increase debug info in wpa-supplicant and # +hostapd logs. wds_mode = 0x2000000000 # WDS station (sort of like a lame mesh), not supported on # +ath10k wep_enable = 0x200 # Use wpa_supplicant configured for WEP encryption. wpa2_enable = 0x400 # Use wpa_supplicant configured for WPA2 encryption. wpa_enable = 0x10 # Enable WPA @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddStaFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddStaFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddStaFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddStaFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddStaFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class AddStaMode(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddStaMode.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddStaMode.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_802_11a = 1 # 802.11a AUTO = 0 # 802.11g aAX = 15 # 802.11a-AX (6E disables /n and /ac) abg = 4 # 802.11abg abgn = 5 # 802.11abgn abgnAC = 8 # 802.11abgn-AC abgnAX = 12 # 802.11abgn-AX an = 10 # 802.11an anAC = 9 # 802.11an-AC anAX = 14 # 802.11an-AX b = 2 # 802.11b bg = 7 # 802.11bg bgn = 6 # 802.11bgn bgnAC = 11 # 802.11bgn-AC bgnAX = 13 # 802.11bgn-AX g = 3 # 802.11g class AddStaRate(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddStaRate.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddStaRate.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_a_g = "/a/g" # 6 Mbps, 9 Mbps, 12 Mbps, 18 Mbps, 24 Mbps, 36 Mbps, 48 Mbps, 54 Mbps p_b = "/b" # 1Mbps, 2Mbps, 5.5 Mbps, 11 Mbps DEFAULT = "DEFAULT" # Use maximum available speed MCS0_76 = "MCS0-76" # /n rates p_bitmap_ = "[bitmap]" # '0xff 00 ...' to directly specify the MCS bitmap. def post_add_sta(self, ampdu_density=None, # 0-7, or 0xFF to not set. ampdu_factor=None, # 0-3, or 0xFF to not set. ap=None, # The Access Point BSSID this Virtual STA should be associated with # (example: 00:11:22:33:4:55, or DEFAULT for any). flags=None, # Flags for this interface (see above.) flags_mask=None, # If set, only these flags will be considered. ieee80211w=None, # Management Frame Protection: 0: disabled, 1: optional, 2: Required. key=None, # Encryption key (WEP, WPA, WPA2, WPA3, etc) for this Virtual STA. # Prepend with 0x for ascii-hex input. mac=None, # The MAC address, can also use parent-pattern in 5.3.8 and higher: # xx:xx:xx:*:*:xx max_amsdu=None, # 1 == enabled, 0 == disabled, 0xFF == do not set. mode=None, # WiFi mode:
  • 0: AUTO,
  • 1: 802.11a
  • 2: b
  • 3: # g
  • 4: abg
  • 5: abgn
  • 6: bgn
  • 7: bg
  • #
  • 8: abgnAC
  • 9 anAC
  • 10 an
  • 11 # bgnAC
  • 12 abgnAX
  • 13 bgnAX
  • 14 anAX
  • 15 # aAX
nickname=None, # Nickname for this Virtual STA. (No longer used) radio=None, # Name of the physical radio interface, for example: wiphy0 rate=None, # Max rate, see help above. resource=None, # Resource number. shelf=None, # Shelf number. ssid=None, # SSID for this Virtual STA. Use [BLANK] for empty SSID. Start with # 0x for HEX interpretation. sta_br_ip=None, # IP Address for station bridging. Set to 0.0.0.0 to use MAC bridging. sta_name=None, # Name for this Virtual STA, for example: sta0 wpa_cfg_file=None, # WPA Supplicant config file. x_coord=None, # Floating point number. y_coord=None, # Floating point number. z_coord=None, # Floating point number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_sta(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "ampdu_density": ampdu_density, "ampdu_factor": ampdu_factor, "ap": ap, "flags": flags, "flags_mask": flags_mask, "ieee80211w": ieee80211w, "key": key, "mac": mac, "max_amsdu": max_amsdu, "mode": mode, "nickname": nickname, "radio": radio, "rate": rate, "resource": resource, "shelf": shelf, "ssid": ssid, "sta_br_ip": sta_br_ip, "sta_name": sta_name, "wpa_cfg_file": wpa_cfg_file, "x_coord": x_coord, "y_coord": y_coord, "z_coord": z_coord, } response = self.json_post("/cli-json/add_sta", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_t1_span ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddT1SpanBuildout(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddT1SpanBuildout.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddT1SpanBuildout.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_15db = 6 # -15db (CSU) p_22_5db = 7 # -22.5db (CSU) p_7_5db = 5 # -7.5db (CSU) p_0db = 8 # 0db (CSU) p_133_ft = 0 # 1-133 feet p_266_ft = 1 # 122-266 feet p_399_ft = 2 # 266-399 feet p_533_ft = 3 # 399-533 feet p_655_ft = 4 # 533-655 feet def post_add_t1_span(self, buildout=None, # Buildout, Integer, see above. coding=None, # Coding: T1: ami or b8zs. E1: ami or hdb3 cpu_id=None, # CPU identifier (A, B, etc) for multiport Sangoma resources. first_channel=None, # The first DS0 channel for this span. framing=None, # Framing: T1: esf or d4. E1: cas or ccs. mtu=None, # MTU for this span (used by in-band management, if at all). pci_bus=None, # PCI Bus number, needed for Sangoma resources. pci_slot=None, # PCI slot number, needed for Sangoma resources. resource=None, # Resource number. shelf=None, # Shelf name/id. span_num=None, # The span number. First span is 1, second is 2... timing=None, # Timing: 0 == do not use, 1 == primary, 2 == secondary.. p_type=None, # Currently supported types are: Sangoma_T1, Sangoma_E1, Digium_T1 debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_t1_span(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "buildout": buildout, "coding": coding, "cpu_id": cpu_id, "first_channel": first_channel, "framing": framing, "mtu": mtu, "pci_bus": pci_bus, "pci_slot": pci_slot, "resource": resource, "shelf": shelf, "span_num": span_num, "timing": timing, "type": p_type, } response = self.json_post("/cli-json/add_t1_span", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_text_blob ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_text_blob(self, name=None, # Text name, for instance '2-AP-test-case' text=None, # [BLANK] will erase all, any other text will be appended to existing # text. Unescaped Value p_type=None, # Text type identifier stream, for instance 'cv-connectivity' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_text_blob(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, "text": text, "type": p_type, } response = self.json_post("/cli-json/add_text_blob", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_tgcx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_tgcx(self, cxname=None, # The name of the CX. tgname=None, # The name of the test group. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_tgcx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cxname": cxname, "tgname": tgname, } response = self.json_post("/cli-json/add_tgcx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_threshold ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddThresholdThreshId(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddThresholdThreshId.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddThresholdThreshId.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" Delete_Marked = -3 # Delete any marked. Mark_All = -2 # Mark all class AddThresholdThreshType(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddThresholdThreshType.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddThresholdThreshType.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" NO_RX_SINCE = 6 # Have not received any bytes/packets in specified time. RX_BPS_RATE_OOR_1m = 5 # rx-bps over last 1 minute is out of range. RX_BPS_RATE_OOR_30S = 3 # rx-bps over last 30 seconds is out of range. RX_BPS_RATE_OOR_3S = 1 # rx-bps over last 3 seconds is out of range. TT_RX_DROP_OOR = 8 # RX Drop percentage is out of range (per-million). TT_RX_LAT_OOR = 7 # Latency running-average out of range. TX_BPS_RATE_OOR_1m = 4 # tx-bps over last 1 minute is out of range. TX_BPS_RATE_OOR_30S = 2 # tx-bps over last 30 seconds is out of range. TX_BPS_RATE_OOR_3S = 0 # tx-bps over last 3 seconds is out of range. def post_add_threshold(self, endp=None, # Endpoint name or ID. thresh_id=None, # Threshold ID. If adding new threshold, use -1, otherwise use # correct ID. thresh_max=None, # Maximum acceptable value for this threshold. thresh_min=None, # Minimum acceptable value for this threshold. thresh_type=None, # Threshold type, integer, (see above). debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_threshold(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp": endp, "thresh_id": thresh_id, "thresh_max": thresh_max, "thresh_min": thresh_min, "thresh_type": thresh_type, } response = self.json_post("/cli-json/add_threshold", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_tm ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_tm(self, name=None, # The name of the test manager. Must be unique across test managers. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_tm(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/add_tm", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_traffic_profile ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddTrafficProfileTrafficProfileFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddTrafficProfileTrafficProfileFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" BI_DIRECTIONAL = 0x2 # Should we do bi-directional traffic? IPERF_UDP = 0x4 # If Iperf, should use UDP. If not set, then will use TCP. UP = 0x1 # Upload direction (this not set means download) @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddTrafficProfileTrafficProfileFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddTrafficProfileTrafficProfileFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddTrafficProfileTrafficProfileFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddTrafficProfileTrafficProfileFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddTrafficProfileTrafficProfileFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class AddTrafficProfileWifiMode(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddTrafficProfileWifiMode.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddTrafficProfileWifiMode.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" Iperf3_Client = "Iperf3-Client" # iperf3 client Iperf3_Server = "Iperf3-Server" # iperf3 server as_is = "as_is" # Make no changes to current configuration http = "http" # Not yet implemented https = "https" # Not yet implemented tcp = "tcp" # udp = "udp" # def post_add_traffic_profile(self, instance_count=None, # Number of connections per device max_pdu=None, # Minimum PDU size max_speed=None, # Opposite-Direction Speed in bps. min_pdu=None, # Minimum PDU size min_speed=None, # Opposite-Direction Speed in bps. name=None, # Profile Name. tos=None, # IP Type-of-Service traffic_profile_flags=None, # Flags for this profile, none defined at this point. traffic_profile_flags_mask=None, # Specify what flags to set. p_type=None, # Profile type: See above.. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_traffic_profile(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "instance_count": instance_count, "max_pdu": max_pdu, "max_speed": max_speed, "min_pdu": min_pdu, "min_speed": min_speed, "name": name, "tos": tos, "traffic_profile_flags": traffic_profile_flags, "traffic_profile_flags_mask": traffic_profile_flags_mask, "type": p_type, } response = self.json_post("/cli-json/add_traffic_profile", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_traffic_profile_notes ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_traffic_profile_notes(self, dut=None, # Profile Name. text=None, # [BLANK] will erase all, any other text will be appended # to existing text. Unescaped # Value debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_traffic_profile_notes(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "dut": dut, "text": text, } response = self.json_post("/cli-json/add_traffic_profile_notes", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_vap ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddVapFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddVapFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_80211h_enable = 0x10000000 # Enable 802.11h (needed for running on DFS channels) Requires # +802.11d. p_80211r_pmska_cache = 0x4000000 # Enable oportunistic PMSKA caching for WPA2 (Related to # +802.11r). p_80211u_additional = 0x100000 # AP requires additional step for access (802.11u Interworking) p_80211u_auto = 0x40000 # Enable 802.11u (Interworking) Auto-internetworking feature. # +Always enabled currently. p_80211u_e911 = 0x200000 # AP claims emergency services reachable (802.11u Interworking) p_80211u_e911_unauth = 0x400000 # AP provides Unauthenticated emergency services (802.11u # +Interworking) p_80211u_enable = 0x20000 # Enable 802.11u (Interworking) feature. p_80211u_gw = 0x80000 # AP Provides access to internet (802.11u Interworking) p_8021x_radius = 0x2000000 # Use 802.1x (RADIUS for AP). create_admin_down = 0x1000000000 # Station should be created admin-down. disable_dgaf = 0x1000000 # AP Disable DGAF (used by HotSpot 2.0). disable_ht40 = 0x800 # Disable HT-40 (will use HT-20 if available). disable_ht80 = 0x8000000 # Disable HT80 (for AC chipset NICs only) enable_80211d = 0x40 # Enable 802.11D to broadcast country-code & channels in # +VAPs enable_wpa = 0x10 # Enable WPA hostapd_config = 0x20 # Use Custom hostapd config file. hs20_enable = 0x800000 # Enable Hotspot 2.0 (HS20) feature. Requires WPA-2. ht160_enable = 0x100000000 # Enable HT160 mode. osen_enable = 0x40000000 # Enable OSEN protocol (OSU Server-only Authentication) pri_sec_ch_enable = 0x100 # Enable Primary/Secondary channel switch. short_preamble = 0x80 # Allow short-preamble use_bss_load = 0x20000000000 # Enable BSS Load IE in Beacons and Probe Responses (.11e). use_bss_transition = 0x80000000000 # Enable BSS transition. use_rrm_report = 0x40000000000 # Enable Radio measurements IE in beacon and probe responses. use_wpa3 = 0x10000000000 # Enable WPA-3 (SAE Personal) mode. verbose = 0x10000 # Verbose-Debug: Increase debug info in wpa-supplicant and # +hostapd logs. wep_enable = 0x200 # Enable WEP Encryption wpa2_enable = 0x400 # Enable WPA2 Encryption @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddVapFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddVapFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddVapFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddVapFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddVapFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class AddVapMode(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddVapMode.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddVapMode.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_802_11a = 1 # 802.11a AUTO = 0 # 802.11g aAX = 15 # 802.11a-AX (6E disables /n and /ac) abg = 4 # 802.11abg abgn = 5 # 802.11abgn abgnAC = 8 # 802.11abgn-AC abgnAX = 12 # 802.11abgn-AX an = 10 # 802.11an anAC = 9 # 802.11an-AC anAX = 14 # 802.11an-AX b = 2 # 802.11b bg = 7 # 802.11bg bgn = 6 # 802.11bgn bgnAC = 11 # 802.11bgn-AC bgnAX = 13 # 802.11bgn-AX g = 3 # 802.11g def post_add_vap(self, ap_name=None, # Name for this Virtual AP, for example: vap0 beacon=None, # The beacon interval, in 1kus (1.024 ms), default 100, range: 15..65535 custom_cfg=None, # Custom hostapd config file, if you want to craft your own config. dtim_period=None, # DTIM period, range 1..255. Default 2. flags=None, # Flags for this interface (see above.) flags_mask=None, # If set, only these flags will be considered. frag_thresh=None, # UN-USED, Was Fragmentation threshold, which is now set with # set_wifi_radio, use NA ieee80211w=None, # Management Frame Protection: 0: disabled, 1: optional, 2: Required. key=None, # Encryption key for this Virtual AP. Prepend with 0x for ascii-hex # representation. mac=None, # The MAC address, can also use parent-pattern in 5.3.8 and higher: # xx:xx:xx:*:*:xx max_sta=None, # Maximum number of Stations allowed to join this AP (1..2007) mode=None, # WiFi mode: see table radio=None, # Name of the physical radio interface, for example: wiphy0 rate=None, # Max rate, see help for add_vsta resource=None, # Resource number. shelf=None, # Shelf number. ssid=None, # SSID for this Virtual AP. x_coord=None, # Floating point number. y_coord=None, # Floating point number. z_coord=None, # Floating point number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_vap(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "ap_name": ap_name, "beacon": beacon, "custom_cfg": custom_cfg, "dtim_period": dtim_period, "flags": flags, "flags_mask": flags_mask, "frag_thresh": frag_thresh, "ieee80211w": ieee80211w, "key": key, "mac": mac, "max_sta": max_sta, "mode": mode, "radio": radio, "rate": rate, "resource": resource, "shelf": shelf, "ssid": ssid, "x_coord": x_coord, "y_coord": y_coord, "z_coord": z_coord, } response = self.json_post("/cli-json/add_vap", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_venue ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddVenueFreq24(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddVenueFreq24.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" ALL = 0xffff # ALL Ch_1 = 0x1 # Channel 1 Ch_2 = 0x2 # Channel 2 Ch_3 = 0x4 # Channel 3 @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddVenueFreq24.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddVenueFreq24.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddVenueFreq24 has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddVenueFreq24 has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddVenueFreq24 has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class AddVenueFreq5(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddVenueFreq5.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" Ch_100 = 0x800 # Channel 100 5500 Ch_104 = 0x1000 # Channel 104 5520 Ch_108 = 0x2000 # Channel 108 5540 Ch_112 = 0x4000 # Channel 112 5560 Ch_116 = 0x8000 # Channel 116 5580 Ch_120 = 0x10000 # Channel 120 5600 Ch_124 = 0x20000 # Channel 124 5620 Ch_128 = 0x40000 # Channel 128 5640 Ch_132 = 0x80000 # Channel 132 5660 Ch_136 = 0x100000 # Channel 136 5680 Ch_140 = 0x200000 # Channel 140 5700 Ch_149 = 0x400000 # Channel 149 5745 Ch_153 = 0x800000 # Channel 153 5765 Ch_157 = 0x1000000 # Channel 157 5785 Ch_161 = 0x2000000 # Channel 161 5805 Ch_165 = 0x4000000 # Channel 165 5825 Ch_36 = 0x1 # Channel 36 5180 Ch_38 = 0x2 # Channel 38 5190 Ch_40 = 0x4 # Channel 40 5200 Ch_42 = 0x8 # Channel 42 5210 Ch_44 = 0x10 # Channel 44 5220 Ch_46 = 0x20 # Channel 46 5230 Ch_48 = 0x40 # Channel 48 5240 Ch_52 = 0x80 # Channel 52 5260 Ch_56 = 0x100 # Channel 56 5280 Ch_60 = 0x200 # Channel 60 5300 Ch_64 = 0x400 # Channel 64 5320 @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddVenueFreq5.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddVenueFreq5.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddVenueFreq5 has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddVenueFreq5 has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddVenueFreq5 has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_venue(self, description=None, # User-supplied description, ie: Big City Ball Park; # 47-characters max. freq_24=None, # Frequency list for 2.4Ghz band, see above. freq_5=None, # Frequency list for 5Ghz band, see above. resource=None, # Resource number. shelf=None, # Shelf number. venu_id=None, # Number to uniquely identify this venue on this resource. x1=None, # Floating point coordinate for lower-left corner. x2=None, # Floating point coordinate for upper-right corner. y1=None, # Floating point coordinate for lower-left corner. y2=None, # Floating point coordinate for upper-right corner. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_venue(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "description": description, "freq_24": freq_24, "freq_5": freq_5, "resource": resource, "shelf": shelf, "venu_id": venu_id, "x1": x1, "x2": x2, "y1": y1, "y2": y2, } response = self.json_post("/cli-json/add_venue", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_vlan ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_vlan(self, old_name=None, # The temporary name, used for configuring un-discovered hardware. port=None, # Port number of an existing Ethernet interface. report_timer=None, # Report timer for this port, leave blank or use NA for defaults. resource=None, # Resource number. shelf=None, # Shelf number. vid=None, # The VLAN-ID for this 802.1Q VLAN interface. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_vlan(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "old_name": old_name, "port": port, "report_timer": report_timer, "resource": resource, "shelf": shelf, "vid": vid, } response = self.json_post("/cli-json/add_vlan", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_voip_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_voip_endp(self, alias=None, # Name of endpoint. auth_user_name=None, # Use this field for authentication user name. AUTO or blank mean # use phone number. display_name=None, # User-Name to be displayed. Use AUTO to display phone number. gateway_port=None, # IP Port for SIP gateway (defaults to 5060). ip_addr=None, # Use this IP for local IP address. Useful when there are # multiple IPs on a port. peer_phone_num=None, # Use AUTO to use phone number of peer endpoint, otherwise # specify a number: user[@host[:port]] phone_num=None, # Phone number for Endpoint port=None, # Port number or name. proxy_passwd=None, # Password to be used when registering with proxy/gateway. resource=None, # Resource number. rtp_port=None, # RTP port to use for send and receive. rx_sound_file=None, # File name to save received PCM data to. Will be in WAV format, # or AUTO shelf=None, # Shelf name/id. sip_gateway=None, # SIP Gateway/Proxy Name, this is who to register with, or AUTO tx_sound_file=None, # File name containing the sound sample we will be playing. vad_max_timer=None, # How often should we force a packet, even if VAD is on. vad_timer=None, # How much silence (milliseconds) before VAD is enabled. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_voip_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "auth_user_name": auth_user_name, "display_name": display_name, "gateway_port": gateway_port, "ip_addr": ip_addr, "peer_phone_num": peer_phone_num, "phone_num": phone_num, "port": port, "proxy_passwd": proxy_passwd, "resource": resource, "rtp_port": rtp_port, "rx_sound_file": rx_sound_file, "shelf": shelf, "sip_gateway": sip_gateway, "tx_sound_file": tx_sound_file, "vad_max_timer": vad_max_timer, "vad_timer": vad_timer, } response = self.json_post("/cli-json/add_voip_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_vr ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddVrFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddVrFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_4BYTE_AS_NUMBER = 0x40 # Sets corresponding Xorp flag. BGP_CONFED = 0x100 # Configure BGP in a confederation. BGP_DAMPING = 0x200 # Enable BGP damping section in Xorp configuration file. ENABLE_BGP = 0x20 # Set this to zero if you don't want BGP on this VR. RIP_ACCEPT_DR = 0x800 # Tell RIP to accept default-routes. ROUTE_REFLECTOR = 0x80 # Act as BGP Route Reflector. USE_IPV6 = 0x10 # Enable IPv6 OSPF routing for this virtual router. USE_IPV6_RADVD = 0x8 # Enable IPv6 RADV Daemon for interfaces in this virtual router. USE_RIP = 0x400 # Enable RIP routing protocol in Xorp. USE_XORP_MCAST = 0x2 # Enable Xorp Multicast routing (requires OSPF to be enabled currently) USE_XORP_OLSR = 0x1000 # Enable OLSR routing protocol in Xorp. USE_XORP_OSPF = 0x1 # Enable Xorp router daemon with OSPF (IPv4) protocol USE_XORP_SHA = 0x4 # Enable Telcordia's Xorp SHA option (requires OSPF to be enabled) @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddVrFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddVrFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddVrFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddVrFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddVrFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_vr(self, alias=None, # Name of virtual router. flags=None, # Virtual router flags, see above for definitions. height=None, # Height to be used when drawn in the LANforge-GUI. notes=None, # Notes for this Virtual Router. Put in quotes if the notes include # white-space. resource=None, # Resource number. shelf=None, # Shelf name/id. vr_id=None, # Leave blank, use NA or 0xFFFF unless you are certain of the value you # want to enter. width=None, # Width to be used when drawn in the LANforge-GUI. x=None, # X coordinate to be used when drawn in the LANforge-GUI. y=None, # Y coordinate to be used when drawn in the LANforge-GUI. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_vr(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "flags": flags, "height": height, "notes": notes, "resource": resource, "shelf": shelf, "vr_id": vr_id, "width": width, "x": x, "y": y, } response = self.json_post("/cli-json/add_vr", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_vr_bgp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddVrBgpFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddVrBgpFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_4BYTE_AS_NUMBER = 0x40 # Sets corresponding Xorp flag. BGP_CONFED = 0x100 # Configure BGP in a confederation. BGP_DAMPING = 0x200 # Enable BGP damping section in Xorp configuration file. ENABLE_BGP = 0x20 # Set this to zero if you don't want BGP on this VR. ROUTE_REFLECTOR = 0x80 # Act as BGP Route Reflector. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddVrBgpFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddVrBgpFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddVrBgpFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddVrBgpFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddVrBgpFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_vr_bgp(self, bgp_id=None, # BGP Identifier: IPv4 Address cluster_id=None, # Cluster ID, IPv4 Address. Use NA if not clustering. confed_id=None, # Confederation ID 1-65535. Use NA if not in a confederation. flags=None, # Virtual router BGP flags, see above for definitions. half_life=None, # Halflife in minutes for damping configuration. local_as=None, # BGP Autonomous System number, 1-65535 max_suppress=None, # Maximum hold down time in minutes for damping configuration. resource=None, # Resource number. reuse=None, # Route flag damping reuse threshold, in minutes. shelf=None, # Shelf name/id. suppress=None, # Route flag damping cutoff threshold, in minutes. vr_id=None, # Name of virtual router. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_vr_bgp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "bgp_id": bgp_id, "cluster_id": cluster_id, "confed_id": confed_id, "flags": flags, "half_life": half_life, "local_as": local_as, "max_suppress": max_suppress, "resource": resource, "reuse": reuse, "shelf": shelf, "suppress": suppress, "vr_id": vr_id, } response = self.json_post("/cli-json/add_vr_bgp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_vrcx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddVrcxFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = AddVrcxFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" custom_dhcpd = 0x400 # Use custom DHCP config file dhcpd_enabled = 0x200 # Serve IPv4 DHCP on this interface ipv6_enabled = 0x2000 # Serve IPv6 DHCP on this interface nat_enabled = 0x100 # This connection will NAT outgoing packets subnet_0 = 0x1 # Specify subnet 0 subnet_1 = 0x2 # Specify subnet 1 subnet_2 = 0x4 # Specify subnet 2 subnet_3 = 0x8 # Specify subnet 3 subnet_4 = 0x10 # Specify subnet 4 subnet_5 = 0x20 # Specify subnet 5 subnet_6 = 0x40 # Specify subnet 6 subnet_7 = 0x80 # Specify subnet 7 use_multicast = 0x800 # Use this interface for multicast and-rp use_vrrp = 0x1000 # Use this interface for VRRP @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddVrcxFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+AddVrcxFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("AddVrcxFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("AddVrcxFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("AddVrcxFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_add_vrcx(self, dhcp_dns=None, # IP Address of DNS server. dhcp_dns6=None, # IPv6 Address of DNS server. dhcp_domain=None, # DHCP Domain name to serve. dhcp_lease_time=None, # DHCP Lease time (in seconds) dhcp_max=None, # Minimum IP address range to serve. dhcp_max6=None, # Minimum IPv6 address to serve. dhcp_min=None, # Minimum IP address range to serve. dhcp_min6=None, # Minimum IPv6 address to serve. flags=None, # Flags, specify if subnets 0-7 are in use, see above for others. height=None, # Height to be used when drawn in the LANforge-GUI. interface_cost=None, # If using OSPF, this sets the cost for this link (1-65535). local_dev=None, # Name of port A, the local network device pair. local_dev_b=None, # Name of port B for the local redirect device pair. nexthop=None, # The next-hop to use when routing packets out this interface. ospf_area=None, # If using OSPF, this sets the OSPF area for this interface. Default # is 0.0.0.0. remote_dev=None, # Name the remote network device. remote_dev_b=None, # Name of port B for the remote network device. resource=None, # Resource number. rip_metric=None, # If using RIP, this determines the RIP metric (cost), (1-15, 15 is # infinite). shelf=None, # Shelf name/id. subnets=None, # Subnets associated with this link, format: 1.1.1.1/24,1.1.2.1/16... vr_name=None, # Virtual Router this endpoint belongs to. Use 'FREE_LIST' to add a # stand-alone endpoint. vrrp_id=None, # VRRP id, must be unique in this virtual router (1-255) vrrp_interval=None, # VRRP broadcast message interval, in seconds (1-255) vrrp_ip=None, # VRRP IPv4 address..ignored if not flagged for VRRP. vrrp_ip_prefix=None, # Number of bits in subnet mask, ie 24 for 255.255.255.0 vrrp_priority=None, # VRRP Priority (1-255, higher is more priority.) wanlink=None, # The name of the WanLink that connects the two B ports. width=None, # Width to be used when drawn in the LANforge-GUI. x=None, # X coordinate to be used when drawn in the LANforge-GUI. y=None, # Y coordinate to be used when drawn in the LANforge-GUI. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_vrcx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "dhcp_dns": dhcp_dns, "dhcp_dns6": dhcp_dns6, "dhcp_domain": dhcp_domain, "dhcp_lease_time": dhcp_lease_time, "dhcp_max": dhcp_max, "dhcp_max6": dhcp_max6, "dhcp_min": dhcp_min, "dhcp_min6": dhcp_min6, "flags": flags, "height": height, "interface_cost": interface_cost, "local_dev": local_dev, "local_dev_b": local_dev_b, "nexthop": nexthop, "ospf_area": ospf_area, "remote_dev": remote_dev, "remote_dev_b": remote_dev_b, "resource": resource, "rip_metric": rip_metric, "shelf": shelf, "subnets": subnets, "vr_name": vr_name, "vrrp_id": vrrp_id, "vrrp_interval": vrrp_interval, "vrrp_ip": vrrp_ip, "vrrp_ip_prefix": vrrp_ip_prefix, "vrrp_priority": vrrp_priority, "wanlink": wanlink, "width": width, "x": x, "y": y, } response = self.json_post("/cli-json/add_vrcx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_vrcx2 ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_add_vrcx2(self, local_dev=None, # Name of port A for the connection. nexthop6=None, # The IPv6 next-hop to use when routing packets out this interface. resource=None, # Resource number. shelf=None, # Shelf name/id. subnets6=None, # IPv6 Subnets associated with this link, format: # aaaa:bbbb::0/64,cccc:dddd:eeee::0/64... vr_name=None, # Virtual Router this endpoint belongs to. Use 'FREE_LIST' to add a # stand-alone endpoint. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_vrcx2(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "local_dev": local_dev, "nexthop6": nexthop6, "resource": resource, "shelf": shelf, "subnets6": subnets6, "vr_name": vr_name, } response = self.json_post("/cli-json/add_vrcx2", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#add_wl_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class AddWlEndpWleFlags(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: AddWlEndpWleFlags.clear_flags(['bridge', 'dhcp']) print( 'value now: '+AddWlEndpWleFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" SHOW_WP = 1 # Show WanPaths in wanlink endpoint table in GUI def post_add_wl_endp(self, alias=None, # Name of WanPath. cpu_id=None, # The CPU/thread that this process should run on (kernel-mode # only). description=None, # Description for this endpoint, put in single quotes if it # contains spaces. dest_ip=None, # Selection filter: Destination IP. dest_ip_mask=None, # Selection filter: Destination IP MASK. drop_every_xth_pkt=None, # YES to periodically drop every Xth pkt, NO to drop packets # randomly. drop_freq=None, # How often, out of 1,000,000 packets, should we purposefully # drop a packet. dup_every_xth_pkt=None, # YES to periodically duplicate every Xth pkt, NO to duplicate # packets randomly. dup_freq=None, # How often, out of 1,000,000 packets, should we purposefully # duplicate a packet. extra_buffer=None, # The extra amount of bytes to buffer before dropping pkts, in # units of 1024, use -1 for AUTO. ignore_bandwidth=None, # Should we ignore the bandwidth settings from the playback # file? YES, NO, or NA. ignore_dup=None, # Should we ignore the Duplicate Packet settings from the # playback file? YES, NO, or NA. ignore_latency=None, # Should we ignore the latency settings from the playback file? # YES, NO, or NA. ignore_loss=None, # Should we ignore the packet-loss settings from the playback # file? YES, NO, or NA. jitter_freq=None, # How often, out of 1,000,000 packets, should we apply random # jitter. latency=None, # The base latency added to all packets, in milliseconds (or add # 'us' suffix for microseconds) max_drop_amt=None, # Maximum amount of packets to drop in a row. Default is 1. max_jitter=None, # The maximum jitter, in milliseconds (or add 'us' suffix for # microseconds) max_lateness=None, # Maximum amount of un-intentional delay before pkt is dropped. # Default is AUTO max_rate=None, # Maximum transmit rate (bps) for this WanLink. max_reorder_amt=None, # Maximum amount of packets by which to reorder, Default is 10. min_drop_amt=None, # Minimum amount of packets to drop in a row. Default is 1. min_reorder_amt=None, # Minimum amount of packets by which to reorder, Default is 1. playback_capture=None, # ON or OFF, should we play back a WAN capture file? playback_capture_file=None, # Name of the WAN capture file to play back. playback_loop=None, # Should we loop the playback file, YES or NO or NA. port=None, # Port number. reorder_every_xth_pkt=None, # YES to periodically reorder every Xth pkt, NO to reorder # packets randomly. reorder_freq=None, # How often, out of 1,000,000 packets, should we make a packet # out of order. resource=None, # Resource number. shelf=None, # Shelf name/id. source_ip=None, # Selection filter: Source IP. source_ip_mask=None, # Selection filter: Source IP MASK. speed=None, # The maximum speed this WanLink will accept (bps). test_mgr=None, # The name of the Test-Manager this WanPath is to use. Leave # blank for no restrictions. wanlink=None, # Name of WanLink to which we are adding this WanPath. wle_flags=None, # WanLink Endpoint specific flags, see above. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_add_wl_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "cpu_id": cpu_id, "description": description, "dest_ip": dest_ip, "dest_ip_mask": dest_ip_mask, "drop_every_xth_pkt": drop_every_xth_pkt, "drop_freq": drop_freq, "dup_every_xth_pkt": dup_every_xth_pkt, "dup_freq": dup_freq, "extra_buffer": extra_buffer, "ignore_bandwidth": ignore_bandwidth, "ignore_dup": ignore_dup, "ignore_latency": ignore_latency, "ignore_loss": ignore_loss, "jitter_freq": jitter_freq, "latency": latency, "max_drop_amt": max_drop_amt, "max_jitter": max_jitter, "max_lateness": max_lateness, "max_rate": max_rate, "max_reorder_amt": max_reorder_amt, "min_drop_amt": min_drop_amt, "min_reorder_amt": min_reorder_amt, "playback_capture": playback_capture, "playback_capture_file": playback_capture_file, "playback_loop": playback_loop, "port": port, "reorder_every_xth_pkt": reorder_every_xth_pkt, "reorder_freq": reorder_freq, "resource": resource, "shelf": shelf, "source_ip": source_ip, "source_ip_mask": source_ip_mask, "speed": speed, "test_mgr": test_mgr, "wanlink": wanlink, "wle_flags": wle_flags, } response = self.json_post("/cli-json/add_wl_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#admin ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_admin(self, arg1=None, # Argument 1: xorp-port | scan-rslts-file | iface-name | iface-eid | # rfgen-message | id arg2=None, # Argument 2: scan key | message | angle | dest-radio arg3=None, # Argument 3: noprobe | migrate-sta-mac-pattern arg5=None, # Argument 4: table-speed cmd=None, # Admin command: # resync_clock|write_xorp_cfg|scan_complete|ifup_post_complete|flush_complete|req_migrate|rfgen|chamber|clean_logs debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_admin(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "arg1": arg1, "arg2": arg2, "arg3": arg3, "arg5": arg5, "cmd": cmd, } response = self.json_post("/cli-json/admin", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#apply_vr_cfg ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_apply_vr_cfg(self, resource=None, # The number of the resource in question, or 'ALL'. shelf=None, # The number of the shelf in question, or 'ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_apply_vr_cfg(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/apply_vr_cfg", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#blink_attenuator ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_blink_attenuator(self, resource=None, # Resource number. serno=None, # Serial number for requested Attenuator, or 'all'. shelf=None, # Shelf number, usually 1. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_blink_attenuator(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "serno": serno, "shelf": shelf, } response = self.json_post("/cli-json/blink_attenuator", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#c_show_ports ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class CShowPortsProbeFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = CShowPortsProbeFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" BRIDGE = 0x8 # 8 include bridges EASY_IP_INFO = 0x10 # 16 Everything but gateway information, which is expensive to probe. ETHTOOL = 0x4 # 4 include ethtool results GW = 0x20 # 32 include gateway information GW_FORCE_REFRESH = 0x40 # 64 Force GW (re)probe. Otherwise, cached values *might* be used. MII = 0x2 # 2 include MII WIFI = 0x1 # 1 include wifi stations @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: CShowPortsProbeFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+CShowPortsProbeFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("CShowPortsProbeFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("CShowPortsProbeFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("CShowPortsProbeFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_c_show_ports(self, port=None, # Port number, or 'all'. probe_flags=None, # See above, add them together for multiple probings. Leave blank if # you want stats only. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_c_show_ports(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "port": port, "probe_flags": probe_flags, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/c_show_ports", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#cancel_vr_cfg ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_cancel_vr_cfg(self, resource=None, # The number of the resource in question, or 'ALL'. shelf=None, # The number of the shelf in question, or 'ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_cancel_vr_cfg(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/cancel_vr_cfg", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#clear_cd_counters ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_clear_cd_counters(self, cd_name=None, # Name of Collision Domain, or 'all'. Null argument is same as # 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_clear_cd_counters(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cd_name": cd_name, } response = self.json_post("/cli-json/clear_cd_counters", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#clear_cx_counters ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_clear_cx_counters(self, cx_name=None, # Name of Cross Connect, or 'all'. Null argument is same as # 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_clear_cx_counters(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cx_name": cx_name, } response = self.json_post("/cli-json/clear_cx_counters", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#clear_endp_counters ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_clear_endp_counters(self, endp_name=None, # Name of Endpoint, or 'all'. Null argument is same as # 'all'. incr_seqno=None, # Enter 'YES' if you want the target to increment the # cfg-seq-no. just_latency=None, # Enter 'YES' if you only want to clear latency counters, # and see above for RXGAP. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_clear_endp_counters(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp_name": endp_name, "incr_seqno": incr_seqno, "just_latency": just_latency, } response = self.json_post("/cli-json/clear_endp_counters", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#clear_group ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_clear_group(self, name=None, # The name of the test group. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_clear_group(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/clear_group", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#clear_port_counters ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class ClearPortCountersExtra(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: ClearPortCountersExtra.clear_flags(['bridge', 'dhcp']) print( 'value now: '+ClearPortCountersExtra.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" dhcp4_lease = "dhcp4_lease" # Remove dhcp lease files for IPv4 DHCP dhcp6_lease = "dhcp6_lease" # Remove dhcp lease files for IPv6 DHCP dhcp_leases = "dhcp_leases" # Remove dhcp lease files for IPv4 and IPv6 DHCP def post_clear_port_counters(self, extra=None, # Clear something else instead: dhcp4_lease | dhcp6_lease | # dhcp_leases port=None, # The number of the port in question, or 'ALL'. resource=None, # The number of the resource in question, or 'ALL'. shelf=None, # The number of the shelf in question, or 'ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_clear_port_counters(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "extra": extra, "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/clear_port_counters", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#clear_resource_counters ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_clear_resource_counters(self, resource=None, # The number of the resource in question, or 'ALL'. shelf=None, # The number of the shelf in question, or 'ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_clear_resource_counters(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/clear_resource_counters", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#clear_wp_counters ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_clear_wp_counters(self, endp_name=None, # Name of WanLink Endpoint. wp_name=None, # Name of WanPath to clear. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_clear_wp_counters(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp_name": endp_name, "wp_name": wp_name, } response = self.json_post("/cli-json/clear_wp_counters", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#create_client ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_create_client(self, name=None, # A single name with no white-spaces (15 characters or less) password=None, # Can be blank or 'NA' if no password is set, otherwise must be the # password. Use IGNORE for no change. super_user=None, # 1 If you want this user to have Administrative powers, 0 or blank # otherwise. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_create_client(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, "password": password, "super_user": super_user, } response = self.json_post("/cli-json/create_client", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#diag ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_diag(self, arg1=None, # Optional: Endpoint name to diag. p_type=None, # Default (blank) is everything, options: alerts, license, counters, fds, # clients, endpoints, shelf, iobuffer. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_diag(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "arg1": arg1, "type": p_type, } response = self.json_post("/cli-json/diag", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#discover ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_discover(self, disconnect=None, # Set to 'disconnect' to force disconnect to remote resource process. resource=None, # Resource ID. Use if discovering Attenuators. shelf=None, # Shelf-ID, only used if discovering Attenuators. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_discover(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "disconnect": disconnect, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/discover", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#do_pesq ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_do_pesq(self, endp_name=None, # Name of Endpoint. result_file_name=None, # The name of the file received by the endpoint. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_do_pesq(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp_name": endp_name, "result_file_name": result_file_name, } response = self.json_post("/cli-json/do_pesq", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#file ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_file(self, card=None, # Card ID cmd=None, # Only 'Download' supported for now, 'Upload' reserved for future use. filename=None, # File to transfer. shelf=None, # Shelf ID debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_file(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "card": card, "cmd": cmd, "filename": filename, "shelf": shelf, } response = self.json_post("/cli-json/file", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#flash_attenuator ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_flash_attenuator(self, filename=None, # File to use when uploading to attenuator. resource=None, # Resource number. serno=None, # Serial number for requested Attenuator, or 'all'. shelf=None, # Shelf number, usually 1. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_flash_attenuator(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "filename": filename, "resource": resource, "serno": serno, "shelf": shelf, } response = self.json_post("/cli-json/flash_attenuator", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getavglatency ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getavglatency(self, aorb=None, # For AtoB, enter 'B', for BtoA, enter 'A'. cx=None, # Cross-connect or Test-Group name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getavglatency(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getavglatency", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getinrxbps ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getinrxbps(self, aorb=None, # For endpoint a, enter 'A', for endpoint b, enter 'B'. cx=None, # Cross-connect or Test-Group name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getinrxbps(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getinrxbps", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getinrxrate ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getinrxrate(self, aorb=None, # For endpoint a, enter 'A', for endpoint b, enter 'B'. cx=None, # Cross-connect or Test-Group name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getinrxrate(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getinrxrate", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getintxrate ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getintxrate(self, aorb=None, # For endpoint a, enter 'A', for endpoint b, enter 'B'. cx=None, # Cross-connect or Test-Group name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getintxrate(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getintxrate", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getipadd ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getipadd(self, aorb=None, # For endpoint a, enter 'A', for endpoint b, enter 'B'. cx=None, # Cross-connect name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getipadd(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getipadd", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getmac ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getmac(self, aorb=None, # For endpoint a, enter 'A', for endpoint b, enter 'B'. cx=None, # Cross-connect name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getmac(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getmac", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getmask ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getmask(self, aorb=None, # For endpoint a, enter 'A', for endpoint b, enter 'B'. cx=None, # Cross-connect name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getmask(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getmask", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getpktdrops ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getpktdrops(self, aorb=None, # For AtoB, enter 'B', for BtoA, enter 'A'. cx=None, # Cross-connect or Test-Group name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getpktdrops(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getpktdrops", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getrxendperrpkts ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getrxendperrpkts(self, aorb=None, # For AtoB, enter 'B', for BtoA, enter 'A'. cx=None, # Cross-connect or Test-Group name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getrxendperrpkts(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getrxendperrpkts", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getrxpkts ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getrxpkts(self, aorb=None, # For endpoint a, enter 'A', for endpoint b, enter 'B'. cx=None, # Cross-connect or Test-Group name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getrxpkts(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getrxpkts", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#getrxporterrpkts ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_getrxporterrpkts(self, aorb=None, # For AtoB, enter 'B', for BtoA, enter 'A'. cx=None, # Cross-connect name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_getrxporterrpkts(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/getrxporterrpkts", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#gettxpkts ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_gettxpkts(self, aorb=None, # For endpoint a, enter 'A', for endpoint b, enter 'B'. cx=None, # Cross-connect or Test-Group name debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_gettxpkts(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "aorb": aorb, "cx": cx, } response = self.json_post("/cli-json/gettxpkts", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#gossip ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_gossip(self, message=None, # Message to show to others currently logged on. Unescaped Value debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_gossip(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "message": message, } response = self.json_post("/cli-json/gossip", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#help ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_help(self, command=None, # The command to get help for. Can be 'all', or blank. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_help(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "command": command, } response = self.json_post("/cli-json/help", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#init_wiser ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_init_wiser(self, file_name=None, # The WISER file name for the desired emulation, or 'NA' for empty # string. node_count=None, # The number of WISER nodes for the desired emulation, or 'NA' for # empty string. resource=None, # The number of the resource in question. shelf=None, # The number of the shelf in question. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_init_wiser(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "file_name": file_name, "node_count": node_count, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/init_wiser", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#licenses ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_licenses(self, popup=None, # If 'popup', then cause a GUI popup msg, otherwise, just show text. show_file=None, # If 'yes', then show the license file, not the parsed license # information. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_licenses(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "popup": popup, "show_file": show_file, } response = self.json_post("/cli-json/licenses", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#load ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_load(self, action=None, # Should be 'append' or 'overwrite'. clean_chambers=None, # If yes, then Chambers will be cleaned up when overwrite is selected, # otherwise they will be kept. clean_dut=None, # If yes, then DUT will be cleaned up when overwrite is selected, # otherwise they will be kept. clean_profiles=None, # If yes, then clean all profiles when overwrite is selected, otherwise # they will be kept. name=None, # The name of the database to load. (DFLT is the default) debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_load(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "action": action, "clean_chambers": clean_chambers, "clean_dut": clean_dut, "clean_profiles": clean_profiles, "name": name, } response = self.json_post("/cli-json/load", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#log_level ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class LogLevelLevel(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = LogLevelLevel.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" ALL = 0xffffffff # Log everything CUST1 = 0x10000 # Cust-1, latency info (65536) DB = 0x80 # Database related logging (128) DBG = 0x20 # debug (32) DBG2 = 0x1000 # very verbose logging (4096) DIS = 0x1 # disasters (1) ERR = 0x2 # errors (2) INF = 0x8 # info (8) LIO = 0x2000 # IO logging (8192) LL_PROF = 0x8000 # Profiling information (32768) OUT1 = 0x4000 # Some std-out logging (16384) PARSE = 0x800 # PARSE specific (2048) SCRIPT = 0x400 # Scripting specific stuff (1024) SEC = 0x40 # log security violations (64) TRC = 0x10 # function trace (16) WRN = 0x4 # warnings (4) XMT = 0x100 # Output going to clients (256) @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: LogLevelLevel.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+LogLevelLevel.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("LogLevelLevel has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("LogLevelLevel has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("LogLevelLevel has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_log_level(self, level=None, # Integer corresponding to the logging flags. target=None, # Options: 'gnu' | [file-endp-name]. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_log_level(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "level": level, "target": target, } response = self.json_post("/cli-json/log_level", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#log_msg ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_log_msg(self, message=None, # Message to log. Unescaped Value debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_log_msg(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "message": message, } response = self.json_post("/cli-json/log_msg", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#login ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_login(self, name=None, # A single name with no white-spaces (15 characters or less) password=None, # Can be blank or 'NA' if no password is set, otherwise must be the # password. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_login(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, "password": password, } response = self.json_post("/cli-json/login", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#motd ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_motd(self, debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_motd(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { } response = self.json_post("/cli-json/motd", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#nc_show_cd ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_nc_show_cd(self, collision_domain=None, # Name of the Collision Domain, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_nc_show_cd(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "collision_domain": collision_domain, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/nc_show_cd", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#nc_show_channel_groups ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_nc_show_channel_groups(self, channel_name=None, # Name of the channel, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_nc_show_channel_groups(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "channel_name": channel_name, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/nc_show_channel_groups", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#nc_show_endpoints ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_nc_show_endpoints(self, endpoint=None, # Name of endpoint, or 'all'. extra=None, # See above. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_nc_show_endpoints(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endpoint": endpoint, "extra": extra, } response = self.json_post("/cli-json/nc_show_endpoints", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#nc_show_pesq ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_nc_show_pesq(self, endpoint=None, # Name of endpoint, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_nc_show_pesq(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endpoint": endpoint, } response = self.json_post("/cli-json/nc_show_pesq", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#nc_show_ports ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class NcShowPortsProbeFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = NcShowPortsProbeFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" BRIDGE = 0x8 # 8 include bridges EASY_IP_INFO = 0x10 # 16 Everything but gateway information, which is expensive to probe. ETHTOOL = 0x4 # 4 include ethtool results GW = 0x20 # 32 include gateway information GW_FORCE_REFRESH = 0x40 # 64 Force GW (re)probe. Otherwise, cached values *might* be used. MII = 0x2 # 2 include MII WIFI = 0x1 # 1 include wifi stations @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: NcShowPortsProbeFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+NcShowPortsProbeFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("NcShowPortsProbeFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("NcShowPortsProbeFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("NcShowPortsProbeFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_nc_show_ports(self, port=None, # Port number, or 'all'. probe_flags=None, # See above, add them together for multiple probings. Leave blank # if you want stats only. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_nc_show_ports(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "port": port, "probe_flags": probe_flags, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/nc_show_ports", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#nc_show_ppp_links ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_nc_show_ppp_links(self, link_num=None, # Ppp-Link number of the span, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_nc_show_ppp_links(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "link_num": link_num, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/nc_show_ppp_links", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#nc_show_spans ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_nc_show_spans(self, resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. span_number=None, # Span-Number of the span, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_nc_show_spans(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, "span_number": span_number, } response = self.json_post("/cli-json/nc_show_spans", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#nc_show_vr ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_nc_show_vr(self, resource=None, # Resource number, or 'all'. router=None, # Name of the Virtual Router, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_nc_show_vr(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "router": router, "shelf": shelf, } response = self.json_post("/cli-json/nc_show_vr", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#nc_show_vrcx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_nc_show_vrcx(self, cx_name=None, # Name of the Virtual Router Connection, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_nc_show_vrcx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cx_name": cx_name, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/nc_show_vrcx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#notify_dhcp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_notify_dhcp(self, cmd=None, # set/down/timeout/info: What does DHCP want us to do? netmask=None, # New subnet mask. new_dns=None, # New DNS server(s) for use by this interface. new_ip=None, # New IP address. new_ip6=None, # New Global IPv6 address: ipv6/prefix new_mtu=None, # New MTU. new_router=None, # One or more default routers. LANforge will only use the first one. port=None, # Interface name. reason=None, # DHCP reason, informational mostly. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_notify_dhcp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cmd": cmd, "netmask": netmask, "new_dns": new_dns, "new_ip": new_ip, "new_ip6": new_ip6, "new_mtu": new_mtu, "new_router": new_router, "port": port, "reason": reason, } response = self.json_post("/cli-json/notify_dhcp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#port_reset_completed ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_port_reset_completed(self, extra=None, # IP for SECIP, blank for others. port=None, # The port in question. p_type=None, # SUNOS, NORMAL, or SECIP..let us know what kind of reset # completed. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_port_reset_completed(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "extra": extra, "port": port, "type": p_type, } response = self.json_post("/cli-json/port_reset_completed", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#probe_port ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_probe_port(self, key=None, # Unique identifier for this request. Usually left blank.
port=None, # Port number or name resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_probe_port(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "key": key, "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/probe_port", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#probe_ports ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_probe_ports(self, resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_probe_ports(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/probe_ports", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#quiesce_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_quiesce_endp(self, endp_name=None, # Name of the endpoint, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_quiesce_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp_name": endp_name, } response = self.json_post("/cli-json/quiesce_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#quiesce_group ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_quiesce_group(self, name=None, # The name of the test group, or 'all' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_quiesce_group(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/quiesce_group", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#quit ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_quit(self, debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_quit(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { } response = self.json_post("/cli-json/quit", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#reboot_os ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_reboot_os(self, resource=None, # Resource number, or ALL. shelf=None, # Shelf number, or ALL. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_reboot_os(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/reboot_os", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#report ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_report(self, reporting_on=None, # Should we globally enable/disable reporting. (YES, NO or NA) rpt_dir=None, # Directory in which reports should be saved. save_endps=None, # Should we save endpoint reports or not. (YES, NO or NA) save_ports=None, # Should we save Port reports or not. (YES, NO or NA) save_resource=None, # Should we save Resource reports or not. (YES, NO or NA) debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_report(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "reporting_on": reporting_on, "rpt_dir": rpt_dir, "save_endps": save_endps, "save_ports": save_ports, "save_resource": save_resource, } response = self.json_post("/cli-json/report", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#reset_port ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class ResetPortPreIfdown(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: ResetPortPreIfdown.clear_flags(['bridge', 'dhcp']) print( 'value now: '+ResetPortPreIfdown.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" P_IN = "P-IN" # Only call the portal login (do not reset drivers/supplicant/dhcp) P_OUT = "P-OUT" # Only call the portal logout (do not reset drivers/supplicant/dhcp) YES = "YES" # (include logout) Call portal-bot.pl ... --logout before going down. def post_reset_port(self, port=None, # Port number to reset, or ALL. pre_ifdown=None, # See above. Leave blank or use NA if unsure. reset_ospf=None, # If set to 'NO' or 'NA', then OSPF will not be updated. Otherwise, it # will be updated. resource=None, # Resource number, or ALL. shelf=None, # Shelf number, or ALL. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_reset_port(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "port": port, "pre_ifdown": pre_ifdown, "reset_ospf": reset_ospf, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/reset_port", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#reset_serial_span ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_reset_serial_span(self, resource=None, # Resource (machine) number. shelf=None, # Shelf number span=None, # Serial-Span number to reset. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_reset_serial_span(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, "span": span, } response = self.json_post("/cli-json/reset_serial_span", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_attenuator ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_attenuator(self, resource=None, # Resource number serno=None, # Serial number for requested Attenuator. shelf=None, # Shelf number, usually 1 debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_attenuator(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "serno": serno, "shelf": shelf, } response = self.json_post("/cli-json/rm_attenuator", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_cd ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_cd(self, cd=None, # Name of Collision Domain. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_cd(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cd": cd, } response = self.json_post("/cli-json/rm_cd", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_cd_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_cd_endp(self, cd=None, # Name of Collision Domain. endp=None, # Endpoint name/id. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_cd_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cd": cd, "endp": endp, } response = self.json_post("/cli-json/rm_cd_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_cd_vr ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_cd_vr(self, cd=None, # Name of Collision Domain. endp=None, # Virtual-Router name/id. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_cd_vr(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cd": cd, "endp": endp, } response = self.json_post("/cli-json/rm_cd_vr", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_chamber ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_chamber(self, chamber=None, # Chamber name, or 'ALL' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_chamber(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "chamber": chamber, } response = self.json_post("/cli-json/rm_chamber", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_chamber_path ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_chamber_path(self, chamber=None, # Chamber Name. path=None, # Path Name, use 'ALL' to delete all paths. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_chamber_path(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "chamber": chamber, "path": path, } response = self.json_post("/cli-json/rm_chamber_path", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_channel_group ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_channel_group(self, channel_name=None, # Name of the channel, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_channel_group(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "channel_name": channel_name, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/rm_channel_group", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_client ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_client(self, client_name=None, # Name of the client profile you wish to remove. client_password=None, # Client password. Not required if we are super-user. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_client(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "client_name": client_name, "client_password": client_password, } response = self.json_post("/cli-json/rm_client", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_cx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_cx(self, cx_name=None, # Name of the cross-connect, or 'all'. test_mgr=None, # Name of test-mgr, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_cx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cx_name": cx_name, "test_mgr": test_mgr, } response = self.json_post("/cli-json/rm_cx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_db ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_db(self, db_name=None, # Name of the database to delete. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_db(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "db_name": db_name, } response = self.json_post("/cli-json/rm_db", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_dut ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_dut(self, shelf=None, # DUT name, or 'ALL' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_dut(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "shelf": shelf, } response = self.json_post("/cli-json/rm_dut", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_endp(self, endp_name=None, # Name of the endpoint, or 'YES_ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp_name": endp_name, } response = self.json_post("/cli-json/rm_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_event ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_event(self, event_id=None, # Numeric event-id, or 'all' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_event(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "event_id": event_id, } response = self.json_post("/cli-json/rm_event", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_group ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_group(self, name=None, # The name of the test group. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_group(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/rm_group", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_ppp_link ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_ppp_link(self, resource=None, # Resource number that holds this PppLink. shelf=None, # Name/id of the shelf. unit_num=None, # Unit-Number for the PppLink to be deleted. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_ppp_link(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, "unit_num": unit_num, } response = self.json_post("/cli-json/rm_ppp_link", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_profile ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_profile(self, name=None, # Profile name, or 'ALL' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_profile(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/rm_profile", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_resource ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_resource(self, resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_resource(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/rm_resource", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_rfgen ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_rfgen(self, resource=None, # Resource number shelf=None, # Shelf number, usually 1 debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_rfgen(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/rm_rfgen", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_sec_ip ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_sec_ip(self, ip_list=None, # IP1/prefix,IP2/prefix,...IPZ/prefix, or ALL port=None, # Name of network device (Port) from which these IPs will be removed. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_sec_ip(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "ip_list": ip_list, "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/rm_sec_ip", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_span ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_span(self, resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. span_num=None, # Span-Number of the channel, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_span(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, "span_num": span_num, } response = self.json_post("/cli-json/rm_span", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_test_mgr ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_test_mgr(self, test_mgr=None, # Name of the test manager to be removed. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_test_mgr(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "test_mgr": test_mgr, } response = self.json_post("/cli-json/rm_test_mgr", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_text_blob ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_text_blob(self, name=None, # Text Blob Name, or 'ALL' p_type=None, # Text Blob type, or 'ALL' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_text_blob(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, "type": p_type, } response = self.json_post("/cli-json/rm_text_blob", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_tgcx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_tgcx(self, cxname=None, # The name of the CX. tgname=None, # The name of the test group. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_tgcx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cxname": cxname, "tgname": tgname, } response = self.json_post("/cli-json/rm_tgcx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_threshold ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_threshold(self, endp=None, # Endpoint name or ID. thresh_id=None, # Threshold ID to remove. Use 'all' to remove all. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_threshold(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp": endp, "thresh_id": thresh_id, } response = self.json_post("/cli-json/rm_threshold", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_traffic_profile ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_traffic_profile(self, name=None, # Profile name, or 'ALL' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_traffic_profile(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/rm_traffic_profile", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_venue ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_venue(self, resource=None, # Resource number, or 'ALL' shelf=None, # Shelf number. venu_id=None, # Number to uniquely identify this venue on this resource, or 'ALL' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_venue(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, "venu_id": venu_id, } response = self.json_post("/cli-json/rm_venue", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_vlan ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_vlan(self, port=None, # Port number or name of the virtual interface. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_vlan(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/rm_vlan", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_vr ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_vr(self, resource=None, # Resource number, or 'all'. router_name=None, # Virtual Router name, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_vr(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "router_name": router_name, "shelf": shelf, } response = self.json_post("/cli-json/rm_vr", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_vrcx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_vrcx(self, connection_name=None, # Virtual Router Connection name, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. vr_id=None, # If not removing from the free-list, then supply the virtual-router # name/ID here. Leave blank or use NA for free-list. vrcx_only=None, # If we should NOT delete underlying auto-created objects, enter # 'vrcx_only' here, otherwise leave blank or use NA. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_vrcx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "connection_name": connection_name, "resource": resource, "shelf": shelf, "vr_id": vr_id, "vrcx_only": vrcx_only, } response = self.json_post("/cli-json/rm_vrcx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rm_wanpath ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rm_wanpath(self, endp_name=None, # Name of the endpoint. wp_name=None, # Name of the wanpath. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rm_wanpath(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp_name": endp_name, "wp_name": wp_name, } response = self.json_post("/cli-json/rm_wanpath", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#rpt_script ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_rpt_script(self, endp=None, # Endpoint name or ID. flags=None, # See above for description of the defined flags. group_action=None, # All or Sequential. loop_count=None, # How many times to loop before stopping (0 is infinite). name=None, # Script name. private=None, # Private encoding for the particular script. p_type=None, # One of: NONE, Script2544, ScriptHunt, ScriptWL debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_rpt_script(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp": endp, "flags": flags, "group_action": group_action, "loop_count": loop_count, "name": name, "private": private, "type": p_type, } response = self.json_post("/cli-json/rpt_script", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#scan_wifi ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class ScanWifiExtra(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: ScanWifiExtra.clear_flags(['bridge', 'dhcp']) print( 'value now: '+ScanWifiExtra.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" NA = "NA" # (or left blank) the system does a full scan dump = "dump" # then only cached values are returned trigger_freq__freq_ = "trigger freq [freq]" # scan exactly those frequencies def post_scan_wifi(self, extra=None, # Extra arguments to the scan script, see above. key=None, # Unique identifier for this request. Usually left blank. port=None, # Port number or name of the virtual interface. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_scan_wifi(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "extra": extra, "key": key, "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/scan_wifi", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_arm_info ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetArmInfoArmFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetArmInfoArmFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" random_payload = 0x10000 # Use random payload sizes instead of linear increase rel_tstamp = 0x400 # Use Relative Timestamps. This will increase performance slow_start = 0x2000 # Use slow-start logic. This ramps up udp_checksum = 0x4000 # Use UDP Checksums. use_gw_mac = 0x1000 # Use default gateway's MAC for destination MAC. use_tcp = 0x8000 # Use TCP instead of UDP protocol. (Note this is NOT stateful TCP!) @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetArmInfoArmFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetArmInfoArmFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetArmInfoArmFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetArmInfoArmFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetArmInfoArmFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_set_arm_info(self, arm_flags=None, # Armageddon-related flags, see above for details. burst=None, # Burst amount, can significantly improve throughput with some # modern drivers, similar to 'multi_pkts', and uses the 'xmit_more' # linux skb option. dst_mac=None, # The destination MAC address. dst_mac_count=None, # How many destination MACs to iterate through. ip_dst_max=None, # Maximum destination IP address to use. ip_dst_min=None, # Minimum destination IP address to use. ip_src_max=None, # Maximum source IP address to use. ip_src_min=None, # Minimum source IP address to use. max_pkt_size=None, # Maximum packet size, including all Ethernet headers (but not # CRC). min_pkt_size=None, # Minimum packet size, including all Ethernet headers (but not # CRC). multi_pkts=None, # The number of identical packets to send before creating a new # one. name=None, # Name of the Endpoint we are setting. pkts_to_send=None, # The number of packets to send. Set to zero for infinite. src_mac=None, # The source MAC address. src_mac_count=None, # How many source MACs to iterate through. udp_dst_max=None, # Minimum destination UDP port. udp_dst_min=None, # Minimum destination UDP port. udp_src_max=None, # Maximum source UDP port. udp_src_min=None, # Minimum source UDP port. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_arm_info(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "arm_flags": arm_flags, "burst": burst, "dst_mac": dst_mac, "dst_mac_count": dst_mac_count, "ip_dst_max": ip_dst_max, "ip_dst_min": ip_dst_min, "ip_src_max": ip_src_max, "ip_src_min": ip_src_min, "max_pkt_size": max_pkt_size, "min_pkt_size": min_pkt_size, "multi_pkts": multi_pkts, "name": name, "pkts_to_send": pkts_to_send, "src_mac": src_mac, "src_mac_count": src_mac_count, "udp_dst_max": udp_dst_max, "udp_dst_min": udp_dst_min, "udp_src_max": udp_src_max, "udp_src_min": udp_src_min, } response = self.json_post("/cli-json/set_arm_info", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_attenuator ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_attenuator(self, atten_idx=None, # Attenuator index, or 'all'. mode=None, # 0 == normal attenuator, 1 == pulse mode (API Tech 4205A # modules directly connected via USB only) pulse_count=None, # Number of pulses (0-255) pulse_interval_ms=None, # Time between pulses, in mili-seconds (0-60000). pulse_time_ms=None, # Time interval between pulse groups in miliseconds (1-60000) pulse_width_us5=None, # Pulse width in units of 1/2 micro second. So, if you want # 1.5us, use value 3 (0-60000) resource=None, # Resource number. serno=None, # Serial number for requested Attenuator, or 'all'. shelf=None, # Shelf number, usually 1. val=None, # Requested attenution in 1/10ths of dB (ddB). debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_attenuator(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "atten_idx": atten_idx, "mode": mode, "pulse_count": pulse_count, "pulse_interval_ms": pulse_interval_ms, "pulse_time_ms": pulse_time_ms, "pulse_width_us5": pulse_width_us5, "resource": resource, "serno": serno, "shelf": shelf, "val": val, } response = self.json_post("/cli-json/set_attenuator", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_chamber ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_chamber(self, chamber=None, # Chamber name cur_rotation=None, # Primarily used to store the last known rotation for turntables # that do not report absolute position. Use NA or leave blank if # unsure. position=None, # Absolute position in degrees. speed_rpm=None, # Speed in rpm (floating point number is accepted tilt=None, # Absolute tilt in degrees. turntable=None, # Turn-table address, for instance: 192.168.1.22:3001 debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_chamber(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "chamber": chamber, "cur_rotation": cur_rotation, "position": position, "speed_rpm": speed_rpm, "tilt": tilt, "turntable": turntable, } response = self.json_post("/cli-json/set_chamber", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_cx_report_timer ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_cx_report_timer(self, cx_name=None, # Name of cross-connect, or 'all'. cxonly=None, # If you want to set the timer for ONLY the CX, and not milliseconds=None, # Report timer length in milliseconds. test_mgr=None, # Name of the test manager, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_cx_report_timer(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cx_name": cx_name, "cxonly": cxonly, "milliseconds": milliseconds, "test_mgr": test_mgr, } response = self.json_post("/cli-json/set_cx_report_timer", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_cx_state ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetCxStateCxState(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetCxStateCxState.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetCxStateCxState.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" DELETED = "DELETED" # Deletes the CX(s). QUIESCE = "QUIESCE" # Stop transmitting and gracefully stop cross-connect. RUNNING = "RUNNING" # Sets the CX(s) in the running state. STOPPED = "STOPPED" # Sets the CX(s) in the stopped state. SWITCH = "SWITCH" # Sets the CX(s) in the running state, stopping any conflicting tests. def post_set_cx_state(self, cx_name=None, # Name of the cross-connect, or 'all'. cx_state=None, # One of: RUNNING, SWITCH, QUIESCE, STOPPED, or DELETED. test_mgr=None, # Name of the test-manager, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_cx_state(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cx_name": cx_name, "cx_state": cx_state, "test_mgr": test_mgr, } response = self.json_post("/cli-json/set_cx_state", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_addr ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_endp_addr(self, ip=None, # The IP Address. Used for TCP/IP and UDP/IP protocols. mac=None, # The MAC address. Only needed for LANforge protocol Endpoints. max_port=None, # The Maximum IP Port. Used for TCP/IP and UDP/IP protocols. min_port=None, # The Minimum IP Port. Used for TCP/IP and UDP/IP protocols. name=None, # The name of the endpoint we are configuring. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_addr(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "ip": ip, "mac": mac, "max_port": max_port, "min_port": min_port, "name": name, } response = self.json_post("/cli-json/set_endp_addr", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_details ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_endp_details(self, conn_timeout=None, # For TCP, the max time in miliseconds to wait for connection # to establish. dst_mac=None, # Destination MAC address, used for custom Ethernet replays. max_conn_timer=None, # The maximum duration (in ms) this connection should run # before re-establishing. max_ip_port=None, # The maximum IP Port value. (The value for min ip port is # set through the add_endp/ip_port parameter.) If greater # than min, each connection will use a random value between # min and max. max_reconn_pause=None, # The maximum time between re-connects, in ms. mcast_src_ip=None, # Multicast source address (used in SSM mode, multicast # endpoints only) mcast_src_port=None, # Multicast source address (used in SSM mode, multicast # endpoints only) min_conn_timer=None, # The minimum duration (in ms) this connection should run # before re-establishing. min_reconn_pause=None, # The minimum time between re-connects, in ms. name=None, # The name of the endpoint we are configuring. pkts_to_send=None, # Number of packets to send before stopping. 0 means # infinite. rcvbuf_size=None, # The receive buffer (window) size. Zero for AUTO sndbuf_size=None, # The sending buffer (window) size. Zero for AUTO tcp_delack_segs=None, # NA: No longer supported. tcp_max_delack=None, # NA: No longer supported. tcp_min_delack=None, # NA: No longer supported. tcp_mss=None, # TCP Maximum Segment Size, affects packet size on the wire # (88 - 32767). debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_details(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "conn_timeout": conn_timeout, "dst_mac": dst_mac, "max_conn_timer": max_conn_timer, "max_ip_port": max_ip_port, "max_reconn_pause": max_reconn_pause, "mcast_src_ip": mcast_src_ip, "mcast_src_port": mcast_src_port, "min_conn_timer": min_conn_timer, "min_reconn_pause": min_reconn_pause, "name": name, "pkts_to_send": pkts_to_send, "rcvbuf_size": rcvbuf_size, "sndbuf_size": sndbuf_size, "tcp_delack_segs": tcp_delack_segs, "tcp_max_delack": tcp_max_delack, "tcp_min_delack": tcp_min_delack, "tcp_mss": tcp_mss, } response = self.json_post("/cli-json/set_endp_details", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_file ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_endp_file(self, file=None, # The file name to read the playback packets from. name=None, # The name of the endpoint we are configuring. playback=None, # Should we playback the capture or not? ON or OFF. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_file(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "file": file, "name": name, "playback": playback, } response = self.json_post("/cli-json/set_endp_file", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_flag ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetEndpFlagFlag(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetEndpFlagFlag.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetEndpFlagFlag.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" AutoHelper = "AutoHelper" # Automatically run on helper process ClearPortOnStart = "ClearPortOnStart" # clear stats on start DoChecksum = "DoChecksum" # Enable checksumming EnableConcurrentSrcIP = "EnableConcurrentSrcIP" # Concurrent source IPs? EnableLinearSrcIP = "EnableLinearSrcIP" # linearized source IPs EnableLinearSrcIPPort = "EnableLinearSrcIPPort" # linearized IP ports EnableRndSrcIP = "EnableRndSrcIP" # randomize source IP KernelMode = "KernelMode" # Enable kernel mode QuiesceAfterDuration = "QuiesceAfterDuration" # quiesce after time period QuiesceAfterRange = "QuiesceAfterRange" # quiesce after range of bytes Unmanaged = "Unmanaged" # Set endpoint unmanaged UseAutoNAT = "UseAutoNAT" # NAT friendly behavior def post_set_endp_flag(self, flag=None, # The name of the flag. name=None, # The name of the endpoint we are configuring. val=None, # Either 1 (for on), or 0 (for off). debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_flag(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "flag": flag, "name": name, "val": val, } response = self.json_post("/cli-json/set_endp_flag", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_payload ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetEndpPayloadPayloadType(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetEndpPayloadPayloadType.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetEndpPayloadPayloadType.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" PRBS_11_8_10 = "PRBS_11_8_10" # PRBS (see above) PRBS_15_0_14 = "PRBS_15_0_14" # PRBS (see above) PRBS_4_0_3 = "PRBS_4_0_3" # Use linear feedback shift register to generate pseudo random sequence. PRBS_7_0_6 = "PRBS_7_0_6" # PRBS (see above) custom = "custom" # Enter your own payload with the set_endp_payload decreasing = "decreasing" # bytes start at FF and decrease, wrapping if needed. increasing = "increasing" # bytes start at 00 and increase, wrapping if needed. ones = "ones" # Payload is all ones (FF). random = "random" # generate a new random payload each time sent. random_fixed = "random_fixed" # means generate one random payload, and send it over and over again. zeros = "zeros" # Payload is all zeros (00). def post_set_endp_payload(self, name=None, # The name of the endpoint we are configuring. payload=None, # For custom payloads, enter the payload in hex, up to 2048 # bytes. Unescaped Value payload_type=None, # The payload type. See help for add_endp. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_payload(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, "payload": payload, "payload_type": payload_type, } response = self.json_post("/cli-json/set_endp_payload", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_pld_bounds ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_endp_pld_bounds(self, is_random=None, # YES if random, anything else for NO. max_pld_size=None, # The maximum payload size, in bytes. min_pld_size=None, # The minimum payload size, in bytes. name=None, # The name of the endpoint we are configuring. use_checksum=None, # YES if use checksum on payload, anything else for NO. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_pld_bounds(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "is_random": is_random, "max_pld_size": max_pld_size, "min_pld_size": min_pld_size, "name": name, "use_checksum": use_checksum, } response = self.json_post("/cli-json/set_endp_pld_bounds", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_proxy ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_endp_proxy(self, enabled=None, # YES or NO to enable or disable proxying. endp_name=None, # Name of endpoint. proxy_ip=None, # Proxy IP Address. proxy_ip_port=None, # Proxy IP Port. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_proxy(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "enabled": enabled, "endp_name": endp_name, "proxy_ip": proxy_ip, "proxy_ip_port": proxy_ip_port, } response = self.json_post("/cli-json/set_endp_proxy", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_quiesce ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_endp_quiesce(self, name=None, # The name of the endpoint we are configuring. quiesce=None, # The number of seconds to quiesce this endpoint when told to # quiesce. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_quiesce(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, "quiesce": quiesce, } response = self.json_post("/cli-json/set_endp_quiesce", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_report_timer ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_endp_report_timer(self, endp_name=None, # Name of endpoint. milliseconds=None, # Report timer length in milliseconds. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_report_timer(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp_name": endp_name, "milliseconds": milliseconds, } response = self.json_post("/cli-json/set_endp_report_timer", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_tos ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetEndpTosTos(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetEndpTosTos.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetEndpTosTos.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" LOWCOST = "LOWCOST" # LOWDELAY = "LOWDELAY" # RELIABILITY = "RELIABILITY" # THROUGHPUT = "THROUGHPUT" # def post_set_endp_tos(self, name=None, # The name of the endpoint we are configuring. priority=None, # The socket priority, can be any positive number. tos=None, # The Type of Service, can be HEX, see above. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_tos(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, "priority": priority, "tos": tos, } response = self.json_post("/cli-json/set_endp_tos", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_endp_tx_bounds ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_endp_tx_bounds(self, is_bursty=None, # YES if bursty, anything else for NO. max_tx_rate=None, # The maximum transmit rate, in bits per second (bps). min_tx_rate=None, # The minimum transmit rate, in bits per second (bps). name=None, # The name of the endpoint we are configuring. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_endp_tx_bounds(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "is_bursty": is_bursty, "max_tx_rate": max_tx_rate, "min_tx_rate": min_tx_rate, "name": name, } response = self.json_post("/cli-json/set_endp_tx_bounds", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_event_interest ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetEventInterestEiFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetEventInterestEiFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" CLEAR = 0x0 # will clear interest SET = 0x1 # set interest flag @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetEventInterestEiFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetEventInterestEiFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetEventInterestEiFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetEventInterestEiFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetEventInterestEiFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class SetEventInterestEvents1(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetEventInterestEvents1.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" BAD_TOS = 0x400000 # Endpoint has bad ToS values configured. Bad_MAC = 0x100000 # Invalid MAC address configured. Cleared = 0x2000 # Counters were cleared for some entity. Connect = 0x100 # WiFi interface connected to AP. Custom = 0x4 # Custom event (generated by USER in GUI or CLI). DHCP_Fail = 0x8000 # DHCP Failed, maybe out of leases? DHCP_Timeout = 0x10000 # Timed out talking to DHCP server. DHCP4_Error = 0x20000 # DHCP gave out duplicated IP address. DHCP6_Error = 0x40000 # DHCPv6 gave out duplicated IPv6 address. Disconnect = 0x80 # WiFi interface disconnected from AP. Endp_Started = 0x40 # Endpoint was started. Endp_Stopped = 0x20 # Endpoint stopped for some reason. Link_Down = 0x1 # Notify when Interface Link goes DOWN. Link_Errors = 0x4000 # Port shows low-level link errors. Link_Up = 0x2 # Notify when Interface Link goes UP. Login = 0x400 # CLI/GUI user connected to LANforge. Logout = 0x200 # CLI/GUI user disconnected from LANforge. Migrated = 0x200000 # Port (station network interface) migrated. NO_RX_SINCE = 0x800000 # Endpoint threshold alert. NO_RX_SINCE_CLEARED = 0x1000000 # Endpoint threshold alert cleared. RX_BPS_OOR_1M = 0x20000000 # Endpoint threshold alert. RX_BPS_OOR_1M_CLEARED = 0x40000000 # Endpoint threshold alert cleared. RX_BPS_OOR_30S = 0x8000000 # Endpoint threshold alert. RX_BPS_OOR_30S_CLEARED = 0x10000000 # Endpoint threshold alert cleared. RX_BPS_OOR_3S = 0x2000000 # Endpoint threshold alert. RX_BPS_OOR_3S_CLEARED = 0x4000000 # Endpoint threshold alert cleared. Resource_Down = 0x8 # Resource has crashed, rebooted, etc. Resource_Up = 0x10 # Resource has connected to manager. Start_Reports = 0x1000 # Start saving report data files (CSV). Stop_Reports = 0x800 # Stop saving report data files (CSV). TX_BPS_OOR_3S = 0x80000000 # Endpoint threshold alert. WiFi_Config = 0x80000 # WiFi Configuration Error. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetEventInterestEvents1.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetEventInterestEvents1.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetEventInterestEvents1 has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetEventInterestEvents1 has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetEventInterestEvents1 has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class SetEventInterestEvents2(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetEventInterestEvents2.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" FW_CRASH = 0x800 # Firmware for entity has crashed. FW_FAIL = 0x1000 # Firmware failed powerup, may require reboot. IFDOWN_FAIL = 0x8000 # IFDOWN-PRE Script (ifup --logout) returned error code. IFDOWN_OK = 0x10000 # IFDOWN-PRE Script (ifup --logout) completed successfully. IFUP_FAIL = 0x2000 # IFUP-POST Script returned error code. IFUP_OK = 0x4000 # IFUP-POST Script completed successfully. RX_DROP_OOR_1M = 0x200 # Endpoint threshold alert. RX_DROP_OOR_1M_CLEARED = 0x400 # Endpoint threshold alert cleared. RX_DROP_OOR_3S = 0x80 # Endpoint threshold alert. RX_DROP_OOR_3S_CLEARED = 0x100 # Endpoint threshold alert cleared. RX_LAT_OOR = 0x20 # Endpoint threshold alert. RX_LAT_OOR_CLEARED = 0x40 # Endpoint threshold alert cleared. TX_BPS_OOR_1M = 0x8 # Endpoint threshold alert. TX_BPS_OOR_1M_CLEARED = 0x10 # Endpoint threshold alert cleared. TX_BPS_OOR_30S = 0x2 # Endpoint threshold alert. TX_BPS_OOR_30S_CLEARED = 0x4 # Endpoint threshold alert cleared. TX_BPS_OOR_3S_CLEARED = 0x1 # Endpoint threshold alert cleared. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetEventInterestEvents2.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetEventInterestEvents2.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetEventInterestEvents2 has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetEventInterestEvents2 has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetEventInterestEvents2 has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_set_event_interest(self, ei_flags=None, # Event Interest flags, see above. event_cnt=None, # Maximum number of events to store. events1=None, # See description for possible values. events2=None, # See description for possible values. events3=None, # See description for possible values. events4=None, # See description for possible values. var1=None, # Currently un-used. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_event_interest(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "ei_flags": ei_flags, "event_cnt": event_cnt, "events1": events1, "events2": events2, "events3": events3, "events4": events4, "var1": var1, } response = self.json_post("/cli-json/set_event_interest", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_event_priority ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetEventPriorityEvent(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetEventPriorityEvent.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetEventPriorityEvent.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" Bad_MAC = 20 # Invalid MAC address configured. Cleared = 13 # Counters were cleared for some entity. Connect = 8 # WiFi interface connected to AP. Custom = 2 # Custom event (generated by USER in GUI or CLI). DHCP_Fail = 15 # DHCP Failed, maybe out of leases? DHCP_Timeout = 16 # Timed out talking to DHCP server. DHCP4_Error = 17 # DHCP gave out duplicated IP address. DHCP6_Error = 18 # DHCPv6 gave out duplicated IPv6 address. Disconnect = 7 # WiFi interface disconnected from AP. Endp_Started = 6 # Endpoint was started. Endp_Stopped = 5 # Endpoint stopped for some reason. Link_Down = 0 # Notify when Interface Link goes UP. Link_Errors = 14 # Port shows low-level link errors. Link_Up = 1 # Notify when Interface Link goes DOWN. Login = 10 # CLI/GUI user connected to LANforge. Logout = 9 # CLI/GUI user disconnected from LANforge. Migrated = 21 # Port (station network interface) migrated. Resource_Down = 3 # Resource has crashed, rebooted, etc. Resource_Up = 4 # Resource has connected to manager. Start_Reports = 12 # Start saving report data files (CSV). Stop_Reports = 11 # Stop saving report data files (CSV). WiFi_Config = 19 # WiFi Configuration Error. class SetEventPriorityPriority(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetEventPriorityPriority.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetEventPriorityPriority.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" AUTO = "AUTO" # Let event creator decide the priority. CRITICAL = "CRITICAL" # DEBUG = "DEBUG" # FATAL = "FATAL" # INFO = "INFO" # WARNING = "WARNING" # def post_set_event_priority(self, event=None, # Number or name for the event, see above. priority=None, # Number or name for the priority. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_event_priority(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "event": event, "priority": priority, } response = self.json_post("/cli-json/set_event_priority", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_fe_info ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_fe_info(self, directory=None, # The directory to read/write in. Absolute path suggested. io_direction=None, # Should we be reading or writing: options: read, write max_file_size=None, # The maximum file size, in bytes. max_rw_sz=None, # Maximum read/write size, in bytes. min_file_size=None, # The minimum file size, in bytes. min_rw_sz=None, # Minimum read/write size, in bytes. name=None, # The name of the file endpoint we are configuring. num_files=None, # Number of files to create when writing. prefix=None, # The prefix of the file(s) to read/write. quiesce_after_files=None, # If non-zero, quiesce test after this many files have been # read/written. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_fe_info(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "directory": directory, "io_direction": io_direction, "max_file_size": max_file_size, "max_rw_sz": max_rw_sz, "min_file_size": min_file_size, "min_rw_sz": min_rw_sz, "name": name, "num_files": num_files, "prefix": prefix, "quiesce_after_files": quiesce_after_files, } response = self.json_post("/cli-json/set_fe_info", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_flag ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetFlagFlag(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetFlagFlag.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetFlagFlag.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" brief = "brief" # Request more abbreviated output to various commands. prompt_newlines = "prompt_newlines" # Add a newline after every prompt. Can help with scripts push_all_rpts = "push_all_rpts" # If enabled, server will send port, endpoint, and other push_endp_rpts = "push_endp_rpts" # If enabled, server will send endpoint reports without request_keyed_text = "request_keyed_text" # Normally most keyed-text events are only sent to the GUI stream_events = "stream_events" # Normally the CLI will not show Events (as seen in the # +Event def post_set_flag(self, client=None, # Specify the user, if it is not the current user. Requires admin # privileges. flag=None, # The name of the flag. val=None, # Either 1 (for on), or 0 (for off). debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_flag(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "client": client, "flag": flag, "val": val, } response = self.json_post("/cli-json/set_flag", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_gen_cmd ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_gen_cmd(self, command=None, # The rest of the command line arguments. Unescaped Value name=None, # The name of the file endpoint we are configuring. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_gen_cmd(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "command": command, "name": name, } response = self.json_post("/cli-json/set_gen_cmd", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_gps_info ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_gps_info(self, altitude=None, # Altitude, assumes units are Meters. ew=None, # East or west (Longitude). lattitude=None, # The lattitude, as read from a GPS device. longitude=None, # The longitude, as ready from a GPS device. ns=None, # North or South (Latitude). resource=None, # Resource number for the port to be modified. shelf=None, # Shelf number for the port to be modified, or SELF. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_gps_info(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "altitude": altitude, "ew": ew, "lattitude": lattitude, "longitude": longitude, "ns": ns, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/set_gps_info", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_ifup_script ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_ifup_script(self, flags=None, # Currently un-defined, use NA port=None, # WiFi interface name or number. post_ifup_script=None, # Script name with optional args, will run after interface # comes up and gets IP. Unescaped # Value resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_ifup_script(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "flags": flags, "port": port, "post_ifup_script": post_ifup_script, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/set_ifup_script", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_license ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_license(self, licenses=None, # License keys all appended into a single line. Unescaped Value debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_license(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "licenses": licenses, } response = self.json_post("/cli-json/set_license", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_mc_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_mc_endp(self, mcast_dest_port=None, # Multicast destination IP Port, for example: 55000 mcast_group=None, # Multicast group IP, ie: 224.1.1.2 IPv6 supported as well. name=None, # The name of the endpoint we are configuring. rcv_mcast=None, # Should we attempt to receive? Values: Yes or No ttl=None, # Time to live for the multicast packets generated. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_mc_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "mcast_dest_port": mcast_dest_port, "mcast_group": mcast_group, "name": name, "rcv_mcast": rcv_mcast, "ttl": ttl, } response = self.json_post("/cli-json/set_mc_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_password ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_password(self, client=None, # Specify the client. If left blank, will use current client. new_password=None, # New password, or 'NA' for blank password. old_password=None, # Old password, or 'NA' for blank password. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_password(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "client": client, "new_password": new_password, "old_password": old_password, } response = self.json_post("/cli-json/set_password", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_poll_mode ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_poll_mode(self, mode=None, # 'polling' or 'push'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_poll_mode(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "mode": mode, } response = self.json_post("/cli-json/set_poll_mode", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_port ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetPortCmdFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetPortCmdFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" abort_if_scripts = 0x400 # Forceably abort all ifup/down scripts on this Port. force_MII_probe = 0x4 # Force MII probe from_dhcp = 0x200 # Settings come from DHCP client. from_user = 0x80 # from_user (Required to change Mgt Port config new_gw_probe = 0x20 # Force new GW probe new_gw_probe_dev = 0x40 # Force new GW probe for ONLY this interface no_hw_probe = 0x8 # Don't probe hardware probe_wifi = 0x10 # Probe WIFI reset_transceiver = 0x1 # Reset transciever restart_link_neg = 0x2 # Restart link negotiation skip_port_bounce = 0x100 # skip-port-bounce (Don't ifdown/up use_pre_ifdown = 0x800 # Call pre-ifdown script before bringing interface down. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetPortCmdFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetPortCmdFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetPortCmdFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetPortCmdFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetPortCmdFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class SetPortCurrentFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetPortCurrentFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" adv_100bt_fd = 0x800000 # advert-100bt-FD adv_100bt_hd = 0x400000 # advert-100bt-HD adv_10bt_fd = 0x200000 # advert-10bt-FD adv_10bt_hd = 0x100000 # advert-10bt-HD adv_10g_fd = 0x800000000 # advert-10G-FD adv_2_5g_fd = 0x400000000 # advert-2.5G-FD adv_5g_fd = 0x400000000000000 # Advertise 5Gbps link speed. adv_flow_ctl = 0x8000000 # advert-flow-control auto_neg = 0x100 # auto-negotiate aux_mgt = 0x800000000000 # Enable Auxillary-Management flag for this port. fixed_100bt_fd = 0x10 # Fixed-100bt-FD fixed_100bt_hd = 0x8 # Fixed-100bt-HD fixed_10bt_fd = 0x4 # Fixed-10bt-FD fixed_10bt_hd = 0x2 # Fixed-10bt-HD (half duplex) ftp_enabled = 0x400000000000 # Enable FTP (vsftpd) service for this port. gro_enabled = 0x4000000000 # GRO-Enabled gso_enabled = 0x10000000000 # GSO-Enabled http_enabled = 0x200000000000 # Enable HTTP (nginx) service for this port. if_down = 0x1 # Interface Down ignore_dhcp = 0x2000000000000 # Don't set DHCP acquired IP on interface, ipsec_client = 0x40000000000000 # Enable client IPSEC xfrm on this port. ipsec_concentrator = 0x80000000000000 # Enable concentrator (upstream) IPSEC xfrm on this port. lro_enabled = 0x2000000000 # LRO-Enabled no_dhcp_rel = 0x80000000000 # No-DHCP-Release no_dhcp_restart = 0x1000000000000 # Disable restart of DHCP on link connect (ie, wifi). no_ifup_post = 0x4000000000000 # Skip ifup-post script if we can detect that we promisc = 0x10000000 # PROMISC radius_enabled = 0x20000000000000 # Enable RADIUS service (using hostapd as radius server) rxfcs = 0x40000000000 # RXFCS service_dns = 0x100000000000000 # Enable DNS (dnsmasq) service on this port. staged_ifup = 0x100000000000 # Staged-IFUP tso_enabled = 0x1000000000 # TSO-Enabled ufo_enabled = 0x8000000000 # UFO-Enabled use_dhcp = 0x80000000 # USE-DHCP use_dhcpv6 = 0x20000000000 # USE-DHCPv6 @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetPortCurrentFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetPortCurrentFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetPortCurrentFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetPortCurrentFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetPortCurrentFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class SetPortDhcpClientId(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetPortDhcpClientId.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetPortDhcpClientId.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" NA = "NA" # Do not change from current value. NONE = "NONE" # Do not use dhcp client ID. p_string_ = "[string]" # Use the string for the client ID. p__DEVNAME = "__DEVNAME" # Use the interface's name as the client ID. p__MAC = "__MAC" # Use interface's MAC address for the client ID. class SetPortDhcpHostname(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetPortDhcpHostname.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetPortDhcpHostname.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" NA = "NA" # Do not change from current value. NONE = "NONE" # Do not use dhcp Hostname p_string_ = "[string]" # Use the string for the Hostname. p__ALIAS__ = "__ALIAS__" # Use alias if set, or EID behaviour if alias is not set.. p__EID__ = "__EID__" # Use hostname 'CT-[resource-id].[port-name]' class SetPortDhcpVendorId(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetPortDhcpVendorId.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetPortDhcpVendorId.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" NA = "NA" # Do not change from current value. NONE = "NONE" # Do not use dhcp vendor ID p_string_ = "[string]" # Use the string for the vendor ID. class SetPortFlags2(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetPortFlags2.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" bypass_disconnect = 0x200 # Logically disconnect the cable (link-down) bypass_enabled = 0x10 # Enable Bypass Device bypass_power_down = 0x80 # Should bypass be on when we shutdown or loose power? bypass_power_on = 0x100 # Should bypass be on when we first power up? supports_bypass = 0x2 # Support Bypass Devices use_stp = 0x1 # Use Spanning Tree Protocol @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetPortFlags2.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetPortFlags2.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetPortFlags2 has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetPortFlags2 has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetPortFlags2 has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class SetPortInterest(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetPortInterest.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" alias = 0x1000 # Port alias aux_mgt = 0x20000000 # Enable/disable Auxillary-Management for a port bridge = 0x10000 # BRIDGE bypass = 0x40000 # Bypass command_flags = 0x1 # apply command flags cpu_mask = 0x100000 # CPU Mask, useful for pinning process to CPU core current_flags = 0x2 # apply current flags dhcp = 0x4000 # including client-id. dhcp_rls = 0x4000000 # DHCP release dhcpv6 = 0x1000000 # Use DHCPv6 gen_offload = 0x80000 # Generic offload flags, everything but LRO ifdown = 0x800000 # Down interface interal_use_1 = 0x800 # (INTERNAL USE) ip_Mask = 0x8 # IP mask ip_address = 0x4 # IP address ip_gateway = 0x10 # IP gateway ipv6_addrs = 0x20000 # IPv6 Address link_speed = 0x80 # Link speed lro_offload = 0x200000 # LRO (Must be disabled when used in Wanlink, mac_address = 0x20 # MAC address mtu = 0x100 # MTU no_apply_dhcp = 0x80000000 # Enable/disable NO-APPLY-DHCP flag for a port no_dhcp_conn = 0x40000000 # Enable/disable NO-DHCP-ON-CONNECT flag for a port promisc_mode = 0x400 # PROMISC mode rpt_timer = 0x8000 # Report Timer rx_all = 0x2000 # Rx-ALL rxfcs = 0x2000000 # RXFCS skip_ifup_roam = 0x100000000 # Enable/disable SKIP-IFUP-ON-ROAM flag for a port sta_br_id = 0x400000 # WiFi Bridge identifier. 0 means no bridging. supported_flags = 0x40 # apply supported flags svc_ftpd = 0x10000000 # Enable/disable FTP Service for a port svc_httpd = 0x8000000 # Enable/disable HTTP Service for a port tx_queue_length = 0x200 # TX Queue Length @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetPortInterest.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetPortInterest.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetPortInterest has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetPortInterest has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetPortInterest has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_set_port(self, alias=None, # A user-defined name for this interface. Can be BLANK or NA. br_aging_time=None, # MAC aging time, in seconds, 32-bit number (or peer IP for GRE). br_forwarding_delay=None, # How long to wait until the bridge will start forwarding packets. br_hello_time=None, # How often does the bridge send out STP hello packets. br_max_age=None, # How long until STP considers a non-responsive bridge dead. br_port_cost=None, # STP Port cost for a port (this applies only to NON-BRIDGE # interfaces). br_port_priority=None, # STP Port priority for a port (this applies only to NON-BRIDGE # interfaces). br_priority=None, # Bridge priority, 16-bit number. bypass_wdt=None, # Watch Dog Timer (in seconds) for this port. Zero (0) to disable. cmd_flags=None, # Command Flags: See above, or NA. cpu_mask=None, # CPU Mask for CPUs that should service this interface. Zero is # don't set (let OS make the decision). This value will be applied # to the proper /proc/irq/[irq-num]/smp_affinity file by the # pin_irq.pl script. current_flags=None, # See above, or NA. current_flags_msk=None, # This sets 'interest' for flags 'Enable RADIUS service' and higher. # See above, or NA. dhcp_client_id=None, # Optional string of up to 63 bytes in length to be passed to the # dhclient process. See above. dhcp_hostname=None, # Optional string of up to 63 bytes in length to be passed to the # dhclient process. Option 12, see above. dhcp_vendor_id=None, # Optional string of up to 63 bytes in length to be passed to the # dhclient process. See above. dns_servers=None, # DNS servers for use by traffic on this port, comma-separated list, # BLANK means zero-length string. flags2=None, # Bridge & other flags, see above. gateway=None, # IP address of the gateway device - used for IP routing, or NA. interest=None, # Which things are we really interested in setting. Can over-ride # defaults based on the other arguments. ip_addr=None, # IP address for the port, or NA. ipsec_concentrator=None, # IP Address of IPSec concentrator. ipsec_local_id=None, # Local Identifier for this IPSec tunnel. ipsec_passwd=None, # Password for IPSec, for pubkey, use: pubkey:[pem-file-name], for # instance: pubkey:station.pem ipsec_remote_id=None, # Remote Identifier for this IPSec tunnel. ipv6_addr_global=None, # Global scoped IPv6 address. ipv6_addr_link=None, # Link scoped IPv6 address. ipv6_dflt_gw=None, # IPv6 default gateway. mac=None, # MAC address to set this port to, or leave blank to not set it, or # NA. mtu=None, # Maximum Transmit Unit (MTU) for this interface. Can be blank or # NA. netmask=None, # Netmask which this port should use, or NA. port=None, # Port number for the port to be modified. report_timer=None, # How often, in milliseconds, should we poll stats on this # interface? resource=None, # Resource number for the port to be modified. shelf=None, # Shelf number for the port to be modified. sta_br_id=None, # WiFi STAtion bridge ID. Zero means none. tx_queue_len=None, # Transmit Queue Length for this interface. Can be blank or NA. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_port(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "br_aging_time": br_aging_time, "br_forwarding_delay": br_forwarding_delay, "br_hello_time": br_hello_time, "br_max_age": br_max_age, "br_port_cost": br_port_cost, "br_port_priority": br_port_priority, "br_priority": br_priority, "bypass_wdt": bypass_wdt, "cmd_flags": cmd_flags, "cpu_mask": cpu_mask, "current_flags": current_flags, "current_flags_msk": current_flags_msk, "dhcp_client_id": dhcp_client_id, "dhcp_hostname": dhcp_hostname, "dhcp_vendor_id": dhcp_vendor_id, "dns_servers": dns_servers, "flags2": flags2, "gateway": gateway, "interest": interest, "ip_addr": ip_addr, "ipsec_concentrator": ipsec_concentrator, "ipsec_local_id": ipsec_local_id, "ipsec_passwd": ipsec_passwd, "ipsec_remote_id": ipsec_remote_id, "ipv6_addr_global": ipv6_addr_global, "ipv6_addr_link": ipv6_addr_link, "ipv6_dflt_gw": ipv6_dflt_gw, "mac": mac, "mtu": mtu, "netmask": netmask, "port": port, "report_timer": report_timer, "resource": resource, "shelf": shelf, "sta_br_id": sta_br_id, "tx_queue_len": tx_queue_len, } response = self.json_post("/cli-json/set_port", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_port_alias ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_port_alias(self, alias=None, # New alias to assign to this virtual interface. port=None, # Physical Port identifier that owns the virtual interface. resource=None, # Resource number for the port to be modified. shelf=None, # Shelf number for the port to be modified. vport=None, # Virtual port identifier. MAC for MAC-VLANs, VLAN-ID for 802.1Q # vlans. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_port_alias(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "alias": alias, "port": port, "resource": resource, "shelf": shelf, "vport": vport, } response = self.json_post("/cli-json/set_port_alias", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_ppp_link_state ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_ppp_link_state(self, link=None, # Unit Number of the PPP Link, or 'all'. ppp_state=None, # One of: RUNNING, STOPPED, or DELETED. resource=None, # Number of the Resource, or 'all'. shelf=None, # Name of the Shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_ppp_link_state(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "link": link, "ppp_state": ppp_state, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/set_ppp_link_state", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_resource ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetResourceResourceFlags(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetResourceResourceFlags.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetResourceResourceFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" skip_load_db_on_start = 1 # Should we skip loading the DB on start? def post_set_resource(self, device_profiles=None, # List of profiles, see above max_helper_count=None, # Maximum number of helper traffic generation processes. 0 means # CPU-core-count (AUTO). max_staged_bringup=None, # Maximum amount of interfaces attempting to come up at once. # Default is 50 max_station_bringup=None, # Maximum amount of stations to bring up per radio per tick. # Default is 12. max_trying_ifup=None, # Maximum amount of interfaces running the network config 'ifup' # logic. Default is 15 resource=None, # Number of the Resource, or all. resource_flags=None, # System wide flags, often requires a reboot for changes to take # effect. resource_flags_mask=None, # What flags to change. If unset, default is all. shelf=None, # Name of the Shelf, or all. top_left_x=None, # X Location for Chamber View. top_left_y=None, # X Location for Chamber View. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_resource(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "device_profiles": device_profiles, "max_helper_count": max_helper_count, "max_staged_bringup": max_staged_bringup, "max_station_bringup": max_station_bringup, "max_trying_ifup": max_trying_ifup, "resource": resource, "resource_flags": resource_flags, "resource_flags_mask": resource_flags_mask, "shelf": shelf, "top_left_x": top_left_x, "top_left_y": top_left_y, } response = self.json_post("/cli-json/set_resource", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_rfgen ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetRfgenRfgenFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetRfgenRfgenFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" one_burst = 0x8 # Run for about 1 second and stop. Uses 5-sec sweep time for single pulse train. running = 0x2 # Should we start the RF Generator or not? @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetRfgenRfgenFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetRfgenRfgenFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetRfgenRfgenFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetRfgenRfgenFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetRfgenRfgenFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_set_rfgen(self, bb_gain=None, # RX Gain, 0 - 62 in 2dB steps freq_khz=None, # Center frequency in Khz gain=None, # Main TX/RX Amp, 0 or 14 (dB), default is 14 p_id=None, # RF Generator ID, not used at this time, enter 'NA' or 0. if_gain=None, # Fine-tune TX/RX Gain, 0 - 40 dB pulse_count=None, # Number of pulses (0-255) pulse_interval_us=None, # Time between pulses, in micro-seconds. pulse_width_us=None, # Requested pulse width, units are in micro-seconds. resource=None, # Resource number. rfgen_flags=None, # RF Generator flags, see above. rfgen_flags_mask=None, # Mask of what flags to set, see above. shelf=None, # Shelf number, usually 1. sweep_time_ms=None, # Time interval between pulse groups in miliseconds debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_rfgen(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "bb_gain": bb_gain, "freq_khz": freq_khz, "gain": gain, "id": p_id, "if_gain": if_gain, "pulse_count": pulse_count, "pulse_interval_us": pulse_interval_us, "pulse_width_us": pulse_width_us, "resource": resource, "rfgen_flags": rfgen_flags, "rfgen_flags_mask": rfgen_flags_mask, "shelf": shelf, "sweep_time_ms": sweep_time_ms, } response = self.json_post("/cli-json/set_rfgen", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_script ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetScriptFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetScriptFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" SCR_COMPLETED = 0x80 # Set automatically by LANforge. SCR_HIDE_CONSTRAINTS = 0x2000 # Hide constraints messages. SCR_HIDE_CSV = 0x20 # Don't print the CSV data in the report. SCR_HIDE_HUNT = 0x800 # Hide the individual hunt steps..just show results. SCR_HIDE_ITER_DETAILS = 0x8 # Hide iteration detail reports. SCR_HIDE_LAT = 0x1000 # Hide latency distribution reports. SCR_HIDE_LEGEND = 0x10 # Don't print the legend in the report. SCR_LOOP = 0x100 # Loop script until manually stopped. SCR_NO_KEYED_RPT = 0x2 # Script should NOT send reports to the CLI/GUI. SCR_RUN_ON_MGR = 0x40 # Set automatically by LANforge. SCR_SHOW_ATTENUATION = 0x4000 # Show attenuation packet stats. SCR_SHOW_DUPS = 0x200 # Report duplicate packets. SCR_SHOW_GOLDEN_3P = 0x20000 # Add 'golden' third-party AP graph for comparison (where available). SCR_SHOW_GOLDEN_LF = 0x10000 # Add 'golden' LANforge graph for comparison (where available). SCR_SHOW_OOO = 0x400 # Report out-of-order packets. SCR_STOPPED = 0x1 # Script should NOT have any affect on the endpoint. SCR_SYMMETRIC = 0x4 # This script should apply settings to the peer endpoing as well. SCR_USE_MSS = 0x8000 # When setting packet size, set TCP MSS instead if endpoint supports # +that. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetScriptFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetScriptFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetScriptFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetScriptFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetScriptFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class SetScriptType(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetScriptType.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetScriptType.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" NONE = "NONE" # Delete any existing script. Script2544 = "Script2544" # For RFC 2544 type testing. ScriptAtten = "ScriptAtten" # For Attenuators only. ScriptHunt = "ScriptHunt" # Hunt for maximum speed with constraints. ScriptWL = "ScriptWL" # For iterating through WanLink settings def post_set_script(self, endp=None, # Endpoint, Test Group or Attenuator name or ID. flags=None, # See above for description of the defined flags. group_action=None, # How to handle group script operations: ALL, Sequential loop_count=None, # How many times to loop before stopping (0 is infinite). name=None, # Script name. private=None, # Private encoding for the particular script. p_type=None, # One of: NONE, Script2544, ScriptHunt, ScriptWL, ScriptAtten debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_script(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp": endp, "flags": flags, "group_action": group_action, "loop_count": loop_count, "name": name, "private": private, "type": p_type, } response = self.json_post("/cli-json/set_script", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_sec_ip ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_sec_ip(self, ip_list=None, # IP1/prefix,IP2/prefix,...IPZ/prefix. port=None, # Name of network device (Port) to which these IPs will be added. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_sec_ip(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "ip_list": ip_list, "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/set_sec_ip", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_voip_info ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_voip_info(self, codec=None, # Codec to use for the voice stream, supported values: G711U, # G711A, SPEEX, g726-16, g726-24, g726-32, g726-40, g729a. first_call_delay=None, # How long to wait before making first call, in seconds. jitter_buffer_sz=None, # The size of the jitter buffer in packets. Default value is 8. local_sip_port=None, # Local SIP UDP port. Default is min-rtp-port + 2. loop_call_count=None, # How many calls to make, zero means infinite. loop_wavefile_count=None, # How many times to play the wave file, zero means infinite. max_call_duration=None, # How long should the call be, in seconds. max_inter_call_gap=None, # Maximum time to wait between calls, in seconds. messaging_protocol=None, # Messaging protocol, supported values: SIP. min_call_duration=None, # How long should the call be, in seconds. min_inter_call_gap=None, # Minimum time to wait between calls, in seconds. name=None, # The name of the endpoint we are configuring. pesq_server_ip=None, # LANforge PESQ server IP address. pesq_server_passwd=None, # LANforge PESQ server password. Default is to use no # authentication (blank entry). pesq_server_port=None, # LANforge PESQ server port, default is 3998. reg_expire_timer=None, # SIP Registration expire timer, in seconds. ringing_timer=None, # How long (milliseconds) to wait in the ringing state before # flagging call as no-answer. sound_dev=None, # Which sound device should we play sound to. (see # set_endp_flags). debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_voip_info(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "codec": codec, "first_call_delay": first_call_delay, "jitter_buffer_sz": jitter_buffer_sz, "local_sip_port": local_sip_port, "loop_call_count": loop_call_count, "loop_wavefile_count": loop_wavefile_count, "max_call_duration": max_call_duration, "max_inter_call_gap": max_inter_call_gap, "messaging_protocol": messaging_protocol, "min_call_duration": min_call_duration, "min_inter_call_gap": min_inter_call_gap, "name": name, "pesq_server_ip": pesq_server_ip, "pesq_server_passwd": pesq_server_passwd, "pesq_server_port": pesq_server_port, "reg_expire_timer": reg_expire_timer, "ringing_timer": ringing_timer, "sound_dev": sound_dev, } response = self.json_post("/cli-json/set_voip_info", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_vrcx_cost ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_vrcx_cost(self, interface_cost=None, # If using OSPF, this sets the cost for this link (1-65535). local_dev=None, # Name of port A for the local redirect device pair. local_dev_b=None, # Name of port B for the local redirect device pair. remote_dev=None, # Name of port B for the remote redirect device pair. remote_dev_b=None, # Name of port B for the remote redirect device pair. resource=None, # Resource number. shelf=None, # Shelf name/id. vr_name=None, # Virtual Router this endpoint belongs to. Use 'FREE_LIST' to add # a stand-alone endpoint. wanlink=None, # The name of the WanLink that connects the two B ports. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_vrcx_cost(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "interface_cost": interface_cost, "local_dev": local_dev, "local_dev_b": local_dev_b, "remote_dev": remote_dev, "remote_dev_b": remote_dev_b, "resource": resource, "shelf": shelf, "vr_name": vr_name, "wanlink": wanlink, } response = self.json_post("/cli-json/set_vrcx_cost", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wanlink_info ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_wanlink_info(self, drop_freq=None, # How often, out of 1,000,000 packets, should we # purposefully drop a packet. dup_freq=None, # How often, out of 1,000,000 packets, should we # purposefully duplicate a packet. extra_buffer=None, # The extra amount of bytes to buffer before dropping pkts, # in units of 1024. Use -1 for AUTO. jitter_freq=None, # How often, out of 1,000,000 packets, should we apply # jitter. latency=None, # The base latency added to all packets, in milliseconds # (or add 'us' suffix for microseconds max_drop_amt=None, # Maximum amount of packets to drop in a row. Default is 1. max_jitter=None, # The maximum jitter, in milliseconds (or ad 'us' suffix # for microseconds) max_lateness=None, # Maximum amount of un-intentional delay before pkt is # dropped. Default is AUTO max_reorder_amt=None, # Maximum amount of packets by which to reorder, Default is # 10. min_drop_amt=None, # Minimum amount of packets to drop in a row. Default is 1. min_reorder_amt=None, # Minimum amount of packets by which to reorder, Default is # 1. name=None, # The name of the endpoint we are configuring. playback_capture_file=None, # Name of the WAN capture file to play back. reorder_freq=None, # How often, out of 1,000,000 packets, should we make a # packet out of order. speed=None, # The maximum speed of traffic this endpoint will accept # (bps). debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wanlink_info(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "drop_freq": drop_freq, "dup_freq": dup_freq, "extra_buffer": extra_buffer, "jitter_freq": jitter_freq, "latency": latency, "max_drop_amt": max_drop_amt, "max_jitter": max_jitter, "max_lateness": max_lateness, "max_reorder_amt": max_reorder_amt, "min_drop_amt": min_drop_amt, "min_reorder_amt": min_reorder_amt, "name": name, "playback_capture_file": playback_capture_file, "reorder_freq": reorder_freq, "speed": speed, } response = self.json_post("/cli-json/set_wanlink_info", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wanlink_pcap ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_wanlink_pcap(self, capture=None, # Should we capture or not? ON or OFF. directory=None, # The directory name in which packet capture files will be # written. name=None, # The name of the endpoint we are configuring. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wanlink_pcap(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "capture": capture, "directory": directory, "name": name, } response = self.json_post("/cli-json/set_wanlink_pcap", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wanpath_corruption ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetWanpathCorruptionFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetWanpathCorruptionFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" BIT_FLIP = 0x4 # Flip a random bit in a byte. BIT_TRANSPOSE = 0x8 # Transpose two side-by-side bits in a byte. DO_CHAIN_ON_HIT = 0x10 # Do next corruption if this corruption is applied. OVERWRITE_FIXED = 0x2 # Write a fixed value to a byte. OVERWRITE_RANDOM = 0x1 # Write a random value to a byte. RECALC_CSUMS = 0x20 # Attempt to re-calculate UDP and TCP checksums. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetWanpathCorruptionFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetWanpathCorruptionFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetWanpathCorruptionFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetWanpathCorruptionFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetWanpathCorruptionFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_set_wanpath_corruption(self, byte=None, # The byte to use for OVERWRITE_FIXED (or NA). flags=None, # The flags for this corruption. index=None, # The corruption to modify (0-5). max_offset=None, # The maximum offset from start of Ethernet packet for the # byte to be modified. min_offset=None, # The minimum offset from start of Ethernet packet for the # byte to be modified. name=None, # WanLink name path=None, # WanPath name rate=None, # Specifies how often, per million, this corruption should # be applied. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wanpath_corruption(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "byte": byte, "flags": flags, "index": index, "max_offset": max_offset, "min_offset": min_offset, "name": name, "path": path, "rate": rate, } response = self.json_post("/cli-json/set_wanpath_corruption", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wanpath_filter ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_wanpath_filter(self, defer_flush=None, # Enter 'YES' if you do NOT want this flushed to the remote. dst_filter=None, # The destination MAC or IP/Mask, 'NA' for PCAP. filter_type=None, # The filter type, one of: MAC, IP, PCAP. passive=None, # Enter 'YES' if you do NOT want to use this filter currently. reverse=None, # If you want the logic reversed, use 'ON', otherwise set to # 'OFF' src_filter=None, # The source MAC or IP/Mask. For PCAP, this is the only # filter. wl_name=None, # The name of the WanLink endpoint we are configuring. wp_name=None, # The name of the WanPath we are configuring. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wanpath_filter(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "defer_flush": defer_flush, "dst_filter": dst_filter, "filter_type": filter_type, "passive": passive, "reverse": reverse, "src_filter": src_filter, "wl_name": wl_name, "wp_name": wp_name, } response = self.json_post("/cli-json/set_wanpath_filter", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wanpath_running ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetWanpathRunningRunning(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetWanpathRunningRunning.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetWanpathRunningRunning.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" AS_PARENT = "AS_PARENT" # then it will be started and stopped as the parent WanLink is. RUNNING = "RUNNING" # then it will be running at all times STOPPED = "STOPPED" # then it will not be running at any time. def post_set_wanpath_running(self, running=None, # The state, one of: AS_PARENT, RUNNING, STOPPED. wl_name=None, # The name of the WanLink endpoint we are configuring. wp_name=None, # The name of the WanPath we are configuring. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wanpath_running(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "running": running, "wl_name": wl_name, "wp_name": wp_name, } response = self.json_post("/cli-json/set_wanpath_running", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wifi_corruptions ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetWifiCorruptionsCorruptFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetWifiCorruptionsCorruptFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" MSG_TYPE_DEAUTH = 0x2 # de-authentication message MSG_TYPE_EAPOL = 0x1 # Any EAPOL message MSG_TYPE_EAPOL_1_OF_2 = 0x40 # EAPOL message 1/2 MSG_TYPE_EAPOL_1_OF_4 = 0x4 # EAPOL message 1/4 MSG_TYPE_EAPOL_2_OF_2 = 0x80 # EAPOL message 2/2 MSG_TYPE_EAPOL_2_OF_4 = 0x8 # EAPOL message 2/4 MSG_TYPE_EAPOL_3_OF_4 = 0x10 # EAPOL message 3/4 MSG_TYPE_EAPOL_4_OF_4 = 0x20 # EAPOL message 4/4 MSG_TYPE_EAPOL_ASSOC = 0x200 # EAP Association MSG_TYPE_EAPOL_KEY_REQ = 0x100 # EAP Key Request (not sure if this works properly) MST_TYPE_EAPOL_ID_REQ = 0x400 # EAP Identity request MST_TYPE_EAPOL_ID_RESP = 0x800 # EAP Identity response MST_TYPE_EAPOL_OTHER_REQ = 0x1000 # EAP Requests that do not match other things. MST_TYPE_EAPOL_OTHER_RESP = 0x2000 # EAP Responses that do not match other things. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetWifiCorruptionsCorruptFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetWifiCorruptionsCorruptFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetWifiCorruptionsCorruptFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetWifiCorruptionsCorruptFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetWifiCorruptionsCorruptFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_set_wifi_corruptions(self, corrupt_flags=None, # Specify packet types to corrupt (see flags above). corrupt_per_mil=None, # Per-million: Station to randomly corrupt selected # message types by this amount. delay_flags=None, # Specify packet types to delay (see flags above). delay_max=None, # miliseconds: Station to randomly delay processing # received messages, max time delay_min=None, # miliseconds: Station to randomly delay processing # received messages, min time dup_flags=None, # Specify packet types to duplicate (see flags above). dup_per_65535=None, # Percentage, represented as x per 65535 of packets we # should duplicate. ignore_flags=None, # Specify packet types to ignore (see flags above). ignore_per_mil=None, # Per-million: Station to randomly ignore selected message # types by this amount. port=None, # WiFi interface name or number. req_flush=None, # Set to 1 if you wish to flush changes to kernel now. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wifi_corruptions(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "corrupt_flags": corrupt_flags, "corrupt_per_mil": corrupt_per_mil, "delay_flags": delay_flags, "delay_max": delay_max, "delay_min": delay_min, "dup_flags": dup_flags, "dup_per_65535": dup_per_65535, "ignore_flags": ignore_flags, "ignore_per_mil": ignore_per_mil, "port": port, "req_flush": req_flush, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/set_wifi_corruptions", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wifi_custom ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_wifi_custom(self, port=None, # WiFi interface name or number. resource=None, # Resource number. shelf=None, # Shelf number. text=None, # [BLANK] will erase all, any other text will be appended to # existing text. Unescaped Value p_type=None, # NA for now, may specify specific locations later. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wifi_custom(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "port": port, "resource": resource, "shelf": shelf, "text": text, "type": p_type, } response = self.json_post("/cli-json/set_wifi_custom", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wifi_extra ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_wifi_extra(self, anonymous_identity=None, # Anonymous identity string for EAP. anqp_3gpp_cell_net=None, # 802.11u 3GCPP Cellular Network Info, VAP only. ca_cert=None, # CA-CERT file name. client_cert=None, # 802.11u Client cert file: /etc/wpa_supplicant/ca.pem domain=None, # 802.11u domain: mytelco.com eap=None, # EAP method: MD5, MSCHAPV2, OTP, GTC, TLS, PEAP, TTLS. group=None, # Group cyphers: CCMP, TKIP, WEP104, WEP40, or combination. hessid=None, # 802.11u HESSID (MAC address format) (or peer for WDS # stations). identity=None, # EAP Identity string. imsi=None, # 802.11u IMSI: 310026-000000000 ipaddr_type_avail=None, # 802.11u network type available, integer, VAP only. key=None, # WEP key0. This should be entered in ascii-hex. Use this only # for WEP. key_mgmt=None, # Key management: WPA-PSK, WPA-EAP, IEEE8021X, NONE, # WPA-PSK-SHA256, WPA-EAP-SHA256 or combo. milenage=None, # 802.11u milenage: # 90dca4eda45b53cf0f12d7c9c3bc6a89:cb9cccc4b9258e6dca4760379fb82 network_auth_type=None, # 802.11u network authentication type, VAP only. network_type=None, # 802.11u network type, integer, VAP only. pac_file=None, # EAP-FAST PAC-File name. (For AP, this field is the RADIUS # secret password) pairwise=None, # Pairwise ciphers: CCMP, TKIP, NONE, or combination. password=None, # EAP Password string. phase1=None, # Outer-authentication, ie TLS tunnel parameters. phase2=None, # Inner authentication with TLS tunnel. pin=None, # EAP-SIM pin string. (For AP, this field is HS20 Operating # Class) pk_passwd=None, # EAP private key password. (For AP, this field is HS20 # connection capability) port=None, # WiFi interface name or number. private_key=None, # EAP private key certificate file name. (For AP, this field # is HS20 WAN Metrics) psk=None, # WPA(2) pre-shared key. If unsure, use this field for any # password entry. Prepend with 0x for ascii-hex # representation. realm=None, # 802.11u realm: mytelco.com resource=None, # Resource number. roaming_consortium=None, # 802.11u roaming consortium: 223344 (15 characters max) shelf=None, # Shelf number. venue_group=None, # 802.11u Venue Group, integer. VAP only. venue_type=None, # 802.11u Venue Type, integer. VAP only. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wifi_extra(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "anonymous_identity": anonymous_identity, "anqp_3gpp_cell_net": anqp_3gpp_cell_net, "ca_cert": ca_cert, "client_cert": client_cert, "domain": domain, "eap": eap, "group": group, "hessid": hessid, "identity": identity, "imsi": imsi, "ipaddr_type_avail": ipaddr_type_avail, "key": key, "key_mgmt": key_mgmt, "milenage": milenage, "network_auth_type": network_auth_type, "network_type": network_type, "pac_file": pac_file, "pairwise": pairwise, "password": password, "phase1": phase1, "phase2": phase2, "pin": pin, "pk_passwd": pk_passwd, "port": port, "private_key": private_key, "psk": psk, "realm": realm, "resource": resource, "roaming_consortium": roaming_consortium, "shelf": shelf, "venue_group": venue_group, "venue_type": venue_type, } response = self.json_post("/cli-json/set_wifi_extra", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wifi_extra2 ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_wifi_extra2(self, corrupt_gtk_rekey_mic=None, # Per-million: AP corrupts GTK Rekey MIC. freq_24=None, # Frequency list for 2.4Ghz band, see above. freq_5=None, # Frequency list for 5Ghz band, see above. ignore_assoc=None, # Per-million: AP ignore assoc request percentage. ignore_auth=None, # Per-million: AP ignore auth request percentage. ignore_probe=None, # Per-million: AP ignore probe percentage. ignore_reassoc=None, # Per-million: AP ignore re-assoc request percentage. ocsp=None, # OCSP settings: 0=disabled, 1=try, but to not require # response, 2=require valid OCSP stapling response. port=None, # WiFi interface name or number. post_ifup_script=None, # Script name with optional args, will run after interface # comes up and gets IP. radius_ip=None, # RADIUS server IP Address (AP Only) radius_port=None, # RADIUS server IP Port (AP Only) req_flush=None, # Set to 1 if you wish to flush changes to kernel now. resource=None, # Resource number. sae_pwe=None, # Set SAE-PWE, 0 == hunting-and-pecking, 1 == # hash-to-element, 2 allow both. shelf=None, # Shelf number. venue_id=None, # Venue-ID for this wifi device. VAP in same venue will # share neigh reports as appropriate. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wifi_extra2(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "corrupt_gtk_rekey_mic": corrupt_gtk_rekey_mic, "freq_24": freq_24, "freq_5": freq_5, "ignore_assoc": ignore_assoc, "ignore_auth": ignore_auth, "ignore_probe": ignore_probe, "ignore_reassoc": ignore_reassoc, "ocsp": ocsp, "port": port, "post_ifup_script": post_ifup_script, "radius_ip": radius_ip, "radius_port": radius_port, "req_flush": req_flush, "resource": resource, "sae_pwe": sae_pwe, "shelf": shelf, "venue_id": venue_id, } response = self.json_post("/cli-json/set_wifi_extra2", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wifi_radio ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetWifiRadioFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetWifiRadioFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" ct_sta_mode = 0x40000 # Enable CT-STA mode if radio supports it. Efficiently replaces sw-crypt in # +some firmware. firmware_cfg = 0x80000 # Apply firmware config. hw_sim = 0x1 # Create hw-sim virtual radio if radio does not already exist. ignore_radar = 0x100000 # Ignore RADAR events reported by firmware. no_scan_share = 0x40 # Disable sharing scan results. no_sw_crypt = 0x20000 # Disable software-crypt for this radio. Disables some virtual-station # +features. use_syslog = 0x20000000 # Put supplicant logs in syslog instead of a file. verbose = 0x10000 # Verbose-Debug: Increase debug info in wpa-supplicant and hostapd logs. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetWifiRadioFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetWifiRadioFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetWifiRadioFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetWifiRadioFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetWifiRadioFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) class SetWifiRadioMode(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetWifiRadioMode.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetWifiRadioMode.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" p_802_11a = 1 # 802.11a AUTO = 0 # 802.11g aAX = 15 # 802.11a-AX (6E disables /n and /ac) abg = 4 # 802.11abg abgn = 5 # 802.11abgn abgnAC = 8 # 802.11abgn-AC abgnAX = 12 # 802.11abgn-AX an = 10 # 802.11an anAC = 9 # 802.11an-AC anAX = 14 # 802.11an-AX b = 2 # 802.11b bg = 7 # 802.11bg bgn = 6 # 802.11bgn bgnAC = 11 # 802.11bgn-AC bgnAX = 13 # 802.11bgn-AX g = 3 # 802.11g def post_set_wifi_radio(self, active_peer_count=None, # Number of locally-cached peer objects for this radio. ampdu_factor=None, # ax200/ax210 only, currently. Requires module reload. OS # Default: 0xFF antenna=None, # Antenna configuration: 0 Diversity/All, 1 Fixed-A (1x1), 4 # AB (2x2), 7 ABC (3x3), 8 ABCD (4x4), 9 8x8 channel=None, # Channel number for this radio device. Frequency takes # precedence if both are set to non-default values. # 0xFFFF, AUTO or DEFAULT means ANY. const_tx=None, # RF Pattern Generator , encoded as a single 32-bit integer. # See above. country=None, # Country number for this radio device. flags=None, # Flags for this interface (see above.) flags_mask=None, # If set, only these flags will be considered. frag_thresh=None, # Fragmentation Threshold (256 - 2346, 2346 == disabled). frequency=None, # Frequency for this radio. 0xFFFF, AUTO or DEFAULT # means ANY. fwname=None, # Firmware name (for example: firmware-5.bin) fwver=None, # Firmware API version (for example, 5 if firmware is based on # firmware-5.bin mac=None, # Used to identify when name cannot be trusted (2.6.34+ # kernels). max_amsdu=None, # Maximum number of frames per AMSDU that may be transmitted. # See above. mode=None, # WiFi mode, see table peer_count=None, # Number of peer objects for this radio. pref_ap=None, # Preferred AP BSSID for all station vdevs on this radio. pulse2_interval_us=None, # Pause between pattern burst for RF noise generator. pulse_interval=None, # RF Pattern generator: interval between pulses in usecs. pulse_width=None, # RF Pattern generator: pulse width in usecs. radio=None, # Name of the physical radio interface, for example: wiphy0 rate=None, # No longer used, specify the rate on the virtual station(s) # instead. rate_ctrl_count=None, # Number of rate-ctrl objects for this radio. resource=None, # Resource number. rts=None, # The RTS Threshold for this radio (off, or 1-2347). shelf=None, # Shelf number. skid_limit=None, # Firmware hash-table Skid Limit for this radio. stations_count=None, # Number of stations supported by this radio. tids_count=None, # TIDs count for this radio. tx_pulses=None, # Number of pattern pulses per burst for RF noise generator. txdesc_count=None, # Transmit descriptor count for this radio. txpower=None, # The transmit power setting for this radio. (AUTO for system # defaults) vdev_count=None, # Configure radio vdev count. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wifi_radio(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "active_peer_count": active_peer_count, "ampdu_factor": ampdu_factor, "antenna": antenna, "channel": channel, "const_tx": const_tx, "country": country, "flags": flags, "flags_mask": flags_mask, "frag_thresh": frag_thresh, "frequency": frequency, "fwname": fwname, "fwver": fwver, "mac": mac, "max_amsdu": max_amsdu, "mode": mode, "peer_count": peer_count, "pref_ap": pref_ap, "pulse2_interval_us": pulse2_interval_us, "pulse_interval": pulse_interval, "pulse_width": pulse_width, "radio": radio, "rate": rate, "rate_ctrl_count": rate_ctrl_count, "resource": resource, "rts": rts, "shelf": shelf, "skid_limit": skid_limit, "stations_count": stations_count, "tids_count": tids_count, "tx_pulses": tx_pulses, "txdesc_count": txdesc_count, "txpower": txpower, "vdev_count": vdev_count, } response = self.json_post("/cli-json/set_wifi_radio", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wifi_txo ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_set_wifi_txo(self, port=None, # WiFi interface name or number. resource=None, # Resource number. shelf=None, # Shelf number. txo_bw=None, # Configure bandwidth: 0 == 20, 1 == 40, 2 == 80, 3 == 160, 4 == # 80+80. txo_enable=None, # Set to 1 if you wish to enable transmit override, 0 to disable. txo_mcs=None, # Configure the MCS (0-3 for CCK, 0-7 for OFDM, 0-7 for HT, 0-9 for # VHT, 0-11 for HE txo_nss=None, # Configure number of spatial streams (0 == nss1, 1 == nss2, ...). txo_pream=None, # Select rate preamble: 0 == OFDM, 1 == CCK, 2 == HT, 3 == VHT, 4 == # HE_SU. txo_retries=None, # Configure number of retries. 0 or 1 means no retries). txo_sgi=None, # Should rates be sent with short-guard-interval or not? txo_txpower=None, # Configure TX power in db. Use 255 for system defaults. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wifi_txo(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "port": port, "resource": resource, "shelf": shelf, "txo_bw": txo_bw, "txo_enable": txo_enable, "txo_mcs": txo_mcs, "txo_nss": txo_nss, "txo_pream": txo_pream, "txo_retries": txo_retries, "txo_sgi": txo_sgi, "txo_txpower": txo_txpower, } response = self.json_post("/cli-json/set_wifi_txo", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wl_corruption ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetWlCorruptionFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SetWlCorruptionFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" BIT_FLIP = 0x4 # Flip a random bit in a byte. BIT_TRANSPOSE = 0x8 # Transpose two side-by-side bits in a byte. DO_CHAIN_ON_HIT = 0x10 # Do next corruption if this corruption is applied. OVERWRITE_FIXED = 0x2 # Write a fixed value to a byte. OVERWRITE_RANDOM = 0x1 # Write a random value to a byte. RECALC_CSUMS = 0x20 # Attempt to re-calculate UDP and TCP checksums. @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetWlCorruptionFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SetWlCorruptionFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SetWlCorruptionFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SetWlCorruptionFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SetWlCorruptionFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_set_wl_corruption(self, byte=None, # The byte to use for OVERWRITE_FIXED (or NA). flags=None, # The flags for this corruption. index=None, # The corruption to modify (0-5). max_offset=None, # The maximum offset from start of Ethernet packet for the byte # to be modified. min_offset=None, # The minimum offset from start of Ethernet packet for the byte # to be modified. name=None, # WanLink name rate=None, # Specifies how often, per million, this corruption should be # applied. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wl_corruption(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "byte": byte, "flags": flags, "index": index, "max_offset": max_offset, "min_offset": min_offset, "name": name, "rate": rate, } response = self.json_post("/cli-json/set_wl_corruption", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#set_wl_qdisc ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SetWlQdiscQdisc(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SetWlQdiscQdisc.clear_flags(['bridge', 'dhcp']) print( 'value now: '+SetWlQdiscQdisc.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" FIFO = "FIFO" # is the default queuing discipline, no arguments WRR__queue_queue_____ = "WRR,[queue,queue,...]" # Weighted Round Robbin is also available def post_set_wl_qdisc(self, name=None, # WanLink name qdisc=None, # FIFO, WRR,a,b,c,d,e,f,g etc debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_set_wl_qdisc(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, "qdisc": qdisc, } response = self.json_post("/cli-json/set_wl_qdisc", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_alerts ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class ShowAlertsType(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: ShowAlertsType.clear_flags(['bridge', 'dhcp']) print( 'value now: '+ShowAlertsType.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" All = "All" # CX = "CX" # Card = "Card" # Channel_Group = "Channel_Group" # CollisionDomain = "CollisionDomain" # Endp = "Endp" # PESQ = "PESQ" # PPP_Link = "PPP_Link" # Port = "Port" # Shelf = "Shelf" # Span = "Span" # Test_Mgr = "Test_Mgr" # def post_show_alerts(self, card=None, # Alert resource filter. endp=None, # Alert endpoint filter. extra=None, # Extra filter, currently ignored. port=None, # Alert port filter (can be port name or number). shelf=None, # Alert shelf filter. p_type=None, # Alert type filter. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_alerts(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "card": card, "endp": endp, "extra": extra, "port": port, "shelf": shelf, "type": p_type, } response = self.json_post("/cli-json/show_alerts", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_attenuators ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_attenuators(self, resource=None, # Resource number, or 'all'. serno=None, # Serial number for requested Attenuator, or 'all'. shelf=None, # Shelf number or alias, can be 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_attenuators(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "serno": serno, "shelf": shelf, } response = self.json_post("/cli-json/show_attenuators", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_cd ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_cd(self, collision_domain=None, # Name of the Collision Domain, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_cd(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "collision_domain": collision_domain, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/show_cd", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_chamber ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_chamber(self, name=None, # Chamber Name or 'ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_chamber(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/show_chamber", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_channel_groups ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_channel_groups(self, channel_name=None, # Name of the channel, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_channel_groups(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "channel_name": channel_name, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/show_channel_groups", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_clients ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_clients(self, debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_clients(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { } response = self.json_post("/cli-json/show_clients", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_cx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_cx(self, cross_connect=None, # Specify cross-connect to act on, or 'all'. test_mgr=None, # Specify test-mgr to act on, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_cx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cross_connect": cross_connect, "test_mgr": test_mgr, } response = self.json_post("/cli-json/show_cx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_cxe ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_cxe(self, cross_connect=None, # Specify cross-connect to show, or 'all'. test_mgr=None, # Specify test-mgr to use, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_cxe(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cross_connect": cross_connect, "test_mgr": test_mgr, } response = self.json_post("/cli-json/show_cxe", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_dbs ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_dbs(self, debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_dbs(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { } response = self.json_post("/cli-json/show_dbs", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_dut ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_dut(self, name=None, # DUT Name or 'ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_dut(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/show_dut", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_endp_payload ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_endp_payload(self, max_bytes=None, # The max number of payload bytes to print out, default is 128. name=None, # The name of the endpoint we are configuring. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_endp_payload(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "max_bytes": max_bytes, "name": name, } response = self.json_post("/cli-json/show_endp_payload", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_endpoints ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_endpoints(self, endpoint=None, # Name of endpoint, or 'all'. extra=None, # See above. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_endpoints(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endpoint": endpoint, "extra": extra, } response = self.json_post("/cli-json/show_endpoints", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_err ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_err(self, message=None, # Message to show to others currently logged on. Unescaped Value debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_err(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "message": message, } response = self.json_post("/cli-json/show_err", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_event_interest ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_event_interest(self, debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_event_interest(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { } response = self.json_post("/cli-json/show_event_interest", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_events ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class ShowEventsType(Enum): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: ShowEventsType.clear_flags(['bridge', 'dhcp']) print( 'value now: '+ShowEventsType.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" All = "All" # CX = "CX" # Card = "Card" # Channel_Group = "Channel_Group" # CollisionDomain = "CollisionDomain" # Endp = "Endp" # PESQ = "PESQ" # PPP_Link = "PPP_Link" # Port = "Port" # Shelf = "Shelf" # Span = "Span" # Test_Mgr = "Test_Mgr" # def post_show_events(self, card=None, # Event resource filter. endp=None, # Event endpoint filter. extra=None, # Extra filter, currently ignored. port=None, # Event port filter (can be port name or number). shelf=None, # Event shelf filter. p_type=None, # Event type filter. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_events(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "card": card, "endp": endp, "extra": extra, "port": port, "shelf": shelf, "type": p_type, } response = self.json_post("/cli-json/show_events", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_files ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_files(self, dir_flags=None, # Determines format of listing, see above. directory=None, # The sub-directory in which to list. p_filter=None, # An optional filter, as used by the 'ls' command. key=None, # A special key, can be used for scripting. resource=None, # The machine to search in. shelf=None, # The virtual shelf to search in. Use 0 for manager machine. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_files(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "dir_flags": dir_flags, "directory": directory, "filter": p_filter, "key": key, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/show_files", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_group ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_group(self, group=None, # Can be name of test group. Use 'all' or leave blank for all groups. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_group(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "group": group, } response = self.json_post("/cli-json/show_group", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_pesq ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_pesq(self, endpoint=None, # Name of endpoint, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_pesq(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endpoint": endpoint, } response = self.json_post("/cli-json/show_pesq", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_ports ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_ports(self, port=None, # Port number, or 'all'. probe_flags=None, # See above, add them together for multiple probings. Leave blank if # you want stats only. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_ports(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "port": port, "probe_flags": probe_flags, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/show_ports", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_ppp_links ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_ppp_links(self, link_num=None, # Ppp-Link number of the span, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_ppp_links(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "link_num": link_num, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/show_ppp_links", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_profile ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_profile(self, name=None, # Profile Name or 'ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_profile(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/show_profile", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_resources ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_resources(self, resource=None, # Resource number, or 'all'. shelf=None, # Shelf number or alias, can be 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_resources(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/show_resources", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_rfgen ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_rfgen(self, resource=None, # Resource number, or 'all'. shelf=None, # Shelf number or alias, can be 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_rfgen(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/show_rfgen", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_rt ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_rt(self, key=None, # Unique identifier for this request. Usually left blank. resource=None, # Resource number. shelf=None, # Shelf number. virtual_router=None, # Name of the virtual router. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_rt(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "key": key, "resource": resource, "shelf": shelf, "virtual_router": virtual_router, } response = self.json_post("/cli-json/show_rt", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_script_results ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_script_results(self, endpoint=None, # Name of endpoint, test-group, or 'all'. key=None, # Optional 'key' to be used in keyed-text message result. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_script_results(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endpoint": endpoint, "key": key, } response = self.json_post("/cli-json/show_script_results", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_spans ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_spans(self, resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. span_number=None, # Span-Number of the span, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_spans(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, "span_number": span_number, } response = self.json_post("/cli-json/show_spans", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_text_blob ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_text_blob(self, brief=None, # Set to 'brief' for a brief listing of all text blobs. name=None, # Text Blob Name or 'ALL'. p_type=None, # Text Blob type or 'ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_text_blob(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "brief": brief, "name": name, "type": p_type, } response = self.json_post("/cli-json/show_text_blob", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_tm ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_tm(self, test_mgr=None, # Can be name of test manager, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_tm(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "test_mgr": test_mgr, } response = self.json_post("/cli-json/show_tm", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_traffic_profile ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_traffic_profile(self, name=None, # Profile Name or 'ALL'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_traffic_profile(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/show_traffic_profile", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_venue ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_venue(self, resource=None, # Resource number, or 'ALL' shelf=None, # Shelf number. venu_id=None, # Number to uniquely identify this venue on this resource, or 'ALL' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_venue(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, "venu_id": venu_id, } response = self.json_post("/cli-json/show_venue", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_vr ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_vr(self, resource=None, # Resource number, or 'all'. router=None, # Name of the Virtual Router, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_vr(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "router": router, "shelf": shelf, } response = self.json_post("/cli-json/show_vr", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_vrcx ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_vrcx(self, cx_name=None, # Name of the Virtual Router Connection, or 'all'. resource=None, # Resource number, or 'all'. shelf=None, # Name/id of the shelf, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_vrcx(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cx_name": cx_name, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/show_vrcx", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#show_wanpaths ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_show_wanpaths(self, endpoint=None, # Name of endpoint, or 'all'. wanpath=None, # Name of wanpath, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_show_wanpaths(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endpoint": endpoint, "wanpath": wanpath, } response = self.json_post("/cli-json/show_wanpaths", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#shutdown ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_shutdown(self, chdir=None, # Directory to cd to before dying. Only useful when using gprof to debug, # or 'NA' to ignore. really=None, # Must be 'YES' for command to really work. serverctl=None, # Enter 'YES' to do a ./serverctl.bash restart to restart all LANforge # processes. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_shutdown(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "chdir": chdir, "really": really, "serverctl": serverctl, } response = self.json_post("/cli-json/shutdown", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#shutdown_os ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_shutdown_os(self, resource=None, # Resource number, or ALL. shelf=None, # Shelf number, or ALL. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_shutdown_os(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/shutdown_os", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#shutdown_resource ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_shutdown_resource(self, resource=None, # Resource number, or ALL. shelf=None, # Shelf number, or ALL. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_shutdown_resource(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/shutdown_resource", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#sniff_port ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" class SniffPortFlags(IntFlag): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- This class is stateless. It can do binary flag math, returning the integer value. Example Usage: int:flag_val = 0 flag_val = SniffPortFlags.set_flags( flag_names=['bridge', 'dhcp']) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" DUMPCAP = 0x2 # Use command-line dumpcap, more efficient than tshark MATE_TERMINAL = 0x4 # Launch tshark/dumpcap in mate-terminal MATE_XTERM = 0x8 # Launch tshark/dumpcap in xterm TSHARK = 0x1 # Use command-line tshark instead of wireshark @classmethod def set_flags(cls, starting_value: int, flag_names=None): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: SniffPortFlags.add_flags(flag_names=['bridge', 'dhcp']) print('value now: '+SniffPortFlags.value()) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" if starting_value is None: raise ValueError("starting_value should be an integer greater or equal than zero, not None") if not flag_names: raise ValueError("flag_names should be a name or a list of names, not None") if type(flag_names) is list: selected_flags = [] for flag in flag_names: if flag not in cls.__members__: raise ValueError("SniffPortFlags has no member:[%s]" % flag) selected_flags.extend([cls[member].value for member in cls.__members__ if member == flag]) selected_flags.append(starting_value) return sum(selected_flags) if flag_names not in cls.__members__: raise ValueError("SniffPortFlags has no member:[%s]" % flag_names) return cls.valueof(flag_names) # use to get in value of flag @classmethod def valueof(cls, name=None): if name is None: return name if name not in cls.__members__: raise ValueError("SniffPortFlags has no member:[%s]" % name) return (cls[member].value for member in cls.__members__ if member == name) def post_sniff_port(self, display=None, # The DISPLAY option, for example: 192.168.1.5:0.0. Will guess if left # blank. duration=None, # Duration for doing a capture (in seconds). Default is 5 minutes for # dumpcap/tshark, and forever for wireshark flags=None, # Flags that control how the sniffing is done. outfile=None, # Optional file location for saving a capture. port=None, # The port we are trying to run the packet sniffer on. resource=None, # Resource number. shelf=None, # Shelf number. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_sniff_port(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "display": display, "duration": duration, "flags": flags, "outfile": outfile, "port": port, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/sniff_port", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#start_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_start_endp(self, endp_name=None, # Name of the cross-connect, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_start_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp_name": endp_name, } response = self.json_post("/cli-json/start_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#start_group ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_start_group(self, name=None, # The name of the test group. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_start_group(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/start_group", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#start_ppp_link ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_start_ppp_link(self, resource=None, # Resource number that holds this PppLink. shelf=None, # Name/id of the shelf. unit_num=None, # Unit-Number for the PppLink to be started. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_start_ppp_link(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, "unit_num": unit_num, } response = self.json_post("/cli-json/start_ppp_link", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#stop_endp ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_stop_endp(self, endp_name=None, # Name of the endpoint, or 'all'. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_stop_endp(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "endp_name": endp_name, } response = self.json_post("/cli-json/stop_endp", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#stop_group ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_stop_group(self, name=None, # The name of the test group, or 'all' debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_stop_group(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "name": name, } response = self.json_post("/cli-json/stop_group", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#stop_ppp_link ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_stop_ppp_link(self, resource=None, # Resource number that holds this PppLink. shelf=None, # Name/id of the shelf. unit_num=None, # Unit-Number for the PppLink to be stopped. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_stop_ppp_link(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, "unit_num": unit_num, } response = self.json_post("/cli-json/stop_ppp_link", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#tail ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_tail(self, cmd=None, # Command: start, stop, results key=None, # File-name that we should be tailing. message=None, # The contents to display (for results only) Unescaped # Value resource=None, # Resource that holds the file. shelf=None, # Shelf that holds the resource that holds the file. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_tail(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "cmd": cmd, "key": key, "message": message, "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/tail", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#tm_register ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_tm_register(self, client_name=None, # Name of client to be registered. (dflt is current client) test_mgr=None, # Name of test manager (can be all.) debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_tm_register(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "client_name": client_name, "test_mgr": test_mgr, } response = self.json_post("/cli-json/tm_register", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#tm_unregister ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_tm_unregister(self, client_name=None, # Name of client to be un-registered. (dflt is current client) test_mgr=None, # Name of test manager (can be all.) debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_tm_unregister(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "client_name": client_name, "test_mgr": test_mgr, } response = self.json_post("/cli-json/tm_unregister", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#version ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_version(self, debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_version(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { } response = self.json_post("/cli-json/version", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#who ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_who(self, debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_who(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { } response = self.json_post("/cli-json/who", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#wifi_cli_cmd ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_wifi_cli_cmd(self, port=None, # Name of the WiFi station or AP interface to which this command # will be directed. resource=None, # Resource number. shelf=None, # Shelf number. wpa_cli_cmd=None, # Command to pass to wpa_cli or hostap_cli. This must be # single-quoted. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_wifi_cli_cmd(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "port": port, "resource": resource, "shelf": shelf, "wpa_cli_cmd": wpa_cli_cmd, } response = self.json_post("/cli-json/wifi_cli_cmd", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#wifi_event ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_wifi_event(self, device=None, # Interface or PHY in most cases. event=None, # What happened. msg=None, # Entire event in human readable form. status=None, # Status on what happened. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_wifi_event(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "device": device, "event": event, "msg": msg, "status": status, } response = self.json_post("/cli-json/wifi_event", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#wiser_reset ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_wiser_reset(self, resource=None, # Resource number, or ALL. shelf=None, # Shelf number, or ALL. debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_wiser_reset(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "resource": resource, "shelf": shelf, } response = self.json_post("/cli-json/wiser_reset", data, debug_=debug_) return response # """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Notes for type requests https://www.candelatech.com/lfcli_ug.php#write ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" def post_write(self, db_name=None, # The name the backup shall be saved as (blank means dflt) debug_=False): """----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- Example Usage: result = post_write(param=value ...) pprint.pprint( result ) ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----""" debug_ |= self.debug data = { "db_name": db_name, } response = self.json_post("/cli-json/write", data, debug_=debug_) return response #