Export: include alerts, thumbnails, usage stats, and short urls (#51938)
This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
package export
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||
"github.com/grafana/grafana-plugin-sdk-go/data/sqlutil"
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore"
|
||||
)
|
||||
|
||||
@@ -13,58 +16,119 @@ func dumpAuthTables(helper *commitHelper, job *gitExportJob) error {
|
||||
comment: "auth tables dump",
|
||||
}
|
||||
|
||||
tables := []string{
|
||||
"user", // joined with "org_user" to get the role
|
||||
"user_role",
|
||||
"builtin_role",
|
||||
"api_key",
|
||||
"team", "team_group", "team_role", "team_member",
|
||||
"role",
|
||||
"temp_user",
|
||||
"user_auth_token", // no org_id... is it temporary?
|
||||
"permission",
|
||||
type statsTables struct {
|
||||
table string
|
||||
sql string
|
||||
converters []sqlutil.Converter
|
||||
drop []string
|
||||
}
|
||||
|
||||
for _, table := range tables {
|
||||
switch table {
|
||||
case "permission":
|
||||
sess.Table(table).
|
||||
Join("left", "role", "permission.role_id = role.id").
|
||||
Cols("permission.*").
|
||||
Where("org_id = ?", helper.orgID).
|
||||
Asc("permission.id")
|
||||
case "user":
|
||||
sess.Table(table).
|
||||
Join("inner", "org_user", "user.id = org_user.user_id").
|
||||
Cols("user.*", "org_user.role").
|
||||
Where("org_user.org_id = ?", helper.orgID).
|
||||
Asc("user.id")
|
||||
case "user_auth_token":
|
||||
sess.Table(table).
|
||||
Join("inner", "org_user", "user_auth_token.id = org_user.user_id").
|
||||
Cols("user_auth_token.*").
|
||||
Where("org_user.org_id = ?", helper.orgID).
|
||||
Asc("user_auth_token.id")
|
||||
default:
|
||||
sess.Table(table).Where("org_id = ?", helper.orgID).Asc("id")
|
||||
dump := []statsTables{
|
||||
{
|
||||
table: "user",
|
||||
sql: `
|
||||
SELECT user.*, org_user.role
|
||||
FROM user
|
||||
JOIN org_user ON user.id = org_user.user_id
|
||||
WHERE org_user.org_id =` + strconv.FormatInt(helper.orgID, 10),
|
||||
converters: []sqlutil.Converter{{Dynamic: true}},
|
||||
drop: []string{
|
||||
"id", "version",
|
||||
"password", // UMMMMM... for now
|
||||
"org_id",
|
||||
},
|
||||
},
|
||||
{
|
||||
table: "user_role",
|
||||
sql: `
|
||||
SELECT * FROM user_role
|
||||
WHERE org_id =` + strconv.FormatInt(helper.orgID, 10),
|
||||
},
|
||||
{
|
||||
table: "builtin_role",
|
||||
sql: `
|
||||
SELECT * FROM builtin_role
|
||||
WHERE org_id =` + strconv.FormatInt(helper.orgID, 10),
|
||||
},
|
||||
{
|
||||
table: "api_key",
|
||||
sql: `
|
||||
SELECT * FROM api_key
|
||||
WHERE org_id =` + strconv.FormatInt(helper.orgID, 10),
|
||||
},
|
||||
{
|
||||
table: "permission",
|
||||
sql: `
|
||||
SELECT permission.*
|
||||
FROM permission
|
||||
JOIN role ON permission.role_id = role.id
|
||||
WHERE org_id =` + strconv.FormatInt(helper.orgID, 10),
|
||||
},
|
||||
{
|
||||
table: "user_auth_token",
|
||||
sql: `
|
||||
SELECT user_auth_token.*
|
||||
FROM user_auth_token
|
||||
JOIN org_user ON user_auth_token.id = org_user.user_id
|
||||
WHERE org_user.org_id =` + strconv.FormatInt(helper.orgID, 10),
|
||||
},
|
||||
{table: "team"},
|
||||
{table: "team_group"},
|
||||
{table: "team_role"},
|
||||
{table: "team_member"},
|
||||
{table: "temp_user"},
|
||||
{table: "role"},
|
||||
}
|
||||
|
||||
for _, auth := range dump {
|
||||
if auth.sql == "" {
|
||||
auth.sql = `
|
||||
SELECT * FROM ` + auth.table + `
|
||||
WHERE org_id =` + strconv.FormatInt(helper.orgID, 10)
|
||||
}
|
||||
if auth.converters == nil {
|
||||
auth.converters = []sqlutil.Converter{{Dynamic: true}}
|
||||
}
|
||||
if auth.drop == nil {
|
||||
auth.drop = []string{
|
||||
"id",
|
||||
"org_id",
|
||||
}
|
||||
}
|
||||
|
||||
raw, err := sess.QueryInterface()
|
||||
rows, err := sess.DB().QueryContext(helper.ctx, auth.sql)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to read: %s // %s", table, err.Error())
|
||||
if strings.HasPrefix(err.Error(), "no such table") {
|
||||
continue
|
||||
}
|
||||
return err
|
||||
}
|
||||
if len(raw) < 1 {
|
||||
continue // don't write empty files
|
||||
}
|
||||
frame, err := queryResultToDataFrame(raw, frameOpts{
|
||||
skip: []string{"org_id", "version", "help_flags1", "theme"},
|
||||
})
|
||||
|
||||
frame, err := sqlutil.FrameFromRows(rows.Rows, -1, auth.converters...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
frame.Name = table
|
||||
if frame.Fields[0].Len() < 1 {
|
||||
continue // do not write empty structures
|
||||
}
|
||||
|
||||
if len(auth.drop) > 0 {
|
||||
lookup := make(map[string]bool, len(auth.drop))
|
||||
for _, v := range auth.drop {
|
||||
lookup[v] = true
|
||||
}
|
||||
fields := make([]*data.Field, 0, len(frame.Fields))
|
||||
for _, f := range frame.Fields {
|
||||
if lookup[f.Name] {
|
||||
continue
|
||||
}
|
||||
fields = append(fields, f)
|
||||
}
|
||||
frame.Fields = fields
|
||||
}
|
||||
frame.Name = auth.table
|
||||
commit.body = append(commit.body, commitBody{
|
||||
fpath: path.Join(helper.orgDir, "auth", "sql.dump", table+".json"),
|
||||
fpath: path.Join(helper.orgDir, "auth", "sql.dump", auth.table+".json"),
|
||||
frame: frame,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user