parent
3a136d2a7a
commit
79b21b9772
Binary file not shown.
|
|
@ -35,7 +35,7 @@ $global:default_exifFile = "##peter_exif##.csv"
|
|||
$global:default_metaFile = "##peter##.json"
|
||||
$global:LogPathName = ""
|
||||
$global:MetadataPathName = Join-Path -Path ".\" -ChildPath ".peter-metadata"
|
||||
$global:Version = "0.0.1"
|
||||
$global:Version = "0.2"
|
||||
|
||||
function Open-Log {
|
||||
|
||||
|
|
@ -241,8 +241,10 @@ function Get-ConvenientFileSize
|
|||
function New-PeterReconcile
|
||||
{
|
||||
Param(
|
||||
[Parameter(Mandatory)][String] $SourceFolder,
|
||||
[Parameter(Mandatory)][String] $ReconcileFile,
|
||||
[Parameter(Mandatory)]
|
||||
[String] $SourceFolder,
|
||||
[Parameter(Mandatory)]
|
||||
[String] $ReconcileFile,
|
||||
[String] $RootFolder,
|
||||
[String] $FileFilter,
|
||||
[int] $ProcessFileCount,
|
||||
|
|
@ -275,7 +277,10 @@ Param(
|
|||
|
||||
if ($ReconcileFile -eq "")
|
||||
{
|
||||
$ReconcileFile = $default_reconcileFile
|
||||
if (!(Test-Path -Path $global:MetadataPathName )) {
|
||||
$null = New-Item -Path $global:MetadataPathName -ItemType Directory
|
||||
}
|
||||
$ReconcileFile = Join-Path -Path $global:MetadataPathName -ChildPath $global:default_reconcileFile
|
||||
}
|
||||
|
||||
if ($SourceFolder.StartsWith("@")) {
|
||||
|
|
@ -298,10 +303,11 @@ Param(
|
|||
Write-Host "Generating reconciliation file '$ReconcileFile'"
|
||||
|
||||
if ($IncludeExif) {
|
||||
if (!(Test-Path -Path $global:MetadataPathName )) {
|
||||
$null = New-Item -Path $global:MetadataPathName -ItemType Directory
|
||||
$dirPath = Split-Path -Path $ReconcileFile -Parent
|
||||
if (!(Test-Path -Path $dirpath )) {
|
||||
$null = New-Item -Path $dirpath -ItemType Directory
|
||||
}
|
||||
$ExifFile = Join-Path -Path $global:MetadataPathName -ChildPath $global:default_exifFile
|
||||
$ExifFile = Join-Path -Path $dirpath -ChildPath $global:default_exifFile
|
||||
Write-Log "Generating Exif file '$ExifFile'"
|
||||
Set-Content -Encoding utf8 -Path $ExifFile -Value $(Set-ExifCsvHeader)
|
||||
}
|
||||
|
|
@ -361,7 +367,9 @@ Param(
|
|||
|
||||
if ($IncludeExif) {
|
||||
$exifData = Get-ImageFileExif -ImageFile $($_.FullName)
|
||||
Add-Content -Path $ExifFile -Value (Set-ExifCsvRecord -ExifData $exifData)
|
||||
if ($null -ne $exifData) {
|
||||
Add-Content -Path $ExifFile -Value (Set-ExifCsvRecord -ExifData $exifData)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -397,7 +405,9 @@ Param(
|
|||
|
||||
if ($IncludeExif) {
|
||||
$exifData = Get-ImageFileExif -ImageFile $($_.FullName)
|
||||
Add-Content -Path $ExifFile -Value (Set-ExifCsvRecord -ExifData $exifData )
|
||||
if ($null -ne $exifData) {
|
||||
Add-Content -Path $ExifFile -Value (Set-ExifCsvRecord -ExifData $exifData )
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -566,6 +576,7 @@ function Invoke-SinglePack
|
|||
|
||||
The following environment variables are supported:
|
||||
- PETERDOCS_RECIPIENTKEY
|
||||
- PETERDOCS_SECRETKEY
|
||||
- PETERDOCS_LOGPATH
|
||||
|
||||
.Example
|
||||
|
|
@ -641,6 +652,13 @@ Param(
|
|||
}
|
||||
}
|
||||
|
||||
if ($SecretKey -eq "") {
|
||||
$getEnvName = $(Get-SoftwareName) + "_SECRETKEY"
|
||||
if ([System.Environment]::GetEnvironmentVariable($getEnvName) -ne "" -and $null -ne [System.Environment]::GetEnvironmentVariable($getEnvName)) {
|
||||
$SecretKey = [System.Environment]::GetEnvironmentVariable($getEnvName)
|
||||
}
|
||||
}
|
||||
|
||||
if (($RecipientKey -eq "") -and ($SecretKey -eq "")) {
|
||||
Write-Log "Recipient Key or Secret Key required for packing"
|
||||
Write-Host "Recipient Key or Secret Key required for packing" -ForegroundColor Red
|
||||
|
|
@ -775,6 +793,12 @@ Param(
|
|||
$null = $items.Add($dataItem)
|
||||
}
|
||||
|
||||
$dataItem = @{"SecretFile"="$SecretFile";"Caption"="File used for complex password storage with asymmetric key";}
|
||||
$null = $items.Add($dataItem)
|
||||
|
||||
$dataItem = @{"FileFilter"="$FileFilter";"Caption"="File filter used with Compress";}
|
||||
$null = $items.Add($dataItem)
|
||||
|
||||
$jsonData.Add("Links",$items)
|
||||
$jsonData | ConvertTo-Json -Depth 10 | Out-File $jsonFile
|
||||
|
||||
|
|
@ -782,7 +806,7 @@ Param(
|
|||
$fullMetadatName = (Get-Item $global:MetadataPathName).FullName
|
||||
$fullZipName = (Get-Item $ArchiveFile).FullName
|
||||
Compress-7Zip -Path $fullMetadatName -ArchiveFileName $fullZipName -PreserveDirectoryRoot -Format SevenZip -Append -Password $secret -EncryptFilenames
|
||||
# Remove-Item $fullMetadatName -Recurse
|
||||
Remove-Item $fullMetadatName -Recurse
|
||||
|
||||
Write-Log "Archive file '$ArchiveFile' created from folder '$SourceFolder'"
|
||||
Write-Host "Archive file '$ArchiveFile' created from folder '$SourceFolder'" -ForegroundColor Green
|
||||
|
|
@ -869,7 +893,8 @@ Param(
|
|||
is not accessible and you want to reconcile, then this tool is appropriate.
|
||||
|
||||
The following environment variables are supported:
|
||||
- PETERDOCS_RECIPIENTKEY
|
||||
- PETERDOCS_PROFILE
|
||||
- PETERDOCS_ACCOUNTKEY
|
||||
- PETERDOCS_LOGPATH
|
||||
|
||||
.Example
|
||||
|
|
@ -1385,6 +1410,7 @@ Param(
|
|||
|
||||
The following environment variables are supported:
|
||||
- PETERDOCS_RECIPIENTKEY
|
||||
- PETERDOCS_SECRETKEY
|
||||
- PETERDOCS_LOGPATH
|
||||
|
||||
|
||||
|
|
@ -1447,6 +1473,13 @@ Param(
|
|||
}
|
||||
}
|
||||
|
||||
if ($SecretKey -eq "") {
|
||||
$getEnvName = $(Get-SoftwareName) + "_SECRETKEY"
|
||||
if ([System.Environment]::GetEnvironmentVariable($getEnvName) -ne "" -and $null -ne [System.Environment]::GetEnvironmentVariable($getEnvName)) {
|
||||
$SecretKey = [System.Environment]::GetEnvironmentVariable($getEnvName)
|
||||
}
|
||||
}
|
||||
|
||||
if (($RecipientKey -eq "") -and ($SecretKey -eq "")) {
|
||||
Write-Log "Recipient Key name or Secret Key required for unpacking"
|
||||
Write-Host "Recipient Key name or Secret Key required for unpacking" -ForegroundColor Red
|
||||
|
|
@ -1576,8 +1609,8 @@ Param(
|
|||
|
||||
# Check for metadata
|
||||
$jsonFile = Join-Path -Path (Join-Path -Path $RestoreFolder -ChildPath $global:MetadataPathName ) -ChildPath $global:default_metaFile
|
||||
Write-Host "Checking $jsonFile"
|
||||
if (Test-FilesExist $jsonFile) {
|
||||
Write-Host "Checking for $jsonFile"
|
||||
if (Test-Path -Path $jsonFile -PathType Leaf ) {
|
||||
$jsonData = Get-Content -Raw -Path $jsonFile | ConvertFrom-Json
|
||||
|
||||
$software = $jsonData.Software.Name
|
||||
|
|
@ -1607,6 +1640,7 @@ Param(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
If (!(Test-Path -Path $ReconcileFile )) {
|
||||
Write-Log "Reconciliation file '$ReconcileFile' does not exist"
|
||||
Write-Host "Reconciliation file '$ReconcileFile' does not exist" -ForegroundColor Red
|
||||
|
|
@ -1619,6 +1653,8 @@ Param(
|
|||
|
||||
Write-Log "Using reconciliation file '$ReconcileFile'"
|
||||
|
||||
Write-Progress -Activity "Comparing reconciliation entries in file $ReconcileFile" -Status "Start"
|
||||
|
||||
$totalFileCount = 0
|
||||
$totalFileSize = 0
|
||||
$errorCount = 0
|
||||
|
|
@ -1626,6 +1662,11 @@ Param(
|
|||
$missingFileCount = 0
|
||||
$missingHash = $false
|
||||
|
||||
$ProcessFileCount = 0
|
||||
Import-Csv $ReconcileFile | ForEach-Object {
|
||||
$ProcessFileCount += 1
|
||||
}
|
||||
|
||||
Import-Csv $ReconcileFile | ForEach-Object {
|
||||
$totalFileCount = $totalFileCount +1
|
||||
if ($RootFolder -ne "") {
|
||||
|
|
@ -1696,8 +1737,16 @@ Param(
|
|||
$errorCount = $errorCount + 1
|
||||
Write-Log "Non existant target file '$restoreFileName'"
|
||||
}
|
||||
|
||||
if ( $ProcessFileCount -gt 0) {
|
||||
Write-Progress -Activity "Comparing reconciliation entries in file $ReconcileFile" -Status "Read $totalFileCount files and size $(Get-ConvenientFileSize -Size $totalFileSize ). Currently at folder '$restoreFileName'" -PercentComplete (($totalFileCount / $ProcessFileCount) * 100)
|
||||
} else {
|
||||
Write-Progress -Activity "Comparing reconciliation entries in file $ReconcileFile" -Status "Read $totalFileCount files and size $(Get-ConvenientFileSize -Size $totalFileSize ). Currently at folder '$restoreFileName'" -PercentComplete -1
|
||||
}
|
||||
}
|
||||
|
||||
Write-Progress -Activity "Comparing reconciliation entries in file $ReconcileFile" -Completed
|
||||
|
||||
Write-Log "Total file storage size is $(Get-ConvenientFileSize -Size $totalFileSize ) ($totalFileSize)"
|
||||
Write-Host "Total file storage size is $(Get-ConvenientFileSize -Size $totalFileSize )"
|
||||
|
||||
|
|
|
|||
|
|
@ -168,8 +168,13 @@ function Get-ImageFileExif {
|
|||
[System.IO.FileOptions]::SequentialScan
|
||||
)
|
||||
|
||||
$fs = New-Object System.IO.FileStream -ArgumentList $fileStreamArgs
|
||||
$image = [System.Drawing.Image]::FromStream($fs)
|
||||
Try {
|
||||
$fs = New-Object System.IO.FileStream -ArgumentList $fileStreamArgs
|
||||
$image = [System.Drawing.Image]::FromStream($fs)
|
||||
} Catch {
|
||||
# Error likely because not an image file
|
||||
return $null
|
||||
}
|
||||
|
||||
$val = Get-ExifContents -ImageStream $image -ExifCode 37378 -Numeric -Size 8 -Parts 2
|
||||
if ($null -eq $val -or $val -eq "") {
|
||||
|
|
@ -284,7 +289,6 @@ function Get-ImageFileExif {
|
|||
if ($fs) {
|
||||
$fs.close()
|
||||
}
|
||||
break
|
||||
return $null
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -90,6 +90,9 @@
|
|||
uses a symmetric cryptographic key exchange which is less secure then the
|
||||
RecipientKey approach.
|
||||
|
||||
SecretKey can also be specifed with Environment variable
|
||||
"PETERDOCS_SECRETKEY"
|
||||
|
||||
Note: Currently the script does not user Secure Strings
|
||||
|
||||
.Parameter ArchiveFile
|
||||
|
|
@ -165,6 +168,7 @@
|
|||
|
||||
The following environment variables are supported:
|
||||
- PETERDOCS_RECIPIENTKEY
|
||||
- PETERDOCS_SECRETKEY
|
||||
- PETERDOCS_PROFILE
|
||||
- PETERDOCS_ACCOUNTKEY
|
||||
- PETERDOCS_LOGPATH
|
||||
|
|
@ -270,7 +274,11 @@ Import-Module .\PeterDocs
|
|||
|
||||
if ($task -eq "NewReconcile") {
|
||||
$actioned = $true
|
||||
New-PeterReconcile -ReconcileFile $reconcileFile -SourceFolder $path -Feedback -RootFolder $rootFolder -FileFilter $fileFilter -LogPath LogPath -ExcludeHash:$ExcludeHash -IncludeExif:$IncludeExif
|
||||
if ($null -eq $reconcileFile -or $reconcileFile -eq "") {
|
||||
Write-Error "Reconcile file name required (-ReconcileFile)"
|
||||
return
|
||||
}
|
||||
New-PeterReconcile -ReconcileFile $reconcileFile -SourceFolder $path -Feedback -RootFolder $rootFolder -FileFilter $fileFilter -LogPath $LogPath -ExcludeHash:$ExcludeHash -IncludeExif:$IncludeExif
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -282,7 +290,7 @@ Import-Module .\PeterDocs
|
|||
if ($task -eq "ArchiveInformation") {
|
||||
$actioned = $true
|
||||
if (($RecipientKey -eq "") -and ($SecretKey -eq "")) {
|
||||
Write-Host "Recipient Key or Secret Key required for 7Zip information" -ForegroundColor Red
|
||||
Write-Error "Recipient Key or Secret Key required for 7Zip information"
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
If you are in a hurry, comfortable to use ``PeterTask.ps1`` and want to accept the defaults
|
||||
then this is what you need to do.
|
||||
|
||||
1. Download PowerShell file [PeterTask.ps1](https://raw.github.com/) to a lcoal directory.
|
||||
1. Download PowerShell file [PeterTask.ps1](https://raw.githubusercontent.com/meerkat-manor/PeterDocs/main/PeterTask.ps1) to a local directory.
|
||||
2. Open a PowerShell terminal where the above file is stored locally and execute command
|
||||
|
||||
```powershell
|
||||
|
|
@ -29,6 +29,32 @@ then this is what you need to do.
|
|||
.\PeterTask.ps1 -Task Compare -Path <restore path>
|
||||
```
|
||||
|
||||
## Just Compare
|
||||
|
||||
If your interest is in the reconciliation function of PeterDocs, then assuming you
|
||||
have two directories, source and target, then the steps to just reconcile are:
|
||||
|
||||
|
||||
1. Download PowerShell file [PeterTask.ps1](https://raw.githubusercontent.com/meerkat-manor/PeterDocs/main/PeterTask.ps1) to a local directory.
|
||||
2. Open a PowerShell terminal where the above file is stored locally and execute command
|
||||
|
||||
```powershell
|
||||
Install-Module -Name PeterDocs -Scope CurrentUser
|
||||
```
|
||||
|
||||
3. Run command below substituting the names as applicable
|
||||
|
||||
```powershell
|
||||
.\PeterTask.ps1 -Task NewReconcile -ReconcileFile .\myfiles.csv -Path <source path>
|
||||
```
|
||||
|
||||
4. Send, if required, the generated CSV file to your destination (target)
|
||||
5. Now compare the destination. Don't forget to run steps 1. and 2. above on your destination
|
||||
|
||||
```powershell
|
||||
.\PeterTask.ps1 -Task Compare -ReconcileFke .\myfiles.csv -Path <target path>
|
||||
```
|
||||
|
||||
## Advanced security
|
||||
|
||||
If you are sending the documents and only want the recipient to be able to unpack the contents then
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ transfer the archive file to your target, where the content are unpacked using t
|
|||
key. After archive contents are restored you can execute the reconcile function
|
||||
to veriy that the contents are transferred, unaltered.
|
||||
|
||||
See [Quick Start](QuickStart.md) if you are ready to start and don't need the details.
|
||||
|
||||
If you have access to both source and target folders, then you should consider
|
||||
using tools such as:
|
||||
|
||||
|
|
@ -37,7 +39,7 @@ folders and can be large in number and size because of the increased
|
|||
resolution of digital cameras.
|
||||
|
||||
The backup also required to be secure from accidental distribution. The backup is not secured
|
||||
from accidental or malicious deletion, which are require different controls.
|
||||
from accidental or malicious deletion, which require different controls.
|
||||
|
||||
## Usage
|
||||
|
||||
|
|
@ -56,7 +58,7 @@ Expand-Peter -RestoreFolder "c:\backup\pictures" -Secret "c0mpleX%S3cret" -Archi
|
|||
Compare-Peter -RestoreFolder "c:\backup\pictures"
|
||||
```
|
||||
|
||||
The above commands are using the default settings for certain options
|
||||
The above commands are using the default settings for certain options.
|
||||
|
||||
Packages source folder contents into a 7ZIP file, adding a reconciliation
|
||||
file to the 7ZIP file and then encrypting the contents. Send
|
||||
|
|
|
|||
Loading…
Reference in New Issue