# import os # import sys # import base64 # import urllib.request # from bs4 import BeautifulSoup # import ssl # import subprocess # from artifactory import ArtifactoryPath # import tarfile # import paramiko # from paramiko import SSHClient # from scp import SCPClient # import pexpect # from pexpect import pxssh # import paramiko # from scp import SCPClient # import pprint # from pprint import pprint # from os import listdir # import re # # # For finding files # # https://stackoverflow.com/questions/3207219/how-do-i-list-all-files-of-a-directory # import glob # # external_results_dir = / var / tmp / lanforge # # local_dir = os.getenv('LOG_DIR') # print("Local Directory where all files will be copied and logged", local_dir) # cicd_user = os.getenv('CICD_USER') # print("cicd_user = ", cicd_user) # cicd_pw = os.getenv('CICD_PW') # print("cicd pw =", cicd_pw) # ap_pw = os.getenv('AP_PW') # ap_user = os.getenv('AP_USER') # tr_user = os.getenv('TR_USER') # print("Testrail user id = ", tr_user) # tr_pw = os.getenv('TR_PW') # print("Testrail password =", tr_pw) # aws_host = '3.96.56.0' # aws_user = 'ubuntu' # # if sys.version_info[0] != 3: # print("This script requires Python 3") # exit(1) # if 'py-json' not in sys.path: # sys.path.append('../py-json') # # from LANforge.LFUtils import * # # if you lack __init__.py in this directory you will not find sta_connect module# # import sta_connect # import testrail_api # from sta_connect import StaConnect # from testrail_api import APIClient # # client: APIClient = APIClient('https://telecominfraproject.testrail.com') # client.user = tr_user # client.password = tr_pw # # print('Beginning file download with requests') # # # class GetBuild: # def __init__(self): # self.user = cicd_user # self.password = cicd_pw # ssl._create_default_https_context = ssl._create_unverified_context # # def get_latest_image(self, url): # # auth = str( # base64.b64encode( # bytes('%s:%s' % (cicd_user, cicd_pw), 'utf-8') # ), # 'ascii' # ).strip() # headers = {'Authorization': 'Basic ' + auth} # # ''' FIND THE LATEST FILE NAME''' # print(url) # req = urllib.request.Request(url, headers=headers) # response = urllib.request.urlopen(req) # html = response.read() # soup = BeautifulSoup(html, features="html.parser") # last_link = soup.find_all('a', href=True)[-1] # latest_file = last_link['href'] # # filepath = local_dir # os.chdir(filepath) # # file_url = url + latest_file # # ''' Download the binary file from Jfrog''' # path = ArtifactoryPath(url, auth=(cicd_user, cicd_pw)) # path.touch() # for file in path: # print('File =', file) # # path = ArtifactoryPath(file, auth=(cicd_user, cicd_pw)) # print("file to be downloaded :", latest_file) # print("File Path:", file) # with path.open() as des: # with open(latest_file, "wb") as out: # out.write(des.read()) # des.close() # print("Extract the tar.gz file and upgrade the AP ") # housing_tgz = tarfile.open(latest_file) # housing_tgz.extractall() # housing_tgz.close() # return "pass" # print("Extract the tar file, and copying the file to Linksys AP directory") # # with open("/Users/syamadevi/Desktop/syama/ea8300/ap_sysupgrade_output.log", "a") as output: # # subprocess.call("scp /Users/syamadevi/Desktop/syama/ea8300/openwrt-ipq40xx-generic-linksys_ea8300-squashfs-sysupgrade.bin root@192.100.1.1:/tmp/openwrt-ipq40xx-generic-linksys_ea8300-squashfs-sysupgrade.bin",shell=True, stdout=output, # # stderr=output) # # print('SSH to Linksys and upgrade the file') # # ''' # # ssh = SSHClient() # ssh.load_system_host_keys() # ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # ssh.connect(hostname='192.100.1.1', # port='22', # username='root', # password='Dadun123$', # look_for_keys=False, # pkey='load_key_if_relevant') # # # SCPCLient takes a paramiko transport as its only argument # scp = SCPClient(ssh.get_transport()) # # scp.put('test.txt', 'testD.txt') # scp.close() # # # # # client = paramiko.SSHClient() # #client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # #client.connect('192.100.1.1', username='syama', password='Dadun123$') # # stdin, stdout, stderr = ssh.exec_command('sysupgrade /tmp/openwrt-ipq40xx-generic-linksys_ea8300-squashfs-sysupgrade.bin') # # for line in stdout: # print (line.strip('\n')) # client.close() # ''' # # def run_opensyncgw_in_docker(self): # # user_password = 'fepv6nj9guCPeEHC' # # my_env = os.environ.copy() # # my_env["userpass"] = user_password # # my_command = 'python --version' # # subprocess.Popen('echo', env=my_env) # with open(local_dir + "docker_jfrog_login.log", "a") as output: # subprocess.call( # "docker login --username" + cicd_user + "--password" + cicd_pw + " https://tip-tip-wlan-cloud-docker-repo.jfrog.io", # shell=True, stdout=output, # stderr=output) # with open(local_dir + "opensyncgw_upgrade.log", "a") as output: # subprocess.call( # "docker pull tip-tip-wlan-cloud-docker-repo.jfrog.io/opensync-gateway-and-mqtt:0.0.1-SNAPSHOT", # shell=True, stdout=output, # stderr=output) # with open(local_dir + "opensyncgw.log", "a") as output: # subprocess.call("docker run --rm -i -p 1883:1883 -p 6640:6640 -p 6643:6643 -p 4043:4043 \ # -v ~/mosquitto/data:/mosquitto/data \ # -v ~/mosquitto/log:/mosquitto/log \ # -v ~/wlan-pki-cert-scripts:/opt/tip-wlan/certs \ # -v ~/app/log:/app/logs \ # -v ~//app/config:/app/config \ # -e OVSDB_CONFIG_FILE='/app/config/config_2_ssids.json' \ # tip-tip-wlan-cloud-docker-repo.jfrog.io/opensync-gateway-and-mqtt:0.0.1-SNAPSHOT", shell=True, stdout=output, # stderr=output) # print("opensync Gateway is running") # return "pass" # # def run_opensyncgw_in_aws(self): # try: # s = pxssh.pxssh() # # os.chdir(local_dir) # print("AWS OPENSYNC GW UPGRADE VIA HELM") # print( # 'Helm upgrades the latest image in the GW if a new image is found from jfrog and the AWS gateway is not upto date ') # # makesure the client key file is in the fame directory to login to AWS VM # s.login(aws_host, aws_user, ssh_key='id_key.pem') # s.sendline('kubectl get pods') # # # run a command # s.prompt() # match the prompt # print(s.before) # print everything before the prompt. # s.sendline( # 'helm upgrade tip-wlan wlan-cloud-helm/tip-wlan/ -n default -f wlan-cloud-helm/tip-wlan/resources/environments/dev-amazon.yaml') # s.prompt() # match the prompt # print(s.before) # print everything before the prompt. # s.sendline('kubectl get pods') # # # run a command # s.prompt() # match the prompt # print(s.before) # print everything before the prompt. # s.logout() # return "pass" # # except pxssh.ExceptionPxssh as e: # print("ALERT !!!!!! pxssh failed on login.") # print(e) # # # class openwrt_ap: # # def ap_upgrade(src, user2, host2, tgt, pwd, opts='', timeout=60): # ''' Performs the scp command. Transfers file(s) from local host to remote host ''' # print("AP Model getting upgarded is :", apModel) # if apModel == "ecw5410": # ap_firmware = 'openwrt-ipq806x-generic-edgecore_ecw5410-squashfs-nand-sysupgrade.bin' # AP_IP = '10.10.10.207' # else: # if apModel == "ea8300": # ap_firmware = 'openwrt-ipq40xx-generic-linksys_ea8300-squashfs-sysupgrade.bin' # AP_IP = '10.10.10.208' # host2 = AP_IP # src = src + ap_firmware # print("src =", src) # print("AP IP ", AP_IP) # print("AP USER =", ap_user) # print("AP PASSWORD =", ap_pw) # cmd = f'''/bin/bash -c "scp {opts} {src} {user2}@{AP_IP}:{tgt}"''' # print("Executing the following cmd:", cmd, sep='\n') # # tmpFl = '/tmp/scp.log' # fp = open(tmpFl, 'wb') # print(tmpFl) # childP = pexpect.spawn(cmd, timeout=timeout) # try: # childP.sendline(cmd) # childP.expect([f"{user2}@{host2}'s password:"]) # childP.sendline(pwd) # childP.logfile = fp # childP.expect(pexpect.EOF) # childP.close() # fp.close() # fp = open(tmpFl, 'r') # stdout = fp.read() # fp.close() # # if childP.exitstatus != 0: # raise Exception(stdout) # except KeyboardInterrupt: # childP.close() # fp.close() # return # print(stdout) # # try: # s = pxssh.pxssh() # s.login(host2, user2, pwd) # # s.sendline('sysupgrade /tmp/openwrt-ipq40xx-generic-linksys_ea8300-squashfs-sysupgrade.bin&') # s.sendline('sysupgrade /tmp/openwrt-ipq806x-generic-edgecore_ecw5410-squashfs-nand-sysupgrade.bin&') # # s.logout() # # s.prompt() # match the prompt # print(s.before) # print everything before the prompt. # sleep(100) # # s.login(host2, user2, pwd) # s.prompt() # # os.system(f"scp {local_dir}/cacert.pem root@10.10.10.207:/usr/plume/certs/ca.pem") # # os.system(f"scp {local_dir}/clientcert.pem root@10.10.10.207:/usr/plume/certs/client.pem") # # os.system(f"scp {local_dir}/clientkey_dec.pem root@10.10.10.207:/usr/plume/certs/client_dec.key") # # s.sendline('service opensync restart') # # s.prompt() # match the prompt # # print(s.before) # print everything before the prompt. # s.logout() # return "pass" # except pxssh.ExceptionPxssh as e: # print("ALERT !!!!!! pxssh failed on login.") # print(e) # # def apCopyCert(src, user2, host2, tgt, pwd, opts='', timeout=60): # # print("Copying the AP Certs") # ''' # s = pxssh.pxssh() # print(src, users2,pwd) # s.login(host2, user2, pwd) # s.prompt() # match the prompt # print("Copying ca.pem") # os.system(f"scp {src}/cacert.pem root@10.10.10.207:/usr/plume/certs/ca.pem") # print("Copying the client.pem") # os.system(f"scp {src}/clientcert.pem root@10.10.10.207:/usr/plume/certs/client.pem") # print("Copying the client_dec.key") # os.system(f"scp {src}/clientkey_dec.pem root@10.10.10.207:/usr/plume/certs/client_dec.key") # s.sendline('service opensync restart') # s.prompt() # match the prompt # print(s.before) # print everything before the prompt. # s.logout() # ''' # cacert = src + "ca.pem" # clientcert = src + "client.pem" # clientkey = src + "client_dec.key" # tgt = "/usr/plume/certs" # ap_pw # # print("src =", src) # print("AP IP ", host2) # print("AP USER =", ap_user) # print("AP PASSWORD =", ap_pw) # # cmd = f'''/bin/bash -c "scp {opts} {src} {user2}@{AP_IP}:{tgt}"''' # # cmd = f'''/bin/bash -c "scp {opts} {cacert} {user2}@{AP_IP}:{tgt}"''' # # cmd = f'''/bin/bash -c "scp {opts} {clientcert} {user2}@{AP_IP}:{tgt}"''' # cmd = f'''/bin/bash -c "scp {opts} {cacert} {clientcert} {clientkey} {user2}@{host2}:{tgt}"''' # print("Executing the following cmd:", cmd, sep='\n') # tmpFl = '/tmp/cert.log' # fp = open(tmpFl, 'wb') # print(tmpFl) # childP = pexpect.spawn(cmd, timeout=timeout) # try: # childP.sendline(cmd) # childP.expect([f"{user2}@{host2}'s password:"]) # childP.sendline(ap_pw) # childP.logfile = fp # childP.expect(pexpect.EOF) # fp.close() # fp = open(tmpFl, 'r') # stdout = fp.read() # fp.close() # # if childP.exitstatus != 0: # # raise Exception(stdout) # print("there is an excess status non 0") # except KeyboardInterrupt: # childP.close() # fp.close() # return # print(stdout) # # def restartGw(src, user2, host2, tgt, pwd, opts='', timeout=60): # print("Restarting opensync GW") # s = pxssh.pxssh() # s.login(host2, user2, pwd) # # s.sendline('sysupgrade /tmp/openwrt-ipq40xx-generic-linksys_ea8300-squashfs-sysupgrade.bin&') # s.sendline('service opensync restart') # # s.logout() # # s.prompt() # match the prompt # print(s.before) # print everything before the prompt. # s.prompt() # s.logout() # # # class RunTest: # def TestCase_938(self, rid): # '''SINGLE CLIENT CONNECTIVITY''' # staConnect = StaConnect("10.10.10.201", 8080, _debugOn=False) # staConnect.sta_mode = 0 # staConnect.upstream_resource = 1 # staConnect.upstream_port = "eth2" # staConnect.radio = "wiphy1" # staConnect.resource = 1 # staConnect.dut_ssid = "autoProvisionedSsid-5u" # # staConnect.dut_passwd = "4C0nnectUS!" # staConnect.dut_passwd = "12345678" # staConnect.dut_security = "wpa2" # staConnect.station_names = ["sta01010"] # staConnect.runtime_secs = 30 # staConnect.cleanup_on_exit = True # staConnect.run() # run_results = staConnect.get_result_list() # for result in run_results: # print("test result: " + result) # # result = 'pass' # print("Single Client Connectivity :", staConnect.passes) # if staConnect.passes() == True: # client.update_testrail(case_id=938, run_id=rid, status_id=1, # msg='client Connectivity to 5GHZ Open SSID is Passed ') # else: # client.update_testrail(case_id=938, run_id=rid, status_id=5, # msg='client connectivity to 5GHZ OPEN SSID is Failed') # # def TestCase_941(self, rid): # # MULTI CLIENT CONNECTIVITY # staConnect = StaConnect("10.10.10.201", 8080, _debugOn=False) # staConnect.sta_mode = 0 # staConnect.upstream_resource = 1 # staConnect.upstream_port = "eth2" # staConnect.radio = "wiphy1" # staConnect.resource = 1 # staConnect.dut_ssid = "autoProvisionedSsid-5u" # # staConnect.dut_passwd = "4C0nnectUS!" # staConnect.dut_passwd = "12345678" # staConnect.dut_security = "wpa2" # staConnect.station_names = ["sta0020", 'sta0021', 'sta0022', 'sta0023'] # staConnect.runtime_secs = 20 # staConnect.cleanup_on_exit = True # staConnect.run() # run_results = staConnect.get_result_list() # for result in run_results: # print("test result: " + result) # if staConnect.passes() == True: # client.update_testrail(case_id=941, run_id=rid, status_id=1, # msg='client Connectivity to 5GHZ Open SSID is Passed ') # else: # client.update_testrail(case_id=941, run_id=rid, status_id=5, # msg='client connectivity to 5GHZ OPEN SSID is Failed') # # # Check for externally run test case results. # def TestCase_LF_External(self, rid): # # https://stackoverflow.com/questions/3207219/how-do-i-list-all-files-of-a-directory # results = glob.glob("%s/*_CICD_RESULTS.txt" % external_results_dir) # for r in results: # rfile = open(r, 'r') # lines = rfile.readlines() # # # File contents looks something like: # # CASE_ID 9999 # # RUN_ID 15 # # STATUS 1 # # MSG Test passed nicely # # MSG Build ID: deadbeef # # MSG Results: http://cicd.telecominfraproject.com # # _case_id = -1 # _status_id = 1 # Default to pass # _msg = "" # _rid = rid # # for line in Lines: # m = re.search(r'(\S+) (.*)', line) # k = m.group(0); # v = m.group(1); # # if k == "CASE_ID": # _case_id = v # if k == "RUN_ID": # _rid = v # if k == "STATUS": # _status_id = v # if k == "MSG": # if _msg == "": # _msg == v # else: # _msg += "\n" # _msg += v # if _case_id != -1: # client.update_testrail(case_id=_case_id, run_id=_rid, status_id=_status_id, msg=_msg) # os.unlink(r) # # def TestCase_939(self, rid): # ''' Client Count in MQTT Log''' # try: # print("Counting clients in MQTT") # s = pxssh.pxssh() # # aws_host = os.getenv(AWS_HOST) # # aws_user=os.getenv(AWS_USER) # os.chdir(local_dir) # # makesure the client key file is in the fame directory to login to AWS VM # s.login(aws_host, aws_user, ssh_key='id_key.pem') # s.sendline('kubectl cp tip-wlan-opensync-gw-static-f795d45-ctb5z:/app/logs/mqttData.log mqttData.log') # # run a command # s.prompt() # match the prompt # print(s.before) # print everything before the prompt. # s.sendline() # s.logout() # # return "pass" # print(aws_host, aws_user) # ssh = paramiko.SSHClient() # ssh.load_system_host_keys() # ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # k = paramiko.RSAKey.from_private_key_file('id_key.pem') # ssh.connect(aws_host, username=aws_user, pkey=k) # print("Connected") # scp = SCPClient(ssh.get_transport()) # scp.get("mqttData.log") # scp.close() # # Get the client Count # ClientCount = subprocess.getoutput( # 'grep \'{\"nodeID\"\' mqttData.log | grep clientList | tail -1 |cut -d \'=\' -f 3 | json_pp | grep macAddres | grep \'04:F0:21:55\' | tr -d , | sort | uniq | wc -l ') # print("client count =", ClientCount) # if (int(ClientCount) >= 1): # client.update_testrail(case_id=939, run_id=rid, status_id=1, # msg=ClientCount + ' Client/Clients Connected ') # else: # client.update_testrail(case_id=939, run_id=rid, status_id=5, # msg='No Client Connected') # except pxssh.ExceptionPxssh as e: # print("ALERT !!!!!! pxssh failed on login.") # print(e) # # # params = { # 'src': local_dir, # 'user2': ap_user, # 'host2': '10.10.10.207', # 'tgt': '/tmp/', # 'pwd': ap_pw, # 'opts': '' # } # apModel = "ecw5410" # # url = 'https://tip.jfrog.io/artifactory/tip-wlan-ap-firmware/' # url = url + apModel # projId = client.get_project_id(project_name='WLAN') # print("TIP WLAN Project ID Is :", projId) # # rid = client.get_run_id(test_run_name='TIP-DEMO4') # print(rid) # Test: RunTest = RunTest() # Build: GetBuild = GetBuild() # ''' # binary_fetch_result = Build.get_latest_image(url) # print("UPDATING TEST RAIL WITH TEST RESULT FOR CASE_ID 940: Download latest openwrt image from Jfrog") # # if binary_fetch_result == 'pass': # client.update_testrail(case_id=940, run_id=rid, status_id=1, msg='latest firmware downloaded') # else: # client.update_testrail(case_id=940, run_id=rid, status_id=5, msg='Firmware Download failed') # # sleep(10) # print("Upgrading AP with latest image downloaded") # ap_upgrade_result = openwrt_ap.ap_upgrade(**params) # sleep(10) # print("UPDATING TEST RAIL WITH TEST RESULT FOR CASE_ID 937") # sleep(10) # if ap_upgrade_result == 'pass': # client.update_testrail(case_id=937, run_id=rid, status_id=1, msg='AP upgraded with latest Firmware') # else: # client.update_testrail(case_id=937, run_id=rid, status_id=5, msg='Firmware upgrade failed in AP ') # print("Upgrading AWS Opensync gateway with latest docker image from Jfrog") # OpensyncGw_UpgResult = Build.run_opensyncgw_in_aws() # if OpensyncGw_UpgResult == 'pass': # client.update_testrail(case_id=936, run_id=rid, status_id=1, msg='Opensync GW upgraded with latest Firmware') # else: # client.update_testrail(case_id=936, run_id=rid, status_id=5, msg='Firmware upgrade failed in Opensync Gateway') # sleep(10) # ''' # pprint.pprint(params) # ap_cert_result = openwrt_ap.apCopyCert(**params) # print("Executing TestCase 938: single Client Connectivity test") # openwrt_ap.restartGw(**params) # Test.TestCase_938(rid) # # print("Executing TestCase 941: Multi Client Connectivity test") # Test.TestCase_941(rid) # sleep(100) # print("Executing TestCase 939:Counting The number of Clients Connected from MQTT") # Test.TestCase_939(rid) # # # #