mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-10-31 10:48:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			199 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| """
 | |
| NAME: attenuator_mon.py
 | |
| 
 | |
| PURPOSE: example of a monitoring loop that notices when attenator values change
 | |
| 
 | |
| EXAMPLE:
 | |
| 
 | |
| NOTES:
 | |
| 
 | |
| 
 | |
| """
 | |
| import sys
 | |
| 
 | |
| if sys.version_info[0] != 3:
 | |
|     print("This script requires Python3")
 | |
|     exit()
 | |
| 
 | |
| sys.path.insert(1, "../../py-json")
 | |
| import argparse
 | |
| import importlib
 | |
| import os
 | |
| from os.path import exists
 | |
| import pprint
 | |
| from time import sleep
 | |
| 
 | |
| 
 | |
| sys.path.append(os.path.join(os.path.abspath(__file__ + "../../../../")))
 | |
| lfcli_base = importlib.import_module('py-json.LANforge.lfcli_base')
 | |
| LFCliBase = lfcli_base.LFCliBase
 | |
| LFUtils = importlib.import_module('py-json.LANforge.LFUtils')
 | |
| realm = importlib.import_module('py-json.realm')
 | |
| Realm = realm.Realm
 | |
| 
 | |
| lfcli_base = importlib.import_module("py-json.LANforge.lfcli_base")
 | |
| LFCliBase = lfcli_base.LFCliBase
 | |
| 
 | |
| 
 | |
| class AttenuatorMonitor(Realm):
 | |
|     def __init__(self,
 | |
|                  host=None,
 | |
|                  port=None,
 | |
|                  action=None,
 | |
|                  action_every_channel=False,
 | |
|                  attenuator=None,
 | |
|                  interval_sec: float = 1.0,
 | |
|                  stop_file=None,
 | |
|                  _deep_clean=False,
 | |
|                  _debug_on=False,
 | |
|                  _exit_on_error=False,
 | |
|                  _exit_on_fail=False):
 | |
|         super().__init__(host,
 | |
|                          port,
 | |
|                          debug_=_debug_on,
 | |
|                          _exit_on_fail=_exit_on_fail)
 | |
|         self.action = action
 | |
|         self.action_every_channel = action_every_channel
 | |
|         self.attenuator = attenuator
 | |
|         self.interval_sec = interval_sec
 | |
|         self.stop_file = stop_file
 | |
| 
 | |
|         self.prev_values = {
 | |
|             "module 1": 0.0,
 | |
|             "module 2": 0.0,
 | |
|             "module 3": 0.0,
 | |
|             "module 4": 0.0,
 | |
|             "module 5": 0.0,
 | |
|             "module 6": 0.0,
 | |
|             "module 7": 0.0,
 | |
|             "module 8": 0.0,
 | |
|         }
 | |
|         # check for attenuator
 | |
| 
 | |
|         response = self.json_get("/atten/list")
 | |
|         if "attenuator" not in response:
 | |
|             if "attenuators" not in response:
 | |
|                 print("Unable to retrieve list of attenuators. Is a LANforge GUI at %s:%s ?"
 | |
|                       % (host, port))
 | |
|                 exit(1)
 | |
| 
 | |
|         found = False
 | |
|         if "attenuator" in response:
 | |
|             if response["attenuator"]["entity id"] != self.attenuator:
 | |
|                 print("Unable to find attenuator %s" % self.attenuator)
 | |
|                 pprint.pprint(("reponse", response))
 | |
|                 exit(1)
 | |
|             else:
 | |
|                 found = True
 | |
|         elif "attenuators" in response:
 | |
|             atten_list = response["attenuators"]
 | |
|             for atten_o in atten_list:
 | |
|                 for key_1 in atten_o.keys():
 | |
|                     if atten_o[key_1]["entity id"] == self.attenuator:
 | |
|                         found = True
 | |
|         else:
 | |
|             print("No attenators on system.")
 | |
|             exit(1)
 | |
|         if not found:
 | |
|             print("No matching attenuators found.")
 | |
|             exit(1)
 | |
| 
 | |
|         self.attenuator_url = "/atten/" + self.attenuator
 | |
| 
 | |
|     def run(self):
 | |
|         if self.stop_file is not None:
 | |
|             if exists(self.stop_file):
 | |
|                 print("Stop File [%s] already exists. Remove file before starting script." % self.stop_file)
 | |
|                 exit(0)
 | |
|         else:
 | |
|             print("No stop file provided. Stop this script with ctrl-c or kill")
 | |
| 
 | |
|         counter = 0;
 | |
|         while(True):
 | |
|             sleep(self.interval_sec)
 | |
|             if exists(self.stop_file):
 | |
|                 return
 | |
|             num_changes = 0
 | |
|             changes = {}
 | |
|             attenuator_values = self.json_get(self.attenuator_url)
 | |
|             z_old: float
 | |
|             z_new: float
 | |
| 
 | |
|             for key in self.prev_values.keys():
 | |
| 
 | |
|                 if key not in attenuator_values["attenuator"]:
 | |
|                     pprint.pprint(attenuator_values["attenuator"])
 | |
|                     raise ValueError("Unexpected lack of keys for attenuator record:")
 | |
|                 if self.debug:
 | |
|                     print("I see: %s -> %s" % (self.prev_values[key], attenuator_values["attenuator"][key]))
 | |
| 
 | |
|                 if "" == attenuator_values["attenuator"][key]:
 | |
|                     continue
 | |
| 
 | |
|                 z_old = float(self.prev_values[key])
 | |
|                 z_new = float(attenuator_values["attenuator"][key])
 | |
| 
 | |
|                 changes[key] = 0
 | |
|                 if z_old != z_new:
 | |
|                     if (counter > 0) and self.action_every_channel:
 | |
|                         self.do_cmd(channel=key, value=z_new)
 | |
|                     else:
 | |
|                         changes[key] = str(z_new)
 | |
|                         num_changes += 1
 | |
|                     self.prev_values[key] = z_new
 | |
| 
 | |
|             if (counter > 0) and (num_changes > 0) and (not self.action_every_channel):
 | |
|                 self.do_cmd(channel="all",
 | |
|                             value=",".join(changes.values()))
 | |
|             if exists(self.stop_file):
 | |
|                 return
 | |
|             counter += 1
 | |
| 
 | |
|     def do_cmd(self,
 | |
|                channel=None,
 | |
|                value=None):
 | |
|         if not channel:
 | |
|             raise ValueError("do_cmd not given channel")
 | |
|         if not value:
 | |
|             raise ValueError("do_cmd not given value")
 | |
|         if not self.action:
 | |
|             raise ValueError("do_cmd lost self.action")
 | |
| 
 | |
|         pprint.pprint([("channel", channel),
 | |
|                        ("values", value)])
 | |
|         os.system(self.action)
 | |
| 
 | |
| def main():
 | |
|     parser = LFCliBase.create_bare_argparse(
 | |
|         prog=__file__,
 | |
|         formatter_class=argparse.RawTextHelpFormatter,
 | |
|         description="""
 | |
| """)
 | |
|     parser.add_argument('--action', help="command to execute when attenuator changes levels")
 | |
|     parser.add_argument('--action_every_channel', help="When True, do an action for every channel that changes")
 | |
|     parser.add_argument('--attenuator', help="attenuator entity id to watch; E.G.: 1.1.323")
 | |
|     parser.add_argument('--interval_sec', type=float, help="wait between checking")
 | |
|     parser.add_argument('--stop_file', help="when this file appears, exit; E.G.: /tmp/stop-monitoring")
 | |
| 
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     if (not args.action) or ("" == args.action):
 | |
|         print("--action is required; how about 'echo hi' ?")
 | |
|         exit(1)
 | |
|     attenuator_mon = AttenuatorMonitor(args.mgr,
 | |
|                                        args.mgr_port,
 | |
|                                        attenuator=args.attenuator,
 | |
|                                        action=args.action,
 | |
|                                        action_every_channel=args.action_every_channel,
 | |
|                                        interval_sec=args.interval_sec,
 | |
|                                        stop_file=args.stop_file,
 | |
|                                        _debug_on=False,
 | |
|                                        _exit_on_error=False,
 | |
|                                        _exit_on_fail=False)
 | |
|     attenuator_mon.run()
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 | 
