-
Notifications
You must be signed in to change notification settings - Fork 0
/
commands.py
101 lines (81 loc) · 3.53 KB
/
commands.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# The contents of this file are subject to the Common Public Attribution
# License Version 1.0. (the "License"); you may not use this file except in
# compliance with the License. You may obtain a copy of the License at
# http://code.reddit.com/LICENSE. The License is based on the Mozilla Public
# License Version 1.1, but Sections 14 and 15 have been added to cover use of
# software over a computer network and provide for limited attribution for the
# Original Developer. In addition, Exhibit A has been modified to be consistent
# with Exhibit B.
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
# the specific language governing rights and limitations under the License.
#
# The Original Code is reddit.
#
# The Original Developer is the Initial Developer. The Initial Developer of
# the Original Code is reddit Inc.
#
# All portions of the code written by reddit are Copyright (c) 2006-2015 reddit
# Inc. All Rights Reserved.
###############################################################################
import os, sys
import paste.fixture
from paste.script import command
from paste.deploy import loadapp
from r2.lib.log import RavenErrorReporter
class RunCommand(command.Command):
max_args = 2
min_args = 1
usage = "CONFIGFILE CMDFILE.py"
summary = "Executed CMDFILE with pylons support"
group_name = "Reddit"
parser = command.Command.standard_parser(verbose=True)
parser.add_option('-c', '--command',
dest='command',
help="execute command in module")
parser.add_option("", "--proctitle",
dest="proctitle",
help="set the title seen by ps and top")
def command(self):
try:
if self.options.proctitle:
import setproctitle
setproctitle.setproctitle("paster " + self.options.proctitle)
except ImportError:
pass
config_file = self.args[0]
config_name = 'config:%s' % config_file
report_to_sentry = "REDDIT_ERRORS_TO_SENTRY" in os.environ
here_dir = os.getcwd()
# Load locals and populate with objects for use in shell
sys.path.insert(0, here_dir)
# Load the wsgi app first so that everything is initialized right
global_conf = {
'running_as_script': "true",
}
wsgiapp = loadapp(
config_name, relative_to=here_dir, global_conf=global_conf)
test_app = paste.fixture.TestApp(wsgiapp)
# Query the test app to setup the environment
tresponse = test_app.get('/_test_vars')
request_id = int(tresponse.body)
# Disable restoration during test_app requests
test_app.pre_request_hook = lambda self: \
paste.registry.restorer.restoration_end()
test_app.post_request_hook = lambda self: \
paste.registry.restorer.restoration_begin(request_id)
# Restore the state of the Pylons special objects
# (StackedObjectProxies)
paste.registry.restorer.restoration_begin(request_id)
loaded_namespace = {}
try:
if self.args[1:]:
execfile(self.args[1], loaded_namespace)
if self.options.command:
exec self.options.command in loaded_namespace
except Exception:
if report_to_sentry:
exc_info = sys.exc_info()
RavenErrorReporter.capture_exception(exc_info=exc_info)
raise