func (self *ApierV1) ExportCdrsToZipString(attr utils.AttrExpFileCdrs, reply *string) error { tmpDir := "/tmp" attr.ExportDir = &tmpDir // Enforce exporting to tmp always so we avoid cleanup issues efc := utils.ExportedFileCdrs{} if err := self.ExportCdrsToFile(attr, &efc); err != nil { return err } else if efc.TotalRecords == 0 || len(efc.ExportedFilePath) == 0 { return errors.New("No CDR records to export") } // Create a buffer to write our archive to. buf := new(bytes.Buffer) // Create a new zip archive. w := zip.NewWriter(buf) // read generated file content, err := ioutil.ReadFile(efc.ExportedFilePath) if err != nil { return err } exportFileName := path.Base(efc.ExportedFilePath) f, err := w.Create(exportFileName) if err != nil { return err } _, err = f.Write(content) if err != nil { return err } // Write metadata into a separate file with extension .cgr medaData, err := json.MarshalIndent(efc, "", " ") if err != nil { errors.New("Failed creating metadata content") } medatadaFileName := exportFileName[:len(path.Ext(exportFileName))] + ".cgr" mf, err := w.Create(medatadaFileName) if err != nil { return err } _, err = mf.Write(medaData) if err != nil { return err } // Make sure to check the error on Close. if err := w.Close(); err != nil { return err } if err := os.Remove(efc.ExportedFilePath); err != nil { fmt.Errorf("Failed removing exported file at path: %s", efc.ExportedFilePath) } *reply = base64.StdEncoding.EncodeToString(buf.Bytes()) return nil }