| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | package logicimport (	"encoding/json"	"time"	"github.com/gravitl/netmaker/database"	"github.com/gravitl/netmaker/models"	"github.com/gravitl/netmaker/servercfg"	"github.com/posthog/posthog-go")// posthog_pub_key - Key for sending data to PostHogconst posthog_pub_key = "phc_1vEXhPOA1P7HP5jP2dVU9xDTUqXHAelmtravyZ1vvES"// posthog_endpoint - Endpoint of PostHog serverconst posthog_endpoint = "https://app.posthog.com"// sendTelemetry - gathers telemetry data and sends to posthogfunc sendTelemetry() error {	if servercfg.Telemetry() == "off" {		return nil	}	var telRecord, err = fetchTelemetryRecord()	if err != nil {		return err	}	// get telemetry data	d, err := fetchTelemetryData()	if err != nil {		return err	}	client, err := posthog.NewWithConfig(posthog_pub_key, posthog.Config{Endpoint: posthog_endpoint})	if err != nil {		return err	}	defer client.Close()	// send to posthog	return client.Enqueue(posthog.Capture{		DistinctId: telRecord.UUID,		Event:      "daily checkin",		Properties: posthog.NewProperties().			Set("nodes", d.Nodes).			Set("non-server nodes", d.Count.NonServer).			Set("extclients", d.ExtClients).			Set("users", d.Users).			Set("networks", d.Networks).			Set("linux", d.Count.Linux).			Set("darwin", d.Count.MacOS).			Set("windows", d.Count.Windows).			Set("freebsd", d.Count.FreeBSD).			Set("docker", d.Count.Docker).			Set("k8s", d.Count.K8S).			Set("version", d.Version),	})}// fetchTelemetry - fetches telemetry data: count of various object types in DBfunc fetchTelemetryData() (telemetryData, error) {	var data telemetryData	data.ExtClients = getDBLength(database.EXT_CLIENT_TABLE_NAME)	data.Users = getDBLength(database.USERS_TABLE_NAME)	data.Networks = getDBLength(database.NETWORKS_TABLE_NAME)	data.Version = servercfg.GetVersion()	nodes, err := GetAllNodes()	if err == nil {		data.Nodes = len(nodes)		data.Count = getClientCount(nodes)	}	return data, err}// setTelemetryTimestamp - Give the entry in the DB a new timestampfunc setTelemetryTimestamp(telRecord *models.Telemetry) error {	lastsend := time.Now().Unix()	var serverTelData = models.Telemetry{		UUID:           telRecord.UUID,		LastSend:       lastsend,		TrafficKeyPriv: telRecord.TrafficKeyPriv,		TrafficKeyPub:  telRecord.TrafficKeyPub,	}	jsonObj, err := json.Marshal(&serverTelData)	if err != nil {		return err	}	err = database.Insert(database.SERVER_UUID_RECORD_KEY, string(jsonObj), database.SERVER_UUID_TABLE_NAME)	return err}// getClientCount - returns counts of nodes with various OS types and conditionsfunc getClientCount(nodes []models.Node) clientCount {	var count clientCount	for _, node := range nodes {		switch node.OS {		case "macos":			count.MacOS += 1		case "windows":			count.Windows += 1		case "linux":			count.Linux += 1		case "freebsd":			count.FreeBSD += 1		}		if !(node.IsServer == "yes") {			count.NonServer += 1		}	}	return count}// fetchTelemetryRecord - get the existing UUID and Timestamp from the DBfunc fetchTelemetryRecord() (models.Telemetry, error) {	var rawData string	var telObj models.Telemetry	var err error	rawData, err = database.FetchRecord(database.SERVER_UUID_TABLE_NAME, database.SERVER_UUID_RECORD_KEY)	if err != nil {		return telObj, err	}	err = json.Unmarshal([]byte(rawData), &telObj)	return telObj, err}// getDBLength - get length of DB to get count of objectsfunc getDBLength(dbname string) int {	data, err := database.FetchRecords(dbname)	if err != nil {		return 0	}	return len(data)}// telemetryData - What data to send to posthogtype telemetryData struct {	Nodes      int	ExtClients int	Users      int	Count      clientCount	Networks   int	Version    string}// clientCount - What types of netclients we're tallyingtype clientCount struct {	MacOS     int	Windows   int	Linux     int	FreeBSD   int	K8S       int	Docker    int	NonServer int}
 |