Ejemplo n.º 1
0
        static int Main(string[] args)
        {
            Log.AppLog = new Log(Log.LogDestination.Console); // Redirect to console all output
            Log.LogLevel = Log.LogEntryType.Debug; // Print all messages
            ICore _pipeProxy = null;
            CLIOptions cliOptions = new CLIOptions();
            string currentVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

            Log.AppLog.WriteEntry("", "\r\nMCEBuddy.UserCLI is a Command Line Interface for users to interact with the MCEBuddy engine", Log.LogEntryType.Debug);
            Log.AppLog.WriteEntry("", "Copyright (c) Ramit Bhalla, Build Version : " + currentVersion, Log.LogEntryType.Debug);
            Log.AppLog.WriteEntry("", "Build Date : " + System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString(System.Globalization.CultureInfo.InvariantCulture), Log.LogEntryType.Debug);
            Log.AppLog.WriteEntry("", "", Log.LogEntryType.Debug);

            if (args.Length < 2) // Atleast 2 arguments are required
            {
                Usage();
                return -1;
            }

            try
            {
                CommandLineParser parser = new CommandLineParser();
                if (!parser.ParseArguments(args, cliOptions))
                    throw new Exception("Invalid Options");
            }
            catch (Exception e)
            {
                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI Invalid Input Error -> " + e.ToString() + "\r\n", Log.LogEntryType.Error);
                Usage();
                return -1; // Bad usage
            }

            Log.AppLog.WriteEntry("", "\r\nMCEBuddy.UserCLI trying to connect to Engine " + cliOptions.Server + " on Port " + cliOptions.Port + "\r\n", Log.LogEntryType.Debug);

            // Connect to the engine
            try // Try to reconnect
            {
                ChannelFactory<ICore> pipeFactory;
                string serverString;

                string remoteServerName = cliOptions.Server;
                int remoteServerPort = cliOptions.Port;

                // If it's LOCALHOST, we use local NAMED PIPE else network SOAP WEB SERVICES
                if (remoteServerName == GlobalDefs.MCEBUDDY_SERVER_NAME)
                {
                    // local NAMED PIPE
                    serverString = GlobalDefs.MCEBUDDY_LOCAL_NAMED_PIPE;
                    NetNamedPipeBinding npb = new NetNamedPipeBinding();
                    TimeSpan timeoutPeriod = GlobalDefs.PIPE_TIMEOUT;
                    npb.OpenTimeout = npb.CloseTimeout = npb.SendTimeout = npb.ReceiveTimeout = timeoutPeriod;
                    npb.TransferMode = TransferMode.Buffered;
                    npb.MaxReceivedMessageSize = npb.MaxBufferPoolSize = npb.MaxBufferSize = Int32.MaxValue;
                    npb.ReaderQuotas = XmlDictionaryReaderQuotas.Max;
                    pipeFactory = new ChannelFactory<ICore>(npb, new EndpointAddress(serverString));
                }
                else
                {
                    // network SOAP WEB SERVICES
                    serverString = GlobalDefs.MCEBUDDY_WEB_SOAP_PIPE;
                    serverString = serverString.Replace(GlobalDefs.MCEBUDDY_SERVER_NAME, remoteServerName); // Update the Server Name with that from the config file
                    serverString = serverString.Replace(GlobalDefs.MCEBUDDY_SERVER_PORT, remoteServerPort.ToString(CultureInfo.InvariantCulture)); // Update the Server Port with that from the config file
                    BasicHttpBinding ntb = new BasicHttpBinding(GlobalDefs.MCEBUDDY_PIPE_SECURITY);
                    TimeSpan timeoutPeriod = GlobalDefs.PIPE_TIMEOUT;
                    ntb.OpenTimeout = ntb.CloseTimeout = ntb.SendTimeout = ntb.ReceiveTimeout = timeoutPeriod;
                    ntb.TransferMode = TransferMode.Buffered;
                    ntb.MaxReceivedMessageSize = ntb.MaxBufferPoolSize = ntb.MaxBufferSize = Int32.MaxValue;
                    ntb.ReaderQuotas = XmlDictionaryReaderQuotas.Max;
                    pipeFactory = new ChannelFactory<ICore>(ntb, new EndpointAddress(serverString));
                }

                // Increase the max objects allowed in serialization channel otherwise we lose the connection when there more than 5K objects in the queue
                foreach (OperationDescription operation in pipeFactory.Endpoint.Contract.Operations)
                {
                    DataContractSerializerOperationBehavior dataContractBehavior = operation.Behaviors[typeof(DataContractSerializerOperationBehavior)] as DataContractSerializerOperationBehavior;

                    if (dataContractBehavior != null)
                        dataContractBehavior.MaxItemsInObjectGraph = Int32.MaxValue;
                }

                _pipeProxy = pipeFactory.CreateChannel();
                _pipeProxy.EngineRunning(); // Test to check if we are really connected

                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI successfully connected to MCEBuddy engine", Log.LogEntryType.Debug);

                // Pass the command to the engine
                switch (cliOptions.Command)
                {
                    // Engine commands
                    case "engine":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command engine", Log.LogEntryType.Debug);
                        
                        // Engine actions
                        switch (cliOptions.Action)
                        {
                            case "start":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI starting engine", Log.LogEntryType.Debug);
                                _pipeProxy.Start();
                                break;

                            case "stop":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI stopping engine", Log.LogEntryType.Debug);
                                _pipeProxy.Stop(true);
                                break;

                            case "pause":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI pausing engine", Log.LogEntryType.Debug);
                                _pipeProxy.SuspendConversion(true);
                                break;

                            case "resume":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI resuming engine", Log.LogEntryType.Debug);
                                _pipeProxy.SuspendConversion(false);
                                break;

                            case "rescan":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI rescanning monitor locations and logs", Log.LogEntryType.Debug);
                                _pipeProxy.Rescan();
                                break;

                            default:
                                Log.AppLog.WriteEntry("", "Invalid action " + cliOptions.Action, Log.LogEntryType.Error);
                                Usage();
                                return -1;
                        }
                        break;

                    // Adding a file to the queue
                    case "addfile":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command addfile", Log.LogEntryType.Debug);
                        if (String.IsNullOrWhiteSpace(cliOptions.Action))
                        {
                            Log.AppLog.WriteEntry("", "Invalid filename " + cliOptions.Action, Log.LogEntryType.Error);
                            Usage();
                            return -1;
                        }

                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI adding file " + cliOptions.Action + " to the conversion queue", Log.LogEntryType.Debug);
                        if (Util.Net.IsUNCPath(Util.Net.GetUNCPath(cliOptions.Action))) // check if the files are on a remote computer
                            Log.AppLog.WriteEntry("", "Networked files will be accessed using the logon credentials of the MCEBuddy Service, not the currently logged on user. You can manually specify the network credentials from the Settings -> Expert Settings page in MCEBuddy.", Log.LogEntryType.Warning);
                        _pipeProxy.AddManualJob(cliOptions.Action);
                        break;

                    // Removing a job from the queue
                    case "removejob":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command removejob", Log.LogEntryType.Debug);
                        int fileNo;
                        if (String.IsNullOrWhiteSpace(cliOptions.Action) || (!int.TryParse(cliOptions.Action, out fileNo)) || (fileNo < 1)) // job starts at 1 for users
                        {
                            Log.AppLog.WriteEntry("", "Invalid job number " + cliOptions.Action, Log.LogEntryType.Error);
                            Usage();
                            return -1;
                        }

                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI removing job " + fileNo + " from the conversion queue", Log.LogEntryType.Debug);
                        _pipeProxy.CancelJob(new int[] {--fileNo}); // MCEBuddy start jobs at 0
                        break;

                    // Change priority
                    case "priority":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command change priority", Log.LogEntryType.Debug);
                        switch (cliOptions.Action)
                        {
                            case "low":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI setting priority to low", Log.LogEntryType.Debug);
                                _pipeProxy.ChangePriority("Low");
                                break;

                            case "normal":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI setting priority to normal", Log.LogEntryType.Debug);
                                _pipeProxy.ChangePriority("Normal");
                                break;

                            case "high":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI setting priority to high", Log.LogEntryType.Debug);
                                _pipeProxy.ChangePriority("High");
                                break;

                            default:
                                Log.AppLog.WriteEntry("", "Invalid priority " + cliOptions.Action, Log.LogEntryType.Error);
                                Usage();
                                return -1;
                        }
                        break;

                    // Remove file from History
                    case "deletehistoryitem":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command deleting file entry from history", Log.LogEntryType.Debug);
                        if (String.IsNullOrWhiteSpace(cliOptions.Action))
                        {
                            Log.AppLog.WriteEntry("", "Invalid filename " + cliOptions.Action, Log.LogEntryType.Error);
                            Usage();
                            return -1;
                        }

                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI deleting item " + cliOptions.Action + " from History", Log.LogEntryType.Debug);
                        _pipeProxy.DeleteHistoryItem(cliOptions.Action);
                        break;

                    // UPnP
                    case "upnp":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command UPnP", Log.LogEntryType.Debug);
                        switch (cliOptions.Action)
                        {
                            case "enable":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI enabling UPnP access port fowarding", Log.LogEntryType.Debug);
                                _pipeProxy.SetUPnPState(true);
                                break;

                            case "disable":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI disabling UPnP access port fowarding", Log.LogEntryType.Debug);
                                _pipeProxy.SetUPnPState(false);
                                break;

                            default:
                                Log.AppLog.WriteEntry("", "Invalid UPnP state " + cliOptions.Action, Log.LogEntryType.Error);
                                Usage();
                                return -1;
                        }
                        break;

                    // Firewall
                    case "firewall":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command Firewall", Log.LogEntryType.Debug);
                        switch (cliOptions.Action)
                        {
                            case "enable":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI enabling Firewall exception for MCEBuddy remote access", Log.LogEntryType.Debug);
                                _pipeProxy.SetFirewallException(true);
                                break;

                            case "disable":
                                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI disabling Firewall exception for MCEBuddy remote access", Log.LogEntryType.Debug);
                                _pipeProxy.SetFirewallException(false);
                                break;

                            default:
                                Log.AppLog.WriteEntry("", "Invalid Firewall exception state " + cliOptions.Action, Log.LogEntryType.Error);
                                Usage();
                                return -1;
                        }
                        break;

                    default:
                        Log.AppLog.WriteEntry("", "Invalid command " + cliOptions.Command, Log.LogEntryType.Error);
                        Usage();
                        return -1;
                }

                // Successful
                Log.AppLog.WriteEntry("", "\r\nMCEBuddy.UserCLI Successful!!", Log.LogEntryType.Debug);
                return 0; // we good here
            }
            catch (Exception e)
            {
                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI Error -> " + e.ToString() + "\r\n", Log.LogEntryType.Error);
                Log.AppLog.WriteEntry("", "\r\nMCEBuddy.UserCLI Failed!!", Log.LogEntryType.Debug);
                return -2; // too bad
            }
        }
