forked from hush/lightwalletd
George Tankersley
6 years ago
3 changed files with 149 additions and 25 deletions
@ -1,20 +1,14 @@ |
|||
module github.com/gtank/ctxd |
|||
|
|||
require ( |
|||
cloud.google.com/go v0.33.1 // indirect |
|||
github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3 // indirect |
|||
github.com/golang/protobuf v1.2.0 |
|||
github.com/mattn/go-sqlite3 v1.10.0 |
|||
github.com/pebbe/zmq4 v1.0.0 |
|||
github.com/pkg/errors v0.8.0 |
|||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3 // indirect |
|||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc |
|||
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890 // indirect |
|||
github.com/sirupsen/logrus v1.2.0 |
|||
golang.org/x/net v0.0.0-20181207154023-610586996380 |
|||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f // indirect |
|||
golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35 // indirect |
|||
golang.org/x/tools v0.0.0-20181204185109-3832e276fb48 // indirect |
|||
google.golang.org/appengine v1.3.0 // indirect |
|||
golang.org/x/sys v0.0.0-20181210030007-2a47403f2ae5 // indirect |
|||
google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898 // indirect |
|||
google.golang.org/grpc v1.16.0 |
|||
honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3 // indirect |
|||
google.golang.org/grpc v1.17.0 |
|||
) |
|||
|
@ -0,0 +1,124 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"database/sql" |
|||
"errors" |
|||
"flag" |
|||
"net" |
|||
"os" |
|||
"os/signal" |
|||
"syscall" |
|||
|
|||
"github.com/gtank/ctxd/rpc" |
|||
"github.com/sirupsen/logrus" |
|||
"google.golang.org/grpc" |
|||
"google.golang.org/grpc/credentials" |
|||
) |
|||
|
|||
var ( |
|||
log = logrus.New() |
|||
|
|||
ErrNoImpl = errors.New("not yet implemented") |
|||
) |
|||
|
|||
func init() { |
|||
log.SetFormatter(&logrus.TextFormatter{ |
|||
//DisableColors: true,
|
|||
FullTimestamp: true, |
|||
DisableLevelTruncation: true, |
|||
}) |
|||
} |
|||
|
|||
type Options struct { |
|||
bindAddr string `json:"bind_address,omitempty"` |
|||
dbPath string `json:"db_path"` |
|||
tlsCertPath string `json:"tls_cert_path,omitempty"` |
|||
tlsKeyPath string `json:"tls_cert_key,omitempty"` |
|||
logLevel uint64 `json:"log_level,omitempty"` |
|||
logPath string `json:"log_file,omitempty"` |
|||
} |
|||
|
|||
func main() { |
|||
opts := &Options{} |
|||
flag.StringVar(&opts.bindAddr, "bind-addr", "127.0.0.1:9067", "the address to listen on") |
|||
flag.StringVar(&opts.dbPath, "db-path", "", "the location of a sqlite database file") |
|||
flag.StringVar(&opts.tlsCertPath, "tls-cert", "", "the path to a TLS certificate (optional)") |
|||
flag.StringVar(&opts.tlsKeyPath, "tls-key", "", "the path to a TLS key file (optional)") |
|||
flag.Uint64Var(&opts.logLevel, "log-level", uint64(logrus.InfoLevel), "log level (logrus 1-7)") |
|||
// TODO prod logging flag.StringVar(&opts.logPath, "log-file", "", "log file to write to")
|
|||
// TODO prod metrics
|
|||
// TODO support config from file
|
|||
flag.Parse() |
|||
|
|||
if opts.dbPath == "" { |
|||
flag.Usage() |
|||
os.Exit(1) |
|||
} |
|||
|
|||
log.SetLevel(logrus.Level(opts.logLevel)) |
|||
|
|||
// gRPC initialization
|
|||
var server *grpc.Server |
|||
|
|||
if opts.tlsCertPath != "" && opts.tlsKeyPath != "" { |
|||
transportCreds, err := credentials.NewServerTLSFromFile(opts.tlsCertPath, opts.tlsKeyPath) |
|||
if err != nil { |
|||
log.WithFields(logrus.Fields{ |
|||
"cert_file": opts.tlsCertPath, |
|||
"key_path": opts.tlsKeyPath, |
|||
"error": err.Error(), |
|||
}).Fatal("couldn't load TLS credentials") |
|||
} |
|||
server = grpc.NewServer(grpc.Creds(transportCreds)) |
|||
} else { |
|||
server = grpc.NewServer() |
|||
} |
|||
|
|||
// Compact transaction service initialization
|
|||
service, err := NewSQLiteStreamer(opts.dbPath) |
|||
if err != nil { |
|||
log.WithFields(logrus.Fields{ |
|||
"db_path": opts.dbPath, |
|||
"error": err.Error(), |
|||
}).Fatal("couldn't create SQL streamer") |
|||
} |
|||
|
|||
// Register service
|
|||
rpc.RegisterCompactTxStreamerServer(server, service) |
|||
|
|||
// Start listening
|
|||
listener, err := net.Listen("tcp", opts.bindAddr) |
|||
if err != nil { |
|||
log.WithFields(logrus.Fields{ |
|||
"bind_addr": opts.bindAddr, |
|||
"error": err.Error(), |
|||
}).Fatal("couldn't create listener") |
|||
} |
|||
|
|||
// Signal handler for graceful stops
|
|||
signals := make(chan os.Signal, 1) |
|||
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM) |
|||
go func() { |
|||
s := <-signals |
|||
log.WithFields(logrus.Fields{ |
|||
"signal": s.String(), |
|||
}).Info("caught signal, stopping gRPC server") |
|||
server.GracefulStop() |
|||
}() |
|||
|
|||
err = server.Serve(listener) |
|||
if err != nil { |
|||
log.WithFields(logrus.Fields{ |
|||
"error": err.Error(), |
|||
}).Fatal("gRPC server failed") |
|||
} |
|||
} |
|||
|
|||
// the service type
|
|||
type sqlStreamer struct { |
|||
db *sql.DB |
|||
} |
|||
|
|||
func NewSQLiteStreamer(dbPath string) (rpc.CompactTxStreamerServer, error) { |
|||
return nil, ErrNoImpl |
|||
} |
Loading…
Reference in new issue