1
0
Fork 0
forked from jriou/coller

Initial commit

Signed-off-by: Julien Riou <julien@riou.xyz>
This commit is contained in:
Julien Riou 2025-08-21 16:22:03 +02:00
commit ef9aca1f3b
Signed by: jriou
GPG key ID: 9A099EDA51316854
26 changed files with 1668 additions and 0 deletions

118
src/cmd/copier/main.go Normal file
View file

@ -0,0 +1,118 @@
package main
import (
"flag"
"fmt"
"io"
"log/slog"
"net/http"
"os"
"syscall"
"git.riou.xyz/jriou/coller/internal"
"golang.org/x/term"
)
var (
AppName = "copier"
AppVersion string
GoVersion string
GitCommit string
)
func handleMain() int {
flag.Usage = usage
version := flag.Bool("version", false, "Print version and exit")
quiet := flag.Bool("quiet", false, "Log errors only")
verbose := flag.Bool("verbose", false, "Print more logs")
debug := flag.Bool("debug", false, "Print even more logs")
password := flag.String("password", os.Getenv("COPIER_PASSWORD"), "Password to decrypt the note")
askPassword := flag.Bool("w", false, "Read password from input")
fileName := flag.String("file", "", "Write content of the note to a file")
flag.Parse()
if flag.NArg() != 1 {
usage()
return internal.RC_ERROR
}
url := flag.Args()[0]
if *version {
internal.ShowVersion(AppName, AppVersion, GitCommit, GoVersion)
return internal.RC_OK
}
var level slog.Level
if *debug {
level = slog.LevelDebug
}
if *verbose {
level = slog.LevelInfo
}
if *quiet {
level = slog.LevelError
}
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: level}))
if *askPassword {
fmt.Print("Password: ")
p, err := term.ReadPassword(int(syscall.Stdin))
if err != nil {
logger.Error("could not read password", slog.Any("error", err))
return internal.RC_ERROR
}
*password = string(p)
}
logger.Debug("parsing url", slog.Any("url", url))
r, err := http.Get(url)
if err != nil {
logger.Error("could not retreive note", slog.Any("error", err))
return internal.RC_ERROR
}
logger.Debug("decoding body")
body, err := io.ReadAll(r.Body)
if err != nil {
logger.Error("could not read response", slog.Any("error", err))
return internal.RC_ERROR
}
var content []byte
if *password != "" {
logger.Debug("decrypting note")
content, err = internal.Decrypt(body, *password)
if err != nil {
logger.Error("could not decrypt paste", slog.Any("error", err))
return internal.RC_ERROR
}
} else {
content = body
}
if *fileName != "" {
logger.Debug("writing output to file", slog.Any("file", *fileName))
err = os.WriteFile(*fileName, content, 0644)
if err != nil {
logger.Error("could not write output to file", slog.Any("error", err))
return internal.RC_ERROR
}
} else {
fmt.Printf("%s", content)
}
return internal.RC_OK
}
func usage() {
fmt.Printf("Usage: %s [OPTIONS] URL\n", os.Args[0])
flag.PrintDefaults()
}
func main() {
os.Exit(handleMain())
}