Hello everyone! I want to write a short script to let me know if there has been more than 3 days since the last full system update whenever I open a terminal (run from .zshrc). Ive got something cobbled together, but sadly it only checks for the last full system update from pacman directly because of the way it looks at the pacman logs.

My question is, how can I make it so that if EITHER pacman directly or yay runs a full system update, it will update something like a persisitent environment variable with a UNIX timestamp?

I’ve also considered writing a hook to run after pacman fully updates the system since yay runs pacman under the hood anyway, but I can’t figure out how to make the hook recognise if it was a successful full system update.

Here is what I have so far:

#!/bin/zsh

last_upgrade_date=$(grep -m 1 'full system upgrade' /var/log/pacman.log | cut -d ' ' -f 1 | tr -d '[]')
last_upgrade_sec=$(date --date="$last_upgrade_date" +%s) # Convert to UNIX timestamp

last_upgrade_sec=$(date -d "$last_upgrade_date" +%s)
now_sec=$(date +%s)

days_since=$(( (now_sec - last_upgrade_sec) / 86400 ))

if (( days_since > 3 )); then
	echo "Days since last update: $days_since day(s)" >> /dev/tty
fi

# Kernel version check
running_kernel=$(uname -r)
installed_kernel=$(pacman -Q linux | awk '{print $2}' | cut -d '-' -f1 | cut -d '.' -f1,2,3)

running_kernel_base=$(echo "$running_kernel" | cut -d '-' -f1)

if [[ "$running_kernel_base" != "$installed_kernel" ]];
then
	echo "Kernel mismatch detected. Reboot recommended." >> /dev/tty
fi

Thanks in advance!

  • donio@lemmy.world
    link
    fedilink
    arrow-up
    2
    ·
    edit-2
    2 days ago

    In the subject you wrote “successful full sys update” but the script and the other suggestions I see so far don’t actually handle the “successful” part.

    The log message only tells you that the update was started and the db mtime only indicates that the db was touched without saying anything about success.

    I’d go about this by always performing the updates through a wrapper script that could check the exit status of the pacman or yay command and record a timestamp accordingly.

  • taaz@biglemmowski.win
    link
    fedilink
    English
    arrow-up
    2
    ·
    edit-2
    2 days ago

    Apart from trying the hook way, I would default to just checking the timestamp of /var/lib/pacman/sync/core.db and extra.
    As any upgrade should be a system upgrade.

    • promitheas@programming.devOP
      link
      fedilink
      arrow-up
      2
      ·
      edit-2
      2 days ago

      This seems like an easy implementation, and I can skip the variable and just directly check the timestamp from the script i guess. My question is, if I install something, say yay -S a_single_package does that also update the timestamp of the core.db file?

      • taaz@biglemmowski.win
        link
        fedilink
        English
        arrow-up
        1
        ·
        edit-2
        1 day ago

        -S should not even try to refresh the database, that is what -Sy is for. And doing any variation of -Sy without also u (upgrade) is the unsupported partial “upgrade”, so it is possible that the time changes but only in the case of misuse.

        Also noticed you can just check the mtime of the directory itself, /var/lib/pacman/sync - directory mtime does not change when the files change content but pacman/alpm probably downloads the new databases to some temp files then moves them into the directory, changing it’s modify time (see stat, stat -c '%Y').

        • ferric_carcinization@lemmy.ml
          link
          fedilink
          English
          arrow-up
          1
          ·
          edit-2
          1 day ago

          From what I remember, you can run -Sy, so long as the next pacman -S <package>... has the -u flag set.

          Edit: ie. pacman -Sy; pacman -Ss <package>; pacman -Sc; pacman -Su should be safe, I think.

  • SayCyberOnceMore@feddit.uk
    link
    fedilink
    English
    arrow-up
    1
    ·
    2 days ago

    Not able to check the details ATM, but there’s a systemd timer which refreshes the pacman cache every week (I think)

    That could probably be modified to run every 3 days and output the latest update’s timestamp to the envvar you wanted?

  • HelloRoot@lemy.lol
    link
    fedilink
    English
    arrow-up
    1
    ·
    edit-2
    2 days ago

    I would write a seperate script/daemon that sets up a listener and waits for an inotify event on the pacman.log file. I think you’d have to listen to a CLOSE.

    Then you know that a software has written something to the log and can update your variables.