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(
9989-show-wot-nicks 33 "-n", "--channel-name",
9989-show-wot-nicks 34 metavar="X",
9989-show-wot-nicks 35 help="specify the channel name for this Pest network")
9989-show-wot-nicks 36 op.add_option(
genesis 37 "-d", "--daemon",
genesis 38 action="store_true",
genesis 39 help="fork and become a daemon")
genesis 40 op.add_option(
genesis 41 "--debug",
genesis 42 action="store_true",
genesis 43 help="print debug messages to stdout")
genesis 44 op.add_option(
genesis 45 "--listen",
genesis 46 metavar="X",
genesis 47 help="listen on specific IP address X")
genesis 48 op.add_option(
genesis 49 "--logdir",
genesis 50 metavar="X",
genesis 51 help="store channel log in directory X")
genesis 52 op.add_option(
genesis 53 "--motd",
genesis 54 metavar="X",
genesis 55 help="display file X as message of the day")
genesis 56 op.add_option(
genesis 57 "-p", "--password",
genesis 58 metavar="X",
genesis 59 help="require connection password X; default: no password")
genesis 60 op.add_option(
9991-improved-log... 61 "--irc-ports",
genesis 62 metavar="X",
9991-improved-log... 63 help="listen on ports X for irc client connections (a list separated by comma or whitespace);"
9991-improved-log... 64 " default: 6667")
genesis 65 op.add_option(
genesis 66 "--udp-port",
genesis 67 metavar="X",
genesis 68 help="listen for UDP packets on X;"
genesis 69 " default: 7778")
genesis 70 op.add_option(
genesis 71 "--statedir",
genesis 72 metavar="X",
genesis 73 help="save persistent channel state (topic, key) in directory X")
genesis 74 op.add_option(
genesis 75 "--verbose",
genesis 76 action="store_true",
genesis 77 help="be verbose (print some progress messages to stdout)")
genesis 78 if os.name == "posix":
genesis 79 op.add_option(
genesis 80 "--chroot",
genesis 81 metavar="X",
genesis 82 help="change filesystem root to directory X after startup"
genesis 83 " (requires root)")
genesis 84 op.add_option(
genesis 85 "--setuid",
genesis 86 metavar="U[:G]",
genesis 87 help="change process user (and optionally group) after startup"
genesis 88 " (requires root)")
genesis 89
genesis 90 (options, args) = op.parse_args(argv[1:])
9989-show-wot-nicks 91 if options.channel_name is None:
9989-show-wot-nicks 92 options.channel_name = "#pest"
genesis 93 if options.debug:
genesis 94 options.verbose = True
9991-improved-log... 95 if options.irc_ports is None:
9991-improved-log... 96 options.irc_ports = "6697"
genesis 97 if options.udp_port is None:
genesis 98 options.udp_port = 7778
genesis 99 else:
genesis 100 options.udp_port = int(options.udp_port)
genesis 101 if options.db_path is None:
9991-improved-log... 102 options.db_path = "blatta.db"
genesis 103 if options.config_file_path is None:
genesis 104 options.config_file_path = "config.py"
genesis 105 if options.chroot:
genesis 106 if os.getuid() != 0:
genesis 107 op.error("Must be root to use --chroot")
genesis 108 if options.setuid:
genesis 109 from pwd import getpwnam
genesis 110 from grp import getgrnam
genesis 111 if os.getuid() != 0:
genesis 112 op.error("Must be root to use --setuid")
genesis 113 matches = options.setuid.split(":")
genesis 114 if len(matches) == 2:
genesis 115 options.setuid = (getpwnam(matches[0]).pw_uid,
genesis 116 getgrnam(matches[1]).gr_gid)
genesis 117 elif len(matches) == 1:
genesis 118 options.setuid = (getpwnam(matches[0]).pw_uid,
genesis 119 getpwnam(matches[0]).pw_gid)
genesis 120 else:
genesis 121 op.error("Specify a user, or user and group separated by a colon,"
genesis 122 " e.g. --setuid daemon, --setuid nobody:nobody")
genesis 123 if (os.getuid() == 0 or os.getgid() == 0) and not options.setuid:
genesis 124 op.error("Running this service as root is not recommended. Use the"
genesis 125 " --setuid option to switch to an unprivileged account after"
genesis 126 " startup. If you really intend to run as root, use"
genesis 127 " \"--setuid root\".")
genesis 128
9991-improved-log... 129 irc_ports = []
9991-improved-log... 130 for port in re.split(r"[,\s]+", options.irc_ports):
genesis 131 try:
9991-improved-log... 132 irc_ports.append(int(port))
genesis 133 except ValueError:
genesis 134 op.error("bad port: %r" % port)
9991-improved-log... 135 options.irc_ports = irc_ports
genesis 136 server = Server(options)
genesis 137 if options.daemon:
genesis 138 server.daemonize()
genesis 139 try:
genesis 140 server.start()
genesis 141 except KeyboardInterrupt:
genesis 142 server.print_error("Interrupted.")
genesis 143
genesis 144
genesis 145 main(sys.argv)