forked from louislam/uptime-kuma
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feature: remote browser support (louislam#3904)
* [empty commit] pull request for remote browser support * Remote browser: Added UI screens and DB tables. * Remote browser working * Fixing tests * Fix tests * Fix tests * fix tests * Test browser * revert init_db.js * Changed drop down to ActionSelect * Fix translations * added remote browsers toggle * revert changes package-lock * Fix bad english * Set default remote browser * Remote browsers Requested changes * fixed description.
- Loading branch information
1 parent
0294118
commit 6278000
Showing
15 changed files
with
579 additions
and
7 deletions.
There are no files selected for viewing
21 changes: 21 additions & 0 deletions
21
db/knex_migrations/2023-10-16-0000-create-remote-browsers.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
exports.up = function (knex) { | ||
return knex.schema | ||
.createTable("remote_browser", function (table) { | ||
table.increments("id"); | ||
table.string("name", 255).notNullable(); | ||
table.string("url", 255).notNullable(); | ||
table.integer("user_id").unsigned(); | ||
}).alterTable("monitor", function (table) { | ||
// Add new column monitor.remote_browser | ||
table.integer("remote_browser").nullable().defaultTo(null).unsigned() | ||
.index() | ||
.references("id") | ||
.inTable("remote_browser"); | ||
}); | ||
}; | ||
|
||
exports.down = function (knex) { | ||
return knex.schema.dropTable("remote_browser").alterTable("monitor", function (table) { | ||
table.dropColumn("remote_browser"); | ||
}); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
const { BeanModel } = require("redbean-node/dist/bean-model"); | ||
|
||
class RemoteBrowser extends BeanModel { | ||
/** | ||
* Returns an object that ready to parse to JSON | ||
* @returns {object} Object ready to parse | ||
*/ | ||
toJSON() { | ||
return { | ||
id: this.id, | ||
url: this.url, | ||
name: this.name, | ||
}; | ||
} | ||
} | ||
|
||
module.exports = RemoteBrowser; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
const { R } = require("redbean-node"); | ||
const { testRemoteBrowser } = require("./monitor-types/real-browser-monitor-type.js"); | ||
class RemoteBrowser { | ||
|
||
/** | ||
* Gets remote browser from ID | ||
* @param {number} remoteBrowserID ID of the remote browser | ||
* @param {number} userID ID of the user who created the remote browser | ||
* @returns {Promise<Bean>} Remote Browser | ||
*/ | ||
static async get(remoteBrowserID, userID) { | ||
let bean = await R.findOne("remote_browser", " id = ? AND user_id = ? ", [ remoteBrowserID, userID ]); | ||
|
||
if (!bean) { | ||
throw new Error("Remote browser not found"); | ||
} | ||
|
||
return bean; | ||
} | ||
|
||
/** | ||
* Save a Remote Browser | ||
* @param {object} remoteBrowser Remote Browser to save | ||
* @param {?number} remoteBrowserID ID of the Remote Browser to update | ||
* @param {number} userID ID of the user who adds the Remote Browser | ||
* @returns {Promise<Bean>} Updated Remote Browser | ||
*/ | ||
static async save(remoteBrowser, remoteBrowserID, userID) { | ||
let bean; | ||
|
||
if (remoteBrowserID) { | ||
bean = await R.findOne("remote_browser", " id = ? AND user_id = ? ", [ remoteBrowserID, userID ]); | ||
|
||
if (!bean) { | ||
throw new Error("Remote browser not found"); | ||
} | ||
|
||
} else { | ||
bean = R.dispense("remote_browser"); | ||
} | ||
|
||
bean.user_id = userID; | ||
bean.name = remoteBrowser.name; | ||
bean.url = remoteBrowser.url; | ||
|
||
await R.store(bean); | ||
|
||
return bean; | ||
} | ||
|
||
/** | ||
* Delete a Remote Browser | ||
* @param {number} remoteBrowserID ID of the Remote Browser to delete | ||
* @param {number} userID ID of the user who created the Remote Browser | ||
* @returns {Promise<void>} | ||
*/ | ||
static async delete(remoteBrowserID, userID) { | ||
let bean = await R.findOne("remote_browser", " id = ? AND user_id = ? ", [ remoteBrowserID, userID ]); | ||
|
||
if (!bean) { | ||
throw new Error("Remote Browser not found"); | ||
} | ||
|
||
// Delete removed remote browser from monitors if exists | ||
await R.exec("UPDATE monitor SET remote_browser = null WHERE remote_browser = ?", [ remoteBrowserID ]); | ||
|
||
await R.trash(bean); | ||
} | ||
|
||
/** | ||
* Tests the connection to Remote Browser | ||
* @param {object} remoteBrowser Docker host to check for | ||
* @returns {boolean} Returns if connection worked | ||
*/ | ||
static async test(remoteBrowser) { | ||
const testResult = await testRemoteBrowser(remoteBrowser.id, remoteBrowser.user_id); | ||
return testResult; | ||
} | ||
|
||
} | ||
|
||
module.exports = { | ||
RemoteBrowser, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
const { sendRemoteBrowserList } = require("../client"); | ||
const { checkLogin } = require("../util-server"); | ||
const { RemoteBrowser } = require("../remote-browser"); | ||
|
||
const { log } = require("../../src/util"); | ||
const { testRemoteBrowser } = require("../monitor-types/real-browser-monitor-type"); | ||
|
||
/** | ||
* Handlers for docker hosts | ||
* @param {Socket} socket Socket.io instance | ||
* @returns {void} | ||
*/ | ||
module.exports.remoteBrowserSocketHandler = (socket) => { | ||
socket.on("addRemoteBrowser", async (remoteBrowser, remoteBrowserID, callback) => { | ||
try { | ||
checkLogin(socket); | ||
|
||
let remoteBrowserBean = await RemoteBrowser.save(remoteBrowser, remoteBrowserID, socket.userID); | ||
await sendRemoteBrowserList(socket); | ||
|
||
callback({ | ||
ok: true, | ||
msg: "Saved.", | ||
msgi18n: true, | ||
id: remoteBrowserBean.id, | ||
}); | ||
|
||
} catch (e) { | ||
callback({ | ||
ok: false, | ||
msg: e.message, | ||
}); | ||
} | ||
}); | ||
|
||
socket.on("deleteRemoteBrowser", async (dockerHostID, callback) => { | ||
try { | ||
checkLogin(socket); | ||
|
||
await RemoteBrowser.delete(dockerHostID, socket.userID); | ||
await sendRemoteBrowserList(socket); | ||
|
||
callback({ | ||
ok: true, | ||
msg: "successDeleted", | ||
msgi18n: true, | ||
}); | ||
|
||
} catch (e) { | ||
callback({ | ||
ok: false, | ||
msg: e.message, | ||
}); | ||
} | ||
}); | ||
|
||
socket.on("testRemoteBrowser", async (remoteBrowser, callback) => { | ||
try { | ||
checkLogin(socket); | ||
let check = await testRemoteBrowser(remoteBrowser.url); | ||
log.info("remoteBrowser", "Tested remote browser: " + check); | ||
let msg; | ||
|
||
if (check) { | ||
msg = "Connected Successfully."; | ||
} | ||
|
||
callback({ | ||
ok: true, | ||
msg, | ||
}); | ||
|
||
} catch (e) { | ||
log.error("remoteBrowser", e); | ||
|
||
callback({ | ||
ok: false, | ||
msg: e.message, | ||
}); | ||
} | ||
}); | ||
}; |
Oops, something went wrong.