Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) zveřejnil Národní politiku koordinovaného zveřejňování zranitelností (pdf), jejímž cílem je nejen zvyšování bezpečnosti produktů informačních a komunikačních technologií (ICT), ale také ochrana objevitelů zranitelností před negativními právními dopady. Součástí je rovněž vytvoření „koordinátora pro účely CVD“, jímž je podle nového zákona o kybernetické … více »
Vývojáři KDE oznámili vydání balíku aplikací KDE Gear 25.12. Přehled novinek i s náhledy a videi v oficiálním oznámení.
Společnost System76 vydala Pop!_OS 24.04 LTS s desktopovým prostředím COSMIC. Videoukázky na YouTube.
Byla vydána verze 1.92.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.
Free Software Foundation zveřejnila ocenění Free Software Awards za rok 2024. Oceněni byli Andy Wingo, jeden ze správců GNU Guile, Alx Sa za příspěvky do Gimpu a Govdirectory jako společensky prospěšný projekt.
Bylo vydáno Eclipse IDE 2025-12 aneb Eclipse 4.38. Představení novinek tohoto integrovaného vývojového prostředí také na YouTube.
U příležitosti oslav osmi let prací na debianím balíčku vyšlo GPXSee 15.6. Nová verze přináší především podporu pro geotagované MP4 soubory, včetně GoPro videí. Kdo nechce čekat, až nová verze dorazí do jeho distribuce, nalezne zdrojové kódy na GitHubu.
Monado, tj. multiplatformní open source implementace standardu OpenXR specifikujícího přístup k platformám a zařízením pro XR, tj. platformám a zařízením pro virtuální realitu (VR) a rozšířenou realitu (AR), bylo vydáno ve verzi 25.1.0. Přehled novinek v poznámkách k vydání.
Byla vydána listopadová aktualizace aneb nová verze 1.107 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.107 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Pornhub zveřejnil podrobné statistiky za rok 2025. V části věnované zařízením a technologiím se lze dočíst, že 87 % přenášených dat směrovalo na telefony, 2 % na tablety a 11 % na desktopy. Operační systém Linux běžel na 6,3 % desktopů. O 22,4 % více než před rokem. Firefox má na desktopu 8,4 % podíl.
PRD, PDDI, STATUS
192.168.0.25, somestring, REGISTRATION SUCCESSFUL
our.domain.de, somestring, REGISTRATION FAILED
S takovýmhle polem bych už si pak snad dokázal poradit a napsat plugin, který by pro každý SIP Trunk vyhodnotil jeho stav a vrátil tuto hodnotu check_mk. Bohužel by mi to samotnému trvalo dost dlouho.
Dokázal by mně někdo nasměrovat k elegantnímu řešení? Díky!
https://192.168.3.200/services/webapp/monitor/sip_i.php?sip_i=regstatus
A tahá to jen několik js souborů:
sip_i.js
jquery.js
bootstrap.min.js
sorttable.js
jquery.quicksearch.js
Nás nejspíš zajímá sip_i.js:
var dataTable;
function init()
{
dataTable = document.getElementById("datatable");
var aCheckBoxes = document.getElementsByName("checkboxes");
dataTable.CheckBoxes = aCheckBoxes;
}
function selectAllRows(x)
{
var aCheckBoxes = dataTable.CheckBoxes;
var bChecked = false;
if(x.id == 'clearall' || x.id == 'checkall')
{
bChecked = (x.id == 'clearall') ? false : true;
}
var aRows = dataTable.tBodies[0].rows;
// nRows is the index of the last checkbox
// warning : remove the title line
var nRows = aRows.length-2;
for(var i=nRows;i>=0;i--)
{
aCheckBoxes[i].checked = bChecked;
}
}
function deleteSelected()
{
var aRows = dataTable.tBodies[0].rows;
var nRows = aRows.length-2;
var parm="";
var aCheckBoxes = dataTable.CheckBoxes;
for(var i=nRows;i>=0;i--)
{
if (aCheckBoxes[i].checked)
{
if (parm != "")
parm+=" "
parm+=aCheckBoxes[i].value;
}
}
document.getElementById("theParam").value = parm ;
document.getElementById("theForm").submit();
}
Já z toho bohužel nedokážu na první pohled vyčíst, jestli tam nějaké použitelné api je.
dataTable = document.getElementById("datatable");
Upravil jsem soubor sip_i.js, tak, že v něm zbylo pouze toto:
var dataTable;
function init()
{
dataTable = document.getElementById("datatable");
}
Uložil vše do overrides a stránka se posléze načetla v podstatě normálně a zobrazila i tabulku s informaci o SIP Trunku.
nóóóóóó vygenerovaná ne :O :O ;D ten řádeček kódu dělá že se v html dokumentu najde element co má parametr id nastavenej na 'datatable' a tan se uloží do proměný dataTable ;D
zisti z kterýho html souboru seto volá a tam si najdi tu tabluku a tu asi jako možná pude parsovat pythonem :O ;D
Díky, svatá Gréto! :) Jediný element s nějakým parametrem id je tento:
ífrejm width="100%" frameborder="0" src="./blank.html" name="content" id="content" onload="javascript:resizeIframe(this);"> ífrejm
A to bohužel není to co bysme potřebovali. Pak už jsem tam našel jen dvě tabulky s class="dataTable, ale to mi taky nepomůže. Kód stránky po načtení vypadá takto:
https://pastebin.com/X89nPLzy
Vidím tam, že se načte skript:
SRC="./js/sip_i.js"
A o kus níže se zavolá funkce init() z tohohle skriptu:
init();
Díky!
hhhmmmmm celý je to takový divný :O :'( to je celej ten sip_i.js co sems dával?? tam seasi jako jenom nějak čaruje s checkboxama :'( fakt ty data nenačítá nějakej php skript strčenej v místě tý tabulky v tom html dokumentu?? jestli mužeš tak sem hoď jak ten dokument z pastebin vypadá bez zapnutýho js třeba staženej wgetem
ještě sem dej možná tamto sorttable.js třeba to nedělá jenom řazení nevim
podezírám podobně pomenovanej skript sip_i.php že se někde asi bude volat ale jako hádám :'(
https://192.168.2.100/services/webapp/monitor/sip_i.php?sip_i=regstatus/
Tak dostanu stránku bez tabulky SIP Trunků. A tuhle chybu jsem přesně udělal v mám pythoním skriptu.
Pokud zmíněnou url zavolám bez lomítka na konci, tami mi curl, wget i python vrátí stránku s tabulkou. Takže celá hypotéza s javascriptem byla mylná. sigh
Tím se ovšem dostáváme k původní otázce, jak příslušnou tabulku, která může mít teoreticky neomezený počet řádek, rozsekat v pythonu do nějakého použitelného tvaru. Prakticky těch řádek moc nebude.
fakt si to jako dobře nakopíroval ten html kód?? tam tabulka neni uzavřená :O :O
todleto by ti mohlo fungovat i tak ;D
from bs4 import BeautifulSoup
import urllib3
http = urllib3.PoolManager()
url = 'https://192.168.2.100/services/webapp/monitor/sip_i.php?sip_i=regstatus'
response = http.request('GET', url)
soup = BeautifulSoup(response.data,"html.parser")
counter=0
#maj tam chybu tag table neni uzavřenej a nemužeme rozumě skákat po tabulkách fakt si to dobře nakopíroval?? :O :O
#proto sem šáhla po těch 'td'
counter=0
PRD="" # :D :D :D :D
PDDI=""
STATUS=""
rows=[]
#pro všechny td tagy v html až jako na ten poslední
#poslední je nějaká kravinka
for td in soup.find_all("td")[:-1]:
if counter==0:
PRD=td.find('b').text.split('-')[1].strip()
counter+=1
elif counter==1:
if not "Public DDI" in td.text:
raise IndexError('sem jako cekala na indexu 1 hodnotu Public DDI a mam tam '+td.text+'!!!! :O :O')
counter+=1
elif counter==2:
if not "STATUS" in td.text:
raise IndexError('sem jako cekala na indexu 2 hodnotu STATUS a mam tam '+td.text+'!!!! :O :O')
counter+=1
elif counter==3:
PDDI=td.text
counter+=1
elif counter==4:
STATUS=td.text.strip()
#udělali jsme kolečko jedný tabulky uložíme řádek napotom
counter=0
rows.append({'PRD': PRD,'PDDI': PDDI,'STATUS': STATUS})
else:
raise IndexError('jako neco je hoooooooooooooooodne spatne protoze index neni v intervalu 0-4!!!! :O :O')
for row in rows:
print("PRD: {PRD} PDDI: {PDDI} STATUS: {STATUS}".format(**row))
Tak po pár menší úpravách mi to funguje. Bylo potřeba přidat autentizaci a ignorovat chybu certifikátu. A split v prvním td bylo potřeba udělat pomocí mezery, protože string za pomlčkou může pomlčku obsahovat:
#!/usr/bin/env python3
# importing the libraries
import requests
from urllib3.exceptions import InsecureRequestWarning
from bs4 import BeautifulSoup
# Suppress only the single warning from urllib3 needed.
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
# Define variables
url = "https://192.168.2.100/services/webapp/monitor/sip_i.php?sip_i=regstatus"
user = 'user'
passwd = 'secret'
# Make a GET request to fetch the raw HTML content
response = requests.get(url, auth=(user, passwd), verify=False)
# Parse the html content
soup = BeautifulSoup(response.text, "html.parser")
counter=0
counter=0
PRD=""
PDDI=""
STATUS=""
rows=[]
for td in soup.find_all("td")[:-1]:
if counter==0:
PRD=td.find('b').text.split(' ')[4].strip()
counter+=1
elif counter==1:
if not "Public DDI" in td.text:
raise IndexError('Expected value "Public DDI" but got '+td.text+'')
counter+=1
elif counter==2:
if not "STATUS" in td.text:
raise IndexError('Expected value "STATUS" but got '+td.text+'')
counter+=1
elif counter==3:
PDDI=td.text
counter+=1
elif counter==4:
STATUS=td.text.strip()
# First table is ready. We save the row for next time.
counter=0
rows.append({'PRD': PRD,'PDDI': PDDI,'STATUS': STATUS})
else:
raise IndexError('Critical Error. Index is not within interval 0-4')
for row in rows:
print("PRD: {PRD} PDDI: {PDDI} STATUS: {STATUS}".format(**row))
Teď z toho ještě zbastlit check pro check_mk, ale s tim už si nějak poradim.
Díky všem.
mužeš udělat split jenom prvním výskytem znaku/stringu uplně jednoduše takhle text.split('-',1)
taky je dobrý nedělat takovýdle krkolomný jednořádkový šílenosti jakože td.find('b').text.split('-',1)[1].strip()protože každej z těch kroků muže selhat třeba to jako nenajde tag b a vrátí to None b nemusí mit text za pomlčkou už nic nemusí bejt a tak. lepšejší je to mit rozdělený na jednotlivý kroky a ty případný chyby hlídat jim moc nevěřim když neuměj ani uzavřit tabulku :O ;D joa že tam je proměná counter dvakrát to je samo že navíc stačí ho mit jenom jednou ;D
nóóó sem trošku čuňačila aby to jako bylo rychle hotový :O :O :D ;D
OXO Connect Rel. 3.2
cpu name: PowerCPU
Software: ONEDE032/039.001
Linux kernel: Linux version 2.6.29.6-rt23-030.001
O licencích jsem nic nenašel.
Nějaké API to určitě má, zkusim něco najít na jejich business portálu.
Bohužel moje dosavadní zkušenost s alcatelem by se dala popsat tak, že obchodní oddělení je mnohem lepší než oddělení vývoje. Můj čistě osobní dojem z jejich produktů je, že to je nepřehledný nepořádek.
#!/usr/bin/env python3
# importing the libraries
import sys, getopt
import requests
import re
from urllib3.exceptions import InsecureRequestWarning
from bs4 import BeautifulSoup
# Suppress only the single warning from urllib3 needed.
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
#def main (argv):
url = ''
user = ''
passwd = ''
hostname = ''
prd = ''
# Get full command-line arguments
full_cmd_arguments = sys.argv
# Keep all but the first
argument_list = full_cmd_arguments[1:]
short_options = "hu:p:H:P:"
long_options = ["username=","password=","hostname=","publicregistrationdomain"]
def usage():
print('check-sip-trunk.py -u <username> -p <password> -H <hostname> -P <publicregistrationdomain>')
try:
arguments, values = getopt.getopt(argument_list, short_options, long_options)
except getopt.GetoptError as err:
print (str(err))
usage()
sys.exit(2)
if not arguments:
usage()
sys.exit(2)
for opt, arg in arguments:
if opt == '-h':
usage()
sys.exit()
elif opt in ("-u", "--username"):
user = arg
elif opt in ("-p", "--password"):
passwd = arg
elif opt in ("-H", "--hostname"):
hostname = arg
url = f"https://{hostname}/services/webapp/monitor/sip_i.php?sip_i=regstatus"
elif opt in ("-P", "--publicregistrationdomain"):
prd = arg
# Make a GET request to fetch the raw HTML content
response = requests.get(url, auth=(user, passwd), verify=False)
# Parse the html content
soup = BeautifulSoup(response.text, "lxml")
counter=0
PRD=""
PDDI=""
STATUS=""
rows=[]
for td in soup.find_all("td")[:-1]:
if counter==0:
PRD=td.find('b')
if PRD is not None:
PRD=PRD.text.split('-',1)[1].strip()
counter+=1
else:
raise IndexError('Tag containing Public Registration Domain not found')
elif counter==1:
if not "Public DDI" in td.text:
raise IndexError('Expected value "Public DDI" but got '+td.text+'')
counter+=1
elif counter==2:
if not "STATUS" in td.text:
raise IndexError('Expected value "STATUS" but got '+td.text+'')
counter+=1
elif counter==3:
PDDI=td.text
counter+=1
elif counter==4:
STATUS=td.text.strip()
counter=0
if STATUS=="REGISTRATION SUCCESSFUL":
trunkstatus = "0 SIP-TRUNK - OK: Public Registration Domain - "+PRD+", Public DDI - "+PDDI+", Status - "+STATUS
rows.append(trunkstatus)
elif STATUS=="REGISTRATION FAILED":
trunkstatus = "2 SIP-TRUNK - CRITICAL: Public Registration Domain - "+PRD+", Public DDI - "+PDDI+", Status - "+STATUS
rows.append(trunkstatus)
else:
trunkstatus = "3 SIP-TRUNK - UNKNOWN: Public Registration Domain - "+PRD+", Public DDI - "+PDDI+", Status - "+STATUS
rows.append(trunkstatus)
else:
raise IndexError('Critical Error. Index is not within interval 0-4')
for item in rows:
if re.search(rf"\b{prd}\b",item):
print(item)
sys.exit()
else:
print("Public Registration Domain \""+prd+"\" does not exist.")
sys.exit(2)
Tiskni
Sdílej: