Skip to content

Instantly share code, notes, and snippets.

@riccardopedrielli
Last active February 7, 2023 12:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save riccardopedrielli/26cdc09f1be72aaf73f8dd3fe60ec2d5 to your computer and use it in GitHub Desktop.
Save riccardopedrielli/26cdc09f1be72aaf73f8dd3fe60ec2d5 to your computer and use it in GitHub Desktop.
Ubuntu workstation setup
#!/usr/bin/env bash
set -Eeu
trap 'STATUS=${?}; echo "${0}: Error on line ${LINENO}: ${BASH_COMMAND}"; exit ${STATUS}' ERR
trap 'rm -rf ${tempDir}' EXIT
readonly supportedUbuntuVersion="22.04"
readonly tempDir="/tmp/setup"
readonly devDir="${HOME}/dev"
readonly scriptsDir="${devDir}/scripts"
readonly binDir="${devDir}/bin"
export DEBIAN_FRONTEND="noninteractive"
export PATH="${PATH}:${scriptsDir}:${binDir}:${devDir}/tools/go/bin:${devDir}/tools/transcrypt:${HOME}/.binenv"
logInfo()
{
echo -e "\e[0;36m${*}\e[0m"
}
logError()
{
echo -e "\e[0;31m${*}\e[0m"
}
logWarning()
{
echo -e "\e[0;33m${*}\e[0m"
}
getLatestGithubVersion()
{
curl -fsSL "https://api.github.com/repos/${1}/releases/latest" | jq -r .tag_name
}
checkUbuntuVersion()
{
local -r currentUbuntuVersion=$(lsb_release -rs)
if [ "${currentUbuntuVersion}" != "${supportedUbuntuVersion}" ]; then
logWarning "This script is supported only on Ubuntu ${supportedUbuntuVersion}"
logWarning "The Ubuntu version currently installed is ${currentUbuntuVersion}"
while true; do
read -rp "Continue anyway? [y/n]: " ANSWER
case ${ANSWER} in
[Yy]* )
break
;;
[Nn]* )
logError "Aborted"
exit 1
;;
* )
echo "Please answer yes or no."
;;
esac
done
fi
}
getSudoPrivileges()
{
logInfo "Get sudo privileges"
sudo -v
}
createTemporaryDirectory()
{
logInfo "Create temporary directory"
mkdir -p ${tempDir}
}
setKernelParameters()
{
logInfo "Set kernel parameters"
sudo tee /etc/sysctl.d/90-custom.conf > /dev/null \
<<- EOT
fs.inotify.max_user_watches=524288
vm.max_map_count=262144
vm.swappiness=5
EOT
sudo sysctl -p /etc/sysctl.d/90-custom.conf
}
configureGrub()
{
logInfo "Configure grub"
sudo tee /etc/default/grub.d/disable-ipv6.cfg > /dev/null \
<<- EOT
GRUB_CMDLINE_LINUX="ipv6.disable=1"
EOT
sudo tee /etc/default/grub.d/timeout.cfg > /dev/null \
<<- EOT
GRUB_TIMEOUT=10
EOT
sudo update-grub
}
disableReports()
{
logInfo "Disable system and error reports"
ubuntu-report -f send no
sudo sed -i \
-e 's/^enabled=1$/enabled=0/' \
/etc/default/apport
sudo systemctl stop apport.service
sudo systemctl disable apport.service
sudo systemctl mask apport.service
}
createDevStructure()
{
logInfo "Create dev structure"
mkdir -p "${devDir}"
mkdir -p "${devDir}/bin"
mkdir -p "${devDir}/data"
mkdir -p "${devDir}/src"
mkdir -p "${devDir}/tools"
}
removeUnwantedPackages()
{
logInfo "Remove unwanted packages"
sudo systemctl disable snapd.service
sudo systemctl disable snapd.socket
sudo systemctl disable snapd.seeded.service
sudo snap remove --purge firefox
sudo snap remove --purge gtk-common-themes
sudo snap remove --purge gnome-3-38-2004
sudo snap remove --purge snap-store
sudo apt autoremove --purge -y snapd
sudo apt autoremove --purge -y gedit
rm -rf "${HOME}/snap"
sudo rm -rf "/root/snap"
sudo rm -rf "/var/cache/snapd"
sudo tee /etc/apt/preferences.d/firefox-no-snap > /dev/null \
<<- EOT
Package: firefox*
Pin: release o=Ubuntu*
Pin-Priority: -1
EOT
sudo tee /etc/apt/preferences.d/no-snap > /dev/null \
<<- EOT
Package: snapd
Pin: release a=*
Pin-Priority: -10
EOT
}
configureApt()
{
logInfo "Configure APT"
sudo sed -i \
-e 's|http://.*\.archive.ubuntu.com|http://archive.ubuntu.com|g' \
-e 's|http://security.ubuntu.com|http://archive.ubuntu.com|g' \
/etc/apt/sources.list
sudo tee /etc/apt/apt.conf.d/10periodic > /dev/null \
<<- EOT
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";
EOT
sudo tee /etc/apt/apt.conf.d/20auto-upgrades > /dev/null \
<<- EOT
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";
EOT
}
updateSystem()
{
logInfo "Update system"
sudo apt update
sudo apt dist-upgrade -y
sudo apt autoremove --purge -y
}
installAptPackages()
{
logInfo "Install APT packages"
echo "virtualbox-ext-pack virtualbox-ext-pack/license select true" | sudo debconf-set-selections
sudo apt install -y \
apt-transport-https \
autokey-gtk \
baobab \
cheese \
chrome-gnome-shell \
cloud-image-utils \
cloud-init \
curl \
dconf-editor \
filezilla \
flatpak \
fonts-firacode \
fwupd-unsigned \
geary \
gimp \
gir1.2-gtop-2.0 \
gnome-connections \
gnome-shell-extension-manager \
gnome-software \
gnome-sushi \
gnome-text-editor \
gnome-tweaks \
golang-docker-credential-helpers \
gradle-completion \
iperf3 \
jq \
libc++1 \
libnvidia-compute-515 \
lm-sensors \
mediainfo \
meld \
neofetch \
net-tools \
nethogs \
openssh-server \
optipng \
pavucontrol \
piper \
pulsemixer \
python3-pip \
python3-venv \
shellcheck \
silversearcher-ag \
simple-scan \
sysbench \
tldr \
tree \
unrar \
vim \
virtualbox \
virtualbox-ext-pack \
xorriso \
xosd-bin \
xsel \
yadm
# Dependencies explanation
# ------------------------
# gir1.2-gtop-2.0 -> TopHat (shell extension)
# libc++1 -> discord
# libnvidia-compute-515 -> celluloid
}
installTranscrypt()
{
logInfo "Install Transcrypt"
local -r transcryptVersion=$(getLatestGithubVersion elasticdog/transcrypt)
local -r toolDir="${devDir}/tools/transcrypt"
mkdir -p "${toolDir}"
curl -fsSL "https://raw.githubusercontent.com/elasticdog/transcrypt/${transcryptVersion}/transcrypt" \
-o "${toolDir}/transcrypt"
chmod +x "${toolDir}/transcrypt"
}
install1Password()
{
logInfo "Install 1Password"
curl -fsSL https://downloads.1password.com/linux/keys/1password.asc | sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/1password.gpg
sudo tee /etc/apt/sources.list.d/1password.list > /dev/null \
<<- EOT
deb [arch=amd64] https://downloads.1password.com/linux/debian/amd64 stable main
EOT
sudo mkdir -p /etc/debsig/policies/AC2D62742012EA22/
curl -fsSL https://downloads.1password.com/linux/debian/debsig/1password.pol | sudo tee /etc/debsig/policies/AC2D62742012EA22/1password.pol
sudo mkdir -p /usr/share/debsig/keyrings/AC2D62742012EA22
curl -fsSL https://downloads.1password.com/linux/keys/1password.asc | sudo gpg --dearmor --output /usr/share/debsig/keyrings/AC2D62742012EA22/debsig.gpg
sudo apt update
sudo apt install -y 1password
}
installDocker()
{
logInfo "Install Docker"
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/docker.gpg
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null \
<<- EOT
deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable
EOT
sudo apt update
sudo apt install -y docker-ce docker-compose-plugin golang-docker-credential-helpers
sudo adduser "${USER}" docker
sudo tee /etc/docker/daemon.json > /dev/null \
<<- EOT
{
"log-driver": "local"
}
EOT
mkdir -p "${HOME}/.docker"
tee "${HOME}/.docker/config.json" > /dev/null \
<<- EOT
{
"auths": {
"https://index.docker.io/v1/": {}
},
"credsStore": "secretservice",
"credHelpers": {
"000000000000.dkr.ecr.eu-west-1.amazonaws.com": "ecr-login"
},
"experimental": "enabled"
}
EOT
}
installGoogleChrome()
{
logInfo "Install Google Chrome"
curl -fsSL "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" -o ${tempDir}/chrome.deb
sudo dpkg -i ${tempDir}/chrome.deb
}
installMySQLWorkbench()
{
logInfo "Install MySQL Workbench"
sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/mysql.gpg \
<<- EOT
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.6
Comment: Hostname: pgp.mit.edu
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
sTSKHe+QnnnoFmu4gnmDU31i
=Xqbo
-----END PGP PUBLIC KEY BLOCK-----
EOT
sudo tee /etc/apt/sources.list.d/mysql.list > /dev/null \
<<- EOT
deb [arch=amd64] https://repo.mysql.com/apt/ubuntu/ $(lsb_release -cs) mysql-8.0
deb [arch=amd64] https://repo.mysql.com/apt/ubuntu/ $(lsb_release -cs) mysql-tools
EOT
sudo apt update
sudo apt dist-upgrade -y
sudo apt install -y mysql-workbench-community
}
installSpotify()
{
logInfo "Install Spotify"
curl -fsSL https://download.spotify.com/debian/pubkey_5E3C45D7B312C643.gpg | sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/spotify.gpg
sudo tee /etc/apt/sources.list.d/spotify.list > /dev/null \
<<- EOT
deb http://repository.spotify.com stable non-free
EOT
sudo apt update
sudo apt install -y spotify-client
}
installVSCode()
{
logInfo "Install Visual Studio Code"
curl -fsSL "https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64" -o ${tempDir}/vscode.deb
sudo dpkg -i ${tempDir}/vscode.deb
}
installAppImageLauncher()
{
logInfo "Install AppImageLauncher"
sudo add-apt-repository -y ppa:appimagelauncher-team/stable
sudo apt update
sudo apt install -y appimagelauncher
tee "${HOME}/.config/appimagelauncher.cfg" > /dev/null \
<<- EOT
[AppImageLauncher]
ask_to_move = true
# destination = ~/Applications
# enable_daemon = true
[appimagelauncherd]
# additional_directories_to_watch = ~/otherApplications:/even/more/applications
# monitor_mounted_filesystems = false
EOT
}
installCelluloid()
{
logInfo "Install Celluloid"
sudo add-apt-repository -y ppa:xuzhen666/gnome-mpv
sudo apt update
sudo apt install -y celluloid
}
installFirefox()
{
logInfo "Install Firefox"
sudo add-apt-repository -y ppa:mozillateam/ppa
sudo apt update
sudo apt install -y firefox
sudo tee /etc/apt/preferences.d/mozillateam-ppa > /dev/null \
<<- EOT
Package: firefox*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 501
EOT
}
installFirefoxDev()
{
logInfo "Install Firefox Developer Edition"
curl -fsSL "https://download.mozilla.org/?product=firefox-devedition-latest-ssl&os=linux64&lang=en-US" \
-o "${tempDir}/firefox-dev.tar.bz2"
tar xjf ${tempDir}/firefox-dev.tar.bz2 -C "${devDir}/tools"
tee "${HOME}/.local/share/applications/firefox-developer-edition.desktop" > /dev/null \
<<- EOT
[Desktop Entry]
Version=1.0
Type=Application
Name=Firefox Developer Edition
Icon=${devDir}/tools/firefox/browser/chrome/icons/default/default128.png
TryExec=${devDir}/tools/firefox/firefox-bin
Exec=${devDir}/tools/firefox/firefox-bin %u
Comment=Firefox Aurora with Developer tools
StartupWMClass=firefox-aurora
GenericName=Web Browser
Keywords=Internet;WWW;Browser;Web;Explorer
Categories=GNOME;GTK;Network;WebBrowser;
MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;x-scheme-handler/chrome;video/webm;application/x-xpinstall;
Actions=new-window;new-private-window;
Terminal=false
X-MultipleArgs=false
StartupNotify=true
[Desktop Action new-window]
Name=Open a New Window
Exec=${devDir}/tools/firefox/firefox-bin -new-window
[Desktop Action new-private-window]
Name=Open a New Private Window
Exec=${devDir}/tools/firefox/firefox-bin -private-window
EOT
}
installGit()
{
logInfo "Install Git"
sudo add-apt-repository -y ppa:git-core/ppa
sudo apt update
sudo apt install -y git
sudo apt install -y libsecret-1-dev
sudo make --directory=/usr/share/doc/git/contrib/credential/libsecret
git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
}
installWakeMeOps()
{
logInfo "Install WakeMeOps"
curl -fsSL https://raw.githubusercontent.com/upciti/wakemeops/main/assets/install_repository | sudo bash
sudo apt update
sudo apt install -y \
bat \
curlie \
datree \
exa \
fd \
ghorg \
glab \
gping \
helm \
hostctl \
hugo \
infracost \
k3d \
krew \
kube-linter \
kubeaudit \
kubectl \
lens \
procs \
telepresence \
terraform \
terraform-docs \
terrascan \
tflint \
yq
}
installBinEnv()
{
logInfo "Install BinEnv"
local -r binenvVersion=$(getLatestGithubVersion devops-works/binenv)
curl -fsSL "https://github.com/devops-works/binenv/releases/download/${binenvVersion}/binenv_linux_amd64" -o ${tempDir}/binenv
chmod +x ${tempDir}/binenv
${tempDir}/binenv update
${tempDir}/binenv install binenv
binenv install broot
binenv install ctop
binenv install driftctl
binenv install duf
binenv install gdu
binenv install gitui
binenv install gocloc
binenv install gokart
binenv install grype
binenv install k6
binenv install kube-beacon
binenv install kube-bench
binenv install kubecolor
binenv install kubent
binenv install kubescape
binenv install kubestr
binenv install lsd
binenv install micro
binenv install sloop
binenv install tfsec
binenv install tlder
binenv install tlsexp
binenv install updatecli
binenv install vagrant
}
installFlatpakPackages()
{
logInfo "Install Flatpak packages"
sudo apt install -y flatpak
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install --or-update -y flathub \
com.belmoussaoui.Obfuscate \
com.getpostman.Postman \
com.github.tchx84.Flatseal \
com.gitlab.newsflash \
com.slack.Slack \
com.todoist.Todoist \
fr.romainvigier.MetadataCleaner \
org.gabmus.whatip \
org.gnome.Firmware \
org.gnome.design.IconLibrary \
org.telegram.desktop \
re.sonny.Commit \
re.sonny.Junction
}
installScripts()
{
logInfo "Install scripts"
if [ -e "${scriptsDir}" ]; then
logWarning "The directory \"${scriptsDir}\" already exists and will not be overwritten"
else
git clone https://github.com/riccardopedrielli/scripts.git "${scriptsDir}"
fi
}
installNVM()
{
logInfo "Install nvm"
local -r nvmVersion=$(getLatestGithubVersion nvm-sh/nvm)
curl -fsSL "https://raw.githubusercontent.com/nvm-sh/nvm/${nvmVersion}/install.sh" | bash
# shellcheck disable=SC1091
source "${HOME}/.nvm/nvm.sh"
nvm install node
install-npm-pkgs
}
installSdkMan()
{
logInfo "Install sdkman"
curl -s "https://get.sdkman.io" | bash
bash -c 'source ~/.sdkman/bin/sdkman-init.sh && sdk install java && sdk install gradle && sdk install micronaut'
}
installDebPackages()
{
logInfo "Install deb packages"
update-local-deb
}
installDevTools()
{
logInfo "Install dev tools"
update-tools
}
installJetBrainsToolbox()
{
logInfo "Install JetBrains Toolbox"
local -r toolboxUrl=$(curl -fsSL 'https://data.services.jetbrains.com/products/releases?code=TBA&latest=true&type=release' | jq -r '.TBA[0].downloads.linux.link')
curl -fsSL "${toolboxUrl}" -o ${tempDir}/jetbrains-toolbox.tar.gz
tar xzf ${tempDir}/jetbrains-toolbox.tar.gz -C ${tempDir}
mv ${tempDir}/jetbrains-toolbox-*/jetbrains-toolbox ${tempDir}
${tempDir}/jetbrains-toolbox
rm -rf ${tempDir}/jetbrains-toolbox*
}
installAwsCli()
{
logInfo "Install aws cli"
update-aws-cli
local -r credHelperVersion=$(curl -fsSL "https://api.github.com/repos/awslabs/amazon-ecr-credential-helper/releases/latest" | jq -r .tag_name | sed 's/v//')
local -r credHelperUrl="https://amazon-ecr-credential-helper-releases.s3.us-east-2.amazonaws.com/${credHelperVersion}/linux-amd64/docker-credential-ecr-login"
curl -fsSL "${credHelperUrl}" -o "${binDir}/docker-credential-ecr-login"
chmod +x "${binDir}/docker-credential-ecr-login"
}
generateBashCompletions()
{
logInfo "Generate bash completions"
update-completion
}
setupBash()
{
logInfo "Set up Bash"
local -r toolDir="${devDir}/tools/bash-git-prompt"
if [ -e "${toolDir}" ]; then
logWarning "The directory \"${toolDir}\" already exists and will not be overwritten"
else
git clone https://github.com/magicmonty/bash-git-prompt.git "${toolDir}"
fi
tee "${HOME}/.bash_aliases" > /dev/null \
<<- EOT
[ -s "\${HOME}/dev/data/bash/custom.sh" ] && source "\${HOME}/dev/data/bash/custom.sh"
EOT
}
setupSensors()
{
logInfo "Set up sensors"
sudo sensors-detect <<< "YES"
}
setupDatetime()
{
logInfo "Set up date & time"
timedatectl set-local-rtc false
timedatectl set-ntp true
local -r gnomeSettings="
[/]
org/gtk/settings/file-chooser/clock-format='24h'
"
dconf load / <<< "${gnomeSettings}"
}
setupBackground()
{
logInfo "Set up background"
local -r backgroundsDir="${HOME}/.local/share/backgrounds"
mkdir -p "${backgroundsDir}"
curl -fsSL https://i.imgur.com/PkHGuw2.jpg -o "${backgroundsDir}/background.jpg"
local -r gnomeSettings="
[/]
org/gnome/desktop/background/picture-uri-dark='file://${backgroundsDir}/background.jpg'
org/gnome/desktop/background/picture-uri='file://${backgroundsDir}/background.jpg'
org/gnome/desktop/background/primary-color='#000000'
org/gnome/desktop/background/secondary-color='#000000'
"
dconf load / <<< "${gnomeSettings}"
}
updateGnomeSettings()
{
logInfo "Update Gnome settings"
local -r gnomeSettings="
[/]
ca/desrt/dconf-editor/show-warning=false
org/gnome/Characters/recent-characters=['È', 'è', 'à', 'ì', 'ò', 'ù', '€', '°', ' ']
org/gnome/TextEditor/highlight-current-line=true
org/gnome/TextEditor/indent-style='space'
org/gnome/TextEditor/restore-session=false
org/gnome/TextEditor/right-margin-position=uint32 120
org/gnome/TextEditor/show-line-numbers=true
org/gnome/TextEditor/show-map=true
org/gnome/TextEditor/spellcheck=false
org/gnome/TextEditor/style-scheme='Adwaita-dark'
org/gnome/TextEditor/tab-width=uint32 4
org/gnome/TextEditor/wrap-text=false
org/gnome/desktop/calendar/show-weekdate=true
org/gnome/desktop/input-sources/xkb-options=['compose:menu']
org/gnome/desktop/interface/clock-format='24h'
org/gnome/desktop/interface/clock-show-weekday=true
org/gnome/desktop/interface/color-scheme='prefer-dark'
org/gnome/desktop/interface/cursor-theme='DMZ-White'
org/gnome/desktop/interface/document-font-name='Sans 10'
org/gnome/desktop/interface/font-name='Ubuntu 10'
org/gnome/desktop/interface/gtk-theme='Yaru-dark'
org/gnome/desktop/interface/icon-theme='Yaru'
org/gnome/desktop/interface/monospace-font-name='Fira Code weight=453 10'
org/gnome/desktop/interface/show-battery-percentage=true
org/gnome/desktop/media-handling/autorun-never=true
org/gnome/desktop/media-handling/autorun-x-content-start-app=['x-content/ostree-repository']
org/gnome/desktop/notifications/show-in-lock-screen=false
org/gnome/desktop/peripherals/mouse/accel-profile='flat'
org/gnome/desktop/peripherals/mouse/speed=0.0
org/gnome/desktop/peripherals/touchpad/click-method='fingers'
org/gnome/desktop/privacy/old-files-age=uint32 1
org/gnome/desktop/privacy/recent-files-max-age=1
org/gnome/desktop/privacy/remember-recent-files=false
org/gnome/desktop/privacy/remove-old-temp-files=true
org/gnome/desktop/privacy/remove-old-trash-files=true
org/gnome/desktop/screensaver/lock-delay=uint32 60
org/gnome/desktop/search-providers/disabled=['org.gnome.Characters.desktop', 'org.gnome.seahorse.Application.desktop', 'org.gnome.Terminal.desktop']
org/gnome/desktop/session/idle-delay=uint32 900
org/gnome/desktop/wm/keybindings/move-to-center=['<Super><Alt>C']
org/gnome/desktop/wm/preferences/titlebar-font='Ubuntu Bold 10'
org/gnome/meld/filename-filters=[('Backups', true, '#*# .#* ~* *~ *.{orig,bak,swp}'), ('OS-specific metadata', true, '.DS_Store ._* .Spotlight-V100 .Trashes Thumbs.db Desktop.ini'), ('Version Control', true, '_MTN .bzr .svn .svn .hg .fslckout _FOSSIL_ .fos CVS _darcs .git .svn .osc'), ('Binaries', true, '*.{pyc,a,obj,o,so,la,lib,dll,exe}'), ('Media', false, '*.{jpg,gif,png,bmp,wav,mp3,ogg,flac,avi,mpg,xcf,xpm}'), ('Dev', true, '.gradle .cache .node-gyp .terraform .terraform.lock.hcl bower_components node_modules build')]
org/gnome/meld/folder-status-filters=['new', 'modified']
org/gnome/meld/highlight-current-line=true
org/gnome/meld/highlight-syntax=true
org/gnome/meld/indent-width=4
org/gnome/meld/insert-spaces-instead-of-tabs=true
org/gnome/meld/show-line-numbers=true
org/gnome/meld/style-scheme='Yaru-dark'
org/gnome/nautilus/list-view/default-visible-columns=['name', 'size', 'type', 'date_modified']
org/gnome/nautilus/list-view/default-zoom-level='small'
org/gnome/nautilus/list-view/use-tree-view=true
org/gnome/nautilus/preferences/default-folder-viewer='list-view'
org/gnome/nautilus/preferences/recursive-search='always'
org/gnome/nautilus/preferences/show-delete-permanently=true
org/gnome/nautilus/preferences/show-directory-item-counts='never'
org/gnome/nautilus/preferences/show-image-thumbnails='never'
org/gnome/nautilus/window-state/sidebar-width=200
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/binding='<Super>x'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/command='gnome-session-quit --power-off'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/name='Shutdown'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/binding='<Shift><Super>x'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/command='gnome-session-quit --reboot'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/name='Reboot'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/binding='<Alt><Super>x'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/command='systemctl suspend'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/name='Suspend'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/binding='<Primary><Shift>Escape'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/command='gnome-system-monitor'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/name='System Monitor'
org/gnome/settings-daemon/plugins/media-keys/custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/']
org/gnome/settings-daemon/plugins/power/ambient-enabled=false
org/gnome/settings-daemon/plugins/power/power-button-action='interactive'
org/gnome/settings-daemon/plugins/power/sleep-inactive-ac-timeout=1200
org/gnome/settings-daemon/plugins/power/sleep-inactive-ac-type='suspend'
org/gnome/settings-daemon/plugins/power/sleep-inactive-battery-timeout=1200
org/gnome/settings-daemon/plugins/power/sleep-inactive-battery-type='suspend'
org/gnome/shell/extensions/dash-to-dock/dash-max-icon-size=40
org/gnome/shell/extensions/dash-to-dock/dock-position='BOTTOM'
org/gnome/shell/extensions/dash-to-dock/multi-monitor=true
org/gnome/shell/extensions/dash-to-dock/show-mounts-network=false
org/gnome/shell/extensions/dash-to-dock/show-mounts-only-mounted=true
org/gnome/shell/favorite-apps=['org.gnome.Nautilus.desktop', 'firefox.desktop', 'firefox-developer-edition.desktop', 'google-chrome.desktop', 'org.gnome.Terminal.desktop', 'code.desktop', 'syntevo-smartgit.desktop', 'gitkraken.desktop', 'org.gnome.meld.desktop', 'lens.desktop', 'com.todoist.Todoist.desktop', 'filezilla.desktop', 'com.getpostman.Postman.desktop', 'com.slack.Slack.desktop', 'org.telegram.desktop.desktop', 'discord-ptb.desktop', 'mysql-workbench.desktop', 'virtualbox.desktop', 'notable.desktop', 'org.gnome.TextEditor.desktop', 'com.gitlab.newsflash.desktop', 'spotify.desktop', '1password.desktop']
org/gnome/software/download-updates-notify=false
org/gnome/software/download-updates=false
org/gnome/system/location/enabled=true
org/gnome/terminal/legacy/keybindings/close-tab='<Primary>w'
org/gnome/terminal/legacy/keybindings/close-window='disabled'
org/gnome/terminal/legacy/keybindings/new-tab='<Primary>t'
org/gnome/terminal/legacy/keybindings/preferences='<Primary>comma'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/audible-bell=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/background-color='rgb(21,27,31)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/bold-color-same-as-fg=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/bold-color='rgb(245,245,245)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/bold-is-bright=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cell-height-scale=1.1000000000000001
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cell-width-scale=1.0
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cursor-background-color='rgb(251,0,232)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cursor-blink-mode='off'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cursor-colors-set=true
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/cursor-foreground-color='rgb(255,229,253)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/default-size-columns=160
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/default-size-rows=40
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/font='Fira Code weight=453 10'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/foreground-color='rgb(240,240,240)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/highlight-background-color='rgb(193,221,255)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/highlight-colors-set=true
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/highlight-foreground-color='rgb(0,0,0)'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/palette=['rgb(0,0,0)', 'rgb(255,72,38)', 'rgb(65,167,50)', 'rgb(243,225,31)', 'rgb(82,137,249)', 'rgb(165,69,183)', 'rgb(65,185,211)', 'rgb(170,170,170)', 'rgb(126,126,126)', 'rgb(226,97,92)', 'rgb(115,205,114)', 'rgb(255,246,70)', 'rgb(98,174,255)', 'rgb(185,87,202)', 'rgb(69,195,221)', 'rgb(255,255,255)']
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/scrollbar-policy='never'
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/use-system-font=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/use-theme-colors=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/use-theme-transparency=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/use-transparent-background=false
org/gnome/terminal/legacy/profiles:/:107d05fc-a7be-4eb3-aa9e-77061af82199/visible-name='Default'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/audible-bell=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/background-color='rgb(21,27,31)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/bold-color-same-as-fg=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/bold-color='rgb(245,245,245)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/bold-is-bright=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cell-height-scale=1.1000000000000001
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cell-width-scale=1.0
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cursor-background-color='rgb(251,0,232)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cursor-blink-mode='off'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cursor-colors-set=true
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/cursor-foreground-color='rgb(255,229,253)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/default-size-columns=96
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/default-size-rows=24
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/font='Fira Code weight=453 16'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/foreground-color='rgb(240,240,240)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/highlight-background-color='rgb(193,221,255)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/highlight-colors-set=true
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/highlight-foreground-color='rgb(0,0,0)'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/palette=['rgb(0,0,0)', 'rgb(255,72,38)', 'rgb(65,167,50)', 'rgb(243,225,31)', 'rgb(82,137,249)', 'rgb(165,69,183)', 'rgb(65,185,211)', 'rgb(170,170,170)', 'rgb(126,126,126)', 'rgb(226,97,92)', 'rgb(115,205,114)', 'rgb(255,246,70)', 'rgb(98,174,255)', 'rgb(185,87,202)', 'rgb(69,195,221)', 'rgb(255,255,255)']
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/scrollbar-policy='never'
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/use-system-font=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/use-theme-colors=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/use-theme-transparency=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/use-transparent-background=false
org/gnome/terminal/legacy/profiles:/:90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa/visible-name='Presentation'
org/gnome/terminal/legacy/profiles:/default='107d05fc-a7be-4eb3-aa9e-77061af82199'
org/gnome/terminal/legacy/profiles:/list=['107d05fc-a7be-4eb3-aa9e-77061af82199', '90a6bbd2-1fa5-44b4-90e0-cc5aa08004fa']
"
dconf load / <<< "${gnomeSettings}"
}
installGnomeShellExtensions()
{
logInfo "Install Gnome Shell Extensions"
gnome-extensions disable ding@rastersoft.com
gnome-extensions enable ubuntu-appindicators@ubuntu.com
gnome-extensions enable ubuntu-dock@ubuntu.com
curl -fsSL https://raw.githubusercontent.com/NicolasBernaerts/ubuntu-scripts/master/ubuntugnome/gnomeshell-extension-manage -o ${tempDir}/gnomeshell-extension-manage
chmod +x ${tempDir}/gnomeshell-extension-manage
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 28 # gTile
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 36 # Lock Keys
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 277 # Impatience
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 841 # Freon
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 906 # Sound Input & Output Device Chooser
${tempDir}/gnomeshell-extension-manage --install --user --version latest --extension-id 5219 # TopHat
local -r gnomeSettings="
[/]
org/gnome/shell/extensions/freon/hot-sensors=['__average__', '__max__']
org/gnome/shell/extensions/freon/show-voltage=false
org/gnome/shell/extensions/gtile/global-presets=false
org/gnome/shell/extensions/gtile/grid-sizes='6x6'
org/gnome/shell/extensions/gtile/moveresize-enabled=false
org/gnome/shell/extensions/lockkeys/notification-preferences='osd'
org/gnome/shell/extensions/lockkeys/style='none'
org/gnome/shell/extensions/net/gfxmonk/impatience/speed-factor=0.75
org/gnome/shell/extensions/sound-output-device-chooser/cannot-activate-hidden-device=false
org/gnome/shell/extensions/sound-output-device-chooser/expand-volume-menu=false
org/gnome/shell/extensions/sound-output-device-chooser/icon-theme='none'
org/gnome/shell/extensions/sound-output-device-chooser/show-profiles=false
"
dconf load / <<< "${gnomeSettings}"
}
configureSshServer()
{
logInfo "Configure SSH server"
sudo tee /etc/ssh/sshd_config.d/99-custom.conf > /dev/null \
<<- EOT
Port 22013
EOT
sudo systemctl restart sshd.service
}
turnOffBluetooth()
{
logInfo "Turn off Bluetooth"
rfkill block bluetooth
}
printEndMessage()
{
logInfo "Done"
tee "${HOME}/TODO.txt" > /dev/null \
<<- EOT
- Delete the setup.sh script
- Open Junction -> Set Junction os default for Web
- Open Settings -> Privacy -> Diagnostic -> Send error reports to Canonical -> Never
- Open Settings -> Default Applications -> Set Music and Video to Celluloid
- Open Language Support -> If prompted for missing languages, click Install
-> Language -> Apply System-Wide
-> Regional Formats -> Apply System-Wide
- Load configs with YADM
- Install IntelliJ IDEA from JetBrains Toolbox
- Delete this file
EOT
echo "
The setup has been completed successfully.
Some changes require a restart to take effect.
After the restart, read the TODO.txt file in your home directory for the manual steps to complete the setup.
"
}
main()
{
checkUbuntuVersion
getSudoPrivileges
createTemporaryDirectory
setKernelParameters
configureGrub
disableReports
createDevStructure
removeUnwantedPackages
configureApt
updateSystem
installAptPackages
installTranscrypt
install1Password
installDocker
installGoogleChrome
installMySQLWorkbench
installSpotify
installVSCode
installAppImageLauncher
installCelluloid
installFirefox
installFirefoxDev
installGit
installWakeMeOps
installBinEnv
installFlatpakPackages
installScripts
installNVM
installSdkMan
installDebPackages
installDevTools
installJetBrainsToolbox
installAwsCli
generateBashCompletions
setupBash
setupSensors
setupDatetime
setupBackground
updateGnomeSettings
installGnomeShellExtensions
configureSshServer
turnOffBluetooth
printEndMessage
}
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment