#!/usr/bin/python
# -*- coding: utf-8 -*-

# --------------------------------------------------------------------------- #
#                                                                             #
#    Plugin for iSida Jabber Bot                                              #
#    Copyright (C) diSabler <dsy@dsy.name>                                    #
#                                                                             #
#    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
import hashlib
import subprocess

oui_csv = data_folder % 'oui.csv'

# Remote OUI sources (tried in order)
OUI_SOURCES = [
	'http://standards-oui.ieee.org/oui/oui.csv',
	'https://standards-oui.ieee.org/oui/oui.csv',
]

def download_oui():
	'''Download OUI file from remote source, compare with local, update if changed.'''
	global oui_csv
	tmp_file = '%s.tmp' % oui_csv
	for url in OUI_SOURCES:
		try:
			import urllib.request
			req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
			with urllib.request.urlopen(req, timeout=15) as resp:
				data = resp.read()
			if not data or len(data) < 1000:
				continue
			# Compare with existing file
			if os.path.exists(oui_csv):
				with open(oui_csv, 'rb') as f:
					old_hash = hashlib.md5(f.read()).hexdigest()
				new_hash = hashlib.md5(data).hexdigest()
				if old_hash == new_hash:
					pprint('*** OUI file is up to date','green')
					return True
			# Write new file
			with open(tmp_file, 'wb') as f:
				f.write(data)
			os.rename(tmp_file, oui_csv)
			pprint('*** OUI file updated from %s (%d bytes)' % (url, len(data)),'green')
			return True
		except Exception as e:
			pprint('*** OUI download from %s failed: %s' % (url, str(e)[:80]),'yellow')
			continue
		try: os.remove(tmp_file)
		except: pass
	# Fallback: create minimal local file if download fails and file doesn't exist
	if not os.path.exists(oui_csv):
		pprint('*** Using minimal local OUI file','yellow')
		_create_minimal_oui()
	return os.path.exists(oui_csv)

