first commit
This commit is contained in:
commit
02a8c72a2e
BIN
DCU-LIST.xlsx
Normal file
BIN
DCU-LIST.xlsx
Normal file
Binary file not shown.
27
chromedriver/LICENSE.chromedriver
Normal file
27
chromedriver/LICENSE.chromedriver
Normal file
@ -0,0 +1,27 @@
|
||||
// Copyright 2015 The Chromium Authors
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google LLC nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
8671
chromedriver/THIRD_PARTY_NOTICES.chromedriver
Normal file
8671
chromedriver/THIRD_PARTY_NOTICES.chromedriver
Normal file
File diff suppressed because it is too large
Load Diff
BIN
chromedriver/chromedriver
Executable file
BIN
chromedriver/chromedriver
Executable file
Binary file not shown.
3
jalankan.sh
Executable file
3
jalankan.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
source /Users/macos/Documents/SINDIGILIVE/CLIENTS/ICON+/Project-HES/Update_DCU/bin/activate
|
||||
python /Users/macos/Documents/SINDIGILIVE/CLIENTS/ICON+/Project-HES/Update_DCU/update_dcu.py
|
179
update_dcu.py
Normal file
179
update_dcu.py
Normal file
@ -0,0 +1,179 @@
|
||||
import time
|
||||
import openpyxl
|
||||
import pexpect
|
||||
from selenium import webdriver
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.chrome.service import Service
|
||||
from selenium.webdriver.chrome.options import Options
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
from selenium.common.exceptions import TimeoutException, NoSuchElementException
|
||||
from pathlib import Path
|
||||
|
||||
def create_ssh_tunnel(dcu_ip, ssh_user="callysta_icon", ssh_host="10.232.4.113", ssh_port=21112, ssh_password="Callysta_icon2024!"):
|
||||
ssh_command = f"ssh -L 8888:{dcu_ip}:80 {ssh_user}@{ssh_host} -p {ssh_port}"
|
||||
child = pexpect.spawn(ssh_command)
|
||||
try:
|
||||
# Expect the password prompt and send the password
|
||||
child.expect("callysta_icon@10.232.4.113's password: ")
|
||||
child.sendline(ssh_password)
|
||||
child.expect(pexpect.EOF)
|
||||
print("SSH tunnel established.")
|
||||
except pexpect.exceptions.EOF:
|
||||
print("Error: SSH connection failed.")
|
||||
except pexpect.exceptions.TIMEOUT:
|
||||
print("Error: SSH connection timed out.")
|
||||
return child # Return the child process to keep the tunnel open
|
||||
|
||||
def verify_dcu_update(driver, expected_ip, retries=10):
|
||||
"""Verify if the DCU update is successful by checking IP and Connect State."""
|
||||
for attempt in range(retries):
|
||||
try:
|
||||
print(f"Attempt {attempt + 1} to verify DCU update...")
|
||||
|
||||
# Click on the "Running State" tab to ensure correct content is displayed
|
||||
driver.find_element(By.ID, "running-state").click()
|
||||
time.sleep(2) # Small delay to let the page render
|
||||
|
||||
# Wait until the main_host_info container is present, indicating page has loaded
|
||||
WebDriverWait(driver, 10).until(
|
||||
EC.presence_of_element_located((By.ID, "main_host_info"))
|
||||
)
|
||||
|
||||
# Locate info items within main_host_info container
|
||||
info_items = driver.find_elements(By.XPATH, "//div[@id='main_host_info']/div[@class='info_item']")
|
||||
print(f"Found {len(info_items)} info items.") # Debug output for verification
|
||||
|
||||
updated_ip = None
|
||||
update_status = None
|
||||
|
||||
# Extract the information based on description (desc)
|
||||
for item in info_items:
|
||||
desc = item.find_element(By.CLASS_NAME, "desc").text.strip()
|
||||
data = item.find_element(By.CLASS_NAME, "data").text.strip()
|
||||
print(f"Description: {desc}, Data: {data}") # Debugging output for each item
|
||||
|
||||
if desc == "IP And Port":
|
||||
updated_ip = data
|
||||
elif desc == "Connect State":
|
||||
update_status = data
|
||||
|
||||
print(f"Found Updated IP: {updated_ip}, Update Status: {update_status}")
|
||||
|
||||
# Check if the updated IP matches and the state is "Success"
|
||||
if updated_ip == expected_ip and update_status == "Success":
|
||||
print("DCU update verified successfully!")
|
||||
return updated_ip, update_status
|
||||
|
||||
# Retry only if the expected data is not yet as desired
|
||||
time.sleep(5 * (attempt + 1))
|
||||
|
||||
except TimeoutException:
|
||||
print("Timeout while waiting for the Running State or information container.")
|
||||
except NoSuchElementException as e:
|
||||
print(f"Error locating elements: {e}")
|
||||
|
||||
# If the loop exits without success
|
||||
raise Exception(f"Failed to verify DCU update after {retries} retries.")
|
||||
|
||||
|
||||
def update_dcu_ip(excel_file, log_file):
|
||||
# Load the Excel file
|
||||
wb = openpyxl.load_workbook(excel_file)
|
||||
sheet = wb.active
|
||||
|
||||
# Set up Chrome WebDriver
|
||||
chrome_options = Options()
|
||||
chrome_options.binary_location = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" # Path to Chrome binary
|
||||
chrome_options.add_argument("--disable-gpu")
|
||||
chrome_options.add_argument("--no-sandbox")
|
||||
chrome_options.add_argument("--disable-dev-shm-usage")
|
||||
|
||||
driver_path = "/Users/macos/Documents/SINDIGILIVE/CLIENTS/ICON+/Project-HES/Update_DCU/chromedriver/chromedriver" # Path to ChromeDriver binary
|
||||
|
||||
try:
|
||||
driver = webdriver.Chrome(service=Service(driver_path), options=chrome_options)
|
||||
except Exception as e:
|
||||
print(f"Error initializing WebDriver: {e}")
|
||||
return
|
||||
|
||||
# Open log file for writing
|
||||
with open(log_file, "w") as log:
|
||||
log.write("DCU IP,Updated IP,Update Status\n")
|
||||
|
||||
# Loop through each DCU IP in the Excel file
|
||||
for row in range(2, sheet.max_row + 1): # Start from row 2
|
||||
dcu_ip = sheet.cell(row=row, column=5).value.strip('="') # Column E contains DCU IPs
|
||||
print(f"Processing DCU IP: {dcu_ip}")
|
||||
|
||||
# Create the SSH tunnel
|
||||
ssh_password = "Callysta_icon2024!" # Replace with actual password
|
||||
ssh_process = create_ssh_tunnel(dcu_ip, ssh_password=ssh_password)
|
||||
|
||||
try:
|
||||
# Access the DCU web application
|
||||
driver.get("http://localhost:8888")
|
||||
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))
|
||||
|
||||
# Login section
|
||||
driver.find_element(By.ID, "username").send_keys("admin")
|
||||
driver.find_element(By.ID, "password").send_keys("jh1296")
|
||||
driver.find_element(By.ID, "submit_btn").click()
|
||||
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "parameter-setting")))
|
||||
|
||||
# Navigate to Parameter Setting
|
||||
driver.find_element(By.ID, "parameter-setting").click()
|
||||
|
||||
# Handle iframe if necessary
|
||||
iframes = driver.find_elements(By.TAG_NAME, "iframe")
|
||||
if iframes:
|
||||
driver.switch_to.frame(iframes[0]) # Adjust index based on iframe structure
|
||||
|
||||
# Update the MDC IP
|
||||
new_ip = "10.232.107.250:9032" # Replace this with the new IP and port you want to set
|
||||
|
||||
# Wait for the input field to become visible and interactable
|
||||
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "main_ip")))
|
||||
ip_field = driver.find_element(By.ID, "main_ip")
|
||||
|
||||
# Retry clearing the field
|
||||
for _ in range(3):
|
||||
ip_field.clear()
|
||||
if not ip_field.get_attribute("value").strip():
|
||||
break
|
||||
time.sleep(1)
|
||||
else:
|
||||
raise Exception("Failed to clear the IP field!")
|
||||
|
||||
# Enter the new IP and submit
|
||||
ip_field.send_keys(new_ip)
|
||||
driver.find_element(By.ID, "main_host_submit").click()
|
||||
|
||||
time.sleep(3) # Wait for changes to take effect
|
||||
|
||||
# Verify the changes with retry logic
|
||||
updated_ip, update_status = verify_dcu_update(driver, expected_ip=new_ip)
|
||||
|
||||
# Log the result
|
||||
log.write(f"{dcu_ip},{updated_ip},{update_status}\n")
|
||||
|
||||
except TimeoutException as e:
|
||||
print(f"Timeout error for DCU IP {dcu_ip}: {e}")
|
||||
log.write(f"{dcu_ip},ERROR,Timeout\n")
|
||||
except Exception as e:
|
||||
print(f"Error processing DCU IP {dcu_ip}: {e}")
|
||||
log.write(f"{dcu_ip},ERROR,{str(e)}\n")
|
||||
|
||||
finally:
|
||||
# Close the SSH tunnel
|
||||
if ssh_process.isalive():
|
||||
ssh_process.terminate()
|
||||
|
||||
# Close the driver
|
||||
driver.quit()
|
||||
|
||||
# Main function
|
||||
if __name__ == "__main__":
|
||||
excel_file = Path("/Users/macos/Documents/SINDIGILIVE/CLIENTS/ICON+/Project-HES/Update_DCU/DCU-LIST.xlsx") # Replace with the path to your Excel file
|
||||
log_file = Path("/Users/macos/Documents/SINDIGILIVE/CLIENTS/ICON+/Project-HES/Update_DCU/update_log.csv") # Replace with the desired path for your log file
|
||||
update_dcu_ip(excel_file, log_file)
|
Loading…
x
Reference in New Issue
Block a user