コード例 #1
0
ファイル: Kernel.cs プロジェクト: ewin66/Blackboard
        private void ProcCheck(IModuleClientTcp module)
        {
            IModuleProcessInfo pi = module.ProcessInfo;

            if ((pi == null) || (String.IsNullOrEmpty(pi.ProcessName)))
            {
                WriteError("No process information found for module {0}", module);
                return;
            }

            Console.Write("Checking running instances for module {0}... ", module.Name);
            try
            {
                int count = this.procMan.CheckModule(module);
                if (count >= 0)
                {
                    Console.WriteLine("Done! There are {0} instances of {1} being executed.", count, module.Name);
                }
                else
                {
                    Console.WriteLine("Failed!");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                WriteError("Failed: " + ex.Message);
            }
        }
コード例 #2
0
        /*
         * /// <summary>
         * /// Kills all modules
         * /// </summary>
         * public void StopModules()
         * {
         *      lock (oLock)
         *      {
         *
         *      }
         * }
         */

        /// <summary>
        /// Waits untill a module becomes ready
        /// </summary>
        /// <param name="mc">The IModuleClientTcp object which contains the information about the module to wait for</param>
        private void WaitModuleReady(IModuleClientTcp mc)
        {
            Parent.Log.WriteLine(6, "Waiting for '" + mc.Name + "' to be ready.");
            do
            {
                mc.WaitReady(500);
            } while (parent.IsRunning && !mc.Ready);
            Parent.Log.WriteLine(6, "IModuleClientTcp '" + mc.Name + "' is ready.");
        }
コード例 #3
0
 /// <summary>
 /// Checks if the process of the specified module is running
 /// </summary>
 /// <param name="module">The module to check</param>
 /// <returns>The number of running instances of the module</returns>
 public int CheckModule(IModuleClientTcp module)
 {
     lock (oLock)
     {
         if (!module.IsLocal)
         {
             return(RemoteCheck(module));
         }
         return(processManager.RunningProcessesCount(module.ProcessInfo));
     }
 }
コード例 #4
0
        /// <summary>
        /// Starts the specified module
        /// </summary>
        /// <param name="module">The module to start</param>
        /// <param name="method">The method used for startup</param>
        public void LaunchModule(IModuleClientTcp module, ModuleStartupMethod method)
        {
            bool result;

            if ((method == ModuleStartupMethod.None) || (module == null) || (module.ProcessInfo == null))
            {
                return;
            }

            lock (oLock)
            {
                if (!module.IsLocal)
                {
                    result = RemoteStartup(module, method);
                    //if (result && (method == ModuleStartupMethod.LaunchAndWaitReady))
                    //	WaitModuleReady(module);
                    return;
                }

                switch (method)
                {
                case ModuleStartupMethod.LaunchAlways:
                    LaunchLocalModule(module);
                    break;

                case ModuleStartupMethod.LaunchAndWaitReady:
                    //if (KillModule(module) && LaunchModule(module))
                    //	WaitModuleReady(module);
                    KillLocalModule(module);
                    LaunchLocalModule(module);
                    break;

                case ModuleStartupMethod.LaunchIfNotRunning:
                    LaunchLocalModuleIfNotRunning(module);
                    break;

                case ModuleStartupMethod.KillThenLaunch:
                    if (KillLocalModule(module))
                    {
                        LaunchLocalModule(module);
                    }
                    break;

                case ModuleStartupMethod.KillOnly:
                    KillLocalModule(module);
                    break;
                }
            }
        }
コード例 #5
0
ファイル: ModuleBlackboard.cs プロジェクト: ewin66/Blackboard
 /// <summary>
 /// Fills out the MachineStatusCollection list with information from blackboard
 /// </summary>
 private void FillMachineStatussList()
 {
     //msc.Add(new MachineStatus(IPAddress.Parse("127.0.0.1"), 50, BatteryChargeStatus.Unknown));
     foreach (IModuleClient m in this.Parent.Modules)
     {
         IModuleClientTcp module = m as IModuleClientTcp;
         if (module == null)
         {
             continue;
         }
         for (int i = 0; i < module.ServerAddresses.Count; ++i)
         {
             if (!msc.Contains(module.ServerAddresses[i]) &&
                 !module.ServerAddresses[i].Equals(IPAddress.Any) &&
                 !module.ServerAddresses[i].Equals(IPAddress.Broadcast))
             {
                 msc.Add(new MachineStatus(module.ServerAddresses[i], 50, BatteryChargeStatus.Unknown));
             }
         }
     }
 }
コード例 #6
0
ファイル: Kernel.cs プロジェクト: ewin66/Blackboard
        private void ProcStart(IModuleClientTcp module)
        {
            IModuleProcessInfo pi = module.ProcessInfo;

            if ((pi == null) || String.IsNullOrEmpty(pi.ProgramPath))
            {
                WriteError("No process information found for module {0}", module);
                return;
            }

            Console.Write("Attempting to start module {0}... ", module.Name);
            try
            {
                this.procMan.LaunchModule(module, ModuleStartupMethod.LaunchAlways);
                Console.WriteLine("Done!");
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                WriteError("Failed: " + ex.Message);
            }
        }
コード例 #7
0
ファイル: Kernel.cs プロジェクト: ewin66/Blackboard
        private void ProcKill(IModuleClientTcp module)
        {
            IModuleProcessInfo pi = module.ProcessInfo;

            if ((pi == null) || (String.IsNullOrEmpty(pi.ProcessName)))
            {
                WriteError("No process information found for module {0}", module);
                return;
            }

            Console.Write("Attempting to kill module {0}... ", module.Name);
            try
            {
                this.procMan.ShutdownModule(module, ModuleShutdownMethod.KillOnly);
                Console.WriteLine("Done!");
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                WriteError("Failed: " + ex.Message);
            }
        }
コード例 #8
0
        /// <summary>
        /// Shutsdown the specified module
        /// </summary>
        /// <param name="module">The module to shutdown</param>
        /// <param name="method">The method used for startup</param>
        public void ShutdownModule(IModuleClientTcp module, ModuleShutdownMethod method)
        {
            bool result;

            if ((method == ModuleShutdownMethod.None) || (module == null) || (module.ProcessInfo == null))
            {
                return;
            }

            lock (oLock)
            {
                Log.WriteLine(4, "Executing shutdown sequence...");
                if (!module.IsLocal)
                {
                    result = RemoteShutdown(module, method);
                    return;
                }

                switch (method)
                {
                case ModuleShutdownMethod.CloseOnly:
                    CloseLocalModule(module);
                    break;

                case ModuleShutdownMethod.KillOnly:
                    KillLocalModule(module);
                    break;

                case ModuleShutdownMethod.CloseThenKill:
                    if (!CloseLocalModule(module))
                    {
                        KillLocalModule(module);
                    }
                    break;
                }
                Log.WriteLine(4, "Shutdown sequence excecution complete!");
            }
        }
コード例 #9
0
        /// <summary>
        /// Request to execute the module startup on remote computer
        /// </summary>
        /// <param name="mc">The module to start</param>
        /// <param name="method">The startup sequence method</param>
        private bool RemoteStartup(IModuleClientTcp mc, ModuleStartupMethod method)
        {
            RemoteStartupRequest  request;
            RemoteStartupResponse response;
            SocketTcpClient       client;
            AutoResetEvent        dataReceivedEvent;
            string serialized;

            Log.WriteLine(5, "Starting module '" + mc.Name + "': on remote computer.");
            client = null;
            foreach (IPAddress ip in mc.ServerAddresses)
            {
                client = new SocketTcpClient(ip, 2300);
                if (client.TryConnect())
                {
                    break;
                }
            }
            if ((client == null) || !client.IsConnected)
            {
                Log.WriteLine(5, "Can not start module '" + mc.Name + "': unable to connect to remote computer.");
                return(false);
            }

            dataReceivedEvent    = new AutoResetEvent(false);
            client.DataReceived += new TcpDataReceivedEventHandler(delegate(TcpPacket packet)
            {
                response = RemoteStartupResponse.FromXml(packet.DataString);
                dataReceivedEvent.Set();
            });

            try
            {
                request    = new RemoteStartupRequest(mc.Name, method, mc.ProcessInfo);
                serialized = RemoteStartupRequest.ToXml(request);
                client.Send(serialized);
                response = null;
                dataReceivedEvent.WaitOne(10000);
                if (response == null)
                {
                    Log.WriteLine(5, "Can not start module '" + mc.Name + "': no response received");
                    client.Disconnect();
                    return(false);
                }
                if ((response.ModuleName != request.ModuleName) ||
                    (response.Method != request.Method))
                {
                    Log.WriteLine(5, "Can not start module '" + mc.Name + "': invalid response");
                    client.Disconnect();
                    return(false);
                }
                if (!response.Success)
                {
                    Log.WriteLine(5, "Can not start module '" + mc.Name + "': " + response.Message);
                    client.Disconnect();
                    return(false);
                }
                Log.WriteLine(5, "Start module '" + mc.Name + "': Success");
                client.Disconnect();
                return(true);
            }
            catch (Exception ex)
            {
                Log.WriteLine(5, "Can not start module '" + mc.Name + "': " + ex.Message);
                return(false);
            }
            finally
            {
                if ((client != null) && client.IsConnected)
                {
                    client.Disconnect();
                }
                if (client.Socket != null)
                {
                    client.Socket.Close();
                }
            }
        }
コード例 #10
0
 /// <summary>
 /// Launches a module if it is not running
 /// </summary>
 /// <param name="mc">The IModuleClientTcp object which contains the information about the module to launch</param>
 private bool LaunchLocalModuleIfNotRunning(IModuleClientTcp mc)
 {
     return(processManager.LaunchProcessIfNotRunning(mc.ProcessInfo));
 }
コード例 #11
0
 /// <summary>
 /// Closes a module
 /// </summary>
 /// <param name="mc">The IModuleClientTcp object which contains the information about the module to close</param>
 private bool CloseLocalModule(IModuleClientTcp mc)
 {
     return(processManager.CloseProcessWindow(mc.ProcessInfo));
 }
コード例 #12
0
ファイル: Kernel.cs プロジェクト: BioRoboticsUNAM/Blackboard
        private void ProcKill(IModuleClientTcp module)
        {
            IModuleProcessInfo pi = module.ProcessInfo;
            if ((pi == null) || (String.IsNullOrEmpty(pi.ProcessName)))
            {
                WriteError("No process information found for module {0}", module);
                return;
            }

            Console.Write("Attempting to kill module {0}... ", module.Name);
            try
            {
                this.procMan.ShutdownModule(module, ModuleShutdownMethod.KillOnly);
                Console.WriteLine("Done!");
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                WriteError("Failed: " + ex.Message);
            }
        }
コード例 #13
0
ファイル: Kernel.cs プロジェクト: ewin66/Blackboard
        public void InfoCommand(string s)
        {
            ConsoleColor color;

            if (!this.blackboard.Modules.Contains(s))
            {
                Console.WriteLine("Unknown module {0}", s);
                return;
            }
            IModuleClient m = this.blackboard.Modules[s];

            WriteModule(m);
            if (!String.IsNullOrEmpty(m.Alias) && (m.Alias != m.Name))
            {
                Console.WriteLine("Alias:  {0}", m.Alias);
            }
            if (!m.Enabled)
            {
                return;
            }

            if (m.Simulation.SimulationEnabled)
            {
                color = Console.ForegroundColor;
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Simulation enabled");
                Console.ForegroundColor = color;
            }

            IModuleClientTcp tcpModule = m as IModuleClientTcp;

            if (tcpModule != null)
            {
                color = Console.ForegroundColor;
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine();
                Console.WriteLine("TCP information:");
                Console.ForegroundColor = color;
                StringBuilder sb = new StringBuilder(100);
                foreach (System.Net.IPAddress a in tcpModule.ServerAddresses)
                {
                    sb.Append(a.ToString());
                    sb.Append(", ");
                }
                if (sb.Length > 2)
                {
                    sb.Length -= 2;
                }
                Console.WriteLine("TCP Port:  {0}", tcpModule.Port);
                Console.WriteLine("Addresses: {0}", sb.ToString());
            }

            if (m.ProcessInfo != null)
            {
                color = Console.ForegroundColor;
                Console.ForegroundColor = ConsoleColor.White;
                Console.WriteLine();
                Console.WriteLine("Process information:");
                Console.ForegroundColor = color;
                Console.WriteLine("Process Name: {0}", m.ProcessInfo.ProcessName);
                Console.WriteLine("Program Path: {0}", m.ProcessInfo.ProgramPath);
                Console.WriteLine("Program Args: {0}", m.ProcessInfo.ProgramArgs);
            }

            color = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine();
            Console.WriteLine("Prototypes (supported commands):");
            Console.ForegroundColor = color;
            WriteModulePrototypes(m);
            Console.WriteLine();
        }
コード例 #14
0
ファイル: Kernel.cs プロジェクト: BioRoboticsUNAM/Blackboard
        private void ProcStart(IModuleClientTcp module)
        {
            IModuleProcessInfo pi = module.ProcessInfo;
            if ((pi == null) || String.IsNullOrEmpty(pi.ProgramPath))
            {
                WriteError("No process information found for module {0}", module);
                return;
            }

            Console.Write("Attempting to start module {0}... ", module.Name);
            try
            {
                this.procMan.LaunchModule(module, ModuleStartupMethod.LaunchAlways);
                Console.WriteLine("Done!");
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                WriteError("Failed: " + ex.Message);
            }
        }
コード例 #15
0
 /// <summary>
 /// Kills a module
 /// </summary>
 /// <param name="mc">The IModuleClientTcp object which contains the information about the module to kill</param>
 private bool KillLocalModule(IModuleClientTcp mc)
 {
     return(processManager.CloseThenKillProcess(mc.ProcessInfo));
 }
コード例 #16
0
 /// <summary>
 /// Launches a module
 /// </summary>
 /// <param name="mc">The IModuleClientTcp object which contains the information about the module to launch</param>
 private bool LaunchModule(IModuleClientTcp mc)
 {
     return(processManager.LaunchProcess(mc.ProcessInfo));
 }
コード例 #17
0
ファイル: Kernel.cs プロジェクト: BioRoboticsUNAM/Blackboard
        private void ProcCheck(IModuleClientTcp module)
        {
            IModuleProcessInfo pi = module.ProcessInfo;
            if ((pi == null) || (String.IsNullOrEmpty(pi.ProcessName)))
            {
                WriteError("No process information found for module {0}", module);
                return;
            }

            Console.Write("Checking running instances for module {0}... ", module.Name);
            try
            {
                int count = this.procMan.CheckModule(module);
                if (count >= 0)
                    Console.WriteLine("Done! There are {0} instances of {1} being executed.", count, module.Name);
                else
                    Console.WriteLine("Failed!");
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                WriteError("Failed: " + ex.Message);
            }
        }