Esempio n. 1
0
        private void NodeInfoForOneNode(NodeInfoInNet x)
        {
            LocalNodeInfo nod = null;

            lock (LocalNodes)
            {
                nod = LocalNodes.FirstOrDefault(y => y.NodeId == x.NodeGuid);
                if (nod == null)
                {
                    nod = new LocalNodeInfo {
                        NodeId          = x.NodeGuid,
                        Fetched         = false,
                        PCVersion       = x.PCVersion,
                        StatusTimeStamp = x.TimeStamp,
                    };
                    LocalNodes.Add(nod);
                }
                else
                {
                    if (nod.StatusTimeStamp > x.TimeStamp)
                    {
                        return;
                    }
                    if (nod.StatusTimeStamp == x.TimeStamp)
                    {
                        if (nod.Fetched)
                        {
                            return;
                        }
                    }
                    else
                    {
                        nod.Fetched         = false;
                        nod.StatusTimeStamp = x.TimeStamp;
                    }
                    //do not set LocalNodeInfo.Url in this block
                }
            }
            if (nod.NodeId == ThisNodeID)//self
            {
                nod.Url = x.Url = $"http://localhost:{WebServerPort}/";
            }

            var t = new FetchQueueItem {
                Node       = x,
                LocalNode  = nod,
                FinishTask = new TaskCompletionSource <int>()
            };

            fetchCloudInfo.Post(t);
            t.FinishTask.Task.Wait(10 * 1000);
        }
Esempio n. 2
0
 private void FireNodeRemovingEvent(LocalNodeInfo node)
 {
     try
     {
         var info = new LocalNodeUpdateEventArgs()
         {
             nodeInfo = node, PCinfos = new List <SSDPPCInfo>()
         };
         OnNodeUpdate?.Invoke(this, info);
     }
     catch (Exception exception)
     {
         logger.LogError(exception, $"Error getting info for node: {node.Url}");
     }
 }
Esempio n. 3
0
        private async Task <PersonalCloudInfo> GetPeerPCInfo(PersonalCloud pc, LocalDiscovery.LocalNodeInfo ninfo)
        {
            try
            {
                var url = new Uri(new Uri(ninfo.Url), "/api/share/cloud");
                var s   = await TopFolderClient.GetCloudInfo(httpClient.Value, url, pc.Id, pc.MasterKey).ConfigureAwait(false);

                var cfg = JsonConvert.DeserializeObject <PersonalCloudInfo>(s);
                var lis = cfg.Apps.Where(x => x.NodeId != ninfo.NodeId).ToList();
                foreach (var item in lis)
                {
                    cfg.Apps.Remove(item);
                }
                return(cfg);
            }
            catch (Exception e)
            {
                logger.LogError(e, $"Exception in GetPeerPCInfo {ninfo?.Url}");
                return(null);
            }
        }
Esempio n. 4
0
        private void SyncSharePCs(LocalNodeInfo node, List <SSDPPCInfo> res)
        {
            //remove
            lock (sharedPCs)
            {
                sharedPCs.RemoveAll(x =>
                                    (x.NodeId == node.NodeId) &&
                                    (
                                        res.FirstOrDefault(y =>
                                                           (y.Id == x.PCId) &&
                                                           (!string.IsNullOrWhiteSpace(y.CodeHash))) == null
                                    )
                                    );
            }

            //add
            lock (sharedPCs)
            {
                foreach (var item in res)
                {
                    if (!string.IsNullOrWhiteSpace(item.CodeHash))
                    {
                        var prev = sharedPCs.FirstOrDefault(x => ((x.NodeId == node.NodeId) && (x.PCId == item.Id)));
                        if (prev == null)
                        {
                            var hash  = ulong.Parse(item.CodeHash, CultureInfo.InvariantCulture);
                            var snode = new NodeShareInfo {
                                Hash      = hash,
                                NodeId    = node.NodeId,
                                Url       = node.Url,
                                PCId      = item.Id,
                                PCVersion = node.PCVersion,
                            };
                            sharedPCs.Add(snode);
                        }
                        logger.LogTrace($"{node.Url}:A PC is sharing");
                    }
                }
            }
        }
Esempio n. 5
0
        private async Task OnNewNodeDiscovered(LocalNodeInfo node, HttpResponseMessage req)
        {
            var res = JsonConvert.DeserializeObject <List <SSDPPCInfo> >(await req.Content.ReadAsStringAsync().ConfigureAwait(false));

            if (res == null)
            {
                res = new List <SSDPPCInfo>();
            }
            try
            {
                node.PcIds = res.Select(x => x.Id).ToList();
                var info = new LocalNodeUpdateEventArgs()
                {
                    nodeInfo = node, PCinfos = res
                };
                OnNodeUpdate?.Invoke(this, info);
            }
            catch (Exception exception)
            {
                logger.LogError(exception, $"Error getting info for node: {node.Url}");
            }

            SyncSharePCs(node, res);
        }
