R3dy / capsulecorp-pentest

Vagrant VirtualBox environment for conducting an internal network penetration test
https://www.manning.com/books/the-art-of-network-penetration-testing?a_aid=royce
804 stars 156 forks source link

ansible issue when launching vagrant provision goku #4

Closed jbyle closed 4 years ago

jbyle commented 4 years ago

Hello,

I am having an issue when launching "vagrant provision goku" Here under is the console log :

I run Windows 10 and installed Vagrant + Virtualbox and Ansible (via CyGwin on Windows) I launched the command in the CyGwin terminal. Do you have any idea what could be the issue ?

$ vagrant provision goku
==> goku: Running provisioner: ansible...
Windows is not officially supported for the Ansible Control Machine.
Please check https://docs.ansible.com/intro_installation.html#control-machine-re
quirements
Vagrant gathered an unknown Ansible version:

and falls back on the compatibility mode '1.8'.

Alternatively, the compatibility mode can be specified in your Vagrantfile:
https://www.vagrantup.com/docs/provisioning/ansible_common.html#compatibility_mo
de
    goku: Running ansible-playbook...
The Ansible software could not be found! Please verify
that Ansible is correctly installed on your host system.

If you haven't installed Ansible yet, please install Ansible
on your host system. Vagrant can't do this for you in a safe and
automated way.
Please check https://docs.ansible.com for more information.

Best regards, Jan

R3dy commented 4 years ago

This is why it is recommend to use WSL instead of Cygwin. Cygwin python + Windows path doesn't play well together.

TLDR you need to create a .bat file somewhere inside the Windows PATH called ansible-playbook.bat with the following contents

@echo off

REM If you used the stand Cygwin installer this will be C:cygwin
set CYGWIN=%USERPROFILE%.babuncygwin

REM You can switch this to work with bash with %CYGWIN%binbash.exe
set SH=%CYGWIN%binzsh.exe

"%SH%" -c "/bin/ansible-playbook %*"

Check this out for more context https://www.azavea.com/blog/2014/10/30/running-vagrant-with-ansible-provisioning-on-windows/

jbyle commented 4 years ago

Hello,

I tried a couple of things. So first CyGwin failed. I noticed in the batch file it was mentioning babuncygwin so I decided to try to install Babun (after removal of CyGwin). I did an install of Babun but at the end the install failed :

za  2 mei 2020 14:30:25
Installing plugin's home [dist]
Installing plugin's home [core]
WARNING: Git push strategy set to  which is unsupported - changing to 'matching'
Installing plugin's home [cygfix]
Installing plugin's home [shell]
Installing plugin's home [pact]
Installing plugin's home [cacert]
Installing plugin's home [oh-my-zsh]
Checking out files: 100% (453/453), done.
HEAD is now at 599831b Merge pull request #4058 from ncanceill/plugin-git
Error on or near line 25, last command 'zsh -c "source ~/.zshrc; rm -f \"$homedir/.zcompdump\"; compinit -u" &> /dev/null';
[babun] Terminating due to internal error #1

I noticed that Babun is not supported anymore.

R3dy commented 4 years ago

Is there a reason you don’t want to try installing Ubuntu with WSL? This would be the preferred method as Cygwin is iffy.

jbyle commented 4 years ago

What do you mean with Ubuntu with WSL ? I have a Windows 10 machine.

R3dy commented 4 years ago

Windows 10 now comes with Ubuntu!

https://docs.microsoft.com/en-us/windows/wsl/install-win10

Read that for more information. The first link I gave you has a tutorial for installing ansible inside Ubuntu (inside windows). This should work better than Cygwin.

jbyle commented 4 years ago

oh, what a nice feature in Windows 10 :-) Didn't know that existed. I just installed Ubuntu as you mentioned. So in short. I now install virtualbox, vagrant and ansible on the Ubuntu ? I have VirtualBox and Vagrant already on my Windows 10 but I suppose I should install it on Ubuntu ?

R3dy commented 4 years ago

Perfect.

My understanding is that Vagrant needs to be installed within WSL but VirtualBox can live in Windows you just need to configure Vagrant properly.

This appears to be a guide to doing exactly what we want. I’m sorry I didn’t find it earlier or I would have suggested it from the start.

https://alchemist.digital/articles/vagrant-ansible-and-virtualbox-on-wsl-windows-subsystem-for-linux/

jbyle commented 4 years ago

Hello,

I have completely set up WSL now and did the configurations. Now when running vagrant, it complains it does not run with the same user (as VirtualBox on my Windows machine) which is correct. Where do I configure this ? I suppose in the Vagrantfile but I have no experience with Vagrant.

See console log here under.

jan@DESKTOP-1N7FUNG:/mnt/d/Jan/Pentesting/capsulecorp-pentest$ vagrant up goku
/opt/vagrant/embedded/gems/2.2.7/gems/vagrant-2.2.7/lib/vagrant/util/which.rb:37: warning: Insecure world writable dir /home/jan/.local/bin in PATH, mode 040777
The VirtualBox VM was created with a user that doesn't match the
current user running Vagrant. VirtualBox requires that the same user
be used to manage the VM that was created. Please re-run Vagrant with
that user. This is not a Vagrant issue.

The UID used to create the VM was: 0
Your UID is: 1000
R3dy commented 4 years ago

This looks like you sudo ran something so your VMs are owned by root. You need to locate the directory where they are contained and change the ownership of the directory recursively using the chown command

Alternatively you could just delete them and recreate them with vagrant destroy and then rerun vagrant up.

I think you’re close!

jbyle commented 4 years ago

Hi again,

I really appreciate your help. Many thanks for your patience. I have no experience with Vagrant nor ansible. In the past I made some vm's with VirtualBox with the GUI. So probably some of my questions will sound silly but that is because of the lack of experience.

So I am further now and getting closer :-) I removed the .vagrant folder. and than did the "vagrant up goku" again with more success but still an issue. See console log here under. I also see on the Virtubal box (Windows) that a vm is created which is good to and indicates the linke betweens wsl vagrant and Window VirtualBox is working

jan@DESKTOP-1N7FUNG:/mnt/d/Jan/Pentesting/capsulecorp-pentest$ vagrant up goku
/opt/vagrant/embedded/gems/2.2.7/gems/vagrant-2.2.7/lib/vagrant/util/which.rb:37: warning: Insecure world writable dir /home/jan/.local/bin in PATH, mode 040777
Bringing machine 'goku' up with 'virtualbox' provider...
==> goku: Importing base box 'royce/capsulecorp-winsrv'...
==> goku: Matching MAC address for NAT networking...
==> goku: Checking if box 'royce/capsulecorp-winsrv' version '0.0.5-alpha' is up to date...
==> goku: There was a problem while downloading the metadata for your box
==> goku: to check for updates. This is not an error, since it is usually due
==> goku: to temporary network problems. This is just a warning. The problem
==> goku: encountered was:
==> goku:
==> goku: Failed to connect to vagrantcloud.com port 443: Connection refused
==> goku:
==> goku: If you want to check for box updates, verify your network connection
==> goku: is valid and try again.
==> goku: Setting the name of the VM: capsulecorp-pentest_goku_1588446286243_7502
==> goku: Clearing any previously set network interfaces...
==> goku: Preparing network interfaces based on configuration...
    goku: Adapter 1: nat
    goku: Adapter 2: hostonly
==> goku: Forwarding ports...
    goku: 3389 (guest) => 3389 (host) (adapter 1)
    goku: 5985 (guest) => 55985 (host) (adapter 1)
    goku: 5986 (guest) => 55986 (host) (adapter 1)
    goku: 22 (guest) => 2222 (host) (adapter 1)
==> goku: Booting VM...
==> goku: Waiting for machine to boot. This may take a few minutes...
    goku: WinRM address: 127.0.0.1:55985
    goku: WinRM username: vagrant
    goku: WinRM execution_time_limit: PT2H
    goku: WinRM transport: negotiate
==> goku: Machine booted and ready!
==> goku: Checking for guest additions in VM...
    goku: The guest additions on this VM do not match the installed version of
    goku: VirtualBox! In most cases this is fine, but in rare cases it can
    goku: prevent things such as shared folders from working properly. If you see
    goku: shared folder errors, please make sure the guest additions within the
    goku: virtual machine match the version of VirtualBox you have installed on
    goku: your host and reload your VM.
    goku:
    goku: Guest Additions Version: 6.0.18
    goku: VirtualBox Version: 5.2
==> goku: Configuring and enabling network interfaces...
==> goku: Mounting shared folders...
    goku: /vagrant => /mnt/d/Jan/Pentesting/capsulecorp-pentest
==> goku: Running provisioner: ansible...
Vagrant has automatically selected the compatibility mode '2.0'
according to the Ansible version installed (2.9.7).

Alternatively, the compatibility mode can be specified in your Vagrantfile:
https://www.vagrantup.com/docs/provisioning/ansible_common.html#compatibility_mode

    goku: Running ansible-playbook...

PLAY [goku] ********************************************************************

TASK [Gathering Facts] *********************************************************
fatal: [goku]: FAILED! => {"msg": "winrm or requests is not installed: No module named winrm"}

PLAY RECAP *********************************************************************
goku                       : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.
R3dy commented 4 years ago

This is great. Looks like it’s all working. That error means your missing pywinrm which needs to be installed via pip.

https://github.com/R3dy/capsulecorp-pentest/wiki/MacOS-Setup-Guide

Check the ansible section

jbyle commented 4 years ago

Here is the console of the provision part of goku. Is this the expected result ? Took a very long time to complete.

jan@DESKTOP-1N7FUNG:/mnt/d/Jan/Pentesting/capsulecorp-pentest$ vagrant provision goku
/opt/vagrant/embedded/gems/2.2.7/gems/vagrant-2.2.7/lib/vagrant/util/which.rb:37: warning: Insecure world writable dir /home/jan/.local/bin in PATH, mode 040777
==> goku: Running provisioner: ansible...
Vagrant has automatically selected the compatibility mode '2.0'
according to the Ansible version installed (2.9.7).

Alternatively, the compatibility mode can be specified in your Vagrantfile:
https://www.vagrantup.com/docs/provisioning/ansible_common.html#compatibility_mode

    goku: Running ansible-playbook...

PLAY [goku] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [goku]

TASK [promotedc : Change hostname to goku] *************************************
changed: [goku]

TASK [promotedc : Install Active Directory Services] ***************************
changed: [goku]

TASK [promotedc : Promote goku to domain controller] ***************************
changed: [goku]

TASK [promotedc : Reboot after promotion and wait for "Applying computer settings" to finish] ***
fatal: [goku]: FAILED! => {"changed": false, "elapsed": 1215, "msg": "Timed out waiting for post-reboot test command (timeout=600)", "rebooted": true}

PLAY RECAP *********************************************************************
goku                       : ok=4    changed=3    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.
R3dy commented 4 years ago

Yes try to rerun the provision.

What's happening is after promoting the server to a DC it hangs on reboot sometimes for a really long time.

I haven't figured out a proper way to verify that the reboot is complete so I put a 600 second timeout. sometimes it works sometimes it doesn't but if you retry vagrant provision goku maybe 1 or 2 more times it should work.

Once Goku is up the other servers should come up without issues

jbyle commented 4 years ago

Hello,

I am having the following error now when launching gohan. I suppose I need to create a Vagrant account to solve this ?

What is the warning (first line) ?

jan@DESKTOP-1N7FUNG:/mnt/d/Jan/Pentesting/capsulecorp-pentest$ vagrant up gohan
/opt/vagrant/embedded/gems/2.2.7/gems/vagrant-2.2.7/lib/vagrant/util/which.rb:37: warning: Insecure world writable dir /home/jan/.local/bin in PATH, mode 040777
Bringing machine 'gohan' up with 'virtualbox' provider...
==> gohan: Box 'royce/capsulecorp-winsrv' could not be found. Attempting to find and install...
    gohan: Box Provider: virtualbox
    gohan: Box Version: 0.0.7-alpha-dc-member
The box 'royce/capsulecorp-winsrv' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Vagrant Cloud, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://vagrantcloud.com/royce/capsulecorp-winsrv"]
Error: Failed to connect to vagrantcloud.com port 443: Connection refused
R3dy commented 4 years ago

You do not need an account to download the VM it’s public. In fact the same URL was already used to download Goku.

This is either an error with Vagrant’s external web server. In that case I would say just keep trying until it succeeds.

Or an error on your side blocking the request which would be strange since it worked once before.

What if you just try the URL in a browser?

jbyle commented 4 years ago

Hello,

https://vagrantcloud.com/royce/capsulecorp-winsrv via the browser works. But I notice dns changed it to https://app.vagrantup.com/royce/boxes/capsulecorp-winsrv . But I cannot even ping to both hostnames in Ubuntu. I am able to ping www.google.com so I can get out with requests. So I cannot connect to that URL. I already tried many times. It is strange.

jbyle commented 4 years ago

Just did another test for troubleshooting. I launched an Amazon aws Ubunu server 18:04 and did a curl. Both respond. So on the WLS Ubuntu there is an access issue when trying to contact https://app.vagrantup.com/royce/boxes/capsulecorp-winsrv but as I said in previous post. I am able to do a curl to www.google.com. So it smells an access issue from the Ubuntu terminal towards vagrantcloud.com.

jbyle commented 4 years ago

Now that I brought up Amazon AWS. Would it be a interesting plan B to set up an Ubuntu server on Amazon to launch the VM's ? If positive, what amount of diskspace would I have to foresee to run all the vm's ? Are we talking about 20GB or 30GB ?

R3dy commented 4 years ago

Can you post the contents your ~/.bashrc file here

Also post the contents of set

use three ticks "```" to place them inside code tags

like this
jbyle commented 4 years ago

Hello, here is the .bashrc

jan@DESKTOP-1N7FUNG:~$ cat .bashrc


# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi
export PATH="${PATH}:/home/jan/.local/bin"
export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
export PATH="${PATH}:/mnt/c/Program Files/Oracle/VirtualBox" ```
R3dy commented 4 years ago

Could you also post the result of the set command Trying to see if you have a HTTP_PROXY var set somewhere, that could cause the behavior you're experiencing.

jbyle commented 4 years ago

Here is the set BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_COMPLETION_VERSINFO=([0]="2" [1]="8") BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="4" [1]="4" [2]="20" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") BASH_VERSION='4.4.20(1)-release' COLUMNS=120 DIRSTACK=() EUID=1000 GROUPS=() HISTCONTROL=ignoreboth HISTFILE=/home/jan/.bash_history HISTFILESIZE=2000 HISTSIZE=1000 HOME=/home/jan HOSTNAME=DESKTOP-1N7FUNG HOSTTYPE=x86_64 IFS=$' \t\n' LANG=C.UTF-8 LESSCLOSE='/usr/bin/lesspipe %s %s' LESSOPEN='| /usr/bin/lesspipe %s' LINES=30 LOGNAME=jan LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:.tar=01;31:.tgz=01;31:.arc=01;31:.arj=01;31:.taz=01;31:.lha=01;31:.lz4=01;31:.lzh=01;31:.lzma=01;31:.tlz=01;31:.txz=01;31:.tzo=01;31:.t7z=01;31:.zip=01;31:.z=01;31:.Z=01;31:.dz=01;31:.gz=01;31:.lrz=01;31:.lz=01;31:.lzo=01;31:.xz=01;31:.zst=01;31:.tzst=01;31:.bz2=01;31:.bz=01;31:.tbz=01;31:.tbz2=01;31:.tz=01;31:.deb=01;31:.rpm=01;31:.jar=01;31:.war=01;31:.ear=01;31:.sar=01;31:.rar=01;31:.alz=01;31:.ace=01;31:.zoo=01;31:.cpio=01;31:.7z=01;31:.rz=01;31:.cab=01;31:.wim=01;31:.swm=01;31:.dwm=01;31:.esd=01;31:.jpg=01;35:.jpeg=01;35:.mjpg=01;35:.mjpeg=01;35:.gif=01;35:.bmp=01;35:.pbm=01;35:.pgm=01;35:.ppm=01;35:.tga=01;35:.xbm=01;35:.xpm=01;35:.tif=01;35:.tiff=01;35:.png=01;35:.svg=01;35:.svgz=01;35:.mng=01;35:.pcx=01;35:.mov=01;35:.mpg=01;35:.mpeg=01;35:.m2v=01;35:.mkv=01;35:.webm=01;35:.ogm=01;35:.mp4=01;35:.m4v=01;35:.mp4v=01;35:.vob=01;35:.qt=01;35:.nuv=01;35:.wmv=01;35:.asf=01;35:.rm=01;35:.rmvb=01;35:.flc=01;35:.avi=01;35:.fli=01;35:.flv=01;35:.gl=01;35:.dl=01;35:.xcf=01;35:.xwd=01;35:.yuv=01;35:.cgm=01;35:.emf=01;35:.ogv=01;35:.ogx=01;35:.aac=00;36:.au=00;36:.flac=00;36:.m4a=00;36:.mid=00;36:.midi=00;36:.mka=00;36:.mp3=00;36:.mpc=00;36:.ogg=00;36:.ra=00;36:.wav=00;36:.oga=00;36:.opus=00;36:.spx=00;36:.xspf=00;36:' MACHTYPE=x86_64-pc-linux-gnu MAILCHECK=60 NAME=DESKTOP-1N7FUNG OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH='/home/jan/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program Files/WindowsApps/CanonicalGroupLimited.Ubuntu18.04onWindows_1804.2020.423.0_x6479rhkp1fndgsc:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/c/Program Files/Intel/WiFi/bin/:/mnt/c/Program Files/Common Files/Intel/WirelessCommon/:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files (x86)/Common Files/Acronis/VirtualFile/:/mnt/c/Program Files (x86)/Common Files/Acronis/VirtualFile64/:/mnt/c/Program Files (x86)/Common Files/Acronis/FileProtector/:/mnt/c/Program Files (x86)/Common Files/Acronis/FileProtector64/:/mnt/c/Program Files (x86)/Common Files/Acronis/SnapAPI/:/mnt/c/Program Files/NVIDIA Corporation/NVIDIA NvDLISR:/mnt/c/Program Files/PuTTY/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/Oracle/VirtualBox:/mnt/c/cygwin64/bin:/mnt/c/Users/Jan/AppData/Local/Microsoft/WindowsApps:/snap/bin:/home/jan/.local/bin:/mnt/c/Program Files/Oracle/VirtualBox' PIPESTATUS=([0]="0") PPID=7 PS1='[\e]0;\u@\h: \w\a]${debian_chroot:+($debian_chroot)}[\033[01;32m]\u@\h[\033[00m]:[\033[01;34m]\w[\033[00m]\$ ' PS2='> ' PS4='+ ' PWD=/home/jan SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 TERM=xterm-256color UID=1000 USER=jan VAGRANT_WSL_ENABLE_WINDOWS_ACCESS=1 WSLENV= WSL_DISTRO_NAME=Ubuntu-18.04 WSL_INTEGRATION_CACHE=/home/jan/.cache/wslu/integration XDG_DATADIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop =clear __git_printf_supports_v=yes _backup_glob='@(##|@(~|.@(bak|orig|rej|swp|dpkg|rpm@(orig|new|save))))' _xspecs=([freeamp]="!.@(mp3|og[ag]|pls|m3u)" [bibtex]="!.aux" [lualatex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [chromium-browser]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL])|[pP][dD][fF])" [tex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [zathura]="!.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)" [lrunzip]="!.lrz" [amaya]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [hbpp]="!.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lzgrep]="!.@(tlz|lzma)" [ggv]="!.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [lzless]="!.@(tlz|lzma)" [loimpress]="!.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [kdvi]="!.@(dvi|DVI)?(.@(gz|Z|bz2))" [lobase]="!.odb" [lbzcat]="!.?(t)bz?(2)" [lilypond]="!.ly" [sxemacs]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [epdfview]="!.pdf" [localc]="!.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [texi2dvi]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [ps2pdf12]="!.@(?(e)ps|pdf)" [ee]="!.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)" [lbunzip2]="!.?(t)bz?(2)" [ps2pdf13]="!.@(?(e)ps|pdf)" [ps2pdf14]="!.@(?(e)ps|pdf)" [lzfgrep]="!.@(tlz|lzma)" [hbrun]="!.[Hh][Rr][Bb]" [kbabel]="!.po" [rview]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kaffeine]="!@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.part)" [xv]="!.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)" [rgvim]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [oodraw]="!.@(sxd|std|sda|sdd|?(f)odg|otg)" [elinks]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [playmidi]="!.@(mid?(i)|cmf)" [xine]="!@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.part)" [xpdf]="!.@(pdf|fdf)?(.@(gz|GZ|bz2|BZ2|Z))" [aviplay]="!.@(avi|asf|wmv)" [latex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lodraw]="!.@(sxd|std|sda|sdd|?(f)odg|otg)" [rvim]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [ogg123]="!.@(og[ag]|m3u|flac|spx)" [ps2pdfwr]="!.@(?(e)ps|pdf)" [harbour]="!.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lomath]="!.@(sxm|smf|mml|odf)" [xemacs]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [unlzma]="!.@(tlz|lzma)" [lowriter]="!.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [vi]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xetex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gvim]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kid3-qt]="!.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [xanim]="!.@(mpg|mpeg|avi|mov|qt)" [portecle]="!@(.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)" [oocalc]="!.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [emacs]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [fbxine]="!@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.part)" [kpdf]="!.@(?(e)ps|pdf)" [oomath]="!.@(sxm|smf|mml|odf)" [compress]=".Z" [iceweasel]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL])|[pP][dD][fF])" [zcat]="!.@(Z|[gGd]z|t[ag]z)" [unzip]="!.@(zip|[egjsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz)" [modplug123]="!.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [dvipdfm]="!.dvi" [oobase]="!.odb" [zipinfo]="!.@(zip|[egjsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz)" [epiphany]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [galeon]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [bzme]="!.@(zip|z|gz|tgz)" [xfig]="!.fig" [xdvi]="!.@(dvi|DVI)?(.@(gz|Z|bz2))" [cdiff]="!.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))" [rgview]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [oowriter]="!.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [netscape]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [acroread]="!.[pf]df" [makeinfo]="!.texi" [kwrite]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [gview]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [qiv]="!.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)" [bzcat]="!.?(t)bz?(2)" [pdftex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [rpm2cpio]="!.[rs]pm" [view]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [unxz]="!.@(?(t)xz|tlz|lzma)" [ly2dvi]="!.ly" [mozilla]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [modplugplay]="!.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [dillo]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [aaxine]="!@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.part)" [dvipdfmx]="!.dvi" [advi]="!.dvi" [lzmore]="!.@(tlz|lzma)" [poedit]="!.po" [firefox]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL])|[pP][dD][fF])" [gv]="!.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [madplay]="!.mp3" [gtranslator]="!.po" [jadetex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gpdf]="!.[pf]df" [kghostview]="!.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [pbzcat]="!.?(t)bz?(2)" [lzcat]="!.@(tlz|lzma)" [vim]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dvips]="!.dvi" [pdfunite]="!.pdf" [dvitype]="!.dvi" [realplay]="!.@(rm?(j)|ra?(m)|smi?(l))" [gqmpeg]="!.@(mp3|og[ag]|pls|m3u)" [xelatex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lzegrep]="!.@(tlz|lzma)" [bunzip2]="!.?(t)bz?(2)" [znew]=".Z" [lokalize]="!.po" [kate]=".@([ao]|so|so.!(conf|/)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dragon]="!@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.part)" [pdflatex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [mozilla-firefox]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL])|[pP][dD][fF])" [ooimpress]="!.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [uncompress]="!.Z" [unpigz]="!.@(Z|[gGdz]z|t[ag]z)" [luatex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lynx]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [ps2pdf]="!.@(?(e)ps|pdf)" [mpg321]="!.mp3" [mpg123]="!.mp3" [pbunzip2]="!.?(t)bz?(2)" [kid3]="!.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [pdfjadetex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [dvipdf]="!.dvi" [gharbour]="!.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [texi2html]="!.texi" [gunzip]="!.@(Z|[gGd]z|t[ag]z)" [google-chrome]="!.@(?([xX]|[sS])[hH][tT][mM]?([lL])|[pP][dD][fF])" [okular]="!.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2)))" [slitex]="!.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [xzcat]="!.@(?(t)xz|tlz|lzma)" [timidity]="!.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)" [dviselect]="!.dvi" ) snap_bin_path=/snap/bin snap_xdg_path=/var/lib/snapd/desktop __expand_tilde_by_ref () { if [[ ${!1} == \~* ]]; then eval $1=$(printf ~%q "${!1#\~}"); fi } get_cword_at_cursor_by_ref () { local cword words=(); reassemble_comp_words_by_ref "$1" words cword; local i cur index=$COMP_POINT lead=${COMP_LINE:0:$COMP_POINT}; if [[ $index -gt 0 && ( -n $lead && -n ${lead//[[:space:]]} ) ]]; then cur=$COMP_LINE; for ((i = 0; i <= cword; ++i )) do while [[ ${#cur} -ge ${#words[i]} && "${cur:0:${#words[i]}}" != "${words[i]}" ]]; do cur="${cur:1}"; [[ $index -gt 0 ]] && ((index--)); done; if [[ $i -lt $cword ]]; then local old_size=${#cur}; cur="${cur#"${words[i]}"}"; local new_size=${#cur}; index=$(( index - old_size + new_size )); fi; done; [[ -n $cur && ! -n ${cur//[[:space:]]} ]] && cur=; [[ $index -lt 0 ]] && index=0; fi; local "$2" "$3" "$4" && _upvars -a${#words[@]} $2 "${words[@]}" -v $3 "$cword" -v $4 "${cur:0:$index}" } __git_eread () { test -r "$1" && IFS=' ' read "$2" < "$1" } git_ps1 () { 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}"; PS1="$ps1pc_start$ps1pc_end" ;; 0 | 1) printf_format="${1:-$printf_format}" ;; ) return $exit ;; esac; 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## }"; repo_info="${repo_info% }"; fi; local inside_worktree="${repo_info## }"; repo_info="${repo_info% }"; local bare_repo="${repo_info## }"; repo_info="${repo_info% }"; local inside_gitdir="${repo_info## }"; local g="${repo_info% }"; 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"; else if [ -f "$g/rebase-apply/applying" ]; then r="|AM"; else r="|AM/REBASE"; fi; fi; else if [ -f "$g/MERGE_HEAD" ]; then r="|MERGING"; else if [ -f "$g/CHERRY_PICK_HEAD" ]; then r="|CHERRY-PICKING"; else if [ -f "$g/REVERT_HEAD" ]; then r="|REVERTING"; else if [ -f "$g/BISECT_LOG" ]; then r="|BISECTING"; fi; fi; fi; fi; fi; if [ -n "$b" ]; then :; else if [ -h "$g/HEAD" ]; then b="$(git symbolic-ref HEAD 2>/dev/null)"; else local head=""; if ! __git_eread "$g/HEAD" head; then return $exit; fi; 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 ;; (tag) git describe --tags HEAD ;; (describe) git describe HEAD ;; ( | default) git describe --tags --exact-match HEAD ;; esac 2>/dev/null)" || b="$short_sha..."; b="($b)"; fi; 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; else if [ "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; fi; local z="${GIT_PS1_STATESEPARATOR-" "}"; 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 } 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 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_ps1_show_upstream () { local key value; local svn_remote svn_url_pattern count n; local upstream=git legacy="" verbose="" name=""; svn_remote=(); 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 ;; esac; done <<< "$output"; 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; case "$upstream" in git) upstream="@{upstream}" ;; svn) 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 upstream=${GIT_SVN_ID:-git-svn}; else upstream=${svn_upstream#/}; fi; else if [[ "svn+git" = "$upstream" ]]; then upstream="@{upstream}"; fi; fi ;; esac; if [[ -z "$legacy" ]]; then count="$(git rev-list --count --left-right "$upstream"...HEAD 2>/dev/null)"; else 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; if [[ -z "$verbose" ]]; then case "$count" in "") p="" ;; "0 0") p="=" ;; "0 ") p=">" ;; " 0") p="<" ;; ) p="<>" ;; esac; else case "$count" in "") p="" ;; "0 0") p=" u=" ;; "0 ") p=" u+${count#0 }" ;; " 0") p=" u-${count% 0}" ;; ) 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}"; unset __git_ps1_upstream_name; fi; fi; fi } load_completion () { local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions); local OIFS=$IFS IFS=: dir cmd="${1##/}" compfile; for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}; do dirs+=($dir/bash-completion/completions); done; IFS=$OIFS; if [[ $BASH_SOURCE == / ]]; then dirs+=("${BASHSOURCE%/*}/completions"); else dirs+=(./completions); fi; for dir in "${dirs[@]}"; do for compfile in "$cmd" "$cmd.bash" "$cmd"; do compfile="$dir/$compfile"; [[ -f "$compfile" ]] && . "$compfile" &> /dev/null && return 0; done; done; [[ -n "${_xspecs[$cmd]}" ]] && complete -F _filedir_xspec "$cmd" && return 0; return 1 } ltrim_colon_completions () { if [[ "$1" == : && "$COMP_WORDBREAKS" == : ]]; then local colon_word=${1%"${1##:}"}; local i=${#COMPREPLY[]}; while [[ $((--i)) -ge 0 ]]; do COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}; done; fi } parse_options () { local option option2 i IFS=' ,/|'; option=; local -a array; read -a array <<< "$1"; for i in "${array[@]}"; do case "$i" in ---) break ;; --?) option=$i; break ;; -?) [[ -n $option ]] || option=$i ;; ) break ;; esac; done; [[ -n $option ]] || return; IFS=' '; if [[ $option =~ ([((no|dont)-?)]). ]]; then option2=${option/"${BASH_REMATCH[1]}"/}; option2=${option2%%[<{().[]}; printf '%s\n' "${option2/=/=}"; option=${option/"${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]}"}; fi; option=${option%%[<{().[]}; printf '%s\n' "${option/=/=}" } reassemble_comp_words_by_ref () { local exclude i j line ref; if [[ -n $1 ]]; then exclude="${1//[^$COMP_WORDBREAKS]}"; fi; printf -v "$3" %s "$COMP_CWORD"; if [[ -n $exclude ]]; then line=$COMP_LINE; for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)) do while [[ $i -gt 0 && ${COMP_WORDS[$i]} == +([$exclude]) ]]; do [[ $line != [[:blank:]] ]] && (( j >= 2 )) && ((j--)); ref="$2[$j]"; printf -v "$ref" %s "${!ref}${COMP_WORDS[i]}"; [[ $i == $COMP_CWORD ]] && printf -v "$3" %s "$j"; line=${line#"${COMP_WORDS[$i]}"}; [[ $line == [[:blank:]] ]] && ((j++)); (( $i < ${#COMP_WORDS[@]} - 1)) && ((i++)) || break 2; done; ref="$2[$j]"; printf -v "$ref" %s "${!ref}${COMP_WORDS[i]}"; line=${line#"${COMP_WORDS[i]}"}; [[ $i == $COMP_CWORD ]] && printf -v "$3" %s "$j"; done; [[ $i == $COMP_CWORD ]] && printf -v "$3" %s "$j"; else for i in ${!COMP_WORDS[@]}; do printf -v "$2[i]" %s "${COMP_WORDS[i]}"; done; fi } _allowed_groups () { if _complete_as_root; then local IFS=' '; COMPREPLY=($( compgen -g -- "$1" )); else local IFS=' '; COMPREPLY=($( compgen -W "$( id -Gn 2>/dev/null || groups 2>/dev/null )" -- "$1" )); fi } _allowed_users () { if _complete_as_root; then local IFS=' '; COMPREPLY=($( compgen -u -- "${1:-$cur}" )); else local IFS=' '; COMPREPLY=($( compgen -W "$( id -un 2>/dev/null || whoami 2>/dev/null )" -- "${1:-$cur}" )); fi } _apport-bug () { local cur dashoptions prev param; COMPREPLY=(); cur=_get_cword; prev=${COMP_WORDS[COMP_CWORD-1]}; dashoptions='-h --help --save -v --version --tag -w --window'; case "$prev" in ubuntu-bug | apport-bug) case "$cur" in -) COMPREPLY=($( compgen -W "$dashoptions" -- $cur )) ;; ) _apport_parameterless ;; esac ;; --save) COMPREPLY=($( compgen -o default -G "$cur" )) ;; -w | --window) dashoptions="--save --tag"; COMPREPLY=($( compgen -W "$dashoptions" -- $cur )) ;; -h | --help | -v | --version | --tag) return 0 ;; ) dashoptions="--tag"; if ! [[ "${COMP_WORDS[]}" =~ .--save. ]]; then dashoptions="--save $dashoptions"; fi; if ! [[ "${COMP_WORDS[]}" =~ .--window. || "${COMP_WORDS[]}" =~ .\ -w\ . ]]; then dashoptions="-w --window $dashoptions"; fi; case "$cur" in -) COMPREPLY=($( compgen -W "$dashoptions" -- $cur )) ;; ) _apport_parameterless ;; esac ;; esac } _apport-cli () { local cur dashoptions prev param; COMPREPLY=(); cur=_get_cword; prev=${COMP_WORDS[COMP_CWORD-1]}; dashoptions='-h --help -f --file-bug -u --update-bug -s --symptom \ -c --crash-file --save -v --version --tag -w --window'; case "$prev" in apport-cli) case "$cur" in -) COMPREPLY=($( compgen -W "$dashoptions" -- $cur )) ;; ) _apport_parameterless ;; esac ;; -f | --file-bug) param="-P --pid -p --package -s --symptom"; COMPREPLY=($( compgen -W "$param $(_apport_symptoms)" -- $cur)) ;; -s | --symptom) COMPREPLY=($( compgen -W "$(_apport_symptoms)" -- $cur)) ;; --save) COMPREPLY=($( compgen -o default -G "$cur" )) ;; -c | --crash-file) COMPREPLY=($( compgen -G "${cur}.apport" compgen -G "${cur}.crash" )) ;; -w | --window) dashoptions="--save --tag"; COMPREPLY=($( compgen -W "$dashoptions" -- $cur )) ;; -h | --help | -v | --version | --tag) return 0 ;; ) dashoptions='--tag'; if ! [[ "${COMP_WORDS[]}" =~ .--save. ]]; then dashoptions="--save $dashoptions"; fi; if ! [[ "${COMP_WORDS[]}" =~ .--window. || "${COMP_WORDS[]}" =~ .\ -w\ . ]]; then dashoptions="-w --window $dashoptions"; fi; if ! [[ "${COMP_WORDS[]}" =~ .--symptom. || "${COMP_WORDS[]}" =~ .\ -s\ . ]]; then dashoptions="-s --symptom $dashoptions"; fi; if ! [[ "${COMP_WORDS[]}" =~ .--update. || "${COMP_WORDS[]}" =~ .\ -u\ . ]]; then dashoptions="-u --update $dashoptions"; fi; if ! [[ "${COMP_WORDS[]}" =~ .--file-bug. || "${COMP_WORDS[]}" =~ .\ -f\ . ]]; then dashoptions="-f --file-bug $dashoptions"; fi; if ! [[ "${COMP_WORDS[]}" =~ .--crash-file. || "${COMP_WORDS[]}" =~ .\ -c\ . ]]; then dashoptions="-c --crash-file $dashoptions"; fi; case "$cur" in -) COMPREPLY=($( compgen -W "$dashoptions" -- $cur )) ;; ) _apport_parameterless ;; esac ;; esac } _apport-collect () { local cur prev; COMPREPLY=(); cur=_get_cword; prev=${COMP_WORDS[COMP_CWORD-1]}; case "$prev" in apport-collect) COMPREPLY=($( compgen -W "-p --package --tag" -- $cur)) ;; -p | --package) COMPREPLY=($( apt-cache pkgnames $cur 2> /dev/null )) ;; --tag) return 0 ;; ) if [[ "${COMP_WORDS[]}" =~ .\ -p. || "${COMP_WORDS[]}" =~ .--package. ]]; then COMPREPLY=($( compgen -W "--tag" -- $cur)); else COMPREPLY=($( compgen -W "-p --package --tag" -- $cur)); fi ;; esac } _apport-unpack () { local cur prev; COMPREPLY=(); cur=_get_cword; prev=${COMP_WORDS[COMP_CWORD-1]}; case "$prev" in apport-unpack) COMPREPLY=($( compgen -G "${cur}.apport" compgen -G "${cur}.crash" )) ;; esac } _apport_parameterless () { local param; param="$dashoptions $( apt-cache pkgnames $cur 2> /dev/null ) $( command ps axo pid | sed 1d ) $( _apport_symptoms ) $( compgen -G "${cur}" )"; COMPREPLY=($( compgen -W "$param" -- $cur)) } _apportsymptoms () { local syms; if [ -r /usr/share/apport/symptoms ]; then for FILE in $(ls /usr/share/apport/symptoms); do if [[ ! "$FILE" =~ ^. && -n $(egrep "^def run\s(.):" /usr/share/apport/symptoms/$FILE) ]]; then syms="$syms ${FILE%.py}"; fi; done; fi; echo $syms } _available_interfaces () { local PATH=$PATH:/sbin; COMPREPLY=($( { if [[ ${1:-} == -w ]]; then iwconfig elif [[ ${1:-} == -a ]]; then ifconfig || ip link show up else ifconfig -a || ip link show fi } 2>/dev/null | awk '/^[^ \t]/ { if ($1 ~ /^[0-9]+:/) { print $2 } else { print $1 } }' )); COMPREPLY=($( compgen -W '${COMPREPLY[@]/%[[:punct:]]/}' -- "$cur" )) } _cd () { local cur prev words cword; _init_completion || return; local IFS=' ' i j k; compopt -o filenames; if [[ -z "${CDPATH:-}" || "$cur" == ?(.)?(.)/ ]]; then _filedir -d; return; fi; local -r mark_dirs=$(_rl_enabled mark-directories && echo y); local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y); for i in ${CDPATH//:/' '}; do k="${#COMPREPLY[@]}"; for j in $( compgen -d -- $i/$cur ); do if [[ ( -n $mark_symdirs && -h $j || -n $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then j+="/"; fi; COMPREPLY[k++]=${j#$i/}; done; done; _filedir -d; if [[ ${#COMPREPLY[@]} -eq 1 ]]; then i=${COMPREPLY[0]}; if [[ "$i" == "$cur" && $i != "/" ]]; then COMPREPLY[0]="${i}/"; fi; fi; return } _cd_devices () { COMPREPLY+=($( compgen -f -d -X "!/?([amrs])cd" -- "${cur:-/dev/}" )) } _command () { local offset i; offset=1; for ((i=1; i <= COMP_CWORD; i++ )) do if [[ "${COMP_WORDS[i]}" != - ]]; then offset=$i; break; fi; done; _command_offset $offset } _command_offset () { local word_offset=$1 i j; for ((i=0; i < $word_offset; i++ )) do for ((j=0; j <= ${#COMP_LINE}; j++ )) do [[ "$COMP_LINE" == "${COMP_WORDS[i]}" ]] && break; COMP_LINE=${COMP_LINE:1}; ((COMP_POINT--)); done; COMP_LINE=${COMP_LINE#"${COMP_WORDS[i]}"}; ((COMP_POINT-=${#COMP_WORDS[i]})); done; for ((i=0; i <= COMP_CWORD - $word_offset; i++ )) do COMP_WORDS[i]=${COMP_WORDS[i+$word_offset]}; done; for ((i; i <= COMP_CWORD; i++ )) do unset 'COMP_WORDS[i]'; done; ((COMP_CWORD -= $word_offset)); COMPREPLY=(); local cur; _get_comp_words_by_ref cur; if [[ $COMP_CWORD -eq 0 ]]; then local IFS=' '; compopt -o filenames; COMPREPLY=($( compgen -d -c -- "$cur" )); else local cmd=${COMP_WORDS[0]} compcmd=${COMP_WORDS[0]}; local cspec=$( complete -p $cmd 2>/dev/null ); if [[ ! -n $cspec && $cmd == / ]]; then cspec=$( complete -p ${cmd##/} 2>/dev/null ); [[ -n $cspec ]] && compcmd=${cmd##/}; fi; if [[ ! -n $cspec ]]; then compcmd=${cmd##/}; _completion_loader $compcmd; cspec=$( complete -p $compcmd 2>/dev/null ); fi; if [[ -n $cspec ]]; then if [[ ${cspec# -F } != $cspec ]]; then local func=${cspec#-F }; func=${func%% }; if [[ ${#COMP_WORDS[@]} -ge 2 ]]; then $func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}" "${COMP_WORDS[${#COMP_WORDS[@]}-2]}"; else $func $cmd "${COMP_WORDS[${#COMP_WORDS[@]}-1]}"; fi; local opt; while [[ $cspec == " -o " ]]; do cspec=${cspec#-o }; opt=${cspec%% }; compopt -o $opt; cspec=${cspec#$opt}; done; else cspec=${cspec#complete}; cspec=${cspec%%$compcmd}; COMPREPLY=($( eval compgen "$cspec" -- '$cur' )); fi; else if [[ ${#COMPREPLY[@]} -eq 0 ]]; then _minimal; fi; fi; fi } _complete_as_root () { [[ $EUID -eq 0 || -n ${root_command:-} ]] } _completion_loader () { local cmd="${1:-EmptycmD}"; __load_completion "$cmd" && return 124; complete -F _minimal -- "$cmd" && return 124 } _configured_interfaces () { if [[ -f /etc/debian_version ]]; then COMPREPLY=($( compgen -W "$( command sed -ne 's|^iface ([^ ]{1,}).$|\1|p' /etc/network/interfaces /etc/network/interfaces.d/ 2>/dev/null )" -- "$cur" )); else if [[ -f /etc/SuSE-release ]]; then COMPREPLY=($( compgen -W "$( printf '%s\n' /etc/sysconfig/network/ifcfg- | command sed -ne 's|.ifcfg-([^].)$|\1|p' )" -- "$cur" )); else if [[ -f /etc/pld-release ]]; then COMPREPLY=($( compgen -W "$( command ls -B /etc/sysconfig/interfaces | command sed -ne 's|.ifcfg-([^].)$|\1|p' )" -- "$cur" )); else COMPREPLY=($( compgen -W "$( printf '%s\n' /etc/sysconfig/network-scripts/ifcfg- | command sed -ne 's|.ifcfg-([^].)$|\1|p' )" -- "$cur" )); fi; fi; fi } _count_args () { local i cword words; reassemble_comp_words_by_ref "$1" words cword; args=1; for i in "${words[@]:1:cword-1}"; do [[ "$i" != - ]] && args=$(($args+1)); done } _dvd_devices () { COMPREPLY+=($( compgen -f -d -X "!/?(r)dvd" -- "${cur:-/dev/}" )) } _expand () { if [[ "$cur" == \~/ ]]; then __expand_tilde_by_ref cur; else if [[ "$cur" == \~ ]]; then _tilde "$cur" || eval COMPREPLY[0]=$(printf ~%q "${COMPREPLY[0]#\~}"); return ${#COMPREPLY[@]}; fi; fi } _filedir () { local IFS=' '; _tilde "$cur" || return; local -a toks; local x tmp; x=$( compgen -d -- "$cur" ) && while read -r tmp; do toks+=("$tmp"); done <<< "$x"; if [[ "$1" != -d ]]; then local quoted; _quote_readline_by_ref "$cur" quoted; local xspec=${1:+"!.@($1|${1^^})"}; x=$( compgen -f -X "$xspec" -- $quoted ) && while read -r tmp; do toks+=("$tmp"); done <<< "$x"; [[ -n ${COMP_FILEDIR_FALLBACK:-} && -n "$1" && ${#toks[@]} -lt 1 ]] && x=$( compgen -f -- $quoted ) && while read -r tmp; do toks+=("$tmp"); done <<< "$x"; fi; if [[ ${#toks[@]} -ne 0 ]]; then compopt -o filenames 2> /dev/null; COMPREPLY+=("${toks[@]}"); fi } _filedir_xspec () { local cur prev words cword; _init_completion || return; _tilde "$cur" || return; local IFS=' ' xspec=${_xspecs[${1##/}]} tmp; local -a toks; toks=($( compgen -d -- "$(quote_readline "$cur")" | { while read -r tmp; do printf '%s\n' $tmp done } )); eval xspec="${xspec}"; local matchop=!; if [[ $xspec == ! ]]; then xspec=${xspec#!}; matchop=@; fi; xspec="$matchop($xspec|${xspec^^})"; toks+=($( eval compgen -f -X "'!$xspec'" -- "\$(quote_readline "\$cur")" | { while read -r tmp; do [[ -n $tmp ]] && printf '%s\n' $tmp done } )); if [[ ${#toks[@]} -ne 0 ]]; then compopt -o filenames; COMPREPLY=("${toks[@]}"); fi } _fstypes () { local fss; if [[ -e /proc/filesystems ]]; then fss="$( cut -d' ' -f2 /proc/filesystems ) $( awk '! /*/ { print $NF }' /etc/filesystems 2>/dev/null )"; else fss="$( awk '/^[ \t][^#]/ { print $3 }' /etc/fstab 2>/dev/null ) $( awk '/^[ \t][^#]/ { print $3 }' /etc/mnttab 2>/dev/null ) $( awk '/^[ \t][^#]/ { print $4 }' /etc/vfstab 2>/dev/null ) $( awk '{ print $1 }' /etc/dfs/fstypes 2>/dev/null ) $( [[ -d /etc/fs ]] && command ls /etc/fs )"; fi; [[ -n $fss ]] && COMPREPLY+=($( compgen -W "$fss" -- "$cur" )) } _get_comp_words_by_ref () { local exclude flag i OPTIND=1; local cur cword words=(); local upargs=() upvars=() vcur vcword vprev vwords; while getopts "c:i:n:p:w:" flag "$@"; do case $flag in c) vcur=$OPTARG ;; i) vcword=$OPTARG ;; n) exclude=$OPTARG ;; p) vprev=$OPTARG ;; w) vwords=$OPTARG ;; esac; done; while [[ $# -ge $OPTIND ]]; do case ${!OPTIND} in cur) vcur=cur ;; prev) vprev=prev ;; cword) vcword=cword ;; words) vwords=words ;; ) echo "bash: $FUNCNAME(): `${!OPTIND}': unknown argument" 1>&2; return 1 ;; esac; let "OPTIND += 1"; done; __get_cword_at_cursor_by_ref "$exclude" words cword cur; [[ -n $vcur ]] && { upvars+=("$vcur"); upargs+=(-v $vcur "$cur") }; [[ -n $vcword ]] && { upvars+=("$vcword"); upargs+=(-v $vcword "$cword") }; [[ -n $vprev && $cword -ge 1 ]] && { upvars+=("$vprev"); upargs+=(-v $vprev "${words[cword - 1]}") }; [[ -n $vwords ]] && { upvars+=("$vwords"); upargs+=(-a${#words[@]} $vwords "${words[@]}") }; (( ${#upvars[@]} )) && local "${upvars[@]}" && _upvars "${upargs[@]}" } _get_cword () { local LC_CTYPE=C; local cword words; __reassemble_comp_words_by_ref "$1" words cword; if [[ -n ${2//[^0-9]/} ]]; then printf "%s" "${words[cword-$2]}"; else if [[ "${#words[cword]}" -eq 0 || "$COMP_POINT" == "${#COMP_LINE}" ]]; then printf "%s" "${words[cword]}"; else local i; local cur="$COMP_LINE"; local index="$COMP_POINT"; for ((i = 0; i <= cword; ++i )) do while [[ "${#cur}" -ge ${#words[i]} && "${cur:0:${#words[i]}}" != "${words[i]}" ]]; do cur="${cur:1}"; [[ $index -gt 0 ]] && ((index--)); done; if [[ "$i" -lt "$cword" ]]; then local old_size="${#cur}"; cur="${cur#${words[i]}}"; local new_size="${#cur}"; index=$(( index - old_size + new_size )); fi; done; if [[ "${words[cword]:0:${#cur}}" != "$cur" ]]; then printf "%s" "${words[cword]}"; else printf "%s" "${cur:0:$index}"; fi; fi; fi } _get_first_arg () { local i; arg=; for ((i=1; i < COMP_CWORD; i++ )) do if [[ "${COMP_WORDS[i]}" != - ]]; then arg=${COMP_WORDS[i]}; break; fi; done } _get_pword () { if [[ $COMP_CWORD -ge 1 ]]; then _get_cword "${@:-}" 1; fi } _gids () { if type getent &> /dev/null; then COMPREPLY=($( compgen -W '$( getent group | cut -d: -f3 )' -- "$cur" )); else if type perl &> /dev/null; then COMPREPLY=($( compgen -W '$( perl -e '"'"'while (($gid) = (getgrent)[2]) { print $gid . "\n" }'"'"' )' -- "$cur" )); else COMPREPLY=($( compgen -W '$( cut -d: -f3 /etc/group )' -- "$cur" )); fi; fi } _have () { PATH=$PATH:/usr/sbin:/sbin:/usr/local/sbin type $1 &> /dev/null } _included_ssh_config_files () { [[ $# -lt 1 ]] && echo "error: $FUNCNAME: missing mandatory argument CONFIG"; local configfile i f; configfile=$1; local included=$( command sed -ne 's/^[[:blank:]][Ii][Nn][Cc][Ll][Uu][Dd][Ee][[:blank:]]{1,}([^#%])(#.){0,1}$/\1/p' "${configfile}" ); for i in ${included[@]}; do if ! [[ "$i" =~ ^\~.|^\/. ]]; then if [[ "$configfile" =~ ^\/etc\/ssh. ]]; then i="/etc/ssh/$i"; else i="$HOME/.ssh/$i"; fi; fi; expand_tilde_by_ref i; for f in ${i}; do if [ -r $f ]; then config+=("$f"); _included_ssh_config_files $f; fi; done; done } _init_completion () { local exclude= flag outx errx inx OPTIND=1; while getopts "n:e:o:i:s" flag "$@"; do case $flag in n) exclude+=$OPTARG ;; e) errx=$OPTARG ;; o) outx=$OPTARG ;; i) inx=$OPTARG ;; s) split=false; exclude+== ;; esac; done; COMPREPLY=(); local redir="@(?([0-9])<|?([0-9&])>?(>)|>&)"; _get_comp_words_by_ref -n "$exclude<>&" cur prev words cword; _variables && return 1; if [[ $cur == $redir || $prev == $redir ]]; then local xspec; case $cur in 2'>') xspec=$errx ;; '>') xspec=$outx ;; '<') xspec=$inx ;; ) case $prev in 2'>') xspec=$errx ;; '>') xspec=$outx ;; '<') xspec=$inx ;; esac ;; esac; cur="${cur##$redir}"; _filedir $xspec; return 1; fi; local i skip; for ((i=1; i < ${#words[@]}; 1)) do if [[ ${words[i]} == $redir ]]; then [[ ${words[i]} == $redir ]] && skip=2 || skip=1; words=("${words[@]:0:i}" "${words[@]:i+skip}"); [[ $i -le $cword ]] && cword=$(( cword - skip )); else i=$(( ++i )); fi; done; [[ $cword -le 0 ]] && return 1; prev=${words[cword-1]}; [[ -n ${split-} ]] && _split_longopt && split=true; return 0 } _installed_modules () { COMPREPLY=($( compgen -W "$( PATH="$PATH:/sbin" lsmod | awk '{if (NR != 1) print $1}' )" -- "$1" )) } _ip_addresses () { local PATH=$PATH:/sbin; COMPREPLY+=($( compgen -W "$( { LC_ALL=C ifconfig -a || ip addr show; } 2>/dev/null | command sed -ne 's/.addr:([^[:space:]])./\1/p' -ne 's|.inet[[:space:]]{1,}([^[:space:]/]).|\1|p' )" -- "$cur" )) } _kernel_versions () { COMPREPLY=($( compgen -W '$( command ls /lib/modules )' -- "$cur" )) } _known_hosts () { local cur prev words cword; _init_completion -n : || return; local options; [[ "$1" == -a || "$2" == -a ]] && options=-a; [[ "$1" == -c || "$2" == -c ]] && options+=" -c"; _known_hosts_real $options -- "$cur" } _known_hosts_real () { local configfile flag prefix; local cur curd awkcur user suffix aliases i host ipv4 ipv6; local -a kh khd config; local OPTIND=1; while getopts "ac46F:p:" flag "$@"; do case $flag in a) aliases='yes' ;; c) suffix=':' ;; F) configfile=$OPTARG ;; p) prefix=$OPTARG ;; 4) ipv4=1 ;; 6) ipv6=1 ;; esac; done; [[ $# -lt $OPTIND ]] && echo "error: $FUNCNAME: missing mandatory argument CWORD"; cur=${!OPTIND}; let "OPTIND += 1"; [[ $# -ge $OPTIND ]] && echo "error: $FUNCNAME("$@"): unprocessed arguments:" $(while [[ $# -ge $OPTIND ]]; do printf '%s\n' ${!OPTIND}; shift; done); [[ $cur == @ ]] && user=${cur%@}@ && cur=${cur#@}; kh=(); if [[ -n $configfile ]]; then [[ -r $configfile ]] && config+=("$configfile"); else for i in /etc/ssh/ssh_config ~/.ssh/config ~/.ssh2/config; do [[ -r $i ]] && config+=("$i"); done; fi; for i in "${config[@]}"; do _included_ssh_config_files "$i"; done; if [[ ${#config[@]} -gt 0 ]]; then local OIFS=$IFS IFS=' ' j; local -a tmpkh; tmpkh=($( awk 'sub("^[ \t]([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u )); IFS=$OIFS; for i in "${tmpkh[@]}"; do while [[ $i =~ ^([^\"])\"([^\"])\"(.*)$ ]]; do i=${BASH_REMATCH[1]}${BASH_REMATCH[3]}; j=${BASH_REMATCH[2]}; __expand_tilde_by_ref j; [[ -r $j ]] && kh+=("$j"); done; for j in $i; do expand_tilde_by_ref j; [[ -r $j ]] && kh+=("$j"); done; done; fi; if [[ -z $configfile ]]; then for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2 /etc/known_hosts /etc/known_hosts2 ~/.ssh/known_hosts ~/.ssh/known_hosts2; do [[ -r $i ]] && kh+=("$i"); done; for i in /etc/ssh2/knownhosts ~/.ssh2/hostkeys; do [[ -d $i ]] && khd+=("$i"/pub); done; fi; if [[ ${#kh[@]} -gt 0 || ${#khd[@]} -gt 0 ]]; then awkcur=${cur//\//\\/}; awkcur=${awkcur//./\.}; curd=$awkcur; if [[ "$awkcur" == [0-9][.:] ]]; then awkcur="^$awkcur[.:]"; else if [[ "$awkcur" == [0-9] ]]; then awkcur="^$awkcur.[.:]"; else if [[ -z $awkcur ]]; then awkcur="[a-z.:]"; else awkcur="^$awkcur"; fi; fi; fi; if [[ ${#kh[@]} -gt 0 ]]; then COMPREPLY+=($( awk 'BEGIN {FS=","} /^\s[^|#]/ { sub("^@[^ ]+ +", ""); \ sub(" .$", ""); \ for (i=1; i<=NF; ++i) { \ sub("^\", "", $i); sub("\?$", "", $i); \ if ($i !~ /[?]/ && $i ~ /'"$awkcur"'/) {print $i} \ }}' "${kh[@]}" 2>/dev/null )); fi; if [[ ${#khd[@]} -gt 0 ]]; then for i in "${khd[@]}"; do if [[ "$i" == key22$curd.pub && -r "$i" ]]; then host=${i/#key22/}; host=${host/%.pub/}; COMPREPLY+=($host); fi; done; fi; for ((i=0; i < ${#COMPREPLY[@]}; i++ )) do COMPREPLY[i]=$prefix$user${COMPREPLY[i]}$suffix; done; fi; if [[ ${#config[@]} -gt 0 && -n "$aliases" ]]; then local hosts=$( command sed -ne 's/^[[:blank:]][Hh][Oo][Ss][Tt][[:blank:]]{1,}([^#?%])(#.){0,1}$/\1/p' "${config[@]}" ); COMPREPLY+=($( compgen -P "$prefix$user" -S "$suffix" -W "$hosts" -- "$cur" )); fi; COMPREPLY+=($( compgen -W "$( ruptime 2>/dev/null | awk '!/^ruptime:/ { print $1 }' )" -- "$cur" )); if [[ -n ${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1} ]]; then COMPREPLY+=($( compgen -A hostname -P "$prefix$user" -S "$suffix" -- "$cur" )); fi; if [[ -n $ipv4 ]]; then COMPREPLY=("${COMPREPLY[@]/:$suffix/}"); fi; if [[ -n $ipv6 ]]; then COMPREPLY=("${COMPREPLY[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}"); fi; if [[ -n $ipv4 || -n $ipv6 ]]; then for i in ${!COMPREPLY[@]}; do [[ -n ${COMPREPLY[i]} ]] || unset -v COMPREPLY[i]; done; fi; ltrim_colon_completions "$prefix$user$cur" } _longopt () { local cur prev words cword split; _init_completion -s || return; case "${prev,,}" in --help | --usage | --version) return ;; --dir) _filedir -d; return ;; --file | --path) filedir; return ;; --+([-a-z0-9])) local argtype=$( LCALL=C $1 --help 2>&1 | command sed -ne "s|.*$prev[{0,1}=[<[]{0,1}([-A-Za-z0-9]{1,}).|\1|p" ); case ${argtype,,} in dir) _filedir -d; return ;; file | path) _filedir; return ;; esac ;; esac; $split && return; if [[ "$cur" == - ]]; then COMPREPLY=($( compgen -W "$( LC_ALL=C $1 --help 2>&1 | command sed -ne 's/.(--[-A-Za-z0-9]{1,}={0,1})./\1/p' | sort -u )" -- "$cur" )); [[ $COMPREPLY == = ]] && compopt -o nospace; else if [[ "$1" == @(rmdir|chroot) ]]; then _filedir -d; else [[ "$1" == mkdir ]] && compopt -o nospace; _filedir; fi; fi } _mac_addresses () { local re='([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}'; local PATH="$PATH:/sbin:/usr/sbin"; COMPREPLY+=($( { LC_ALL=C ifconfig -a || ip link show; } 2>/dev/null | command sed -ne "s/.[[:space:]]HWaddr[[:space:]]{1,}($re)[[:space:]]./\1/p" -ne "s/.[[:space:]]HWaddr[[:space:]]{1,}($re)[[:space:]]$/\1/p" -ne "s|.[[:space:]](link/){0,1}ether[[:space:]]{1,}($re)[[:space:]].|\2|p" -ne "s|.[[:space:]](link/){0,1}ether[[:space:]]{1,}($re)[[:space:]]$|\2|p" )); COMPREPLY+=($( { arp -an || ip neigh show; } 2>/dev/null | command sed -ne "s/.[[:space:]]($re)[[:space:]]./\1/p" -ne "s/.[[:space:]]($re)[[:space:]]$/\1/p" )); COMPREPLY+=($( command sed -ne "s/^[[:space:]]($re)[[:space:]].*/\1/p" /etc/ethers 2>/dev/null )); COMPREPLY=($( compgen -W '${COMPREPLY[@]}' -- "$cur" )); ltrim_colon_completions "$cur" } _minimal () { local cur prev words cword split; _init_completion -s || return; $split && return; _filedir } _modules () { local modpath; modpath=/lib/modules/$1; COMPREPLY=($( compgen -W "$( command ls -RL $modpath 2>/dev/null | command sed -ne 's/^(.).k{0,1}o(.[gx]z){0,1}$/\1/p' )" -- "$cur" )) } _ncpus () { local var=NPROCESSORS_ONLN; [[ $OSTYPE == linux ]] && var=_$var; local n=$( getconf $var 2>/dev/null ); printf %s ${n:-1} } _parse_help () { eval local cmd=$( quote "$1" ); local line; { case $cmd in -) cat ;; ) LC_ALL=C "$( dequote "$cmd" )" ${2:---help} 2>&1 ;; esac } | while read -r line; do [[ $line == ([[:blank:]])- ]] || continue; while [[ $line =~ ((^|[^-])-[A-Za-z0-9?][[:space:]]+)[?[A-Z0-9]+]? ]]; do line=${line/"${BASH_REMATCH[0]}"/"${BASH_REMATCH[1]}"}; done; parse_options "${line// or /, }"; done } _parse_usage () { eval local cmd=$( quote "$1" ); local line match option i char; { case $cmd in -) cat ;; ) LC_ALL=C "$( dequote "$cmd" )" ${2:---usage} 2>&1 ;; esac } | while read -r line; do while [[ $line =~ [[[:space:]](-[^]]+)[[:space:]]] ]]; do match=${BASH_REMATCH[0]}; option=${BASH_REMATCH[1]}; case $option in -?([)+([a-zA-Z0-9?])) for ((i=1; i < ${#option}; i++ )) do char=${option:i:1}; [[ $char != '[' ]] && printf '%s\n' -$char; done ;; ) parse_options "$option" ;; esac; line=${line#"$match"}; done; done } _pci_ids () { COMPREPLY+=($( compgen -W "$( PATH="$PATH:/sbin" lspci -n | awk '{print $3}')" -- "$cur" )) } _pgids () { COMPREPLY=($( compgen -W '$( command ps axo pgid= )' -- "$cur" )) } _pids () { COMPREPLY=($( compgen -W '$( command ps axo pid= )' -- "$cur" )) } _pnames () { if [[ "$1" == -s ]]; then COMPREPLY=($( compgen -X '' -W '$( command ps axo comm | command sed -e 1d )' -- "$cur" )); else COMPREPLY=($( compgen -X '' -W '$( command ps axo command= | command sed -e \ "s/ .//" -e \ "s:./::" -e \ "s/:$//" -e \ "s/^[[(-]//" -e \ "s/[])]$//" | sort -u )' -- "$cur" )); fi } _quote_readline_by_ref () { if [ -z "$1" ]; then printf -v $2 %s "$1"; else if [[ $1 == \' ]]; then printf -v $2 %s "${1:1}"; else if [[ $1 == \~ ]]; then printf -v $2 \~%q "${1:1}"; else printf -v $2 %q "$1"; fi; fi; fi; [[ ${!2} == \ ]] && printf -v $2 %s "${1//\\/\}"; [[ ${!2} == \$ ]] && eval $2=${!2} } _realcommand () { type -P "$1" > /dev/null && { if type -p realpath > /dev/null; then realpath "$(type -P "$1")"; else if type -p greadlink > /dev/null; then greadlink -f "$(type -P "$1")"; else if type -p readlink > /dev/null; then readlink -f "$(type -P "$1")"; else type -P "$1"; fi; fi; fi } } _rl_enabled () { [[ "$( bind -v )" == $1+([[:space:]])on ]] } _root_command () { local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin; local root_command=$1; _command } _service () { local cur prev words cword; _init_completion || return; [[ $cword -gt 2 ]] && return; if [[ $cword -eq 1 && $prev == ?(/)service ]]; then _services; [[ -e /etc/mandrake-release ]] && _xinetd_services; else local sysvdirs; _sysvdirs; COMPREPLY=($( compgen -W '`command sed -e "y/|/ /" \ -ne "s/^.(U|msg_u)sage.{(.)}.$/\2/p" \ ${sysvdirs[0]}/${prev##/} 2>/dev/nullstart stop' -- "$cur" )); fi } _services () { local sysvdirs; _sysvdirs; local IFS=' ' reset=$(shopt -p nullglob); shopt -s nullglob; COMPREPLY=($( printf '%s\n' ${sysvdirs[0]}/!($_backup_glob|functions|README) )); $reset; COMPREPLY+=($( systemctl list-units --full --all 2>/dev/null | awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }' )); if [[ -x /sbin/upstart-udev-bridge ]]; then COMPREPLY+=($( initctl list 2>/dev/null | cut -d' ' -f1 )); fi; COMPREPLY=($( compgen -W '${COMPREPLY[@]#${sysvdirs[0]}/}' -- "$cur" )) } _shells () { local shell rest; while read -r shell rest; do [[ $shell == /* && $shell == "$cur"* ]] && COMPREPLY+=($shell); done 2> /dev/null < /etc/shells } _signals () { local -a sigs=($( compgen -P "$1" -A signal "SIG${cur#$1}" )); COMPREPLY+=("${sigs[@]/#${1}SIG/${1}}") } _split_longopt () { if [[ "$cur" == --?*=* ]]; then prev="${cur%%?(\\)=*}"; cur="${cur#*=}"; return 0; fi; return 1 } _sysvdirs () { sysvdirs=(); [[ -d /etc/rc.d/init.d ]] && sysvdirs+=(/etc/rc.d/init.d); [[ -d /etc/init.d ]] && sysvdirs+=(/etc/init.d); [[ -f /etc/slackware-version ]] && sysvdirs=(/etc/rc.d) } _terms () { COMPREPLY+=($( compgen -W "$( command sed -ne 's/^\([^[:space:]#|]\{2,\}\)|.*/\1/p' /etc/termcap 2>/dev/null )" -- "$cur" )); COMPREPLY+=($( compgen -W "$( { toe -a 2>/dev/null || toe 2>/dev/null; } | awk '{ print $1 }' | sort -u )" -- "$cur" )) } _tilde () { local result=0; if [[ $1 == \~* && $1 != */* ]]; then COMPREPLY=($( compgen -P '~' -u -- "${1#\~}" )); result=${#COMPREPLY[@]}; [[ $result -gt 0 ]] && compopt -o filenames 2> /dev/null; fi; return $result } _uids () { if type getent &> /dev/null; then COMPREPLY=($( compgen -W '$( getent passwd | cut -d: -f3 )' -- "$cur" )); else if type perl &> /dev/null; then COMPREPLY=($( compgen -W '$( perl -e '"'"'while (($uid) = (getpwent)[2]) { print $uid . "\n" }'"'"' )' -- "$cur" )); else COMPREPLY=($( compgen -W '$( cut -d: -f3 /etc/passwd )' -- "$cur" )); fi; fi } _upvar () { if unset -v "$1"; then if (( $# == 2 )); then eval $1=\"\$2\"; else eval $1=\(\"\${@:2}\"\); fi; fi } _upvars () { if ! (( $# )); then echo "${FUNCNAME[0]}: usage: ${FUNCNAME[0]} [-v varname" "value] | [-aN varname [value ...]] ..." 1>&2; return 2; fi; while (( $# )); do case $1 in -a*) [[ -n ${1#-a} ]] || { echo "bash: ${FUNCNAME[0]}: \$1': missing" "number specifier" 1>&2; return 1 }; printf %d "${1#-a}" &> /dev/null || { echo "bash:" "${FUNCNAME[0]}: `$1': invalid number specifier" 1>&2; return 1 }; [[ -n "$2" ]] && unset -v "$2" && eval $2=(\"\${@:3:${1#-a}}\") && shift $((${1#-a} + 2)) || { echo "bash: ${FUNCNAME[0]}:" "`$1${2+ }$2': missing argument(s)" 1>&2; return 1 } ;; -v) [[ -n "$2" ]] && unset -v "$2" && eval $2=\"\$3\" && shift 3 || { echo "bash: ${FUNCNAME[0]}: $1: missing" "argument(s)" 1>&2; return 1 } ;; ) echo "bash: ${FUNCNAME[0]}: $1: invalid option" 1>&2; return 1 ;; esac; done } _usb_ids () { COMPREPLY+=($( compgen -W "$( PATH="$PATH:/sbin" lsusb | awk '{print $6}' )" -- "$cur" )) } _user_at_host () { local cur prev words cword; _init_completion -n : || return; if [[ $cur == @ ]]; then _known_hosts_real "$cur"; else COMPREPLY=($( compgen -u -S @ -- "$cur" )); compopt -o nospace; fi } _usergroup () { if [[ $cur == \\ || $cur == :: ]]; then return; else if [[ $cur == \: ]]; then local prefix; prefix=${cur%%([^:])}; prefix=${prefix//\}; local mycur="${cur#[:]}"; if [[ $1 == -u ]]; then _allowed_groups "$mycur"; else local IFS=' '; COMPREPLY=($( compgen -g -- "$mycur" )); fi; COMPREPLY=($( compgen -P "$prefix" -W "${COMPREPLY[@]}" )); else if [[ $cur == : ]]; then local mycur="${cur#:}"; if [[ $1 == -u ]]; then _allowed_groups "$mycur"; else local IFS=' '; COMPREPLY=($( compgen -g -- "$mycur" )); fi; else if [[ $1 == -u ]]; then _allowed_users "$cur"; else local IFS=' '; COMPREPLY=($( compgen -u -- "$cur" )); fi; fi; fi; fi } _userland () { local userland=$( uname -s ); [[ $userland == @(Linux|GNU/) ]] && userland=GNU; [[ $userland == $1 ]] } variables () { if [[ $cur =~ ^(\$({[!#]?)?)([A-Za-z0-9])$ ]]; then if [[ $cur == \${ ]]; then local arrs vars; vars=($( compgen -A variable -P ${BASH_REMATCH[1]} -S '}' -- ${BASH_REMATCH[3]} )) && arrs=($( compgen -A arrayvar -P ${BASH_REMATCH[1]} -S '[' -- ${BASH_REMATCH[3]} )); if [[ ${#vars[@]} -eq 1 && -n $arrs ]]; then compopt -o nospace; COMPREPLY+=(${arrs[]}); else COMPREPLY+=(${vars[]}); fi; else COMPREPLY+=($( compgen -A variable -P '$' -- "${BASHREMATCH[3]}" )); fi; return 0; else if [[ $cur =~ ^(\${[#!]?)([A-Za-z0-9])[([^]])$ ]]; then local IFS=' '; COMPREPLY+=($( compgen -W '$(printf %s\n "${!'${BASH_REMATCH[2]}'[@]}")' -P "${BASH_REMATCH[1]}${BASH_REMATCH[2]}[" -S ']}' -- "${BASH_REMATCH[3]}" )); if [[ ${BASH_REMATCH[3]} == [@] ]]; then COMPREPLY+=("${BASH_REMATCH[1]}${BASH_REMATCH[2]}[${BASH_REMATCH[3]}]}"); fi; __ltrim_coloncompletions "$cur"; return 0; else if [[ $cur =~ ^\${[#!]?[A-Za-z0-9][.]$ ]]; then COMPREPLY+=("$cur}"); __ltrim_colon_completions "$cur"; return 0; else case $prev in TZ) cur=/usr/share/zoneinfo/$cur; _filedir; for i in ${!COMPREPLY[@]}; do if [[ ${COMPREPLY[i]} == .tab ]]; then unset 'COMPREPLY[i]'; continue; else if [[ -d ${COMPREPLY[i]} ]]; then COMPREPLY[i]+=/; compopt -o nospace; fi; fi; COMPREPLY[i]=${COMPREPLY[i]#/usr/share/zoneinfo/}; done; return 0 ;; esac; fi; fi; fi; return 1 } _xfunc () { set -- "$@"; local srcfile=$1; shift; declare -F $1 &> /dev/null || { __load_completion "$srcfile" }; "$@" } _xinetd_services () { local xinetddir=/etc/xinetd.d; if [[ -d $xinetddir ]]; then local IFS=' ' reset=$(shopt -p nullglob); shopt -s nullglob; local -a svcs=($( printf '%s\n' $xinetddir/!($_backup_glob) )); $reset; COMPREPLY+=($( compgen -W '${svcs[@]#$xinetddir/}' -- "$cur" )); fi } command_not_found_handle () { if [ -x /usr/lib/command-not-found ]; then /usr/lib/command-not-found -- "$1"; return $?; else if [ -x /usr/share/command-not-found/command-not-found ]; then /usr/share/command-not-found/command-not-found -- "$1"; return $?; else printf "%s: command not found\n" "$1" 1>&2; return 127; fi; fi } dequote () { eval printf %s "$1" 2> /dev/null } quote () { local quoted=${1//\'/\'\\'\'}; printf "'%s'" "$quoted" } quote_readline () { local quoted; _quote_readline_by_ref "$1" ret; printf %s "$ret" }

R3dy commented 4 years ago

OK this one is getting out of hand. Since we have resolved the original issue I'm going to close this one and ask you to open a new one and re-post the URL error issue when running vagrant up gohan