// Copyright 2022, Chef. All rights reserved. // https://github.com/q191201771/lal // // Use of this source code is governed by a MIT-style license // that can be found in the License file. // // Author: Chef (191201771@qq.com) package logic import ( "github.com/q191201771/lal/pkg/base" "github.com/q191201771/naza/pkg/bininfo" "math" ) // server_manager__api.go // // 支持http-api功能的部分 // func (sm *ServerManager) StatLalInfo() base.LalInfo { var lalInfo base.LalInfo lalInfo.BinInfo = bininfo.StringifySingleLine() lalInfo.LalVersion = base.LalVersion lalInfo.ApiVersion = base.HttpApiVersion lalInfo.NotifyVersion = base.HttpNotifyVersion lalInfo.WebUiVersion = base.HttpWebUiVersion lalInfo.StartTime = sm.serverStartTime lalInfo.ServerId = sm.config.ServerId return lalInfo } func (sm *ServerManager) StatAllGroup() (sgs []base.StatGroup) { sm.mutex.Lock() defer sm.mutex.Unlock() sm.groupManager.Iterate(func(group *Group) bool { sgs = append(sgs, group.GetStat(math.MaxInt32)) return true }) return } func (sm *ServerManager) StatGroup(streamName string) *base.StatGroup { sm.mutex.Lock() defer sm.mutex.Unlock() g := sm.getGroup("", streamName) if g == nil { return nil } // copy var ret base.StatGroup ret = g.GetStat(math.MaxInt32) return &ret } func (sm *ServerManager) CtrlStartRelayPull(info base.ApiCtrlStartRelayPullReq) (ret base.ApiCtrlStartRelayPullResp) { sm.mutex.Lock() defer sm.mutex.Unlock() streamName := info.StreamName if streamName == "" { ctx, err := base.ParseUrl(info.Url, -1) if err != nil { ret.ErrorCode = base.ErrorCodeStartRelayPullFail ret.Desp = err.Error() return } streamName = ctx.LastItemOfPath } // 注意,如果group不存在,我们依然relay pull g := sm.getOrCreateGroup("", streamName) sessionId, err := g.StartPull(info) if err != nil { ret.ErrorCode = base.ErrorCodeStartRelayPullFail ret.Desp = err.Error() } else { ret.ErrorCode = base.ErrorCodeSucc ret.Desp = base.DespSucc ret.Data.StreamName = streamName ret.Data.SessionId = sessionId } return } // CtrlStopRelayPull // // TODO(chef): 整理错误值 func (sm *ServerManager) CtrlStopRelayPull(streamName string) (ret base.ApiCtrlStopRelayPullResp) { sm.mutex.Lock() defer sm.mutex.Unlock() g := sm.getGroup("", streamName) if g == nil { ret.ErrorCode = base.ErrorCodeGroupNotFound ret.Desp = base.DespGroupNotFound return } ret.Data.SessionId = g.StopPull() if ret.Data.SessionId == "" { ret.ErrorCode = base.ErrorCodeSessionNotFound ret.Desp = base.DespSessionNotFound return } ret.ErrorCode = base.ErrorCodeSucc ret.Desp = base.DespSucc return } // CtrlKickSession // // TODO(chef): refactor 不要返回http结果,返回error吧 func (sm *ServerManager) CtrlKickSession(info base.ApiCtrlKickSessionReq) (ret base.ApiCtrlKickSessionResp) { sm.mutex.Lock() defer sm.mutex.Unlock() g := sm.getGroup("", info.StreamName) if g == nil { ret.ErrorCode = base.ErrorCodeGroupNotFound ret.Desp = base.DespGroupNotFound return } if !g.KickSession(info.SessionId) { ret.ErrorCode = base.ErrorCodeSessionNotFound ret.Desp = base.DespSessionNotFound return } ret.ErrorCode = base.ErrorCodeSucc ret.Desp = base.DespSucc return } func (sm *ServerManager) CtrlAddIpBlacklist(info base.ApiCtrlAddIpBlacklistReq) (ret base.ApiCtrlAddIpBlacklistResp) { sm.mutex.Lock() defer sm.mutex.Unlock() sm.ipBlacklist.Add(info.Ip, info.DurationSec) ret.ErrorCode = base.ErrorCodeSucc ret.Desp = base.DespSucc return } func (sm *ServerManager) CtrlStartRtpPub(info base.ApiCtrlStartRtpPubReq) (ret base.ApiCtrlStartRtpPubResp) { sm.mutex.Lock() defer sm.mutex.Unlock() // 注意,如果group不存在,我们依然relay pull g := sm.getOrCreateGroup("", info.StreamName) ret = g.StartRtpPub(info) return }