VOOZH about

URL: https://wiki.archlinux.org/title/User:Thorko/Automatically_update_system

⇱ User:Thorko/Automatically update system - ArchWiki


Jump to content
From ArchWiki

👁 Image
This article is not officially supported.

The Arch Linux community does not offer support for the information contained in this page; for installation procedures, the Installation guide is the only officially supported document. The content below is mainly maintained by User:Thorko, who last reviewed it on 2024-06-19. This approach is unsupported and due to the nature of updates on Arch Linux will eventually cause your system to break., and it may be out of date or inaccurate.

This page describes how to automatically update your arch sytem.

First create the necessary configuration and systemd files

/etc/archupgrade.conf
# ignore packages to be updated
# multiple packages seperated by comma
ignore="linux,pacman"
log="/var/log/archupgrade.log"
mailto="<your mail address>"
/etc/sytemd/system/archupgrade.timer
[Unit]
Description=Upgrade arch

[Timer]
OnCalendar=Wed 02:07:00
Persistent=true
Unit=archupgrade.service

[Install]
WantedBy=default.target
/etc/systemd/system/archupgrade.service
[Unit]
Description=Upgrade arch with pacman

[Service]
Type=oneshot
User=root
Environment=SHELL=/bin/sh
Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
ExecStart=/usr/local/bin/archupgrade minimal reboot

Once your have created the files above add the script to run the update in /usr/local/bin/archupgrade and make it executable (moreutils package is a dependency for ts)

#!/bin/bash

function log() {
	date=$(date +'%Y-%m-%d %H:%M')
 echo "[$date] $1" >> $log 2>&1
}

function mail() {
	host=$(hostname)
	day=$(date +'%Y-%m-%d')
	msg=$(grep "$day" $log)
	echo -e "$msg" | mailx -s "Arch upgrade: $host" $mailto
}


function list_updates() {
	list=$(pacman -Qu)
	if [ $? -ne 0 ]; then
		echo "nothing to do"
		exit 0
	else
		echo "$list"
	fi
}

function will_reboot() {
 dd=$(date +'%Y-%m-%d')
 grep $dd $log | grep "upgrading linux..."
 if [ $? -eq 0 ]; then
 log "Will reboot in 10 minutes"
		shutdown -r +10
	else
		log "no linux kernel upgrade"
	fi
}

function minimal() {
	pacman -Syu --ignore=$ignore --noconfirm --overwrite '*' | tee -a $log
	if [ $? -ne 0 ]; then
		log "Upgrade not complete"
		mail "Minimal upgrade not complete"
		exit 1
	fi

	log "minimal upgrade done"

 if [ $reboot -eq 1 ]; then
		will_reboot
	fi
	mail "minimal upgrade done"
}

function full() {
 # do an archlinux-keyring before upgrading
	sudo pacman -Sy --noconfirm archlinux-keyring | ts '[%Y-%m-%d %H:%M:%S]' | tee -a $log
	sudo pacman -Syu --noconfirm --overwrite '*' | ts '[%Y-%m-%d %H:%M:%S]' | tee -a $log
	if [ $? -ne 0 ]; then
		log "Upgrade not complete"
		mail "Full upgrade not complete"
		exit 1
	fi

 if [ $reboot -eq 1 ]; then
		will_reboot
	fi
	mail "full upgrade done"
}

config="/etc/archupgrade.conf"
if [ ! -f $config ]; then
	echo "No config file found: $config"
	exit 1
fi
 source $config
pacman -Sy

reboot=$2
if [ -z $reboot ]; then
	reboot=0
else
 reboot=1
fi

case "$1" in
	list_updates)
		list_updates
		;;
	minimal)
		minimal $2
		;;
	full)
		full $2
		;;
	*)
		echo "$0 <list_updates|minimal|full> [reboot]"
		echo "reboot: will only reboot if a kernel update has been done"
		exit 0
		;;
esac
chmod 700 /usr/local/bin/archupgrade

Now enable the timer

systemctl enable --now archupgrade.timer