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