Ejemplo n.º 2
0
        static int Main(string[] args)
        {
            Log.AppLog   = new Log(Log.LogDestination.Console); // Redirect to console all output
            Log.LogLevel = Log.LogEntryType.Debug;              // Print all messages
            ICore      _pipeProxy     = null;
            CLIOptions cliOptions     = new CLIOptions();
            string     currentVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

            Log.AppLog.WriteEntry("", "\r\nMCEBuddy.UserCLI is a Command Line Interface for users to interact with the MCEBuddy engine", Log.LogEntryType.Debug);
            Log.AppLog.WriteEntry("", "Copyright (c) Ramit Bhalla, Build Version : " + currentVersion, Log.LogEntryType.Debug);
            Log.AppLog.WriteEntry("", "Build Date : " + System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString(System.Globalization.CultureInfo.InvariantCulture), Log.LogEntryType.Debug);
            Log.AppLog.WriteEntry("", "", Log.LogEntryType.Debug);

            if (args.Length < 2) // Atleast 2 arguments are required
            {
                Usage();
                return(-1);
            }

            try
            {
                CommandLineParser parser = new CommandLineParser();
                if (!parser.ParseArguments(args, cliOptions))
                {
                    throw new Exception("Invalid Options");
                }
            }
            catch (Exception e)
            {
                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI Invalid Input Error -> " + e.ToString() + "\r\n", Log.LogEntryType.Error);
                Usage();
                return(-1); // Bad usage
            }

            Log.AppLog.WriteEntry("", "\r\nMCEBuddy.UserCLI trying to connect to Engine " + cliOptions.Server + " on Port " + cliOptions.Port + "\r\n", Log.LogEntryType.Debug);

            // Connect to the engine
            try // Try to reconnect
            {
                string remoteServerName = cliOptions.Server;
                int    remoteServerPort = cliOptions.Port;

                _pipeProxy = MCEBuddyEngineConnect.ConnectToRemoteEngine(remoteServerName, remoteServerPort);
                _pipeProxy.EngineRunning(); // Test to check if we are really connected

                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI successfully connected to MCEBuddy engine", Log.LogEntryType.Debug);

                // Pass the command to the engine
                switch (cliOptions.Command)
                {
                // Engine commands
                case "engine":
                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command engine", Log.LogEntryType.Debug);

                    // Engine actions
                    switch (cliOptions.Action)
                    {
                    case "start":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI starting engine", Log.LogEntryType.Debug);
                        _pipeProxy.Start();
                        break;

                    case "stop":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI stopping engine", Log.LogEntryType.Debug);
                        _pipeProxy.Stop(true);
                        break;

                    case "pause":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI pausing engine", Log.LogEntryType.Debug);
                        _pipeProxy.SuspendConversion(true);
                        break;

                    case "resume":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI resuming engine", Log.LogEntryType.Debug);
                        _pipeProxy.SuspendConversion(false);
                        break;

                    case "rescan":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI rescanning monitor locations and logs", Log.LogEntryType.Debug);
                        _pipeProxy.Rescan();
                        break;

                    default:
                        Log.AppLog.WriteEntry("", "Invalid action " + cliOptions.Action, Log.LogEntryType.Error);
                        Usage();
                        return(-1);
                    }
                    break;

                // Adding a file to the queue
                case "addfile":
                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command addfile", Log.LogEntryType.Debug);
                    if (String.IsNullOrWhiteSpace(cliOptions.Action))
                    {
                        Log.AppLog.WriteEntry("", "Invalid filename " + cliOptions.Action, Log.LogEntryType.Error);
                        Usage();
                        return(-1);
                    }

                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI adding file " + cliOptions.Action + " to the conversion queue", Log.LogEntryType.Debug);
                    if (Util.Net.IsUNCPath(Util.Net.GetUNCPath(cliOptions.Action)))     // check if the files are on a remote computer
                    {
                        Log.AppLog.WriteEntry("", "Networked files will be accessed using the logon credentials of the MCEBuddy Service, not the currently logged on user. You can manually specify the network credentials from the Settings -> Expert Settings page in MCEBuddy.", Log.LogEntryType.Warning);
                    }
                    _pipeProxy.AddManualJob(cliOptions.Action);
                    break;

                // Removing a job from the queue
                case "removejob":
                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command removejob", Log.LogEntryType.Debug);
                    int fileNo;
                    if (String.IsNullOrWhiteSpace(cliOptions.Action) || (!int.TryParse(cliOptions.Action, out fileNo)) || (fileNo < 1))     // job starts at 1 for users
                    {
                        Log.AppLog.WriteEntry("", "Invalid job number " + cliOptions.Action, Log.LogEntryType.Error);
                        Usage();
                        return(-1);
                    }

                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI removing job " + fileNo + " from the conversion queue", Log.LogEntryType.Debug);
                    _pipeProxy.CancelJob(new int[] { --fileNo });   // MCEBuddy start jobs at 0
                    break;

                // Change priority
                case "priority":
                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command change priority", Log.LogEntryType.Debug);
                    switch (cliOptions.Action)
                    {
                    case "low":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI setting priority to low", Log.LogEntryType.Debug);
                        _pipeProxy.ChangePriority("Low");
                        break;

                    case "normal":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI setting priority to normal", Log.LogEntryType.Debug);
                        _pipeProxy.ChangePriority("Normal");
                        break;

                    case "high":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI setting priority to high", Log.LogEntryType.Debug);
                        _pipeProxy.ChangePriority("High");
                        break;

                    default:
                        Log.AppLog.WriteEntry("", "Invalid priority " + cliOptions.Action, Log.LogEntryType.Error);
                        Usage();
                        return(-1);
                    }
                    break;

                // Remove file from History
                case "deletehistoryitem":
                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command deleting file entry from history", Log.LogEntryType.Debug);
                    if (String.IsNullOrWhiteSpace(cliOptions.Action))
                    {
                        Log.AppLog.WriteEntry("", "Invalid filename " + cliOptions.Action, Log.LogEntryType.Error);
                        Usage();
                        return(-1);
                    }

                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI deleting item " + cliOptions.Action + " from History", Log.LogEntryType.Debug);
                    _pipeProxy.DeleteHistoryItem(cliOptions.Action);
                    break;

                // UPnP
                case "upnp":
                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command UPnP", Log.LogEntryType.Debug);
                    switch (cliOptions.Action)
                    {
                    case "enable":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI enabling UPnP access port fowarding", Log.LogEntryType.Debug);
                        _pipeProxy.SetUPnPState(true);
                        break;

                    case "disable":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI disabling UPnP access port fowarding", Log.LogEntryType.Debug);
                        _pipeProxy.SetUPnPState(false);
                        break;

                    default:
                        Log.AppLog.WriteEntry("", "Invalid UPnP state " + cliOptions.Action, Log.LogEntryType.Error);
                        Usage();
                        return(-1);
                    }
                    break;

                // Firewall
                case "firewall":
                    Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI processing command Firewall", Log.LogEntryType.Debug);
                    switch (cliOptions.Action)
                    {
                    case "enable":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI enabling Firewall exception for MCEBuddy remote access", Log.LogEntryType.Debug);
                        _pipeProxy.SetFirewallException(true);
                        break;

                    case "disable":
                        Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI disabling Firewall exception for MCEBuddy remote access", Log.LogEntryType.Debug);
                        _pipeProxy.SetFirewallException(false);
                        break;

                    default:
                        Log.AppLog.WriteEntry("", "Invalid Firewall exception state " + cliOptions.Action, Log.LogEntryType.Error);
                        Usage();
                        return(-1);
                    }
                    break;

                default:
                    Log.AppLog.WriteEntry("", "Invalid command " + cliOptions.Command, Log.LogEntryType.Error);
                    Usage();
                    return(-1);
                }

                // Successful
                Log.AppLog.WriteEntry("", "\r\nMCEBuddy.UserCLI Successful!!", Log.LogEntryType.Debug);
                return(0); // we good here
            }
            catch (Exception e)
            {
                Log.AppLog.WriteEntry("", "MCEBuddy.UserCLI Error -> " + e.ToString() + "\r\n", Log.LogEntryType.Error);
                Log.AppLog.WriteEntry("", "\r\nMCEBuddy.UserCLI Failed!!", Log.LogEntryType.Debug);
                return(-2); // too bad
            }
        }