public static void DefaultSetDestinationsProc(DataVaultServerReceivedData data, DataVaultServerOptions options) { FileSystem fs = options.DestFileSystem; PathParser parser = fs.PathParser; string root = options.DestRootDirName; DataVaultData d = data.JsonData !; string timeStampStr; if (d.WithTime == false) { timeStampStr = Str.DateToStrShort(d.TimeStamp.LocalDateTime.Date); } else { timeStampStr = Str.DateTimeToStrShortWithMilliSecs(d.TimeStamp.LocalDateTime); } string relativePath = Str.CombineStringArray("/", d.SystemName, d.LogName, d.KeyType, d.KeyShortValue, d.KeyFullValue, $"{timeStampStr}-{d.SystemName}-{d.LogName}-{d.KeyType}-{d.KeyFullValue}.json"); if (d.WriteCompleteFlag ?? false) { relativePath += ".completed"; } data.AddDestinationFileName(parser.NormalizeDirectorySeparator(parser.Combine(root, relativePath))); }
public async Task <HttpResult> PostHandlerAsync(WebMethods method, string path, QueryStringList queryString, HttpContext context, RouteData routeData, IPEndPoint local, IPEndPoint remote, CancellationToken cancel = default) { var request = context.Request; string str = await request._RecvStringContentsAsync(CoresConfig.DataVaultServerApp.MaxHttpPostRecvData, cancel : cancel); DataVaultData?recv = str._JsonToObject <DataVaultData>(); List <DataVaultData> list = new List <DataVaultData>(); if (recv != null) { recv.NormalizeReceivedData(); recv.StatGitCommitId = recv.StatGitCommitId._NonNullTrim(); recv.StatAppVer = recv.StatAppVer._NonNullTrim(); recv.TimeStamp = DtOffsetNow; recv.StatGlobalIp = remote.Address.ToString(); recv.StatGlobalPort = remote.Port; recv.StatGlobalFqdn = await LocalNet.GetHostNameSingleOrIpAsync(recv.StatGlobalIp, cancel); recv.StatLocalIp = recv.StatLocalIp._NonNullTrim(); if (recv.StatLocalIp._IsEmpty()) { recv.StatLocalIp = "127.0.0.1"; } recv.StatLocalFqdn = recv.StatLocalFqdn._NonNullTrim(); if (recv.StatLocalFqdn._IsEmpty()) { recv.StatLocalFqdn = "localhost"; } recv.StatUid = recv.StatUid._NonNullTrim(); if (recv.SystemName._IsFilled() && recv.LogName._IsFilled()) { // キー無し 1 つのディレクトリに全部書き込み try { DataVaultData d = recv._CloneIfClonable(); d.KeyType = "all"; d.KeyShortValue = "all"; d.KeyFullValue = "all"; list.Add(d); } catch (Exception ex) { ex._Debug(); } // UID からキーを生成 try { DataVaultData d = recv._CloneIfClonable(); d.KeyType = "by_uid"; d.KeyShortValue = recv.StatUid._TruncStr(2); d.KeyFullValue = recv.StatUid._TruncStr(4); list.Add(d); } catch (Exception ex) { ex._Debug(); } // グローバル IP からキーを生成 try { DataVaultData d = recv._CloneIfClonable(); d.KeyType = "by_global_ip"; d.KeyShortValue = IPUtil.GetHead1BytesIPString(recv.StatGlobalIp); d.KeyFullValue = IPUtil.GetHead2BytesIPString(recv.StatGlobalIp); list.Add(d); } catch (Exception ex) { ex._Debug(); } // グローバル FQDN からキーを生成 try { string shortKey, longKey; if (IPUtil.IsStrIP(recv.StatGlobalFqdn) == false) { // FQDN if (MasterData.DomainSuffixList.ParseDomainBySuffixList(recv.StatGlobalFqdn, out string tld, out string domain, out string hostname)) { // 正しい TLD 配下のドメイン // 例: 12345.abc.example.org の場合 // Short key は org.example.ab // Long key は org.example.abc.1 string domainReverse = domain._Split(StringSplitOptions.RemoveEmptyEntries, '.').Reverse()._Combine("."); string hostnameReverse = hostname._Split(StringSplitOptions.RemoveEmptyEntries, '.').Reverse()._Combine("."); shortKey = new string[] { domainReverse, hostnameReverse._TruncStr(2) }._Combine("."); longKey = new string[] { domainReverse, hostnameReverse._TruncStr(5) }._Combine("."); } else { // おかしなドメイン shortKey = recv.StatGlobalFqdn._TruncStr(2); longKey = recv.StatGlobalFqdn._TruncStr(4); } } else { // IP アドレス shortKey = IPUtil.GetHead1BytesIPString(recv.StatGlobalIp); longKey = IPUtil.GetHead1BytesIPString(recv.StatGlobalIp); } DataVaultData d = recv._CloneIfClonable(); d.KeyType = "by_global_fqdn"; d.KeyShortValue = shortKey; d.KeyFullValue = longKey; list.Add(d); }
async Task PostHttpMainAsync(CancellationToken cancel = default) { if (this.Config.PostUrl._IsEmpty()) { return; } StatManDatabase copy; lock (this.DataLock) { copy = this.Database._CloneWithJson(); } KeyValueList <string, string> vers = new KeyValueList <string, string>(); vers.Add("APPNAME", CoresLib.AppNameFnSafe); vers.Add("OS", Env.OsInfoString); vers.Add("CPU", Env.CpuInfo.ToString()); vers.Add("NUMCPU", Env.NumCpus.ToString()); vers.Add("DOTNET", Env.FrameworkInfoString); vers.Add("EXE", Env.AppExecutableExeOrDllFileName._GetFileName() ?? ""); List <string> versStrs = new List <string>(); vers.ForEach(x => versStrs.Add($"{x.Key}={x.Value}")); var data = Json.NewJsonObject(); foreach (var item in copy.StrValues) { data.TryAdd(item.Key, new JValue(item.Value)); } foreach (var item in copy.LongValues) { data.TryAdd(item.Key, new JValue(item.Value)); } DataVaultData postData = new DataVaultData { TimeStamp = DtOffsetNow, StatUid = copy.Uid, StatAppVer = versStrs._Combine("|"), StatGitCommitId = Dbg.GetCurrentGitCommitId(), StatLocalIp = this.CurrentLocalIp.ToString(), StatLocalFqdn = LocalNet.GetHostInfo(true).HostName, SystemName = Config.SystemName, LogName = Config.LogName, Data = data, }; string postStr = postData._ObjectToJson(); using var http = new WebApi(new WebApiOptions(new WebApiSettings { SslAcceptAnyCerts = true })); var ret = await http.SimplePostJsonAsync(WebMethods.POST, Config.PostUrl, postStr, cancel); if (ret.ToString()._InStr("ok") == false) { throw new CoresException($"Http error: {ret.ToString()._TruncStrEx(1000)}"); } }