working rpaste
This commit is contained in:
parent
c901ee769b
commit
46bd2b7585
18
LICENSE
Normal file
18
LICENSE
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
Copyright 2021 Louis Abel <label@rockylinux.org>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
BIN
modules/paste/.rpaste.go.swp
Normal file
BIN
modules/paste/.rpaste.go.swp
Normal file
Binary file not shown.
@ -42,16 +42,27 @@ func runPaste(ctx *cli.Context) error {
|
|||||||
} else if !stdMethod && PasteData == "" {
|
} else if !stdMethod && PasteData == "" {
|
||||||
argList := os.Args
|
argList := os.Args
|
||||||
lastArg := argList[len(argList)-1]
|
lastArg := argList[len(argList)-1]
|
||||||
|
if lastArg != os.Args[0] {
|
||||||
fileBytes, err := ioutil.ReadFile(lastArg)
|
fileBytes, err := ioutil.ReadFile(lastArg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
PasteData = string(fileBytes)
|
PasteData = string(fileBytes)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final check to see if there's paste data
|
||||||
|
if PasteData == "" {
|
||||||
|
cli.ShowAppHelp(ctx)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
// Check that PasteData is text, and not binary
|
// Check that PasteData is text, and not binary
|
||||||
|
// fmt.Println("You cannot upload binary data.")
|
||||||
|
|
||||||
fmt.Println(PasteData)
|
//fmt.Println(PasteData)
|
||||||
|
|
||||||
|
Rpaste(ctx.String("life"), ctx.String("type"), PasteData)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,15 @@
|
|||||||
// support for rpaste (bpaste)
|
// support for rpaste (bpaste)
|
||||||
package paste
|
package paste
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
rpasteTimeMap = map[string]string{
|
rpasteTimeMap = map[string]string{
|
||||||
"1hour": "1hour",
|
"1hour": "1hour",
|
||||||
@ -8,3 +17,45 @@ var (
|
|||||||
"1week": "1week",
|
"1week": "1week",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func Rpaste(life string, lexer string, fileContent string) error {
|
||||||
|
payload := map[string]interface{}{
|
||||||
|
"expiry": life,
|
||||||
|
"files": []map[string]string{
|
||||||
|
{
|
||||||
|
"name": "paste",
|
||||||
|
"lexer": lexer,
|
||||||
|
"content": PasteData,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
payloadJson, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Could not marshal json")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Uploading...")
|
||||||
|
resp, err := http.Post("https://rpa.st/api/v1/paste", "application/json", bytes.NewBuffer(payloadJson))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Could not contact rpaste endpoint")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode == 200 {
|
||||||
|
var response map[string]interface{}
|
||||||
|
json.NewDecoder(resp.Body).Decode(&response)
|
||||||
|
url := fmt.Sprintf("%s", response["link"])
|
||||||
|
ss := strings.Split(url, "/")
|
||||||
|
slug := ss[len(ss)-1]
|
||||||
|
|
||||||
|
fmt.Printf("Paste URL: %s\n", response["link"])
|
||||||
|
fmt.Printf("Raw URL: https://rpa.st/raw/%s\n", slug)
|
||||||
|
fmt.Printf("Removal URL: %s\n", response["removal"])
|
||||||
|
} else {
|
||||||
|
fmt.Printf("ERROR: %d\n", resp.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -12,6 +12,7 @@ var (
|
|||||||
HelpTemplate = "\033[01;32m{{.Name}}\033[0m: {{.Usage}}\n\n" +
|
HelpTemplate = "\033[01;32m{{.Name}}\033[0m: {{.Usage}}\n\n" +
|
||||||
"Usage: {{.Name}} [options] [filepath]\n" +
|
"Usage: {{.Name}} [options] [filepath]\n" +
|
||||||
" command | {{.Name}} [options]\n\n" +
|
" command | {{.Name}} [options]\n\n" +
|
||||||
|
"This command can take a file or standard in as input\n\n" +
|
||||||
"Options:\n" +
|
"Options:\n" +
|
||||||
"{{range .VisibleFlags}}{{.}}\n" +
|
"{{range .VisibleFlags}}{{.}}\n" +
|
||||||
"{{end}}"
|
"{{end}}"
|
||||||
|
@ -5,10 +5,11 @@ package utility
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
_ "errors"
|
_ "errors"
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
_ "path"
|
_ "path"
|
||||||
_ "path/filepath"
|
_ "path/filepath"
|
||||||
_ "strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Check if this is a file
|
// Check if this is a file
|
||||||
@ -35,4 +36,13 @@ func IsExist(path string) (bool, error) {
|
|||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reads one-line text files (like for /sys or /proc) - Strips carriage returns
|
||||||
|
func Slurp(path string) string {
|
||||||
|
data, err := ioutil.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return strings.TrimSpace(string(data))
|
||||||
|
}
|
||||||
|
|
||||||
// todo: add string checking, we can't paste binary
|
// todo: add string checking, we can't paste binary
|
||||||
|
@ -13,10 +13,10 @@ func ExecutePipe(outbuffer *bytes.Buffer, stack ...*exec.Cmd) (err error) {
|
|||||||
i := 0
|
i := 0
|
||||||
|
|
||||||
for ; i < len(stack)-1; i++ {
|
for ; i < len(stack)-1; i++ {
|
||||||
stdin_pipe, stdoutpipe := io.Pipe()
|
stdinpipe, stdoutpipe := io.Pipe()
|
||||||
stack[i].Stdout = stdoutpipe
|
stack[i].Stdout = stdoutpipe
|
||||||
stack[i].Stderr = &errbuffer
|
stack[i].Stderr = &errbuffer
|
||||||
stack[i+1].Stdin = stdin_pipe
|
stack[i+1].Stdin = stdinpipe
|
||||||
pipestack[i] = stdoutpipe
|
pipestack[i] = stdoutpipe
|
||||||
}
|
}
|
||||||
|
|
||||||
|
50
modules/utility/system.go
Normal file
50
modules/utility/system.go
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package utility
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Not all of these are going to be used, but just in case. This is more of a
|
||||||
|
// reference just for me. I want to be able to support more than just EL for
|
||||||
|
// example and send to the "right" paste bins or some generic one.
|
||||||
|
var (
|
||||||
|
regexPrettyName = regexp.MustCompile(`^PRETTY_NAME=(.*)$`)
|
||||||
|
regexID = regexp.MustCompile(`^ID=(.*)$`)
|
||||||
|
regexVersionID = regexp.MustCompile(`^VERSION_ID=(.*)$`)
|
||||||
|
regexRockyName = regexp.MustCompile(`^Rocky( Linux)? release`)
|
||||||
|
regexOtherEL = regexp.MustCompile(`^(CentOS|Fedora|Red Hat Enterprise|AlmaLinux|Scientific)( Linux)? release`)
|
||||||
|
regexRedHatName = regexp.MustCompile(`^(Rocky|CentOS|Fedora|Red Hat Enterprise|AlmaLinux|Scientific)( Linux)? release`)
|
||||||
|
|
||||||
|
VendorName string
|
||||||
|
SystemVersion string
|
||||||
|
SystemPrettyName string
|
||||||
|
)
|
||||||
|
|
||||||
|
func SetPasteOnOS() string {
|
||||||
|
file, err := os.Open("/etc/os-release")
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
for scanner.Scan() {
|
||||||
|
if m := regexID.FindStringSubmatch(scanner.Text()); m != nil {
|
||||||
|
VendorName = strings.Trim(m[1], `"`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// default is set to rpaste elsewhere
|
||||||
|
switch VendorName {
|
||||||
|
case "rocky":
|
||||||
|
return "rpaste"
|
||||||
|
//setting.PasteBinService = "rpaste"
|
||||||
|
case "redhat", "fedora", "centos", "almalinux", "scientific":
|
||||||
|
return "fpaste"
|
||||||
|
//setting.PasteBinService = "fpaste"
|
||||||
|
}
|
||||||
|
|
||||||
|
return "rpaste"
|
||||||
|
}
|
14
rpaste.go
14
rpaste.go
@ -21,6 +21,7 @@ var (
|
|||||||
DefaultConf = "/etc/rpaste/rpaste.conf"
|
DefaultConf = "/etc/rpaste/rpaste.conf"
|
||||||
DefaultLexer = "text"
|
DefaultLexer = "text"
|
||||||
DefaultLifeTime = "1hour"
|
DefaultLifeTime = "1hour"
|
||||||
|
// This will end up being dynamic in the future
|
||||||
DefaultPasteBin = "rpaste"
|
DefaultPasteBin = "rpaste"
|
||||||
DefaultSysInfo = false
|
DefaultSysInfo = false
|
||||||
ShortOption = true
|
ShortOption = true
|
||||||
@ -40,7 +41,7 @@ func init() {
|
|||||||
func main() {
|
func main() {
|
||||||
app := &cli.App{
|
app := &cli.App{
|
||||||
Name: AppName,
|
Name: AppName,
|
||||||
Usage: "Paste utility originally made for the Rocky paste service",
|
Usage: "A paste utility originally made for the Rocky paste service",
|
||||||
Version: Version,
|
Version: Version,
|
||||||
// short options should be on
|
// short options should be on
|
||||||
UseShortOptionHandling: ShortOption,
|
UseShortOptionHandling: ShortOption,
|
||||||
@ -55,7 +56,8 @@ func main() {
|
|||||||
UsageText: `Paste utility used primarily for the Rocky Linux pastebin service.
|
UsageText: `Paste utility used primarily for the Rocky Linux pastebin service.
|
||||||
It can collect system information and forward it to a pastebin or simply
|
It can collect system information and forward it to a pastebin or simply
|
||||||
send regular text files. This utility is primarily used for asking for
|
send regular text files. This utility is primarily used for asking for
|
||||||
assistance in the Rocky Linux support venue.`,
|
assistance in the Rocky Linux community support venue. It can also be used on
|
||||||
|
other systems like Fedora and other Enterprise Linux distributions.`,
|
||||||
// list all commands below
|
// list all commands below
|
||||||
Commands: []*cli.Command{
|
Commands: []*cli.Command{
|
||||||
paste.PasteMethod,
|
paste.PasteMethod,
|
||||||
@ -88,12 +90,6 @@ assistance in the Rocky Linux support venue.`,
|
|||||||
Usage: "Collects general system information (disables stdin and file input)",
|
Usage: "Collects general system information (disables stdin and file input)",
|
||||||
Required: false,
|
Required: false,
|
||||||
},
|
},
|
||||||
// &cli.StringFlag{
|
|
||||||
// Name: "pastebin",
|
|
||||||
// Aliases: []string{"p"},
|
|
||||||
// Value: setting.PasteBinService,
|
|
||||||
// Usage: "Decides what pastebin to use",
|
|
||||||
// },
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// append the default flags to both the main and paste method
|
// append the default flags to both the main and paste method
|
||||||
@ -101,7 +97,7 @@ assistance in the Rocky Linux support venue.`,
|
|||||||
app.Flags = append(app.Flags, defaultFlags...)
|
app.Flags = append(app.Flags, defaultFlags...)
|
||||||
|
|
||||||
// Actions
|
// Actions
|
||||||
//app.Before = establishConfExistence
|
//app.Before = utility.SetPasteOnOS
|
||||||
app.Action = paste.PasteMethod.Action
|
app.Action = paste.PasteMethod.Action
|
||||||
|
|
||||||
// Verify reader is set
|
// Verify reader is set
|
||||||
|
Loading…
Reference in New Issue
Block a user