forked from honeytrap/honeytrap
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdirector.go
96 lines (84 loc) · 2.88 KB
/
director.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
* Honeytrap
* Copyright (C) 2016-2017 DutchSec (https://dutchsec.com/)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License version 3 as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License
* version 3 along with this program in the file "LICENSE". If not, see
* <http://www.gnu.org/licenses/agpl-3.0.txt>.
*
* See https://honeytrap.io/ for more details. All requests should be sent to
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
* Honeytrap" logo and retain the original copyright notice. If the display of the
* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
* must display the words "Powered by Honeytrap" and retain the original copyright notice.
*/
package director
import (
"net"
"github.com/BurntSushi/toml"
"github.com/honeytrap/honeytrap/pushers"
)
var (
directors = map[string]func(...func(Director) error) (Director, error){}
)
func Register(key string, fn func(...func(Director) error) (Director, error)) func(...func(Director) error) (Director, error) {
directors[key] = fn
return fn
}
func Get(key string) (func(...func(Director) error) (Director, error), bool) {
if fn, ok := directors[key]; ok {
return fn, true
}
return nil, false
}
func GetAvailableDirectorNames() []string {
var out []string
for key := range directors {
out = append(out, key)
}
return out
}
// Director defines an interface which exposes an interface to allow structures that
// implement this interface allow us to control containers which they provide.
type Director interface {
Dial(net.Conn) (net.Conn, error)
//Dial(network) (net.Conn, error)
//DialUDP() (net.Conn, error)
// Run(ctx context.Context)
}
type SetChanneler interface {
SetChannel(pushers.Channel)
}
func WithChannel(channel pushers.Channel) func(Director) error {
return func(d Director) error {
if sc, ok := d.(SetChanneler); ok {
sc.SetChannel(channel)
}
return nil
}
}
type TomlDecoder interface {
PrimitiveDecode(primValue toml.Primitive, v interface{}) error
}
func WithConfig(c toml.Primitive, decoder TomlDecoder) func(Director) error {
return func(d Director) error {
err := decoder.PrimitiveDecode(c, d)
return err
}
}