#!/usr/bin/env python import os import time import logging from selenium import webdriver from pyvirtualdisplay import Display logger = logging.getLogger(__file__) class DomainNotFoundError(Exception): pass class HpUpdater(): def __init__(self): logger.debug('Initiating HpUpdater') def _login(self, driver): logger.debug('login called') driver.get('https://admin.hostpoint.ch/customer/Auth/Login') driver.find_element_by_name('username').send_keys(os.environ.get('HpLogin')) driver.find_element_by_name('password').send_keys(os.environ.get('HpPass')) driver.find_element_by_name('login').click() def _updateARecord(self, driver, ip): logger.debug('updateARecord called') driver.get('https://admin.hostpoint.ch/customer/Domains/Overview') domainTableRows = driver.find_elements_by_class_name('b-table__body-row') for row in domainTableRows: if os.environ.get('Domain') == row.find_element_by_class_name('domain-name-value').get_attribute('value'): row.find_element_by_name('edit_dns').click() logger.debug('domain found') break else: raise DomainNotFoundError(f'Domain {os.environ.get("Domain")} can not be found in domain list.') driver.implicitly_wait(10) tableRows = driver.find_element_by_id('dns-record-list').find_elements_by_class_name('b-record') # The last two entries are my A records for e in tableRows[-2:]: try: e.find_element_by_name('edit').click() # For some reason with each iteration it return one more such element editForm = driver.find_elements_by_class_name('dns-record-list-edit') editForm[-1].find_element_by_name('ip_address').clear() editForm[-1].find_element_by_name('ip_address').send_keys(ip) editForm[-1].find_element_by_name('apply').click() except Exception as e: logger.error(f'Exception during update: {str(e)}') logger.info(f'Changed A records ip to {ip}') try: e = driver.find_element_by_name('execute_now') driver.execute_script("arguments[0].click();", e) # Give the site some time to save time.sleep(10) logger.info('Successfully saved changes') except Exception as e: logger.error(f'Exception during save: {str(e)}') def update(self, ip): logger.info('Start Hostpoint Record update') # Thanks to https://github.com/dimmg/dockselpy # Display is only used for firefox to run properly display = Display(visible=0, size=(800, 600)) display.start() logging.info('Initialized virtual display..') firefox_profile = webdriver.FirefoxProfile() firefox_profile.set_preference('browser.download.folderList', 2) firefox_profile.set_preference('browser.download.manager.showWhenStarting', False) firefox_profile.set_preference('browser.download.dir', os.getcwd()) firefox_profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'text/csv') logging.info('Prepared firefox profile..') driver = webdriver.Firefox(firefox_profile=firefox_profile) logging.info('Initialized firefox browser..') self._login(driver) try: self._updateARecord(driver, ip) except DomainNotFoundError as e: logging.error(e) driver.quit() display.stop()