Esempio n. 6
0
        internal async Task OnLocalNodeUpdate(LocalDiscovery.LocalNodeInfo ninfo, List <SSDPPCInfo> ssdpinfo)
        {
            bool updated = false;
            bool deleted = false;

            lock (CachedNodes)
            {
                var ssdpin = ssdpinfo.FirstOrDefault(x => x.Id == Id);
                if (ssdpin != null)
                {
                    var name = DecryptName(ssdpin.EN);
                    if (name == null)
                    {
                        logger.LogError($"Invalid node from {ninfo.Url}");
                        return;
                    }

                    NodeInfoForPC info = CachedNodes.FirstOrDefault(x => x.NodeGuid == ninfo.NodeId);
                    if (info != null)
                    {
                        if (info.PCTimeStamp < ssdpin.TimeStamp)
                        {
                            logger.LogTrace($"Removing node {info.Name} {info.NodeGuid}");
                            CachedNodes.Remove(info);
                        }
                        else
                        {
                            return;
                        }
                    }
                    var newinf = new NodeInfoForPC {
                        NodeGuid    = ninfo.NodeId,
                        PCVersion   = ninfo.PCVersion,
                        PCTimeStamp = ssdpin.TimeStamp,
                        Url         = ninfo.Url,
                        Name        = name
                    };
                    CachedNodes.Add(newinf);
                    OnCachedNodesChange();
                    updated = true;
                }
                else
                {
                    int nremoved = 0;
                    if (CachedNodes.FirstOrDefault(x => x.NodeGuid == ninfo.NodeId) != null)
                    {
                        nremoved = CachedNodes.RemoveAll(x => x.NodeGuid == ninfo.NodeId);
                    }
                    if (nremoved > 0)
                    {
                        logger.LogTrace($"Removing node {ninfo.NodeId} {ninfo.NodeId} all");
                        OnCachedNodesChange();
                        deleted = true;
                    }
                }
            }
            if (updated || deleted)
            {
                if (!deleted)
                {
                    var pci = await GetPeerPCInfo(this, ninfo).ConfigureAwait(false);

                    if ((pci != null) && (pci.StorageProviders != null))
                    {
                        bool needResync = false;
                        foreach (var sp in pci.StorageProviders)
                        {
                            if (sp.Visibility != StorageProviderVisibility.Public)
                            {
                                continue;
                            }
                            if (sp.Type == StorageProviderInstance.TypeAliYun)
                            {
                                lock (StorageProviderInstances)
                                {
                                    if (!StorageProviderInstances.Any(x => sp.Id.Equals(x.RuntimeId)))
                                    {
                                        var instance = new StorageProviderInstance_AliyunOSS(new StorageProviderInfo {
                                            Id         = sp.Id,
                                            Type       = StorageProviderInstance.TypeAliYun,
                                            Name       = sp.Name,
                                            Visibility = sp.Visibility,
                                            Settings   = sp.Settings
                                        });
                                        StorageProviderInstances.Add(instance);
                                        needResync = true;
                                    }
                                }
                            }
                            if (sp.Type == StorageProviderInstance.TypeAzure)
                            {
                                lock (StorageProviderInstances)
                                {
                                    if (!StorageProviderInstances.Any(x => sp.Id.Equals(x.RuntimeId)))
                                    {
                                        var instance = new StorageProviderInstance_AzureBlob(new StorageProviderInfo {
                                            Id         = sp.Id,
                                            Type       = StorageProviderInstance.TypeAzure,
                                            Name       = sp.Name,
                                            Visibility = sp.Visibility,
                                            Settings   = sp.Settings
                                        });
                                        StorageProviderInstances.Add(instance);
                                        needResync = true;
                                    }
                                }
                            }
                        }
                        if (needResync)
                        {
                            ResyncClientListToStorageProviderInstances();
                        }
                    }
                    if ((pci != null) && (pci.Apps != null))
                    {
                        foreach (var ai in pci.Apps)
                        {
                            NodeInfoForPC n = GetNodeById(ai.NodeId);
                            if (n == null)
                            {
                                return;
                            }
                            var a = Apps.FirstOrDefault(x => (x.NodeId == ai.NodeId) && (x.AppId == ai.AppId) && (x.Name == ai.Name));
                            if (a == null)
                            {
                                lock (Apps)
                                {
                                    Apps.Add(ai);
                                }
                            }
                        }
                    }
                }
                _ = Task.Run(() => {
                    try
                    {
                        OnNodeChangedEvent?.Invoke(this, EventArgs.Empty);
                    }
                    catch
                    {
                    }
                });
            }
        }