styx/plugins/pastebin.go
Christopher Talib 9fa5d13bf6 Full text search and indexing some keywords
Some of keywords are indexed and open for full text search, please refer
to the README for more details.

CertStream, Pastebin and Shodan are running as services and can be
searched.

Next steps: building the matcher and creating edges.
2020-05-20 10:03:28 +02:00

110 lines
2.2 KiB
Go

package plugins
import (
"context"
"encoding/json"
"sync"
"time"
"github.com/dgraph-io/dgo/v2"
"github.com/dgraph-io/dgo/v2/protos/api"
"github.com/sirupsen/logrus"
"github.com/spf13/viper"
"gitlab.dcso.lolcat/LABS/styx/models"
)
// PastebinPlugin defines the general PastebinPlugin structure.
type PastebinPlugin struct {
StopChan chan bool
StoppedChan chan bool
Running bool
}
// Initialize initialises the certstream configuration.
func (p *PastebinPlugin) Initialize() bool {
if !viper.GetBool("pastebin.activated") {
return false
}
logrus.Info("pastebin plugin is activated")
return true
}
// Run runs the Pastebin plugin.
func (p *PastebinPlugin) Run(wg *sync.WaitGroup, dgraphClient *dgo.Dgraph) {
if !p.Running {
p.StoppedChan = make(chan bool)
wg.Add(1)
go p.doRun(dgraphClient)
p.Running = true
}
}
// Stop stops the Pastebin plugin.
func (p *PastebinPlugin) Stop(wg *sync.WaitGroup) {
if p.Running {
p.StoppedChan = make(chan bool)
close(p.StopChan)
<-p.StopChan
wg.Done()
p.Running = false
}
}
func (p *PastebinPlugin) doRun(graphClient *dgo.Dgraph) {
for {
select {
default:
pastes, err := models.QueryPastes()
if err != nil {
logrus.Error(err)
}
for _, p := range pastes {
paste, err := models.FetchPaste(p)
if err != nil {
logrus.Error("cannot fetch paste", err)
}
fp := models.FullPaste{
Meta: p,
Full: paste,
Type: "fullPaste",
}
pasteNode := models.BuildPasteNode(&fp)
mainNode := models.BuildNode("node", "pastebin", pasteNode.ID)
// if elastic {
// e.StorePaste(fp)
// }
// models.SavePaste("paste_formatted.json", res)
e := models.Node{
ID: mainNode.ID,
Type: mainNode.Type,
NData: mainNode.NData,
Created: mainNode.Created,
Modified: mainNode.Modified,
PasteNode: *pasteNode,
}
ctx := context.Background()
mu := &api.Mutation{
CommitNow: true,
}
pb, err := json.Marshal(e)
if err != nil {
logrus.Fatal(err)
}
mu.SetJson = pb
_, err = graphClient.NewTxn().Mutate(ctx, mu)
if err != nil {
logrus.Fatal(err)
}
time.Sleep(1 * time.Second)
}
time.Sleep(3 * time.Second)
}
}
}