jellyfin/MediaBrowser.ServerApplication/Native/WindowsApp.cs

264 lines
7.4 KiB
C#
Raw Normal View History

2016-04-24 03:03:49 +00:00
using System;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Startup.Common;
using MediaBrowser.ServerApplication.Networking;
using System.Collections.Generic;
2016-04-24 03:03:49 +00:00
using System.Diagnostics;
2016-04-03 17:34:52 +00:00
using System.IO;
using System.Reflection;
2016-09-06 06:50:07 +00:00
using System.Windows.Forms;
2016-10-25 19:02:04 +00:00
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
2016-06-23 17:04:18 +00:00
using MediaBrowser.Model.System;
2016-05-01 21:48:37 +00:00
using MediaBrowser.Server.Implementations.Persistence;
2016-04-02 04:29:48 +00:00
using MediaBrowser.Server.Startup.Common.FFMpeg;
2016-04-24 03:03:49 +00:00
using OperatingSystem = MediaBrowser.Server.Startup.Common.OperatingSystem;
namespace MediaBrowser.ServerApplication.Native
{
public class WindowsApp : INativeApp
{
private readonly IFileSystem _fileSystem;
2016-01-21 17:45:42 +00:00
private readonly ILogger _logger;
2016-01-21 17:45:42 +00:00
public WindowsApp(IFileSystem fileSystem, ILogger logger)
{
_fileSystem = fileSystem;
2016-01-21 17:45:42 +00:00
_logger = logger;
}
public List<Assembly> GetAssembliesWithParts()
{
var list = new List<Assembly>();
2015-10-12 19:09:56 +00:00
if (!System.Environment.Is64BitProcess)
{
2016-01-06 16:57:15 +00:00
//list.Add(typeof(PismoIsoManager).Assembly);
2015-10-12 19:09:56 +00:00
}
list.Add(GetType().Assembly);
2016-04-02 04:29:48 +00:00
return list;
}
2016-03-26 17:51:27 +00:00
public void AuthorizeServer(int udpPort, int httpServerPort, int httpsPort, string applicationPath, string tempDirectory)
{
2016-03-26 17:51:27 +00:00
ServerAuthorization.AuthorizeServer(udpPort, httpServerPort, httpsPort, applicationPath, tempDirectory);
}
public NativeEnvironment Environment
{
get
{
return new NativeEnvironment
{
OperatingSystem = OperatingSystem.Windows,
2016-06-23 17:04:18 +00:00
SystemArchitecture = System.Environment.Is64BitOperatingSystem ? Architecture.X64 : Architecture.X86,
2014-11-23 23:10:41 +00:00
OperatingSystemVersionString = System.Environment.OSVersion.VersionString
};
}
}
public bool SupportsLibraryMonitor
{
get { return true; }
}
public bool SupportsRunningAsService
{
get
{
return true;
}
}
public bool IsRunningAsService
{
get;
set;
}
public bool CanSelfRestart
{
get
{
return MainStartup.CanSelfRestart;
}
}
public bool SupportsAutoRunAtStartup
{
get
{
return true;
}
}
public bool CanSelfUpdate
{
get
{
return MainStartup.CanSelfUpdate;
}
}
public void Shutdown()
{
MainStartup.Shutdown();
}
2015-06-05 14:27:01 +00:00
public void Restart(StartupOptions startupOptions)
{
MainStartup.Restart();
}
public void ConfigureAutoRun(bool autorun)
{
2016-04-03 17:34:52 +00:00
var shortcutPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.StartMenu), "Emby", "Emby Server.lnk");
var startupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Startup);
if (autorun)
{
//Copy our shortut into the startup folder for this user
var targetPath = Path.Combine(startupPath, Path.GetFileName(shortcutPath) ?? "Emby Server.lnk");
_fileSystem.CreateDirectory(Path.GetDirectoryName(targetPath));
File.Copy(shortcutPath, targetPath, true);
}
else
{
//Remove our shortcut from the startup folder for this user
_fileSystem.DeleteFile(Path.Combine(startupPath, Path.GetFileName(shortcutPath) ?? "Emby Server.lnk"));
}
}
public INetworkManager CreateNetworkManager(ILogger logger)
{
return new NetworkManager(logger);
}
public void PreventSystemStandby()
{
2016-04-23 18:38:36 +00:00
MainStartup.Invoke(Standby.PreventSleep);
}
public void AllowSystemStandby()
{
MainStartup.Invoke(Standby.AllowSleep);
}
2016-04-02 04:29:48 +00:00
public FFMpegInstallInfo GetFfmpegInstallInfo()
{
var info = new FFMpegInstallInfo();
info.FFMpegFilename = "ffmpeg.exe";
info.FFProbeFilename = "ffprobe.exe";
2016-06-23 17:04:18 +00:00
info.Version = "0";
2016-04-02 04:29:48 +00:00
return info;
}
2016-04-24 03:03:49 +00:00
public void LaunchUrl(string url)
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = url
},
EnableRaisingEvents = true,
};
process.Exited += ProcessExited;
try
{
process.Start();
}
catch (Exception ex)
{
_logger.ErrorException("Error launching url: {0}", ex, url);
throw;
}
}
2016-05-01 21:48:37 +00:00
public IDbConnector GetDbConnector()
{
return new DbConnector(_logger);
}
2016-04-24 03:03:49 +00:00
/// <summary>
/// Processes the exited.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
private static void ProcessExited(object sender, EventArgs e)
{
((Process)sender).Dispose();
}
2016-09-03 17:16:36 +00:00
public void EnableLoopback(string appName)
{
LoopUtil.Run(appName);
}
2016-09-06 05:02:05 +00:00
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)
{
2016-09-08 06:41:49 +00:00
_logger.Info("Found potential windows firewall rule blocking Emby Server: " + data);
2016-09-06 05:02:05 +00:00
}
//var parts = data.Split('\n');
//return parts.Length > 4;
2016-09-06 06:50:07 +00:00
//return Confirm();
2016-09-06 05:02:05 +00:00
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;
}
}
}
}
2016-06-17 13:21:34 +00:00
}