From 2ca147976f8f0068b53bd7359fe8f0906b7308d5 Mon Sep 17 00:00:00 2001 From: tfn18001 Date: Fri, 22 Apr 2022 00:21:37 -0400 Subject: [PATCH] Monitor Function Fixes + Debugging profile --- CTng/.vscode/launch.json | 13 +++ CTng/ctng.go | 4 +- CTng/gossip/gossiper.go | 2 +- CTng/monitor/monitor.go | 84 ++++++++++--------- CTng/monitor/monitor_process.go | 4 +- CTng/monitorTest.sh | 4 +- CTng/server/Gossiper_server.go | 2 + CTng/server/Monitor_server.go | 48 +++++------ .../1/monitor_priv_config.json | 4 +- 9 files changed, 91 insertions(+), 74 deletions(-) diff --git a/CTng/.vscode/launch.json b/CTng/.vscode/launch.json index 3b4ebc8..3346116 100644 --- a/CTng/.vscode/launch.json +++ b/CTng/.vscode/launch.json @@ -17,6 +17,19 @@ "config/test/localhost:8081.crypto.json" ], }, + { + "name": "Launch Monitor", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceRoot}/ctng.go", + "args": [ + "monitor", + "testData/monitorNetworkTest/monitor_pub_config.json", + "testData/monitorNetworkTest/1/monitor_priv_config.json", + "testData/gossiperNetworkTest/1/gossiperCrypto.json" + ], + }, { "name": "Launch testData Gossiper 3", "type": "go", diff --git a/CTng/ctng.go b/CTng/ctng.go index 97a7c75..e7e8eb3 100644 --- a/CTng/ctng.go +++ b/CTng/ctng.go @@ -45,9 +45,11 @@ func main() { fmt.Println(helpText) panic(err) } + storage := new(gossip.Gossip_Storage) + *storage = make(gossip.Gossip_Storage) ctx := monitor.MonitorContext{ Config: &conf, - Storage: new(gossip.Gossip_Storage), + Storage: storage, StorageFile: "monitor_data.json", } ctx.Config = &conf diff --git a/CTng/gossip/gossiper.go b/CTng/gossip/gossiper.go index bd0ac9e..21b1f5c 100644 --- a/CTng/gossip/gossiper.go +++ b/CTng/gossip/gossiper.go @@ -71,7 +71,7 @@ func SendToOwner(c *GossiperContext, obj Gossip_object) { fmt.Println(err) } // Send the gossip object to the owner. - resp, postErr := c.Client.Post("http://"+c.Config.Owner_URL+"/monitor/recieve-gossip", "application/json", bytes.NewBuffer(msg)) + resp, postErr := c.Client.Post("http://"+c.Config.Owner_URL+"/recieve-gossip", "application/json", bytes.NewBuffer(msg)) if postErr != nil { fmt.Errorf("Error sending object to owner: " + postErr.Error()) } else { diff --git a/CTng/monitor/monitor.go b/CTng/monitor/monitor.go index 280d07b..9c9cbe0 100644 --- a/CTng/monitor/monitor.go +++ b/CTng/monitor/monitor.go @@ -1,8 +1,8 @@ package monitor import ( - "CTng/crypto" "CTng/gossip" + "CTng/util" "bytes" "encoding/json" "errors" @@ -13,63 +13,73 @@ import ( "time" ) -func QueryLoggers(loggerURLs []string) { - for _, logger := range loggerURLs { +const PROTOCOL = "http://" + +func QueryLoggers(c *MonitorContext) { + for _, logger := range c.Config.Logger_URLs { // Get today's STH from logger. // Get today's date in format YYYY-MM-DD var today = time.Now().UTC().Format(time.RFC3339)[0:10] - sthResp, err := http.Get(logger + "ctng/v1/get-sth/" + today) + sthResp, err := http.Get(PROTOCOL + logger + "/ctng/v1/get-sth/" + today) if err != nil { - log.Fatalln(err) + log.Println(err) + AccuseEntity(c, logger) + continue } sthBody, err := ioutil.ReadAll(sthResp.Body) + var STH gossip.Gossip_object + err = json.Unmarshal(sthBody, &STH) if err != nil { - log.Fatalln(err) - } - STH := string(sthBody) - fmt.Printf("STH from logger " + logger + ": " + STH + "\n") //temp - - // Get today's entries from logger - entriesResp, err := http.Get(logger + "ctng/v1/get-entries/" + today) - if err != nil { - log.Fatalln(err) + log.Println(util.RED+err.Error(), util.RESET) + AccuseEntity(c, logger) + continue } - - entiresBody, err := ioutil.ReadAll(entriesResp.Body) + err = STH.Verify(c.Config.Crypto) if err != nil { - log.Fatalln(err) + log.Println(util.RED+"STH signature verification failed", err.Error(), util.RESET) + AccuseEntity(c, logger) + } else { + Process_valid_object(c, STH) } - entries := string(entiresBody) - fmt.Printf("Entries from logger " + logger + ": " + entries + "\n") //temp - - // TODO - process STH and entries + // Get today's entries from logger + // entriesResp, err := http.Get(logger + "/ctng/v1/get-entries/" + today) + // if err != nil { + // log.Println(util.RED+err.Error(), util.RESET) + // } + + // entiresBody, err := ioutil.ReadAll(entriesResp.Body) + // if err != nil { + // log.Println(util.RED+err.Error(), util.RESET) + // } + // entries := string(entiresBody) + // fmt.Printf("Entries from logger " + logger + ": " + entries + "\n") //temp } } -func QueryAuthorities(authURLs []string) { - for _, CA := range authURLs { +func QueryAuthorities(c *MonitorContext) { + for _, CA := range c.Config.CA_URLs { // Get today's revocation information from CA. // Get today's date in format YYYY-MM-DD var today = time.Now().UTC().Format(time.RFC3339)[0:10] - revResp, err := http.Get(CA + "/ctng/v1/get-revocations/" + today) + revResp, err := http.Get(PROTOCOL + CA + "/ctng/v1/get-revocations/" + today) if err != nil { - log.Fatalln(err) + log.Println(util.RED+err.Error(), util.RESET) } revBody, err := ioutil.ReadAll(revResp.Body) if err != nil { - log.Fatalln(err) + log.Println(util.RED+err.Error(), util.RESET) } rev := string(revBody) - fmt.Printf("Revocation information from CA " + CA + ": " + rev + "\n") + fmt.Println("Revocation information from CA " + CA + ": " + rev + "\n") // TODO - process revocation data } @@ -78,14 +88,12 @@ func QueryAuthorities(authURLs []string) { //Accused = Domain name of the accused entity (logger etc.) //should be a monitor functionality -func AccuseEntity(c *crypto.CryptoConfig, Accused string) (gossip.Gossip_object, error) { +func AccuseEntity(c *MonitorContext, Accused string) { // this should be a method for the monitor // psedo code for now msg := Accused - signature, err := c.ThresholdSign(msg) - if err != nil { - return gossip.Gossip_object{}, err - } + signature, _ := c.Config.Crypto.ThresholdSign(msg) + var sigarray [2]string sigarray[0] = signature.String() sigarray[1] = "" @@ -93,14 +101,14 @@ func AccuseEntity(c *crypto.CryptoConfig, Accused string) (gossip.Gossip_object, payloadarray[0] = msg payloadarray[1] = "" accusation := gossip.Gossip_object{ - Application: "accsuation", - Type: "http://ctng.uconn.edu/203", - Signer: c.SelfID.String(), + Application: "CTng", + Type: gossip.ACCUSATION_FRAG, + Signer: c.Config.Crypto.SelfID.String(), Signature: sigarray, Timestamp: gossip.GetCurrentTimestamp(), Payload: payloadarray, } - return accusation, nil + Send_to_gossiper(c, accusation) } func Send_to_gossiper(c *MonitorContext, g gossip.Gossip_object) { @@ -110,9 +118,9 @@ func Send_to_gossiper(c *MonitorContext, g gossip.Gossip_object) { fmt.Println(err) } // Send the gossip object to the gossiper. - resp, postErr := c.Client.Post("http://"+c.Config.Gossiper_URL+"/monitor/recieve-gossip", "application/json", bytes.NewBuffer(msg)) + resp, postErr := c.Client.Post(PROTOCOL+c.Config.Gossiper_URL+"/gossip/gossip-data", "application/json", bytes.NewBuffer(msg)) if postErr != nil { - fmt.Printf("Error sending object to Gossiper: " + postErr.Error()) + fmt.Println("Error sending object to Gossiper: ", postErr.Error()) } else { // Close the response, mentioned by http.Post // Alernatively, we could return the response from this function. diff --git a/CTng/monitor/monitor_process.go b/CTng/monitor/monitor_process.go index 47e6e7f..828f97d 100644 --- a/CTng/monitor/monitor_process.go +++ b/CTng/monitor/monitor_process.go @@ -13,7 +13,7 @@ func Process_valid_object(c *MonitorContext, g gossip.Gossip_object) { if IsLogger(c, g.Signer) && g.Type == gossip.STH { sig_frag, err := c.Config.Crypto.ThresholdSign(g.Payload[0]) if err != nil { - fmt.Printf(err.Error()) + fmt.Println(err.Error()) } Send_to_gossiper(c, g) f := func() { @@ -35,7 +35,7 @@ func Process_valid_object(c *MonitorContext, g gossip.Gossip_object) { if IsAuthority(c, g.Signer) && g.Type == gossip.REVOCATION { sig_frag, err := c.Config.Crypto.ThresholdSign(g.Payload[0]) if err != nil { - fmt.Printf(err.Error()) + fmt.Println(err.Error()) } Send_to_gossiper(c, g) f := func() { diff --git a/CTng/monitorTest.sh b/CTng/monitorTest.sh index 7a33a61..a90191c 100644 --- a/CTng/monitorTest.sh +++ b/CTng/monitorTest.sh @@ -1,6 +1,6 @@ #/bin/bash go run . monitor \ -testData/monitorNetworkTest/gossiper_pub_config.json \ -testData/monitorNetworkTest/$1/gossiper_priv_config.json \ +testData/monitorNetworkTest/monitor_pub_config.json \ +testData/monitorNetworkTest/$1/monitor_priv_config.json \ testData/gossiperNetworkTest/$1/gossiperCrypto.json \ No newline at end of file diff --git a/CTng/server/Gossiper_server.go b/CTng/server/Gossiper_server.go index 1487437..91b216e 100644 --- a/CTng/server/Gossiper_server.go +++ b/CTng/server/Gossiper_server.go @@ -161,6 +161,7 @@ func handleOwnerGossip(c *gossip.GossiperContext, w http.ResponseWriter, r *http err := json.NewDecoder(r.Body).Decode(&gossip_obj) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) + return } err = gossip_obj.Verify(c.Config.Crypto) @@ -169,6 +170,7 @@ func handleOwnerGossip(c *gossip.GossiperContext, w http.ResponseWriter, r *http // gossip.ProcessInvalidObject(gossip_obj, err) fmt.Println(util.RED+"Owner sent invalid object.", util.RESET) http.Error(w, err.Error(), http.StatusBadRequest) + return } stored_obj, found := c.GetObject(gossip_obj.GetID(c.Config.Public.Period_interval)) if found { diff --git a/CTng/server/Monitor_server.go b/CTng/server/Monitor_server.go index 5d4c7db..b43a4b9 100644 --- a/CTng/server/Monitor_server.go +++ b/CTng/server/Monitor_server.go @@ -3,6 +3,7 @@ package server import ( "CTng/gossip" "CTng/monitor" + "CTng/util" "encoding/json" "fmt" "io/ioutil" @@ -82,7 +83,7 @@ func receivePOM(c *monitor.MonitorContext, w http.ResponseWriter, r *http.Reques } PoM := string(body) - fmt.Printf("PoM Received: " + PoM + "\n") //temp + fmt.Println("PoM Received: " + PoM) //temp // TODO - Validate, process and save PoM } @@ -99,7 +100,7 @@ func getRevocation(c *monitor.MonitorContext, w http.ResponseWriter, r *http.Req // Get {date} from the end of the URL date := path.Base(r.URL.Path) - fmt.Printf(date, '\n') //temp + fmt.Println(date) //temp // if no revocation data found for specified day, return a 404 http.Error(w, "Revocation information not found.", 404) @@ -111,7 +112,7 @@ func getSTH(c *monitor.MonitorContext, w http.ResponseWriter, r *http.Request) { // Get {date} from the end of the URL date := path.Base(r.URL.Path) - fmt.Printf(date, '\n') //temp + fmt.Println(date) //temp // if no STH found for specified day, return a 404 http.Error(w, "STH object not found.", 404) @@ -123,7 +124,7 @@ func getPOM(c *monitor.MonitorContext, w http.ResponseWriter, r *http.Request) { // Get {date} from the end of the URL date := path.Base(r.URL.Path) - fmt.Printf(date, '\n') //temp + fmt.Println(date) // if no POM found for specified day, return a 404 http.Error(w, "PoM not found.", 404) @@ -143,8 +144,7 @@ func handle_gossip(c *monitor.MonitorContext, w http.ResponseWriter, r *http.Req err = gossip_obj.Verify(c.Config.Crypto) if err != nil { fmt.Println("Recieved invalid object from " + getSenderURL(r) + ".") - obj, err := monitor.AccuseEntity(c.Config.Crypto, gossip_obj.Signer) - monitor.Send_to_gossiper(c, obj) + monitor.AccuseEntity(c, gossip_obj.Signer) http.Error(w, err.Error(), http.StatusOK) return } @@ -179,28 +179,20 @@ func StartMonitorServer(c *monitor.MonitorContext) { panic(err) } } - - // Start HTTP server loop - // Execute as goroutine so server and client - // can operate concurrently - go handleMonitorRequests(c) - - // Query loggers and authorities once per day - queryInterval := time.Hour * 24 - - // Perform startup queries - monitor.QueryLoggers(c.Config.Logger_URLs) - monitor.QueryAuthorities(c.Config.CA_URLs) - queryTime := time.Now() - - // Monitor client loop - for { - // Check if enough time has passed to query loggers and CAs again - if time.Since(queryTime) >= queryInterval { - monitor.QueryLoggers(c.Config.Logger_URLs) - monitor.QueryAuthorities(c.Config.CA_URLs) - queryTime = time.Now() + tr := &http.Transport{} + c.Client = &http.Client{ + Transport: tr, + } + // Run a go routine to handle tasks that must occur every MMD + f := func() { + for { + fmt.Println(util.GREEN + "Querying Loggers+CAs" + util.RESET) + monitor.QueryLoggers(c) + // monitor.QueryAuthorities(c) + time.Sleep(time.Duration(c.Config.Public.MMD) * time.Second) } - time.Sleep(time.Second) } + go f() + // Start HTTP server loop + handleMonitorRequests(c) } diff --git a/CTng/testData/monitorNetworkTest/1/monitor_priv_config.json b/CTng/testData/monitorNetworkTest/1/monitor_priv_config.json index 7328ec7..fb23330 100644 --- a/CTng/testData/monitorNetworkTest/1/monitor_priv_config.json +++ b/CTng/testData/monitorNetworkTest/1/monitor_priv_config.json @@ -1,7 +1,7 @@ { "Crypto_config_path": "testData/monitorNetworkTest/1/monitorCrypto.json", - "CA_URLs": ["192.168.1.1", "1.1.1.1", "255.255.255.255"], - "Logger_URLs": ["192.168.1.1", "1.1.1.1", "255.255.255.255"], + "CA_URLs": ["localhost:9000"], + "Logger_URLs": ["localhost:8080", "localhost:8081"], "Gossiper_URL": "localhost:8080", "Port": "8180" } \ No newline at end of file