Skip to content
This repository was archived by the owner on Apr 3, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions mayday.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/coreos/mayday/mayday/plugins/rkt"
mtar "github.com/coreos/mayday/mayday/tar"
"github.com/coreos/mayday/mayday/tarable"
"github.com/coreos/mayday/mayday/upload"

"github.com/spf13/pflag"
"github.com/spf13/viper"
Expand Down Expand Up @@ -65,14 +66,18 @@ func openFile(f File) (*file.MaydayFile, error) {
func main() {
pflag.StringP("config", "c", configDefault, "path configuration file (in place of profile)")
pflag.BoolP("danger", "d", false, "collect potentially sensitive information (ex, container logs)")
pflag.BoolP("upload", "u", false, "upload dump to CoreOS support")
pflag.StringP("profile", "p", "", "set of data to be collected (default: everything)")
pflag.StringP("output", "o", "", "output file (default: /tmp/mayday-{hostname}-{current time}.tar.gz)")
pflag.StringP("upload-server", "s", "http://localhost:8080", "mayday ingestion service server")

// binds cli flag "danger" to viper config danger, etc.
viper.BindPFlag("danger", pflag.Lookup("danger"))
viper.BindPFlag("config", pflag.Lookup("config"))
viper.BindPFlag("output", pflag.Lookup("output"))
viper.BindPFlag("profile", pflag.Lookup("profile"))
viper.BindPFlag("upload", pflag.Lookup("upload"))
viper.BindPFlag("upload-server", pflag.Lookup("upload-server"))
// cli arg takes precendence over anything in config files
pflag.Parse()

Expand Down Expand Up @@ -197,6 +202,17 @@ func main() {
t.Init(tarfile, now)

mayday.Run(t, tarables)
if viper.GetBool("upload") {
log.Print("uploading to mayday ingestion service")
_, err = tarfile.Seek(0, 0)
res, err := upload.Upload(tarfile)
if err != nil {
log.Printf("error uploading to ingestion service: %s", err)
} else {
log.Printf("access token: %s", res.Access)
}
}

t.Close()

log.Printf("Output saved in %v\n", outputFile)
Expand Down
65 changes: 65 additions & 0 deletions mayday/upload/upload.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package upload

import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"log"
"mime/multipart"
"net/http"

"github.com/spf13/viper"
)

type UploadResponse struct {
Sha string `json:"sha"`
Access string `json:"access_key"`
}

var apiVersion = "/v1"

func Upload(reader io.Reader) (*UploadResponse, error) {

bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)

// TODO don't just ignore this error
machineId, _ := ioutil.ReadFile("/etc/machine-id")
bodyWriter.WriteField("machine_id", string(machineId))

var res *UploadResponse

fileWriter, err := bodyWriter.CreateFormFile("targz", "mayday.tar.gz")
if err != nil {
fmt.Println("error writing to buffer")
return res, err
}

_, err = io.Copy(fileWriter, reader)
if err != nil {
return res, err
}

contentType := bodyWriter.FormDataContentType()
bodyWriter.Close()

log.Print(viper.GetString("upload-server") + apiVersion + "/upload")
resp, err := http.Post(viper.GetString("upload-server")+apiVersion+"/upload", contentType, bodyBuf)
if err != nil {
return res, err
}
defer resp.Body.Close()
resp_body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return res, err
}

if resp.StatusCode != 200 {
return res, errors.New(string(resp_body))
}
err = json.Unmarshal(resp_body, &res)
return res, nil
}