setting uyp for image backup and restore

This commit is contained in:
Steve White 2024-10-23 17:02:19 -05:00
parent 998ae4295b
commit c624ac4c67
5 changed files with 159 additions and 2 deletions

View File

@ -1,12 +1,17 @@
package main package main
import ( import (
"archive/tar"
"compress/gzip"
"context" "context"
"crypto/md5"
"encoding/hex"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"os" "os"
"path/filepath"
"strings" "strings"
"time" "time"
@ -411,3 +416,80 @@ func AuthMiddleware(next http.Handler) http.Handler {
next.ServeHTTP(w, r) next.ServeHTTP(w, r)
}) })
} }
func GetImageArchiveHandler(w http.ResponseWriter, r *http.Request) {
// Create a pipe to write the archive to
pr, pw := io.Pipe()
// Create an MD5 hash writer
hash := md5.New()
// Use a MultiWriter to write to both the pipe and the hash
multiWriter := io.MultiWriter(pw, hash)
// Start a goroutine to create the archive
go func() {
defer pw.Close()
gzipWriter := gzip.NewWriter(multiWriter)
defer gzipWriter.Close()
tarWriter := tar.NewWriter(gzipWriter)
defer tarWriter.Close()
err := filepath.Walk(config.ImageStorageDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
header, err := tar.FileInfoHeader(info, info.Name())
if err != nil {
return err
}
relPath, err := filepath.Rel(config.ImageStorageDir, path)
if err != nil {
return err
}
header.Name = relPath
if err := tarWriter.WriteHeader(header); err != nil {
return err
}
if !info.IsDir() {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(tarWriter, file)
if err != nil {
return err
}
}
return nil
})
if err != nil {
pw.CloseWithError(err)
}
}()
// Set headers
w.Header().Set("Content-Type", "application/gzip")
w.Header().Set("Content-Disposition", "attachment; filename=images.tar.gz")
// Copy the archive to the response writer
_, err := io.Copy(w, pr)
if err != nil {
http.Error(w, fmt.Sprintf("Error sending archive: %v", err), http.StatusInternalServerError)
return
}
// Calculate and set the MD5 sum header
md5sum := hex.EncodeToString(hash.Sum(nil))
w.Header().Set("X-Archive-MD5", md5sum)
}

View File

@ -88,6 +88,7 @@ func main() {
managementRouter.Handle("/user/{id}", http.HandlerFunc(DeleteUserHandler)).Methods("DELETE", "OPTIONS") managementRouter.Handle("/user/{id}", http.HandlerFunc(DeleteUserHandler)).Methods("DELETE", "OPTIONS")
managementRouter.Handle("/db", http.HandlerFunc(BackupDatabaseHandler)).Methods("GET", "OPTIONS") managementRouter.Handle("/db", http.HandlerFunc(BackupDatabaseHandler)).Methods("GET", "OPTIONS")
managementRouter.Handle("/db", http.HandlerFunc(RestoreDatabaseHandler)).Methods("POST", "OPTIONS") managementRouter.Handle("/db", http.HandlerFunc(RestoreDatabaseHandler)).Methods("POST", "OPTIONS")
managementRouter.Handle("/imagearchive", http.HandlerFunc(GetImageArchiveHandler)).Methods("GET", "OPTIONS")
// Apply CORS middleware // Apply CORS middleware
c := cors.New(cors.Options{ c := cors.New(cors.Options{

View File

@ -0,0 +1,73 @@
#!/bin/bash
# Set variables
SERVER_URL="http://localhost:8080" # Replace with your server URL
ENDPOINT="/admin/imagearchive"
OUTPUT_FILE="images.tar.gz"
EXTRACT_DIR="extracted_images"
USERNAME=boxuser
PASSWORD=boxuser
AUTH_TOKEN=$(curl -s -X POST -H "Content-Type: application/json" \
-d "{\"username\":\"$USERNAME\", \"password\":\"$PASSWORD\"}" \
"$SERVER_URL/api/v1/login" | jq -r '.token')
echo $AUTH_TOKEN
# Function to check if a command exists
command_exists () {
type "$1" &> /dev/null ;
}
# Check if required commands exist
if ! command_exists curl || ! command_exists md5sum || ! command_exists tar; then
echo "Error: This script requires curl, md5sum, and tar. Please install them and try again."
exit 1
fi
# Download the archive
echo "Downloading archive..."
HTTP_RESPONSE=$(curl -s -w "HTTPSTATUS:%{http_code}" -o "$OUTPUT_FILE" \
-H "Authorization: Bearer $AUTH_TOKEN" \
"$SERVER_URL/api/v1/login")
HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
if [ $HTTP_STATUS -ne 200 ]; then
echo "Error: HTTP Status $HTTP_STATUS"
echo "Response: $HTTP_BODY"
exit 1
fi
# Get MD5 sum from header
HEADER_MD5=$(curl -sI -H "Authorization: Bearer $AUTH_TOKEN" "$SERVER_URL$ENDPOINT" | grep X-Archive-MD5 | cut -d' ' -f2 | tr -d '\r')
# Calculate MD5 sum of downloaded file
CALCULATED_MD5=$(md5sum "$OUTPUT_FILE" | cut -d' ' -f1)
echo "MD5 from header: $HEADER_MD5"
echo "Calculated MD5: $CALCULATED_MD5"
# Compare MD5 sums
if [ "$HEADER_MD5" = "$CALCULATED_MD5" ]; then
echo "MD5 sums match. File integrity verified."
else
echo "MD5 sums do not match. File may be corrupted."
exit 1
fi
# Extract the archive
echo "Extracting archive..."
mkdir -p "$EXTRACT_DIR"
tar -xzvf "$OUTPUT_FILE" -C "$EXTRACT_DIR"
# List contents of extracted directory
echo "Contents of extracted archive:"
find "$EXTRACT_DIR" -type f | sed "s|$EXTRACT_DIR/||"
# Clean up
echo "Cleaning up..."
rm "$OUTPUT_FILE"
rm -r "$EXTRACT_DIR"
echo "Test completed successfully."

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# API base URL # API base URL
API_BASE_URL="http://localhost:8080" API_BASE_URL="http://localhost:8080/api/v1"
# Login credentials # Login credentials
USERNAME="boxuser" USERNAME="boxuser"
@ -15,4 +15,4 @@ TOKEN=$(curl -s -X POST -H "Content-Type: application/json" \
curl -X GET \ curl -X GET \
$API_BASE_URL/admin/user \ $API_BASE_URL/admin/user \
-H "Authorization: Bearer $TOKEN" \ -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -H "Content-Type: application/json"

1
scripts/images.tar.gz Normal file
View File

@ -0,0 +1 @@
404 page not found