Пример #1
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();
            }

        }
Пример #2
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);
        }
Пример #3
0
 public static void UpdateConfiguration(ServantConfiguration configuration)
 {
     var content = Serializer.Serialize(configuration);
     System.IO.File.WriteAllText(ConfigFilePath, content);
     TinyIoCContainer.Current.Register(configuration);
 }
Пример #4
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 serializer = new JavaScriptSerializer();
                var pingTimer = new System.Timers.Timer(2000);
                pingTimer.Elapsed += (sender, args) =>
                                     {
                                         ws.Ping();
                                     };
                pingTimer.Enabled = false;

                ws.OnMessage += (sender, e) =>
                {
                    var request = serializer.Deserialize<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 = serializer.Serialize(sites);
                            ws.Send(serializer.Serialize(new CommandResponse(request.Guid)
                                                     {
                                                         Guid = request.Guid,
                                                         Message = result,
                                                         Success = true
                                                     }));
                            break;
                        case CommandRequestType.UpdateSite:
                            var site = serializer.Deserialize<Site>(request.JsonObject);

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

                            if (originalSite == null)
                            {
                                ws.Send("not_found");
                                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;

                            SiteManager.UpdateSite(originalSite);

                            ws.Send(serializer.Serialize(new CommandResponse(request.Guid) { Message  = "ok", Success = true}));
                            break;
                        case CommandRequestType.GetApplicationPools:
                            var appPools = SiteManager.GetApplicationPools();
                            ws.Send(serializer.Serialize(new CommandResponse(request.Guid) {Message = serializer.Serialize(appPools), Success = true}));
                            break;
                        case CommandRequestType.GetCertificates:
                            ws.Send(serializer.Serialize(new CommandResponse(request.Guid) {Message = serializer.Serialize(SiteManager.GetCertificates()), Success = true}));
                            break;
                        case CommandRequestType.StartSite:
                            var startSite = SiteManager.GetSiteByName(request.Value);
                            var startResult = SiteManager.StartSite(startSite);
                            ws.Send(serializer.Serialize(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(serializer.Serialize(new CommandResponse(request.Guid) {  Success = true }));
                            break;
                        case CommandRequestType.RecycleApplicationPool:
                            var recycleSite = SiteManager.GetSiteByName(request.Value);
                            SiteManager.RecycleApplicationPoolBySite(recycleSite.IisId);
                            ws.Send(serializer.Serialize(new CommandResponse(request.Guid) { Message = "ok", Success = true }));
                            break;
                        case CommandRequestType.RestartSite:
                            var restartSite = SiteManager.GetSiteByName(request.Value);
                            SiteManager.RestartSite(restartSite.IisId);
                            ws.Send(serializer.Serialize(new CommandResponse(request.Guid) { Message = "ok", Success = true }));
                            break;
                        case CommandRequestType.DeleteSite:
                            var deleteSite = SiteManager.GetSiteByName(request.Value);
                            SiteManager.DeleteSite(deleteSite.IisId);
                            ws.Send(serializer.Serialize(new CommandResponse(request.Guid) { Message = "ok", Success = true }));
                            break;
                        case CommandRequestType.CreateSite:
                            var createSite = serializer.Deserialize<Site>(request.JsonObject);
                            var id = SiteManager.CreateSite(createSite);
                            ws.Send(serializer.Serialize(new CommandResponse(request.Guid) { Message = id.ToString(), 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;
            }
        }
Пример #5
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;

            }
        }
Пример #6
0
 public void Start(ServantConfiguration configuration = null)
 {
 }