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