154 lines
4.2 KiB
JavaScript
154 lines
4.2 KiB
JavaScript
|
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,
|
||
|
};
|