init repo
This commit is contained in:
commit
87b3cbca26
|
@ -0,0 +1,2 @@
|
||||||
|
.DS_Store
|
||||||
|
bfile_cli
|
|
@ -0,0 +1,5 @@
|
||||||
|
module blek/bfile_cli
|
||||||
|
|
||||||
|
go 1.21.3
|
||||||
|
|
||||||
|
require github.com/alecthomas/kong v0.8.1 // indirect
|
|
@ -0,0 +1,2 @@
|
||||||
|
github.com/alecthomas/kong v0.8.1 h1:acZdn3m4lLRobeh3Zi2S2EpnXTd1mOL6U7xVml+vfkY=
|
||||||
|
github.com/alecthomas/kong v0.8.1/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U=
|
|
@ -0,0 +1,111 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
import "fmt"
|
||||||
|
import "time"
|
||||||
|
import "mime"
|
||||||
|
import "bytes"
|
||||||
|
import "strings"
|
||||||
|
import "net/http"
|
||||||
|
import "io/ioutil"
|
||||||
|
import "path/filepath"
|
||||||
|
import "mime/multipart"
|
||||||
|
import "net/textproto"
|
||||||
|
|
||||||
|
import "github.com/alecthomas/kong"
|
||||||
|
|
||||||
|
var Args struct {
|
||||||
|
Upload struct {
|
||||||
|
Filename string `optional:"" short:"n" help:"A short name by which the file can be accessed"`
|
||||||
|
File string `arg:"" help:"The URL or a path to a file to upload"`
|
||||||
|
|
||||||
|
Instance string `arg:"" help:"The URL of the instance to upload the file to"`
|
||||||
|
Tos bool `short:"t" default:"false"`
|
||||||
|
} `cmd:"" help:"Upload a file"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func upload(args *kong.Context) {
|
||||||
|
|
||||||
|
if strings.HasSuffix(Args.Upload.Instance, "/") {
|
||||||
|
fmt.Fprintf(os.Stderr, "Error: instance URL must not end with /\n")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! Args.Upload.Tos {
|
||||||
|
fmt.Println("You must agree to the ToS!");
|
||||||
|
fmt.Println("It can be found at", Args.Upload.Instance + "/tos")
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := os.Stat(Args.Upload.File); err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "Error: can't read file %s\n", Args.Upload.File)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
body := &bytes.Buffer{}
|
||||||
|
writer := multipart.NewWriter(body)
|
||||||
|
|
||||||
|
ftype := mime.TypeByExtension(filepath.Ext(Args.Upload.File))
|
||||||
|
if ftype == "" {
|
||||||
|
ftype = "application/x-octet-stream"
|
||||||
|
}
|
||||||
|
|
||||||
|
fileHeader := textproto.MIMEHeader{}
|
||||||
|
fileHeader.Set("Content-Type", ftype)
|
||||||
|
fileHeader.Set("Content-Disposition", fmt.Sprintf("form-data; name=\"file\"; filename=\"%s\"", Args.Upload.File))
|
||||||
|
part, err := writer.CreatePart(fileHeader)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
tosHeader := textproto.MIMEHeader{}
|
||||||
|
tosHeader.Set("Content-Type", "text/plain")
|
||||||
|
tosHeader.Set("Content-Disposition", fmt.Sprintf("form-data; name=\"tos_consent\"; filename=\"%s\"", Args.Upload.File))
|
||||||
|
tos, err := writer.CreatePart(tosHeader)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
tos.Write([]byte("on"))
|
||||||
|
|
||||||
|
file, err := ioutil.ReadFile(Args.Upload.File)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
part.Write([]byte(file))
|
||||||
|
|
||||||
|
writer.Close()
|
||||||
|
|
||||||
|
req, err := http.NewRequest("POST", Args.Upload.Instance + "/curlapi/upload", body)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cType := writer.FormDataContentType()
|
||||||
|
req.Header.Set("Content-Type", cType)
|
||||||
|
req.Header.Set("Content-Length", fmt.Sprintf("%d", body.Len()))
|
||||||
|
|
||||||
|
client := &http.Client{Timeout: 120 * time.Second}
|
||||||
|
api, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer api.Body.Close()
|
||||||
|
data, err := ioutil.ReadAll(api.Body)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Println(string(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
args := kong.Parse(&Args)
|
||||||
|
|
||||||
|
switch args.Command() {
|
||||||
|
case "upload <file> <instance>":
|
||||||
|
upload(args)
|
||||||
|
default:
|
||||||
|
panic(args.Command())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue