Skip to content

Commit 1ef67f8

Browse files
committed
added 'delete server' functionality to server
show base_directory in webui when displaying paths
1 parent 5f6b892 commit 1ef67f8

File tree

6 files changed

+156
-13
lines changed

6 files changed

+156
-13
lines changed

html/css/custom.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,8 @@ li.accordion-group a, ul.nav, .pointer {
6363
.table-hover tbody tr:hover > td,
6464
.table-hover tbody tr:hover > td{
6565
background-color: #ddd !important;
66+
}
67+
68+
#delete_server label {
69+
padding-left: 0;
6670
}

html/index.html

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,29 @@ <h4 class="title" data-bind=""><span class="icon icone-bookmark"></span> Ownersh
493493
</section>
494494
</div>
495495
<!--/ END Default Widget -->
496+
<!-- START Default Widget -->
497+
<div id="delete_server" class="span6 widget" data-bind="">
498+
<header>
499+
<h4 class="title" data-bind=""><span class="icon icone-bookmark"></span> Delete Server</h4>
500+
</header>
501+
<section class="body">
502+
<div class="body-inner">
503+
<div class="controls" id="delete_confirmations">
504+
<label class="checkbox">
505+
<input type="checkbox" value="true"> Delete <span data-bind="text: $root.dashboard.base_directory"></span>/servers/<span data-bind="text: $root.server().server_name"></span>
506+
</label>
507+
<label class="checkbox">
508+
<input type="checkbox" value="true"> Delete <span data-bind="text: $root.dashboard.base_directory"></span>/backup/<span data-bind="text: $root.server().server_name"></span>
509+
</label>
510+
<label class="checkbox">
511+
<input type="checkbox" value="true"> Delete <span data-bind="text: $root.dashboard.base_directory"></span>/archive/<span data-bind="text: $root.server().server_name"></span>
512+
</label>
513+
<button class="btn btn-warning btn-mini" data-bind="click: $root.delete_server">Delete </button>
514+
</div>
515+
</div>
516+
</section>
517+
</div>
518+
<!--/ END Default Widget -->
496519
</div>
497520
<!--/ END Row -->
498521

@@ -704,7 +727,7 @@ <h4 class="title">Create Server from an Archive</h4>
704727
</header>
705728
<section class="body">
706729
<div class="body-inner">
707-
<p>The files listed below are those located in the <strong class="text-success" data-placement="top" title="" rel="tooltip" data-original-title="Acceptable archives are .tar, .tar.gz, .tgz, and .zip">/import</strong> directory of your Minecraft data files.</p>
730+
<p>The files listed below are those located in the <strong class="text-success" data-placement="top" title="" rel="tooltip" data-original-title="Acceptable archives are .tar, .tar.gz, .tgz, and .zip"><span data-bind="text: $root.dashboard.base_directory"></span>/import</strong> directory of your Minecraft data files.</p>
708731
</div>
709732
</section>
710733
<table id="table_importable" class="table table-hover" data-bind="">
@@ -792,8 +815,8 @@ <h4>Server Profiles</h4>
792815
<section class="body">
793816
<div class="body-inner">
794817
<p>Server profiles may be prototyped by any user, but may only be updated by a user with write permissions on <strong class="text-success" data-placement="top" title="" rel="tooltip" data-original-title="chmod g+w profile.config">profile.config</strong>.
795-
<span data-bind="visible: $root.dashboard.whoami() != 'root'">The <strong>root</strong> user may extend these privileges to additional users by assigning <strong>profile.config</strong> to a new group and then adding authorized users to this group.</span>
796-
<span data-bind="visible: $root.dashboard.whoami() == 'root'">You may share this privilege with additional users by assigning <strong>profile.config</strong> to a new group and then adding authorized users to this group.</span></p>
818+
<span data-bind="visible: $root.dashboard.whoami() != 'root'">The <strong>root</strong> user may extend these privileges to additional users by assigning <strong><span data-bind="text: $root.dashboard.base_directory"></span>/profiles/profile.config</strong> to a new group and then adding authorized users to this group.</span>
819+
<span data-bind="visible: $root.dashboard.whoami() == 'root'">You may share this privilege with additional users by assigning <strong><span data-bind="text: $root.dashboard.base_directory"></span>/profiles/profile.config</strong> to a new group and then adding authorized users to this group.</span></p>
797820
Members of this group may update and remove profiles:
798821
<select id="pc_group" name="pc_group" data-bind="visible: $root.dashboard.whoami() == 'root', options: $root.dashboard.groups, event: { change: $root.change_pc_group }"></select>
799822
<strong data-bind="visible: $root.dashboard.whoami() != 'root', text: $root.dashboard.pc_group"></strong>

