raw
genesis                 1 #! /usr/bin/env python
genesis 2
genesis 3 import os
genesis 4 import re
genesis 5 import select
genesis 6 import socket
genesis 7 import string
genesis 8 import sys
genesis 9 import tempfile
genesis 10 import time
genesis 11 from lib.server import VERSION
genesis 12 from lib.server import Server
genesis 13 from lib.peer import Peer
genesis 14 from datetime import datetime
genesis 15 from optparse import OptionParser
genesis 16
genesis 17
genesis 18 def main(argv):
genesis 19 op = OptionParser(
genesis 20 version=VERSION,
9991-improved-log... 21 description="Blatta is an implementation of a Pest network station.")
genesis 22 op.add_option(
genesis 23 "-a", "--address-table-path",
genesis 24 help="Import address table from specified file")
genesis 25 op.add_option(
genesis 26 "-b", "--db-path",
genesis 27 help="Specify path to settings database file")
genesis 28 op.add_option(
genesis 29 "-c", "--config-file-path",
genesis 30 metavar="X",
genesis 31 help="load the configfile from X")
genesis 32 op.add_option(
genesis 33 "-d", "--daemon",
genesis 34 action="store_true",
genesis 35 help="fork and become a daemon")
genesis 36 op.add_option(
genesis 37 "--debug",
genesis 38 action="store_true",
genesis 39 help="print debug messages to stdout")
genesis 40 op.add_option(
genesis 41 "--listen",
genesis 42 metavar="X",
genesis 43 help="listen on specific IP address X")
genesis 44 op.add_option(
genesis 45 "--logdir",
genesis 46 metavar="X",
genesis 47 help="store channel log in directory X")
genesis 48 op.add_option(
genesis 49 "--motd",
genesis 50 metavar="X",
genesis 51 help="display file X as message of the day")
genesis 52 op.add_option(
genesis 53 "-p", "--password",
genesis 54 metavar="X",
genesis 55 help="require connection password X; default: no password")
genesis 56 op.add_option(
9991-improved-log... 57 "--irc-ports",
genesis 58 metavar="X",
9991-improved-log... 59 help="listen on ports X for irc client connections (a list separated by comma or whitespace);"
9991-improved-log... 60 " default: 6667")
genesis 61 op.add_option(
genesis 62 "--udp-port",
genesis 63 metavar="X",
genesis 64 help="listen for UDP packets on X;"
genesis 65 " default: 7778")
genesis 66 op.add_option(
genesis 67 "--statedir",
genesis 68 metavar="X",
genesis 69 help="save persistent channel state (topic, key) in directory X")
genesis 70 op.add_option(
genesis 71 "--verbose",
genesis 72 action="store_true",
genesis 73 help="be verbose (print some progress messages to stdout)")
genesis 74 if os.name == "posix":
genesis 75 op.add_option(
genesis 76 "--chroot",
genesis 77 metavar="X",
genesis 78 help="change filesystem root to directory X after startup"
genesis 79 " (requires root)")
genesis 80 op.add_option(
genesis 81 "--setuid",
genesis 82 metavar="U[:G]",
genesis 83 help="change process user (and optionally group) after startup"
genesis 84 " (requires root)")
genesis 85
genesis 86 (options, args) = op.parse_args(argv[1:])
genesis 87 if options.debug:
genesis 88 options.verbose = True
9991-improved-log... 89 if options.irc_ports is None:
9991-improved-log... 90 options.irc_ports = "6697"
genesis 91 if options.udp_port is None:
genesis 92 options.udp_port = 7778
genesis 93 else:
genesis 94 options.udp_port = int(options.udp_port)
genesis 95 if options.db_path is None:
9991-improved-log... 96 options.db_path = "blatta.db"
genesis 97 if options.config_file_path is None:
genesis 98 options.config_file_path = "config.py"
genesis 99 if options.chroot:
genesis 100 if os.getuid() != 0:
genesis 101 op.error("Must be root to use --chroot")
genesis 102 if options.setuid:
genesis 103 from pwd import getpwnam
genesis 104 from grp import getgrnam
genesis 105 if os.getuid() != 0:
genesis 106 op.error("Must be root to use --setuid")
genesis 107 matches = options.setuid.split(":")
genesis 108 if len(matches) == 2:
genesis 109 options.setuid = (getpwnam(matches[0]).pw_uid,
genesis 110 getgrnam(matches[1]).gr_gid)
genesis 111 elif len(matches) == 1:
genesis 112 options.setuid = (getpwnam(matches[0]).pw_uid,
genesis 113 getpwnam(matches[0]).pw_gid)
genesis 114 else:
genesis 115 op.error("Specify a user, or user and group separated by a colon,"
genesis 116 " e.g. --setuid daemon, --setuid nobody:nobody")
genesis 117 if (os.getuid() == 0 or os.getgid() == 0) and not options.setuid:
genesis 118 op.error("Running this service as root is not recommended. Use the"
genesis 119 " --setuid option to switch to an unprivileged account after"
genesis 120 " startup. If you really intend to run as root, use"
genesis 121 " \"--setuid root\".")
genesis 122
9991-improved-log... 123 irc_ports = []
9991-improved-log... 124 for port in re.split(r"[,\s]+", options.irc_ports):
genesis 125 try:
9991-improved-log... 126 irc_ports.append(int(port))
genesis 127 except ValueError:
genesis 128 op.error("bad port: %r" % port)
9991-improved-log... 129 options.irc_ports = irc_ports
genesis 130 server = Server(options)
genesis 131 if options.daemon:
genesis 132 server.daemonize()
genesis 133 try:
genesis 134 server.start()
genesis 135 except KeyboardInterrupt:
genesis 136 server.print_error("Interrupted.")
genesis 137
genesis 138
genesis 139 main(sys.argv)