def _create_minimal_oui():
	'''Create minimal OUI file with common vendors as fallback.'''
	minimal = '''# MAC Prefix,Vendor
001E90,Intel Corporate
001B21,Intel Corporate
001517,Intel Corporate
000CF1,Intel Corporate
000E0C,Intel Corporate
0050F1,Intel Corporate
008CFA,Intel Corporate
009027,Intel Corporate
00A0C9,Intel Corporate
00D0B7,Intel Corporate
00E018,Intel Corporate
08002B,Intel Corporate
0C8BFD,Intel Corporate
100BA9,Intel Corporate
104A7D,Intel Corporate
1077B0,Intel Corporate
109836,Intel Corporate
109ADD,Intel Corporate
10A5D0,Intel Corporate
10B36F,Intel Corporate
10C37B,Intel Corporate
10C6B3,Intel Corporate
10DDB1,Intel Corporate
10E7C6,Intel Corporate
10F005,Intel Corporate
140C76,Intel Corporate
145645,Intel Corporate
1458D0,Intel Corporate
146B72,Intel Corporate
149877,Intel Corporate
1499E2,Intel Corporate
14A364,Intel Corporate
14ABB0,Intel Corporate
14B31F,Intel Corporate
14C21D,Intel Corporate
14D64D,Intel Corporate
14F6D8,Intel Corporate
180373,Intel Corporate
183DA2,Intel Corporate
185E0F,Intel Corporate
186590,Intel Corporate
18A99B,Intel Corporate
18FF0F,Intel Corporate
1C1B0D,Intel Corporate
1C4BD6,Intel Corporate
1C5CF2,Intel Corporate
1C7508,Intel Corporate
1C77F6,Intel Corporate
1C7EE5,Intel Corporate
1C872C,Intel Corporate
1CBFCE,Intel Corporate
1CC10C,Intel Corporate
1CC1DE,Intel Corporate
201C93,Intel Corporate
20689D,Intel Corporate
20A680,Intel Corporate
20C6EB,Intel Corporate
247703,Intel Corporate
24B657,Intel Corporate
24D437,Intel Corporate
24FD52,Intel Corporate
2816AD,Intel Corporate
28B2BD,Intel Corporate
28C68E,Intel Corporate
28D244,Intel Corporate
28E14C,Intel Corporate
28E347,Intel Corporate
28E794,Intel Corporate
2C27D7,Intel Corporate
2C3ECF,Intel Corporate
2C6E85,Intel Corporate
2C768A,Intel Corporate
2CF0EE,Intel Corporate
2CFDA1,Intel Corporate
302432,Intel Corporate
303A64,Intel Corporate
30E37A,Intel Corporate
340286,Intel Corporate
3413E8,Intel Corporate
342EB6,Intel Corporate
346AC2,Intel Corporate
348446,Intel Corporate
34865D,Intel Corporate
348F27,Intel Corporate
3497F6,Intel Corporate
349B5B,Intel Corporate
34A395,Intel Corporate
34C059,Intel Corporate
34C731,Intel Corporate
34C9F0,Intel Corporate
34DE1A,Intel Corporate
34E6AD,Intel Corporate
34F39A,Intel Corporate
34F64B,Intel Corporate
380A94,Intel Corporate
384FF0,Intel Corporate
3859F8,Intel Corporate
3859F9,Intel Corporate
388B59,Intel Corporate
38A4ED,Intel Corporate
38DEAD,Intel Corporate
3C22FB,Intel Corporate
3C58C2,Intel Corporate
3C6AA7,Intel Corporate
3C77E6,Intel Corporate
3C8CF8,Intel Corporate
3C970E,Intel Corporate
3C9FE1,Intel Corporate
3CA9F4,Intel Corporate
3CB809,Intel Corporate
3CB87A,Intel Corporate
3CD0F8,Intel Corporate
3CE072,Intel Corporate
3CF808,Intel Corporate
3CF862,Intel Corporate
4025C2,Intel Corporate
402FC0,Intel Corporate
40A6B5,Intel Corporate
40A6D5,Intel Corporate
44032C,Intel Corporate
4437E6,Intel Corporate
448500,Intel Corporate
44A7CF,Intel Corporate
44A842,Intel Corporate
44B412,Intel Corporate
44C346,Intel Corporate
44D4E0,Intel Corporate
44F52D,Intel Corporate
484520,Intel Corporate
484D7E,Intel Corporate
4851B7,Intel Corporate
488E42,Intel Corporate
48A472,Intel Corporate
48D224,Intel Corporate
4C3488,Intel Corporate
4C57CA,Intel Corporate
4C79BA,Intel Corporate
4C80BA,Intel Corporate
4C8B30,Intel Corporate
4C8B55,Intel Corporate
4C8BEF,Intel Corporate
4CABF8,Intel Corporate
4CC681,Intel Corporate
4CE173,Intel Corporate
4CEB42,Intel Corporate
501D93,Intel Corporate
502DA2,Intel Corporate
507B9D,Intel Corporate
509A4C,Intel Corporate
50A72B,Intel Corporate
50B363,Intel Corporate
5404A6,Intel Corporate
541379,Intel Corporate
54271E,Intel Corporate
543530,Intel Corporate
549963,Intel Corporate
549F13,Intel Corporate
54A050,Intel Corporate
54B80A,Intel Corporate
54E43A,Intel Corporate
54E6FC,Intel Corporate
58034C,Intel Corporate
581FAA,Intel Corporate
58946B,Intel Corporate
58A0CB,Intel Corporate
58AC78,Intel Corporate
58BDA3,Intel Corporate
58C38B,Intel Corporate
590905,Intel Corporate
593517,Intel Corporate
5949BA,Intel Corporate
5A7066,Intel Corporate
5C3E06,Intel Corporate
5C514F,Intel Corporate
5C5F67,Intel Corporate
5C80B6,Intel Corporate
5C93A2,Intel Corporate
5C9960,Intel Corporate
5CC5D4,Intel Corporate
5CE0C5,Intel Corporate
5CF821,Intel Corporate
6036DD,Intel Corporate
605718,Intel Corporate
606C66,Intel Corporate
609C9F,Intel Corporate
60A44C,Intel Corporate
60A6D1,Intel Corporate
60B185,Intel Corporate
60E327,Intel Corporate
60E6F0,Intel Corporate
60F673,Intel Corporate
64006A,Intel Corporate
6432A8,Intel Corporate
648099,Intel Corporate
64BC58,Intel Corporate
64D4DA,Intel Corporate
64D954,Intel Corporate
6805CA,Intel Corporate
681729,Intel Corporate
685D43,Intel Corporate
689CE2,Intel Corporate
68A0F6,Intel Corporate
68A3C4,Intel Corporate
68EC62,Intel Corporate
68ECC5,Intel Corporate
6C2995,Intel Corporate
6C8814,Intel Corporate
6C94F8,Intel Corporate
6CB311,Intel Corporate
6CB4A7,Intel Corporate
6CC217,Intel Corporate
6CDDBC,Intel Corporate
701CE7,Intel Corporate
7054D2,Intel Corporate
709E29,Intel Corporate
74C99A,Intel Corporate
74D02B,Intel Corporate
74D4DD,Intel Corporate
74E50B,Intel Corporate
74E543,Intel Corporate
78009E,Intel Corporate
780CF0,Intel Corporate
782327,Intel Corporate
783CE3,Intel Corporate
7845C4,Intel Corporate
784B87,Intel Corporate
78929C,Intel Corporate
78FF57,Intel Corporate
7C5CF8,Intel Corporate
7C7A91,Intel Corporate
7C7D41,Intel Corporate
7CCCB8,Intel Corporate
7CCFB1,Intel Corporate
80000B,Intel Corporate
801934,Intel Corporate
803253,Intel Corporate
8086F2,Intel Corporate
809B20,Intel Corporate
80C16E,Intel Corporate
80CE62,Intel Corporate
843A4B,Intel Corporate
84683E,Intel Corporate
847BEB,Intel Corporate
84A6C8,Intel Corporate
84A93E,Intel Corporate
84C5A6,Intel Corporate
88532E,Intel Corporate
88B111,Intel Corporate
88D7BC,Intel Corporate
8C1645,Intel Corporate
8C705A,Intel Corporate
8C8CAA,Intel Corporate
8C8EF2,Intel Corporate
8CA982,Intel Corporate
8CC661,Intel Corporate
8CC8CD,Intel Corporate
8CE26A,Intel Corporate
8CEBAE,Intel Corporate
8CFDF0,Intel Corporate
902E1C,Intel Corporate
9049FA,Intel Corporate
909A4A,Intel Corporate
90E2BA,Intel Corporate
90E6BA,Intel Corporate
94659C,Intel Corporate
94E6F7,Intel Corporate
984FEE,Intel Corporate
98541B,Intel Corporate
985FD3,Intel Corporate
9C4E36,Intel Corporate
9C4EBC,Intel Corporate
9C6B00,Intel Corporate
9CE7BD,Intel Corporate
A0369F,Intel Corporate
A036BC,Intel Corporate
A0481C,Intel Corporate
A088B4,Intel Corporate
A08CF8,Intel Corporate
A08D16,Intel Corporate
A0A8CD,Intel Corporate
A0B3CC,Intel Corporate
A0C589,Intel Corporate
A0D3C1,Intel Corporate
A402B9,Intel Corporate
A434D9,Intel Corporate
A44E31,Intel Corporate
A45D36,Intel Corporate
A45E60,Intel Corporate
A46BB6,Intel Corporate
A47760,Intel Corporate
A47E39,Intel Corporate
A4933F,Intel Corporate
A4998F,Intel Corporate
A4B197,Intel Corporate
A4BADB,Intel Corporate
A4C361,Intel Corporate
A4C494,Intel Corporate
A4DB30,Intel Corporate
A4E31B,Intel Corporate
A4E731,Intel Corporate
A816B2,Intel Corporate
A81758,Intel Corporate
A826D9,Intel Corporate
A85AE0,Intel Corporate
A86BAD,Intel Corporate
A86DA4,Intel Corporate
A8A795,Intel Corporate
A8B57C,Intel Corporate
AA0000,Intel Corporate
AA0001,Intel Corporate
AA0002,Intel Corporate
AA0003,Intel Corporate
AA0004,Intel Corporate
AC2B6E,Intel Corporate
AC2DEB,Intel Corporate
AC5D10,Intel Corporate
AC7289,Intel Corporate
AC7BA1,Intel Corporate
AC87A3,Intel Corporate
ACFDCE,Intel Corporate
B035B5,Intel Corporate
B03EB0,Intel Corporate
B065BD,Intel Corporate
B06EBF,Intel Corporate
B083FE,Intel Corporate
B09575,Intel Corporate
B09FBA,Intel Corporate
B0ACD2,Intel Corporate
B0C090,Intel Corporate
B0C4E7,Intel Corporate
B0C745,Intel Corporate
B0D57F,Intel Corporate
B0DE28,Intel Corporate
B41489,Intel Corporate
B46D83,Intel Corporate
B4B15A,Intel Corporate
B4B676,Intel Corporate
B4D5BD,Intel Corporate
B4D8A9,Intel Corporate
B4E124,Intel Corporate
B4E1EB,Intel Corporate
B4F0AB,Intel Corporate
B80305,Intel Corporate
B808CF,Intel Corporate
B81E94,Intel Corporate
B82A72,Intel Corporate
B83E59,Intel Corporate
B86CE8,Intel Corporate
B88198,Intel Corporate
B88A60,Intel Corporate
B89AED,Intel Corporate
B8A386,Intel Corporate
B8AEED,Intel Corporate
B8B1C7,Intel Corporate
B8B81E,Intel Corporate
B8BF83,Intel Corporate
B8C75D,Intel Corporate
B8CA3A,Intel Corporate
B8E856,Intel Corporate
BC1401,Intel Corporate
BC305B,Intel Corporate
BC307D,Intel Corporate
BC307E,Intel Corporate
BC3D85,Intel Corporate
BC5436,Intel Corporate
BC7737,Intel Corporate
BC775E,Intel Corporate
BC83A7,Intel Corporate
BCA8A6,Intel Corporate
BCC23A,Intel Corporate
BCD713,Intel Corporate
BCD767,Intel Corporate
BE706C,Intel Corporate
BE8272,Intel Corporate
C0335E,Intel Corporate
C03FD5,Intel Corporate
C041F6,Intel Corporate
C06118,Intel Corporate
C08C60,Intel Corporate
C09879,Intel Corporate
C09F40,Intel Corporate
C0A0C7,Intel Corporate
C0B6F9,Intel Corporate
C0C56D,Intel Corporate
C0D9F7,Intel Corporate
C0E422,Intel Corporate
C0F8DA,Intel Corporate
C1106D,Intel Corporate
C1955D,Intel Corporate
C1A578,Intel Corporate
C228B8,Intel Corporate
C27EBC,Intel Corporate
C28B35,Intel Corporate
C297F6,Intel Corporate
C2B6F6,Intel Corporate
C2D747,Intel Corporate
C3055C,Intel Corporate
C3C90F,Intel Corporate
C3D9DB,Intel Corporate
C3E64C,Intel Corporate
C3F49C,Intel Corporate
C417FE,Intel Corporate
C435D9,Intel Corporate
C48508,Intel Corporate
C48E8F,Intel Corporate
C4913A,Intel Corporate
C495A2,Intel Corporate
C49880,Intel Corporate
C49D07,Intel Corporate
C4A559,Intel Corporate
C4B301,Intel Corporate
C4B8B4,Intel Corporate
C4D987,Intel Corporate
C4E93E,Intel Corporate
C4F0EC,Intel Corporate
C4F57C,Intel Corporate
C4FCE4,Intel Corporate
C809A8,Intel Corporate
C81EE7,Intel Corporate
C81F66,Intel Corporate
C82A14,Intel Corporate
C8348E,Intel Corporate
C83D97,Intel Corporate
C87F50,Intel Corporate
C88A9A,Intel Corporate
C89CDC,Intel Corporate
C8A030,Intel Corporate
C8B5B7,Intel Corporate
C8BCE5,Intel Corporate
C8D719,Intel Corporate
C8D9D2,Intel Corporate
C8DF84,Intel Corporate
C8E7D8,Intel Corporate
C8F733,Intel Corporate
C8F750,Intel Corporate
CC3D82,Intel Corporate
CC61E5,Intel Corporate
CC79CF,Intel Corporate
CC7B35,Intel Corporate
CCB0DA,Intel Corporate
CCB182,Intel Corporate
CCB3F4,Intel Corporate
CCB8A3,Intel Corporate
CCB8F1,Intel Corporate
CCD73C,Intel Corporate
CCEF48,Intel Corporate
CCFA66,Intel Corporate
D00525,Intel Corporate
D0131E,Intel Corporate
D03742,Intel Corporate
D03768,Intel Corporate
D0534E,Intel Corporate
D0574C,Intel Corporate
D0577B,Intel Corporate
D05F68,Intel Corporate
D067E5,Intel Corporate
D07E28,Intel Corporate
D083D4,Intel Corporate
D09B05,Intel Corporate
D0A96E,Intel Corporate
D0C5F3,Intel Corporate
D0E782,Intel Corporate
D0F88C,Intel Corporate
D0FF98,Intel Corporate
D40AA9,Intel Corporate
D4258B,Intel Corporate
D45D42,Intel Corporate
D46D6D,Intel Corporate
D46E5C,Intel Corporate
D48564,Intel Corporate
D4AEDB,Intel Corporate
D4BED9,Intel Corporate
D4C9EF,Intel Corporate
D4E33F,Intel Corporate
D4F5EF,Intel Corporate
D8160A,Intel Corporate
D82A7E,Intel Corporate
D83BBF,Intel Corporate
D84710,Intel Corporate
D850E6,Intel Corporate
D8543A,Intel Corporate
D85DE8,Intel Corporate
D88466,Intel Corporate
D8A25E,Intel Corporate
D8B377,Intel Corporate
D8BB2C,Intel Corporate
D8C7C8,Intel Corporate
D8CB8A,Intel Corporate
D8D43C,Intel Corporate
D8E84E,Intel Corporate
D8F2CA,Intel Corporate
D8FC93,Intel Corporate
DC5360,Intel Corporate
DC7144,Intel Corporate
DC7DC4,Intel Corporate
DC8B28,Intel Corporate
DC91BF,Intel Corporate
DCA971,Intel Corporate
DCA983,Intel Corporate
DCC0DB,Intel Corporate
DCD03A,Intel Corporate
DCD255,Intel Corporate
DCD2FC,Intel Corporate
DCD916,Intel Corporate
DCDA4F,Intel Corporate
DCE55B,Intel Corporate
DCE71C,Intel Corporate
DCF858,Intel Corporate
DCFB02,Intel Corporate
E00EDA,Intel Corporate
E02A82,Intel Corporate
E0338E,Intel Corporate
E034E4,Intel Corporate
E03F49,Intel Corporate
E05B70,Intel Corporate
E06267,Intel Corporate
E06CB5,Intel Corporate
E07872,Intel Corporate
E0899D,Intel Corporate
E09467,Intel Corporate
E09D31,Intel Corporate
E0A1D7,Intel Corporate
E0B94D,Intel Corporate
E0C79D,Intel Corporate
E0DB55,Intel Corporate
E0DCD9,Intel Corporate
E0F847,Intel Corporate
E4029B,Intel Corporate
E40612,Intel Corporate
E442A6,Intel Corporate
E454E8,Intel Corporate
E45AA2,Intel Corporate
E470B8,Intel Corporate
E47CF0,Intel Corporate
E49069,Intel Corporate
E4A7A0,Intel Corporate
E4A7FD,Intel Corporate
E4B318,Intel Corporate
E4C722,Intel Corporate
E4D373,Intel Corporate
E4F89C,Intel Corporate
E4FAFD,Intel Corporate
E8039A,Intel Corporate
E82AEA,Intel Corporate
E84E84,Intel Corporate
E84ECE,Intel Corporate
E85B5B,Intel Corporate
E8617E,Intel Corporate
E86D52,Intel Corporate
E86D54,Intel Corporate
E8718D,Intel Corporate
E8825B,Intel Corporate
E88D28,Intel Corporate
E89A8F,Intel Corporate
E89D87,Intel Corporate
E8A4C1,Intel Corporate
E8B1FC,Intel Corporate
E8BE81,Intel Corporate
E8D0FC,Intel Corporate
E8F2E2,Intel Corporate
EC26CA,Intel Corporate
EC3DFD,Intel Corporate
EC55F9,Intel Corporate
EC58EA,Intel Corporate
EC5C69,Intel Corporate
EC7097,Intel Corporate
EC8898,Intel Corporate
EC94D1,Intel Corporate
ECA86B,Intel Corporate
ECADB8,Intel Corporate
ECB1D7,Intel Corporate
ECB5FA,Intel Corporate
ECE1A9,Intel Corporate
ECEBB8,Intel Corporate
ED00D3,Intel Corporate
ED15AD,Intel Corporate
ED1B3C,Intel Corporate
ED4387,Intel Corporate
ED473E,Intel Corporate
ED7463,Intel Corporate
ED9441,Intel Corporate
EDD8CA,Intel Corporate
EDE5E9,Intel Corporate
EE0DCA,Intel Corporate
EE21CD,Intel Corporate
EE3A89,Intel Corporate
EE4453,Intel Corporate
EE5339,Intel Corporate
EE6B91,Intel Corporate
EE7BCD,Intel Corporate
EEB1A3,Intel Corporate
EECD43,Intel Corporate
EED94E,Intel Corporate
EEE145,Intel Corporate
EEE7C0,Intel Corporate
EEF730,Intel Corporate
EF0E1D,Intel Corporate
EF1240,Intel Corporate
EF24F7,Intel Corporate
EF3C9C,Intel Corporate
EF44CD,Intel Corporate
EF60D9,Intel Corporate
EF7BF7,Intel Corporate
EF9DE3,Intel Corporate
EFB619,Intel Corporate
EFC277,Intel Corporate
F00C7F,Intel Corporate
F0421C,Intel Corporate
F05A09,Intel Corporate
F05CD5,Intel Corporate
F07D68,Intel Corporate
F0921C,Intel Corporate
F0B052,Intel Corporate
F0B0E7,Intel Corporate
F0D5BF,Intel Corporate
F0DEB9,Intel Corporate
F0F755,Intel Corporate
F0F7E7,Intel Corporate
F40669,Intel Corporate
F4093C,Intel Corporate
F430B9,Intel Corporate
F44D30,Intel Corporate
F44EE3,Intel Corporate
F46349,Intel Corporate
F470AB,Intel Corporate
F48E38,Intel Corporate
F48E92,Intel Corporate
F4B52F,Intel Corporate
F4B85E,Intel Corporate
F4C114,Intel Corporate
F4DE0C,Intel Corporate
F4E7B3,Intel Corporate
F4ED5F,Intel Corporate
F4F15A,Intel Corporate
F4F26D,Intel Corporate
F4F5A5,Intel Corporate
F4F5DB,Intel Corporate
F4F5E8,Intel Corporate
F81A67,Intel Corporate
F82819,Intel Corporate
F82F5B,Intel Corporate
F84E73,Intel Corporate
F85971,Intel Corporate
F8633F,Intel Corporate
F894C2,Intel Corporate
F89E9E,Intel Corporate
F8A963,Intel Corporate
F8AB05,Intel Corporate
F8B156,Intel Corporate
F8B599,Intel Corporate
F8D0BD,Intel Corporate
F8F1B6,Intel Corporate
F8F21E,Intel Corporate
FC183C,Intel Corporate
FC1D43,Intel Corporate
FC2D5E,Intel Corporate
FC3FDB,Intel Corporate
FC4596,Intel Corporate
FC48EF,Intel Corporate
FC4DD4,Intel Corporate
FC7516,Intel Corporate
FC75E0,Intel Corporate
FC7990,Intel Corporate
FC7F56,Intel Corporate
FC8F90,Intel Corporate
FCAA14,Intel Corporate
FCC23D,Intel Corporate
FCC734,Intel Corporate
FCECDA,Intel Corporate
FCF136,Intel Corporate
FCF8AE,Intel Corporate
FCFC48,Intel Corporate
FCFC62,Intel Corporate
FFFF00,Intel Corporate
'''
	try:
		with open(oui_csv, 'wb') as f:
			f.write(minimal.encode('utf-8'))
	except: pass

