Commit 6e5fb24b authored by Mo Firouz's avatar Mo Firouz Committed by Chris Molozian
Browse files

Add verbose option to server CLI (#3).

parent 09c5ee67
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ build/*
!dashboard/build
data/*
.GITHUB_TOKEN
.idea

### Go ###
# Compiled Object files, Static and Dynamic libs (Shared Objects)
+12 −0
Original line number Diff line number Diff line
@@ -5,8 +5,20 @@ The format is based on [keep a changelog](http://keepachangelog.com/) and this p

## [Unreleased]

### Added

- Add verbose command-line flag to enable debug logging and console output.

### Changed
- Update db schema to support 64 characters with device IDs. This enables `SystemInfo.deviceUniqueIdentifier` to be used as a source for device IDs on Windows 10.
- Logout messages now close the connection as well and won't reply.
- Changed Logout message type from `TLogout` to `Logout`.

### Fixed

- Fix issue where random handle generator wasn't seeded properly.
- Fix issues in executing Friend and Storage queries.
- Fix sending Close frame message in the Websocket to gracefully close connection.

## [0.10.0] - 2017-01-14
### Added
+33 −19
Original line number Diff line number Diff line
@@ -26,15 +26,14 @@ import (
	"syscall"
	"time"

	"nakama/cmd"
	"nakama/pkg/ga"
	"nakama/server"

	"github.com/armon/go-metrics"
	"github.com/go-yaml/yaml"
	_ "github.com/lib/pq"
	uuid "github.com/satori/go.uuid"
	"github.com/uber-go/zap"
	"nakama/cmd"
	"nakama/pkg/ga"
	"nakama/server"
)

const (
@@ -44,12 +43,18 @@ const (
var (
	version  string
	commitID string
	verboseLogging bool = true
)

func main() {
	semver := fmt.Sprintf("%s+%s", version, commitID)

	clogger := zap.New(zap.NewTextEncoder(zap.TextNoTime()), zap.Output(os.Stdout))
	options := []zap.Option{zap.Output(os.Stdout), zap.LevelEnablerFunc(zapLevelEnabler)}
	if verboseLogging {
		options = append(options, zap.AddStacks(zap.ErrorLevel))
	}
	clogger := zap.New(zap.NewTextEncoder(zap.TextNoTime()), options...)


	if len(os.Args) > 1 {
		// TODO requires Zap to be set to Info level.
@@ -71,6 +76,9 @@ func main() {
	metrics.NewGlobal(&metrics.Config{EnableRuntimeMetrics: true, ProfileInterval: 5 * time.Second}, metric)

	logger, mlogger := configureLogger(clogger, config)
	if verboseLogging {
		logger = mlogger
	}

	// Print startup information
	mlogger.Info("Nakama starting", zap.String("at", time.Now().UTC().Format("2006-01-02 15:04:05.000 -0700 MST")))
@@ -132,6 +140,7 @@ func parseArgs(clogger zap.Logger) server.Config {
	config := server.NewConfig()

	flags := flag.NewFlagSet("main", flag.ExitOnError)
	flags.BoolVar(&verboseLogging, "verbose", false, "Turn verbose logging on.")
	var filepath string
	flags.StringVar(&filepath, "config", "", "The absolute file path to configuration YAML file.")
	var name string
@@ -181,6 +190,10 @@ func parseArgs(clogger zap.Logger) server.Config {
	return config
}

func zapLevelEnabler(level zap.Level) bool {
	return !(level == zap.DebugLevel && !verboseLogging)
}

func configureLogger(clogger zap.Logger, config server.Config) (zap.Logger, zap.Logger) {
	err := os.MkdirAll(filepath.FromSlash(config.GetDataDir()+"/log"), 0755)
	if err != nil {
@@ -198,6 +211,7 @@ func configureLogger(clogger zap.Logger, config server.Config) (zap.Logger, zap.
		zap.NewJSONEncoder(zap.RFC3339Formatter("timestamp")),
		zap.Output(zap.AddSync(file)),
		zap.AddStacks(zap.ErrorLevel),
		zap.LevelEnablerFunc(zapLevelEnabler),
	)
	logger = logger.With(zap.String("server", config.GetName()))

@@ -206,6 +220,20 @@ func configureLogger(clogger zap.Logger, config server.Config) (zap.Logger, zap.
	return logger, mlogger
}

func dbConnect(multiLogger zap.Logger, dsns []string) *sql.DB {
	// TODO config database pooling
	db, err := sql.Open("postgres", "postgresql://"+dsns[0]+"/nakama?sslmode=disable")
	if err != nil {
		multiLogger.Fatal("Error connecting to database", zap.Error(err))
	}
	err = db.Ping()
	if err != nil {
		multiLogger.Fatal("Error pinging database", zap.Error(err))
	}

	return db
}

// Help improve Nakama by sending anonymous usage statistics.
//
// You can disable the telemetry completely before server start by setting the
@@ -239,20 +267,6 @@ func runTelemetry(logger zap.Logger, httpc *http.Client, gacode string, cookie s
	}
}

func dbConnect(multiLogger zap.Logger, dsns []string) *sql.DB {
	// TODO config database pooling
	db, err := sql.Open("postgres", "postgresql://"+dsns[0]+"/nakama?sslmode=disable")
	if err != nil {
		multiLogger.Fatal("Error connecting to database", zap.Error(err))
	}
	err = db.Ping()
	if err != nil {
		multiLogger.Fatal("Error pinging database", zap.Error(err))
	}

	return db
}

func newOrLoadCookie(datadir string) string {
	filePath := filepath.FromSlash(datadir + "/" + cookieFilename)
	b, err := ioutil.ReadFile(filePath)
+2 −2
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ message Envelope {

    Heartbeat heartbeat = 3;

    TLogout logout = 4;
    Logout logout = 4;
    TLink link = 5;
    TUnlink unlink = 6;

@@ -135,7 +135,7 @@ message Envelope {
  }
}

message TLogout {}
message Logout {}

// Link expects same input as an authentication.
message TLink {
+4 −4
Original line number Diff line number Diff line
@@ -16,10 +16,10 @@ package server

import (
	"database/sql"

	"nakama/pkg/social"
	"fmt"

	"github.com/uber-go/zap"
	"nakama/pkg/social"
)

type pipeline struct {
@@ -42,11 +42,11 @@ func NewPipeline(config Config, db *sql.DB, socialClient *social.Client, tracker
}

func (p *pipeline) processRequest(logger zap.Logger, session *session, envelope *Envelope) {
	logger.Debug(fmt.Sprintf("Received %T message", envelope.Payload))

	switch envelope.Payload.(type) {
	case *Envelope_Logout:
		// TODO Store JWT into a blacklist until remaining JWT expiry.
		logger.Info("Recieved logout message")
		session.Send(&Envelope{CollationId: envelope.CollationId})
		session.Close()

	case *Envelope_Link:
Loading