说明:
所有设备开机后,IP地址均会被平台以SNMP的方式发现并记录入库。
环境没有DHCP,用户自己配置IP地址上网,需要检测下哪些IP地址没有人使用。
问题的一个难点在于,这个IP已经分配给了别人,但是这个人刚好没有开机,那么怎么判断这个IP是否已经有人用了呢。
恰好平台会有相对所有设备的IP,故基于查询数据库IP信息,进行对比。
另一个难点是用户的电脑可能是单个网卡或IP,也可能是多个网卡或多个IP,其实严格来讲或许并不很严谨。
思路:1.获取本地电脑的名子,所有的IP地址。
2.将本地的IP地址和电脑名组成字典。
3.从数据库获取每个IP相同网段的IP地址,这里现场刚好使用的C段比较好实现。
4.用本地的每个IP的前3位生成254个IP地址,然后把查询出来已经使用的这个段的IP地址排除掉,剩下的展示给用户,让他从中选一个自己用。
5.如果用户的IP地址在数据库中查询不到,那么就只显示下本地电脑名子和所有的IPv4的地址。
嗯嗯,就这样子先。不在现场远程模拟现场环境;
参考和复制了部分网络的代码,如果您希望我删掉,请告诉我。不想重复造轮子,我不会,也不想。
代码如下:
我得把数据库的名子注释掉,用的python+postgresql+ psycopg2
ps:这个网站的编辑格式,我没整习惯,也暂时不想整习惯,格式如果变化了,请理解。
import psycopg2
import socket
import random
import sys
def get_local_ip_list():
local_ip_lists = []#获取电脑本地所有IPv4地址
#========================================================
# 查看当前主机名
print('当前主机名称为 : ' + socket.gethostname())
c_hostname = socket.gethostname()
# 下方代码为获取当前主机IPV4 和IPV6的所有IP地址(所有系统均通用)
addrs = socket.getaddrinfo(socket.gethostname(),None)
print('当前主机所有的IPv4地址:' )
for ipinfo in addrs:
if ':' not in ipinfo[4][0]:
print(ipinfo[4][0])
local_ip_lists.append(ipinfo[4][0])
return local_ip_lists检查到服务器的网络通不通
def try_connect_server(cip,ip, port):
#server port and ip
server_ip = ip
servr_port = port
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
l_port = random.randint(65000, 65530)
try:
#如果可以连接到服务器,那么我就去检查这个IP是否已经被使用
tcp_client.bind((cip,l_port))
tcp_client.connect((server_ip, servr_port))
tcp_client.shutdown(2)
return True
except :
#如果连建不到服务器,那么我们不做什么
return Falsedef get_data(database_info,sql):
conn = psycopg2.connect(database=database_info["database"],
user=database_info["user"],
password=database_info["password"],
host=database_info["host"],
port=database_info["port"])
cur = conn.cursor()
try:
cur.execute(sql)
#获取表的所有字段名称
coloumns = [row[0] for row in cur.description]
result = [[str(item) for item in row] for row in cur.fetchall()]
return [dict(zip(coloumns, row)) for row in result]
except Exception as ex:
print(ex)
finally:
conn.close()数据库连接信息
def format_data():
return_ip_list = []
all_used_ip = []
sql="select strdevip,strdevname from tbl_devbaseinfo"
data=get_data(database_info,sql)
return data
# for item in data:
# return_ip_list.append(item)# for ipp in return_ip_list:
# ippused =ipp['strdevip']
# print(ippused)
# all_used_ip.append(ippused)
# return all_used_ipdef ganarater_local_ips(ipaddr):
top3 = ipaddr.split('.')
c_ips = []
for lastipnum in range(1,255):
sip = top3[0] + '.' + top3[1] + '.' + top3[2] + '.' + str(lastipnum)
c_ips.append(sip)
# return_ip_list = []
all_used_ip = []
sql="select strdevip from tbl_devbaseinfo where strdevip like '" + top3[0] + '.' + top3[1] + '.' + top3[2] + ".%'"
data=get_data(database_info,sql)
for temp_used_ip in data:
all_used_ip.append(temp_used_ip['strdevip'])
not_used_ips = []
for temp_ip in c_ips:
if temp_ip not in all_used_ip:
not_used_ips.append(temp_ip)
return not_used_ipsif name == 'main':
"""
整体思路:
1.先获取电脑所有的IPv4地址
2.测试到服务器的连通性,如果到服务器的链路是通的,则下一步和已分配的IP地址做对比,如果到服务器不通,则不做处理
3.如果IP地址存在数据库中,则提示IP地址已经被使用,然后查询同网段已经使用的IP地址,将可使用的IP地址打印显示出来
4.如果IP地址不在数据库中,则不做任何提示,
"""
database_info={
"database":"数据库名子",
"user":"用户名",
"password":"数据库密码",
"host":"192.168.136.128",
"port":"5432"
}
#server_ip = '192.168.30.112'
server_ip = 'www.baidu.com'
#获取到本地IPv4地址并显示
local_ips = get_local_ip_list() #本地IPv4地址
local_ips2 = [] #可以连接到服务器的IP地址
local_hostname = socket.gethostname()#测试每个IP地址到服务器的联通性
for ip in local_ips:
if try_connect_server(ip,server_ip,80):
local_ips2.append(ip)
if len(local_ips2) == 0 :
print("您的本地IP均无法连接到服务器,请检查网络故障!")
sys.exit()
#用可以连通服务器的每个IP地址去数据库中查询,是否已经有人使用
used_ip_lists = format_data() #获取数据库中所有的IP地址和电脑名称
#print(used_ip_lists)
local_machine_name = {}
local_used_ips = []
for ip in local_ips:
local_machine_name['strdevip'] = ip
local_machine_name['strdevname'] = socket.gethostname()
#print(local_machine_name)
# if local_machine_name in used_ip_lists and local_machine_name['strdevname'] != used_ip_lists['strdevname']:
# print("您当前使用的IP地址已经被这台电脑 " + used_ip_lists['strdevname'] + " 电脑使用,请更换下面未被使用的IP地址中的一个")
for used_ip_info in used_ip_lists:
if local_machine_name['strdevip'] == used_ip_info['strdevip'] and local_machine_name['strdevname'] != used_ip_info['strdevname']:
local_used_ips.append(local_machine_name['strdevip'])
print("您当前使用的IP地址" + local_machine_name['strdevip'] +"已经被这台电脑 " + used_ip_info['strdevname'] + " 电脑使用,请更换下面未被使用的IP地址中的一个")
if local_machine_name['strdevip'] == used_ip_info['strdevip'] and local_machine_name['strdevname'] != used_ip_info['strdevname']:
#此处用当前的可以连接到服务器的IP地址,生成整个c段的地址,然后把数据库里符合这个c段的地址全部排除掉
for local_ip_used in local_used_ips:
local_c_ips = ganarater_local_ips(local_machine_name['strdevip'])
print(local_c_ips)