Dictionaries/Dict.Unix.Linux.Debian/Dict.Unix.Linux.Debian.psm1
# List here the name of the package to add to system # . fuseiso : mount ISO files as non-root user # . libhivex-bin : read Windows registry files # . mount : for 'losetup' (should already be installed) # . util-linux : for 'lsblk' (should already be installed) # . wimtools : mnipulate wim files $Script:PackageList = "fuseiso libhivex-bin mount util-linux wimtools" <# ######## ### ###### ## ## ### ###### ######## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ######## ## ## ## ##### ## ## ## #### ###### ## ######### ## ## ## ######### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ## ## ## ## ###### ######## #> <# .SYNOPSIS Install a package on debian-like distribution .DESCRIPTION Install a package using apt command .EXAMPLE Install-OSPackage -Name firefox .NOTES General notes #> function Install-OSPackage { [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Medium')] [OutputType([boolean])] Param ( # The name of the package to install [Alias('Name')] [Parameter(Mandatory = $true, ValueFromPipeLine = $true)][string]$PackageName ) Begin { Write-EnterFunction $command = "DEBIAN_FRONTEND=noninteractive apt -y install --no-install-recommends" } Process { $command += " $PackageName" } End { if ($PSCmdlet.ShouldProcess("Install package ?")) { $rc = Execute-Command -exe "bash" -args "-c `"$command`"" } else { $rc = $false } return $rc Write-LeaveFunction } } <# .SYNOPSIS Uninstall a package from disk .DESCRIPTION Uninstall a package using apt command .EXAMPLE Uninstall-OSPackage -Name firefox .EXAMPLE Uninstall-OSPackage -Name firefox -Purge .NOTES General notes #> function Uninstall-OSPackage { [CmdletBinding(SupportsShouldProcess = $true)] [OutputType([boolean])] Param ( # The name of the package to install [Alias('Name')] [Parameter(Mandatory = $true, ValueFromPipeLine = $true)][string]$PackageName, # Purge configuration [switch]$Purge ) Begin { Write-EnterFunction $command = "DEBIAN_FRONTEND=noninteractive apt -y remove" if ($Purge) { $command += " --purge" } } Process { $command += " $PackageName" } End { if ($PSCmdlet.ShouldProcess("Uninstall package ?")) { $rc = Execute-Command -exe "bash" -args "-c `"$command`"" } else { $rc = $false } return $rc Write-LeaveFunction } } <# .SYNOPSIS Install dependencies to unlock full PWSH functionnalities .DESCRIPTION PWSH can make use of some binaries that are not included in distro at install time. This function can install them all at once. #> function Install-Dependencies { # [CmdletBinding()]Param ( # [Parameter(Mandatory = $true,ValueFromPipeLine = $true)][string]$string = "" # ) Begin { Write-EnterFunction } Process { ebegin("Installing dependancies. Please wait") eexec apt-get install -y $Script:PackagesList eend $? } End { Write-LeaveFunction } } <# .SYNOPSIS Remove dependencies from current system .DESCRIPTION Cleanly remove dependencies # TODO add this function to the uninstall process #> function Remove-Dependencies { # [CmdletBinding()]Param ( # [Parameter(Mandatory = $true,ValueFromPipeLine = $true)][string]$string = "" # ) Begin { Write-EnterFunction } Process { ebegin("Removing dependancies. Please wait") eexec apt-get purge -y $Script:PackagesList eexec apt-get autoremove -y eexec apt-get autoclean -y eend $? } End { Write-LeaveFunction } } <# #### ###### ####### ## ## ## ## ## ## ## ## ## ## ###### ## ## ## ## ## ## ## ## ## ## ## #### ###### ####### #> <# .SYNOPSIS Mount an .iso file somewhere on the filesystem .DESCRIPTION Mount-Iso take care if Iso file is already mounted. If not, it tries to mount it in /mnt directory. It return absolute path name of mountpoint. .EXAMPLE Mount-Iso -File /path/to/cdrom.iso Mount the iso '/path/to/cdrom.iso' into the filesystem .EXAMPLE Mount-Iso -File /path/to/cdrom.iso -To /tmp/myiso Mount the iso '/path/to/cdrom.iso' into the /tmp/myiso directory .OUTPUTS Absolute pathname of the mountpoint of the iso file .NOTES # TODO make Mount-Iso work as non-root user. It should be OK with fuseiso, but it can't mount UDF ISO files so it is not reliable #> function Mount-Iso { [CmdletBinding()][OutputType([System.Boolean])]Param ( [Parameter(Mandatory = $true,ValueFromPipeLine = $true)][string]$File, [string]$To = $null ) Begin { Write-EnterFunction # edevel ("To = $To") if ($To -eq "") { if (IamAdmin) { $To = "/tmp/iso-" + $(New-Guid) } else { $To = $env:HOME + "/iso-" + $(New-Guid) } } # edevel ("To = $To") } Process { if (!(fileExist -Name $File)) { return $false } # $oFile = Get-Item $File # $To = $To + '/' + $(New-Guid) # check if iso file is already mounted on system $loop = losetup --list --json -j $File | ConvertFrom-Json if ($null -ne $loop) { $loopDevice = $loop.loopdevices[0].name $blkDevice = lsblk --list --json -O $loopDevice | ConvertFrom-Json return $blkDevice.blockdevices[0].mountpoint } # else continue on new-item -path $To -ItemType Directory -Force if (IamAdmin) { try { eexec -exe mount -args "-o loop $File $To" } catch { remove-item $To -Confirm:$false return $false } } else { ewarn($MyInvocation.MyCommand.ToString() + "() : You must be root.") return $false # eexec -exe fuseiso -args "'$File' '$To'" } return $To } End { Write-LeaveFunction } } <# .SYNOPSIS Unmount an .iso file .DESCRIPTION Dismount-Iso unmount iso file either by specifying iso filename or mountpoint. .EXAMPLE Dismount-Iso -File /path/to/cdrom.iso Dismount the iso '/path/to/cdrom.iso' from the filesystem .EXAMPLE Dismount-Iso -From /mnt/myiso Dismount the iso from the /mnt/myiso directory .OUTPUTS $true on success, $false otherwise #> function Dismount-Iso { [CmdletBinding(DefaultParameterSetName = 'MOUNTPOINT')]Param ( [Parameter(ParameterSetName = 'FILE', Mandatory = $true,ValueFromPipeLine = $true)] [string]$File, [Parameter(ParameterSetName = 'MOUNTPOINT', Mandatory = $true,ValueFromPipeLine = $true)] [Alias('From')][string]$Mountpoint, [switch]$Force ) Begin { Write-EnterFunction if ($Force) { $options = "-f" } } Process { switch ($PSCmdlet.ParameterSetName) { 'FILE' { if (!(fileExist -Name $File)) { return $false } # $oFile = Get-Item $File # $To = $To + '/' + $(New-Guid) # 1st check if iso file is already mounted on system $loop = losetup --list --json -j $File | ConvertFrom-Json if ($null -ne $loop) { $loopDevice = $loop.loopdevices[0].name $blkDevice = lsblk --list --json -O $loopDevice | ConvertFrom-Json eexec umount $options $blkDevice.blockdevices[0].mountpoint } # else continue on } 'MOUNTPOINT' { if (IamAdmin) { eexec umount $options $Mountpoint } else { eexec fusermount -u $Mountpoint } } } Remove-Item $Mountpoint -Recurse:$false -Confirm:$false -Force $rc = $? return $rc } End { Write-LeaveFunction } } <# ## ## #### ## ## ## ## ## ## ### ### ## ## ## ## #### #### ## ## ## ## ## ### ## ## ## ## ## ## ## ## ## ## ## ## ## ### ### #### ## ## #> <# .SYNOPSIS Mount a .wim file somewhere on the filesystem .DESCRIPTION Mount-wim CANNOT take care if wim file is already mounted (fuse limitation) If not, it tries to mount it in /mnt directory. It return absolute path name of mountpoint. .EXAMPLE Mount-wim -File /path/to/install.wim Mount the wim '/path/to/install.wim' into the filesystem .EXAMPLE Mount-wim -File /path/to/install.wim -Index 3 -To /tmp/mywim Mount the wim '/path/to/install.wim' into the /tmp/mywim directory .OUTPUTS Absolute pathname of the mountpoint of the wim file .NOTES Mount-wim CANNOT take care if wim file is already mounted (fuse limitation) #> function Mount-Wim { [CmdletBinding()]Param ( [Parameter(Mandatory = $true,ValueFromPipeLine = $true)][string]$File, [uint16]$Index = 1, [string]$To = $null ) Begin { Write-EnterFunction # edevel ("To = $To") if ($To -eq "") { if (IamAdmin) { $To = "/tmp/wim-" + $(New-Guid) } else { $To = $env:HOME + "/wim-" + $(New-Guid) } } # edevel ("To = $To") } Process { if (!(fileExist -Name $File)) { return $false } new-item -path $To -ItemType Directory -Force eexec -exe wimmount -args "$File $Index $To" return $To } End { Write-LeaveFunction } } <# .SYNOPSIS Unmount an .wim file .DESCRIPTION Dismount-wim unmount wim file either by specifying wim filename or mountpoint. .EXAMPLE Dismount-wim -File /path/to/cdrom.wim Dismount the wim '/path/to/cdrom.wim' from the filesystem .EXAMPLE Dismount-wim -From /mnt/mywim Dismount the wim from the /mnt/mywim directory .OUTPUTS $true on success, $false otherwise #> function Dismount-Wim { [CmdletBinding(DefaultParameterSetName = 'MOUNTPOINT')][OutputType([System.Boolean])]Param ( # [Parameter(ParameterSetName = 'FILE', Mandatory = $true,ValueFromPipeLine = $true)] # [string]$File, [Parameter(ParameterSetName = 'MOUNTPOINT', Mandatory = $true,ValueFromPipeLine = $true)] [Alias('From')][string]$Mountpoint # [switch]$Force ) Begin { Write-EnterFunction if ($Force) { $options = "-f" } } Process { switch ($PSCmdlet.ParameterSetName) { 'FILE' { if (!(fileExist -Name $File)) { return $false } # $oFile = Get-Item $File # $To = $To + '/' + $(New-Guid) # 1st check if wim file is already mounted on system $loop = losetup --list --json -j $File | ConvertFrom-Json if ($null -ne $loop) { $loopDevice = $loop.loopdevices[0].name $blkDevice = lsblk --list --json -O $loopDevice | ConvertFrom-Json eexec umount $options $blkDevice.blockdevices[0].mountpoint } # else continue on } 'MOUNTPOINT' { eexec fusermount -u $Mountpoint } } Remove-Item $Mountpoint -Recurse:$false -Confirm:$false -Force $rc = $? return $rc } End { Write-LeaveFunction } } <# ###### ####### ## ## ######## ## ## ######## ######## ######## ## ## ## ## ### ### ## ## ## ## ## ## ## ## ## ## ## #### #### ## ## ## ## ## ## ## ## ## ## ## ## ### ## ######## ## ## ## ###### ######## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ####### ## ## ## ####### ## ######## ## ## #> |