Архив рубрики: python

Массовый откат прошивок unifi /unifi multiple controller downgrade

Давно не писал, всем привет. работы много.

задача…. 200+ контроллеров unify. Откатить прошивку на всех точках. всех сайтах

быстрописано. можно красивее, но задача стояла оперативно решить проблему. потом улучшать будем. не придираемся. закомментил строки которые ставил для других задач.

import ssl
import sys
#sys.stdout = open(‘/var/www/html/index.html’, ‘w’)
from unificontrol import UnifiClient
from prettytable import PrettyTable
from datetime import timedelta
import json
import re
import logging
#logging.basicConfig(level=logging.DEBUG)

 

#print (‘<!DOCTYPE html><html><head><meta charset=»utf-8″><title>Тег META, атрибут charset</title></head> <body> ‘);

username = ‘CONTROLLER_USER’
password = ‘CONTROLLER_PASSWORD’
sitename = ‘6h2g5wq1′ # имя сайта для отката. чтобы на всех сделать — делаем правки небольшие

def get_sites(host,username,password):
client = UnifiClient(host = host, port = «8443», username = username, password = password,site=’default’)
sites = client.list_sites()
#print (sites)
return sites,host

def get_wlanconf(host,sites,wlanconf_id,username,password):
client = UnifiClient(host = host, port = «8443», username = username, password = password,site=sites)
wlan = client.list_wlanconf(wlanconf_id)
print(» wlan-debug» + str(wlan))

if «networkconf_id» in wlan[0]:
networkconf= client.list_wlanconf(wlan[0][‘_id’])
else:
networkconf = ‘———-‘
print(» netconf-debug» + str(networkconf))
return wlan,networkconf

def manual_update(host,sites,username,password,mac,fw):
client = UnifiClient(host = host, port = «8443», username = username, password = password,site=sites)
upd=client.upgrade_device_external(mac, fw)
print(» wlan-debug» + str(upd))

 

def get_devices_from_sites(host,sites,sites_descr,username,password):
client = UnifiClient(host = host, port = «8443», username = username, password = password,site=sites)
#devs = client.list_devices_basic()
#print (devs)
devs2 = client.list_devices()
#print (» DEVS2-debug» + str(devs2))
#wlan=client.list_wlanconf()
#wlan_groups=client.list_wlan_groups()

#print (» wlan-groups-debug» + str(wlan_groups))
return devs2,host,sites,sites_descr

controllers = [«172.16.7.3», «172.16.7.4», «172.16.7.5», «172.16.7.6»,»172.16.7.7″,»172.16.7.8″,»172.16.7.9″,»172.16.7.254″]

for i in range(len(controllers)):
print(«<h1> Контроллер: » + controllers[i] + «</h1>»)
sites,host_1=get_sites(controllers[i],username,password)
for elem_sites in sites:
print («<h2> Сайт:» + elem_sites[‘desc’] +» (name: «+ elem_sites[‘name’] + » id: » + elem_sites[‘_id’] + «) controller: «+ controllers[i]+»</h2>»)
devs, host, sites,sites_descr = get_devices_from_sites(host_1,elem_sites[‘name’],elem_sites[‘desc’], username, password)

t = PrettyTable([‘mac’,’ip’, ‘state’,’model’,’board_rev’,’version’,’name’,’essid’,’sites’,’sites_name’,’controller’,’act_upd’])
if len(devs) > 0:
for elem_sites_dev in devs:
if «name» in elem_sites_dev:
Name = elem_sites_dev[‘name’]
else:
Name=»—»
act_upd=»NO»
if «board_rev» in elem_sites_dev:
board_rev = elem_sites_dev[‘board_rev’]
else:
board_rev=»—»

if sites == sitename and elem_sites_dev[‘model’]==»U7LT» and elem_sites_dev[‘state’]==1: #тут условие какие точки обновлять. для примера обновляем точки UAP-AP-AC-LITE (допилить)
act_upd=»yes»
manual_update(host,sites,username,password,elem_sites_dev[‘mac’],»http://firmware_url/lite.4.3.28.bin»)
else:
act_upd=»NO»

if «vap_table» in elem_sites_dev:
essid=»»
vap_table=(elem_sites_dev[‘vap_table’])
for elem_sites_vap in vap_table:
wlanconf_id=elem_sites_vap[‘wlanconf_id’]
#wlan,networkconf=get_wlanconf(host,sites,wlanconf_id,username,password)
essid += elem_sites_vap[‘essid’] + » <br> »
else:
essid=»—»

t.add_row([elem_sites_dev[‘mac’],elem_sites_dev[‘ip’], str(elem_sites_dev[‘state’]),elem_sites_dev[‘model’],board_rev,elem_sites_dev[‘version’],Name,essid,sites,sites_descr,host,act_upd])
print(t) # вывод в таблицу html можно сделать погуглив по python prettytable html. одна строка t.XXX_XXXX_XXX.  не расслабляемся, ищем сами. все другие строки закомменченые относятся к данному моменту
else:
print («<i>Empty devs in this site</i>»)
#print (‘</body></html>’);
#sys.stdout.close()

кавычки чутка съехали. обычные двойные кавычки.

пишу как всегда для себя. чтобы не забыть

вывод df -h в pdf


#!/usr/bin/python
import subprocess
import datetime
 
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
 
def disk_report():
   p=subprocess.Popen("df -h", shell=True,stdout=subprocess.PIPE)
   #записываем вывод df -h
   return p.stdout.readlines()

def create_pdf(input,output="disk_rep.pdf"):
   #создаем pdf, записываем дату
   now=datetime.datetime.today()
   date=now.strftime("%h %d %Y %H:%M:%S")
   c=canvas.Canvas(output)
   textobj=c.beginText()
   textobj.setTextOrigin(inch,11*inch)
   textobj.textLines('''
   Disk Capacity Report: %s ''' % date)
   for line in input:
     textobj.textLine(line.strip())
   c.drawText(textobj)
   c.showPage()
   c.save()
report=disk_report() #записываем вывод в переменную
create_pdf(report)