public static async Task FetchBuild(string path, string version)
        {
            string ZipDir = $@"{Program.ServiceDirectory}\Server\MCSFiles\Update_{version}.zip";

            if (!Directory.Exists($@"{Program.ServiceDirectory}\Server\MCSFiles"))
            {
                Directory.CreateDirectory($@"{Program.ServiceDirectory}\Server\MCSFiles");
            }
            if (File.Exists(ZipDir))
            {
                File.Delete(ZipDir);
            }
            if ((string)InstanceProvider.GetHostInfo().GetGlobalValue("AcceptedMojangLic") == "false")
            {
                InstanceProvider.GetServiceLogger().AppendLine("------First time download detected------\n");
                InstanceProvider.GetServiceLogger().AppendLine("You will need to agree to the Minecraft End User License Agreement");
                InstanceProvider.GetServiceLogger().AppendLine("in order to continue. Visit https://account.mojang.com/terms");
                InstanceProvider.GetServiceLogger().AppendLine("to view terms. Type \"Yes\" and press enter to confirm that");
                InstanceProvider.GetServiceLogger().AppendLine("you agree to said terms.");
                Console.Write("Do you agree to the terms? ");
                Console.Out.Flush();
                if (Console.ReadLine() != "Yes")
                {
                    return;
                }
                InstanceProvider.GetHostInfo().SetGlobalProperty("AcceptedMojangLic", "true");
                InstanceProvider.GetConfigManager().SaveGlobalFile();
                InstanceProvider.GetServiceLogger().AppendLine("Now downloading latest build of Minecraft Bedrock Server. Please wait...");
            }
            using (var httpClient = new HttpClient())
            {
                using (var request = new HttpRequestMessage(HttpMethod.Get, path))
                {
                    using (Stream contentStream = await(await httpClient.SendAsync(request)).Content.ReadAsStreamAsync(), stream = new FileStream(ZipDir, FileMode.Create, FileAccess.Write, FileShare.None, 256000, true))
                    {
                        try
                        {
                            await contentStream.CopyToAsync(stream);
                        }
                        catch (Exception e)
                        {
                            InstanceProvider.GetServiceLogger().AppendLine($"Download zip resulted in error: {e.StackTrace}");
                        }
                        httpClient.Dispose();
                        request.Dispose();
                        contentStream.Dispose();
                    }
                }
            }
        }
        public void SaveGlobalFile()
        {
            string[] output = new string[InstanceProvider.GetHostInfo().GetGlobals().Count + 3];
            int      index  = 0;

            output[index++] = "#Globals";
            output[index++] = string.Empty;
            foreach (Property prop in InstanceProvider.GetHostInfo().GetGlobals())
            {
                output[index++] = $"{prop.KeyName}={prop.Value}";
            }
            output[index++] = string.Empty;

            File.WriteAllLines(globalFile, output);
        }
        public bool LoadConfigs()
        {
            bool loading = true;

            if (!Directory.Exists(configDir))
            {
                Directory.CreateDirectory(configDir);
            }
            if (File.Exists($@"{configDir}\..\bedrock_ver.ini"))
            {
                loadedVersion = File.ReadAllText($@"{configDir}\..\bedrock_ver.ini");
            }

            string[] files          = Directory.GetFiles(configDir, "*.conf");
            string   globFileResult = null;

            foreach (string file in files)
            {
                if (file.EndsWith("Globals.conf"))
                {
                    globFileResult = file;
                    InstanceProvider.GetServiceLogger().AppendLine("Loading Globals...");
                    InstanceProvider.GetHostInfo().SetGlobalsDefault();
                    string[] lines = File.ReadAllLines(file);
                    foreach (string line in lines)
                    {
                        if (!line.StartsWith("#") && !string.IsNullOrEmpty(line))
                        {
                            string[] split = line.Split('=');
                            if (split.Length == 1)
                            {
                                split[1] = "";
                            }
                            InstanceProvider.GetHostInfo().GetGlobals().First(prop => prop.KeyName == split[0]).Value = split[1];
                        }
                    }
                }
            }
            if (globFileResult == null)
            {
                InstanceProvider.GetHostInfo().SetGlobalsDefault();
                InstanceProvider.GetServiceLogger().AppendLine("Globals.conf was not found. Loaded defaults and saved to file.");
                SaveGlobalFile();
            }
            InstanceProvider.GetHostInfo().ClearServerInfos();
            ServerInfo serverInfo = new ServerInfo();

            serverInfo.InitDefaults();
            while (loading)
            {
                foreach (string file in files)
                {
                    FileInfo FInfo = new FileInfo(file);
                    if (FInfo.Name == "Globals.conf")
                    {
                        continue;
                    }
                    serverInfo = new ServerInfo();
                    serverInfo.InitDefaults();
                    serverInfo.FileName      = FInfo.Name;
                    serverInfo.ServerVersion = loadedVersion;
                    string[] linesArray = File.ReadAllLines(file);
                    foreach (string line in linesArray)
                    {
                        if (!line.StartsWith("#") && !string.IsNullOrEmpty(line))
                        {
                            string[] split = line.Split('=');
                            if (split.Length == 1)
                            {
                                split = new string[] { split[0], "" };
                            }
                            Property SrvProp = serverInfo.ServerPropList.FirstOrDefault(prop => prop.KeyName == split[0]);
                            if (SrvProp != null)
                            {
                                serverInfo.SetServerProp(split[0], split[1]);
                            }
                            switch (split[0])
                            {
                            case "server-name":
                                InstanceProvider.GetServiceLogger().AppendLine($"Loading ServerInfo for server {split[1]}...");
                                serverInfo.ServerName = split[1];
                                LoadPlayerDatabase(serverInfo);
                                LoadRegisteredPlayers(serverInfo);
                                break;

                            case "AddStartCmd":
                                serverInfo.StartCmds.Add(new StartCmdEntry(split[1]));
                                break;

                            case "ServerPath":
                                serverInfo.ServerPath.Value = split[1];
                                break;

                            case "ServerExeName":
                                serverInfo.ServerExeName.Value = split[1];
                                break;

                            case "BackupPath":
                                serverInfo.BackupPath.Value = split[1];
                                break;

                            case "LogToFile":
                                serverInfo.LogToFileEnabled.Value = split[1];
                                break;

                            case "AdvancedBackup":
                                serverInfo.AdvancedBackup.Value = split[1];
                                break;

                            case "MaxBackupCount":
                                serverInfo.MaxBackupCount.Value = split[1];
                                break;
                            }
                        }
                    }
                    InstanceProvider.GetHostInfo().GetServerInfos().Add(serverInfo);
                }
                if (InstanceProvider.GetHostInfo().GetServerInfos().Count == 0)
                {
                    SaveServerProps(serverInfo, true);
                    files = Directory.GetFiles(configDir, "*.conf");
                }
                else
                {
                    loading = false;
                }
            }
            return(true);
        }
