The Fate of gmane.org

As previously discussed in this embarrassing saga, gmane.org was bought by Yomura Corporation, and they have now let the domain expire.

The domain went to the normal Namesilo auction process, and I was waiting for it to appear there so I could buy it back. I didn’t check often enough, and before I was able to put in a bid, somebody else had put in a max bid, and I was unable to buy it.

I’m assuming it’ll now be taken over by spammers or somebody else? We’ll see.

But here’s a call for action: Yomura, the previous owners, have 22 days to renew the domain, get it back, and hand it off to somebody else. Does anybody know anybody there they can prod? Mark? Eden? Sam? Whoever? It would be a shame if all the gmane.org links out there end up pointing to some scam or malware site.

[Update 12 hours later: I just got a message from NameSilo saying that the domain has, indeed, been renewed, so perhaps somebody did some poking? Or something? But I guess the domain is safe from malware squatters again.]

*sigh*

OK, here’s the longer story about the expiry process, because I knew nothing about what the process was like, and you may be as confused as I was.

So: A couple of weeks ago I noticed that the domain, set for expiry on Feb. 17th, had switched to a different set of name servers:

The gmane.org domain now pointed here:

A nice blank page with just the following JS:

Kinda invalid:

But I figured that it was just some holding page.

But they got a new certificate from DigiCert?

Uh-oh, I thought.

So the expiration date is now in 2021…

The IP address points to an IP range owned by SEDO. But… Who is SEDO, anyway? It turns out that it’s a domain name auction site. And I knew nothing about domain name auctions.

It turns out that most of the bigger registrars, upon domain expiry, put domains up for auction, usually for a month. In this period, the original registrant can still renew the domain and get it back, so it’s an auction during the grace period.

The rules vary between auction houses, but NameSilo will typically put older, attractive expired domains (and gmane.org is from 2002) up for auction with a max price of $1K. If somebody bids the max price, they’re ensured winning the action, so I thought I’d just sit still here, not calling attention to the situation and wait until it comes up for auction, and then bid $1K.

But I didn’t reload the page often enough, and somebody else bid $1K, so I’m locked out.

… and somebody bid $1K.

I’ve been looking at this page for days now, and these other five-letter .org domain names have been there with bids for, like, $1 all this time. And then gmane.org shows up, and somebody immediately bids $1K.

*sigh*

Well, I have no idea who that is, so for all I know, it’s somebody nice? If so, please get in touch: larsi@gnus.org.

New Lists Can Now Be Added To Gmane

I’ve now hacked up a new admin interface to the Gmane mailing list archive.

If you want to add new lists, use the new admin interface. Older lists can also be edited, and you can request resubscription and stuff.

This stuff has not exactly been rigorously tested, so if you have any problems with the interface, leave a comment here and say what happened.

Reagent is… Nice?

I’ve been procrastinating on writing a web-based admin interface for news.gmane.io… because I just haven’t been able to make up my mind as to what technologies to use.

I hate learning new stuff, but it feels pretty stagnant to tap away in Javascript (on the frontend) and PHP for whatever has to happen on the backend. I really just kinda dislike PHP for no particular reason, but it’s so convenient: If you need a simple API for doing whatever, you write a .php page and that’s it. No dependencies, no setup, pretty good error reporting: Everything built in in Apache.

But I don’t liiiike iiiittt. (Imagine a whiny voice.)

For the Gmane stuff, I had the additional problem that I have a lot of admin logic in Emacs, and I want to keep that. Because it’s really convenient, especially when doing mass updates.

So… it took me weeks to accept it, but if I don’t want to implement a lot of things twice, I had to use Emacs on the backend.

*insert shocked face here*

I wrote a very short PHP component that does the TLS and the auth, and just reads some JSON posted to it, sends it over to Emacs, reads the JSON from Emacs and spits it out to the client. Like… middleware.

I could have done the HTTPS server in Emacs, too, but there’s just too many variables to get that solid, and Apache works.

So. That’s the backend, and what about the frontend?

I have no knowledge of Clojure, ClojureScript, Java or React, so I settled on Reagent.

My first stumbling block was Clojure, of course. I’ve been writing in Common Lisp for my day job for a couple of decades, and Clojure is… not Common Lisp? And I’m not sure what the design philosophy behind it is. Is it perhaps “make it look cool enough so that Java people won’t notice that it’s Lisp”?

Compared to Common Lisp, it’s terse and tends towards line noise, just like Perl. I made the following comment on irc:

(lambda (bar) (foo bar)) is the same as #(foo %)

And got the sarcastic response back:

And I guess (lambda (foo zoo) (bar foo zoo)) is the same as #(bar %1 %2)?

And it is! It was a joke, but that’s exactly what it is. When people are sarcastic, but happen onto the actual language design, that says… something?

