mirror of
https://github.com/gravitational/teleport.git
synced 2026-11-03 16:38:35 +08:00
156 lines
4.9 KiB
Go
156 lines
4.9 KiB
Go
/**
|
|
* Copyright 2021 Gravitational, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package web
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gravitational/teleport/api/types"
|
|
"github.com/gravitational/teleport/lib/reversetunnel"
|
|
"github.com/gravitational/teleport/lib/web/ui"
|
|
|
|
"github.com/gravitational/trace"
|
|
"github.com/julienschmidt/httprouter"
|
|
)
|
|
|
|
// clusterKubesGet returns a list of kube clusters in a form the UI can present.
|
|
func (h *Handler) clusterKubesGet(w http.ResponseWriter, r *http.Request, p httprouter.Params, ctx *SessionContext, site reversetunnel.RemoteSite) (interface{}, error) {
|
|
clt, err := ctx.GetUserClient(site)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
resp, err := listResources(clt, r, types.KindKubernetesCluster)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
clusters, err := types.ResourcesWithLabels(resp.Resources).AsKubeClusters()
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
return listResourcesGetResponse{
|
|
Items: ui.MakeKubeClusters(clusters),
|
|
StartKey: resp.NextKey,
|
|
TotalCount: resp.TotalCount,
|
|
}, nil
|
|
}
|
|
|
|
// clusterDatabasesGet returns a list of db servers in a form the UI can present.
|
|
func (h *Handler) clusterDatabasesGet(w http.ResponseWriter, r *http.Request, p httprouter.Params, ctx *SessionContext, site reversetunnel.RemoteSite) (interface{}, error) {
|
|
clt, err := ctx.GetUserClient(site)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
resp, err := listResources(clt, r, types.KindDatabaseServer)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
servers, err := types.ResourcesWithLabels(resp.Resources).AsDatabaseServers()
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
// Make a list of all proxied databases.
|
|
var databases []types.Database
|
|
for _, server := range servers {
|
|
databases = append(databases, server.GetDatabase())
|
|
}
|
|
|
|
return listResourcesGetResponse{
|
|
Items: ui.MakeDatabases(h.auth.clusterName, databases),
|
|
StartKey: resp.NextKey,
|
|
TotalCount: resp.TotalCount,
|
|
}, nil
|
|
}
|
|
|
|
// clusterDesktopsGet returns a list of desktops in a form the UI can present.
|
|
func (h *Handler) clusterDesktopsGet(w http.ResponseWriter, r *http.Request, p httprouter.Params, ctx *SessionContext, site reversetunnel.RemoteSite) (interface{}, error) {
|
|
clt, err := ctx.GetUserClient(site)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
resp, err := listResources(clt, r, types.KindWindowsDesktop)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
windowsDesktops, err := types.ResourcesWithLabels(resp.Resources).AsWindowsDesktops()
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
return listResourcesGetResponse{
|
|
Items: ui.MakeDesktops(windowsDesktops),
|
|
StartKey: resp.NextKey,
|
|
TotalCount: resp.TotalCount,
|
|
}, nil
|
|
}
|
|
|
|
// clusterDesktopServicesGet returns a list of desktop services in a form the UI can present.
|
|
func (h *Handler) clusterDesktopServicesGet(w http.ResponseWriter, r *http.Request, p httprouter.Params, ctx *SessionContext, site reversetunnel.RemoteSite) (interface{}, error) {
|
|
// Get a client to the Auth Server with the logged in user's identity. The
|
|
// identity of the logged in user is used to fetch the list of desktop services.
|
|
clt, err := ctx.GetUserClient(site)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
resp, err := listResources(clt, r, types.KindWindowsDesktopService)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
desktopServices, err := types.ResourcesWithLabels(resp.Resources).AsWindowsDesktopServices()
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
return listResourcesGetResponse{
|
|
Items: ui.MakeDesktopServices(desktopServices),
|
|
StartKey: resp.NextKey,
|
|
TotalCount: resp.TotalCount,
|
|
}, nil
|
|
}
|
|
|
|
// getDesktopHandle returns a desktop.
|
|
func (h *Handler) getDesktopHandle(w http.ResponseWriter, r *http.Request, p httprouter.Params, ctx *SessionContext, site reversetunnel.RemoteSite) (interface{}, error) {
|
|
clt, err := ctx.GetUserClient(site)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
|
|
desktopName := p.ByName("desktopName")
|
|
|
|
windowsDesktops, err := clt.GetWindowsDesktops(r.Context(),
|
|
types.WindowsDesktopFilter{Name: desktopName})
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
if len(windowsDesktops) == 0 {
|
|
return nil, trace.NotFound("expected at least one desktop, got 0")
|
|
}
|
|
// windowsDesktops may contain the same desktop multiple times
|
|
// if multiple Windows Desktop Services are in use. We only need
|
|
// to see the desktop once in the UI, so just take the first one.
|
|
return ui.MakeDesktop(windowsDesktops[0]), nil
|
|
}
|