diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc2faa1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/vendor +/bin +/.env \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5e6ea9a --- /dev/null +++ b/Makefile @@ -0,0 +1,30 @@ +export GO111MODULE := on + +build: bin/server + +bin/server: vendor + CGO_ENABLED=0 go build -v -o ./bin/server ./cmd/server + +watch: + modd + +test: + go test -v ./... + +lint: + PATH=$(PATH):./bin/gometalinter gometalinter -e '.*/pkg/mod' --vendor ./... + +vendor: + go mod tidy + +install-devtools: vendor + # Install modd + GO111MODULE=off go get -u github.com/cortesi/modd/cmd/modd + # Install Gometalinter + bash misc/gometalinter/install.sh -b ./bin/gometalinter + +clean: + rm -rf ./bin + go clean -i -x -r -modcache + +.PHONY: test clean generate vendor install-devtools lint watch \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..32395be --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Orion + +Récepteur GNSS/RTK pour les topographes et chefs de chantier + +## Documentation + +[Voir la documentation](./doc) + +## License + +`TODO` \ No newline at end of file diff --git a/cmd/server/config.go b/cmd/server/config.go new file mode 100644 index 0000000..2a777d7 --- /dev/null +++ b/cmd/server/config.go @@ -0,0 +1,24 @@ +package main + +import ( + "github.com/caarlos0/env" +) + +type config struct { + HTTPHost string `env:"ORION_HTTP_HOST"` + HTTPPort string `env:"ORION_HTTP_PORT"` +} + +func overwriteFromEnv(conf *config) error { + if err := env.Parse(conf); err != nil { + return err + } + return nil +} + +func newDefaultConfig() *config { + return &config{ + HTTPHost: "0.0.0.0", + HTTPPort: "8888", + } +} diff --git a/cmd/server/main.go b/cmd/server/main.go new file mode 100644 index 0000000..452ee3f --- /dev/null +++ b/cmd/server/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "fmt" + "log" + "net/http" + + "github.com/go-chi/chi" + "github.com/go-chi/chi/middleware" +) + +var ( + conf = newDefaultConfig() +) + +func main() { + + if err := overwriteFromEnv(conf); err != nil { + log.Fatal(err) + } + + r := chi.NewRouter() + + r.Use(middleware.Recoverer) + r.Use(middleware.RequestID) + r.Use(middleware.RealIP) + r.Use(middleware.Logger) + + hostStr := fmt.Sprintf("%s:%s", conf.HTTPHost, conf.HTTPPort) + log.Printf("listening on http://%s", hostStr) + + if err := http.ListenAndServe(hostStr, r); err != nil { + log.Fatal(err) + } + +} diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..4116a0f --- /dev/null +++ b/doc/README.md @@ -0,0 +1,3 @@ +# Documentation + +- [Préparer son environnement de développement](./prepa-dev.md) \ No newline at end of file diff --git a/doc/prepa-dev.md b/doc/prepa-dev.md new file mode 100644 index 0000000..578699f --- /dev/null +++ b/doc/prepa-dev.md @@ -0,0 +1,18 @@ +# Préparer son environnement de développement + +### Dépendances + +- [Go >= 1.11](https://golang.org/dl/) + +### Procédure + +1. Installer les outils de développement. Cette opération va notamment générer les bindings Qt pour l'application `notebook`. **Cette étape peut durer un certain temps**. + + ```shell + make install-devtools + ``` + +2. Lancer le serveur + ```shell + make watch + ``` \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..dacfb13 --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module forge.cadoles.com/Pyxis/orion + +require ( + github.com/caarlos0/env v3.3.0+incompatible + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-chi/chi v3.3.3+incompatible + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.2.2 // indirect + golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3 // indirect + golang.org/x/text v0.3.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..ee69d7d --- /dev/null +++ b/go.sum @@ -0,0 +1,14 @@ +github.com/caarlos0/env v3.3.0+incompatible h1:jCfY0ilpzC2FFViyZyDKCxKybDESTwaR+ebh8zm6AOE= +github.com/caarlos0/env v3.3.0+incompatible/go.mod h1:tdCsowwCzMLdkqRYDlHpZCp2UooDD3MspDBjZ2AD02Y= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-chi/chi v3.3.3+incompatible h1:KHkmBEMNkwKuK4FdQL7N2wOeB9jnIx7jR5wsuSBEFI8= +github.com/go-chi/chi v3.3.3+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3 h1:czFLhve3vsQetD6JOJ8NZZvGQIXlnN3/yXxbT6/awxI= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/misc/gometalinter/install.sh b/misc/gometalinter/install.sh new file mode 100644 index 0000000..cc4249d --- /dev/null +++ b/misc/gometalinter/install.sh @@ -0,0 +1,388 @@ +#!/bin/sh +set -e +# Code generated by godownloader on 2018-09-06T00:26:55Z. DO NOT EDIT. +# + +usage() { + this=$1 + cat </dev/null +} +echoerr() { + echo "$@" 1>&2 +} +log_prefix() { + echo "$0" +} +_logp=6 +log_set_priority() { + _logp="$1" +} +log_priority() { + if test -z "$1"; then + echo "$_logp" + return + fi + [ "$1" -le "$_logp" ] +} +log_tag() { + case $1 in + 0) echo "emerg" ;; + 1) echo "alert" ;; + 2) echo "crit" ;; + 3) echo "err" ;; + 4) echo "warning" ;; + 5) echo "notice" ;; + 6) echo "info" ;; + 7) echo "debug" ;; + *) echo "$1" ;; + esac +} +log_debug() { + log_priority 7 || return 0 + echoerr "$(log_prefix)" "$(log_tag 7)" "$@" +} +log_info() { + log_priority 6 || return 0 + echoerr "$(log_prefix)" "$(log_tag 6)" "$@" +} +log_err() { + log_priority 3 || return 0 + echoerr "$(log_prefix)" "$(log_tag 3)" "$@" +} +log_crit() { + log_priority 2 || return 0 + echoerr "$(log_prefix)" "$(log_tag 2)" "$@" +} +uname_os() { + os=$(uname -s | tr '[:upper:]' '[:lower:]') + case "$os" in + msys_nt) os="windows" ;; + esac + echo "$os" +} +uname_arch() { + arch=$(uname -m) + case $arch in + x86_64) arch="amd64" ;; + x86) arch="386" ;; + i686) arch="386" ;; + i386) arch="386" ;; + aarch64) arch="arm64" ;; + armv5*) arch="armv5" ;; + armv6*) arch="armv6" ;; + armv7*) arch="armv7" ;; + esac + echo ${arch} +} +uname_os_check() { + os=$(uname_os) + case "$os" in + darwin) return 0 ;; + dragonfly) return 0 ;; + freebsd) return 0 ;; + linux) return 0 ;; + android) return 0 ;; + nacl) return 0 ;; + netbsd) return 0 ;; + openbsd) return 0 ;; + plan9) return 0 ;; + solaris) return 0 ;; + windows) return 0 ;; + esac + log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" + return 1 +} +uname_arch_check() { + arch=$(uname_arch) + case "$arch" in + 386) return 0 ;; + amd64) return 0 ;; + arm64) return 0 ;; + armv5) return 0 ;; + armv6) return 0 ;; + armv7) return 0 ;; + ppc64) return 0 ;; + ppc64le) return 0 ;; + mips) return 0 ;; + mipsle) return 0 ;; + mips64) return 0 ;; + mips64le) return 0 ;; + s390x) return 0 ;; + amd64p32) return 0 ;; + esac + log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" + return 1 +} +untar() { + tarball=$1 + case "${tarball}" in + *.tar.gz | *.tgz) tar -xzf "${tarball}" ;; + *.tar) tar -xf "${tarball}" ;; + *.zip) unzip "${tarball}" ;; + *) + log_err "untar unknown archive format for ${tarball}" + return 1 + ;; + esac +} +mktmpdir() { + test -z "$TMPDIR" && TMPDIR="$(mktemp -d)" + mkdir -p "${TMPDIR}" + echo "${TMPDIR}" +} +http_download_curl() { + local_file=$1 + source_url=$2 + header=$3 + if [ -z "$header" ]; then + code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") + else + code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") + fi + if [ "$code" != "200" ]; then + log_debug "http_download_curl received HTTP status $code" + return 1 + fi + return 0 +} +http_download_wget() { + local_file=$1 + source_url=$2 + header=$3 + if [ -z "$header" ]; then + wget -q -O "$local_file" "$source_url" + else + wget -q --header "$header" -O "$local_file" "$source_url" + fi +} +http_download() { + log_debug "http_download $2" + if is_command curl; then + http_download_curl "$@" + return + elif is_command wget; then + http_download_wget "$@" + return + fi + log_crit "http_download unable to find wget or curl" + return 1 +} +http_copy() { + tmp=$(mktemp) + http_download "${tmp}" "$1" "$2" || return 1 + body=$(cat "$tmp") + rm -f "${tmp}" + echo "$body" +} +github_release() { + owner_repo=$1 + version=$2 + test -z "$version" && version="latest" + giturl="https://github.com/${owner_repo}/releases/${version}" + json=$(http_copy "$giturl" "Accept:application/json") + test -z "$json" && return 1 + version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//') + test -z "$version" && return 1 + echo "$version" +} +hash_sha256() { + TARGET=${1:-/dev/stdin} + if is_command gsha256sum; then + hash=$(gsha256sum "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command sha256sum; then + hash=$(sha256sum "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command shasum; then + hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 + echo "$hash" | cut -d ' ' -f 1 + elif is_command openssl; then + hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 + echo "$hash" | cut -d ' ' -f a + else + log_crit "hash_sha256 unable to find command to compute sha-256 hash" + return 1 + fi +} +hash_sha256_verify() { + TARGET=$1 + checksums=$2 + if [ -z "$checksums" ]; then + log_err "hash_sha256_verify checksum file not specified in arg2" + return 1 + fi + BASENAME=${TARGET##*/} + want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) + if [ -z "$want" ]; then + log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" + return 1 + fi + got=$(hash_sha256 "$TARGET") + if [ "$want" != "$got" ]; then + log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" + return 1 + fi +} +cat /dev/null <