public async Task Execute(IJobContext context) { if (!CliUtils.ParseArgs(_options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } var version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); await Console.Out.WriteLineAsync($"SiteServer CLI 版本号: {version.Substring(0, version.Length - 2)}"); await Console.Out.WriteLineAsync($"当前文件夹: {CliUtils.PhysicalApplicationPath}"); await Console.Out.WriteLineAsync(); var webConfigPath = CliUtils.GetWebConfigPath(_configFile); if (FileUtils.IsFileExists(webConfigPath)) { WebConfigUtils.Load(CliUtils.PhysicalApplicationPath, webConfigPath); try { var cmsVersion = FileVersionInfo.GetVersionInfo(PathUtils.Combine(CliUtils.PhysicalApplicationPath, "Bin", "SiteServer.CMS.dll")).ProductVersion; await Console.Out.WriteLineAsync($"SitServer CMS Version: {cmsVersion}"); } catch { // ignored } await Console.Out.WriteLineAsync($"数据库类型: {WebConfigUtils.DatabaseType.Value}"); await Console.Out.WriteLineAsync($"连接字符串: {WebConfigUtils.ConnectionString}"); await Console.Out.WriteLineAsync($"连接字符串(加密): {TranslateUtils.EncryptStringBySecretKey(WebConfigUtils.ConnectionString, WebConfigUtils.SecretKey)}"); } }
public async Task Execute(IJobContext context) { if (!CliUtils.ParseArgs(_options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } if (string.IsNullOrEmpty(_directory)) { await CliUtils.PrintErrorAsync("需要指定恢复数据的文件夹名称:directory"); return; } var treeInfo = new TreeInfo(_directory); if (!DirectoryUtils.IsDirectoryExists(treeInfo.DirectoryPath)) { await CliUtils.PrintErrorAsync($"恢复数据的文件夹 {treeInfo.DirectoryPath} 不存在"); return; } var tablesFilePath = treeInfo.TablesFilePath; if (!FileUtils.IsFileExists(tablesFilePath)) { await CliUtils.PrintErrorAsync($"恢复文件 {treeInfo.TablesFilePath} 不存在"); return; } var webConfigPath = CliUtils.GetWebConfigPath(_configFile); if (!FileUtils.IsFileExists(webConfigPath)) { await CliUtils.PrintErrorAsync($"系统配置文件不存在:{webConfigPath}!"); return; } WebConfigUtils.Load(CliUtils.PhysicalApplicationPath, webConfigPath); if (string.IsNullOrEmpty(WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"{webConfigPath} 中数据库连接字符串 connectionString 未设置"); return; } await Console.Out.WriteLineAsync($"数据库类型: {WebConfigUtils.DatabaseType.Value}"); await Console.Out.WriteLineAsync($"连接字符串: {WebConfigUtils.ConnectionString}"); await Console.Out.WriteLineAsync($"恢复文件夹: {treeInfo.DirectoryPath}"); if (!DataProvider.DatabaseDao.IsConnectionStringWork(WebConfigUtils.DatabaseType, WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"系统无法连接到 {webConfigPath} 中设置的数据库"); return; } if (!_dataOnly) { if (!SystemManager.IsNeedInstall()) { await CliUtils.PrintErrorAsync("数据无法在已安装系统的数据库中恢复,命令执行失败"); return; } // 恢复前先创建表,确保系统在恢复的数据库中能够使用 SystemManager.CreateSiteServerTables(); } await CliUtils.PrintRowLineAsync(); await CliUtils.PrintRowAsync("恢复表名称", "总条数"); await CliUtils.PrintRowLineAsync(); var errorLogFilePath = CliUtils.CreateErrorLogFile(CommandName); await Restore(_includes, _excludes, _dataOnly, tablesFilePath, treeInfo, errorLogFilePath); await Console.Out.WriteLineAsync($"恭喜,成功从文件夹:{treeInfo.DirectoryPath} 恢复数据!"); }
public static async Task Execute(IJobContext context) { if (!CliUtils.ParseArgs(Options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } if (string.IsNullOrEmpty(_directory)) { await CliUtils.PrintErrorAsync("需要指定恢复数据的文件夹名称:directory"); return; } var treeInfo = new TreeInfo(_directory); if (!DirectoryUtils.IsDirectoryExists(treeInfo.DirectoryPath)) { await CliUtils.PrintErrorAsync($"恢复数据的文件夹 {treeInfo.DirectoryPath} 不存在"); return; } var tablesFilePath = treeInfo.TablesFilePath; if (!FileUtils.IsFileExists(tablesFilePath)) { await CliUtils.PrintErrorAsync($"恢复文件 {treeInfo.TablesFilePath} 不存在"); return; } var webConfigPath = CliUtils.GetWebConfigPath(_configFile); if (!FileUtils.IsFileExists(webConfigPath)) { await CliUtils.PrintErrorAsync($"系统配置文件不存在:{webConfigPath}!"); return; } WebConfigUtils.Load(CliUtils.PhysicalApplicationPath, webConfigPath); if (string.IsNullOrEmpty(WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"{webConfigPath} 中数据库连接字符串 connectionString 未设置"); return; } await Console.Out.WriteLineAsync($"数据库类型: {WebConfigUtils.DatabaseType.Value}"); await Console.Out.WriteLineAsync($"连接字符串: {WebConfigUtils.ConnectionString}"); await Console.Out.WriteLineAsync($"恢复文件夹: {treeInfo.DirectoryPath}"); if (!DataProvider.DatabaseDao.IsConnectionStringWork(WebConfigUtils.DatabaseType, WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"系统无法连接到 {webConfigPath} 中设置的数据库"); return; } if (!_dataOnly) { if (SystemManager.IsInstalled) { await CliUtils.PrintErrorAsync("数据无法在已安装系统的数据库中恢复,命令执行失败"); return; } // 恢复前先创建表,确保系统在恢复的数据库中能够使用 SystemManager.CreateSiteServerTables(); } var tableNames = TranslateUtils.JsonDeserialize <List <string> >(await FileUtils.ReadTextAsync(tablesFilePath, Encoding.UTF8)); await CliUtils.PrintRowLineAsync(); await CliUtils.PrintRowAsync("恢复表名称", "总条数"); await CliUtils.PrintRowLineAsync(); var errorLogFilePath = CliUtils.CreateErrorLogFile(CommandName); foreach (var tableName in tableNames) { try { if (_includes != null) { if (!StringUtils.ContainsIgnoreCase(_includes, tableName)) { continue; } } if (_excludes != null) { if (StringUtils.ContainsIgnoreCase(_excludes, tableName)) { continue; } } var metadataFilePath = treeInfo.GetTableMetadataFilePath(tableName); if (!FileUtils.IsFileExists(metadataFilePath)) { continue; } var tableInfo = TranslateUtils.JsonDeserialize <TableInfo>(await FileUtils.ReadTextAsync(metadataFilePath, Encoding.UTF8)); await CliUtils.PrintRowAsync(tableName, tableInfo.TotalCount.ToString("#,0")); if (!DataProvider.DatabaseDao.IsTableExists(tableName)) { if (!DataProvider.DatabaseDao.CreateTable(tableName, tableInfo.Columns, out var ex, out var sqlString)) { await CliUtils.AppendErrorLogAsync(errorLogFilePath, new TextLogInfo { DateTime = DateTime.Now, Detail = $"创建表 {tableName}: {sqlString}", Exception = ex }); continue; } } else { DataProvider.DatabaseDao.AlterSystemTable(tableName, tableInfo.Columns); } if (tableInfo.RowFiles.Count > 0) { using (var progress = new ProgressBar()) { for (var i = 0; i < tableInfo.RowFiles.Count; i++) { progress.Report((double)i / tableInfo.RowFiles.Count); var fileName = tableInfo.RowFiles[i]; var objects = TranslateUtils.JsonDeserialize <List <JObject> >( await FileUtils.ReadTextAsync(treeInfo.GetTableContentFilePath(tableName, fileName), Encoding.UTF8)); try { DataProvider.DatabaseDao.InsertMultiple(tableName, objects, tableInfo.Columns); } catch (Exception ex) { await CliUtils.AppendErrorLogAsync(errorLogFilePath, new TextLogInfo { DateTime = DateTime.Now, Detail = $"插入表 {tableName}, 文件名 {fileName}", Exception = ex }); } } } } } catch (Exception ex) { await CliUtils.AppendErrorLogAsync(errorLogFilePath, new TextLogInfo { DateTime = DateTime.Now, Detail = $"插入表 {tableName}", Exception = ex }); } } await CliUtils.PrintRowLineAsync(); if (WebConfigUtils.DatabaseType == DatabaseType.Oracle) { var tableNameList = DataProvider.DatabaseDao.GetTableNameList(); foreach (var tableName in tableNameList) { DataProvider.DatabaseDao.AlterOracleAutoIncresementIdToMaxValue(tableName); } } if (!_dataOnly) { // 恢复后同步表,确保内容辅助表字段与系统一致 SystemManager.SyncContentTables(); SystemManager.UpdateConfigVersion(); } await Console.Out.WriteLineAsync($"恭喜,成功从文件夹:{treeInfo.DirectoryPath} 恢复数据!"); }
public static async Task Execute(IJobContext context) { if (!CliUtils.ParseArgs(Options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } if (string.IsNullOrEmpty(_directory)) { _directory = $"backup/{DateTime.Now:yyyy-MM-dd}"; } var treeInfo = new TreeInfo(_directory); DirectoryUtils.CreateDirectoryIfNotExists(treeInfo.DirectoryPath); var webConfigPath = CliUtils.GetWebConfigPath(_configFile); if (!FileUtils.IsFileExists(webConfigPath)) { await CliUtils.PrintErrorAsync($"系统配置文件不存在:{webConfigPath}!"); return; } WebConfigUtils.Load(CliUtils.PhysicalApplicationPath, webConfigPath); if (string.IsNullOrEmpty(WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"{webConfigPath} 中数据库连接字符串 connectionString 未设置"); return; } await Console.Out.WriteLineAsync($"数据库类型: {WebConfigUtils.DatabaseType.Value}"); await Console.Out.WriteLineAsync($"连接字符串: {WebConfigUtils.ConnectionString}"); await Console.Out.WriteLineAsync($"备份文件夹: {treeInfo.DirectoryPath}"); if (!DataProvider.DatabaseDao.IsConnectionStringWork(WebConfigUtils.DatabaseType, WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"系统无法连接到 {webConfigPath} 中设置的数据库"); return; } if (_excludes == null) { _excludes = new List <string>(); } _excludes.Add("bairong_Log"); _excludes.Add("bairong_ErrorLog"); _excludes.Add("siteserver_ErrorLog"); _excludes.Add("siteserver_Log"); _excludes.Add("siteserver_Tracking"); var allTableNames = DataProvider.DatabaseDao.GetTableNameList(); var tableNames = new List <string>(); foreach (var tableName in allTableNames) { if (_includes != null && !StringUtils.ContainsIgnoreCase(_includes, tableName)) { continue; } if (StringUtils.ContainsIgnoreCase(_excludes, tableName)) { continue; } if (StringUtils.ContainsIgnoreCase(tableNames, tableName)) { continue; } tableNames.Add(tableName); } await FileUtils.WriteTextAsync(treeInfo.TablesFilePath, Encoding.UTF8, TranslateUtils.JsonSerialize(tableNames)); await CliUtils.PrintRowLineAsync(); await CliUtils.PrintRowAsync("备份表名称", "总条数"); await CliUtils.PrintRowLineAsync(); foreach (var tableName in tableNames) { var tableInfo = new TableInfo { Columns = DataProvider.DatabaseDao.GetTableColumnInfoList(WebConfigUtils.ConnectionString, tableName), TotalCount = DataProvider.DatabaseDao.GetCount(tableName), RowFiles = new List <string>() }; if (_maxRows > 0 && tableInfo.TotalCount > _maxRows) { tableInfo.TotalCount = _maxRows; } await CliUtils.PrintRowAsync(tableName, tableInfo.TotalCount.ToString("#,0")); var identityColumnName = DataProvider.DatabaseDao.AddIdentityColumnIdIfNotExists(tableName, tableInfo.Columns); if (tableInfo.TotalCount > 0) { var current = 1; if (tableInfo.TotalCount > CliUtils.PageSize) { var pageCount = (int)Math.Ceiling((double)tableInfo.TotalCount / CliUtils.PageSize); using (var progress = new ProgressBar()) { for (; current <= pageCount; current++) { progress.Report((double)(current - 1) / pageCount); var fileName = $"{current}.json"; tableInfo.RowFiles.Add(fileName); var offset = (current - 1) * CliUtils.PageSize; var limit = tableInfo.TotalCount - offset < CliUtils.PageSize ? tableInfo.TotalCount - offset : CliUtils.PageSize; var rows = DataProvider.DatabaseDao.GetPageObjects(tableName, identityColumnName, offset, limit); await FileUtils.WriteTextAsync(treeInfo.GetTableContentFilePath(tableName, fileName), Encoding.UTF8, TranslateUtils.JsonSerialize(rows)); } } } else { var fileName = $"{current}.json"; tableInfo.RowFiles.Add(fileName); var rows = DataProvider.DatabaseDao.GetObjects(tableName); await FileUtils.WriteTextAsync(treeInfo.GetTableContentFilePath(tableName, fileName), Encoding.UTF8, TranslateUtils.JsonSerialize(rows)); } } await FileUtils.WriteTextAsync(treeInfo.GetTableMetadataFilePath(tableName), Encoding.UTF8, TranslateUtils.JsonSerialize(tableInfo)); } await CliUtils.PrintRowLineAsync(); await Console.Out.WriteLineAsync($"恭喜,成功备份数据库至文件夹:{treeInfo.DirectoryPath}!"); }
public static async Task Execute(IJobContext context) { if (!CliUtils.ParseArgs(Options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } var webConfigPath = CliUtils.GetWebConfigPath(_configFile); if (!FileUtils.IsFileExists(webConfigPath)) { await CliUtils.PrintErrorAsync($"系统配置文件不存在:{webConfigPath}!"); return; } if (string.IsNullOrEmpty(WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"{webConfigPath} 中数据库连接字符串 connectionString 未设置"); return; } if (string.IsNullOrEmpty(_userName)) { await CliUtils.PrintErrorAsync("未设置参数管理员用户名:{userName} !"); return; } if (string.IsNullOrEmpty(_password)) { await CliUtils.PrintErrorAsync("未设置参数管理员密码:{password} !"); return; } if (_password.Length < 6) { await CliUtils.PrintErrorAsync("管理员密码必须大于6位 !"); return; } if (!EUserPasswordRestrictionUtils.IsValid(_password, EUserPasswordRestrictionUtils.GetValue(EUserPasswordRestriction.LetterAndDigit))) { await CliUtils.PrintErrorAsync($"管理员密码不符合规则,请包含{EUserPasswordRestrictionUtils.GetText(EUserPasswordRestriction.LetterAndDigit)}"); return; } WebConfigUtils.Load(CliUtils.PhysicalApplicationPath, webConfigPath); await Console.Out.WriteLineAsync($"数据库类型: {WebConfigUtils.DatabaseType.Value}"); await Console.Out.WriteLineAsync($"连接字符串: {WebConfigUtils.ConnectionString}"); await Console.Out.WriteLineAsync($"系统文件夹: {CliUtils.PhysicalApplicationPath}"); if (!DataProvider.DatabaseDao.IsConnectionStringWork(WebConfigUtils.DatabaseType, WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync("系统无法连接到 web.config 中设置的数据库"); return; } if (SystemManager.IsInstalled) { await CliUtils.PrintErrorAsync("系统已安装在 web.config 指定的数据库中,命令执行失败"); return; } WebConfigUtils.UpdateWebConfig(WebConfigUtils.IsProtectData, WebConfigUtils.DatabaseType, WebConfigUtils.ConnectionString, WebConfigUtils.ApiPrefix, WebConfigUtils.AdminDirectory, WebConfigUtils.HomeDirectory, StringUtils.GetShortGuid(), false); DataProvider.Reset(); SystemManager.InstallDatabase(_userName, _password); await Console.Out.WriteLineAsync("恭喜,系统安装成功!"); }
public async Task Execute(IJobContext context) { if (!CliUtils.ParseArgs(_options, context.Args)) { return; } if (_isHelp) { PrintUsage(); return; } var directory = _directory; if (string.IsNullOrEmpty(directory)) { directory = $"backup/{DateTime.Now:yyyy-MM-dd}"; } var treeInfo = new TreeInfo(directory); DirectoryUtils.CreateDirectoryIfNotExists(treeInfo.DirectoryPath); var backupWebConfigPath = CliUtils.GetWebConfigPath(_from); if (!FileUtils.IsFileExists(backupWebConfigPath)) { await CliUtils.PrintErrorAsync($"系统配置文件不存在:{backupWebConfigPath}!"); return; } WebConfigUtils.Load(CliUtils.PhysicalApplicationPath, backupWebConfigPath); if (string.IsNullOrEmpty(WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"{backupWebConfigPath} 中数据库连接字符串 connectionString 未设置"); return; } await Console.Out.WriteLineAsync($"备份数据库类型: {WebConfigUtils.DatabaseType.Value}"); await Console.Out.WriteLineAsync($"备份连接字符串: {WebConfigUtils.ConnectionString}"); await Console.Out.WriteLineAsync($"备份文件夹: {treeInfo.DirectoryPath}"); if (!DataProvider.DatabaseDao.IsConnectionStringWork(WebConfigUtils.DatabaseType, WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"系统无法连接到 {backupWebConfigPath} 中设置的数据库"); return; } if (_excludes == null) { _excludes = new List <string>(); } _excludes.Add("bairong_Log"); _excludes.Add("bairong_ErrorLog"); _excludes.Add("siteserver_ErrorLog"); _excludes.Add("siteserver_Log"); _excludes.Add("siteserver_Tracking"); var errorLogFilePath = CliUtils.CreateErrorLogFile(CommandName); await BackupJob.Backup(_includes, _excludes, _maxRows, treeInfo); var restoreWebConfigPath = CliUtils.GetWebConfigPath(_to); if (!FileUtils.IsFileExists(restoreWebConfigPath)) { await CliUtils.PrintErrorAsync($"系统配置文件不存在:{restoreWebConfigPath}!"); return; } WebConfigUtils.Load(CliUtils.PhysicalApplicationPath, restoreWebConfigPath); if (string.IsNullOrEmpty(WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"{restoreWebConfigPath} 中数据库连接字符串 connectionString 未设置"); return; } await Console.Out.WriteLineAsync($"恢复数据库类型: {WebConfigUtils.DatabaseType.Value}"); await Console.Out.WriteLineAsync($"恢复连接字符串: {WebConfigUtils.ConnectionString}"); if (!DataProvider.DatabaseDao.IsConnectionStringWork(WebConfigUtils.DatabaseType, WebConfigUtils.ConnectionString)) { await CliUtils.PrintErrorAsync($"系统无法连接到 {restoreWebConfigPath} 中设置的数据库"); return; } await RestoreJob.Restore(_includes, _excludes, true, treeInfo.DirectoryPath, treeInfo, errorLogFilePath); await CliUtils.PrintRowLineAsync(); await Console.Out.WriteLineAsync("恭喜,成功同步数据!"); }