mirror of https://github.com/statping/statping
				
				
				
			bulk import services based on CSV
							parent
							
								
									adf8cdab20
								
							
						
					
					
						commit
						359c00c250
					
				
							
								
								
									
										7
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										7
									
								
								Makefile
								
								
								
								
							| 
						 | 
				
			
			@ -6,13 +6,14 @@ GOCMD=go
 | 
			
		|||
GOBUILD=$(GOCMD) build -a
 | 
			
		||||
GOTEST=$(GOCMD) test
 | 
			
		||||
GOGET=$(GOCMD) get
 | 
			
		||||
GOVERSION=1.12.x
 | 
			
		||||
GOINSTALL=$(GOCMD) install
 | 
			
		||||
XGO=GOPATH=$(GOPATH) xgo -go 1.12.x --dest=build
 | 
			
		||||
XGO=GOPATH=$(GOPATH) xgo -go $(GOVERSION) --dest=build
 | 
			
		||||
BUILDVERSION=-ldflags "-X main.VERSION=${VERSION} -X main.COMMIT=$(TRAVIS_COMMIT)"
 | 
			
		||||
RICE=$(GOPATH)/bin/rice
 | 
			
		||||
PATH:=/usr/local/bin:$(GOPATH)/bin:$(PATH)
 | 
			
		||||
PUBLISH_BODY='{ "request": { "branch": "master", "message": "Homebrew update version v${VERSION}", "config": { "env": { "VERSION": "${VERSION}", "COMMIT": "$(TRAVIS_COMMIT)" } } } }'
 | 
			
		||||
TRAVIS_BUILD_CMD='{ "request": { "branch": "master", "message": "Compile master for Statping v${VERSION}", "config": { "os": [ "linux" ], "language": "go", "go": [ "1.12.x" ], "go_import_path": "github.com/hunterlong/statping", "install": true, "sudo": "required", "services": [ "docker" ], "env": { "VERSION": "${VERSION}" }, "matrix": { "allow_failures": [ { "go": "master" } ], "fast_finish": true }, "before_deploy": [ "git config --local user.name \"hunterlong\"", "git config --local user.email \"info@socialeck.com\"", "git tag v$(VERSION) --force"], "deploy": [ { "provider": "releases", "api_key": "$(GH_TOKEN)", "file_glob": true, "file": "build/*", "skip_cleanup": true } ], "notifications": { "email": false }, "before_script": ["gem install sass"], "script": [ "wget -O statping.gpg $(SIGN_URL)", "gpg --import statping.gpg", "travis_wait 30 docker pull karalabe/xgo-latest", "make release" ], "after_success": [], "after_deploy": [ "make publish-homebrew" ] } } }'
 | 
			
		||||
TRAVIS_BUILD_CMD='{ "request": { "branch": "master", "message": "Compile master for Statping v${VERSION}", "config": { "os": [ "linux" ], "language": "go", "go": [ "${GOVERSION}" ], "go_import_path": "github.com/hunterlong/statping", "install": true, "sudo": "required", "services": [ "docker" ], "env": { "VERSION": "${VERSION}" }, "matrix": { "allow_failures": [ { "go": "master" } ], "fast_finish": true }, "before_deploy": [ "git config --local user.name \"hunterlong\"", "git config --local user.email \"info@socialeck.com\"", "git tag v$(VERSION) --force"], "deploy": [ { "provider": "releases", "api_key": "$(GH_TOKEN)", "file_glob": true, "file": "build/*", "skip_cleanup": true } ], "notifications": { "email": false }, "before_script": ["gem install sass"], "script": [ "wget -O statping.gpg $(SIGN_URL)", "gpg --import statping.gpg", "travis_wait 30 docker pull karalabe/xgo-latest", "make release" ], "after_success": [], "after_deploy": [ "make publish-homebrew" ] } } }'
 | 
			
		||||
TEST_DIR=$(GOPATH)/src/github.com/hunterlong/statping
 | 
			
		||||
PATH:=$(PATH)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +157,7 @@ docker-build-dev:
 | 
			
		|||
 | 
			
		||||
# build Cypress UI testing :cypress docker tag
 | 
			
		||||
