Add mock data for scanner test
[wifi-radar.git] / wifiradar / misc.py
blobe9615f335f04cd9e0fb2f024de34f0b1db0d4995
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
4 # misc.py - collection of miscellaneous functions and classes
6 # Part of WiFi Radar: A utility for managing WiFi profiles on GNU/Linux.
8 # Copyright (C) 2004-2005 Ahmad Baitalmal <ahmad@baitalmal.com>
9 # Copyright (C) 2005 Nicolas Brouard <nicolas.brouard@mandrake.org>
10 # Copyright (C) 2005-2009 Brian Elliott Finley <brian@thefinleys.com>
11 # Copyright (C) 2006 David Decotigny <com.d2@free.fr>
12 # Copyright (C) 2006 Simon Gerber <gesimu@gmail.com>
13 # Copyright (C) 2006-2007 Joey Hurst <jhurst@lucubrate.org>
14 # Copyright (C) 2006, 2009 Ante Karamatic <ivoks@ubuntu.com>
15 # Copyright (C) 2009-2010,2014 Sean Robinson <robinson@tuxfamily.org>
16 # Copyright (C) 2010 Prokhor Shuchalov <p@shuchalov.ru>
18 # This program is free software; you can redistribute it and/or modify
19 # it under the terms of the GNU General Public License as published by
20 # the Free Software Foundation; version 2 of the License.
22 # This program is distributed in the hope that it will be useful,
23 # but WITHOUT ANY WARRANTY; without even the implied warranty of
24 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 # GNU General Public License in LICENSE.GPL for more details.
27 # You should have received a copy of the GNU General Public License
28 # along with this program; if not, write to:
29 # Free Software Foundation, Inc.
30 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
34 from __future__ import unicode_literals
36 import collections
37 import errno
38 import gettext
39 import logging
40 import os
41 import sys
43 from subprocess import check_call, Popen, PIPE, STDOUT
45 WIFI_RADAR_VERSION = '0.0.0'
47 # create a logger
48 logger = logging.getLogger(__name__)
50 __all__ = ['_', 'PYVERSION', 'WIFI_RADAR_VERSION', 'DeviceError',
51 'NoDeviceError', 'PipeError', 'KeySortedDict',
52 'get_new_profile', 'shellcmd']
54 PYVERSION = sys.version_info[0]
56 # Look for string translations in the default location, then in the po
57 # directory under the current directory. This second location is useful
58 # during development.
59 for locale_dir in [gettext.bindtextdomain(None), os.path.realpath('./po/')]:
60 try:
61 trans = gettext.translation('wifi-radar', locale_dir)
62 except IOError as e:
63 logger.warning("{EXC} in '{DIR}'".format(EXC=e, DIR=locale_dir))
64 else:
65 logger.info("Translation file found in '{DIR}'".format(DIR=locale_dir))
66 break
67 else:
68 logger.warning('Translation disabled. Please report this '
69 'at http://wifi-radar.tuxfamily.org/')
70 trans = gettext.NullTranslations()
71 # Return a reference to the unicode version of gettext, no matter
72 # the Python version.
73 if PYVERSION < 3:
74 _ = trans.ugettext
75 else:
76 _ = trans.gettext
78 class DeviceError(EnvironmentError):
79 """ DeviceError will be raised when a problem is found while changing
80 a wireless device's configuration (e.g. when 'ifconfig wlan0 up'
81 fails).
82 """
83 pass
86 class NoDeviceError(EnvironmentError):
87 """ NoDeviceError will be raised when a wireless device cannot be
88 found.
89 """
90 pass
93 class PipeError(IOError):
94 """ PipeError is raised when a communication Pipe closes unexpectedly.
95 """
96 pass
99 class KeySortedDict(collections.MutableMapping):
100 """ :class:`KeySortedDict` provides a dictionary whose keys are always
101 returned in sorted order. Internal storage is not affected by the
102 sorting.
104 def __init__(self, *args, **kwargs):
105 self._key_list = list()
106 self._backing_dict = dict()
107 self.update(*args, **kwargs)
109 def __setitem__(self, key, value):
110 """ ksd.__setitem__(k, v) <==> ksd[k] = v """
111 if key in self:
112 # Update in place.
113 self._backing_dict[key] = value
114 else:
115 self._key_list.append(key)
116 self._backing_dict[key] = value
118 def __getitem__(self, key):
119 """ ksd.__getitem__(k) <==> ksd[k] """
120 return self._backing_dict[key]
122 def __delitem__(self, key):
123 """ ksd.__delitem__(k) <==> del ksd[k] """
124 del self._backing_dict[key]
125 self._key_list.remove(key)
127 def __iter__(self):
128 """ ksd.__iter__() <==> iter(ksd) """
129 self._key_list.sort()
130 for key in self._key_list:
131 yield key
133 def __len__(self):
134 """ ksd.__len__ <==> len(ksd) """
135 return len(self._key_list)
137 def __repr__(self):
138 return '{}({})'.format(self.__class__.__name__, self.items())
140 def copy(self):
141 return self._backing_dict.copy()
144 def get_new_profile():
145 """ Return a blank profile.
147 Parameters:
149 none
151 Returns:
153 dictionary -- An AP profile with defaults set.
155 return { 'known': False,
156 'available': False,
157 'encrypted': False,
158 'essid': '',
159 'bssid': '',
160 'roaming': False,
161 'protocol': 'g',
162 'signal': -193,
163 'channel': 'auto',
164 'con_prescript': '',
165 'con_postscript': '',
166 'dis_prescript': '',
167 'dis_postscript': '',
168 'key': '',
169 'mode': 'auto',
170 'security': 'none',
171 'wep_mode': '',
172 'wpa_psk': '',
173 'use_dhcp': True,
174 'ip': '',
175 'netmask': '',
176 'gateway': '',
177 'domain': '',
178 'dns1': '',
179 'dns2': ''
182 def shellcmd(command, environment=None):
183 """ Run 'command' through the shell, where 'command' is a tuple of
184 the program to execute and its arguments. 'environment' is a
185 dictionary of shell environment variables (as keys) and their
186 values. Returns 0 on success, otherwise, it raises
187 CalledProcessError.
189 env_tmp = os.environ
190 env_tmp.update(environment)
191 return check_call(command, shell=True, env=env_tmp)
194 # Make so we can be imported
195 if __name__ == '__main__':
196 pass