# set-executionpolicy unrestricted # Check if running as administrator if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Write-Host "This script requires administrator privileges. Attempting to restart as administrator..." -ForegroundColor Yellow # Get the current script path $scriptPath = $MyInvocation.MyCommand.Path # Restart the script with administrator privileges try { Start-Process PowerShell -Verb RunAs -ArgumentList "-ExecutionPolicy Bypass -File `"$scriptPath`"" exit } catch { Write-Error "Failed to restart as administrator. Please run this script as administrator manually." Write-Host "Right-click on PowerShell and select 'Run as administrator', then run this script again." -ForegroundColor Red pause exit 1 } } Write-Host "Running with administrator privileges." -ForegroundColor Green # Check for updates from Gitea repository Write-Host "Checking for updates..." -ForegroundColor Cyan $baseUrl = "https://gitea.andrewspolytechnic.com" $repoPath = "sandrews/windows-install" $updateScriptDir = $PSScriptRoot $lastUpdateCheck = $null $updateCheckFile = Join-Path -Path $updateScriptDir -ChildPath "last_update_check.txt" try { # Check if we've checked for updates in the last 24 hours if (Test-Path $updateCheckFile) { $lastUpdateCheck = Get-Content $updateCheckFile | Get-Date $timeSinceLastCheck = (Get-Date) - $lastUpdateCheck if ($timeSinceLastCheck.TotalHours -lt 24) { Write-Host "Last update check was less than 24 hours ago. Skipping update check." -ForegroundColor DarkGray # Continue with the script } else { # Time to check for updates again $checkForUpdates = $true } } else { # First time running update check $checkForUpdates = $true } if ($checkForUpdates) { # Create a temporary directory to download files $tempDir = Join-Path -Path $env:TEMP -ChildPath "windows-install-update" if (Test-Path $tempDir) { Remove-Item $tempDir -Recurse -Force } New-Item -ItemType Directory -Path $tempDir -Force | Out-Null # Try different URL patterns for Gitea zip download $possibleUrls = @( "$baseUrl/$repoPath/archive/master.zip", "$baseUrl/$repoPath/archive/refs/heads/master.zip", "$baseUrl/api/v1/repos/$repoPath/archive/master.zip" ) $downloadSuccess = $false $zipPath = Join-Path -Path $tempDir -ChildPath "update.zip" $ProgressPreference = 'SilentlyContinue' # Hide progress bar to speed up download foreach ($zipUrl in $possibleUrls) { Write-Host "Trying to download updates from $zipUrl..." -ForegroundColor Cyan try { Invoke-WebRequest -Uri $zipUrl -OutFile $zipPath -UseBasicParsing -TimeoutSec 10 # Check if the download was successful (file exists and is not empty) if (Test-Path $zipPath -and (Get-Item $zipPath).Length -gt 0) { $downloadSuccess = $true Write-Host "Download successful!" -ForegroundColor Green break # Exit the loop if download was successful } } catch { Write-Host "Failed with this URL: $_" -ForegroundColor DarkGray # Continue to the next URL } } if ($downloadSuccess) { try { # Extract the zip file Write-Host "Extracting update package..." -ForegroundColor Cyan Expand-Archive -Path $zipPath -DestinationPath $tempDir -Force # Find the extracted directory $extractedDir = Get-ChildItem -Path $tempDir -Directory | Select-Object -First 1 if ($extractedDir -and (Test-Path $extractedDir.FullName)) { # Copy all files except .git directory to current location Write-Host "Installing updates..." -ForegroundColor Cyan Get-ChildItem -Path $extractedDir.FullName | Where-Object { $_.Name -ne ".git" } | ForEach-Object { $destPath = Join-Path -Path $updateScriptDir -ChildPath $_.Name Copy-Item -Path $_.FullName -Destination $destPath -Recurse -Force } # Record the update time Get-Date -Format "yyyy-MM-dd HH:mm:ss" | Out-File -FilePath $updateCheckFile -Force Write-Host "Update completed successfully!" -ForegroundColor Green # Suggest restarting the script with the updated version $restartChoice = Read-Host "The script has been updated. Would you like to restart the script to use the updated version? (Y/N)" if ($restartChoice -eq "Y" -or $restartChoice -eq "y") { Write-Host "Restarting script..." -ForegroundColor Cyan Start-Process PowerShell -Verb RunAs -ArgumentList "-ExecutionPolicy Bypass -File `"$PSCommandPath`"" exit } } else { Write-Host "Could not find extracted update directory." -ForegroundColor Yellow } } catch { Write-Host "Error extracting or installing updates: $_" -ForegroundColor Yellow } } else { Write-Host "Could not download updates from any of the tried URLs." -ForegroundColor Yellow } # Clean up if (Test-Path $tempDir) { try { Remove-Item $tempDir -Recurse -Force -ErrorAction SilentlyContinue } catch { Write-Host "Could not clean up temp directory: $_" -ForegroundColor DarkGray } } } } catch { Write-Host "Error checking for updates: $_" -ForegroundColor Yellow Write-Host "Continuing with current version..." -ForegroundColor Yellow } $uid = $Env:UserName # Get the directory where this script is located $scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path # Copy SSH directory from Nextcloud synchronized location if it exists $sshSourceDir = "C:\Users\$uid\Nextcloud\Documents\Important_Docs\.ssh" $sshDestDir = "C:\Users\$uid\.ssh" if (Test-Path -Path $sshSourceDir) { Copy-Item -Path $sshSourceDir -Destination $sshDestDir -Recurse -Force Write-Host "Copied SSH directory from Nextcloud to: $sshDestDir" } else { Write-Host "Important_Docs/.ssh directory not found at: $sshSourceDir. Skipping SSH key copy." -ForegroundColor Yellow } python "$scriptDir\Python\NextcloudClientFix.py" # Nextcloud - Copy sync-exclude.lst to AppData Write-Host "Configuring Nextcloud sync exclusions..." # Define the source and destination paths for sync-exclude.lst $syncExcludeSource = "$scriptDir\sync-exclude.lst" $nextcloudAppDataDir = "$env:APPDATA\Nextcloud" $syncExcludeDestination = Join-Path -Path $nextcloudAppDataDir -ChildPath "sync-exclude.lst" # Check if the source file exists if (Test-Path -Path $syncExcludeSource) { # Ensure the Nextcloud AppData directory exists if (-not (Test-Path -Path $nextcloudAppDataDir)) { try { New-Item -Path $nextcloudAppDataDir -ItemType Directory -Force | Out-Null Write-Host "Created Nextcloud directory at: $nextcloudAppDataDir" } catch { Write-Warning "Failed to create Nextcloud directory: $_" } } # Copy the sync-exclude.lst file try { Copy-Item -Path $syncExcludeSource -Destination $syncExcludeDestination -Force Write-Host "Copied sync-exclude.lst to $syncExcludeDestination" } catch { Write-Warning "Failed to copy sync-exclude.lst: $_" } } else { Write-Warning "sync-exclude.lst not found at: $syncExcludeSource" }