package controller
import (
"context"
webcli "github.com/goodrain/rainbond/api/webcli/app"
"github.com/goodrain/rainbond/config/configs"
"github.com/goodrain/rainbond/pkg/component/storage"
"github.com/gorilla/websocket"
"net/http"
"os"
"path"
"github.com/go-chi/chi"
"github.com/goodrain/rainbond/api/handler"
"github.com/goodrain/rainbond/api/proxy"
ctxutil "github.com/goodrain/rainbond/api/util/ctx"
"github.com/goodrain/rainbond/util/constants"
"github.com/sirupsen/logrus"
)
var app *webcli.App
func GetWebCli() *webcli.App {
if app == nil {
app = &webcli.App{}
app.SetUpgrader(&websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
Subprotocols: []string{"webtty"},
CheckOrigin: func(r *http.Request) bool {
return true
},
})
if err := app.CreateKubeClient(); err != nil {
logrus.Errorf("create kube client error: %v", err)
}
}
return app
}
type DockerConsole struct {
socketproxy proxy.Proxy
}
func (d DockerConsole) Get(w http.ResponseWriter, r *http.Request) {
d.socketproxy.Proxy(w, r)
}
var dockerLog *DockerLog
type DockerLog struct {
socketproxy proxy.Proxy
}
func GetDockerLog() *DockerLog {
if dockerLog == nil {
dockerLog = &DockerLog{
socketproxy: proxy.CreateProxy("dockerlog", "websocket", configs.Default().APIConfig.EventLogEndpoints),
}
}
return dockerLog
}
func (d DockerLog) Get(w http.ResponseWriter, r *http.Request) {
d.socketproxy.Proxy(w, r)
}
type MonitorMessage struct {
socketproxy proxy.Proxy
}
var monitorMessage *MonitorMessage
func GetMonitorMessage() *MonitorMessage {
if monitorMessage == nil {
monitorMessage = &MonitorMessage{
socketproxy: proxy.CreateProxy("monitormessage", "websocket", configs.Default().APIConfig.EventLogEndpoints),
}
}
return monitorMessage
}
func (d MonitorMessage) Get(w http.ResponseWriter, r *http.Request) {
d.socketproxy.Proxy(w, r)
}
type EventLog struct {
socketproxy proxy.Proxy
}
var eventLog *EventLog
func GetEventLog() *EventLog {
if eventLog == nil {
eventLog = &EventLog{
socketproxy: proxy.CreateProxy("eventlog", "websocket", configs.Default().APIConfig.EventLogEndpoints),
}
}
return eventLog
}
func (d EventLog) Get(w http.ResponseWriter, r *http.Request) {
d.socketproxy.Proxy(w, r)
}
type LogFile struct {
Root string
}
var logFile *LogFile
func GetLogFile() *LogFile {
root := os.Getenv("SERVICE_LOG_ROOT")
if root == "" {
root = constants.GrdataLogPath
}
logrus.Infof("service logs file root path is :%s", root)
if logFile == nil {
logFile = &LogFile{
Root: root,
}
}
return logFile
}
func (d LogFile) Get(w http.ResponseWriter, r *http.Request) {
gid := chi.URLParam(r, "gid")
filename := chi.URLParam(r, "filename")
filePath := path.Join(d.Root, gid, filename)
if isExist(filePath) {
storage.Default().StorageCli.ServeFile(w, r, filePath)
} else {
w.WriteHeader(404)
}
}
func isExist(filename string) bool {
_, err := os.Stat(filename)
return err == nil || os.IsExist(err)
}
func (d LogFile) GetInstallLog(w http.ResponseWriter, r *http.Request) {
filename := chi.URLParam(r, "filename")
filePath := d.Root + filename
if isExist(filePath) {
storage.Default().StorageCli.ServeFile(w, r, filePath)
} else {
w.WriteHeader(404)
}
}
var pubSubControll *PubSubControll
type PubSubControll struct {
socketproxy proxy.Proxy
}
func GetPubSubControll() *PubSubControll {
if pubSubControll == nil {
pubSubControll = &PubSubControll{
socketproxy: proxy.CreateProxy("dockerlog", "websocket", configs.Default().APIConfig.EventLogEndpoints),
}
}
return pubSubControll
}
func (d PubSubControll) Get(w http.ResponseWriter, r *http.Request) {
serviceID := chi.URLParam(r, "serviceID")
name, _ := handler.GetEventHandler().GetLogInstance(serviceID)
if name != "" {
r.URL.Query().Add("host_id", name)
r = r.WithContext(context.WithValue(r.Context(), proxy.ContextKey("host_id"), name))
}
d.socketproxy.Proxy(w, r)
}
func (d PubSubControll) GetHistoryLog(w http.ResponseWriter, r *http.Request) {
serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string)
name, _ := handler.GetEventHandler().GetLogInstance(serviceID)
if name != "" {
r.URL.Query().Add("host_id", name)
r = r.WithContext(context.WithValue(r.Context(), proxy.ContextKey("host_id"), name))
}
d.socketproxy.Proxy(w, r)
}