Felix J. Ogris' private homepage: some stuff about homemade software, FreeBSD, Linux, computers, and hacking in general.

Somewhat more nosy? Mailto www@ogris.de.

You're viewing this webpage using the good old IPv4 protocol.

IPv6 test pages

recent news

[2024-06-30] Random password generator with Python >= 3.6:
$ python -c 'import random, string; print("".join(random.choices(string.ascii_letters+string.digits+string.punctuation, k=16)))'

[2024-06-16] New version of kvmlib allows you to disable any sound hardware at all (set VM_SOUND to "0"), fixes a bug when accessing qemu's console without a parameter, allows you to create, resize, and list virtual disks, and may create, delete, rollback, and list snapshots of a vm's virtual disks.

[2024-04-16] 499.ipdb is a helper for geolocation access on your FreeBSD firewall. It atomically loads the ip ranges of given countries to an ipfw firewall table. You run 499.ipdb weekly by periodic and as cron job during system boot. It either requires sysutils/ipdbtools from ports to directly download and compile ip geolocation data from a regional Internet registry, or may download the output from a central host that also runs 499.ipdb regularly.

[2024-03-20] text2png.py outputs a given text as scrambled picture in png format.

[2024-03-13] graypold version 11 supports SQLite database backends. Please see the provided readme.txt. Also note that the config option for the graylisting unix socket has changed:
OLD: listen_graypol = /var/run/graypold_graypol.sock
NEW: listen_graylist = /var/run/graypold_graylist.sock

[2024-03-07] ovpn.py version 2 displays transferred bytes human readable with suffixed kB, MB, and so, and right-aligns integer values. Here's a screenshot:
Example output of ovpn.py



[2024-02-24] Updating a FreeBSD system bumped to FreeBSD 14.

[2024-02-17] First rule of WSGI programming: You do not use global variables. Thus, LogBlitz version 17.

[2024-01-17] gitup is a lightweight alternative to the official git client. It is aimed at updating ports (and src) on a FreeBSD system without cloning the respective repository's database or history. Installation is pretty simple:
# pkg install gitup
# cp -aiv /usr/local/etc/gitup.conf.sample /usr/local/etc/gitup.conf
If you have already installed ports locally, then you might build gitup from source:
# make -C /usr/port/net/gitup install clean
# cp -aiv /usr/local/etc/gitup.conf.sample /usr/local/etc/gitup.conf
Keeping your ports copy up to date is trivial:
# gitup ports
gitup will not proceed if a .git directory exists. Thus, if you have cloned your copy of the ports tree using the official git client, then remove /usr/ports/.git first:
# rm -r /usr/ports/.git

[2024-01-08] LogBlitz version 16 can be served by a WSGI server, too.


[2023-12-16] New version of pocgi.py fixes two bugs: Standard input was not opened in binary mode, and parsed values were not comparable to strings.

[2023-12-13] As FreeBSD 14 ships without portsnap, you are encouraged to use git in order to update your local ports tree. If you do not need the complete history of the entire ports collection, then limit the number of historical commits to one, e.g. for a very first clone right a fresh install:
# pkg install git
# git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports
To keep the ports tree tidy afterwards, I use these 3 commands for now:
# cd /usr/ports
# git pull --depth 1
# git reset --hard origin
# git clean -dfx


[2023-12-03] pocgi.py (plain old cgi) aims to be a replacement for Python's cgi library, which was deprecated in 3.11 and will be removed in 3.13 (see PEP 594).

[2023-11-25] formdata.py shows how to do multipart/form-data HTTP POST uploads with Python's urllib only.

[2023-11-05] Benchmarked two additional devices for video encoding speed.

[2023-09-16] I benchmarked my graphic cards for video encoding speed and kept the results as my personal reference.



[2023-09-12] The other day I needed an event counter shared between scripts written in Python and Perl. These scripts process incoming files at a very low rate, about 10 per hour. Their filenames should be prefixed with an increasing and unique id. A text file containing the next id, protected by a file lock, is complicated, error-prone, and most likely non-portable. Same counts for a shared memory segment, plus this is lost at a reboot. A full blown SQL server seemed to be overkill. Thus, SQLite came to my mind. It has been part of Python since version 2.5, and is available, if not even installed, on many operating systems. The scripts are quite trivial. For Python:

import sqlite3

con = sqlite3.connect("/tmp/counter.sqlite", isolation_level=None)
cur = con.cursor()
(next_id,) = cur.execute("UPDATE counter SET id=id+1 RETURNING id").fetchone()
Perl counterpart:
#!/usr/bin/perl -w

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect("DBI:SQLite:dbname=/tmp/counter.sqlite", "", "", {
  AutoCommit => 1, RaiseError => 1
my ($next_id) = $dbh->selectrow_array("UPDATE counter SET id=id+1 RETURNING id");
print "$next_id\n";
Of course you have to initialise the database and the counter table upfront, e.g. by using the sqlite3 command line tool:
$ sqlite3 /tmp/counter.sqlite "CREATE TABLE counter (id INT NOT NULL PRIMARY KEY); INSERT INTO counter VALUES (0);"
A bonus variant written in C:
/* Compile with:
 * cc -W -Wall -O3 -pipe -s -o counter counter.c -lsqlite3
#include <stdio.h>
#include <err.h>
#include <sqlite3.h>

int main ()
  const char sql[] = "UPDATE counter SET id=id+1 RETURNING id";
  sqlite3 *db;
  sqlite3_stmt *stmt;
  int next_id;

  if (sqlite3_open("/tmp/counter.sqlite", &db) != SQLITE_OK)
    errx(1, "sqlite3_open: %s",
         db ? sqlite3_errmsg(db) : "Generic SQLite error");

  if (sqlite3_prepare_v2(db, sql, sizeof(sql), &stmt, NULL) != SQLITE_OK)
    errx(1, "sqlite3_prepare_v2: %s", sqlite3_errmsg(db));

  if (sqlite3_step(stmt) != SQLITE_ROW)
    errx(1, "sqlite3_step: %s", sqlite3_errmsg(db));

  next_id = sqlite3_column_int(stmt, 0);

  if (sqlite3_finalize(stmt) != SQLITE_OK)
    errx(1, "sqlite3_finalize: %s", sqlite3_errmsg(db));

  if (sqlite3_close_v2(db) != SQLITE_OK)
    errx(1, "sqlite3_close_v2: %s", sqlite3_errmsg(db));

  printf("%i\n", next_id);

  return 0;



[2023-09-04] How to show git log entries up to a certain date:
$ git --no-pager log -1 --until "2023-06-22"
$ git --no-pager log -1 --until "last year"
You can then use the commit hash from the above outputs for further processing, e.g.:
$ git diff --stat <commit hash>
[2023-08-23] How to get the current date and time of Lisbon:

[2023-08-09] rrdquery.pl version 4 (obviously) comes with version numbering, an example section, and fixes two bugs, where a "IS NULL" predicate wasn't parsed correctly and an aggregate function was always expected.

[2023-08-03] dnskey2id.pl shows how to derive the key id for a given DNSSEC dnskey in Perl. Inspired by a Python snippet I found on https://lists.isc.org/pipermail/bind-users/2010-October/081724.html.

[2023-07-27] LogBlitz version 15 reduces the number and size of http cookies, and displays the number and size of the selected logfiles.

old news

Valid HTML 4.01 Strict! Valid CSS! [Valid RSS] Viewable With Any Browser Vim FreeBSD Imprint
Data privacy