Created
July 27, 2022 22:48
-
-
Save perpen/916167baa80b1aea2d5492cbb4f27bb4 to your computer and use it in GitHub Desktop.
Don't read this
This file contains hidden or 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
#!/usr/bin/env bash | |
set -e -o pipefail | |
my-dirs() { | |
mkdir -p ~/{src,tmp} | |
if [[ $(hostname) = penguin ]]; then | |
[[ -r ~/downloads ]] \ | |
|| ln -sfv /mnt/chromeos/MyFiles/Downloads ~/downloads | |
else | |
mkdir -p ~/downloads | |
fi | |
} | |
kakoune() { | |
echo kakoune | |
local dir=$LOCAL/kakoune | |
[[ "$1" = "force" ]] && rm -rf "$dir" | |
[[ -d "$dir" ]] && return | |
# using sudo here in case it's first run on new box and i'm not in docker group yet | |
local gcc_version | |
case $(ls /lib/x86_64-linux-gnu/libncurses.so.?) in | |
*.5) gcc_version=7.3 ;; | |
*) gcc_version=8 ;; | |
esac | |
sudo docker run --rm -v /tmp:/out gcc:$gcc_version bash -c \ | |
"set -x \ | |
&& git clone https://github.com/mawww/kakoune.git \ | |
&& cd kakoune/src \ | |
&& make -j$CONCURRENCY_LEVEL \ | |
&& make PREFIX=$dir install \ | |
&& tar cfz /out/kak.tgz $dir" | |
rm -rf $dir | |
tar xfz /tmp/kak.tgz -C/ | |
cat <<EOF > $PROFILE_D/kakoune.sh | |
export PATH=$dir/bin:\$PATH | |
EOF | |
} | |
kakoune-plug() { | |
echo plug.kak | |
local dir=~/.config/kak/plugins | |
[[ "$1" = force ]] && rm -rf $dir/plug.kak | |
[[ -d $dir/plug.kak ]] && return | |
mkdir -p $dir | |
rm -rf $dir/plug.kak | |
git clone https://github.com/andreyorst/plug.kak.git $dir/plug.kak | |
curl -Lo- \ | |
https://github.com/ul/kak-lsp/releases/download/v7.0.0/kak-lsp-v7.0.0-x86_64-unknown-linux-musl.tar.gz \ | |
| tar xfz - -C $LOCAL/bin kak-lsp | |
} | |
nvm-install() { | |
echo nvm | |
local nvm_dir=$LOCAL/nvm | |
[[ "$1" = "force" ]] && rm -rf $nvm_dir | |
[[ -f $nvm_dir/nvm.sh ]] && return | |
mkdir -p $nvm_dir | |
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh \ | |
| NVM_DIR=$nvm_dir bash | |
cat <<EOF > $PROFILE_D/nvm.sh | |
# export PATH="./node_modules/.bin:\$PATH" | |
EOF | |
cat <<EOF > $PROFILE_D/nvm.rc | |
source $nvm_dir/nvm.sh | |
[[ -s "$nvm_dir/bash_completion" ]] && source "$nvm_dir/bash_completion" | |
EOF | |
source $PROFILE_D/nvm.rc | |
nvm install 12 | |
} | |
lsp-java() { | |
echo lsp-java | |
local jdt_dir=$LOCAL/jdt | |
echo "Installing eclipse jdt jars" | |
true && [[ "$1" = "force" || ! -d $jdt_dir ]] && { | |
rm -rf $jdt_dir | |
mkdir $jdt_dir | |
cd $jdt_dir | |
curl -O https://ci.eclipse.org/ls/job/jdt-ls-master/lastSuccessfulBuild/artifact/org.eclipse.jdt.ls.product/distro/jdt-language-server-0.46.0-201910230827.tar.gz | |
tar xfz ./*.tar.gz | |
rm -f ./*.tar.gz | |
} | |
local alt_dir=$LOCAL/java-language-server | |
echo "Installing alternative java language server" | |
false && [[ "$1" = "force" || ! -d $alt_dir ]] && { | |
sudo apt-get install -y openjdk-11-jdk-headless protobuf-compiler | |
# we need bazel | |
sudo apt-get install -y pkg-config zip g++ zlib1g-dev unzip python3 | |
cd /var/tmp | |
rm -rf bazel* | |
curl -LO https://github.com/bazelbuild/bazel/releases/download/1.1.0/bazel-1.1.0-installer-linux-x86_64.sh | |
chmod a+x bazel*.sh | |
sudo ./bazel*.sh | |
rm bazel*.sh | |
exit 0 | |
rm -rf $alt_dir | |
git clone https://github.com/georgewfraser/java-language-server.git | |
cd $alt_dir | |
git checkout 6910e31 | |
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 ./scripts/build.sh | |
} | |
} | |
shell-stuff() { | |
echo shell-stuff | |
local bin=$LOCAL/bin/shellcheck | |
[[ "$1" = "force" ]] && rm -f $bin | |
[[ -x $bin ]] && return | |
curl \ | |
https://storage.googleapis.com/shellcheck/shellcheck-stable.linux.x86_64.tar.xz \ | |
| xz -d \ | |
| tar xf - -C $LOCAL/bin --strip-components 1 | |
chmod a+x $bin | |
} | |
lsp() { | |
echo lsp | |
source $PROFILE_D/nvm.sh | |
local packages=( | |
vscode-html-languageserver-bin | |
vscode-css-languageserver-bin | |
vscode-json-languageserver-bin | |
bash-language-server | |
typescript | |
typescript-language-server | |
javascript-typescript-langserver | |
) | |
local installed="$(npm list -g | sed -r 's/^.* ([^ ]+)@.*$/\1/')" | |
[[ "$1" = "force" ]] && installed="" | |
for package in "${packages[@]}"; do | |
(echo $installed | grep -q $package) \ | |
|| npm install -g $package | |
done | |
} | |
ctags() { | |
echo ctags - provides readtags to kakoune | |
[[ "$1" = "force" ]] && rm -f $LOCAL/bin/ctags | |
[[ -x $LOCAL/bin/ctags ]] && return | |
sudo apt-get remove -y exuberant-ctags || true | |
cd $TMP | |
git clone https://github.com/universal-ctags/ctags.git | |
cd ctags | |
./autogen.sh | |
./configure --prefix=$LOCAL | |
make | |
make install | |
} | |
tmux() { | |
echo tmux | |
[[ "$1" = "force" ]] && rm -f $LOCAL/bin/tmux | |
[[ -x $LOCAL/bin/tmux ]] && return | |
sudo apt-get install -y libevent-dev libncurses5-dev byacc | |
sudo apt-get remove -y tmux || true | |
cd $TMP | |
git clone https://github.com/tmux/tmux.git | |
cd tmux | |
sh autogen.sh | |
./configure --prefix=$LOCAL | |
make | |
make install | |
## Just in case google cloud shell uses the absolute path when starting the session: | |
sudo ln -sf $LOCAL/bin/tmux /usr/bin | |
echo Installing tpm | |
rm -rf ~/.tmux/plugins/tpm | |
mkdir -p ~/.tmux/plugins | |
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm | |
} | |
fzy() { | |
echo fzy | |
[[ "$1" = "force" ]] && rm -f $LOCAL/bin/fzy | |
[[ -x $LOCAL/bin/fzy ]]&> /dev/null && return | |
cd $TMP | |
git clone https://github.com/jhawthorn/fzy.git | |
cd fzy | |
make | |
make PREFIX=$LOCAL install | |
} | |
leiningen() { | |
echo leiningen | |
[[ "$1" = "force" ]] && rm -f $LOCAL/bin/lein | |
[[ -x $LOCAL/bin/lein ]] && return | |
curl -o $LOCAL/bin/lein \ | |
https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein | |
chmod a+x $LOCAL/bin/lein | |
} | |
python() { | |
echo python | |
local venv_dir=$LOCAL/venv | |
[[ "$1" = "force" ]] && rm -rf "$venv_dir" | |
[[ -d $venv_dir ]] && return | |
sudo apt-get install -y virtualenv libpython3-dev | |
virtualenv -p python3 $venv_dir | |
source $venv_dir/bin/activate | |
pip install -q --upgrade pip | |
pip install -q flask requests flake8 mccabe pep8 pyflakes bitbucket-api \ | |
yapf truffleHog PyGithub howdoi 'python-language-server[all]' | |
cat <<EOF > $PROFILE_D/python.sh | |
source $venv_dir/bin/activate | |
EOF | |
source $PROFILE_D/python.sh | |
} | |
golang() { | |
echo golang | |
[[ "$1" = "force" ]] && rm -rf "$LOCAL/go" | |
[[ -d $LOCAL/go ]] && return | |
curl -o- \ | |
https://dl.google.com/go/go1.17.5.linux-amd64.tar.gz \ | |
| tar xfz - -C $LOCAL | |
cat <<EOF > $PROFILE_D/go.sh | |
export PATH=$LOCAL/go/bin:\$PATH | |
export GOPATH=$HOME/src/go | |
export PATH=\$GOPATH/bin:\$PATH | |
mkdir -p \$GOPATH | |
EOF | |
source $PROFILE_D/go.sh | |
# GO111MODULE=on go install golang.org/x/tools/gopls@latest | |
go install golang.org/x/tools/gopls@latest | |
go install -u github.com/go-delve/delve/cmd/dlv | |
} | |
ruby() { | |
echo ruby | |
local rbenv_dir=$LOCAL/rbenv | |
[[ "$1" = "force" ]] && rm -rf "$rbenv_dir" | |
[[ -d $rbenv_dir ]] && return | |
sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev | |
git clone https://github.com/rbenv/rbenv.git $rbenv_dir | |
mkdir -p $rbenv_dir/plugins | |
[[ -d $rbenv_dir/plugins/ruby-build ]] \ | |
|| git clone https://github.com/rbenv/ruby-build.git $rbenv_dir/plugins/ruby-build | |
cat <<EOF > $PROFILE_D/ruby.sh | |
export RBENV_ROOT=$rbenv_dir | |
export PATH="$rbenv_dir/bin:\$PATH" | |
eval "\$($rbenv_dir/bin/rbenv init -)" || true | |
export PATH="$HOME/.gems/bin:\$PATH" | |
EOF | |
source $PROFILE_D/ruby.sh | |
rbenv install 2.6.1 | |
rbenv global 2.6.1 | |
gem install gist # cli for editing github gists | |
gem install rufo rubocop | |
gem install solargraph json rest-client | |
solargraph download-core | |
} | |
iptables() { | |
echo iptables | |
sudo apt-get install -y iptables iptables-persistent | |
sudo cp -fv ~/lib/files-rio/iptables/rules.* /etc/iptables/ | |
} | |
rust() { | |
echo rust | |
export RUSTUP_HOME=$LOCAL/rust | |
[[ "$1" = "force" ]] && rm -rf "$RUSTUP_HOME" | |
[[ -d "$RUSTUP_HOME" ]] && return | |
export CARGO_HOME=$LOCAL/rust | |
sudo mkdir -p $RUSTUP_HOME | |
sudo chown "$(id -u):$(id -g)" $RUSTUP_HOME | |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path | |
cat <<EOF > $PROFILE_D/rust.sh | |
source $RUSTUP_HOME/env | |
export PATH=~/.cargo/bin:\$PATH | |
EOF | |
source $PROFILE_D/rust.sh | |
rustup default stable | |
rustup component add rls --toolchain stable-x86_64-unknown-linux-gnu | |
} | |
gcloud-install() { | |
echo gcloud sdk | |
local dir="$LOCAL/google-cloud-sdk" | |
[[ "$1" = "force" ]] && rm -rf "$dir" | |
[[ -f "$dir/bin/gcloud" ]] && return | |
cd "$LOCAL" | |
# see https://cloud.google.com/sdk/docs/install | |
curl -f \ | |
https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-367.0.0-linux-x86_64.tar.gz \ | |
| tar xfz - | |
source ~/.secrets/gcp-defaults.sh | |
# gcloud config set account [email protected] | |
cat <<EOF > $PROFILE_D/gcloud.sh | |
export PATH=$dir/bin:\$PATH | |
source $LOCAL/google-cloud-sdk/completion.bash.inc | |
source ~/.secrets/gcp-defaults.sh | |
export CLOUDSDK_PYTHON_SITEPACKAGES=1 | |
EOF | |
source $PROFILE_D/gcloud.sh | |
gcloud components install app-engine-go --quiet | |
} | |
terraform() { | |
echo terraform | |
[[ "$1" = "force" ]] && rm -f $LOCAL/bin/terraform | |
[[ -x $LOCAL/bin/terraform ]] && return | |
cd $TMP | |
wget https://releases.hashicorp.com/terraform/0.11.10/terraform_0.11.10_linux_amd64.zip | |
unzip terraform_0.11.10_linux_amd64.zip | |
sudo mv terraform $LOCAL/bin | |
rm terraform_0.11.10_linux_amd64.zip | |
} | |
docker-install() { | |
type docker &> /dev/null && return | |
case $(hostname) in | |
cs-*) # cloudshell | |
# pre-installed | |
;; | |
*) | |
sudo apt-get install -y \ | |
apt-transport-https \ | |
ca-certificates \ | |
curl \ | |
gnupg2 \ | |
software-properties-common | |
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - | |
sudo apt-key fingerprint 0EBFCD88 | |
sudo add-apt-repository \ | |
"deb [arch=amd64] https://download.docker.com/linux/debian \ | |
$(lsb_release -cs) \ | |
stable" | |
sudo apt-get update | |
sudo apt-get install -y docker-ce docker-ce-cli containerd.io | |
sudo usermod -a -G docker $USER | |
;; | |
esac | |
} | |
atlassian() { | |
echo atlassian | |
local dir=$LOCAL/atlassian | |
[[ "$1" = "force" ]] && rm -rf "$dir" | |
[[ -d $dir ]] && return | |
mkdir $dir | |
curl -L https://marketplace.atlassian.com/download/plugins/atlassian-plugin-sdk-tgz \ | |
| tar xfz - -C $dir --strip-components 1 | |
cat <<EOF > $PROFILE_D/atlassian.sh | |
export PATH=$dir/bin:\$PATH | |
EOF | |
} | |
maven() { | |
echo maven | |
local dir=$LOCAL/maven | |
[[ "$1" = "force" ]] && rm -rf "$dir" | |
[[ -d $dir ]] && return | |
sudo apt-get install -y libasound2 libasound2-data openjdk-11-jdk-headless | |
sudo sed -i -r 's/^( *assistive_technologies *=.*)$/#\1/' /etc/java-11-openjdk/accessibility.properties | |
rm -rf $dir | |
mkdir $dir | |
curl -L http://mirrors.ukfast.co.uk/sites/ftp.apache.org/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.tar.gz \ | |
| tar xfz - -C $dir --strip-components 1 | |
cat <<EOF > $PROFILE_D/maven.sh | |
export PATH=$dir/bin:\$PATH | |
export MAVEN_COLOR=true | |
EOF | |
} | |
install-flutter() { | |
echo flutter | |
[[ "$1" = "force" ]] && rm -rf "$LOCAL/flutter" | |
[[ -d $LOCAL/flutter ]] && return | |
cd $LOCAL | |
git clone https://github.com/flutter/flutter.git | |
cat <<EOF > $PROFILE_D/flutter.sh | |
export PATH=$LOCAL/flutter/bin:\$PATH | |
export CHROME_EXECUTABLE=chromium | |
export PATH="\$PATH":"\$HOME/.pub-cache/bin" | |
EOF | |
source $PROFILE_D/flutter.sh | |
type flutter | |
} | |
code-server() { | |
echo code-server | |
[[ -f /usr/bin/code-server ]] && return | |
local version=3.8.0 | |
cd /var/tmp | |
curl -fOL https://github.com/cdr/code-server/releases/download/v${version}/code-server_${version}_amd64.deb | |
sudo dpkg -i code-server_${version}_amd64.deb | |
sudo systemctl enable --now code-server@$USER | |
cd - | |
} | |
code-server-OLD() { | |
echo code-server | |
cat <<EOF > /tmp/code-server.service | |
[Unit] | |
Description=Code Server IDE | |
After=network.target | |
[Service] | |
Type=simple | |
User=$USER | |
EnvironmentFile=$HOME/.profile | |
WorkingDirectory=$HOME | |
# Restart=on-failure | |
# RestartSec=10 | |
ExecStart=$HOME/bin/vsc run $(pwd) | |
StandardOutput=file:/var/log/code-server-output.log | |
StandardError=file:/var/log/code-server-error.log | |
[Install] | |
WantedBy=multi-user.target | |
EOF | |
sudo cp -f /tmp/code-server.service /etc/systemd/system/ | |
sudo systemctl daemon-reload | |
sudo systemctl enable code-server | |
sudo systemctl start code-server | |
rm /tmp/code-server.service | |
} | |
plan9() { | |
echo plan9 | |
local dir=$LOCAL/plan9 | |
[[ "$1" = "force" ]] && rm -rf "$dir" | |
[[ -d $dir ]] && return | |
sudo apt-get install -y libx11-dev libxt-dev libfontconfig1-dev libxext-dev | |
rm -rf $dir | |
git clone [email protected]:9fans/plan9port.git $dir | |
cd $dir | |
./INSTALL | |
cat <<EOF > $PROFILE_D/plan9.rc | |
export PLAN9=$dir | |
export PATH=\$PATH:\$PLAN9/bin | |
EOF | |
} | |
plan9-drawterm() { | |
echo plan9-drawterm | |
local dir=$LOCAL/drawterm | |
[[ "$1" = "force" ]] && rm -rf "$dir" | |
[[ -d $dir ]] && return | |
rm -rf $dir | |
sudo apt-get install -y mercurial | |
hg clone https://code.9front.org/hg/drawterm $dir | |
cd $dir | |
CONF=unix make | |
# The binary will be invoked from ~/bin/drawterm | |
} | |
shutbot() { | |
gcloud2 current > /dev/null || return | |
echo shutbot | |
cat <<EOF > /tmp/shutbot.service | |
[Unit] | |
Description=Shutdown on inactivity | |
After=network.target | |
[Service] | |
Type=simple | |
User=$USER | |
EnvironmentFile=$HOME/.profile | |
WorkingDirectory=$HOME | |
# Restart=on-failure | |
# RestartSec=10 | |
ExecStart=$HOME/bin/gcloud2 shutbot | |
StandardOutput=file:/var/log/shutbot-output.log | |
StandardError=file:/var/log/shutbot-error.log | |
[Install] | |
WantedBy=multi-user.target | |
EOF | |
sudo cp -f /tmp/shutbot.service /etc/systemd/system/ | |
sudo systemctl daemon-reload | |
sudo systemctl enable shutbot | |
sudo systemctl start shutbot | |
rm /tmp/shutbot.service | |
} | |
secure-ssh() { | |
echo secure-ssh | |
local line="AllowUsers $USER" | |
sudo grep -Eq "^$line" /etc/ssh/sshd_config || { | |
echo -e "\n$line" | sudo tee -a /etc/ssh/sshd_config | |
} | |
} | |
main() { | |
[[ ! $(hostname) =~ cs-.* ]] && { | |
sudo apt-get update | |
sudo apt-get install -y \ | |
aptitude \ | |
autoconf \ | |
bc \ | |
build-essential \ | |
chkrootkit \ | |
dc \ | |
editorconfig \ | |
file \ | |
git \ | |
htop \ | |
httpie \ | |
iftop \ | |
inotify-tools \ | |
jq \ | |
lsb-release \ | |
lsof \ | |
ltrace \ | |
mlocate \ | |
pkg-config \ | |
ripgrep \ | |
socat \ | |
software-properties-common \ | |
strace \ | |
time \ | |
tree \ | |
unzip \ | |
wget | |
} | |
my-dirs | |
tmux "$@" | |
fzy "$@" | |
# ctags "$@" | |
python "$@" | |
# terraform "$@" | |
nvm-install "$@" | |
lsp "$@" | |
ruby "$@" | |
shell-stuff "$@" | |
# if not on cloudshell | |
[[ ! "$(hostname)" =~ cs-.* ]] && { | |
golang "$@" | |
rust "$@" | |
gcloud-install "$@" | |
docker-install "$@" | |
# maven "$@" | |
# leiningen "$@" | |
# atlassian "$@" | |
# code-server "$@" | |
} | |
kakoune "$@" # requires docker | |
kakoune-plug "$@" | |
# on a workstation | |
[[ ! "$(hostname)" =~ cs-.* && "$(hostname)" != "penguin" ]] && { | |
# plan9 "$@" | |
# plan9-drawterm "$@" | |
# iptables "$@" | |
secure-ssh "$@" | |
} | |
} | |
LOCAL=/usr/local/henri | |
mkdir -p $LOCAL/bin | |
PROFILE_D=$LOCAL/profile.d | |
mkdir -p $PROFILE_D | |
cat <<EOF > $PROFILE_D/0-main.sh | |
export PATH=$LOCAL/bin:\$PATH | |
EOF | |
eval "$(grep -E '^processor' /proc/cpuinfo \ | |
| tail -1 \ | |
| awk '{print "export CONCURRENCY_LEVEL=" $3 + 1}')" | |
TMP=$(mktemp -d) | |
trap "{ rm -rf $TMP; }" EXIT | |
[[ -z "$1" ]] && set main | |
eval "$@" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment