https://github.com/traefikturkey/onvoy/blob/main/ubuntu%2Fbash%2Fdocker_server_setup.sh
Last active
December 31, 2023 15:27
-
-
Save ilude/e2342829a97c3c3d3da5f9c73976c4ec to your computer and use it in GitHub Desktop.
Docker Host Setup
This file contains 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
#### This works with real and FULL vm installs of Ubuntu server 22.04 as of 06/07/22 | |
##### if you do docker in lxc then this is probably not the script for you | |
##### this does not need updated when 1setup.sh changes. It always pulls the latests | |
##### copy and paste the line below on a fresh ubuntu server setup | |
curl -s https://gist.githubusercontent.com/ilude/e2342829a97c3c3d3da5f9c73976c4ec/raw/1setup.sh?$(date +%s) | /bin/bash -s | tee build.log |
This file contains 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
#!/bin/sh | |
echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee --append /etc/sudoers.d/$USER | |
# quiet down the console | |
echo "3 4 1 3" | sudo tee /proc/sys/kernel/printk | |
echo "kernel.printk = 3 4 1 3" | sudo tee --append /etc/sysctl.conf | |
# Setting for redis to behave during background saves | |
sudo sysctl vm.overcommit_memory=1 | |
echo "vm.overcommit_memory = 1" | sudo tee --append /etc/sysctl.conf | |
sudo sysctl net.core.somaxconn=1024 | |
echo "net.core.somaxconn = 1024" | sudo tee --append /etc/sysctl.conf | |
# makde dockerized elasticsearch happy | |
sudo sysctl -w vm.max_map_count=262144 | |
echo "vm.max_map_count = 262144" | sudo tee --append /etc/sysctl.conf | |
sudo sysctl -w vm.swappiness=1 | |
echo "vm.swappiness=1" | sudo tee --append /etc/sysctl.conf | |
# Set Timezone of server | |
# timedatectl list-timezones | |
# sudo timedatectl set-timezone America/New_York | |
sudo timedatectl set-timezone America/Los_Angeles | |
sudo timedatectl set-local-rtc 1 # 1=local 0=UTC | |
sudo timedatectl set-ntp true | |
# disable ip6 | |
sudo sysctl net.ipv6.conf.all.disable_ipv6=1 | |
sudo sysctl net.ipv6.conf.default.disable_ipv6=1 | |
echo "net.ipv6.conf.all.disable_ipv6=1" | sudo tee --append /etc/sysctl.conf | |
echo "net.ipv6.conf.default.disable_ipv6=1" | sudo tee --append /etc/sysctl.conf | |
# basic system administration packages | |
sudo apt update | |
sudo apt install -y \ | |
anacron \ | |
apt-transport-https \ | |
bwm-ng \ | |
ca-certificates \ | |
curl \ | |
dnsutils \ | |
git \ | |
gnupg \ | |
htop \ | |
iftop \ | |
iotop \ | |
logrotate \ | |
lsb-release \ | |
make \ | |
nano \ | |
net-tools \ | |
sysstat \ | |
software-properties-common \ | |
vnstat | |
sudo apt purge -y landscape-common | |
# Disable Ubuntu motd spam | |
sudo systemctl disable motd-news.timer | |
sudo sed -i 's/^ENABLED=.*/ENABLED=0/' /etc/default/motd-news | |
rm -f /etc/legal | |
# tone down the adware and login noise | |
# sudo chmod -x /etc/update-motd.d/50-motd-news # prevents motd-news.service from starting | |
sudo chmod -x \ | |
/etc/update-motd.d/10-help-text \ | |
/etc/update-motd.d/80-livepatch \ | |
/etc/update-motd.d/95-hwe-eol | |
# speed up boot times | |
# https://askubuntu.com/a/979493 | |
# speed up booting by not letting networkd wait around for unconfigured interfaces | |
sudo systemctl disable systemd-networkd-wait-online.service | |
sudo systemctl mask systemd-networkd-wait-online.service | |
sudo mkdir -p /etc/systemd/system.conf.d/ | |
sudo tee /etc/systemd/system.conf.d/timeoutstopsec.conf >/dev/null <<'EOF' | |
[Manager] | |
# default wait time for services to stop during shutdown/reboot | |
# before systemd will kill it and move on | |
DefaultTimeoutStopSec=10s | |
EOF | |
if [[ $(sudo lsmod | grep ipmi | wc -l) != 0 ]]; then | |
echo "Installing IPMI and configuring systemd watchdog" | |
sudo apt install openipmi ipmitool -y | |
if [[ $(grep ipmi /etc/modules | wc -l) == 0 ]]; then | |
echo "ipmi_watchdog" | sudo tee /etc/modules | |
fi | |
sudo tee /etc/systemd/system.conf.d/watchdog.conf >/dev/null <<'EOF' | |
[Manager] | |
# configures /dev/watchdog for how long it should wait for a ping | |
RuntimeWatchdogSec==20s | |
# how long to wait for a clean reboot shutdown before doing a hardware reset | |
ShutdownWatchdogSec=180s | |
EOF | |
# restart systemd | |
sudo systemctl daemon-reexec | |
fi | |
sudo tee -a /etc/systemd/system/disable-hugepages.service >/dev/null <<'EOF' | |
[Unit] | |
Description="Disable Transparent Hugepage" | |
Before=docker.service | |
[Service] | |
Type=oneshot | |
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' | |
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' | |
[Install] | |
RequiredBy=docker.service | |
EOF | |
sudo systemctl daemon-reload | |
sudo systemctl enable disable-hugepages.service | |
sudo systemctl start disable-hugepages.service | |
# Fire and forget | |
export DEBIAN_FRONTEND=noninteractive | |
# https://askubuntu.com/a/1421221 | |
sudo sed -i 's/#$nrconf{restart} = '"'"'i'"'"';/$nrconf{restart} = '"'"'a'"'"';/g' /etc/needrestart/needrestart.conf | |
# Avoiding unnecessary packages | |
# Since we are trying to make this system as minimal as possible, | |
# we should make sure only the required packages are installed without | |
# having to provide the --no-install-recommends option every time | |
echo "set default apt to --no-install-recommends" | |
sudo tee -a /etc/apt/apt.conf.d/99local >/dev/null <<'EOF' | |
APT::Install-Suggests "0"; | |
APT::Install-Recommends "0"; | |
Dpkg::Options { | |
"--force-confdef"; | |
"--force-confold"; | |
} | |
EOF | |
echo "prevent packages from installing unwanted locales" | |
sudo tee -a /etc/dpkg/dpkg.cfg.d/01_nolocales >/dev/null <<'EOF' | |
path-exclude /usr/share/locale/* | |
path-include /usr/share/locale/en* | |
EOF | |
sudo apt update | |
sudo apt dist-upgrade -y | |
# prevent blk_update_request: I/O error, dev fd0, sector 0 on console | |
# sudo rmmod floppy | |
# echo "blacklist floppy" | sudo tee /etc/modprobe.d/blacklist-floppy.conf | |
# sudo dpkg-reconfigure initramfs-tools | |
########################################################### | |
# Remove the evil that is snaps | |
########################################################### | |
sudo snap remove lxd | |
sudo snap remove core18 | |
sudo snap remove snapd | |
sudo apt purge snapd -y | |
########################################################### | |
# Install and Setup Docker | |
########################################################### | |
# uninstall any perviously installed docker packages | |
sudo apt-get remove docker docker-engine docker.io | |
# install docker using convenience install script from docker.com | |
curl -fsSL https://get.docker.com -o get-docker.sh | |
sudo sh get-docker.sh | |
sudo groupadd docker | |
sudo usermod -aG docker $USER | |
# set timeouts for start up and stopping docker service | |
DCK_SRV=/lib/systemd/system/docker.service | |
sudo grep -q '^TimeoutStopSec' $DCK_SRV && sudo sed -i 's/^TimeoutStopSec.*/TimeoutStopSec=45/' $DCK_SRV || sudo sed -i 's/TimeoutSec.*/TimeoutSec=300'"\n"'TimeoutStopSec=45/' $DCK_SRV | |
sudo systemctl enable docker | |
sudo systemctl start docker | |
########################################################### | |
# install docker compose cli plugin | |
########################################################### | |
sudo apt install -y jq | |
DOCKER_COMPOSE_VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | jq .name -r) | |
DOCKER_CLI_PLUGIN_PATH=/usr/local/lib/docker/cli-plugins | |
sudo mkdir -p $DOCKER_CLI_PLUGIN_PATH | |
sudo curl -L "https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-$(uname -s)-$(uname -m)" -o $DOCKER_CLI_PLUGIN_PATH/docker-compose | |
sudo chmod +x $DOCKER_CLI_PLUGIN_PATH/docker-compose | |
# docker compose is now a built in command but you can | |
# uncomment the line below to setup docker-compose command | |
sudo ln -s $DOCKER_CLI_PLUGIN_PATH/docker-compose /usr/local/bin/docker-compose | |
########################################################### | |
# setup users environment | |
########################################################### | |
# load git config with aliases and such that work for me | |
sudo curl -L https://gist.githubusercontent.com/ilude/e2342829a97c3c3d3da5f9c73976c4ec/raw/gitconfig -o /etc/gitconfig | |
mkdir $HOME/.ssh | |
#curl -L https://gist.githubusercontent.com/ilude/e2342829a97c3c3d3da5f9c73976c4ec/raw/authorized_keys -o $HOME/.ssh/authorized_keys | |
ssh-keyscan -H github.com >> $HOME/.ssh/known_hosts | |
ssh-keyscan -H bitbucket.org >> $HOME/.ssh/known_hosts | |
chmod 700 $HOME/.ssh | |
chmod 600 $HOME/.ssh/* | |
#scp $USER@rms.rammount.com:~/.ssh/id_rsa $HOME/.ssh | |
sudo mkdir -p /apps | |
sudo chown $USER:$USER /apps | |
tee -a ~/.bashrc >/dev/null <<'EOF' | |
alias dc='docker compose' | |
alias l='ls --color -lhav --group-directories-first' | |
alias dps='docker ps --format="table {{.Names}}\t{{.ID}}\t{{.Image}}\t{{.RunningFor}}\t{{.State}}\t{{.Status}}"' | |
alias dpsp='docker ps --format="table {{.Names}}\t{{.ID}}\t{{.Image}}\t{{.RunningFor}}\t{{.State}}\t{{.Status}}\t{{.Ports}}"' | |
EOF | |
sudo tee -a /etc/bash_prompt >/dev/null <<'EOF' | |
export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1 "\[\033[0;33m\][\[\033[1;36m\]%s\[\033[0;33m\]]")\[\e[0m\]$ ' | |
EOF | |
sudo tee -a /etc/bash_completion.d/z99_bash_prompt >/dev/null <<'EOF' | |
if [ -f /etc/bash_prompt ]; then | |
. /etc/bash_prompt | |
fi | |
EOF | |
########################################################### | |
# setup logrotate and other system maintenance automations | |
########################################################### | |
sudo tee -a /etc/logrotate.d/docker-container >/dev/null <<'EOF' | |
/var/lib/docker/containers/*/*.log { | |
rotate 15 | |
daily | |
compress | |
missingok | |
delaycompress | |
copytruncate | |
} | |
EOF | |
sudo mv /etc/cron.daily/logrotate /etc/cron.hourly/logrotate | |
sudo tee -a /etc/cron.weekly/docker-prune >/dev/null <<'EOF' | |
#!/bin/bash | |
/usr/bin/docker system prune -f | |
EOF | |
sudo chmod +x /etc/cron.weekly/docker-prune | |
sudo tee -a /etc/cron.weekly/update-system >/dev/null <<'EOF' | |
#!/bin/bash | |
/usr/bin/dpkg --configure -a | |
/usr/bin/apt-get update | |
/usr/bin/apt-get -qy dist-upgrade | |
/usr/bin/apt-get install -f | |
/usr/bin/apt-get clean | |
/usr/bin/apt-get -qy autoremove | |
if [ -f /var/run/reboot-required ]; then | |
sudo reboot | |
else | |
dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge | |
exit 0 | |
fi | |
EOF | |
sudo chmod +x /etc/cron.weekly/update-system | |
########################################################### | |
# cleanup any mess we made | |
########################################################### | |
echo "cleaning up uneeded packages..." | |
sudo apt autoremove -y --purge | |
sudo apt autoclean -y | |
echo "reloading profile" | |
source $HOME/.profile | |
echo "Setup Complete!" | |
echo "You probably want to start a new session now!" | |
# force new shell so we have groups and shizzle | |
#exec su -l $USER |
This file contains 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
# bash/zsh git prompt support | |
# | |
# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org> | |
# Distributed under the GNU General Public License, version 2.0. | |
# | |
# This script allows you to see repository status in your prompt. | |
# | |
# To enable: | |
# | |
# 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh). | |
# 2) Add the following line to your .bashrc/.zshrc: | |
# source ~/.git-prompt.sh | |
# 3a) Change your PS1 to call __git_ps1 as | |
# command-substitution: | |
# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' | |
# ZSH: setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' | |
# the optional argument will be used as format string. | |
# 3b) Alternatively, for a slightly faster prompt, __git_ps1 can | |
# be used for PROMPT_COMMAND in Bash or for precmd() in Zsh | |
# with two parameters, <pre> and <post>, which are strings | |
# you would put in $PS1 before and after the status string | |
# generated by the git-prompt machinery. e.g. | |
# Bash: PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "' | |
# will show username, at-sign, host, colon, cwd, then | |
# various status string, followed by dollar and SP, as | |
# your prompt. | |
# ZSH: precmd () { __git_ps1 "%n" ":%~$ " "|%s" } | |
# will show username, pipe, then various status string, | |
# followed by colon, cwd, dollar and SP, as your prompt. | |
# Optionally, you can supply a third argument with a printf | |
# format string to finetune the output of the branch status | |
# | |
# The repository status will be displayed only if you are currently in a | |
# git repository. The %s token is the placeholder for the shown status. | |
# | |
# The prompt status always includes the current branch name. | |
# | |
# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value, | |
# unstaged (*) and staged (+) changes will be shown next to the branch | |
# name. You can configure this per-repository with the | |
# bash.showDirtyState variable, which defaults to true once | |
# GIT_PS1_SHOWDIRTYSTATE is enabled. | |
# | |
# You can also see if currently something is stashed, by setting | |
# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed, | |
# then a '$' will be shown next to the branch name. | |
# | |
# If you would like to see if there're untracked files, then you can set | |
# GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked | |
# files, then a '%' will be shown next to the branch name. You can | |
# configure this per-repository with the bash.showUntrackedFiles | |
# variable, which defaults to true once GIT_PS1_SHOWUNTRACKEDFILES is | |
# enabled. | |
# | |
# If you would like to see the difference between HEAD and its upstream, | |
# set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates you are behind, ">" | |
# indicates you are ahead, "<>" indicates you have diverged and "=" | |
# indicates that there is no difference. You can further control | |
# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list | |
# of values: | |
# | |
# verbose show number of commits ahead/behind (+/-) upstream | |
# name if verbose, then also show the upstream abbrev name | |
# legacy don't use the '--count' option available in recent | |
# versions of git-rev-list | |
# git always compare HEAD to @{upstream} | |
# svn always compare HEAD to your SVN upstream | |
# | |
# You can change the separator between the branch name and the above | |
# state symbols by setting GIT_PS1_STATESEPARATOR. The default separator | |
# is SP. | |
# | |
# By default, __git_ps1 will compare HEAD to your SVN upstream if it can | |
# find one, or @{upstream} otherwise. Once you have set | |
# GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by | |
# setting the bash.showUpstream config variable. | |
# | |
# If you would like to see more information about the identity of | |
# commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE | |
# to one of these values: | |
# | |
# contains relative to newer annotated tag (v1.6.3.2~35) | |
# branch relative to newer tag or branch (master~4) | |
# describe relative to older annotated tag (v1.6.3.1-13-gdd42c2f) | |
# default exactly matching tag | |
# | |
# If you would like a colored hint about the current dirty state, set | |
# GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on | |
# the colored output of "git status -sb" and are available only when | |
# using __git_ps1 for PROMPT_COMMAND or precmd. | |
# | |
# If you would like __git_ps1 to do nothing in the case when the current | |
# directory is set up to be ignored by git, then set | |
# GIT_PS1_HIDE_IF_PWD_IGNORED to a nonempty value. Override this on the | |
# repository level by setting bash.hideIfPwdIgnored to "false". | |
# check whether printf supports -v | |
__git_printf_supports_v= | |
printf -v __git_printf_supports_v -- '%s' yes >/dev/null 2>&1 | |
# stores the divergence from upstream in $p | |
# used by GIT_PS1_SHOWUPSTREAM | |
__git_ps1_show_upstream () | |
{ | |
local key value | |
local svn_remote svn_url_pattern count n | |
local upstream=git legacy="" verbose="" name="" | |
svn_remote=() | |
# get some config options from git-config | |
local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')" | |
while read -r key value; do | |
case "$key" in | |
bash.showupstream) | |
GIT_PS1_SHOWUPSTREAM="$value" | |
if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then | |
p="" | |
return | |
fi | |
;; | |
svn-remote.*.url) | |
svn_remote[$((${#svn_remote[@]} + 1))]="$value" | |
svn_url_pattern="$svn_url_pattern\\|$value" | |
upstream=svn+git # default upstream is SVN if available, else git | |
;; | |
esac | |
done <<< "$output" | |
# parse configuration values | |
for option in ${GIT_PS1_SHOWUPSTREAM}; do | |
case "$option" in | |
git|svn) upstream="$option" ;; | |
verbose) verbose=1 ;; | |
legacy) legacy=1 ;; | |
name) name=1 ;; | |
esac | |
done | |
# Find our upstream | |
case "$upstream" in | |
git) upstream="@{upstream}" ;; | |
svn*) | |
# get the upstream from the "git-svn-id: ..." in a commit message | |
# (git-svn uses essentially the same procedure internally) | |
local -a svn_upstream | |
svn_upstream=($(git log --first-parent -1 \ | |
--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null)) | |
if [[ 0 -ne ${#svn_upstream[@]} ]]; then | |
svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]} | |
svn_upstream=${svn_upstream%@*} | |
local n_stop="${#svn_remote[@]}" | |
for ((n=1; n <= n_stop; n++)); do | |
svn_upstream=${svn_upstream#${svn_remote[$n]}} | |
done | |
if [[ -z "$svn_upstream" ]]; then | |
# default branch name for checkouts with no layout: | |
upstream=${GIT_SVN_ID:-git-svn} | |
else | |
upstream=${svn_upstream#/} | |
fi | |
elif [[ "svn+git" = "$upstream" ]]; then | |
upstream="@{upstream}" | |
fi | |
;; | |
esac | |
# Find how many commits we are ahead/behind our upstream | |
if [[ -z "$legacy" ]]; then | |
count="$(git rev-list --count --left-right \ | |
"$upstream"...HEAD 2>/dev/null)" | |
else | |
# produce equivalent output to --count for older versions of git | |
local commits | |
if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)" | |
then | |
local commit behind=0 ahead=0 | |
for commit in $commits | |
do | |
case "$commit" in | |
"<"*) ((behind++)) ;; | |
*) ((ahead++)) ;; | |
esac | |
done | |
count="$behind $ahead" | |
else | |
count="" | |
fi | |
fi | |
# calculate the result | |
if [[ -z "$verbose" ]]; then | |
case "$count" in | |
"") # no upstream | |
p="" ;; | |
"0 0") # equal to upstream | |
p="=" ;; | |
"0 "*) # ahead of upstream | |
p=">" ;; | |
*" 0") # behind upstream | |
p="<" ;; | |
*) # diverged from upstream | |
p="<>" ;; | |
esac | |
else | |
case "$count" in | |
"") # no upstream | |
p="" ;; | |
"0 0") # equal to upstream | |
p=" u=" ;; | |
"0 "*) # ahead of upstream | |
p=" u+${count#0 }" ;; | |
*" 0") # behind upstream | |
p=" u-${count% 0}" ;; | |
*) # diverged from upstream | |
p=" u+${count#* }-${count% *}" ;; | |
esac | |
if [[ -n "$count" && -n "$name" ]]; then | |
__git_ps1_upstream_name=$(git rev-parse \ | |
--abbrev-ref "$upstream" 2>/dev/null) | |
if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then | |
p="$p \${__git_ps1_upstream_name}" | |
else | |
p="$p ${__git_ps1_upstream_name}" | |
# not needed anymore; keep user's | |
# environment clean | |
unset __git_ps1_upstream_name | |
fi | |
fi | |
fi | |
} | |
# Helper function that is meant to be called from __git_ps1. It | |
# injects color codes into the appropriate gitstring variables used | |
# to build a gitstring. | |
__git_ps1_colorize_gitstring () | |
{ | |
if [[ -n ${ZSH_VERSION-} ]]; then | |
local c_red='%F{red}' | |
local c_green='%F{green}' | |
local c_lblue='%F{blue}' | |
local c_clear='%f' | |
else | |
# Using \[ and \] around colors is necessary to prevent | |
# issues with command line editing/browsing/completion! | |
local c_red='\[\e[31m\]' | |
local c_green='\[\e[32m\]' | |
local c_lblue='\[\e[1;34m\]' | |
local c_clear='\[\e[0m\]' | |
fi | |
local bad_color=$c_red | |
local ok_color=$c_green | |
local flags_color="$c_lblue" | |
local branch_color="" | |
if [ $detached = no ]; then | |
branch_color="$ok_color" | |
else | |
branch_color="$bad_color" | |
fi | |
c="$branch_color$c" | |
z="$c_clear$z" | |
if [ "$w" = "*" ]; then | |
w="$bad_color$w" | |
fi | |
if [ -n "$i" ]; then | |
i="$ok_color$i" | |
fi | |
if [ -n "$s" ]; then | |
s="$flags_color$s" | |
fi | |
if [ -n "$u" ]; then | |
u="$bad_color$u" | |
fi | |
r="$c_clear$r" | |
} | |
__git_eread () | |
{ | |
local f="$1" | |
shift | |
test -r "$f" && read "$@" <"$f" | |
} | |
# __git_ps1 accepts 0 or 1 arguments (i.e., format string) | |
# when called from PS1 using command substitution | |
# in this mode it prints text to add to bash PS1 prompt (includes branch name) | |
# | |
# __git_ps1 requires 2 or 3 arguments when called from PROMPT_COMMAND (pc) | |
# in that case it _sets_ PS1. The arguments are parts of a PS1 string. | |
# when two arguments are given, the first is prepended and the second appended | |
# to the state string when assigned to PS1. | |
# The optional third parameter will be used as printf format string to further | |
# customize the output of the git-status string. | |
# In this mode you can request colored hints using GIT_PS1_SHOWCOLORHINTS=true | |
__git_ps1 () | |
{ | |
# preserve exit status | |
local exit=$? | |
local pcmode=no | |
local detached=no | |
local ps1pc_start='\u@\h:\w ' | |
local ps1pc_end='\$ ' | |
local printf_format=' (%s)' | |
case "$#" in | |
2|3) pcmode=yes | |
ps1pc_start="$1" | |
ps1pc_end="$2" | |
printf_format="${3:-$printf_format}" | |
# set PS1 to a plain prompt so that we can | |
# simply return early if the prompt should not | |
# be decorated | |
PS1="$ps1pc_start$ps1pc_end" | |
;; | |
0|1) printf_format="${1:-$printf_format}" | |
;; | |
*) return $exit | |
;; | |
esac | |
# ps1_expanded: This variable is set to 'yes' if the shell | |
# subjects the value of PS1 to parameter expansion: | |
# | |
# * bash does unless the promptvars option is disabled | |
# * zsh does not unless the PROMPT_SUBST option is set | |
# * POSIX shells always do | |
# | |
# If the shell would expand the contents of PS1 when drawing | |
# the prompt, a raw ref name must not be included in PS1. | |
# This protects the user from arbitrary code execution via | |
# specially crafted ref names. For example, a ref named | |
# 'refs/heads/$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)' might cause the | |
# shell to execute 'sudo rm -rf /' when the prompt is drawn. | |
# | |
# Instead, the ref name should be placed in a separate global | |
# variable (in the __git_ps1_* namespace to avoid colliding | |
# with the user's environment) and that variable should be | |
# referenced from PS1. For example: | |
# | |
# __git_ps1_foo=$(do_something_to_get_ref_name) | |
# PS1="...stuff...\${__git_ps1_foo}...stuff..." | |
# | |
# If the shell does not expand the contents of PS1, the raw | |
# ref name must be included in PS1. | |
# | |
# The value of this variable is only relevant when in pcmode. | |
# | |
# Assume that the shell follows the POSIX specification and | |
# expands PS1 unless determined otherwise. (This is more | |
# likely to be correct if the user has a non-bash, non-zsh | |
# shell and safer than the alternative if the assumption is | |
# incorrect.) | |
# | |
local ps1_expanded=yes | |
[ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no | |
[ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no | |
local repo_info rev_parse_exit_code | |
repo_info="$(git rev-parse --git-dir --is-inside-git-dir \ | |
--is-bare-repository --is-inside-work-tree \ | |
--short HEAD 2>/dev/null)" | |
rev_parse_exit_code="$?" | |
if [ -z "$repo_info" ]; then | |
return $exit | |
fi | |
local short_sha="" | |
if [ "$rev_parse_exit_code" = "0" ]; then | |
short_sha="${repo_info##*$'\n'}" | |
repo_info="${repo_info%$'\n'*}" | |
fi | |
local inside_worktree="${repo_info##*$'\n'}" | |
repo_info="${repo_info%$'\n'*}" | |
local bare_repo="${repo_info##*$'\n'}" | |
repo_info="${repo_info%$'\n'*}" | |
local inside_gitdir="${repo_info##*$'\n'}" | |
local g="${repo_info%$'\n'*}" | |
if [ "true" = "$inside_worktree" ] && | |
[ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] && | |
[ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] && | |
git check-ignore -q . | |
then | |
return $exit | |
fi | |
local r="" | |
local b="" | |
local step="" | |
local total="" | |
if [ -d "$g/rebase-merge" ]; then | |
__git_eread "$g/rebase-merge/head-name" b | |
__git_eread "$g/rebase-merge/msgnum" step | |
__git_eread "$g/rebase-merge/end" total | |
if [ -f "$g/rebase-merge/interactive" ]; then | |
r="|REBASE-i" | |
else | |
r="|REBASE-m" | |
fi | |
else | |
if [ -d "$g/rebase-apply" ]; then | |
__git_eread "$g/rebase-apply/next" step | |
__git_eread "$g/rebase-apply/last" total | |
if [ -f "$g/rebase-apply/rebasing" ]; then | |
__git_eread "$g/rebase-apply/head-name" b | |
r="|REBASE" | |
elif [ -f "$g/rebase-apply/applying" ]; then | |
r="|AM" | |
else | |
r="|AM/REBASE" | |
fi | |
elif [ -f "$g/MERGE_HEAD" ]; then | |
r="|MERGING" | |
elif [ -f "$g/CHERRY_PICK_HEAD" ]; then | |
r="|CHERRY-PICKING" | |
elif [ -f "$g/REVERT_HEAD" ]; then | |
r="|REVERTING" | |
elif [ -f "$g/BISECT_LOG" ]; then | |
r="|BISECTING" | |
fi | |
if [ -n "$b" ]; then | |
: | |
elif [ -h "$g/HEAD" ]; then | |
# symlink symbolic ref | |
b="$(git symbolic-ref HEAD 2>/dev/null)" | |
else | |
local head="" | |
if ! __git_eread "$g/HEAD" head; then | |
return $exit | |
fi | |
# is it a symbolic ref? | |
b="${head#ref: }" | |
if [ "$head" = "$b" ]; then | |
detached=yes | |
b="$( | |
case "${GIT_PS1_DESCRIBE_STYLE-}" in | |
(contains) | |
git describe --contains HEAD ;; | |
(branch) | |
git describe --contains --all HEAD ;; | |
(describe) | |
git describe HEAD ;; | |
(* | default) | |
git describe --tags --exact-match HEAD ;; | |
esac 2>/dev/null)" || | |
b="$short_sha..." | |
b="($b)" | |
fi | |
fi | |
fi | |
if [ -n "$step" ] && [ -n "$total" ]; then | |
r="$r $step/$total" | |
fi | |
local w="" | |
local i="" | |
local s="" | |
local u="" | |
local c="" | |
local p="" | |
if [ "true" = "$inside_gitdir" ]; then | |
if [ "true" = "$bare_repo" ]; then | |
c="BARE:" | |
else | |
b="GIT_DIR!" | |
fi | |
elif [ "true" = "$inside_worktree" ]; then | |
if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] && | |
[ "$(git config --bool bash.showDirtyState)" != "false" ] | |
then | |
git diff --no-ext-diff --quiet || w="*" | |
git diff --no-ext-diff --cached --quiet || i="+" | |
if [ -z "$short_sha" ] && [ -z "$i" ]; then | |
i="#" | |
fi | |
fi | |
if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] && | |
git rev-parse --verify --quiet refs/stash >/dev/null | |
then | |
s="$" | |
fi | |
if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] && | |
[ "$(git config --bool bash.showUntrackedFiles)" != "false" ] && | |
git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null | |
then | |
u="%${ZSH_VERSION+%}" | |
fi | |
if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then | |
__git_ps1_show_upstream | |
fi | |
fi | |
local z="${GIT_PS1_STATESEPARATOR-" "}" | |
# NO color option unless in PROMPT_COMMAND mode | |
if [ $pcmode = yes ] && [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then | |
__git_ps1_colorize_gitstring | |
fi | |
b=${b##refs/heads/} | |
if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then | |
__git_ps1_branch_name=$b | |
b="\${__git_ps1_branch_name}" | |
fi | |
local f="$w$i$s$u" | |
local gitstring="$c$b${f:+$z$f}$r$p" | |
if [ $pcmode = yes ]; then | |
if [ "${__git_printf_supports_v-}" != yes ]; then | |
gitstring=$(printf -- "$printf_format" "$gitstring") | |
else | |
printf -v gitstring -- "$printf_format" "$gitstring" | |
fi | |
PS1="$ps1pc_start$gitstring$ps1pc_end" | |
else | |
printf -- "$printf_format" "$gitstring" | |
fi | |
return $exit | |
} | |
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1 "\[\033[0;33m\][\[\033[1;36m\]%s\[\033[0;33m\]]")\[\e[0m\]$ ' |
This file contains 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
[fetch] | |
prune = true | |
[push] | |
default = current | |
[branch] | |
autosetuprebase = alway | |
[push] | |
default = current | |
[alias] | |
co = checkout | |
cb = checkout -b | |
ci = commit -m | |
ca = !git add -A . && git status -s && git commit -m | |
s = status -s | |
br = branch | |
unstage = reset . | |
db = !git branch -D $1 && git push --delete origin $1 | |
dlb = !git branch -D $1 | |
drb = !git remote prune origin && git push --delete origin $1 | |
aa = !git add -A . && git status -s | |
pushall = "!git push --all; git push --tags" | |
ct = "!git checkout -b $1 && git push --set-upstream origin $1" | |
ls = !git --no-pager log -10 --date=short --pretty='%C(yellow)%h%Creset - %C(yellow)%an%Creset %C(white)%ad%Creset%C(yellow)%d%Creset %Cgreen%s%Creset' | |
ll = !git log --date=short --pretty='%C(yellow)%h%Creset - %C(yellow)%an%Creset %C(white)%ad%Creset%C(yellow)%d%Creset %Cgreen%s%Creset' | |
lg = log --graph --abbrev-commit --date=relative --pretty='%C(yellow)%h%Creset - %C(yellow)%an%Creset%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' | |
lf = show --pretty=\"format:\" --name-only | |
wtf = reflog | |
rs = remote show origin |
This file contains 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
# This file is generated from information provided by | |
# the datasource. Changes to it will not persist across an instance. | |
# To disable cloud-init's network configuration capabilities, write a file | |
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: | |
# network: {config: disabled} | |
network: | |
ethernets: | |
eth0: | |
addresses: [] | |
dhcp4: true | |
optional: true | |
# needed for windows dhcp server | |
dhcp-identifier: mac | |
version: 2 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment