예제 #1
0
        public void Typical(
            MockFileSystem fs,
            LogCleaner cleaner)
        {
            cleaner.LogSettings.LogFolder.Returns(new DirectoryPath("C:/logs"));
            cleaner.LogSettings.DateFormat.Returns(Log.DateFormat);
            cleaner.NowProvider.NowLocal.Returns(new DateTime(2021, 9, 16));

            fs.Directory.CreateDirectory("C:/logs");
            var keepDir = $"C:/logs/{new DateTime(2021, 9, 15).ToString(Log.DateFormat)}";

            fs.Directory.CreateDirectory($"C:/logs/{new DateTime(2021, 9, 15).ToString(Log.DateFormat)}");
            var keepFile = Path.Combine(keepDir, "SomeFile");

            fs.File.Create(keepFile);
            var deleteDir = $"C:/logs/{new DateTime(2021, 9, 6).ToString(Log.DateFormat)}";

            fs.Directory.CreateDirectory(deleteDir);
            var deleteFile = Path.Combine(deleteDir, "SomeFile");

            fs.File.Create(deleteFile);

            cleaner.Start();

            fs.Directory.Exists(keepDir).Should().BeTrue();
            fs.File.Exists(keepFile).Should().BeTrue();
            fs.Directory.Exists(deleteDir).Should().BeFalse();
            fs.File.Exists(deleteFile).Should().BeFalse();
        }
예제 #2
0
        public void Clean_ShouldSkipLockedFile()
        {
            // Arrange
            const string logPath = nameof(Clean_ShouldSkipLockedFile);

            CreateEmptyDirectory(logPath);
            var files = new[] { "file2.log", "file1.log", "file.log" }.Select(f => Path.Combine(logPath, f)).ToList();

            files.ForEach(CreateEmptyFile);
            File.SetCreationTimeUtc(files[0], new DateTime(2000, 01, 01, 0, 10, 0));
            File.SetCreationTimeUtc(files[1], new DateTime(2000, 01, 01, 0, 20, 0));
            File.SetCreationTimeUtc(files[2], new DateTime(2000, 01, 01, 0, 30, 0));
            var cleaner = new LogCleaner(_logger);

            // Act
            using (File.OpenRead(files[1]))
            {
                cleaner.Clean(logPath, 0);
            }
            var result = Directory.GetFiles(logPath).Select(Path.GetFileName);

            // Assert
            result.Should().HaveCount(1)
            .And.Contain(new[] { "file1.log" });
        }
예제 #3
0
        private void InitializeApplication()
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;

            Version = Assembly.GetExecutingAssembly().GetName().Version;

            LogProvider.Log.Info(string.Format("--------------- PPPoker Card Catcher (v.{0}) ---------------", Version));
            LogProvider.Log.Info(string.Format("OsVersion: {0}", Environment.OSVersion));
            LogProvider.Log.Info(string.Format("Current Culture: {0}", Thread.CurrentThread.CurrentCulture));
            LogProvider.Log.Info(string.Format("Current UI Culture: {0}", Thread.CurrentThread.CurrentUICulture));

            ValidateLicenseAssemblies();

            ResourceRegistrator.Initialization();

            if (IsCheckForUpdates())
            {
                CheckUpdates();
            }

            LogCleaner.ClearLogsFolder();

            /* Without this user won't be able to input decimal point for float bindings if UpdateSourceTrigger set to PropertyChanged */
            FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
        }
예제 #4
0
        private void InitializeApplication(GeneralSettingsModel generalSettingsModel)
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;

            Version = Assembly.GetExecutingAssembly().GetName().Version;

            LogProvider.Log.Info(string.Format("---------------=============== Initialize DriveHUD (v.{0}) ===============---------------", Version));
            LogProvider.Log.Info(string.Format("OsVersion: {0}", Environment.OSVersion));
            LogProvider.Log.Info(string.Format("Current Culture: {0}", Thread.CurrentThread.CurrentCulture));
            LogProvider.Log.Info(string.Format("Current UI Culture: {0}", Thread.CurrentThread.CurrentUICulture));

            ValidateLicenseAssemblies();

            if (generalSettingsModel.IsAutomaticallyDownloadUpdates)
            {
                CheckUpdates();
            }

            VisualStudio2013Palette.LoadPreset(VisualStudio2013Palette.ColorVariation.Dark);

            LogCleaner.ClearLogsFolder();

            /* Without this user won't be able to input decimal point for float bindings if UpdateSourceTrigger set to PropertyChanged */
            System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
        }
