25 Commits

Author SHA1 Message Date
PrincessPi 4e798818d1 CHECKSUM GREATLY IMPROVED 2026-09-25 17:02:59 -06:00
PrincessPi 56b08f32da waypoit debuguing 2026-09-25 16:52:30 -06:00
PrincessPi 251c9aa06c waypoit debuguing 2026-09-25 16:51:04 -06:00
PrincessPi 1dbd1ad79b waypoit debuguing 2026-09-25 16:50:16 -06:00
PrincessPi 7bd65e7d76 waypoit debuguing 2026-09-25 16:45:30 -06:00
PrincessPi 2fd8238a98 waypoit debuguing 2026-09-25 16:33:58 -06:00
PrincessPi 503e947eaf waypoit debuguing 2026-09-25 16:20:22 -06:00
PrincessPi 07a29167dd waypoit debuguing 2026-09-25 16:19:14 -06:00
PrincessPi 608e225833 WORKAN DEBUG 2026-09-25 16:10:17 -06:00
PrincessPi 4fea9dbccc waypoint debug 2026-09-25 16:01:49 -06:00
PrincessPi 4377cc6a45 waypoit debuguing 2026-09-25 15:56:47 -06:00
PrincessPi e5435d124e waypoit debuguing 2026-09-25 15:50:28 -06:00
PrincessPi 757f1775ff waypoit debuguing 2026-09-25 15:43:25 -06:00
PrincessPi dc17c77c87 waypoint debug 2026-09-25 15:30:52 -06:00
PrincessPi b504218205 waypoint debug 2026-09-25 15:27:37 -06:00
PrincessPi 776a52c3c3 waypoit debuguing 2026-09-25 15:25:19 -06:00
PrincessPi 3f03b2a0f3 waypoit debuguing 2026-09-25 15:23:52 -06:00
PrincessPi b32cae15b2 waypoint debugging 2026-09-25 15:20:47 -06:00
PrincessPi 784b60a4e7 waypoint debugging 2026-09-25 15:17:50 -06:00
PrincessPi 53fe4e9ed3 waypoint 2026-09-25 15:16:30 -06:00
PrincessPi b010b7ac71 added a kasm installer dev 2026-09-20 17:29:26 -06:00
PrincessPi 0994e78843 added a random word generator 2026-09-19 21:27:49 -06:00
PrincessPi 1a61eb2034 1789857176 2026-09-19 16:32:56 -06:00
PrincessPi 29ee569bfe fixed oniux shit proper and finished checksum for windowz 2026-08-10 21:12:56 -06:00
PrincessPi 3425139b1f fixed oniux shit proper and finished checksum for windowz 2026-08-10 21:06:05 -06:00
10 changed files with 1363 additions and 347 deletions
+1
View File
@@ -39,6 +39,7 @@ script=/tmp/install_script.sh && curl -s https://git.thecoven.info/PrincessPi/ge
* `large_file_search_for_hash`
* `randomtoken`
* `alfa_install_kali.sh`
* `torsilly.sh`
#### monitoring
* `mon-watch`
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
1. recursive verify error: `FAILED open or read`
2. recursive progress set to count total number of files recursively first for progress bar
+557 -178
View File
@@ -1,277 +1,656 @@
<#
.SYNOPSIS
Princess Pi's Magical CHECKSUM! - Computes and verifies message digests / file checksums.
.DESCRIPTION
Computes or verifies checksums using cryptographic hash algorithms (SHA256, SHA512, SHA1, MD5, SHA384).
Supports parallel processing, recursive scanning, direct hash matching, and verification file parsing.
.NOTES
Requires PowerShell 7.0 or higher.
#>
[CmdletBinding(DefaultParameterSetName='Generate')]
param(
# File(s) or wildcard pattern to compute checksum for
[Parameter(Position = 0, ParameterSetName = 'Generate', ValueFromPipeline = $true)]
[Parameter(Position = 0, ParameterSetName = 'Match', ValueFromPipeline = $true)]
[Parameter(Position = 0, ParameterSetName = 'PrincessPi', ValueFromPipeline = $false)]
[Alias('i', 'input', 'if', 'InputFile')]
[string[]]$FilePath,
# Output file to save generated checksums (-o mode)
# Custom output file (-f / -OutFile / -of)
[Parameter(Mandatory = $false, ParameterSetName = 'Generate')]
[Alias('o')]
[Alias('f', 'of')]
[string]$OutFile,
# File containing checksums to verify (-c mode)
# Auto output file switch (-s / -Save / -o)
[Parameter(Mandatory = $false, ParameterSetName = 'Generate')]
[Alias('s', 'o')]
[switch]$Save,
# File containing checksums to verify (-c / -Check)
[Parameter(Mandatory = $false, ParameterSetName = 'Verify')]
[Alias('c')]
[string]$Check,
# Direct checksum hash string to match against (-m mode)
# Direct checksum hash string to match against (-m / -Match)
[Parameter(Mandatory = $true, ParameterSetName = 'Match')]
[Alias('m')]
[string]$Match,
# Hashing algorithm to use (Defaults to SHA256)
[Parameter(Mandatory = $false)]
[Alias('a')]
[Alias('a', 'algo')]
[ValidateSet('SHA1', 'SHA256', 'SHA384', 'SHA512', 'MD5')]
[string]$Algorithm,
# Help flag (-h, -Help)
# Recursive flag (-r / -Recursive)
[Parameter(Mandatory = $false)]
[Alias('r')]
[switch]$Recursive,
# Princess Pi art flag (-pp / -PrincessPi)
[Parameter(Mandatory = $true, ParameterSetName = 'PrincessPi')]
[Alias('pp')]
[switch]$PrincessPi,
# Help flag (-h / -Help)
[Parameter(Mandatory = $false)]
[Alias('h')]
[switch]$Help
)
begin {
function Show-Help {
@'
# --- ENVIRONMENT SANITY CHECK ---
if ($PSVersionTable.PSVersion.Major -lt 7) {
Write-Error "checksum: This script requires PowerShell 7 or higher for parallel execution (-Parallel support). Current version is $($PSVersionTable.PSVersion)."
exit 1
}
# --- HELPER FUNCTIONS ---
function Show-Help {
@'
Princess Pi's Magical CHECKSUM!
NAME
checksum - Compute and verify message digests / file checksums
SYNOPSIS
.\checksum.ps1 [-FilePath] <string[]> [-OutFile <string>] [-Algorithm <string>]
.\checksum.ps1 [-FilePath] <string[]> -Match <string> [-Algorithm <string>]
.\checksum.ps1 -Check <string> [-Algorithm <string>]
.\checksum.ps1 [-FilePath] <string[]> [-s] [-f <string>] [-Algorithm <string>] [-r]
.\checksum.ps1 [-FilePath] <string[]> -Match <string> [-Algorithm <string>] [-r]
.\checksum.ps1 -Check <string> [-Algorithm <string>] [-r]
.\checksum.ps1 -PrincessPi
.\checksum.ps1 -Help
DESCRIPTION
Computes or verifies checksums using various cryptographic algorithms.
Outputs hash values in standard Linux utility format (<hash> <filename>).
Computes or verifies checksums using cryptographic hash algorithms (SHA256, SHA512, SHA1, MD5, SHA384).
Outputs hash values in standard GNU coreutils format (<hash> <filename>).
Ignores checksum metadata files (.md5, .sha1, .sha256, .sha384, .sha512) during wildcards unless passed explicitly.
PARAMETERS
-FilePath <string[]>
Specifies the path to one or more files to hash. Accepts wildcards (*).
-FilePath, -i, -input, -if, -InputFile <string[]>
Specifies the target file(s) or wildcard pattern (*).
-o, -OutFile <string>
Specifies an output file to save the checksum results to, while still
displaying the output on screen.
-s, -S, -Save, -o, -O <switch>
Auto-saves checksum results. (Takes no arguments).
- If input filename contains a wildcard (*), saves to 'checksums.<algo>'.
- If input filename does NOT contain a wildcard, saves to '<filename>.<algo>'.
When combined with -r and *, recursively auto-generates checksums per directory.
-c, -Check <string>
Read checksums from the specified file and verify them against files on disk.
-f, -F, -of, -OF, -OutFile <string>
Saves checksum results to a specific custom filename.
Overrides the auto-naming behavior of -s if both are passed.
-m, -Match <string>
Compare the computed hash of the target file(s) against a specific hash string.
-c, -C, -Check <string>
Reads hashes from a specified checksum file and verifies target files on disk.
If -r is specified, recursively looks for and validates checksum files by name across subdirectories.
-a, -Algorithm <string>
Specifies the cryptographic hash algorithm to use.
Supported values: SHA1, SHA256 (default), SHA384, SHA512, MD5.
If omitted in -c or -m mode, the algorithm is auto-detected by hash length.
-m, -M, -Match <string>
Compares the computed hash of target file(s) directly against a given hash string.
-h, -Help
Display this help message.
-a, -A, -Algo, -Algorithm <string>
Specifies the hash algorithm to use.
Supported options: MD5, SHA1, SHA256 (default), SHA384, SHA512.
In -c or -m mode, auto-detects algorithm from hash length if omitted.
-r, -R, -Recursive <switch>
Processes target files or verification files recursively across directory structures.
-pp, -PP, -PrincessPi <switch>
Displays Princess Pi!
-h, -H, -Help <switch>
Displays this help documentation.
Also displays on any error.
EXAMPLES
1. Compute SHA256 checksum for a single file:
.\checksum.ps1 myfile.iso
1. Compute SHA256 for a single file and auto-save as 'myfile.iso.sha256':
.\checksum.ps1 myfile.iso -s
2. Compute checksums for all files and write to a file while showing output:
.\checksum.ps1 * -o checksums.sha256
2. Compute SHA512 recursively and auto-save as 'checksums.sha512' in each folder:
.\checksum.ps1 * -r -s -a SHA512
3. Verify a file against a explicit hash string:
.\checksum.ps1 myfile.iso -m "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
3. Compute SHA256 checksums and save to a specific custom file:
.\checksum.ps1 * -f my_hashes.txt
4. Verify checksums against a verification file:
.\checksum.ps1 -c checksums.sha256
5. Compare file directly against an expected hash string:
.\checksum.ps1 myfile.bin -m 406653a68bd3538975656831f33f031b
Princess Pi LOVES YOU!~
https://linktr.ee/princesspi3
4. Verify checksums from a verification file (auto-detects algorithm):
.\checksum.ps1 -c checksums.sha256
'@
}
}
# Helper function to auto-detect hash algorithm based on string character length
function Get-AlgorithmFromHashLength {
param([string]$HashString)
function Write-ErrorWithHelp {
param([string]$ErrorMessage);
Show-Help;
Write-Host "";
Write-Error $ErrorMessage;
}
switch ($HashString.Trim().Length) {
32 { return 'MD5' }
40 { return 'SHA1' }
64 { return 'SHA256' }
96 { return 'SHA384' }
128 { return 'SHA512' }
default {
Write-Error "checksum: Could not auto-detect algorithm for hash length $($HashString.Length). Please specify -Algorithm."
return $null
}
function Show-PrincessPiArt {
$art = @'
=#= -- ##*+++++ *+
-#=#- +# -*%%= ##++++++++++# ##*********#
#==#= *** %%++%% -++# #++++++++++++*+ *#***************#
#===#= %***+%++#*%%@+++++% #++++++++++++**+++#******++********#
====+#%@*******###%=%++##++% #+++++++++++*++++++++#***====+****++#
=#=*==**#*#########%++#*+++@ *++++++++#+++++++++++#****==+******#
*#=====%####***%%++++#*+++**% ++++++++*+++++++++++++#************#*******
@****#==%####**#*+++++++#+++#**# #+++++++++++++++++++#####+*****************#
@****#######%**@+*%**#%+++++%##*** #+++++++++++++++++#+++++#****+======*****+
#****##%####@**%+*******@@+++@###**% #+++++++++++++*++++++++++****========****#
****#####%%*%*%+***@@@%%@*+++@####** *+++++++++++++++++++++#****=======****#
%***####%%**+%%*++*@=##@@%@++++%###*** ++++*+++++++++++#+**************#
@%%%@@##%%#++++++++==**@@**+++%*###**% +++++++++++#*+++++#*********####
%###%++++++++====**#++++%**##**% @% ++++#+++++++++++++**************#
%###%++++++++++++++++++%**%##**%@###@ %++++++++++++++++***=====********
###%%++++++++%++++++*%%%%###***##%##@ +++++++++++++##**************#
###%%%%+++++##+++++++#*+%###***%%%##@ ++++++++++++++%********+############%@
@%%*@*%%%%###****+*%%****++%##***%##@@@ #+++++++++++++++*********###*****#########*
#%%###***#####%**++++##**%#@@#@ ##+++++++++*###%#+***+***##*************#######
@#%%####%%####%+++++++##*######%++++++++++++++#*+++++#%###%#######*********######%
##%########@%@+++@###%*%#####@+++++++++++%**++++++++++%%%%%%########***==**###%##%
%#%###%###########@@%#%#@@##++++++++****++++********+++ %########**===*###%*#
#**##%####@@####%@######%*++++++++++++++++#++**+*#++++# ########******###% %
@#***# ###%@@##%#######@+++++++++++++++++++++%*++**++++# *########******##% @
*******% %##% =@#########++++++++++++++++++#++++*%++*#%#++# ########******##%
#@%@# %% *@#@@###*+++++++++++++++++++%+++##+++###++* ##*#####******##@
**##%*++%++++++++++++++++++++++++++++++++% +#**#####******###
##%#######*@***+#+++++++++++++++#***#++++++++++++ %**#####*******#%
*+++++$****##****++++++++##% #******#+++++++++++ %**#####*******#@
#++++++++*******- ++++++++# *******#++++++++++# @**#####*******#
#@@+++++++******- *+++++++# #******#+++++++++* **####%**==+**@
@@@@@+++ %+++++++# ******# %+++++++ %*###%***===**@ %=
@@@@@@@@@ #+++++++# =****** #++++++% *###%#***=+**% %**
@@@@@@@@@@ ++++++++# ******# #++++++# *##@%********% @*@
@@+@@@++@@+ ++++++++# ******# #++++++# @## #*********@ #***#
@@+@@++@@@++ @@@++++++* @@@%**** #@@++++% +## %#****************%
@*@**@+++# @@@@+++++ @@@@@@**# @@@@@++++# @# %#****************
+#+++++# @@@@@@+++% @@@@@@@@# @@@@@@@++ @ %##************%
#+++** @@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ %###********%*
@@@@@@@@@@+ @@@@@@@@@@ =@@@@@@@@@ %%#####%%
*@@@@@@@@@@ @+*@@@@@@@= @@++@@@@@@
@++@@@@@@@@ #**@**@@@@@ *@@*#@@@@@@ -=
@%#@@@@@@@@ *#***@@@@@@ @+#+@++#@@@
#+++@++@@@@@ **********# #+++++@+@@@@
##+#+++@@@@@@ ##****#### *+#+##+++@@%%
#+++++++++++# #++++++++++#
#########*
____ ____ ____ _ _ ___ ____ ___ ___ ____ ____
( _ \( _ \(_ _)( \( )/ __)( ___)/ __)/ __) ( _ \(_ _)/\/
)___/ ) / _)(_ ) (( (__ )__) \__ \\__ \ )___/ _)(_
(__) (_)\_)(____)(_)\_)\___)(____)(___/(___/ (__) (____)
Princess Pi
https://linktr.ee/princesspi3
'@
Write-Host $art -ForegroundColor Blue;
}
function Get-AlgorithmFromHashLength {
param([string]$HashString);
switch ($HashString.Trim().Length) {
32 { return 'MD5'; }
40 { return 'SHA1'; }
64 { return 'SHA256'; }
96 { return 'SHA384'; }
128 { return 'SHA512'; }
default {
Write-ErrorWithHelp "checksum: Could not auto-detect algorithm for hash length $($HashString.Length). Please specify -Algorithm.";
return $null;
}
}
}
process {
# Match help arguments passed either as switch (-h, -Help) or positional string ('help', 'h', '--help', etc.)
$isHelpRequested = $Help.IsPresent -or (
$FilePath -and $FilePath.Count -eq 1 -and (
$FilePath[0] -match '^(?i)[-/]{0,2}(h|help)$'
)
)
# --- MAIN EXECUTION FLOW ---
$helpInPath = $false;
if ($FilePath) {
foreach ($p in ($FilePath)) {
if ($p -match '^(?i)[-/]{1,2}(h|help|\?)$') {
$helpInPath = $true;
break;
}
}
}
if ($isHelpRequested) {
Show-Help
return
if ($Help.IsPresent -or $helpInPath) {
Show-Help;
return;
}
if ($PrincessPi.IsPresent) {
Show-PrincessPiArt;
return;
}
if (-not [string]::IsNullOrWhiteSpace($Algorithm)) {
$Algorithm = $Algorithm.ToUpper();
}
$isWildcardGlobal = $false;
if ($FilePath) {
foreach ($p in $FilePath) {
if ($p -match '\*') { $isWildcardGlobal = $true; }
}
}
$showProgress = $Recursive.IsPresent -or $isWildcardGlobal -or ($PSCmdlet.ParameterSetName -eq 'Verify');
# --- ITEM GATHERING (Generate & Match Modes) ---
if ($PSCmdlet.ParameterSetName -in @('Generate', 'Match')) {
if (-not $FilePath -or $FilePath.Count -eq 0) {
Write-ErrorWithHelp "checksum: Missing file path parameter. Use -Help for usage.";
return;
}
# Normalize explicit algorithm input if provided
if (-not [string]::IsNullOrWhiteSpace($Algorithm)) {
$Algorithm = $Algorithm.ToUpper()
}
$allItems = @();
$skipExtensions = @('.md5', '.sha1', '.sha256', '.sha384', '.sha512');
# --- DIRECT MATCH MODE (-m / -Match) ---
if ($PSCmdlet.ParameterSetName -eq 'Match') {
if (-not $FilePath -or $FilePath.Count -eq 0) {
Write-Error "checksum: Missing file path parameter for matching. Use -Help for usage."
return
}
foreach ($pathEntry in ($FilePath)) {
$isWildcard = ($pathEntry -match '\*');
$resolvedItems = @();
# Auto-detect algorithm from provided -Match hash string if not explicitly given
if ([string]::IsNullOrWhiteSpace($Algorithm)) {
$Algorithm = Get-AlgorithmFromHashLength -HashString $Match
if (-not $Algorithm) { return }
Write-Verbose "Auto-detected algorithm: $Algorithm"
}
$expectedHash = $Match.Trim().ToLower()
foreach ($pathEntry in $FilePath) {
$resolvedItems = Get-Item -Path $pathEntry -ErrorAction SilentlyContinue
if (-not $resolvedItems) {
Write-Error "checksum: $pathEntry`: No such file or directory"
continue
if ($Recursive) {
$resolvedItems = Get-ChildItem -Path ($pathEntry) -Recurse -File -ErrorAction 'SilentlyContinue';
} else {
if ($isWildcard -or ($pathEntry -match '\?')) {
$resolvedItems = Get-ChildItem -Path ($pathEntry) -File -ErrorAction 'SilentlyContinue';
} else {
$resolvedItems = Get-Item -Path ($pathEntry) -ErrorAction 'SilentlyContinue';
}
}
foreach ($item in $resolvedItems) {
if ($item.PSIsContainer) {
Write-Error "checksum: $($item.Name)`: Is a directory"
} else {
$actualHash = (Get-FileHash -Path $item.FullName -Algorithm $Algorithm).Hash.ToLower()
$targetFile = Resolve-Path -Path $item.FullName -Relative
if ($targetFile.StartsWith(".\")) { $targetFile = $targetFile.Substring(2) }
if (-not $resolvedItems) {
Write-ErrorWithHelp "checksum: $($pathEntry): No such file or directory";
continue;
}
if ($actualHash -eq $expectedHash) {
Write-Host "${targetFile}: " -NoNewline
Write-Host "OK" -ForegroundColor Green
} else {
Write-Host "${targetFile}: " -NoNewline
Write-Host "FAILED" -ForegroundColor Red
}
$explicitFileFound = $false;
if ((-not $isWildcard) -and (Test-Path -Path ($pathEntry) -PathType 'Leaf')) {
$explicitFileFound = $true;
}
foreach ($item in ($resolvedItems)) {
if ($item.PSIsContainer) { continue; }
if (-not $explicitFileFound) {
if ($skipExtensions -contains $item.Extension.ToLower()) {
continue;
}
}
$allItems += $item;
}
}
# --- VERIFICATION MODE (-c / -Check) ---
elseif ($PSCmdlet.ParameterSetName -eq 'Verify') {
if (-not (Test-Path -Path $Check -PathType Leaf)) {
Write-Error "checksum: $Check`: No such file or directory"
return
}
# --- DIRECT MATCH MODE (-m / -Match) ---
if ($PSCmdlet.ParameterSetName -eq 'Match') {
if ([string]::IsNullOrWhiteSpace($Algorithm)) {
$Algorithm = Get-AlgorithmFromHashLength -HashString ($Match);
if (-not $Algorithm) { return; }
}
$expectedHash = $Match.Trim().ToLower();
$totalFiles = $allItems.Count;
$currentIndex = 0;
$allItems | ForEach-Object -Parallel {
$item = $_
$algo = $using:Algorithm
$exp = $using:expectedHash
$actualHash = (Get-FileHash -Path ($item.FullName) -Algorithm ($algo)).Hash.ToLower();
$targetFile = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue';
if (-not $targetFile) { $targetFile = $item.Name; }
if ($targetFile.StartsWith(".\") -or $targetFile.StartsWith("./")) { $targetFile = $targetFile.Substring(2); }
[PSCustomObject]@{
TargetFile = $targetFile
IsMatch = ($actualHash -eq $exp)
}
} -ThrottleLimit 16 | ForEach-Object {
$currentIndex++
if ($showProgress -and $totalFiles -gt 0) {
Write-Progress -Activity "Matching Checksums ($Algorithm)" -Status "Processing file $currentIndex of $totalFiles" -PercentComplete (($currentIndex / $totalFiles) * 100);
}
$lines = Get-Content -Path $Check
if ($_.IsMatch) {
Write-Host "$($_.TargetFile): " -NoNewline;
Write-Host "OK" -ForegroundColor Green;
} else {
Write-Host "$($_.TargetFile): " -NoNewline;
Write-Host "FAILED" -ForegroundColor Red;
}
}
if ($showProgress) {
Write-Progress -Activity "Matching Checksums ($Algorithm)" -Completed;
}
}
# --- VERIFICATION MODE (-c / -Check) ---
elseif ($PSCmdlet.ParameterSetName -eq 'Verify') {
$checkFiles = @();
if ($Recursive) {
$checkFileName = Split-Path -Path ($Check) -Leaf;
$checkFiles = Get-ChildItem -Path '.\' -Filter ($checkFileName) -Recurse -File -ErrorAction 'SilentlyContinue';
} else {
if (Test-Path -Path ($Check) -PathType 'Leaf') {
$checkFiles = @(Get-Item -Path ($Check));
}
}
if (-not $checkFiles -or $checkFiles.Count -eq 0) {
Write-ErrorWithHelp "checksum: $($Check): No such file or directory";
return;
}
foreach ($cf in ($checkFiles)) {
$lines = Get-Content -Path ($cf.FullName);
$baseDir = $cf.DirectoryName;
$fileAlgo = $Algorithm;
if ([string]::IsNullOrWhiteSpace($fileAlgo)) {
foreach ($line in ($lines)) {
if ([string]::IsNullOrWhiteSpace($line) -or $line.StartsWith("#")) { continue; }
# Auto-detect algorithm based on hash length if not explicitly provided
if ([string]::IsNullOrWhiteSpace($Algorithm)) {
foreach ($line in $lines) {
if ([string]::IsNullOrWhiteSpace($line) -or $line.StartsWith("#")) { continue }
if ($line -match '^([a-fA-F0-9]+)\s+') {
$Algorithm = Get-AlgorithmFromHashLength -HashString $Matches[1]
if (-not $Algorithm) { return }
Write-Verbose "Auto-detected algorithm: $Algorithm"
break
$fileAlgo = Get-AlgorithmFromHashLength -HashString ($Matches[1]);
break;
}
elseif ($line -match '^([a-fA-F0-9]{128}|[a-fA-F0-9]{96}|[a-fA-F0-9]{64}|[a-fA-F0-9]{40}|[a-fA-F0-9]{32})') {
$fileAlgo = Get-AlgorithmFromHashLength -HashString ($Matches[1]);
break;
}
}
if ([string]::IsNullOrWhiteSpace($fileAlgo)) { $fileAlgo = 'SHA256'; }
}
# Fallback if file contained no parsable hashes
if ([string]::IsNullOrWhiteSpace($Algorithm)) {
$Algorithm = 'SHA256'
$verifyItems = @();
foreach ($line in ($lines)) {
if ([string]::IsNullOrWhiteSpace($line) -or $line.StartsWith("#")) { continue; }
$expectedHash = $null;
$targetFile = $null;
if ($line -match '^([a-fA-F0-9]+)\s+[* ]?(.*)$') {
$expectedHash = $Matches[1].ToLower();
$targetFile = $Matches[2].Trim().TrimStart('*');
}
elseif ($line -match '^([a-fA-F0-9]{128}|[a-fA-F0-9]{96}|[a-fA-F0-9]{64}|[a-fA-F0-9]{40}|[a-fA-F0-9]{32})[* ]?(.*)$') {
$expectedHash = $Matches[1].ToLower();
$targetFile = $Matches[2].Trim().TrimStart('*');
}
if ($expectedHash -and $targetFile) {
$targetFullPath = Join-Path -Path ($baseDir) -ChildPath ($targetFile);
$verifyItems += [PSCustomObject]@{
ExpectedHash = $expectedHash
TargetFile = $targetFile
TargetFullPath = $targetFullPath
BaseDir = $baseDir
};
}
}
foreach ($line in $lines) {
# Skip empty lines or comments
if ([string]::IsNullOrWhiteSpace($line) -or $line.StartsWith("#")) { continue }
$totalFiles = $verifyItems.Count;
$currentIndex = 0;
# Match standard checksum output format: "<hash> [* ]<filename>"
if ($line -match '^([a-fA-F0-9]+)\s+[* ]?(.*)$') {
$expectedHash = $Matches[1].ToLower()
# Strip leading whitespace and any leftover leading asterisk
$targetFile = $Matches[2].Trim().TrimStart('*')
$verifyItems | ForEach-Object -Parallel {
$item = $_
$algo = $using:fileAlgo
if (Test-Path -Path $targetFile -PathType Leaf) {
$actualHash = (Get-FileHash -Path $targetFile -Algorithm $Algorithm).Hash.ToLower()
if (Test-Path -Path ($item.TargetFullPath) -PathType 'Leaf') {
$actualHash = (Get-FileHash -Path ($item.TargetFullPath) -Algorithm ($algo)).Hash.ToLower();
if ($actualHash -eq $expectedHash) {
Write-Host "${targetFile}: " -NoNewline
Write-Host "OK" -ForegroundColor Green
} else {
Write-Host "${targetFile}: " -NoNewline
Write-Host "FAILED" -ForegroundColor Red
}
} else {
Write-Host "${targetFile}: " -NoNewline
Write-Host "FAILED open or read" -ForegroundColor Red
$displayPath = Resolve-Path -Path ($item.TargetFullPath) -Relative -ErrorAction 'SilentlyContinue';
if (-not $displayPath) { $displayPath = $item.TargetFile; }
if ($displayPath.StartsWith(".\") -or $displayPath.StartsWith("./")) { $displayPath = $displayPath.Substring(2); }
[PSCustomObject]@{
DisplayPath = $displayPath
Status = if ($actualHash -eq $item.ExpectedHash) { "OK" } else { "FAILED" }
IsError = $false
}
} else {
Write-Warning "checksum: improperly formatted line: $line"
$displayPath = $item.TargetFile;
if ($item.BaseDir -ne (Get-Location).Path) {
$displayPath = Join-Path -Path (Resolve-Path -Path ($item.BaseDir) -Relative -ErrorAction 'SilentlyContinue') -ChildPath ($item.TargetFile);
if ($displayPath.StartsWith(".\") -or $displayPath.StartsWith("./")) { $displayPath = $displayPath.Substring(2); }
}
[PSCustomObject]@{
DisplayPath = $displayPath
Status = "FAILED open or read"
IsError = $true
}
}
} -ThrottleLimit 16 | ForEach-Object {
$currentIndex++
if ($totalFiles -gt 0) {
Write-Progress -Activity "Verifying Checksums ($fileAlgo)" -Status "Processing file $currentIndex of $totalFiles" -PercentComplete (($currentIndex / $totalFiles) * 100);
}
Write-Host "$($_.DisplayPath): " -NoNewline;
if ($_.IsError) {
Write-Host "$($_.Status)" -ForegroundColor Red;
} elseif ($_.Status -eq "OK") {
Write-Host "OK" -ForegroundColor Green;
} else {
Write-Host "FAILED" -ForegroundColor Red;
}
}
Write-Progress -Activity "Verifying Checksums ($fileAlgo)" -Completed;
}
}
# --- GENERATION MODE ---
else {
if ([string]::IsNullOrWhiteSpace($Algorithm)) {
$Algorithm = 'SHA256';
}
# --- GENERATION MODE ---
else {
# Default to SHA256 if no algorithm was specified in generation mode
if ([string]::IsNullOrWhiteSpace($Algorithm)) {
$Algorithm = 'SHA256'
}
if (-not $FilePath -or $FilePath.Count -eq 0) {
Write-Error "checksum: Missing file path parameter. Use -Help for usage."
return
}
$wantCustomOut = $PSBoundParameters.ContainsKey('OutFile');
$wantAutoOut = $Save.IsPresent;
# Clear/initialize output file if specified before writing hashes
if (-not [string]::IsNullOrWhiteSpace($OutFile)) {
$null = New-Item -Path $OutFile -ItemType File -Force
}
if ($wantCustomOut -or $wantAutoOut) {
if ($Recursive -and $isWildcardGlobal) {
$groupedItems = $allItems | Group-Object DirectoryName;
foreach ($pathEntry in $FilePath) {
# Resolve wildcards and single file inputs
$resolvedItems = Get-Item -Path $pathEntry -ErrorAction SilentlyContinue
foreach ($group in ($groupedItems)) {
$dirPath = $group.Name;
$filesInDir = $group.Group;
if (-not $resolvedItems) {
Write-Error "checksum: $pathEntry`: No such file or directory"
continue
}
foreach ($item in $resolvedItems) {
# Handle directories like Linux sha256sum does
if ($item.PSIsContainer) {
Write-Error "checksum: $($item.Name)`: Is a directory"
if ($wantCustomOut) {
$currentOutFile = Join-Path -Path ($dirPath) -ChildPath ($OutFile);
} else {
$hash = (Get-FileHash -Path $item.FullName -Algorithm $Algorithm).Hash.ToLower()
$currentOutFile = Join-Path -Path ($dirPath) -ChildPath "checksums.$($Algorithm.ToLower())";
}
# Format standard relative path (stripping leading '.\')
$relativePath = Resolve-Path -Path $item.FullName -Relative
if ($relativePath.StartsWith(".\")) {
$relativePath = $relativePath.Substring(2)
$totalFiles = $filesInDir.Count;
$currentIndex = 0;
$linesToWrite = @();
$filesInDir | ForEach-Object -Parallel {
$item = $_
$algo = $using:Algorithm
$hash = (Get-FileHash -Path ($item.FullName) -Algorithm ($algo)).Hash.ToLower();
$relativePath = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue';
if (-not $relativePath) { $relativePath = $item.Name; }
if ($relativePath.StartsWith(".\") -or $relativePath.StartsWith("./")) {
$relativePath = $relativePath.Substring(2);
}
$outputLine = "$hash $relativePath"
# If -OutFile is provided, write line to file
if (-not [string]::IsNullOrWhiteSpace($OutFile)) {
Add-Content -Path $OutFile -Value $outputLine
[PSCustomObject]@{
Item = $item
Hash = $hash
RelativePath = $relativePath
OutputLine = "${hash} ${relativePath}"
ItemOutFile = "$($item.FullName).$($algo.ToLower())"
}
} -ThrottleLimit 16 | ForEach-Object {
$currentIndex++;
if ($showProgress -and $totalFiles -gt 0) {
Write-Progress -Activity "Computing Checksums ($Algorithm)" -Status "Directory: $(Split-Path $dirPath -Leaf) [$currentIndex/$totalFiles]" -PercentComplete (($currentIndex / $totalFiles) * 100);
}
# Output to stdout
Write-Output $outputLine
$linesToWrite += $_.OutputLine;
Write-Output $_.OutputLine;
}
if ($showProgress) {
Write-Progress -Activity "Computing Checksums ($Algorithm)" -Completed;
}
Set-Content -Path ($currentOutFile) -Value $linesToWrite -Encoding utf8;
}
}
else {
if ($wantCustomOut -or ($wantAutoOut -and $isWildcardGlobal)) {
if ($wantCustomOut) {
$singleOutFile = $OutFile;
} else {
$singleOutFile = "checksums.$($Algorithm.ToLower())";
}
$totalFiles = $allItems.Count;
$currentIndex = 0;
$linesToWrite = @();
$allItems | ForEach-Object -Parallel {
$item = $_
$algo = $using:Algorithm
$hash = (Get-FileHash -Path ($item.FullName) -Algorithm ($algo)).Hash.ToLower();
$relativePath = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue';
if (-not $relativePath) { $relativePath = $item.Name; }
if ($relativePath.StartsWith(".\") -or $relativePath.StartsWith("./")) {
$relativePath = $relativePath.Substring(2);
}
[PSCustomObject]@{
Item = $item
Hash = $hash
RelativePath = $relativePath
OutputLine = "${hash} ${relativePath}"
ItemOutFile = "$($item.FullName).$($algo.ToLower())"
}
} -ThrottleLimit 16 | ForEach-Object {
$currentIndex++;
if ($showProgress -and $totalFiles -gt 0) {
Write-Progress -Activity "Computing Checksums ($Algorithm)" -Status "Processing file $currentIndex of $totalFiles" -PercentComplete (($currentIndex / $totalFiles) * 100);
}
$linesToWrite += $_.OutputLine;
Write-Output $_.OutputLine;
}
if ($showProgress) {
Write-Progress -Activity "Computing Checksums ($Algorithm)" -Completed;
}
Set-Content -Path ($singleOutFile) -Value $linesToWrite -Encoding utf8;
}
else {
$totalFiles = $allItems.Count;
$currentIndex = 0;
$allItems | ForEach-Object -Parallel {
$item = $_
$algo = $using:Algorithm
$hash = (Get-FileHash -Path ($item.FullName) -Algorithm ($algo)).Hash.ToLower();
$relativePath = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue';
if (-not $relativePath) { $relativePath = $item.Name; }
if ($relativePath.StartsWith(".\") -or $relativePath.StartsWith("./")) {
$relativePath = $relativePath.Substring(2);
}
[PSCustomObject]@{
Item = $item
Hash = $hash
RelativePath = $relativePath
OutputLine = "${hash} ${relativePath}"
ItemOutFile = "$($item.FullName).$($algo.ToLower())"
}
} -ThrottleLimit 16 | ForEach-Object {
$currentIndex++;
if ($showProgress -and $totalFiles -gt 0) {
Write-Progress -Activity "Computing Checksums ($Algorithm)" -Status "Processing file $currentIndex of $totalFiles" -PercentComplete (($currentIndex / $totalFiles) * 100);
}
Write-Output $_.OutputLine;
Set-Content -Path ($_.ItemOutFile) -Value $_.OutputLine -Encoding utf8;
}
if ($showProgress) {
Write-Progress -Activity "Computing Checksums ($Algorithm)" -Completed;
}
}
}
}
}
else {
$totalFiles = $allItems.Count;
$currentIndex = 0;
end {}
$allItems | ForEach-Object -Parallel {
$item = $_
$algo = $using:Algorithm
$hash = (Get-FileHash -Path ($item.FullName) -Algorithm ($algo)).Hash.ToLower();
$relativePath = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue';
if (-not $relativePath) { $relativePath = $item.Name; }
if ($relativePath.StartsWith(".\") -or $relativePath.StartsWith("./")) {
$relativePath = $relativePath.Substring(2);
}
[PSCustomObject]@{
Item = $item
Hash = $hash
RelativePath = $relativePath
OutputLine = "${hash} ${relativePath}"
ItemOutFile = "$($item.FullName).$($algo.ToLower())"
}
} -ThrottleLimit 16 | ForEach-Object {
$currentIndex++;
if ($showProgress -and $totalFiles -gt 0) {
Write-Progress -Activity "Computing Checksums ($Algorithm)" -Status "Processing file $currentIndex of $totalFiles" -PercentComplete (($currentIndex / $totalFiles) * 100);
}
Write-Output $_.OutputLine;
}
if ($showProgress) {
Write-Progress -Activity "Computing Checksums ($Algorithm)" -Completed;
}
}
}
+6 -20
View File
@@ -1,23 +1,9 @@
# waypoint.ps1
if ($args[0]) { $commit_message=($args -join " ") } # if arg0 exists, join all passed args with spaces
else { $commit_message="waypoint" } # or default to "waypoint"
if (-not (Test-Path -Path ".\.git" -PathType Container)) {
Write-Host "No .git folder detected. Initializing new Git repository..." -ForegroundColor Yellow
git init
} else {
Write-Host "Git repository detected. Creating waypoint..." -ForegroundColor Cyan
}
# Stage all changes
Write-Host "WAYPOINT!`n`tCommit Message: $commit_message`n"
# add and commit
git add .
git commit -m "$commit_message"
# Format the timestamp with timezone offset/ID string
$timestamp = (Get-Date).ToString("yyyy-MM-dd-HHmm") + "-" + ((Get-TimeZone).Id -creplace '[a-z\s]', '')
# Capture current git status output
$statusOutput = (git status | Out-String).Trim()
# Construct the commit message
$commitMessage = "WAYPOINT $timestamp`n`n$statusOutput"
# Execute commit
git commit -m "$commitMessage"
Write-Host "`nDone :`"3"
@@ -0,0 +1,58 @@
#!/bin/bash
domain=kasm.h.acker.is
local_port=8443
swap_size_gib=6
sudo apt update
sudo apt dist-upgrade -y
sudo fallocate -l ${swap_size_gib}g /mnt/${swap_size_gib}GiB.swap
sudo chmod 600 /mnt/${swap_size_gib}GiB.swap
sudo mkswap /mnt/${swap_size_gib}GiB.swap
sudo swapon /mnt/${swap_size_gib}GiB.swap
echo "/mnt/${swap_size_gib}GiB.swap swap swap defaults 0 0" | sudo tee -a /etc/fstab
cd /tmp
curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_1.19.0-latest.tar.gz
tar -xf kasm_release*.tar.gz
sudo bash kasm_release/install.sh -L $local_port
sudo apt update
sudo apt install nginx certbot python3-certbot-nginx -y
sudo certbot certonly --nginx -d $domain
sudo cat << 'EOF' > /etc/nginx/sites-available/$domain
server {
listen 443 ssl;
server_name $domain;
ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem;
location / {
# WebSocket Support
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Host and X headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Should match the listening port of this proxy
proxy_set_header X-Forwarded-Port 443;
# Connectivity Options
proxy_http_version 1.1;
proxy_read_timeout 1800s;
proxy_send_timeout 1800s;
proxy_connect_timeout 1800s;
proxy_buffering off;
# Allow large requests to support file uploads to sessions
client_max_body_size 10M;
# Proxy to Kasm Workspaces running locally on $local_port using ssl
proxy_pass https://127.0.0.1:$local_port;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/$domain /etc/nginx/sites-enabled/$domain
sudo nginx -t
sudo systemctl restart nginx
sudo docker restart kasm_api
sudo shutdown -r +7
+44 -50
View File
@@ -12,7 +12,6 @@ tmpDir='/tmp/generalssss'
tmp_customscripts_dir="$tmpDir/customscripts"
finalDir='/usr/share/customscripts'
packages="7zip apache2 argon2 avahi-daemon btop build-essential byobu cargo cifs-utils clamav cmake cowsay cracklib-runtime detox docker.io exiftool fdupes ffuf gcc-arm-none-eabi grc gzip iotop iptraf-ng jq kpartx libnss-mdns libnewlib-arm-none-eabi librust-git2+openssl-probe-dev libstdc++-arm-none-eabi-newlib locales lynx net-tools nginx openssl php polygen polygen-data procps python3 python3-scapy resolvconf restic ripgrep samba screen seclists snapd thefuck unzip wget xrdp xxd xz-utils zip kali-linux-default"
# packages="grc kpartx openssl cracklib-runtime argon2 jq polygen polygen-data apache2 seclists cmake locales python3 build-essential gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib librust-git2+openssl-probe-dev cargo nginx build-essential cowsay iotop iptraf-ng btop screen byobu thefuck wget lynx zip unzip 7zip xz-utils gzip net-tools clamav php restic cifs-utils detox fdupes ripgrep avahi-daemon libnss-mdns xxd xrdp libimage-exiftool-perl kali-tools-hardware kali-tools-crypto-stego kali-tools-fuzzing kali-tools-bluetooth kali-tools-rfid kali-tools-sdr kali-tools-voip kali-tools-802-11 kali-tools-forensics samba procps snapd"
echo -e "\nSTARTING!\n\tUsing Shell $SHELL\n"
@@ -73,49 +72,48 @@ if [ ! -z "$1" ]; then
# echo -e "\nhaveibeenpwned-downloader installed, skipping install\n"
# fi
# homebrew
# if [ ! $(which brew) ]; then
# ## install homebrew
# echo -e "\nlinuxbrew not found, installing\n"
# bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
# test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
# ### add to rcfile
# if ! grep -q 'linuxbrew' $rcfile; then
# # echo "adding linuxbrew to $rcfile"
# # echo "# linuxbrew (homebrew/brew)" >> $rcfile
# # echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> $rcfile
# else
# echo "linuxbrew already in $rcfile skipping"
# fi
#
# # source $rcfile
# else
# echo -e "\nlinuxbrew installed, skipping install\n"
# # source $rcfile
# fi
# ### install ponysay
# if [ ! $(which ponysay) ]; then
# echo -e "\nponysay not fonud, installiing\n"
# brew install ponysay
# if ! grep 'ponysay fix' $rcfile; then
# # echo "adding ponysay fix to $rcfile"
# # echo -e "# ponysay fix\nexport PYTHONWARNINGS=ignore::SyntaxWarning" >> $rcfile
# # source $rcfile
# else
# # echo "ponysay fix already in $rcfile skipping"
# # source $rcfile
# fi
# else
# echo -e "\nponysay already installed, skipping\n"
# fi
if [ ! $(which brew) ]; then
## install homebrew
echo -e "\nlinuxbrew not found, installing\n"
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
test -d /home/linuxbrew/.linuxbrew && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
### add to rcfile
if ! grep -q 'linuxbrew' $rcfile; then
echo "adding linuxbrew to $rcfile"
echo "# linuxbrew (homebrew/brew)" >> $rcfile
echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> $rcfile
else
echo "linuxbrew already in $rcfile skipping"
fi
else
echo -e "\nlinuxbrew installed, skipping install\n"
fi
### install ponysay
if [ ! $(which ponysay) ]; then
echo -e "\nponysay not fonud, installiing\n"
brew install ponysay
if ! grep 'ponysay fix' $rcfile; then
echo "adding ponysay fix to $rcfile"
echo -e "# ponysay fix\nexport PYTHONWARNINGS=ignore::SyntaxWarning" >> $rcfile
source $rcfile
else
echo "ponysay fix already in $rcfile skipping"
source $rcfile
fi
else
echo -e "\nponysay already installed, skipping\n"
fi
# cargo
## oniux
echo -e "\nINSTALLIN TOR ONIUX\n"
if [ -f /usr/local/bin/oniux ]; then
echo -e "\nexisting oniux found, skipping\n"
else
echo -e "\nexisting oniux not found, installing\n"
cargo install --git https://gitlab.torproject.org/tpo/core/oniux --tag v0.6.1 oniux
cd /tmp && cargo install --git https://gitlab.torproject.org/tpo/core/oniux && cd - && echo -e '## Oniux/Cargo Shit\nPATH=$PATH:$HOME/.cargo/bin' >> ~/.bashrc && source ~/.bashrc && oniux curl https://canhazip.com
fi
else
@@ -160,7 +158,7 @@ git clone $gitRepo $tmpDir --single-branch --depth 1
# donut
echo -e "\nCompiling donut\n"
gcc -o "$tmp_customscripts_dir/donut" "$tmp_customscripts_dir/donut.c" -lm # 2>/dev/null
gcc -o "$tmp_customscripts_dir/donut" "$tmp_customscripts_dir/donut.c" -lm 2>/dev/null
# put the customscripts dir into place
echo -e "\nPlacing in $finalDir\n"
@@ -181,10 +179,10 @@ pathgrep=$?
if [ $pathgrep -eq 0 ]; then
echo -e "\n$finalDir Already in \$PATH Skipping Append\n"
fi
# else
# echo -e "\nAdding $finalDir to $username's \$PATH by Appending to $rcfile\n"
# echo -e "\n\n# automatically added by customscripts installer\nexport PATH=\"\$PATH:$finalDir\"" >> "$rcfile"
# fi
else
# echo -e "\nAdding $finalDir to $username's \$PATH by Appending to $rcfile\n"
# echo -e "\n\n# automatically added by customscripts installer\nexport PATH=\"\$PATH:$finalDir\"" >> "$rcfile"
fi
# install pishrink if not there
if [ ! -f /usr/local/bin/pishrink ]; then
@@ -204,15 +202,11 @@ if [ ! -d $userhome/.local/share/blesh ]; then
cd /tmp
git clone --recursive --depth 1 --shallow-submodules --single-branch -b master https://github.com/akinomyoga/ble.sh.git
make -C ble.sh install PREFIX=~/.local
# echo '# ble.sh' >> $rcfile
# echo "source -- ~/.local/share/blesh/ble.sh" >> $rcfile
# source $rcfile
# exec "$SHELL"
echo '# ble.sh' >> $rcfile
echo "source -- ~/.local/share/blesh/ble.sh" >> $rcfile
else
echo -e "\nble.sh already installed, skippping\n"
fi
# else
# echo -e "\nble.sh already installed, skippping\n"
# source $rcfile
# fi
$SHELL -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv bash)"' >> "$rcfile"
-85
View File
@@ -1,85 +0,0 @@
#!/bin/bash
# usage
## curl -s https://raw.githubusercontent.com/PrincessPi3/general-scripts-and-system-ssssssetup/refs/heads/main/customscripts/python_pyenv_setup.sh | sudo "$SHELL" && source ~/.zshrc && exec "$SHELL" && pyenv install 3:latest && pyenv global 3:latest
# set -e
# set rcfile
rcfile="$HOME/.zshrc" # zsh
# rcfile="$USER/.bashrc" # bash
package_log="/home/princesspi/python_packages_removed.txt"
# check if a command exists, and if so, purge that package
# usage: check_purge_package <package_name>
check_purge_package () {
package_name=$1
# which -s $package_name 2>/dev/null 1>/dev/null # silently test for command
# package_check=$? # get return code. 0 for found, any other for not found
# if [ $package_check -eq 0 ]; then # if package is found, purge it
echo "purging $package_name"
sudo apt purge $package_name -y 2>>"$package_log" 1>>"$package_log"
echo "finished purging $package_name"
# else # otherwise skip
# echo "no $package_name installation found, skipping uninstall"
#fi
}
# cleanup previous python installs
# check_purge_package pyenv*
# check_purge_package python3*
# check_purge_package python2*
# check_purge_package python*
# check_purge_package pip*
# check_purge_package pip3*
# check_purge_package pip2*
# cleanup
# echo "Autoremoving packages"
# sudo apt autoremove -y 2>>"$package_log" 1>>"$package_log"
# echo -e "DONE CLEARING OLD PACKAGES!\n\tRemoved packages logged to $package_log"
if [ -d $HOME/.pyenv ]; then
echo "Removing existing pyenv installation"
rm -rf $HOME/.pyenv
else
echo "No existing pyenv installation found, skipping removal"
fi
# install pyenv
curl -fsSL https://pyenv.run | bash
## setup shell
### check for pyenv in rcfile
grep -q .pyenv $rcfile
rc_pyenv_check=$? # get retcode, 0 for found not 0 for not found
if [ $rc_pyenv_check -eq 0 ]; then # if pyenv found
echo "pyenv already set up in $rcfile, skipping add init"
else # if pyenv not found
echo "Setting up pyenv in $rcfile"
echo -e "\n# pyenv setup" >> $rcfile
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> $rcfile
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> $rcfile
echo 'eval "$(pyenv init - zsh)"' >> $rcfile
fi
## add aliases
### check for aliases in rcfile
grep -q '## python aliases' $rcfile
rc_pyalias_check=$? # get retcode, 0 for found not 0 for not found
if [ $rc_pyalias_check -eq 0 ]; then # if aliases found
echo "pyenv aliases already set up in $rcfile, skipping"
else # if aliases not found, add python shit
echo "Setting up pyenv aliases in $rcfile"
echo "## python aliases" >> $rcfile
echo 'alias py=python' >> $rcfile
echo 'alias py3=python' >> $rcfile
echo 'alias py2=python' >> $rcfile
echo 'alias python3=python' >> $rcfile
echo 'alias python2=python' >> $rcfile
echo 'alias pip3=pip' >> $rcfile
echo -e "alias pip2=pip\n" >> $rcfile
fi
echo -e "\n\ndone~ :3~\n\treset shell with exec \"\$SHELL\"\n"
+40
View File
@@ -0,0 +1,40 @@
#!/bin/bash
# Usage:
## Install Tor
### sudo apt update; sudo apt install tor -y
## Edit /etc/tor/torrc
### sudo nano /etc/tor/torrc
#### Uncomment or add
##### ControlPort 9051
#### Ucomment and change to (default value is 1, change to 0)
##### CookieAuthentication 0
## Enable, Start, and Restart Tor
### sudo systemctl enable tor; sudo systemctl start tor; sleep 20; sudo systemctl restart tor
# Configuration
TARGET_URL="https://canhazip.com"
TOR_PROXY="socks5h://127.0.0.1:9050"
TOR_CONTROL_PORT=9051
DELAY=2 # Delay in seconds between requests
# Ensure you respect HIBP's API rate limits and terms of service
while true; do
echo "[+] Requesting new Tor identity..."
# Send NEWNYM signal to Tor Control Port to switch IP
echo -e 'AUTHENTICATE ""\r\nsignal NEWNYM\r\nQUIT' | nc 127.0.0.1 9051 > /dev/null
# Give Tor a brief moment to establish the new circuit
sleep "$DELAY"
echo "[+] Verifying current IP..."
CURRENT_IP=$(curl -s --proxy "$TOR_PROXY" https://canhazip.com)
echo "[+] Current Tor IP: $CURRENT_IP"
echo "[+] Sending request to Have I Been Pwned..."
# 'socks5h://' ensures DNS resolution happens through Tor, preventing leaks
curl -s --proxy "$TOR_PROXY" -H "hibp-api-key: YOUR_API_KEY" "$TARGET_URL"
echo -e "\n[+] Waiting for next iteration...\n"
sleep "$DELAY"
done