public static void UpdateConfiguration(ServantConfiguration configuration)
        {
            var content = Serializer.Serialize(configuration);

            System.IO.File.WriteAllText(ConfigFilePath, content);
            TinyIoCContainer.Current.Register(configuration);
        }
Exemple #2
0
        public void Setup()
        {
            Configuration = Nancy.TinyIoc.TinyIoCContainer.Current.Resolve <ServantConfiguration>();

            var nonAuthenticatedModules = new List <Type> {
                typeof(SetupModule), typeof(ApiModule)
            };
            var requiresAuthentication = !nonAuthenticatedModules.Contains(this.GetType());

            Before += ctx =>
            {
                Model.Title = "Servant for IIS";
                Page        = new PageModel
                {
                    Servername = System.Environment.MachineName,
                    Sites      = SiteManager.GetSites(true).OrderBy(x => x.Name)
                };
                var fileVersion = FileVersionInfo.GetVersionInfo(typeof(BaseModule).Assembly.Location).FileVersion.Split('.');
                Model.Version          = string.Join(".", fileVersion.Take(2));
                Model.Page             = Page;
                Model.Errors           = new List <Error>();
                Model.InstallationGuid = Configuration.InstallationGuid;
                bool IsDevelopment;
                bool.TryParse(System.Configuration.ConfigurationManager.AppSettings["IsDevelopment"], out IsDevelopment);
                Model.IsDevelopment       = IsDevelopment;
                Model.AutoSendCrashReport = Configuration.AutoSendCrashReport;

                return(null);
            };

            After += ctx =>
            {
                var redirectStatusCodes = new [] { HttpStatusCode.TemporaryRedirect, HttpStatusCode.SeeOther, HttpStatusCode.MovedPermanently };
                Model.ErrorsAsJson = new Nancy.Json.JavaScriptSerializer().Serialize(Model.Errors);

                if (!redirectStatusCodes.Contains(ctx.Response.StatusCode))
                {
                    Model.Message       = Session[MessageKey];
                    Model.MessageType   = Session[MessageTypeKey];
                    Session[MessageKey] = null;
                }

                if (!Configuration.SetupCompleted && requiresAuthentication)
                {
                    ctx.Response = Response.AsRedirect("/setup/1/");
                }
            };


            if (requiresAuthentication)
            {
                this.RequiresAuthentication();
            }
        }
Exemple #3
0
        public void Start(ServantConfiguration configuration = null)
        {
            if (configuration == null)
            {
                configuration = Nancy.TinyIoc.TinyIoCContainer.Current.Resolve <ServantConfiguration>();
                Debug         = configuration.Debug;
            }

            if (ServantHost == null)
            {
                var uri = new Uri(configuration.ServantUrl.Replace("*", "localhost"));
                CreateHost(uri);

                //StartLogParsing();
                try
                {
                    ServantHost.Start();
                }
                catch (HttpListenerException)                 // Tries to start Servant on another port
                {
                    var servantUrl   = configuration.ServantUrl.Replace("*", "localhost");
                    var portPosition = servantUrl.LastIndexOf(":");
                    if (portPosition != -1)
                    {
                        servantUrl = servantUrl.Substring(0, portPosition);
                    }
                    servantUrl += ":54445";

                    var newUri = new Uri(servantUrl);
                    CreateHost(uri);
                    ServantHost.Start();

                    configuration.ServantUrl = newUri.ToString();
                    ConfigurationHelper.UpdateConfiguration(configuration);
                }
            }

            if (configuration.EnableErrorMonitoring)
            {
                _timer.Start();
            }

            if (Debug)
            {
                Console.WriteLine("Host started on {0}", configuration.ServantUrl);
            }
        }
