Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 75 additions & 69 deletions packages/ublue-rebase-helper/src/ublue-rebase-helper
Original file line number Diff line number Diff line change
Expand Up @@ -3,94 +3,100 @@
# Ublue Rebase Helper 2.0

get_config() {
REBASE_HELPER_CONFIG_FILE="${REBASE_HELPER_CONFIG_FILE:-/etc/ublue-os/rebase_helper.json}"
QUERY="$1"
FALLBACK="$2"
shift
shift
OUTPUT="$(jq -r -c "$QUERY" "$REBASE_HELPER_CONFIG_FILE" 2>/dev/null || echo "$FALLBACK")"
if [ "$OUTPUT" == "null" ] ; then
echo "$FALLBACK"
return
fi
echo "$OUTPUT"
REBASE_HELPER_CONFIG_FILE="${REBASE_HELPER_CONFIG_FILE:-/etc/ublue-os/rebase_helper.json}"
QUERY="$1"
FALLBACK="$2"
shift
shift
OUTPUT="$(jq -r -c "$QUERY" "$REBASE_HELPER_CONFIG_FILE" 2>/dev/null || echo "$FALLBACK")"
if [ "$OUTPUT" == "null" ] ; then
echo "$FALLBACK"
return
fi
echo "$OUTPUT"
}

#shellcheck disable=1091
source /usr/lib/ujust/ujust.sh

IMAGE_INFO="${REBASE_HELPER_INFO_FILE:-"/usr/share/ublue-os/image-info.json"}"
IMAGE_INFO="${REBASE_HELPER_INFO_FILE:-/usr/share/ublue-os/image-info.json}"
IMAGE_NAME=$(jq -r '."image-name"' < "$IMAGE_INFO")
IMAGE_VENDOR=$(jq -r '."image-vendor"' < "$IMAGE_INFO")
IMAGE_REGISTRY="ghcr.io/${IMAGE_VENDOR}"

function list_tags(){
local branch="${branch:-$1}"
shift
local regex='.Tags[]'
regex="$regex"\ ' | select(test("^PLACEHOLDER|^PLACEHOLDER-(?:\\d+\\IMAGE_DATE_SEPARATOR\\d+|\\d+)"))'
regex=${regex//PLACEHOLDER/$branch}
regex=${regex//IMAGE_DATE_SEPARATOR/$IMAGE_DATE_SEPARATOR}
echo -e >&2 "Listing images, this can take a bit of time..."
skopeo list-tags "docker://${IMAGE_REGISTRY}/${IMAGE_NAME}" | jq -r "$regex"
}
IMAGE_DATE_SEPARATOR="$(get_config '."image-date-separator"' "-")"

IMAGE_DATE_SEPARATOR="$(get_config '."image-date-separator"' ".")"
# Image variant selection
echo "Select your Bluefin image:"
IMAGE_OPTIONS=(bluefin bluefin-dx cancel)
CHOSEN_IMAGE="$(Choose "${IMAGE_OPTIONS[@]}")"
[[ "$CHOSEN_IMAGE" == "cancel" ]] && exit 0

# Generates AVAILABLE_TAGS array from JSON array
AVAILABLE_TAGS="$(get_config '."available-tags"[]' "null")"
AVAILABLE_TAGS=${AVAILABLE_TAGS//\"/""}
mapfile -t AVAILABLE_TAGS < <(echo "$AVAILABLE_TAGS")
if [ "${AVAILABLE_TAGS[*]}" == "null" ] ; then
echo "Failure listing available tags"
exit 1
fi
IMAGE_NAME="$CHOSEN_IMAGE"

echo "Which stream would you like to rebase to?"
CHOSEN_TAG="$(Choose date "${AVAILABLE_TAGS[@]}" cancel)"

if [ "${CHOSEN_TAG}" == "date" ] ; then
echo "Which stream do you want to rebase to a specific date to?"
CHOSEN_TAG="$(Choose all current "${AVAILABLE_TAGS[@]}" cancel)"
if [[ ! " ${AVAILABLE_TAGS[*]} all current " =~ [[:space:]]${CHOSEN_TAG}[[:space:]] ]]; then
exit 0
fi
case "$CHOSEN_TAG" in
"all")
CHOSEN_TAG=""
;;

"current")
CURRENT_IMAGE=$(rpm-ostree status -b --json | jq -r '.deployments[0]."container-image-reference"')
#shellcheck disable=2001
CHOSEN_TAG="$(echo "$CURRENT_IMAGE" | sed "s/.*://")"
;;

"cancel")
exit 0
;;
esac

echo "Warning: This will pin you to a specific version, do not forget to rebase back to a channel to resume receiving updates."
mapfile -t valid_tags < <(list_tags "$CHOSEN_TAG" | sed 's/\"//g' | sed 's/,//g')
CHOSEN_TAG=$(Choose cancel "${valid_tags[@]}")
elif [[ ! " ${AVAILABLE_TAGS[*]} " =~ [[:space:]]${CHOSEN_TAG}[[:space:]] ]]; then
# No valid things were found
exit 0
fi
# Define base channels
AVAILABLE_TAGS=(lts stream10)

if [[ "$CHOSEN_TAG" == "cancel" || "$CHOSEN_TAG" == "" ]] ; then
exit 0
# Channel selection
echo "Which base stream would you like to rebase to?"
CHOSEN_BASE="$(Choose "${AVAILABLE_TAGS[@]}" cancel)"
[[ "$CHOSEN_BASE" == "cancel" ]] && exit 0

# If lts, ask for lts-hwe option
declare -a CHANNELS
if [[ "$CHOSEN_BASE" == "lts" ]]; then
CHANNELS=(lts lts-hwe)
else
CHANNELS=(stream10 stream10-hwe)
fi

if [ "$rebase_target" == "" ] ; then
rebase_target="$IMAGE_REGISTRY/$IMAGE_NAME:$CHOSEN_TAG"
CHOSEN_TAG="$(Choose "${CHANNELS[@]}" cancel)"
[[ "$CHOSEN_TAG" == "cancel" ]] && exit 0

# Tag selection flow
if [[ "$CHOSEN_TAG" == lts || "$CHOSEN_TAG" == stream10 ]]; then
echo "Do you want to select a specific tag for channel: $CHOSEN_TAG?"
fetch_choice=$(Choose "no" "yes" cancel)
[[ "$fetch_choice" == "cancel" ]] && exit 0

if [[ "$fetch_choice" == "yes" ]]; then
echo "Fetching available tags for channel: $CHOSEN_TAG"

# Fetch all tags
ALL_TAGS=$(skopeo list-tags "docker://${IMAGE_REGISTRY}/${IMAGE_NAME}" | jq -r '.Tags[]')

# Build available tag list for selection
if [[ "$CHOSEN_TAG" == "lts" ]]; then
mapfile -t valid_tags < <(echo "$ALL_TAGS" | grep -E "^lts$|^lts-amd64$|^lts-arm64$|^lts${IMAGE_DATE_SEPARATOR}[0-9]{8}$")
elif [[ "$CHOSEN_TAG" == "stream10" ]]; then
mapfile -t valid_tags < <(echo "$ALL_TAGS" | grep -E "^stream10$|^stream10\\.${IMAGE_DATE_SEPARATOR}?[0-9]{8}$")
fi

# Prompt for tag selection
echo "Select a tag to rebase to:"
CHOSEN_TAG="$(Choose cancel "${valid_tags[@]}")"
[[ "$CHOSEN_TAG" == "cancel" ]] && exit 0
fi
elif [[ "$CHOSEN_TAG" == stream10-hwe ]]; then
echo "Fetching available tags for channel: $CHOSEN_TAG"

# Fetch all tags
ALL_TAGS=$(skopeo list-tags "docker://${IMAGE_REGISTRY}/${IMAGE_NAME}" | jq -r '.Tags[]')

# Build available tag list for stream10-hwe selection
mapfile -t valid_tags < <(echo "$ALL_TAGS" | grep -E "^stream10\\.[0-9]{8}-hwe$")

echo "Select a tag to rebase to:"
CHOSEN_TAG="$(Choose cancel "${valid_tags[@]}")"
[[ "$CHOSEN_TAG" == "cancel" ]] && exit 0
fi

echo "Rebase target is ${rebase_target}"
REBASE_TARGET="$IMAGE_REGISTRY/$IMAGE_NAME:$CHOSEN_TAG"

echo -e "\nRebase target is: $REBASE_TARGET"
if [[ $(Confirm "Do you really wish to rebase?") -ne "0" ]]; then
exit 1
fi

rpm-ostree rebase "ostree-image-signed:docker://${rebase_target}"
rpm-ostree rebase "ostree-image-signed:docker://${REBASE_TARGET}"
exit 0
2 changes: 1 addition & 1 deletion packages/ublue-rebase-helper/ublue-rebase-helper.spec
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Name: ublue-rebase-helper
Version: 0.1.0
Version: 0.1.1
Release: 1%{?dist}
Summary: Rebase helper for Universal Blue images

Expand Down