mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-07-24 03:35:38 +03:00
269 lines
6 KiB
Diff
269 lines
6 KiB
Diff
From 05dde83e45d64a82b89e5c10b0f74b28f424379a Mon Sep 17 00:00:00 2001
|
|
From: Henrik Riomar <henrik.riomar@gmail.com>
|
|
Date: Sun, 10 Jul 2016 13:44:15 +0200
|
|
Subject: [PATCH] initial support for Alpine Linux (apk)
|
|
|
|
Note that Alpine host code is not implemented in Perl as that is not
|
|
present on an Alpine Linux system by default.
|
|
|
|
Implements ADP 0.6
|
|
|
|
---
|
|
This patch is backported from upstream.
|
|
---
|
|
apk/Makefile | 9 ++
|
|
apk/apt-dater-host | 212 +++++++++++++++++++++++++++++++++++++++++++++
|
|
apk/apt-dater-host-sudoers | 9 ++
|
|
3 files changed, 230 insertions(+)
|
|
create mode 100644 apk/Makefile
|
|
create mode 100755 apk/apt-dater-host
|
|
create mode 100644 apk/apt-dater-host-sudoers
|
|
|
|
diff --git a/apk/Makefile b/apk/Makefile
|
|
new file mode 100644
|
|
index 0000000..227f366
|
|
--- /dev/null
|
|
+++ b/apk/Makefile
|
|
@@ -0,0 +1,9 @@
|
|
+clean:
|
|
+
|
|
+install:
|
|
+ install -D -m0755 apt-dater-host \
|
|
+ $(DESTDIR)/usr/bin/apt-dater-host
|
|
+
|
|
+ install -m0750 -d $(DESTDIR)/etc/sudoers.d
|
|
+ install -m0640 apt-dater-host-sudoers \
|
|
+ $(DESTDIR)/etc/sudoers.d/apt-dater-host
|
|
diff --git a/apk/apt-dater-host b/apk/apt-dater-host
|
|
new file mode 100755
|
|
index 0000000..a5862ae
|
|
--- /dev/null
|
|
+++ b/apk/apt-dater-host
|
|
@@ -0,0 +1,212 @@
|
|
+#!/bin/sh
|
|
+
|
|
+# apt-dater - terminal-based remote package update manager
|
|
+#
|
|
+# Implementation of the protocol described in
|
|
+# https://github.com/DE-IBH/apt-dater-host/blob/master/doc/ADP-0.6
|
|
+# using Busybox ash, awk and sed for use with Alpine Linux
|
|
+#
|
|
+# Author:
|
|
+# Henrik Riomar <henrik.riomar@gmail.com>
|
|
+#
|
|
+# Copyright Holder:
|
|
+# 2016 (C) Henrik Riomar
|
|
+#
|
|
+# License:
|
|
+# This program is free software; you can redistribute it and/or modify
|
|
+# it under the terms of the GNU General Public License as published by
|
|
+# the Free Software Foundation; either version 2 of the License, or
|
|
+# (at your option) any later version.
|
|
+#
|
|
+# This program is distributed in the hope that it will be useful,
|
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+# GNU General Public License for more details.
|
|
+#
|
|
+# You should have received a copy of the GNU General Public License
|
|
+# along with this package; if not, write to the Free Software
|
|
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
+#
|
|
+
|
|
+ADP_VERSION="0.6"
|
|
+ROOT_CMD="sudo"
|
|
+APK_CMD="/sbin/apk"
|
|
+
|
|
+err=255 # exit code returned by Perl from die()
|
|
+
|
|
+# LSBREL: ${Distri}|{Version}|${Codename}
|
|
+get_lsbrel()
|
|
+{
|
|
+ name=$(awk -F= '/^ID/ {print $NF}' /etc/os-release)
|
|
+ version=$(awk -F= '/^VERSION_ID/ {print $NF}' /etc/os-release)
|
|
+ echo "LSBREL: ${name}|${version}|"
|
|
+}
|
|
+
|
|
+# PRL: ${URI}
|
|
+get_prl()
|
|
+{
|
|
+ sed -n 's/^http/PRL: http/p' /etc/apk/repositories
|
|
+}
|
|
+
|
|
+# check if a pkg is held back
|
|
+is_held()
|
|
+{
|
|
+ grep -E -q ^$1\= /etc/apk/world
|
|
+}
|
|
+
|
|
+# check if $1 > $2
|
|
+newer_then()
|
|
+{
|
|
+ [ x"$($APK_CMD version -t $1 $2)" = x">" ] && return 0
|
|
+
|
|
+ return 1
|
|
+}
|
|
+
|
|
+# STATUS: ${Package}|${InstVersion}|${Status}...
|
|
+get_pkg_stat()
|
|
+{
|
|
+ tmp=$(mktemp)
|
|
+ $APK_CMD version -v | grep -v "^Installed:" > $tmp
|
|
+ $APK_CMD info | while read -r pkg
|
|
+ do
|
|
+ line=$(grep -E "^${pkg}-[0-9]" $tmp)
|
|
+ new_ver=$(echo $line | awk '{print $NF}')
|
|
+ cur_ver=$(echo $line | awk '{print $1}' | sed "s/$pkg-//")
|
|
+ if [ x"$new_ver" = x"$cur_ver" ]; then
|
|
+ echo "STATUS: $pkg|$cur_ver|i"
|
|
+ elif is_held $pkg; then
|
|
+ echo "STATUS: $pkg|$cur_ver|h"
|
|
+ elif [ x"$new_ver" = x"?" ]; then
|
|
+ echo "STATUS: $pkg|$cur_ver|x"
|
|
+ elif newer_then $new_ver $cur_ver; then
|
|
+ echo "STATUS: $pkg|$cur_ver|u=$new_ver"
|
|
+ else
|
|
+ # newer installed ($cur_ver) than available,
|
|
+ # ADP 0.6 does not describe this case
|
|
+ # x should be suitable for now.
|
|
+ echo "STATUS: $pkg|$cur_ver|x"
|
|
+ fi
|
|
+ done
|
|
+ rm $tmp
|
|
+}
|
|
+
|
|
+# VIRT: ${Name}
|
|
+get_virt()
|
|
+{
|
|
+ virt=$(dmesg | awk '/Hypervisor detected:/ {print $NF}')
|
|
+ if [ -n "$virt" ]; then
|
|
+ echo "VIRT: $virt"
|
|
+ else
|
|
+ echo "VIRT: Unknown"
|
|
+ fi
|
|
+}
|
|
+
|
|
+# UNAME: ${KERNEL-NAME}|${MACHINE}
|
|
+get_uname()
|
|
+{
|
|
+ echo "UNAME: $(uname -s)|$(uname -m)"
|
|
+}
|
|
+
|
|
+# KERNELINFO: ${Code} ${Release}
|
|
+get_kern()
|
|
+{
|
|
+ # 0 - latest running
|
|
+ # 1 - reboot
|
|
+ # 9 - Unknown
|
|
+ running=$(uname -r)
|
|
+ flavor=$(uname -r | awk -F- '{print $NF}')
|
|
+ vmlinuz="/boot/vmlinuz-$flavor"
|
|
+ if [ -r $vmlinuz ]; then
|
|
+ installed=$($APK_CMD info --who-owns $vmlinuz | grep -E -o "[0-9]+.[0-9]+.[0-9]+-r[0-9]")
|
|
+ with_r=$(echo $running | sed -e "s/[0-9]-${flavor}$/r&/g" | sed "s/-${flavor}//")
|
|
+ if [ x"$($APK_CMD version -t $with_r $installed)" = x'=' ]; then
|
|
+ echo "KERNELINFO: 0 $running"
|
|
+ else
|
|
+ echo "KERNELINFO: 1 $running"
|
|
+ fi
|
|
+ else
|
|
+ echo "KERNELINFO: 9 $running"
|
|
+ fi
|
|
+
|
|
+}
|
|
+
|
|
+# FORBID: ${Operations}
|
|
+check_forbid()
|
|
+{
|
|
+ echo "FORBID: 0"
|
|
+}
|
|
+
|
|
+# ADPROTO: ${ProtoVersion}
|
|
+say_hi()
|
|
+{
|
|
+ echo "ADPROTO: $ADP_VERSION"
|
|
+}
|
|
+
|
|
+do_status()
|
|
+{
|
|
+ get_lsbrel
|
|
+ get_prl
|
|
+ get_virt
|
|
+ get_uname
|
|
+ check_forbid
|
|
+ get_pkg_stat
|
|
+ get_kern
|
|
+}
|
|
+
|
|
+run_as_root()
|
|
+{
|
|
+ err_str="ADPERR:"
|
|
+ interactive=$1
|
|
+ [ $interactive -eq 1 ] && err_str="ERROR:"
|
|
+ shift
|
|
+
|
|
+ proxy="/etc/profile.d/proxy.sh"
|
|
+ [ -r $proxy ] && source $proxy
|
|
+
|
|
+ cmd="$ROOT_CMD $*"
|
|
+ $cmd
|
|
+ ret=$?
|
|
+ if [ $ret -ne 0 ]; then
|
|
+ echo "$err_str \"$cmd\" returned $ret"
|
|
+ exit $err
|
|
+ fi
|
|
+}
|
|
+
|
|
+
|
|
+if [ -z "$1" ]; then
|
|
+ echo "Don't call this script directly!"
|
|
+ exit $err
|
|
+fi
|
|
+
|
|
+case "$1" in
|
|
+ refresh)
|
|
+ say_hi
|
|
+ run_as_root 0 $APK_CMD update
|
|
+ do_status
|
|
+ ;;
|
|
+
|
|
+ status)
|
|
+ say_hi
|
|
+ do_status
|
|
+ ;;
|
|
+
|
|
+ upgrade)
|
|
+ run_as_root 1 $APK_CMD upgrade
|
|
+ ;;
|
|
+
|
|
+ install)
|
|
+ shift
|
|
+ echo "Installing PKG: $*"
|
|
+ run_as_root 1 $APK_CMD add $*
|
|
+ ;;
|
|
+
|
|
+ kernel)
|
|
+ say_hi
|
|
+ get_kern
|
|
+ ;;
|
|
+
|
|
+ *)
|
|
+ echo Invalid command \'$1\'\!
|
|
+ exit $err
|
|
+ ;;
|
|
+esac
|
|
diff --git a/apk/apt-dater-host-sudoers b/apk/apt-dater-host-sudoers
|
|
new file mode 100644
|
|
index 0000000..6fc868c
|
|
--- /dev/null
|
|
+++ b/apk/apt-dater-host-sudoers
|
|
@@ -0,0 +1,9 @@
|
|
+# apt-dater-host sudoers.d config file
|
|
+# ------------------------------------
|
|
+#
|
|
+
|
|
+# Keep http_proxy environment variable
|
|
+#Defaults env_keep += http_proxy
|
|
+
|
|
+# Allow members of group adm to execute the apk command
|
|
+%adm ALL=NOPASSWD: /sbin/apk
|