From b169e51549c070681840788fceff44ba21897504 Mon Sep 17 00:00:00 2001 From: Evan Tschuy Date: Mon, 12 Sep 2016 12:28:23 -0700 Subject: [PATCH] begin upload/ingestion/beltane support --- mayday.go | 16 ++++++++++ mayday/upload/upload.go | 65 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 mayday/upload/upload.go diff --git a/mayday.go b/mayday.go index 443cf60..59d3072 100644 --- a/mayday.go +++ b/mayday.go @@ -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" @@ -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() @@ -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) diff --git a/mayday/upload/upload.go b/mayday/upload/upload.go new file mode 100644 index 0000000..247be26 --- /dev/null +++ b/mayday/upload/upload.go @@ -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 +}