Skip to content

Commit 56dbda2

Browse files
committed
Add scripts for kernel updates
- Makefile: include specific target update-sources - Refactor get-fedora-latest-config (cherry picked from commit 8a001e9)
1 parent 43854b5 commit 56dbda2

File tree

4 files changed

+221
-25
lines changed

4 files changed

+221
-25
lines changed

Makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ endif
5353

5454
get-sources: $(SRC_FILE) $(SIGN_FILE) $(WG_SRC_FILE) $(WG_SIG_FILE)
5555

56+
verrel:
57+
@echo $(NAME)-$(VERSION)-$(RELEASE)
58+
5659
$(SRC_FILE):
5760
@wget -q -N $(URL)
5861

@@ -90,8 +93,9 @@ ifneq ($(WG_SRC_FILE), None)
9093
-rm $(WG_SRC_FILE) $(WG_SIG_FILE)
9194
endif
9295

93-
verrel:
94-
@echo $(NAME)-$(VERSION)-$(RELEASE)
96+
.PHONY: update-sources
97+
update-sources:
98+
@$(WORKDIR)/update-sources $(BRANCH)
9599

96100
help:
97101
@echo "Usage: make <target>"

get-fedora-latest-config

Lines changed: 76 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,6 @@ if [ "${VERBOSE:-0}" -ge 2 ] || [ "${DEBUG:-0}" -eq 1 ]; then
77
set -x
88
fi
99

10-
localdir="$(dirname "$(readlink -f "$0")")"
11-
releasever="$1"
12-
# Set to 1 to include rc srpm
13-
rc="$2"
14-
15-
kernelver="$(cat "$localdir/version")"
16-
kernelsrc="linux-$kernelver"
17-
1810
exit_clean() {
1911
local exit_code=$?
2012
rm -rf "$tmpdir"
@@ -25,26 +17,86 @@ errecho() {
2517
>&2 echo "$@"
2618
}
2719

28-
# example of releasever: '29' or 'rawhide'
29-
if [ "x$releasever" != "x" ]; then
30-
if [[ ! "$releasever" =~ ^[1-9][0-9]$ ]] && [ "$releasever" != "rawhide" ]; then
31-
errecho "Invalid release format"
32-
exit 1
33-
fi
34-
elif [ "x$releasever" == "x" ]; then
35-
listver="$(curl -s -L https://dl.fedoraproject.org/pub/fedora/linux/releases 2> /dev/null)"
36-
releasever="$(echo "$listver" | sed -e 's/<[^>]*>//g' | awk '{print $1}' | grep -o "[1-9][0-9]" | tail -1)"
37-
if ! [[ "$releasever" =~ ^[1-9][0-9]$ ]]; then
38-
errecho "An error occurred while trying to determine latest Fedora version"
39-
exit 1
20+
usage() {
21+
errecho "Usage: $0 [OPTIONS]... []
22+
23+
This script is used for fetching latest Fedora kernel config for the current
24+
kernel version used by Qubes.
25+
26+
Options:
27+
--releasever <Fedora RELEASEVER> Fedora release version to use. Default is latest.
28+
--include-testing Include testing updates repository
29+
--include-rc Include release candidate kernels
30+
31+
Remark:
32+
Ensure to have downloaded kernel sources in local directory (make get-sources).
33+
"
34+
exit 1
35+
}
36+
37+
get_releasever() {
38+
releasever="$1"
39+
# example of releasever: '29' or 'rawhide'
40+
if [ "x$releasever" != "x" ]; then
41+
if [[ ! "$releasever" =~ ^[1-9][0-9]$ ]] && [ "$releasever" != "rawhide" ]; then
42+
errecho "Invalid release format"
43+
exit 1
44+
fi
45+
elif [ "x$releasever" == "x" ]; then
46+
listver="$(curl -s -L https://dl.fedoraproject.org/pub/fedora/linux/releases 2> /dev/null)"
47+
releasever="$(echo "$listver" | sed -e 's/<[^>]*>//g' | awk '{print $1}' | grep -o "[1-9][0-9]" | tail -1)"
48+
if ! [[ "$releasever" =~ ^[1-9][0-9]$ ]]; then
49+
errecho "An error occurred while trying to determine latest Fedora version"
50+
exit 1
51+
fi
4052
fi
53+
echo "$releasever"
54+
}
55+
56+
localdir="$(dirname "$(readlink -f "$0")")"
57+
kernelver="$(cat "$localdir/version")"
58+
kernelsrc="linux-$kernelver"
59+
60+
if ! OPTS=$(getopt -o hv:t:r: --long help,releasever:,include-testing,include-rc -n "$0" -- "$@"); then
61+
errecho "An error occurred while parsing options."
62+
exit 1
63+
fi
64+
65+
eval set -- "$OPTS"
66+
67+
while [[ $# -gt 0 ]]; do
68+
case "$1" in
69+
-a | --releasever ) releasever="$2"; shift ;;
70+
-m | --include-testing ) ktesting="1"; shift ;;
71+
-i | --include-rc ) krc="1"; shift ;;
72+
-h | --help) usage ;;
73+
esac
74+
shift
75+
done
76+
77+
if [ ! -e "$localdir/$kernelsrc.tar.xz" ]; then
78+
errecho "Cannot find $kernelsrc.tar.xz in local directory."
79+
exit 1
4180
fi
4281

