41 lines
1.7 KiB
Go
41 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
agentpb "git.ipao.vip/rogee/go-sip/gen/agent"
|
|
"git.ipao.vip/rogee/go-sip/internal/asterisk"
|
|
"git.ipao.vip/rogee/go-sip/internal/config"
|
|
"git.ipao.vip/rogee/go-sip/internal/rpc"
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
func newSIPOnlyAgentServer(settings config.AgentEnvironment) (*rpc.Server, error) {
|
|
if settings.AgentID == "" || settings.CellID == "" || settings.DispatcherID == "" || settings.SessionPath == "" || len(settings.PeerFingerprints) == 0 {
|
|
return nil, errors.New("SIP-only Agent requires bound identities, persistent sessions and pinned peer certificates")
|
|
}
|
|
for _, path := range []string{settings.AsteriskConfigDir, settings.AsteriskBin, settings.AsteriskLibraryDir} {
|
|
if !filepath.IsAbs(path) {
|
|
return nil, errors.New("native Asterisk paths must be explicit absolute paths")
|
|
}
|
|
}
|
|
if err := rejectLegacyAgentSpool(settings.RecoveryRoot); err != nil {
|
|
return nil, err
|
|
}
|
|
if _, err := os.Lstat(filepath.Join(settings.RecoveryRoot, ".executions")); err == nil {
|
|
return nil, errors.New("legacy Agent execution state requires operator disposition")
|
|
} else if !errors.Is(err, os.ErrNotExist) {
|
|
return nil, err
|
|
}
|
|
loader := asterisk.Loader{ConfigDir: settings.AsteriskConfigDir, Asterisk: settings.AsteriskBin, LibraryDir: settings.AsteriskLibraryDir}
|
|
return rpc.NewServer(rpc.ServerOptions{
|
|
Mode: "sip-only", StatePath: settings.SessionPath,
|
|
ApprovedDispatcherID: settings.DispatcherID,
|
|
Status: &agentpb.AgentStatus{AgentId: settings.AgentID, CellId: settings.CellID, BootId: uuid.NewString(), ProtocolVersion: "agent.v1"},
|
|
RequirePeerCertificate: true, PeerCertificateFingerprints: settings.PeerFingerprints,
|
|
LoadedSIP: loader.LoadedSIP, ApplySIP: loader.Apply,
|
|
}), nil
|
|
}
|