JOJ3/pkg/healthcheck/verify.go
2024-09-11 07:44:10 -04:00

93 lines
2.7 KiB
Go

package healthcheck
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
// getChecksum calculates the SHA-256 checksum of a file
func getChecksum(filePath string) (string, error) {
// Open the file
file, err := os.Open(filePath)
if err != nil {
return "", err
}
defer file.Close()
// Calculate SHA-256
hash := sha256.New()
if _, err := io.Copy(hash, file); err != nil {
return "", err
}
return hex.EncodeToString(hash.Sum(nil)), nil
}
// checkFileChecksum checks if a single file's checksum matches the expected value
func checkFileChecksum(rootDir, fileName, expectedChecksum string) (bool, string) {
filePath := filepath.Join(rootDir, strings.TrimSpace(fileName))
actualChecksum, err := getChecksum(filePath)
if err != nil {
return false, fmt.Sprintf("Error reading file %s: %v", filePath, err)
}
if actualChecksum == expectedChecksum {
return true, ""//fmt.Sprintf("Checksum for %s passed!", filePath)
} else {
return false, fmt.Sprintf("Checksum for %s failed. Expected %s, but got %s. Please revert the changes!", filePath, expectedChecksum, actualChecksum)
}
}
func VerifyFiles(rootDir string,checkFileNameList string, checkFileSumList string ) error {
// Parse command-line arguments
// checkFileNameList := flag.String("checkFileNameList", "", "Comma-separated list of files to check.")
// checkFileSumList := flag.String("checkFileSumList", "", "Comma-separated list of expected checksums.")
// rootDir := flag.String("rootDir", ".", "Root directory containing the files.")
// flag.Parse()
// Process input file names and checksums
fileNames := strings.Split(checkFileNameList, ",")
checkSums := strings.Split(checkFileSumList, ",")
// Check if the number of files matches the number of checksums
if len(fileNames) == 0 {
return nil//fmt.Errorf("No checksum happened")
}
if len(fileNames) != len(checkSums) {
return fmt.Errorf("Error: The number of files and checksums do not match.")
os.Exit(1)
}
allPassed := true
var errorMessages []string
// Check each file's checksum
for i, fileName := range fileNames {
expectedChecksum := strings.TrimSpace(checkSums[i])
passed, message := checkFileChecksum(rootDir, fileName, expectedChecksum)
if message != "" {
return fmt.Errorf(message)
}
if !passed {
allPassed = false
errorMessages = append(errorMessages, message)
}
}
fmt.Printf("test")
if allPassed {
return nil//fmt.Errorf("Congratulations! All checksums passed!")
} else {
return fmt.Errorf("Some checksums failed. Please review the errors below:")
for _, msg := range errorMessages {
return fmt.Errorf(msg)
}
return fmt.Errorf("Please revert your changes or contact the teaching team if you have a valid reason for adjusting them.")
}
return nil
}