82+
releasever=$(get_releasever "$releasever")
83+
4384
# get the latest kernel rpm
44-
latestver=$(dnf -q repoquery kernel-core --disablerepo=* --enablerepo=fedora --enablerepo=updates --releasever="$releasever")
45-
if [ "$rc" != "1" ]; then
85+
repo_opts="--disablerepo=* --enablerepo=fedora --enablerepo=updates --releasever=$releasever"
86+
87+
# include testing
88+
if [ "$ktesting" == "1" ]; then
89+
repo_opts="$repo_opts --enablerepo=updates-testing"
90+
fi
91+
92+
# shellcheck disable=SC2086
93+
latestver=$(dnf -q repoquery kernel-core $repo_opts)
94+
95+
# include rc
96+
if [ "$krc" != "1" ]; then
4697
latestver=$(echo "$latestver" | grep -v "rc[0-9]*")
4798
fi
99+
48100
latestver=$(echo "$latestver" | sort -V | tail -1 | cut -d ':' -f2)
49101
latestrpm="kernel-core-$latestver.rpm"
50102

@@ -58,7 +110,8 @@ if [ "x$latestrpm" != "x" ] && [ "x$releasever" != "x" ]; then
58110
trap 'exit_clean' 0 1 2 3 6 15
59111
tmpdir="$(mktemp -d -p "$localdir")"
60112
# download latest kernel rpm
61-
dnf -q download kernel-core --disablerepo=* --enablerepo=fedora --enablerepo=updates --releasever="$releasever"
113+
# shellcheck disable=SC2086
114+
dnf -q download kernel-core $repo_opts
62115
mv "$latestrpm" "$tmpdir/$latestrpm.untrusted"
63116

64117
# check signature

kernel-updater.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#!/usr/bin/python3
2+
3+
import sys
4+
import argparse
5+
import requests
6+
import json
7+
8+
from packaging import version
9+
from packaging.version import parse as parse_version
10+
11+
12+
class KernelUpdaterClient:
13+
def __init__(self, version, branch):
14+
self.version = version
15+
self.branch = branch
16+
17+
def get_version_qubes(self):
18+
return self.version
19+
20+
def get_version_upstream(self):
21+
url_releases = 'https://www.kernel.org/releases.json'
22+
r = requests.get(url_releases)
23+
latest_upstream = None
24+
if 200 <= r.status_code < 300:
25+
content = json.loads(r.content.decode('utf-8'))
26+
releases = [rel['version'] for rel in content['releases'] if
27+
rel['moniker'] in ('stable', 'longterm')]
28+
29+
releases.sort(key=parse_version, reverse=True)
30+
31+
if 'stable-' in self.branch:
32+
branch_version = self.branch.split('-')[1]
33+
releases = [rel for rel in releases if
34+
rel.startswith(branch_version)]
35+
36+
latest_upstream = releases[0]
37+
else:
38+
print('An error occurred while downloading "%s"' % url_releases)
39+
40+
return latest_upstream
41+
42+
def is_update_needed(self):
43+
version_qubes = self.get_version_qubes()
44+
version_upstream = self.get_version_upstream()
45+
if version_qubes and version_upstream and (version.parse(version_qubes) < version.parse(version_upstream)):
46+
return version_upstream
47+
48+
def parse_args(argv):
49+
parser = argparse.ArgumentParser()
50+
51+
parser.add_argument('--check-update', required=False, action='store_true')
52+
parser.add_argument('--version', required=True)
53+
parser.add_argument('--branch', required=True)
54+
55+
args = parser.parse_args(argv[1:])
56+
57+
return args
58+
59+
60+
def main(argv):
61+
args = parse_args(argv)
62+
client = KernelUpdaterClient(version=args.version, branch=args.branch)
63+
64+
if args.check_update:
65+
is_update_needed = client.is_update_needed()
66+
if is_update_needed is not None:
67+
print(is_update_needed)
68+
69+
return 0
70+
71+
72+
if __name__ == '__main__':
73+
sys.exit(main(sys.argv))

