コード例 #1
0
        public static bool PushResponse(string MachineID, PushDataResponse response, Int64 Channel, bool Use2ndLock = false)
        {
            string Key = MachineID + "-" + Channel.ToString();
            PushServiceHelperData dd = null;

            lock (Lock)
            {
                if (Data.ContainsKey(Key) == false)
                {
                    return(false);
                }
                dd = Data[Key];
            }

            lock (dd.InnerLock)
            {
                response.MachineID = MachineID;
                dd.Responses.Add(response);
                if (Use2ndLock == false)
                {
                    dd.ResponseEventLock.Set();
                }
                else
                {
                    dd.ResponseEventLock2.Set();
                }
            }

            return(true);
        }
コード例 #2
0
        public RESTStatus RestartClientForced(SQLLib sql, object dummy, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string guid = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action  = "restartsystemforced";
            p.ReplyID = guid;

            PushServiceHelper.SendPushService(MachineID, p, 0);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, guid);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            Dummy      = new NetString();
            Dummy.Data = "OK";

            return(RESTStatus.Success);
        }
コード例 #3
0
        public RESTStatus PushResponseB(SQLLib sql, PushDataResponse pdr, NetworkConnectionInfo ni)
        {
            if (ni.HasAcl(ACLFlags.ComputerLogin) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            if (pdr == null)
            {
                ni.Error   = "Invalid data";
                ni.ErrorID = ErrorFlags.InvalidData;
                return(RESTStatus.Fail);
            }

            if (ni.PushChannel == null)
            {
                ni.Error   = "Too early";
                ni.ErrorID = ErrorFlags.InvalidData;
                return(RESTStatus.Fail);
            }

            if (PushServiceHelper.PushResponse(ni.Username, pdr, ni.PushChannel.Value, true) == false)
            {
                ni.Error   = "Cannot push";
                ni.ErrorID = ErrorFlags.SystemError;
                return(RESTStatus.ServerError);
            }

            return(RESTStatus.Success);
        }
コード例 #4
0
ファイル: StdIO.cs プロジェクト: VulpesSARL/Fox-SDC
        public RESTStatus PopSTDIOData(SQLLib sql, NetString StdIOSession, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            if (StdIOSession == null)
            {
                ni.Error   = "Missing Session Data";
                ni.ErrorID = ErrorFlags.InvalidData;
                return(RESTStatus.Fail);
            }

            if (string.IsNullOrWhiteSpace(StdIOSession.Data) == true)
            {
                ni.Error   = "Missing Session Data";
                ni.ErrorID = ErrorFlags.InvalidData;
                return(RESTStatus.Fail);
            }

            string           sess = "stdio-" + StdIOSession.Data;
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, sess, true);

            if (resp == null)
            {
                res           = new Push_Stdio_StdOut();
                res.SessionID = StdIOSession.Data;
                res.State     = PushStdoutState.Timeout;
                return(RESTStatus.NoContent);
            }

            try
            {
                res = JsonConvert.DeserializeObject <Push_Stdio_StdOut>(resp.Data.ToString());
            }
            catch
            {
                res           = new Push_Stdio_StdOut();
                res.SessionID = StdIOSession.Data;
                res.State     = PushStdoutState.InternalError;
                return(RESTStatus.NoContent);
            }

            return(RESTStatus.Success);
        }
コード例 #5
0
        public RESTStatus PushNetworkDataCreateConnection(SQLLib sql, PushConnectNetwork data, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string SessionConnectionGUID = RemoteNetworkConnectionWSCrosser.CreateSession(ni.Username, MachineID);

            data.SessionID = SessionConnectionGUID;

            string sess = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action          = "netcreatedata2";
            p.ReplyID         = sess;
            p.AdditionalData1 = JsonConvert.SerializeObject(data);

            PushServiceHelper.SendPushService(MachineID, p, 1);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 1, sess);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                RemoteNetworkConnectionWSCrosser.CloseSession(SessionConnectionGUID);
                return(RESTStatus.NoContent);
            }

            try
            {
                res1 = JsonConvert.DeserializeObject <PushConnectNetworkResult>(resp.Data.ToString());
            }
            catch
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                RemoteNetworkConnectionWSCrosser.CloseSession(SessionConnectionGUID);
                return(RESTStatus.NoContent);
            }

            return(RESTStatus.Success);
        }
コード例 #6
0
        public RESTStatus CheckFile(SQLLib sql, NetString Req, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string guid = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action          = "checkfile";
            p.ReplyID         = guid;
            p.AdditionalData1 = Req.Data;

            PushServiceHelper.SendPushService(MachineID, p, 0);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, guid);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            try
            {
                FileRes = new NetInt32();
                if (Int32.TryParse(resp.Data.ToString(), out FileRes.Data) == false)
                {
                    ni.Error   = "Faulty data";
                    ni.ErrorID = ErrorFlags.NoData;
                    return(RESTStatus.NoContent);
                }
            }
            catch
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }
            return(RESTStatus.Success);
        }