html/index_nl.html

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,29 @@ <h4 class="title" data-bind=""><span class="icon icone-bookmark"></span> Eigenaa
491491
</section>
492492
</div>
493493
<!--/ END Default Widget -->
494+
<!-- START Default Widget -->
495+
<div id="delete_server" class="span6 widget" data-bind="">
496+
<header>
497+
<h4 class="title" data-bind=""><span class="icon icone-bookmark"></span> Delete Server</h4>
498+
</header>
499+
<section class="body">
500+
<div class="body-inner">
501+
<div class="controls" id="delete_confirmations">
502+
<label class="checkbox">
503+
<input type="checkbox" value="true"> Delete <span data-bind="text: $root.dashboard.base_directory"></span>/servers/<span data-bind="text: $root.server().server_name"></span>
504+
</label>
505+
<label class="checkbox">
506+
<input type="checkbox" value="true"> Delete <span data-bind="text: $root.dashboard.base_directory"></span>/backup/<span data-bind="text: $root.server().server_name"></span>
507+
</label>
508+
<label class="checkbox">
509+
<input type="checkbox" value="true"> Delete <span data-bind="text: $root.dashboard.base_directory"></span>/archive/<span data-bind="text: $root.server().server_name"></span>
510+
</label>
511+
<button class="btn btn-warning btn-mini" data-bind="click: $root.delete_server">Delete </button>
512+
</div>
513+
</div>
514+
</section>
515+
</div>
516+
<!--/ END Default Widget -->
494517
</div>
495518
<!--/ END Row -->
496519

@@ -700,7 +723,7 @@ <h4 class="title">Aanmaken Server van een Archiefbestand</h4>
700723
</header>
701724
<section class="body">
702725
<div class="body-inner">
703-
<p>De onderstaande bestanden zijn in de Minecraft data directory <strong class="text-success" data-placement="top" title="" rel="tooltip" data-original-title="Acceptable archives are .tar, .tar.gz, .tgz, and .zip">/import</strong> gevonden.</p>
726+
<p>De onderstaande bestanden zijn in de Minecraft data directory <strong class="text-success" data-placement="top" title="" rel="tooltip" data-original-title="Acceptable archives are .tar, .tar.gz, .tgz, and .zip"><span data-bind="text: $root.dashboard.base_directory"></span>/import</strong> gevonden.</p>
704727
</div>
705728
</section>
706729
<table id="table_importable" class="table table-hover" data-bind="">
@@ -744,7 +767,7 @@ <h4>Server Profielen</h4>
744767
<div class="row-fluid">
745768
<section class="body">
746769
<div class="body-inner">
747-
<p>Server profielen mag door elke gebruiker worden aangemaakt, maar alleen een gebruiker met schrijfrechten kan <strong class="text-success" data-placement="top" title="" rel="tooltip" data-original-title="Gebruikers met schrijfrechten mogen profielen UPDATEN &amp; VERWIJDEREN">profile.config</strong> updaten. Je kunt dit recht met andere gebruikers delen door <strong>profile.config</strong> toe te kennen aan een nieuwe groep en vervolgens geautoriseerde gebruikers aan de groep toe te voegen.</p>
770+
<p>Server profielen mag door elke gebruiker worden aangemaakt, maar alleen een gebruiker met schrijfrechten kan <strong class="text-success" data-placement="top" title="" rel="tooltip" data-original-title="Gebruikers met schrijfrechten mogen profielen UPDATEN &amp; VERWIJDEREN">profile.config</strong> updaten. Je kunt dit recht met andere gebruikers delen door <strong><span data-bind="text: $root.dashboard.base_directory"></span>/profiles/profile.config</strong> toe te kennen aan een nieuwe groep en vervolgens geautoriseerde gebruikers aan de groep toe te voegen.</p>
748771
</div>
749772
</section>
750773
</div>

