From 73082f167445b38a3341b8912e9cdc5c87bfa40a Mon Sep 17 00:00:00 2001 From: Anthony Lapenna Date: Tue, 14 Feb 2017 12:37:37 +1300 Subject: [PATCH] feat(cli): add a --no-analytics flag to disable google analytics (#601) --- api/cli/cli.go | 25 +++++++++++++------------ api/cli/defaults.go | 1 + api/cli/defaults_windows.go | 1 + api/cmd/portainer/main.go | 1 + api/portainer.go | 26 ++++++++++++++------------ app/app.js | 15 ++++++++++----- app/services/stateManager.js | 1 + gruntfile.js | 8 ++++---- 8 files changed, 45 insertions(+), 33 deletions(-) diff --git a/api/cli/cli.go b/api/cli/cli.go index acaaa8ea7..d77d6249b 100644 --- a/api/cli/cli.go +++ b/api/cli/cli.go @@ -22,18 +22,19 @@ func (*Service) ParseFlags(version string) (*portainer.CLIFlags, error) { kingpin.Version(version) flags := &portainer.CLIFlags{ - Endpoint: kingpin.Flag("host", "Dockerd endpoint").Short('H').String(), - Logo: kingpin.Flag("logo", "URL for the logo displayed in the UI").String(), - Labels: pairs(kingpin.Flag("hide-label", "Hide containers with a specific label in the UI").Short('l')), - Addr: kingpin.Flag("bind", "Address and port to serve Portainer").Default(defaultBindAddress).Short('p').String(), - Assets: kingpin.Flag("assets", "Path to the assets").Default(defaultAssetsDirectory).Short('a').String(), - Data: kingpin.Flag("data", "Path to the folder where the data is stored").Default(defaultDataDirectory).Short('d').String(), - Templates: kingpin.Flag("templates", "URL to the templates (apps) definitions").Default(defaultTemplatesURL).Short('t').String(), - NoAuth: kingpin.Flag("no-auth", "Disable authentication").Default(defaultNoAuth).Bool(), - TLSVerify: kingpin.Flag("tlsverify", "TLS support").Default(defaultTLSVerify).Bool(), - TLSCacert: kingpin.Flag("tlscacert", "Path to the CA").Default(defaultTLSCACertPath).String(), - TLSCert: kingpin.Flag("tlscert", "Path to the TLS certificate file").Default(defaultTLSCertPath).String(), - TLSKey: kingpin.Flag("tlskey", "Path to the TLS key").Default(defaultTLSKeyPath).String(), + Endpoint: kingpin.Flag("host", "Dockerd endpoint").Short('H').String(), + Logo: kingpin.Flag("logo", "URL for the logo displayed in the UI").String(), + Labels: pairs(kingpin.Flag("hide-label", "Hide containers with a specific label in the UI").Short('l')), + Addr: kingpin.Flag("bind", "Address and port to serve Portainer").Default(defaultBindAddress).Short('p').String(), + Assets: kingpin.Flag("assets", "Path to the assets").Default(defaultAssetsDirectory).Short('a').String(), + Data: kingpin.Flag("data", "Path to the folder where the data is stored").Default(defaultDataDirectory).Short('d').String(), + Templates: kingpin.Flag("templates", "URL to the templates (apps) definitions").Default(defaultTemplatesURL).Short('t').String(), + NoAuth: kingpin.Flag("no-auth", "Disable authentication").Default(defaultNoAuth).Bool(), + NoAnalytics: kingpin.Flag("no-analytics", "Disable Analytics in app").Default(defaultNoAuth).Bool(), + TLSVerify: kingpin.Flag("tlsverify", "TLS support").Default(defaultTLSVerify).Bool(), + TLSCacert: kingpin.Flag("tlscacert", "Path to the CA").Default(defaultTLSCACertPath).String(), + TLSCert: kingpin.Flag("tlscert", "Path to the TLS certificate file").Default(defaultTLSCertPath).String(), + TLSKey: kingpin.Flag("tlskey", "Path to the TLS key").Default(defaultTLSKeyPath).String(), } kingpin.Parse() diff --git a/api/cli/defaults.go b/api/cli/defaults.go index 57c755ea0..7d281575f 100644 --- a/api/cli/defaults.go +++ b/api/cli/defaults.go @@ -8,6 +8,7 @@ const ( defaultAssetsDirectory = "." defaultTemplatesURL = "https://raw.githubusercontent.com/portainer/templates/master/templates.json" defaultNoAuth = "false" + defaultNoAnalytics = "false" defaultTLSVerify = "false" defaultTLSCACertPath = "/certs/ca.pem" defaultTLSCertPath = "/certs/cert.pem" diff --git a/api/cli/defaults_windows.go b/api/cli/defaults_windows.go index 6ffc1f331..f8408dcdc 100644 --- a/api/cli/defaults_windows.go +++ b/api/cli/defaults_windows.go @@ -6,6 +6,7 @@ const ( defaultAssetsDirectory = "." defaultTemplatesURL = "https://raw.githubusercontent.com/portainer/templates/master/templates.json" defaultNoAuth = "false" + defaultNoAnalytics = "false" defaultTLSVerify = "false" defaultTLSCACertPath = "C:\\certs\\ca.pem" defaultTLSCertPath = "C:\\certs\\cert.pem" diff --git a/api/cmd/portainer/main.go b/api/cmd/portainer/main.go index 4e12d2091..13d0342c2 100644 --- a/api/cmd/portainer/main.go +++ b/api/cmd/portainer/main.go @@ -28,6 +28,7 @@ func main() { HiddenLabels: *flags.Labels, Logo: *flags.Logo, Authentication: !*flags.NoAuth, + Analytics: !*flags.NoAnalytics, } fileService, err := file.NewService(*flags.Data, "") diff --git a/api/portainer.go b/api/portainer.go index bc5af38ac..fc3cb1df2 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -13,18 +13,19 @@ type ( // CLIFlags represents the available flags on the CLI. CLIFlags struct { - Addr *string - Assets *string - Data *string - Endpoint *string - Labels *[]Pair - Logo *string - Templates *string - NoAuth *bool - TLSVerify *bool - TLSCacert *string - TLSCert *string - TLSKey *string + Addr *string + Assets *string + Data *string + Endpoint *string + Labels *[]Pair + Logo *string + Templates *string + NoAuth *bool + NoAnalytics *bool + TLSVerify *bool + TLSCacert *string + TLSCert *string + TLSKey *string } // Settings represents Portainer settings. @@ -32,6 +33,7 @@ type ( HiddenLabels []Pair `json:"hiddenLabels"` Logo string `json:"logo"` Authentication bool `json:"authentication"` + Analytics bool `json:"analytics"` } // User represent a user account. diff --git a/app/app.js b/app/app.js index a35c3daf0..3c31d9274 100644 --- a/app/app.js +++ b/app/app.js @@ -66,6 +66,7 @@ angular.module('portainer', [ $httpProvider.interceptors.push('jwtInterceptor'); AnalyticsProvider.setAccount('@@CONFIG_GA_ID'); + AnalyticsProvider.startOffline(true); $urlRouterProvider.otherwise('/auth'); @@ -497,15 +498,19 @@ angular.module('portainer', [ $state.go('auth', {error: 'Your session has expired'}); }); } + if (state.application.analytics) { + Analytics.offline(false); + Analytics.registerScriptTags(); + Analytics.registerTrackers(); + $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { + Analytics.trackPage(toState.url); + Analytics.pageView(); + }); + } }, function error(err) { Messages.error("Failure", err, 'Unable to retrieve application settings'); }); - $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { - Analytics.trackPage(toState.url); - Analytics.pageView(); - }); - $rootScope.$state = $state; }]) // This is your docker url that the api will use to make requests diff --git a/app/services/stateManager.js b/app/services/stateManager.js index ee71fee4c..8f4e41b77 100644 --- a/app/services/stateManager.js +++ b/app/services/stateManager.js @@ -24,6 +24,7 @@ angular.module('portainer.services') } else { Config.$promise.then(function success(data) { state.application.authentication = data.authentication; + state.application.analytics = data.analytics; state.application.logo = data.logo; LocalStorage.storeApplicationState(state.application); state.loading = false; diff --git a/gruntfile.js b/gruntfile.js index 8e1ed96ed..b053ca3ae 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -407,28 +407,28 @@ module.exports = function (grunt) { command: [ 'docker stop portainer', 'docker rm portainer', - 'docker run --privileged -d -p 9000:9000 -v /tmp/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer' + 'docker run --privileged -d -p 9000:9000 -v /tmp/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer --no-analytics' ].join(';') }, runSwarm: { command: [ 'docker stop portainer', 'docker rm portainer', - 'docker run -d -p 9000:9000 --name portainer portainer -H tcp://10.0.7.10:2375' + 'docker run -d -p 9000:9000 --name portainer portainer -H tcp://10.0.7.10:2375 --no-analytics' ].join(';') }, runSwarmLocal: { command: [ 'docker stop portainer', 'docker rm portainer', - 'docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer' + 'docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer --no-analytics' ].join(';') }, runSsl: { command: [ 'docker stop portainer', 'docker rm portainer', - 'docker run -d -p 9000:9000 -v /tmp/portainer:/data -v /tmp/docker-ssl:/certs --name portainer portainer -H tcp://10.0.7.10:2376 --tlsverify' + 'docker run -d -p 9000:9000 -v /tmp/portainer:/data -v /tmp/docker-ssl:/certs --name portainer portainer -H tcp://10.0.7.10:2376 --tlsverify --no-analytics' ].join(';') }, cleanImages: {