Skip to content

Instantly share code, notes, and snippets.

@RealityRipple
Last active January 8, 2021 22:00
Show Gist options
  • Save RealityRipple/08072f216d1ca1399a32550474366173 to your computer and use it in GitHub Desktop.
Save RealityRipple/08072f216d1ca1399a32550474366173 to your computer and use it in GitHub Desktop.
Slackware SlackBuild Package Manager (With Dependency Resolver)
#!/bin/bash
if [ -z "${PATH-}" ]; then
export PATH="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin"
fi
if ! { [[ "$PATH" == *":/bin:"* ]] || [[ "$PATH" == "/bin:"* ]] || [[ "$PATH" == *":/bin" ]]; }; then
PATH="$PATH:/bin"
fi
if ! { [[ "$PATH" == *":/usr/bin:"* ]] || [[ "$PATH" == "/usr/bin:"* ]] || [[ "$PATH" == *":/usr/bin" ]]; }; then
PATH="$PATH:/usr/bin"
fi
if ! { [[ "$PATH" == *":/usr/local/bin:"* ]] || [[ "$PATH" == "/usr/local/bin:"* ]] || [[ "$PATH" == *":/usr/local/bin" ]]; }; then
PATH="$PATH:/usr/local/bin"
fi
if ! { [[ "$PATH" == *":/sbin:"* ]] || [[ "$PATH" == "/sbin:"* ]] || [[ "$PATH" == *":/sbin:"* ]]; }; then
PATH="$PATH:/sbin"
fi
if ! { [[ "$PATH" == *":/usr/sbin:"* ]] || [[ "$PATH" == "/usr/sbin:"* ]] || [[ "$PATH" == *":/usr/sbin" ]]; }; then
PATH="$PATH:/usr/sbin"
fi
if ! { [[ "$PATH" == *":/usr/local/sbin:"* ]] || [[ "$PATH" == "/usr/local/sbin:"* ]] || [[ "$PATH" == *":/usr/local/sbin" ]]; }; then
PATH="$PATH:/usr/local/sbin"
fi
title="SlackBuilder"
shortwait=1s
longwait=3s
gaugestate=''
use_nc=false
percent=0
pkg_name='slackbuild-package'
dep_name=''
did_pkg='7'
did_dep=''
workdir='/tmp/SBow'
slackbuild_root='https://slackbuilds.org'
slackbuild_url="$slackbuild_root/slackbuilds/"
slackbuild_search_url="$slackbuild_root/result/?search="
slack_ver="$(. /etc/os-release; echo "$VERSION")"
text_status() {
local did
did="$1"
status_ret=''
case "$did" in
9)status_ret=' N/A ';;
8)status_ret=' ';;
7)status_ret=' Pending ';;
6)status_ret=' Skipped ';;
5)status_ret=' Done ';;
4)status_ret=' Checked ';;
3)status_ret='Completed';;
2)status_ret=' Passed ';;
1)status_ret=' Failed ';;
0)status_ret=' Success ';;
*)
if [ "$did" -lt '0' ]; then
(( pct=-1*did )) || true
pct="${pct%%.*}"
if [ "$pct" -lt '10' ]; then
status_ret=" ${pct}% "
elif [ "$pct" -lt '100' ]; then
status_ret=" ${pct}% "
elif [ "$pct" = '100' ]; then
status_ret=' 100% '
else
status_ret=' Working '
fi
else
status_ret=' ? '
fi;;
esac
}
infobox() {
local boxrows
local boxcols
local inslist
local deplist
local didlist
local dcount
local i
update_window
if [ "$use_nc" = true ]; then
(( boxrows=rows-3 ))
(( boxcols=cols-6 ))
inslist=("Install $pkg_name" "$did_pkg")
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
inslist+=("Install $dep" "$did")
fi
done
dialog --keep-window \
--begin 1 2 \
--title "$title" \
--mixedgauge "$gaugestate" "$boxrows" "$boxcols" "$percent" \
"${inslist[@]}" \
--and-widget --keep-window \
--infobox "\n$1\n " 0 0
return 0
fi
clear
printf '== %s ==\n' "$title"
status_ret=''
text_status "$did_pkg"
printf ' [%s] Install %s\n' "$status_ret" "$pkg_name"
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
status_ret=''
text_status "$did"
printf ' [%s] Install %s\n' "$status_ret" "$dep"
fi
done
printf '\n'
printf '%b\n' "$1"
return 0
}
textbox() {
local boxrows
local boxcols
local outrows
local outcols
update_window
if [ "$use_nc" = true ]; then
(( boxrows=rows-3 ))
(( boxcols=cols-6 ))
(( outrows=boxrows-12 ))
(( outcols=boxcols-4 ))
inslist=("Install $pkg_name" "$did_pkg")
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
inslist+=("Install $dep" "$did")
fi
done
dialog --keep-window \
--begin 1 2 \
--title "$title" \
--mixedgauge "$gaugestate" "$boxrows" "$boxcols" "$percent" \
"${inslist[@]}" \
--and-widget --keep-window \
--title "$2" \
--textbox "$1" "$outrows" "$outcols"
return 0
fi
clear
printf '== %s ==\n' "$title"
status_ret=''
text_status "$did_pkg"
printf ' [%s] Install %s\n' "$status_ret" "$pkg_name"
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
status_ret=''
text_status "$did"
printf ' [%s] Install %s\n' "$status_ret" "$dep"
fi
done
printf '\n'
printf '%b\n\n' "$2"
cat "$1"
return 0
}
alert() {
local boxrows
local boxcols
local inslist
local deplist
local didlist
local dcount
local i
update_window
if [ "$use_nc" = true ]; then
(( boxrows=rows-3 ))
(( boxcols=cols-6 ))
inslist=("Install $pkg_name" "$did_pkg")
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
inslist+=("Install $dep" "$did")
fi
done
dialog --keep-window \
--begin 1 2 \
--title "$title" \
--mixedgauge "$gaugestate" "$boxrows" "$boxcols" "$percent" \
"${inslist[@]}" \
--and-widget --keep-window \
--title "$2" --msgbox "\n$1\n " 0 0
return 0
fi
clear
printf '== %s ==\n' "$title"
status_ret=''
text_status "$did_pkg"
printf ' [%s] Install %s\n' "$status_ret" "$pkg_name"
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
status_ret=''
text_status "$did"
printf ' [%s] Install %s\n' "$status_ret" "$dep"
fi
done
printf '\n'
printf '%b\n\n' "$1"
read -r -N 1 -p "Press any key to continue..."
clear
return 0
}
confirm() {
local yesno
local boxrows
local boxcols
local inslist
local deplist
local didlist
local dcount
local i
update_window
if [ "$use_nc" = true ]; then
(( boxrows=rows-3 ))
(( boxcols=cols-6 ))
inslist=("Install $pkg_name" "$did_pkg")
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
inslist+=("Install $dep" "$did")
fi
done
if [ "$3" = 'no' ]; then
dialog --keep-window \
--begin 1 2 \
--title "$title" \
--mixedgauge "$gaugestate" "$boxrows" "$boxcols" "$percent" \
"${inslist[@]}" \
--and-widget --keep-window \
--title "$2" --defaultno --yesno "\n$1\n " 0 0
else
dialog --keep-window \
--begin 1 2 \
--title "$title" \
--mixedgauge "$gaugestate" "$boxrows" "$boxcols" "$percent" \
"${inslist[@]}" \
--and-widget --keep-window \
--title "$2" --yesno "\n$1\n " 0 0
fi
yesno=$?
if [ "$yesno" = '0' ]; then
return 0
else
return 1
fi
fi
clear
printf '== %s ==\n' "$title"
if ! [ "$gaugestate" = '' ]; then
status_ret=''
text_status "$did_pkg"
printf ' [%s] Install %s\n' "$status_ret" "$pkg_name"
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
status_ret=''
text_status "$did"
printf ' [%s] Install %s\n' "$status_ret" "$dep"
fi
done
fi
printf '\n'
printf '%b' "$1"
if [ "$3" = 'no' ]; then
read -r -p ' [y/N]: ' yesno
clear
if [ "$yesno" = 'y' ] || [ "$yesno" = 'Y' ]; then
return 0
else
return 1
fi
else
read -r -p ' [Y/n]: ' yesno
clear
if [ "$yesno" = 'n' ] || [ "$yesno" = 'N' ]; then
return 1
else
return 0
fi
fi
}
progress() {
local boxrows
local boxcols
local inslist
local deplist
local didlist
local dcount
local i
local pct
gaugestate="$1"
update_window
if [ "$use_nc" = true ]; then
(( boxrows=rows-3 ))
(( boxcols=cols-6 ))
inslist=("Install $pkg_name" "$did_pkg")
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
inslist+=("Install $dep" "$did")
fi
done
dialog --begin 1 2 \
--title "$title" \
--mixedgauge "$1" "$boxrows" "$boxcols" "$percent" \
"${inslist[@]}"
return 0
fi
clear
printf '== %s ==\n' "$title"
status_ret=''
text_status "$did_pkg"
printf ' [%s] Install %s\n' "$status_ret" "$pkg_name"
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
status_ret=''
text_status "$did"
printf ' [%s] Install %s\n' "$status_ret" "$dep"
fi
done
printf '\n'
printf '%b\n' "$1"
return 0
}
output() {
local boxrows
local boxcols
local outrows
local outcols
local outy
local inslist
local deplist
local didlist
local dcount
local i
local ret
update_window
if [ "$use_nc" = true ]; then
(( boxrows=rows-3 ))
(( boxcols=cols-6 ))
(( outcols=boxcols-4 ))
inslist=("Install $pkg_name" "$did_pkg")
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
inslist+=("Install $dep" "$did")
fi
done
(( outy=7+dcount ))
(( outrows=boxrows-10 ))
(( outrows=outrows-dcount ))
if ! [ "$2" = '' ]; then
if [ -e /tmp/sbr_tmp.log ]; then
rm /tmp/sbr_tmp.log
fi
eval "$1" 2>&1 | tee "/tmp/sbr_tmp.log" | dialog --keep-window \
--begin 1 2 \
--title "$title" \
--mixedgauge "$gaugestate" "$boxrows" "$boxcols" "$percent" \
"${inslist[@]}" \
--and-widget --keep-window \
--no-shadow --no-lines \
--begin "$outy" 4 \
--progressbox "$outrows" "$outcols"
ret="$(tail -n "$2" /tmp/sbr_tmp.log)"
rm /tmp/sbr_tmp.log
out_ret="$ret"
return 0
fi
eval "$1" 2>&1 | dialog --keep-window \
--begin 1 2 \
--title "$title" \
--mixedgauge "$gaugestate" "$boxrows" "$boxcols" "$percent" \
"${inslist[@]}" \
--and-widget --keep-window \
--no-shadow --no-lines \
--begin "$outy" 4 \
--progressbox "$outrows" "$outcols"
return 0
fi
if ! [ "$2" = '' ]; then
ret="$(eval "$1" | tail -n "$2")"
out_ret="$ret"
return 0
fi
eval "$1"
return 0
}
input() {
local dret
local boxrows
local boxcols
input_ret=''
update_window
if [ "$use_nc" = true ]; then
(( boxrows=rows-3 ))
(( boxcols=cols-6 ))
input_ret=$(dialog --keep-window \
--begin 1 2 \
--title "$title" \
--mixedgauge "$gaugestate" "$boxrows" "$boxcols" "$percent" \
'Install slackbuild-package' '7' \
--and-widget --keep-window \
--title "$2" --inputbox "\n$1\n " 0 0 --output-fd 1)
dret=$?
if [ "$dret" = '0' ]; then
return 0
else
input_ret=''
return 1
fi
fi
clear
printf '== %s ==\n' "$title"
status_ret=''
text_status "$did_pkg"
printf ' [%s] Install %s\n' "$status_ret" "$pkg_name"
oldIFS="$IFS"
IFS='|'
read -ra deplist <<< "$dep_name"
read -ra didlist <<< "$did_dep"
dcount="${#deplist[@]}"
IFS="$oldIFS"
for (( i=0; i<"$dcount"; i++ )); do
dep="${deplist[$i]}"
did="${didlist[$i]}"
if ! [ "$dep" = '' ]; then
status_ret=''
text_status "$did"
printf ' [%s] Install %s\n' "$status_ret" "$dep"
fi
done
printf '\n'
printf '%b' "$1"
read -r -p ' ' input_ret
clear
if [ "$input_ret" = '' ]; then
return 1
else
return 0
fi
}
find_slackbuild() {
local pkg_id
local pkg_path
local pkg_search
local pos
pkg_id="$1"
pkg_ret=''
pkg_path="$(curl -Is "${slackbuild_search_url}${pkg_id}&sv=$slack_ver" | grep -Fi 'Location')"
if [ "$pkg_path" = '' ]; then
pkg_search="$(curl -s "${slackbuild_search_url}${pkg_id}&sv=$slack_ver" | grep -Fi '<td><a href=')"
search_ret=''
parse_slackbuild_search "$pkg_id" "$pkg_search"
if [ "$search_ret" = '' ]; then
return 1
fi
pkg_path="$search_ret"
pos=13
(( pos+="${#slack_ver}" )) || true
pkg_path="$(echo "${pkg_path:pos}" | sed 's|\(.*\)/.*|\1|')"
else
pos=45
(( pos+="${#slack_ver}" )) || true
pkg_path="$(echo "${pkg_path:pos}" | sed 's|\(.*\)/.*|\1|')"
fi
pkg_ret="$pkg_path"
return 0
}
install_slackbuild() {
local orig_dir
local build_dir
local pkg_id
local old_progress
local pkg_deps
local deplist
local didlist
local d
local dep_data
local pos
local oldIFS
local dlist
local mlist
local dcount
local mcount
local i
local DLD
local DMD
local pkg_file
local dld_md5
local out_path
local idx
local index
pkg_id="$1"
index="$3"
orig_dir="$(pwd)"
build_dir="$workdir"
old_progress="$gaugestate"
(( itm_count++ ))
check_ret=''
if check_slackbuild_installed "$pkg_id"; then
if ! confirm "$check_ret is already installed.\n\nWould you like to reinstall/upgrade $pkg_id anyway?" 'Already Installed'; then
(( itm_done++ ))
(( percent=itm_done*100/itm_count )) || true
return 2
fi
fi
if ! [ -d "$build_dir" ]; then
output "sudo -u $SUDO_USER mkdir $build_dir"
fi
if ! [ -d "$build_dir" ]; then
alert "Error creating workspace at \"$build_dir\"!" 'Unable to Build Package'
cd "$orig_dir" || true
return 1
fi
cd "$build_dir" || true
if ! [ "$(pwd)" = "$build_dir" ]; then
alert "Error navigating to \"$build_dir\"!" 'Unable to Build Package'
cd "$orig_dir" || true
return 1
fi
progress "Downloading $pkg_id.tar.gz from SlackBuilds"
sleep $shortwait
output "sudo -u $SUDO_USER wget -O '$build_dir/$pkg_id.tar.gz' '${slackbuild_url}${slack_ver}/$2/$pkg_id.tar.gz'"
if ! [ -e "$build_dir/$pkg_id.tar.gz" ]; then
alert "Error downloading \"$pkg_id.tar.gz\"!" 'Unable to Build Package'
cd "$orig_dir" || true
gaugestate="$old_progress"
progress "$old_progress"
return 1
fi
if [ "$index" = '-1' ]; then
did_pkg='-14'
else
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$index]='-14'
did_dep="${didlist[*]}"
IFS="$oldIFS"
fi
progress "Extracting $pkg_id.tar.gz"
sleep $shortwait
output "sudo -u $SUDO_USER tar xzf '$build_dir/$pkg_id.tar.gz' -C '$build_dir'"
cd "$build_dir/$pkg_id" || true
if ! [ "$(pwd)" = "$build_dir/$pkg_id" ]; then
alert "Error navigating to \"$build_dir/$pkg_id\"!" 'Unable to Build Package'
cd "$orig_dir" || true
gaugestate="$old_progress"
progress "$old_progress"
return 1
fi
gaugestate="$old_progress"
progress "$old_progress"
if [ "$index" = '-1' ]; then
did_pkg='-29'
else
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$index]='-29'
did_dep="${didlist[*]}"
IFS="$oldIFS"
fi
progress "Reading $pkg_id requirements"
sleep $shortwait
pkg_deps="$(. "$pkg_id.info"; echo "$REQUIRES")"
oldIFS="$IFS"
IFS=' '
read -ra deplist <<< "$pkg_deps"
IFS="$oldIFS"
for d in "${deplist[@]}"; do
if [ "$d" = '%README%' ]; then
alert "The \"$pkg_id\" package has some complicated requirements.\n\nPlease read the README carefully." 'Manual Requirements'
textbox 'README' "$pkg_id README"
else
idx=0
if [ "$dep_name" = '' ]; then
dep_name="$d"
did_dep="7"
else
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
IFS="$oldIFS"
idx="${#didlist[@]}"
dep_name="$dep_name|$d"
did_dep="$did_dep|7"
fi
pkg_ret=''
find_slackbuild "$d"
if [ "$pkg_ret" = '' ]; then
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$idx]='1'
did_dep="${didlist[*]}"
IFS="$oldIFS"
alert "Unable to find \"$d\" for Slackware $slack_ver on the SlackBuilds website.\n\nPlease install the \"$d\" package manually." 'Manual Requirements'
continue
fi
oldIFS="$IFS"
IFS='/'
read -ra dep_data <<< "$pkg_ret"
IFS="$oldIFS"
if [ "${dep_data[1]}" = '' ]; then
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$idx]='1'
did_dep="${didlist[*]}"
IFS="$oldIFS"
alert "Unable to parse \"$pkg_ret\" into a category and package name.\n\nPlease install the \"$d\" package manually." 'Manual Requirements'
continue
fi
if [ "${dep_data[0]}" = '' ]; then
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$idx]='1'
did_dep="${didlist[*]}"
IFS="$oldIFS"
alert "Unable to parse \"$pkg_ret\" into a category and package name.\n\nPlease install the \"$d\" package manually." 'Manual Requirements'
continue
fi
old_progress="$gaugestate"
progress "Installing $pkg_id Requirement\n ${dep_data[1]} SlackBuild"
sleep $shortwait
install_slackbuild "${dep_data[1]}" "${dep_data[0]}" "$idx"
dep_ret="$?"
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$idx]='5'
did_dep="${didlist[*]}"
IFS="$oldIFS"
gaugestate="$old_progress"
progress "$old_progress"
if [ "$dep_ret" = '1' ]; then
return 1
fi
fi
done
if [ "$index" = '-1' ]; then
did_pkg='-43'
else
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$index]='-43'
did_dep="${didlist[*]}"
IFS="$oldIFS"
fi
progress "Reading $pkg_id Download List"
sleep $shortwait
if [ "$(uname -m)" = 'x86_64' ]; then
pkg_dld="$(. "$build_dir/$pkg_id/$pkg_id.info"; echo "$DOWNLOAD_x86_64")"
if [ "$pkg_dld" = '' ] || [ "$pkg_dld" = 'UNSUPPORTED' ]; then
pkg_dld="$(. "$build_dir/$pkg_id/$pkg_id.info"; echo "$DOWNLOAD")"
pkg_md5="$(. "$build_dir/$pkg_id/$pkg_id.info"; echo "$MD5SUM")"
else
pkg_md5="$(. "$build_dir/$pkg_id/$pkg_id.info"; echo "$MD5SUM_x86_64")"
fi
else
pkg_dld="$(. "$build_dir/$pkg_id/$pkg_id.info"; echo "$DOWNLOAD")"
pkg_md5="$(. "$build_dir/$pkg_id/$pkg_id.info"; echo "$MD5SUM")"
fi
oldIFS="$IFS"
IFS=' '
read -ra dlist <<< "$pkg_dld"
read -ra mlist <<< "$pkg_md5"
IFS="$oldIFS"
dcount="${#dlist[@]}"
mcount="${#mlist[@]}"
if ! [ "$dcount" = "$mcount" ]; then
alert "Error reading \"$pkg_id.info\": DOWNLOAD and MD5SUM count mismatch!" 'Unable to Build Package'
cd "$orig_dir" || true
return 1
fi
if [ "$index" = '-1' ]; then
did_pkg='-57'
else
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$index]='-57'
did_dep="${didlist[*]}"
IFS="$oldIFS"
fi
progress "Downloading $pkg_id Archives"
sleep $shortwait
for (( i=0; i<"$dcount"; i++ )); do
DLD="${dlist[$i]}"
DMD="${mlist[$i]}"
pkg_file="$(basename "$DLD")"
progress "Downloading $pkg_id Archive\n $pkg_file"
sleep $shortwait
output "sudo -u $SUDO_USER wget -O '$build_dir/$pkg_id/$pkg_file' '$DLD'"
if ! [ -e "$build_dir/$pkg_id/$pkg_file" ]; then
alert "Error downloading \"$DLD\"!" 'Unable to Build Package'
cd "$orig_dir" || true
return 1
fi
progress "Verifying $pkg_file Integrity"
sleep $shortwait
dld_md5="$(md5sum "$build_dir/$pkg_id/$pkg_file")"
if ! [ "${dld_md5:0:32}" = "$DMD" ]; then
alert "MD5 Mismatch: \"$DLD\"!" 'Unable to Build Package'
cd "$orig_dir" || true
return 1
fi
done
if [ "$index" = '-1' ]; then
did_pkg='-71'
else
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$index]='-71'
did_dep="${didlist[*]}"
IFS="$oldIFS"
fi
infobox 'You best get comfortable, this might take quite a long time.'
sleep $longwait
old_progress="$gaugestate"
progress "Building $pkg_id"
sleep $shortwait
out_ret=''
output "$build_dir/$pkg_id/$pkg_id.SlackBuild" '2'
out_path="$out_ret"
if ! [ "${out_path:0:18}" = 'Slackware package ' ]; then
alert "Error creating Slackware package for $pkg_id." 'Unable to Build Package'
cd "$orig_dir" || true
gaugestate="$old_progress"
progress "$old_progress"
return 1
fi
if ! [ "${out_path: -9}" = ' created.' ]; then
alert "Error creating Slackware package for $pkg_id." 'Unable to Build Package'
cd "$orig_dir" || true
gaugestate="$old_progress"
progress "$old_progress"
return 1
fi
if [ "$index" = '-1' ]; then
did_pkg='-85'
else
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$index]='-85'
did_dep="${didlist[*]}"
IFS="$oldIFS"
fi
out_path="${out_path:18}"
out_path="${out_path:0: -9}"
progress "Installing $pkg_id"
sleep $shortwait
output "installpkg $out_path"
if [ "$index" = '-1' ]; then
did_pkg='-100'
else
oldIFS="$IFS"
IFS='|'
read -ra didlist <<< "$did_dep"
didlist[$index]='-100'
did_dep="${didlist[*]}"
IFS="$oldIFS"
fi
progress 'Cleaning Work Folder'
sleep $shortwait
output "rm $build_dir/$pkg_id.tar.gz"
output "rm -rf $build_dir/$pkg_id"
output "rm $out_path"
cd "$orig_dir" || true
(( itm_done++ ))
(( percent=itm_done*100/itm_count )) || true
gaugestate="$old_progress"
progress "$old_progress"
return 0
}
parse_slackbuild_search() {
local find_id
local table
local rex_find
find_id="$1"
table="$2"
rex_find='<tr [^>]+><td><a href="([^"]+)"> ([^<]+)<\/a>'
search_ret=''
while [[ $table =~ $rex_find ]];do
if [ "${BASH_REMATCH[2]}" = "$find_id" ]; then
search_ret="${BASH_REMATCH[1]}"
return 0
fi
table="${table##*${BASH_REMATCH[0]}}"
done
search_ret=''
return 1
}
check_slackbuild_installed() {
local pkg_id
local slack_find
local slack_list
local oldIFS
local p
local rex_find
local pkg_file
pkg_id="$1"
check_ret=''
slack_find="$(ls /var/log/packages/"$pkg_id"*)"
if [ "$slack_find" = '' ]; then
return 1
fi
oldIFS="$IFS"
IFS=$'\n'
read -rd '' -a slack_list <<<"$slack_find"
IFS="$oldIFS"
rex_find='^(.+)-([^-]+)-(x86_64|x86|i[4-6]86|fw|noarch)'
for p in "${slack_list[@]}"; do
pkg_file="$(basename "$p")"
if [[ $pkg_file =~ $rex_find ]]; then
if [ "${BASH_REMATCH[1]}" = "$pkg_id" ]; then
check_ret="$pkg_file"
return 0
fi
fi
done
return 1
}
update_window() {
local ms
if [ -e /usr/bin/dialog ]; then
ms="$(dialog --print-maxsize --stdout)"
ms=${ms#*: }
cols=${ms#*, }
rows=${ms%, *}
if [ "$cols" -gt '59' ]; then
if [ "$rows" -gt '17' ]; then
use_nc=true
else
use_nc=false
if [ "$1" = true ]; then
alert "$title includes an optional ncurses interface.\nTo use the interface, please increase your terminal height to 18 or more rows."
fi
fi
else
use_nc=false
if [ "$1" = true ]; then
alert "$title includes an optional ncurses interface.\nTo use the interface, please increase your terminal width to 60 or more columns."
fi
fi
else
use_nc=false
if [ "$1" = true ]; then
#confirm "$title includes an optional ncurses interface which requires the \"dialog\" package.\n\nWould you like to install \"dialog\" now?" '' 'no'
#if ! [ $? = '1' ]; then
if confirm "$title includes an optional ncurses interface which requires the \"dialog\" package.\n\nWould you like to install \"dialog\" now?" '' 'no'; then
output 'slackpkg -batch=on update'
output 'slackpkg -batch=on -default_answer=y install dialog'
fi
fi
fi
}
update_window true
if ! [ "$EUID" = '0' ]; then
alert "$title requires root permissions to build and install packages." 'Permissions Required'
clear
exit 1
fi
if [ -d "$workdir" ]; then
rm -rf "$workdir"
fi
input_ret=''
input 'Enter the name of the package you wish to build:' 'Select Package'
if [ "$input_ret" = '' ]; then
clear
exit 1
fi
find="$input_ret"
pkg_name="$find"
did_pkg=7
pkg_ret=''
find_slackbuild "$find"
if [ "$pkg_ret" = '' ]; then
alert "Unable to find \"$find\" for Slackware $slack_ver on the SlackBuilds website.\n\nPlease install the \"$find\" package manually." 'Manual Requirements'
clear
exit 1
fi
oldIFS="$IFS"
IFS='/'
read -ra find_data <<< "$pkg_ret"
IFS="$oldIFS"
if [ "${find_data[1]}" = '' ]; then
alert "Unable to parse \"$pkg_ret\" into a category and package name.\n\nPlease install the \"$find\" package manually."
clear
exit 1
fi
if [ "${find_data[0]}" = '' ]; then
alert "Unable to parse \"$pkg_ret\" into a category and package name.\n\nPlease install the \"$find\" package manually."
clear
exit 1
fi
progress "Preparing ${find_data[1]} SlackBuild"
sleep $shortwait
itm_count=0
itm_done=0
install_slackbuild "${find_data[1]}" "${find_data[0]}" '-1'
success="$?"
if [ -d "$workdir" ]; then
rm -rf "$workdir"
fi
if [ "$success" = '0' ]; then
alert "The SlackBuild package \"$pkg_name\" has been installed." 'Package Installed'
clear
exit 0
fi
clear
exit 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment