Last active
January 8, 2021 22:00
-
-
Save RealityRipple/08072f216d1ca1399a32550474366173 to your computer and use it in GitHub Desktop.
Slackware SlackBuild Package Manager (With Dependency Resolver)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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