2020-04-22 19:31:53 +02:00
|
|
|
#!/usr/bin/env python
|
2020-04-22 19:50:09 +02:00
|
|
|
|
2020-04-22 19:48:20 +02:00
|
|
|
import os
|
2020-04-22 19:31:53 +02:00
|
|
|
import time
|
|
|
|
import logging
|
|
|
|
|
|
|
|
from selenium import webdriver
|
2020-04-23 14:27:07 +02:00
|
|
|
from pyvirtualdisplay import Display
|
|
|
|
|
|
|
|
logger = logging.getLogger(__file__)
|
2020-04-22 19:31:53 +02:00
|
|
|
|
2020-12-18 23:55:25 +01:00
|
|
|
class DomainNotFoundError(Exception):
|
|
|
|
pass
|
|
|
|
|
2020-04-22 19:31:53 +02:00
|
|
|
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')
|
2020-04-22 19:48:20 +02:00
|
|
|
driver.find_element_by_name('username').send_keys(os.environ.get('HpLogin'))
|
|
|
|
driver.find_element_by_name('password').send_keys(os.environ.get('HpPass'))
|
2020-04-22 19:31:53 +02:00
|
|
|
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')
|
2020-12-18 23:55:25 +01:00
|
|
|
|
|
|
|
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.')
|
2020-04-22 19:31:53 +02:00
|
|
|
|
|
|
|
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')
|
2020-04-23 14:27:07 +02:00
|
|
|
|
|
|
|
# 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..')
|
2020-04-22 19:31:53 +02:00
|
|
|
|
2020-04-23 14:27:07 +02:00
|
|
|
self._login(driver)
|
2020-12-18 23:55:25 +01:00
|
|
|
try:
|
|
|
|
self._updateARecord(driver, ip)
|
|
|
|
except DomainNotFoundError as e:
|
|
|
|
logging.error(e)
|
2020-04-22 19:31:53 +02:00
|
|
|
|
2020-04-23 14:27:07 +02:00
|
|
|
driver.quit()
|
|
|
|
display.stop()
|