コード例 #7
0
        public RESTStatus PushNetworkDataPull(SQLLib sql, PushConnectNetworkData data, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string sess = Guid.NewGuid().ToString();

            data.data = null;

            PushData p = new PushData();

            p.Action          = "netdatapull";
            p.ReplyID         = sess;
            p.AdditionalData1 = JsonConvert.SerializeObject(data);

            PushServiceHelper.SendPushService(MachineID, p, 1);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 1, sess);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            try
            {
                resd = JsonConvert.DeserializeObject <PushConnectNetworkData>(resp.Data.ToString());
            }
            catch
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            return(RESTStatus.Success);
        }
コード例 #8
0
        public RESTStatus WSCreateScreenConnection(SQLLib sql, object dummy, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string SessionConnectionGUID = RemoteNetworkConnectionWSCrosser.CreateSession(ni.Username, MachineID);
            string guid = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action          = "startwsscreen";
            p.ReplyID         = guid;
            p.AdditionalData1 = SessionConnectionGUID;

            PushServiceHelper.SendPushService(MachineID, p, 2);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 2, guid, Timeout: 240);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            try
            {
                res1 = JsonConvert.DeserializeObject <PushConnectNetworkResult>(resp.Data.ToString());
            }
            catch
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }
            return(RESTStatus.Success);
        }
コード例 #9
0
        public RESTStatus ListFiles(SQLLib sql, PushDirListReq Req, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string guid = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action          = "listfiles";
            p.ReplyID         = guid;
            p.AdditionalData1 = JsonConvert.SerializeObject(Req);

            PushServiceHelper.SendPushService(MachineID, p, 0);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, guid);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            try
            {
                Lists = JsonConvert.DeserializeObject <NetStringList>(resp.Data.ToString());
            }
            catch
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }
            return(RESTStatus.Success);
        }
コード例 #10
0
        public RESTStatus WUCheckStatus(SQLLib sql, object dummy, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string guid = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action  = "wustatus";
            p.ReplyID = guid;

            PushServiceHelper.SendPushService(MachineID, p, 0);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, guid);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            try
            {
                WUStatus = JsonConvert.DeserializeObject <WUStatus>(resp.Data.ToString());
            }
            catch
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            return(RESTStatus.Success);
        }
コード例 #11
0
ファイル: TaskManager.cs プロジェクト: VulpesSARL/Fox-SDC
        public RESTStatus KillTask(SQLLib sql, NetInt32 PID, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string guid = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action          = "killtask";
            p.ReplyID         = guid;
            p.AdditionalData1 = PID.Data.ToString();

            PushServiceHelper.SendPushService(MachineID, p, 0);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, guid);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            OK      = new NetBool();
            OK.Data = false;

            if (resp.Data.ToString() != "ok")
            {
                OK.Data = false;
                return(RESTStatus.Success);
            }

            OK.Data = true;
            return(RESTStatus.Success);
        }
コード例 #12
0
ファイル: EFIBios.cs プロジェクト: VulpesSARL/Fox-SDC
        public RESTStatus SetNextEFIDevice(SQLLib sql, NetInt32 ID, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string guid = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action          = "efisetnextdevice";
            p.ReplyID         = guid;
            p.AdditionalData1 = ID.Data.ToString();

            PushServiceHelper.SendPushService(MachineID, p, 0);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, guid);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            try
            {
                NextBootDeviceOK = JsonConvert.DeserializeObject <NetBool>(resp.Data.ToString());
            }
            catch
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }
            return(RESTStatus.Success);
        }
コード例 #13
0
ファイル: Clock.cs プロジェクト: VulpesSARL/Fox-SDC
        public RESTStatus Clock(SQLLib sql, object dummy, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string guid = Guid.NewGuid().ToString();

            PushData p = new PushData();

            p.Action  = "clock";
            p.ReplyID = guid;

            PushServiceHelper.SendPushService(MachineID, p, 0);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 0, guid);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            if (!(resp.Data is DateTime))
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            ClockData       = new PushClock();
            ClockData.UTCDT = (DateTime)resp.Data;

            return(RESTStatus.Success);
        }