update-sources

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/bin/bash
2+
# vim: set ts=4 sw=4 sts=4 et :
3+
4+
set -e
5+
set -o pipefail
6+
7+
[ "$DEBUG" = "1" ] && set -x
8+
9+
distance_version() {
10+
read -ra VER1 <<<"$(echo "$1" | tr '.' ' ')"
11+
read -ra VER2 <<<"$(echo "$2" | tr '.' ' ')"
12+
13+
[[ ${VER1[0]} -eq ${VER2[0]} ]] && [[ $((VER1[1] - VER2[1])) -le 1 ]] && [[ $((VER1[1] - VER2[1])) -ge 0 ]]
14+
}
15+
16+
LOCALDIR="$(readlink -f "$(dirname "$0")")"
17+
BUILDERDIR="$LOCALDIR/../../"
18+
VERSION="$(cat version)"
19+
BRANCH="$1"
20+
21+
if [ -z "$BRANCH" ]; then
22+
# Check if qubes-builder Makefile is here
23+
# else rely on current checkout branch
24+
if [ -e "$BUILDERDIR/Makefile" ]; then
25+
BRANCH="$(make -C ../../ -s get-var GET_VAR=BRANCH_linux_kernel 2>/dev/null)"
26+
else
27+
BRANCH="$(git rev-parse --abbrev-ref HEAD)"
28+
fi
29+
fi
30+
31+
# Filter allowed branches
32+
if [[ ! "$BRANCH" =~ ^stable-[0-9]+\.[0-9]+$ ]] && [ "$BRANCH" != "master" ]; then
33+
echo "Cannot determine kernel branch to use."
34+
exit 1
35+
fi
36+
37+
LATEST_KERNEL_VERSION="$(python3 "$LOCALDIR/kernel-updater.py" --check-update --version "$VERSION" --branch "$BRANCH")"
38+
39+
if [ "x$LATEST_KERNEL_VERSION" == "x" ]; then
40+
echo "Current kernel version in branch ${BRANCH} is up to date"
41+
exit 0
42+
fi
43+
44+
# Download latest kernel
45+
echo "$LATEST_KERNEL_VERSION" > version
46+
make get-sources
47+
48+
FC_LATEST="$(curl -s -L https://dl.fedoraproject.org/pub/fedora/linux/releases | sed -e 's/<[^>]*>//g' | awk '{print $1}' | grep -o "[1-9][0-9]" | tail -1)"
49+
STABLE_KERNEL="$(dnf -q repoquery kernel --disablerepo=* --enablerepo=fedora --enablerepo=updates --releasever="$FC_LATEST" | sort -V | tail -1 | cut -d ':' -f2 | cut -d '-' -f1)"
50+
if [ "$BRANCH" == "master" ]; then
51+
TESTING_KERNEL="$(dnf -q repoquery kernel --disablerepo=* --enablerepo=fedora --enablerepo=updates --enablerepo=updates-testing --releasever="$FC_LATEST" | sort -V | tail -1 | cut -d ':' -f2 | cut -d '-' -f1)"
52+
RAWHIDE_KERNEL="$(dnf -q repoquery kernel --disablerepo=* --enablerepo=fedora --enablerepo=updates --releasever=rawhide | grep -v "rc[0-9]*" | sort -V | tail -1 | cut -d ':' -f2 | cut -d '-' -f1 || true)"
53+
fi
54+
55+
if distance_version "$STABLE_KERNEL" "$LATEST_KERNEL_VERSION"; then
56+
"$LOCALDIR/get-fedora-latest-config" --releasever "$FC_LATEST"
57+
mv config-base-"$STABLE_KERNEL" config-base
58+
elif [ "$BRANCH" == "master" ] && { distance_version "$TESTING_KERNEL" "$LATEST_KERNEL_VERSION"; }; then
59+
"$LOCALDIR/get-fedora-latest-config" --releasever "$FC_LATEST" --include-testing
60+
mv config-base-"$STABLE_KERNEL" config-base
61+
elif [ "$BRANCH" == "master" ] && { distance_version "$RAWHIDE_KERNEL" "$LATEST_KERNEL_VERSION"; }; then
62+
"$LOCALDIR/get-fedora-latest-config" --releasever rawhide
63+
mv config-base-"$RAWHIDE_KERNEL" config-base
64+
else
65+
echo "Cannot determine latest config for kernel ${LATEST_KERNEL_VERSION}. Use the current existing config..."
66+
fi

0 commit comments

Comments
 (0)