diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-06-13 09:17:13 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-06-13 09:17:13 +0200 |
commit | ddea558b402edd4b3a6ac72c7c6ddf38ba5e5bcc (patch) | |
tree | aa1bb19fe1457b892fea95782e7f8561b8b1ebf3 /src/plugins | |
parent | update makefile (diff) | |
download | xpybar-ddea558b402edd4b3a6ac72c7c6ddf38ba5e5bcc.tar.gz xpybar-ddea558b402edd4b3a6ac72c7c6ddf38ba5e5bcc.tar.bz2 xpybar-ddea558b402edd4b3a6ac72c7c6ddf38ba5e5bcc.tar.xz |
add ipaddress
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
-rw-r--r-- | src/plugins/ipaddress.py | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/src/plugins/ipaddress.py b/src/plugins/ipaddress.py new file mode 100644 index 0000000..e150ecc --- /dev/null +++ b/src/plugins/ipaddress.py @@ -0,0 +1,207 @@ +# -*- python -*- +''' +xpybar – xmobar replacement written in python +Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +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 +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. +''' + +import os + +from util import * + + +class IPAddress: + ''' + Multi-home aware retrieval of public and private IP addresses + + @variable nics:dict<str, The state and IP address for a network interface card + (state:int Either of: `IPAddress.{DOWN,UNKOWN,ISOLATED,UP}` + private:str? The interface's private IPv4 address + private6:str? The interface's private IPv6 address + public:str?)> The interface's public IP address on the Internet + ''' + + + DOWN = 0 + ''' + The network interface is down + ''' + + UNKNOWN = 1 + ''' + The network interface's public IP address is unknown, + but it is connected to the Internet + ''' + + ISOLATED = 2 + ''' + The network interface's public IP address is unknown + because it does not appear to be connected to the Internet + ''' + + UP = 3 + ''' + The network interface is up and the public IP address is known + ''' + + + def __init__(self, *exclude): + ''' + Constructor + + @param exclude:*str Devices to exclude + ''' + nics = [d for d in os.listdir('/sys/class/net') if d not in exclude] + infos = [i for i in spawn_read('ifconfig').split('\n\n') if not i == ''] + self.nics = {} + for nic in nics: + state, private, private6, public = IPAddress.DOWN, None, None, None + for info in infos: + if info.startswith(nic + ': '): + info = [i.lstrip().split(' ') for i in info.split('\n')[1:]] + info = dict((i[0], i[1]) for i in info) + private = info['inet'] if 'inet' in info else None + private6 = info['inet6'] if 'inet6' in info else None + state = IPAddress.ISOLATED + break + if not state == IPAddress.DOWN: + self.__isolated = True + public = self.__site_0() + if public is None: public = self.__site_1() + if public is None: public = self.__site_2() + if public is None: public = self.__site_3() + if public is None: public = self.__site_4() + if public is None: public = self.__site_5() + if public is None: public = self.__site_6() + if public is None: public = self.__site_7() + if public is None: public = self.__site_8() + if public is not None: + state = IPAddress.UP + elif not self.__isolated: + state = IPAddress.UNKNOWN + self.nics[nic] = (state, private, private6, public) + + + def public(self): + ''' + Get all unique public IP address + + @return :dist<address:str?, nics:list<str>> The IP addresses and the interfaces with those addresses + ''' + rc = {} + for nic in self.nics.keys(): + if self.nics[nic][3] in rc: + rc[self.nics[nic][3]].append(nic) + else: + rc[self.nics[nic][3]] = [nic] + return rc + + + def __site_0(self): + try: + data = spawn_read('wget', 'http://checkip.dyndns.org', '-O', '-') + if not data == '': + self.__isolated = False + return data.split('<body>')[1].split('</body>')[0].split(': ')[1] + except: + return None + + def __site_1(self): + try: + data = spawn_read('wget', 'http://ipecho.net/plain', '-O', '-') + if not data == '': + self.__isolated = False + data = data.strip() + return data if not data == '' else None + except: + return None + + def __site_2(self): + try: + data = spawn_read('wget', 'http://www.checkmyipaddress.org', '-O', '-') + if not data == '': + self.__isolated = False + data = [line.strip() for line in data.replace('\r\n', '\n').split('\n') if '</h3>' in line] + data = [line.split('>')[1].split('<')[0] for line in data] + data = [line for line in data if ' ' not in line] + return data[0] if not len(data) == 0 else None + except: + return None + + def __site_3(self): + try: + data = spawn_read('wget', 'http://www.ip-address.org', '-O', '-') + if not data == '': + self.__isolated = False + data = [line.strip(' \t') for line in data.replace('\r\n', '\n').split('\n') if 'ip += ' in line] + data = [line.split('"')[1] for line in data if len(line) - len(line.replace('"', '')) == 2] + data = [line.split('<')[0] for line in data] + data_ = [] + for line in data: + line_ = line + for c in '0123456789abcdefABCDEF.:': + line_ = line_.replace(c, '') + if not line_ == '': + data_.append(line_) + return data_[0] if not len(data_) == 0 else None + except: + return None + + def __site_4(self): + try: + data = spawn_read('wget', 'http://www.myipnumber.com/my-ip-address.asp', '-O', '-') + if not data == '': + self.__isolated = False + data = data.replace('\r\n', '\n').split('\nThe IP Address of this machine is:\n')[1] + return data.lower().split('\n')[0].split('<b>\n')[1].split('\n</b>')[0] + except: + return None + + def __site_5(self): + try: + data = spawn_read('wget', 'http://www.findipinfo.com', '-O', '-') + if not data == '': + self.__isolated = False + return data.split('Your IP Address Is: ')[1].split('<')[0] + except: + return None + + def __site_6(self): + try: + data = spawn_read('wget', 'http://what-ip.net', '-O', '-') + if not data == '': + self.__isolated = False + return data.split('Your IP Address is : ')[1].split('<b>')[1].split('</b>')[0] + except: + return None + + def __site_7(self): + try: + data = spawn_read('wget', 'http://my-ip-address.com', '-O', '-') + if not data == '': + self.__isolated = False + return data.split('<input ')[1].split('>')[0].split('value=')[1].split('"')[1] + except: + return None + + def __site_8(self): + try: + data = spawn_read('wget', 'https://duckduckgo.com?q=what is my ip address', '-O', '-') + if not data == '': + self.__isolated = False + return data.split('"Answer":"Your IP address is ')[1].split(' ')[0] + except: + return None + |