From 1f64cbeaf41f121397d63d96352b9e403d744bfc Mon Sep 17 00:00:00 2001 From: Mark Goodwin Date: Tue, 30 Apr 2019 06:55:24 +1000 Subject: [PATCH] Initial import (#1670656). --- .gitignore | 2 + 000-go-test-fixes.patch | 141 ++++ 001-man-pages.patch | 219 +++++++ 002-update-golang-oauth2-vendor-sources.patch | 26 + 003-file-mode-updates.patch | 27 + 004-grafana.ini-for-Linux-distros.patch | 616 ++++++++++++++++++ 005-remove-jaeger-tracing.patch | 189 ++++++ ...ve-RPM-spec-and-webpack-build-script.patch | 597 +++++++++++++++++ grafana.spec | 511 +++++++++++++++ make_webpack.sh | 61 ++ sources | 2 + 11 files changed, 2391 insertions(+) create mode 100644 .gitignore create mode 100644 000-go-test-fixes.patch create mode 100644 001-man-pages.patch create mode 100644 002-update-golang-oauth2-vendor-sources.patch create mode 100644 003-file-mode-updates.patch create mode 100644 004-grafana.ini-for-Linux-distros.patch create mode 100644 005-remove-jaeger-tracing.patch create mode 100644 006-native-RPM-spec-and-webpack-build-script.patch create mode 100644 grafana.spec create mode 100644 make_webpack.sh create mode 100644 sources diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..016c26f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/grafana-6.1.4.tar.gz +/grafana_webpack-6.1.4.tar.gz diff --git a/000-go-test-fixes.patch b/000-go-test-fixes.patch new file mode 100644 index 0000000..b8a9e82 --- /dev/null +++ b/000-go-test-fixes.patch @@ -0,0 +1,141 @@ +diff --git a/pkg/tsdb/azuremonitor/azuremonitor-datasource_test.go b/pkg/tsdb/azuremonitor/azuremonitor-datasource_test.go +index b8d1d6cc2..39cfe3f76 100644 +--- a/pkg/tsdb/azuremonitor/azuremonitor-datasource_test.go ++++ b/pkg/tsdb/azuremonitor/azuremonitor-datasource_test.go +@@ -107,19 +107,19 @@ func TestAzureMonitorDatasource(t *testing.T) { + So(len(res.Series[0].Points), ShouldEqual, 5) + + So(res.Series[0].Points[0][0].Float64, ShouldEqual, 2.0875) +- So(res.Series[0].Points[0][1].Float64, ShouldEqual, 1549620780000) ++ So(res.Series[0].Points[0][1].Float64, ShouldEqual, int64(1549620780000)) + + So(res.Series[0].Points[1][0].Float64, ShouldEqual, 2.1525) +- So(res.Series[0].Points[1][1].Float64, ShouldEqual, 1549620840000) ++ So(res.Series[0].Points[1][1].Float64, ShouldEqual, int64(1549620840000)) + + So(res.Series[0].Points[2][0].Float64, ShouldEqual, 2.155) +- So(res.Series[0].Points[2][1].Float64, ShouldEqual, 1549620900000) ++ So(res.Series[0].Points[2][1].Float64, ShouldEqual, int64(1549620900000)) + + So(res.Series[0].Points[3][0].Float64, ShouldEqual, 3.6925) +- So(res.Series[0].Points[3][1].Float64, ShouldEqual, 1549620960000) ++ So(res.Series[0].Points[3][1].Float64, ShouldEqual, int64(1549620960000)) + + So(res.Series[0].Points[4][0].Float64, ShouldEqual, 2.44) +- So(res.Series[0].Points[4][1].Float64, ShouldEqual, 1549621020000) ++ So(res.Series[0].Points[4][1].Float64, ShouldEqual, int64(1549621020000)) + }) + + Convey("when data from query aggregated as total to one time series", func() { +@@ -139,7 +139,7 @@ func TestAzureMonitorDatasource(t *testing.T) { + So(err, ShouldBeNil) + + So(res.Series[0].Points[0][0].Float64, ShouldEqual, 8.26) +- So(res.Series[0].Points[0][1].Float64, ShouldEqual, 1549718940000) ++ So(res.Series[0].Points[0][1].Float64, ShouldEqual, int64(1549718940000)) + }) + + Convey("when data from query aggregated as maximum to one time series", func() { +@@ -159,7 +159,7 @@ func TestAzureMonitorDatasource(t *testing.T) { + So(err, ShouldBeNil) + + So(res.Series[0].Points[0][0].Float64, ShouldEqual, 3.07) +- So(res.Series[0].Points[0][1].Float64, ShouldEqual, 1549722360000) ++ So(res.Series[0].Points[0][1].Float64, ShouldEqual, int64(1549722360000)) + }) + + Convey("when data from query aggregated as minimum to one time series", func() { +@@ -179,7 +179,7 @@ func TestAzureMonitorDatasource(t *testing.T) { + So(err, ShouldBeNil) + + So(res.Series[0].Points[0][0].Float64, ShouldEqual, 1.51) +- So(res.Series[0].Points[0][1].Float64, ShouldEqual, 1549723380000) ++ So(res.Series[0].Points[0][1].Float64, ShouldEqual, int64(1549723380000)) + }) + + Convey("when data from query aggregated as Count to one time series", func() { +@@ -199,7 +199,7 @@ func TestAzureMonitorDatasource(t *testing.T) { + So(err, ShouldBeNil) + + So(res.Series[0].Points[0][0].Float64, ShouldEqual, 4) +- So(res.Series[0].Points[0][1].Float64, ShouldEqual, 1549723440000) ++ So(res.Series[0].Points[0][1].Float64, ShouldEqual, int64(1549723440000)) + }) + + Convey("when data from query aggregated as total and has dimension filter", func() { +diff --git a/pkg/tsdb/mssql/mssql_test.go b/pkg/tsdb/mssql/mssql_test.go +index c3d447060..cc27304fc 100644 +--- a/pkg/tsdb/mssql/mssql_test.go ++++ b/pkg/tsdb/mssql/mssql_test.go +@@ -162,7 +162,7 @@ func TestMSSQL(t *testing.T) { + So(column[19].(time.Time), ShouldEqual, dt.Truncate(time.Minute)) + So(column[20].(time.Time), ShouldEqual, dt.Truncate(24*time.Hour)) + So(column[21].(time.Time), ShouldEqual, time.Date(1, 1, 1, dt.Hour(), dt.Minute(), dt.Second(), dt.Nanosecond(), time.UTC)) +- So(column[22].(time.Time), ShouldEqual, dt2.In(time.FixedZone("UTC", int(-7*time.Hour)))) ++ So(column[22].(time.Time), ShouldEqual, dt2.In(time.FixedZone("UTC-7", int(-7*60*60)))) + }) + }) + +diff --git a/pkg/tsdb/stackdriver/stackdriver_test.go b/pkg/tsdb/stackdriver/stackdriver_test.go +index 78c3086a9..1ab1e099f 100644 +--- a/pkg/tsdb/stackdriver/stackdriver_test.go ++++ b/pkg/tsdb/stackdriver/stackdriver_test.go +@@ -236,13 +236,13 @@ func TestStackdriver(t *testing.T) { + + Convey("timestamps should be in ascending order", func() { + So(res.Series[0].Points[0][0].Float64, ShouldEqual, 0.05) +- So(res.Series[0].Points[0][1].Float64, ShouldEqual, 1536670020000) ++ So(res.Series[0].Points[0][1].Float64, ShouldEqual, int64(1536670020000)) + + So(res.Series[0].Points[1][0].Float64, ShouldEqual, 1.05) +- So(res.Series[0].Points[1][1].Float64, ShouldEqual, 1536670080000) ++ So(res.Series[0].Points[1][1].Float64, ShouldEqual, int64(1536670080000)) + + So(res.Series[0].Points[2][0].Float64, ShouldEqual, 1.0666666666667) +- So(res.Series[0].Points[2][1].Float64, ShouldEqual, 1536670260000) ++ So(res.Series[0].Points[2][1].Float64, ShouldEqual, int64(1536670260000)) + }) + }) + +@@ -365,9 +365,9 @@ func TestStackdriver(t *testing.T) { + } + + Convey("timestamps should be in ascending order", func() { +- So(res.Series[0].Points[0][1].Float64, ShouldEqual, 1536668940000) +- So(res.Series[0].Points[1][1].Float64, ShouldEqual, 1536669000000) +- So(res.Series[0].Points[2][1].Float64, ShouldEqual, 1536669060000) ++ So(res.Series[0].Points[0][1].Float64, ShouldEqual, int64(1536668940000)) ++ So(res.Series[0].Points[1][1].Float64, ShouldEqual, int64(1536669000000)) ++ So(res.Series[0].Points[2][1].Float64, ShouldEqual, int64(1536669060000)) + }) + + Convey("bucket bounds should be correct", func() { +@@ -410,8 +410,8 @@ func TestStackdriver(t *testing.T) { + } + + Convey("timestamps should be in ascending order", func() { +- So(res.Series[0].Points[0][1].Float64, ShouldEqual, 1550859086000) +- So(res.Series[0].Points[1][1].Float64, ShouldEqual, 1550859146000) ++ So(res.Series[0].Points[0][1].Float64, ShouldEqual, int64(1550859086000)) ++ So(res.Series[0].Points[1][1].Float64, ShouldEqual, int64(1550859146000)) + }) + + Convey("bucket bounds should be correct", func() { +diff --git a/pkg/tsdb/time_range_test.go b/pkg/tsdb/time_range_test.go +index 37ced412e..38b147689 100644 +--- a/pkg/tsdb/time_range_test.go ++++ b/pkg/tsdb/time_range_test.go +@@ -70,11 +70,11 @@ func TestTimeRange(t *testing.T) { + + res, err := tr.ParseFrom() + So(err, ShouldBeNil) +- So(res.UnixNano()/int64(time.Millisecond), ShouldEqual, 1474973725473) ++ So(res.UnixNano()/int64(time.Millisecond), ShouldEqual, int64(1474973725473)) + + res, err = tr.ParseTo() + So(err, ShouldBeNil) +- So(res.UnixNano()/int64(time.Millisecond), ShouldEqual, 1474975757930) ++ So(res.UnixNano()/int64(time.Millisecond), ShouldEqual, int64(1474975757930)) + }) + + Convey("Cannot parse asdf", func() { diff --git a/001-man-pages.patch b/001-man-pages.patch new file mode 100644 index 0000000..44ff37d --- /dev/null +++ b/001-man-pages.patch @@ -0,0 +1,219 @@ +diff --git a/docs/man/man1/grafana-cli.1 b/docs/man/man1/grafana-cli.1 +new file mode 100644 +index 000000000..171748fcd +--- /dev/null ++++ b/docs/man/man1/grafana-cli.1 +@@ -0,0 +1,51 @@ ++.TH GRAFANA "1" "February 2019" "Grafana cli version 5.4.3" "User Commands" ++.SH NAME ++grafana-cli \- command line administration for the Grafana metrics dashboard and graph editor ++.SH DESCRIPTION ++.SS "NAME:" ++.IP ++grafana-cli ++.SS "USAGE:" ++.IP ++\fBgrafana\-cli\fP [\fIglobal options\fP] \fIcommand\fP [\fIcommand options\fP] [\fIarguments\fP...] ++.SS "COMMANDS:" ++.TP ++plugins ++Manage plugins for grafana ++.TP ++admin ++Grafana admin commands ++.TP ++help, h ++Shows a list of commands or help for one command ++.SS "GLOBAL OPTIONS:" ++.TP ++\fB\-\-pluginsDir\fR value ++path to the grafana plugin directory (default: "/var/lib/grafana/plugins") [$GF_PLUGIN_DIR] ++.TP ++\fB\-\-repo\fR value ++url to the plugin repository (default: "https://grafana.com/api/plugins") [$GF_PLUGIN_REPO] ++.TP ++\fB\-\-pluginUrl\fR value ++Full url to the plugin zip file instead of downloading the plugin from grafana.com/api [$GF_PLUGIN_URL] ++.TP ++\fB\-\-insecure\fR ++Skip TLS verification (insecure) ++.TP ++\fB\-\-debug\fR, \fB\-d\fR ++enable debug logging ++.TP ++\fB\-\-help\fR, \fB\-h\fR ++show help ++.TP ++\fB\-\-version\fR, \fB\-v\fR ++print the version ++.SH "SEE ALSO" ++Additional documentation for ++.B grafana-cli ++is available on-line at ++.BR http://docs.grafana.org/administration/cli/ . ++The full documentation for ++.B Grafana ++is available on-line at ++.BR http://docs.grafana.org/ . +diff --git a/docs/man/man1/grafana-server.1 b/docs/man/man1/grafana-server.1 +new file mode 100644 +index 000000000..30b7c1306 +--- /dev/null ++++ b/docs/man/man1/grafana-server.1 +@@ -0,0 +1,156 @@ ++.TH VERSION "1" "February 2019" "Version 5.4.3" "User Commands" ++.SH NAME ++grafana-server \- back-end server for the Grafana metrics dashboard and graph editor ++.SH DESCRIPTION ++.B grafana-server ++is the back-end server for the Grafana metrics dashboard and graph editor. ++The ++.B grafana-server ++program should not normally be run from the command line, ++except when testing or for development purposes. ++Rather it should be managed by ++.BR systemd . ++After installing Grafana, the systemd service should be enabled and started as follows: ++.P ++.in 1i ++.B systemctl daemon-reload ++.br ++.B systemctl enable grafana-server.service ++.br ++.B systemctl start grafana-server.service ++.in ++.P ++.SH OPTIONS ++The ++.B gafana-server ++configuration is specified in ++.BR /etc/grafana/grafana.ini ++and is well documented with comments. ++The command-line options listed below override options of ++the same (or similar) name in the configuration file and also provide ++additional options for testing Grafana. ++.P ++.HP ++\fB\-config\fR string ++.IP ++path to config file ++.HP ++\fB\-homepath\fR string ++.IP ++path to grafana install/home path, defaults to working directory ++.HP ++\fB\-packaging\fR string ++.IP ++describes the way Grafana was installed (default "unknown") ++.HP ++\fB\-pidfile\fR string ++.IP ++path to pid file ++.HP ++\fB\-profile\fR ++.IP ++Turn on pprof profiling ++.HP ++\fB\-profile\-port\fR int ++.IP ++Define custom port for profiling (default 6060) ++.HP ++\fB\-test\fR.bench regexp ++.IP ++run only benchmarks matching regexp ++.HP ++\fB\-test\fR.benchmem ++.IP ++print memory allocations for benchmarks ++.HP ++\fB\-test\fR.benchtime d ++.IP ++run each benchmark for duration d (default 1s) ++.HP ++\fB\-test\fR.blockprofile file ++.IP ++write a goroutine blocking profile to file ++.HP ++\fB\-test\fR.blockprofilerate rate ++.IP ++set blocking profile rate (see runtime.SetBlockProfileRate) (default 1) ++.HP ++\fB\-test\fR.count n ++.IP ++run tests and benchmarks n times (default 1) ++.HP ++\fB\-test\fR.coverprofile file ++.IP ++write a coverage profile to file ++.HP ++\fB\-test\fR.cpu list ++.IP ++comma\-separated list of cpu counts to run each test with ++.HP ++\fB\-test\fR.cpuprofile file ++.IP ++write a cpu profile to file ++.HP ++\fB\-test\fR.failfast ++.IP ++do not start new tests after the first test failure ++.HP ++\fB\-test\fR.list regexp ++.IP ++list tests, examples, and benchmarks matching regexp then exit ++.HP ++\fB\-test\fR.memprofile file ++.IP ++write a memory profile to file ++.HP ++\fB\-test\fR.memprofilerate rate ++.IP ++set memory profiling rate (see runtime.MemProfileRate) ++.HP ++\fB\-test\fR.mutexprofile string ++.IP ++write a mutex contention profile to the named file after execution ++.HP ++\fB\-test\fR.mutexprofilefraction int ++.IP ++if >= 0, calls runtime.SetMutexProfileFraction() (default 1) ++.HP ++\fB\-test\fR.outputdir dir ++.IP ++write profiles to dir ++.HP ++\fB\-test\fR.parallel n ++.IP ++run at most n tests in parallel (default 8) ++.HP ++\fB\-test\fR.run regexp ++.IP ++run only tests and examples matching regexp ++.HP ++\fB\-test\fR.short ++.IP ++run smaller test suite to save time ++.HP ++\fB\-test\fR.testlogfile file ++.IP ++write test action log to file (for use only by cmd/go) ++.HP ++\fB\-test\fR.timeout d ++.IP ++panic test binary after duration d (default 0, timeout disabled) ++.HP ++\fB\-test\fR.trace file ++.IP ++write an execution trace to file ++.HP ++\fB\-test\fR.v ++.IP ++verbose: print additional output ++.TP ++\fB\-v\fR ++prints current version and exits ++.SH "SEE ALSO" ++The full documentation for ++.B Grafana ++is available on-line at ++.BR http://docs.grafana.org/ . diff --git a/002-update-golang-oauth2-vendor-sources.patch b/002-update-golang-oauth2-vendor-sources.patch new file mode 100644 index 0000000..f0c3f34 --- /dev/null +++ b/002-update-golang-oauth2-vendor-sources.patch @@ -0,0 +1,26 @@ +diff --git a/pkg/api/login_oauth.go b/pkg/api/login_oauth.go +index a3599bc7a..0c6579847 100644 +--- a/pkg/api/login_oauth.go ++++ b/pkg/api/login_oauth.go +@@ -125,7 +125,7 @@ func (hs *HTTPServer) OAuthLogin(ctx *m.ReqContext) { + oauthCtx := context.WithValue(context.Background(), oauth2.HTTPClient, oauthClient) + + // get token from provider +- token, err := connect.Exchange(oauthCtx, code) ++ token, err := connect.Exchange(oauthCtx, code, oauth2.AccessTypeOnline) + if err != nil { + ctx.Handle(500, "login.OAuthLogin(NewTransportWithCode)", err) + return +diff --git a/pkg/login/social/social.go b/pkg/login/social/social.go +index 3ec0e2c96..72807d73e 100644 +--- a/pkg/login/social/social.go ++++ b/pkg/login/social/social.go +@@ -29,7 +29,7 @@ type SocialConnector interface { + IsSignupAllowed() bool + + AuthCodeURL(state string, opts ...oauth2.AuthCodeOption) string +- Exchange(ctx context.Context, code string) (*oauth2.Token, error) ++ Exchange(ctx context.Context, code string, opts ...oauth2.AuthCodeOption) (*oauth2.Token, error) + Client(ctx context.Context, t *oauth2.Token) *http.Client + TokenSource(ctx context.Context, t *oauth2.Token) oauth2.TokenSource + } diff --git a/003-file-mode-updates.patch b/003-file-mode-updates.patch new file mode 100644 index 0000000..3eb1243 --- /dev/null +++ b/003-file-mode-updates.patch @@ -0,0 +1,27 @@ +diff --git a/public/app/features/dashboard/components/DashboardSettings/SettingsCtrl.ts b/public/app/features/dashboard/components/DashboardSettings/SettingsCtrl.ts +old mode 100755 +new mode 100644 +diff --git a/public/app/features/folders/services/FolderPageLoader.ts b/public/app/features/folders/services/FolderPageLoader.ts +old mode 100755 +new mode 100644 +diff --git a/public/app/plugins/datasource/elasticsearch/img/elasticsearch.svg b/public/app/plugins/datasource/elasticsearch/img/elasticsearch.svg +old mode 100755 +new mode 100644 +diff --git a/public/app/plugins/datasource/graphite/partials/query.editor.html b/public/app/plugins/datasource/graphite/partials/query.editor.html +old mode 100755 +new mode 100644 +diff --git a/public/app/plugins/datasource/stackdriver/partials/query.editor.html b/public/app/plugins/datasource/stackdriver/partials/query.editor.html +old mode 100755 +new mode 100644 +diff --git a/public/app/plugins/panel/graph/graph.ts b/public/app/plugins/panel/graph/graph.ts +old mode 100755 +new mode 100644 +diff --git a/public/fonts/grafana-icons.svg b/public/fonts/grafana-icons.svg +old mode 100755 +new mode 100644 +diff --git a/public/sass/components/_panel_text.scss b/public/sass/components/_panel_text.scss +index e69de29bb..cd0183132 100644 +--- a/public/sass/components/_panel_text.scss ++++ b/public/sass/components/_panel_text.scss +@@ -0,0 +1 @@ ++// nothing here diff --git a/004-grafana.ini-for-Linux-distros.patch b/004-grafana.ini-for-Linux-distros.patch new file mode 100644 index 0000000..cc4089d --- /dev/null +++ b/004-grafana.ini-for-Linux-distros.patch @@ -0,0 +1,616 @@ +diff --git a/conf/distro-defaults.ini b/conf/distro-defaults.ini +new file mode 100644 +index 000000000..b75e4c839 +--- /dev/null ++++ b/conf/distro-defaults.ini +@@ -0,0 +1,610 @@ ++##################### Grafana Configuration Defaults for distros ##################### ++# ++# Do not modify this file in grafana installs ++# ++ ++# possible values : production, development ++app_mode = production ++ ++# instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty ++instance_name = ${HOSTNAME} ++ ++#################################### Paths ############################### ++[paths] ++# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) ++data = /var/lib/grafana ++ ++# Temporary files in `data` directory older than given duration will be removed ++temp_data_lifetime = 24h ++ ++# Directory where grafana can store logs ++logs = /var/log/grafana ++ ++# Directory where grafana will automatically scan and look for plugins ++plugins = /var/lib/grafana/plugins ++ ++# folder that contains provisioning config files that grafana will apply on startup and while running. ++provisioning = conf/provisioning ++ ++#################################### Server ############################## ++[server] ++# Protocol (http, https, socket) ++protocol = http ++ ++# The ip address to bind to, empty will bind to all interfaces ++http_addr = ++ ++# The http port to use ++http_port = 3000 ++ ++# The public facing domain name used to access grafana from a browser ++domain = localhost ++ ++# Redirect to correct domain if host header does not match domain ++# Prevents DNS rebinding attacks ++enforce_domain = false ++ ++# The full public facing url ++root_url = %(protocol)s://%(domain)s:%(http_port)s/ ++ ++# Log web requests ++router_logging = false ++ ++# the path relative working path ++static_root_path = public ++ ++# enable gzip ++enable_gzip = false ++ ++# https certs & key file ++cert_file = ++cert_key = ++ ++# Unix socket path ++socket = /tmp/grafana.sock ++ ++#################################### Database ############################ ++[database] ++# You can configure the database connection by specifying type, host, name, user and password ++# as separate properties or as on string using the url property. ++ ++# Either "mysql", "postgres" or "sqlite3", it's your choice ++type = sqlite3 ++host = 127.0.0.1:3306 ++name = grafana ++user = root ++# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" ++password = ++# Use either URL or the previous fields to configure the database ++# Example: mysql://user:secret@host:port/database ++url = ++ ++# Max idle conn setting default is 2 ++max_idle_conn = 2 ++ ++# Max conn setting default is 0 (mean not set) ++max_open_conn = ++ ++# Connection Max Lifetime default is 14400 (means 14400 seconds or 4 hours) ++conn_max_lifetime = 14400 ++ ++# Set to true to log the sql calls and execution times. ++log_queries = ++ ++# For "postgres", use either "disable", "require" or "verify-full" ++# For "mysql", use either "true", "false", or "skip-verify". ++ssl_mode = disable ++ ++ca_cert_path = ++client_key_path = ++client_cert_path = ++server_cert_name = ++ ++# For "sqlite3" only, path relative to data_path setting ++path = grafana.db ++ ++# For "sqlite3" only. cache mode setting used for connecting to the database ++cache_mode = private ++ ++#################################### Cache server ############################# ++[remote_cache] ++# Either "redis", "memcached" or "database" default is "database" ++type = database ++ ++# cache connectionstring options ++# database: will use Grafana primary database. ++# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=grafana` ++# memcache: 127.0.0.1:11211 ++connstr = ++ ++#################################### Session ############################# ++[session] ++# Either "memory", "file", "redis", "mysql", "postgres", "memcache", default is "file" ++provider = file ++ ++# Provider config options ++# memory: not have any config yet ++# file: session dir path, is relative to grafana data_path ++# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=grafana` ++# postgres: user=a password=b host=localhost port=5432 dbname=c sslmode=disable ++# mysql: go-sql-driver/mysql dsn config string, examples: ++# `user:password@tcp(127.0.0.1:3306)/database_name` ++# `user:password@unix(/var/run/mysqld/mysqld.sock)/database_name` ++# memcache: 127.0.0.1:11211 ++ ++ ++provider_config = sessions ++ ++# Session cookie name ++cookie_name = grafana_sess ++ ++# If you use session in https only, default is false ++cookie_secure = false ++ ++# Session life time, default is 86400 ++session_life_time = 86400 ++gc_interval_time = 86400 ++ ++# Connection Max Lifetime default is 14400 (means 14400 seconds or 4 hours) ++conn_max_lifetime = 14400 ++ ++#################################### Data proxy ########################### ++[dataproxy] ++ ++# This enables data proxy logging, default is false ++logging = false ++ ++# How long the data proxy should wait before timing out default is 30 (seconds) ++timeout = 30 ++ ++# If enabled and user is not anonymous, data proxy will add X-Grafana-User header with username into the request, default is false. ++send_user_header = false ++ ++#################################### Analytics ########################### ++[analytics] ++# Server reporting, sends usage counters to stats.grafana.org every 24 hours. ++# No ip addresses are being tracked, only simple counters to track ++# running instances, dashboard and error counts. It is very helpful to us. ++# Change this option to false to disable reporting. ++reporting_enabled = false ++ ++# Set to false to disable all checks to https://grafana.com ++# for new versions (grafana itself and plugins), check is used ++# in some UI views to notify that grafana or plugin update exists ++# This option does not cause any auto updates, nor send any information ++# only a GET request to https://grafana.com to get latest versions ++check_for_updates = false ++ ++# Google Analytics universal tracking code, only enabled if you specify an id here ++google_analytics_ua_id = ++ ++# Google Tag Manager ID, only enabled if you specify an id here ++google_tag_manager_id = ++ ++#################################### Security ############################ ++[security] ++# default admin user, created on startup ++admin_user = admin ++ ++# default admin password, can be changed before first start of grafana, or in profile settings ++admin_password = admin ++ ++# used for signing ++secret_key = SW2YcwTIb9zpOOhoPsMm ++ ++# disable gravatar profile images ++disable_gravatar = false ++ ++# data source proxy whitelist (ip_or_domain:port separated by spaces) ++data_source_proxy_whitelist = ++ ++# disable protection against brute force login attempts ++disable_brute_force_login_protection = false ++ ++# set to true if you host Grafana behind HTTPS. default is false. ++cookie_secure = false ++ ++# set cookie SameSite attribute. defaults to `lax`. can be set to "lax", "strict" and "none" ++cookie_samesite = lax ++ ++#################################### Snapshots ########################### ++[snapshots] ++# snapshot sharing options ++external_enabled = false ++external_snapshot_url = https://snapshots-origin.raintank.io ++external_snapshot_name = Publish to snapshot.raintank.io ++ ++# remove expired snapshot ++snapshot_remove_expired = true ++ ++#################################### Dashboards ################## ++ ++[dashboards] ++# Number dashboard versions to keep (per dashboard). Default: 20, Minimum: 1 ++versions_to_keep = 20 ++ ++#################################### Users ############################### ++[users] ++# disable user signup / registration ++allow_sign_up = false ++ ++# Allow non admin users to create organizations ++allow_org_create = false ++ ++# Set to true to automatically assign new users to the default organization (id 1) ++auto_assign_org = true ++ ++# Set this value to automatically add new users to the provided organization (if auto_assign_org above is set to true) ++auto_assign_org_id = 1 ++ ++# Default role new users will be automatically assigned (if auto_assign_org above is set to true) ++auto_assign_org_role = Viewer ++ ++# Require email validation before sign up completes ++verify_email_enabled = false ++ ++# Background text for the user field on the login page ++login_hint = email or username ++password_hint = password ++ ++# Default UI theme ("dark" or "light") ++default_theme = dark ++ ++# External user management ++external_manage_link_url = ++external_manage_link_name = ++external_manage_info = ++ ++# Viewers can edit/inspect dashboard settings in the browser. But not save the dashboard. ++viewers_can_edit = false ++ ++# Editors can administrate dashboard, folders and teams they create ++editors_can_admin = false ++ ++[auth] ++# Login cookie name ++login_cookie_name = grafana_session ++ ++# The lifetime (days) an authenticated user can be inactive before being required to login at next visit. Default is 7 days. ++login_maximum_inactive_lifetime_days = 7 ++ ++# The maximum lifetime (days) an authenticated user can be logged in since login time before being required to login. Default is 30 days. ++login_maximum_lifetime_days = 30 ++ ++# How often should auth tokens be rotated for authenticated users when being active. The default is each 10 minutes. ++token_rotation_interval_minutes = 10 ++ ++# Set to true to disable (hide) the login form, useful if you use OAuth ++disable_login_form = false ++ ++# Set to true to disable the signout link in the side menu. useful if you use auth.proxy ++disable_signout_menu = false ++ ++# URL to redirect the user to after sign out ++signout_redirect_url = ++ ++# Set to true to attempt login with OAuth automatically, skipping the login screen. ++# This setting is ignored if multiple OAuth providers are configured. ++oauth_auto_login = false ++ ++#################################### Anonymous Auth ###################### ++[auth.anonymous] ++# enable anonymous access ++enabled = false ++ ++# specify organization name that should be used for unauthenticated users ++org_name = Main Org. ++ ++# specify role for unauthenticated users ++org_role = Viewer ++ ++#################################### Github Auth ######################### ++[auth.github] ++enabled = false ++allow_sign_up = true ++client_id = some_id ++client_secret = some_secret ++scopes = user:email,read:org ++auth_url = https://github.com/login/oauth/authorize ++token_url = https://github.com/login/oauth/access_token ++api_url = https://api.github.com/user ++team_ids = ++allowed_organizations = ++ ++#################################### GitLab Auth ######################### ++[auth.gitlab] ++enabled = false ++allow_sign_up = true ++client_id = some_id ++client_secret = some_secret ++scopes = api ++auth_url = https://gitlab.com/oauth/authorize ++token_url = https://gitlab.com/oauth/token ++api_url = https://gitlab.com/api/v4 ++allowed_groups = ++ ++#################################### Google Auth ######################### ++[auth.google] ++enabled = false ++allow_sign_up = true ++client_id = some_client_id ++client_secret = some_client_secret ++scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email ++auth_url = https://accounts.google.com/o/oauth2/auth ++token_url = https://accounts.google.com/o/oauth2/token ++api_url = https://www.googleapis.com/oauth2/v1/userinfo ++allowed_domains = ++hosted_domain = ++ ++#################################### Grafana.com Auth #################### ++# legacy key names (so they work in env variables) ++[auth.grafananet] ++enabled = false ++allow_sign_up = true ++client_id = some_id ++client_secret = some_secret ++scopes = user:email ++allowed_organizations = ++ ++[auth.grafana_com] ++enabled = false ++allow_sign_up = true ++client_id = some_id ++client_secret = some_secret ++scopes = user:email ++allowed_organizations = ++ ++#################################### Generic OAuth ####################### ++[auth.generic_oauth] ++name = OAuth ++enabled = false ++allow_sign_up = true ++client_id = some_id ++client_secret = some_secret ++scopes = user:email ++email_attribute_name = email:primary ++auth_url = ++token_url = ++api_url = ++team_ids = ++allowed_organizations = ++tls_skip_verify_insecure = false ++tls_client_cert = ++tls_client_key = ++tls_client_ca = ++send_client_credentials_via_post = false ++ ++#################################### Basic Auth ########################## ++[auth.basic] ++enabled = true ++ ++#################################### Auth Proxy ########################## ++[auth.proxy] ++enabled = false ++header_name = X-WEBAUTH-USER ++header_property = username ++auto_sign_up = true ++ldap_sync_ttl = 60 ++whitelist = ++headers = ++ ++#################################### Auth LDAP ########################### ++[auth.ldap] ++enabled = false ++config_file = /etc/grafana/ldap.toml ++allow_sign_up = true ++ ++#################################### SMTP / Emailing ##################### ++[smtp] ++enabled = false ++host = localhost:25 ++user = ++# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" ++password = ++cert_file = ++key_file = ++skip_verify = false ++from_address = admin@grafana.localhost ++from_name = Grafana ++ehlo_identity = ++ ++[emails] ++welcome_email_on_sign_up = false ++templates_pattern = emails/*.html ++ ++#################################### Logging ########################## ++[log] ++# Either "console", "file", "syslog". Default is console and file ++# Use space to separate multiple modes, e.g. "console file" ++mode = console file ++ ++# Either "debug", "info", "warn", "error", "critical", default is "info" ++level = info ++ ++# optional settings to set different levels for specific loggers. Ex filters = sqlstore:debug ++filters = ++ ++# For "console" mode only ++[log.console] ++level = ++ ++# log line format, valid options are text, console and json ++format = console ++ ++# For "file" mode only ++[log.file] ++level = ++ ++# log line format, valid options are text, console and json ++format = text ++ ++# This enables automated log rotate(switch of following options), default is true ++log_rotate = true ++ ++# Max line number of single file, default is 1000000 ++max_lines = 1000000 ++ ++# Max size shift of single file, default is 28 means 1 << 28, 256MB ++max_size_shift = 28 ++ ++# Segment log daily, default is true ++daily_rotate = true ++ ++# Expired days of log file(delete after max days), default is 7 ++max_days = 7 ++ ++[log.syslog] ++level = ++ ++# log line format, valid options are text, console and json ++format = text ++ ++# Syslog network type and address. This can be udp, tcp, or unix. If left blank, the default unix endpoints will be used. ++network = ++address = ++ ++# Syslog facility. user, daemon and local0 through local7 are valid. ++facility = ++ ++# Syslog tag. By default, the process' argv[0] is used. ++tag = ++ ++#################################### Usage Quotas ######################## ++[quota] ++enabled = false ++ ++#### set quotas to -1 to make unlimited. #### ++# limit number of users per Org. ++org_user = 10 ++ ++# limit number of dashboards per Org. ++org_dashboard = 100 ++ ++# limit number of data_sources per Org. ++org_data_source = 10 ++ ++# limit number of api_keys per Org. ++org_api_key = 10 ++ ++# limit number of orgs a user can create. ++user_org = 10 ++ ++# Global limit of users. ++global_user = -1 ++ ++# global limit of orgs. ++global_org = -1 ++ ++# global limit of dashboards ++global_dashboard = -1 ++ ++# global limit of api_keys ++global_api_key = -1 ++ ++# global limit on number of logged in users. ++global_session = -1 ++ ++#################################### Alerting ############################ ++[alerting] ++# Disable alerting engine & UI features ++enabled = true ++# Makes it possible to turn off alert rule execution but alerting UI is visible ++execute_alerts = true ++ ++# Default setting for new alert rules. Defaults to categorize error and timeouts as alerting. (alerting, keep_state) ++error_or_timeout = alerting ++ ++# Default setting for how Grafana handles nodata or null values in alerting. (alerting, no_data, keep_state, ok) ++nodata_or_nullvalues = no_data ++ ++# Alert notifications can include images, but rendering many images at the same time can overload the server ++# This limit will protect the server from render overloading and make sure notifications are sent out quickly ++concurrent_render_limit = 5 ++ ++#################################### Explore ############################# ++[explore] ++# Enable the Explore section ++enabled = true ++ ++#################################### Internal Grafana Metrics ############ ++# Metrics available at HTTP API Url /metrics ++[metrics] ++enabled = true ++interval_seconds = 10 ++ ++#If both are set, basic auth will be required for the metrics endpoint. ++basic_auth_username = ++basic_auth_password = ++ ++# Send internal Grafana metrics to graphite ++[metrics.graphite] ++# Enable by setting the address setting (ex localhost:2003) ++address = ++prefix = prod.grafana.%(instance_name)s. ++ ++[grafana_net] ++url = https://grafana.org ++ ++[grafana_com] ++url = https://grafana.com ++ ++#################################### Distributed tracing ############ ++[tracing.jaeger] ++# jaeger destination (ex localhost:6831) ++address = ++# tag that will always be included in when creating new spans. ex (tag1:value1,tag2:value2) ++always_included_tag = ++# Type specifies the type of the sampler: const, probabilistic, rateLimiting, or remote ++sampler_type = const ++# jaeger samplerconfig param ++# for "const" sampler, 0 or 1 for always false/true respectively ++# for "probabilistic" sampler, a probability between 0 and 1 ++# for "rateLimiting" sampler, the number of spans per second ++# for "remote" sampler, param is the same as for "probabilistic" ++# and indicates the initial sampling rate before the actual one ++# is received from the mothership ++sampler_param = 1 ++ ++#################################### External Image Storage ############## ++[external_image_storage] ++# You can choose between (s3, webdav, gcs, azure_blob, local) ++provider = ++ ++[external_image_storage.s3] ++bucket_url = ++bucket = ++region = ++path = ++access_key = ++secret_key = ++ ++[external_image_storage.webdav] ++url = ++username = ++password = ++public_url = ++ ++[external_image_storage.gcs] ++key_file = ++bucket = ++path = ++ ++[external_image_storage.azure_blob] ++account_name = ++account_key = ++container_name = ++ ++[external_image_storage.local] ++# does not require any configuration ++ ++[rendering] ++# Options to configure external image rendering server like https://github.com/grafana/grafana-image-renderer ++server_url = ++callback_url = ++ ++[panels] ++enable_alpha = false ++disable_sanitize_html = false ++ ++[enterprise] ++license_path = diff --git a/005-remove-jaeger-tracing.patch b/005-remove-jaeger-tracing.patch new file mode 100644 index 0000000..f2b4778 --- /dev/null +++ b/005-remove-jaeger-tracing.patch @@ -0,0 +1,189 @@ +diff --git a/pkg/cmd/grafana-server/server.go b/pkg/cmd/grafana-server/server.go +index c10212329..a29d14c85 100644 +--- a/pkg/cmd/grafana-server/server.go ++++ b/pkg/cmd/grafana-server/server.go +@@ -31,7 +31,6 @@ import ( + _ "github.com/grafana/grafana/pkg/infra/metrics" + _ "github.com/grafana/grafana/pkg/infra/remotecache" + _ "github.com/grafana/grafana/pkg/infra/serverlock" +- _ "github.com/grafana/grafana/pkg/infra/tracing" + _ "github.com/grafana/grafana/pkg/infra/usagestats" + _ "github.com/grafana/grafana/pkg/plugins" + _ "github.com/grafana/grafana/pkg/services/alerting" +diff --git a/pkg/infra/tracing/tracing.go b/pkg/infra/tracing/tracing.go +deleted file mode 100644 +index fd7258b7a..000000000 +--- a/pkg/infra/tracing/tracing.go ++++ /dev/null +@@ -1,129 +0,0 @@ +-package tracing +- +-import ( +- "context" +- "io" +- "strings" +- +- "github.com/grafana/grafana/pkg/log" +- "github.com/grafana/grafana/pkg/registry" +- "github.com/grafana/grafana/pkg/setting" +- +- opentracing "github.com/opentracing/opentracing-go" +- jaegercfg "github.com/uber/jaeger-client-go/config" +-) +- +-func init() { +- registry.RegisterService(&TracingService{}) +-} +- +-type TracingService struct { +- enabled bool +- address string +- customTags map[string]string +- samplerType string +- samplerParam float64 +- log log.Logger +- closer io.Closer +- +- Cfg *setting.Cfg `inject:""` +-} +- +-func (ts *TracingService) Init() error { +- ts.log = log.New("tracing") +- ts.parseSettings() +- +- if ts.enabled { +- ts.initGlobalTracer() +- } +- +- return nil +-} +- +-func (ts *TracingService) parseSettings() { +- var section, err = ts.Cfg.Raw.GetSection("tracing.jaeger") +- if err != nil { +- return +- } +- +- ts.address = section.Key("address").MustString("") +- if ts.address != "" { +- ts.enabled = true +- } +- +- ts.customTags = splitTagSettings(section.Key("always_included_tag").MustString("")) +- ts.samplerType = section.Key("sampler_type").MustString("") +- ts.samplerParam = section.Key("sampler_param").MustFloat64(1) +-} +- +-func (ts *TracingService) initGlobalTracer() error { +- cfg := jaegercfg.Configuration{ +- ServiceName: "grafana", +- Disabled: !ts.enabled, +- Sampler: &jaegercfg.SamplerConfig{ +- Type: ts.samplerType, +- Param: ts.samplerParam, +- }, +- Reporter: &jaegercfg.ReporterConfig{ +- LogSpans: false, +- LocalAgentHostPort: ts.address, +- }, +- } +- +- jLogger := &jaegerLogWrapper{logger: log.New("jaeger")} +- +- options := []jaegercfg.Option{} +- options = append(options, jaegercfg.Logger(jLogger)) +- +- for tag, value := range ts.customTags { +- options = append(options, jaegercfg.Tag(tag, value)) +- } +- +- tracer, closer, err := cfg.NewTracer(options...) +- if err != nil { +- return err +- } +- +- opentracing.InitGlobalTracer(tracer) +- +- ts.closer = closer +- +- return nil +-} +- +-func (ts *TracingService) Run(ctx context.Context) error { +- <-ctx.Done() +- +- if ts.closer != nil { +- ts.log.Info("Closing tracing") +- ts.closer.Close() +- } +- +- return nil +-} +- +-func splitTagSettings(input string) map[string]string { +- res := map[string]string{} +- +- tags := strings.Split(input, ",") +- for _, v := range tags { +- kv := strings.Split(v, ":") +- if len(kv) > 1 { +- res[kv[0]] = kv[1] +- } +- } +- +- return res +-} +- +-type jaegerLogWrapper struct { +- logger log.Logger +-} +- +-func (jlw *jaegerLogWrapper) Error(msg string) { +- jlw.logger.Error(msg) +-} +- +-func (jlw *jaegerLogWrapper) Infof(msg string, args ...interface{}) { +- jlw.logger.Info(msg, args) +-} +diff --git a/pkg/infra/tracing/tracing_test.go b/pkg/infra/tracing/tracing_test.go +deleted file mode 100644 +index 27e4de777..000000000 +--- a/pkg/infra/tracing/tracing_test.go ++++ /dev/null +@@ -1,36 +0,0 @@ +-package tracing +- +-import "testing" +- +-func TestGroupSplit(t *testing.T) { +- tests := []struct { +- input string +- expected map[string]string +- }{ +- { +- input: "tag1:value1,tag2:value2", +- expected: map[string]string{ +- "tag1": "value1", +- "tag2": "value2", +- }, +- }, +- { +- input: "", +- expected: map[string]string{}, +- }, +- { +- input: "tag1", +- expected: map[string]string{}, +- }, +- } +- +- for _, test := range tests { +- tags := splitTagSettings(test.input) +- for k, v := range test.expected { +- value, exists := tags[k] +- if !exists || value != v { +- t.Errorf("tags does not match %v ", test) +- } +- } +- } +-} diff --git a/006-native-RPM-spec-and-webpack-build-script.patch b/006-native-RPM-spec-and-webpack-build-script.patch new file mode 100644 index 0000000..683f12f --- /dev/null +++ b/006-native-RPM-spec-and-webpack-build-script.patch @@ -0,0 +1,597 @@ +diff --git a/packaging/rpm/spec/README b/packaging/rpm/spec/README +new file mode 100644 +index 000000000..f97c2a26b +--- /dev/null ++++ b/packaging/rpm/spec/README +@@ -0,0 +1,7 @@ ++The make_webpack.sh script in this directory can be used to create ++a webpack tarball of all the nodejs dependencies needed to build a ++particular tagged version of grafana, along with the grafana tarball ++itself. After running the script, the two tarballs should be copied ++to your rpmbuild SOURCES. You can then run a native rpm spec build ++using grafana.spec. ++ +diff --git a/packaging/rpm/spec/grafana.spec b/packaging/rpm/spec/grafana.spec +new file mode 100644 +index 000000000..9d69b105e +--- /dev/null ++++ b/packaging/rpm/spec/grafana.spec +@@ -0,0 +1,511 @@ ++%global grafana_arches %{lua: go_arches = {} ++ for arch in rpm.expand("%{go_arches}"):gmatch("%S+") do ++ go_arches[arch] = 1 ++ end ++ for arch in rpm.expand("%{nodejs_arches}"):gmatch("%S+") do ++ if go_arches[arch] then ++ print(arch .. " ") ++ end ++end} ++ ++Name: grafana ++Version: 6.1.4 ++Release: 1%{?dist} ++Summary: Metrics dashboard and graph editor ++License: ASL 2.0 ++URL: https://grafana.org ++ ++# Source0 contains the tagged upstream sources ++Source0: https://github.com/grafana/grafana/archive/v%{version}/%{name}-%{version}.tar.gz ++ ++# Source1 contains the front-end javascript modules bundled into a webpack ++Source1: grafana_webpack-%{version}.tar.gz ++ ++# Source2 is the script to create the above webpack from grafana sources ++Source2: make_webpack.sh ++ ++# Patches for upstream (except Patch5) ++Patch0: 000-go-test-fixes.patch ++Patch1: 001-man-pages.patch ++Patch2: 002-update-golang-oauth2-vendor-sources.patch ++Patch3: 003-file-mode-updates.patch ++Patch4: 004-grafana.ini-for-Linux-distros.patch ++Patch5: 005-remove-jaeger-tracing.patch ++Patch6: 006-native-RPM-spec-and-webpack-build-script.patch ++ ++# Intersection of go_arches and nodejs_arches ++ExclusiveArch: %{grafana_arches} ++ ++%global GRAFANA_USER %{name} ++%global GRAFANA_GROUP %{name} ++%global GRAFANA_HOME %{_datadir}/%{name} ++ ++# grafana-server service daemon uses systemd ++%{?systemd_requires} ++Requires(pre): shadow-utils ++ ++BuildRequires: systemd, golang, compiler(go-compiler) ++ ++# golang build deps. These allow us to unbundle vendor golang source. ++BuildRequires: golang(github.com/aws/aws-sdk-go) ++BuildRequires: golang(github.com/benbjohnson/clock) ++BuildRequires: golang(github.com/beorn7/perks/quantile) ++BuildRequires: golang(github.com/bmizerany/assert) ++BuildRequires: golang(github.com/bradfitz/gomemcache/memcache) ++BuildRequires: golang(github.com/BurntSushi/toml) ++BuildRequires: golang(github.com/codahale/hdrhistogram) ++BuildRequires: golang(github.com/codegangsta/cli) ++BuildRequires: golang(github.com/davecgh/go-spew/spew) ++BuildRequires: golang(github.com/denisenkom/go-mssqldb) ++BuildRequires: golang(github.com/facebookgo/inject) ++BuildRequires: golang(github.com/facebookgo/structtag) ++BuildRequires: golang(github.com/fatih/color) ++BuildRequires: golang(github.com/go-ini/ini) ++BuildRequires: golang(google.golang.org/appengine) ++BuildRequires: golang(golang.org/x/sys/unix) ++BuildRequires: golang(github.com/go-macaron/binding) ++BuildRequires: golang(github.com/go-macaron/gzip) ++BuildRequires: golang(github.com/go-macaron/inject) ++BuildRequires: golang(github.com/go-macaron/session) ++BuildRequires: golang(google.golang.org/genproto/googleapis/rpc/status) ++BuildRequires: golang(github.com/gopherjs/gopherjs/js) ++BuildRequires: golang(github.com/gorilla/websocket) ++BuildRequires: golang(github.com/gosimple/slug) ++BuildRequires: golang(github.com/go-sql-driver/mysql) ++BuildRequires: golang(github.com/go-stack/stack) ++BuildRequires: golang(github.com/go-xorm/builder) ++BuildRequires: golang(github.com/go-xorm/core) ++BuildRequires: golang(github.com/go-xorm/xorm) ++BuildRequires: golang(google.golang.org/grpc) ++BuildRequires: golang(github.com/hashicorp/go-hclog) ++# need grpc_broker in go-plugin >= 1.0.0-1 ++BuildRequires: golang(github.com/hashicorp/go-plugin) ++BuildRequires: golang(github.com/hashicorp/go-version) ++BuildRequires: golang(github.com/hashicorp/yamux) ++BuildRequires: golang(github.com/inconshreveable/log15) ++BuildRequires: golang(github.com/jmespath/go-jmespath) ++BuildRequires: golang(github.com/jtolds/gls) ++BuildRequires: golang(github.com/klauspost/compress/flate) ++BuildRequires: golang(github.com/klauspost/compress/gzip) ++BuildRequires: golang(github.com/klauspost/compress/snappy) ++BuildRequires: golang(github.com/klauspost/cpuid) ++BuildRequires: golang(github.com/klauspost/crc32) ++BuildRequires: golang(github.com/kr/pretty) ++BuildRequires: golang(github.com/kr/text) ++BuildRequires: golang(github.com/lib/pq) ++BuildRequires: golang(github.com/mattn/go-colorable) ++BuildRequires: golang(github.com/mattn/go-isatty) ++BuildRequires: golang(github.com/mattn/go-sqlite3) ++BuildRequires: golang(github.com/matttproud/golang_protobuf_extensions/pbutil) ++BuildRequires: golang(github.com/mitchellh/go-testing-interface) ++BuildRequires: golang(github.com/oklog/run) ++BuildRequires: golang(github.com/opentracing/opentracing-go) ++BuildRequires: golang(github.com/patrickmn/go-cache) ++BuildRequires: golang(github.com/pkg/errors) ++BuildRequires: golang(github.com/prometheus/client_golang/api) ++BuildRequires: golang(github.com/prometheus/client_golang/api/prometheus/v1) ++BuildRequires: golang(github.com/prometheus/client_model/go) ++BuildRequires: golang-github-prometheus-common-devel ++BuildRequires: golang(github.com/prometheus/common/expfmt) ++BuildRequires: golang(github.com/prometheus/common/model) ++BuildRequires: golang(github.com/prometheus/common/expfmt) ++BuildRequires: golang(github.com/prometheus/procfs) ++BuildRequires: golang(github.com/prometheus/procfs/internal/util) ++BuildRequires: golang(github.com/prometheus/procfs) ++BuildRequires: golang(github.com/prometheus/procfs/internal/util) ++BuildRequires: golang(github.com/prometheus/procfs/nfs) ++BuildRequires: golang(github.com/prometheus/procfs/xfs) ++BuildRequires: golang(github.com/rainycape/unidecode) ++BuildRequires: golang(github.com/sergi/go-diff/diffmatchpatch) ++BuildRequires: golang(github.com/smartystreets/assertions) ++BuildRequires: golang(github.com/smartystreets/goconvey/convey) ++BuildRequires: golang(github.com/smartystreets/goconvey/convey/gotest) ++BuildRequires: golang(github.com/smartystreets/goconvey/convey/reporting) ++BuildRequires: golang(github.com/teris-io/shortid) ++BuildRequires: golang(github.com/Unknwon/com) ++BuildRequires: golang(github.com/VividCortex/mysqlerr) ++BuildRequires: golang(github.com/yudai/gojsondiff) ++BuildRequires: golang(github.com/yudai/golcs) ++BuildRequires: golang(golang.org/x/crypto/pbkdf2) ++BuildRequires: golang(golang.org/x/crypto/ed25519) ++BuildRequires: golang(golang.org/x/crypto/md4) ++BuildRequires: golang(golang.org/x/net/context) ++BuildRequires: golang(golang.org/x/net/context/ctxhttp) ++BuildRequires: golang(golang.org/x/net/http2) ++BuildRequires: golang(golang.org/x/net/http2/hpack) ++BuildRequires: golang(golang.org/x/net/http/httpguts) ++BuildRequires: golang(golang.org/x/net/idna) ++BuildRequires: golang(golang.org/x/net/internal/timeseries) ++BuildRequires: golang(golang.org/x/net/trace) ++BuildRequires: golang(golang.org/x/text/collate) ++BuildRequires: golang(golang.org/x/text/collate/build) ++BuildRequires: golang(golang.org/x/text/internal/colltab) ++BuildRequires: golang(golang.org/x/text/internal/gen) ++BuildRequires: golang(golang.org/x/text/internal/tag) ++BuildRequires: golang(golang.org/x/text/internal/triegen) ++BuildRequires: golang(golang.org/x/text/internal/ucd) ++BuildRequires: golang(golang.org/x/oauth2) ++BuildRequires: golang(golang.org/x/oauth2/google) ++BuildRequires: golang(golang.org/x/oauth2/internal) ++BuildRequires: golang(golang.org/x/oauth2/jws) ++BuildRequires: golang(golang.org/x/oauth2/jwt) ++BuildRequires: golang(github.com/golang/protobuf/proto) ++BuildRequires: golang(github.com/golang/protobuf/ptypes) ++BuildRequires: golang(github.com/golang/protobuf/ptypes) ++BuildRequires: golang(github.com/golang/protobuf/ptypes/duration) ++BuildRequires: golang(github.com/golang/protobuf/ptypes/any) ++BuildRequires: golang(github.com/golang/protobuf/ptypes/timestamp) ++BuildRequires: golang(cloud.google.com/go/compute/metadata) ++BuildRequires: golang(gopkg.in/alexcesaro/quotedprintable.v3) ++BuildRequires: golang(gopkg.in/asn1-ber.v1) ++BuildRequires: golang(github.com/go-bufio/bufio) ++BuildRequires: golang(github.com/go-ini/ini) ++BuildRequires: golang(github.com/go-macaron/macaron) ++BuildRequires: golang(github.com/go-redis/redis) ++BuildRequires: golang(gopkg.in/square/go-jose.v2) ++BuildRequires: golang(gopkg.in/square/go-jose.v2/cipher) ++BuildRequires: golang(gopkg.in/square/go-jose.v2/json) ++BuildRequires: golang(github.com/go-yaml/yaml) ++BuildRequires: golang(golang.org/x/sync/errgroup) ++BuildRequires: golang(gopkg.in/ldap.v3) ++BuildRequires: golang(gopkg.in/mail.v2) ++ ++# Declare all nodejs modules bundled in the webpack - this is for security ++# purposes so if nodejs-foo ever needs an update, affected packages can be ++# easily identified. This is generated from package-lock.json once the webpack ++# has been built with make_webpack.sh. ++Provides: bundled(nodejs-abbrev) = 1.1.1 ++Provides: bundled(nodejs-ansi-regex) = 2.1.1 ++Provides: bundled(nodejs-ansi-styles) = 2.2.1 ++Provides: bundled(nodejs-argparse) = 1.0.10 ++Provides: bundled(nodejs-array-find-index) = 1.0.2 ++Provides: bundled(nodejs-async) = 1.5.2 ++Provides: bundled(nodejs-balanced-match) = 1.0.0 ++Provides: bundled(nodejs-brace-expansion) = 1.1.11 ++Provides: bundled(nodejs-builtin-modules) = 1.1.1 ++Provides: bundled(nodejs-camelcase) = 2.1.1 ++Provides: bundled(nodejs-camelcase-keys) = 2.1.0 ++Provides: bundled(nodejs-chalk) = 1.1.3 ++Provides: bundled(nodejs-coffee-script) = 1.10.0 ++Provides: bundled(nodejs-colors) = 1.1.2 ++Provides: bundled(nodejs-concat-map) = 0.0.1 ++Provides: bundled(nodejs-currently-unhandled) = 0.4.1 ++Provides: bundled(nodejs-dateformat) = 1.0.12 ++Provides: bundled(nodejs-decamelize) = 1.2.0 ++Provides: bundled(nodejs-error-ex) = 1.3.2 ++Provides: bundled(nodejs-escape-string-regexp) = 1.0.5 ++Provides: bundled(nodejs-esprima) = 2.7.3 ++Provides: bundled(nodejs-eventemitter2) = 0.4.14 ++Provides: bundled(nodejs-exit) = 0.1.2 ++Provides: bundled(nodejs-find-up) = 1.1.2 ++Provides: bundled(nodejs-findup-sync) = 0.3.0 ++Provides: bundled(nodejs-fs.realpath) = 1.0.0 ++Provides: bundled(nodejs-get-stdin) = 4.0.1 ++Provides: bundled(nodejs-getobject) = 0.1.0 ++Provides: bundled(nodejs-glob) = 7.0.6 ++Provides: bundled(nodejs-graceful-fs) = 4.1.15 ++Provides: bundled(nodejs-grunt) = 1.0.1 ++Provides: bundled(nodejs-grunt-cli) = 1.2.0 ++Provides: bundled(nodejs-grunt-known-options) = 1.1.1 ++Provides: bundled(nodejs-grunt-legacy-log) = 1.0.2 ++Provides: bundled(nodejs-lodash) = 4.17.11 ++Provides: bundled(nodejs-grunt-legacy-log-utils) = 1.0.0 ++Provides: bundled(nodejs-grunt-legacy-util) = 1.0.0 ++Provides: bundled(nodejs-has-ansi) = 2.0.0 ++Provides: bundled(nodejs-hooker) = 0.2.3 ++Provides: bundled(nodejs-hosted-git-info) = 2.7.1 ++Provides: bundled(nodejs-iconv-lite) = 0.4.24 ++Provides: bundled(nodejs-indent-string) = 2.1.0 ++Provides: bundled(nodejs-inflight) = 1.0.6 ++Provides: bundled(nodejs-inherits) = 2.0.3 ++Provides: bundled(nodejs-is-arrayish) = 0.2.1 ++Provides: bundled(nodejs-is-builtin-module) = 1.0.0 ++Provides: bundled(nodejs-is-finite) = 1.0.2 ++Provides: bundled(nodejs-is-utf8) = 0.2.1 ++Provides: bundled(nodejs-isexe) = 2.0.0 ++Provides: bundled(nodejs-js-yaml) = 3.5.5 ++Provides: bundled(nodejs-load-json-file) = 1.1.0 ++Provides: bundled(nodejs-loud-rejection) = 1.6.0 ++Provides: bundled(nodejs-map-obj) = 1.0.1 ++Provides: bundled(nodejs-meow) = 3.7.0 ++Provides: bundled(nodejs-minimatch) = 3.0.4 ++Provides: bundled(nodejs-minimist) = 1.2.0 ++Provides: bundled(nodejs-nopt) = 3.0.6 ++Provides: bundled(nodejs-normalize-package-data) = 2.4.2 ++Provides: bundled(nodejs-number-is-nan) = 1.0.1 ++Provides: bundled(nodejs-object-assign) = 4.1.1 ++Provides: bundled(nodejs-once) = 1.4.0 ++Provides: bundled(nodejs-parse-json) = 2.2.0 ++Provides: bundled(nodejs-path-exists) = 2.1.0 ++Provides: bundled(nodejs-path-is-absolute) = 1.0.1 ++Provides: bundled(nodejs-path-type) = 1.1.0 ++Provides: bundled(nodejs-pify) = 2.3.0 ++Provides: bundled(nodejs-pinkie) = 2.0.4 ++Provides: bundled(nodejs-pinkie-promise) = 2.0.1 ++Provides: bundled(nodejs-read-pkg) = 1.1.0 ++Provides: bundled(nodejs-read-pkg-up) = 1.0.1 ++Provides: bundled(nodejs-redent) = 1.0.0 ++Provides: bundled(nodejs-repeating) = 2.0.1 ++Provides: bundled(nodejs-resolve) = 1.1.7 ++Provides: bundled(nodejs-rimraf) = 2.2.8 ++Provides: bundled(nodejs-safer-buffer) = 2.1.2 ++Provides: bundled(nodejs-semver) = 5.6.0 ++Provides: bundled(nodejs-signal-exit) = 3.0.2 ++Provides: bundled(nodejs-spdx-correct) = 3.1.0 ++Provides: bundled(nodejs-spdx-exceptions) = 2.2.0 ++Provides: bundled(nodejs-spdx-expression-parse) = 3.0.0 ++Provides: bundled(nodejs-spdx-license-ids) = 3.0.3 ++Provides: bundled(nodejs-sprintf-js) = 1.0.3 ++Provides: bundled(nodejs-strip-ansi) = 3.0.1 ++Provides: bundled(nodejs-strip-bom) = 2.0.0 ++Provides: bundled(nodejs-strip-indent) = 1.0.1 ++Provides: bundled(nodejs-supports-color) = 2.0.0 ++Provides: bundled(nodejs-trim-newlines) = 1.0.0 ++Provides: bundled(nodejs-underscore.string) = 3.2.3 ++Provides: bundled(nodejs-validate-npm-package-license) = 3.0.4 ++Provides: bundled(nodejs-which) = 1.2.14 ++Provides: bundled(nodejs-wrappy) = 1.0.2 ++Provides: bundled(nodejs-yarn) = 1.13.0 ++ ++ ++%description ++Grafana is an open source, feature rich metrics dashboard and graph editor for ++Graphite, InfluxDB & OpenTSDB. ++ ++ ++%prep ++%setup -q -T -D -b 0 ++%setup -q -T -D -b 1 ++%patch0 -p1 ++%patch1 -p1 ++%patch2 -p1 ++%patch3 -p1 ++%patch4 -p1 ++%patch5 -p1 ++%patch6 -p1 ++ ++# Set up build subdirs and links ++mkdir -p %{_builddir}/src/github.com/grafana ++ln -sf %{_builddir}/%{name}-%{version} \ ++ %{_builddir}/src/github.com/grafana/grafana ++ ++# remove some (apparent) development files, for rpmlint ++rm -f %{_builddir}/src/github.com/grafana/grafana/public/sass/.sass-lint.yml ++rm -f %{_builddir}/src/github.com/grafana/grafana/public/test/.jshintrc ++ ++# Unbundle all grafana vendor sources, as per BuildRequires above. ++# An exception is grafana-plugin-model, which is part of grafana. ++cp --parents -a vendor/github.com/grafana %{_builddir} ++rm -r vendor # remove all vendor sources ++mv %{_builddir}/vendor vendor # put back what we're keeping ++ ++ ++%build ++# Build the server-side binaries: grafana-server and grafana-cli ++export GOPATH=%{_builddir}:%{gopath} ++%gobuild -o grafana-cli ./pkg/cmd/grafana-cli ++%gobuild -o grafana-server ./pkg/cmd/grafana-server ++ ++ ++%install ++# binaries ++install -d %{buildroot}%{_sbindir} ++install -p -m 755 %{name}-server %{name}-cli %{buildroot}%{_sbindir} ++ ++# other shared files, public html, webpack ++install -d %{buildroot}%{_datadir}/%{name} ++cp -a conf public %{buildroot}%{_datadir}/%{name} ++ ++# man pages ++install -d %{buildroot}%{_mandir}/man1 ++install -p -m 644 docs/man/man1/* %{buildroot}%{_mandir}/man1 ++ ++# config dirs ++install -d %{buildroot}%{_sysconfdir}/%{name} ++install -d %{buildroot}%{_sysconfdir}/sysconfig ++ ++# config defaults ++install -p -m 644 conf/distro-defaults.ini \ ++ %{buildroot}%{_sysconfdir}/%{name}/grafana.ini ++install -p -m 644 conf/distro-defaults.ini \ ++ %{buildroot}%{_datadir}/%{name}/conf/defaults.ini ++install -p -m 644 conf/ldap.toml %{buildroot}%{_sysconfdir}/%{name}/ldap.toml ++install -p -m 644 packaging/rpm/sysconfig/grafana-server \ ++ %{buildroot}%{_sysconfdir}/sysconfig/grafana-server ++ ++# config database directory and plugins ++install -d %{buildroot}%{_sharedstatedir}/%{name} ++install -d -m 755 %{buildroot}%{_sharedstatedir}/%{name} ++install -d -m 755 %{buildroot}%{_sharedstatedir}/%{name}/plugins ++ ++# log directory ++install -d %{buildroot}%{_localstatedir}/log/%{name} ++ ++# systemd service files ++install -d %{buildroot}%{_unitdir} # only needed for manual rpmbuilds ++install -p -m 644 packaging/rpm/systemd/grafana-server.service \ ++ %{buildroot}%{_unitdir} ++ ++# daemon run pid file config for using tmpfs ++install -d %{buildroot}%{_tmpfilesdir} ++echo "d %{_rundir}/%{name} 0755 %{GRAFANA_USER} %{GRAFANA_GROUP} -" \ ++ > %{buildroot}%{_tmpfilesdir}/%{name}.conf ++ ++%pre ++getent group %{GRAFANA_GROUP} >/dev/null || groupadd -r %{GRAFANA_GROUP} ++getent passwd %{GRAFANA_USER} >/dev/null || \ ++ useradd -r -g %{GRAFANA_GROUP} -d %{GRAFANA_HOME} -s /sbin/nologin \ ++ -c "%{GRAFANA_USER} user account" %{GRAFANA_USER} ++exit 0 ++ ++%preun ++%systemd_preun grafana-server.service ++ ++%post ++%systemd_post grafana-server.service ++ ++%postun ++%systemd_postun_with_restart grafana-server.service ++ ++ ++%check ++cd %{_builddir}/src/github.com/grafana/grafana ++export GOPATH=%{_builddir}:%{gopath} ++# this test fails for some reason ++rm -f pkg/services/provisioning/dashboards/file_reader_linux_test.go ++# should be using %%gochecks here, but it doesn't work ++go test ./pkg/... ++ ++ ++%files ++# binaries ++%{_sbindir}/%{name}-server ++%{_sbindir}/%{name}-cli ++ ++# config files ++%dir %{_sysconfdir}/%{name} ++%config(noreplace) %attr(644, root, %{GRAFANA_GROUP}) %{_sysconfdir}/%{name}/grafana.ini ++%config(noreplace) %attr(644, root, %{GRAFANA_GROUP}) %{_sysconfdir}/%{name}/ldap.toml ++%config(noreplace) %{_sysconfdir}/sysconfig/grafana-server ++ ++# Grafana configuration to dynamically create /run/grafana/grafana.pid on tmpfs ++%{_tmpfilesdir}/%{name}.conf ++ ++# config database directory and plugins (actual db files are created by grafana-server) ++%attr(-, %{GRAFANA_USER}, %{GRAFANA_GROUP}) %dir %{_sharedstatedir}/%{name} ++%attr(-, %{GRAFANA_USER}, %{GRAFANA_GROUP}) %dir %{_sharedstatedir}/%{name}/plugins ++ ++# shared directory and all files therein ++%dir %{_datadir}/%{name} ++%{_datadir}/%{name}/public ++%dir %{_datadir}/%{name}/conf ++%attr(-, root, %{GRAFANA_GROUP}) %{_datadir}/%{name}/conf/* ++ ++# systemd service file ++%{_unitdir}/grafana-server.service ++ ++# log directory - grafana.log is created by grafana-server, and it does it's own log rotation ++%attr(0755, %{GRAFANA_USER}, %{GRAFANA_GROUP}) %dir %{_localstatedir}/log/%{name} ++ ++# man pages for grafana binaries ++%{_mandir}/man1/%{name}-server.1* ++%{_mandir}/man1/%{name}-cli.1* ++ ++# other docs and license ++%license LICENSE ++%doc CHANGELOG.md CODE_OF_CONDUCT.md CONTRIBUTING.md NOTICE.md ++%doc PLUGIN_DEV.md README.md ROADMAP.md UPGRADING_DEPENDENCIES.md ++ ++ ++%changelog ++* Wed Apr 24 2019 Mark Goodwin 6.1.4-1 ++- update to latest upstream stable release 6.1.4, see CHANGELOG ++- use gobuild and gochecks macros, eliminate arch symlinks ++- re-enable grafana-debugsource package ++- fix GRAFANA_GROUP typo ++- fix more modes for brp-mangle-shebangs ++- vendor source unbundling now done in prep after patches ++- remove all rhel and fedora conditional guff ++ ++* Tue Apr 16 2019 Mark Goodwin 6.1.3-1 ++- update to latest upstream stable release 6.1.3, see CHANGELOG ++- unbundle all vendor sources, replace with BuildRequires, see ++ the long list of blocker BZs linked to BZ#1670656 ++- BuildRequires go-plugin >= v1.0.0 for grpc_broker (thanks eclipseo) ++- tweak make_webpack to no longer use grunt, switch to prod build ++- add ExclusiveArch lua script (thanks quantum.analyst) ++- move db directory and plugins to /var/lib/grafana ++- split out into 6 patches, ready for upstream PRs ++- add check to run go tests for gating checks ++ ++* Thu Apr 04 2019 Mark Goodwin 6.1.0-1 ++- update to latest upstream stable release 6.1.0, see CHANGELOG ++ ++* Thu Mar 21 2019 Mark Goodwin 6.0.2-1 ++- bump to latest upstream stable release 6.0.2-1 ++- unbundle almost all remaining vendor code, see linked blockers in BZ#1670656 ++ ++* Fri Mar 15 2019 Mark Goodwin 6.0.1-3 ++- bump to latest upstream stable release 6.0.1-1 ++ ++* Thu Mar 14 2019 Mark Goodwin 6.0.1-2 ++- unbundle and add BuildRequires for golang-github-rainycape-unidecode-devel ++ ++* Thu Mar 07 2019 Mark Goodwin 6.0.1-1 ++- update to v6.0.1 upstream sources, tweak distro config, re-do patch ++- simplify make_webpack.sh script (Elliott Sales de Andrade) ++- vendor/github.com/go-ldap is now gone, so don't unbundle it ++ ++* Thu Mar 07 2019 Mark Goodwin 5.4.3-11 ++- tweak after latest feedback, bump to 5.4.3-11 (BZ 1670656) ++- build debuginfo package again ++- unbundle BuildRequires for golang-github-hashicorp-version-devel ++- remove some unneeded development files ++- remove macros from changelog and other rpmlint tweaks ++ ++* Fri Feb 22 2019 Mark Goodwin 5.4.3-10 ++- tweak spec for available and unavailable (bundled) golang packages ++ ++* Wed Feb 20 2019 Xavier Bachelot 5.4.3-9 ++- Remove extraneous slash (cosmetic) ++- Create directories just before moving stuff in them ++- Truncate long lines ++- Group all golang stuff ++- Simplify BuildRequires/bundled Provides ++- Sort BuildRequires/bundled Provides ++- Fix bundled go packages Provides ++ ++* Fri Feb 15 2019 Mark Goodwin 5.4.3-8 ++- add BuildRequires (and unbundle) vendor sources available in Fedora ++- declare Provides for remaining (bundled) vendor go sources ++- do not attempt to unbundle anything on RHEL < 7 or Fedora < 28 ++ ++* Thu Feb 07 2019 Mark Goodwin 5.4.3-7 ++- further refinement for spec doc section from Xavier Bachelot ++- disable debug_package to avoid empty debugsourcefiles.list ++ ++* Wed Feb 06 2019 Mark Goodwin 5.4.3-6 ++- further refinement following review by Xavier Bachelot ++ ++* Tue Feb 05 2019 Mark Goodwin 5.4.3-5 ++- further refinement following review by Xavier Bachelot ++ ++* Fri Feb 01 2019 Mark Goodwin 5.4.3-4 ++- further spec updates after packaging review ++- reworked post-install scriplets ++ ++* Thu Jan 31 2019 Mark Goodwin 5.4.3-3 ++- tweak FHS patch, update spec after packaging review ++ ++* Wed Jan 30 2019 Mark Goodwin 5.4.3-2 ++- add patch to be standard FHS compliant, remove phantomjs ++- update to v5.4.3 upstream community sources ++ ++* Wed Jan 09 2019 Mark Goodwin 5.4.2-1 ++- update to v5.4.2 upstream community sources ++ ++* Thu Oct 18 2018 Mark Goodwin 5.3.1-1 ++- update to v5.3.1 upstream community sources ++ ++* Tue Oct 02 2018 Mark Goodwin 5.2.5-1 ++- native RPM spec build with current tagged v5.2.5 sources +diff --git a/packaging/rpm/spec/make_webpack.sh b/packaging/rpm/spec/make_webpack.sh +new file mode 100755 +index 000000000..47a8025ff +--- /dev/null ++++ b/packaging/rpm/spec/make_webpack.sh +@@ -0,0 +1,61 @@ ++#! /bin/bash ++# ++# Copyright (c) 2019 Red Hat. ++# ++# This program is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by the ++# Free Software Foundation; either version 2 of the License, or (at your ++# option) any later version. ++# ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++# for more details. ++# ++ ++[ $# -ne 1 ] && echo "Usage: $0 version" && exit 1 ++ ++# grafana version (must be tagged on github.com/grafana/grafana as "v$VER") ++VER=$1 ++BUILDDIR=`mktemp -d buildXXXXXX` ++ ++[ ! -f /usr/bin/npm ] && echo Error, please install \"npm\" package && exit 1 ++ ++# get src tree and set cwd ++echo Fetching pristine upstream git tagged branch for grafana version v$VER ... ++git clone https://github.com/grafana/grafana grafana-$VER ++cd grafana-$VER ++git checkout -b v$VER v$VER ++ ++# exclude the phantomjs-prebuilt binary module from the webpack ++sed -i '/phantomjs-prebuilt/d' package.json ++ ++# nuke grunt task for copying phantomjs ++rm -f scripts/grunt/options/phantomjs.js ++sed -i '/phantomjs/d' scripts/grunt/*.js ++ ++# populate node_modules using package.json ++echo Running yarn to populate local node_modules .... ++npm install yarn ++node_modules/yarn/bin/yarn --non-interactive --no-progress --ignore-engines install --pure-lockfile > yarn.out 2>&1 ++node_modules/yarn/bin/yarn --non-interactive -W add webpack-cli ++ ++# build the webpack ++echo;echo Building production webpack .... ++node_modules/webpack/bin/webpack.js --display errors-only --mode production --config scripts/webpack/webpack.prod.js ++ ++cd .. ++ ++# webpack tarball. Includes public/views because index.html references the webpack ++tar czf grafana_webpack-$VER.tar.gz grafana-$VER/public/build grafana-$VER/public/views ++ ++# source tarball (if needed) ++if [ ! -f grafana-$VER.tar.gz ]; then ++ wget --quiet -O grafana-$VER.tar.gz https://github.com/grafana/grafana/archive/v$VER/grafana-$VER.tar.gz ++fi ++ ++# done ++echo Both grafana-$VER.tar.gz and grafana_webpack-$VER.tar.gz ++echo should now be copied to your \$HOME/rpmbuild/SOURCES ++ ++exit 0 diff --git a/grafana.spec b/grafana.spec new file mode 100644 index 0000000..9d69b10 --- /dev/null +++ b/grafana.spec @@ -0,0 +1,511 @@ +%global grafana_arches %{lua: go_arches = {} + for arch in rpm.expand("%{go_arches}"):gmatch("%S+") do + go_arches[arch] = 1 + end + for arch in rpm.expand("%{nodejs_arches}"):gmatch("%S+") do + if go_arches[arch] then + print(arch .. " ") + end +end} + +Name: grafana +Version: 6.1.4 +Release: 1%{?dist} +Summary: Metrics dashboard and graph editor +License: ASL 2.0 +URL: https://grafana.org + +# Source0 contains the tagged upstream sources +Source0: https://github.com/grafana/grafana/archive/v%{version}/%{name}-%{version}.tar.gz + +# Source1 contains the front-end javascript modules bundled into a webpack +Source1: grafana_webpack-%{version}.tar.gz + +# Source2 is the script to create the above webpack from grafana sources +Source2: make_webpack.sh + +# Patches for upstream (except Patch5) +Patch0: 000-go-test-fixes.patch +Patch1: 001-man-pages.patch +Patch2: 002-update-golang-oauth2-vendor-sources.patch +Patch3: 003-file-mode-updates.patch +Patch4: 004-grafana.ini-for-Linux-distros.patch +Patch5: 005-remove-jaeger-tracing.patch +Patch6: 006-native-RPM-spec-and-webpack-build-script.patch + +# Intersection of go_arches and nodejs_arches +ExclusiveArch: %{grafana_arches} + +%global GRAFANA_USER %{name} +%global GRAFANA_GROUP %{name} +%global GRAFANA_HOME %{_datadir}/%{name} + +# grafana-server service daemon uses systemd +%{?systemd_requires} +Requires(pre): shadow-utils + +BuildRequires: systemd, golang, compiler(go-compiler) + +# golang build deps. These allow us to unbundle vendor golang source. +BuildRequires: golang(github.com/aws/aws-sdk-go) +BuildRequires: golang(github.com/benbjohnson/clock) +BuildRequires: golang(github.com/beorn7/perks/quantile) +BuildRequires: golang(github.com/bmizerany/assert) +BuildRequires: golang(github.com/bradfitz/gomemcache/memcache) +BuildRequires: golang(github.com/BurntSushi/toml) +BuildRequires: golang(github.com/codahale/hdrhistogram) +BuildRequires: golang(github.com/codegangsta/cli) +BuildRequires: golang(github.com/davecgh/go-spew/spew) +BuildRequires: golang(github.com/denisenkom/go-mssqldb) +BuildRequires: golang(github.com/facebookgo/inject) +BuildRequires: golang(github.com/facebookgo/structtag) +BuildRequires: golang(github.com/fatih/color) +BuildRequires: golang(github.com/go-ini/ini) +BuildRequires: golang(google.golang.org/appengine) +BuildRequires: golang(golang.org/x/sys/unix) +BuildRequires: golang(github.com/go-macaron/binding) +BuildRequires: golang(github.com/go-macaron/gzip) +BuildRequires: golang(github.com/go-macaron/inject) +BuildRequires: golang(github.com/go-macaron/session) +BuildRequires: golang(google.golang.org/genproto/googleapis/rpc/status) +BuildRequires: golang(github.com/gopherjs/gopherjs/js) +BuildRequires: golang(github.com/gorilla/websocket) +BuildRequires: golang(github.com/gosimple/slug) +BuildRequires: golang(github.com/go-sql-driver/mysql) +BuildRequires: golang(github.com/go-stack/stack) +BuildRequires: golang(github.com/go-xorm/builder) +BuildRequires: golang(github.com/go-xorm/core) +BuildRequires: golang(github.com/go-xorm/xorm) +BuildRequires: golang(google.golang.org/grpc) +BuildRequires: golang(github.com/hashicorp/go-hclog) +# need grpc_broker in go-plugin >= 1.0.0-1 +BuildRequires: golang(github.com/hashicorp/go-plugin) +BuildRequires: golang(github.com/hashicorp/go-version) +BuildRequires: golang(github.com/hashicorp/yamux) +BuildRequires: golang(github.com/inconshreveable/log15) +BuildRequires: golang(github.com/jmespath/go-jmespath) +BuildRequires: golang(github.com/jtolds/gls) +BuildRequires: golang(github.com/klauspost/compress/flate) +BuildRequires: golang(github.com/klauspost/compress/gzip) +BuildRequires: golang(github.com/klauspost/compress/snappy) +BuildRequires: golang(github.com/klauspost/cpuid) +BuildRequires: golang(github.com/klauspost/crc32) +BuildRequires: golang(github.com/kr/pretty) +BuildRequires: golang(github.com/kr/text) +BuildRequires: golang(github.com/lib/pq) +BuildRequires: golang(github.com/mattn/go-colorable) +BuildRequires: golang(github.com/mattn/go-isatty) +BuildRequires: golang(github.com/mattn/go-sqlite3) +BuildRequires: golang(github.com/matttproud/golang_protobuf_extensions/pbutil) +BuildRequires: golang(github.com/mitchellh/go-testing-interface) +BuildRequires: golang(github.com/oklog/run) +BuildRequires: golang(github.com/opentracing/opentracing-go) +BuildRequires: golang(github.com/patrickmn/go-cache) +BuildRequires: golang(github.com/pkg/errors) +BuildRequires: golang(github.com/prometheus/client_golang/api) +BuildRequires: golang(github.com/prometheus/client_golang/api/prometheus/v1) +BuildRequires: golang(github.com/prometheus/client_model/go) +BuildRequires: golang-github-prometheus-common-devel +BuildRequires: golang(github.com/prometheus/common/expfmt) +BuildRequires: golang(github.com/prometheus/common/model) +BuildRequires: golang(github.com/prometheus/common/expfmt) +BuildRequires: golang(github.com/prometheus/procfs) +BuildRequires: golang(github.com/prometheus/procfs/internal/util) +BuildRequires: golang(github.com/prometheus/procfs) +BuildRequires: golang(github.com/prometheus/procfs/internal/util) +BuildRequires: golang(github.com/prometheus/procfs/nfs) +BuildRequires: golang(github.com/prometheus/procfs/xfs) +BuildRequires: golang(github.com/rainycape/unidecode) +BuildRequires: golang(github.com/sergi/go-diff/diffmatchpatch) +BuildRequires: golang(github.com/smartystreets/assertions) +BuildRequires: golang(github.com/smartystreets/goconvey/convey) +BuildRequires: golang(github.com/smartystreets/goconvey/convey/gotest) +BuildRequires: golang(github.com/smartystreets/goconvey/convey/reporting) +BuildRequires: golang(github.com/teris-io/shortid) +BuildRequires: golang(github.com/Unknwon/com) +BuildRequires: golang(github.com/VividCortex/mysqlerr) +BuildRequires: golang(github.com/yudai/gojsondiff) +BuildRequires: golang(github.com/yudai/golcs) +BuildRequires: golang(golang.org/x/crypto/pbkdf2) +BuildRequires: golang(golang.org/x/crypto/ed25519) +BuildRequires: golang(golang.org/x/crypto/md4) +BuildRequires: golang(golang.org/x/net/context) +BuildRequires: golang(golang.org/x/net/context/ctxhttp) +BuildRequires: golang(golang.org/x/net/http2) +BuildRequires: golang(golang.org/x/net/http2/hpack) +BuildRequires: golang(golang.org/x/net/http/httpguts) +BuildRequires: golang(golang.org/x/net/idna) +BuildRequires: golang(golang.org/x/net/internal/timeseries) +BuildRequires: golang(golang.org/x/net/trace) +BuildRequires: golang(golang.org/x/text/collate) +BuildRequires: golang(golang.org/x/text/collate/build) +BuildRequires: golang(golang.org/x/text/internal/colltab) +BuildRequires: golang(golang.org/x/text/internal/gen) +BuildRequires: golang(golang.org/x/text/internal/tag) +BuildRequires: golang(golang.org/x/text/internal/triegen) +BuildRequires: golang(golang.org/x/text/internal/ucd) +BuildRequires: golang(golang.org/x/oauth2) +BuildRequires: golang(golang.org/x/oauth2/google) +BuildRequires: golang(golang.org/x/oauth2/internal) +BuildRequires: golang(golang.org/x/oauth2/jws) +BuildRequires: golang(golang.org/x/oauth2/jwt) +BuildRequires: golang(github.com/golang/protobuf/proto) +BuildRequires: golang(github.com/golang/protobuf/ptypes) +BuildRequires: golang(github.com/golang/protobuf/ptypes) +BuildRequires: golang(github.com/golang/protobuf/ptypes/duration) +BuildRequires: golang(github.com/golang/protobuf/ptypes/any) +BuildRequires: golang(github.com/golang/protobuf/ptypes/timestamp) +BuildRequires: golang(cloud.google.com/go/compute/metadata) +BuildRequires: golang(gopkg.in/alexcesaro/quotedprintable.v3) +BuildRequires: golang(gopkg.in/asn1-ber.v1) +BuildRequires: golang(github.com/go-bufio/bufio) +BuildRequires: golang(github.com/go-ini/ini) +BuildRequires: golang(github.com/go-macaron/macaron) +BuildRequires: golang(github.com/go-redis/redis) +BuildRequires: golang(gopkg.in/square/go-jose.v2) +BuildRequires: golang(gopkg.in/square/go-jose.v2/cipher) +BuildRequires: golang(gopkg.in/square/go-jose.v2/json) +BuildRequires: golang(github.com/go-yaml/yaml) +BuildRequires: golang(golang.org/x/sync/errgroup) +BuildRequires: golang(gopkg.in/ldap.v3) +BuildRequires: golang(gopkg.in/mail.v2) + +# Declare all nodejs modules bundled in the webpack - this is for security +# purposes so if nodejs-foo ever needs an update, affected packages can be +# easily identified. This is generated from package-lock.json once the webpack +# has been built with make_webpack.sh. +Provides: bundled(nodejs-abbrev) = 1.1.1 +Provides: bundled(nodejs-ansi-regex) = 2.1.1 +Provides: bundled(nodejs-ansi-styles) = 2.2.1 +Provides: bundled(nodejs-argparse) = 1.0.10 +Provides: bundled(nodejs-array-find-index) = 1.0.2 +Provides: bundled(nodejs-async) = 1.5.2 +Provides: bundled(nodejs-balanced-match) = 1.0.0 +Provides: bundled(nodejs-brace-expansion) = 1.1.11 +Provides: bundled(nodejs-builtin-modules) = 1.1.1 +Provides: bundled(nodejs-camelcase) = 2.1.1 +Provides: bundled(nodejs-camelcase-keys) = 2.1.0 +Provides: bundled(nodejs-chalk) = 1.1.3 +Provides: bundled(nodejs-coffee-script) = 1.10.0 +Provides: bundled(nodejs-colors) = 1.1.2 +Provides: bundled(nodejs-concat-map) = 0.0.1 +Provides: bundled(nodejs-currently-unhandled) = 0.4.1 +Provides: bundled(nodejs-dateformat) = 1.0.12 +Provides: bundled(nodejs-decamelize) = 1.2.0 +Provides: bundled(nodejs-error-ex) = 1.3.2 +Provides: bundled(nodejs-escape-string-regexp) = 1.0.5 +Provides: bundled(nodejs-esprima) = 2.7.3 +Provides: bundled(nodejs-eventemitter2) = 0.4.14 +Provides: bundled(nodejs-exit) = 0.1.2 +Provides: bundled(nodejs-find-up) = 1.1.2 +Provides: bundled(nodejs-findup-sync) = 0.3.0 +Provides: bundled(nodejs-fs.realpath) = 1.0.0 +Provides: bundled(nodejs-get-stdin) = 4.0.1 +Provides: bundled(nodejs-getobject) = 0.1.0 +Provides: bundled(nodejs-glob) = 7.0.6 +Provides: bundled(nodejs-graceful-fs) = 4.1.15 +Provides: bundled(nodejs-grunt) = 1.0.1 +Provides: bundled(nodejs-grunt-cli) = 1.2.0 +Provides: bundled(nodejs-grunt-known-options) = 1.1.1 +Provides: bundled(nodejs-grunt-legacy-log) = 1.0.2 +Provides: bundled(nodejs-lodash) = 4.17.11 +Provides: bundled(nodejs-grunt-legacy-log-utils) = 1.0.0 +Provides: bundled(nodejs-grunt-legacy-util) = 1.0.0 +Provides: bundled(nodejs-has-ansi) = 2.0.0 +Provides: bundled(nodejs-hooker) = 0.2.3 +Provides: bundled(nodejs-hosted-git-info) = 2.7.1 +Provides: bundled(nodejs-iconv-lite) = 0.4.24 +Provides: bundled(nodejs-indent-string) = 2.1.0 +Provides: bundled(nodejs-inflight) = 1.0.6 +Provides: bundled(nodejs-inherits) = 2.0.3 +Provides: bundled(nodejs-is-arrayish) = 0.2.1 +Provides: bundled(nodejs-is-builtin-module) = 1.0.0 +Provides: bundled(nodejs-is-finite) = 1.0.2 +Provides: bundled(nodejs-is-utf8) = 0.2.1 +Provides: bundled(nodejs-isexe) = 2.0.0 +Provides: bundled(nodejs-js-yaml) = 3.5.5 +Provides: bundled(nodejs-load-json-file) = 1.1.0 +Provides: bundled(nodejs-loud-rejection) = 1.6.0 +Provides: bundled(nodejs-map-obj) = 1.0.1 +Provides: bundled(nodejs-meow) = 3.7.0 +Provides: bundled(nodejs-minimatch) = 3.0.4 +Provides: bundled(nodejs-minimist) = 1.2.0 +Provides: bundled(nodejs-nopt) = 3.0.6 +Provides: bundled(nodejs-normalize-package-data) = 2.4.2 +Provides: bundled(nodejs-number-is-nan) = 1.0.1 +Provides: bundled(nodejs-object-assign) = 4.1.1 +Provides: bundled(nodejs-once) = 1.4.0 +Provides: bundled(nodejs-parse-json) = 2.2.0 +Provides: bundled(nodejs-path-exists) = 2.1.0 +Provides: bundled(nodejs-path-is-absolute) = 1.0.1 +Provides: bundled(nodejs-path-type) = 1.1.0 +Provides: bundled(nodejs-pify) = 2.3.0 +Provides: bundled(nodejs-pinkie) = 2.0.4 +Provides: bundled(nodejs-pinkie-promise) = 2.0.1 +Provides: bundled(nodejs-read-pkg) = 1.1.0 +Provides: bundled(nodejs-read-pkg-up) = 1.0.1 +Provides: bundled(nodejs-redent) = 1.0.0 +Provides: bundled(nodejs-repeating) = 2.0.1 +Provides: bundled(nodejs-resolve) = 1.1.7 +Provides: bundled(nodejs-rimraf) = 2.2.8 +Provides: bundled(nodejs-safer-buffer) = 2.1.2 +Provides: bundled(nodejs-semver) = 5.6.0 +Provides: bundled(nodejs-signal-exit) = 3.0.2 +Provides: bundled(nodejs-spdx-correct) = 3.1.0 +Provides: bundled(nodejs-spdx-exceptions) = 2.2.0 +Provides: bundled(nodejs-spdx-expression-parse) = 3.0.0 +Provides: bundled(nodejs-spdx-license-ids) = 3.0.3 +Provides: bundled(nodejs-sprintf-js) = 1.0.3 +Provides: bundled(nodejs-strip-ansi) = 3.0.1 +Provides: bundled(nodejs-strip-bom) = 2.0.0 +Provides: bundled(nodejs-strip-indent) = 1.0.1 +Provides: bundled(nodejs-supports-color) = 2.0.0 +Provides: bundled(nodejs-trim-newlines) = 1.0.0 +Provides: bundled(nodejs-underscore.string) = 3.2.3 +Provides: bundled(nodejs-validate-npm-package-license) = 3.0.4 +Provides: bundled(nodejs-which) = 1.2.14 +Provides: bundled(nodejs-wrappy) = 1.0.2 +Provides: bundled(nodejs-yarn) = 1.13.0 + + +%description +Grafana is an open source, feature rich metrics dashboard and graph editor for +Graphite, InfluxDB & OpenTSDB. + + +%prep +%setup -q -T -D -b 0 +%setup -q -T -D -b 1 +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 + +# Set up build subdirs and links +mkdir -p %{_builddir}/src/github.com/grafana +ln -sf %{_builddir}/%{name}-%{version} \ + %{_builddir}/src/github.com/grafana/grafana + +# remove some (apparent) development files, for rpmlint +rm -f %{_builddir}/src/github.com/grafana/grafana/public/sass/.sass-lint.yml +rm -f %{_builddir}/src/github.com/grafana/grafana/public/test/.jshintrc + +# Unbundle all grafana vendor sources, as per BuildRequires above. +# An exception is grafana-plugin-model, which is part of grafana. +cp --parents -a vendor/github.com/grafana %{_builddir} +rm -r vendor # remove all vendor sources +mv %{_builddir}/vendor vendor # put back what we're keeping + + +%build +# Build the server-side binaries: grafana-server and grafana-cli +export GOPATH=%{_builddir}:%{gopath} +%gobuild -o grafana-cli ./pkg/cmd/grafana-cli +%gobuild -o grafana-server ./pkg/cmd/grafana-server + + +%install +# binaries +install -d %{buildroot}%{_sbindir} +install -p -m 755 %{name}-server %{name}-cli %{buildroot}%{_sbindir} + +# other shared files, public html, webpack +install -d %{buildroot}%{_datadir}/%{name} +cp -a conf public %{buildroot}%{_datadir}/%{name} + +# man pages +install -d %{buildroot}%{_mandir}/man1 +install -p -m 644 docs/man/man1/* %{buildroot}%{_mandir}/man1 + +# config dirs +install -d %{buildroot}%{_sysconfdir}/%{name} +install -d %{buildroot}%{_sysconfdir}/sysconfig + +# config defaults +install -p -m 644 conf/distro-defaults.ini \ + %{buildroot}%{_sysconfdir}/%{name}/grafana.ini +install -p -m 644 conf/distro-defaults.ini \ + %{buildroot}%{_datadir}/%{name}/conf/defaults.ini +install -p -m 644 conf/ldap.toml %{buildroot}%{_sysconfdir}/%{name}/ldap.toml +install -p -m 644 packaging/rpm/sysconfig/grafana-server \ + %{buildroot}%{_sysconfdir}/sysconfig/grafana-server + +# config database directory and plugins +install -d %{buildroot}%{_sharedstatedir}/%{name} +install -d -m 755 %{buildroot}%{_sharedstatedir}/%{name} +install -d -m 755 %{buildroot}%{_sharedstatedir}/%{name}/plugins + +# log directory +install -d %{buildroot}%{_localstatedir}/log/%{name} + +# systemd service files +install -d %{buildroot}%{_unitdir} # only needed for manual rpmbuilds +install -p -m 644 packaging/rpm/systemd/grafana-server.service \ + %{buildroot}%{_unitdir} + +# daemon run pid file config for using tmpfs +install -d %{buildroot}%{_tmpfilesdir} +echo "d %{_rundir}/%{name} 0755 %{GRAFANA_USER} %{GRAFANA_GROUP} -" \ + > %{buildroot}%{_tmpfilesdir}/%{name}.conf + +%pre +getent group %{GRAFANA_GROUP} >/dev/null || groupadd -r %{GRAFANA_GROUP} +getent passwd %{GRAFANA_USER} >/dev/null || \ + useradd -r -g %{GRAFANA_GROUP} -d %{GRAFANA_HOME} -s /sbin/nologin \ + -c "%{GRAFANA_USER} user account" %{GRAFANA_USER} +exit 0 + +%preun +%systemd_preun grafana-server.service + +%post +%systemd_post grafana-server.service + +%postun +%systemd_postun_with_restart grafana-server.service + + +%check +cd %{_builddir}/src/github.com/grafana/grafana +export GOPATH=%{_builddir}:%{gopath} +# this test fails for some reason +rm -f pkg/services/provisioning/dashboards/file_reader_linux_test.go +# should be using %%gochecks here, but it doesn't work +go test ./pkg/... + + +%files +# binaries +%{_sbindir}/%{name}-server +%{_sbindir}/%{name}-cli + +# config files +%dir %{_sysconfdir}/%{name} +%config(noreplace) %attr(644, root, %{GRAFANA_GROUP}) %{_sysconfdir}/%{name}/grafana.ini +%config(noreplace) %attr(644, root, %{GRAFANA_GROUP}) %{_sysconfdir}/%{name}/ldap.toml +%config(noreplace) %{_sysconfdir}/sysconfig/grafana-server + +# Grafana configuration to dynamically create /run/grafana/grafana.pid on tmpfs +%{_tmpfilesdir}/%{name}.conf + +# config database directory and plugins (actual db files are created by grafana-server) +%attr(-, %{GRAFANA_USER}, %{GRAFANA_GROUP}) %dir %{_sharedstatedir}/%{name} +%attr(-, %{GRAFANA_USER}, %{GRAFANA_GROUP}) %dir %{_sharedstatedir}/%{name}/plugins + +# shared directory and all files therein +%dir %{_datadir}/%{name} +%{_datadir}/%{name}/public +%dir %{_datadir}/%{name}/conf +%attr(-, root, %{GRAFANA_GROUP}) %{_datadir}/%{name}/conf/* + +# systemd service file +%{_unitdir}/grafana-server.service + +# log directory - grafana.log is created by grafana-server, and it does it's own log rotation +%attr(0755, %{GRAFANA_USER}, %{GRAFANA_GROUP}) %dir %{_localstatedir}/log/%{name} + +# man pages for grafana binaries +%{_mandir}/man1/%{name}-server.1* +%{_mandir}/man1/%{name}-cli.1* + +# other docs and license +%license LICENSE +%doc CHANGELOG.md CODE_OF_CONDUCT.md CONTRIBUTING.md NOTICE.md +%doc PLUGIN_DEV.md README.md ROADMAP.md UPGRADING_DEPENDENCIES.md + + +%changelog +* Wed Apr 24 2019 Mark Goodwin 6.1.4-1 +- update to latest upstream stable release 6.1.4, see CHANGELOG +- use gobuild and gochecks macros, eliminate arch symlinks +- re-enable grafana-debugsource package +- fix GRAFANA_GROUP typo +- fix more modes for brp-mangle-shebangs +- vendor source unbundling now done in prep after patches +- remove all rhel and fedora conditional guff + +* Tue Apr 16 2019 Mark Goodwin 6.1.3-1 +- update to latest upstream stable release 6.1.3, see CHANGELOG +- unbundle all vendor sources, replace with BuildRequires, see + the long list of blocker BZs linked to BZ#1670656 +- BuildRequires go-plugin >= v1.0.0 for grpc_broker (thanks eclipseo) +- tweak make_webpack to no longer use grunt, switch to prod build +- add ExclusiveArch lua script (thanks quantum.analyst) +- move db directory and plugins to /var/lib/grafana +- split out into 6 patches, ready for upstream PRs +- add check to run go tests for gating checks + +* Thu Apr 04 2019 Mark Goodwin 6.1.0-1 +- update to latest upstream stable release 6.1.0, see CHANGELOG + +* Thu Mar 21 2019 Mark Goodwin 6.0.2-1 +- bump to latest upstream stable release 6.0.2-1 +- unbundle almost all remaining vendor code, see linked blockers in BZ#1670656 + +* Fri Mar 15 2019 Mark Goodwin 6.0.1-3 +- bump to latest upstream stable release 6.0.1-1 + +* Thu Mar 14 2019 Mark Goodwin 6.0.1-2 +- unbundle and add BuildRequires for golang-github-rainycape-unidecode-devel + +* Thu Mar 07 2019 Mark Goodwin 6.0.1-1 +- update to v6.0.1 upstream sources, tweak distro config, re-do patch +- simplify make_webpack.sh script (Elliott Sales de Andrade) +- vendor/github.com/go-ldap is now gone, so don't unbundle it + +* Thu Mar 07 2019 Mark Goodwin 5.4.3-11 +- tweak after latest feedback, bump to 5.4.3-11 (BZ 1670656) +- build debuginfo package again +- unbundle BuildRequires for golang-github-hashicorp-version-devel +- remove some unneeded development files +- remove macros from changelog and other rpmlint tweaks + +* Fri Feb 22 2019 Mark Goodwin 5.4.3-10 +- tweak spec for available and unavailable (bundled) golang packages + +* Wed Feb 20 2019 Xavier Bachelot 5.4.3-9 +- Remove extraneous slash (cosmetic) +- Create directories just before moving stuff in them +- Truncate long lines +- Group all golang stuff +- Simplify BuildRequires/bundled Provides +- Sort BuildRequires/bundled Provides +- Fix bundled go packages Provides + +* Fri Feb 15 2019 Mark Goodwin 5.4.3-8 +- add BuildRequires (and unbundle) vendor sources available in Fedora +- declare Provides for remaining (bundled) vendor go sources +- do not attempt to unbundle anything on RHEL < 7 or Fedora < 28 + +* Thu Feb 07 2019 Mark Goodwin 5.4.3-7 +- further refinement for spec doc section from Xavier Bachelot +- disable debug_package to avoid empty debugsourcefiles.list + +* Wed Feb 06 2019 Mark Goodwin 5.4.3-6 +- further refinement following review by Xavier Bachelot + +* Tue Feb 05 2019 Mark Goodwin 5.4.3-5 +- further refinement following review by Xavier Bachelot + +* Fri Feb 01 2019 Mark Goodwin 5.4.3-4 +- further spec updates after packaging review +- reworked post-install scriplets + +* Thu Jan 31 2019 Mark Goodwin 5.4.3-3 +- tweak FHS patch, update spec after packaging review + +* Wed Jan 30 2019 Mark Goodwin 5.4.3-2 +- add patch to be standard FHS compliant, remove phantomjs +- update to v5.4.3 upstream community sources + +* Wed Jan 09 2019 Mark Goodwin 5.4.2-1 +- update to v5.4.2 upstream community sources + +* Thu Oct 18 2018 Mark Goodwin 5.3.1-1 +- update to v5.3.1 upstream community sources + +* Tue Oct 02 2018 Mark Goodwin 5.2.5-1 +- native RPM spec build with current tagged v5.2.5 sources diff --git a/make_webpack.sh b/make_webpack.sh new file mode 100644 index 0000000..47a8025 --- /dev/null +++ b/make_webpack.sh @@ -0,0 +1,61 @@ +#! /bin/bash +# +# Copyright (c) 2019 Red Hat. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# + +[ $# -ne 1 ] && echo "Usage: $0 version" && exit 1 + +# grafana version (must be tagged on github.com/grafana/grafana as "v$VER") +VER=$1 +BUILDDIR=`mktemp -d buildXXXXXX` + +[ ! -f /usr/bin/npm ] && echo Error, please install \"npm\" package && exit 1 + +# get src tree and set cwd +echo Fetching pristine upstream git tagged branch for grafana version v$VER ... +git clone https://github.com/grafana/grafana grafana-$VER +cd grafana-$VER +git checkout -b v$VER v$VER + +# exclude the phantomjs-prebuilt binary module from the webpack +sed -i '/phantomjs-prebuilt/d' package.json + +# nuke grunt task for copying phantomjs +rm -f scripts/grunt/options/phantomjs.js +sed -i '/phantomjs/d' scripts/grunt/*.js + +# populate node_modules using package.json +echo Running yarn to populate local node_modules .... +npm install yarn +node_modules/yarn/bin/yarn --non-interactive --no-progress --ignore-engines install --pure-lockfile > yarn.out 2>&1 +node_modules/yarn/bin/yarn --non-interactive -W add webpack-cli + +# build the webpack +echo;echo Building production webpack .... +node_modules/webpack/bin/webpack.js --display errors-only --mode production --config scripts/webpack/webpack.prod.js + +cd .. + +# webpack tarball. Includes public/views because index.html references the webpack +tar czf grafana_webpack-$VER.tar.gz grafana-$VER/public/build grafana-$VER/public/views + +# source tarball (if needed) +if [ ! -f grafana-$VER.tar.gz ]; then + wget --quiet -O grafana-$VER.tar.gz https://github.com/grafana/grafana/archive/v$VER/grafana-$VER.tar.gz +fi + +# done +echo Both grafana-$VER.tar.gz and grafana_webpack-$VER.tar.gz +echo should now be copied to your \$HOME/rpmbuild/SOURCES + +exit 0 diff --git a/sources b/sources new file mode 100644 index 0000000..64f93e3 --- /dev/null +++ b/sources @@ -0,0 +1,2 @@ +SHA512 (grafana-6.1.4.tar.gz) = 75ed40232182d33484ecaeb58539d465bfcbd0ba7d03901925e8256a40fb6c87292ec0b324e97dce89ddb3b87505090f730eb12f77d987de5fe6e3b31ffb1782 +SHA512 (grafana_webpack-6.1.4.tar.gz) = a8895d14213cbe43adb3585969a6b23c1016d39bdcee9b48bd544f31f84a51bb4eb9b942ef68450910bd73ad9c03f89870782a230bba098197e7ce32000b8058