Scripting Server Customization & Setup
Tags: linux, terminal, bash, tutorial
Published: 2019-10-25 14:40:14

As you well know by now, I am a big nerd. The more I learn, the more I find myself moving away from large desktop environments and window managers to the terminal. The terminal is fast, efficient, and does not hog system resources.

It is to a point now that if I can do it in the terminal then I do it in the terminal. Of course, some tasks are not well suited for a terminal. Just because I can read a webpage via the terminal does not mean it's the best tool for the job. The majority of websites use so much CSS and javascript that it becomes a nightmare to navigate through.

That being said, most of my workflow can be more efficient in the terminal via a headless server. No need for a super expensive laptop, all I need is one that can connect to the server of my choice. After a bit of tweaking the environment is exactly as I like it to be. Every aspect down to the color scheme and keyboard layout.

However, over time this simple tweaking has become a healthy chunk of my time to both set up and update. New servers need all the goods, and even with all the dotfiles in place at my Github account I still need to take time setting everything up. Installing packages and symlinking configuration files takes more time the more I use the terminal.

## Automation Through Bash Scripting

We covered Bash in a mini-series here a few months back, and since I only ever use Linux, I can use these types of scripts on all my machines. As you can see on my Github page, I already have dotfiles for my desktop and laptop (which will merge soon), but I don't have a repository for my server configuration.

This is because I have only recently gotten into heavily customizing my terminal experience to improve my productivity. I guess we can say that forcing myself to learn Vim started off the journey in its current form since that got me into editing the `.vimrc` file. Add in the move to i3wm for my desktop computer, and the ball is now rolling in full force.

This bash script is still in the works, so there are only a few lines I am able to share with you, but I think it will get your gears turning. Having the mindset to automate as much of my computing life as possible saves me a lot of time.

## Parts of my script

```bash
if [[ ! -d ~/.config/nvim/colors/ ]]; then
   mkdir ~/.config/nvim/colors/
fi
```

Here I tell the script that if the directory ~/.config/nvim/colors/ does not exist then create the directory by running `mkdir ~/.config/nvim/colors/`. Then I do it again for the `.bashrc` file.

```bash
if [[ ! -f ~/.bashrc ]]; then
   touch ~/.bashrc
fi
```

The reason why I have the script create these files and directories (and more as I flesh this out) is to make sure the needed information is there for the symlinks I automate at the end of the bash script. After this I have the script add two lines to the end of the `.bashrc` file.

```bash
echo "alias vim='nvim'" >> .bashrc
echo "alias tmux='tmux -2'" >> .bashrc
source ~/.bashrc
```

These lines may be replaced with a symlink to a completed `.bashrc` file as I tweak the script because as I add more to the server's `.bashrc` it could make the script a bit messy. The next section I have so far is to install git and pull down a Vim, plugin manager.

```bash
sudo apt install git
git clone https://github.com/VundleVim/Vundle.vim.git ~/.config/nvim/bundle/Vundle.vim
```

I plan to have the script check the distribution of Linux before installing git so that I do not have to edit this file between servers running Ubuntu and Arch. Then we have the symlinks:

```bash
ln -sf ~/dotfiles/vim/colors/molokai.vim ~/.config/nvim/colors/molokai.vim
ln -sf ~/dotfiles/vimrc.main ~/.config/nvim/init.vim
ln -sf ~/dotfiles/tmuxConfig.main ~/.tmux.conf
```

A symlink tells the computer to use the first file in each line and make the second file link back to the first. This is handy when customizing the configuration files for many programs. Instead of having to edit them every time by hand we can have a master copy to edit and tweak over time.