Sometimes I need to download files through http from a list on an “autoindex” page and it’s always painful to find a correct command for this.
The easy solution is wget but you need to use the correct parameters because wget has a lot of mirroring options but you only want specific ones to achieve this goal.
I ended up with the following command:
wget --continue --accept "*.tgz" --no-directories --no-parent --recursive http://ftp.fr.openbsd.org/pub/OpenBSD/6.7/amd64/
This will download every tgz files available at the address given as last parameter.
The parameters given will filter to only download the tgz files, put the files in the current working directory and most important, don’t try to escape to the parent directory to start downloading again. The `–continue`` parameter allow to interrupt wget and start again, downloaded file will be skipped and partially downloaded files will be completed.
Do not reuse this command if files changed on the remote server because continue feature only work if your local file and the remote file are the same, this simply look at the local and remote names and will ask the remote server to start downloading at the current byte range of your local file. If meanwhile the remote file changed, you will have a mix of the old and new file.
Obviously ftp protocol would be better suited for this download job but ftp is less and less available so I find wget to be a nice workaround for this.
I manage my birthday list so I don’t forget about them in a calendar file so I can use it in scripts
The calendar file format is easy but sadly it only works using English month names.
This is an example file with differents spacing:
7 August This is 7 august birthday! 8 August This is 8 august birthday! 16 August This is 16 august birthday!
Now you have a calendar file you can use the calendar binary on it and show incoming events in the next n days using -A flag.
calendar -A 20
Note that the default file is
~/.calendar/calendar so if you
use this file you don’t need to use the
-f flag in calendar.
Now, I also use it in crontab with xmessage to show a popup once a day with incoming birthdays.
30 13 * * * calendar -A 7 -f ~/.calendar/birthday | grep . && calendar -A 7 -f ~/.calendar/birthdays | env DISPLAY=:0 xmessage -file -
You have to set the DISPLAY variable so it appear on the screen.
It’s important to check if calendar will have any output before calling xmessage to prevent having an empty window.
The software developer prx, his website is available at https://ybad.name/ (en/fr), released a new software called prose to publish a blog by sending emails.
I really like this idea, while this doesn’t suit my needs at all, I wanted to write about it.
The code can be downloaded from this address https://dev.ybad.name/prose/ .
I will briefly introduce how it works but the README file is well explaining,
prose must be started from the mail server, upon email receival in
/etc/mail/aliases the email will be piped into prose which will produce the
On the security side, prose doesn’t use any external command and on OpenBSD it will use unveil and pledge features to reduce privileges of prose, unveil will restrict the process file system accesses outside of the html output directory.
I would also congrats prx who demonstrates again that writing good software isn’t exclusive to IT professionnal.
While no one would expect this, there are huge efforts from a small team to bring more games into OpenBSD. In fact, now some commercial games works natively now, thanks to Mono or Java. There are no wine or linux emulation layer in OpenBSD.
Here is a small list of most well known games that run on OpenBSD:
- Northguard (RTS)
- Dead Cells (Side scroller action game)
- Stardew Valley (Farming / Roguelike)
- Slay The Spire (Card / Roguelike)
- Axiom Verge (Side scroller, metroidvania)
- Crosscode (top view twin stick shooter)
- Terraria (Side scroller action game with craft)
- Ion Fury (FPS)
- Doom 3 (FPS)
- Minecraft (Sandbox - not working using latest version)
- Tales Of Maj’Eyal (Roguelike with lot of things in it - open source and free)
I would also like to feature the recently made compatible games from Zachtronics developer, those are ingenious puzzles games requiring efficiency. There are games involving Assembly code, pseudo code, molecules etc…
- Opus Magnum
Finally, there are good RPG running thanks to devoted developer spending their free time working on game engine reimplementation:
- Elder Scroll III: Morrowind (openmw engine)
- Baldur’s Gate 1 and 2 (gemrb engine)
- Planescape: Torment (gemrb engine)
There is a Peertube (opensource decentralized Youtube alternative) channel where I started publishing gaming videos recorded from OpenBSD. Now there are also videos from others people that are published. OpenBSD Gaming channel
The full list of running games is available in the Shopping guide webpage including information how they run, on which store you can buy them and if they are compatible.
Big thanks to thfr@ who works hard to keep the shopping guide up to date and who made most of this possible. Many thanks to all the other people in the OpenBSD Gaming community :)
Note that it seems last Terraria release/update doesn’t work on OpenBSD yet.
While the title may appear quite strange, the article is about installing a package to have a new random wallpaper everytime you start the X session!
First, you need to install a package named
openbsd-backgrounds which is quite
large with a size of 144 MB. This package made by Marc Espie contains lot of
pictures shot by some OpenBSD developers.
You can automatically set a picture as a background when xenodm start and
prompt for your username by uncommenting a few lines in the file
Uncomment this part
if test -x /usr/local/bin/openbsd-wallpaper then /usr/local/bin/openbsd-wallpaper fi
openbsd-wallpaper will display a different random picture on
every screen (if you have multiples screen connected) every time you run it.
This article is exceptionnaly in French because it’s about a French OpenBSD community.
Bonjour à toutes et à tous.
Exceptionnellement je publie un billet en français sur mon blog car je tiens à faire passer le mot concernant la communauté française obsd4a.
Vous pourrez par exemple trouver la quasi intégralité de la FAQ OpenBSD traduite à cette adresse
Sur l’accueil du site vous pourrez trouver des liens vers le forum, le wiki, le blog, la mailing list et aussi les informations pour rejoindre le salon irc (#obsd4* sur freenode)
I added a new feature to my blog today, when I post a new blog article this will trigger my dedicated Mastodon user https://bsd.network/@solenepercent to publish a Toot so people can discuss the content there.
Every article now contains a link to the toot if you want to discuss about an article.
This is not perfect but a good trade-off I think:
- the website remains static and light (nothing is included, only one more link per blog post)
- people who would like to discuss about it can proceed in a known place instead of writing reactions on reddit or other places without a chance for me to asnwer
- this is not relying on proprietary services
Of course, if you want to give me feedback, I’m still happy to reply to emails or on IRC.
I’m using FreeBSD again on a laptop for some reasons so expect to read more about FreeBSD here. This tutorial explain how to get a graphical desktop using FreeBSD 12.1.
I used a Lenovo Thinkpad T480 for this tutorial.
Intel graphics hardware support
If you have a recent Intel integrated graphic card (maybe less than 3 years), you have to install a package containing the driver:
pkg install drm-kmod
and you also have to tell the system the correct path of the module (because another i915kms.ko file exist):
Choose your desktop environnement
pkg install xfce
Then in your user
~/.xsession file you must append:
exec ck-launch-session startxfce4
pkg install mate
Then in your user
~/.xsession file you must append:
exec ck-launch-session mate-session
pkg install kde5
Then in your user
~/.xsession file you must append:
exec ck-launch-session startplasma-x11
Setting up the graphical interface
You have to enable a few services to have a working graphical session:
- moused to get laptop mouse support
- dbus for hald
- hald for hardware detection
- xdm for display manager where you log-in
You can install them with the command:
pkg install xorg dbus hal xdm
Then you can enable the services at boot using the following commands, order is important:
sysrc moused_enable="yes" sysrc dbus_enable="yes" sysrc hald_enable="yes" sysrc xdm_enable="yes"
Reboot or start the services in the same order:
service moused start service dbus start service hald start service xdm start
Note that xdm will be in qwerty layout.
The installer should have prompted for the service powerd, if you didn’t activate it at this time, you can still enable it.
Check if it’s running
service powerd status
Starting the service
service powerd start
If you have a webcam and want to use it, some configuration is required in order to make it work.
Install the package webcamd, it will displays all the instructions written below at the install step.
pkg install webcamd
From here, append this line to the file
/boot/loader.conf to load webcam
support at boot time:
Add your user to the webcamd group so it will be able to use the device:
pw groupmod webcamd -m YOUR_USER
Enable webcamd at boot:
Now, you have to logout from your user for the group change to take place. And if you want the webcamd daemon to work now and not wait next reboot:
kldload cuse service webcamd start service devd restart
You should have a /dev/video0 device now. You can test it easily with the
I found this blog very interesting, I wish I found it before I struggle with all the configuration as it explains how to install FreeBSD on the exact same laptop. The author explains how to make a transparent lagg0 interface for switching from ethernet to wifi automatically with a failover pseudo device.
Some websites (like this one) now offers two differents themes: light and dark.
Dark themes are proven to be better for the eyes and reduce battery usage on mobiles devices because it requires less light to be displayed hence it requires less energy to display. The gain is optimal on OLED devices but it also works on classic LCD screens.
While on Windows and MacOS there is a global setting for the user interface in which you choose if your system is in light or dark mode, with that setting being used by lot of applications supporting dark/light themes, on Linux and BSDs (and others) operating systems there is no such settings and your web browser will keep displaying the light theme all the time.
Hopefully, it can be fixed in firefox as as explained in the documentation.
To make it short, in the about:config special Firefox page, one can create a
ui.systemUsesDarkTheme with a number value of
1, the firefox
about:config page should turn dark immediately and then Firefox will try to use
dark themes when they are available.
You should note that as explained in the mozilla documentation, if you have the
privacy.resistFingerprinting set to
true the dark mode can’t be used.
It seems dark mode and privacy can’t belong together for some reasons.
Many thanks to https://tilde.zone/@andinus who pointed me this out after I overlooked that page and searched a long time with no result how to make Firefox display website using the dark theme.
In this article I’ll explain how to aggregate internet access bandwidth using mlvpn software. I struggled a lot to set this up so I wanted to share a how-to.
mlvpn is meant to be used with DSL / fiber links, not wireless or 4G links with variable bandwidth or packet loss.
mlvpn requires to be run on a server which will be the public internet access and on the client on which you want to aggregate the links, this is like doing multiples VPN to the same remote server with a VPN per link, and aggregate them.
Multi-wan roundrobin / load balancer doesn’t allow to stack bandwidth but doesn’t require a remote server, depend on what you want to do, this may be enough and mlvpn may not be required.
mlvpn should be OS agnostic between client / server but I only tried between two OpenBSD hosts, your setup may differ.
Some network diagram
Here is a simple network, the client has access to 2 ISP through two ethernet interfaces.
em0 and em1 will have to be on different rdomains (it’s a feature to separate routing tables).
Let’s say the public ip of the server is 184.108.40.206.
[internet] ↑ | (public ip on em0) #-------------# | | | Server | | | #-------------# | | | | | | | | (internet) | | (internet) #-------------# #-------------# | | | | | ISP 1 | | ISP 2 | | | | | (you certainly don't control those) #-------------# #-------------# | | | | (dsl1 via em0)| | (dsl1 via em1) #-------------# | | | Client | | | #-------------#
As said previously, em0 and em1 must be on different rdomains, it can easily be
done by adding
rdomain 1 and
rdomain 2 to the interfaces configuration.
Example in /etc/hostname.em0
rdomain 1 dhcp
On OpenBSD the installation is as easy as
pkg_add mlvpn (should work starting
from 6.7 because it required patching).
Once the network configuration is done on the client, there are 3 steps to do to get aggregation working:
- mlvpn configuration on the server
- mlvpn configuration on the client
- activating NAT on the client
On the server we will use the UDP ports 5080 et 5081.
Connections speed must be defined in bytes to allow mlvpn to correctly balance the traffic over the links, this is really important.
bandwidth_upload = 1468006 is the maximum download bandwidth of the
client on the specified link in bytes. If you have a download speed of 1.4 MB/s
then you can choose a value of 1.4*1024*1024 => 1468006.
bandwidth_download = 102400 is the maximum upload bandwidth of the
client on the specified link in bytes. If you have an upload speed of 100 kB/s
then you can choose a value of 100*1024 => 102400.
The password line must be a very long random string, it’s a shared secret between the client and the server.
# config you don't need to change [general] statuscommand = "/etc/mlvpn/mlvpn_updown.sh" protocol = "tcp" loglevel = 4 mode = "server" tuntap = "tun" interface_name = "tun0" cleartext_data = 0 ip4 = "10.44.43.2/30" ip4_gateway = "10.44.43.1" # things you need to change password = "apoziecxjvpoxkvpzeoirjdskpoezroizepzdlpojfoiezjrzanzaoinzoi" [dsl1] bindhost = "220.127.116.11" bindport = 5080 bandwidth_upload = 1468006 bandwidth_download = 102400 [dsl2] bindhost = "18.104.22.168" bindport = 5081 bandwidth_upload = 1468006 bandwidth_download = 102400
password value must match the one on the server, the values of
ip4_gateway must be reversed compared to the server configuration (this is so
in the following example).
bindfib lines must correspond to the according rdomain values of your
# config you don't need to change [general] statuscommand = "/etc/mlvpn/mlvpn_updown.sh" loglevel = 4 mode = "client" tuntap = "tun" interface_name = "tun0" ip4 = "10.44.43.1/30" ip4_gateway = "10.44.43.2" timeout = 30 cleartext_data = 0 password = "apoziecxjvpoxkvpzeoirjdskpoezroizepzdlpojfoiezjrzanzaoinzoi" [dsl1] remotehost = "22.214.171.124" remoteport = 5080 bindfib = 1 [dsl2] remotehost = "126.96.36.199" remoteport = 5081 bindfib = 2
NAT configuration (server side)
As with every VPN you must enable packet forwarding and create a pf rule for the NAT.
Add this line in /etc/sysctl.conf:
You can enable it now with
sysctl net.inet.ip.forwarding=1 instead of waiting
for a reboot.
In pf.conf you must allow the UDP ports 5080 and 5081 on the public interface and enable nat, this can be done with the following lines in pf.conf but you should obviously adapt to your configuration.
# allow NAT on VPN pass in on tun0 pass out quick on em0 from 10.44.43.0/30 to any nat-to em0 # allow mlvpn to be reachable pass in on egress inet proto udp from any to (egress) port 5080:5081
On both server and client you can run mlvpn with rcctl:
rcctl enable mlvpn rcctl start mlvpn
You should see a new tun0 device on both systems and being able to ping them through tun0.
Now, on the client you have to add a default gateway through the mlvpn
tunnel with the command
route add -net default 10.44.43.2 (adapt if you
use others addresses). I still didn’t find how to automatize it properly.
Your client should now use both WAN links and being visible with the remote server public IP address.
mlvpn can be used for more links, you only need to add new sections.
mlvpn also support IPv6 but I didn’t take time to find how to make it work,
si if you are comfortable with ipv6 it may be easy to set up IPv6 with the
ip6_gateway in mlvpn.conf.