html/js/scriptin.js

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ function webui() {
198198
pc_permissions: ko.observable(),
199199
pc_group: ko.observable(),
200200
git_hash: ko.observable(),
201-
stock_profiles: ko.observableArray([])
201+
stock_profiles: ko.observableArray([]),
202+
base_directory: ko.observable()
202203
}
203204

204205
self.logs = {
@@ -417,6 +418,30 @@ function webui() {
417418
.then(function() {self.ajax.refresh(null)});
418419
}
419420

421+
self.delete_server = function(vm, eventobj) {
422+
var params = {
423+
server_name: self.server().server_name
424+
}
425+
426+
var unchecked = $('#delete_confirmations input[type=checkbox]').filter(function(i,v) {
427+
return !$(v).prop('checked');
428+
})
429+
430+
if (unchecked.length == 0) {
431+
$.getJSON('/delete_server', params)
432+
.then(self.ajax.received, self.ajax.lost)
433+
.done(function(){ self.show_page('dashboard') },
434+
function(){})
435+
} else {
436+
$.gritter.add({
437+
text: 'No action taken; must confirm all content will be deleted to continue.',
438+
sticky: false,
439+
time: '3000',
440+
class_name: 'gritter-warning'
441+
});
442+
}
443+
}
444+
420445
self.change_group = function(vm, eventobj) {
421446
var params = {
422447
group: $(eventobj.currentTarget).val(),
@@ -480,6 +505,13 @@ function webui() {
480505
$.getJSON('/vm/increments', params).then(self.refresh.increments);
481506
$.getJSON('/vm/archives', params).then(self.refresh.archives);
482507
$.getJSON('/vm/server_summary', params).then(self.refresh.summary);
508+
setTimeout(function() {
509+
$('#delete_server input[type="checkbox"]').not('.nostyle').iCheck({
510+
checkboxClass: 'icheckbox_minimal-grey',
511+
radioClass: 'iradio_minimal-grey',
512+
increaseArea: '40%' // optional
513+
});
514+
}, 500)
483515
break;
484516
case 'profiles':
485517
$.getJSON('/vm/profiles').then(self.refresh.profiles);
@@ -709,6 +741,7 @@ function webui() {
709741
self.dashboard.pc_group(data.pc_group);
710742
self.dashboard.git_hash(data.git_hash);
711743
self.dashboard.stock_profiles(data.stock_profiles);
744+
self.dashboard.base_directory(data.base_directory);
712745

713746
$('#pc_group option').filter(function () {
714747
return $(this).val() == data.pc_group

mineos.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ def _set_environment(self):
129129
'sc': os.path.join(self.env['cwd'], 'server.config'),
130130
'pc': os.path.join(self.base, self.DEFAULT_PATHS['profiles'], 'profile.config'),
131131
'sp_backup': os.path.join(self.env['bwd'], 'server.properties'),
132-
'sc_backup': os.path.join(self.env['bwd'], 'server.config'),
133-
'log': os.path.join(self.env['cwd'], 'server.log')
132+
'sc_backup': os.path.join(self.env['bwd'], 'server.config')
134133
})
135134

136135
def _load_config(self, load_backup=False, generate_missing=False):
@@ -430,6 +429,12 @@ def prune_archives(self, filename):
430429
"""Removes old archives by filename as a space-separated string."""
431430
self._command_direct(self.command_delete_files(filename), self.env['awd'])
432431

432+
@server_exists(True)
433+
@server_up(False)
434+
def delete_server(self):
435+
"""Deletes server files from system"""
436+
self._command_direct(self.command_delete_server, self.env['pwd'])
437+
433438
def remove_profile(self, profile):
434439
"""Removes a profile found in profile.config at the base_directory root"""
435440
try:
@@ -1069,6 +1074,19 @@ def command_delete_files(self, files):
10691074
self._previous_arguments = required_arguments
10701075
return 'rm -- %(files)s' % required_arguments
10711076

1077+
@property
1078+
@sanitize
1079+
def command_delete_server(self):
1080+
"""Deletes a server and all its related files and folders"""
1081+
required_arguments = {
1082+
'live': self.env['cwd'],
1083+
'backup': self.env['bwd'],
1084+
'archive': self.env['awd']
1085+
}
1086+
1087+
self._previous_arguments = required_arguments
1088+
return 'rm -rf -- %(live)s %(backup)s %(archive)s' % required_arguments
1089+
10721090
@sanitize
10731091
def command_chown(self, user, path):
10741092
"""Executes chown on a directory"""
@@ -1225,9 +1243,16 @@ def find_base(directory, match_dir):
12251243
def list_last_loglines(self, lines=100):
12261244
"""Returns last n lines from logfile"""
12271245
from procfs_reader import tail
1228-
1229-
with open(self.env['log'], 'rb') as log:
1230-
return tail(log, int(lines))
1246+
1247+
logfiles =['server.log', os.path.join('logs', 'latest.log')]
1248+
1249+
for i in logfiles:
1250+
try:
1251+
with open(os.path.join(self.env['cwd'], logfiles), 'rb') as log:
1252+
return tail(log, int(lines))
1253+
except IOError:
1254+
pass
1255+
return []
12311256

12321257
@classmethod
12331258
def list_servers_to_act(cls, action, base_directory):

mounts.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ def dashboard(self):
188188
'pc_permissions': profile_editable,
189189
'pc_group': pc_group,
190190
'git_hash': git_hash(os.path.dirname(os.path.abspath(__file__))),
191-
'stock_profiles': STOCK_PROFILES.keys()
191+
'stock_profiles': STOCK_PROFILES.keys(),
192+
'base_directory': self.base_directory,
192193
})
193194

194195
@cherrypy.expose
@@ -575,4 +576,38 @@ def change_pc_group(self, **raw_args):
575576

576577
response['payload'] = to_jsonable_type(retval)
577578
return dumps(response)
578-
579+
580+
@cherrypy.expose
581+
@require()
582+
def delete_server(self, **raw_args):
583+
args = {k:str(v) for k,v in raw_args.iteritems()}
584+
server_name = args.pop('server_name')
585+
retval = None
586+
587+
response = {
588+
'result': None,
589+
'cmd': 'delete_server',
590+
'payload': None
591+
}
592+
593+
try:
594+
if mc.has_server_rights(self.login, server_name, self.base_directory):
595+
instance = mc(server_name, None, self.base_directory)
596+
instance.delete_server()
597+
else:
598+
raise OSError('Server deletion failed. Only the server owner or root may delete servers.')
599+
except (RuntimeError, KeyError, OSError) as ex:
600+
response['result'] = 'error'
601+
retval = ex.message
602+
except CalledProcessError as ex:
603+
response['result'] = 'error'
604+
retval = ex.output
605+
except RuntimeWarning as ex:
606+
response['result'] = 'warning'
607+
retval = ex.message
608+
else:
609+
response['result'] = 'success'
610+
retval = "Server '%s' deleted" % server_name
611+
612+
response['payload'] = to_jsonable_type(retval)
613+
return dumps(response)

0 commit comments

Comments
 (0)