setting uyp for image backup and restore
This commit is contained in:
parent
998ae4295b
commit
c624ac4c67
82
handlers.go
82
handlers.go
|
@ -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)
|
||||||
|
}
|
||||||
|
|
1
main.go
1
main.go
|
@ -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{
|
||||||
|
|
|
@ -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."
|
|
@ -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"
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
404 page not found
|
Loading…
Reference in New Issue