From 8d207f81905d479d781f99b41e62faa30b36d3e8 Mon Sep 17 00:00:00 2001 From: sneak Date: Tue, 17 Mar 2020 20:52:29 -0700 Subject: [PATCH] initial --- Makefile | 79 ++++++++++++++++++++++++++++++++++++++ cmd/api/main.go | 17 ++++++++ datavibe/api.go | 100 ++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 9 +++++ go.sum | 36 +++++++++++++++++ 5 files changed, 241 insertions(+) create mode 100644 Makefile create mode 100644 cmd/api/main.go create mode 100644 datavibe/api.go create mode 100644 go.mod create mode 100644 go.sum diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..804a3f3 --- /dev/null +++ b/Makefile @@ -0,0 +1,79 @@ +VERSION := $(shell git rev-parse --short HEAD) +BUILDTIME := $(shell date -u '+%Y-%m-%dT%H:%M:%SZ') +BUILDTIMEFILENAME := $(shell date -u '+%Y%m%d-%H%M%SZ') +BUILDTIMETAG := $(shell date -u '+%Y%m%d%H%M%S') +BUILDUSER := $(shell whoami) +BUILDHOST := $(shell hostname -s) +BUILDARCH := $(shell uname -m) + +FN := api +IMAGENAME := datavibe/$(FN) + +UNAME_S := $(shell uname -s) + +GOLDFLAGS += -X main.Version=$(VERSION) +GOLDFLAGS += -X main.Buildarch=$(BUILDARCH) + +# osx can't statically link apparently?! +ifeq ($(UNAME_S),Darwin) + GOFLAGS := -ldflags "$(GOLDFLAGS)" +endif + +ifneq ($(UNAME_S),Darwin) + GOFLAGS = -ldflags "-linkmode external -extldflags -static $(GOLDFLAGS)" +endif + +default: run + +rundebug: build + GOTRACEBACK=all DEBUG=1 ./$(FN) + +run: build + ./$(FN) + +clean: + -rm ./$(FN) + +build: ./$(FN) + +.lintsetup: + go get -v -u golang.org/x/lint/golint + go get -u github.com/GeertJohan/fgt + touch .lintsetup + +lint: fmt .lintsetup + fgt golint ./... + +go-get: + cd cmd/$(FN) && go get -v + +./$(FN): */*.go cmd/*/*.go go-get + cd cmd/$(FN) && go build -o ../../$(FN) $(GOFLAGS) . + +fmt: + gofmt -s -w . + +test: lint build-docker-image + +is_uncommitted: + git diff --exit-code >/dev/null 2>&1 + +build-docker-image: clean + docker build -t $(IMAGENAME) . + +build-docker-image-dist: is_uncommitted clean + docker build -t $(IMAGENAME):$(VERSION) -t $(IMAGENAME):latest -t $(IMAGENAME):$(BUILDTIMETAG) . + +dist: lint build-docker-image + -mkdir -p ./output + docker run --rm --entrypoint cat $(IMAGENAME) /bin/$(FN) > output/$(FN) + docker save $(IMAGENAME) | bzip2 > output/$(BUILDTIMEFILENAME).$(FN).tbz2 + +hub: upload-docker-image + +upload-docker-image: build-docker-image + docker push $(IMAGENAME):$(VERSION) + docker push $(IMAGENAME):$(BUILDTIMETAG) + docker push $(IMAGENAME):latest + +.PHONY: build fmt test is_uncommitted build-docker-image dist hub upload-docker-image clean run rundebug default build-docker-image-dist diff --git a/cmd/api/main.go b/cmd/api/main.go new file mode 100644 index 0000000..70aabff --- /dev/null +++ b/cmd/api/main.go @@ -0,0 +1,17 @@ +package main + +import "os" + +import "git.eeqj.de/datavibe/api/datavibe" + +// these are filled in at link-time by the build scripts + +// Version is the git version of the app +var Version string + +// Buildarch contains the architecture it is compiled for +var Buildarch string + +func main() { + os.Exit(datavibe.APIEntry(Version, Buildarch)) +} diff --git a/datavibe/api.go b/datavibe/api.go new file mode 100644 index 0000000..59a4137 --- /dev/null +++ b/datavibe/api.go @@ -0,0 +1,100 @@ +package datavibe + +import "os" +import "time" + +import "github.com/jinzhu/gorm" +import _ "github.com/jinzhu/gorm/dialects/sqlite" // required for orm + +import "github.com/rs/zerolog" +import "github.com/rs/zerolog/log" + +import "github.com/mattn/go-isatty" + +func APIEntry(version string, buildarch string) int { + a := new(API) + a.version = version + a.buildarch = buildarch + a.setupLogging() + return a.runForever() +} + +// Feta is the main structure/process of this app +type API struct { + version string + buildarch string + //api *Server + db *gorm.DB + startup time.Time +} + +func (a *API) identify() { + log.Info(). + Str("version", a.version). + Str("buildarch", a.buildarch). + Msg("starting") +} + +func (a *API) setupLogging() { + + log.Logger = log.With().Caller().Logger() + + tty := isatty.IsTerminal(os.Stdin.Fd()) || isatty.IsCygwinTerminal(os.Stdin.Fd()) + + if tty { + out := zerolog.NewConsoleWriter( + func(w *zerolog.ConsoleWriter) { + // Customize time format + w.TimeFormat = time.RFC3339 + }, + ) + log.Logger = log.Output(out) + } + + // always log in UTC + zerolog.TimestampFunc = func() time.Time { + return time.Now().UTC() + } + + zerolog.SetGlobalLevel(zerolog.InfoLevel) + if os.Getenv("DEBUG") != "" { + zerolog.SetGlobalLevel(zerolog.DebugLevel) + } + + a.identify() +} + +func (a *API) uptime() time.Duration { + return time.Since(a.startup) +} + +/* +func (f *Feta) setupDatabase() { + var err error + f.db, err = gorm.Open("sqlite3", "feta.sqlite") + + if err != nil { + panic(err) + } + + //f.databaseMigrations() +} +*/ + +func (a *API) runForever() int { + a.startup = time.Now() + + //f.setupDatabase() + + home := os.Getenv("HOME") + if home == "" { + panic("can't find home directory") + } + + // FIXME(sneak) + for { + time.Sleep(1 * time.Second) + } + + return 0 +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..615c285 --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module git.eeqj.de/datavibe/api + +go 1.13 + +require ( + github.com/jinzhu/gorm v1.9.12 + github.com/mattn/go-isatty v0.0.12 + github.com/rs/zerolog v1.18.0 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e071609 --- /dev/null +++ b/go.sum @@ -0,0 +1,36 @@ +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/jinzhu/gorm v1.9.12 h1:Drgk1clyWT9t9ERbzHza6Mj/8FY/CqMyVzOiHviMo6Q= +github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= +github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.18.0 h1:CbAm3kP2Tptby1i9sYy2MGRg0uxIN9cyDb59Ys7W8z8= +github.com/rs/zerolog v1.18.0/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=