diff --git a/minecraft/index.cgi b/minecraft/index.cgi
index a063c687a..9a47c7adf 100644
--- a/minecraft/index.cgi
+++ b/minecraft/index.cgi
@@ -49,5 +49,5 @@ print &ui_buttons_row("atboot.cgi",
print &ui_buttons_end();
-&ui_print_footer("/", $text{'index_return'});
+&ui_print_footer("/", $text{'index'});
diff --git a/minecraft/lang/en b/minecraft/lang/en
index 48620f46e..2052bbe59 100644
--- a/minecraft/lang/en
+++ b/minecraft/lang/en
@@ -19,5 +19,8 @@ conf_title=Server Configuration
users_title=Users and Operators
logs_title=View Log File
+logs_lines=Show last
+logs_matching=lines matching
+logs_ok=Search
manual_title=Edit Configuration File
diff --git a/minecraft/minecraft-lib.pl b/minecraft/minecraft-lib.pl
index 24d7f6274..7f15a6baa 100644
--- a/minecraft/minecraft-lib.pl
+++ b/minecraft/minecraft-lib.pl
@@ -1,4 +1,8 @@
# Functions for editing the minecraft config
+#
+# XXX java param options
+# XXX plugins?
+# XXX world reset
BEGIN { push(@INC, ".."); };
use strict;
@@ -28,6 +32,41 @@ return undef;
# If the minecraft server is running, return the PID
sub is_minecraft_server_running
{
+&foreign_require("proc");
+my @procs = &proc::list_processes();
+my $jar = $config{'minecraft_jar'} ||
+ $config{'minecraft_dir'}."/"."minecraft_server.jar";
+my $shortjar = $jar;
+$shortjar =~ s/^.*\///;
+foreach my $p (@procs) {
+ if ($p->{'args'} =~ /\Q$config{'java_cmd'}\E.*(\Q$jar\E|\Q$shortjar\E)/) {
+ return $p->{'pid'};
+ }
+ }
+return undef;
+}
+
+# get_minecraft_config()
+# Parses the config into an array ref of hash refs
+sub get_minecraft_config
+{
+my @rv;
+my $fh = "CONFIG";
+my $lnum = 0;
+&open_readfile($fh, $config{'minecraft_dir'}."/server.properties") ||
+ return [ ];
+while(<$fh>) {
+ s/\r|\n//g;
+ s/#.*$//;
+ if (/^([^=]+)=(.*)/) {
+ push(@rv, { 'name' => $1,
+ 'value' => $2,
+ 'line' => $lnum });
+ }
+ $lnum++;
+ }
+close($fh);
+return \@rv;
}
1;
diff --git a/minecraft/module.info b/minecraft/module.info
index e53b4b832..a90b2333d 100644
--- a/minecraft/module.info
+++ b/minecraft/module.info
@@ -1,3 +1,3 @@
desc=Minecraft Server
-depends=init
+depends=init proc
category=servers
diff --git a/minecraft/view_logs.cgi b/minecraft/view_logs.cgi
new file mode 100644
index 000000000..80bd41a72
--- /dev/null
+++ b/minecraft/view_logs.cgi
@@ -0,0 +1,42 @@
+#!/usr/local/bin/perl
+# Show the log file, with searching
+
+use strict;
+use warnings;
+require './minecraft-lib.pl';
+our (%in, %text, %config);
+my $logfile = $config{'minecraft_dir'}."/server.log";
+&ReadParse();
+
+$in{'lines'} = undef if ($in{'lines'} !~ /^\d+$/);
+$in{'lines'} ||= 20;
+
+&ui_print_header(undef, $text{'logs_title'}, "");
+
+# Search form
+print &ui_form_start("view_logs.cgi");
+print "$text{'logs_lines'} ",
+ &ui_textbox("lines", $in{'lines'}, 5)." ".
+ "$text{'logs_matching'} ",
+ &ui_textbox("search", $in{'search'}, 20)." ".
+ &ui_submit($text{'logs_ok'})."
\n";
+print &ui_form_end()."
\n"; + +# Results +my $cmd; +if ($in{'search'}) { + $cmd = "grep ".quotemeta($in{'search'})." ".quotemeta($logfile)." | ". + "tail -".quotemeta($in{'lines'}); + } +else { + $cmd = "tail -".quotemeta($in{'lines'})." ".quotemeta($logfile); + } +print "
";
+my $fh = "OUT";
+&open_execute_command($fh, $cmd, 1, 1);
+while(<$fh>) {
+ print &html_escape($_);
+ }
+print "";
+
+&ui_print_footer("", $text{'index_return'});