Skip to content

Instantly share code, notes, and snippets.

@perpen
Created July 27, 2022 22:48
Show Gist options
  • Save perpen/916167baa80b1aea2d5492cbb4f27bb4 to your computer and use it in GitHub Desktop.
Save perpen/916167baa80b1aea2d5492cbb4f27bb4 to your computer and use it in GitHub Desktop.
Don't read this
#!/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 $GCP_HENRI_PROJECT@appspot.gserviceaccount.com
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 git@github.com: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