1""" 2raven.scripts.runner 3~~~~~~~~~~~~~~~~~~~~ 4 5:copyright: (c) 2012 by the Sentry Team, see AUTHORS for more details. 6:license: BSD, see LICENSE for more details. 7""" 8 9from __future__ import absolute_import 10from __future__ import print_function 11 12import logging 13import os 14import sys 15import time 16 17from optparse import OptionParser 18 19from raven import Client, get_version 20from raven.utils.json import json 21 22 23def store_json(option, opt_str, value, parser): 24 try: 25 value = json.loads(value) 26 except ValueError: 27 print("Invalid JSON was used for option %s. Received: %s" % (opt_str, value)) 28 sys.exit(1) 29 setattr(parser.values, option.dest, value) 30 31 32def get_loadavg(): 33 if hasattr(os, 'getloadavg'): 34 return os.getloadavg() 35 return None 36 37 38def get_uid(): 39 try: 40 import pwd 41 except ImportError: 42 return None 43 try: 44 return pwd.getpwuid(os.geteuid())[0] 45 except KeyError: # Sometimes fails in containers 46 return None 47 48 49def send_test_message(client, options): 50 sys.stdout.write("Client configuration:\n") 51 for k in ('base_url', 'project', 'public_key', 'secret_key'): 52 sys.stdout.write(' %-15s: %s\n' % (k, getattr(client.remote, k))) 53 sys.stdout.write('\n') 54 55 remote_config = client.remote 56 if not remote_config.is_active(): 57 sys.stdout.write("Error: DSN configuration is not valid!\n") 58 sys.exit(1) 59 60 if not client.is_enabled(): 61 sys.stdout.write('Error: Client reports as being disabled!\n') 62 sys.exit(1) 63 64 data = options.get('data', { 65 'culprit': 'raven.scripts.runner', 66 'logger': 'raven.test', 67 'request': { 68 'method': 'GET', 69 'url': 'http://example.com', 70 } 71 }) 72 73 sys.stdout.write('Sending a test message... ') 74 sys.stdout.flush() 75 76 ident = client.captureMessage( 77 message='This is a test message generated using ``raven test``', 78 data=data, 79 level=logging.INFO, 80 stack=True, 81 tags=options.get('tags', {}), 82 extra={ 83 'user': get_uid(), 84 'loadavg': get_loadavg(), 85 }, 86 ) 87 88 sys.stdout.write('Event ID was %r\n' % (ident,)) 89 90 91def main(): 92 root = logging.getLogger('sentry.errors') 93 root.setLevel(logging.DEBUG) 94 # if len(root.handlers) == 0: 95 # root.addHandler(logging.StreamHandler()) 96 97 parser = OptionParser(version=get_version()) 98 parser.add_option("--data", action="callback", callback=store_json, 99 type="string", nargs=1, dest="data") 100 parser.add_option("--tags", action="callback", callback=store_json, 101 type="string", nargs=1, dest="tags") 102 (opts, args) = parser.parse_args() 103 104 dsn = ' '.join(args[1:]) or os.environ.get('SENTRY_DSN') 105 if not dsn: 106 print("Error: No configuration detected!") 107 print("You must either pass a DSN to the command, or set the SENTRY_DSN environment variable.") 108 sys.exit(1) 109 110 print("Using DSN configuration:") 111 print(" ", dsn) 112 print() 113 114 client = Client(dsn, include_paths=['raven']) 115 116 send_test_message(client, opts.__dict__) 117 118 # TODO(dcramer): correctly support async models 119 time.sleep(3) 120 if client.state.did_fail(): 121 sys.stdout.write('error!\n') 122 sys.exit(1) 123 124 sys.stdout.write('success!\n') 125