Exemple #4
0
        private void IncomingListener()
        {
            keepalive = true;
            InstanceProvider.GetServiceLogger().AppendLine("Established connection! Listening for incoming packets!");
            int AvailBytes = 0;
            int byteCount  = 0;

            while (InstanceProvider.GetClientServiceAlive())
            {
                try
                {
                    byte[] buffer = new byte[4];
                    AvailBytes = client.Client.Available;
                    while (AvailBytes != 0) // Recieve data from client.
                    {
                        byteCount = stream.Read(buffer, 0, 4);
                        int expectedLen = BitConverter.ToInt32(buffer, 0);
                        buffer    = new byte[expectedLen];
                        byteCount = stream.Read(buffer, 0, expectedLen);
                        NetworkMessageSource      msgSource = (NetworkMessageSource)buffer[0];
                        NetworkMessageDestination msgDest   = (NetworkMessageDestination)buffer[1];
                        NetworkMessageTypes       msgType   = (NetworkMessageTypes)buffer[2];
                        NetworkMessageStatus      msgStatus = (NetworkMessageStatus)buffer[3];
                        string   data      = GetOffsetString(buffer);
                        string[] dataSplit = null;
                        switch (msgDest)
                        {
                        case NetworkMessageDestination.Server:

                            JsonParser message;
                            switch (msgType)
                            {
                            case NetworkMessageTypes.PropUpdate:

                                message = JsonParser.Deserialize(data);
                                List <Property> propList = message.Value.ToObject <List <Property> >();
                                Property        prop     = propList.First(p => p.KeyName == "server-name");
                                InstanceProvider.GetBedrockServer(prop.Value).serverInfo.ServerPropList = propList;
                                InstanceProvider.GetConfigManager().SaveServerProps(InstanceProvider.GetBedrockServer(prop.Value).serverInfo, true);
                                InstanceProvider.GetConfigManager().LoadConfigs();
                                InstanceProvider.GetBedrockServer(prop.Value).CurrentServerStatus = BedrockServer.ServerStatus.Stopping;
                                while (InstanceProvider.GetBedrockServer(prop.Value).CurrentServerStatus == BedrockServer.ServerStatus.Stopping)
                                {
                                    Thread.Sleep(100);
                                }
                                InstanceProvider.GetBedrockServer(prop.Value).StartControl(InstanceProvider.GetBedrockService()._hostControl);
                                SendData(NetworkMessageSource.Server, NetworkMessageDestination.Client, NetworkMessageTypes.PropUpdate);

                                break;

                            case NetworkMessageTypes.Restart:

                                RestartServer(data, false);
                                break;

                            case NetworkMessageTypes.Backup:

                                RestartServer(data, true);
                                break;

                            case NetworkMessageTypes.Command:

                                dataSplit = data.Split(';');
                                InstanceProvider.GetBedrockServer(dataSplit[0]).StdInStream.WriteLine(dataSplit[1]);
                                InstanceProvider.GetServiceLogger().AppendLine($"Sent command {dataSplit[1]} to stdInput stream");

                                break;
                            }
                            break;

                        case NetworkMessageDestination.Service:
                            switch (msgType)
                            {
                            case NetworkMessageTypes.Connect:

                                InstanceProvider.GetHostInfo().ServiceLog = InstanceProvider.GetServiceLogger().Log;
                                string jsonString    = JsonParser.Serialize(JsonParser.FromValue(InstanceProvider.GetHostInfo()));
                                byte[] stringAsBytes = GetBytes(jsonString);
                                SendData(stringAsBytes, NetworkMessageSource.Service, NetworkMessageDestination.Client, NetworkMessageTypes.Connect);
                                heartbeatRecieved = false;

                                break;

                            case NetworkMessageTypes.Disconnect:

                                DisconnectClient();

                                break;

                            case NetworkMessageTypes.Heartbeat:

                                if (InstanceProvider.GetHeartbeatThreadAlive())
                                {
                                    heartbeatRecieved = true;
                                }
                                else
                                {
                                    InstanceProvider.InitHeartbeatThread(new ThreadStart(SendBackHeatbeatSignal)).Start();
                                    Thread.Sleep(500);
                                    heartbeatRecieved = true;
                                }

                                break;

                            case NetworkMessageTypes.ConsoleLogUpdate:

                                StringBuilder srvString = new StringBuilder();
                                string[]      split     = data.Split('|');
                                for (int i = 0; i < split.Length; i++)
                                {
                                    dataSplit = split[i].Split(';');
                                    string srvName = dataSplit[0];
                                    int    srvTextLen;
                                    int    clientCurLen;
                                    int    loop;
                                    if (srvName != "Service")
                                    {
                                        ServerLogger srvText = InstanceProvider.GetBedrockServer(srvName).serverInfo.ConsoleBuffer;
                                        srvTextLen   = srvText.Count();
                                        clientCurLen = int.Parse(dataSplit[1]);
                                        loop         = clientCurLen;
                                        while (loop < srvTextLen)
                                        {
                                            srvString.Append($"{srvName};{srvText.FromIndex(loop)};{loop}|");
                                            loop++;
                                        }
                                    }
                                    else
                                    {
                                        ServiceLogger srvText = InstanceProvider.GetServiceLogger();
                                        srvTextLen   = srvText.Count();
                                        clientCurLen = int.Parse(dataSplit[1]);
                                        loop         = clientCurLen;
                                        while (loop < srvTextLen)
                                        {
                                            srvString.Append($"{srvName};{srvText.FromIndex(loop)};{loop}|");
                                            loop++;
                                        }
                                    }
                                }
                                if (srvString.Length > 1)
                                {
                                    srvString.Remove(srvString.Length - 1, 1);
                                    stringAsBytes = GetBytes(srvString.ToString());
                                    SendData(stringAsBytes, NetworkMessageSource.Server, NetworkMessageDestination.Client, NetworkMessageTypes.ConsoleLogUpdate);
                                }
                                break;
                            }
                            break;
                        }
                        AvailBytes = client.Client.Available;
                    }
                    Thread.Sleep(200);
                }
                catch (OutOfMemoryException)
                {
                    InstanceProvider.GetServiceLogger().AppendLine("");
                }
                catch (ObjectDisposedException e)
                {
                    InstanceProvider.GetServiceLogger().AppendLine("Client was disposed! Killing thread...");
                    break;
                }
                catch (ThreadAbortException) { }

                catch (JsonException e)
                {
                    InstanceProvider.GetServiceLogger().AppendLine($"Error parsing json array: {e.Message}");
                    InstanceProvider.GetServiceLogger().AppendLine($"Stacktrace: {e.InnerException}");
                }
                catch (Exception e)
                {
                    //InstanceProvider.GetServiceLogger().AppendLine($"Error: {e.Message} {e.StackTrace}");
                    //InstanceProvider.GetServiceLogger().AppendLine($"Error: {e.Message}: {AvailBytes}, {byteCount}\n{e.StackTrace}");
                }
                AvailBytes = client.Client.Available;
                if (InstanceProvider.GetClientService().ThreadState == ThreadState.Aborted)
                {
                    keepalive = false;
                }
            }
            InstanceProvider.GetServiceLogger().AppendLine("IncomingListener thread exited.");
        }