The case of the faulty antivirus update

Μια και πιάσαμε τις ιστορίες από τα παλιά, ακόμα ένα support horror story:

Μια μέρα έρχονται τα κορίτσια από το support και μου λένε κάτι σαν “έχουμε μια σειρά από συνδρομητές με το anti-virus [name withheld] και παραπονιούνται πως μετά το πιο πρόσφατο update, αφότου κάνουν κλήση dialup (ναι, τόσο παλιά ιστορία), δεν μπορούν να δουν τίποτε στο browser”.

Κατά τα συνήθη, “ΟΚ βρε παιδιά, αλλά αυτό δεν είναι δικό μας πρόβλημα”. Και ναι οι συνδρομητές αναγνώριζαν πως δεν είναι δικό μας πρόβλημα, αλλά επειδή ήμασταν μάλλον το μόνο support department που δεν τους είχε με χρονόμετρο, αλλά δείχνανε τα παιδιά ειλικρινή προσπάθεια να λύσουν οποιοδήποτε πρόβλημα, τους ρώταγαν και για αυτό, γιατί δεν έβρισκαν πουθενά αλλού να πουν τον πόνο τους.

Αρχίσαμε να σκεφτόμαστε πράγματα και να τους λέμε να κάνουν τα διάφορα προφανή (βγες και ξαναμπές, κάνε reboot, σβήσε το μηχάνημα, βγάλε και την πρίζα, κ.λπ.) χωρίς καμία λύση. Μέχρι που κάποια στιγμή μου κόβει και τους λέω “Ρωτήστε με κάποιον εύσχημο τρόπο αν έχουν πληρώσει για το πρόγραμμα, κάποιους που έχετε περισσότερο θάρρος”. Μαντέψτε. Μετά είπαν σε κάποιο που είχαν ακόμα περισσότερη άνεση αν μπορεί να αγοράσει μια άδεια. Και ως διά μαγείας το πρόβλημα λύθηκε.

Όχι δεν θα πω ποια εταιρία. Μπορεί να το έκανε επίτηδες, μπορεί και όχι. Μπορεί να ήταν ιδέα κάποιου βασιλικότερου του βασιλέως υπαλλήλου, μπορεί απλά να ήταν και ένα λαθασμένο if statement. Απλά συνέβη και έτσι λύθηκε.

The case of the faulty line

Η δεύτερη ιστορία που υποσχέθηκα χτες:

Back in the day, οι συνδρομητές Internet της ΤΠ/ΤΕΕ μια μέρα, που ήταν και μέρα προθεσμίας, δεν μπορούσαν να συνδεθούν σε ένα σύστημα του ΙΚΑ. Δικαίως τα μπινελίκια πήγαιναν σύννεφο από τους χρήστες.

Μιλάμε με το ΙΚΑ: “Παιδιά, όλα καλά εδώ, στη μεριά σας είναι το πρόβλημα. Όλοι οι άλλοι συνδέονται χωρίς πρόβλημα”.

Μιλάμε με τον ΟΤΕ: “Παιδιά όλα καλά εδώ και είναι μερικοί πελάτες σας, στην μεριά σας είναι το πρόβλημα”.

Προφανώς κι εμείς δεν πιστεύαμε πως είχαμε πρόβλημα αφού σε ΟΛΟ το υπόλοιπο Internet πηγαίναμε κανονικά.

Φυσικά και κανείς από όλους τους εμπλεκόμενους δεν είχε αλλάξει κάτι, οπότε όλοι κρατάγανε άμυνα.

Μετά από φιλότιμες προσπάθειες του ρουτερά μας, μαθαίνει πως το ΙΚΑ (το συγκεκριμένο project το έτρεχε ανάδοχος BTW και όχι το ΙΚΑ) είχε τρεις γραμμές σε ΑΛΛΟ provider και τους βαράει στο φιλότιμο και συνεργάζονται ΟΛΟΙ και ρίχνουμε μία μία τις γραμμές. Ε, ρίξανε μια γραμμή στο ΙΚΑ και το πρόβλημα εξαφανίστηκε. Δεν θυμάμαι ρε συ Michael Papadeas αν ήταν κανένα χαλασμένο βύσμα ή καλώδιο και απλά το πρόβλημα υπήρχε και έγινε αισθητό επειδή οι συνδρομητές μας πέφτανε μαζικά πάνω ή ήταν routing problem.

Τραβάτε να μου πείτε ποιανού το κεφάλι έπρεπε να πέσει τώρα που κόσμος θα πλήρωνε πρόστιμα γιατί το ΙΚΑ ήταν μη προσβάσιμο για ένα υποσύνολο χρηστών. Θυμάμαι μόνο πως βάλαμε τον πρόεδρο Αλαβάνο να ζητήσει, μετά τεχνικής ανάλυσης, από τον Διοικητή του ΙΚΑ παράταση μια μέρα για να μπορέσουν οι συνδρομητές μας να κάνουν την υποβολή. Δεν ξέρω τι έγινε μετά.

Α ναι, όλα αυτά Παρασκευή μεσημέρι.

Γιατί τα θυμήθηκα όλα αυτά; Επειδή ο υπουργός θέλει να πέσουν κεφάλια.

