Add option for protocol version hints, clean up configuration

This commit is contained in:
timvisee 2021-11-09 14:57:58 +01:00
parent 86c88d85f2
commit bbecb43639
No known key found for this signature in database
GPG Key ID: B8DB720BC383E172
5 changed files with 48 additions and 31 deletions

View File

@ -1,21 +1,37 @@
# lazymc configuration
#
# You must configure your server directory and start command, see:
# - server.directory
# - server.command
#
# You can probably leave the rest as-is.
#
# You may generate a new configuration with: lazymc config generate
# Or find the latest at: https://is.gd/WWBIQu
[public]
# Public address. IP and port users connect to.
# Shows sleeping status, starts server on connect, and proxies to server.
address = "0.0.0.0:25565"
# Server version & protocol hint.
# Sent to clients until actual server version is known.
# See: https://is.gd/FTQKTP
version = "1.17.1"
protocol = 756
[server]
# Server directory.
# Server address. Internal IP and port of server started by lazymc to proxy to.
# Port must be different from public port.
address = "127.0.0.1:25566"
# Server directory, defaults to current directory.
directory = "."
# Command to start the server.
# Warning: if using a bash script read: https://github.com/timvisee/lazymc/blob/master/docs/command_bash.md
# Warning: if using a bash script read: https://is.gd/k8SQYv
command = "java -Xmx1G -Xms1G -jar server.jar --nogui"
# Server address. Internal IP and port of server started by lazymc to proxy to.
address = "127.0.0.1:25566"
# Immediately wake server when starting lazymc.
wake_on_start = false
@ -27,19 +43,13 @@ sleep_after = 60
minimum_online_time = 60
[messages]
# MOTD when server is sleeping.
# MOTDs, shown in server browser.
motd_sleeping = "☠ Server is sleeping\n§2☻ Join to start it up"
# MOTD when server is starting.
motd_starting = "§2☻ Server is starting...\n§7⌛ Please wait..."
# MOTD when server is stopping.
motd_stopping = "☠ Server going to sleep...\n⌛ Please wait..."
# Login (kick) message when server is starting.
# Login messages, when user tries to connect.
login_starting = "Server is starting... §c♥§r\n\nThis may take some time.\n\nPlease try to reconnect in a minute."
# Login (kick) message when server is stopping.
login_stopping = "Server is going to sleep... §7☠§r\n\nPlease try to reconnect in a minute to wake it again."
[rcon]
@ -47,13 +57,12 @@ login_stopping = "Server is going to sleep... §7☠§r\n\nPlease try to reconne
# Must be enabled on Windows.
enabled = true
# Server RCON port. Must differ from Minecraft server port.
# Server RCON port. Must differ from public and server port.
port = 25575
# Server RCON password.
# Or whether to randomize password each start (recommended).
password = ""
# Randomize ingress server RCON password on each start.
randomize_password = true
[advanced]

View File

@ -91,6 +91,12 @@ pub struct Public {
/// Egress address.
#[serde(alias = "address_egress")]
pub address: SocketAddr,
/// Minecraft protocol version name hint.
pub version: String,
/// Minecraft protocol version hint.
pub protocol: u32,
}
/// Server configuration.

View File

@ -14,7 +14,7 @@ use tokio::io::AsyncWriteExt;
use tokio::net::TcpStream;
use crate::config::Config;
use crate::proto::{self, ClientState, RawPacket, PROTO_DEFAULT_PROTOCOL};
use crate::proto::{self, ClientState, RawPacket};
use crate::server::Server;
/// Monitor ping inverval in seconds.
@ -31,7 +31,7 @@ pub async fn monitor_server(config: Arc<Config>, state: Arc<Server>) {
loop {
// Poll server state and update internal status
trace!(target: "lazymc::monitor", "Fetching status for {} ... ", addr);
let status = poll_server(addr).await;
let status = poll_server(&config, addr).await;
state.update_status(&config, status);
// Sleep server when it's bedtime
@ -50,23 +50,27 @@ pub async fn monitor_server(config: Arc<Config>, state: Arc<Server>) {
/// Poll server state.
///
/// Returns server status if connection succeeded.
pub async fn poll_server(addr: SocketAddr) -> Option<ServerStatus> {
fetch_status(addr).await.ok()
pub async fn poll_server(config: &Config, addr: SocketAddr) -> Option<ServerStatus> {
fetch_status(config, addr).await.ok()
}
/// Attemp to fetch status from server.
async fn fetch_status(addr: SocketAddr) -> Result<ServerStatus, ()> {
async fn fetch_status(config: &Config, addr: SocketAddr) -> Result<ServerStatus, ()> {
let mut stream = TcpStream::connect(addr).await.map_err(|_| ())?;
send_handshake(&mut stream, addr).await?;
send_handshake(&mut stream, &config, addr).await?;
request_status(&mut stream).await?;
wait_for_status_timeout(&mut stream).await
}
/// Send handshake.
async fn send_handshake(stream: &mut TcpStream, addr: SocketAddr) -> Result<(), ()> {
async fn send_handshake(
stream: &mut TcpStream,
config: &Config,
addr: SocketAddr,
) -> Result<(), ()> {
let handshake = Handshake {
protocol_version: PROTO_DEFAULT_PROTOCOL as i32,
protocol_version: config.public.protocol as i32,
server_addr: addr.ip().to_string(),
server_port: addr.port(),
next_state: ClientState::Status.to_id(),

View File

@ -10,13 +10,13 @@ use crate::types;
/// Default minecraft protocol version name.
///
/// Send to clients when the server is sleeping when the real server version is not known yet.
pub const PROTO_DEFAULT_VERSION: &str = "1.16.5";
pub const PROTO_DEFAULT_VERSION: &str = "1.17.1";
/// Default minecraft protocol version.
///
/// Send to clients when the server is sleeping when the real server version is not known yet, and
/// with server status polling requests.
pub const PROTO_DEFAULT_PROTOCOL: u32 = 754;
pub const PROTO_DEFAULT_PROTOCOL: u32 = 756;
/// Handshake state, handshake packet ID.
pub const HANDSHAKE_PACKET_ID_HANDSHAKE: i32 = 0;

View File

@ -13,9 +13,7 @@ use tokio::io::AsyncWriteExt;
use tokio::net::TcpStream;
use crate::config::*;
use crate::proto::{
self, Client, ClientState, RawPacket, PROTO_DEFAULT_PROTOCOL, PROTO_DEFAULT_VERSION,
};
use crate::proto::{self, Client, ClientState, RawPacket};
use crate::server::{self, Server};
/// Proxy the given inbound stream to a target address.
@ -88,8 +86,8 @@ pub async fn serve(
Some(status) => (status.version, status.players.max),
None => (
ServerVersion {
name: String::from(PROTO_DEFAULT_VERSION),
protocol: PROTO_DEFAULT_PROTOCOL,
name: config.public.version.clone(),
protocol: config.public.protocol,
},
0,
),