Exemple #4
0
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.AssemblyResolve += Resolver;
            Init();

            if (!IsAnAdministrator())
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("Error: ");
                Console.ResetColor();
                Console.Write("Servant needs to run as administrator to access IIS.");
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.DarkYellow;
                Console.Write("Solution: ");
                Console.ResetColor();
                Console.Write("Right click Servant.Server.exe and select 'Run as administrator'.");
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
                return;
            }

            if (!IsIisInstalled())
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("Error: ");
                Console.ResetColor();
                Console.Write("IIS needs to be installed to use Servant.");
                Console.WriteLine();
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
                return;
            }

            var command = args.FirstOrDefault() ?? "";

            Configuration = TinyIoCContainer.Current.Resolve <ServantConfiguration>();

            if (Configuration.IsHttps())
            {
                if (!IsServantCertificateInstalled())
                {
                    InstallServantCertificate();
                }

                var servantPort = new Uri(Configuration.ServantUrl).Port;
                if (!CertificateHandler.IsCertificateBound(servantPort))
                {
                    CertificateHandler.AddCertificateBinding(servantPort);
                }
            }

            switch (command)
            {
            case "install":
                if (IsAlreadyInstalled())
                {
                    Console.WriteLine("Servant is already installed. Use /uninstall to uninstall.");
                    Console.ReadLine();
                    return;
                }
                const string servantServiceName = "Servant for IIS";

                var existingServantService = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == servantServiceName);
                if (existingServantService != null)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Servant is already running on this machine.");
                    Console.ReadLine();
                    return;
                }
                ManagedInstallerClass.InstallHelper(new[] { "/LogToConsole=false", Assembly.GetExecutingAssembly().Location });
                var startController = new ServiceController("Servant for IIS");
                startController.Start();
                StartBrowser();
                Console.WriteLine("Servant was successfully installed. Please complete the installation from your browser on " + Configuration.ServantUrl);
                break;

            case "uninstall":
                Console.WriteLine();
                Console.WriteLine("Trying to uninstall the Servant service...");
                try
                {
                    ManagedInstallerClass.InstallHelper(new[] { "/u", "/LogToConsole=false", Assembly.GetExecutingAssembly().Location });
                    Console.WriteLine("The service was successfully uninstalled.");
                }
                catch (Exception)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("An error occurred while trying to uninstall Servant.");
                    Console.ResetColor();
                }

                break;

            default:
                if (Environment.UserInteractive || (args != null && args.Length > 0))
                {
                    Console.WriteLine();
                    Console.WriteLine("Welcome to Servant for IIS.");
                    Console.WriteLine();

                    StartServant();
                    Console.WriteLine("You can now manage your server from " + Configuration.ServantUrl);
                    StartBrowser();
                    while (true)
                    {
                        Console.ReadLine();
                    }
                }

                ServiceBase.Run(new ServantService());
                break;
            }
        }