예제 #5
0
        private static IDisposable InitLogger(Func <LoggerConfiguration> createConfiguration)//, bool useSyncLogger)
        {
            lock (syncRoot)
            {
                if (logCleaner != null)
                {
                    logCleaner.Dispose();
                    logCleaner = null;
                }

                try
                {
                    var configuration = createConfiguration();
                    Log.Logger = //useSyncLogger
                                 //?
                                 configuration.CreateLogger()
                                 //: configuration.CreateLoggerAsync();
                    ;
                    logCleaner = new LogCleaner(Log.Logger);
                    return(logCleaner);
                }
                catch (Exception)
                {
                    Log.Logger = new LoggerConfiguration().CreateLogger();
                    throw;
                }
            }
        }
예제 #6
0
        public void Clean_ShouldNotThrow_WhenFolderNotExists()
        {
            // Arrange
            const string logPath = "Folder\\Does\\Not\\Exist";
            var          cleaner = new LogCleaner(_logger);
            // Act
            Action action = () => cleaner.Clean(logPath, 0);

            //Assert
            action.Should().NotThrow <Exception>();
        }
예제 #7
0
        /// <summary>
        /// 1分钟任务
        /// </summary>
        public static void Do()
        {
            R.SystemStatus.DriveTotal = DriveTool.GetDriveTotalSize(R.Paths.App);
            R.SystemStatus.DriveAvail = DriveTool.GetDriveAvailableSize(R.Paths.App);

            LogCleaner.LogFileAnalyse();

            if (R.IsAutoDeleteExpiredLog)
            {
                LogCleaner.CleanLogFile();
            }
        }
예제 #8
0
        /// <summary>
        /// 1分钟任务
        /// </summary>
        public static void Do()
        {
            R.SystemStatus.DriveTotal = DriveTool.GetDriveTotalSize(R.Paths.App);
            R.SystemStatus.DriveAvail = DriveTool.GetDriveAvailableSize(R.Paths.App);

            LogCleaner.LogFileAnalyse();
            R.Log.I($"全部日志文件:{R.SystemStatus.AllLogCount} 个, 共计:{ByteConvertTool.Cvt(R.SystemStatus.AllLogSize, "MB")} GB");
            R.Log.I($"过期日志文件:{R.SystemStatus.ExpireLogCount} 个, 共计:{ByteConvertTool.Cvt(R.SystemStatus.ExpireLogSize, "MB")} GB");

            //string toMail = "*****@*****.**";
            //string subject = $"服务器状态报表:日报:{DateTime.Now.ToString("yyyy年MM月dd日")}";
            //string emailBody = "测试内容";
            //EmailTool et = new EmailTool(
            //    "*****@*****.**",
            //    toMail, subject, emailBody,
            //    "bigbird_server","bigbird528");
            //et.Send();
        }
예제 #9
0
        public void Clean_ShouldDeleteOldestFiles()
        {
            // Arrange
            const string logPath = nameof(Clean_ShouldDeleteOldestFiles);

            CreateEmptyDirectory(logPath);
            var files = new[] { "file.log", "file1.log", "file2.log", "file3.log", "file4.log" }.Select(f => Path.Combine(logPath, f)).ToList();

            files.ForEach(CreateEmptyFile);
            File.SetCreationTimeUtc(files[0], new DateTime(2019, 03, 15, 10, 50, 0));
            File.SetCreationTimeUtc(files[1], new DateTime(2019, 03, 15, 10, 40, 0));
            File.SetCreationTimeUtc(files[2], new DateTime(2019, 03, 15, 10, 30, 0));
            File.SetCreationTimeUtc(files[3], new DateTime(2019, 03, 15, 10, 20, 0));
            File.SetCreationTimeUtc(files[4], new DateTime(2019, 03, 15, 10, 10, 0));
            var cleaner = new LogCleaner(_logger);

            // Act
            cleaner.Clean(logPath, 2);
            var result = Directory.GetFiles(logPath).Select(Path.GetFileName);

            // Assert
            result.Should().HaveCount(2)
            .And.Contain(new[] { "file.log", "file1.log" });
        }
