You have chosen to sponsor your bid up to a maximum amount of .
We're looking for someone to satisfy a very simple interface, IBackup:
public interface IBackup
/// Backs-up the specified file.
/// The file.
void Backup(string filename);
/// Marks that the specified file needs to be deleted (or not backed-up if it's not been yet).
/// The file.
void Delete(string filename);
/// Marks that the specified file has been moved from one location to another
/// The old file.
/// The new file.
void Move(string oldFilename, string newFilename);
The filename is a virtual reference to that file, for instance, folder/subfolder/filename.ext
The requirement is that the implementation will take this request and immediately return in a non-blocking way (the call to this backup doesn't want to wait for the backup process, but just register the backup and move on). Several files might be added to the Web site at once, so your implementation will need to keep a queue of files and then process them in its own thread.
We need implementations that:
1. Take a Windows file and copy it to another Windows file location, possibly on a network
2. Take a Windows file and FTP it to a given server
3. Take a Windows file and copy it to Azure blob storage
4. Take an Azure blob and FTP it to a given server
5. Take an Azure blob and copy it to another Azure blob
I mention items 3-5 because that's where we want to head, but points 1 and 2 are all we need immediately.
I'd recommend setting up a number of implementations of IBackup for each job, and using a constructor to get what you need to make it work. We use Ninject so can inject whatever's needed. For instance:
Public class NetworkBackup : IBackup
Public NetworkBackup(IFile fileObject, IDirectory directoryObject, string sourceLocation, string backupLocation)
// IFile is an interface we use which exactly matches System.IO.File; likewise IDirectory matches System.IO.Directory
// We use these so we can swap them out when creating the Azure version of this site, which will use blobs instead of the file system
// sourceLocation would be the full path to the parent of the site, eg, c:WebsitesSite1Content
// backupLocation would be the full path to the base of the backup location, eg, c:BackupsSite1Content
... implementation ...
public class FtpBackup : IBackup
Public FtpBackup(string host, string username, string password, ... etc ...)
Then we can pick and choose which implementation we use, and even have a:
Public class ComboBackup : IBackup
Public ComboBackup(IList backupSystems)
Which would let us inject the FTP and network implementations and it would loop through and backup using both simultaneously.
The most important bit is the non-blocking asynchronous nature of it. It MUST NOT stop the Web site from responding. If you need to report errors we have a logging system I can give you the interface for too.
Nothing, even the interface, is set in stone yet, so if you find you need it to be done differently, please let me know as soon as possible and we'll amend it. The constructors are of course totally open to what you need, so try not to hard-code any requirements.
When it comes to FTP an open-source FTP library will be fine to use, particularly if it's available through nuget (our preferred way of getting libraries), but if a commercial library makes life much easier let me know and I'll certainly consider it.
This is a "made for hire" project. We will retain copyright and ownership of the solution.