mirror of
https://github.com/swissmakers/wireguard-manager.git
synced 2026-04-01 08:47:07 +02:00
Remove non-sense wake-on-lan features from the VPN-Manager
This commit is contained in:
@@ -1,210 +0,0 @@
|
||||
var base_url = jQuery(".brand-link").attr('href');
|
||||
if (base_url.substring(base_url.length - 1, base_url.length) != "/")
|
||||
base_url = base_url + "/";
|
||||
|
||||
|
||||
const wake_on_lan_new_template = '<div class="col-sm-4" id="{{ .Id }}">\n' +
|
||||
'\t<div class="info-box">\n' +
|
||||
'\t\t<div class="info-box-content">\n' +
|
||||
'\t\t\t<div class="btn-group">\n' +
|
||||
'\t\t\t\t<button type="button" class="btn btn-outline-success btn-sm"\n' +
|
||||
'\t\t\t\t\t\tdata-mac-address="{{ .MacAddress }}">Wake On\n' +
|
||||
'\t\t\t\t</button>\n' +
|
||||
'\t\t\t\t<button type="button"\n' +
|
||||
'\t\t\t\t\t\tclass="btn btn-outline-primary btn-sm btn_modify_wake_on_lan_host"\n' +
|
||||
'\t\t\t\t\t\tdata-toggle="modal" data-target="#modal_wake_on_lan_host"\n' +
|
||||
'\t\t\t\t\t\tdata-name="{{ .Name }}" data-mac-address="{{ .MacAddress }}">Edit\n' +
|
||||
'\t\t\t\t</button>\n' +
|
||||
'\t\t\t\t<button type="button" class="btn btn-outline-danger btn-sm" data-toggle="modal"\n' +
|
||||
'\t\t\t\t\t\tdata-target="#modal_remove_wake_on_lan_host"\n' +
|
||||
'\t\t\t\t\t\tdata-mac-address="{{ .MacAddress }}">Remove\n' +
|
||||
'\t\t\t\t</button>\n' +
|
||||
'\t\t\t</div>\n' +
|
||||
'\t\t\t<hr>\n' +
|
||||
'\t\t\t<span class="info-box-text"><i class="fas fa-address-card"></i> <span class="name">{{ .Name }}</span></span>\n' +
|
||||
'\t\t\t<span class="info-box-text"><i class="fas fa-ethernet"></i> <span class="mac-address">{{ .MacAddress }}</span></span>\n' +
|
||||
'\t\t\t<span class="info-box-text"><i class="fas fa-clock"></i> <span class="latest-used">Unused</span></span>\n' +
|
||||
'\t\t</div>\n' +
|
||||
'\t</div>\n' +
|
||||
'</div>';
|
||||
|
||||
jQuery(function ($) {
|
||||
$.validator.addMethod('mac', function (value, element) {
|
||||
return this.optional(element) || /^([0-9A-F]{2}[:]){5}([0-9A-F]{2})$/.test(value);
|
||||
}, 'Please enter a valid MAC Address.(uppercase letters and numbers, : only) ex: 00:AB:12:EF:DD:AA');
|
||||
});
|
||||
|
||||
jQuery.each(["put", "delete"], function (i, method) {
|
||||
jQuery[method] = function (url, data, callback, type) {
|
||||
if (jQuery.isFunction(data)) {
|
||||
type = type || callback;
|
||||
callback = data;
|
||||
data = undefined;
|
||||
}
|
||||
|
||||
return jQuery.ajax({
|
||||
url: url,
|
||||
type: method,
|
||||
dataType: type,
|
||||
data: data,
|
||||
success: callback,
|
||||
contentType: 'application/json'
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
jQuery(function ($) {
|
||||
let newHostHtml = '<div class="col-sm-2 offset-md-4" style=" text-align: right;"><button style="" id="btn_new_wake_on_lan_host" type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#modal_wake_on_lan_host"><i class="nav-icon fas fa-plus"></i> New Host</button></div>';
|
||||
$('h1').parents(".row").append(newHostHtml);
|
||||
});
|
||||
|
||||
jQuery(function ($) {
|
||||
$('.btn-outline-success').click(function () {
|
||||
const $this = $(this);
|
||||
$.put(base_url + 'wake_on_lan_host/' + $this.data('mac-address'), function (result) {
|
||||
$this.parents('.info-box').find('.latest-used').text(prettyDateTime(result));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
jQuery(function ($) {
|
||||
let $modal_remove_wake_on_lan_host = $('#modal_remove_wake_on_lan_host');
|
||||
let $remove_client_confirm = $('#remove_wake_on_host_confirm');
|
||||
|
||||
$modal_remove_wake_on_lan_host.on('show.bs.modal', function (event) {
|
||||
const $btn = $(event.relatedTarget);
|
||||
const $modal = $(this);
|
||||
|
||||
const $editBtn = $btn.parents('.btn-group').find('.btn_modify_wake_on_lan_host');
|
||||
$modal.find('.modal-body').text("You are about to remove Wake On Lan Host " + $editBtn.data('name'));
|
||||
$remove_client_confirm.val($editBtn.data('mac-address'));
|
||||
})
|
||||
|
||||
$remove_client_confirm.click(function () {
|
||||
const macAddress = $remove_client_confirm.val().replaceAll(":", "-");
|
||||
$.delete(base_url + 'wake_on_lan_host/' + macAddress);
|
||||
$('#' + macAddress).remove();
|
||||
|
||||
$modal_remove_wake_on_lan_host.modal('hide');
|
||||
});
|
||||
});
|
||||
|
||||
jQuery(function ($) {
|
||||
$('.latest-used').each(function () {
|
||||
const $this = $(this);
|
||||
const timeText = $this.text().trim();
|
||||
try {
|
||||
if (timeText != "Unused") {
|
||||
$this.text(prettyDateTime(timeText));
|
||||
}
|
||||
} catch (ex) {
|
||||
console.log(timeText);
|
||||
throw ex;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
jQuery(function ($) {
|
||||
let $modal_wake_on_lan_host = $("#modal_wake_on_lan_host");
|
||||
let $name = $('#frm_wake_on_lan_host_name');
|
||||
let $macAddress = $('#frm_wake_on_lan_host_mac_address');
|
||||
let $oldMacAddress = $('#frm_wake_on_lan_host_old_mac_address');
|
||||
let $contentRow = $('.content .row');
|
||||
let $frm_wake_on_lan_host = $("#frm_wake_on_lan_host");
|
||||
|
||||
// https://jqueryvalidation.org/
|
||||
let validator = $frm_wake_on_lan_host.validate({
|
||||
submitHandler: function () {
|
||||
let data = {
|
||||
name: $name.val(),
|
||||
mac_address: $macAddress.val().toUpperCase(),
|
||||
old_mac_address: $oldMacAddress.val().toUpperCase()
|
||||
};
|
||||
$.ajax({
|
||||
cache: false,
|
||||
method: 'POST',
|
||||
url: base_url + 'wake_on_lan_host',
|
||||
dataType: 'json',
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(data),
|
||||
success: function (response) {
|
||||
/** @type {string} */
|
||||
let oldMacAddress = $oldMacAddress.val().toUpperCase();
|
||||
|
||||
if (oldMacAddress != '') {
|
||||
let macAddress = response.MacAddress;
|
||||
let name = response.Name;
|
||||
|
||||
let $container = $('#' + oldMacAddress.replaceAll(":", "-"));
|
||||
if (macAddress != oldMacAddress) {
|
||||
$container.attr('id', macAddress.replaceAll(":", "-"));
|
||||
$container.find('.mac-address').text(macAddress);
|
||||
$container.find('[data-mac-address]').data('mac-address', macAddress);
|
||||
}
|
||||
|
||||
$container.find('.name').text(name);
|
||||
$container.find('[data-name]').data('name', name);
|
||||
} else {
|
||||
const $template = $(
|
||||
wake_on_lan_new_template
|
||||
.replace(/{{ .Id }}/g, response.MacAddress.replaceAll(":", "-").toUpperCase())
|
||||
.replace(/{{ .MacAddress }}/g, response.MacAddress.toUpperCase())
|
||||
.replace(/{{ .Name }}/g, response.Name)
|
||||
);
|
||||
|
||||
$contentRow.append($template);
|
||||
}
|
||||
$modal_wake_on_lan_host.modal('hide');
|
||||
toastr.success('Wake on Lan Host Save successfully');
|
||||
},
|
||||
error: function (jqXHR, exception) {
|
||||
const responseJson = jQuery.parseJSON(jqXHR.responseText);
|
||||
toastr.error(responseJson['message']);
|
||||
|
||||
if (typeof (console) != 'undefined')
|
||||
console.log(exception);
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
},
|
||||
rules: {
|
||||
name: {
|
||||
required: true,
|
||||
},
|
||||
mac_address: {
|
||||
required: true,
|
||||
mac: true,
|
||||
}
|
||||
},
|
||||
messages: {
|
||||
name: {
|
||||
required: "Please enter a name"
|
||||
},
|
||||
mac_address: {
|
||||
required: "Please enter a Mac Address"
|
||||
}
|
||||
},
|
||||
errorElement: 'span',
|
||||
errorPlacement: function (error, element) {
|
||||
error.addClass('invalid-feedback');
|
||||
element.closest('.form-group').append(error);
|
||||
},
|
||||
highlight: function (element) {
|
||||
$(element).addClass('is-invalid');
|
||||
},
|
||||
unhighlight: function (element) {
|
||||
$(element).removeClass('is-invalid');
|
||||
}
|
||||
});
|
||||
|
||||
$modal_wake_on_lan_host.on('show.bs.modal', function (e) {
|
||||
const $btn = $(e.relatedTarget);
|
||||
validator.resetForm();
|
||||
$macAddress.removeClass('is-invalid');
|
||||
|
||||
$name.val($btn.data('name'));
|
||||
$macAddress.val($btn.data('mac-address'));
|
||||
$oldMacAddress.val($btn.data('mac-address'));
|
||||
});
|
||||
});
|
||||
@@ -1,176 +0,0 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/labstack/gommon/log"
|
||||
"github.com/sabhiram/go-wol/wol"
|
||||
"github.com/swissmakers/wireguard-manager/model"
|
||||
"github.com/swissmakers/wireguard-manager/store"
|
||||
)
|
||||
|
||||
type WakeOnLanHostSavePayload struct {
|
||||
Name string `json:"name"`
|
||||
MacAddress string `json:"mac_address"`
|
||||
OldMacAddress string `json:"old_mac_address"`
|
||||
}
|
||||
|
||||
func createError(c echo.Context, err error, msg string) error {
|
||||
log.Error(msg, err)
|
||||
return c.JSON(
|
||||
http.StatusInternalServerError,
|
||||
jsonHTTPResponse{
|
||||
false,
|
||||
msg})
|
||||
}
|
||||
|
||||
func GetWakeOnLanHosts(db store.IStore) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
var err error
|
||||
|
||||
hosts, err := db.GetWakeOnLanHosts()
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("wake_on_lan_hosts database error: %s", err))
|
||||
}
|
||||
|
||||
err = c.Render(http.StatusOK, "wake_on_lan_hosts.html", map[string]interface{}{
|
||||
"baseData": model.BaseData{Active: "wake_on_lan_hosts", CurrentUser: currentUser(c), Admin: isAdmin(c)},
|
||||
"hosts": hosts,
|
||||
"error": "",
|
||||
})
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("wake_on_lan_hosts.html render error: %s", err))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func SaveWakeOnLanHost(db store.IStore) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
var payload WakeOnLanHostSavePayload
|
||||
err := c.Bind(&payload)
|
||||
if err != nil {
|
||||
log.Error("Wake On Host Save Payload Bind Error: ", err)
|
||||
return c.JSON(http.StatusInternalServerError, payload)
|
||||
}
|
||||
|
||||
var host = model.WakeOnLanHost{
|
||||
MacAddress: payload.MacAddress,
|
||||
Name: payload.Name,
|
||||
}
|
||||
if len(payload.OldMacAddress) != 0 { // Edit
|
||||
if payload.OldMacAddress != payload.MacAddress { // modified mac address
|
||||
oldHost, err := db.GetWakeOnLanHost(payload.OldMacAddress)
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("Wake On Host Update Err: %s", err))
|
||||
}
|
||||
|
||||
if payload.OldMacAddress != payload.MacAddress {
|
||||
existHost, _ := db.GetWakeOnLanHost(payload.MacAddress)
|
||||
if existHost != nil {
|
||||
return createError(c, nil, "Mac Address already exists.")
|
||||
}
|
||||
}
|
||||
|
||||
err = db.DeleteWakeOnHostLanHost(payload.OldMacAddress)
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("Wake On Host Update Err: %s", err))
|
||||
}
|
||||
host.LatestUsed = oldHost.LatestUsed
|
||||
}
|
||||
err = db.SaveWakeOnLanHost(host)
|
||||
} else { // new
|
||||
existHost, _ := db.GetWakeOnLanHost(payload.MacAddress)
|
||||
if existHost != nil {
|
||||
return createError(c, nil, "Mac Address already exists.")
|
||||
}
|
||||
|
||||
err = db.SaveWakeOnLanHost(host)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("Wake On Host Save Error: %s", err))
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, host)
|
||||
}
|
||||
}
|
||||
|
||||
func DeleteWakeOnHost(db store.IStore) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
var macAddress = c.Param("mac_address")
|
||||
var host, err = db.GetWakeOnLanHost(macAddress)
|
||||
|
||||
if err != nil {
|
||||
log.Error("Wake On Host Delete Error: ", err)
|
||||
return createError(c, err, fmt.Sprintf("Wake On Host Delete Error: %s", macAddress))
|
||||
}
|
||||
|
||||
err = db.DeleteWakeOnHost(*host)
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("Wake On Host Delete Error: %s", macAddress))
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, nil)
|
||||
}
|
||||
}
|
||||
|
||||
func WakeOnHost(db store.IStore) echo.HandlerFunc {
|
||||
return func(c echo.Context) error {
|
||||
macAddress := c.Param("mac_address")
|
||||
host, err := db.GetWakeOnLanHost(macAddress)
|
||||
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("Error: %s", macAddress))
|
||||
}
|
||||
|
||||
now := time.Now().UTC()
|
||||
host.LatestUsed = &now
|
||||
err = db.SaveWakeOnLanHost(*host)
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("Latest Used Update Error: %s", macAddress))
|
||||
}
|
||||
|
||||
magicPacket, err := wol.New(macAddress)
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("Magic Packet Create Error: %s", macAddress))
|
||||
}
|
||||
|
||||
bytes, err := magicPacket.Marshal()
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("Magic Packet Bytestream Error: %s", macAddress))
|
||||
}
|
||||
|
||||
udpAddr, err := net.ResolveUDPAddr("udp", "255.255.255.255:0")
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("ResolveUDPAddr Error: %s", macAddress))
|
||||
}
|
||||
|
||||
// Grab a UDP connection to send our packet of bytes.
|
||||
conn, err := net.DialUDP("udp", nil, udpAddr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func(conn *net.UDPConn) {
|
||||
err := conn.Close()
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
}(conn)
|
||||
|
||||
n, err := conn.Write(bytes)
|
||||
if err == nil && n != 102 {
|
||||
return createError(c, nil, fmt.Sprintf("magic packet sent was %d bytes (expected 102 bytes sent)", n))
|
||||
}
|
||||
if err != nil {
|
||||
return createError(c, err, fmt.Sprintf("Network Send Error: %s", macAddress))
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusOK, host.LatestUsed)
|
||||
}
|
||||
}
|
||||
4
main.go
4
main.go
@@ -247,10 +247,6 @@ func main() {
|
||||
app.GET(util.BasePath+"/api/subnet-ranges", handler.GetOrderedSubnetRanges(), handler.ValidSession)
|
||||
app.GET(util.BasePath+"/api/suggest-client-ips", handler.SuggestIPAllocation(db), handler.ValidSession)
|
||||
app.POST(util.BasePath+"/api/apply-wg-config", handler.ApplyServerConfig(db, tmplDir), handler.ValidSession, handler.ContentTypeJson)
|
||||
app.GET(util.BasePath+"/wake_on_lan_hosts", handler.GetWakeOnLanHosts(db), handler.ValidSession, handler.RefreshSession)
|
||||
app.POST(util.BasePath+"/wake_on_lan_host", handler.SaveWakeOnLanHost(db), handler.ValidSession, handler.ContentTypeJson)
|
||||
app.DELETE(util.BasePath+"/wake_on_lan_host/:mac_address", handler.DeleteWakeOnHost(db), handler.ValidSession, handler.ContentTypeJson)
|
||||
app.PUT(util.BasePath+"/wake_on_lan_host/:mac_address", handler.WakeOnHost(db), handler.ValidSession, handler.ContentTypeJson)
|
||||
|
||||
// strip the "assets/" prefix from the embedded directory so files can be called directly without the "assets/"
|
||||
// prefix
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type WakeOnLanHost struct {
|
||||
MacAddress string `json:"MacAddress"`
|
||||
Name string `json:"Name"`
|
||||
LatestUsed *time.Time `json:"LatestUsed"`
|
||||
}
|
||||
|
||||
func (host WakeOnLanHost) ResolveResourceName() (string, error) {
|
||||
resourceName := strings.Trim(host.MacAddress, " \t\r\n\000")
|
||||
if len(resourceName) == 0 {
|
||||
return "", errors.New("mac Address is Empty")
|
||||
}
|
||||
resourceName = strings.ToUpper(resourceName)
|
||||
resourceName = strings.ReplaceAll(resourceName, ":", "-")
|
||||
|
||||
if _, err := net.ParseMAC(resourceName); err != nil {
|
||||
return "", errors.New("invalid mac address")
|
||||
}
|
||||
|
||||
return resourceName, nil
|
||||
}
|
||||
|
||||
const WakeOnLanHostCollectionName = "wake_on_lan_hosts"
|
||||
@@ -101,11 +101,6 @@ func New(tmplDir fs.FS, extraData map[string]interface{}, secret [64]byte) *echo
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
tmplWakeOnLanHostsString, err := util.StringFromEmbedFile(tmplDir, "wake_on_lan_hosts.html")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// create template list
|
||||
funcs := template.FuncMap{
|
||||
"StringsJoin": strings.Join,
|
||||
@@ -118,7 +113,6 @@ func New(tmplDir fs.FS, extraData map[string]interface{}, secret [64]byte) *echo
|
||||
templates["global_settings.html"] = template.Must(template.New("global_settings").Funcs(funcs).Parse(tmplBaseString + tmplGlobalSettingsString))
|
||||
templates["users_settings.html"] = template.Must(template.New("users_settings").Funcs(funcs).Parse(tmplBaseString + tmplUsersSettingsString))
|
||||
templates["status.html"] = template.Must(template.New("status").Funcs(funcs).Parse(tmplBaseString + tmplStatusString))
|
||||
templates["wake_on_lan_hosts.html"] = template.Must(template.New("wake_on_lan_hosts").Funcs(funcs).Parse(tmplBaseString + tmplWakeOnLanHostsString))
|
||||
|
||||
lvl, err := util.ParseLogLevel(util.LookupEnvOrString(util.LogLevel, "INFO"))
|
||||
if err != nil {
|
||||
|
||||
@@ -38,7 +38,6 @@ func (o *JsonDB) Init() error {
|
||||
var clientPath = path.Join(o.dbPath, "clients")
|
||||
var serverPath = path.Join(o.dbPath, "server")
|
||||
var userPath = path.Join(o.dbPath, "users")
|
||||
var wakeOnLanHostsPath = path.Join(o.dbPath, "wake_on_lan_hosts")
|
||||
var serverInterfacePath = path.Join(serverPath, "interfaces.json")
|
||||
var serverKeyPairPath = path.Join(serverPath, "keypair.json")
|
||||
var globalSettingPath = path.Join(serverPath, "global_settings.json")
|
||||
@@ -54,9 +53,6 @@ func (o *JsonDB) Init() error {
|
||||
if _, err := os.Stat(userPath); os.IsNotExist(err) {
|
||||
os.MkdirAll(userPath, os.ModePerm)
|
||||
}
|
||||
if _, err := os.Stat(wakeOnLanHostsPath); os.IsNotExist(err) {
|
||||
os.MkdirAll(wakeOnLanHostsPath, os.ModePerm)
|
||||
}
|
||||
|
||||
// server's interface
|
||||
if _, err := os.Stat(serverInterfacePath); os.IsNotExist(err) {
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
package jsondb
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path"
|
||||
|
||||
"github.com/swissmakers/wireguard-manager/model"
|
||||
"github.com/swissmakers/wireguard-manager/util"
|
||||
)
|
||||
|
||||
func (o *JsonDB) GetWakeOnLanHosts() ([]model.WakeOnLanHost, error) {
|
||||
var hosts []model.WakeOnLanHost
|
||||
|
||||
// read all client json file in "hosts" directory
|
||||
records, err := o.conn.ReadAll(model.WakeOnLanHostCollectionName)
|
||||
if err != nil {
|
||||
return hosts, err
|
||||
}
|
||||
|
||||
// build the ClientData list
|
||||
for _, f := range records {
|
||||
host := model.WakeOnLanHost{}
|
||||
|
||||
// get client info
|
||||
if err := json.Unmarshal(f, &host); err != nil {
|
||||
return hosts, fmt.Errorf("cannot decode client json structure: %v", err)
|
||||
}
|
||||
|
||||
// create the list of hosts and their qrcode data
|
||||
hosts = append(hosts, host)
|
||||
}
|
||||
|
||||
return hosts, nil
|
||||
}
|
||||
|
||||
func (o *JsonDB) GetWakeOnLanHost(macAddress string) (*model.WakeOnLanHost, error) {
|
||||
host := &model.WakeOnLanHost{
|
||||
MacAddress: macAddress,
|
||||
}
|
||||
resourceName, err := host.ResolveResourceName()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = o.conn.Read(model.WakeOnLanHostCollectionName, resourceName, host)
|
||||
if err != nil {
|
||||
host = nil
|
||||
}
|
||||
return host, err
|
||||
}
|
||||
|
||||
func (o *JsonDB) DeleteWakeOnHostLanHost(macAddress string) error {
|
||||
host := &model.WakeOnLanHost{
|
||||
MacAddress: macAddress,
|
||||
}
|
||||
resourceName, err := host.ResolveResourceName()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return o.conn.Delete(model.WakeOnLanHostCollectionName, resourceName)
|
||||
}
|
||||
|
||||
func (o *JsonDB) SaveWakeOnLanHost(host model.WakeOnLanHost) error {
|
||||
resourceName, err := host.ResolveResourceName()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
wakeOnLanHostPath := path.Join(path.Join(o.dbPath, model.WakeOnLanHostCollectionName), resourceName+".json")
|
||||
output := o.conn.Write(model.WakeOnLanHostCollectionName, resourceName, host)
|
||||
err = util.ManagePerms(wakeOnLanHostPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
func (o *JsonDB) DeleteWakeOnHost(host model.WakeOnLanHost) error {
|
||||
resourceName, err := host.ResolveResourceName()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return o.conn.Delete(model.WakeOnLanHostCollectionName, resourceName)
|
||||
}
|
||||
@@ -19,11 +19,6 @@ type IStore interface {
|
||||
SaveServerInterface(serverInterface model.ServerInterface) error
|
||||
SaveServerKeyPair(serverKeyPair model.ServerKeypair) error
|
||||
SaveGlobalSettings(globalSettings model.GlobalSetting) error
|
||||
GetWakeOnLanHosts() ([]model.WakeOnLanHost, error)
|
||||
GetWakeOnLanHost(macAddress string) (*model.WakeOnLanHost, error)
|
||||
DeleteWakeOnHostLanHost(macAddress string) error
|
||||
SaveWakeOnLanHost(host model.WakeOnLanHost) error
|
||||
DeleteWakeOnHost(host model.WakeOnLanHost) error
|
||||
GetPath() string
|
||||
SaveHashes(hashes model.ClientServerHashes) error
|
||||
GetHashes() (model.ClientServerHashes, error)
|
||||
|
||||
@@ -164,14 +164,6 @@
|
||||
</p>
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="{{.basePath}}/wake_on_lan_hosts" class="nav-link {{if eq .baseData.Active "wake_on_lan_hosts" }}active{{end}}">
|
||||
<i class="nav-icon fas fa-solid fa-power-off"></i>
|
||||
<p>
|
||||
WoL Hosts
|
||||
</p>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
<!-- /.sidebar-menu -->
|
||||
|
||||
@@ -1,123 +0,0 @@
|
||||
{{define "title"}}
|
||||
Wake On Lan Hosts
|
||||
{{end}}
|
||||
|
||||
{{define "top_css"}}
|
||||
{{end}}
|
||||
|
||||
{{define "username"}}
|
||||
{{ .username }}
|
||||
{{end}}
|
||||
|
||||
{{define "page_title"}}
|
||||
Wake On Lan Hosts
|
||||
{{end}}
|
||||
|
||||
{{define "page_content"}}
|
||||
|
||||
<div class="modal fade" id="modal_wake_on_lan_host">
|
||||
<!-- MacAddress string `json:"MacAddress"`-->
|
||||
<!-- Name string `json:"Name"`-->
|
||||
<!-- LatestIPAddress string `json:"LatestIPAddress"`-->
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h4 class="modal-title">New Wake On Lan Host</h4>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<form name="frm_wake_on_lan_host" id="frm_wake_on_lan_host">
|
||||
<div class="modal-body">
|
||||
<input type="hidden" id="frm_wake_on_lan_host_old_mac_address" name="old_mac_address">
|
||||
<div class="form-group">
|
||||
<label for="frm_wake_on_lan_host_name" class="control-label">Name</label>
|
||||
<input type="text" class="form-control" id="frm_wake_on_lan_host_name" name="name">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="frm_wake_on_lan_host_mac_address" class="control-label">Mac Address</label>
|
||||
<input type="text" class="form-control" id="frm_wake_on_lan_host_mac_address"
|
||||
name="mac_address">
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer justify-content-between">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<!-- /.modal-content -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="modal_remove_wake_on_lan_host">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content bg-danger">
|
||||
<div class="modal-header">
|
||||
<h4 class="modal-title">Remove</h4>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
</div>
|
||||
<div class="modal-footer justify-content-between">
|
||||
<button type="button" class="btn btn-outline-dark" data-dismiss="modal">Cancel</button>
|
||||
<button type="button" class="btn btn-outline-dark" id="remove_wake_on_host_confirm">Apply</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.modal-content -->
|
||||
</div>
|
||||
<!-- /.modal-dialog -->
|
||||
</div>
|
||||
|
||||
<section class="content">
|
||||
<div class="container-fluid">
|
||||
{{ if .error }}
|
||||
<div class="alert alert-warning" role="alert">{{.error}}</div>
|
||||
{{ end}}
|
||||
|
||||
<div class="row">
|
||||
{{ range $idx, $host := .hosts }}
|
||||
{{- /*gotype: github.com/swissmakers/wireguard-manager/model.WakeOnLanHost*/ -}}
|
||||
<div class="col-sm-4" id="{{ $host.ResolveResourceName }}">
|
||||
<div class="info-box">
|
||||
<div class="info-box-content">
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-outline-success btn-sm"
|
||||
data-mac-address="{{ .MacAddress }}">Wake On
|
||||
</button>
|
||||
<button type="button"
|
||||
class="btn btn-outline-primary btn-sm btn_modify_wake_on_lan_host"
|
||||
data-toggle="modal" data-target="#modal_wake_on_lan_host"
|
||||
data-name="{{ .Name }}" data-mac-address="{{ .MacAddress }}">Edit
|
||||
</button>
|
||||
<button type="button" class="btn btn-outline-danger btn-sm" data-toggle="modal"
|
||||
data-target="#modal_remove_wake_on_lan_host"
|
||||
data-mac-address="{{ .MacAddress }}">Remove
|
||||
</button>
|
||||
</div>
|
||||
<hr>
|
||||
<span class="info-box-text"><i class="fas fa-address-card"></i> <span class="name">{{ .Name }}</span></span>
|
||||
<span class="info-box-text"><i class="fas fa-ethernet"></i> <span class="mac-address">{{ .MacAddress }}</span></span>
|
||||
<span class="info-box-text"><i class="fas fa-clock"></i>
|
||||
<span class="latest-used">
|
||||
{{ if .LatestUsed }}
|
||||
{{ .LatestUsed.Format "2006-01-02T15:04:05Z07:00"}}
|
||||
{{ else }}
|
||||
Unused
|
||||
{{ end }}
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{end}}
|
||||
{{define "bottom_js"}}
|
||||
<script src="{{.basePath}}/static/custom/js/wake_on_lan_hosts.js"></script>
|
||||
{{end}}
|
||||
Reference in New Issue
Block a user