예제 #10
0
        /// <summary>
        /// 接受消息
        /// </summary>
        /// <param name="host"></param>
        /// <param name="model"></param>
        public static void ReceiveMessage(string host, TcpDataModel model)
        {
            switch (model.Type)
            {
            case 10001000:
                R.Tx.IsAuth      = true;
                R.Tx.ConnectTime = DateTime.Now;
                R.MainUI.UITxStatus();
                TxSendQueue.Start();
                break;

            //状态信息
            case 20001000:     /* 普通应答 */
                break;

            case 20001001:     /* 状态 */
                //R.MainUI.UIStatus(model);
                break;

            case 20001002:     /* 状态(二维码) */
                break;

            case 20002000:
                //R.MainUI.UILog(Json.Byte2Object<string>(model.Data));
                break;

            case 20003000:
                //R.MainUI.UIScreen(model);
                break;

            case 20004000:     /* 系统信息 */
                //R.MainUI.UIInfo(model);
                break;

            case 20004001:     /* 软件信息 */
                //R.MainUI.UIInfo(model);
                break;

            case 20004002:     /* 硬件信息 */
                //R.MainUI.UIInfo(model);
                break;

            case 20004003:     /* 共享信息 */
                //R.MainUI.UIInfo(model);
                break;

            case 20004004:     /* APP信息 */
                //R.MainUI.UIInfo(model);
                break;

            case 30001000:
                //R.MainUI.UIConsole(Json.Byte2Object<List<string>>(model.Data));
                break;

            //指令操作
            case 40001000:     /* 清除过期日志 */
                R.Log.I("收到指令操作:40001000:清除过期日志:15天之前日志");
                LogCleaner.CleanLogFile();
                break;

            case 40002000:     /* 重启服务 */
                try
                {
                    R.Log.I("收到指令操作:40002000:重启服务");
                    string ss = Json.Byte2Object <string>(model.Data);
                    Tuple <string, int> info = Json.String2Object <Tuple <string, int> >(ss);
                    if (R.Tx.LocalIP == info.Item1 && R.ProjectItems.Any(x => x.Port == info.Item2))
                    {
                        Parts.ProjectItemPart item = R.ProjectItems.FirstOrDefault(x => x.Port == info.Item2);
                        if (item != null)
                        {
                            item.Restart();
                        }
                    }
                }
                catch { }
                break;

            //更新操作
            case 90001000:    /* 获取更新文件基本信息 */
                try
                {
                    Tuple <string, string> data = Json.Byte2Object <Tuple <string, string> >(model.Data);
                    if (Str.Ok(data.Item1, data.Item2))
                    {
                        R.AppointName = data.Item1;
                        R.AppointMD5  = data.Item2;
                        TxSendQueue.Add(90001000, "Fire in the hole");
                    }
                }
                catch { }
                break;

            case 90002000:    /* 获取更新文件 */
                try
                {
                    if (Str.Ok(R.AppointName, R.AppointMD5))
                    {
                        if (File.Exists(DirTool.Combine(R.Paths.App, R.AppointName)))
                        {
                            FileTool.Delete(DirTool.Combine(R.Paths.App, R.AppointName));
                        }

                        if (BinaryFileTool.write(DirTool.Combine(R.Paths.App, R.AppointName), model.Data))
                        {
                            IniTool.Set(R.Files.Settings, "Appoint", "Name", R.AppointName);
                            IniTool.Set(R.Files.Settings, "Appoint", "MD5", R.AppointMD5);

                            // 判断文件存在,并且MD5相符,则退出并运行新版本(否则删除不一致文件)
                            if (File.Exists(DirTool.Combine(R.Paths.App, R.AppointName)) &&
                                FileTool.GetMD5(DirTool.Combine(R.Paths.App, R.AppointName)) == R.AppointMD5)
                            {
                                ProcessTool.Start(R.Files.App);
                                R.MainUI.UIExitApp();
                            }
                            else
                            {
                                FileTool.Delete(DirTool.Combine(R.Paths.App, R.AppointName));
                            }
                        }
                    }
                }
                catch { }
                break;

            default: break;
            }
        }
