mirror of
https://github.com/eliasstepanik/ark-ac-server-tools.git
synced 2026-01-15 20:08:29 +00:00
Merge pull request #113 from klightspeed/1.3-dev#rcon
RCON and Server Query implementation
This commit is contained in:
commit
5f026a8fd4
100
tools/arkmanager
100
tools/arkmanager
@ -90,6 +90,80 @@ checkConfig() {
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# Get server admin password
|
||||
#
|
||||
getAdminPassword() {
|
||||
if [ -n "${ark_ServerAdminPassword}" ]; then
|
||||
echo "${ark_ServerAdminPassword}"
|
||||
else
|
||||
sed -ne '/^\[ServerSettings\]/,/^\[.*\]/{s/^ServerAdminPassword[[:space:]]*=[[:space:]]*//p;}' "${arkserverroot}/ShooterGame/Saved/Config/LinuxServer/GameUserSettings.ini"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# Execute RCON command
|
||||
#
|
||||
rconcmd() {
|
||||
perl -MSocket -e '
|
||||
sub sendpkt {
|
||||
my ($sock, $reqid, $reqtype, $body) = @_;
|
||||
my $packet = pack("VVV", length($body) + 10, $reqid, $reqtype) . $body . "\0\0";
|
||||
send($sock, $packet, 0) or die "Error sending command to server";
|
||||
}
|
||||
|
||||
sub recvpkt {
|
||||
my ($sock) = @_;
|
||||
my $data = "";
|
||||
recv($sock, $data, 12, 0);
|
||||
my ($pktlen, $resid, $restype) = unpack("VVV", $data);
|
||||
recv($sock, $data, $pktlen - 8, 0);
|
||||
return ($resid, $restype, substr($data, 0, $pktlen - 10));
|
||||
}
|
||||
|
||||
sub auth {
|
||||
my ($sock, $password) = @_;
|
||||
my $reqid = 1;
|
||||
sendpkt($sock, $reqid, 3, $password);
|
||||
my ($resid, $restype, $rcvbody) = recvpkt($sock);
|
||||
die "Authentication failed" if $resid == -1;
|
||||
}
|
||||
|
||||
my $port = $ARGV[0];
|
||||
my $password = $ARGV[1];
|
||||
my $command = $ARGV[2];
|
||||
socket(my $socket, PF_INET, SOCK_STREAM, 0);
|
||||
setsockopt($socket, SOL_SOCKET, SO_RCVTIMEO, pack("i4", 30, 0, 0, 0));
|
||||
my $sockaddr = pack_sockaddr_in($port, inet_aton("127.0.0.1"));
|
||||
connect($socket, $sockaddr) or die "Error connecting to server";
|
||||
auth($socket, $password);
|
||||
sendpkt($socket, 2, 2, $command);
|
||||
my ($resid, $restype, $rcvbody) = recvpkt($socket);
|
||||
print $rcvbody, "\n";
|
||||
' "${ark_RCONPort}" "`getAdminPassword`" "$1"
|
||||
}
|
||||
|
||||
#
|
||||
# Save world
|
||||
#
|
||||
doSaveWorld() {
|
||||
rconcmd saveworld
|
||||
}
|
||||
|
||||
#
|
||||
# Exit cleanly
|
||||
#
|
||||
doExitServer() {
|
||||
rconcmd doexit
|
||||
}
|
||||
|
||||
#
|
||||
# Broadcast message
|
||||
#
|
||||
doBroadcast(){
|
||||
rconcmd "broadcast $1" >/dev/null
|
||||
}
|
||||
|
||||
#
|
||||
# Check if a new version is available but not apply it
|
||||
#
|
||||
@ -362,10 +436,23 @@ printStatus(){
|
||||
echo -e "$NORMAL" "Server online: " "$RED" "No" "$NORMAL"
|
||||
else
|
||||
echo -e "$NORMAL" "Server online: " "$GREEN" "Yes" "$NORMAL"
|
||||
perl -MSocket -e '
|
||||
my $port = int($ARGV[0]);
|
||||
socket(my $socket, PF_INET, SOCK_DGRAM, 0);
|
||||
setsockopt($socket, SOL_SOCKET, SO_RCVTIMEO, pack("i4", 1, 0, 0, 0));
|
||||
my $sockaddr = pack_sockaddr_in($port, inet_aton("127.0.0.1"));
|
||||
send($socket, "\xff\xff\xff\xffTSource Engine Query\x00", 0, $sockaddr);
|
||||
my $data = "";
|
||||
recv($socket, $data, 1400, 0) or (print "Unable to query server\n" and exit(1));
|
||||
my ($servername, $mapname, $game, $fullname, $rest) = split(/\x00/, substr($data, 6), 5);
|
||||
my $players = ord(substr($rest, 2, 1));
|
||||
my $maxplayers = ord(substr($rest, 3, 1));
|
||||
print "Server Name: $servername\n";
|
||||
print "Players: $players / $maxplayers\n";
|
||||
' "${ark_QueryPort}"
|
||||
fi
|
||||
getCurrentVersion
|
||||
echo -e "$NORMAL" "Server version: " "$GREEN" $instver "$NORMAL"
|
||||
|
||||
}
|
||||
|
||||
doUpgrade() {
|
||||
@ -425,7 +512,13 @@ case "$1" in
|
||||
doBackup
|
||||
;;
|
||||
broadcast)
|
||||
doInfo $2
|
||||
doBroadcast "$2"
|
||||
;;
|
||||
saveworld)
|
||||
doSaveWorld
|
||||
;;
|
||||
rconcmd)
|
||||
rconcmd "$2"
|
||||
;;
|
||||
status)
|
||||
printStatus
|
||||
@ -437,6 +530,9 @@ case "$1" in
|
||||
echo -e "Usage: arkmanager[OPTION]\n"
|
||||
echo "Option Description"
|
||||
echo "backup Saves a backup of your server inside the backup directory"
|
||||
echo "broadcast <msg> Sends a message to all users connected to server"
|
||||
echo "saveworld Saves the game world to disk"
|
||||
echo "rconcmd <cmd> Execute RCON command on server"
|
||||
echo "checkupdate Check for a new ARK server version"
|
||||
echo "install Install the ARK server files from steamcmd"
|
||||
echo "restart Stops the server and then starts it"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user