b1ca4b3c5f
Implementing first version for shodan node, missing yet some models, but the overal approach works and can be queried in Ratel.
153 lines
2.3 KiB
Go
153 lines
2.3 KiB
Go
package graph
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/dgraph-io/dgo/v2"
|
|
"github.com/dgraph-io/dgo/v2/protos/api"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
func ConnectToDgraph() (*dgo.Dgraph, error) {
|
|
conn, err := grpc.Dial("localhost:9080", grpc.WithInsecure())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
dgraphClient := dgo.NewDgraphClient(api.NewDgraphClient(conn))
|
|
|
|
err = setupDgraphSchema(dgraphClient)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return dgraphClient, nil
|
|
}
|
|
|
|
func setupDgraphSchema(c *dgo.Dgraph) error {
|
|
err := c.Alter(context.Background(), &api.Operation{
|
|
DropOp: api.Operation_ALL,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = c.Alter(context.Background(), &api.Operation{
|
|
Schema: `
|
|
id: string @index(term) .
|
|
type: string @index(term) .
|
|
ndata: string .
|
|
nodeOne: uid .
|
|
nodeTwo: uid .
|
|
subNode: uid .
|
|
sourceName: string @index(term) .
|
|
timestamp: string .
|
|
created: string .
|
|
modified: string .
|
|
certNode: uid .
|
|
shodanNode: uid .
|
|
|
|
type Node {
|
|
id: string
|
|
type: string
|
|
ndata: string
|
|
created: string
|
|
modified: string
|
|
certNode: CertNode
|
|
shodanNode: ShodanNode
|
|
}
|
|
|
|
type Edge {
|
|
id: string
|
|
nodeOne: uid
|
|
nodeTwo: uid
|
|
timestamp: string
|
|
sourceName: string
|
|
}
|
|
|
|
fingerprint: string .
|
|
notBefore: string .
|
|
notAfter: string .
|
|
cn: string .
|
|
sourceName: string .
|
|
serialNumber: string .
|
|
basicConstraints: string .
|
|
chain: [uid].
|
|
csdata: uid .
|
|
raw: uid .
|
|
|
|
type CertNode {
|
|
id: string
|
|
fingerprint: string
|
|
notBefore: string
|
|
notAfter: string
|
|
cn: string
|
|
sourceName: string
|
|
serialNumber: string
|
|
basicConstraints: string
|
|
raw: CertRaw
|
|
chain: CertNode
|
|
}
|
|
|
|
type CertRaw {
|
|
id: string
|
|
type: string
|
|
created: string
|
|
modified: string
|
|
csdata: string
|
|
}
|
|
|
|
hostData: uid .
|
|
|
|
type ShodanNode {
|
|
id: string
|
|
type: string
|
|
created: string
|
|
modified: string
|
|
hostData: uid
|
|
}
|
|
|
|
product: string .
|
|
hostnames: [string] .
|
|
version: string .
|
|
title: string .
|
|
ip: string .
|
|
os: string .
|
|
organization: string .
|
|
isp: string .
|
|
cpe: [string] .
|
|
asn: string .
|
|
port: int .
|
|
html: string .
|
|
banner: string .
|
|
transport: string .
|
|
domains: [string] .
|
|
timestamp: string .
|
|
|
|
type Hostdata {
|
|
product: string
|
|
hostnames: [string]
|
|
version: string
|
|
title: string
|
|
ip: string
|
|
os: string
|
|
organization: string
|
|
isp: string
|
|
cpe: [string]
|
|
asn: string
|
|
port: int
|
|
html: string
|
|
banner: string
|
|
transport: string
|
|
domains: [string]
|
|
timestamp: string
|
|
}
|
|
|
|
`})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|