]> jfr.im git - irc/quakenet/qwebirc.git/blob - run.py
prohibit running as root
[irc/quakenet/qwebirc.git] / run.py
1 #!/usr/bin/env python
2 # this entire thing is a hack and badly needs reimplementing
3 import bin.compile
4 bin.compile.vcheck()
5
6 DEFAULT_PORT = 9090
7
8 from optparse import OptionParser
9 import sys, os, config
10
11 def run_twistd(args1=None, args2=None):
12 from twisted.scripts.twistd import run
13 args = [sys.argv[0]]
14 if args1 is not None:
15 args.extend(args1)
16 args.append("qwebirc")
17 if args2 is not None:
18 args.extend(args2)
19 sys.argv = args
20 run()
21
22 def help_reactors(*args):
23 run_twistd(["--help-reactors"])
24 sys.exit(1)
25
26 try:
27 from select import epoll
28 DEFAULT_REACTOR = "epoll"
29 except ImportError:
30 try:
31 from select import kqueue
32 DEFAULT_REACTOR = "kqueue"
33 except ImportError:
34 try:
35 from select import poll
36 DEFAULT_REACTOR = "poll"
37 except ImportError:
38 DEFAULT_REACTOR = "select"
39
40 parser = OptionParser()
41 parser.add_option("-n", "--no-daemon", help="Don't run in the background.", action="store_false", dest="daemonise", default=True)
42 parser.add_option("--help-reactors", help="Display a list of reactor names.", action="callback", callback=help_reactors)
43 parser.add_option("-b", "--debug", help="Run in the Python Debugger.", action="store_true", dest="debug", default=False)
44 parser.add_option("-t", "--tracebacks", help="Display tracebacks in error pages (this reveals a LOT of information, do NOT use in production!)", action="store_true", dest="tracebacks", default=False)
45 parser.add_option("-r", "--reactor", help="Which reactor to use (see --help-reactors for a list).", dest="reactor", default=DEFAULT_REACTOR)
46 parser.add_option("-p", "--port", help="Port to start the server on.", type="int", dest="port", default=DEFAULT_PORT)
47 parser.add_option("-i", "--ip", help="IP address to listen on.", dest="ip", default="0.0.0.0")
48 parser.add_option("-l", "--logfile", help="Path to twisted log file.", dest="logfile")
49 parser.add_option("-c", "--clf", help="Path to web CLF (Combined Log Format) log file.", dest="clogfile")
50 parser.add_option("-C", "--certificate", help="Path to SSL certificate.", dest="sslcertificate")
51 parser.add_option("-k", "--key", help="Path to SSL key.", dest="sslkey")
52 parser.add_option("-H", "--certificate-chain", help="Path to SSL certificate chain file.", dest="sslchain")
53 parser.add_option("-P", "--pidfile", help="Path to store PID file", dest="pidfile")
54 parser.add_option("-s", "--syslog", help="Log to syslog", action="store_true", dest="syslog", default=False)
55 parser.add_option("--profile", help="Run in profile mode, dumping results to this file", dest="profile")
56 parser.add_option("--profiler", help="Name of profiler to use", dest="profiler")
57 parser.add_option("--syslog-prefix", help="Syslog prefix", dest="syslog_prefix", default="qwebirc")
58
59 sargs = sys.argv[1:]
60 if "ARGS" in dir(config):
61 import shlex
62 sargs = shlex.split(config.ARGS) + sargs
63
64 (options, args) = parser.parse_args(args=sargs)
65
66 args1, args2 = [], []
67
68 if not options.daemonise:
69 args1.append("-n")
70 if options.debug:
71 args1.append("-b")
72
73 if options.reactor != DEFAULT_REACTOR:
74 rn = options.reactor + "reactor"
75 getattr(__import__("twisted.internet", fromlist=[rn]), rn).install()
76 if options.logfile:
77 args1+=["--logfile", options.logfile]
78 if options.pidfile:
79 args1+=["--pidfile", options.pidfile]
80 if options.syslog:
81 args1+=["--syslog"]
82 if options.profile:
83 args1+=["--profile", options.profile]
84 if options.profiler:
85 args1+=["--profiler", options.profiler]
86
87 if options.syslog and options.syslog_prefix:
88 import syslog
89 syslog.openlog(options.syslog_prefix)
90
91 if not options.tracebacks:
92 args2.append("-n")
93 if options.clogfile:
94 args2+=["--logfile", options.clogfile]
95
96 if options.sslcertificate and options.sslkey:
97 args2+=["--certificate", options.sslcertificate, "--privkey", options.sslkey, "--https", options.port]
98 if options.sslchain:
99 args2+=["--certificate-chain", options.sslchain]
100 else:
101 args2+=["--port", options.port]
102
103 args2+=["--ip", options.ip]
104
105 if os.name == "posix" and os.getuid() == 0:
106 print >>sys.stderr, "refusing to run as root"
107 os.exit(1)
108
109 run_twistd(args1, args2)