mirror of
https://github.com/beego/bee.git
synced 2024-11-25 15:00:55 +00:00
cf7aef47f0
Moved logging to the new logging infrastructure by removing the use of ColorLog() function. Added more documentation. Also fixed some typos in comments and function names.
155 lines
3.6 KiB
Go
155 lines
3.6 KiB
Go
// Copyright 2013 bee authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
|
// not use this file except in compliance with the License. You may obtain
|
|
// a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
// License for the specific language governing permissions and limitations
|
|
// under the License.
|
|
package main
|
|
|
|
import (
|
|
"archive/zip"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
var cmdRundocs = &Command{
|
|
UsageLine: "rundocs [-isDownload=true] [-docport=8888]",
|
|
Short: "rundocs will run the docs server,default is 8089",
|
|
Long: `
|
|
-d meaning will download the docs file from github
|
|
-p meaning server the Server on which port, default is 8089
|
|
|
|
`,
|
|
}
|
|
|
|
var (
|
|
swaggerVersion = "2"
|
|
swaggerlink = "https://github.com/beego/swagger/archive/v" + swaggerVersion + ".zip"
|
|
)
|
|
|
|
type docValue string
|
|
|
|
func (d *docValue) String() string {
|
|
return fmt.Sprint(*d)
|
|
}
|
|
|
|
func (d *docValue) Set(value string) error {
|
|
*d = docValue(value)
|
|
return nil
|
|
}
|
|
|
|
var isDownload docValue
|
|
var docport docValue
|
|
|
|
func init() {
|
|
cmdRundocs.Run = runDocs
|
|
cmdRundocs.Flag.Var(&isDownload, "isDownload", "weather download the Swagger Docs")
|
|
cmdRundocs.Flag.Var(&docport, "docport", "doc server port")
|
|
}
|
|
|
|
func runDocs(cmd *Command, args []string) int {
|
|
if isDownload == "true" {
|
|
downloadFromURL(swaggerlink, "swagger.zip")
|
|
err := unzipAndDelete("swagger.zip")
|
|
if err != nil {
|
|
logger.Errorf("Error while unzipping 'swagger.zip' file: %s", err)
|
|
}
|
|
}
|
|
if docport == "" {
|
|
docport = "8089"
|
|
}
|
|
if _, err := os.Stat("swagger"); err != nil && os.IsNotExist(err) {
|
|
logger.Fatal("No Swagger dist found. Run: bee rundocs -isDownload=true")
|
|
}
|
|
|
|
logger.Infof("Starting the docs server on: http://127.0.0.1:%s", docport)
|
|
|
|
err := http.ListenAndServe(":"+string(docport), http.FileServer(http.Dir("swagger")))
|
|
if err != nil {
|
|
logger.Fatalf("%s", err)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func downloadFromURL(url, fileName string) {
|
|
var down bool
|
|
if fd, err := os.Stat(fileName); err != nil && os.IsNotExist(err) {
|
|
down = true
|
|
} else if fd.Size() == int64(0) {
|
|
down = true
|
|
} else {
|
|
logger.Infof("'%s' already exists", fileName)
|
|
return
|
|
}
|
|
if down {
|
|
logger.Infof("Downloading '%s' to '%s'...", url, fileName)
|
|
output, err := os.Create(fileName)
|
|
if err != nil {
|
|
logger.Errorf("Error while creating '%s': %s", fileName, err)
|
|
return
|
|
}
|
|
defer output.Close()
|
|
|
|
response, err := http.Get(url)
|
|
if err != nil {
|
|
logger.Errorf("Error while downloading '%s': %s", url, err)
|
|
return
|
|
}
|
|
defer response.Body.Close()
|
|
|
|
n, err := io.Copy(output, response.Body)
|
|
if err != nil {
|
|
logger.Errorf("Error while downloading '%s': %s", url, err)
|
|
return
|
|
}
|
|
logger.Successf("%d bytes downloaded!", n)
|
|
}
|
|
}
|
|
|
|
func unzipAndDelete(src string) error {
|
|
logger.Infof("Unzipping '%s'...", src)
|
|
r, err := zip.OpenReader(src)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer r.Close()
|
|
|
|
rp := strings.NewReplacer("swagger-"+swaggerVersion, "swagger")
|
|
for _, f := range r.File {
|
|
rc, err := f.Open()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer rc.Close()
|
|
|
|
fname := rp.Replace(f.Name)
|
|
if f.FileInfo().IsDir() {
|
|
os.MkdirAll(fname, f.Mode())
|
|
} else {
|
|
f, err := os.OpenFile(
|
|
fname, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
_, err = io.Copy(f, rc)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
logger.Successf("Done! Deleting '%s'...", src)
|
|
return os.RemoveAll(src)
|
|
}
|