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)));
    }
Exemple #2
0
    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);
                }
Exemple #3
0
    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)}");
        }
    }