And, oy, don’t get me started on the threading operators (-> and –>). Perhaps designed to placate Java developers who can’t read anything but foo.bar().zot().foobar()? More than a few of the design decisions seem predicated on limitations of the Java language (which are then reflected in the JVM), like there not being “real” keyword arguments for functions.

My point is: My quibbles are irrelevant. Whatever the idea behind Clojure was — it worked. People love these tricks, because people love writing code that’s incomprehensible I mean clever.

We now have a Lisp that’s mainstream enough that you can do web development on it instead of writing Javascript. And for that we’re all grateful.

I have not learned Clojure in depth (to put it mildly), but learning enough to write a web page only took a day. I guess I’ll look back upon my first ClojureScript project in shame, but it, like, works, and it’s a lot more fun to add new stuff to it now than it would have been in Javascript.

My major problem with all this is… the tooling isn’t quite all there yet when developing. With leim and Figwheel, everything reloads nicely and magically in the browser while doing stuff, and when doing something egregiously wrong, I get nice error messages:

However, if the breakage isn’t during compilation, the error reporting is really, really bad:

That’s an error message from line 25173 in react-dom.js, and determining where the error in my .cljs file is is… difficult? I thought I must be doing something obviously wrong to not get better error reporting, but googling this stuff shows that people mostly are just putting a lot of prns everywhere, and that’s really primitive.

Even worse are Reagent errors that are less… errorey. I spent an hour on a problem with bind-fields because I thought it took a function parameter, but it wanted a vector. Absolutely no feedback whatsoever — nothing worked, but I didn’t see what the problem was before I googled “reagent-forms” “bind-keys” (with quotes), and the second answer is somebody who’d done exactly what I’d done.

And some of the error messaging seems wilfully obtuse:

This was because of:

Yes, those should be square brackets. (And note: No reporting on what line the error was on.)

*sigh*

But Reagent feels quite nice, and the Hickup HTML syntax is wonderful: The best I’ve seen in any language. Even real Lisps don’t have an HTML-generator syntax that’s that thought-through and regular. I mean… this makes me happy:

[:div
 [:h2 "New edit requests"]
 [:div#requests.log
  (map (fn [req]
         [:div.clickable {:on-click #(show-edit % req)
                         :key (:request-time req)}
			 (:request-time req) " " (:newsgroup req)])
       (:ok data))]]

Here’s the live admin interface in action, handling an edit request:

news.gmane.org is now news.gmane.io

As previously discussed, the gmane.org domain was no longer viable, and the NNTP server has now moved to news.gmane.io.

Likewise, mailing list subscriptions have been moved from m.gmane.org to m.gmane-mx.org.

As of this writing, neither service is up, because I’m doing the final resync before restarting the services on a new server. I expect the services to be back up again about 21:00 GMT (January 15th 2020), so don’t panic before that time.

DNS changes may also take some time to propagate.

[Edit at 15:30 GMT: I had misremembered how long the rsync took, so we’re now live six hours ahead of schedule. This Shouldn’t Possibly Happen. I mean, a computer project not being late. Anyway, both Gmane and Gwene feeds are now processing, but the news-to-mail bits aren’t up yet.]

OK, service announcement done, so I thought I’d write a bit about what happened the last week:

First of all, thank you for all the nice comments and PVT EMAILs of support. I wasn’t quite sure whether to continue running the NNTP server, but getting some feedback helps.

So then I started moving 15K mailing lists from a subscription on gmane.org to the new domain, and that was… er… interesting? The process works like this:

The Gmane configuration is a file that has one of these entries per list:

gmane.test   gmane-test@quimby.gnus.org
  Testing the Gmane hierarchy
  mailman gt-gmane-test
  validated=2020-01-13
  transfer=done
  crosspost-posting=no

I’ve got an Emacs mode to do a the maintenance work (subscribing, unsubscribing and the like), so I utilised that to write a function that would send out two unsubscription messages (because lists may be subscribed as @gmane.org or @m.gmane.org for historical reasons and there’s no record of which one) and one subscription message for the new @m.gmane-mx address. This bit is fully automated, so I could just sit there watching Emacs send out messages at a somewhat speedy clip. (Well, sending out all the messages took 12 hours in total due to how it’s done: It’s actually doing RPC via NNTP so that the messages are sent directly from the MTA instead of from me, because that looks less spammy.)

(While looking at Emacs doing this bit, I watched Witcher, which was surprisingly entertaining… in parts, and really, really tedious for the rest of the time. And, since it was Netflix, it looked cheap and shoddy.)

