#!/bin/bash

Info () {
title="Info"
author="Peter Starfinger"
mail="E-Mail: info@die-starfingers.de"
jahr="2020"
app="$(basename $0)"
info="$(get-text 'The Starbuntu application&#10;<i>$app</i>&#10;was written by' $app)"

yad --center --fixed --title="$title" --window-icon="info" --image="info" --borders=20 --text="$info"$'\n'$'\n'"$author"$'\n'"$mail"$'\n'$'\n'"$jahr"$'\n' --text-align=center --selectable-labels --button="OK" &
wunwa "$title" > /dev/null; xdotool key Home key Down
}

param="$1"
[ "$param" = "info" ] && Info && exit 0

! $(sudoer $USER) && exit 1

if [ "$param" = "root" ]; then
    dofug="/root/.local/share/zeitgeist/day-of-upgrade"
    [ -f "$dofug" ] && upgr=$(cat "$dofug") || upgr=0
    today=$(date +%j)
    today=$(sed 's/^[0]*//g' <<< $today)
    year=$(date +%Y); ((year--))
    if [ $((today-upgr)) -lt 0 ]; then
	if [ $year -eq $(((year/4)*4)) ]; then
	    let today=366+$today
	else
	    let today=365+$today
	fi
    fi
    let Diff=$today-$upgr
    if [ $Diff -gt 7 ]; then
	err=1
	until [ $err -eq 0 ]; do
	    wget -q --spider http://google.com
	    err=$?
	done
	title="$(gettext "Upgrade Reminder")"
	text="$(gettext "<b>    The last upgrade has been executed&#10;    earlier than one week ago.&#10;&#10;    Do you want to run it now?</b>")"
	button="$(gettext "Help")"
	lang_dir="$(gettext "C")"
	b0="$(gettext "Yes")"; b1="$(gettext "No")"
	yad --center --borders=10 --image=/usr/share/icons/gnome/48x48/status/dialog-warning.png --window-icon=$HOME/.icons/upgrade.png --title="$title" --text="$text" --button="$b1":1 --button=$button:"yelp /usr/share/help/$lang_dir/Starbuntu/starbuntu-apps-details.page#upgrade" --button="Info":"$0 info" --button="$b0":0
	[ $? -eq 1 ] && exit 1
    else
	exit 0
    fi
fi

if [[ "$USER" != "root" ]]; then xseticon -id $(wunwa "upgrade$") $HOME/.icons/upgrade.png & gksu "xterm -e $0 $USER"; exit 0; else [ -z "$param" ] && param="root"; fi

[ "$param" = "root" ] && casa="/root" || casa="/home/$param"
eval "$(cat "$casa/.profile" | grep 'LANGUAGE=')"

if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
    if [ `date +%j` -ne $(cat /root/.local/share/zeitgeist/day-of-upgrade) ]; then
	cp /usr/share/sddm/scripts/Xsetup /usr/share/sddm/scripts/Xsetup.sb
	apt update 2>/dev/null
	apt full-upgrade 2>/dev/null
	IFS=$'\n'
	pilist=($(dpkg-query -l | grep 'ii  '))
	pilist=(${pilist[@]//ii  /})
	pilist=(${pilist[@]%% *})
	pilist=(${pilist[@]//:$(dpkg --print-architecture)/})
	echo "${pilist[*]}" > /var/lib/apt/lists/auxfiles/pilist

	pnilist=($(apt list | grep -v \[[Ii]nstall | grep -v i386 | grep -v ^linux))
	unset pnilist[0]
	pnilist=(${pnilist[@]%%\/*})
	pnilist=(${pnilist[@]//libreoffice/#libreoffice})
	pnilist=($(echo "${pnilist[*]}" | grep -v ^lib))
	pnilist=(${pnilist[@]//#libreoffice/libreoffice})
	echo "${pnilist[*]}" > /var/lib/apt/lists/auxfiles/pnilist

	if [ ! -L "/usr/share/plymouth/ubuntu-logo.png" ]; then
	    text="$(gettext "The package Plymouth is getting adjusted ...")"
	    echo "$text"
	    cp /usr/local/share/plymouth-Starbuntu/starbuntu-logo.png /usr/share/plymouth
	    ln -sfn /usr/share/plymouth/starbuntu-logo.png /usr/share/plymouth/ubuntu-logo.png
	    update-initramfs -c -k all
	fi
	[ -n "$(diff /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy.bak)" ] && cp /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy.bak /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy
	[ -n "$(diff /usr/share/sddm/scripts/Xsetup /usr/share/sddm/scripts/Xsetup.sb)" ] && mv /usr/share/sddm/scripts/Xsetup /usr/share/sddm/scripts/Xsetup.sddm && mv /usr/share/sddm/scripts/Xsetup.sb /usr/share/sddm/scripts/Xsetup || rm /usr/share/sddm/scripts/Xsetup.sb
	[ -e "/live" ] && mv-jre
    fi
    count_up=false
    second_run=false
    remove_kernel=false	
    [ -e "/live" ] && n=1 || n=2

    cd /tmp/hsperfdata_$USER
    installed="$(grep "LTS'/>" $HOME/.config/openbox/menu.xml | cut -d' ' -f5)" #'
    wget -q die-starfingers.de/Starbuntu/Repository/Latest_Versions -O Latest_Versions
    . Latest_Versions
    conseq="$installed"$'\n'"$newest"
    
    if [ "$newest" != "$installed" ] && [ "$newest" = "$(echo "$conseq" | sort --version-sort | tail -1)" ]; then
	text=$'\n'"$(gettext "Starbuntu upgradable! Upgrade?")"
	reply="$(gettext "y/n")"
	text="$text $reply"
	echo "$text"
	read -n 1 key <&1
	if [ "$key" = "${reply::1}" ]; then
	    locked="$(grep LOCKED /etc/environment)"
	    wget die-starfingers.de/Starbuntu/Repository/starbuntu-utils-$newest-all.deb
	    apt-get install "./starbuntu-utils-$newest-all.deb"
	    [ $HOSTNAME = "Starbuntu-p" ] && chown -R 1000:1000 /usr/local/bin
	    count_up=true
	    rm starbuntu-utils-$newest-all.deb
	    sed -i "s/export LOCKED=.*/$locked/" /etc/environment
	    sed -i "s/DOWNLOADED=.*/DOWNLOADED=\"$(date "+%Y-%m-%d %H")\"/" "/etc/environment"
	    j_installed=$(dpkg -l starbuntu-jdk-jre | tail -1 | cut -d\  -f4)
	    if [ "$j_latest" != "$j_installed" ]; then
		wget die-starfingers.de/Starbuntu/Repository/starbuntu-jdk-jre-headless_${j_latest}_amd64.deb
		dpkg -r --force-all starbuntu-jdk-jre-headless
		dpkg -i --force-all "./starbuntu-jdk-jre-headless_${j_latest}_amd64.deb"
		wget die-starfingers.de/Starbuntu/Repository/starbuntu-jdk-jre_${j_latest}_amd64.deb
		dpkg -r --force-all starbuntu-jdk-jre
		dpkg -i --force-all "./starbuntu-jdk-jre_${j_latest}_amd64.deb"
	    fi
	    mv_installed=$(dpkg -l starbuntu-mediathekview | tail -1 | cut -d\  -f4)
	    if [ "$mv_latest" != "$mv_installed" ]; then
		wget die-starfingers.de/Starbuntu/Repository/starbuntu-mediathekview_${mv_latest}_all.deb
		dpkg -r --force-all starbuntu-mediathekview
		dpkg -i --force-all "./starbuntu-mediathekview_${mv_latest}_all.deb"
	    fi
	fi
    else
	text=$'\n'"$(gettext "The Starbuntu files are up-to-date!")"$'\n'
	echo "$text"
    fi
    
    descr="$installed"
    installed_new="$(cat /usr/lib/os-release | grep PRETTY_NAME)"
    installed_new="${installed_new#* }"; installed_new="${installed_new%% *}"
    descr_new="$installed_new"
    [ $(tr -dc '.' <<< "$descr_new" | wc -c) -lt 3 ] && descr_new="$descr_new".0
    [ $(tr -dc '.' <<< "$descr_new" | wc -c) -lt 3 ] && descr_new="$descr_new".0
    nr="${descr##*.}"; nr_new="${descr_new##*.}"
    if [ -e "/live" ]; then
	[ "$descr_new" = "$descr" ] && descr_new="${descr%.*}.$((++nr))" || descr_new="${descr_new%.*}.$((++nr_new))"
    fi
#    [ -e "/etc/grub.d.part" ] && suffix=".part" || suffix=""
#    [ "${descr_new: -1}" = "1" ] && chmod u+w /boot/grub/grub.cfg && sed -i -E "s/[02468][02468]\.04\.[1-4]/${descr_new%.1*}/g" /etc/grub.d$suffix/10_linux /boot/grub/grub.cfg && chmod u-w /boot/grub/grub.cfg
    descr_hyphen="${descr//./-}"
    descr_new_hyphen="${descr_new//./-}"
    descr_mask="${descr%04*}04"
    descr_mask="${descr_mask//./\\.}\..\..[0-9]?"
    user="$(id -nu 1000)"

    old=($(ls /boot/vmlinuz-* | sort -r --version-sort | cut -d- -f2,3))

    if [ -e "/live" ]; then
	if [ $(ls /boot/vmlinuz* | wc -w) -gt 1 ]; then
	    text=""
	    for ((k=$n; k<${#old[@]}; k++)); do text="$text ${old[$k]}"; done
	    text="Kernel$text entfernen? j/n"
	    echo "$text"
	    read -n 1 key <&1
	    [ "$key" = "j" ] && remove_kernel=true
	fi
	if [ `date +%j` -ne $(cat /root/.local/share/zeitgeist/day-of-upgrade) ]; then
	    text=$'\n'"Starbuntu-Version raufzählen? j/n"
	    echo "$text"
	    read -n 1 key <&1
	    [ "$key" = "j" ] && count_up=true && second_run=true
	fi
    else
	remove_kernel=true
    fi

    $remove_kernel && for ((k=$n; k<${#old[@]}; k++)); do apt-get -qy remove --purge linux-*-${old[$k]}*; done

    apt-get -qy autoremove --purge
    apt-get autoclean
    apt-get clean

    if [ -e "/live" ] && $count_up && $second_run; then
      cd /live
      pkg=$(ls -d starbuntu-utils-* | head -n 1)
      for f in /etc/lsb-release /usr/lib/os-release; do
	release="$(cat $f)"
	release="$(echo "$release" | sed 's/Ubuntu/Starbuntu/g')"
	release="${release/$installed_new/$descr_new}"
	echo "$release" > $f
	cp "$f" "$pkg"/tmp/$(basename $f)
	if [ "$f" = "/usr/lib/os-release" ]; then
	    cp "/etc/environment" "$pkg"/etc
	    grep -rl "${descr%04*}04" /usr/share/help* | xargs sed -i -E "s/${descr_hyphen%04*}04-.-.*-amd64/$descr_new_hyphen-amd64/g; s/$descr_mask/$descr_new/g"
	    udevil mount -o password_stdin ssh://die-starfingers.de@ssh.strato.de <<< "$(./decode C6C8B3C5ADC4C096C8507673BA7DBB65767E)"
	    cd /media/root/ssh-ssh.strato.de/Starbuntu
	    grep -rl "${descr%04*}04" --exclude=Starbuntu-$descr_hyphen-amd64.iso --exclude=Starbuntu-latest.iso --exclude-dir={Forum,Images,JavaCalc,Repository} * | xargs sed -i -E "s/${descr_hyphen%04*}04-.-.*-amd64/$descr_new_hyphen-amd64/g; s/$descr_mask/$descr_new/g"
	    cd /live
	    pkg_new="starbuntu-utils-"$descr_new"-all"
	    mv "$pkg" "$pkg_new"
	    grep -rl "${descr%04*}04" $pkg_new/usr/share/help* | xargs sed -i -E "s/${descr_hyphen%04*}04-.-.*-amd64/$descr_new_hyphen-amd64/g; s/$descr_mask/$descr_new/g"
	    control=$(cat $pkg_new/DEBIAN/control)
	    control="$(echo "$control" | sed "s/Version: .*/Version: $descr_new/g")"
	    size_old="$(echo "$control" | grep 'Installed-Size: ')"
	    size_old="${size_old#*Installed-Size: }"
	    size=$(du -s $pkg_new)
	    size="${size%%$'\t'*}"
	    ((size=size-2))
	    control="${control/$size_old/$size}"
	    echo "$control" > $pkg_new/DEBIAN/control
	    rm "$pkg".deb
	    dpkg-deb -b "$pkg_new"
	    rm /media/root/ssh-ssh.strato.de/Starbuntu/Repository/$pkg.deb
	    cp "$pkg_new".deb /media/root/ssh-ssh.strato.de/Starbuntu/Repository
	    sed -i "s/newest=.*/newest=$descr_new/" /media/root/ssh-ssh.strato.de/Starbuntu/Repository/Latest_Versions
	    mv /media/root/ssh-ssh.strato.de/Starbuntu/Starbuntu-$descr_hyphen-amd64.iso /media/root/ssh-ssh.strato.de/Starbuntu/Starbuntu-$descr_new_hyphen-amd64.iso
	    ln -sfr /media/root/ssh-ssh.strato.de/Starbuntu/Starbuntu-$descr_new_hyphen-amd64.iso /media/root/ssh-ssh.strato.de/Starbuntu/Starbuntu-latest.iso
	    udevil umount ssh://die-starfingers.de@ssh.strato.de
	    # [ -n "$(grep "LOCKED=true" /etc/environment)" ] && locked=true || locked=false
	    # apt install ./"$pkg_new".deb
	    # $locked && sed -i "s/LOCKED=false/LOCKED=true/" /etc/environment
	fi
      done
    fi
    l_file=`find /etc/grub.d* -maxdepth 1 -type f -name 10_linux`
    src=`grep -n "^\. " $l_file`
    if [ $(echo "$src" | wc -l) = 1 ]; then
      n=`echo "$src" | cut -d: -f1`
      src_file='. "/etc/lsb-release"  # von mir eingefügt'
      sed -i "$((n+1))i $src_file" $l_file
      grub_distr='GRUB_DISTRIBUTOR="Ubuntu"  # von mir eingefügt'
      sed -i "$((n+2))i $grub_distr" $l_file
      if [ -d "/home/$user/Starbuntu/Webseite" ]; then
	distr_descr="DISTRIB_DESCRIPTION=\"\$(echo \"\$DISTRIB_DESCRIPTION\" | sed \'s/Starbuntu/Starprivat/\')\"  # von mir eingefügt"
	sed -i "$((n+3))i $distr_descr" $l_file
      fi
      distr='GRUB_DISTRIBUTOR="$DISTRIB_DESCRIPTION"    # von mir eingefügt'
      if [ -z "`grep "$distr" $l_file`" ]; then n=`grep -n 'Ubuntu|Kubuntu' $l_file | cut -d: -f1`; sed -i "$((n+1))i \ \ \ \ \ \ $distr" $l_file; fi
    fi
    if [ -d "/home/$user/Starbuntu/Webseite" ] && $count_up; then
	sed -i 's/PRETTY_NAME=\"Starbuntu/PRETTY_NAME=\"Starprivat/' /usr/lib/os-release
	cd /home/$user/Starbuntu
	grep -rl "${descr%04*}04" * | xargs sed -i -E "s/${descr_hyphen%04*}04-.-.*-amd64/$descr_new_hyphen-amd64/g; s/$descr_mask/$descr_new/g"
    fi
    $count_up && ! $second_run && sudo -u $user sh -c 'appmenu-refresh 2>/dev/null && obamenu-refresh' &
    [ ! -d "/run/live" ] && dev-uuid

    day=`date +%j`
    day=$(sed 's/^[0]*//g' <<< $day)
    echo $day > /root/.local/share/zeitgeist/day-of-upgrade
    if $second_run; then
	xterm -e $0 &
	sleep 1
    fi

    text="$(gettext "[ End, please press Return! ]")"
else
    text="$(gettext "[ I'm sorry but you are offline, please press Return! ]")" # '
fi

! $second_run && echo "$text" && read

exit 0