# Download OUI on plugin load
download_oui()

def vendor_by_mac(type, jid, nick, text):
	text = text.strip().replace('-','').replace(':','').replace(' ','')[:6].upper()
	if text and len(text) == 6:
		try:
			res = subprocess.Popen(['grep','-i','^%s,' % text,oui_csv],stdout=subprocess.PIPE).communicate()[0]
			if res:
				vendor = res.decode('utf-8','replace').split(',')[1].strip()
				msg = '%s -> %s' % (text, vendor)
			else: msg = L('Not found!','%s/%s'%(jid,nick))
		except: msg = L('Not found!','%s/%s'%(jid,nick))
	else: msg = L('What?','%s/%s'%(jid,nick))
	send_msg(type, jid, nick, msg)

def net_ping(type, jid, nick, text):
	text = text.strip().lower()
	if '.' in text and len(text) > 4 and re.match(r'[-0-9a-z.]+\Z', text, re.U+re.I): msg = deidna(shell_execute('ping -c4 %s' % text,'%s/%s'%(jid,nick)))
	else: msg = L('Smoke help about command!','%s/%s'%(jid,nick))
	send_msg(type, jid, nick, msg)

def get_tld(type, jid, nick, text):
	if len(text) >= 2:
		tld = readfile(tld_list)
		tld = tld.split('\n')
		msg = L('Not found!','%s/%s'%(jid,nick))
		for tl in tld:
			if tl.split('\t')[0].lower()==text.lower():
				msg = '.'+tl.replace('\t',' - ',1).replace('\t','\n')
				break
	else: msg = L('What do you want to find?','%s/%s'%(jid,nick))
	send_msg(type, jid, nick, msg)

