public virtual void DeleteDirectory(string path) { logger.Trace("Attempting to send '{0}' to recycling bin", path); var recyclingBin = _configProvider.RecycleBin; if (String.IsNullOrWhiteSpace(recyclingBin)) { logger.Info("Recycling Bin has not been configured, deleting permanently. {0}", path); _diskProvider.DeleteFolder(path, true); logger.Trace("Folder has been permanently deleted: {0}", path); } else { var destination = Path.Combine(recyclingBin, new DirectoryInfo(path).Name); logger.Trace("Moving '{0}' to '{1}'", path, destination); _diskProvider.MoveDirectory(path, destination); logger.Trace("Setting last accessed: {0}", path); _diskProvider.DirectorySetLastWriteTimeUtc(destination, DateTime.UtcNow); foreach (var file in _diskProvider.GetFiles(destination, SearchOption.AllDirectories)) { _diskProvider.FileSetLastWriteTimeUtc(file, DateTime.UtcNow); } logger.Trace("Folder has been moved to the recycling bin: {0}", destination); } }
public virtual void Start(ProgressNotification notification, dynamic options) { notification.CurrentMessage = "Checking for updates"; var updatePackage = _updateProvider.GetAvilableUpdate(_environmentProvider.Version); //No updates available if (updatePackage == null) { return; } var packageDestination = Path.Combine(_environmentProvider.GetUpdateSandboxFolder(), updatePackage.FileName); if (_diskProvider.FolderExists(_environmentProvider.GetUpdateSandboxFolder())) { logger.Info("Deleting old update files"); _diskProvider.DeleteFolder(_environmentProvider.GetUpdateSandboxFolder(), true); } logger.Info("Downloading update package from [{0}] to [{1}]", updatePackage.Url, packageDestination); notification.CurrentMessage = "Downloading Update " + updatePackage.Version; _httpProvider.DownloadFile(updatePackage.Url, packageDestination); logger.Info("Download completed for update package from [{0}]", updatePackage.FileName); logger.Info("Extracting Update package"); notification.CurrentMessage = "Extracting Update"; _archiveProvider.ExtractArchive(packageDestination, _environmentProvider.GetUpdateSandboxFolder()); logger.Info("Update package extracted successfully"); logger.Info("Preparing client"); notification.CurrentMessage = "Preparing to start Update"; _diskProvider.MoveDirectory(_environmentProvider.GetUpdateClientFolder(), _environmentProvider.GetUpdateSandboxFolder()); logger.Info("Starting update client"); var startInfo = new ProcessStartInfo { FileName = _environmentProvider.GetUpdateClientExePath(), Arguments = string.Format("{0} {1}", _environmentProvider.NzbDroneProcessIdFromEnviroment, _configFileProvider.Guid) }; var process = _processProvider.Start(startInfo); notification.CurrentMessage = "Update in progress. NzbDrone will restart shortly."; _processProvider.WaitForExit(process); }
public virtual void Start(string targetFolder) { Verify(targetFolder); AppType appType = AppType.Normal; logger.Info("Stopping all running services"); if (_serviceProvider.ServiceExist(ServiceProvider.NZBDRONE_SERVICE_NAME) && _serviceProvider.IsServiceRunning(ServiceProvider.NZBDRONE_SERVICE_NAME)) { appType = AppType.Service; _serviceProvider.Stop(ServiceProvider.NZBDRONE_SERVICE_NAME); } else { appType = AppType.Normal; } //TODO:Should be able to restart service if anything beyond this point fails logger.Info("Killing all running processes"); var processes = _processProvider.GetProcessByName(ProcessProvider.NzbDroneProccessName); foreach (var processInfo in processes) { _processProvider.Kill(processInfo.Id); } var consoleProcesses = _processProvider.GetProcessByName(ProcessProvider.NzbDroneConsoleProccessName); foreach (var processInfo in consoleProcesses) { appType = AppType.Console; _processProvider.Kill(processInfo.Id); } logger.Info("Killing all orphan IISExpress processes"); _iisProvider.StopServer(); logger.Info("Creating backup of existing installation"); _diskProvider.CopyDirectory(targetFolder, _environmentProvider.GetUpdateBackUpFolder()); logger.Info("Moving update package to target"); try { _diskProvider.CopyDirectory(_environmentProvider.GetUpdatePackageFolder(), targetFolder); logger.Trace("Deleting Update Package."); _diskProvider.DeleteFolder(_environmentProvider.GetUpdatePackageFolder(), true); } catch (Exception e) { RollBack(targetFolder); foreach (var key in e.Data.Keys) { logger.Trace("Key: {0}, Value: {1}", key, e.Data[key]); } logger.FatalException("Failed to copy upgrade package to target folder.", e); } finally { StartNzbDrone(appType, targetFolder); } }
public virtual void ProcessDownload(DirectoryInfo subfolderInfo) { if (subfolderInfo.Name.StartsWith("_") && _diskProvider.GetLastDirectoryWrite(subfolderInfo.FullName).AddMinutes(2) > DateTime.UtcNow) { Logger.Trace("[{0}] is too fresh. skipping", subfolderInfo.Name); return; } if (_diskProvider.IsFolderLocked(subfolderInfo.FullName)) { Logger.Trace("[{0}] is currently locked by another process, skipping", subfolderInfo.Name); return; } string seriesName = Parser.ParseSeriesName(RemoveStatusFromFolderName(subfolderInfo.Name)); var series = _seriesProvider.FindSeries(seriesName); if (series == null) { Logger.Trace("Unknown Series on Import: {0}", subfolderInfo.Name); TagFolder(subfolderInfo, PostDownloadStatusType.UnknownSeries); return; } if (!_diskProvider.FolderExists(series.Path)) { Logger.Warn("Series Folder doesn't exist: {0}, creating it.", series.Path); _diskProvider.CreateDirectory(series.Path); } var size = _diskProvider.GetDirectorySize(subfolderInfo.FullName); var freeSpace = _diskProvider.FreeDiskSpace(new DirectoryInfo(series.Path)); if (Convert.ToUInt64(size) > freeSpace) { Logger.Error("Not enough free disk space for series: {0}, {1}", series.Title, series.Path); return; } _diskScanProvider.CleanUpDropFolder(subfolderInfo.FullName); var importedFiles = _diskScanProvider.Scan(series, subfolderInfo.FullName); importedFiles.ForEach(file => _diskScanProvider.MoveEpisodeFile(file, true)); //Create Metadata for all the episode files found if (importedFiles.Any()) { _metadataProvider.CreateForEpisodeFiles(importedFiles); } //Delete the folder only if folder is small enough if (_diskProvider.GetDirectorySize(subfolderInfo.FullName) < Constants.IgnoreFileSize) { Logger.Trace("Episode(s) imported, deleting folder: {0}", subfolderInfo.Name); _diskProvider.DeleteFolder(subfolderInfo.FullName, true); } else { if (importedFiles.Count == 0) { Logger.Trace("No Imported files: {0}", subfolderInfo.Name); TagFolder(subfolderInfo, PostDownloadStatusType.ParseError); } else { //Unknown Error Importing (Possibly a lesser quality than episode currently on disk) Logger.Trace("Unable to import series (Unknown): {0}", subfolderInfo.Name); TagFolder(subfolderInfo, PostDownloadStatusType.Unknown); } } }