Russ Allbery: Review: The Girl with the Dragon Tattoo
| Translator: | Reg Keeland |
| Series: | Millennium #1 |
| Publisher: | Vintage Crime |
| Copyright: | 2005, 2008 |
| Printing: | June 2009 |
| ISBN: | 0-307-47347-3 |
| Format: | Mass market |
| Pages: | 644 |
| Translator: | Reg Keeland |
| Series: | Millennium #1 |
| Publisher: | Vintage Crime |
| Copyright: | 2005, 2008 |
| Printing: | June 2009 |
| ISBN: | 0-307-47347-3 |
| Format: | Mass market |
| Pages: | 644 |
Here is my monthly update covering a large part of what I have been doing in the free software world (previously):
dh $@ --with buildinfo in deb/rules instead of having to
explicitly call it somewhere in an override.
Debops
I've set up initial Debian packages of Debops2, a collection of fine crafted
Ansible roles and playbooks especially for Debian servers, shipped with a couple
of convenience and wrapper scripts in Python3.
There are two binary packages, one for the toolset (debops), and the other for the
playbooks and roles of the project (debops-playbooks).
The application is easy to use, just initialize a new project with debops-init foo
and add your server(s) to foo/ansible/inventory/hosts belonging to groups representing
services and things you want to employ on them.
Like the group [debops_gitlab] automatically installs a complete running Gitlab setup
on one or a multitude of servers in the same run with the debops command4.
Use other groups like [debops_mariadb_server] accordingly in the same host inventory.
Ansible runs agent less, so you don't have to prepare freshly setup servers with nothing
special to use that tool randomly (like on localhost).
The list of things you could deploy with Debops is quite amazing and you've got dozens
of services at your hand.
The new packages are currently in experimental because they need some more fine
tuning, like there are a couple of minor error messages which recently occur using it,
but it works well.
The (early staged) documentation unfortunately couldn't be packaged because of the
scattered resp. collective nature of the project (all parts have their own Github repositories)5,
and also how to generate the upstream tarball remains a bit of a challenge (currently,
it's the outcome of debops-init)6.
I'll have this package in unstable soon. More info on Debops is coming up, then.
Hashicorp's Packer
I'm very glad to announce that Packer7 is ready being available in unstable,
and the two year old RFP bug could be finally closed8.
It's another great and much convenient devops tool which does a lot of different
things in an automated fashion using only a single "one-argument" CLI tool in combination
with a couple of lines in a configuration script (thanks to Yaroslav Halchenko for the tip).
Packer helps creating machine images for different platforms.
This is like when you use e.g. Debian installations in a Qemu box for testing or development
purposes.
Instead of setting up a new virtual machine manually like installing Debian on
another computer this process could be automated with Packer, like I've written about
in this blog entry here9.
You just need a template containing instructions for the included Qemu-builder and a preseeding
script for the Debian installer, and there you go drinking your coffee while Packer does all
the work for you: downloading the installation ISO image, creating the new virtual harddrive,
booting the emulator, running the whole installation process automatically like answering questions,
selecting things, rebooting without ISO image to complete the installation etc.
A couple of minutes and you have a new pre-baked virtual machine image like from a vendoring
machine, a fresh one everytime you need it.
Packer10 supports a number of builders for different target platforms
(desktop virtualization solutions as much as public cloud providers and private cloud software),
can build in parallel, and also the full range of common provisioners can be employed
in the process to equip the newly installed OSs.
Vagrant boxes could be generated by one of the included postprocessors.
I'll write more on Packer here on this blog, soon.
There were more then two dozens of packages missing to complete Packer11, which is
the achievement of combined forces within the pkg-go group. Much thanks esp. to Alexandre
Viau who have worked on the most of the needed new packages.
Thanks also to the FTP-masters which were always very quick in reviewing the Go packages,
so that it could be proceeded to build and package the sub dependent new ones always consecutively.
Squirrel3
I've didn't had the most work with it and just sponsored this for Fabian Wolff, but want to
highlight here that there's a new package of Squirrel12 now available in
Debian13.
Squirrel is a lightweight scripting language, somewhat comparable to Lua. It's
fully object-oriented and highly embeddable, it's used in a lot of commerical computer
games under the hood for implementing intelligence for bots next to other things14,
but also for the Internet of Things (it's embedded in hardware from Electric Imp).
Squirrel functions could be called from C++15.
I've filed an ITP bug for Squirrel already in 2011 (#651195), but always something else
got in the way, and it ended up being an RFP. I'm really glad that it got picked up
and completed.
misc
There were a couple of uploads on updated upstream tarballs and for fixing bugs,
namely afl/2.10b-1 and 2.11b-1,
python-afl/0.5.3-1, pyutilib/5.3.2-1, pyomo/4.3.11327-1,
libvigraimpex/1.10.0+git20160211.167be93dfsg-2 (fix of #820429, thanks for Tobias Frost),
and gamera/3.4.2+svn1454-1.
For the pkg-go group, I've set up a new package of github-mitchellh-ioprogress (which is
needed by the official DigitalOcean CLI tool doctl, now RFP #807956 instead of ITP
due to the lack of time - again facing a lot of missing packages),
and provided a little patch for dh-make-golang updating some standards16.
For Packer I've also updated azure-go-autorest and azure-sdk as team upload (#821938, #821832),
but it came out that the project which is currently under heavy development towards
a new official release broke a lot in the past weeks (and no Git branching have been used),
so that Packer as a matter of fact needed a vendored snapshot, although there have been only a
couple of commits in between.
Docker-registry hat the same problem with the new package of azure-sdk/2.1.1~beta1, so that it
needed to be fixed, too (#822146).
By the way, the tool ratt17 comes very handy for automatically test building down all
reverse dependencies, not only for Go packages (thanks to Tianon Gravi for the tip).
Finally, I've posted the needed reverse depencies as RFP bugs for Terraform18
(again quite a lot), Vuls19, and cve-dictionary20, which is needed for Vuls.
I'll let them rest a while waiting to get picked up before working anything down.
debops like:
$ debops -u root --private-key=~/.ssh/id_digitalocean
dh $@ --with buildinfo in deb/rules instead of having to
explicitly call it somewhere in an override.
Debops
I've set up initial Debian packages of Debops2, a collection of fine crafted
Ansible roles and playbooks especially for Debian servers (servers which run on Debian),
which are shipped with a couple of helper and wrapper scripts in Python3.
There are two binary packages, one for the toolset (debops), and the other for the
playbooks and roles of the project (debops-playbooks).
The application is easy to use, just initialize a new project with debops-init foo
and add your server(s) to foo/ansible/inventory/hosts belonging to groups representing
services and things you want to employ on them.
For example, the group [debops_gitlab] automatically installs a complete running Gitlab setup
on one or a multitude of servers in the same run with the debops command4.
Other groups like [debops_mariadb_server] could be used accordingly in the same host inventory.
Ansible works without agent, so you don't have to prepare freshly setup servers with nothing
special to use that tool randomly (like on localhost).
The list of things you could deploy with Debops is quite amazing and dozens
of services are at hand.
The new Debian packages are currently in experimental because they need some more fine
tuning, e.g. there are a couple of minor error messages which recently occur using it,
but it works well.
The (early staged) documentation unfortunately couldn't be packaged because of the
scattered resp. collective nature of the project (all parts have their own Github
repositories)5, and also how to generate the upstream tarball remains a bit of a
challenge (currently, it's the outcome of debops-init)6.
I'll have this package in unstable soon. More info on Debops is coming up, then.
HashiCorp's Packer
I'm very glad to announce that Packer7 is ready being available in unstable,
and the RFP bug could be finally closed after I've taken it over8.
It's another great and much convenient devops tool which does a lot of different
things in an automated fashion using only a single "one-argument" CLI tool in combination
with a couple of lines in a configuration script (thanks to Yaroslav Halchenko for the tip).
Packer helps creating machine images for different platforms.
This is like when you use e.g. Debian installations in a Qemu box for testing or development
purposes.
Instead of setting up a new virtual machine manually the same way as installing Debian on
another computer this process can be completely automated with Packer, like I've written about
in this blog entry here9.
You just need a template which contains instructions for the included Qemu builder and a
preseeding script for the Debian installer, and there you go drinking your coffee while
Packer does all the work:
download the ISO image for installation, create the new virtual harddrive, boot the
emulator, run the whole installation process automatically like with answering questions,
selecting things, reboot without ISO image to complete the installation etc.
A couple of minutes and you have a new pre-baked virtual machine image like from a vendoring
machine, another fresh one could be created anytime.
Packer10 supports a number of builders for different target platforms
(desktop virtualization solutions as much as public cloud providers and private cloud software),
can build in parallel, and also the full range of common provisioners can be employed
in the process to equip the newly installed OSs with services and programs.
Vagrant boxes could be generated by one of the included postprocessors.
I'll write more on Packer here on this blog, soon.
There were more then two dozens of packages missing to complete Packer11, which is
the achievement of combined forces within the pkg-go group. Much thanks esp. to Alexandre
Viau who have worked on the most of the needed new packages.
Thanks also to the FTP masters which were always very quick in reviewing the Go packages,
so that it could be proceeded to build and package the sub dependent new ones always
consecutively.
Squirrel3
I've didn't had the major work of that and just sponsored this for Fabian Wolff, but want
to highlight here that there's a new package of Squirrel12 now available in
Debian13.
Squirrel is a lightweight scripting language, somewhat comparable to Lua. It's
fully object-oriented and highly embeddable, it's used in a lot of commerical computer
games under the hood for implementing intelligence for bots next to other things14,
but also for the Internet of Things (it's embedded in hardware from Electric Imp).
Squirrel functions could be called from C++15.
I've filed an ITP bug for Squirrel already in 2011 (#651195), but always something else
had a higher priority, and it ended up being an RFP. I'm really glad that it got picked up
and completed quickly afterwards.
misc
There were a couple of uploads on updated upstream tarballs and for fixing bugs,
namely afl/2.10b-1 and 2.11b-1,
python-afl/0.5.3-1, pyutilib/5.3.2-1, pyomo/4.3.11327-1,
libvigraimpex/1.10.0+git20160211.167be93dfsg-2 (fix of #820429, thanks to Tobias Frost),
and gamera/3.4.2+svn1454-1.
For the pkg-go group, I've set up a new package of github-mitchellh-ioprogress (which is
needed by the official DigitalOcean CLI tool doctl, now RFP #807956 instead of ITP
due to the lack of time, again a lot of missing packages are missing for that),
and provided a little patch for dh-make-golang updating some standards16.
For Packer I've also updated azure-go-autorest and azure-sdk as team upload (#821938, #821832),
but it came out that the project which is currently under heavy development towards
a new official release broke a lot in the past weeks (no Git branching have been used),
so that Packer as a matter of fact needed a vendored snapshot, although there have been only
a couple of commits in between.
Docker-registry has the same problem with the new package of azure-sdk/2.1.1~beta1, so that it
needed to be fixed, too (#822146).
By the way, the tool ratt17 comes very handy for automatically test building down all
reverse dependencies, not only for Go packages (thanks to Tianon Gravi for the tip).
Finally, I've posted the needed reverse depencies as RFP bugs for Terraform18
(again quite a lot), Vuls19, and cve-dictionary20, which is needed for Vuls.
I'll let them rest a while waiting to get picked up before working anything down.
debops like:
$ debops -u root --private-key=~/.ssh/id_digitalocean
This post is largely to remind myself of the details next time I hit something similar; I found bits of relevant information all over the place, but not in one single location.
I love Kodi. These days the Debian packages give me a nice out of the box experience that is easy to use. The problem comes in dealing with remote controls and making best use of the available buttons. In particular I want to upgrade the VDR setup my parents have to a more modern machine that s capable of running Kodi. In this instance an AMD E350 nettop, which isn t recent but does have sufficient hardware acceleration of video decoding to do the job. Plus it has a built in fintek CIR setup.
First step was finding a decent remote. The fintek is a proper IR receiver supported by the in-kernel decoding options, so I had a lot of flexibility. As it happened I ended up with a surplus to requirements Virgin V Box HD remote (URC174000-04R01). This has the advantage of looking exactly like a STB remote, because it is one.
Pointed it at the box, saw that the fintek_cir module was already installed and fired up irrecord. Failed to get it to actually record properly. Googled lots. Found ir-keytable. Fired up ir-keytable -t and managed to get sensible output with the RC-5 decoder. Used irrecord -l to get a list of valid button names and proceed to construct a vboxhd file which I dropped in /etc/rc_keymaps/. I then added a
fintek-cir * vboxhd
/etc/rc_maps.cfg to force my new keymap to be loaded on boot.
That got my remote working, but then came the issue of dealing with the fact that some keys worked fine in Kodi and others didn t. This seems to be an issue with scancodes above 0xff. I could have remapped the remote not to use any of these, but instead I went down the inputlirc approach (which is already in use on the existing VDR box).
For this I needed a stable device file to point it at; the /dev/input/eventN file wasn t stable and as a platform device it didn t end up with a useful entry in /dev/input/by-id. A quick
udevadm info -a -p $(udevadm info -q path -n /dev/input/eventN)
/etc/udev/rules.d/70-remote-control.rules containing
KERNEL=="event*",ATTRS id =="FIT0002",SYMLINK="input/remote"
/dev/input/remote symlink. /etc/defaults/inputlirc ended up containing:
EVENTS="/dev/input/remote"
OPTIONS="-g -m 0"
~kodi/.kodi/temp/kodi.log I could see them getting seen, but not understood. Further searching led me to construct an Lircmap.xml - in particular the piece I needed was the <remote device="/dev/input/remote"> bit. The existing /usr/share/kodi/system/Lircmap.xml provided a good starting point for what I wanted and I dropped my generated file in ~kodi/.kodi/userdata/.
(Sadly it turns out I got lucky with the remote; it seems to be using the RC-5x variant which was broken in 3.17; works fine with the 3.16 kernel in Debian 8 (jessie) but nothing later. I ve narrowed down the offending commit and raised #117221.)
Helpful pages included:
echo in a portable manner across shells.PERL_HASH_SEED=0 when calling the scripts that generate samples.
As I'm nearing the point where Nageru, my live
video mixer, can produce a stream directly that is actually suitable to
streaming directly to clients (without a transcoding layer in the chain),
it struck me the other day how much of the chain I've actually had to touch:
In my test setup, the signal comes into a Blackmagic Intensity
Shuttle. At some point, I found what I believe is a bug in the
card's firmware; I couldn't fix it, but a workaround was applied in the Linux
kernel. (I also have some of their PCI cards, in which I haven't found any
bugs, but I have found bugs in their drivers.)
From there, it goes into bmusb, a driver I wrote myself. bmusb
uses libusb-1.0 to drive the USB card from userspace but for
performance and stability reasons, I patched libusb to use the new usbfs zerocopy
support in the Linux kernel. (The patch is still pending review.) Said
zerocopy support wasn't written by me, but I did the work to clean up the
support and push it upstream (it's in the 4.6-rc* series).
Once safely through bmusb, it goes of course into Nageru, which I wrote
myself. Nageru uses Movit for pixel processing, which I also wrote
myself. Movit in turn uses OpenGL; I've found bugs in all three major driver
implementations, and fixed a Nageru-related one in Mesa (and in the process
of debugging that, found bugs in apitrace, a most useful
OpenGL debugger). Sound goes through zita-resampler to stretch it
ever so gently (in case audio and video clocks are out of sync), which I
didn't wrote, but patched to get SSE support (patch pending upstream).
So now Nageru chews a bit on it, and then encodes the video using x264
(that's the new part in 1.3.0 of course, you need a fast CPU to do that
as opposed to using Quick Sync). I didn't write x264, but I had to redo parts of
the speedcontrol patch (not part of upstream; awaiting review
semi-upstream) because of bugs and outdated timings, but I also found a bug
in x264 proper (fixed by upstream, pending inclusion). Muxing is done through
ffmpeg, where I actually found multiple bugs in the muxer (some of
which are still pending fixes).
Once the stream is safely encoded and hopefully reasonably
standards-conforming (that took me quite a while), it goes to
Cubemap, which I wrote, for reflection to clients. For low-bitrate
clients, it takes a detour through VLC to get a
re-encode on a faster machine to lower bitrate I've found multiple bugs
in VLC's streaming support in the past (and also fixed some of them, plus
written the code that interacts with Cubemap).
From there it goes to any of several clients, usually a browser. I didn't
write any browsers (thank goodness!), but I wrote the client-side JavaScript
that picks the closest relay, and the code for sending it to a Chromecast.
I also found a bug in Chrome for Android (will be fixed in version 50 or 51, although
the fix was just about turning on something that was already in the works),
and one in Firefox for Linux (fixed by patching GStreamer's MP4 demuxer,
although they've since switched away from that to something less crappy).
IE/Edge also broke at some point, but unfortunately I don't have a way to
report bugs to Microsoft. There's also at least one VLC bug involved on the
client side (it starts decoding frames too late if they come with certain
irregular timestamps, which causes them to drop), but I want to verify that
they still persist even after the muxer is fixed before I go deep on that.
Moral of the story: If anyone wants to write a multimedia application and
says I'll just use <framework, language or library XYZ>, and I'll get
everything for free; I just need to click things together! , they simply
don't know what they're talking about and are in for a rude awakening.
Multimedia is hard, an amazing amount of things can go wrong, complex systems
have subtle bugs, and there is no silver bullet.
.
Arriving in London and finding the Red Hat offices
After being stuck in trains for the weekend, but fortunately arriving at the airport in time, I finally made it to London with quite some delay due to the slow bus transfer from Stansted Airport. After finding the hotel, the next issue was to get food and a place which accepted my credit card, which was surprisingly hard in defence of London I must say though, that it was a Sunday, 7 p.m. and my card is somewhat special (in Canada, it managed to crash some card readers, so they needed a hard-reset). While searching for food, I also found the Red Hat offices where the hackfest was starting the next day by accident. My hotel, the office and the tower bridge were really close, which was awesome! I have been to London in 2008 the last time, and only for a day, so being that close to the city center was great. The hackfest didn t leave any time to visit the city much, but by being close to the center, one could hardly avoid the London experience
.
Cool people working on great stuff
That s basically the summary for the hackfest
. It was awesome to meet with Richard Hughes again, since we haven t seen each other in person since 2011, but work on lots of stuff together. This was especially important, since we managed to solve quite some disagreements we had over stuff Richard even almost managed to make me give in to adding <kudos/> to the AppStream spec, something which I was pretty against supporting (it didn t make it yet, but I am no longer against the idea of having that the remaining issues are solvable).
Meeting Iain Lane again (after FOSDEM) was also very nice, and also seeing other people I ve only worked with over IRC or bug reports (e.g. William, Kalev, ) was great. Also lots of new people were there, like guys from Endless, who build their low-budget computer for developing/emerging countries on top of GNOME and Linux technologies. It s pretty cool stuff they do, you should check out their website! (they also build their distribution on top of Debian, which is even more awesome, and something I didn t know before (because many Endless people I met before were associated with GNOME or Fedora, I kind of implicitly assumed the system was based on Fedora
)).
The incarnation of GNOME Software used by endless looks pretty different from what the normal GNOME user sees, since it s adjusted for a different audience and input method. But it looks great, and is a good example for how versatile GS already is! And for upstream GNOME, we ve seen some pretty great mockups done by Endless too I hope those will make it into production somehow.
XdgApp and sandboxing of apps was also a big topic, aside from Ubuntu and Endless integration. Fortunately, Alexander Larsson was also there to answer all the sandboxing and XdgApp-questions.
I used the time to follow up on a conversation with Alexander we started at FOSDEM this year, about the Limba vs. XdgApp bundling issue. While we are in-line on the sandboxing approach, the way how software is distributed is implemented differently in Limba and XdgApp, and it is bad to have too many bundling systems around (doesn t make for a good story where we can just tell developers ship as this bundling format, and it will be supported everywhere ). Talking with Alex about this was very nice, and I think there is a way out of the too-many-solutions dilemma, at least for Limba and XdgApp I will blog about that separately soon.
On the Ubuntu side, a lot of bugs and issues were squashed and changes upstreamed to GNOME, and people were generally doing their best to reduce Richard s bus-factor on the project a little
.
I mainly worked on AppStream issues, finishing up the last pieces of appstream-generator and running it against some sample package sets (and later that week against the whole Debian archive). I also started to implement support for showing AppStream issues in the Debian PTS (this work is not finished yet). I also managed to solve a few bugs in the old DEP-11 generator and prepare another release for Ubuntu.
We also enjoyed some good Japanese food, and some incredibly great, but also suddenly very expensive Indian food (but that s a different story
).
The most important thing for me though was to get together with people actually using AppStream metadata in software centers and also more specialized places. This yielded some useful findings, e.g. that localized screenshots are not something weird, but actually a wanted feature of Endless for their curated AppStore. So localized screenshots will be part of the next AppStream spec. Also, there seems to be a general need to ship curation information for software centers somehow (which apps are featured? how are they styled? added special banners for some featured apps, app of the day features, etc.). This problem hasn t been solved, since it s highly implementation-specific, and AppStream should be distro-agnostic. But it is something we might be able to address in a generic way sooner or later (I need to talk to people at KDE and Elementary about it).
In summary
It was a great event! Going to conferences and hackfests always makes me feel like it moves projects leaps ahead, even if you do little coding. Sorting out issues together with people you see in person (rather than communicating with them via text messages or video chat), is IMHO always the most productive way to move forward (yeah, unless you do this every week, but I think you get my point
).
For me, being the only (and youngest ^^) developer at the hackfest who was not employed by any company in the FLOSS business, the hackfest was also motivating to continue to invest spare time into working on these projects.
So, the only thing left to do is a huge shout out of THANK YOU to the Ubuntu Community Fund and therefore the Ubuntu community for sponsoring me! You rock! Also huge thanks to Canonical for organizing the sponsoring really quickly, so I didn t get into trouble with paying my flights.

Laney and attente on the Millennium Bridge after we walked the distance between Red Hat and Canonical s offices.
While there is real progress being made towards
eliminating insecure HTTP traffic,
DNS is a fundamental
Internet service that still usually relies on unauthenticated cleartext.
There are however a few efforts to try and fix this problem. Here is the
setup I use on my Debian laptop to make use of both
DNSSEC and DNSCrypt.
dnscrypt-proxy package and then
set it as the default resolver either in /etc/resolv.conf:
nameserver 127.0.2.1
if you are using a static network configuration or in
/etc/dhcp/dhclient.conf:
supersede domain-name-servers 127.0.2.1;
if you rely on dynamic network configuration via DHCP.
There are two things you might want to keep in mind when choosing your
DNSCrypt resolver:
/etc/default/dnscrypt-proxy:
DNSCRYPT_PROXY_RESOLVER_NAME=ns0.dnscrypt.is
/etc/resolv.conf (or
/etc/dhcp/dhclient.conf) to my unbound installation at 127.0.0.1.
Then I put the following in /etc/unbound/unbound.conf.d/dnscrypt.conf:
server:
# Remove localhost from the donotquery list
do-not-query-localhost: no
forward-zone:
name: "."
forward-addr: 127.0.2.1@53
to stop unbound from resolving DNS directly and to instead go through the
encrypted DNSCrypt proxy.
/etc/cron.d/restart-dns.conf that restarts both services once a day:
0 3 * * * root /usr/sbin/service dnscrypt-proxy restart
1 3 * * * root /usr/sbin/service unbound restart
dnssec-trigger package
looked promising but when I tried it on my jessie laptop, it wasn't
particularly reliable.
My temporary work-around is to comment out this line in
/etc/dhcp/dhclient.conf whenever I need to connect to such annoying wifi
networks:
#supersede domain-name-servers 127.0.0.1;
If you've found a better solution to this problem, please leave a comment!
Over the last few months, I have been working casually on a new package to integrate MessagePack with R. What is MessagePack, you ask? To quote its website, "It's like JSON, but fast and small."
Or in more extended terms:
MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.Now, serialization formats are a dime a dozen: JSON, BSON, Protocol Buffers, CaptnProto, Flatbuffer. The list goes on and on. So why another? In a nutshell: "software ecosystems". I happen to like working with Redis, and within the world of Redis, MessagePack is a first-class citizen supported by things close to the core like the embedded Lua interpreter, as well as fancy external add-ons such as the Redis Desktop Manager GUI. So nothing overly fundamentalist here, but a fairly pragmatic choice based on what happens to fit my needs. Plus, having worked on and off with Protocol Buffers for close to a decade, the chance of working with something not requiring a friggin' schema compiler seemed appealing for a chance. So far, we have been encoding a bunch of data streams at work via MessagePack into Redis (and of course back). It works really well---header-only C++11 libraries for the win. I'll provide an updated RcppRedis which uses this (if present) in due course. For now and the foreseeable future, this RcppMsgPack package will live only on the ghrr drat repository. To make RcppMsgPack work, I currently have to include the MessagePack 1.4.0 headers. A matching package for this version of the headers is in Debian but so far only in experimental. Once this hits the mainline repository I can depend on it, and upload a (lighter, smaller) RcppMsgPack to CRAN. Until then, please just do
## install drat if not present
if (!require(drat)) install.packages("drat")
## use drat to select ghrr repo
drat::addRepo("ghrr")
## install RcppMsgPack
install.packages("RcppMsgPack")
More details, issue tickets etc are at the GitHub repository.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
Explaining G del s theorems to students is a pain. Period. How can those poor creatures crank their mind around a Completeness and an Incompleteness Proof I understand that. But then, there are brave souls using G del s theorems to explain the world of demons to writers, in particular to answer the question:
You can control a Demon by knowing its True Name, but why?
Very impressive.
Found at worldbuilding.stackexchange.com, pointed to me by a good friend. I dare to full quote author Cort Ammon (nothing more is known), to preserve this masterpiece. Thanks!!!!
/dev/sr0 /mnt/br auto defaults,noatime,auto,nofail 0 2and reload systemd configuration:
sudo systemctl daemon-reloadThe important parameters are auto and nofail : with auto , systemd mounts the filesystem as soon as the device is available. This behavior is different from sysvinit where auto is taken into account only when mount -a is run by init scripts. nofail ensures that boot does not fail when the device is not available. The second case is handled by a line like the following one (even if the line is split here to improve readability):
/dev/sr0 /mnt/br auto defaults,x-systemd.automount,\ x-systemd.device-timeout=5,noatime,noauto 0 2With the line above in /etc/fstab, the file system is mounted when user does (for instance) ls /mnt/br (actually, the first ls fails and triggers the mount. A second ls gives the expected result. There s probably a way to improve this behavior, but I ve not found it ) x-systemd.* parameters are documented in systemd.mount(5). Last but not least, using a plain device file (like /dev/sr0) works fine to automount optical devices. But it is difficult to predict the name of a device file created for a usb drive, so a LABEL or a UUID should be used in /etc/fstab instead of a plain device file. I.e. something like:
LABEL=my_usb_drive /mnt/my-drive auto defaults,auto,nofail 0 2All the best
There is overwhelming consensus that these requirements [for exceptional access] are incompatible with good security engineering practice Dr. Matthew BlazeThe challenge is that political people see everything as a political/policy issue, but this isn t that kind of issue. I get particularly frustrated when I read ignorant ramblings like this that dismiss the overwhelming consensus of the people that actually understand what needs to be done as emotional, hysterical obstructionism. Contrary to what seems to be that author s point, constructive dialogue and understanding values does nothing to change the technical risks of mandating exceptional access. Of course the opponents of Feinstein-Burr decry it as technologically illiterate, it is technologically illiterate. This doesn t quite rise to the level of that time the Indiana state legislature considered legislating a new value (or in fact multiple values) for the mathematical constant Pi, but it is in the same legislative domain.
The accelerated world of the Western or Westernized countries seems to be fed by an insidious food, which generates a kind of psychological dependence: anxiety. The economy of global markets cannot help it, it has a structural need of it to feed their iron logic of survival. The anxiety generated in the masses of consumers and in market competitors is crucial for Companies fighting each other and now they can only live if men are projected to objective targets continuously moving forward, without ever allowing them to achieve a stable destination.
The consumer is thus constantly maintained in a state of perpetual breathlessness, always looking for the fresh air of liberation that could eventually reduce his tension. It is a state of anxiety caused by false needs generated by advertising campaigns whose primary purpose is to create a need, to interpret to their advantage a still confused psychological demand leading to the destination decided by the market <Read More [by Fabio Marzocca]>
During a JAWS for Windows training, I was introduced to the
Research It feature of that screen reader.
Research It is a quick way to utilize web scraping to make
working with complex web pages easier.
It is about extracting specific information from a website that
does not offer an API. For instance, look up a word
in an online dictionary, or quickly check the status of
a delivery. Strictly speaking, this feature does not belong
in a screen reader, but it is a very helpful tool to have at your
fingertips.
Research It uses XQuery (actually, XQilla) to do all the
heavy lifting. This also means that the Research It Rulesets
are theoretically also useable on other platforms. I was immediately
hooked, because I always had a love for XPath. Looking
at XQuery code is totally self-explanatory for me.
I just like the syntax and semantics.
So I immediately checked out XQilla on Debian,
and found #821329 and #821330, which were promptly
fixed by Tommi Vainikainen, thanks to him for the really quick response!
Unfortunately, making xqilla:parse-html available and
upgrading to the latest upstream version is not enough to
use XQilla on Linux with the typical webpages out there.
Xerces-C++, which is what XQilla uses to fetch web resources,
does not support HTTPS URLs at the moment. I filed #821380 to
ask for HTTPS support in Xerces-C to be enabled by default.
And even with HTTPS support enabled in Xerces-C, the xqilla:parse-html
function (which is based on HTML Tidy) fails for
a lot of real-world webpages I tried.
Manually upgrading the six year old version of HTML Tidy in Debian
to the latest from GitHub (tidy-html5, #810951) did not help a lot either.
from click import argument, group
@group()
def xq():
"""Web scraping for command-line users."""
pass
@xq.group('github.com')
def github():
"""Quick access to github.com."""
pass
@github.command('code_search')
@argument('language')
@argument('query')
def github_code_search(language, query):
"""Search for source code."""
scrape(get='https://github.com/search',
params= 'l': language, 'q': query, 'type': 'code' )
declare function local:source-lines($table as node()*) as xs:string*
for $tr in $table/tr return normalize-space(data($tr))
;
let $results := html//div[@id="code_search_results"]/div[@class="code-list"]
for $div in $results/div
let $repo := data($div/p/a[1])
let $file := data($div/p/a[2])
let $link := resolve-uri(data($div/p/a[2]/@href))
return (concat($repo, ": ", $file), $link, local:source-lines($div//table),
"---------------------------------------------------------------")
fx:~/xq% ./xq.py github.com
Usage: xq.py github.com [OPTIONS] COMMAND [ARGS]...
Quick access to github.com.
Options:
--help Show this message and exit.
Commands:
code_search Search for source code.
fx:~/xq% ./xq.py github.com code_search Pascal '"debian/rules"'
prof7bit/LazPackager: frmlazpackageroptionsdeb.pas
https://github.com/prof7bit/LazPackager/blob/cc3e35e9bae0c5a582b0b301dcbb38047fba2ad9/frmlazpackageroptionsdeb.pas
230 procedure TFDebianOptions.BtnPreviewRulesClick(Sender: TObject);
231 begin
232 ShowPreview('debian/rules', EdRules.Text);
233 end;
234
235 procedure TFDebianOptions.BtnPreviewChangelogClick(Sender: TObject);
---------------------------------------------------------------
prof7bit/LazPackager: lazpackagerdebian.pas
https://github.com/prof7bit/LazPackager/blob/cc3e35e9bae0c5a582b0b301dcbb38047fba2ad9/lazpackagerdebian.pas
205 + 'mv ../rules debian/' + LF
206 + 'chmod +x debian/rules' + LF
207 + 'mv ../changelog debian/' + LF
208 + 'mv ../copyright debian/' + LF
---------------------------------------------------------------
from bs4 import BeautifulSoup
from bs4.element import Doctype, ResultSet
from inspect import currentframe
from itertools import chain
from os import path
from os.path import abspath, dirname
from subprocess import PIPE, run
from tempfile import NamedTemporaryFile
import requests
def scrape(get=None, post=None, find_all=None,
xquery_name=None, xquery_vars= , **kwargs):
"""Execute a XQuery file.
When either get or post is specified, fetch the resource and run it through
BeautifulSoup, passing it as context to the XQuery.
If find_all is given, wrap the result of executing find_all on
the BeautifulSoup in an artificial HTML body.
If xquery_name is not specified, the callers function name is used.
xquery_name combined with extension ".xq" is searched in the directory
where this Python script resides and executed with XQilla.
kwargs are passed to get or post calls. Typical extra keywords would be:
params -- To pass extra parameters to the URL.
data -- For HTTP POST.
"""
response = None
url = None
context = None
if get is not None:
response = requests.get(get, **kwargs)
elif post is not None:
response = requests.post(post, **kwargs)
if response is not None:
response.raise_for_status()
context = BeautifulSoup(response.text, 'lxml')
dtd = next(context.descendants)
if type(dtd) is Doctype:
dtd.extract()
if find_all is not None:
context = context.find_all(find_all)
url = response.url
if xquery_name is None:
xquery_name = currentframe().f_back.f_code.co_name
cmd = ['xqilla']
if context is not None:
if type(context) is BeautifulSoup:
soup = context
context = NamedTemporaryFile(mode='w')
print(soup, file=context)
cmd.extend(['-i', context.name])
elif isinstance(context, list) or isinstance(context, ResultSet):
tags = context
context = NamedTemporaryFile(mode='w')
print('<html><body>', file=context)
for item in tags: print(item, file=context)
print('</body></html>', file=context)
context.flush()
cmd.extend(['-i', context.name])
cmd.extend(chain.from_iterable(['-v', k, v] for k, v in xquery_vars.items()))
if url is not None:
cmd.extend(['-b', url])
cmd.append(abspath(path.join(dirname(__file__), xquery_name + ".xq")))
output = run(cmd, stdout=PIPE).stdout.decode('utf-8')
if type(context) is NamedTemporaryFile: context.close()
print(output, end='')
Last week, someone posted a request for help on the popular Server
Fault Q&A site: they had apparently accidentally deleted their entire web
hosting business, and all their backups. The post (now itself deleted) was a
reasonably obvious fake, but mainstream media reported on it anyway,
and then life imitated art and 123-reg went and did actually delete all their
hosted VMs, and their
backups.
I was chatting to some friends from $job-2 and we had a brief smug moment that
we had never done anything this bad, before moving on to incredulity that we
had never done anything this bad in the 5 years or so we were running the
University web servers. Some time later I realised that my personal backups
were at risk from something like this because I have a permanently mounted
/backup partition on my home NAS. I decided to fix it.
I already use Systemd to manage mounting the /backup partition (via a
backup.mount file) and its dependencies. I'll skip the finer details of that
for now.
I planned to define some new Systemd units for each backup job which
was previously scheduled via Cron in order that I could mark them as
depending on the /backup mount. I needed to adjust that mount definition by
adding StopWhenUnneeded=true. This ensures that /backup will be unmounted
when it is not in use by another job, and not at risk of a stray rm -rf.
The backup jobs are all simple shell scripts that convert quite easily into
services. An example:
backup-home.service:
[Unit] Requires=backup.mount After=backup.mount [Service] User=backupuser Group=backupuser ExecStart=/home/backupuser/bin/phobos-backup-homeTo schedule this, I also need to create a timer: backup-home.timer:
[Timer] OnCalendar=*-*-* 04:01:00 [Install] WantedBy=timers.targetTo enable the timer, you have to both enable and start it:
I created service and timer units for each of my cron jobs. The other big difference to driving these from Cron is that by default I won't get any emails if the jobs generate output - in particular, if they fail. I definitely do want mail if things fail. The Arch Wiki has an interesting proposed solution to this which I took a look at. It's a bit clunky, and my initial experiments with a derivation from this (usingsystemctl enable backup-home.timer
systemctl start backup-home.timer
mail(1) not sendmail(1)) have not yet generated any
mail.
Pros and Cons
The Systemd timespec is more intuitive than Cron's. It's a shame you need a
minimum of three more lines of boilerplate for the simplest of timers. I think
WantedBy=timers.target should probably be an implicit default for all .timer
type units. Here I think clarity suffers in the name of consistency.
With timers, start doesn't kick-off the job, it really means "enable" in the
context of timers, which is clumsy considering the existing enable verb,
which seems almost superfluous, but is necessary for consistency, .service and a .unit file for each active line in my
crontab, that's a lot of small files (twice as many as the number of jobs
being defined) and they're all stored in system-wide folder because of the
dependency on the necessarily system-level units defining the mount.
It's easy to forget the After= line for the backup services. On the one hand,
it's a shame that After= doesn't imply Require=, so you don't need both; or
alternatively there was a convenience option that did both. On the other hand,
there are already too many Systemd options and adding more conjoined ones would
just make it even more complicated.
It's a shame I couldn't use user-level units to achieve this, but they could
not depend on the system-level ones, nor activate /backup. This is a sensible
default, since you don't want any user to be able to start any service
on-demand, but some way of enabling it for these situations would be good.
I ruled out systemd.automount because a stray rm -rf would trigger the mount
which defeats the whole exercise.
Apparently this might be something you solve with Polkit, as the Arch Wiki
explains, which looks like it has
XML disease.
I need to get mail-on-error working reliably.
I've lately been working on support for
Secure Boot in Debian,
mostly in the packages maintained by the kernel team.
My instructions for setting up UEFI Secure Boot are based on OVMF
running on KVM/QEMU. All 'Designed for Windows' PCs should allow
reconfiguration of SB, but it may not be easy to do so. The ability to reconfigure SB is indeed now optional for@benhutchingsuk "Hardware can be Designed for Windows 10 and can offer no way to opt out of the Secure Boot" https://t.co/lQVdPYtMwx Robert Edmonds (@rsedmonds) April 20, 2016
devices which are designed to always boot with a specific Secure Boot configuration. I also noticed that the requirements say that OEMs should not sign an EFI shell binary. Therefore I've revised the instructions to use efibootmgr instead. Background UEFI Secure Boot, when configured and enabled (which it is on most new PCs) requires that whatever it loads is signed with a trusted key. The one common trusted key for PCs is held by Microsoft, and while they will sign other people's code for a nominal fee, they require that it also validates the code it loads, i.e. the kernel or next stage boot loader. The kernel in turn is responsible for validating any code that could compromise its integrity (kernel modules, kexec images). Currently there are no such signed boot loaders in Debian, though the shim and grub-signed packages included in many other distributions should be usable. However it's possible to load an appropriately configured Linux kernel directly from the UEFI firmware (typically through the shell) which is what I'm doing at the moment. Packaging signed kernels Signing keys obviously need to be protected against disclosure; the private keys can't be included in a source package. We also won't install them on buildds separately, and generating signatures at build time would of course be unreproducible. So I've created a new source package, linux-signed, which contains detached signatures prepared offline. Currently the binary packages built from linux-signed also contain only detached signatures, which are applied as necessary at installation time. The signed kernel image (only on x86 for now) is named /boot/vmlinuz-kversion.efi.signed. However, since packages must not modify files owned by another package and I didn't want to dpkg-divert thousands of modules, the module signatures remain detached. Detached module signatures are a new invention of mine, and require changes in kmod and various other packages to support them. (An alternate might be to put signed modules under a different directory and drop a configuration file in /lib/depmod.d to make them higher priority. But then we end up with two copies of every module installed, which can be a substantial waste of space.) Preparation The packages you need to repeat the experiment:
openssl req -new -x509 -newkey rsa:2048 -keyout pk.key -out pk.crt \
-outform der -nodes
You'll also need to install the certificate for my kernel image
signing key, which is under debian/certs in the
linux-signed package. OVMF requires this in DER format:
openssl x509 -in linux-signed-1~exp3/debian/certs/linux-image-benh@debian.org.cert.pem \
-out linux.crt -outform der
You'll need to copy the certificate(s) to a FAT-formatted partition
such as the EFI system partition, so that the firmware can read it.
Use efibootmgr to add a boot entry for the kernel, for
example:
efibootmgr -c -d /dev/sda -L linux-signed -l '\vmlinuz.efi' -u 'initrd=initrd.img root=/dev/sda2 ro quiet'You should use the same kernel parameters as usual, except that you also need to specify the initrd filename using the initrd= parameter. The EFI stub code at the beginning of the kernel will load the initrd using EFI boot services. Enabling Secure Boot
Switching from one GnuPG master key to the usage of subkeys was long on my list of things I wanted to do, but never came around. With the advent of a YubiKey NEO in my pocket I finally took the plunge: reading through lots of web pages (and adding one here for confusion), trying to understand the procedures, and above all, understanding my own requirements!
To sum up a long story, it was worth the plunge, and all over the security level of my working environment has improved considerable.
While the advantages of subkeys are well documented (e.g., Debian Wiki), at the end of the day I was like probably many Debian Developers having one master key that was used for every action: mail decryption and signing, signing of uploads, etc. Traveling a lot I always felt uncomfortable. Despite a lengthy passphrase, I still didn t want my master key to get into wrong hands in case the laptop got stolen. Furthermore, I had my master key on several computers (work, laptop, mail server), which didn t help a lot either. With all this, I started to compile a list of requirements/objectives I wanted to have:
$ gpg -K $MASTERKEY
sec 4096R/0x6CACA448860CDC13 2010-09-14
Key fingerprint = F7D8 A928 26E3 16A1 9FA0 ACF0 6CAC A448 860C DC13
uid Norbert Preining <norbert@preining.info>
uid Norbert Preining <preining@logic.at>
uid Norbert Preining <preining@debian.org>
uid Norbert Preining <preining@jaist.ac.jp>
ssb 4096R/0xD1D2BD14810F62B3 2010-09-14 |
$ gpg --expert --edit-key $MASTERKEY |
$ gpg --expert --edit-key $MASTERKEY
gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
pub 4096R/0x6CACA448860CDC13 created: 2010-09-14 expires: never usage: SC
trust: ultimate validity: ultimate
sub 4096R/0xD1D2BD14810F62B3 created: 2010-09-14 expires: never usage: E
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
gpg> expire
Changing expiration time for the primary key.
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Mon 06 Feb 2017 08:09:16 PM JST
Is this correct? (y/N) y
You need a passphrase to unlock the secret key for
user: "Norbert Preining <norbert@preining.info>"
4096-bit RSA key, ID 0x6CACA448860CDC13, created 2010-09-14
Enter passphrase:
pub 4096R/0x6CACA448860CDC13 created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
sub 4096R/0xD1D2BD14810F62B3 created: 2010-09-14 expires: never usage: E
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
gpg> key 1
pub 4096R/0x6CACA448860CDC13 created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
sub* 4096R/0xD1D2BD14810F62B3 created: 2010-09-14 expires: never usage: E
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
gpg> expire
Changing expiration time for a subkey.
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Mon 06 Feb 2017 08:09:27 PM JST
Is this correct? (y/N) y
You need a passphrase to unlock the secret key for
user: "Norbert Preining <norbert@preining.info>"
4096-bit RSA key, ID 0x6CACA448860CDC13, created 2010-09-14
Enter passphrase:
pub 4096R/0x6CACA448860CDC13 created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
sub* 4096R/0xD1D2BD14810F62B3 created: 2010-09-14 expires: 2017-02-06 usage: E
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp> |
gpg> addphoto
Pick an image to use for your photo ID. The image must be a JPEG file.
Remember that the image is stored within your public key. If you use a
very large picture, your key will become very large as well!
Keeping the image close to 240x288 is a good size to use.
Enter JPEG filename for photo ID: GPG/norbert-head.jpg
Is this photo correct (y/N/q)? y
You need a passphrase to unlock the secret key for
user: "Norbert Preining <norbert@preining.info>"
4096-bit RSA key, ID 0x6CACA448860CDC13, created 2010-09-14
Enter passphrase:
pub 4096R/0x6CACA448860CDC13 created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
sub* 4096R/0xD1D2BD14810F62B3 created: 2010-09-14 expires: 2017-02-06 usage: E
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ unknown] (5) [jpeg image of size 4185] |
gpg> addkey
Key is protected.
You need a passphrase to unlock the secret key for
user: "Norbert Preining <norbert@preining.info>"
4096-bit RSA key, ID 0x6CACA448860CDC13, created 2010-09-14
Enter passphrase:
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
Your selection? 4
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Mon 06 Feb 2017 08:10:06 PM JST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
....+++++
..........+++++
pub 4096R/0x6CACA448860CDC13 created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
sub* 4096R/0xD1D2BD14810F62B3 created: 2010-09-14 expires: 2017-02-06 usage: E
sub 2048R/0xEC00B8DAD32266AA created: 2016-02-07 expires: 2017-02-06 usage: S
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ unknown] (5) [jpeg image of size 4185] |
gpg> addkey
Key is protected.
You need a passphrase to unlock the secret key for
user: "Norbert Preining <norbert@preining.info>"
4096-bit RSA key, ID 0x6CACA448860CDC13, created 2010-09-14
Enter passphrase:
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
Your selection? 6
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Mon 06 Feb 2017 08:10:20 PM JST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
..+++++
........+++++
pub 4096R/0x6CACA448860CDC13 created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
sub* 4096R/0xD1D2BD14810F62B3 created: 2010-09-14 expires: 2017-02-06 usage: E
sub 2048R/0xEC00B8DAD32266AA created: 2016-02-07 expires: 2017-02-06 usage: S
sub 2048R/0xBF361ED434425B4C created: 2016-02-07 expires: 2017-02-06 usage: E
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ unknown] (5) [jpeg image of size 4185] |
gpg> addkey
Key is protected.
You need a passphrase to unlock the secret key for
user: "Norbert Preining <norbert@preining.info>"
4096-bit RSA key, ID 0x6CACA448860CDC13, created 2010-09-14
Enter passphrase:
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
Your selection? 8
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt
(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? s
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt
(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? e
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions:
(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? a
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate
(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? q
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Mon 06 Feb 2017 08:10:34 PM JST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
......+++++
+++++
pub 4096R/0x6CACA448860CDC13 created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
sub* 4096R/0xD1D2BD14810F62B3 created: 2010-09-14 expires: 2017-02-06 usage: E
sub 2048R/0xEC00B8DAD32266AA created: 2016-02-07 expires: 2017-02-06 usage: S
sub 2048R/0xBF361ED434425B4C created: 2016-02-07 expires: 2017-02-06 usage: E
sub 2048R/0x9C7CA4E294F04D49 created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ unknown] (5) [jpeg image of size 4185]
gpg> save |
$ gpg --expert --edit-key $MASTERKEY
gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
gpg: checking the trustdb
gpg: public key 0x0FC3EC02FBBB8AB1 is 58138 seconds newer than the signature
gpg: 3 marginal(s) needed, 1 complete(s) needed, classic trust model
gpg: depth: 0 valid: 2 signed: 28 trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: depth: 1 valid: 28 signed: 41 trust: 28-, 0q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at 2016-11-02
pub 4096R/0x6CACA448860CDC13 created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
sub 4096R/0xD1D2BD14810F62B3 created: 2010-09-14 expires: 2017-02-06 usage: E
sub 2048R/0xEC00B8DAD32266AA created: 2016-02-07 expires: 2017-02-06 usage: S
sub 2048R/0xBF361ED434425B4C created: 2016-02-07 expires: 2017-02-06 usage: E
sub 2048R/0x9C7CA4E294F04D49 created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> |
$ gpg --gen-revoke $MASTERKEY > GPG/revoke-certificate-$MASTERKEY.txt sec 4096R/0x6CACA448860CDC13 2010-09-14 Norbert Preining <norbert@preining.info> Create a revocation certificate for this key? (y/N) y Please select the reason for the revocation: 0 = No reason specified 1 = Key has been compromised 2 = Key is superseded 3 = Key is no longer used Q = Cancel (Probably you want to select 1 here) Your decision? 1 Enter an optional description; end it with an empty line: > Reason for revocation: Key has been compromised (No description given) Is this okay? (y/N) y You need a passphrase to unlock the secret key for user: "Norbert Preining <norbert@preining.info>" 4096-bit RSA key, ID 0x6CACA448860CDC13, created 2010-09-14 Enter passphrase: ASCII armored output forced. Revocation certificate created. |
$ killall gpg-agent |
$ gpg2 -K $MASTERKEY
gpg: keyserver option 'ca-cert-file' is obsolete; please use 'hkp-cacert' in dirmngr.conf
gpg: starting migration from earlier GnuPG versions
gpg: porting secret keys from '/home/norbert/.gnupg/secring.gpg' to gpg-agent
gpg: key 0xD2BF4AA309C5B094: secret key imported
gpg: key 0x6CACA448860CDC13: secret key imported
gpg: migration succeeded
sec rsa4096/0x6CACA448860CDC13 2010-09-14 [SC] [expires: 2017-02-06]
Key fingerprint = F7D8 A928 26E3 16A1 9FA0 ACF0 6CAC A448 860C DC13
uid [ultimate] Norbert Preining <norbert@preining.info>
uid [ultimate] Norbert Preining <preining@logic.at>
uid [ultimate] Norbert Preining <preining@debian.org>
uid [ultimate] Norbert Preining <preining@jaist.ac.jp>
uid [ultimate] [jpeg image of size 4185]
ssb rsa4096/0xD1D2BD14810F62B3 2010-09-14 [E] [expires: 2017-02-06]
ssb rsa2048/0xEC00B8DAD32266AA 2016-02-07 [S] [expires: 2017-02-06]
ssb rsa2048/0xBF361ED434425B4C 2016-02-07 [E] [expires: 2017-02-06]
ssb rsa2048/0x9C7CA4E294F04D49 2016-02-07 [A] [expires: 2017-02-06] |
%Assuan% socket=/dev/shm/S.gpg-agent |
$ gpg2 --edit-key $MASTERKEY
gpg (GnuPG) 2.1.11; Copyright (C) 2016 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> key 2
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb* rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> keytocard
Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection? 1
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb* rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> key 2
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> key 3
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb* rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> keytocard
Please select where to store the key:
(2) Encryption key
Your selection? 2
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb* rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> key 3
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> key 4
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb* rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> keytocard
Please select where to store the key:
(3) Authentication key
Your selection? 3
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb* rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> key 4
sec rsa4096/0x6CACA448860CDC13
created: 2010-09-14 expires: 2017-02-06 usage: SC
trust: ultimate validity: ultimate
ssb rsa4096/0xD1D2BD14810F62B3
created: 2010-09-14 expires: 2017-02-06 usage: E
ssb rsa2048/0xEC00B8DAD32266AA
created: 2016-02-07 expires: 2017-02-06 usage: S
ssb rsa2048/0xBF361ED434425B4C
created: 2016-02-07 expires: 2017-02-06 usage: E
ssb rsa2048/0x9C7CA4E294F04D49
created: 2016-02-07 expires: 2017-02-06 usage: A
[ultimate] (1). Norbert Preining <norbert@preining.info>
[ultimate] (2) Norbert Preining <preining@logic.at>
[ultimate] (3) Norbert Preining <preining@debian.org>
[ultimate] (4) Norbert Preining <preining@jaist.ac.jp>
[ultimate] (5) [jpeg image of size 4185]
gpg> save |
$ gpg2 -K $MASTERKEY
gpg: keyserver option 'ca-cert-file' is obsolete; please use 'hkp-cacert' in dirmngr.conf
sec rsa4096/0x6CACA448860CDC13 2010-09-14 [SC] [expires: 2017-02-06]
Key fingerprint = F7D8 A928 26E3 16A1 9FA0 ACF0 6CAC A448 860C DC13
uid [ultimate] Norbert Preining <norbert@preining.info>
uid [ultimate] Norbert Preining <preining@logic.at>
uid [ultimate] Norbert Preining <preining@debian.org>
uid [ultimate] Norbert Preining <preining@jaist.ac.jp>
uid [ultimate] [jpeg image of size 4185]
ssb rsa4096/0xD1D2BD14810F62B3 2010-09-14 [E] [expires: 2017-02-06]
ssb> rsa2048/0xEC00B8DAD32266AA 2016-02-07 [S] [expires: 2017-02-06]
ssb> rsa2048/0xBF361ED434425B4C 2016-02-07 [E] [expires: 2017-02-06]
ssb> rsa2048/0x9C7CA4E294F04D49 2016-02-07 [A] [expires: 2017-02-06]
$ gpg -K $MASTERKEY
sec 4096R/0x6CACA448860CDC13 2010-09-14 [expires: 2017-02-06]
Key fingerprint = F7D8 A928 26E3 16A1 9FA0 ACF0 6CAC A448 860C DC13
uid Norbert Preining <norbert@preining.info>
uid Norbert Preining <preining@logic.at>
uid Norbert Preining <preining@debian.org>
uid Norbert Preining <preining@jaist.ac.jp>
uid [jpeg image of size 4185]
ssb 4096R/0xD1D2BD14810F62B3 2010-09-14 [expires: 2017-02-06]
ssb 2048R/0xEC00B8DAD32266AA 2016-02-07 [expires: 2017-02-06]
ssb 2048R/0xBF361ED434425B4C 2016-02-07 [expires: 2017-02-06]
ssb 2048R/0x9C7CA4E294F04D49 2016-02-07 [expires: 2017-02-06]
$ gpg2 --card-status
....
Name of cardholder: Norbert Preining
....
PIN retry counter : 3 3 3
Signature counter : 0
Signature key ....: 5871 F824 2DCC 3660 2362 BE7D EC00 B8DA D322 66AA
created ....: 2016-02-07 11:10:06
Encryption key....: 2501 195C 90AB F4D2 3DEA A303 BF36 1ED4 3442 5B4C
created ....: 2016-02-07 11:10:20
Authentication key: 9CFB 3775 C164 0E99 F0C8 014C 9C7C A4E2 94F0 4D49
created ....: 2016-02-07 11:10:34
General key info..: sub rsa2048/0xEC00B8DAD32266AA 2016-02-07 Norbert Preining <norbert@preining.info>
sec rsa4096/0x6CACA448860CDC13 created: 2010-09-14 expires: 2017-02-06
ssb rsa4096/0xD1D2BD14810F62B3 created: 2010-09-14 expires: 2017-02-06
ssb> rsa2048/0xEC00B8DAD32266AA created: 2016-02-07 expires: 2017-02-06
card-no: 0006 03645719
ssb> rsa2048/0xBF361ED434425B4C created: 2016-02-07 expires: 2017-02-06
card-no: 0006 03645719
ssb> rsa2048/0x9C7CA4E294F04D49 created: 2016-02-07 expires: 2017-02-06
card-no: 0006 03645719
$ |
$ gpg2 --with-keygrip --list-key $MASTERKEY
pub rsa4096/0x6CACA448860CDC13 2010-09-14 [SC] [expires: 2017-02-06]
Key fingerprint = F7D8 A928 26E3 16A1 9FA0 ACF0 6CAC A448 860C DC13
Keygrip = 9DC1E90703856C1DE0EAC970CED7ABF5EE5EF79D
uid [ultimate] Norbert Preining <norbert@preining.info>
uid [ultimate] Norbert Preining <preining@logic.at>
uid [ultimate] Norbert Preining <preining@debian.org>
uid [ultimate] Norbert Preining <preining@jaist.ac.jp>
uid [ultimate] [jpeg image of size 4185]
sub rsa4096/0xD1D2BD14810F62B3 2010-09-14 [E] [expires: 2017-02-06]
Keygrip = 4B8FF57434DD989243666377376903281D861596
sub rsa2048/0xEC00B8DAD32266AA 2016-02-07 [S] [expires: 2017-02-06]
Keygrip = 39B14EF1392F2F251863A87AE4D44CE502755C39
sub rsa2048/0xBF361ED434425B4C 2016-02-07 [E] [expires: 2017-02-06]
Keygrip = E41C8DDB2A22976AE0DA8D7D11F586EA793203EA
sub rsa2048/0x9C7CA4E294F04D49 2016-02-07 [A] [expires: 2017-02-06]
Keygrip = A337DE390143074C6DBFEA64224359B9859B02FC
$ rm ~/.gnupg/private-keys-v1.d/9DC1E90703856C1DE0EAC970CED7ABF5EE5EF79D.key
$ |
$ gpg2 -K $MASTERKEY sec# rsa4096/0x6CACA448860CDC13 2010-09-14 [SC] [expires: 2017-02-06] ... |
$ gpg --output secret-subkeys --export-secret-subkeys $MASTERKEY $ gpg --delete-secret-keys $MASTERKEY sec 4096R/0x6CACA448860CDC13 2010-09-14 Norbert Preining <norbert@preining.info> Delete this key from the keyring? (y/N) y This is a secret key! - really delete? (y/N) y $ gpg --import secret-subkeys gpg: key 0x6CACA448860CDC13: secret key imported gpg: key 0x6CACA448860CDC13: "Norbert Preining <norbert@preining.info>" not changed gpg: Total number processed: 1 gpg: unchanged: 1 gpg: secret keys read: 1 gpg: secret keys imported: 1 $ |
$ gpg2 -K $MASTERKEY
sec# rsa4096/0x6CACA448860CDC13 2010-09-14 [SC] [expires: 2017-02-06]
Key fingerprint = F7D8 A928 26E3 16A1 9FA0 ACF0 6CAC A448 860C DC13
uid [ultimate] Norbert Preining <norbert@preining.info>
uid [ultimate] Norbert Preining <preining@logic.at>
uid [ultimate] Norbert Preining <preining@debian.org>
uid [ultimate] Norbert Preining <preining@jaist.ac.jp>
uid [ultimate] [jpeg image of size 4185]
ssb rsa4096/0xD1D2BD14810F62B3 2010-09-14 [E] [expires: 2017-02-06]
ssb> rsa2048/0xEC00B8DAD32266AA 2016-02-07 [S] [expires: 2017-02-06]
ssb> rsa2048/0xBF361ED434425B4C 2016-02-07 [E] [expires: 2017-02-06]
ssb> rsa2048/0x9C7CA4E294F04D49 2016-02-07 [A] [expires: 2017-02-06]
$ |
$ gpg -K $MASTERKEY
sec# 4096R/0x6CACA448860CDC13 2010-09-14 [expires: 2017-02-06]
Key fingerprint = F7D8 A928 26E3 16A1 9FA0 ACF0 6CAC A448 860C DC13
uid Norbert Preining <norbert@preining.info>
uid Norbert Preining <preining@logic.at>
uid Norbert Preining <preining@debian.org>
uid Norbert Preining <preining@jaist.ac.jp>
uid [jpeg image of size 4185]
ssb 4096R/0xD1D2BD14810F62B3 2010-09-14 [expires: 2017-02-06]
ssb 2048R/0xEC00B8DAD32266AA 2016-02-07 [expires: 2017-02-06]
ssb 2048R/0xBF361ED434425B4C 2016-02-07 [expires: 2017-02-06]
ssb 2048R/0x9C7CA4E294F04D49 2016-02-07 [expires: 2017-02-06]
$ |
$ cp -a .gnupg .gnupg-mail $ cd .gnupg-mail $ rm -rf private-keys-v1.d/ pubring.gpg~ reader_0.status $ rm -rf S.gpg-agent* S.scdaemon .gpg-v21-migrated |
$ cd $HOME/.gnupg $ rm secring.gpg |
gpg --keyserver hkp://keyring.debian.org --send-key YOURMASTERKEYID |
gpg --keyserver hkp://pool.sks-keyservers.net --send-key $MASTERKEY |
python -m SimpleHTTPServer http server.Next.