diff --git a/client/app/config.go b/client/app/config.go index 40eaf8a956..d0d6e2a55f 100644 --- a/client/app/config.go +++ b/client/app/config.go @@ -186,17 +186,17 @@ func (cfg *Config) Web(c *core.Core, mm *mm.MarketMaker, log dex.Logger, utc boo } return &webserver.Config{ - DataDir: filepath.Join(cfg.AppData, "srv"), - Core: c, - MarketMaker: mmCore, - Addr: cfg.WebAddr, - CustomSiteDir: cfg.SiteDir, - Logger: log, - UTC: utc, - CertFile: certFile, - KeyFile: keyFile, - Language: cfg.Language, - Tor: cfg.Tor, + DataDir: filepath.Join(cfg.AppData, "srv"), + Core: c, + MarketMaker: mmCore, + Addr: cfg.WebAddr, + CustomSiteDir: cfg.SiteDir, + Logger: log, + UTC: utc, + CertFile: certFile, + KeyFile: keyFile, + Language: cfg.Language, + Tor: cfg.Tor, MainLogFilePath: cfg.LogPath, } } diff --git a/client/webserver/api.go b/client/webserver/api.go index 89d7679032..adf216687f 100644 --- a/client/webserver/api.go +++ b/client/webserver/api.go @@ -4,11 +4,14 @@ package webserver import ( + "archive/zip" "encoding/hex" "encoding/json" "errors" "fmt" + "io" "net/http" + "os" "time" "decred.org/dcrdex/client/asset" @@ -2042,17 +2045,37 @@ func (s *WebServer) apiTakeAction(w http.ResponseWriter, r *http.Request) { writeJSON(w, simpleAck()) } +// apiExportAppLogs time stamps the application log, zips it and sends it back to +// the browser or webview as an attachment. Logfile names need to be distinct as +// webview will not overwite an existing file. func (s *WebServer) apiExportAppLogs(w http.ResponseWriter, r *http.Request) { - fmt.Printf("=== apiExportAppLogs->\n") - w.Header().Set("Content-Disposition", "attachment; filename=bwlogs.zip") - w.Header().Set("Content-Type", "text/plain") + timeString := time.Now().Format("2006-01-02T15_04_05") + zipAttachment := fmt.Sprintf("attachment; filename=bwlog_%s.zip", timeString) + + w.Header().Set("Content-Disposition", zipAttachment) + w.Header().Set("Content-Type", "application/octet-stream; type=zip") w.WriteHeader(http.StatusOK) - fmt.Printf("=== %s\n", s.mainLogFilePath) + zipWriter := zip.NewWriter(w) + defer zipWriter.Close() + + lf, err := os.Open(s.mainLogFilePath) + if err != nil { + log.Errorf("error opening bisonw log file: %v", err) + return + } + defer lf.Close() - // TODO(warrior) .. get the file ;-) + iow, err := zipWriter.Create("bwlog.txt") // only 1 file in zip header + if err != nil { + log.Errorf("error creating an io.Writer: %v", err) + return + } - fmt.Printf("=== <-apiExportAppLogs\n") + if _, err := io.Copy(iow, lf); err != nil { + log.Errorf("error copying bisonw log to zip writer: %v", err) + return + } } func (s *WebServer) redeemGameCode(w http.ResponseWriter, r *http.Request) { diff --git a/client/webserver/site/src/css/icons.scss b/client/webserver/site/src/css/icons.scss index 098e4a42e6..d25d7b963c 100644 --- a/client/webserver/site/src/css/icons.scss +++ b/client/webserver/site/src/css/icons.scss @@ -155,6 +155,12 @@ display: inline-block; } +.ico-wide-headed-down-arrow::before { + content: "\e919"; + display: inline-block; + transform: rotate(270deg); +} + .ico-arrowup::before { content: "\e90c"; display: inline-block; diff --git a/client/webserver/site/src/html/settings.tmpl b/client/webserver/site/src/html/settings.tmpl index 21377506b1..eeaccf3471 100644 --- a/client/webserver/site/src/html/settings.tmpl +++ b/client/webserver/site/src/html/settings.tmpl @@ -77,7 +77,7 @@
- [[[export_logs]]] + [[[export_logs]]]