Exemple #5
0
        private static WebSocket GetClient(ServantConfiguration configuration)
        {
            var url = "ws://" + configuration.ServantIoUrl + "/Client?installationGuid=" + configuration.InstallationGuid + "&organizationGuid=" + configuration.ServantIoKey + "&servername=" + System.Environment.MachineName;

            using (var ws = new WebSocket(url))
            {
                var pingTimer = new System.Timers.Timer(2000);
                pingTimer.Elapsed += (sender, args) =>
                {
                    ws.Ping();
                };
                pingTimer.Enabled = false;

                ws.OnMessage += (sender, e) =>
                {
                    var request = Json.DeserializeFromString <CommandRequest>(e.Data);

                    switch (request.Command)
                    {
                    case CommandRequestType.Unauthorized:
                        IsStopped = true;
                        Console.WriteLine();
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine(DateTime.Now.ToLongTimeString() + ": Servant.io key was not recognized.");
                        Console.ResetColor();
                        ws.Close();
                        break;

                    case CommandRequestType.GetSites:
                        var sites  = SiteManager.GetSites();
                        var result = Json.SerializeToString(sites);
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Guid    = request.Guid,
                            Message = result,
                            Success = true
                        }));
                        break;

                    case CommandRequestType.UpdateSite:
                        var site = Json.DeserializeFromString <Site>(request.JsonObject);

                        var originalSite = SiteManager.GetSiteByName(request.Value);

                        if (originalSite == null)
                        {
                            ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                            {
                                Message = Json.SerializeToString(new ManageSiteResult {
                                    Result = SiteResult.SiteNameNotFound
                                }), Success = true
                            }));
                            return;
                        }

                        originalSite.ApplicationPool  = site.ApplicationPool;
                        originalSite.Name             = site.Name;
                        originalSite.SiteState        = site.SiteState;
                        originalSite.Bindings         = site.Bindings;
                        originalSite.LogFileDirectory = site.LogFileDirectory;
                        originalSite.SitePath         = site.SitePath;
                        originalSite.Bindings         = site.Bindings;

                        var updateResult = SiteManager.UpdateSite(originalSite);

                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Message = Json.SerializeToString(updateResult), Success = true
                        }));
                        break;

                    case CommandRequestType.GetApplicationPools:
                        var appPools = SiteManager.GetApplicationPools();
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Message = Json.SerializeToString(appPools), Success = true
                        }));
                        break;

                    case CommandRequestType.GetCertificates:
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Message = Json.SerializeToString(SiteManager.GetCertificates()), Success = true
                        }));
                        break;

                    case CommandRequestType.StartSite:
                        var startSite   = SiteManager.GetSiteByName(request.Value);
                        var startResult = SiteManager.StartSite(startSite);
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Success = startResult == SiteStartResult.Started, Message = startResult.ToString()
                        }));
                        break;

                    case CommandRequestType.StopSite:
                        var stopSite = SiteManager.GetSiteByName(request.Value);
                        SiteManager.StopSite(stopSite);
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Success = true
                        }));
                        break;

                    case CommandRequestType.RecycleApplicationPool:
                        SiteManager.RecycleApplicationPool(request.Value);
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Message = "ok", Success = true
                        }));
                        break;

                    case CommandRequestType.RestartSite:
                        var restartSite = SiteManager.GetSiteByName(request.Value);
                        SiteManager.RestartSite(restartSite.IisId);
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Message = "ok", Success = true
                        }));
                        break;

                    case CommandRequestType.DeleteSite:
                        var deleteSite = SiteManager.GetSiteByName(request.Value);
                        SiteManager.DeleteSite(deleteSite.IisId);
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Message = "ok", Success = true
                        }));
                        break;

                    case CommandRequestType.CreateSite:
                        var createSite   = Json.DeserializeFromString <Site>(request.JsonObject);
                        var createResult = SiteManager.CreateSite(createSite);
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Message = Json.SerializeToString(createResult), Success = true
                        }));
                        break;

                    case CommandRequestType.ForceUpdate:
                        var host = TinyIoCContainer.Current.Resolve <IHost>();
                        host.Update();
                        ws.Send(Json.SerializeToString(new CommandResponse(request.Guid)
                        {
                            Message = "Started", Success = true
                        }));
                        break;
                    }
                };

                ws.OnError += (sender, args) =>
                {
                    var isInternalError = args.Message == "An exception has occurred while receiving a message.";

                    var socket = (WebSocket)sender;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Error: " + args.Message);
                    Console.ResetColor();

                    if (socket.ReadyState == WebSocketState.Open && !isInternalError)
                    {
                        Connect();
                    }
                };

                ws.OnClose += (sender, args) =>
                {
                    Console.WriteLine(DateTime.Now.ToLongTimeString() + ": Lost connection to Servant.io");
                    pingTimer.Enabled = false;

                    if (!_isRetrying)
                    {
                        Connect();
                    }
                };

                ws.OnOpen += (sender, args) =>
                {
                    Console.WriteLine(DateTime.Now.ToLongTimeString() + ": Successfully connected to ws://" + configuration.ServantIoUrl);
                    pingTimer.Enabled = true;
                };
                ws.Log.Output = (data, s) => { };
                ws.Log.Level  = LogLevel.Fatal;

                return(ws);
            }
        }
Exemple #6
0
 public void Start(ServantConfiguration configuration = null)
 {
 }