fritzfix/libs/fritzbox.js
2024-06-12 10:26:04 +02:00

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,
};