rpi: check hash of rpicamera binaries after download (#4012) (#4600)

This commit is contained in:
Alessandro Ros
2025-06-02 20:32:50 +02:00
committed by GitHub
parent 06abf6f679
commit bf9df762ca
3 changed files with 45 additions and 16 deletions

View File

@@ -0,0 +1 @@
c5f4db9d0fd05bfb8e692c1f33d06d9f06b93084706bcf384ee2a823757f4299

View File

@@ -0,0 +1 @@
f3499c34dc6190f158098fa457893d76b410b0e99386b19dd3888e9ed12bab25

View File

@@ -3,7 +3,10 @@ package main
import (
"archive/tar"
"bytes"
"compress/gzip"
"crypto/sha256"
"encoding/hex"
"errors"
"fmt"
"io"
@@ -54,6 +57,45 @@ func dumpTar(src io.Reader) error {
return nil
}
func doSingle(version string, f string) error {
err := os.RemoveAll(strings.TrimSuffix(f, ".tar.gz"))
if err != nil {
return err
}
res, err := http.Get("https://github.com/bluenviron/mediamtx-rpicamera/releases/download/" + version + "/" + f)
if err != nil {
return err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return fmt.Errorf("bad status code: %v", res.StatusCode)
}
buf, err := io.ReadAll(res.Body)
if err != nil {
return err
}
hashBuf, err := os.ReadFile("./mtxrpicamdownloader/HASH_" + strings.ToUpper(strings.ReplaceAll(f, ".", "_")))
if err != nil {
return err
}
str := strings.TrimSpace(string(hashBuf))
hash, err := hex.DecodeString(str)
if err != nil {
return err
}
if sum := sha256.Sum256(buf); !bytes.Equal(sum[:], hash) {
return fmt.Errorf("hash mismatch")
}
return dumpTar(bytes.NewReader(buf))
}
func do() error {
buf, err := os.ReadFile("./mtxrpicamdownloader/VERSION")
if err != nil {
@@ -64,22 +106,7 @@ func do() error {
log.Printf("downloading mediamtx-rpicamera %s...", version)
for _, f := range []string{"mtxrpicam_32.tar.gz", "mtxrpicam_64.tar.gz"} {
err = os.RemoveAll(strings.TrimSuffix(f, ".tar.gz"))
if err != nil {
return err
}
res, err := http.Get("https://github.com/bluenviron/mediamtx-rpicamera/releases/download/" + version + "/" + f)
if err != nil {
return err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return fmt.Errorf("bad status code: %v", res.StatusCode)
}
err = dumpTar(res.Body)
err = doSingle(version, f)
if err != nil {
return err
}