From 633fc78116c1440911ef36df0ea692134608e2a3 Mon Sep 17 00:00:00 2001
From: ale <ale@incal.net>
Date: Wed, 30 Oct 2019 20:38:25 +0000
Subject: [PATCH] Add support for external values in scripts

No external values are currently defined or filled in, it's just
defining an "ext" variable placeholder.
---
 script/script.go      | 10 ++++++++--
 script/script_test.go |  2 +-
 server/server.go      |  2 +-
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/script/script.go b/script/script.go
index 5513c9e..72e8076 100644
--- a/script/script.go
+++ b/script/script.go
@@ -7,6 +7,7 @@ import (
 	"sync"
 
 	"github.com/d5/tengo/script"
+	"github.com/d5/tengo/stdlib"
 
 	ippb "git.autistici.org/ai3/tools/iprep/proto"
 )
@@ -24,7 +25,7 @@ func LoadScript(path string) (*Script, error) {
 }
 
 var globalVars = []string{
-	"ip", "score", "counts", "interval",
+	"ip", "score", "counts", "interval", "ext",
 }
 
 func NewScript(src []byte) (*Script, error) {
@@ -36,6 +37,10 @@ func NewScript(src []byte) (*Script, error) {
 			return nil, err
 		}
 	}
+
+	// Add available imports.
+	s.SetImports(stdlib.GetModuleMap("math", "times"))
+
 	c, err := s.Compile()
 	if err != nil {
 		return nil, err
@@ -53,11 +58,12 @@ func buildIPMap(ip string, m ippb.Map) map[string]interface{} {
 	return out
 }
 
-func (script *Script) RunIP(ctx context.Context, ip string, m ippb.Map, intervalSecs float64) (float64, error) {
+func (script *Script) RunIP(ctx context.Context, ip string, m ippb.Map, intervalSecs float64, ext map[string]interface{}) (float64, error) {
 	c := script.compiled.Clone()
 	c.Set("ip", ip)
 	c.Set("score", 0.0)
 	c.Set("interval", intervalSecs)
+	c.Set("ext", ext)
 	if err := c.Set("counts", buildIPMap(ip, m)); err != nil {
 		return 0, err
 	}
diff --git a/script/script_test.go b/script/script_test.go
index a60fea1..0ddc89e 100644
--- a/script/script_test.go
+++ b/script/script_test.go
@@ -22,7 +22,7 @@ score = counts["test"] / 2 + counts["test2"]
 	m.Incr("test2", "1.2.3.4", 2)
 	m.Incr("test2", "2.3.4.5", 3)
 
-	score, err := s.RunIP(context.Background(), "1.2.3.4", m, 3600)
+	score, err := s.RunIP(context.Background(), "1.2.3.4", m, 3600, nil)
 	if err != nil {
 		t.Fatalf("runScript: %v", err)
 	}
diff --git a/server/server.go b/server/server.go
index 86f0ef9..cf2a919 100644
--- a/server/server.go
+++ b/server/server.go
@@ -88,7 +88,7 @@ func (s *Server) GetScore(ctx context.Context, req *ippb.GetScoreRequest) (*ippb
 		return nil, status.Errorf(codes.Unavailable, "%v", err)
 	}
 
-	score, err := s.Script().RunIP(ctx, req.Ip, m, s.horizon.Seconds())
+	score, err := s.Script().RunIP(ctx, req.Ip, m, s.horizon.Seconds(), nil)
 	if err != nil {
 		return nil, status.Errorf(codes.Internal, "%v", err)
 	}
-- 
GitLab