2020-02-25 10:05:31 +01:00
|
|
|
package plugins
|
|
|
|
|
|
|
|
import (
|
2020-03-04 15:16:59 +01:00
|
|
|
"context"
|
|
|
|
"encoding/json"
|
2020-02-25 10:05:31 +01:00
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/CaliDog/certstream-go"
|
2020-03-04 15:16:59 +01:00
|
|
|
"github.com/dgraph-io/dgo/v2"
|
|
|
|
"github.com/dgraph-io/dgo/v2/protos/api"
|
2020-02-25 10:05:31 +01:00
|
|
|
"github.com/jmoiron/jsonq"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
"gitlab.dcso.lolcat/LABS/styx/filters"
|
|
|
|
"gitlab.dcso.lolcat/LABS/styx/models"
|
|
|
|
)
|
|
|
|
|
|
|
|
// CertStreamPlugin defines the general CertStreamPlugin structure.
|
|
|
|
type CertStreamPlugin struct {
|
|
|
|
Stream chan jsonq.JsonQuery
|
|
|
|
ErrStream chan error
|
|
|
|
StopChan chan bool
|
|
|
|
StoppedChan chan bool
|
|
|
|
Running bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// Initialize initialises the certstream configuration.
|
|
|
|
func (c *CertStreamPlugin) Initialize() bool {
|
|
|
|
if !viper.GetBool("certstream.activated") {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
logrus.Info("certstream plugin is activated")
|
|
|
|
stream, errStream := certstream.CertStreamEventStream(false)
|
|
|
|
c.Stream = stream
|
|
|
|
c.ErrStream = errStream
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
// Run runs the Certstream plugin.
|
2020-03-04 15:16:59 +01:00
|
|
|
func (c *CertStreamPlugin) Run(wg *sync.WaitGroup, dgraphClient *dgo.Dgraph) {
|
2020-02-25 10:05:31 +01:00
|
|
|
if !c.Running {
|
|
|
|
c.StopChan = make(chan bool)
|
|
|
|
wg.Add(1)
|
2020-03-04 15:16:59 +01:00
|
|
|
go c.doRun(dgraphClient)
|
2020-02-25 10:05:31 +01:00
|
|
|
c.Running = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Stop stops the Certstream plugin.
|
|
|
|
func (c *CertStreamPlugin) Stop(wg *sync.WaitGroup) {
|
|
|
|
if c.Running {
|
|
|
|
c.StopChan = make(chan bool)
|
|
|
|
close(c.StopChan)
|
|
|
|
<-c.StopChan
|
|
|
|
wg.Done()
|
|
|
|
c.Running = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-04 15:16:59 +01:00
|
|
|
func (c *CertStreamPlugin) doRun(graphClient *dgo.Dgraph) {
|
2020-02-25 10:05:31 +01:00
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case jq := <-c.Stream:
|
|
|
|
if data, err := models.ExtractCertFromStream(jq); err == nil {
|
|
|
|
|
2020-03-19 09:27:15 +01:00
|
|
|
allDomains := data.CSData.LeafCert.AllDomains
|
2020-02-25 10:05:31 +01:00
|
|
|
for _, domain := range allDomains {
|
|
|
|
if filters.RunDomainFilters(domain) {
|
|
|
|
rawNode := models.WrapCertStreamData(*data)
|
2020-03-19 09:27:15 +01:00
|
|
|
// models.SaveCertStreamRaw("raw_certstream.json", rawNode)
|
2020-02-25 10:05:31 +01:00
|
|
|
|
|
|
|
certNode := models.BuildCertNode(rawNode)
|
2020-05-20 10:03:28 +02:00
|
|
|
// models.SaveCertNode("cert_nodes.json", certNode)
|
2020-02-25 10:05:31 +01:00
|
|
|
mainNode := models.BuildNode("node", "certstream", certNode.ID)
|
2020-05-20 10:03:28 +02:00
|
|
|
// models.SaveNode("nodes.json", mainNode)
|
|
|
|
// rawEdge := models.BuildEdge("certstream", structs.Map(rawNode), structs.Map(mainNode))
|
|
|
|
// models.SaveEdge(rawEdge)
|
|
|
|
// edge := models.BuildEdge("certstream", structs.Map(mainNode), structs.Map(certNode))
|
|
|
|
// models.SaveEdge(edge)
|
2020-02-25 10:05:31 +01:00
|
|
|
// saveSingleValues(conn, "certstream", "domain", certNode.ID, domain)
|
2020-03-04 15:16:59 +01:00
|
|
|
|
2020-05-18 10:22:08 +02:00
|
|
|
// edge between Node and CertNode
|
|
|
|
e := models.Node{
|
|
|
|
ID: mainNode.ID,
|
2020-08-28 13:34:08 +02:00
|
|
|
NodeType: mainNode.NodeType,
|
2020-05-18 10:22:08 +02:00
|
|
|
NData: mainNode.NData,
|
|
|
|
Created: mainNode.Created,
|
|
|
|
Modified: mainNode.Modified,
|
|
|
|
CertNode: *certNode,
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx := context.Background()
|
2020-03-04 15:16:59 +01:00
|
|
|
mu := &api.Mutation{
|
|
|
|
CommitNow: true,
|
|
|
|
}
|
2020-03-19 09:27:15 +01:00
|
|
|
|
2020-05-18 10:22:08 +02:00
|
|
|
pb, err := json.Marshal(e)
|
2020-03-04 15:16:59 +01:00
|
|
|
if err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
2020-03-19 09:27:15 +01:00
|
|
|
|
2020-05-18 10:22:08 +02:00
|
|
|
mu.SetJson = pb
|
2020-03-19 09:27:15 +01:00
|
|
|
|
2020-05-18 10:22:08 +02:00
|
|
|
_, err = graphClient.NewTxn().Mutate(ctx, mu)
|
2020-03-19 09:27:15 +01:00
|
|
|
if err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
2020-02-25 10:05:31 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
case err := <-c.ErrStream:
|
|
|
|
logrus.Error(err)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|