I did this in 1K batches, because when I’ve triggered this bit, all messages for the group in question go to a special gmane.admin group, so that I can see all the error messages and stuff, but most importantly: The “reply to confirm subscription” messages, which I then have to respond to (from Gnus). That’s semi-scriptable, but when the “please reply” message is in Chinese, I have to kinda guess.

Then after that, the “Welcome to foo” messages start pouring in, and again, handling the ones in English is fine, but then there’s all the other languages. I know Willkommen, and I can guess at bem-vinda and bienvenu, but Japanese is not my forte, so more guessing is involved.

So this took two days, and for the second day I watched both seasons of Fleabag (the first one is really fun and original and weird, and in the second one they removed everything that was interesting about it and made it into a normal boring dramedy, which explains why it’s on all the “best of” lists of 2019, and even won the Golden Globe. Well played!).

Fun bits from this process: If you’re sending out mail to email addresses that may not longer exist, you’ll end up being branded a spammer, but that wasn’t really much of a surprise.

What did surprise me was that Sourceforge has made it impossible to sign up to mailing lists via email, so we either had to abandon the 2K Sourceforge lists (I know! So many! I had no idea) or do something… semimanually. So I wrote a little bit to open Firefox on each list URL, which put the unique gmane-mx.org into the X selection, so doing each list was “Super-s Right-Mouse TAB TAB SPACE TAB SPACE RET Super-TAB”, and I could do one in five seconds without moving my hands from the keyboard (it’s got build in mouse buttons).

But then it turns out that if you do that a lot, Sourceforge will sic the old-fashioned “click on the three palms” captcha on you. Which took the throughput way, way down.

So for the first half of the Sourceforge lists, I utilised the power of crowdsourcing, and sent off 100 lists each to people who volunteered to do this mindless and boring bit. (Some came back for seconds!) Thank you all again for volunteering.

For the second half, I discovered the wonderful world of captcha solvers, and after signing up with a free wit.ai API key, it worked pretty reliably. So I did most of the second day myself, since it just added a new “TAB RET” bit to each list. (I watched the Alan Bennett at the BBC box set for this part. It’s quite extraordinary. I particularly loved the one with Mrs Bucket in the hospital… and the one with the photographer in the churchyard… and the one with the guy who retires, is unhappy about the retirement, and then gets a stroke and dies.)

Uhm… Any other observations? Ah, right; the IETF MTAs rate-limited me to about one email per ten minutes, so it took four days for all the un/resubscription messages to get through, and some probably just timed out, so I should do another sweep of those bits.

OK… that’s it? Now I just have to wait for the rsync and the DNS changes, which is why I’m going on for this long.

Let’s hear it for TV and wine; two invaluable companions when doing boring semi-manual labour.

Whatever Happened To news.gmane.org?

I fucked up.

Short version: If you’re reading mailing lists with an NNTP news reader via news.gmane.org, you should update your news reader to point to news.gmane.io instead.

Over the past few years, people have asked me what happened to Gmane, and I’ve mostly clasped my hands over my ears and gone “la la la can’t hear you”, because there’s nothing about the story I’m now finally going to tell that I don’t find highly embarrassing. I had hoped I could just continue that way until I die, but perhaps it would be more constructive to actually tell people what’s going on instead of doing an ostrich impression.

So here’s the long, boring and stupid story.

But first, just some background, because there’s no reason you should know what I’m blathering on about: In 2002 I started a mailing list archive called Gmane. It was fun for many years: I got to write a whole bunch of software for the web site, and it was a useful and satisfying hobby (with some quirks, like not daring to visit India). After a decade or so I started getting burned out, and that’s when my problems started.

At that point I should have looked for somebody to take over Gmane in an orderly fashion, but there were (at least) two reasons I didn’t: I felt a childish attachment to the entire project (I think the feeling can best expressed summed up as “NO! MINE!”), and while I could easily see that somebody would want to take over the web part, the NNTP part (which was the one I used personally) seemed too obscure for anybody to be interested in.

So things limped along, me not having any fun at all at this point, and whenever anybody approached me with feelers towards taking over, I would mostly not reply, because when formulating a reason to say no, I didn’t really have a good reason.

And then the DDoS happened, taking out both Gmane and my kind employer, and I lost my shit. I can’t properly express how little I want to be typing these paragraphs, because I’m so embarrassed by my inadequate handling of the situation. But at least here was an opportunity to hand over Gmane to somebody who could continue running it responsibly.

I got a whole bunch of nice offers from people, among them from somebody working at C, a company with a good reputation and huge reach.

I thought it over, and I said yes to the offer from Y. Because I was thinking “those C. people are nice…” Somehow it had gotten into my mind that Y was C. I have no explanation or excuse: I looked at two totally different company names, and I thought in my head that I was saying yes to one while sending email to the other.

