github.com/spline-fu/mattermost-server@v4.10.10+incompatible/app/diagnostics.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package app 5 6 import ( 7 "encoding/json" 8 "runtime" 9 "sync/atomic" 10 11 "github.com/mattermost/mattermost-server/mlog" 12 "github.com/mattermost/mattermost-server/model" 13 "github.com/segmentio/analytics-go" 14 ) 15 16 const ( 17 SEGMENT_KEY = "fwb7VPbFeQ7SKp3wHm1RzFUuXZudqVok" 18 19 TRACK_CONFIG_SERVICE = "config_service" 20 TRACK_CONFIG_TEAM = "config_team" 21 TRACK_CONFIG_CLIENT_REQ = "config_client_requirements" 22 TRACK_CONFIG_SQL = "config_sql" 23 TRACK_CONFIG_LOG = "config_log" 24 TRACK_CONFIG_FILE = "config_file" 25 TRACK_CONFIG_RATE = "config_rate" 26 TRACK_CONFIG_EMAIL = "config_email" 27 TRACK_CONFIG_PRIVACY = "config_privacy" 28 TRACK_CONFIG_THEME = "config_theme" 29 TRACK_CONFIG_OAUTH = "config_oauth" 30 TRACK_CONFIG_LDAP = "config_ldap" 31 TRACK_CONFIG_COMPLIANCE = "config_compliance" 32 TRACK_CONFIG_LOCALIZATION = "config_localization" 33 TRACK_CONFIG_SAML = "config_saml" 34 TRACK_CONFIG_PASSWORD = "config_password" 35 TRACK_CONFIG_CLUSTER = "config_cluster" 36 TRACK_CONFIG_METRICS = "config_metrics" 37 TRACK_CONFIG_WEBRTC = "config_webrtc" 38 TRACK_CONFIG_SUPPORT = "config_support" 39 TRACK_CONFIG_NATIVEAPP = "config_nativeapp" 40 TRACK_CONFIG_ANALYTICS = "config_analytics" 41 TRACK_CONFIG_ANNOUNCEMENT = "config_announcement" 42 TRACK_CONFIG_ELASTICSEARCH = "config_elasticsearch" 43 TRACK_CONFIG_PLUGIN = "config_plugin" 44 TRACK_CONFIG_DATA_RETENTION = "config_data_retention" 45 TRACK_CONFIG_MESSAGE_EXPORT = "config_message_export" 46 TRACK_CONFIG_DISPLAY = "config_display" 47 TRACK_CONFIG_TIMEZONE = "config_timezone" 48 49 TRACK_ACTIVITY = "activity" 50 TRACK_LICENSE = "license" 51 TRACK_SERVER = "server" 52 TRACK_PLUGINS = "plugins" 53 ) 54 55 var client *analytics.Client 56 57 func (a *App) SendDailyDiagnostics() { 58 if *a.Config().LogSettings.EnableDiagnostics && a.IsLeader() { 59 a.initDiagnostics("") 60 a.trackActivity() 61 a.trackConfig() 62 a.trackLicense() 63 a.trackPlugins() 64 a.trackServer() 65 } 66 } 67 68 func (a *App) initDiagnostics(endpoint string) { 69 if client == nil { 70 client = analytics.New(SEGMENT_KEY) 71 client.Logger = a.Log.StdLog(mlog.String("source", "segment")) 72 // For testing 73 if endpoint != "" { 74 client.Endpoint = endpoint 75 client.Verbose = true 76 client.Size = 1 77 } 78 client.Identify(&analytics.Identify{ 79 UserId: a.DiagnosticId(), 80 }) 81 } 82 } 83 84 func (a *App) SendDiagnostic(event string, properties map[string]interface{}) { 85 client.Track(&analytics.Track{ 86 Event: event, 87 UserId: a.DiagnosticId(), 88 Properties: properties, 89 }) 90 } 91 92 func isDefault(setting interface{}, defaultValue interface{}) bool { 93 return setting == defaultValue 94 } 95 96 func pluginSetting(pluginSettings *model.PluginSettings, plugin, key string, defaultValue interface{}) interface{} { 97 settings, ok := pluginSettings.Plugins[plugin] 98 if !ok { 99 return defaultValue 100 } 101 var m map[string]interface{} 102 if b, err := json.Marshal(settings); err != nil { 103 return defaultValue 104 } else { 105 json.Unmarshal(b, &m) 106 } 107 if value, ok := m[key]; ok { 108 return value 109 } 110 return defaultValue 111 } 112 113 func pluginActivated(pluginStates map[string]*model.PluginState, pluginId string) bool { 114 state, ok := pluginStates[pluginId] 115 if !ok { 116 return false 117 } 118 return state.Enable 119 } 120 121 func (a *App) trackActivity() { 122 var userCount int64 123 var activeUserCount int64 124 var inactiveUserCount int64 125 var teamCount int64 126 var publicChannelCount int64 127 var privateChannelCount int64 128 var directChannelCount int64 129 var deletedPublicChannelCount int64 130 var deletedPrivateChannelCount int64 131 var postsCount int64 132 133 if ucr := <-a.Srv.Store.User().GetTotalUsersCount(); ucr.Err == nil { 134 userCount = ucr.Data.(int64) 135 } 136 137 if ucr := <-a.Srv.Store.Status().GetTotalActiveUsersCount(); ucr.Err == nil { 138 activeUserCount = ucr.Data.(int64) 139 } 140 141 if iucr := <-a.Srv.Store.User().AnalyticsGetInactiveUsersCount(); iucr.Err == nil { 142 inactiveUserCount = iucr.Data.(int64) 143 } 144 145 if tcr := <-a.Srv.Store.Team().AnalyticsTeamCount(); tcr.Err == nil { 146 teamCount = tcr.Data.(int64) 147 } 148 149 if ucc := <-a.Srv.Store.Channel().AnalyticsTypeCount("", "O"); ucc.Err == nil { 150 publicChannelCount = ucc.Data.(int64) 151 } 152 153 if pcc := <-a.Srv.Store.Channel().AnalyticsTypeCount("", "P"); pcc.Err == nil { 154 privateChannelCount = pcc.Data.(int64) 155 } 156 157 if dcc := <-a.Srv.Store.Channel().AnalyticsTypeCount("", "D"); dcc.Err == nil { 158 directChannelCount = dcc.Data.(int64) 159 } 160 161 if duccr := <-a.Srv.Store.Channel().AnalyticsDeletedTypeCount("", "O"); duccr.Err == nil { 162 deletedPublicChannelCount = duccr.Data.(int64) 163 } 164 165 if dpccr := <-a.Srv.Store.Channel().AnalyticsDeletedTypeCount("", "P"); dpccr.Err == nil { 166 deletedPrivateChannelCount = dpccr.Data.(int64) 167 } 168 169 if pcr := <-a.Srv.Store.Post().AnalyticsPostCount("", false, false); pcr.Err == nil { 170 postsCount = pcr.Data.(int64) 171 } 172 173 a.SendDiagnostic(TRACK_ACTIVITY, map[string]interface{}{ 174 "registered_users": userCount, 175 "active_users": activeUserCount, 176 "registered_deactivated_users": inactiveUserCount, 177 "teams": teamCount, 178 "public_channels": publicChannelCount, 179 "private_channels": privateChannelCount, 180 "direct_message_channels": directChannelCount, 181 "public_channels_deleted": deletedPublicChannelCount, 182 "private_channels_deleted": deletedPrivateChannelCount, 183 "posts": postsCount, 184 "used_apiv3": atomic.LoadInt32(model.UsedApiV3) == 1, 185 }) 186 187 atomic.StoreInt32(model.UsedApiV3, 0) 188 } 189 190 func (a *App) trackConfig() { 191 cfg := a.Config() 192 a.SendDiagnostic(TRACK_CONFIG_SERVICE, map[string]interface{}{ 193 "web_server_mode": *cfg.ServiceSettings.WebserverMode, 194 "enable_security_fix_alert": *cfg.ServiceSettings.EnableSecurityFixAlert, 195 "enable_insecure_outgoing_connections": *cfg.ServiceSettings.EnableInsecureOutgoingConnections, 196 "enable_incoming_webhooks": cfg.ServiceSettings.EnableIncomingWebhooks, 197 "enable_outgoing_webhooks": cfg.ServiceSettings.EnableOutgoingWebhooks, 198 "enable_commands": *cfg.ServiceSettings.EnableCommands, 199 "enable_only_admin_integrations": *cfg.ServiceSettings.EnableOnlyAdminIntegrations, 200 "enable_post_username_override": cfg.ServiceSettings.EnablePostUsernameOverride, 201 "enable_post_icon_override": cfg.ServiceSettings.EnablePostIconOverride, 202 "enable_apiv3": *cfg.ServiceSettings.EnableAPIv3, 203 "enable_user_access_tokens": *cfg.ServiceSettings.EnableUserAccessTokens, 204 "enable_custom_emoji": *cfg.ServiceSettings.EnableCustomEmoji, 205 "enable_emoji_picker": *cfg.ServiceSettings.EnableEmojiPicker, 206 "experimental_enable_authentication_transfer": *cfg.ServiceSettings.ExperimentalEnableAuthenticationTransfer, 207 "restrict_custom_emoji_creation": *cfg.ServiceSettings.RestrictCustomEmojiCreation, 208 "enable_testing": cfg.ServiceSettings.EnableTesting, 209 "enable_developer": *cfg.ServiceSettings.EnableDeveloper, 210 "enable_multifactor_authentication": *cfg.ServiceSettings.EnableMultifactorAuthentication, 211 "enforce_multifactor_authentication": *cfg.ServiceSettings.EnforceMultifactorAuthentication, 212 "enable_oauth_service_provider": cfg.ServiceSettings.EnableOAuthServiceProvider, 213 "connection_security": *cfg.ServiceSettings.ConnectionSecurity, 214 "uses_letsencrypt": *cfg.ServiceSettings.UseLetsEncrypt, 215 "forward_80_to_443": *cfg.ServiceSettings.Forward80To443, 216 "maximum_login_attempts": *cfg.ServiceSettings.MaximumLoginAttempts, 217 "session_length_web_in_days": *cfg.ServiceSettings.SessionLengthWebInDays, 218 "session_length_mobile_in_days": *cfg.ServiceSettings.SessionLengthMobileInDays, 219 "session_length_sso_in_days": *cfg.ServiceSettings.SessionLengthSSOInDays, 220 "session_cache_in_minutes": *cfg.ServiceSettings.SessionCacheInMinutes, 221 "session_idle_timeout_in_minutes": *cfg.ServiceSettings.SessionIdleTimeoutInMinutes, 222 "isdefault_site_url": isDefault(*cfg.ServiceSettings.SiteURL, model.SERVICE_SETTINGS_DEFAULT_SITE_URL), 223 "isdefault_tls_cert_file": isDefault(*cfg.ServiceSettings.TLSCertFile, model.SERVICE_SETTINGS_DEFAULT_TLS_CERT_FILE), 224 "isdefault_tls_key_file": isDefault(*cfg.ServiceSettings.TLSKeyFile, model.SERVICE_SETTINGS_DEFAULT_TLS_KEY_FILE), 225 "isdefault_read_timeout": isDefault(*cfg.ServiceSettings.ReadTimeout, model.SERVICE_SETTINGS_DEFAULT_READ_TIMEOUT), 226 "isdefault_write_timeout": isDefault(*cfg.ServiceSettings.WriteTimeout, model.SERVICE_SETTINGS_DEFAULT_WRITE_TIMEOUT), 227 "isdefault_google_developer_key": isDefault(cfg.ServiceSettings.GoogleDeveloperKey, ""), 228 "isdefault_allow_cors_from": isDefault(*cfg.ServiceSettings.AllowCorsFrom, model.SERVICE_SETTINGS_DEFAULT_ALLOW_CORS_FROM), 229 "isdefault_allowed_untrusted_internal_connections": isDefault(*cfg.ServiceSettings.AllowedUntrustedInternalConnections, ""), 230 "restrict_post_delete": *cfg.ServiceSettings.RestrictPostDelete, 231 "allow_edit_post": *cfg.ServiceSettings.AllowEditPost, 232 "post_edit_time_limit": *cfg.ServiceSettings.PostEditTimeLimit, 233 "enable_user_typing_messages": *cfg.ServiceSettings.EnableUserTypingMessages, 234 "enable_channel_viewed_messages": *cfg.ServiceSettings.EnableChannelViewedMessages, 235 "time_between_user_typing_updates_milliseconds": *cfg.ServiceSettings.TimeBetweenUserTypingUpdatesMilliseconds, 236 "cluster_log_timeout_milliseconds": *cfg.ServiceSettings.ClusterLogTimeoutMilliseconds, 237 "enable_post_search": *cfg.ServiceSettings.EnablePostSearch, 238 "enable_user_statuses": *cfg.ServiceSettings.EnableUserStatuses, 239 "close_unused_direct_messages": *cfg.ServiceSettings.CloseUnusedDirectMessages, 240 "enable_preview_features": *cfg.ServiceSettings.EnablePreviewFeatures, 241 "enable_tutorial": *cfg.ServiceSettings.EnableTutorial, 242 "experimental_enable_default_channel_leave_join_messages": *cfg.ServiceSettings.ExperimentalEnableDefaultChannelLeaveJoinMessages, 243 "experimental_group_unread_channels": *cfg.ServiceSettings.ExperimentalGroupUnreadChannels, 244 "isdefault_image_proxy_type": isDefault(*cfg.ServiceSettings.ImageProxyType, ""), 245 "isdefault_image_proxy_url": isDefault(*cfg.ServiceSettings.ImageProxyURL, ""), 246 "isdefault_image_proxy_options": isDefault(*cfg.ServiceSettings.ImageProxyOptions, ""), 247 "websocket_url": isDefault(*cfg.ServiceSettings.WebsocketURL, ""), 248 "allow_cookies_for_subdomains": *cfg.ServiceSettings.AllowCookiesForSubdomains, 249 }) 250 251 a.SendDiagnostic(TRACK_CONFIG_TEAM, map[string]interface{}{ 252 "enable_user_creation": cfg.TeamSettings.EnableUserCreation, 253 "enable_team_creation": *cfg.TeamSettings.EnableTeamCreation, 254 "restrict_team_invite": *cfg.TeamSettings.RestrictTeamInvite, 255 "restrict_public_channel_creation": *cfg.TeamSettings.RestrictPublicChannelCreation, 256 "restrict_private_channel_creation": *cfg.TeamSettings.RestrictPrivateChannelCreation, 257 "restrict_public_channel_management": *cfg.TeamSettings.RestrictPublicChannelManagement, 258 "restrict_private_channel_management": *cfg.TeamSettings.RestrictPrivateChannelManagement, 259 "restrict_public_channel_deletion": *cfg.TeamSettings.RestrictPublicChannelDeletion, 260 "restrict_private_channel_deletion": *cfg.TeamSettings.RestrictPrivateChannelDeletion, 261 "enable_open_server": *cfg.TeamSettings.EnableOpenServer, 262 "enable_custom_brand": *cfg.TeamSettings.EnableCustomBrand, 263 "restrict_direct_message": *cfg.TeamSettings.RestrictDirectMessage, 264 "max_notifications_per_channel": *cfg.TeamSettings.MaxNotificationsPerChannel, 265 "enable_confirm_notifications_to_channel": *cfg.TeamSettings.EnableConfirmNotificationsToChannel, 266 "max_users_per_team": *cfg.TeamSettings.MaxUsersPerTeam, 267 "max_channels_per_team": *cfg.TeamSettings.MaxChannelsPerTeam, 268 "teammate_name_display": *cfg.TeamSettings.TeammateNameDisplay, 269 "isdefault_site_name": isDefault(cfg.TeamSettings.SiteName, "Mattermost"), 270 "isdefault_custom_brand_text": isDefault(*cfg.TeamSettings.CustomBrandText, model.TEAM_SETTINGS_DEFAULT_CUSTOM_BRAND_TEXT), 271 "isdefault_custom_description_text": isDefault(*cfg.TeamSettings.CustomDescriptionText, model.TEAM_SETTINGS_DEFAULT_CUSTOM_DESCRIPTION_TEXT), 272 "isdefault_user_status_away_timeout": isDefault(*cfg.TeamSettings.UserStatusAwayTimeout, model.TEAM_SETTINGS_DEFAULT_USER_STATUS_AWAY_TIMEOUT), 273 "restrict_private_channel_manage_members": *cfg.TeamSettings.RestrictPrivateChannelManageMembers, 274 "enable_X_to_leave_channels_from_LHS": *cfg.TeamSettings.EnableXToLeaveChannelsFromLHS, 275 "experimental_enable_automatic_replies": *cfg.TeamSettings.ExperimentalEnableAutomaticReplies, 276 "experimental_town_square_is_read_only": *cfg.TeamSettings.ExperimentalTownSquareIsReadOnly, 277 "experimental_primary_team": isDefault(*cfg.TeamSettings.ExperimentalPrimaryTeam, ""), 278 }) 279 280 a.SendDiagnostic(TRACK_CONFIG_CLIENT_REQ, map[string]interface{}{ 281 "android_latest_version": cfg.ClientRequirements.AndroidLatestVersion, 282 "android_min_version": cfg.ClientRequirements.AndroidMinVersion, 283 "desktop_latest_version": cfg.ClientRequirements.DesktopLatestVersion, 284 "desktop_min_version": cfg.ClientRequirements.DesktopMinVersion, 285 "ios_latest_version": cfg.ClientRequirements.IosLatestVersion, 286 "ios_min_version": cfg.ClientRequirements.IosMinVersion, 287 }) 288 289 a.SendDiagnostic(TRACK_CONFIG_SQL, map[string]interface{}{ 290 "driver_name": *cfg.SqlSettings.DriverName, 291 "trace": cfg.SqlSettings.Trace, 292 "max_idle_conns": *cfg.SqlSettings.MaxIdleConns, 293 "max_open_conns": *cfg.SqlSettings.MaxOpenConns, 294 "data_source_replicas": len(cfg.SqlSettings.DataSourceReplicas), 295 "data_source_search_replicas": len(cfg.SqlSettings.DataSourceSearchReplicas), 296 "query_timeout": *cfg.SqlSettings.QueryTimeout, 297 }) 298 299 a.SendDiagnostic(TRACK_CONFIG_LOG, map[string]interface{}{ 300 "enable_console": cfg.LogSettings.EnableConsole, 301 "console_level": cfg.LogSettings.ConsoleLevel, 302 "console_json": *cfg.LogSettings.ConsoleJson, 303 "enable_file": cfg.LogSettings.EnableFile, 304 "file_level": cfg.LogSettings.FileLevel, 305 "file_json": cfg.LogSettings.FileJson, 306 "enable_webhook_debugging": cfg.LogSettings.EnableWebhookDebugging, 307 "isdefault_file_location": isDefault(cfg.LogSettings.FileLocation, ""), 308 }) 309 310 a.SendDiagnostic(TRACK_CONFIG_PASSWORD, map[string]interface{}{ 311 "minimum_length": *cfg.PasswordSettings.MinimumLength, 312 "lowercase": *cfg.PasswordSettings.Lowercase, 313 "number": *cfg.PasswordSettings.Number, 314 "uppercase": *cfg.PasswordSettings.Uppercase, 315 "symbol": *cfg.PasswordSettings.Symbol, 316 }) 317 318 a.SendDiagnostic(TRACK_CONFIG_FILE, map[string]interface{}{ 319 "enable_public_links": cfg.FileSettings.EnablePublicLink, 320 "driver_name": *cfg.FileSettings.DriverName, 321 "amazon_s3_ssl": *cfg.FileSettings.AmazonS3SSL, 322 "amazon_s3_sse": *cfg.FileSettings.AmazonS3SSE, 323 "amazon_s3_signv2": *cfg.FileSettings.AmazonS3SignV2, 324 "amazon_s3_trace": *cfg.FileSettings.AmazonS3Trace, 325 "max_file_size": *cfg.FileSettings.MaxFileSize, 326 "enable_file_attachments": *cfg.FileSettings.EnableFileAttachments, 327 "enable_mobile_upload": *cfg.FileSettings.EnableMobileUpload, 328 "enable_mobile_download": *cfg.FileSettings.EnableMobileDownload, 329 }) 330 331 a.SendDiagnostic(TRACK_CONFIG_EMAIL, map[string]interface{}{ 332 "enable_sign_up_with_email": cfg.EmailSettings.EnableSignUpWithEmail, 333 "enable_sign_in_with_email": *cfg.EmailSettings.EnableSignInWithEmail, 334 "enable_sign_in_with_username": *cfg.EmailSettings.EnableSignInWithUsername, 335 "require_email_verification": cfg.EmailSettings.RequireEmailVerification, 336 "send_email_notifications": cfg.EmailSettings.SendEmailNotifications, 337 "use_channel_in_email_notifications": *cfg.EmailSettings.UseChannelInEmailNotifications, 338 "email_notification_contents_type": *cfg.EmailSettings.EmailNotificationContentsType, 339 "enable_smtp_auth": *cfg.EmailSettings.EnableSMTPAuth, 340 "connection_security": cfg.EmailSettings.ConnectionSecurity, 341 "send_push_notifications": *cfg.EmailSettings.SendPushNotifications, 342 "push_notification_contents": *cfg.EmailSettings.PushNotificationContents, 343 "enable_email_batching": *cfg.EmailSettings.EnableEmailBatching, 344 "email_batching_buffer_size": *cfg.EmailSettings.EmailBatchingBufferSize, 345 "email_batching_interval": *cfg.EmailSettings.EmailBatchingInterval, 346 "isdefault_feedback_name": isDefault(cfg.EmailSettings.FeedbackName, ""), 347 "isdefault_feedback_email": isDefault(cfg.EmailSettings.FeedbackEmail, ""), 348 "isdefault_feedback_organization": isDefault(*cfg.EmailSettings.FeedbackOrganization, model.EMAIL_SETTINGS_DEFAULT_FEEDBACK_ORGANIZATION), 349 "skip_server_certificate_verification": *cfg.EmailSettings.SkipServerCertificateVerification, 350 "isdefault_login_button_color": isDefault(*cfg.EmailSettings.LoginButtonColor, ""), 351 "isdefault_login_button_border_color": isDefault(*cfg.EmailSettings.LoginButtonBorderColor, ""), 352 "isdefault_login_button_text_color": isDefault(*cfg.EmailSettings.LoginButtonTextColor, ""), 353 }) 354 355 a.SendDiagnostic(TRACK_CONFIG_RATE, map[string]interface{}{ 356 "enable_rate_limiter": *cfg.RateLimitSettings.Enable, 357 "vary_by_remote_address": *cfg.RateLimitSettings.VaryByRemoteAddr, 358 "vary_by_user": *cfg.RateLimitSettings.VaryByUser, 359 "per_sec": *cfg.RateLimitSettings.PerSec, 360 "max_burst": *cfg.RateLimitSettings.MaxBurst, 361 "memory_store_size": *cfg.RateLimitSettings.MemoryStoreSize, 362 "isdefault_vary_by_header": isDefault(cfg.RateLimitSettings.VaryByHeader, ""), 363 }) 364 365 a.SendDiagnostic(TRACK_CONFIG_PRIVACY, map[string]interface{}{ 366 "show_email_address": cfg.PrivacySettings.ShowEmailAddress, 367 "show_full_name": cfg.PrivacySettings.ShowFullName, 368 }) 369 370 a.SendDiagnostic(TRACK_CONFIG_THEME, map[string]interface{}{ 371 "enable_theme_selection": *cfg.ThemeSettings.EnableThemeSelection, 372 "isdefault_default_theme": isDefault(*cfg.ThemeSettings.DefaultTheme, model.TEAM_SETTINGS_DEFAULT_TEAM_TEXT), 373 "allow_custom_themes": *cfg.ThemeSettings.AllowCustomThemes, 374 "allowed_themes": len(cfg.ThemeSettings.AllowedThemes), 375 }) 376 377 a.SendDiagnostic(TRACK_CONFIG_OAUTH, map[string]interface{}{ 378 "enable_gitlab": cfg.GitLabSettings.Enable, 379 "enable_google": cfg.GoogleSettings.Enable, 380 "enable_office365": cfg.Office365Settings.Enable, 381 }) 382 383 a.SendDiagnostic(TRACK_CONFIG_SUPPORT, map[string]interface{}{ 384 "isdefault_terms_of_service_link": isDefault(*cfg.SupportSettings.TermsOfServiceLink, model.SUPPORT_SETTINGS_DEFAULT_TERMS_OF_SERVICE_LINK), 385 "isdefault_privacy_policy_link": isDefault(*cfg.SupportSettings.PrivacyPolicyLink, model.SUPPORT_SETTINGS_DEFAULT_PRIVACY_POLICY_LINK), 386 "isdefault_about_link": isDefault(*cfg.SupportSettings.AboutLink, model.SUPPORT_SETTINGS_DEFAULT_ABOUT_LINK), 387 "isdefault_help_link": isDefault(*cfg.SupportSettings.HelpLink, model.SUPPORT_SETTINGS_DEFAULT_HELP_LINK), 388 "isdefault_report_a_problem_link": isDefault(*cfg.SupportSettings.ReportAProblemLink, model.SUPPORT_SETTINGS_DEFAULT_REPORT_A_PROBLEM_LINK), 389 "isdefault_support_email": isDefault(*cfg.SupportSettings.SupportEmail, model.SUPPORT_SETTINGS_DEFAULT_SUPPORT_EMAIL), 390 }) 391 392 a.SendDiagnostic(TRACK_CONFIG_LDAP, map[string]interface{}{ 393 "enable": *cfg.LdapSettings.Enable, 394 "enable_sync": *cfg.LdapSettings.EnableSync, 395 "connection_security": *cfg.LdapSettings.ConnectionSecurity, 396 "skip_certificate_verification": *cfg.LdapSettings.SkipCertificateVerification, 397 "sync_interval_minutes": *cfg.LdapSettings.SyncIntervalMinutes, 398 "query_timeout": *cfg.LdapSettings.QueryTimeout, 399 "max_page_size": *cfg.LdapSettings.MaxPageSize, 400 "isdefault_first_name_attribute": isDefault(*cfg.LdapSettings.FirstNameAttribute, model.LDAP_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE), 401 "isdefault_last_name_attribute": isDefault(*cfg.LdapSettings.LastNameAttribute, model.LDAP_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE), 402 "isdefault_email_attribute": isDefault(*cfg.LdapSettings.EmailAttribute, model.LDAP_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE), 403 "isdefault_username_attribute": isDefault(*cfg.LdapSettings.UsernameAttribute, model.LDAP_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE), 404 "isdefault_nickname_attribute": isDefault(*cfg.LdapSettings.NicknameAttribute, model.LDAP_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE), 405 "isdefault_id_attribute": isDefault(*cfg.LdapSettings.IdAttribute, model.LDAP_SETTINGS_DEFAULT_ID_ATTRIBUTE), 406 "isdefault_position_attribute": isDefault(*cfg.LdapSettings.PositionAttribute, model.LDAP_SETTINGS_DEFAULT_POSITION_ATTRIBUTE), 407 "isdefault_login_field_name": isDefault(*cfg.LdapSettings.LoginFieldName, model.LDAP_SETTINGS_DEFAULT_LOGIN_FIELD_NAME), 408 "isdefault_login_button_color": isDefault(*cfg.LdapSettings.LoginButtonColor, ""), 409 "isdefault_login_button_border_color": isDefault(*cfg.LdapSettings.LoginButtonBorderColor, ""), 410 "isdefault_login_button_text_color": isDefault(*cfg.LdapSettings.LoginButtonTextColor, ""), 411 }) 412 413 a.SendDiagnostic(TRACK_CONFIG_COMPLIANCE, map[string]interface{}{ 414 "enable": *cfg.ComplianceSettings.Enable, 415 "enable_daily": *cfg.ComplianceSettings.EnableDaily, 416 }) 417 418 a.SendDiagnostic(TRACK_CONFIG_LOCALIZATION, map[string]interface{}{ 419 "default_server_locale": *cfg.LocalizationSettings.DefaultServerLocale, 420 "default_client_locale": *cfg.LocalizationSettings.DefaultClientLocale, 421 "available_locales": *cfg.LocalizationSettings.AvailableLocales, 422 }) 423 424 a.SendDiagnostic(TRACK_CONFIG_SAML, map[string]interface{}{ 425 "enable": *cfg.SamlSettings.Enable, 426 "enable_sync_with_ldap": *cfg.SamlSettings.EnableSyncWithLdap, 427 "verify": *cfg.SamlSettings.Verify, 428 "encrypt": *cfg.SamlSettings.Encrypt, 429 "isdefault_scoping_idp_provider_id": isDefault(*cfg.SamlSettings.ScopingIDPProviderId, ""), 430 "isdefault_scoping_idp_name": isDefault(*cfg.SamlSettings.ScopingIDPName, ""), 431 "isdefault_first_name_attribute": isDefault(*cfg.SamlSettings.FirstNameAttribute, model.SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE), 432 "isdefault_last_name_attribute": isDefault(*cfg.SamlSettings.LastNameAttribute, model.SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE), 433 "isdefault_email_attribute": isDefault(*cfg.SamlSettings.EmailAttribute, model.SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE), 434 "isdefault_username_attribute": isDefault(*cfg.SamlSettings.UsernameAttribute, model.SAML_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE), 435 "isdefault_nickname_attribute": isDefault(*cfg.SamlSettings.NicknameAttribute, model.SAML_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE), 436 "isdefault_locale_attribute": isDefault(*cfg.SamlSettings.LocaleAttribute, model.SAML_SETTINGS_DEFAULT_LOCALE_ATTRIBUTE), 437 "isdefault_position_attribute": isDefault(*cfg.SamlSettings.PositionAttribute, model.SAML_SETTINGS_DEFAULT_POSITION_ATTRIBUTE), 438 "isdefault_login_button_text": isDefault(*cfg.SamlSettings.LoginButtonText, model.USER_AUTH_SERVICE_SAML_TEXT), 439 "isdefault_login_button_color": isDefault(*cfg.SamlSettings.LoginButtonColor, ""), 440 "isdefault_login_button_border_color": isDefault(*cfg.SamlSettings.LoginButtonBorderColor, ""), 441 "isdefault_login_button_text_color": isDefault(*cfg.SamlSettings.LoginButtonTextColor, ""), 442 }) 443 444 a.SendDiagnostic(TRACK_CONFIG_CLUSTER, map[string]interface{}{ 445 "enable": *cfg.ClusterSettings.Enable, 446 "use_ip_address": *cfg.ClusterSettings.UseIpAddress, 447 "use_experimental_gossip": *cfg.ClusterSettings.UseExperimentalGossip, 448 "read_only_config": *cfg.ClusterSettings.ReadOnlyConfig, 449 }) 450 451 a.SendDiagnostic(TRACK_CONFIG_METRICS, map[string]interface{}{ 452 "enable": *cfg.MetricsSettings.Enable, 453 "block_profile_rate": *cfg.MetricsSettings.BlockProfileRate, 454 }) 455 456 a.SendDiagnostic(TRACK_CONFIG_NATIVEAPP, map[string]interface{}{ 457 "isdefault_app_download_link": isDefault(*cfg.NativeAppSettings.AppDownloadLink, model.NATIVEAPP_SETTINGS_DEFAULT_APP_DOWNLOAD_LINK), 458 "isdefault_android_app_download_link": isDefault(*cfg.NativeAppSettings.AndroidAppDownloadLink, model.NATIVEAPP_SETTINGS_DEFAULT_ANDROID_APP_DOWNLOAD_LINK), 459 "isdefault_iosapp_download_link": isDefault(*cfg.NativeAppSettings.IosAppDownloadLink, model.NATIVEAPP_SETTINGS_DEFAULT_IOS_APP_DOWNLOAD_LINK), 460 }) 461 462 a.SendDiagnostic(TRACK_CONFIG_WEBRTC, map[string]interface{}{ 463 "enable": *cfg.WebrtcSettings.Enable, 464 "isdefault_stun_uri": isDefault(*cfg.WebrtcSettings.StunURI, model.WEBRTC_SETTINGS_DEFAULT_STUN_URI), 465 "isdefault_turn_uri": isDefault(*cfg.WebrtcSettings.TurnURI, model.WEBRTC_SETTINGS_DEFAULT_TURN_URI), 466 }) 467 468 a.SendDiagnostic(TRACK_CONFIG_ANALYTICS, map[string]interface{}{ 469 "isdefault_max_users_for_statistics": isDefault(*cfg.AnalyticsSettings.MaxUsersForStatistics, model.ANALYTICS_SETTINGS_DEFAULT_MAX_USERS_FOR_STATISTICS), 470 }) 471 472 a.SendDiagnostic(TRACK_CONFIG_ANNOUNCEMENT, map[string]interface{}{ 473 "enable_banner": *cfg.AnnouncementSettings.EnableBanner, 474 "isdefault_banner_color": isDefault(*cfg.AnnouncementSettings.BannerColor, model.ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_COLOR), 475 "isdefault_banner_text_color": isDefault(*cfg.AnnouncementSettings.BannerTextColor, model.ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_TEXT_COLOR), 476 "allow_banner_dismissal": *cfg.AnnouncementSettings.AllowBannerDismissal, 477 }) 478 479 a.SendDiagnostic(TRACK_CONFIG_ELASTICSEARCH, map[string]interface{}{ 480 "isdefault_connection_url": isDefault(*cfg.ElasticsearchSettings.ConnectionUrl, model.ELASTICSEARCH_SETTINGS_DEFAULT_CONNECTION_URL), 481 "isdefault_username": isDefault(*cfg.ElasticsearchSettings.Username, model.ELASTICSEARCH_SETTINGS_DEFAULT_USERNAME), 482 "isdefault_password": isDefault(*cfg.ElasticsearchSettings.Password, model.ELASTICSEARCH_SETTINGS_DEFAULT_PASSWORD), 483 "enable_indexing": *cfg.ElasticsearchSettings.EnableIndexing, 484 "enable_searching": *cfg.ElasticsearchSettings.EnableSearching, 485 "sniff": *cfg.ElasticsearchSettings.Sniff, 486 "post_index_replicas": *cfg.ElasticsearchSettings.PostIndexReplicas, 487 "post_index_shards": *cfg.ElasticsearchSettings.PostIndexShards, 488 "isdefault_index_prefix": isDefault(*cfg.ElasticsearchSettings.IndexPrefix, model.ELASTICSEARCH_SETTINGS_DEFAULT_INDEX_PREFIX), 489 "live_indexing_batch_size": *cfg.ElasticsearchSettings.LiveIndexingBatchSize, 490 "bulk_indexing_time_window_seconds": *cfg.ElasticsearchSettings.BulkIndexingTimeWindowSeconds, 491 "request_timeout_seconds": *cfg.ElasticsearchSettings.RequestTimeoutSeconds, 492 }) 493 494 a.SendDiagnostic(TRACK_CONFIG_PLUGIN, map[string]interface{}{ 495 "enable_jira": pluginSetting(&cfg.PluginSettings, "jira", "enabled", false), 496 "enable_zoom": pluginActivated(cfg.PluginSettings.PluginStates, "zoom"), 497 "enable": *cfg.PluginSettings.Enable, 498 "enable_uploads": *cfg.PluginSettings.EnableUploads, 499 }) 500 501 a.SendDiagnostic(TRACK_CONFIG_DATA_RETENTION, map[string]interface{}{ 502 "enable_message_deletion": *cfg.DataRetentionSettings.EnableMessageDeletion, 503 "enable_file_deletion": *cfg.DataRetentionSettings.EnableFileDeletion, 504 "message_retention_days": *cfg.DataRetentionSettings.MessageRetentionDays, 505 "file_retention_days": *cfg.DataRetentionSettings.FileRetentionDays, 506 "deletion_job_start_time": *cfg.DataRetentionSettings.DeletionJobStartTime, 507 }) 508 509 a.SendDiagnostic(TRACK_CONFIG_MESSAGE_EXPORT, map[string]interface{}{ 510 "enable_message_export": *cfg.MessageExportSettings.EnableExport, 511 "export_format": *cfg.MessageExportSettings.ExportFormat, 512 "daily_run_time": *cfg.MessageExportSettings.DailyRunTime, 513 "default_export_from_timestamp": *cfg.MessageExportSettings.ExportFromTimestamp, 514 "batch_size": *cfg.MessageExportSettings.BatchSize, 515 "global_relay_customer_type": *cfg.MessageExportSettings.GlobalRelaySettings.CustomerType, 516 "is_default_global_relay_smtp_username": isDefault(*cfg.MessageExportSettings.GlobalRelaySettings.SmtpUsername, ""), 517 "is_default_global_relay_smtp_password": isDefault(*cfg.MessageExportSettings.GlobalRelaySettings.SmtpPassword, ""), 518 "is_default_global_relay_email_address": isDefault(*cfg.MessageExportSettings.GlobalRelaySettings.EmailAddress, ""), 519 }) 520 521 a.SendDiagnostic(TRACK_CONFIG_DISPLAY, map[string]interface{}{ 522 "experimental_timezone": *cfg.DisplaySettings.ExperimentalTimezone, 523 }) 524 525 a.SendDiagnostic(TRACK_CONFIG_TIMEZONE, map[string]interface{}{ 526 "isdefault_supported_timezones_path": isDefault(*cfg.TimezoneSettings.SupportedTimezonesPath, model.TIMEZONE_SETTINGS_DEFAULT_SUPPORTED_TIMEZONES_PATH), 527 }) 528 } 529 530 func (a *App) trackLicense() { 531 if license := a.License(); license != nil { 532 data := map[string]interface{}{ 533 "customer_id": license.Customer.Id, 534 "license_id": license.Id, 535 "issued": license.IssuedAt, 536 "start": license.StartsAt, 537 "expire": license.ExpiresAt, 538 "users": *license.Features.Users, 539 } 540 541 features := license.Features.ToMap() 542 for featureName, featureValue := range features { 543 data["feature_"+featureName] = featureValue 544 } 545 546 a.SendDiagnostic(TRACK_LICENSE, data) 547 } 548 } 549 550 func (a *App) trackPlugins() { 551 if *a.Config().PluginSettings.Enable { 552 totalActiveCount := -1 // -1 to indicate disabled or error 553 webappActiveCount := 0 554 backendActiveCount := 0 555 totalInactiveCount := -1 // -1 to indicate disabled or error 556 webappInactiveCount := 0 557 backendInactiveCount := 0 558 settingsCount := 0 559 560 plugins, _ := a.GetPlugins() 561 562 if plugins != nil { 563 totalActiveCount = len(plugins.Active) 564 565 for _, plugin := range plugins.Active { 566 if plugin.Webapp != nil { 567 webappActiveCount += 1 568 } 569 570 if plugin.Backend != nil { 571 backendActiveCount += 1 572 } 573 574 if plugin.SettingsSchema != nil { 575 settingsCount += 1 576 } 577 } 578 579 totalInactiveCount = len(plugins.Inactive) 580 581 for _, plugin := range plugins.Inactive { 582 if plugin.Webapp != nil { 583 webappInactiveCount += 1 584 } 585 586 if plugin.Backend != nil { 587 backendInactiveCount += 1 588 } 589 590 if plugin.SettingsSchema != nil { 591 settingsCount += 1 592 } 593 } 594 } 595 596 a.SendDiagnostic(TRACK_PLUGINS, map[string]interface{}{ 597 "active_plugins": totalActiveCount, 598 "active_webapp_plugins": webappActiveCount, 599 "active_backend_plugins": backendActiveCount, 600 "inactive_plugins": totalInactiveCount, 601 "inactive_webapp_plugins": webappInactiveCount, 602 "inactive_backend_plugins": backendInactiveCount, 603 "plugins_with_settings": settingsCount, 604 }) 605 } 606 } 607 608 func (a *App) trackServer() { 609 data := map[string]interface{}{ 610 "edition": model.BuildEnterpriseReady, 611 "version": model.CurrentVersion, 612 "database_type": *a.Config().SqlSettings.DriverName, 613 "operating_system": runtime.GOOS, 614 } 615 616 if scr := <-a.Srv.Store.User().AnalyticsGetSystemAdminCount(); scr.Err == nil { 617 data["system_admins"] = scr.Data.(int64) 618 } 619 620 a.SendDiagnostic(TRACK_SERVER, data) 621 }