Ιστορίες (μη) αναβάθμισης εξοπλισμού στο Δημόσιο

Έχω καιρό να ποστάρω και έγραψα δυο ιστορίες στο facebook, που είναι κρίμα να μείνουν εκεί μέσα. Η πρώτη είναι αυτή εδώ:

Από το 1997 έως και μετά το 2014 (δεν θυμάμαι ως πότε επειδή τότε αποχώρησα) ένα κρίσιμο σύστημα στο ΤΕΕ έτρεχε σε ένα Sun Ultra Enterprise 3000. Στο μεταξύ η Sun δεν υπήρχε πια, η Oracle δεν ενδιαφερόταν και ο ανάδοχος του software ζήταγε την μάνα του και τον πατέρα του για να κάνει μετάβαση σε νέο σύστημα.

Οπότε πορευόμασταν με ότι είχαμε μέχρι είτε να πεθάνει, είτε να προλάβουμε να βρούμε πόρους για αντικατάσταση.

Δυο φορές κόντεψε να πεθάνει. Μετά από ένα αναγκαστικό reboot (ναι το μηχάνημα πρακτικά επανεκκινούνταν μόνο αν υπήρχε πρόβλημα με το ρεύμα) αρνιόταν να εκκινήσει. Είχε 4 επεξεργαστές σε κάρτες των δύο. Ευτυχώς σε έναν τεχνικό από μια εταιρία που είχε ακόμα expertise σε αυτά τα μηχανήματα έκοψε να βγάλουμε την μια κάρτα και να δοκιμάσουμε και πήρε μπρος. Πρέπει να αποσύρθηκε κάποια στιγμή το 2016 με δύο επεξεργαστές, σωστά George Kotsolis?

Και μια φορά ακόμα έσκασε ένας δίσκος σε ένα Ultra 1 βοηθητικό στις λειτουργίες του παραπάνω μηχανήματος και ευτυχώς (α) υπήρχε δίσκος να αντικατασταθεί και (β) δούλεψε το restore που πήρε δύο μέρες. Στο μεσοδιάστημα έμαθα περισσότερα από όσα ήθελα να ξέρω για το πως θα μπορούσε να γίνει emulation UltraSparc σε amd64 (υπήρχε software που έδινε η Sun και ένα μήνα πριν η Oracle το είχε καταργήσει, αλλά είχαμε κάπου τα ISO από επαγγελματική περιέργεια), που ήταν το plan b.

Θυμήθηκα την ιστορία από μια συζήτηση με τον Διομήδη Σπινέλλη. Οι φωτογραφίες είναι του Ντίνου Σ.

Αύριο η επόμενη ιστορία

Can I have a serviceless Ingress (part 2)

Now that ingress-nginx is being retired, people are looking for alternatives. haproxy-ingress is a choice. In a previous post I had showed how one could have an Ingress object that is not linked to any service (leaving any required processing to the ingress controller)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: not-nginx
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      return 302 https://new_web_server_here$request_uri;
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - old_name_here
    secretName: secret_name_here
  rules:
  - host: old_name_here

Unfortuneately, in the case of the haproxy-ingress the above won’t work. The Ingress object needs to be linked with a service, even if this service does not exist:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: not-nginx
  annotations:
    haproxy-ingress.github.io/redirect-to: https://new_web_server_here
spec:
  ingressClassName: haproxy
  tls:
  - hosts:
    - old_name_here
    secretName: secret_name_here
  rules:
  - host: old_name_here
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: no-service
            port:
              number: 80

You may want to user redirect-code-to if you want to set the 3xx code also.

A bare whiteboard application

A couple of years ago, a friend commented in a Slack that “there is no whiteboard / sketch application in macOS” readily available. Maybe there is and we did not know, but even at the time it was suggested that someting like https://jspaint.app might do the job. But the thing stayed at a corner of my mind.

About a week ago, I watched the ultimate introduction to pygame and the question returned. But now we also have LLMs to play some design and implentation ping pong and I started asking Claude a bit about that. And it was writing tons and tons of stuff where all was I wanted a bare whiteboard with no features at all. Something to (hand) draw lines on, no undo, no colors, not even a save image feature. And here is what I got:

import pygame
import sys
import argparse


options = argparse.ArgumentParser(description='Start a pygame window with configurable dimensions')
options.add_argument('--width', type=int, default=800, help='Window width (default: 800)')
options.add_argument('--height', type=int, default=600, help='Window height (default: 600)')
args = options.parse_args()

pygame.init()

screen = pygame.display.set_mode((args.width, args.height))
pygame.display.set_caption('pygame sketch')
clock = pygame.time.Clock()
a = (-1, -1)

screen.fill((250, 250, 160))
while True:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			pygame.quit()
			sys.exit()

		if event.type == pygame.MOUSEBUTTONUP:
			a = (-1, -1)

	mouse_buttons = pygame.mouse.get_pressed()
	if mouse_buttons[0]:
		if a[0] == -1:
			a = pygame.mouse.get_pos()
		else:
			b = pygame.mouse.get_pos()
			pygame.draw.line(screen, 'red', a, b, 2)
			a = b

	pygame.display.flip()
	clock.tick(60)

