mirror of
				https://github.com/gravitl/netmaker.git
				synced 2025-10-31 04:06:37 +08:00 
			
		
		
		
	 230e062c84
			
		
	
	230e062c84
	
	
	
		
			
			* set free tier limits through config * add host limit to config * check for host limit on free tier * fix license validation, replace node limit with hosts * add hosts to telemetry data * debug init * validate license every 1hr * hook manager, api to fetch server usage * hook manager, server usage api * encode json server usage api * update ngork url * update license validation endpoint * avoid setting limits on eer * adding hotfix * correct users limits env var * add comments to exported funcs --------- Co-authored-by: afeiszli <alex.feiszli@gmail.com>
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package logic
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"sync"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/gravitl/netmaker/logger"
 | |
| 	"github.com/gravitl/netmaker/models"
 | |
| )
 | |
| 
 | |
| // == Constants ==
 | |
| 
 | |
| // How long to wait before sending telemetry to server (24 hours)
 | |
| const timer_hours_between_runs = 24
 | |
| 
 | |
| // HookManagerCh - channel to add any new hooks
 | |
| var HookManagerCh = make(chan models.HookDetails, 2)
 | |
| 
 | |
| // == Public ==
 | |
| 
 | |
| // TimerCheckpoint - Checks if 24 hours has passed since telemetry was last sent. If so, sends telemetry data to posthog
 | |
| func TimerCheckpoint() error {
 | |
| 	// get the telemetry record in the DB, which contains a timestamp
 | |
| 	telRecord, err := fetchTelemetryRecord()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	sendtime := time.Unix(telRecord.LastSend, 0).Add(time.Hour * time.Duration(timer_hours_between_runs))
 | |
| 	// can set to 2 minutes for testing
 | |
| 	// sendtime := time.Unix(telRecord.LastSend, 0).Add(time.Minute * 2)
 | |
| 	enoughTimeElapsed := time.Now().After(sendtime)
 | |
| 	// if more than 24 hours has elapsed, send telemetry to posthog
 | |
| 	if enoughTimeElapsed {
 | |
| 		// run any time hooks
 | |
| 		runHooks()
 | |
| 		return setTelemetryTimestamp(&telRecord)
 | |
| 
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // AddHook - adds a hook function to run every 24hrs
 | |
| func AddHook(ifaceToAdd interface{}) {
 | |
| 	timeHooks = append(timeHooks, ifaceToAdd)
 | |
| }
 | |
| 
 | |
| // StartHookManager - listens on `HookManagerCh` to run any hook
 | |
| func StartHookManager(ctx context.Context, wg *sync.WaitGroup) {
 | |
| 	defer wg.Done()
 | |
| 	for {
 | |
| 		select {
 | |
| 		case <-ctx.Done():
 | |
| 			logger.Log(0, "## Stopping Hook Manager")
 | |
| 			return
 | |
| 		case newhook := <-HookManagerCh:
 | |
| 			wg.Add(1)
 | |
| 			go addHookWithInterval(ctx, wg, newhook.Hook, newhook.Interval)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func addHookWithInterval(ctx context.Context, wg *sync.WaitGroup, hook func() error, interval time.Duration) {
 | |
| 	defer wg.Done()
 | |
| 	ticker := time.NewTicker(interval)
 | |
| 	defer ticker.Stop()
 | |
| 	for {
 | |
| 		select {
 | |
| 		case <-ctx.Done():
 | |
| 			return
 | |
| 		case <-ticker.C:
 | |
| 			hook()
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| // == private ==
 | |
| 
 | |
| // timeHooks - functions to run once a day, functions must take no parameters
 | |
| var timeHooks = []interface{}{
 | |
| 	loggerDump,
 | |
| 	sendTelemetry,
 | |
| }
 | |
| 
 | |
| func loggerDump() error {
 | |
| 	logger.DumpFile(fmt.Sprintf("data/netmaker.log.%s", time.Now().Format(logger.TimeFormatDay)))
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // runHooks - runs the functions currently in the timeHooks data structure
 | |
| func runHooks() {
 | |
| 	for _, hook := range timeHooks {
 | |
| 		if err := hook.(func() error)(); err != nil {
 | |
| 			logger.Log(1, "error occurred when running timer function:", err.Error())
 | |
| 		}
 | |
| 	}
 | |
| }
 |