mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			324 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			324 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Go
		
	
	
	
| package api
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/grafana/grafana/pkg/api/dtos"
 | |
| 	"github.com/grafana/grafana/pkg/bus"
 | |
| 	"github.com/grafana/grafana/pkg/middleware"
 | |
| 	m "github.com/grafana/grafana/pkg/models"
 | |
| 	"github.com/grafana/grafana/pkg/plugins"
 | |
| 	"github.com/grafana/grafana/pkg/setting"
 | |
| )
 | |
| 
 | |
| func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) {
 | |
| 	settings, err := getFrontendSettingsMap(c)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	prefsQuery := m.GetPreferencesWithDefaultsQuery{OrgId: c.OrgId, UserId: c.UserId}
 | |
| 	if err := bus.Dispatch(&prefsQuery); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	prefs := prefsQuery.Result
 | |
| 
 | |
| 	// Read locale from acccept-language
 | |
| 	acceptLang := c.Req.Header.Get("Accept-Language")
 | |
| 	locale := "en-US"
 | |
| 
 | |
| 	if len(acceptLang) > 0 {
 | |
| 		parts := strings.Split(acceptLang, ",")
 | |
| 		locale = parts[0]
 | |
| 	}
 | |
| 
 | |
| 	appUrl := setting.AppUrl
 | |
| 	appSubUrl := setting.AppSubUrl
 | |
| 
 | |
| 	// special case when doing localhost call from phantomjs
 | |
| 	if c.IsRenderCall {
 | |
| 		appUrl = fmt.Sprintf("%s://localhost:%s", setting.Protocol, setting.HttpPort)
 | |
| 		appSubUrl = ""
 | |
| 		settings["appSubUrl"] = ""
 | |
| 	}
 | |
| 
 | |
| 	var data = dtos.IndexViewData{
 | |
| 		User: &dtos.CurrentUser{
 | |
| 			Id:             c.UserId,
 | |
| 			IsSignedIn:     c.IsSignedIn,
 | |
| 			Login:          c.Login,
 | |
| 			Email:          c.Email,
 | |
| 			Name:           c.Name,
 | |
| 			OrgCount:       c.OrgCount,
 | |
| 			OrgId:          c.OrgId,
 | |
| 			OrgName:        c.OrgName,
 | |
| 			OrgRole:        c.OrgRole,
 | |
| 			GravatarUrl:    dtos.GetGravatarUrl(c.Email),
 | |
| 			IsGrafanaAdmin: c.IsGrafanaAdmin,
 | |
| 			LightTheme:     prefs.Theme == "light",
 | |
| 			Timezone:       prefs.Timezone,
 | |
| 			Locale:         locale,
 | |
| 			HelpFlags1:     c.HelpFlags1,
 | |
| 		},
 | |
| 		Settings:                settings,
 | |
| 		Theme:                   prefs.Theme,
 | |
| 		AppUrl:                  appUrl,
 | |
| 		AppSubUrl:               appSubUrl,
 | |
| 		GoogleAnalyticsId:       setting.GoogleAnalyticsId,
 | |
| 		GoogleTagManagerId:      setting.GoogleTagManagerId,
 | |
| 		BuildVersion:            setting.BuildVersion,
 | |
| 		BuildCommit:             setting.BuildCommit,
 | |
| 		NewGrafanaVersion:       plugins.GrafanaLatestVersion,
 | |
| 		NewGrafanaVersionExists: plugins.GrafanaHasUpdate,
 | |
| 	}
 | |
| 
 | |
| 	if setting.DisableGravatar {
 | |
| 		data.User.GravatarUrl = setting.AppSubUrl + "/public/img/transparent.png"
 | |
| 	}
 | |
| 
 | |
| 	if len(data.User.Name) == 0 {
 | |
| 		data.User.Name = data.User.Login
 | |
| 	}
 | |
| 
 | |
| 	themeUrlParam := c.Query("theme")
 | |
| 	if themeUrlParam == "light" {
 | |
| 		data.User.LightTheme = true
 | |
| 		data.Theme = "light"
 | |
| 	}
 | |
| 
 | |
| 	if c.OrgRole == m.ROLE_ADMIN || c.OrgRole == m.ROLE_EDITOR {
 | |
| 		data.NavTree = append(data.NavTree, &dtos.NavLink{
 | |
| 			Text: "Create",
 | |
| 			Id:   "create",
 | |
| 			Icon: "fa fa-fw fa-plus",
 | |
| 			Url:  "#",
 | |
| 			Children: []*dtos.NavLink{
 | |
| 				{Text: "Dashboard", Icon: "gicon gicon-dashboard-new", Url: setting.AppSubUrl + "/dashboard/new"},
 | |
| 				{Text: "Folder", SubTitle: "Create a new folder to organize your dashboards", Id: "folder", Icon: "gicon gicon-folder-new", Url: setting.AppSubUrl + "/dashboards/folder/new"},
 | |
| 				{Text: "Import", SubTitle: "Import dashboard from file or Grafana.com", Id: "import", Icon: "gicon gicon-dashboard-import", Url: setting.AppSubUrl + "/dashboard/import"},
 | |
| 			},
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	dashboardChildNavs := []*dtos.NavLink{
 | |
| 		{Text: "Home", Url: setting.AppSubUrl + "/", Icon: "fa fa-fw fa-home", HideFromTabs: true},
 | |
| 		{Divider: true, HideFromTabs: true},
 | |
| 		{Text: "Manage", Id: "manage-dashboards", Url: setting.AppSubUrl + "/dashboards", Icon: "fa fa-fw fa-sitemap"},
 | |
| 		{Text: "Playlists", Id: "playlists", Url: setting.AppSubUrl + "/playlists", Icon: "fa fa-fw fa-film"},
 | |
| 		{Text: "Snapshots", Id: "snapshots", Url: setting.AppSubUrl + "/dashboard/snapshots", Icon: "icon-gf icon-gf-fw icon-gf-snapshot"},
 | |
| 	}
 | |
| 
 | |
| 	data.NavTree = append(data.NavTree, &dtos.NavLink{
 | |
| 		Text:     "Dashboards",
 | |
| 		Id:       "dashboards",
 | |
| 		SubTitle: "Manage dashboards & folders",
 | |
| 		Icon:     "gicon gicon-dashboard",
 | |
| 		Url:      setting.AppSubUrl + "/",
 | |
| 		Children: dashboardChildNavs,
 | |
| 	})
 | |
| 
 | |
| 	if c.IsSignedIn {
 | |
| 		profileNode := &dtos.NavLink{
 | |
| 			Text:         c.SignedInUser.Name,
 | |
| 			SubTitle:     c.SignedInUser.Login,
 | |
| 			Id:           "profile",
 | |
| 			Img:          data.User.GravatarUrl,
 | |
| 			Url:          setting.AppSubUrl + "/profile",
 | |
| 			HideFromMenu: true,
 | |
| 			Children: []*dtos.NavLink{
 | |
| 				{Text: "Preferences", Id: "profile-settings", Url: setting.AppSubUrl + "/profile", Icon: "fa fa-fw fa-sliders"},
 | |
| 				{Text: "Change Password", Id: "change-password", Url: setting.AppSubUrl + "/profile/password", Icon: "fa fa-fw fa-lock", HideFromMenu: true},
 | |
| 			},
 | |
| 		}
 | |
| 
 | |
| 		if !setting.DisableSignoutMenu {
 | |
| 			// add sign out first
 | |
| 			profileNode.Children = append(profileNode.Children, &dtos.NavLink{
 | |
| 				Text: "Sign out", Id: "sign-out", Url: setting.AppSubUrl + "/logout", Icon: "fa fa-fw fa-sign-out", Target: "_self",
 | |
| 			})
 | |
| 		}
 | |
| 
 | |
| 		data.NavTree = append(data.NavTree, profileNode)
 | |
| 	}
 | |
| 
 | |
| 	if setting.AlertingEnabled && (c.OrgRole == m.ROLE_ADMIN || c.OrgRole == m.ROLE_EDITOR) {
 | |
| 		alertChildNavs := []*dtos.NavLink{
 | |
| 			{Text: "Alert Rules", Id: "alert-list", Url: setting.AppSubUrl + "/alerting/list", Icon: "fa fa-fw fa-list-ul"},
 | |
| 			{Text: "Notification channels", Id: "channels", Url: setting.AppSubUrl + "/alerting/notifications", Icon: "gicon gicon-alert-notification-channel"},
 | |
| 		}
 | |
| 
 | |
| 		data.NavTree = append(data.NavTree, &dtos.NavLink{
 | |
| 			Text:     "Alerting",
 | |
| 			SubTitle: "Alert rules & notifications",
 | |
| 			Id:       "alerting",
 | |
| 			Icon:     "gicon gicon-alert",
 | |
| 			Url:      setting.AppSubUrl + "/alerting/list",
 | |
| 			Children: alertChildNavs,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	enabledPlugins, err := plugins.GetEnabledPlugins(c.OrgId)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	for _, plugin := range enabledPlugins.Apps {
 | |
| 		if plugin.Pinned {
 | |
| 			appLink := &dtos.NavLink{
 | |
| 				Text: plugin.Name,
 | |
| 				Id:   "plugin-page-" + plugin.Id,
 | |
| 				Url:  plugin.DefaultNavUrl,
 | |
| 				Img:  plugin.Info.Logos.Small,
 | |
| 			}
 | |
| 
 | |
| 			for _, include := range plugin.Includes {
 | |
| 				if !c.HasUserRole(include.Role) {
 | |
| 					continue
 | |
| 				}
 | |
| 
 | |
| 				if include.Type == "page" && include.AddToNav {
 | |
| 					link := &dtos.NavLink{
 | |
| 						Url:  setting.AppSubUrl + "/plugins/" + plugin.Id + "/page/" + include.Slug,
 | |
| 						Text: include.Name,
 | |
| 					}
 | |
| 					appLink.Children = append(appLink.Children, link)
 | |
| 				}
 | |
| 
 | |
| 				if include.Type == "dashboard" && include.AddToNav {
 | |
| 					link := &dtos.NavLink{
 | |
| 						Url:  setting.AppSubUrl + "/dashboard/db/" + include.Slug,
 | |
| 						Text: include.Name,
 | |
| 					}
 | |
| 					appLink.Children = append(appLink.Children, link)
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if len(appLink.Children) > 0 && c.OrgRole == m.ROLE_ADMIN {
 | |
| 				appLink.Children = append(appLink.Children, &dtos.NavLink{Divider: true})
 | |
| 				appLink.Children = append(appLink.Children, &dtos.NavLink{Text: "Plugin Config", Icon: "fa fa-fw fa-cog", Url: setting.AppSubUrl + "/plugins/" + plugin.Id + "/edit"})
 | |
| 			}
 | |
| 
 | |
| 			if len(appLink.Children) > 0 {
 | |
| 				data.NavTree = append(data.NavTree, appLink)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if c.OrgRole == m.ROLE_ADMIN {
 | |
| 		cfgNode := &dtos.NavLink{
 | |
| 			Id:       "cfg",
 | |
| 			Text:     "Configuration",
 | |
| 			SubTitle: "Organization: " + c.OrgName,
 | |
| 			Icon:     "fa fa-fw fa-cog",
 | |
| 			Url:      setting.AppSubUrl + "/datasources",
 | |
| 			Children: []*dtos.NavLink{
 | |
| 				{
 | |
| 					Text:        "Data Sources",
 | |
| 					Icon:        "gicon gicon-datasources",
 | |
| 					Description: "Add and configure data sources",
 | |
| 					Id:          "datasources",
 | |
| 					Url:         setting.AppSubUrl + "/datasources",
 | |
| 				},
 | |
| 				{
 | |
| 					Text:        "Users",
 | |
| 					Id:          "users",
 | |
| 					Description: "Manage org members",
 | |
| 					Icon:        "icon-gf icon-gf-fw icon-gf-users",
 | |
| 					Url:         setting.AppSubUrl + "/org/users",
 | |
| 				},
 | |
| 				{
 | |
| 					Text:        "Teams",
 | |
| 					Id:          "teams",
 | |
| 					Description: "Manage org groups",
 | |
| 					Icon:        "gicon gicon-team",
 | |
| 					Url:         setting.AppSubUrl + "/org/teams",
 | |
| 				},
 | |
| 				{
 | |
| 					Text:        "Plugins",
 | |
| 					Id:          "plugins",
 | |
| 					Description: "View and configure plugins",
 | |
| 					Icon:        "icon-gf icon-gf-fw icon-gf-apps",
 | |
| 					Url:         setting.AppSubUrl + "/plugins",
 | |
| 				},
 | |
| 				{
 | |
| 					Text:        "Preferences",
 | |
| 					Id:          "org-settings",
 | |
| 					Description: "Organization preferences",
 | |
| 					Icon:        "fa fa-fw fa-sliders",
 | |
| 					Url:         setting.AppSubUrl + "/org",
 | |
| 				},
 | |
| 
 | |
| 				{
 | |
| 					Text:        "API Keys",
 | |
| 					Id:          "apikeys",
 | |
| 					Description: "Create & manage API keys",
 | |
| 					Icon:        "fa fa-fw fa-key",
 | |
| 					Url:         setting.AppSubUrl + "/org/apikeys",
 | |
| 				},
 | |
| 			},
 | |
| 		}
 | |
| 
 | |
| 		if c.IsGrafanaAdmin {
 | |
| 			cfgNode.Children = append(cfgNode.Children, &dtos.NavLink{
 | |
| 				Divider: true, HideFromTabs: true,
 | |
| 			})
 | |
| 			cfgNode.Children = append(cfgNode.Children, &dtos.NavLink{
 | |
| 				Text:         "Server Admin",
 | |
| 				HideFromTabs: true,
 | |
| 				SubTitle:     "Manage all users & orgs",
 | |
| 				Id:           "admin",
 | |
| 				Icon:         "fa fa-fw fa-shield",
 | |
| 				Url:          setting.AppSubUrl + "/admin/users",
 | |
| 				Children: []*dtos.NavLink{
 | |
| 					{Text: "Users", Id: "global-users", Url: setting.AppSubUrl + "/admin/users", Icon: "icon-gf icon-gf-fw icon-gf-users"},
 | |
| 					{Text: "Orgs", Id: "global-orgs", Url: setting.AppSubUrl + "/admin/orgs", Icon: "gicon gicon-org"},
 | |
| 					{Text: "Settings", Id: "server-settings", Url: setting.AppSubUrl + "/admin/settings", Icon: "fa fa-fw fa-sliders"},
 | |
| 					{Text: "Stats", Id: "server-stats", Url: setting.AppSubUrl + "/admin/stats", Icon: "fa fa-fw fa-bar-chart"},
 | |
| 					{Text: "Style Guide", Id: "styleguide", Url: setting.AppSubUrl + "/styleguide", Icon: "fa fa-fw fa-eyedropper"},
 | |
| 				},
 | |
| 			})
 | |
| 		}
 | |
| 
 | |
| 		data.NavTree = append(data.NavTree, cfgNode)
 | |
| 	}
 | |
| 
 | |
| 	data.NavTree = append(data.NavTree, &dtos.NavLink{
 | |
| 		Text:         "Help",
 | |
| 		Id:           "help",
 | |
| 		Url:          "#",
 | |
| 		Icon:         "fa fa-fw fa-question",
 | |
| 		HideFromMenu: true,
 | |
| 		Children: []*dtos.NavLink{
 | |
| 			{Text: "Keyboard shortcuts", Url: "/shortcuts", Icon: "fa fa-fw fa-keyboard-o", Target: "_self"},
 | |
| 			{Text: "Community site", Url: "http://community.grafana.com", Icon: "fa fa-fw fa-comment", Target: "_blank"},
 | |
| 			{Text: "Documentation", Url: "http://docs.grafana.org", Icon: "fa fa-fw fa-file", Target: "_blank"},
 | |
| 		},
 | |
| 	})
 | |
| 
 | |
| 	return &data, nil
 | |
| }
 | |
| 
 | |
| func Index(c *middleware.Context) {
 | |
| 	if data, err := setIndexViewData(c); err != nil {
 | |
| 		c.Handle(500, "Failed to get settings", err)
 | |
| 		return
 | |
| 	} else {
 | |
| 		c.HTML(200, "index", data)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func NotFoundHandler(c *middleware.Context) {
 | |
| 	if c.IsApiRequest() {
 | |
| 		c.JsonApiErr(404, "Not found", nil)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	if data, err := setIndexViewData(c); err != nil {
 | |
| 		c.Handle(500, "Failed to get settings", err)
 | |
| 		return
 | |
| 	} else {
 | |
| 		c.HTML(404, "index", data)
 | |
| 	}
 | |
| }
 |