I do not think I will make anything more with it. But it was a fun PoC , first time pygame application.

LLMs are my first go-to person

I have a go-to guy. Everyone should. But he decided to change continents. And this makes it difficult to challenge his mind on a frequent basis. I am now using Claude for this. It is always there and cannot complain, whatever crazy I may ask of it. It has even transformed into my repository of crazy ideas / projects that will never happen. Gone are the notebooks stashed deep in my drawers.

The LLM also never says no. Never denies a thing. It will never say something like “protect your time for such bullshit”. It will reframe the answer in a “positive” way. “While X is not the best technology for Y, it might be possible to achieve …”.

I iterate (“discuss”) a lot. Without code samples.

Maybe when something becomes well formulated, I will pick my go-to guy’s brain. Because it is easy to get high on your own supply.

Happy SysAdmin Day

One more SysAdmin Day. I don’t have any war story to share, so I will copy-paste a comment I posted on LinkedIn:


Let me tell you a story that involves a real (brick & mortar) Architect:

– Sir, I need to fill you in on the latest details on the construction of the mansion and to ask for a favor?
– What is it?
– Sir, can you please ask your wife to not change her mind every two days? We tear down walls and raise them and we will never finish that way
– Look, I pay you a ton of money to deal with my wife’s expectations. Otherwise I’d be doing it

Forget the crudeness of the client. The moral of the story is that you are being paid to operate in a volatile environment with changing requirements outside your control. You need to accept the fact and learn to navigate it.

On a branch of the prehistory of GRNOG

Originally a LinkedIn post, but I thought it deserved better posterity:

#GRNOG18 marks the 10 years of GRNOG. Faidon Liambotis, going through his email archives traced the roots of GRNOG to two (sometimes ovelapping) groups of people: The greek IPv6 working group, then led by Athanassios Liakopoulos and the Greek Postmasters mailing list (for which I lent a hand):

It was Angelo Karageorgiou (then leading the technical capability of a now defunct ISP) who reached out to me because UCEPROTECT was including lots of Greek address space by the buckets and refusing to delist them and asked whether we could gather fellow Postmasters to work on the thing. I knew some of them and reached out and a meeting was held at the OTE building, facilitated by the ever so nice Pandelis Papanikolaou. Faidon and George Kargiotakis were also there on behalf of GRNET – Greek Research & Technology Network and offered to host the mailing list (I think on Sympa?).

Two more meetings / dinners were held by the Greek Postmasters and eventually traffic on the list died out (ISPs were being absorbed, people, including me changed jobs, other ISPs outsourced their email to Microsoft). It was then that Andreas Polyrakis took over and provided the necessary energy with the rest of the team, merging the two groups and possibly a few more and the rest is history as they say.

Looking back, I have to say that I could have never built such an amazing community as the one Andreas, Faidon, Kostas Zorbadelos, Michalis Oikonomakos, Tasos Karaliotas and whoever else lent them a hand.

You guys rock and I am a proud observer of your work. Don’t ever change.

Enough with the pre-history; history is made by those who are doing the work (ie, not me).

How I install portainer

Portainer is an interesting piece of software that allows you to manage running containers in Docker, Docker Swarm and of course, Kubernetes. There are instructions on how to run the server part on your system, but as usual, I like to have my own twist on things.

While I am no big fan of helm, we are going to use it here. So let’s add the repository:

helm repo add portainer https://portainer.github.io/k8s/
helm repo update

Now you can peek at the helm values and decide on how to install the thing:

helm upgrade --install portainer portainer/portainer \
--create-namespace -n portainer \
--set image.tag=lts \
--set service.type=ClusterIP \
--set persistence.size=8G

You will notice that I do not have helm install an Ingress too. I do this because we may be running different ingress controllers for different things and we might want to do stuff that goes outside what the default Ingress object constructed by the helm chart does. In my case this is using cert-manager:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: portainer
  namespace: portainer
  annotations:
    nginx.ingress.kubernetes.io/service-upstream: "true"
    cert-manager.io/issuer: "letsencrypt-portainer"
    cert-manager.io/duration: "2160h"
    cert-manager.io/renew-before: "360h"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - portainer.example.com
    secretName: portainer-example-com-tls
  rules:
  - host: portainer.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: portainer
            port:
              number: 9000

I hope this helps into starting your Portainer journey.

systemd and the picolisp mailing list manager

In the past I have blogged how one can use picolisp’s mailing list manager (.tgz file) with docker. But this might not be practical for some people who might opt for a more “traditional” approach. That would require you to run it via systemd. So you would need a systemd service file. Assuming that you run list@example.com and you have a user list in your system, that would look like:

[Unit]
Description=MailingList

[Service]
User=list
ExecStart=/home/list/mailing.l
WorkingDirectory=/home/list
Restart=on-failure
RestartSec=30s

[Install]
WantedBy=multi-user.target

As a reminder, you subscribe to such a list by sending email to the list with Subscribe in the subject line and you unsubscribe with Unsubscribe in the subject line. Emails sent to the list by non-members are silently dropped.