Monthly Shaarli
January, 2018
Switching from primitive types to product types can improve confidence in correctness and compiler errors, but not without a cost.
The guide is a bit too simplistic but covers some topics like spf and client configuration
Blog series to install opensmtp and dovecot with filters for spam, antivirus, dkim plus roundcube webmail
A couple of details are missing like reverse DNS (test with mail-tester):
- set the droplet name as the domain you are using for the emails (eg mail.example.com) if using digitalocean
- set the same domain in /etc/mailname
https://romainl.github.io/the-patient-vimmer/0.html
https://romainl.github.io/the-patient-vimmer/1.html
https://romainl.github.io/the-patient-vimmer/2.html
https://romainl.github.io/the-patient-vimmer/3.html
https://romainl.github.io/the-patient-vimmer/4.html
https://romainl.github.io/the-patient-vimmer/5.html
https://romainl.github.io/the-patient-vimmer/6.html
https://romainl.github.io/the-patient-vimmer/7.html
https://romainl.github.io/the-patient-vimmer/8.html
logrotate for docker logs

Good example for generating password using different wrappers or bindings of the crypt() function
I use this to manually change password in /etc/shadow for users created only as opensmtpd users which has no shell access (/usr/sbin/nologin)
The quickest way, using python3 is:
python -c 'import crypt; print(crypt.crypt("password",crypt.METHOD_SHA512))'
Map functions are hard to "get" in the abstract. This looks at two mental models that helped me understand them better.
Concise example to setup an opensmtpd server with virtual domains and virtual users
Had some problems with the passwd table which where solved by following this example:
http://misc.opensmtpd.narkive.com/OpKS0DRj/table-passwd-invialid-without-the-shell