Merge remote-tracking branch 'origin/main' into multi-tenant
This commit is contained in:
@@ -44,7 +44,7 @@ type YamlConfig struct {
|
||||
ListenAddr string `yaml:"listenAddr"`
|
||||
ListenPort uint16 `yaml:"listenPort"`
|
||||
PrivateKey string `yaml:"privateKey"`
|
||||
MaxConnNum uint8 `yaml:"maxConnNum"`
|
||||
MaxConnNum int `yaml:"maxConnNum"`
|
||||
Timeout uint16 `yaml:"timeout"`
|
||||
Session string `yaml:"session"`
|
||||
MmlHome string `yaml:"mmlHome"`
|
||||
@@ -57,7 +57,7 @@ type YamlConfig struct {
|
||||
TelnetServer struct {
|
||||
ListenAddr string `yaml:"listenAddr"`
|
||||
ListenPort uint16 `yaml:"listenPort"`
|
||||
MaxConnNum uint8 `yaml:"maxConnNum"`
|
||||
MaxConnNum int `yaml:"maxConnNum"`
|
||||
Timeout uint16 `yaml:"timeout"`
|
||||
Session string `yaml:"session"`
|
||||
MmlHome string `yaml:"mmlHome"`
|
||||
|
||||
@@ -61,8 +61,8 @@ snmpServer:
|
||||
#engineID: "800007db03360102101101"
|
||||
engineID: "8000000004323030313a6462383a3a39313636"
|
||||
trapPort: 34958
|
||||
trapListen: true
|
||||
trapBool: true
|
||||
trapListen: false
|
||||
trapBool: false
|
||||
trapTick: 60
|
||||
timeOut: 5
|
||||
trapTarget: "2001:db8::9219"
|
||||
|
||||
25
sshsvc/setHLRServiceState
Normal file
25
sshsvc/setHLRServiceState
Normal file
@@ -0,0 +1,25 @@
|
||||
#!/bin/bash
|
||||
|
||||
TargetIP="[2001:db8::9166]"
|
||||
PORT="34957"
|
||||
|
||||
case "$1" in
|
||||
1)
|
||||
echo -n "Set HLR state link down ... "
|
||||
snmpset -v3 -l noAuthNoPriv -u manager ${TargetIP}:${PORT} .1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0 i 1 >/dev/null
|
||||
echo "done"
|
||||
;;
|
||||
2)
|
||||
echo -n "Set HLR state link up ... "
|
||||
snmpset -v3 -l noAuthNoPriv -u manager ${TargetIP}:${PORT} .1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0 i 2 >/dev/null
|
||||
echo "done"
|
||||
;;
|
||||
3)
|
||||
echo -n "Set HLR state authentication failure ... "
|
||||
snmpset -v3 -l noAuthNoPriv -u manager ${TargetIP}:${PORT} .1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0 i 3 >/dev/null
|
||||
echo "done"
|
||||
;;
|
||||
*)
|
||||
echo "Unknown state ($1)"
|
||||
;;
|
||||
esac
|
||||
@@ -33,8 +33,13 @@ type SNMPService struct {
|
||||
|
||||
ListenHost string
|
||||
TrapHost string
|
||||
SysDescr string
|
||||
SysService int
|
||||
|
||||
SysName string
|
||||
SysDescr string
|
||||
SysLocation string
|
||||
SysContact string
|
||||
SysStatus string
|
||||
SysService int
|
||||
}
|
||||
|
||||
func (s *SNMPService) getAuthProto() g.SnmpV3AuthProtocol {
|
||||
@@ -135,7 +140,39 @@ func (s *SNMPService) StartSNMPServer() {
|
||||
func (s *SNMPService) handleOIDs() []*GoSNMPServer.PDUValueControlItem {
|
||||
customOIDs := []*GoSNMPServer.PDUValueControlItem{
|
||||
{
|
||||
OID: "1.3.6.1.2.1.1.1.0",
|
||||
OID: "1.3.6.1.4.1.1379.2.3.3.3.1.1.1.0",
|
||||
Type: g.OctetString,
|
||||
OnGet: func() (value interface{}, err error) {
|
||||
return s.SysName, nil
|
||||
},
|
||||
OnSet: func(value interface{}) error {
|
||||
// 将[]uint8转换为string
|
||||
if v, ok := value.([]uint8); ok {
|
||||
s.SysName = string(v)
|
||||
log.Printf("Set request for OID 1.3.6.1.4.1.1379.2.3.3.3.1.1.1.0 with value %v", s.SysName)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
{
|
||||
OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.2.0",
|
||||
Type: g.OctetString,
|
||||
OnGet: func() (value interface{}, err error) {
|
||||
return s.SysStatus, nil
|
||||
},
|
||||
OnSet: func(value interface{}) error {
|
||||
// 将[]uint8转换为string
|
||||
if v, ok := value.([]uint8); ok {
|
||||
s.SysStatus = string(v)
|
||||
log.Printf("Set request for OID 1.3.6.1.4.1.1379.2.3.3.3.1.1.2.0 with value %v", s.SysStatus)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
{
|
||||
OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.3.0",
|
||||
Type: g.OctetString,
|
||||
OnGet: func() (value interface{}, err error) {
|
||||
return s.SysDescr, nil
|
||||
@@ -144,36 +181,80 @@ func (s *SNMPService) handleOIDs() []*GoSNMPServer.PDUValueControlItem {
|
||||
// 将[]uint8转换为string
|
||||
if v, ok := value.([]uint8); ok {
|
||||
s.SysDescr = string(v)
|
||||
log.Printf("Set request for OID 1.3.6.1.2.1.1.1.0 with value %v", s.SysDescr)
|
||||
log.Printf("Set request for OID .1.3.6.1.4.1.1379.2.3.3.3.1.1.3.0 with value %v", s.SysDescr)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
{
|
||||
OID: "1.3.6.1.2.1.1.3.0",
|
||||
OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.4.0",
|
||||
Type: g.OctetString,
|
||||
OnGet: func() (value interface{}, err error) {
|
||||
return s.SysLocation, nil
|
||||
},
|
||||
OnSet: func(value interface{}) error {
|
||||
// 将[]uint8转换为string
|
||||
if v, ok := value.([]uint8); ok {
|
||||
s.SysLocation = string(v)
|
||||
log.Printf("Set request for OID .1.3.6.1.4.1.1379.2.3.3.3.1.1.4.0 with value %v", s.SysLocation)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
{
|
||||
OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.5.0",
|
||||
Type: g.OctetString,
|
||||
OnGet: func() (value interface{}, err error) {
|
||||
return s.SysContact, nil
|
||||
},
|
||||
OnSet: func(value interface{}) error {
|
||||
// 将[]uint8转换为string
|
||||
if v, ok := value.([]uint8); ok {
|
||||
s.SysContact = string(v)
|
||||
log.Printf("Set request for OID .1.3.6.1.4.1.1379.2.3.3.3.1.1.5.0 with value %v", s.SysContact)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
{
|
||||
OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.7.0",
|
||||
Type: g.TimeTicks,
|
||||
OnGet: func() (value interface{}, err error) {
|
||||
return uint32(time.Now().Unix()), nil
|
||||
},
|
||||
},
|
||||
{
|
||||
OID: "1.3.6.1.2.1.1.7.0",
|
||||
OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0",
|
||||
Type: g.Integer,
|
||||
OnGet: func() (value interface{}, err error) {
|
||||
return s.SysService, nil
|
||||
},
|
||||
OnSet: func(value interface{}) error {
|
||||
// 将[]uint8转换为string
|
||||
if v, ok := value.(int); ok {
|
||||
s.SysService = v
|
||||
log.Printf("Set request for OID 1.3.6.1.2.1.1.7.0 with value %v", s.SysService)
|
||||
log.Printf("Set request for OID .1.3.6.1.4.1.1379.2.3.3.3.1.1.9.0 with value %v", s.SysService)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
}
|
||||
// 为 GETBULK 新增处理 OIDs
|
||||
bulkOIDs := &GoSNMPServer.PDUValueControlItem{
|
||||
OID: ".1.3.6.1.4.1.1379.2.3.3.3.1.1", // 这里是您想要支持 GETBULK 的 OID 前缀
|
||||
Type: g.OctetString,
|
||||
OnGet: func() (value interface{}, err error) {
|
||||
// 假设我们返回一百度值,您可以根据您的实现进行调整
|
||||
values := []interface{}{s.SysName, s.SysStatus, s.SysDescr, s.SysLocation, s.SysContact, uint32(time.Now().Unix()), s.SysService} // 可以从其他结构中获取真实值
|
||||
return values, nil
|
||||
},
|
||||
}
|
||||
|
||||
customOIDs = append(customOIDs, bulkOIDs)
|
||||
|
||||
// 获取mibImps.All()返回的OID列表
|
||||
mibOIDs := mibImps.All()
|
||||
|
||||
@@ -311,27 +392,38 @@ func (s *SNMPService) SendPeriodicTraps(gs *g.GoSNMP) {
|
||||
|
||||
// 1. 设备链路连接失败时发送Trap (LinkDown)
|
||||
func (s *SNMPService) sendLinkDownTrap(gs *g.GoSNMP, ifIndex int, ifDescr string) {
|
||||
err := gs.Connect()
|
||||
if err != nil {
|
||||
log.Fatalf("Connect() err: %v", err)
|
||||
}
|
||||
defer gs.Conn.Close()
|
||||
|
||||
trap := g.SnmpTrap{
|
||||
Variables: []g.SnmpPDU{
|
||||
{
|
||||
Name: ".1.3.6.1.2.1.2.2.1.1", // ifIndex
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.1", // linkDown
|
||||
Type: g.OctetString,
|
||||
Value: ".1.3.6.1.4.1.1379.2.3.3.3.3.1",
|
||||
},
|
||||
{
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.1.1", // ifIndex
|
||||
Type: g.Integer,
|
||||
Value: ifIndex,
|
||||
},
|
||||
{
|
||||
Name: ".1.3.6.1.2.1.2.2.1.2", // ifDescr
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.1.2", // ifDescr
|
||||
Type: g.OctetString,
|
||||
Value: ifDescr,
|
||||
},
|
||||
{
|
||||
Name: ".1.3.6.1.6.3.1.1.5.3", // linkDown
|
||||
Type: g.ObjectIdentifier,
|
||||
Value: ".1.3.6.1.6.3.1.1.5.3",
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.4", // severity OID
|
||||
Type: g.Integer,
|
||||
Value: 2, // event
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
_, err := gs.SendTrap(trap)
|
||||
_, err = gs.SendTrap(trap)
|
||||
if err != nil {
|
||||
log.Printf("error sending LinkDown trap: %s", err)
|
||||
} else {
|
||||
@@ -341,27 +433,38 @@ func (s *SNMPService) sendLinkDownTrap(gs *g.GoSNMP, ifIndex int, ifDescr string
|
||||
|
||||
// 2. 设备链路恢复正常时发送Trap (LinkUp)
|
||||
func (s *SNMPService) sendLinkUpTrap(gs *g.GoSNMP, ifIndex int, ifDescr string) {
|
||||
err := gs.Connect()
|
||||
if err != nil {
|
||||
log.Fatalf("Connect() err: %v", err)
|
||||
}
|
||||
defer gs.Conn.Close()
|
||||
|
||||
trap := g.SnmpTrap{
|
||||
Variables: []g.SnmpPDU{
|
||||
{
|
||||
Name: ".1.3.6.1.2.1.2.2.1.1", // ifIndex
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.2", // linkUp
|
||||
Type: g.OctetString,
|
||||
Value: ".1.3.6.1.4.1.1379.2.3.3.3.3.2",
|
||||
},
|
||||
{
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.2.1", // ifIndex
|
||||
Type: g.Integer,
|
||||
Value: ifIndex,
|
||||
},
|
||||
{
|
||||
Name: ".1.3.6.1.2.1.2.2.1.2", // ifDescr
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.2.2", // ifDescr
|
||||
Type: g.OctetString,
|
||||
Value: ifDescr,
|
||||
},
|
||||
{
|
||||
Name: ".1.3.6.1.6.3.1.1.5.4", // linkUp
|
||||
Type: g.ObjectIdentifier,
|
||||
Value: ".1.3.6.1.6.3.1.1.5.4",
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.4", // severity OID
|
||||
Type: g.Integer,
|
||||
Value: 5, // event
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
_, err := gs.SendTrap(trap)
|
||||
_, err = gs.SendTrap(trap)
|
||||
if err != nil {
|
||||
log.Printf("error sending LinkUp trap: %s", err)
|
||||
} else {
|
||||
@@ -371,27 +474,38 @@ func (s *SNMPService) sendLinkUpTrap(gs *g.GoSNMP, ifIndex int, ifDescr string)
|
||||
|
||||
// 3. 设备鉴权失败时发送Trap (AuthenticationFailure)
|
||||
func (s *SNMPService) sendAuthFailureTrap(gs *g.GoSNMP, username, descr string) {
|
||||
err := gs.Connect()
|
||||
if err != nil {
|
||||
log.Fatalf("Connect() err: %v", err)
|
||||
}
|
||||
defer gs.Conn.Close()
|
||||
|
||||
trap := g.SnmpTrap{
|
||||
Variables: []g.SnmpPDU{
|
||||
{
|
||||
Name: ".1.3.6.1.6.3.1.1.5.5", // authenticationFailure
|
||||
Type: g.ObjectIdentifier,
|
||||
Value: ".1.3.6.1.6.3.1.1.5.5",
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.3", // authenticationFailure
|
||||
Type: g.OctetString,
|
||||
Value: ".1.3.6.1.4.1.1379.2.3.3.3.3.3",
|
||||
},
|
||||
{
|
||||
Name: ".1.3.6.1.4.1.2021.251.1", // 自定义OID,用于记录失败的用户名
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.3.1", // 自定义OID,用于记录失败的用户名
|
||||
Type: g.OctetString,
|
||||
Value: username,
|
||||
},
|
||||
{
|
||||
Name: ".1.3.6.1.4.1.2021.252.1", // 自定义OID,用于记录描述
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.3.3.2", // 自定义OID,用于记录描述
|
||||
Type: g.OctetString,
|
||||
Value: descr,
|
||||
},
|
||||
{
|
||||
Name: ".1.3.6.1.4.1.1379.2.3.3.3.4", // severity OID
|
||||
Type: g.Integer,
|
||||
Value: 4, // event
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
_, err := gs.SendTrap(trap)
|
||||
_, err = gs.SendTrap(trap)
|
||||
if err != nil {
|
||||
log.Printf("error sending AuthenticationFailure trap: %s", err)
|
||||
} else {
|
||||
|
||||
@@ -155,10 +155,14 @@ func main() {
|
||||
TimeOut: conf.SNMPServer.TimeOut,
|
||||
TrapTarget: conf.SNMPServer.TrapTarget,
|
||||
|
||||
ListenHost: conf.SNMPServer.ListenAddr + ":" + strconv.Itoa(int(conf.SNMPServer.ListenPort)),
|
||||
TrapHost: conf.SNMPServer.ListenAddr + ":" + strconv.Itoa(int(conf.SNMPServer.TrapPort)),
|
||||
SysDescr: "HLR server",
|
||||
SysService: 0,
|
||||
ListenHost: conf.SNMPServer.ListenAddr + ":" + strconv.Itoa(int(conf.SNMPServer.ListenPort)),
|
||||
TrapHost: conf.SNMPServer.ListenAddr + ":" + strconv.Itoa(int(conf.SNMPServer.TrapPort)),
|
||||
SysName: "HLR-0",
|
||||
SysStatus: "Normal",
|
||||
SysDescr: "HLR server(sysNO=0)",
|
||||
SysLocation: "Shanghai",
|
||||
SysContact: "",
|
||||
SysService: 0,
|
||||
}
|
||||
|
||||
go snmpSvc.StartSNMPServer()
|
||||
@@ -375,7 +379,7 @@ func handleSSHConnection(conn net.Conn, serverConfig *ssh.ServerConfig) {
|
||||
if sshCC > int(conf.Sshd.MaxConnNum) {
|
||||
sshMu.Unlock()
|
||||
log.Error("Maximum number of connections exceeded")
|
||||
//conn.Write([]byte("Reach max connections"))
|
||||
channel.Write([]byte(fmt.Sprintf("Connection limit reached (limit=%d). Try again later.\r\n", conf.Sshd.MaxConnNum)))
|
||||
conn.Close()
|
||||
continue
|
||||
}
|
||||
@@ -442,15 +446,19 @@ func handleSSHShell(sshConn *ssh.ServerConn, channel ssh.Channel) {
|
||||
Version: global.Version,
|
||||
Output: mmlp.DefaultFormatType,
|
||||
MmlHome: conf.Sshd.MmlHome,
|
||||
Limit: 50,
|
||||
Limit: conf.Sshd.MaxConnNum,
|
||||
User: sshConn.User(),
|
||||
SessionToken: fmt.Sprintf("%x", sshConn.SessionID()),
|
||||
HttpUri: conf.OMC.HttpUri,
|
||||
UserAgent: config.GetDefaultUserAgent(),
|
||||
TagNE: conf.Sshd.TagNE,
|
||||
}
|
||||
|
||||
term := term.NewTerminal(channel, fmt.Sprintf("[%s@%s]> ", omcMmlVar.User, omcMmlVar.TagNE))
|
||||
msg := fmt.Sprintf("\r\nWelcome to the %s server!\r\n", strings.ToUpper(omcMmlVar.TagNE))
|
||||
term.Write([]byte(msg))
|
||||
msg = fmt.Sprintf("Last login: %s from %s \r\n\r\n", time.Now().Format(time.RFC1123), sshConn.RemoteAddr())
|
||||
term.Write([]byte(msg))
|
||||
|
||||
// 启动交互式shell会话
|
||||
for {
|
||||
line, err := term.ReadLine()
|
||||
@@ -468,6 +476,13 @@ func handleSSHShell(sshConn *ssh.ServerConn, channel ssh.Channel) {
|
||||
}
|
||||
var response string
|
||||
switch cmdline {
|
||||
case "hello":
|
||||
term.Write([]byte("Hello, world!\r\n"))
|
||||
goto continueLoop
|
||||
case "time":
|
||||
response = fmt.Sprintf("Current time: %s\r\n", time.Now().Format(time.RFC1123))
|
||||
term.Write([]byte(response))
|
||||
goto continueLoop
|
||||
case "exit", "quit":
|
||||
goto exitLoop
|
||||
case "":
|
||||
|
||||
@@ -18,7 +18,7 @@ type TelnetHandler struct {
|
||||
UserName string
|
||||
Password string
|
||||
AuthType string
|
||||
MaxConnNum uint8
|
||||
MaxConnNum int
|
||||
TagNE string
|
||||
ListenHost string
|
||||
|
||||
@@ -65,7 +65,8 @@ func (t *TelnetHandler) StartTelnetServer() {
|
||||
t.mu.Lock()
|
||||
if t.connCount >= int(t.MaxConnNum) {
|
||||
t.mu.Unlock()
|
||||
io.WriteString(conn, "Connection limit reached. Try again later.\r\n")
|
||||
msg := fmt.Sprintf("Connection limit reached (limit=%d). Try again later.\r\n", t.MaxConnNum)
|
||||
io.WriteString(conn, msg)
|
||||
conn.Close()
|
||||
continue
|
||||
}
|
||||
@@ -88,7 +89,8 @@ func (t *TelnetHandler) handleTelnetConnection(conn net.Conn) {
|
||||
writer := bufio.NewWriter(conn)
|
||||
|
||||
// 发送欢迎信息
|
||||
writer.WriteString("Welcome to the Telnet server!\r\n")
|
||||
|
||||
writer.WriteString(fmt.Sprintf("\r\nWelcome to the %s server!\r\n", strings.ToUpper(t.TagNE)))
|
||||
writer.Flush()
|
||||
|
||||
// 请求用户名
|
||||
@@ -129,7 +131,8 @@ func (t *TelnetHandler) handleTelnetConnection(conn net.Conn) {
|
||||
writer.Flush()
|
||||
|
||||
if t.handleTelnetAuth(t.AuthType, user, pass) {
|
||||
writer.WriteString("\r\nAuthentication successful!\r\n")
|
||||
msg := fmt.Sprintf("\r\n\r\nLast login: %s from %s \r\n\r\n", time.Now().Format(time.RFC1123), conn.RemoteAddr())
|
||||
writer.WriteString(msg)
|
||||
writer.Flush()
|
||||
t.HandleCommands(user, t.TagNE, reader, writer)
|
||||
} else {
|
||||
@@ -181,7 +184,7 @@ func (t *TelnetHandler) HandleCommands(user, tag string, reader *bufio.Reader, w
|
||||
case "time":
|
||||
writer.WriteString(fmt.Sprintf("\r\nCurrent time: %s\r\n", time.Now().Format(time.RFC1123)))
|
||||
case "exit", "quit":
|
||||
writer.WriteString("\r\nGoodbye!\r\n")
|
||||
writer.WriteString("\r\n\r\nGoodbye!\r\n")
|
||||
writer.Flush()
|
||||
return
|
||||
case "":
|
||||
|
||||
Reference in New Issue
Block a user