diff options
Diffstat (limited to 'modules-available/rebootcontrol/templates')
14 files changed, 561 insertions, 273 deletions
diff --git a/modules-available/rebootcontrol/templates/_page.html b/modules-available/rebootcontrol/templates/_page.html deleted file mode 100644 index a124e165..00000000 --- a/modules-available/rebootcontrol/templates/_page.html +++ /dev/null @@ -1,184 +0,0 @@ -<h3>{{location}}</h3> - -<form method="post" action="?do=rebootcontrol" class="form-inline"> - <input type="hidden" name="token" value="{{token}}"> - <div class="row"> - <div class="col-md-12"> - <table class="table table-condensed table-hover stupidtable" id="dataTable"> - <thead> - <tr> - <th data-sort="string">{{lang_client}}</th> - <th data-sort="ipv4">{{lang_ip}}</th> - <th data-sort="string">{{lang_status}}</th> - <th data-sort="string">{{lang_session}}</th> - <th data-sort="string">{{lang_user}}</th> - <th data-sort="int" data-sort-default="desc">{{lang_selected}}</th> - </tr> - </thead> - - <tbody> - {{#data}} - <tr> - <td> - {{hostname}} - {{^hostname}}{{clientip}}{{/hostname}} - </td> - <td>{{clientip}}</td> - <td class="statusColumn"> - {{#status}} - <span class="text-success">{{lang_on}}</span> - {{/status}} - {{^status}} - <span class="text-danger">{{lang_off}}</span> - {{/status}} - </td> - <td>{{#status}}{{currentsession}}{{/status}}</td> - <td>{{#status}}{{currentuser}}{{/status}}</td> - <td data-sort-value="0" class="checkboxColumn slx-smallcol"> - <div class="checkbox"> - <input id="m-{{machineuuid}}" type="checkbox" name="clients[]" value='{{machineuuid}}'> - <label for="m-{{machineuuid}}"></label> - </div> - </td> - </tr> - {{/data}} - </tbody> - </table> - </div> - </div> - - <!-- Modals --> - <div class ="modal fade" id="rebootModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> - <div class="modal-dialog" role="document"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> - <h4 class="modal-title" id="myModalLabel">{{lang_rebootButton}}</h4> - </div> - <div class="modal-body"> - <div>{{lang_rebootCheck}}</div> - <div>{{lang_rebootIn}} <input name="r-minutes" title="{{lang_shutdownIn}}" type="number" value="0" min="0" pattern="\d+"> {{lang_minutes}}</div> - <div> - <div class="checkbox checkbox-inline"> - <input name="quick" type="checkbox" value="on" id="rb-quick"> - <label for="rb-quick">{{lang_kexecRebootCheck}}</label> - </div> - </div> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" data-dismiss="modal">{{lang_cancel}}</button> - <button type="submit" {{perms.action.reboot.disabled}} name="action" value="reboot" class="btn btn-warning"> - <span class="glyphicon glyphicon-repeat"></span> - {{lang_reboot}} - </button> - </div> - </div> - </div> - </div> - - <div class ="modal fade" id="shutdownModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel2"> - <div class="modal-dialog" role="document"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> - <h4 class="modal-title" id="myModalLabel2">{{lang_shutdownButton}}</h4> - </div> - <div class="modal-body"> - <div>{{lang_shutdownCheck}}</div> - {{lang_shutdownIn}} <input name="s-minutes" title="{{lang_shutdownIn}}" type="number" value="0" min="0" pattern="\d+"> {{lang_minutes}} - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" data-dismiss="modal">{{lang_cancel}}</button> - <button type="submit" {{perms.action.shutdown.disabled}} name="action" value="shutdown" class="btn btn-danger"> - <span class="glyphicon glyphicon-off"></span> - {{lang_shutdownButton}} - </button> - </div> - </div> - </div> - </div> -</form> - - -<script type="application/javascript"> - var $dataTable; - - document.addEventListener("DOMContentLoaded", function() { - - $dataTable = $("#dataTable"); - markCheckedRows(); - // Handle change of checkboxes in table - $('input:checkbox').change(function() { - var $this = $(this); - //give each checkbox the function to mark the row (in green) - if ($this.is(':checked')) { - markRows($this.closest("tr"), true); - $this.closest("td").data("sort-value", 1); - } else { - markRows($this.closest("tr"), false); - $this.closest("td").data("sort-value", 0); - } - - //if all are checked, change the selectAll-Button to unselectAll. if one is not checked, change unselectAll to selectAll - var unchecked = $dataTable.find("input:checkbox:not(:checked)").length; - var checked = $dataTable.find("input:checkbox:checked").length; - if (unchecked === 0) { - $('#selectAllButton').hide(); - $('#unselectAllButton').show(); - } else if (checked === 0) { - $('#selectAllButton').show(); - $('#unselectAllButton').hide(); - } - - //if no client is selected, disable the shutdown/reboot button, and enable them if a client is selected - $('#rebootButton').prop('disabled', checked === 0 || '{{perms.action.reboot.disabled}}' === 'disabled'); - $('#shutdownButton').prop('disabled', checked === 0 || '{{perms.action.shutdown.disabled}}' === 'disabled'); - }); - // Propagate click on column with checkbox to checkbox - $('.checkboxColumn').click(function(e) { - if (e.target === this) { - $(this).find('input:checkbox').click(); - } - }); - // Arm the (de)select all buttons - $('#selectAllButton').click(function() { selectAllRows(true); }); - $('#unselectAllButton').click(function() { selectAllRows(false); }); - }); - - // Check all checkboxes, change selectAll button, make shutdown/reboot button enabled as clients will certainly be selected - function selectAllRows(selected) { - var $box = $dataTable.find('input:checkbox'); - if ($box.length === 0) return; - if (selected) { - $box = $box.filter(':not(:checked)'); - } else { - $box = $box.filter(':checked'); - } - if ($box.length === 0) return; - $box.prop('checked', !!selected).trigger('change'); - } - - // mark all previous checked rows (used when loading site), enable (de)select all if list is not empty - function markCheckedRows() { - var $checked = $dataTable.find("input:checkbox:checked"); - markRows($checked.closest("tr"), true); - var $unchecked = $dataTable.find("input:checkbox:not(:checked)"); - markRows($unchecked.closest("tr"), false); - if($unchecked.length === 0) { - $('#selectAllButton').hide(); - $('#unselectAllButton').show(); - } - if ($unchecked.length > 0 || $checked.length > 0) { - $('.select-button').prop('disabled', false); - } - } - - function markRows($rows, marked) { - if (marked) { - $rows.addClass('active'); - } else { - $rows.removeClass('active'); - } - } - -</script>
\ No newline at end of file diff --git a/modules-available/rebootcontrol/templates/exec-enter-command.html b/modules-available/rebootcontrol/templates/exec-enter-command.html new file mode 100644 index 00000000..5916e2a8 --- /dev/null +++ b/modules-available/rebootcontrol/templates/exec-enter-command.html @@ -0,0 +1,41 @@ +<h2>{{lang_execRemoteCommand}}</h2> + +<table class="table table-hover stupidtable" id="dataTable"> + <thead> + <tr> + <th data-sort="string">{{lang_client}}</th> + <th data-sort="ipv4">{{lang_ip}}</th> + <th data-sort="string"> + {{lang_status}} + </th> + </tr> + </thead> + + <tbody> + {{#clients}} + <tr> + <td>{{hostname}}{{^hostname}}{{machineuuid}}{{/hostname}}</td> + <td>{{clientip}}</td> + <td>{{state}}</td> + </tr> + {{/clients}} + </tbody> +</table> + +<h3>{{lang_enterCommand}}</h3> + +<form method="post" action="?do=rebootcontrol" id="list-form"> + <input type="hidden" name="token" value="{{token}}"> + <input type="hidden" name="show" value="exec"> + <input type="hidden" name="id" value="{{id}}"> + <div> + <label for="script-text">{{lang_scriptOrCommand}}</label> + <textarea id="script-text" class="form-control" name="script" rows="10"></textarea> + </div> + <div class="text-right slx-space"> + <button type="submit" class="btn btn-primary" name="action" value="exec"> + <span class="glyphicon glyphicon-play"></span> + {{lang_remoteExec}} + </button> + </div> +</form>
\ No newline at end of file diff --git a/modules-available/rebootcontrol/templates/header.html b/modules-available/rebootcontrol/templates/header.html index e171ccd6..6d38b939 100644 --- a/modules-available/rebootcontrol/templates/header.html +++ b/modules-available/rebootcontrol/templates/header.html @@ -1,34 +1,9 @@ <div class="page-header"> - <button type="button" id="settingsButton" class="btn btn-default pull-right" data-toggle="modal" data-target="#settingsModal"><span class="glyphicon glyphicon-cog"></span> {{lang_settings}}</button> - <h1>{{lang_rebootControl}}</h1> -</div> - -<div> - <label>{{lang_location}}: - <select id="locationDropdown" class="form-control" onchange="selectLocation()"> - {{#locations}} - <option value="{{locationid}}" {{disabled}} {{#selected}}selected{{/selected}}>{{locationpad}} {{locationname}}</option> - {{/locations}} - </select> - </label> - <div class="pull-right"> - <button type="button" id="shutdownButton" class="btn btn-danger action-button" data-toggle="modal" data-target="#shutdownModal" disabled> - <span class="glyphicon glyphicon-off"></span> - {{lang_shutdownButton}} - </button> - <button type="button" id="rebootButton" class="btn btn-warning action-button" data-toggle="modal" data-target="#rebootModal" disabled> - <span class="glyphicon glyphicon-repeat"></span> - {{lang_rebootButton}} - </button> - <button type="button" id="selectAllButton" class="btn btn-primary select-button" disabled> - <span class="glyphicon glyphicon-check"></span> - {{lang_selectall}} - </button> - <button type="button" id="unselectAllButton" class="btn btn-default select-button collapse" disabled> - <span class="glyphicon glyphicon-unchecked"></span> - {{lang_unselectall}} - </button> - </div> + <button type="button" id="settingsButton" class="btn btn-default pull-right" data-toggle="modal" data-target="#settingsModal"> + <span class="glyphicon glyphicon-cog"></span> + {{lang_settings}} + </button> + <h1>{{lang_moduleHeading}}</h1> </div> <div id="settingsModal" class="modal fade" role="dialog"> @@ -40,40 +15,73 @@ <h4 class="modal-title"><b>{{lang_settings}}</b></h4> </div> <div class="modal-body"> - <p>{{lang_pubKey}}</p> - <pre id="pubkey">{{pubKey}}</pre> + <label for="pubkey">{{lang_pubKey}}</label> + <pre id="pubkey">{{pubkey}}</pre> <p>{{lang_newKeypairExplanation}}</p> - </div> - <div class="modal-footer"> - <button {{perms.newkeypair.disabled}} class="btn btn-danger pull-right" onclick="generateNewKeypair()" type="button"> + <div class="checkbox"> + <input {{perms.newkeypair.disabled}} type="checkbox" id="keypair-confirm"> + <label for="keypair-confirm">{{lang_keypairConfirmCheck}}</label> + </div> + <button {{perms.newkeypair.disabled}} class="btn btn-danger pull-right" id="keypair-button" + onclick="generateNewKeypair()" type="button"> <span class="glyphicon glyphicon-refresh"></span> {{lang_genNew}} </button> + <div class="clearfix"></div> + </div> + <div class="modal-body"> + <label>{{lang_wolDiscoverHeading}}</label> + <form method="post" action="?do=rebootcontrol"> + <input type="hidden" name="token" value="{{token}}"> + <input type="hidden" name="action" value="toggle-wol"> + <div class="checkbox"> + <input {{perms.woldiscover.disabled}} id="wol-auto-discover" type="checkbox" name="enabled" {{wol_auto_checked}}> + <label for="wol-auto-discover">{{lang_wolAutoDiscoverCheck}}</label> + </div> + <div class="slx-space"></div> + <p>{{lang_wolDiscoverDescription}}</p> + <button {{perms.woldiscover.disabled}} class="btn btn-primary pull-right" + onclick="generateNewKeypair()" type="submit"> + <span class="glyphicon glyphicon-floppy-disk"></span> + {{lang_saveWolAutoDiscover}} + </button> + <div class="clearfix"></div> + </form> + </div> + <div class="modal-body"> </div> </div> </div> </div> <script type="application/javascript"> - - // Change Location when selected in Dropdown Menu - function selectLocation() { - var dropdown = $("#locationDropdown"); - var location = dropdown.val(); - window.location.replace("?do=rebootcontrol&location="+location); - } - - function generateNewKeypair() { - if (!confirm('{{lang_confirmNewKeypair}}')) +document.addEventListener('DOMContentLoaded', function() { + var $btn = $('#keypair-button'); + var $chk = $('#keypair-confirm'); + $chk.prop('checked', false); // Firefox helpfully keeping state on F5 + $btn.click(function() { + if (!$chk.is(':checked')) { + var $p = $chk.parent(); + $p.fadeOut(100, function () { + $p.fadeIn(75); + }); return; + } + $btn.prop('disabled', true); $.ajax({ url: '?do=rebootcontrol', type: 'POST', data: { action: "generateNewKeypair", token: TOKEN }, success: function(value) { $('#pubkey').text(value); + }, + fail: function() { + $('#pubkey').text('Error'); + $btn.prop('disabled', false); } }); - } + }); +}); + </script>
\ No newline at end of file diff --git a/modules-available/rebootcontrol/templates/jumphost-edit.html b/modules-available/rebootcontrol/templates/jumphost-edit.html new file mode 100644 index 00000000..7a79dc86 --- /dev/null +++ b/modules-available/rebootcontrol/templates/jumphost-edit.html @@ -0,0 +1,42 @@ +<h2>{{lang_editJumpHost}}</h2> + +<form method="post" action="?do=rebootcontrol"> + <input type="hidden" name="token" value="{{token}}"> + <input type="hidden" name="show" value="jumphost"> + <input type="hidden" name="hostid" value="{{hostid}}"> + <div class="list-group"> + <div class="list-group-item"> + <div class="row"> + <div class="col-md-9 col-sm-7"> + <label for="host">{{lang_host}}</label> + <input required id="host" class="form-control" type="text" name="host" value="{{host}}"> + </div> + <div class="col-md-3 col-sm-5"> + <label for="port">{{lang_port}}</label> + <input required id="port" class="form-control" type="number" name="port" value="{{port}}" min="1" max="65535"> + </div> + </div> + </div> + <div class="list-group-item"> + <label for="username">{{lang_username}}</label> + <input required id="username" class="form-control" type="text" name="username" value="{{username}}"> + </div> + <div class="list-group-item"> + <label for="sshkey">{{lang_privkey}}</label> + <textarea required id="sshkey" class="form-control" name="sshkey" rows="8">{{sshkey}}</textarea> + </div> + <div class="list-group-item"> + <label for="script">{{lang_wakeupScript}}</label> + <textarea required id="script" class="form-control" name="script" rows="8">{{script}}</textarea> + <div class="slx-smallspace"></div> + <p>{{lang_wakeScriptHelp}}</p> + </div> + </div> + <div class="buttonbar text-right"> + <button type="reset" class="btn btn-default">{{lang_reset}}</button> + <button type="submit" class="btn btn-primary" name="action" value="save"> + <span class="glyphicon glyphicon-floppy-disk"></span> + {{lang_save}} + </button> + </div> +</form>
\ No newline at end of file diff --git a/modules-available/rebootcontrol/templates/jumphost-list.html b/modules-available/rebootcontrol/templates/jumphost-list.html new file mode 100644 index 00000000..6023c872 --- /dev/null +++ b/modules-available/rebootcontrol/templates/jumphost-list.html @@ -0,0 +1,65 @@ +<h2>{{lang_settings}}</h2> + +<h3>{{lang_wolReachability}}</h3> + +<h4>{{lang_jumpHosts}}</h4> + +<form method="post" action="?do=rebootcontrol"> + <input type="hidden" name="token" value="{{token}}"> + <input type="hidden" name="show" value="jumphost"> + <input type="hidden" name="action" value="list"> + <table class="table"> + <thead> + <tr> + <th>{{lang_host}}</th> + <th class="slx-smallcol">{{lang_numAssignedSubnets}}</th> + <th class="slx-smallcol">{{lang_reachable}}</th> + <th class="slx-smallcol"></th> + </tr> + </thead> + <tbody> + {{#jumpHosts}} + <tr> + <td>{{host}}:{{port}}</td> + <td class="text-nowrap text-right"> + <a class="btn btn-xs btn-default {{perms.jumphost.assign-subnet.disabled}}" + href="?do=rebootcontrol&show=jumphost&what=assign&id={{hostid}}"> + <span class="glyphicon glyphicon-tasks"></span> + </a> + <span class="badge">{{subnetCount}}</span> + </td> + <td class="text-nowrap text-center"> + {{#reachable}} + <span class="glyphicon glyphicon-ok text-success"></span> + {{/reachable}} + {{^reachable}} + <span class="glyphicon glyphicon-remove text-danger"></span> + {{/reachable}} + <button class="btn btn-xs btn-default btn-check-jumphost" type="submit" name="checkid" value="{{hostid}}" + {{perms.jumphost.edit.disabled}}> + {{lang_check}} + </button> + </td> + <td class="text-nowrap text-center"> + <a class="btn btn-xs btn-default {{perms.jumphost.edit.disabled}}" + href="?do=rebootcontrol&show=jumphost&what=edit&id={{hostid}}"> + <span class="glyphicon glyphicon-edit"></span> + </a> + <button type="submit" name="deleteid" value="{{hostid}}" class="btn btn-xs btn-danger" + data-confirm="#confirm-delete-host" data-title="{{host}}" {{perms.jumphost.edit.disabled}}> + <span class="glyphicon glyphicon-trash"></span> + </button> + </td> + </tr> + {{/jumpHosts}} + </tbody> + </table> +</form> +<div class="buttonbar text-right"> + <a class="btn btn-success" href="?do=rebootcontrol&show=jumphost&what=edit&id=new"> + <span class="glyphicon glyphicon-plus"></span> + {{lang_new}} + </a> +</div> + +<div class="hidden" id="confirm-delete-host">{{lang_hostDeleteConfirm}}</div>
\ No newline at end of file diff --git a/modules-available/rebootcontrol/templates/jumphost-subnets.html b/modules-available/rebootcontrol/templates/jumphost-subnets.html new file mode 100644 index 00000000..9b418667 --- /dev/null +++ b/modules-available/rebootcontrol/templates/jumphost-subnets.html @@ -0,0 +1,28 @@ +<h2>{{lang_jumpHost}} {{host}} - {{lang_assignedSubnets}}</h2> + +<form method="post" action="?do=rebootcontrol"> + <input type="hidden" name="token" value="{{token}}"> + <input type="hidden" name="show" value="jumphost"> + <input type="hidden" name="action" value="assign"> + <input type="hidden" name="hostid" value="{{hostid}}"> + <div class="list-group"> + <div class="list-group-item"> + {{#list}} + <div class="row"> + <div class="col-md-12"> + <div class="checkbox"> + <input id="check-{{subnetid}}" type="checkbox" name="subnet[{{subnetid}}]" {{checked}}> + <label for="check-{{subnetid}}">{{cidr}}</label> + </div> + </div> + </div> + {{/list}} + <div class="text-right"> + <button type="submit" class="btn btn-primary"> + <span class="glyphicon glyphicon-floppy-disk"></span> + {{lang_save}} + </button> + </div> + </div> + </div> +</form>
\ No newline at end of file diff --git a/modules-available/rebootcontrol/templates/status-checkconnection.html b/modules-available/rebootcontrol/templates/status-checkconnection.html new file mode 100644 index 00000000..e31d95ea --- /dev/null +++ b/modules-available/rebootcontrol/templates/status-checkconnection.html @@ -0,0 +1,47 @@ +<h3>{{lang_checkingJumpHost}}: {{host}}</h3> + +<div class="clearfix"></div> +<div class="collapse alert alert-success" id="result-ok"> + <span class="glyphicon glyphicon-check"></span> + {{lang_hostReachable}} +</div> +<div class="collapse alert alert-warning" id="result-error"> + <span class="glyphicon glyphicon-remove"></span> + {{lang_hostNonZeroExit}} +</div> +<div class="collapse alert alert-danger" id="result-unreach"> + <span class="glyphicon glyphicon-remove"></span> + {{lang_hostNotReachable}} +</div> + +<div class="collapse" id="log-wrapper"> + <label for="log-output">{{lang_checkOutputLabel}}</label> + <pre id="log-output"></pre> +</div> + +<div data-tm-id="{{taskId}}" data-tm-log="error" data-tm-callback="updateStatus">{{lang_checkingJumpHost}}</div> +<script type="application/javascript"> + function updateStatus(task) { + if (!task || !task.data || !task.data.result || !task.data.result['{{host}}']) + return; + var status = task.data.result['{{host}}']; + var log = ''; + if (status.stderr) log += status.stderr + "\n"; + if (status.stdout) log += status.stdout + "\n"; + showErrorLog(log); + if (task.statusCode === 'TASK_FINISHED' || task.statusCode === 'TASK_ERROR') { + if (status.exitCode === 0) { + $('#result-ok').show(); + } else if (status.exitCode > 0) { + $('#result-error').show(); + } else { + $('#result-unreach').show(); + } + } + } + function showErrorLog(log) { + if (!log) return; + $('#log-output').text(log); + $('#log-wrapper').show(); + } +</script> diff --git a/modules-available/rebootcontrol/templates/status-exec.html b/modules-available/rebootcontrol/templates/status-exec.html new file mode 100644 index 00000000..403b7fca --- /dev/null +++ b/modules-available/rebootcontrol/templates/status-exec.html @@ -0,0 +1,63 @@ +<div data-tm-id="{{id}}" data-tm-log="error" data-tm-callback="updateStatus">{{lang_executingRemotely}}</div> + +<div class="slx-space"></div> + +<div class="list-group"> + <div class="list-group-item"> +<div class="row"> + <div class="col-md-6 col-sm-8 col-xs-12 slx-bold">{{lang_host}}</div> + <div class="col-md-4 col-sm-2 col-xs-6 slx-bold">{{lang_status}}</div> + <div class="col-md-2 col-sm-2 col-xs-6 slx-bold text-right">{{lang_exitCode}}</div> +</div> + </div> + +{{#clients}} +<div class="list-group-item" id="client-{{machineuuid}}"> + <div class="row"> + <div class="col-md-6 col-sm-8 col-xs-12 slx-bold">{{hostname}}{{^hostname}}{{clientip}}{{/hostname}}</div> + <div class="col-md-4 col-sm-2 col-xs-6 state"></div> + <div class="col-md-2 col-sm-2 col-xs-6 text-right exitCode"></div> + </div> + <div class="stdout collapse"> + <i>{{lang_stdout}}</i> + <pre></pre> + </div> + <div class="stderr collapse"> + <i>{{lang_stderr}}</i> + <pre></pre> + </div> +</div> +{{/clients}} +</div> + +<script><!-- + +var ignoreHosts = {}; + +function updateStatus(task) { + if (!task || !task.data || !task.data.result) + return; + for (var host in task.data.result) { + if (!task.data.result.hasOwnProperty(host) || ignoreHosts[host]) + continue; + updateStatusClient(host, task.data.result[host]); + } +} + +function updateStatusClient(id, status) { + var $p = $('#client-' + id); + if ($p.length === 0) + return; + $p.find('.state').text(status.state); + if (status.stdout) $p.find('.stdout').show().find('pre').text(status.stdout); + if (status.stderr) $p.find('.stderr').show().find('pre').text(status.stderr); + if (status.state === 'DONE' || status.state === 'ERROR' || status.state === 'TIMEOUT') { + $p.find('.state').addClass((status.state === 'DONE') ? 'text-success' : 'text-danger'); + if (status.exitCode >= 0) { + $p.find('.exitCode').text(status.exitCode).addClass((status.exitCode === 0 ? 'text-success' : 'text-danger')); + } + ignoreHosts[id] = true; + } +} + +//--></script>
\ No newline at end of file diff --git a/modules-available/rebootcontrol/templates/status.html b/modules-available/rebootcontrol/templates/status-reboot.html index c05b2fad..240c4387 100644 --- a/modules-available/rebootcontrol/templates/status.html +++ b/modules-available/rebootcontrol/templates/status-reboot.html @@ -1,37 +1,35 @@ -<div> - <form class="form-inline"> - <b>{{lang_location}}: {{locationName}}</b> - <input type="hidden" name="do" value="rebootcontrol"> - <input type="hidden" name="location" value="{{locationId}}"> - <button type="submit" class="btn btn-primary pull-right"><span class="glyphicon glyphicon-arrow-left"></span> {{lang_back}}</button> - </form> -</div> +<h3>{{action}}</h3> +{{#locations}} +<div class="loc">{{name}}</div> +{{/locations}} +<div class="clearfix slx-space"></div> -<div> - <table class="table table-hover stupidtable" id="dataTable"> - <thead> - <tr> - <th data-sort="string">{{lang_client}}</th> - <th data-sort="ipv4">{{lang_ip}}</th> - <th data-sort="string"> - {{lang_status}} - </th> - </tr> - </thead> +<table class="table table-hover stupidtable" id="dataTable"> + <thead> + <tr> + <th data-sort="string">{{lang_client}}</th> + <th data-sort="ipv4">{{lang_ip}}</th> + <th data-sort="string"> + {{lang_status}} + </th> + </tr> + </thead> - <tbody> - {{#clients}} - <tr> - <td>{{hostname}}{{^hostname}}{{machineuuid}}{{/hostname}}</td> - <td>{{clientip}}</td> - <td id="status-{{machineuuid}}"></td> - </tr> - {{/clients}} - </tbody> - </table> -</div> + <tbody> + {{#clients}} + <tr> + <td>{{hostname}}{{^hostname}}{{machineuuid}}{{/hostname}}</td> + <td>{{clientip}}</td> + <td> + <span id="status-{{machineuuid}}" class="machineuuid" data-uuid="{{machineuuid}}"></span> + <span id="text-{{machineuuid}}"></span> + </td> + </tr> + {{/clients}} + </tbody> +</table> -<div data-tm-id="{{taskId}}" data-tm-log="error" data-tm-callback="updateStatus"></div> +<div data-tm-id="{{id}}" data-tm-log="error" data-tm-callback="updateStatus"></div> <script type="application/javascript"> statusStrings = { @@ -48,11 +46,12 @@ function updateStatus(task) { if (!task || !task.data || !task.data.clientStatus) return; + stillActive = true; var clientStatus = task.data.clientStatus; for (var uuid in clientStatus) { if (!clientStatus.hasOwnProperty(uuid)) continue; - var $s = $("#status-" + uuid); + var $s = $("#text-" + uuid); var status = clientStatus[uuid]; if ($s.data('state') === status) continue; diff --git a/modules-available/rebootcontrol/templates/status-wol.html b/modules-available/rebootcontrol/templates/status-wol.html new file mode 100644 index 00000000..3e83126c --- /dev/null +++ b/modules-available/rebootcontrol/templates/status-wol.html @@ -0,0 +1,52 @@ +{{#locations}} +<div class="loc">{{name}}</div> +{{/locations}} +<div class="clearfix slx-space"></div> + +{{#tasks}} +<div data-tm-id="{{.}}" data-tm-callback="wolCallback">{{lang_aWolJob}}</div> +{{/tasks}} +{{^tasks}} +<div class="alert alert-warning"> + <span class="glyphicon glyphicon-exclamation-sign"></span> + {{lang_noTasksForJob}} +</div> +{{/tasks}} + +<pre>{{log}}</pre> + +<table class="table table-hover stupidtable" id="dataTable"> + <thead> + <tr> + <th data-sort="string">{{lang_client}}</th> + <th data-sort="ipv4">{{lang_ip}}</th> + <th data-sort="string"> + {{lang_status}} + </th> + </tr> + </thead> + + <tbody> + {{#clients}} + <tr> + <td>{{hostname}}{{^hostname}}{{machineuuid}}{{^machineuuid}}{{clientip}}{{/machineuuid}}{{/hostname}}</td> + <td>{{clientip}}</td> + {{#machineuuid}} + <td> + <span id="status-{{machineuuid}}" class="machineuuid" data-uuid="{{machineuuid}}"></span> + <span id="spinner-{{machineuuid}}" class="glyphicon glyphicon-refresh slx-rotation"> + </td> + {{/machineuuid}} + {{^machineuuid}} + <td></td> + {{/machineuuid}} + </tr> + {{/clients}} + </tbody> +</table> + +<script><!-- +function wolCallback(task) { + stillActive = true; +} +//--></script>
\ No newline at end of file diff --git a/modules-available/rebootcontrol/templates/subnet-edit.html b/modules-available/rebootcontrol/templates/subnet-edit.html new file mode 100644 index 00000000..d8173863 --- /dev/null +++ b/modules-available/rebootcontrol/templates/subnet-edit.html @@ -0,0 +1,70 @@ +<!-- subnetid, start, end, fixed, isdirect, lastdirectcheck, lastseen, seencount --> + +<form method="post" action="?do=rebootcontrol"> + <input type="hidden" name="token" value="{{token}}"> + <input type="hidden" name="show" value="subnet"> + <input type="hidden" name="id" value="{{subnetid}}"> + <div class="panel panel-default"> + <div class="panel-heading"> + {{lang_editSubnet}}: <b>{{cidr}}</b> ({{start_s}} - {{end_s}}) + </div> + <div class="list-group"> + <div class="list-group-item"> + <div class="checkbox"> + <input id="fixed_cb" type="checkbox" name="fixed" {{#fixed}}checked{{/fixed}} {{perms.subnet.flag.disabled}}> + <label for="fixed_cb">{{lang_fixSubnetSettings}}</label> + </div> + <div class="slx-space"></div> + <p>{{lang_fixSubnetDesc}}</p> + </div> + <div class="list-group-item {{^fixed}}collapse{{/fixed}} subnet-option"> + <div class="checkbox"> + <input id="direct_cb" type="checkbox" name="isdirect" {{#isdirect}}checked{{/isdirect}} {{perms.subnet.flag.disabled}}> + <label for="direct_cb">{{lang_reachableFromServer}}</label> + </div> + <div class="slx-space"></div> + <p>{{lang_reachableFromServerDesc}}</p> + </div> + <div class="list-group-item {{perms.jumphost.view.hidden}}"> + <label>{{lang_assignedJumpHosts}}</label> + {{#jumpHosts}} + <div class="row"> + <div class="col-md-12"> + <div class="checkbox"> + <input id="jhb{{hostid}}" type="checkbox" name="jumphost[{{hostid}}]" {{checked}} + {{perms.jumphost.assign-subnet.disabled}}> + <label for="jhb{{hostid}}">{{host}}:{{port}}</label> + </div> + </div> + </div> + {{/jumpHosts}} + </div> + <div class="list-group-item"> + <label>{{lang_reachableFrom}}</label> + {{#sourceNets}} + <div>{{cidr}}</div> + {{/sourceNets}} + </div> + </div> + <div class="panel-footer text-right"> + <button type="submit" class="btn btn-primary" name="action" value="edit" {{perms.subnet.flag.disabled}}> + <span class="glyphicon glyphicon-floppy-disk"></span> + {{lang_save}} + </button> + </div> + </div> +</form> +<script><!-- +document.addEventListener('DOMContentLoaded', function() { + var $overrides = $('.subnet-option'); + var $cb = $('#fixed_cb'); + $cb.change(function() { + if ($cb.is(':checked')) { + $overrides.show(); + } else { + $overrides.hide(); + } + }).change(); + +}); +//--></script> diff --git a/modules-available/rebootcontrol/templates/subnet-list.html b/modules-available/rebootcontrol/templates/subnet-list.html new file mode 100644 index 00000000..bf6cee1c --- /dev/null +++ b/modules-available/rebootcontrol/templates/subnet-list.html @@ -0,0 +1,53 @@ +<!-- subnetid, start, end, fixed, isdirect, lastdirectcheck, lastseen, seencount --> + +<h2>{{lang_subnets}}</h2> + +<p>{{lang_subnetsDescription}}</p> + +<p>{{lang_wolMachineSupportText}}</p> + +<table class="table"> + <thead> + <tr> + <th>{{lang_subnet}}</th> + <th class="slx-smallcol">{{lang_isFixed}}</th> + <th class="slx-smallcol">{{lang_isDirect}}</th> + <th class="slx-smallcol">{{lang_wolReachability}}</th> + <th class="slx-smallcol">{{lang_lastseen}}</th> + </tr> + </thead> + <tbody> + {{#subnets}} + <tr> + <td> + <a href="?do=rebootcontrol&show=subnet&what=subnet&id={{subnetid}}">{{cidr}}</a> + </td> + <td class="text-center">{{#fixed}}<span class="glyphicon glyphicon-lock"></span>{{/fixed}}</td> + <td class="text-center">{{#isdirect}}<span class="glyphicon glyphicon-ok"></span>{{/isdirect}}</td> + <td class="text-right">{{jumphostcount}} / {{sourcecount}}</td> + <td class="{{lastseen_class}}">{{lastseen_s}}</td> + </tr> + {{/subnets}} + </tbody> +</table> + +<form method="post" action="?do=rebootcontrol"> + <input type="hidden" name="token" value="{{token}}"> + <input type="hidden" name="show" value="subnet"> + <div class="list-group"> + <div class="list-group-item"> + <label>{{lang_addNewSubnet}}</label> + <div class="row"> + <div class="col-md-4 col-sm-6"> + <input class="form-control" type="text" name="cidr" placeholder="1.2.3.0/24"> + </div> + <div class="col-md-4 col-sm-6"> + <button class="btn btn-primary" name="action" value="add"> + <span class="glyphicon glyphicon-floppy-disk"></span> + {{lang_add}} + </button> + </div> + </div> + </div> + </div> +</form> diff --git a/modules-available/rebootcontrol/templates/task-header.html b/modules-available/rebootcontrol/templates/task-header.html new file mode 100644 index 00000000..211c16e5 --- /dev/null +++ b/modules-available/rebootcontrol/templates/task-header.html @@ -0,0 +1,4 @@ +<p> + {{lang_taskListIntro}} +</p> +<div class="slx-space"></div>
\ No newline at end of file diff --git a/modules-available/rebootcontrol/templates/task-list.html b/modules-available/rebootcontrol/templates/task-list.html index 063ba949..5ab75675 100644 --- a/modules-available/rebootcontrol/templates/task-list.html +++ b/modules-available/rebootcontrol/templates/task-list.html @@ -2,9 +2,8 @@ <table class="table"> <thead> <tr> - <th>{{lang_mode}}</th> + <th>{{lang_task}}</th> <th>{{lang_location}}</th> - <th>{{lang_time}}</th> <th>{{lang_clientCount}}</th> <th>{{lang_status}}</th> </tr> @@ -12,19 +11,20 @@ <tbody> {{#list}} <tr> - <td> - <a href="?do=rebootcontrol&taskid={{taskId}}">{{mode}}</a> + <td class="text-nowrap"> + <a href="?do=rebootcontrol&show=task&what=task&taskid={{id}}">{{type}}</a> + <div class="small">{{action}}</div> </td> <td> - {{locationName}} + {{#locations}} + <div class="loc">{{name}}</div> + {{/locations}} + <div class="clearfix"></div> </td> - <td> - {{time}} + <td class="text-nowrap"> + {{clients}} </td> - <td> - {{clientCount}} - </td> - <td> + <td class="text-nowrap"> {{status}} </td> </tr> |