예제 #11
0
        public void Start(string[] args)
        {
            Singleton     = this;
            Console.Title = BaseWindowTitle;

            if (_restartsLimit > -1)
            {
                if (_restartsTimeWindow > 0)
                {
                    if (!RestartsStopwatch.IsRunning)
                    {
                        RestartsStopwatch.Start();
                    }
                    else if (RestartsStopwatch.Elapsed.TotalSeconds > _restartsTimeWindow)
                    {
                        RestartsStopwatch.Restart();
                        _restarts = 0;
                    }
                }

                if (!_ignoreNextRestart)
                {
                    _restarts++;
                }
                else
                {
                    _ignoreNextRestart = false;
                }

                if (_restarts > _restartsLimit)
                {
                    ConsoleUtil.WriteLine("Restarts limit exceeded.", ConsoleColor.Red);
                    ExitAction = ShutdownAction.SilentShutdown;
                    Exit(1);
                }
            }

            try
            {
                var reconfigure = false;
                var useDefault  = false;

                if (_firstRun)
                {
                    if (args.Length == 0 || !ushort.TryParse(args[0], out GamePort))
                    {
                        ConsoleUtil.WriteLine("You can pass port number as first startup argument.",
                                              ConsoleColor.Green);
                        Console.WriteLine(string.Empty);
                        ConsoleUtil.Write("Port number (default: 7777): ", ConsoleColor.Green);

                        ReadInput((input) =>
                        {
                            if (!string.IsNullOrEmpty(input))
                            {
                                return(ushort.TryParse(input, out GamePort));
                            }
                            GamePort = 7777;
                            return(true);
                        }, () => { },
                                  () =>
                        {
                            ConsoleUtil.WriteLine("Port number must be a unsigned short integer.",
                                                  ConsoleColor.Red);
                        });
                    }

                    var capture = CaptureArgs.None;

                    foreach (var arg in args)
                    {
                        switch (capture)
                        {
                        case CaptureArgs.None:
                            if (arg.StartsWith("-", StringComparison.Ordinal) &&
                                !arg.StartsWith("--", StringComparison.Ordinal) && arg.Length > 1)
                            {
                                for (var i = 1; i < arg.Length; i++)
                                {
                                    switch (arg[i])
                                    {
                                    case 'c':
                                        NoSetCursor = true;
                                        break;

                                    case 'p':
                                        PrintControlMessages = true;
                                        break;

                                    case 'n':
                                        AutoFlush = false;
                                        break;

                                    case 'l':
                                        EnableLogging = false;
                                        break;

                                    case 'r':
                                        reconfigure = true;
                                        break;

                                    case 's':
                                        _stdPrint = true;
                                        break;

                                    case 'd':
                                        useDefault = true;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                switch (arg)
                                {
                                case "--noSetCursor":
                                    NoSetCursor = true;
                                    break;

                                case "--printControl":
                                    PrintControlMessages = true;
                                    break;

                                case "--noAutoFlush":
                                    AutoFlush = false;
                                    break;

                                case "--noLogs":
                                    EnableLogging = false;
                                    break;

                                case "--reconfigure":
                                    reconfigure = true;
                                    break;

                                case "--printStd":
                                    _stdPrint = true;
                                    break;

                                case "--useDefault":
                                    useDefault = true;
                                    break;

                                case "--config":
                                    capture = CaptureArgs.ConfigPath;
                                    break;

                                case "--logs":
                                    capture = CaptureArgs.LaLogsPath;
                                    break;

                                case "--gameLogs":
                                    capture = CaptureArgs.GameLogsPath;
                                    break;

                                case "--restartsLimit":
                                    capture = CaptureArgs.RestartsLimit;
                                    break;

                                case "--restartsTimeWindow":
                                    capture = CaptureArgs.RestartsTimeWindow;
                                    break;

                                case "--logLengthLimit":
                                    capture = CaptureArgs.LogLengthLimit;
                                    break;

                                case "--logEntriesLimit":
                                    capture = CaptureArgs.LogEntriesLimit;
                                    break;

                                case "--":
                                    capture = CaptureArgs.ArgsPassthrough;
                                    break;
                                }
                            }
                            break;

                        case CaptureArgs.ArgsPassthrough:
                            _gameArguments += $"\"{arg}\" ";
                            break;

                        case CaptureArgs.ConfigPath:
                            ConfigPath = arg;
                            capture    = CaptureArgs.None;
                            break;

                        case CaptureArgs.LaLogsPath:
                            LaLogsPath = arg + Path.DirectorySeparatorChar;
                            capture    = CaptureArgs.None;
                            break;

                        case CaptureArgs.GameLogsPath:
                            GameLogsPath = arg + Path.DirectorySeparatorChar;
                            capture      = CaptureArgs.None;
                            break;

                        case CaptureArgs.RestartsLimit:
                            if (!int.TryParse(arg, out _restartsLimit) || _restartsLimit < -1)
                            {
                                _restartsLimit = 4;
                                ConsoleUtil.WriteLine("restartsLimit argument value must be an integer greater or equal to -1.", ConsoleColor.Red);
                            }
                            capture = CaptureArgs.None;
                            break;

                        case CaptureArgs.RestartsTimeWindow:
                            if (!int.TryParse(arg, out _restartsTimeWindow) || _restartsLimit < 0)
                            {
                                _restartsTimeWindow = 480;
                                ConsoleUtil.WriteLine("restartsTimeWindow argument value must be an integer greater or equal to 0.", ConsoleColor.Red);
                            }
                            capture = CaptureArgs.None;
                            break;

                        case CaptureArgs.LogLengthLimit:
                        {
                            string a = arg.Replace("k", "000", StringComparison.Ordinal)
                                       .Replace("M", "000000", StringComparison.Ordinal)
                                       .Replace("G", "000000000", StringComparison.Ordinal)
                                       .Replace("T", "000000000000", StringComparison.Ordinal);
                            if (!ulong.TryParse(a, out LogLengthLimit))
                            {
                                ConsoleUtil.WriteLine(
                                    "logLengthLimit argument value must be an integer greater or equal to 0.",
                                    ConsoleColor.Red);
                                LogLengthLimit = 25000000000;
                            }

                            capture = CaptureArgs.None;
                        }
                        break;

                        case CaptureArgs.LogEntriesLimit:
                        {
                            string a = arg.Replace("k", "000", StringComparison.Ordinal)
                                       .Replace("M", "000000", StringComparison.Ordinal)
                                       .Replace("G", "000000000", StringComparison.Ordinal)
                                       .Replace("T", "000000000000", StringComparison.Ordinal);
                            if (!ulong.TryParse(a, out LogEntriesLimit))
                            {
                                ConsoleUtil.WriteLine(
                                    "logEntriesLimit argument value must be an integer greater or equal to 0.",
                                    ConsoleColor.Red);
                                LogEntriesLimit = 10000000000;
                            }

                            capture = CaptureArgs.None;
                        }
                        break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    }
                }

                if (ConfigPath != null)
                {
                    if (File.Exists(ConfigPath))
                    {
                        Configuration = Config.DeserializeConfig(File.ReadAllLines(ConfigPath, Encoding.UTF8));
                    }
                    else
                    {
                        reconfigure = true;
                    }
                }
                else
                {
                    var cfgPath =
                        $"{GameUserDataRoot}config{Path.DirectorySeparatorChar}{GamePort}{Path.DirectorySeparatorChar}config_localadmin.txt";

                    if (File.Exists(cfgPath))
                    {
                        Configuration = Config.DeserializeConfig(File.ReadAllLines(cfgPath, Encoding.UTF8));
                    }
                    else
                    {
                        cfgPath = $"{GameUserDataRoot}config{Path.DirectorySeparatorChar}config_localadmin_global.txt";

                        if (File.Exists(cfgPath))
                        {
                            Configuration = Config.DeserializeConfig(File.ReadAllLines(cfgPath, Encoding.UTF8));
                        }
                        else
                        {
                            reconfigure = true;
                        }
                    }
                }

                if (reconfigure)
                {
                    ConfigWizard.RunConfigWizard(useDefault);
                }

                NoSetCursor   |= Configuration !.LaNoSetCursor;
                AutoFlush     &= Configuration !.LaLogAutoFlush;
                EnableLogging &= Configuration !.EnableLaLogs;

                InputQueue.Clear();

                if (_firstRun)
                {
                    try
                    {
                        SetupExitHandlers();
                    }
                    catch (Exception ex)
                    {
                        ConsoleUtil.WriteLine(
                            $"Starting exit handlers threw {ex}. Game process will NOT be closed on console closing!",
                            ConsoleColor.Yellow);
                    }
                }

                if (_firstRun || _exit)
                {
                    _exit     = false;
                    _firstRun = false;
                    SetupKeyboardInput();
                }

                RegisterCommands();
                SetupReader();

                StartSession();

                _readerTask !.Start();

                if (!EnableLogging)
                {
                    ConsoleUtil.WriteLine("Logging has been disabled.", ConsoleColor.Red);
                }
                else if (!AutoFlush)
                {
                    ConsoleUtil.WriteLine("Logs auto flush has been disabled.", ConsoleColor.Yellow);
                }

                if (PrintControlMessages)
                {
                    ConsoleUtil.WriteLine("Printing control messages been enabled using startup argument.", ConsoleColor.Gray);
                }

                if (NoSetCursor)
                {
                    ConsoleUtil.WriteLine("Cursor management been disabled.", ConsoleColor.Gray);
                }

                if (Configuration.LaDeleteOldLogs || Configuration.DeleteOldRoundLogs || Configuration.CompressOldRoundLogs)
                {
                    LogCleaner.Initialize();
                }

                while (!_exit)
                {
                    Thread.Sleep(250);
                }

                // If the game was terminated intentionally, then wait, otherwise no
                Exit(0, true); // After the readerTask is completed this will happen
            }
            catch (Exception ex)
            {
                File.WriteAllText($"LocalAdmin Crash {DateTime.UtcNow:yyyy-MM-ddTHH-mm-ssZ}.txt", ex.ToString());

                Logger.Log("|===| Exception |===|");
                Logger.Log(ex);
                Logger.Log("|===================|");
                Logger.Log("");
            }
        }