LINUX.ORG.RU

Примитивный скрипт проверки обновлений для debian


0

0

Написал простой скрипт на баше. Скрипт кривой и костыльный, но работает.

Зависимости: bash, grep, sed, awk, curl, KDE4

От кед фактически используется только kdialog для вывода уведомления. Для гномеров в репах дебиана есть своя утилита. Буду рад если кому-нибудь пригодится

Можно поставить на крон:

0 * * * *      export DISPLAY=:0; <path>deb-check-updates.sh > /dev/null

Собственно сам скрипт:

#!/bin/bash

get_remote_mtime () {
	remote_date=`curl --silent --head "$1" | grep -i "Last-Modified:" | sed 's/^Last-Modified\://i'`
	remote_mtime=`date -d "$remote_date" "+%s"`
	return 0
}

check_entry () {
	if [ "$1" == "deb-src" ]; then
		deb_type="source"
	else
		deb_type="binary"
	fi
	# trim last /
	mirror=${2%\/}
	release="$3"
	# replace / with _
	release_local=${release//\//_}
	echo "deb_type=$deb_type"
	echo "mirror=$mirror"
	echo "release_local=$release_local"

	# check each component (main, contrib etc.)
	shift 3
	until [ -z "$1" ]; do
		component="$1"
		echo "component=$component"
		shift
		host=`echo "$mirror" | awk -F "/" '{print $3}'`
		path=`echo "$mirror" | sed  's/^[a-z]*:\/\/[^\/]*//i'`
		path="$path/"
		echo "path=$path"
		path_local=${path//\//_}
		echo "host=$host"
		echo "path_local=$path_local"
		
		# local path to index file
		packages_local="/var/lib/apt/lists/${host}${path_local}dists_${release_local}_${component}_"
		if [ "$deb_type" == "binary" ]; then
			packages_local="${packages_local}${deb_type}-${arch}_Packages"
		else
			packages_local="${packages_local}${deb_type}_Sources"
		fi
		echo "packages_local=$packages_local"
		
		# remote index file path
		packages_remote="${mirror}/dists/${release}/${component}/"
		if [ "$deb_type" == "binary" ]; then
			packages_remote="${packages_remote}${deb_type}-${arch}/Packages"
		else
			packages_remote="${packages_remote}source/Sources"
		fi
		echo "packages_remote=$packages_remote"

		# compare local and remote Packages.diff mtime
		if [ -e "$packages_local.IndexDiff" ]; then
			local_mtime=`date -r "${packages_local}.IndexDiff" "+%s"`
			echo "local_mtime=$local_mtime"
			get_remote_mtime "${packages_remote}.IndexDiff"
			echo "remote_mtime=$remote_mtime"
			if [ -n "$remote_mtime" ]; then
				# if remote files is newer than local
				if [ "$remote_mtime" -gt "$local_mtime" ]; then
					echo "updates on $mirror $release $component $deb_type"
					updated_sources=( "${updated_sources[@]}" "$host $release $component $deb_type")
					continue
				fi
			fi
		fi
		
		# compare Packages.gz file
		if [ -e "$packages_local" ]; then
			local_mtime=`date -r "${packages_local}" "+%s"`
			echo "local_mtime=$local_mtime"
			get_remote_mtime "${packages_remote}.gz"
			echo "remote_mtime=$remote_mtime"
			if [ -n "$remote_mtime" ]; then
				# if remote files is newer than local
				if [ "$remote_mtime" -gt "$local_mtime" ]; then
					echo "updates on $mirror $release $component $deb_type"
					updated_sources=( "${updated_sources[@]}" "$host $release $component $deb_type")
				fi
			fi
		fi
	done
}

# get architecture
arch=`dpkg-architecture -qDEB_HOST_ARCH`
echo "arch = $arch"

declare -a updated_sources

# read sources.list
while read line; do
	# skip empty lines
	if [ -z "$line" ]; then 
		continue
	fi
	# ignore commented lines
	if [ -n "`expr match "$line" '\(^[\ ]*\#\)'`" ]; then 
		continue
	fi
	echo "$line"
	check_entry $line
	echo ""
done < /etc/apt/sources.list

echo ""

# show notification
if [ "${#updated_sources[@]}" -gt "0" ]; then
	msg="Updates available on<ul>"
	for i in "${updated_sources[@]}"; do
		msg="${msg}<li>${i}</li>"
	done
	msg="${msg}</ul>"
	echo "$msg"
	kdialog --title 'Update checker' --passivepopup "$msg" 2000
else
	echo "no updates"
fi

★★★★★

Это ты apt-watch изобрел что-ли?

apt-watch-backend - Applet that monitors apt sources for upgrades (backend slave)
apt-watch-gnome - Applet that monitors apt sources for upgrades (GNOME applet)
apt-watch - Applet that monitors apt sources for upgrades (transitional package)

sdio ★★★★★
()
Ответ на: комментарий от sdio

примерно. Только без гнома. Если кто подскажет, как в гноме вывести уведомление, то можно сделать совсем без привязок к ДЕ. И еще какой-нибудь способ для остальных рабочих сред. Где то я на ЛОРе такую тему видел недавно.

nu11 ★★★★★
() автор топика
Ответ на: комментарий от nu11

>Если кто подскажет, как в гноме вывести уведомление, то можно сделать совсем без привязок к ДЕ.

А dbus-send / qdbus не выйдет руками звать? Пытаться звать из org.freedesktop.Notifications (не помню имя метода), если не вышло, то пробовать org.kde.VisualNotifications. 1ое работает и в гноме и, говорят(?), новом КДЕ. Второе — в старых кедах.

Deleted
()
Ответ на: комментарий от Deleted

>А dbus-send / qdbus не выйдет руками звать?
можно конечно. Только нужно же четко знать кого звать :) И опробовать я его не могу, за отсутствием гнома. Вот если бы кто из гномеров портировал. Там кстати html поддерживается или свой велосипед для форматирования текста?

новом КДЕ

которые еще не вышло.

nu11 ★★★★★
() автор топика
Ответ на: комментарий от nu11

>которые еще не вышло.

Так в текущем org.kde.VisualNotifications :}

А вот кого и как звать в org.freedesktop.Notifications я тоже не в курсе, ибо в своё время на сайте fdo об этом ничего не нашлось, как ни странно. Стандарты, ага :\

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.