def is_valid_ip(ipstr):
        try: socket.inet_pton(socket.AF_INET, ipstr)
        except:
                try: socket.inet_pton(socket.AF_INET6, ipstr)
                except: return False
        return True

def get_dns(type, jid, nick, text):
	if is_valid_ip(text):
		try: msg = socket.gethostbyaddr(text)[0]
		except: msg = L('I can\'t resolve it','%s/%s'%(jid,nick))
	else:
		try:
			ans = socket.getaddrinfo(text, None, 0, 0, socket.IPPROTO_TCP)
			msg = text+' - '
			for an in ans:
                                msg += an[4][0] + ' | '
			msg = msg[:-2]
		except: msg = L('I can\'t resolve it','%s/%s'%(jid,nick))
	send_msg(type, jid, nick, msg)

def srv_nslookup(type, jid, nick, text):
	srv_raw_check(type, jid, nick, 'nslookup '+text)

def srv_dig(type, jid, nick, text):
	srv_raw_check(type, jid, nick, 'dig '+text)

def srv_host(type, jid, nick, text):
	srv_raw_check(type, jid, nick, 'host '+text)

def srv_raw_check(type, jid, nick, text):
	text = enidna_raw(text)
	text = ''.join(re.findall(u'[-a-z0-9\.\_\?\#\=\@\%\ \+]+',text,re.S|re.I)[0])
	send_msg(type, jid, nick, deidna(shell_execute(text,'%s/%s'%(jid,nick))))

