using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.InteropServices.ComTypes; using Emby.Server.Core; using Emby.Server.Implementations; using Emby.Server.Implementations.EntryPoints; using Emby.Server.Implementations.FFMpeg; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.System; using MediaBrowser.ServerApplication.Native; namespace MediaBrowser.ServerApplication { public class WindowsAppHost : ApplicationHost { public WindowsAppHost(ServerApplicationPaths applicationPaths, ILogManager logManager, StartupOptions options, IFileSystem fileSystem, IPowerManagement powerManagement, string releaseAssetFilename, IEnvironmentInfo environmentInfo, MediaBrowser.Controller.Drawing.IImageEncoder imageEncoder, ISystemEvents systemEvents, IMemoryStreamFactory memoryStreamFactory, MediaBrowser.Common.Net.INetworkManager networkManager, Action certificateGenerator, Func defaultUsernameFactory) : base(applicationPaths, logManager, options, fileSystem, powerManagement, releaseAssetFilename, environmentInfo, imageEncoder, systemEvents, memoryStreamFactory, networkManager, certificateGenerator, defaultUsernameFactory) { } public override bool IsRunningAsService { get { return MainStartup.IsRunningAsService; } } protected override FFMpegInstallInfo GetFfmpegInstallInfo() { var info = new FFMpegInstallInfo(); info.FFMpegFilename = "ffmpeg.exe"; info.FFProbeFilename = "ffprobe.exe"; info.Version = "20160410"; info.ArchiveType = "7z"; info.DownloadUrls = GetDownloadUrls(); return info; } private string[] GetDownloadUrls() { switch (EnvironmentInfo.SystemArchitecture) { case Architecture.X64: return new[] { "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win64.7z" }; case Architecture.X86: return new[] { "https://github.com/MediaBrowser/Emby.Resources/raw/master/ffmpeg/windows/ffmpeg-20160410-win32.7z" }; } return new string[] { }; } protected override void RestartInternal() { MainStartup.Restart(); } protected override List GetAssembliesWithPartsInternal() { var list = new List(); if (!Environment.Is64BitProcess) { //list.Add(typeof(PismoIsoManager).Assembly); } list.Add(GetType().Assembly); return list; } protected override void ShutdownInternal() { MainStartup.Shutdown(); } protected override void AuthorizeServer() { ServerAuthorization.AuthorizeServer(UdpServerEntryPoint.PortNumber, ServerConfigurationManager.Configuration.HttpServerPortNumber, ServerConfigurationManager.Configuration.HttpsPortNumber, MainStartup.ApplicationPath, ConfigurationManager.CommonApplicationPaths.TempDirectory); } protected override void ConfigureAutoRunInternal(bool autorun) { var startupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Startup); if (autorun && !MainStartup.IsRunningAsService) { //Copy our shortut into the startup folder for this user var targetPath = Path.Combine(startupPath, "Emby Server.lnk"); IShellLinkW link = (IShellLinkW)new ShellLink(); var appPath = Process.GetCurrentProcess().MainModule.FileName; // setup shortcut information link.SetDescription(Name); link.SetPath(appPath); link.SetWorkingDirectory(Path.GetDirectoryName(appPath)); // save it IPersistFile file = (IPersistFile)link; file.Save(targetPath, true); } else { //Remove our shortcut from the startup folder for this user FileSystemManager.DeleteFile(Path.Combine(startupPath, "Emby Server.lnk")); } } protected override bool SupportsDualModeSockets { get { return true; } } protected override void EnableLoopbackInternal(string appName) { LoopUtil.Run(appName); } public override bool SupportsRunningAsService { get { return true; } } public override bool CanSelfRestart { get { return MainStartup.CanSelfRestart; } } public override bool SupportsAutoRunAtStartup { get { return true; } } public override bool CanSelfUpdate { get { return MainStartup.CanSelfUpdate; } } public bool PortsRequireAuthorization(string applicationPath) { var appNameSrch = Path.GetFileName(applicationPath); var startInfo = new ProcessStartInfo { FileName = "netsh", Arguments = "advfirewall firewall show rule \"" + appNameSrch + "\"", CreateNoWindow = true, UseShellExecute = false, WindowStyle = ProcessWindowStyle.Hidden, ErrorDialog = false, RedirectStandardOutput = true }; using (var process = Process.Start(startInfo)) { process.Start(); try { var data = process.StandardOutput.ReadToEnd() ?? string.Empty; if (data.IndexOf("Block", StringComparison.OrdinalIgnoreCase) != -1) { Logger.Info("Found potential windows firewall rule blocking Emby Server: " + data); } //var parts = data.Split('\n'); //return parts.Length > 4; //return Confirm(); return false; } catch (Exception ex) { Logger.ErrorException("Error querying windows firewall", ex); // Hate having to do this try { process.Kill(); } catch (Exception ex1) { Logger.ErrorException("Error killing process", ex1); } throw; } } } } }