diff --git a/cmd/list.go b/cmd/list.go index 845da29..b722c81 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "strings" + "time" "github.com/OpenCHAMI/magellan/internal/db/sqlite" @@ -25,7 +26,7 @@ var listCmd = &cobra.Command{ fmt.Printf("%s\n", string(b)) } else { for _, r := range probeResults { - fmt.Printf("%s:%d (%s)\n", r.Host, r.Port, r.Protocol) + fmt.Printf("%s:%d (%s) @ %s\n", r.Host, r.Port, r.Protocol, r.Timestamp.Format(time.UnixDate)) } } }, diff --git a/cmd/scan.go b/cmd/scan.go index 563629f..5bb5019 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -7,6 +7,7 @@ import ( "os" "path" "strings" + "time" magellan "github.com/OpenCHAMI/magellan/internal" "github.com/OpenCHAMI/magellan/internal/db/sqlite" @@ -76,7 +77,7 @@ var scanCmd = &cobra.Command{ fmt.Printf("%s\n", string(b)) } else { for _, r := range probeStates { - fmt.Printf("%s:%d (%s)\n", r.Host, r.Port, r.Protocol) + fmt.Printf("%s:%d (%s) @ %s\n", r.Host, r.Port, r.Protocol, r.Timestamp.Format(time.UnixDate)) } } } diff --git a/internal/db/sqlite/sqlite.go b/internal/db/sqlite/sqlite.go index 213b2f3..7eb75a8 100644 --- a/internal/db/sqlite/sqlite.go +++ b/internal/db/sqlite/sqlite.go @@ -15,6 +15,7 @@ func CreateProbeResultsIfNotExists(path string) (*sqlx.DB, error) { port INTEGER NOT NULL, protocol TEXT, state INTEGER, + timestamp TIMESTAMP, PRIMARY KEY (host, port) ); ` @@ -41,8 +42,8 @@ func InsertProbeResults(path string, states *[]magellan.ScannedResult) error { // insert all probe states into db tx := db.MustBegin() for _, state := range *states { - sql := `INSERT OR REPLACE INTO magellan_scanned_ports (host, port, protocol, state) - VALUES (:host, :port, :protocol, :state);` + sql := `INSERT OR REPLACE INTO magellan_scanned_ports (host, port, protocol, state, timestamp) + VALUES (:host, :port, :protocol, :state, :timestamp);` _, err := tx.NamedExec(sql, &state) if err != nil { fmt.Printf("failed toexecute transaction: %v\n", err) diff --git a/internal/scan.go b/internal/scan.go index 56b064a..ef4ca41 100644 --- a/internal/scan.go +++ b/internal/scan.go @@ -12,20 +12,22 @@ import ( ) type ScannedResult struct { - Host string `json:"host"` - Port int `json:"port"` - Protocol string `json:"protocol"` - State bool `json:"state"` + Host string `json:"host"` + Port int `json:"port"` + Protocol string `json:"protocol"` + State bool `json:"state"` + Timestamp time.Time `json:"timestamp"` } func rawConnect(host string, ports []int, timeout int, keepOpenOnly bool) []ScannedResult { results := []ScannedResult{} for _, p := range ports { result := ScannedResult{ - Host: host, - Port: p, - Protocol: "tcp", - State: false, + Host: host, + Port: p, + Protocol: "tcp", + State: false, + Timestamp: time.Now(), } t := time.Second * time.Duration(timeout) port := fmt.Sprint(p)