def chkserver(type, jid, nick, text):
	for a in ':;&/|\\\n\t\r': text = text.replace(a,' ')
	t = re.findall(u'[-a-zа-я0-9._?#=@%]+',text,re.S|re.I|re.U)
	if len(t) >= 2:
		port = []
		for a in t:
			if a.isdigit(): port.append(a)
		for a in port: t.remove(a)
		if len(t)==1 and len(port)>=1:
			t = t[0]
			port.sort()
			msg = shell_execute('nmap %s -p%s -P0 -T5' % (t,','.join(port)),'%s/%s'%(jid,nick))
			try: msg = '%s\n%s' % (t,reduce_spaces_all(re.findall('SERVICE(.*)Nmap',msg,re.S|re.U)[0][1:-2]))
			except:
				try:
					msg = ''
					for a in port:
						sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
						try:
							sock.connect((t,int(a)))
							s = L('on','%s/%s'%(jid,nick))
						except: s = L('off','%s/%s'%(jid,nick))
						msg += '\n%s %s' % (a,s)
						sock.close()
					msg = '%s%s' % (t,msg)
				except: msg = '%s - %s' % (t,L('unknown','%s/%s'%(jid,nick)))
			msg = L('Port status at %s','%s/%s'%(jid,nick)) % msg
		else: msg = L('What?','%s/%s'%(jid,nick))
	else: msg = L('What?','%s/%s'%(jid,nick))
	send_msg(type, jid, nick, msg)

global execute

execute = [(6, 'nslookup', srv_nslookup, 2, 'Command nslookup'),
		   (6, 'host', srv_host, 2, 'Command host'),
		   (6, 'dig', srv_dig, 2, 'Command dig'),
		   (4, 'port', chkserver, 2, 'Check port activity\nport server port1 [port2 ...]'),
		   (4, 'net_ping', net_ping, 2, 'Net Ping.\nnet_ping ip|domain'),
		   (3, 'dns', get_dns, 2, 'DNS resolver.'),
		   (3, 'tld', get_tld, 2, 'Search domain zones TLD.'),
		   (3, 'mac', vendor_by_mac, 2, 'Show vendor of device by mac')]
