Byl vydán Debian 13.5, tj. pátá opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.14, tj. čtrnáctá opravná verze Debianu 12 s kódovým názvem Bookworm. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
CiviCRM (Wikipedie) bylo vydáno v nové verzi 6.14.0. Podrobnosti o nových funkcích a opravách najdete na release stránce. CiviCRM je robustní open-source CRM systém navržený speciálně pro neziskové organizace, spolky a občanské iniciativy. Projekt je napsán v jazyce PHP a licencován pod GNU Affero General Public License (AGPLv3). Český překlad má nyní 45 % přeložených řetězců a přibližuje se milníku 50 %. Potřebujeme vaši pomoc, abychom se dostali dál. Pokud máte chuť přispět překladem nebo korekturou, přidejte se na platformu Transifex.
Další lokální zranitelností Linuxu je ssh-keysign-pwn. Uživatel si může přečíst obsah souborů, ke kterým má právo ke čtení pouze root, například soubory s SSH klíči nebo /etc/shadow. V upstreamu již opraveno [oss-security mailing list].
Singularity (YouTube) je nejnovější otevřený film od Blender Studia. Jedná se o jejich první 4K HDR film.
Vyšla hra Život Není Krásný: Poslední Exekuce (Steam, ProtonDB). Kreslená point & click adventura ze staré školy plná černého humoru a nekorektního násilí. Vžijte se do role zpustlého exekutora Vladimíra Brehowského a projděte s ním jeho poslední pracovní den. Hra volně navazuje na sérii Život Není Krásný.
Společnost Red Hat představila Fedora Hummingbird, tj. linuxovou distribuci s nativním kontejnerovým designem určenou pro vývojáře využívající AI agenty.
Hru The Legend of Zelda: Twilight Princess od společnosti Nintendo si lze nově díky projektu Dusklight (původně Dusk) a reverznímu inženýrství zahrát i na počítačích a mobilních zařízeních. Vyžadována je kopie původní hry (textury, modely, hudba, zvukové efekty, …). Ukázka na YouTube. Projekt byl zahájen v srpnu 2020.
Byla vydána nová major verze 29.0 programovacího jazyka Erlang (Wikipedie) a související platformy OTP (Open Telecom Platform, Wikipedie). Detailní přehled novinek na GitHubu.
Po zranitelnostech Copy Fail a Dirty Frag přichází zranitelnost Fragnesia. Další lokální eskalace práv na Linuxu. Zatím v upstreamu neopravena. Přiřazeno ji bylo CVE-2026-46300.
Sovereign Tech Agency (Wikipedie) prostřednictvím svého fondu Sovereign Tech Fund podpoří KDE částkou 1 285 200 eur.
Hledal jsem možnost, jak sledovat logy, kreré vytváří python přes logger logging. Programy tail, more a všechny ostatní metody nesplňovaly moje požadavky ( nebo neumím číst man a google ).
Moje bádání v tomto směru bylo ukončeno rozhodnutím udělat takový program v Pythonu. Cesta (pro mně) síce zdlouhavější, zato však inspirativní.
(doufám, že se tady dozvím, že i zbytečná, protože tohle už přece dávno existuje a všichni to dobře vědí... kromě mně, tedy.)
Program jsem psal Pythonu + pySide2. Je jednoúčelový, hlídá jen jeden log, jednoho typu, ale plně funguje a navíc logy obarvuje. Ještě mě napadá dodělat pořádně otevírání souborů a barvení ANSI sekvencí, tak možná později, až na to bude čas...
Přikládám kód: Pro znovuotevření jiného souboru jsem plánoval odpojit a znovu připojit signál fileChanged (aby se nezdvojoval), ale nepovedlo se mi najít správnou kombinaci pro fuknci receivers .. nějak nevím čím ji nakrmit, no vyřešil jsem to jinak.
#! /usr/bin/python3
# This Python file uses the following encoding: utf-8
import sys
import os
from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.QtCore import QFile, Slot, Signal, SIGNAL, QFileSystemWatcher
from PySide2.QtUiTools import QUiLoader
class Reader(QMainWindow):
def __init__(self):
super(Reader, self).__init__()
self.load_ui()
self.fwatcher = QFileSystemWatcher()
self.fwatcher.fileChanged.connect(self.fileWasChanged)
def load_ui(self):
loader = QUiLoader()
path = os.path.join(os.path.dirname(__file__), "form.ui")
ui_file = QFile(path)
ui_file.open(QFile.ReadOnly)
self.ui = loader.load(ui_file)
ui_file.close()
self.ui.action_Open_file.triggered.connect(self.readFile)
self.ui.show()
@Slot()
def readFile(self):
# noConnection = self.fwatcher.receivers("filechanged")
watchedFiles = self.fwatcher.files()
if watchedFiles:
self.fwatcher.removePaths(watchedFiles)
self.fname = "/home/blabla/muj.log"
self.fwatcher.addPath(self.fname)
self.fillBrowser()
def fillBrowser(self):
content = ""
with open(self.fname, "r") as fh:
while True:
line = fh.readline()
if not line:
break
line = self.loggerConvert(line)
content += line
self.ui.textBrowser.setHtml(content)
@Slot(str)
def fileWasChanged(self, path):
self.fillBrowser()
def loggerConvert(self, line):
line = line.replace("NOTSET", '<font color="gray>NOTSET</font>')
line = line.replace("DEBUG", '<font color="blue">DEBUG</font>')
line = line.replace("INFO", '\
<font color="green">INFO</font>')
line = line.replace("WARNING", '<font color="orange">WARNING</font>')
line = line.replace("ERROR", '<font color="red">ERROR</font>')
line = line.replace("CRITICAL", '<span style="background-color:red"><font color="white"b>\
CRITICAL</font></span>')
line = line.replace("DEBUG", '<font color="blue">DEBUG</font>')
line = line + "
"
return line
if __name__ == "__main__":
app = QApplication([])
widget = Reader()
# widget.ui.show()
sys.exit(app.exec_())
Log vzniká pomocí modulu logging :
import logging
...
...
logging.basicConfig(
filename=logFilename,
format="%(asctime)s [%(levelname)s] %(module)s: %(lineno)d\
%(funcName)s: %(message)s",
level=logging.DEBUG,
datefmt='%d %H:%M:%S',
filemode="w"
)
Tiskni
Sdílej:
Jako bych slyšel ironii ... ale máš pravdu ... 
less --follow-name
tail -f) program
https://klogg.filimonov.dev anebo
https://glogg.bonnefon.org/index.html
Programy tail, more a všechny ostatní metody nesplňovaly moje požadavky ( nebo neumím číst man a google ).Nebýval kdysi tohle portál pro fanoušky linuxu?
import os
import time
class TailFIterator:
"""
Text file iterator, which yields new lines added to the file, like
tail -F. It can detect when the file descriptor was changed (logrotated) or
the file was truncated (also used by logrotate).
You can overload:
.on_file_not_found()
To change behaviour when the file was followed, but was deleted
in the process (logrotated). Standard behaviour is to wait 5 seconds,
try again forever. See also .file_not_found_counter for details.
.on_no_changes_detected()
To decide what to do when no change was detected. Default is to
wait 1s.
"""
def __init__(self, file_path: str, file_mode: str = "rt"):
self.file_size = 0
self.file_path = file_path
self.file_mode = file_mode
self.inode_number = os.stat(file_path).st_ino
self.logfile = open(file_path, self.file_mode)
self.file_not_found_counter = 0
def __iter__(self):
while True:
try:
size = self._get_current_size()
self.file_not_found_counter = 0
except FileNotFoundError as e:
self.file_not_found_counter += 1
self.on_file_not_found(self.file_not_found_counter, e)
continue
if size > self.file_size:
self.logfile.seek(self.file_size)
for line in self.logfile:
yield line
self.file_size = self.logfile.tell()
# in case the .truncate() was called
elif size < self.file_size:
self._check_and_handle_logrotate()
self.file_size = 0
continue
if self._check_and_handle_logrotate():
continue
self.on_no_changes_detected()
def _get_current_size(self) -> int:
return os.stat(self.file_path).st_size
def _check_and_handle_logrotate(self) -> bool:
current_file_info = os.stat(self.file_path)
current_inode_number = current_file_info.st_ino
if current_inode_number != self.inode_number:
self.inode_number = current_file_info.st_ino
self.logfile = open(self.file_path, self.file_mode)
self.file_size = 0
return True
def on_file_not_found(self, file_not_found_counter: int, exception):
if file_not_found_counter > 5:
raise exception
time.sleep(5)
def on_no_changes_detected(self):
time.sleep(1)
(Psal jsem kdysi pro jeden starší projekt co běžel někde kam jsem nechtěl tahat závislosti).
. Za starých časů jsem psal něco podobného pro PHP a používalo to externí inotify. Dneska už zbytečné, každý jazyk to podoporuje.
Děkuji za fakt šikovné podněty ... I komentátorům vašeho příspěvku... Zvlášť Jenda musel prohrabávat staré (.. co - prastaré) archivy, aby našel prastarý kód ( i když podle syntaxe možná zase tak prastarý není, ale stejně) ... fakt dík :)Je to několik let staré, prohledávat jsem nemusel, mám v notionu složku se snippety kam si házím použitelné věci a různé ukázky.
.. jak jsi onehdá snil ... no počkáme ... a snad se dožijem
\b(ERROR|INFO|WARN)\b
Výhoda je, že to nebude matchovat třeba information nebo terror.
Escape HTML - například <1> by se měla změnit na <1> , jinak to může být hezký námět nat code injection
S těmi newline a načítáním nového souboru - bude tam nějaká komplexita navíc, neboť match či přidání nového řádku by se mělo dít jenom v případech, kdy se dokončilo načtení aspoň jednoho řádku. To jenom detail, když už to tak komplikuju.