public override HealthCheck Check() { var startupFolder = _appFolderInfo.StartUpFolder; var uiFolder = Path.Combine(startupFolder, "UI"); if ((OsInfo.IsWindows || _configFileProvider.UpdateAutomatically) && _configFileProvider.UpdateMechanism == UpdateMechanism.BuiltIn) { if (!_diskProvider.FolderWritable(startupFolder)) { return(new HealthCheck(GetType(), HealthCheckResult.Error, string.Format("Cannot install update because startup folder '{0}' is not writable by the user '{1}'.", startupFolder, Environment.UserName), "Cannot install update because startup folder is not writable by the user")); } if (!_diskProvider.FolderWritable(uiFolder)) { return(new HealthCheck(GetType(), HealthCheckResult.Error, string.Format("Cannot install update because UI folder '{0}' is not writable by the user '{1}'.", uiFolder, Environment.UserName), "Cannot install update because UI folder is not writable by the user")); } } if (BuildInfo.BuildDateTime < DateTime.UtcNow.AddDays(-14)) { if (_checkUpdateService.AvailableUpdate() != null) { return(new HealthCheck(GetType(), HealthCheckResult.Warning, "New update is available")); } } return(new HealthCheck(GetType())); }
public RootFolder Add(RootFolder rootFolder) { var all = All(); if (string.IsNullOrWhiteSpace(rootFolder.Path) || !Path.IsPathRooted(rootFolder.Path)) { throw new ArgumentException("Invalid path"); } if (!_diskProvider.FolderExists(rootFolder.Path)) { throw new DirectoryNotFoundException("Can't add root directory that doesn't exist."); } if (all.Exists(r => r.Path.PathEquals(rootFolder.Path))) { throw new InvalidOperationException("Recent directory already exists."); } if (!_diskProvider.FolderWritable(rootFolder.Path)) { throw new UnauthorizedAccessException(string.Format("Root folder path '{0}' is not writable by user '{1}'", rootFolder.Path, Environment.UserName)); } _rootFolderRepository.Insert(rootFolder); var moviePaths = _movieRepository.AllMoviePaths().ToList(); GetDetails(rootFolder, moviePaths, true); return(rootFolder); }
public void Register() { try { MigrateAppDataFolder(); _diskProvider.EnsureFolder(_appFolderInfo.AppDataFolder); } catch (UnauthorizedAccessException) { throw new SonarrStartupException("Cannot create AppFolder, Access to the path {0} is denied", _appFolderInfo.AppDataFolder); } if (OsInfo.IsWindows) { SetPermissions(); } if (!_diskProvider.FolderWritable(_appFolderInfo.AppDataFolder)) { throw new SonarrStartupException("AppFolder {0} is not writable", _appFolderInfo.AppDataFolder); } InitializeMonoApplicationData(); }
public RootFolder Add(RootFolder rootFolder) { var all = All(); if (string.IsNullOrWhiteSpace(rootFolder.Path) || !Path.IsPathRooted(rootFolder.Path)) { throw new ArgumentException("Invalid path"); } if (!_diskProvider.FolderExists(rootFolder.Path)) { throw new DirectoryNotFoundException("Can't add root directory that doesn't exist."); } if (all.Exists(r => r.Path.PathEquals(rootFolder.Path))) { throw new InvalidOperationException("Recent directory already exists."); } if (_configService.DownloadedEpisodesFolder.IsNotNullOrWhiteSpace() && _configService.DownloadedEpisodesFolder.PathEquals(rootFolder.Path)) { throw new InvalidOperationException("Drone Factory folder cannot be used."); } if (!_diskProvider.FolderWritable(rootFolder.Path)) { throw new UnauthorizedAccessException(string.Format("Root folder path '{0}' is not writable by user '{1}'", rootFolder.Path, Environment.UserName)); } _rootFolderRepository.Insert(rootFolder); rootFolder.FreeSpace = _diskProvider.GetAvailableSpace(rootFolder.Path); rootFolder.UnmappedFolders = GetUnmappedFolders(rootFolder.Path); return(rootFolder); }
private void InstallUpdate(UpdatePackage updatePackage) { EnsureAppDataSafety(); if (OsInfo.IsWindows || _configFileProvider.UpdateMechanism != UpdateMechanism.Script) { if (!_diskProvider.FolderWritable(_appFolderInfo.StartUpFolder)) { throw new UpdateFolderNotWritableException("Cannot install update because startup folder '{0}' is not writable by the user '{1}'.", _appFolderInfo.StartUpFolder, Environment.UserName); } } var updateSandboxFolder = _appFolderInfo.GetUpdateSandboxFolder(); var packageDestination = Path.Combine(updateSandboxFolder, updatePackage.FileName); if (_diskProvider.FolderExists(updateSandboxFolder)) { _logger.Info("Deleting old update files"); _diskProvider.DeleteFolder(updateSandboxFolder, true); } _logger.ProgressInfo("Downloading update {0}", updatePackage.Version); _logger.Debug("Downloading update package from [{0}] to [{1}]", updatePackage.Url, packageDestination); _httpClient.DownloadFile(updatePackage.Url, packageDestination); _logger.ProgressInfo("Verifying update package"); if (!_updateVerifier.Verify(updatePackage, packageDestination)) { _logger.Error("Update package is invalid"); throw new UpdateVerificationFailedException("Update file '{0}' is invalid", packageDestination); } _logger.Info("Update package verified successfully"); _logger.ProgressInfo("Extracting Update package"); _archiveService.Extract(packageDestination, updateSandboxFolder); _logger.Info("Update package extracted successfully"); EnsureValidBranch(updatePackage); _backupService.Backup(BackupType.Update); if (OsInfo.IsNotWindows && _configFileProvider.UpdateMechanism == UpdateMechanism.Script) { InstallUpdateWithScript(updateSandboxFolder); return; } _logger.Info("Preparing client"); _diskProvider.MoveFolder(_appFolderInfo.GetUpdateClientFolder(), updateSandboxFolder); _logger.Info("Starting update client {0}", _appFolderInfo.GetUpdateClientExePath()); _logger.ProgressInfo("Sonarr will restart shortly."); _processProvider.Start(_appFolderInfo.GetUpdateClientExePath(), GetUpdaterArgs(updateSandboxFolder)); }
protected override bool IsValid(PropertyValidatorContext context) { if (context.PropertyValue == null) { return(false); } return(_diskProvider.FolderWritable(context.PropertyValue.ToString())); }
public override HealthCheck Check() { var startupFolder = _appFolderInfo.StartUpFolder; var uiFolder = Path.Combine(startupFolder, "UI"); if ((OsInfo.IsWindows || _configFileProvider.UpdateAutomatically) && _configFileProvider.UpdateMechanism == UpdateMechanism.BuiltIn && !_osInfo.IsDocker) { if (OsInfo.IsOsx && startupFolder.GetAncestorFolders().Contains("AppTranslocation")) { return(new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("UpdateCheckStartupTranslocationMessage"), startupFolder), "#cannot_install_update_because_startup_folder_is_in_an_app_translocation_folder.")); } if (!_diskProvider.FolderWritable(startupFolder)) { return(new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("UpdateCheckStartupNotWritableMessage"), startupFolder, Environment.UserName), "#cannot_install_update_because_startup_folder_is_not_writable_by_the_user")); } if (!_diskProvider.FolderWritable(uiFolder)) { return(new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("UpdateCheckUINotWritableMessage"), uiFolder, Environment.UserName), "#cannot_install_update_because_ui_folder_is_not_writable_by_the_user")); } } if (BuildInfo.BuildDateTime < DateTime.UtcNow.AddDays(-14)) { if (_checkUpdateService.AvailableUpdate() != null) { return(new HealthCheck(GetType(), HealthCheckResult.Warning, "New update is available")); } } return(new HealthCheck(GetType())); }
public override HealthCheck Check() { var startupFolder = _appFolderInfo.StartUpFolder; var uiFolder = Path.Combine(startupFolder, "UI"); if ((OsInfo.IsWindows || _configFileProvider.UpdateAutomatically) && _configFileProvider.UpdateMechanism == UpdateMechanism.BuiltIn) { if (OsInfo.IsOsx && startupFolder.GetAncestorFolders().Contains("AppTranslocation")) { return(new HealthCheck(GetType(), HealthCheckResult.Error, string.Format("Cannot install update because startup folder '{0}' is in an App Translocation folder.", startupFolder), "#cannot_install_update_because_startup_folder_is_in_an_App_Translocation_folder")); } if (!_diskProvider.FolderWritable(startupFolder)) { return(new HealthCheck(GetType(), HealthCheckResult.Error, string.Format("Cannot install update because startup folder '{0}' is not writable by the user '{1}'.", startupFolder, Environment.UserName), "#cannot_install_update_because_startup_folder_is_not_writable_by_the_user")); } if (!_diskProvider.FolderWritable(uiFolder)) { return(new HealthCheck(GetType(), HealthCheckResult.Error, string.Format("Cannot install update because UI folder '{0}' is not writable by the user '{1}'.", uiFolder, Environment.UserName), "#cannot_install_update_because_UI_folder_is_not_writable_by_the_user")); } } if (BuildInfo.BuildDateTime < DateTime.UtcNow.AddDays(-14)) { if (_checkUpdateService.AvailableUpdate() != null) { return(new HealthCheck(GetType(), HealthCheckResult.Warning, "New update is available")); } } return(new HealthCheck(GetType())); }
public void Register() { _diskProvider.EnsureFolder(_appFolderInfo.AppDataFolder); if (OsInfo.IsWindows) { SetPermissions(); } if (!_diskProvider.FolderWritable(_appFolderInfo.AppDataFolder)) { throw new SonarrStartupException("AppFolder {0} is not writable", _appFolderInfo.AppDataFolder); } }
private void VerifyRootFolder(RootFolder rootFolder) { if (string.IsNullOrWhiteSpace(rootFolder.Path) || !Path.IsPathRooted(rootFolder.Path)) { throw new ArgumentException("Invalid path"); } if (!_diskProvider.FolderExists(rootFolder.Path)) { throw new DirectoryNotFoundException("Can't add root directory that doesn't exist."); } if (!_diskProvider.FolderWritable(rootFolder.Path)) { throw new UnauthorizedAccessException(string.Format("Root folder path '{0}' is not writable by user '{1}'", rootFolder.Path, Environment.UserName)); } }
protected ValidationFailure TestFolder(string folder, string propertyName, bool mustBeWritable = true) { if (!_diskProvider.FolderExists(folder)) { return(new NzbDroneValidationFailure(propertyName, "Folder does not exist") { DetailedDescription = string.Format("The folder you specified does not exist or is inaccessible. Please verify the folder permissions for the user account '{0}', which is used to execute Radarr.", Environment.UserName) }); } if (mustBeWritable && !_diskProvider.FolderWritable(folder)) { _logger.Error("Folder '{0}' is not writable.", folder); return(new NzbDroneValidationFailure(propertyName, "Unable to write to folder") { DetailedDescription = string.Format("The folder you specified is not writable. Please verify the folder permissions for the user account '{0}', which is used to execute Radarr.", Environment.UserName) }); } return(null); }
public override HealthCheck Check() { var droneFactoryFolder = _configService.DownloadedEpisodesFolder; if (droneFactoryFolder.IsNullOrWhiteSpace()) { return(new HealthCheck(GetType())); } if (!_diskProvider.FolderExists(droneFactoryFolder)) { return(new HealthCheck(GetType(), HealthCheckResult.Error, "Drone factory folder does not exist")); } if (!_diskProvider.FolderWritable(droneFactoryFolder)) { return(new HealthCheck(GetType(), HealthCheckResult.Error, "Unable to write to drone factory folder")); } //Todo: Unable to import one or more files/folders from return(new HealthCheck(GetType())); }
private bool InstallUpdate(UpdatePackage updatePackage) { EnsureAppDataSafety(); if (OsInfo.IsWindows || _configFileProvider.UpdateMechanism != UpdateMechanism.Script) { var startupFolder = _appFolderInfo.StartUpFolder; var uiFolder = Path.Combine(startupFolder, "UI"); if (!_diskProvider.FolderWritable(startupFolder)) { throw new UpdateFolderNotWritableException("Cannot install update because startup folder '{0}' is not writable by the user '{1}'.", startupFolder, Environment.UserName); } if (!_diskProvider.FolderWritable(uiFolder)) { throw new UpdateFolderNotWritableException("Cannot install update because UI folder '{0}' is not writable by the user '{1}'.", uiFolder, Environment.UserName); } } if (_appFolderInfo.StartUpFolder.EndsWith("_output")) { _logger.ProgressDebug("Running in developer environment, not updating."); return(false); } var updateSandboxFolder = _appFolderInfo.GetUpdateSandboxFolder(); var packageDestination = Path.Combine(updateSandboxFolder, updatePackage.FileName); if (_diskProvider.FolderExists(updateSandboxFolder)) { _logger.Info("Deleting old update files"); _diskProvider.DeleteFolder(updateSandboxFolder, true); } _logger.ProgressInfo("Downloading update {0}", updatePackage.Version); _logger.Debug("Downloading update package from [{0}] to [{1}]", updatePackage.Url, packageDestination); _httpClient.DownloadFile(updatePackage.Url, packageDestination); _logger.ProgressInfo("Verifying update package"); if (!_updateVerifier.Verify(updatePackage, packageDestination)) { _logger.Error("Update package is invalid"); throw new UpdateVerificationFailedException("Update file '{0}' is invalid", packageDestination); } _logger.Info("Update package verified successfully"); _logger.ProgressInfo("Extracting Update package"); _archiveService.Extract(packageDestination, updateSandboxFolder); _logger.Info("Update package extracted successfully"); EnsureValidBranch(updatePackage); _backupService.Backup(BackupType.Update); if (OsInfo.IsNotWindows && _configFileProvider.UpdateMechanism == UpdateMechanism.Script) { InstallUpdateWithScript(updateSandboxFolder); return(true); } _logger.Info("Preparing client"); _diskTransferService.TransferFolder(_appFolderInfo.GetUpdateClientFolder(), updateSandboxFolder, TransferMode.Move); // Set executable flag on update app if (OsInfo.IsOsx || (OsInfo.IsLinux && PlatformInfo.IsNetCore)) { _diskProvider.SetFilePermissions(_appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime), "755", null); } _logger.Info("Starting update client {0}", _appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime)); _logger.ProgressInfo("Radarr will restart shortly."); _processProvider.Start(_appFolderInfo.GetUpdateClientExePath(updatePackage.Runtime), GetUpdaterArgs(updateSandboxFolder)); return(true); }