poezio.py 3.9 KB
Newer Older
louiz’'s avatar
louiz’ committed
1
# Copyright 2010-2011 Florent Le Coz <louiz@louiz.org>
2 3 4 5
#
# This file is part of Poezio.
#
# Poezio is free software: you can redistribute it and/or modify
6
# it under the terms of the zlib license. See the COPYING file.
7 8 9
"""
Starting point of poezio. Launches both the Connection and Gui
"""
10

11
import sys
12
import os
13
import signal
14

mathieui's avatar
mathieui committed
15

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
def test_curses():
    """
    Check if the system ncurses linked with python has unicode capabilities.
    """
    import curses
    if hasattr(curses, 'unget_wch'):
        return True
    print("""\
ERROR: The current python executable is linked with a ncurses version that \
has no unicode capabilities.

This could mean that:
    - python was built on a system where readline is linked against \
libncurses and not libncursesw
    - python was built without ncursesw headers available

Please file a bug for your distribution or fix that on your system and then \
recompile python.
Poezio is currently unable to read your input or draw its interface properly,\
 so it will now exit.""")
    return False

mathieui's avatar
mathieui committed
38

39 40 41 42 43 44 45 46 47 48 49 50 51 52
def test_env():
    """
    Check if the environment has the right variables set
    """
    unset = set()
    for i in ('HOME', 'PATH', 'TERM'):
        if not os.environ.get(i):
            unset.add(i)
    if unset:
        variables = ', '.join('$%s' % i for i in unset)
        print('ERROR: %s not set' % variables)
        return False
    return True

53

Link Mauve's avatar
Link Mauve committed
54
def test_unicode():
mathieui's avatar
mathieui committed
55
    from . import poopt
Link Mauve's avatar
Link Mauve committed
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
    try:
        poopt.wcswidth('✔')
    except UnicodeError:
        print("""\
ERROR: The current system is misconfigured for Unicode.

Check your locale setup, especially the $LANG environment variable and \
whether it matches a locale built on your system.  Also check that it is a \
.UTF-8 locale, and not using some legacy encoding.

Poezio is unable to display characters properly, so it will now exit.""")
        return False
    return True


louiz’'s avatar
pylint  
louiz’ committed
71 72
def main():
    """
Link Mauve's avatar
Link Mauve committed
73
    Entry point.
louiz’'s avatar
pylint  
louiz’ committed
74
    """
75 76 77 78 79

    if os.geteuid() == 0:
        sys.stdout.write("Please do not run poezio as root.\n")
        sys.exit(0)

80 81
    sys.stdout.write("\x1b]0;poezio\x07")
    sys.stdout.flush()
mathieui's avatar
mathieui committed
82
    from poezio import config
83
    config.run_cmdline_args()
84 85 86 87
    config.create_global_config()
    config.setup_logging()
    config.post_logging_setup()

88 89 90
    import logging
    logging.raiseExceptions = False

mathieui's avatar
mathieui committed
91
    from poezio.config import options
92

93 94 95 96
    if options.check_config:
        config.check_config()
        sys.exit(0)

97 98 99
    from poezio.asyncio import monkey_patch_asyncio_slixmpp
    monkey_patch_asyncio_slixmpp()

mathieui's avatar
mathieui committed
100
    from poezio import theming
101 102
    theming.update_themes_dir()

mathieui's avatar
mathieui committed
103
    from poezio import logger
104
    logger.create_logger()
105

mathieui's avatar
mathieui committed
106
    from poezio import roster
107
    roster.roster.reset()
108

mathieui's avatar
mathieui committed
109
    from poezio.core.core import Core
110

mathieui's avatar
mathieui committed
111
    signal.signal(signal.SIGINT, signal.SIG_IGN)  # ignore ctrl-c
mathieui's avatar
mathieui committed
112
    cocore = Core()
mathieui's avatar
mathieui committed
113
    signal.signal(signal.SIGUSR1, cocore.sigusr_handler)  # reload the config
mathieui's avatar
mathieui committed
114 115
    signal.signal(signal.SIGHUP, cocore.exit_from_signal)
    signal.signal(signal.SIGTERM, cocore.exit_from_signal)
mathieui's avatar
mathieui committed
116 117
    if options.debug:
        cocore.debug = True
louiz’'s avatar
pylint  
louiz’ committed
118
    cocore.start()
119

120
    from slixmpp.exceptions import IqError, IqTimeout
mathieui's avatar
mathieui committed
121

122 123 124 125 126
    def swallow_iqerrors(loop, context):
        """Do not log unhandled iq errors and timeouts"""
        if not isinstance(context['exception'], (IqError, IqTimeout)):
            loop.default_exception_handler(context)

127 128 129 130
    # Warning: asyncio must always be imported after the config. Otherwise
    # the asyncio logger will not follow our configuration and won't write
    # the tracebacks in the correct file, etc
    import asyncio
131
    loop = asyncio.get_event_loop()
132
    loop.set_exception_handler(swallow_iqerrors)
133

134 135
    loop.add_reader(sys.stdin, cocore.on_input_readable)
    loop.add_signal_handler(signal.SIGWINCH, cocore.sigwinch_handler)
136
    cocore.xmpp.start()
137
    loop.run_forever()
138
    # We reach this point only when loop.stop() is called
139 140
    try:
        cocore.reset_curses()
141 142
    except:
        pass