My proposal was that I would still own the gmane.org domain, but Y said they had to own it, so I just signed it over, sent them an SSD with the spool, and continued running the NNTP news server (now hosted in a slightly different place).

By that time I had realised that I’m in touch not with the company I was intending to give Gmane to, but at that point I thought it would be churlish to yank Gmane away from them, saying “oops! wrong company!”

Yes, everything here is embarrassing.

It took Y half a year to get the web site up again, and finally all those dead links stopped screaming. However, the site went down frequently (I didn’t get much communication from Y, but apparently there were more DDoS attacks), and it’s been down completely for at least the last year, I think?

Which brings us to last year, when the company I’d been a co-founder of back in 1997 and worked for since, entered into a sales process. (The other co-founder and majority owner got cancer and suddenly died some time earlier.) The new owner would probably not let me host the news.gmane.org server in the server room, so I got in touch with my contact M at Y to arrange a DNS change for the news.gmane.org server.

And I heard nothing back.

So I Cc’d everybody I’d ever known at Y, including the corporate counsel S, and then I got a response from M, CC’d to S, that started with:

I already responded to this on 22nd January.

So apparently M’s email can’t reach me unless he’s Cc’in S? I guess they must have extremely high security email at Y or something, because I can’t think of any other reason for M’s emails not reaching me. (I grepped the exim logs for the previous year: No contact from Y’s MTAs.)

But I thought, well, now I have contact at least, so I can get the DNS updated! Then S responded:

You have contact with M, please follow through with him directly.

I don’t need copying on any of this.

And then… crickets: I didn’t get any further communication with Y, and no DNS update for the NNTP server.

So at this point, I definitely should have done… something… but instead the sale of my employer was progressing, and then it was done, and then I took a long holiday, and then…

I’m an expert at procrastinating, especially when whatever I have to do involves some degree of confrontation.

Time passes, until… two weeks ago, when I got a message that I really have to have my server removed within a couple of weeks, so I sent off new emails to the Y people, even Cc-ing the guy I wasn’t supposed to Cc, and I heard nothing back, at all. So I have to assume the gmane.org domain can’t be updated any more and I have to do something.

I have set up a new server, and I have mirrored all the data to it, but the problem is the domain, of course. The name of the server is one thing: Update your .gnus files to point to news.gmane.io now; the old name will stop working in a couple of weeks (I got an extension, apparently).

The bigger problem is all the mailing lists: When the server goes away, 15K mailing lists will start to bounce.

So the question is: What should I do about that? There’s several options:

1) Let them bounce: It’s not a major disaster, but I can imagine list admins at places like vger being annoyed (Gmane subscribes to hundreds of vger lists).

2) Unsubscribe them all and let news.gmane.org die a final death: The unsubscription has to happen before the server goes away, because the unsubscription emails have to come from the IP address mentioned in the SPF record for gmane.org.

3) Unsubscribe and resubscribe under a different domain: I have registered a new domain gmane-mx.org and done some experimentation. Of twenty lists un/resubscribed (I’ve scripted this bit so it’s not a lot of work to do a few hundred lists in a batch), two were successfully resubscribed. It seems the reason for this is that sourceforge lists can no longer be subscribed without creating a sourceforge account? And many of the other lists just bounced, despite being active, so it means that they’ve moved without the gmane.conf being updated, but the Gmane address is still subscribed. Fixing this will take manual intervention. But do I want to do this? Asking mailing lists admins to trust me again, with a new domain after the previous debacle, is a bit too much, isn’t it?

4) Somebody at Y could wake up and do the fucking DNS update: Make blaine.gmane.org point to 159.69.161.202 (that’s all you have to do) and we can at least have time to do whatever transition we’re doing in an orderly fashion.

I don’t know what’s going to happen, but list admins: If gmane.org addresses start to bounce, and you want to fix things manually, just replace “gmane.org” with “gmane-mx.org” in all the email addresses. This works already.

OK, this blog post turned out to be even more meandering and unstructured than I had anticipated, but that’s probably because I don’t even know what I want to do here, or what people want to have happen.

  • Should I just let news.gmane.org die? Is it even useful for anybody any more?
  • Should I resubscribe all the lists as gmane-mx.org to continue having a “full” archive, and then try to make somebody more responsible and responsive take over it all again? I mean, there could be a new web interface with similar links as the old one?
  • Is the above point even relevant any more in these days of GDPR? What’s the upside for anybody running such a service?

In many ways, I do want Gmane to go away and not have to think about it any more, because it’s all tied up in feelings of inadequacy. I hope I’m not fishing for sympathy here; this has been really awkward to write, and the only conclusion anybody can draw from reading this is that I’m a fuck-up, and I fucked this up.

But I guess I’m asking for some feedback as to what should happen next. I think I have about a week until the old server goes away now, so whatever happens has to happen fast.