diff --git a/zenmap/zenmapCore/DelayedObject.py b/zenmap/zenmapCore/DelayedObject.py new file mode 100644 index 000000000..d788de08c --- /dev/null +++ b/zenmap/zenmapCore/DelayedObject.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# ***********************IMPORTANT NMAP LICENSE TERMS************************ +# * * +# * The Nmap Security Scanner is (C) 1996-2013 Insecure.Com LLC. Nmap is * +# * also a registered trademark of Insecure.Com LLC. This program is free * +# * software; you may redistribute and/or modify it under the terms of the * +# * GNU General Public License as published by the Free Software * +# * Foundation; Version 2 ("GPL"), BUT ONLY WITH ALL OF THE CLARIFICATIONS * +# * AND EXCEPTIONS DESCRIBED HEREIN. This guarantees your right to use, * +# * modify, and redistribute this software under certain conditions. If * +# * you wish to embed Nmap technology into proprietary software, we sell * +# * alternative licenses (contact sales@nmap.com). Dozens of software * +# * vendors already license Nmap technology such as host discovery, port * +# * scanning, OS detection, version detection, and the Nmap Scripting * +# * Engine. * +# * * +# * Note that the GPL places important restrictions on "derivative works", * +# * yet it does not provide a detailed definition of that term. To avoid * +# * misunderstandings, we interpret that term as broadly as copyright law * +# * allows. For example, we consider an application to constitute a * +# * derivative work for the purpose of this license if it does any of the * +# * following with any software or content covered by this license * +# * ("Covered Software"): * +# * * +# * o Integrates source code from Covered Software. * +# * * +# * o Reads or includes copyrighted data files, such as Nmap's nmap-os-db * +# * or nmap-service-probes. * +# * * +# * o Is designed specifically to execute Covered Software and parse the * +# * results (as opposed to typical shell or execution-menu apps, which will * +# * execute anything you tell them to). * +# * * +# * o Includes Covered Software in a proprietary executable installer. The * +# * installers produced by InstallShield are an example of this. Including * +# * Nmap with other software in compressed or archival form does not * +# * trigger this provision, provided appropriate open source decompression * +# * or de-archiving software is widely available for no charge. For the * +# * purposes of this license, an installer is considered to include Covered * +# * Software even if it actually retrieves a copy of Covered Software from * +# * another source during runtime (such as by downloading it from the * +# * Internet). * +# * * +# * o Links (statically or dynamically) to a library which does any of the * +# * above. * +# * * +# * o Executes a helper program, module, or script to do any of the above. * +# * * +# * This list is not exclusive, but is meant to clarify our interpretation * +# * of derived works with some common examples. Other people may interpret * +# * the plain GPL differently, so we consider this a special exception to * +# * the GPL that we apply to Covered Software. Works which meet any of * +# * these conditions must conform to all of the terms of this license, * +# * particularly including the GPL Section 3 requirements of providing * +# * source code and allowing free redistribution of the work as a whole. * +# * * +# * As another special exception to the GPL terms, Insecure.Com LLC grants * +# * permission to link the code of this program with any version of the * +# * OpenSSL library which is distributed under a license identical to that * +# * listed in the included docs/licenses/OpenSSL.txt file, and distribute * +# * linked combinations including the two. * +# * * +# * Any redistribution of Covered Software, including any derived works, * +# * must obey and carry forward all of the terms of this license, including * +# * obeying all GPL rules and restrictions. For example, source code of * +# * the whole work must be provided and free redistribution must be * +# * allowed. All GPL references to "this License", are to be treated as * +# * including the terms and conditions of this license text as well. * +# * * +# * Because this license imposes special exceptions to the GPL, Covered * +# * Work may not be combined (even as part of a larger work) with plain GPL * +# * software. The terms, conditions, and exceptions of this license must * +# * be included as well. This license is incompatible with some other open * +# * source licenses as well. In some cases we can relicense portions of * +# * Nmap or grant special permissions to use it in other open source * +# * software. Please contact fyodor@nmap.org with any such requests. * +# * Similarly, we don't incorporate incompatible open source software into * +# * Covered Software without special permission from the copyright holders. * +# * * +# * If you have any questions about the licensing restrictions on using * +# * Nmap in other works, are happy to help. As mentioned above, we also * +# * offer alternative license to integrate Nmap into proprietary * +# * applications and appliances. These contracts have been sold to dozens * +# * of software vendors, and generally include a perpetual license as well * +# * as providing for priority support and updates. They also fund the * +# * continued development of Nmap. Please email sales@nmap.com for further * +# * information. * +# * * +# * If you have received a written license agreement or contract for * +# * Covered Software stating terms other than these, you may choose to use * +# * and redistribute Covered Software under those terms instead of these. * +# * * +# * Source is provided to this software because we believe users have a * +# * right to know exactly what a program is going to do before they run it. * +# * This also allows you to audit the software for security holes (none * +# * have been found so far). * +# * * +# * Source code also allows you to port Nmap to new platforms, fix bugs, * +# * and add new features. You are highly encouraged to send your changes * +# * to the dev@nmap.org mailing list for possible incorporation into the * +# * main distribution. By sending these changes to Fyodor or one of the * +# * Insecure.Org development mailing lists, or checking them into the Nmap * +# * source code repository, it is understood (unless you specify otherwise) * +# * that you are offering the Nmap Project (Insecure.Com LLC) the * +# * unlimited, non-exclusive right to reuse, modify, and relicense the * +# * code. Nmap will always be available Open Source, but this is important * +# * because the inability to relicense code has caused devastating problems * +# * for other Free Software projects (such as KDE and NASM). We also * +# * occasionally relicense the code to third parties as discussed above. * +# * If you wish to specify special license conditions of your * +# * contributions, just say so when you send them. * +# * * +# * This program 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 Nmap * +# * license file for more details (it's in a COPYING file included with * +# * Nmap, and also available from https://svn.nmap.org/nmap/COPYING * +# * * +# ***************************************************************************/ + + +class DelayedObject(object): + def __init__(self, klass, *args, **kwargs): + object.__setattr__(self,"klass", klass) + object.__setattr__(self,"args", args) + object.__setattr__(self,"kwargs", kwargs) + def __setattr__(self, name, value): + self = object.__getattribute__(self, "klass")( + *object.__getattribute__(self,"args"), + **object.__getattribute__(self,"kwargs") + ) + setattr(self, name, value) + def __getattribute__(self, name): + self = object.__getattribute__(self, "klass")( + *object.__getattribute__(self,"args"), + **object.__getattribute__(self,"kwargs") + ) + return getattr(self, name) diff --git a/zenmap/zenmapCore/Paths.py b/zenmap/zenmapCore/Paths.py index c27567cd1..fe2500572 100644 --- a/zenmap/zenmapCore/Paths.py +++ b/zenmap/zenmapCore/Paths.py @@ -131,7 +131,6 @@ import shutil from zenmapCore.BasePaths import base_paths, fs_dec from zenmapCore.Version import VERSION from zenmapCore.Name import APP_NAME -from zenmapCore.UmitOptionParser import option_parser # Find out the prefix under which data files (interface definition XML, @@ -197,29 +196,39 @@ class Paths(object): "profile_editor"] def __init__(self): - self.user_config_dir = option_parser.get_confdir() - self.user_config_file = os.path.join( - self.user_config_dir, base_paths['user_config_file']) self.config_dir = CONFIG_DIR self.locale_dir = LOCALE_DIR self.pixmaps_dir = PIXMAPS_DIR self.misc_dir = MISC_DIR self.docs_dir = DOCS_DIR self.nmap_dir = NMAPDATADIR + self._delayed_incomplete = True + + # Delay initializing these paths so that + # zenmapCore.I18N.install_gettext can install _() before modules that + # need it get imported + def _delayed_init(self): + if self._delayed_incomplete: + from zenmapCore.UmitOptionParser import option_parser + self.user_config_dir = option_parser.get_confdir() + self.user_config_file = os.path.join( + self.user_config_dir, base_paths['user_config_file']) + self._delayed_incomplete = False def __getattr__(self, name): if name in self.hardcoded: return self.__dict__[name] - elif name in self.config_files_list: + self._delayed_init() + if name in self.config_files_list: return return_if_exists( join(self.user_config_dir, base_paths[name])) - elif name in self.empty_config_files_list: + if name in self.empty_config_files_list: return return_if_exists( join(self.user_config_dir, base_paths[name]), True) - elif name in self.misc_files_list: + if name in self.misc_files_list: return return_if_exists(join(self.misc_dir, base_paths[name])) try: diff --git a/zenmap/zenmapCore/UmitLogging.py b/zenmap/zenmapCore/UmitLogging.py index 41918c5c3..a2d03847b 100644 --- a/zenmap/zenmapCore/UmitLogging.py +++ b/zenmap/zenmapCore/UmitLogging.py @@ -124,12 +124,13 @@ from logging import Logger, StreamHandler, Formatter from zenmapCore.Name import APP_DISPLAY_NAME from zenmapCore.UmitOptionParser import option_parser - -LOGLEVEL = option_parser.get_verbose() +from zenmapCore.DelayedObject import DelayedObject class Log(Logger, object): def __init__(self, name, level=0): + if level == 0: + level = option_parser.get_verbose() Logger.__init__(self, name, level) self.formatter = self.format @@ -151,7 +152,7 @@ class Log(Logger, object): # Import this! -log = Log(APP_DISPLAY_NAME, LOGLEVEL) +log = DelayedObject(Log, APP_DISPLAY_NAME) if __name__ == '__main__': log.debug("Debug Message") diff --git a/zenmap/zenmapCore/UmitOptionParser.py b/zenmap/zenmapCore/UmitOptionParser.py index b7ac7d458..78f9f3540 100644 --- a/zenmap/zenmapCore/UmitOptionParser.py +++ b/zenmap/zenmapCore/UmitOptionParser.py @@ -125,6 +125,7 @@ from zenmapCore.Name import APP_NAME, NMAP_DISPLAY_NAME from zenmapCore.Version import VERSION import zenmapCore.I18N from zenmapCore.BasePaths import base_paths +from zenmapCore.DelayedObject import DelayedObject class UmitOptionParser(OptionParser): @@ -259,7 +260,7 @@ used more than once to get even more verbosity")) """ return 40 - (self.options.verbose * 10) -option_parser = UmitOptionParser() +option_parser = DelayedObject(UmitOptionParser) if __name__ == "__main__": opt = UmitOptionParser() diff --git a/zenmap/zenmapGUI/App.py b/zenmap/zenmapGUI/App.py index 07f2626ed..3844654b6 100644 --- a/zenmap/zenmapGUI/App.py +++ b/zenmap/zenmapGUI/App.py @@ -163,8 +163,6 @@ import zenmapCore.I18N from zenmapCore.Paths import Path from zenmapCore.Name import APP_DISPLAY_NAME -from zenmapGUI.MainWindow import ScanWindow - from zenmapGUI.higwidgets.higdialogs import HIGAlertDialog # A global list of open scan windows. When the last one is destroyed, we call @@ -186,6 +184,7 @@ def _destroy_callback(window): def new_window(): + from zenmapGUI.MainWindow import ScanWindow w = ScanWindow() w.connect("destroy", _destroy_callback) if is_maemo():