コード例 #14
0
ファイル: Chat.cs プロジェクト: VulpesSARL/Fox-SDC
        public RESTStatus SendChatmessageToClient(SQLLib sql, PushChatMessage ChatMessage, NetworkConnectionInfo ni, string MachineID)
        {
            if (ni.HasAcl(ACLFlags.ChangeServerSettings) == false)
            {
                ni.Error   = "Access denied";
                ni.ErrorID = ErrorFlags.AccessDenied;
                return(RESTStatus.Denied);
            }

            string guid = Guid.NewGuid().ToString();

            Int64?ID = null;

            lock (ni.sqllock)
            {
                ID = sql.InsertMultiDataID("Chats",
                                           new SQLData("MachineID", MachineID),
                                           new SQLData("DT", DateTime.UtcNow),
                                           new SQLData("Read", 0),
                                           new SQLData("ToClient", 1),
                                           new SQLData("Name", ni.Name),
                                           new SQLData("Text", ChatMessage.Text));
            }
            if (ID != null)
            {
                ChatMessage.ID = ID.Value;
            }
            else
            {
                ChatMessage.ID = 0;
            }

            ChatMessage.DT   = DateTime.UtcNow;
            ChatMessage.Name = ni.Name;

            PushData p = new PushData();

            p.Action          = "chatmessage";
            p.ReplyID         = guid;
            p.AdditionalData1 = JsonConvert.SerializeObject(ChatMessage);

            PushServiceHelper.SendPushService(MachineID, p, 10);
            PushDataResponse resp = PushServiceHelper.PopResponse(MachineID, 10, guid);

            if (resp == null)
            {
                ni.Error   = "No response";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }

            try
            {
                Res = JsonConvert.DeserializeObject <NetBool>(resp.Data.ToString());
            }
            catch
            {
                ni.Error   = "Faulty data";
                ni.ErrorID = ErrorFlags.NoData;
                return(RESTStatus.NoContent);
            }
            return(RESTStatus.Success);
        }
コード例 #15
0
        public static PushDataResponse PopResponse(string MachineID, Int64 Channel, string SpecificID, bool Use2ndLock = false, int Timeout = 60)
        {
            string Key = MachineID + "-" + Channel.ToString();
            PushServiceHelperData dd   = null;
            PushDataResponse      resp = null;

            lock (Lock)
            {
                if (Data.ContainsKey(Key) == false)
                {
                    return(null);
                }
                dd = Data[Key];
            }

            DateTime now = DateTime.UtcNow;

            do
            {
                if ((DateTime.UtcNow - now).TotalSeconds > 30)
                {
                    break;
                }

                int Counter = 0;
                int Timer   = 0;
                lock (dd.InnerLock)
                {
                    Counter = dd.Responses.Count;
                }

                if (Counter == 0)
                {
                    if (Use2ndLock == false)
                    {
                        while (Counter == 0)
                        {
                            lock (dd.InnerLock)
                            {
                                Counter = dd.Responses.Count;
                            }
                            dd.ResponseEventLock.WaitOne(LockWaitOne);
                            Timer++;
                            if (Timer > Timeout)
                            {
                                break;
                            }
                        }
                    }
                    else
                    {
                        while (Counter == 0)
                        {
                            lock (dd.InnerLock)
                            {
                                Counter = dd.Responses.Count;
                            }
                            dd.ResponseEventLock2.WaitOne(LockWaitOne);
                            Timer++;
                            if (Timer > Timeout)
                            {
                                break;
                            }
                        }
                    }
                }

                if (string.IsNullOrWhiteSpace(SpecificID) == true)
                {
                    lock (dd.InnerLock)
                    {
                        if (dd.Responses.Count == 0)
                        {
                            if (Use2ndLock == false)
                            {
                                dd.ResponseEventLock.Reset();
                            }
                            else
                            {
                                dd.ResponseEventLock2.Reset();
                            }
                            continue;
                        }
                        resp = dd.Responses[0];
                        dd.Responses.RemoveAt(0);
                        if (dd.Responses.Count == 0)
                        {
                            if (Use2ndLock == false)
                            {
                                dd.ResponseEventLock.Reset();
                            }
                            else
                            {
                                dd.ResponseEventLock2.Reset();
                            }
                        }
                        break;
                    }
                }
                else
                {
                    lock (dd.InnerLock)
                    {
                        if (dd.Responses.Count == 0)
                        {
                            if (Use2ndLock == false)
                            {
                                dd.ResponseEventLock.Reset();
                            }
                            else
                            {
                                dd.ResponseEventLock2.Reset();
                            }
                            continue;
                        }
                        foreach (PushDataResponse r in dd.Responses)
                        {
                            if (string.IsNullOrWhiteSpace(r.ReplyID) == false)
                            {
                                if (r.ReplyID.ToLower() == SpecificID.ToLower())
                                {
                                    resp = r;
                                    break;
                                }
                            }
                        }
                        if (resp != null)
                        {
                            dd.Responses.Remove(resp);
                            if (dd.Responses.Count == 0)
                            {
                                if (Use2ndLock == false)
                                {
                                    dd.ResponseEventLock.Reset();
                                }
                                else
                                {
                                    dd.ResponseEventLock2.Reset();
                                }
                            }
                            break;
                        }
                        if (Use2ndLock == false)
                        {
                            dd.ResponseEventLock.Reset();
                        }
                        else
                        {
                            dd.ResponseEventLock2.Reset();
                        }
                    }
                }
            } while (true);
#if DEBUG
            //StackTrace stacky = new StackTrace();
            //Debug.WriteLine(">> PopResponse: \n  " + JsonConvert.SerializeObject(resp) + "\n       for\n   " + stacky.ToString());
#endif
            return(resp);
        }