summaryrefslogtreecommitdiff
path: root/src/hub/src/spreadspace.org/sfive-hub/s5hub.go
blob: 9b28270bd56cf020217129af8bbcd837c513439f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// sfive
//
// sfive - spreadspace streaming statistics suite is a generic
// statistic collection tool for streaming server infrastuctures.
// The system collects and stores meta data like number of views
// and throughput from a number of streaming servers and stores
// it in a global data store.
// The data acquisition is designed to be generic and extensible in
// order to support different streaming software.
// sfive also contains tools and applications to filter and visualize
// live and recorded data.
//
//
// Copyright (C) 2014-2017 Christian Pointner <equinox@spreadspace.org>
//                         Markus Grüneis <gimpf@gimpf.org>
//
// This file is part of sfive.
//
// sfive is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 3
// as published by the Free Software Foundation.
//
// sfive is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with sfive. If not, see <http://www.gnu.org/licenses/>.
//

package main

import (
	"flag"
	"log"
	"os"
	"os/signal"
	"syscall"

	"spreadspace.org/sfive"
)

var s5hl = log.New(os.Stderr, "[s5hub]\t", log.LstdFlags)

func main() {
	// ******************  this should be replaced? by a proper config file

	db := flag.String("db", "/var/lib/sfive/db.bolt", "path to the database file")
	readOnly := flag.Bool("read-only", false, "open database in read-only mode")
	anonymize := flag.Bool("anonymize", false, "anonymize clients IP addresses using crypto-pan")
	anonKeyFile := flag.String("anonymization-key-file", "", "path to the file containing the key to be used for crypto-pan anonymization (default: use randomly generated key)")
	geoipDB := flag.String("geoip-db", "", "path to the Geo-IP database")
	pipe := flag.String("pipe", "/var/run/sfive/pipe", "path to the unix pipe for the pipeserver")
	startPipe := flag.Bool("start-pipe-server", true, "start a connection oriented pipe server; see option pipe")
	pipegram := flag.String("pipegram", "/var/run/sfive/pipegram", "path to the unix datagram pipe for the pipeserver")
	startPipegram := flag.Bool("start-pipegram-server", true, "start a datagram oriented pipe server; see option pipegram")
	web := flag.String("web", ":8000", "port for the webserver to listen on")
	startWeb := flag.Bool("start-web-server", true, "start a webserver")
	forward := flag.String("forward-url", "", "forward to another sfive-server with http server at base-url")
	forwardES := flag.String("forward-es-url", "", "forward to an ElasticSearch *index* via http")
	forwardGraphite := flag.String("forward-graphite", "", "forward to Graphite at this host")
	graphiteBasePath := flag.String("graphite-base-path", "sfive", "use this as base for all paths on graphite")
	forwardPiwik := flag.String("forward-piwik-url", "", "forward to Piwik at this host")
	piwikSiteURL := flag.String("piwik-site-url", "", "use this base url for the site")
	piwikSiteID := flag.Uint("piwik-site-id", 1, "use this site-id for piwik")
	piwikToken := flag.String("piwik-token", "", "the auth token for piwik")
	help := flag.Bool("help", false, "show usage")

	flag.Parse()

	s5hl.Printf("Hello, world.\n")
	if *help {
		flag.Usage()
		return
	}

	cfg := sfive.SrvConfig{}
	if *startPipe {
		cfg.Interfaces.Pipe = sfive.PipeInterfaceConfig{ListenPath: *pipe}
	}
	if *startPipegram {
		cfg.Interfaces.Pipegram = sfive.PipegramInterfaceConfig{ListenPath: *pipegram}
	}
	if *startWeb {
		cfg.Interfaces.Web = sfive.WebInterfaceConfig{ListenAddr: *web}
	}
	cfg.Store = sfive.StoreConfig{*db, *readOnly}
	cfg.Transform = sfive.TransformConfig{*anonymize, *anonKeyFile, *geoipDB}
	cfg.Forwards.SFive = sfive.SFiveForwardConfig{URL: *forward}
	cfg.Forwards.Elasticsearch = sfive.ESForwardConfig{URL: *forwardES}
	cfg.Forwards.Graphite = sfive.GraphiteForwardConfig{Host: *forwardGraphite, BasePath: *graphiteBasePath}
	cfg.Forwards.Piwik = sfive.PiwikForwardConfig{URL: *forwardPiwik, SiteURL: *piwikSiteURL, SiteID: *piwikSiteID}
	cfg.Forwards.Piwik.AuthConfig = sfive.AuthConfig{Token: *piwikToken}

	// ******************  end config

	srv, err := sfive.NewServer(cfg)
	if err != nil {
		s5hl.Fatalf(err.Error())
	}

	wg, err := srv.Start()
	if err != nil {
		s5hl.Fatalf(err.Error())
	}

	alldone := make(chan bool)
	go func() {
		defer func() { alldone <- true }()
		wg.Wait()
	}()

	c := make(chan os.Signal, 1)
	signal.Notify(c, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGINT)

	select {
	case sig := <-c:
		s5hl.Printf("signal(%v) received, shutting down", sig)
	case <-alldone:
	}
	srv.Shutdown()
}