--- /dev/null
+node_modules/*
+.vscode/*
--- /dev/null
+#!/bin/bash
+
+#CFGFILE="/mnt/c/Users/ksaff/Workspace/dksnas/.dksnas/db_backup.json"
+CFGFILE="/home/dks/backup/webserver/conf/db_backup.json"
+CFGDIR=`dirname ${CFGFILE}`;
+KEYS=`cat ${CFGFILE} | jq -c keys | tr -d '[]"' | sed 's/,/\n/g'`
+IFS='
+'
+SDB=( ${KEYS} )
+for cdb in "${SDB[@]}"
+do
+ echo `date`": backup DB : $cdb"
+ DATA=`cat ${CFGFILE} | jq -c ".$cdb" | tr -d '{}"' | sed 's/,/\n/g' | sed 's/:/=/'`
+ echo ${DATA} > ${CFGDIR}'/cbackupvars.sh';
+ source ${CFGDIR}'/cbackupvars.sh';
+ rm ${CFGDIR}'/cbackupvars.sh'
+ CDATE=`date +%Y%m%d_%H%M%S`
+ OUTFILE=${bkppath}"/"$cdb"_"${CDATE}".sql"
+ #echo ${OUTFILE}
+ if [ ! -d ${bkppath}]
+ then
+ mkdir -p ${bkppath}
+ fi
+ if [ "${type}" = "mysql" ]
+ then
+ mysqldump -h ${dbhost} -u ${dbuser} -p${dbpwd} ${dbname} > ${OUTFILE}
+ gzip ${OUTFILE};
+ fi
+ find "${bkppath}" -name "*.sql.gz" | sort -r | sed -e '1,${minfiles}d' | xargs rm
+done
+exit 0
+
+
+
-#!/usr/bin/perl
+#!C:\Strawberry\perl\bin\perl.exe
use strict;
use File::Basename;
use Data::Dumper;
+use JSON::PP;
-my $config->{drives}->{'222239212D6A'} = {path => '/home/dks/private',uid=>1001,gid=>1001,type=>'rw'};
-$config->{drives}->{'94M3TGRGT'} = {path => '/home/dks/mirror',uid=>1001,gid=>1001,type=>'rw'};
-$config->{drives}->{'94M1TP66T'} = {path => '/home/dks/music',uid=>1001,gid=>1001,type=>'rw'};
-$config->{drives}->{'22223921335B'} = {path => '/home/dks/backup',uid=>1001,gid=>1001,type=>'rw'};
+$cfgfile = dirname(dirname($0)).'/.dksnas/drives.conf';
+my $strcfg = "";
+open(CFG,$cfgfile);
+while (my $l = <CFG>){
+ $strcfg .= $l;
+}
+close(CFG);
+$config = json_decode($strcfg);
+# my $config->{drives}->{'222239212D6A'} = {path => '/home/dks/private',uid=>1001,gid=>1001,type=>'rw'};
+# $config->{drives}->{'94M3TGRGT'} = {path => '/home/dks/mirror',uid=>1001,gid=>1001,type=>'rw'};
+# $config->{drives}->{'94M1TP66T'} = {path => '/home/dks/music',uid=>1001,gid=>1001,type=>'rw'};
+# $config->{drives}->{'22223921335B'} = {path => '/home/dks/backup',uid=>1001,gid=>1001,type=>'rw'};
+# print encode_json($config);
my $connecteddrives = &getconnecteddrives();
my $mounts = &getcurrentmountpoints();
#print Dumper($mounts);
-<!doctype html>\r
-<html lang="en">\r
-<head>\r
-<meta charset="utf-8">\r
-<meta name="viewport"\r
- content="width=device-width, initial-scale=1, shrink-to-fit=no">\r
-<meta name="description" content="">\r
-<meta name="author" content="">\r
-\r
-\r
-<title>DKS - NAS - Configuration</title>\r
-\r
-<!-- Bootstrap core CSS -->\r
-<link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">\r
-<link href="css/station.css" rel="stylesheet">\r
-</head>\r
-\r
-<body>\r
- <header>\r
- <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">\r
- <a class="navbar-brand" href="#">DKS NAS</a>\r
- <button class="navbar-toggler d-lg-none" type="button"\r
- data-toggle="collapse" data-target="#navbarsExampleDefault"\r
- aria-controls="navbarsExampleDefault" aria-expanded="false"\r
- aria-label="Toggle navigation">\r
- <span class="navbar-toggler-icon"></span>\r
- </button>\r
-\r
- <div class="collapse navbar-collapse" id="navbarsExampleDefault">\r
- <ul class="navbar-nav mr-auto">\r
- <li class="nav-item"><a class="nav-link" href="index.html">Home</a>\r
- </li>\r
- <li class="nav-item"><a class="nav-link" href="configuration.html">Configuration</a>\r
- </li>\r
- </ul>\r
- \r
- </div>\r
- </nav>\r
- </header>\r
-\r
- <div class="container-fluid">\r
- <div class="row">\r
-\r
- <main role="main" class="col-sm-12 col-md-12"\r
- style="margin-top: 100px;">\r
- <div class="row justify-content-center">\r
- <div class="card col-md-6 ">\r
- <h4 class="card-header">DKS NAS</h4>\r
- <div class="card-body">\r
- <button class="btn btn-primary" id="btn_restart">Restart</button>\r
- <button class="btn btn-primary" id="btn_shutdown">Shutdown</button>\r
-\r
- </div>\r
- </div>\r
- </div>\r
- <div class="row justify-content-center">\r
- <div class="card col-md-6 ">\r
- <h4 class="card-header">Protect Web-Interface</h4>\r
- <div class="card-body">\r
- <form>\r
- <div class="form-row">\r
- <div class="col col-md-6">\r
- <input type="text" class="form-control" id="login"\r
- placeholder="username">\r
- </div>\r
- </div>\r
- <br/>\r
- <div class="form-row">\r
-\r
- <div class="col">\r
- <input type="password" class="form-control" id="apppassword1"\r
- placeholder="password...">\r
- </div>\r
- <div class="col">\r
- <input type="password" class="form-control"\r
- placeholder="retype password" id="apppassword2">\r
- </div>\r
- <div class="col">\r
- <a href="#" class="btn btn-primary"\r
- onclick="config.setlogin();">Save</a>\r
- </div>\r
-\r
- </div>\r
- </form>\r
-\r
- </div>\r
- </div>\r
- </div>\r
- <!-- <div class="row justify-content-center">\r
- <div class="card col-md-6 ">\r
- <h4 class="card-header">System User</h4>\r
- <div class="card-body">\r
- <form>\r
- <div class="form-row">\r
- <div class="col col-md-4">\r
- <select id="sysuser" class="form-control">\r
- </select>\r
- </div>\r
- </div>\r
- <div class="form-row">\r
-\r
- <div class="col">\r
- <input type="password" class="form-control" id="syspassword1"\r
- placeholder="password...">\r
- </div>\r
- <div class="col">\r
- <input type="password" class="form-control"\r
- placeholder="retype password" id="syspassword2">\r
- </div>\r
- </div>\r
- <div class="col">\r
- <a href="#" class="btn btn-primary"\r
- onclick="config.setsyspasswd();">Save</a>\r
- </div>\r
- </form>\r
- </div>\r
- </div>\r
- </div> -->\r
- <div class="row justify-content-center">\r
- <div class="card col-md-6 " >\r
- <h4 class="card-header">Cable LAN</h4>\r
- <div class="card-body">\r
- <form class="form-row">\r
- <div class="form-check form-check-inline">\r
- <label class="form-check-label">\r
- <input class="form-check-input" type="radio" name="cable_type" id="cablenet_type_dhcp" value="dhcp"> DHCP\r
- </label>\r
-</div>\r
-<div class="form-check form-check-inline">\r
- <label class="form-check-label">\r
- <input class="form-check-input" type="radio" name="cable_type" id="cablenet_type_static" value="static"> Static\r
- </label>\r
-</div>\r
-\r
- <div class="col">\r
- <input type="text" class="form-control" placeholder="IP" disabled="1" id="cablenet_ip">\r
- </div>\r
- <div class="col">\r
- <input type="text" class="form-control" placeholder="Subnet" disabled="1" id="cablenet_subnet">\r
- </div>\r
- <div class="col">\r
- <input type="text" class="form-control" placeholder="Gateway" disabled="1" id="cablenet_gateway">\r
- </div>\r
- <div class="col">\r
- <input type="text" class="form-control" placeholder="DNS" disabled="1" id="cablenet_dns">\r
- </div>\r
- <div class="col">\r
- <a href="#" class="btn btn-primary">Save</a>\r
- </div> \r
- \r
- </form>\r
- \r
- </div>\r
-</div>\r
-</div>\r
-\r
-<div class="row justify-content-center">\r
- <div class="card col-md-6 " >\r
- <h4 class="card-header">Wireless LAN</h4>\r
- <div class="card-body">\r
- <form class="form-row">\r
- \r
- <div class="col">\r
- <input type="text" class="form-control" placeholder="SSID">\r
- </div>\r
- <div class="col">\r
- <input type="password" class="form-control" placeholder="Password">\r
- </div>\r
- <div class="col">\r
- <a href="#" class="btn btn-primary">Save</a>\r
- </div> \r
- \r
- </form>\r
- \r
- </div>\r
-</div>\r
-</div>\r
-\r
-<div class="row justify-content-center">\r
- <div class="card col-md-6 " >\r
- <h4 class="card-header">Current OpenVPN Configuration</h4>\r
- <div class="card-body">\r
- <form> \r
- \r
- \r
- <div class="col col-md-6">\r
- <input type="file" class="form-control" placeholder="Browse File.. (*.ovpn)">\r
- </div>\r
- <div class="form-row">\r
- <div class="form-check form-check-inline">\r
- <label class="form-check-label">\r
- <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1"> Enable\r
- </label>\r
-</div>\r
-<div class="form-check form-check-inline">\r
- <label class="form-check-label">\r
- <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2"> Disable\r
- </label>\r
-</div>\r
-</div>\r
- <div class="alert alert-success" role="alert">\r
- <h4 class="alert-heading">Status!</h4>\r
- <p>Aww yeah, you successfully read this important alert message. This example text is going to run a bit longer so that you can see how spacing within an alert works with this kind of content.</p>\r
-</div>\r
- \r
- \r
-\r
- <div class="col">\r
- <a href="#" class="btn btn-primary">Save</a>\r
- </div> \r
- \r
- </form>\r
- \r
- </div>\r
-</div>\r
-</div>\r
-\r
-<div class="row justify-content-center">\r
- <div class="card col-md-6 " >\r
- <h4 class="card-header">External Drives</h4>\r
- <div class="card-body">\r
- <table class="table table-striped" id="tbl_extdrives">\r
- <thead><tr>\r
- <th>NAME</th>\r
- <th>Size</th>\r
- <th>File-System</th>\r
- <th>Mount-Folder</th>\r
- <th>Action</th>\r
- </tr>\r
- </thead>\r
- <tbody>\r
- \r
- </tbody>\r
- </table>\r
- \r
-</div>\r
-</div>\r
-</div>\r
-\r
-<div class="row justify-content-center">\r
- <div class="card col-md-6 " >\r
- <h4 class="card-header">Share Users</h4>\r
- <div class="card-body">\r
- <div class="form-inline">\r
- <input type="text" placeholder="username" class="form-control" id="newshareusername"/>\r
- <input type="password" placeholder="password" class="form-control" id="newsharepassword"/>\r
- <button class="btn btn-info" id="btn_addshareuser">add User</button>\r
- </div>\r
- <table class="table table-striped" id="tbl_shareusers">\r
- <thead><tr>\r
- <th>Name</th>\r
- <th>Password</th>\r
- <th>Action</th>\r
- </tr>\r
- </thead>\r
- <tbody>\r
- </tbody>\r
- </table>\r
-</div>\r
-</div>\r
-</div>\r
-\r
-<div class="row justify-content-center">\r
- <div class="card col-md-6 " >\r
- <h4 class="card-header">Shared Folders</h4>\r
- <div class="card-body">\r
- <div class="">\r
- <h4>Global <button id="savesharesglobal" class="btn btn-info">Save</button></h4>\r
- <div class="form-group row">\r
- <label for="shareworkgroup" class="col-sm-2 col-form-label">Workgroup</label>\r
- <div class="col-sm-10">\r
- <input type="text" class="form-control" id="shareworkgroup">\r
- </div>\r
- </div>\r
- <div class="form-group row">\r
- <label for="shareserverdesc" class="col-sm-2 col-form-label">Description</label>\r
- <div class="col-sm-10">\r
- <input type="text" class="form-control" id="shareserverdesc">\r
- </div>\r
- </div>\r
- <div class="form-group row">\r
- <label for="sharenetbios" class="col-sm-2 col-form-label">NetBIOS Name</label>\r
- <div class="col-sm-10">\r
- <input type="text" class="form-control" id="sharenetbios">\r
- </div>\r
- </div>\r
- \r
- </div>\r
- <div >\r
- <h4>New Share <button id="savenewshare" class="btn btn-info">Save</button></h4>\r
- <div class="form-group row">\r
- <label for="newsharename" class="col-sm-2 col-form-label">Name</label>\r
- <div class="col-sm-10">\r
- <input type="text" class="form-control" placeholder="name" id="newsharename"/>\r
- </div>\r
- </div>\r
- <div class="form-group row">\r
- <label for="newsharedescription" class="col-sm-2 col-form-label">Description</label>\r
- <div class="col-sm-10">\r
- <input type="text" class="form-control" placeholder="description" id="newsharedescription"/>\r
- </div>\r
- </div>\r
- <div class="form-group row">\r
- <label for="newsharedrive" class="col-sm-2 col-form-label">Description</label>\r
- <div class="col-sm-10 form-inline">\r
- <select id="newsharedrive" class="form-control"><option value="">select base-folder...</option></select>\r
- <input type="text" class="form-control" placeholder="subfolder" id="newsharesubfolder"/>\r
- </div>\r
-\r
- </div>\r
- </div>\r
- <h4>Current Shares</h4>\r
- <table class="table table-striped" id="tbl_shares">\r
- <thead><tr>\r
- <th>Name</th>\r
- <th>Description</th>\r
- <th>Authorized Users</th>\r
- <th>Action</th>\r
- </tr>\r
- </thead>\r
- <tbody>\r
- </tbody>\r
- </table>\r
- \r
-</div>\r
-</div>\r
-</div>\r
- </main>\r
- </div>\r
- </div>\r
-\r
- <script src="vendor/jquery/jquery-3.2.1.min.js"></script>\r
-\r
- <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>\r
- <script src="js/configure.js"></script>\r
- <script src="js/dksnas.js"></script>\r
-</body>\r
-</html>\r
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1, shrink-to-fit=no">
+<meta name="description" content="">
+<meta name="author" content="">
+
+
+<title>DKS - NAS - Configuration</title>
+
+<!-- Bootstrap core CSS -->
+<link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
+<link href="css/station.css" rel="stylesheet">
+</head>
+
+<body>
+ <header>
+ <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
+ <a class="navbar-brand" href="#">DKS NAS</a>
+ <button class="navbar-toggler d-lg-none" type="button"
+ data-toggle="collapse" data-target="#navbarsExampleDefault"
+ aria-controls="navbarsExampleDefault" aria-expanded="false"
+ aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+
+ <div class="collapse navbar-collapse" id="navbarsExampleDefault">
+ <ul class="navbar-nav mr-auto">
+ <li class="nav-item"><a class="nav-link" href="index.html">Home</a>
+ </li>
+ <li class="nav-item"><a class="nav-link" href="configuration.html">Configuration</a>
+ </li>
+ </ul>
+
+ </div>
+ </nav>
+ </header>
+
+ <div class="container-fluid">
+ <div class="row">
+
+ <main role="main" class="col-sm-12 col-md-12"
+ style="margin-top: 100px;">
+ <div class="row justify-content-center">
+ <div class="card col-md-6 ">
+ <h4 class="card-header">DKS NAS</h4>
+ <div class="card-body">
+ <button class="btn btn-primary" id="btn_restart">Restart</button>
+ <button class="btn btn-primary" id="btn_shutdown">Shutdown</button>
+
+ </div>
+ </div>
+ </div>
+ <div class="row justify-content-center">
+ <div class="card col-md-6 ">
+ <h4 class="card-header">Protect Web-Interface</h4>
+ <div class="card-body">
+ <form>
+ <div class="form-row">
+ <div class="col col-md-6">
+ <input type="text" class="form-control" id="login"
+ placeholder="username">
+ </div>
+ </div>
+ <br/>
+ <div class="form-row">
+
+ <div class="col">
+ <input type="password" class="form-control" id="apppassword1"
+ placeholder="password...">
+ </div>
+ <div class="col">
+ <input type="password" class="form-control"
+ placeholder="retype password" id="apppassword2">
+ </div>
+ <div class="col">
+ <a href="#" class="btn btn-primary"
+ onclick="config.setlogin();">Save</a>
+ </div>
+
+ </div>
+ </form>
+
+ </div>
+ </div>
+ </div>
+ <!-- <div class="row justify-content-center">
+ <div class="card col-md-6 ">
+ <h4 class="card-header">System User</h4>
+ <div class="card-body">
+ <form>
+ <div class="form-row">
+ <div class="col col-md-4">
+ <select id="sysuser" class="form-control">
+ </select>
+ </div>
+ </div>
+ <div class="form-row">
+
+ <div class="col">
+ <input type="password" class="form-control" id="syspassword1"
+ placeholder="password...">
+ </div>
+ <div class="col">
+ <input type="password" class="form-control"
+ placeholder="retype password" id="syspassword2">
+ </div>
+ </div>
+ <div class="col">
+ <a href="#" class="btn btn-primary"
+ onclick="config.setsyspasswd();">Save</a>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div> -->
+ <div class="row justify-content-center">
+ <div class="card col-md-6 " >
+ <h4 class="card-header">Cable LAN</h4>
+ <div class="card-body">
+ <form class="form-row">
+ <div class="form-check form-check-inline">
+ <label class="form-check-label">
+ <input class="form-check-input" type="radio" name="cable_type" id="cablenet_type_dhcp" value="dhcp"> DHCP
+ </label>
+</div>
+<div class="form-check form-check-inline">
+ <label class="form-check-label">
+ <input class="form-check-input" type="radio" name="cable_type" id="cablenet_type_static" value="static"> Static
+ </label>
+</div>
+
+ <div class="col">
+ <input type="text" class="form-control" placeholder="IP" disabled="1" id="cablenet_ip">
+ </div>
+ <div class="col">
+ <input type="text" class="form-control" placeholder="Subnet" disabled="1" id="cablenet_subnet">
+ </div>
+ <div class="col">
+ <input type="text" class="form-control" placeholder="Gateway" disabled="1" id="cablenet_gateway">
+ </div>
+ <div class="col">
+ <input type="text" class="form-control" placeholder="DNS" disabled="1" id="cablenet_dns">
+ </div>
+ <div class="col">
+ <a href="#" class="btn btn-primary">Save</a>
+ </div>
+
+ </form>
+
+ </div>
+</div>
+</div>
+
+<div class="row justify-content-center">
+ <div class="card col-md-6 " >
+ <h4 class="card-header">Wireless LAN</h4>
+ <div class="card-body">
+ <form class="form-row">
+
+ <div class="col">
+ <input type="text" class="form-control" placeholder="SSID">
+ </div>
+ <div class="col">
+ <input type="password" class="form-control" placeholder="Password">
+ </div>
+ <div class="col">
+ <a href="#" class="btn btn-primary">Save</a>
+ </div>
+
+ </form>
+
+ </div>
+</div>
+</div>
+
+<div class="row justify-content-center">
+ <div class="card col-md-6 " >
+ <h4 class="card-header">Current OpenVPN Configuration</h4>
+ <div class="card-body">
+ <form>
+
+
+ <div class="col col-md-6">
+ <input type="file" class="form-control" placeholder="Browse File.. (*.ovpn)">
+ </div>
+ <div class="form-row">
+ <div class="form-check form-check-inline">
+ <label class="form-check-label">
+ <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1"> Enable
+ </label>
+</div>
+<div class="form-check form-check-inline">
+ <label class="form-check-label">
+ <input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2"> Disable
+ </label>
+</div>
+</div>
+ <div class="alert alert-success" role="alert">
+ <h4 class="alert-heading">Status!</h4>
+ <p>Aww yeah, you successfully read this important alert message. This example text is going to run a bit longer so that you can see how spacing within an alert works with this kind of content.</p>
+</div>
+
+
+
+ <div class="col">
+ <a href="#" class="btn btn-primary">Save</a>
+ </div>
+
+ </form>
+
+ </div>
+</div>
+</div>
+
+<div class="row justify-content-center">
+ <div class="card col-md-6 " >
+ <h4 class="card-header">External Drives</h4>
+ <div class="card-body">
+ <table class="table table-striped" id="tbl_extdrives">
+ <thead><tr>
+ <th>NAME</th>
+ <th>Size</th>
+ <th>File-System</th>
+ <th>Mount-Folder</th>
+ <th>Action</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ </tbody>
+ </table>
+
+</div>
+</div>
+</div>
+
+<div class="row justify-content-center">
+ <div class="card col-md-6 " >
+ <h4 class="card-header">Share Users</h4>
+ <div class="card-body">
+ <div class="form-inline">
+ <input type="text" placeholder="username" class="form-control" id="newshareusername"/>
+ <input type="password" placeholder="password" class="form-control" id="newsharepassword"/>
+ <button class="btn btn-info" id="btn_addshareuser">add User</button>
+ </div>
+ <table class="table table-striped" id="tbl_shareusers">
+ <thead><tr>
+ <th>Name</th>
+ <th>Password</th>
+ <th>Action</th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+ </table>
+</div>
+</div>
+</div>
+
+<div class="row justify-content-center">
+ <div class="card col-md-6 " >
+ <h4 class="card-header">Shared Folders</h4>
+ <div class="card-body">
+ <div class="">
+ <h4>Global <button id="savesharesglobal" class="btn btn-info">Save</button></h4>
+ <div class="form-group row">
+ <label for="shareworkgroup" class="col-sm-2 col-form-label">Workgroup</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" id="shareworkgroup">
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="shareserverdesc" class="col-sm-2 col-form-label">Description</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" id="shareserverdesc">
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="sharenetbios" class="col-sm-2 col-form-label">NetBIOS Name</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" id="sharenetbios">
+ </div>
+ </div>
+
+ </div>
+ <div >
+ <h4>New Share <button id="savenewshare" class="btn btn-info">Save</button></h4>
+ <div class="form-group row">
+ <label for="newsharename" class="col-sm-2 col-form-label">Name</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" placeholder="name" id="newsharename"/>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="newsharedescription" class="col-sm-2 col-form-label">Description</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" placeholder="description" id="newsharedescription"/>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="newsharedrive" class="col-sm-2 col-form-label">Description</label>
+ <div class="col-sm-10 form-inline">
+ <select id="newsharedrive" class="form-control"><option value="">select base-folder...</option></select>
+ <input type="text" class="form-control" placeholder="subfolder" id="newsharesubfolder"/>
+ </div>
+
+ </div>
+ </div>
+ <h4>Current Shares</h4>
+ <table class="table table-striped" id="tbl_shares">
+ <thead><tr>
+ <th>Name</th>
+ <th>Description</th>
+ <th>Authorized Users</th>
+ <th>Action</th>
+ </tr>
+ </thead>
+ <tbody>
+ </tbody>
+ </table>
+
+</div>
+</div>
+</div>
+ </main>
+ </div>
+ </div>
+
+ <script src="vendor/jquery/jquery-3.2.1.min.js"></script>
+
+ <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
+ <script src="js/configure.js"></script>
+ <script src="js/dksnas.js"></script>
+</body>
+</html>
-.card {\r
- margin: 5px;\r
- padding: 0px;\r
-}\r
-\r
-.card-body {\r
- margin: 0px;\r
-}\r
-\r
-.card-header {\r
- margin: 0px;\r
-}\r
+.card {
+ margin: 5px;
+ padding: 0px;
+}
+
+.card-body {
+ margin: 0px;
+}
+
+.card-header {
+ margin: 0px;
+}
-<!doctype html>\r
-<html lang="en">\r
- <head>\r
- <meta charset="utf-8">\r
- <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">\r
- <meta name="description" content="">\r
- <meta name="author" content="">\r
-\r
-\r
- <title>DKS NAS</title>\r
-\r
- <!-- Bootstrap core CSS -->\r
- <link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">\r
- <link href="vendor/fontawesome/css/fa-svg-with-js.css" rel="stylesheet">\r
- <link href="css/station.css" rel="stylesheet">\r
- <style>\r
- .card:hover {\r
- background-color: #0080ff;\r
- }\r
- </style>\r
- </head>\r
-\r
- <body>\r
- <header>\r
- <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">\r
- <a class="navbar-brand" href="#">DKS NAS</a>\r
- <button class="navbar-toggler d-lg-none" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">\r
- <span class="navbar-toggler-icon"></span>\r
- </button>\r
-\r
- <div class="collapse navbar-collapse" id="navbarsExampleDefault">\r
- <ul class="navbar-nav mr-auto">\r
- <li class="nav-item">\r
- <a class="nav-link" href="index.html">Home</a>\r
- </li>\r
- <li class="nav-item">\r
- <a class="nav-link" href="configuration.html">Configuration</a>\r
- </li>\r
- \r
- </ul>\r
- \r
- \r
- </div>\r
- </nav>\r
- </header>\r
-\r
- <div class="container">\r
- <div class="row justify-content-center">\r
- <main role="main" class="col-sm-12 col-md-12" style="margin-top: 100px;">\r
- \r
- <section class="row col-md-12">\r
- <nav class="navbar navbar-expand-lg navbar-dark bg-dark" style="width: 100%;">\r
- <a class="navbar-brand" href="#"></a>\r
- <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarbrowsedata" aria-controls="navbarbrowsedata" aria-expanded="false" aria-label="Toggle navigation">\r
- <span class="navbar-toggler-icon"></span>\r
- </button>\r
- <div class="collapse navbar-collapse" id="navbarbrowsedata">\r
- <div class="navbar-nav">\r
- <button class="btn btn-info" id="btn-home" data-folder=""><i class="fas fa-home"></i></button> \r
- <button class="btn btn-info" id="btn-share" data-folder=""><i class="fas fa-share"></i> set folder shared</button> \r
- <button class="btn btn-default" id="btn-currentfolder" data-folder=""><i class="fas fa-sync"></i> <span id="current_folder"></span></button>\r
- </div>\r
- </div>\r
-</nav>\r
-\r
- \r
- </section>\r
- <section class="row">\r
- <table class="table table-striped table-bordered" id="browsetable">\r
- <thead><tr><th style="width: 50px;"><button id="btn-folderup" class="btn btn-info" data-folder=""><i class="fas fa-level-up-alt"></i></button></th><th>Name</th><th style="width: 50px;">Action</th></tr></thead>\r
- <tbody></tbody>\r
- </table>\r
-\r
- \r
- </section>\r
- \r
- </main>\r
- </div>\r
- </div>\r
-\r
- <script src="vendor/jquery/jquery-3.2.1.min.js"></script>\r
- \r
- <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>\r
- <script src="vendor/fontawesome/js/fontawesome-all.min.js"></script>\r
- <script src="js/browser.js"></script>\r
- <script src="js/dksnas.js"></script>\r
- \r
- </body>\r
-</html>\r
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+ <meta name="description" content="">
+ <meta name="author" content="">
+
+
+ <title>DKS NAS</title>
+
+ <!-- Bootstrap core CSS -->
+ <link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
+ <link href="vendor/fontawesome/css/fa-svg-with-js.css" rel="stylesheet">
+ <link href="css/station.css" rel="stylesheet">
+ <style>
+ .card:hover {
+ background-color: #0080ff;
+ }
+ </style>
+ </head>
+
+ <body>
+ <header>
+ <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
+ <a class="navbar-brand" href="#">DKS NAS</a>
+ <button class="navbar-toggler d-lg-none" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+
+ <div class="collapse navbar-collapse" id="navbarsExampleDefault">
+ <ul class="navbar-nav mr-auto">
+ <li class="nav-item">
+ <a class="nav-link" href="index.html">Home</a>
+ </li>
+ <li class="nav-item">
+ <a class="nav-link" href="configuration.html">Configuration</a>
+ </li>
+
+ </ul>
+
+
+ </div>
+ </nav>
+ </header>
+
+ <div class="container">
+ <div class="row justify-content-center">
+ <main role="main" class="col-sm-12 col-md-12" style="margin-top: 100px;">
+
+ <section class="row col-md-12">
+ <nav class="navbar navbar-expand-lg navbar-dark bg-dark" style="width: 100%;">
+ <a class="navbar-brand" href="#"></a>
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarbrowsedata" aria-controls="navbarbrowsedata" aria-expanded="false" aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+ <div class="collapse navbar-collapse" id="navbarbrowsedata">
+ <div class="navbar-nav">
+ <button class="btn btn-info" id="btn-home" data-folder=""><i class="fas fa-home"></i></button>
+ <button class="btn btn-info" id="btn-share" data-folder=""><i class="fas fa-share"></i> set folder shared</button>
+ <button class="btn btn-default" id="btn-currentfolder" data-folder=""><i class="fas fa-sync"></i> <span id="current_folder"></span></button>
+ </div>
+ </div>
+</nav>
+
+
+ </section>
+ <section class="row">
+ <table class="table table-striped table-bordered" id="browsetable">
+ <thead><tr><th style="width: 50px;"><button id="btn-folderup" class="btn btn-info" data-folder=""><i class="fas fa-level-up-alt"></i></button></th><th>Name</th><th style="width: 50px;">Action</th></tr></thead>
+ <tbody></tbody>
+ </table>
+
+
+ </section>
+
+ </main>
+ </div>
+ </div>
+
+ <script src="vendor/jquery/jquery-3.2.1.min.js"></script>
+
+ <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
+ <script src="vendor/fontawesome/js/fontawesome-all.min.js"></script>
+ <script src="js/browser.js"></script>
+ <script src="js/dksnas.js"></script>
+
+ </body>
+</html>
- function initdata(){\r
- browser.getdirectory(null);\r
- }\r
- \r
-var mimetypeicons = {\r
- "unknown":"file",\r
- "text/csv":"file-alt",\r
- "text/plain":"file-alt",\r
- "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"file-excel",\r
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document":"file-word",\r
- "application/pdf":"file-pdf",\r
- "image/svg+xml":"image",\r
- "image/png":"image",\r
- "application/javascript":"file-code",\r
- "application/zip":"file-archive",\r
- "image/jpeg":"image",\r
- "image/tif":"image",\r
- "image/jpeg":"image",\r
- "audio/mpeg":"file-audio",\r
- "audio/ogg":"file-audio"\r
-}\r
-\r
-$("#btn-home").on('click',function(){\r
- browser.getdirectory(dksnas.info.home);\r
-});\r
-\r
-$("#btn-folderup").on('click',function(){\r
- browser.getdirectory($("#btn-folderup").attr('data-folder'));\r
-});\r
-\r
-$("#btn-share").on('click',function(){\r
- alert($("#btn-share").attr('data-folder'));\r
-});\r
-\r
-$("#btn-currentfolder").on('click',function(){\r
- browser.getdirectory($("#btn-currentfolder").attr('data-folder'));\r
-});\r
- \r
- var browser = {\r
- getdirectory: function(dir){\r
- if (!dir){\r
- dir = dksnas.info.home;\r
- }\r
- dir = dir.replace(/\\/g,'/');\r
- if (dir == dksnas.info.home){\r
- $('#btn-currentfolder').hide();\r
- $('#btn-share').hide();\r
- $('#btn-folderup').hide();\r
- } else {\r
- $('#btn-currentfolder').show();\r
- $('#btn-currentfolder').attr("data-folder",dir);\r
- $('#btn-share').show();\r
- $('#btn-share').attr("data-folder",dir);\r
- $('#btn-folderup').show();\r
- var parent = dir.substring(0,dir.lastIndexOf('/'));\r
- $('#btn-folderup').attr("data-folder",parent);\r
- }\r
- var displaycurdir = dir.substring(dksnas.info.home.length);\r
- console.log(displaycurdir);\r
- $('#current_folder').html(displaycurdir);\r
- $('#browsetable > tbody').html("");\r
- console.log(dir);\r
- console.log(window.location.origin + "/system/directory/list?path=" + encodeURIComponent(dir));\r
- $.ajax({\r
- encoding:"UTF-8",\r
- url: window.location.origin + "/system/directory/list?path=" + encodeURIComponent(dir) ,\r
- success: function (data){\r
- console.log(data.result.file);\r
- for (var i=0;i<data.result.directory.length;i++){\r
- $('#browsetable > tbody:last-child').append('<tr><td><i class="fas fa-folder"></i></td><td><a href="javascript:browser.getdirectory(\'' + dir + '/' + data.result.directory[i] +'\');">'+data.result.directory[i]+ '</a></td><td><button class="btn btn-info"><i class="fas fa-download"></i></button></td></tr>');\r
- }\r
- for (var i=0;i<data.result.file.length;i++){\r
- var fd = data.result.file[i];\r
- \r
- $('#browsetable > tbody:last-child').append('<tr><td><i class="far fa-'+ (mimetypeicons[fd.mimetype]?mimetypeicons[fd.mimetype]:'file')+'"></i></td><td>'+fd.name+ '</td><td><button class="btn btn-info"><i class="fas fa-download"></i></button></td></tr>');\r
- }\r
- },\r
- error: function(data){\r
- alert("Error:" + JSON.stringify(data));\r
- console.log("Error:" + JSON.stringify(data));\r
- },\r
- async:true\r
- });\r
- }\r
+ function initdata(){
+ browser.getdirectory(null);
+ }
+
+var mimetypeicons = {
+ "unknown":"file",
+ "text/csv":"file-alt",
+ "text/plain":"file-alt",
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"file-excel",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document":"file-word",
+ "application/pdf":"file-pdf",
+ "image/svg+xml":"image",
+ "image/png":"image",
+ "application/javascript":"file-code",
+ "application/zip":"file-archive",
+ "image/jpeg":"image",
+ "image/tif":"image",
+ "image/jpeg":"image",
+ "audio/mpeg":"file-audio",
+ "audio/ogg":"file-audio"
+}
+
+$("#btn-home").on('click',function(){
+ browser.getdirectory(dksnas.info.home);
+});
+
+$("#btn-folderup").on('click',function(){
+ browser.getdirectory($("#btn-folderup").attr('data-folder'));
+});
+
+$("#btn-share").on('click',function(){
+ alert($("#btn-share").attr('data-folder'));
+});
+
+$("#btn-currentfolder").on('click',function(){
+ browser.getdirectory($("#btn-currentfolder").attr('data-folder'));
+});
+
+ var browser = {
+ getdirectory: function(dir){
+ if (!dir){
+ dir = dksnas.info.home;
+ }
+ dir = dir.replace(/\\/g,'/');
+ if (dir == dksnas.info.home){
+ $('#btn-currentfolder').hide();
+ $('#btn-share').hide();
+ $('#btn-folderup').hide();
+ } else {
+ $('#btn-currentfolder').show();
+ $('#btn-currentfolder').attr("data-folder",dir);
+ $('#btn-share').show();
+ $('#btn-share').attr("data-folder",dir);
+ $('#btn-folderup').show();
+ var parent = dir.substring(0,dir.lastIndexOf('/'));
+ $('#btn-folderup').attr("data-folder",parent);
+ }
+ var displaycurdir = dir.substring(dksnas.info.home.length);
+ console.log(displaycurdir);
+ $('#current_folder').html(displaycurdir);
+ $('#browsetable > tbody').html("");
+ console.log(dir);
+ console.log(window.location.origin + "/system/directory/list?path=" + encodeURIComponent(dir));
+ $.ajax({
+ encoding:"UTF-8",
+ url: window.location.origin + "/system/directory/list?path=" + encodeURIComponent(dir) ,
+ success: function (data){
+ console.log(data.result.file);
+ for (var i=0;i<data.result.directory.length;i++){
+ $('#browsetable > tbody:last-child').append('<tr><td><i class="fas fa-folder"></i></td><td><a href="javascript:browser.getdirectory(\'' + dir + '/' + data.result.directory[i] +'\');">'+data.result.directory[i]+ '</a></td><td><button class="btn btn-info"><i class="fas fa-download"></i></button></td></tr>');
+ }
+ for (var i=0;i<data.result.file.length;i++){
+ var fd = data.result.file[i];
+
+ $('#browsetable > tbody:last-child').append('<tr><td><i class="far fa-'+ (mimetypeicons[fd.mimetype]?mimetypeicons[fd.mimetype]:'file')+'"></i></td><td>'+fd.name+ '</td><td><button class="btn btn-info"><i class="fas fa-download"></i></button></td></tr>');
+ }
+ },
+ error: function(data){
+ alert("Error:" + JSON.stringify(data));
+ console.log("Error:" + JSON.stringify(data));
+ },
+ async:true
+ });
+ }
}
\ No newline at end of file
- function initdata(){\r
- $.ajax({\r
- encoding:"UTF-8",\r
- url:"/app/config",\r
- success: function (data){\r
- console.log("DATA");\r
- config.fillconfig(data.result);\r
- },\r
- error: function(data){\r
- console.log("Error:" + JSON.stringify(data));\r
- },\r
- async:false\r
- });\r
- }\r
- \r
- var config = {\r
- setlogin: function(){\r
- var bok = 0;\r
- var errmsg = "Please fill all fields!";\r
- if (($("#login").val() != "") && ($("#apppassword2").val() != "") && ($("#apppassword1").val() != "")){\r
- if ($("#apppassword2").val() != $("#apppassword1").val()){\r
- errmsg = "Passwords does not match eachother!"; \r
- }else if ($("#apppassword1").val().length < 8 ){\r
- errmsg = "Passwords length must have at least 8 characters!";\r
- }else {\r
- bok=1;\r
- }\r
- }\r
- if (bok == 0){\r
- alert(errmsg);\r
- }else {\r
- $.ajax({\r
- method: 'POST',\r
- encoding:"UTF-8",\r
- url:"/app/save/login",\r
- data: "login=" + encodeURIComponent($("#login").val()) + "&pwd=" + encodeURIComponent($("#apppassword1").val()),\r
- success: function (data){\r
- console.log("Error:" + JSON.stringify(data));\r
- },\r
- error: function(data){\r
- console.log("Error:" + JSON.stringify(data));\r
- },\r
- async:false\r
- });\r
- }\r
- },\r
- fillconfig: function(data){\r
- console.log(data);\r
- if (data){\r
- if (data.weblogin){\r
- if (data.weblogin.user){\r
- $("#login").val(data.weblogin.user);\r
- }\r
- }\r
- if (data.cablenet){\r
- if (data.cablenet.type){\r
- $("#cablenet_type_"+ data.cablenet.type).prop("checked",true);\r
- \r
- }\r
- \r
- }\r
- if (data.extdrives){\r
- $("#tbl_extdrives > tbody").html("");\r
- for (var drv in data.extdrives){\r
- var trow = '<tr>';\r
- trow += '<td>'+ data.extdrives[drv].label+'<br/>('+ data.extdrives[drv].serial +')</td>';\r
- trow += '<td>'+ data.extdrives[drv].size +'</td>';\r
- trow += '<td>'+ data.extdrives[drv].fs+ '</td>';\r
- if (data.extdrives[drv].mounted){\r
- trow += '<td><input type="text" class="form-control" value="'+data.extdrives[drv].mountpoint+'" id="extdrv_folder_'+data.extdrives[drv].dev+'" placeholder="folder" disabled="1"></td>';\r
- trow += '<td><button class="btn btn-info" id="btn_mount_'+data.extdrives[drv].dev+'">Unmount</button></td>';\r
- }\r
- else {\r
- \r
- trow += '<td><input type="text" class="form-control" value="'+((data.extdrives[drv].mountpoint)?data.extdrives[drv].mountpoint:"")+'" id="extdrv_folder_'+data.extdrives[drv].dev+'" placeholder="folder"></td>';\r
- trow += '<td><button class="btn btn-info" id="btn_mount_'+data.extdrives[drv].dev+'">Mount</button></td>';\r
- }\r
- trow += '</tr>';\r
- $("#tbl_extdrives > tbody").append(trow);\r
- }\r
- }\r
- if (data.shareusers){\r
- $('#tbl_shareusers > tbody').html("");\r
- for (var u in data.shareusers){\r
- var trow = '<tr>';\r
- trow += '<td>'+u+'</td>';\r
- trow += '<td><input type="password" class="form-control" placeholder="user password" id="shareuserpwd_'+u+'"></td>';\r
- trow += '<td><button class="btn btn-info" id="btn_pwdshareuser_'+u+'">Save Password</button> <button class="btn btn-info" id="btn_delshareuser_'+u+'">Delete User</button></td>';\r
- trow += '</tr>';\r
- $("#tbl_shareusers> tbody").append(trow);\r
- }\r
- }\r
- if (data.shares){\r
- if (data.shares.global){\r
- $("#shareworkgroup").val(data.shares.global.workgroup);\r
- $("#shareserverdesc").val(data.shares.global["server string"]);\r
- $("#sharenetbios").val(data.shares.global["netbios name"]);\r
- }\r
- $('#tbl_shares > tbody').html("");\r
- if (data.shares.folders){\r
- for (var f in data.shares.folders){\r
- var trow = '<tr>';\r
- trow += '<td>'+f+'</td>';\r
- trow += '<td>'+data.shares.folders[f].comment+'</td>';\r
- \r
- trow += '<td><div class="btn-group">';\r
- trow += '<button type="button" class="btn btn-secondary" id="shareusers_'+f+'">'+data.shares.folders[f]["valid users"].join(",")+'</button>';\r
- trow += '<button type="button" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="sr-only">Toggle Dropdown</span></button><div class="dropdown-menu">';\r
- for (var v in data.shares.folders[f]["valid users"]){\r
- trow += '<a class="dropdown-item"><input class="form-check-input" type="checkbox" id="shareuser_'+data.shares.folders[f]["valid users"][v]+'_'+ f +'" value="static"> '+data.shares.folders[f]["valid users"][v]+'</a>';\r
- }\r
- trow += '</div></div></td>';\r
- trow += '<td><button class="btn btn-info" id="btn_saveshareusers_'+f+'">Save Users</button> <button class="btn btn-info" id="btn_delshare_'+u+'">Delete Share</button></td>';\r
- trow += '</tr>';\r
- $("#tbl_shares > tbody").append(trow);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- };\r
- \r
- \r
- \r
- $('input[name="cable_type"]:radio').on('change',function() {\r
- console.log("TEST RADIO CHECK!");\r
- if (this.value == 'dhcp'){\r
- $("#cablenet_ip").prop("disabled",true);\r
- $("#cablenet_subnet").prop("disabled",true);\r
- $("#cablenet_gateway").prop("disabled",true);\r
- $("#cablenet_dns").prop("disabled",true);\r
- } else {\r
- $("#cablenet_ip").prop("disabled",false);\r
- $("#cablenet_subnet").prop("disabled",false);\r
- $("#cablenet_gateway").prop("disabled",false);\r
- $("#cablenet_dns").prop("disabled",false);\r
- } \r
- });\r
- \r
- $('#btn_shudown').on('click',function(){\r
- if (confirm("shutdown DKS-NAS now?")){\r
- $.ajax({\r
- encoding:"UTF-8",\r
- url:"/app/shutdown",\r
- success: function (data){\r
- console.log("Success:" + data);\r
- },\r
- error: function(data){\r
- console.log("Error:" + data);\r
- },\r
- async:false\r
- });\r
- }\r
- });\r
- \r
- $('#btn_restart').on('click',function(){\r
- if (confirm("restart DKS-NAS now?")){\r
- $.ajax({\r
- encoding:"UTF-8",\r
- url:"/app/restart",\r
- success: function (data){\r
- console.log("Success:" + data);\r
- },\r
- error: function(data){\r
- console.log("Error:" + data);\r
- },\r
- async:false\r
- });\r
- }\r
+ function initdata(){
+ $.ajax({
+ encoding:"UTF-8",
+ url:"/app/config",
+ success: function (data){
+ console.log("DATA");
+ config.fillconfig(data.result);
+ },
+ error: function(data){
+ console.log("Error:" + JSON.stringify(data));
+ },
+ async:false
+ });
+ }
+
+ var config = {
+ setlogin: function(){
+ var bok = 0;
+ var errmsg = "Please fill all fields!";
+ if (($("#login").val() != "") && ($("#apppassword2").val() != "") && ($("#apppassword1").val() != "")){
+ if ($("#apppassword2").val() != $("#apppassword1").val()){
+ errmsg = "Passwords does not match eachother!";
+ }else if ($("#apppassword1").val().length < 8 ){
+ errmsg = "Passwords length must have at least 8 characters!";
+ }else {
+ bok=1;
+ }
+ }
+ if (bok == 0){
+ alert(errmsg);
+ }else {
+ $.ajax({
+ method: 'POST',
+ encoding:"UTF-8",
+ url:"/app/save/login",
+ data: "login=" + encodeURIComponent($("#login").val()) + "&pwd=" + encodeURIComponent($("#apppassword1").val()),
+ success: function (data){
+ console.log("Error:" + JSON.stringify(data));
+ },
+ error: function(data){
+ console.log("Error:" + JSON.stringify(data));
+ },
+ async:false
+ });
+ }
+ },
+ fillconfig: function(data){
+ console.log(data);
+ if (data){
+ if (data.weblogin){
+ if (data.weblogin.user){
+ $("#login").val(data.weblogin.user);
+ }
+ }
+ if (data.cablenet){
+ if (data.cablenet.type){
+ $("#cablenet_type_"+ data.cablenet.type).prop("checked",true);
+
+ }
+
+ }
+ if (data.extdrives){
+ $("#tbl_extdrives > tbody").html("");
+ for (var drv in data.extdrives){
+ var trow = '<tr>';
+ trow += '<td>'+ data.extdrives[drv].label+'<br/>('+ data.extdrives[drv].serial +')</td>';
+ trow += '<td>'+ data.extdrives[drv].size +'</td>';
+ trow += '<td>'+ data.extdrives[drv].fs+ '</td>';
+ if (data.extdrives[drv].mounted){
+ trow += '<td><input type="text" class="form-control" value="'+data.extdrives[drv].mountpoint+'" id="extdrv_folder_'+data.extdrives[drv].dev+'" placeholder="folder" disabled="1"></td>';
+ trow += '<td><button class="btn btn-info" id="btn_mount_'+data.extdrives[drv].dev+'">Unmount</button></td>';
+ }
+ else {
+
+ trow += '<td><input type="text" class="form-control" value="'+((data.extdrives[drv].mountpoint)?data.extdrives[drv].mountpoint:"")+'" id="extdrv_folder_'+data.extdrives[drv].dev+'" placeholder="folder"></td>';
+ trow += '<td><button class="btn btn-info" id="btn_mount_'+data.extdrives[drv].dev+'">Mount</button></td>';
+ }
+ trow += '</tr>';
+ $("#tbl_extdrives > tbody").append(trow);
+ }
+ }
+ if (data.shareusers){
+ $('#tbl_shareusers > tbody').html("");
+ for (var u in data.shareusers){
+ var trow = '<tr>';
+ trow += '<td>'+u+'</td>';
+ trow += '<td><input type="password" class="form-control" placeholder="user password" id="shareuserpwd_'+u+'"></td>';
+ trow += '<td><button class="btn btn-info" id="btn_pwdshareuser_'+u+'">Save Password</button> <button class="btn btn-info" id="btn_delshareuser_'+u+'">Delete User</button></td>';
+ trow += '</tr>';
+ $("#tbl_shareusers> tbody").append(trow);
+ }
+ }
+ if (data.shares){
+ if (data.shares.global){
+ $("#shareworkgroup").val(data.shares.global.workgroup);
+ $("#shareserverdesc").val(data.shares.global["server string"]);
+ $("#sharenetbios").val(data.shares.global["netbios name"]);
+ }
+ $('#tbl_shares > tbody').html("");
+ if (data.shares.folders){
+ for (var f in data.shares.folders){
+ var trow = '<tr>';
+ trow += '<td>'+f+'</td>';
+ trow += '<td>'+data.shares.folders[f].comment+'</td>';
+
+ trow += '<td><div class="btn-group">';
+ trow += '<button type="button" class="btn btn-secondary" id="shareusers_'+f+'">'+data.shares.folders[f]["valid users"].join(",")+'</button>';
+ trow += '<button type="button" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="sr-only">Toggle Dropdown</span></button><div class="dropdown-menu">';
+ for (var v in data.shares.folders[f]["valid users"]){
+ trow += '<a class="dropdown-item"><input class="form-check-input" type="checkbox" id="shareuser_'+data.shares.folders[f]["valid users"][v]+'_'+ f +'" value="static"> '+data.shares.folders[f]["valid users"][v]+'</a>';
+ }
+ trow += '</div></div></td>';
+ trow += '<td><button class="btn btn-info" id="btn_saveshareusers_'+f+'">Save Users</button> <button class="btn btn-info" id="btn_delshare_'+u+'">Delete Share</button></td>';
+ trow += '</tr>';
+ $("#tbl_shares > tbody").append(trow);
+ }
+ }
+ }
+ }
+ }
+ };
+
+
+
+ $('input[name="cable_type"]:radio').on('change',function() {
+ console.log("TEST RADIO CHECK!");
+ if (this.value == 'dhcp'){
+ $("#cablenet_ip").prop("disabled",true);
+ $("#cablenet_subnet").prop("disabled",true);
+ $("#cablenet_gateway").prop("disabled",true);
+ $("#cablenet_dns").prop("disabled",true);
+ } else {
+ $("#cablenet_ip").prop("disabled",false);
+ $("#cablenet_subnet").prop("disabled",false);
+ $("#cablenet_gateway").prop("disabled",false);
+ $("#cablenet_dns").prop("disabled",false);
+ }
+ });
+
+ $('#btn_shudown').on('click',function(){
+ if (confirm("shutdown DKS-NAS now?")){
+ $.ajax({
+ encoding:"UTF-8",
+ url:"/app/shutdown",
+ success: function (data){
+ console.log("Success:" + data);
+ },
+ error: function(data){
+ console.log("Error:" + data);
+ },
+ async:false
+ });
+ }
+ });
+
+ $('#btn_restart').on('click',function(){
+ if (confirm("restart DKS-NAS now?")){
+ $.ajax({
+ encoding:"UTF-8",
+ url:"/app/restart",
+ success: function (data){
+ console.log("Success:" + data);
+ },
+ error: function(data){
+ console.log("Error:" + data);
+ },
+ async:false
+ });
+ }
});
\ No newline at end of file
-var dksnas = {\r
- info: null,\r
- getinfo: function(){\r
- $.ajax({\r
- encoding:"UTF-8",\r
- url:"/app/info" ,\r
- success: function (data){\r
- //dump(data + "\n");\r
- dksnas.info=data.result;\r
- dksnas.info.home = dksnas.info.home.replace(/\\/g,'/'); \r
- },\r
- error: function(data){\r
- alert("Error:" + JSON.stringify(data));\r
- console.log("Error:" + JSON.stringify(data));\r
- },\r
- async:false\r
- });\r
- \r
- }\r
-}; \r
-\r
-$(document).ready(function() {\r
- dksnas.getinfo();\r
- initdata();\r
+var dksnas = {
+ info: null,
+ getinfo: function(){
+ $.ajax({
+ encoding:"UTF-8",
+ url:"/app/info" ,
+ success: function (data){
+ //dump(data + "\n");
+ dksnas.info=data.result;
+ dksnas.info.home = dksnas.info.home.replace(/\\/g,'/');
+ },
+ error: function(data){
+ alert("Error:" + JSON.stringify(data));
+ console.log("Error:" + JSON.stringify(data));
+ },
+ async:false
+ });
+
+ }
+};
+
+$(document).ready(function() {
+ dksnas.getinfo();
+ initdata();
});
\ No newline at end of file
+++ /dev/null
-#!/usr/bin/perl
-use strict;
-use File::Basename;
-use Getopt::Long;
-use Time::HiRes;
-use Data::Dumper;
-use lib (dirname($0));
-use lib ('/home/dks/perl5/lib/perl5');
-# if ($^O ne "MSWin32" ){
-# use lib (dirname($0));
-# #use lib ($ENV{HOME}.'/perl5/lib/perl5');
-# }
-#if ($^O eq "darwin"){
-# use lib ($ENV{HOME}.'/perl5/lib/perl5');
-#}
-use Plack::Builder;
-use Plack::App::File;
-use Plack::App::Directory;
-#use Plack::App::WrapCGI;
-#use Plack::Middleware::Auth::Basic;
-use Plack::Request;
-use Plack::Runner;
-#use Module::Service;
-#use Module::Test;
-#use Module::SQLite;
-#use Module::Audio;
-#use Module::System;
-#use Module::OpenVPN;
-#use Module::SSH;
-#use JSON::PP;
-
-print $^O."\n";
-
-
-my @match = grep { /par-.*inc$/} @INC;
-
-my $basedir = dirname($0);
-if (scalar(@match) > 0){
- $basedir = $match[0];
-}
-
-my $cfgpath = "";
-print "BASEDIR:".$basedir."\n";
-my $name = basename($0);
-$name =~ s/\.pl$//;
-$name =~ s/\.exe$//;
-
-# if ($^O eq "MSWin32"){
-# $cfgpath = $ENV{APPDATA}.'/'.$name;
-# }
-# elsif ($^O eq "darwin"){
-# $cfgpath = $ENV{HOME}.'/Library/Application Support/'.$name;
-# } else {
- $cfgpath = $ENV{HOME}.'/.'.$name;
-# }
-# sub version {
-# require Twiggy;
-# print "Twiggy $Twiggy::VERSION\n";
-# }
-
-print "ConfigPath:".$cfgpath."\n";
-
-# sub authen_cb {
-# my($username, $password, $env) = @_;
-# my $auth = 0;
-# #print "Check AUTH\n";
-# if (-e $cfgpath.'/'.$name.'.passwd'){
-# open(AUTH,$cfgpath.'/'.$name.'.passwd');
-# while (my $l = <AUTH>){
-# chomp($l);
-# if ($l eq $username.'='.$password){
-# $auth = 1;
-# last;
-# }
-# }
-# close(AUTH);
-# }
-# return $auth;
-# }
-
-my $allapp = builder {
- # if (-e $cfgpath.'/'.$name.'.passwd'){
- # enable "Auth::Basic", authenticator => \&authen_cb;
- # }
- #enable "DirIndex";
- mount "/" => Plack::App::Directory->new(root => dirname($0)."/cert")->to_app;
- #mount "/app" => Module::Service->new();
- #mount "/system" => Module::System->new();
- #mount "/test" => Module::Test->new();
- #mount "/openvpn" => Module::OpenVPN->new();
- #mount "/ssh" => Module::SSH->new();
- #mount "/audio" => Module::Audio->new(binpath => dirname($0).'/');
- #mount "/sqlite" => Module::SQLite->new();
- #mount "/summernote" => Plack::App::File->new(root => dirname($0)."/summernote")->to_app;
- #mount "/codemirror" => Plack::App::File->new(root => dirname($0)."/codemirror")->to_app;
- #mount "/station" => Plack::App::File->new(root => dirname($0)."/station")->to_app;
- #mount "/cert" => Plack::App::File->new(root => dirname($0).'/cert')->to_app;
- #mount "/spotify" => Plack::App::File->new(root => dirname($0)."/testspotify")->to_app;
-};
-
-
-my @args = ("-p","80");
-my $runner = Plack::Runner->new(server => 'Starlight', env => 'deployment', ipv6 => '1' );#env => development, test
-$runner->parse_options(@args);
-$runner->run($allapp);
-
-print "Started\n";
+++ /dev/null
-#!/usr/bin/perl
-
-use CGI;
-
-my $cgi = new CGI();
-print $cgi->header(-type=> 'text/html', -charset=>"utf-8");
-print $ENV{REMOTE_ADDR};
\ No newline at end of file
--- /dev/null
+{
+ "juridig": {
+ "type":"mysql",
+ "dbhost": "sql615.your-server.de",
+ "dbname": "juridig_db",
+ "dbuser": "juridig",
+ "dbpwd": "fnx4HYwYCKRNR694",
+ "bkppath": "/home/dks/backup/webserver/db/juridig"
+ },
+ "fanclubf91_lu": {
+ "type":"mysql",
+ "dbhost": "sql588.your-server.de",
+ "dbname": "wp_dksalu_db0",
+ "dbuser": "wp_dksalu_0",
+ "dbpwd": "B4Q3Zs4nKf4i4KM1",
+ "bkppath": "/home/dks/backup/webserver/db/fanclubf91_lu"
+ },
+ "dateschutz_lu": {
+ "type":"mysql",
+ "dbhost": "sql247.your-server.de",
+ "dbname": "wp_dksalu_db1",
+ "dbuser": "wp_dksalu_1",
+ "dbpwd": "AASEV6zRxQDkmZ8Z",
+ "bkppath": "/home/dks/backup/webserver/db/dateschutz_lu"
+ },
+ "solarch_dbsite": {
+ "type":"mysql",
+ "dbhost": "sql537.your-server.de",
+ "dbname": "solarch_db1",
+ "dbuser": "solarch_1",
+ "dbpwd": "F8LVv6iwjLkdLCMM",
+ "bkppath": "/home/dks/backup/webserver/db/solarch_dbsite"
+ },
+ "solarch_dbprojectplan": {
+ "type":"mysql",
+ "dbhost": "sql635.your-server.de",
+ "dbname": "solarch_db2",
+ "dbuser": "solarch_2",
+ "dbpwd": "y8UvMP97pVeA7KTm",
+ "bkppath": "/home/dks/backup/webserver/db/solarch_dbprojectplan"
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "drives": {
+ "222239212D6A": {
+ "gid": 1001,
+ "uid": 1001,
+ "type": "rw",
+ "path": "/home/dks/private"
+ },
+ "94M1TP66T": {
+ "uid": 1001,
+ "gid": 1001,
+ "type": "rw",
+ "path": "/home/dks/music"
+ },
+ "94M3TGRGT": {
+ "type": "rw",
+ "path": "/home/dks/mirror",
+ "uid": 1001,
+ "gid": 1001
+ },
+ "22223921335B": {
+ "gid": 1001,
+ "uid": 1001,
+ "type": "rw",
+ "path": "/home/dks/backup"
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+[global]
+workgroup = DKS
+server string = DKS Home Backup System %v
+netbios name = home-backup
+security = user
+map to guest = bad user
+dns proxy = no
+
+[bin]
+ comment = bin folder
+ path = /home/dks/bin
+ valid users = kilian
+ force group = dks
+ force user = dks
+ create mask = 0660
+ directory mask = 0771
+ writable = yes
+
+[mirror]
+ comment = Mirror Drive
+ path = /home/dks/mirror
+ valid users = kilian
+ force group = dks
+ force user = dks
+ create mask = 0660
+ directory mask = 0771
+ writable = yes
+
+[backup]
+ comment = Backup Drive
+ path = /home/dks/backup
+ valid users = kilian
+ force group = dks
+ force user = dks
+ create mask = 0660
+ directory mask = 0771
+ writable = yes
+
+[music]
+ comment = Music Drive
+ path = /home/dks/music
+ valid users = kilian
+ force group = dks
+ force user = dks
+ create mask = 0660
+ directory mask = 0771
+ writable = yes
+
+[private]
+ comment = Private Family Drive
+ path = /home/dks/private
+ valid users = kilian
+ force group = dks
+ force user = dks
+ create mask = 0660
+ directory mask = 0771
+ writable = yes
+
--- /dev/null
+#!/bin/bash
+
+#add group dks
+#add user dks
+
+#add smbusers -> (must have real user with: -g <user> -G dks -s /bin/false -d /dev/null
+
--- /dev/null
+{
+ "name": "dksnas",
+ "version": "0.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@fortawesome/fontawesome-free": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.7.2.tgz",
+ "integrity": "sha512-Ha4HshKdCVKgu4TVCtG8XyPPYdzTzNW4/fvPnn+LT7AosRABryhlRv4cc4+o84dgpvVJN9reN7jo/c+nYujFug==",
+ "dev": true
+ },
+ "bootstrap": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz",
+ "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==",
+ "dev": true
+ },
+ "bootstrap-table": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/bootstrap-table/-/bootstrap-table-1.13.4.tgz",
+ "integrity": "sha512-033fnjYKgFZO98PL6E0JAqmwTJ2isoQxJBFU6BwEbIMmRZETk5iDoPGgV+7wORt4c+yABNWj8EnbFBWAHz5YPw==",
+ "dev": true
+ },
+ "jquery": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
+ "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==",
+ "dev": true
+ },
+ "popper.js": {
+ "version": "1.14.7",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz",
+ "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==",
+ "dev": true
+ }
+ }
+}
--- /dev/null
+{
+ "name": "dksnas",
+ "version": "0.1.0",
+ "description": "NAS Server",
+ "author": "Kilian Saffran",
+ "license": "MIT",
+ "devDependencies": {
+ "@fortawesome/fontawesome-free": "^5.7.2",
+ "bootstrap": "^4.3.1",
+ "bootstrap-table": "^1.13.4",
+ "jquery": "^3.3.1",
+ "popper.js": "^1.14.7"
+ }
+}