const logger = require("./logger.js"); const timediff = require("./timediff.js"); const selenium = require("selenium-webdriver"); const firefox = require("selenium-webdriver/firefox"); let webdriver; let defaultTimeout; let rebootTimeout; async function initializeDriver() { logger.debug("initializing the webdriver..."); defaultTimeout = global.config.timeouts.webui; rebootTimeout = global.config.timeouts.reboot; let seleniumUrl = global.config.selenium; if (!seleniumUrl.endsWith("/")) { seleniumUrl += "/"; } webdriver = await new selenium.Builder() .forBrowser(selenium.Browser.FIREFOX) .usingServer(seleniumUrl + "wd/hub") .setFirefoxOptions( new firefox.Options().addArguments( "--headless", "--private", "--purgecaches" ) ) .withCapabilities( selenium.Capabilities.firefox().set("acceptInsecureCerts", true) ) .build(); await webdriver .manage() .setTimeouts({ // implicit: defaultTimeout, pageLoad: defaultTimeout, // script: defaultTimeout, }); logger.debug("webdriver was successfully initialized!"); } async function login() { logger.debug("opening url '" + global.config.fritzbox.url + "'..."); await webdriver.get(global.config.fritzbox.url); logger.debug("entering credentials..."); try { const selection = new selenium.Select( await webdriver.findElement(selenium.By.id("uiViewUser")) ); await selection.selectByValue(global.config.fritzbox.user); logger.debug("set specified username"); } catch (ignored) {} await webdriver .findElement(selenium.By.id("uiPass")) .sendKeys(global.config.fritzbox.password, selenium.Key.RETURN); logger.debug("set specified password"); logger.info("logging in..."); } async function reboot() { logger.info("initializing reboot..."); try { await initializeDriver(); await login(); await clickElementById("sys"); await clickElementById("mSave"); await clickElementById("reboot"); await clickElementByName("reboot"); await webdriver .wait( selenium.until.elementLocated(selenium.By.className("waitimg")), defaultTimeout ) .then(function () { logger.debug("reboot has been initiated via web ui"); }); await webdriver .wait( selenium.until.elementLocated(selenium.By.className("waitimg")), defaultTimeout ) .then(function () { logger.info("fritzbox is rebooting now..."); }); const timestamp = Date.now(); await webdriver .wait( selenium.until.elementLocated(selenium.By.id("loginForm")), rebootTimeout ) .then(function () { logger.info( "fritzbox has been successfully rebooted after " + timediff.inSeconds(timestamp) + " seconds!" ); }); } catch (err) { logger.error("encountered an error executing the reboot (" + err + ")"); return err; } finally { await quit(); } } async function clickElementById(element) { if (element === undefined || element.length === 0) { return; } logger.debug("waiting for element with id '" + element + "'..."); await webdriver.wait( selenium.until.elementLocated(selenium.By.id(element)), defaultTimeout ); logger.debug("clicking on element with id '" + element + "'..."); await webdriver.findElement(selenium.By.id(element)).click(); } async function clickElementByName(element) { if (element === undefined || element.length === 0) { return; } logger.debug("waiting for element with name '" + element + "'..."); await webdriver.wait( selenium.until.elementLocated(selenium.By.name(element)), defaultTimeout ); logger.debug("clicking on element with name '" + element + "'..."); await webdriver.findElement(selenium.By.name(element)).click(); } async function quit() { if (webdriver === undefined) { return; } try { logger.debug("closing the webdriver..."); webdriver.quit(); logger.debug("webdriver was successfully closed!"); webdriver = undefined; } catch (err) { logger.error("encountered an error closing the webdriver (" + err + ")"); } } // exports module.exports = { reboot, quit, };