Alexandre Bruyant
195c92a5ec
All checks were successful
Create and publish a Docker image / build-and-push-image (push) Successful in 1m24s
145 lines
3.2 KiB
Go
145 lines
3.2 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())
|
|
}
|
|
|
|
githubactions.Debugf("Reading response...")
|
|
resBody, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
githubactions.Fatalf(err.Error())
|
|
}
|
|
|
|
githubactions.Debugf("Response: %v", string(resBody))
|
|
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
|
|
}
|
|
}
|
|
}
|