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(); } }
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); }
public static void UpdateConfiguration(ServantConfiguration configuration) { var content = Serializer.Serialize(configuration); System.IO.File.WriteAllText(ConfigFilePath, content); TinyIoCContainer.Current.Register(configuration); }
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; } }
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; } }
public void Start(ServantConfiguration configuration = null) { }