ipfs-node-pin/main.go
Alexandre Bruyant 11f23aab6c
All checks were successful
Create and publish a Docker image / build-and-push-image (push) Successful in 55s
Remove first body read
2024-01-08 13:15:05 +01:00

138 lines
3.0 KiB
Go

package main
import (
"encoding/json"
"fmt"
"io"
"io/fs"
"net/http"
"os"
"path/filepath"
"gitea.bruyant.xyz/alexandre/ipfs-node-pin/ipfsnodepin"
"github.com/sethvargo/go-githubactions"
)
type AddResponse struct {
Bytes int64
Hash string
Name string
Size string
}
func main() {
githubactions.Debugf("Checking inputs")
path := githubactions.GetInput("path_to_add")
if path == "" {
githubactions.Fatalf("Missing: path_to_add")
}
ipfsHost := githubactions.GetInput("ipfs_host")
if ipfsHost == "" {
githubactions.Fatalf("Missing: ipfs_host")
}
ipfsPort := githubactions.GetInput("ipfs_port")
if ipfsPort == "" {
githubactions.Fatalf("Missing: ipfs_port")
}
targetPath, err := os.Open(path)
if err != nil {
githubactions.Fatalf("Unable to access path_to_add: %v", err.Error())
}
defer targetPath.Close()
targetPathInfo, err := targetPath.Stat()
if err != nil {
githubactions.Fatalf("Unable to access to access path_to_add info: %v", fmt.Errorf("%w", err))
}
if !targetPathInfo.IsDir() {
githubactions.Fatalf("%v is not a directory", path)
}
githubactions.Debugf("Inputs OK")
body, writer := io.Pipe()
targetUrl := fmt.Sprintf("http://%v:%v/api/v0/add", ipfsHost, ipfsPort)
req, err := http.NewRequest(http.MethodPost, targetUrl, body)
if err != nil {
githubactions.Fatalf("Unable to create request: %v", err.Error())
}
q := req.URL.Query()
q.Add("progress", "false")
q.Add("stream-true", "false")
req.URL.RawQuery = q.Encode()
mwriter := ipfsnodepin.NewIpfsMultipartWriter(writer)
req.Header.Add("Content-Type", mwriter.FormDataContentType())
go func() {
defer writer.Close()
defer mwriter.Close()
err = filepath.Walk(path, func(innerPath string, info fs.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
w, err := mwriter.CreateIpfsFilePart(innerPath)
if err != nil {
return err
}
fileReader, err := os.Open(innerPath)
if err != nil {
return err
}
defer fileReader.Close()
written, err := io.Copy(w, fileReader)
if err != nil {
return fmt.Errorf("error copying %s (%d bytes written): %v", innerPath, written, err)
}
return nil
})
if err != nil {
githubactions.Fatalf("Unable to create request body: %v", fmt.Errorf("%w", err))
}
}()
githubactions.Debugf("Calling node API...")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
githubactions.Fatalf(err.Error())
}
d := json.NewDecoder(res.Body)
addResponses := make([]*AddResponse, 0)
for {
var addResponse AddResponse
if err := d.Decode(&addResponse); err == io.EOF {
break
} else if err != nil {
githubactions.Warningf("Failed to unmarshal response: %v", fmt.Errorf("%w", err))
}
githubactions.Infof("Unmarshaled response: %v", addResponse)
addResponses = append(addResponses, &addResponse)
}
for _, addResponse := range addResponses {
if (*addResponse).Name == path {
githubactions.SetOutput("cid", addResponse.Hash)
break
}
}
}