#!/bin/bash
# DISCLAIMER
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
# INITIALIZATION ##############################################################
set -o xtrace
debug=true
updateSystem=false
packages=""
repos=()
taskNames=()
taskMessages=()
taskDescriptions=()
taskRecipes=()
taskPostInstallations=()
taskSelectedList=()
# TASK LIST ###################################################################
#------------------------------------------------------------------------------
taskNames+=("Update system")
taskMessages+=("Updating system")
taskDescriptions+=("Install the latest version of all your software")
taskRecipes+=("updateSystem")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
updateSystem()
{
updateSystem=true
}
#------------------------------------------------------------------------------
taskNames+=("Install automatic drivers")
taskMessages+=("Processing drivers")
taskDescriptions+=("Install drivers that are appropriate for automatic installation")
taskPostInstallations+=("")
taskRecipes+=("autoInstallDrivers")
taskSelectedList+=("FALSE")
autoInstallDrivers()
{
ubuntu-drivers autoinstall
}
#------------------------------------------------------------------------------
taskNames+=("Install Java, Flash and codecs")
taskMessages+=("Processing Java, Flash and codecs")
taskDescriptions+=("Install non-open-source packages like Java, Flash plugin, Unrar, and some audio and video codecs like MP3/AVI/MPEG")
taskRecipes+=("installRestrictedExtras")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installRestrictedExtras()
{
addPackage "ubuntu-restricted-extras"
}
#------------------------------------------------------------------------------
taskNames+=("Install Chrome")
taskMessages+=("Processing Chrome")
taskDescriptions+=("The web browser from Google")
taskRecipes+=("installChrome")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installChrome()
{
if [[ $OSarch == "x86_64" ]]; then
installPackage "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"
else
>&2 echo "Your system is not supported by Google Chrome"
return 1
fi
}
#------------------------------------------------------------------------------
taskNames+=("Install Chromium")
taskMessages+=("Processing Chromium")
taskDescriptions+=("The open-source web browser providing the code for Google Chrome.")
taskRecipes+=("installChromium")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installChromium()
{
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections
addPackage "chromium-browser"
}
#------------------------------------------------------------------------------
taskNames+=("Install Firefox")
taskMessages+=("Processing Firefox")
taskDescriptions+=("The web browser from Mozilla")
taskRecipes+=("installFirefox")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installFirefox()
{
addRepo "ppa:ubuntu-mozilla-security/ppa"
addPackage "firefox firefox-locale-$(locale | grep LANGUAGE | cut -d= -f2 | cut -d_ -f1)"
}
#------------------------------------------------------------------------------
taskNames+=("Install Opera")
taskMessages+=("Processing Opera")
taskDescriptions+=("Just another web browser")
taskRecipes+=("installOpera")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installOpera()
{
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections
echo opera-stable opera-stable/add-deb-source boolean true | debconf-set-selections
if [[ $OSarch == "x86_64" ]]; then
wget -O /tmp/opera.deb "https://download1.operacdn.com/pub/opera/desktop/52.0.2871.40/linux/opera-stable_52.0.2871.40_amd64.deb"
else
wget -O /tmp/opera.deb "https://download1.operacdn.com/pub/opera/desktop/52.0.2871.40/linux/opera-stable_52.0.2871.40_i386.deb"
fi
DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/opera.deb # Needs dpkg and variable set to avoid prompt
rm /tmp/opera.deb
}
#------------------------------------------------------------------------------
taskNames+=("Install Transmission")
taskMessages+=("Processing Transmission")
taskDescriptions+=("A light bittorrent download client")
taskRecipes+=("installTransmission")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installTransmission()
{
addRepo "ppa:transmissionbt/ppa"
addPackage "transmission-gtk"
}
#------------------------------------------------------------------------------
taskNames+=("Install Dropbox")
taskMessages+=("Processing Dropbox")
taskDescriptions+=("A cloud hosting service to store your files online")
taskRecipes+=("installDropbox")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installDropbox()
{
# Handle elementary OS with wingpanel support
if [[ $OSname == "elementary" ]]; then
installPackage git
apt-get --purge remove -y dropbox*
installPackage python-gpgme
git clone https://github.com/zant95/elementary-dropbox /tmp/elementary-dropbox
bash /tmp/elementary-dropbox/install.sh -y
else
if [[ $OSarch == "x86_64" ]]; then
wget -O /tmp/dropbox.tar.gz "https://www.dropbox.com/download?plat=lnx.x86_64"
else
wget -O /tmp/dropbox.tar.gz "https://www.dropbox.com/download?plat=lnx.x86"
fi
tar -xvzf /tmp/dropbox.tar.gz -C /home/"$SUDO_USER"
/.dropbox-dist/dropboxd
fi
}
#------------------------------------------------------------------------------
taskNames+=("Install VirtualBox")
taskMessages+=("Processing VirtualBox")
taskDescriptions+=("A virtualization software to run other OSes on top of your current OS")
taskRecipes+=("installVirtualBox")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installVirtualBox()
{
addPackage "virtualbox"
}
#------------------------------------------------------------------------------
taskNames+=("Install Skype")
taskMessages+=("Processing Skype")
taskDescriptions+=("A videocall software from Microsoft")
taskRecipes+=("installSkype")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installSkype()
{
installPackage "https://go.skype.com/skypeforlinux-64.deb"
}
#------------------------------------------------------------------------------
taskNames+=("Install Thunderbird")
taskMessages+=("Processing Thunderbird")
taskDescriptions+=("A mail client from Mozilla")
taskRecipes+=("installThunderbird")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installThunderbird()
{
addPackage "thunderbird"
}
#------------------------------------------------------------------------------
taskNames+=("Install Telegram")
taskMessages+=("Processing Telegram")
taskDescriptions+=("A chat client, similar to Whatsapp, Viber, Facebook Messenger or Google Hangouts")
taskRecipes+=("installTelegram")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installTelegram()
{
if [[ $OSarch == "x86_64" ]]; then
wget -O - https://telegram.org/dl/desktop/linux > /tmp/telegram.tar.xz
else
wget -O - https://telegram.org/dl/desktop/linux32 > /tmp/telegram.tar.xz
fi
tar -xf /tmp/telegram.tar.xz -C /opt
chmod +x /opt/Telegram/Telegram
chown -R "$SUDO_USER:$SUDO_USER" /opt/Telegram/
wget -q -o /opt/Telegram/icon.png https://desktop.telegram.org/img/td_logo.png
desktopFile="/home/$SUDO_USER/.local/share/applications/telegram.desktop"
echo "[Desktop Entry]" > "$desktopFile"
echo "Name=Telegram" >> "$desktopFile"
echo "GenericName=Chat" >> "$desktopFile"
echo "Comment=Chat with yours friends" >> "$desktopFile"
echo "Exec=/opt/Telegram/Telegram" >> "$desktopFile"
echo "Terminal=false" >> "$desktopFile"
echo "Type=Application" >> "$desktopFile"
echo "Icon=/opt/Telegram/icon.png" >> "$desktopFile"
echo "Categories=Network;Chat;" >> "$desktopFile"
echo "StartupNotify=false" >> "$desktopFile"
}
#------------------------------------------------------------------------------
taskNames+=("Install Slack")
taskMessages+=("Processing Slack")
taskDescriptions+=("A team communication application")
taskRecipes+=("installSlack")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installSlack()
{
installPackage "https://downloads.slack-edge.com/linux_releases/slack-desktop-2.3.3-amd64.deb"
}
#------------------------------------------------------------------------------
taskNames+=("Install VLC")
taskMessages+=("Processing VLC")
taskDescriptions+=("The most famous multimedia player")
taskRecipes+=("installVLC")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installVLC()
{
addRepo "ppa:videolan/stable-daily"
addPackage "vlc"
}
#------------------------------------------------------------------------------
taskNames+=("Install Kazam")
taskMessages+=("Processing Kazam")
taskDescriptions+=("A tool to record your screen and take screenshots")
taskRecipes+=("installKazam")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installKazam()
{
addPackage "kazam"
}
#------------------------------------------------------------------------------
taskNames+=("Install Handbrake")
taskMessages+=("Processing Handbrake")
taskDescriptions+=("A video transcoder")
taskRecipes+=("installHandbrake")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installHandbrake()
{
addRepo "ppa:stebbins/handbrake-releases"
addPackage "handbrake-gtk handbrake-cli"
}
#------------------------------------------------------------------------------
taskNames+=("Install Spotify")
taskMessages+=("Processing Spotify...")
taskDescriptions+=("One of the best music streaming apps")
taskRecipes+=("installSpotify")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installSpotify()
{
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0DF731E45CE24F27EEEB1450EFDC8610341D9410
if [[ ! -f /etc/apt/sources.list.d/spotify.list ]]; then
echo deb http://repository.spotify.com stable non-free | tee /etc/apt/sources.list.d/spotify.list
fi
addPackage "spotify-client"
}
#------------------------------------------------------------------------------
taskNames+=("Install Audacity")
taskMessages+=("Processing Audacity")
taskDescriptions+=("Record and edit audio files")
taskRecipes+=("installAudacity")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installAudacity()
{
addPackage "audacity"
}
#------------------------------------------------------------------------------
taskNames+=("Install Soundconverter")
taskMessages+=("Processing Soundconverter")
taskDescriptions+=("Audio file converter")
taskRecipes+=("installSoundconverter")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installSoundconverter()
{
addPackage "soundconverter"
}
#------------------------------------------------------------------------------
taskNames+=("Install Mixxx")
taskMessages+=("Processing Mixxx")
taskDescriptions+=("A MP3 DJ mixing software")
taskRecipes+=("installMixxx")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installMixxx()
{
addRepo "ppa:mixxx/mixxx"
addPackage "mixxx"
}
#------------------------------------------------------------------------------
taskNames+=("Install LMMS")
taskMessages+=("Processing LMMS")
taskDescriptions+=("Music production for everyone: loops, synthesizers, mixer...")
taskRecipes+=("installLMMS")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installLMMS()
{
addPackage "lmms"
}
#------------------------------------------------------------------------------
taskNames+=("Install Gimp")
taskMessages+=("Processing Gimp")
taskDescriptions+=("Gimp is an image editor")
taskRecipes+=("installGimp")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installGimp()
{
addPackage "gimp"
}
#------------------------------------------------------------------------------
taskNames+=("Install Inkscape")
taskMessages+=("Processing Inkscape")
taskDescriptions+=("Create and edit scalable vectorial images")
taskRecipes+=("installInkscape")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installInkscape()
{
addPackage "inkscape"
}
#------------------------------------------------------------------------------
taskNames+=("Install Blender")
taskMessages+=("Processing Blender")
taskDescriptions+=("3D modelling, animation, rendering and production")
taskRecipes+=("installBlender")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installBlender()
{
addRepo "ppa:thomas-schiex/blender"
addPackage "blender"
}
#------------------------------------------------------------------------------
taskNames+=("Install Freecad")
taskMessages+=("Processing Freecad")
taskDescriptions+=("An open-source parametric 3D modeler")
taskRecipes+=("installFreecad")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installFreecad()
{
addRepo "ppa:freecad-maintainers/freecad-stable"
addPackage "freecad"
}
#------------------------------------------------------------------------------
taskNames+=("Install LeoCad")
taskMessages+=("Processing LeoCad")
taskDescriptions+=("Virtual LEGO CAD software")
taskRecipes+=("installLeoCad")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installLeoCad()
{
installPackage "unzip"
wget -q -O /tmp/ldraw.zip http://www.ldraw.org/library/updates/complete.zip
unzip /tmp/ldraw.zip -d /home/"$SUDO_USER"
addPackage "leocad"
}
#------------------------------------------------------------------------------
taskNames+=("Install LibreOffice suite")
taskMessages+=("Processing LibreOffice")
taskDescriptions+=("A complete office suite: word processor, spreadsheets, slideshows, diagrams, drawings, databases and equations")
taskRecipes+=("installLibreOffice")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installLibreOffice()
{
addPackage "libreoffice libreoffice-l10n-$lang"
}
#------------------------------------------------------------------------------
taskNames+=("Install LibreOffice Writer")
taskMessages+=("Processing LibreOffice Writer")
taskDescriptions+=("Install just the LibreOffice word processor")
taskRecipes+=("installLibreOfficeWriter")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installLibreOfficeWriter()
{
addPackage "libreoffice-writer libreoffice-l10n-$lang"
}
#------------------------------------------------------------------------------
taskNames+=("Install LibreOffice Impress")
taskMessages+=("Processing LibreOffice Impress")
taskDescriptions+=("Install just the LibreOffice slide show editor")
taskRecipes+=("installLibreOfficeImpress")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installLibreOfficeImpress()
{
addPackage "libreoffice-impress libreoffice-l10n-$lang"
}
#------------------------------------------------------------------------------
taskNames+=("Install LibreOffice Spreadsheet")
taskMessages+=("Processing LibreOffice Spreadsheet")
taskDescriptions+=("Install just the LibreOffice spreadsheet editor")
taskRecipes+=("installLibreOfficeSpreadsheet")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installLibreOfficeSpreadsheet()
{
addPackage "libreoffice-calc libreoffice-l10n-$lang"
}
#------------------------------------------------------------------------------
taskNames+=("Install LibreOffice Draw")
taskMessages+=("Processing LibreOffice Draw")
taskDescriptions+=("Install just the LibreOffice drawing editor")
taskRecipes+=("installLibreOfficeDraw")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installLibreOfficeDraw()
{
addPackage "libreoffice-draw libreoffice-l10n-$lang"
}
#------------------------------------------------------------------------------
taskNames+=("Install LibreOffice Base")
taskMessages+=("Processing LibreOffice Base")
taskDescriptions+=("Install just the LibreOffice database manager")
taskRecipes+=("installLibreOfficeBase")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installLibreOfficeBase()
{
addPackage "libreoffice-base libreoffice-l10n-$lang"
}
#------------------------------------------------------------------------------
taskNames+=("Install LibreOffice Math")
taskMessages+=("Processing LibreOffice Math")
taskDescriptions+=("Install just the LibreOffice equation editor")
taskRecipes+=("installLibreOfficeMath")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installLibreOfficeMath()
{
addPackage "libreoffice-math libreoffice-l10n-$lang"
}
#------------------------------------------------------------------------------
taskNames+=("Install Evince")
taskMessages+=("Processing Evince")
taskDescriptions+=("A document viewer with support for PDF, Postscript, djvu, tiff, dvi, XPS and SyncTex")
taskRecipes+=("installEvince")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installEvince()
{
addPackage "evince"
}
#------------------------------------------------------------------------------
taskNames+=("Install Master PDF Editor")
taskMessages+=("Processing Master PDF Editor")
taskDescriptions+=("A convenient and smart PDF editor for Linux")
taskRecipes+=("installMasterPDF")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installMasterPDF()
{
if [[ $OSarch == "x86_64" ]]; then
installPackage "http://get.code-industry.net/public/master-pdf-editor-3.7.10_amd64.deb"
else
installPackage "http://get.code-industry.net/public/master-pdf-editor-3.7.10_i386.deb"
fi
}
#------------------------------------------------------------------------------
taskNames+=("Install Jabref")
taskMessages+=("Processing Jabref")
taskDescriptions+=("A graphical editor for bibtex libraries")
taskRecipes+=("installJabref")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installJabref()
{
addPackage "jabref"
}
#------------------------------------------------------------------------------
taskNames+=("Install TexMaker")
taskMessages+=("Processing TexMaker")
taskDescriptions+=("A LateX development environment")
taskRecipes+=("installTexMaker")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installTexMaker()
{
addPackage "texmaker"
}
#------------------------------------------------------------------------------
taskNames+=("Install DiffPdf")
taskMessages+=("Processing DiffPdf")
taskDescriptions+=("Tool to compare PDF files")
taskRecipes+=("installDiffPdf")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installDiffPdf()
{
addPackage "diffpdf"
}
#------------------------------------------------------------------------------
taskNames+=("Install Steam")
taskMessages+=("Processing Steam")
taskDescriptions+=("A game digital distribution platform developed by Valve")
taskRecipes+=("installSteam")
taskPostInstallations+=("postSteam")
taskSelectedList+=("FALSE")
installSteam()
{
addRepo "multiverse"
addPackage "steam"
}
postSteam()
{
cd "$HOME"/.steam/ubuntu12_32/steam-runtime/i386/usr/lib/i386-linux-gnu
mv libstdc++.so.6 libstdc++.so.6.bak
cd "$HOME"/.steam/ubuntu12_32/steam-runtime/amd64/usr/lib/x86_64-linux-gnu
mv libstdc++.so.6 libstdc++.so.6.bak
}
#------------------------------------------------------------------------------
taskNames+=("Install 0 A.D.")
taskMessages+=("Processing 0 A.D.")
taskDescriptions+=("0 A.D. is a game of ancient warfare, similar to Age of Empires")
taskRecipes+=("install0AD")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
install0AD()
{
addPackage "0ad"
}
#------------------------------------------------------------------------------
taskNames+=("Install Wine")
taskMessages+=("Processing Wine")
taskDescriptions+=("A tool to install Windows software on Linux")
taskRecipes+=("installWine")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installWine()
{
if [[ $OSarch == "x86_64" ]]; then
dpkg --add-architecture i386
fi
wget -q -nc -O /tmp/Release.key https://dl.winehq.org/wine-builds/Release.key
apt-key add /tmp/Release.key
installRepo "https://dl.winehq.org/wine-builds/ubuntu/"
apt-get update
apt-get install --install-recommends winehq-stable
}
#------------------------------------------------------------------------------
taskNames+=("Install PlayOnLinux")
taskMessages+=("Processing PlayOnLinux")
taskDescriptions+=("A tool to install Windows games on Linux")
taskRecipes+=("installPlayOnLinux")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installPlayOnLinux()
{
addPackage "playonlinux"
}
#------------------------------------------------------------------------------
taskNames+=("Install Disk utility")
taskMessages+=("Processing Disk utility")
taskDescriptions+=("A tool to manage your drives")
taskRecipes+=("installDiskUtility")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installDiskUtility()
{
addPackage "gnome-disk-utility"
}
#------------------------------------------------------------------------------
taskNames+=("Install GParted")
taskMessages+=("Processing GParted")
taskDescriptions+=("A tool to make partitions in your hard drives")
taskRecipes+=("installGParted")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installGParted()
{
addPackage "gparted"
}
#------------------------------------------------------------------------------
taskNames+=("Install MenuLibre")
taskMessages+=("Processing MenuLibre")
taskDescriptions+=("Add or remove applications from your menu")
taskRecipes+=("installMenuLibre")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installMenuLibre()
{
addPackage "menulibre"
}
#------------------------------------------------------------------------------
taskNames+=("Install Seahorse")
taskMessages+=("Processing Seahorse")
taskDescriptions+=("Manage your passwords")
taskRecipes+=("installSeahorse")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installSeahorse()
{
addPackage "seahorse"
}
#------------------------------------------------------------------------------
taskNames+=("Install Duplicity")
taskMessages+=("Processing Duplicity")
taskDescriptions+=("Keep your files safe by making automatic backups")
taskRecipes+=("installDuplicity")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installDuplicity()
{
addPackage "duplicity"
}
#------------------------------------------------------------------------------
taskNames+=("Install UNetbootin")
taskMessages+=("Processing UNetbootin")
taskDescriptions+=("Tool for creating Live USB drives")
taskRecipes+=("installUNetbootin")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installUNetbootin()
{
addPackage "unetbootin"
}
#------------------------------------------------------------------------------
taskNames+=("Install EncFS")
taskMessages+=("Processing EncFS")
taskDescriptions+=("Create and manage encrypted folders to keep your files safe")
taskRecipes+=("installEncFS")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installEncFS()
{
addRepo "ppa:gencfsm"
addPackage "gnome-encfs-manager"
}
#------------------------------------------------------------------------------
taskNames+=("Install FileZilla")
taskMessages+=("Processing FileZilla")
taskDescriptions+=("Download and upload files via FTP, FTPS and SFTP")
taskRecipes+=("installFileZilla")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installFileZilla()
{
addPackage "filezilla"
}
#------------------------------------------------------------------------------
taskNames+=("Install utilities bundle")
taskMessages+=("Processing utilities bundle")
taskDescriptions+=("Java, zip, rar and exfat tools")
taskRecipes+=("installUtilities")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installUtilities()
{
addPackage "icedtea-8-plugin openjdk-8-jre p7zip rar exfat-fuse exfat-utils"
}
#------------------------------------------------------------------------------
taskNames+=("Install Glipper")
taskMessages+=("Processing Glipper")
taskDescriptions+=("Gnome clipboard manager")
taskRecipes+=("installGlipper")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installGlipper()
{
addPackage "glipper"
}
#------------------------------------------------------------------------------
taskNames+=("Install developer bundle")
taskMessages+=("Processing developer bundle")
taskDescriptions+=("Tools for developers: build-essential, cmake, git, svn, java, python, octave, autotools...")
taskRecipes+=("installDevBundle")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installDevBundle()
{
addPackage "build-essential cmake cmake-gui cmake-curses-gui python python3 octave gfortran git git-svn subversion kdiff3 colordiff openjdk-8-jdk autoconf autotools-dev cppcheck"
}
#------------------------------------------------------------------------------
taskNames+=("Install Boost libraries")
taskMessages+=("Processing Boost")
taskDescriptions+=("Boost C++ libraries")
taskRecipes+=("installBoost")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installBoost()
{
addPackage "libboost-dev libboost-serialization-dev libboost-filesystem-dev liboost-dev libboost-system-dev"
}
#------------------------------------------------------------------------------
taskNames+=("Install CodeLite")
taskMessages+=("Processing CodeLite")
taskDescriptions+=("A C/C++, PHP and JavaScript IDE for developers")
taskRecipes+=("installCodeLite")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installCodeLite()
{
apt-key adv --fetch-keys https://repos.codelite.org/CodeLite.asc
addRepo "deb http://repos.codelite.org/ubuntu/ $OSbaseCodeName universe"
addPackage "codelite wxcrafter"
}
#------------------------------------------------------------------------------
taskNames+=("Install Visual Studio Code")
taskMessages+=("Processing Visual Studio Code")
taskDescriptions+=("A source code editor developed by Microsoft")
taskRecipes+=("installVSCode")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installVSCode()
{
if [[ $OSarch == "x86_64" ]]; then
installPackage "https://az764295.vo.msecnd.net/stable/79b44aa704ce542d8ca4a3cc44cfca566e7720f1/code_1.21.1-1521038896_amd64.deb"
else
installPackage "https://az764295.vo.msecnd.net/stable/79b44aa704ce542d8ca4a3cc44cfca566e7720f1/code_1.21.1-1521038898_i386.deb"
fi
}
#------------------------------------------------------------------------------
taskNames+=("Install Atom")
taskMessages+=("Processing Atom")
taskDescriptions+=("A hackable text editor")
taskRecipes+=("installAtom")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installAtom()
{
addRepo "ppa:webupd8team/atom"
addPackage "atom"
}
#------------------------------------------------------------------------------
taskNames+=("Install Arduino")
taskMessages+=("Processing Arduino")
taskDescriptions+=("The official IDE for the Arduino board")
taskRecipes+=("installArduino")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installArduino()
{
if [[ $OSarch == "x86_64" ]]; then
wget -q -O /tmp/arduino.tar.xz https://downloads.arduino.cc/arduino-1.8.5-linux64.tar.xz
else
wget -q -O /tmp/arduino.tar.xz https://downloads.arduino.cc/arduino-1.8.5-linux32.tar.xz
fi
tar xf /tmp/arduino.tar.xz -C /tmp
mv /tmp/arduino-1.6.13/ /opt/arduino
/opt/arduino/install.sh
}
#------------------------------------------------------------------------------
taskNames+=("Install GitKraken")
taskMessages+=("Processing GitKraken")
taskDescriptions+=("A graphical git client from Axosoft")
taskRecipes+=("installGitKraken")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installGitKraken()
{
if [[ $OSarch == "x86_64" ]]; then
installPackage "https://release.gitkraken.com/linux/gitkraken-amd64.deb"
else
>&2 echo "Your system is not supported by Gitkraken"
return 1
fi
}
#------------------------------------------------------------------------------
taskNames+=("Install SmartGit")
taskMessages+=("Processing SmartGit")
taskDescriptions+=("A graphical git client from Syntevo")
taskRecipes+=("installSmartGit")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installSmartGit()
{
installPackage "https://www.syntevo.com/downloads/smartgit/smartgit-17_1_6.deb"
}
#------------------------------------------------------------------------------
taskNames+=("Install SysAdmin bundle")
taskMessages+=("Processing SysAdmin bundle")
taskDescriptions+=("Tools for sysadmins: tmux, cron, screen, ncdu, htop, aptitude, apache, etckeeper, xpra and dconf-editor")
taskRecipes+=("installSysAdminBundle")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installSysAdminBundle()
{
addPackage "tmux cron screen ncdu htop aptitude apache2 etckeeper xpra dconf-editor exfat-fuse exfat-utils"
}
#------------------------------------------------------------------------------
taskNames+=("Install Exodus")
taskMessages+=("Processing Exodus")
taskDescriptions+=("A blockchain wallet")
taskRecipes+=("installExodus")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installExodus()
{
wget -q -O /tmp/Exodus.zip https://exodusbin.azureedge.net/releases/exodus-linux-x64-1.48.0.zip
installPackage "unzip"
unzip /tmp/Exodus.zip -d /opt/Exodus/
chown -R "$SUDO_USER":"$SUDO_USER" /opt/Exodus/
#FIXME: install desktop file
}
#------------------------------------------------------------------------------
taskNames+=("Install Delta")
taskMessages+=("Processing Delta")
taskDescriptions+=("A cryptocurrency portfolio tracker")
taskRecipes+=("installDelta")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installDelta()
{
wget -q -O /home/"$SUDO_USER"/Delta.AppImage https://static-assets.getdelta.io/desktop_app/Delta-0.9.2-x86_64.AppImage
chmod +x /home/"$SUDO_USER"/Delta.AppImage
#FIXME: message the user to execute it
#bash --rcfile <(echo '. ~/.bashrc; some_command')
}
#------------------------------------------------------------------------------
taskNames+=("Install rEFInd")
taskMessages+=("Processing rEFInd")
taskDescriptions+=("An EFI boot manager")
taskRecipes+=("installrEFInd")
taskPostInstallations+=("postrEFInd")
taskSelectedList+=("FALSE")
installrEFInd()
{
addRepo "ppa:rodsmith/refind"
addPackage "refind"
}
postrEFInd()
{
refind-install --shim /boot/efi/EFI/ubuntu/shimx64.efi --localkeys
refind-mkdefault
}
#------------------------------------------------------------------------------
taskNames+=("Install Discord")
taskMessages+=("Processing Discord")
taskDescriptions+=("Gaming voice/chat service")
taskRecipes+=("installDiscord")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installDiscord()
{
if [[ $OSarch == "x86_64" ]]; then
installPackage "https://dl.discordapp.net/apps/linux/0.0.4/discord-0.0.4.deb"
else
>&2 echo "Your system is not supported by Gitkraken"
return 1
fi
}
#------------------------------------------------------------------------------
taskNames+=("Install Tux Guitar")
taskMessages+=("Processing Tux Guitar")
taskDescriptions+=("A tablature editor")
taskRecipes+=("installTuxGuitar")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installTuxGuitar()
{
addPackage "tuxguitar tuxguitar-alsa tuxguitar-jsa tuxguitar-oss"
}
#------------------------------------------------------------------------------
taskNames+=("Install Ukuu")
taskMessages+=("Processing Ukuu")
taskDescriptions+=("A kernel update tool")
taskRecipes+=("installUkuu")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installUkuu()
{
addRepo "ppa:teejee2008/ppa"
addPackage "ukuu"
}
#------------------------------------------------------------------------------
taskNames+=("Install Gnome System Monitor")
taskMessages+=("Processing Gnome System Monitor")
taskDescriptions+=("A system resource usage monitor")
taskRecipes+=("installSystemMonitor")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installSystemMonitor()
{
addPackage "gnome-system-monitor"
}
#------------------------------------------------------------------------------
taskNames+=("Install ANoise")
taskMessages+=("Processing ANoise")
taskDescriptions+=("An ambient music player")
taskRecipes+=("installANoise")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installANoise()
{
addRepo "ppa:costales/anoise"
addPackage "anoise"
}
#------------------------------------------------------------------------------
taskNames+=("Install Minetest")
taskMessages+=("Processing Minetest")
taskDescriptions+=("A Minecraft clone")
taskRecipes+=("installMinetest")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installMinetest()
{
addRepo "ppa:minetestdevs/stable"
addPackage "minetest"
}
#------------------------------------------------------------------------------
taskNames+=("Install Typora")
taskMessages+=("Processing Typora")
taskDescriptions+=("A minimalist text editor")
taskRecipes+=("installTypora")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installTypora()
{
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE
addRepo "deb http://typora.io linux/"
addPackage "typora"
}
#------------------------------------------------------------------------------
taskNames+=("Install Kdenlive")
taskMessages+=("Processing Kdenlive")
taskDescriptions+=("A video editing suite")
taskRecipes+=("installKdenlive")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installKdenlive()
{
addPackage "kdenlive"
}
#------------------------------------------------------------------------------
taskNames+=("Install Openshot")
taskMessages+=("Processing Openshot")
taskDescriptions+=("A video editor")
taskRecipes+=("installOpenshot")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installOpenshot()
{
addRepo "ppa:openshot.developers/ppa"
addPackage "openshot-qt"
}
#------------------------------------------------------------------------------
taskNames+=("Install Retroarch")
taskMessages+=("Processing Retroarch")
taskDescriptions+=("A retro games emulator frontend")
taskRecipes+=("installRetroarch")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installRetroarch()
{
addRepo "ppa:libretro/stable"
addPackage "retroarch"
}
#------------------------------------------------------------------------------
taskNames+=("Install Ulauncher")
taskMessages+=("Processing Ulauncher")
taskDescriptions+=("Application launcher for Linux")
taskRecipes+=("installUlauncher")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installUlauncher()
{
addRepo "ppa:agornostal/ulauncher"
addPackage "ulauncher"
}
#------------------------------------------------------------------------------
taskNames+=("Install Jumpapp")
taskMessages+=("Processing Jumpapp")
taskDescriptions+=("Application switcher for Linux")
taskRecipes+=("installJumpapp")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installJumpapp()
{
addRepo "ppa:mkropat/ppa"
addPackage "jumpapp"
}
#------------------------------------------------------------------------------
taskNames+=("Install Wireshark")
taskMessages+=("Processing Wireshark")
taskDescriptions+=("A network traffic analyzer")
taskRecipes+=("installWireshark")
taskPostInstallations+=("")
taskSelectedList+=("FALSE")
installWireshark()
{
echo "wireshark-common wireshark-common/install-setuid boolean true" | debconf-set-selections
DEBIAN_FRONTEND=noninteractive
addPackage "wireshark"
}
#------------------------------------------------------------------------------
# INSTRUCTIONS
# To add a new task, add a new section above this block copying and pasting the following 5 lines:
# taskNames+=("")
# taskMessages+=("")
# taskDescriptions+=("")
# taskRecipes+=("")
# taskPostInstallations+=("")
# taskSelectedList+=("Task boolean value")
# Then, uncomment them and:
# Replace with the new task's name.
# Replace with the message that will be displayed while.
# performing the task, i.e. "Upgrading the system" .
# Replace with the new task's description.
# Replace with the function name which will contain
# the necessary commands to perform the task and write that function. Do NOT use sudo in it.
# Replace with the function name which will contain
# the necessary commands to execute after installation and write that function. Do NOT use sudo in it.
# If you don't need anything to be run after installatio, just leave the function blank
# or use taskPostInstallations+=("")
# Replace with TRUE of FALSE to make this task to be marked by default.
#------------------------------------------------------------------------------
# END OF TASK LIST ############################################################
#------------------------------------------------------------------------------
# Main function
function main()
{
# Check that the recipe arrays are well formed
if [[ ${#taskNames[@]} -ne ${#taskMessages[@]} ]] ||
[[ ${#taskMessages[@]} -ne ${#taskDescriptions[@]} ]] ||
[[ ${#taskDescriptions[@]} -ne ${#taskRecipes[@]} ]] ||
[[ ${#taskRecipes[@]} -ne ${#taskPostInstallations[@]} ]] ||
[[ ${#taskPostInstallations[@]} -ne ${#taskSelectedList[@]} ]] ; then
if ! checkPackage zenity; then
echo "There is an error in the some recipe. Array lengths do not match. Please check your recipes."
else
zenity --error --title="Alfred" --text="There is an error in the some recipe. Array lengths do not match. Please check your recipes."
fi
exit 1
fi
# Test that this is Ubuntu or an Ubuntu derivative
grep -Fxq "ID_LIKE=ubuntu" /etc/os-release
if [[ $? -ne 0 ]]; then
if ! $(checkPackage zenity); then
echo "This is not an Ubuntu or Ubuntu derivative distro. You can't run Alfred in this system."
else
zenity --error --title="Alfred" --text="This is not an Ubuntu or Ubuntu derivative distro. You can't run Alfred in this system."
fi
exit 1
fi
# Get system info
OSarch=$(uname -m)
OSname=$(lsb_release -si)
#OSversion=$(lsb_release -sr)
#OScodeName=$(lsb_release -sc)
OSbaseCodeName=$(lsb_release -scu)
lang=$(locale | grep LANGUAGE | cut -d= -f2 | cut -d_ -f1)
# Test /var/lib/dpkg/lock to ensure we can install packages
lock=$(fuser /var/lib/dpkg/lock)
if [ ! -z "$lock" ]; then
if ! $(checkPackage zenity); then
echo "Another program is installing or updating packages. Please wait until this process finishes and then launch Alfred again."
else
zenity --error --title="Alfred" --text="Another program is installing or updating packages. Please wait until this process finishes and then launch Alfred again."
fi
exit 0
fi
# Repair installation interruptions
dpkg --configure -a
# Get list of already added repos
installedRepos=()
getRepoList
# Check if Zenity package is installed
if ! $(checkPackage zenity); then
installPackage "zenity"
fi
# Test connectivity
if ! ping -c 1 google.com >> /dev/null 2>&1; then
zenity --error --title="Alfred" --text="There is no connection to the Internet. Please connect and then launch Alfred again."
exit 0
fi
# Create selection GUI with Zenity
while true; do
# Build task table for Zenity
taskTable=()
for (( i=0; i<${#taskNames[@]}; i++ )); do
taskTable+=("${taskSelectedList[$i]}" "${taskNames[$i]}" "${taskDescriptions[$i]}")
done
tasks=$(zenity --list --checklist \
--height 720 \
--width 1280 \
--title="Alfred" \
--text "Select tasks to perform:" \
--column=Selection \
--column=Task \
--column=Description \
"${taskTable[@]}" \
--separator=', '
)
# Check for closed window / cancel button
if [[ $? == 1 ]]; then
exit 0
fi
# Check zero tasks selected
if [[ -z "$tasks" ]]; then
zenity --info --title="Alfred" --text "No tasks were selected"
continue
fi
# Save selected tasks
for i in "${!taskNames[@]}"; do
if [[ $tasks == *"${taskNames[i]}"* ]]; then
taskSelectedList[$i]="TRUE"
else
taskSelectedList[$i]="FALSE"
fi
done
# Warning message and confirmation
message="The selected tasks will be performed now. "
message+="You won't be able to cancel this operation once started.\n"
message+="Are you sure you want to continue?"
if zenity --question --title="Alfred" --text "$message"; then
break
fi
done
# Write error log file header
debugLog="/tmp/Alfred-dbg.log"
errorLog="/tmp/Alfred-errors.log"
logHeader="==================================================================================================\n"
logHeader="${logHeader}NEW SESSION $(date)\n"
logHeader="$logHeader$(lsb_release -d | cut -d: -f2 | sed "s/^[ \t]*//")\n"
logHeader="$logHeader$(uname -a)\n"
echo -e "$logHeader" >> $errorLog
if $debug; then
echo -e "$logHeader" >> $debugLog
fi
chown "$SUDO_USER":"$SUDO_USER" $errorLog
chown "$SUDO_USER":"$SUDO_USER" $debugLog
# Perform all tasks
(
errors=false
for i in "${!taskNames[@]}"; do
if [[ $tasks == *"${taskNames[i]}"* ]]; then
echo -e "# Processing recipes... [${taskMessages[i]}]"
echo -e "--------------------------------------------------------------------------------------------------\n" >> $errorLog
echo -e "RECIPE ${taskNames[$i]}\n" >> $errorLog
if $debug; then
${taskRecipes[$i]} &>> $debugLog
else
${taskRecipes[$i]} 2>&1
fi
if [[ $? -ne 0 ]]; then
errors=true
fi
fi
done
# Add repos
echo "# Adding repositories..."
if $debug; then
processRepos &>> $debugLog
else
processRepos 2>&1
fi
if [[ $? != 0 ]]; then
errors=true
echo -e "REPO_ERRORS_HAPPENED\n" >> $errorLog
fi
# Install packages
echo "# Installing packages..."
if $debug; then
processPackages &>> $debugLog
else
processPackages 2>&1
fi
if [[ $? != 0 ]]; then
errors=true
echo -e "PACKAGE_ERRORS_HAPPENED\n" >> $errorLog
fi
# Run post-installation tasks
echo "# Running post-installation tasks..."
for i in "${!taskNames[@]}"; do
if [[ $tasks == *"${taskNames[i]}"* ]]; then
if $debug; then
${taskPostInstallations[$i]} &>> $debugLog
else
${taskPostInstallations[$i]} 2>&1
fi
if [[ $? -ne 0 ]]; then
errors=true
fi
fi
done
# End and notify
if $errors ; then
echo -ne "SOME_ERRORS_HAPPENED\n" >> $errorLog
echo "# Some tasks ended with errors"
if $(checkPackage libnotify-bin); then
su "$SUDO_USER" -c 'notify-send -i utilities-terminal Alfred "Some tasks ended with errors"'
fi
else
echo "# All tasks completed succesfully"
if $(checkPackage libnotify-bin); then
su "$SUDO_USER" -c 'notify-send -i utilities-terminal Alfred "All tasks completed succesfully"'
fi
fi
) |
zenity --progress \
--pulsate \
--no-cancel \
--title="Alfred" \
--text="Processing all tasks" \
--percentage=0 \
--height 100 \
--width 500
# Show error list from the error log
errors=false
if [[ $(tail -1 $errorLog) == "SOME_ERRORS_HAPPENED" ]]; then
errors=true
fi
if $errors ; then
errorList=()
# Last occurrence of NEW SESSION
startLine=$(tac $errorLog | grep -n -m1 "NEW SESSION" | cut -d: -f1)
while read line; do
firstword=$(echo "$line" | cut -d' ' -f1)
if [[ "$firstword" == "RECIPE" ]]; then # If line starts with RECIPE
errorList+=("${line/RECIPE /}")
fi
done <<< "$(tail -n "$startLine" "$errorLog")" # Use the error log only from startLine to the end
if [[ ${#errorList[@]} -gt 0 ]]; then
message="The following tasks ended with errors and could not be completed:"
zenity --list --height 500 --width 500 --title="Alfred" \
--text="$message" \
--hide-header --column "Tasks with errors" "${errorList[@]}"
message="Please notify the following error log at https://github.com/derkomai/alfred/issues\n"
message+="-------------------------------------------------------------"
message+="---------------------------------------------------------\n\n"
echo -e "$message$(tail -n "$startLine" "$errorLog")" |
zenity --text-info --height 700 --width 800 --title="Alfred"
fi
fi
}
# End of main function
function packageIsInstalled()
{
LANG=C
apt-cache policy "$1" | grep "Installed: (none)" &> /dev/null
if [[ $? == 0 ]]; then
echo false
else
echo true
fi
}
function packageExists()
{
dpkg -l "$1" &> /dev/null
if [[ $? == 0 ]]; then
echo true
else
echo false
fi
}
function checkPackage()
{
if $(packageExists $1) && $(packageIsInstalled "$1"); then
echo true
else
echo false
fi
}
function addPackage()
{
packages+=" $1"
}
function installPackage()
{
for arg in "$@"; do
if [[ "$arg" == "http"*".deb" ]]; then
wget -q -O /tmp/package.deb "$arg"
apt-get -y install /tmp/package.deb
rm /tmp/package.deb
else
apt-get -y install "$arg"
fi
done
}
function processPackages()
{
if $updateSystem; then
apt-get -y upgrade
fi
# Install only packages that are not installed already
packageList=""
for package in $packages; do
if ! $(checkPackage "$package"); then
packageList+=" $package"
fi
done
apt-get -y install $packageList
apt-get -y autoremove
}
function getRepoList()
{
# Get list of already added repos
readarray installedRepos <<< "$(for APT in $(find /etc/apt/ -name \*.list); do
grep -o "^deb http://ppa.launchpad.net/[a-z0-9\-]\+/[a-z0-9\-]\+" "$APT" | while read ENTRY ; do
USER=$(echo "$ENTRY" | cut -d/ -f4)
PPA=$(echo "$ENTRY" | cut -d/ -f5)
echo "ppa:$USER/$PPA"
done
done)"
}
function checkRepo()
{
for repo in "${installedRepos[@]}"; do
if [[ $repo == "$1" ]]; then
echo true
return 0
fi
done
echo false
}
function addRepo()
{
repos+=($1)
}
function installRepo()
{
if ! $(checkPackage "software-properties-common"); then
installPackage "software-properties-common"
fi
add-apt-repository -y "$1"
}
function processRepos()
{
# Ensure ppa adding capability
if ! $(checkPackage "software-properties-common"); then
installPackage "software-properties-common"
fi
for repo in "${repos[@]}"; do
if ! $(checkRepo "$repo"); then
add-apt-repository -y "$repo"
fi
done
apt-get update
}
function getPassword()
{
sudo -k
while true; do
password=$(zenity --password --title="Alfred")
# Check for closed window / cancel button
if [[ $? == 1 ]]; then
return 1
fi
# Check for correct password
myid=$(echo "$password" | sudo -S id -u)
if [[ $? == 0 ]] && [[ $myid == 0 ]]; then
echo "$password"
return 0
else
zenity --info --title="Alfred" --text="Wrong password, try again"
fi
done
}
# RUN
# Check for root permissions and ask for password in other case
if [[ $(id -u) == 0 ]]; then
main
else
password=$(getPassword)
if [[ $? == 0 ]]; then
echo "$password" | sudo -S "$0"
else
exit 0
fi
fi
exit 0