docker-build-cypress: clean
 | 
			
		||||
	GOPATH=$(GOPATH) xgo -out statping -go 1.12.x -ldflags "-X main.VERSION=${VERSION} -X main.COMMIT=$(TRAVIS_COMMIT)" --targets=linux/amd64 ./cmd
 | 
			
		||||
	GOPATH=$(GOPATH) xgo -out statping -go $(GOVERSION) -ldflags "-X main.VERSION=${VERSION} -X main.COMMIT=$(TRAVIS_COMMIT)" --targets=linux/amd64 ./cmd
 | 
			
		||||
	docker build -t hunterlong/statping:cypress -f dev/Dockerfile-cypress .
 | 
			
		||||
	rm -f statping
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -85,6 +85,7 @@ func Router() *mux.Router {
 | 
			
		|||
	r.Handle("/settings/build", authenticated(saveAssetsHandler, true)).Methods("GET")
 | 
			
		||||
	r.Handle("/settings/delete_assets", authenticated(deleteAssetsHandler, true)).Methods("GET")
 | 
			
		||||
	r.Handle("/settings/export", authenticated(exportHandler, true)).Methods("GET")
 | 
			
		||||
	r.Handle("/settings/bulk_import", authenticated(bulkImportHandler, true)).Methods("POST")
 | 
			
		||||
 | 
			
		||||
	// SERVICE Routes
 | 
			
		||||
	r.Handle("/services", http.HandlerFunc(servicesHandler)).Methods("GET")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,14 +16,18 @@
 | 
			
		|||
package handlers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/hunterlong/statping/core"
 | 
			
		||||
	"github.com/hunterlong/statping/source"
 | 
			
		||||
	"github.com/hunterlong/statping/types"
 | 
			
		||||
	"github.com/hunterlong/statping/utils"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func settingsHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
| 
						 | 
				
			
			@ -103,6 +107,90 @@ func deleteAssetsHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		|||
	ExecuteResponse(w, r, "settings.gohtml", core.CoreApp, "/settings")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func bulkImportHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	var fileData bytes.Buffer
 | 
			
		||||
	file, _, err := r.FormFile("file")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		utils.Log(3, fmt.Errorf("error bulk import services: %v", err))
 | 
			
		||||
		w.Write([]byte(err.Error()))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer file.Close()
 | 
			
		||||
 | 
			
		||||
	io.Copy(&fileData, file)
 | 
			
		||||
	data := fileData.String()
 | 
			
		||||
 | 
			
		||||
	for i, line := range strings.Split(strings.TrimSuffix(data, "\n"), "\n")[1:] {
 | 
			
		||||
		col := strings.Split(line, ",")
 | 
			
		||||
 | 
			
		||||
		newService, err := commaToService(col)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			utils.Log(3, fmt.Errorf("issue with row %v: %v", i, err))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		service := core.ReturnService(newService)
 | 
			
		||||
		_, err = service.Create(true)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			utils.Log(3, fmt.Errorf("cannot create service %v: %v", col[0], err))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		utils.Log(1, fmt.Sprintf("Created new service %v", service.Name))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ExecuteResponse(w, r, "settings.gohtml", core.CoreApp, "/settings")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// commaToService will convert a CSV comma delimited string slice to a Service type
 | 
			
		||||
// this function is used for the bulk import services feature
 | 
			
		||||
func commaToService(s []string) (*types.Service, error) {
 | 
			
		||||
	if len(s) != 16 {
 | 
			
		||||
		err := fmt.Errorf("does not have the expected amount of %v columns for a service", 16)
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	interval, err := time.ParseDuration(s[4])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	timeout, err := time.ParseDuration(s[9])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	allowNotifications, err := strconv.ParseBool(s[10])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public, err := strconv.ParseBool(s[11])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newService := &types.Service{
 | 
			
		||||
		Name:               s[0],
 | 
			
		||||
		Domain:             s[1],
 | 
			
		||||
		Expected:           types.NewNullString(s[2]),
 | 
			
		||||
		ExpectedStatus:     int(utils.ToInt(s[3])),
 | 
			
		||||
		Interval:           int(utils.ToInt(interval.Seconds())),
 | 
			
		||||
		Type:               s[5],
 | 
			
		||||
		Method:             s[6],
 | 
			
		||||
		PostData:           types.NewNullString(s[7]),
 | 
			
		||||
		Port:               int(utils.ToInt(s[8])),
 | 
			
		||||
		Timeout:            int(utils.ToInt(timeout.Seconds())),
 | 
			
		||||
		AllowNotifications: types.NewNullBool(allowNotifications),
 | 
			
		||||
		Public:             types.NewNullBool(public),
 | 
			
		||||
		GroupId:            int(utils.ToInt(s[12])),
 | 
			
		||||
		Headers:            types.NewNullString(s[13]),
 | 
			
		||||
		Permalink:          types.NewNullString(s[14]),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return newService, nil
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseForm(r *http.Request) url.Values {
 | 
			
		||||
	r.ParseForm()
 | 
			
		||||
	return r.PostForm
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
name,domain,expected,expected_status,interval,type,method,post_data,port,timeout,order,allow_notifications,public,group_id,headers,permalink
 | 
			
		||||
Bulk Upload,http://google.com,,200,60s,http,get,,,60s,1,true,true,,Authorization=example,bulk_example
 | 
			
		||||
		
		
			
  | 
| 
						 | 
				
			
			@ -139,6 +139,19 @@
 | 
			
		|||
                            <a class="btn btn-sm btn-primary" href={{safeURL QrAuth}}>Open in Statping App</a>
 | 
			
		||||
                        {{end}}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                        <h3 class="mt-3">Bulk Import Services</h3>
 | 
			
		||||
                        You can import multiple services based on a CSV file with the format shown on the <a href="https://github.com/hunterlong/statping/wiki/Bulk-Import-Services" target="_blank">Bulk Import Wiki</a>.
 | 
			
		||||
 | 
			
		||||
                        <form action="/settings/bulk_import" method="POST" enctype="multipart/form-data" class="form-inline">
 | 
			
		||||
                            <div class="form-group">
 | 
			
		||||
                                <input type="file" name="file" class="form-control-file" accept=".csv">
 | 
			
		||||
                            </div>
 | 
			
		||||
                            <div class="form-group">
 | 
			
		||||
                                <button type="submit" class="btn btn-success ml-3">Upload</button>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </form>
 | 
			
		||||
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    <div class="tab-pane" id="v-pills-style" role="tabpanel" aria-labelledby="v-pills-style-tab">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
// Code generated by go generate; DO NOT EDIT.
 | 
			
		||||
// This file was generated by robots at
 | 
			
		||||
// 2019-05-02 15:16:38.134302 -0700 PDT m=+0.921403151
 | 
			
		||||
// 2019-05-14 12:12:36.365798 -0700 PDT m=+0.459353534
 | 
			
		||||
//
 | 
			
		||||
// This contains the most recently Markdown source for the Statping Wiki.
 | 
			
		||||
package source
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
0.80.57
 | 
			
		||||
0.80.58
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue