Hunter0x7c7
2022-08-11 a82f9cb69f63aaeba40c024960deda7d75b9fece
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
package instman
 
import (
    "context"
 
    core "github.com/v2fly/v2ray-core/v5"
    "github.com/v2fly/v2ray-core/v5/common"
    "github.com/v2fly/v2ray-core/v5/features/extension"
)
 
//go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
 
type InstanceMgr struct {
    config    *Config // nolint: structcheck
    instances map[string]*core.Instance
}
 
func (i InstanceMgr) Type() interface{} {
    return extension.InstanceManagementType()
}
 
func (i InstanceMgr) Start() error {
    return nil
}
 
func (i InstanceMgr) Close() error {
    return nil
}
 
func (i InstanceMgr) ListInstance(ctx context.Context) ([]string, error) {
    var instanceNames []string
    for k := range i.instances {
        instanceNames = append(instanceNames, k)
    }
    return instanceNames, nil
}
 
func (i InstanceMgr) AddInstance(ctx context.Context, name string, config []byte, configType string) error {
    coreConfig, err := core.LoadConfig(configType, config)
    if err != nil {
        return newError("unable to load config").Base(err)
    }
    instance, err := core.New(coreConfig)
    if err != nil {
        return newError("unable to create instance").Base(err)
    }
    i.instances[name] = instance
    return nil
}
 
func (i InstanceMgr) StartInstance(ctx context.Context, name string) error {
    err := i.instances[name].Start()
    if err != nil {
        return newError("failed to start instance").Base(err)
    }
    return nil
}
 
func (i InstanceMgr) StopInstance(ctx context.Context, name string) error {
    err := i.instances[name].Close()
    if err != nil {
        return newError("failed to stop instance").Base(err)
    }
    return nil
}
 
func (i InstanceMgr) UntrackInstance(ctx context.Context, name string) error {
    delete(i.instances, name)
    return nil
}
 
func NewInstanceMgr(ctx context.Context, config *Config) (extension.InstanceManagement, error) {
    return InstanceMgr{instances: map[string]*core.Instance{}}, nil
}
 
func init() {
    common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
        var f extension.InstanceManagement
        var err error
        if f, err = NewInstanceMgr(ctx, config.(*Config)); err != nil {
            return nil, err
        }
        return f, nil
    }))
}