#!/usr/bin/env python #Copyright 2004 Sebastian Hagen # This file is part of eucharis. # eucharis is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 # as published by the Free Software Foundation # eucharis is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with eucharis; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os import sys import time import logging import socket import threading import xml.parsers import __main__ import eucharis_core import eucharis_debug import basic_io import iptracking import authentication_system import init_misc import irc_base import irc_server import irc_client import botnet_interface import dns_server import data_pickling import signal_handling import control_connection import data_export_irc import debug_irc_server import info_gimmicks settings = {} settings['target_uid'] = 65534 settings['save_delay'] = 600 defaults = {} defaults['persistent_sockets'] = {} defaults['logger'] = logging.getLogger() defaults['input_files'] = { 'settings':('settings.py', 'auth.py'), 'state':('state.xml',) } defaults['output_files'] = { 'state.xml':[("eucharis_core.t1.servers", 'eucharis_core') ] } network_connection = True defaults['rehash_data']={} init_misc.set_defaults(defaults=defaults, global_scope=globals()) main_init = () #Read configuration files. for input_file in input_files['settings']: execfile(input_file) def obtain_version_self(): output_os, output_host, output_os_version, output_os_compilets, output_platform = os.uname() python_version = sys.version_info while (len(python_version) < 3): python_version = python_version + (0,) output_tuple = ('Eucharis Project', '1.3', 'Python %d.%d.%d' % (python_version[0], python_version[1], python_version[2]), str(output_host), str(output_os), str(output_os_version), '(%s)' % (output_platform,)) return output_tuple version_info = obtain_version_self() def start_instance(target): def clean_up(varname): if (varname in globals()): data_pickling.save_variables() globals()[varname].clean_up() del(globals()[varname]) def update_users(target, new_instance): if (target in __main__.connection_users): for connection_user in __main__.connection_users[target]: connection_user.connections[target] = new_instance if (('handler_bindings' in dir(connection_user)) and (target in connection_user.handler_bindings)): connection_user.handlers_modify(action='register', handler_types=[target]) global is1, t1, dh1, rm1, bi1, cc1, iui, ic1 if (target == 'iptracker'): clean_up('t1') t1 = iptracking.iptracker(irc_server=is1, irc_client=ic1, botnet_interface=bi1, dgram_socket=persistent_sockets['dns_server'], **settings['iptracker']) elif (target == 'irc_server'): clean_up('is1') is1 = irc_server.irc_server(**settings['irc_server']) is1.connection_init() update_users(target, is1) elif (target == 'irc_server_debug_handler'): clean_up('isd1') isd1 = eucharis_debug.irc_server_debug_handler(irc_server=is1) elif (target == 'irc_client'): clean_up('ic1') ic1 = irc_client.irc_client(**settings['irc_client']) elif (target == 'botnet_interface'): clean_up('bi1') bi1 = botnet_interface.eggdrop_botnet_connection(**settings['botnet_interface']) bi1.connection_init() update_users(target, bi1) elif (target == 'iptrack_user_interface'): clean_up('iui') iui = iptracking.iptrack_user_interface(irc_server=is1, iptrack_instance=t1, control_connection=cc1) elif (target == 'control_connection'): clean_up('cc1') cc1 = control_connection.control_server(**settings['control_connection']) elif (target == 'irc_state_dumper_file'): clean_up('isdf1') isdf1 = data_export_irc.irc_state_dumper_file(irc_server=is1, **settings['irc_state_dumper_file']) elif (target == 'irc_state_dumper_sql'): clean_up('isds1') isds1 = data_export_irc.irc_state_dumper_sql(irc_server=is1, **settings['irc_state_dumper_sql']) elif (target == 'info_request_handler'): clean_up('irh1') irh1 = info_gimmicks.info_request_handler(irc_server=is1, control_connection=cc1) elif (target == 'dict_request_handler'): clean_up('drh1') drh1 = info_gimmicks.dict_request_handler(irc_server=is1, **settings['dict_request_handler']) if (target in ('iptracker',)): restore_state() t1.integrity_check() def init(): if (os.getuid() == 0): #We were started as root; do the privileged init stuff and change our uid afterwards. logger.log(20, 'Started as root. Performing privileged init...') socket_dgram = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) socket_dgram.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) socket_dgram.bind(settings['address_dns_server']) persistent_sockets['dns_server'] = socket_dgram logger.log(20, 'Changing my gid and uid to normal user...') if (('target_gid' in settings) and (settings['target_gid'] > 0)): os.setgid(settings['target_gid']) else: os.setgid(1) if (('target_uid' in settings) and (settings['target_uid'] > 0)): os.setuid(settings['target_uid']) else: os.setuid(1) if (os.getuid() == 0): logger.log(50, 'Failed to change uid from 0 (root).') os._exit(os.EX_OSERR) else: logger.log(20, 'Started as normal user. Skipping privileged init.') persistent_sockets['dns_server'] = None basic_io.log_init() __main__.connection_users = { 'irc_server':[], 'irc_client':[], 'botnet_interface':[] } for main_init_entry in main_init: start_instance(main_init_entry) def restore_state(): for filename in input_files['state']: try: data_pickling.xml_input(filename=filename, basename=filename.split('.')[0]) except IOError, xml.parsers.expat.ExpatError: logger.log(40, 'Unable to restore state from file %s.' % (filename,), exc_info=True) privileged_init = {} for filename in output_files: for variable_unit in output_files[filename]: data_pickling.register_variable(variable_unit=variable_unit, filename=filename) data_pickling.register_save_timer(delay=settings['save_delay'])