/// <summary> /// Makes the directory. /// </summary> /// <param name="path">The path.</param> /// <param name="forceDeviceMethod">if set to <c>true</c> forces the use of the "non-busybox" method.</param> public void MakeDirectory(string path, bool forceDeviceMethod) { Device.ThrowIfNull("Device"); path.ThrowIfNullOrWhiteSpace("path"); CommandErrorReceiver cer = new CommandErrorReceiver( ); try { //var fileEntry = FileEntry.FindOrCreate ( Device, path ); // if we have busybox we can use the mkdir in there as it supports --parents if (Device.BusyBox.Available && !forceDeviceMethod) { try { Device.BusyBox.ExecuteShellCommand("mkdir -p {0}", cer, path); } catch { try { // if there was an error, then fallback too. MakeDirectoryFallbackInternal(path, cer); } catch { } } } else { // if busybox is not available then we have to fallback MakeDirectoryFallbackInternal(path, cer); } } catch { } if (!string.IsNullOrEmpty(cer.ErrorMessage)) { throw new IOException(cer.ErrorMessage); } }
/// <summary> /// Chmods the specified path. /// </summary> /// <param name="path">The path.</param> /// <param name="permissions">The permissions.</param> public void Chmod(string path, string permissions ) { Device.ThrowIfNull ( "Device" ); path.ThrowIfNullOrWhiteSpace ( "path" ); permissions.ThrowIfNullOrWhiteSpace ( "permissions" ); FileEntry entry = Device.FileListingService.FindFileEntry ( path ); CommandErrorReceiver cer = new CommandErrorReceiver ( ); Device.ExecuteShellCommand ( "chmod {0} {1}", cer, permissions, entry.FullEscapedPath ); }
/// <summary> /// Chmods the specified path. /// </summary> /// <param name="path">The path.</param> /// <param name="permissions">The permissions.</param> public void Chmod(string path, FilePermissions permissions) { Device.ThrowIfNull("Device"); path.ThrowIfNullOrWhiteSpace("path"); permissions.ThrowIfNull("permissions"); FileEntry entry = Device.FileListingService.FindFileEntry(path); CommandErrorReceiver cer = new CommandErrorReceiver( ); Device.ExecuteShellCommand("chmod {0} {1}", cer, permissions.ToChmod( ), entry.FullEscapedPath); }
/// <summary> /// Moves the specified source to the specified destination. /// </summary> /// <param name="source">The source.</param> /// <param name="destination">The destination.</param> public void Move(string source, string destination) { Device.ThrowIfNull("Device"); source.ThrowIfNullOrWhiteSpace("source"); destination.ThrowIfNullOrWhiteSpace("destination"); CommandErrorReceiver cer = new CommandErrorReceiver( ); FileEntry sfe = Device.FileListingService.FindFileEntry(source); Device.ExecuteShellCommand("mv {0} {1}", cer, sfe.FullEscapedPath, destination); if (!string.IsNullOrEmpty(cer.ErrorMessage)) { throw new IOException(cer.ErrorMessage); } }
/// <summary> /// Unmounts the specified mount point. /// </summary> /// <param name="mountPoint">The mount point.</param> /// <param name="options">The options.</param> public void Unmount(string mountPoint, string options) { mountPoint.ThrowIfNull("mountPoint"); Device.ThrowIfNull("Device"); CommandErrorReceiver cer = new CommandErrorReceiver( ); if (Device.BusyBox.Available) { Device.ExecuteShellCommand("busybox umount {1} {0}", cer, !string.IsNullOrEmpty(options) ? string.Format("-o {0}", options) : string.Empty, mountPoint); } else { Device.ExecuteShellCommand("umount {1} {0}", cer, !string.IsNullOrEmpty(options) ? string.Format("-o {0}", options) : string.Empty, mountPoint); } }
/// <summary> /// Attempts to mount the mount point to the associated device without knowing the device or the type. /// Some devices may not support this method. /// </summary> /// <param name="mountPoint"></param> public void Mount(string mountPoint) { mountPoint.ThrowIfNull("mountPoint"); Device.ThrowIfNull("Device"); CommandErrorReceiver cer = new CommandErrorReceiver( ); if (Device.BusyBox.Available) { Device.ExecuteShellCommand("busybox mount {0}", cer, mountPoint); } else { Device.ExecuteShellCommand("mount {0}", cer, mountPoint); } }
/// <summary> /// Creates the specified path. /// </summary> /// <param name="path">The path.</param> /// <returns></returns> public FileEntry Create(string path) { Device.ThrowIfNull("Device"); path.ThrowIfNullOrWhiteSpace("path"); if (!Device.IsOffline) { if (Exists(path)) { throw new ArgumentException("The specified path already exists."); } else { var cer = new CommandErrorReceiver( ); var escaped = LinuxPath.Escape(path); // use native touch command if its available. var cmd = Device.BusyBox.Available ? "touch" : ">"; var command = string.Format("{0} {1}", cmd, escaped); if (Device.CanSU( )) { Device.ExecuteRootShellCommand(command, cer); } else { Device.ExecuteShellCommand(command, cer); } if (!string.IsNullOrEmpty(cer.ErrorMessage)) { throw new IOException(string.Format("Error creating file: {0}", cer.ErrorMessage)); } else { // at this point, the newly created file should exist. return(Device.FileListingService.FindFileEntry(path)); } } } else { throw new IOException("Device is not online"); } }
/// <summary> /// Mounts the specified device. /// </summary> /// <param name="mountPoint">The mp.</param> /// <param name="options">The options.</param> public void Mount(MountPoint mountPoint, string options) { mountPoint.ThrowIfNull("mountPoint"); Device.ThrowIfNull("Device"); CommandErrorReceiver cer = new CommandErrorReceiver( ); if (Device.BusyBox.Available) { Device.ExecuteShellCommand("busybox mount {0} {4} -t {1} {2} {3}", cer, mountPoint.IsReadOnly ? "-r" : "-w", mountPoint.FileSystem, mountPoint.Block, mountPoint.Name, !string.IsNullOrEmpty(options) ? string.Format("-o {0}", options) : string.Empty); } else { Device.ExecuteShellCommand("mount {0} {4} -t {1} {2} {3}", cer, mountPoint.IsReadOnly ? "-r" : "-w", mountPoint.FileSystem, mountPoint.Block, mountPoint.Name, !string.IsNullOrEmpty(options) ? string.Format("-o {0}", options) : string.Empty); } }
/// <summary> /// Deletes the specified path. /// </summary> /// <param name="fileEntry">The file entry.</param> /// <exception cref="System.IO.IOException">If the command fails.</exception> public void Delete(FileEntry fileEntry) { /// <exception cref="System.ArgumentNullException"> /// If device is null /// or /// If path is null or empty. /// </exception> Device.ThrowIfNull("Device"); fileEntry.ThrowIfNull("fileEntry"); if (fileEntry.Exists) { CommandErrorReceiver cer = new CommandErrorReceiver( ); Device.ExecuteShellCommand("rm -f {0} {1}", cer, fileEntry.IsDirectory ? "-r" : string.Empty, fileEntry.FullResolvedPath); if (!string.IsNullOrEmpty(cer.ErrorMessage)) { throw new IOException(cer.ErrorMessage); } } }
/// <summary> /// Creates the specified path. /// </summary> /// <param name="path">The path.</param> /// <returns></returns> public FileEntry Create(string path ) { Device.ThrowIfNull ( "Device" ); path.ThrowIfNullOrWhiteSpace ( "path" ); if ( !Device.IsOffline ) { if ( Exists ( path ) ) { throw new ArgumentException ( "The specified path already exists." ); } else { var cer = new CommandErrorReceiver ( ); var escaped = LinuxPath.Escape ( path ); // use native touch command if its available. var cmd = Device.BusyBox.Available ? "touch" : ">"; var command = string.Format ( "{0} {1}", cmd, escaped ); if ( Device.CanSU ( ) ) { Device.ExecuteRootShellCommand ( command, cer ); } else { Device.ExecuteShellCommand ( command, cer ); } if ( !string.IsNullOrEmpty ( cer.ErrorMessage ) ) { throw new IOException (string.Format ( "Error creating file: {0}", cer.ErrorMessage ) ); } else { // at this point, the newly created file should exist. return Device.FileListingService.FindFileEntry ( path ); } } } else { throw new IOException ( "Device is not online" ); } }
/// <summary> /// Makes the directory. /// </summary> /// <param name="path">The path.</param> /// <param name="forceDeviceMethod">if set to <c>true</c> forces the use of the "non-busybox" method.</param> public void MakeDirectory(string path, bool forceDeviceMethod ) { Device.ThrowIfNull ( "Device" ); path.ThrowIfNullOrWhiteSpace ( "path" ); CommandErrorReceiver cer = new CommandErrorReceiver ( ); try { //var fileEntry = FileEntry.FindOrCreate ( Device, path ); // if we have busybox we can use the mkdir in there as it supports --parents if ( Device.BusyBox.Available && !forceDeviceMethod ) { try { Device.BusyBox.ExecuteShellCommand ( "mkdir -p {0}", cer, path ); } catch { try { // if there was an error, then fallback too. MakeDirectoryFallbackInternal ( path, cer ); } catch { } } } else { // if busybox is not available then we have to fallback MakeDirectoryFallbackInternal ( path, cer ); } } catch { } if ( !string.IsNullOrEmpty ( cer.ErrorMessage ) ) { throw new IOException ( cer.ErrorMessage ); } }
/// <summary> /// this is a fallback if the mkdir -p fails for somereason /// </summary> /// <param name="path"></param> /// <param name="cer"></param> internal void MakeDirectoryFallbackInternal(string path, CommandErrorReceiver cer) { Device.ExecuteShellCommand("mkdir {0}", cer, path); }
/// <summary> /// Mounts the specified device. /// </summary> /// <param name="mountPoint">The mp.</param> /// <param name="options">The options.</param> public void Mount( MountPoint mountPoint, string options ) { mountPoint.ThrowIfNull ( "mountPoint" ); Device.ThrowIfNull ( "Device" ); CommandErrorReceiver cer = new CommandErrorReceiver ( ); if ( Device.BusyBox.Available ) { Device.ExecuteShellCommand ( "busybox mount {0} {4} -t {1} {2} {3}", cer, mountPoint.IsReadOnly ? "-r" : "-w", mountPoint.FileSystem, mountPoint.Block, mountPoint.Name, !string.IsNullOrEmpty ( options ) ? string.Format ( "-o {0}", options ) : string.Empty ); } else { Device.ExecuteShellCommand ( "mount {0} {4} -t {1} {2} {3}", cer, mountPoint.IsReadOnly ? "-r" : "-w", mountPoint.FileSystem, mountPoint.Block, mountPoint.Name, !string.IsNullOrEmpty ( options ) ? string.Format ( "-o {0}", options ) : string.Empty ); } }
/// <summary> /// Deletes the specified path. /// </summary> /// <param name="fileEntry">The file entry.</param> /// <exception cref="System.IO.IOException">If the command fails.</exception> public void Delete( FileEntry fileEntry ) { /// <exception cref="System.ArgumentNullException"> /// If device is null /// or /// If path is null or empty. /// </exception> Device.ThrowIfNull("Device"); fileEntry.ThrowIfNull ( "fileEntry" ); if ( fileEntry.Exists ) { CommandErrorReceiver cer = new CommandErrorReceiver ( ); Device.ExecuteShellCommand ( "rm -f {0} {1}", cer, fileEntry.IsDirectory ? "-r" : string.Empty, fileEntry.FullResolvedPath ); if ( !string.IsNullOrEmpty ( cer.ErrorMessage ) ) { throw new IOException ( cer.ErrorMessage ); } } }
/// <summary> /// Copies the specified source to the specified destination. /// </summary> /// <param name="source">The source.</param> /// <param name="destination">The destination.</param> public void Copy(string source, string destination ) { Device.ThrowIfNull ( "Device" ); source.ThrowIfNullOrWhiteSpace ( "source" ); destination.ThrowIfNullOrWhiteSpace ( "destination" ); CommandErrorReceiver cer = new CommandErrorReceiver ( ); FileEntry sfe = Device.FileListingService.FindFileEntry ( source ); Device.ExecuteShellCommand ( "cat {0} > {1}", cer, sfe.FullEscapedPath, destination ); if ( !string.IsNullOrEmpty ( cer.ErrorMessage ) ) { throw new IOException ( cer.ErrorMessage ); } }
/// <summary> /// Attempts to mount the mount point to the associated device without knowing the device or the type. /// Some devices may not support this method. /// </summary> /// <param name="mountPoint"></param> public void Mount(string mountPoint ) { mountPoint.ThrowIfNull ( "mountPoint" ); Device.ThrowIfNull ( "Device" ); CommandErrorReceiver cer = new CommandErrorReceiver ( ); if ( Device.BusyBox.Available ) { Device.ExecuteShellCommand ( "busybox mount {0}", cer, mountPoint ); } else { Device.ExecuteShellCommand ( "mount {0}", cer, mountPoint ); } }
/// <summary> /// this is a fallback if the mkdir -p fails for somereason /// </summary> /// <param name="path"></param> /// <param name="cer"></param> internal void MakeDirectoryFallbackInternal(string path, CommandErrorReceiver cer ) { Device.ExecuteShellCommand ( "mkdir {0}", cer, path ); }
/// <summary> /// Unmounts the specified mount point. /// </summary> /// <param name="mountPoint">The mount point.</param> /// <param name="options">The options.</param> public void Unmount(string mountPoint, string options ) { mountPoint.ThrowIfNull ( "mountPoint" ); Device.ThrowIfNull ( "Device" ); CommandErrorReceiver cer = new CommandErrorReceiver ( ); if ( Device.BusyBox.Available ) { Device.ExecuteShellCommand ( "busybox umount {1} {0}", cer, !string.IsNullOrEmpty ( options ) ? string.Format ( "-o {0}", options ) : string.Empty, mountPoint ); } else { Device.ExecuteShellCommand ( "umount {1} {0}", cer, !string.IsNullOrEmpty ( options ) ? string.Format ( "-o {0}", options ) : string.Empty, mountPoint ); } }