SKM IT World

Just another blog about IT


Leave a comment

Pimp My Git – Git Mergetool

I like to work with git on the command line. But in some cases I prefer UI support. For example, solving merge conflicts is such a case. Git has a command mergetool, which can open a graphical tool to solve merge conflicts. But before you can use this command, you had to configure it. In this blog post I’d like to show you how to configure mergetool and how to use it.

Configuration

First at all, open a shell on Linux. On Windows, open Git Bash. Then choose a graphic tool that should support you solving merge conflicts. git mergetool –tool-help shows a list which tools are supported on your machine


 sparsick@sparsick-ThinkPad-T430s > git mergetool --tool-help
'git mergetool --tool=<tool>' may be set to one of the following:
                araxis
                kdiff3
                meld

The following tools are valid, but not currently available:
                bc
                bc3
                codecompare
                deltawalker
                diffmerge
                diffuse
                ecmerge
                emerge
                gvimdiff
                gvimdiff2
                gvimdiff3
                opendiff
                p4merge
                tkdiff
                tortoisemerge
                vimdiff
                vimdiff2
                vimdiff3
                winmerge
                xxdiff

Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

This command shows two lists. The first list shows all tools that are supported by git and that are available on your machine (in sample, it is araxis, kdiff3 and meld). The second list shows that are also supported by git, but they aren’t install on your machine.

I use meld as graphical tool. It’s runnable on Windows and Linux. If you haven’t install meld on your machine, then it’s now the right time to do it or choose another tool.

We want to set mergetool globally for all our repositories.


sparsick@sparsick-ThinkPad-T430s > git config --global merge.tool meld
sparsick@sparsick-ThinkPad-T430s > git mergetool
No files need merging

If git mergetool returns more than No files need merging, then the path to your graphic tool isn’t set in your $PATH system variable (The normal case on Windows systems). It’s possible to set the path to the graphical tool directly in git.

sparsick@sparsick-ThinkPad-T430s > git config --global mergetool.meld.path /c/Program\ Files\ \(x86\)/Meld/Meld.exe</pre>

Bear two important things in mind: mergetool is written without a dot between merge and tool and meld is a placeholder for the name of the graphical tool in the above sample. If you use another tool such like vimdiff, then the config key is called mergetool.vimdiff.path .

Now git mergetool is ready to use.

Usage

Now I’d like to demonstrate how to use git mergetool. It is used in when we have merge conflicts during a merge action. Let’s say we want to merge branch branch1 into master and this merge will have some merge conflicts.


sparsick@sparsick-ThinkPad-T430s > git merge branch1

Auto-merging test
CONFLICT (content): Merge conflict in test
Automatic merge failed; fix conflicts and then commit the result.

Now, we want to solve these conflicts with a graphical tool (in the example, it’s meld). git mergetool on the command line open the graphical tool of our choice.

sparsick@sparsick-ThinkPad-T430s > git mergetool

Merging:
test

Normal merge conflict for 'test':
{local}: modified file
{remote}: modified file

After solving the merge conflicts, the change has to commit.

sparsick@sparsick-ThinkPad-T430s > git status

On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)

Changes to be committed:

modified:   test

Untracked files:
(use "git add <file>..." to include in what will be committed)

test.orig
sparsick@sparsick-ThinkPad-T430s > git commit

You can see that we have a new untracked file test.orig . This is a backup of the merged file created by mergetool. You can configure that this backup should be removed after a successful merge.

sparsick@sparsick-ThinkPad-T430s > git config --global mergetool.keepBackup false

Further files are created when using git mergetool:

sparsick@sparsick-ThinkPad-T430s > git status

On branch master
Untracked files:
(use "git add ..." to include in what will be committed)

test.BACKUP.7344
test.BASE.7344
test.LOCAL.7344
test.REMOTE.7344

If only these files are currently untracked, then a git clean can help. Otherwise they have to be removed manually.

sparsick@sparsick-ThinkPad-T430s > git clean -f

Removing test.BACKUP.7344
Removing test.BASE.7344
Removing test.LOCAL.7344
Removing test.REMOTE.734

Links

  1. Meld Homepage
  2. git mergetool Documentation


Leave a comment

Summary of SoCraTes 2016 Session “Hey dude, where is my tool chain?” – Working on Windows as a Linux User aka Let’s talk about Windows

This year on the conference SoCraTes I hosted a session for the first time. It was about working on a Windows system from the perspective of a Linux user.  A big thank to @ndrssmn, who motivated to host this session.

@yooogan was so nice to summarize the session in the SoCraTes wiki (big thank for that).  But the wiki page is only accessible for SoCraTes participants, so we decided that I republish it on my blog. Enjoy it.


Console/Shell

  • Babun – Based on Cygwin, includes a CLI package manager (pact – like apt, yum, …) and preconfigured oh-my-zsh as shell
  • ConEmu – feature rich console emulator with tabs
  • Console2 (original)/(modified fork) – console emulator, multi tabs, configurable mouse behavior
  • PuTTYssh client (when you don’t have Babun/Cygwin anyway)

File Management

Text Editors

  • Notepad++ – all-purpose editor, syntax highlighting, file monitoring (tail -f)
  • Atom – editor; same settings in all your environments

Diff/Merge

Searching

Viewers

Documentation

  • Zim – Organize notes, saves to plain text
  • Greenshot – Screenshots, including obfuscation / comments, for documentation, connects to JIRA
  • yEd – multi-platform (Win/Linux/MacOS) graph editor, extensible palette, useful pictograms
  • Paint.NET – free image editor
  • GIMP – Swiss army knife for images

System

Disk Usage

  • RidNacs – graphical du
  • WinDirStat – even more colorful graphical du
  • ncdu – CLI, can be installed from Cygwin/Babun

Keyboard

  • WinCompose – a (X.org/X11 like) compose key for Windows – type äöë߀«»←↑↓→¡☺♥… like a boss!
  • SharpKeys – remap keyboard: CapsLockCtrl, ~Esc, etc.
  • AutoHotkey – very sophisticated keyboard macros / automation – full-fledged scripting language

Clipboard

  • PureText – remove formatting from pasted text
  • Ditto – clipboard manager

Pictures (taken from Twitter):

Let's talk about Windows, pt. 1
Let's talk about Windows, pt. 2
Let's talk about Windows, pt. 3

 


Leave a comment

How to Install Serverspec in the Current Version on Ubuntu 14.04 LTS (Trusty)

If you google “serverspec install ubuntu”, you find the information that a package called ruby-serverspec in the standard package repository can be used to install Serverspec on an Ubuntu 14.04 LTS based system. Unfortunately, this package installs an outdated version of Serverspec. The next point is that if you try to install the newest version of Serverspec with gem (that’s the way that it is described on the Serverspec homepage), you will get the following error message:


~> sudo gem install serverspec
ERROR:  Error installing serverspec:
net-ssh requires Ruby version >= 2.0.

 

The problem is, when you install Ruby with sudo apt-get install ruby, the package manager installs Ruby in the version 1.9.1 .

Therefore, the next sections explain how to install Ruby and Serverspec in the newest version on an Ubuntu 14.04 LTS based system. Let’s start with Ruby that is required for Serverspec.

Ruby Installation

The cloud hosting service Brightbox provides Ruby package repositories for several Ubuntu versions and several Ruby version. I chose the repository for Ruby 2.3 packages, so the installation steps are:


~> sudo apt-get install software-properties-common
~> sudo apt-add-repository ppa:brightbox/ruby-ng
~> sudo apt-get update
~> sudo apt-get install ruby2.3
~> ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux-gnu]

Serverspec Installation

Now, we can install Serverspec like it is explained on the Serverspec homepage. In my case, I had to install rake separately.

~> sudo gem install serverspec rake

Links

  1. Serverspec Homepage
  2. Brightbox Ruby package repositories for Ubuntu documentation


Leave a comment

Vagrant Home and Vagrant Dot File On NTFS Partition Mounted In A Linux System

I use Vagrant together with VirtualBox  on an Ubuntu based Linux system.  Because my internal SSD drive isn’t so large, I outsource the location of VirtualBox’s VMs to an external HDD drive with a NTFS partition. Additionally, I set Vagrant’s environment variables VAGRANT_DOTFILE_PATH and VAGRANT_HOME so, that the directories .vagrant and .vagrant.d are also on the external HDD drive. External HDD drive with NTFS partition are auto-mounted with the following mount options on an Ubuntu based Linux system.

rw,auto,user,fmask=0111,dmask=0000

For typical Vagrant commands like vagrant up, vagrant destroy, vagrant halt these mount options are sufficient. After using Vagrant for a while, I wanted to install some Vagrant plugins. The command for plugin installation in Vagrant is vagrant plugin install <plugin name>. The plugin installation failed with following error message.

An error occurred while installing nokogiri (1.6.3.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.3.1'` succeeds before bundling.>
ERROR vagrant: Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues.

A hint on the Vagrant project’s issue tracker brings me to try out several mount options for the NTFS partition. Finally, the NTFS partition has to be mounted with following mount option and then the plugin installation is successful.

rw,auto,user,uid=skosmalla,guid=skosmalla,exec,fmask=0022,dmask=0000

Links


1 Comment

Salt SSH Installation on Centos 5.5

Salt has the option to manage servers agentlessly.  Agentless means that the targets don’t need a agent process. The master orchestrates the target system over SSH. Therefor it exists an own command called salt-shh.  The following sections explain how to install Salt SSH on a CentOs 5.5 and how to configure minimally a master and its targets for a test connection. The how to is tested with Salt version 2014.1.11.

Installation

On Master Node

Salt SSH is a part of the master package, so we have to install salt-master.

sudo yum install salt-master

It also installs the optional dependencies. For an agent mode these dependencies can make trouble (see for more information Salt Installation on Centos 5.5). But for our case these dependencies can be ignored because the communication between master and target systems is over SSH.

On Target Nodes

On target nodes, we have to ensure that Python 2.6. are installed and some Python 2.6 modules (see Salt Dependency page). These are needed because the master copies Python scripts to the minions and run them on the targets. So the following steps has to be done.

  1. Enable EPEL Release
    sudo yum install epel-release
    
  1. Install Python 2.6 package and needed Python modules
    sudo yum install python26 python26-msgpack python26-PyYAML python26-jinja2 python26-markupsafe python-libcloud python26-requests
    

Configuration

This section describes only the important configuration issues for running the first command from a master to its targets. For further configuration possibilities, please read the Salt documentation about configuration.

The configuration depends whether the authentication uses password or public/private keys.

Password Authentication

  1. Go on target nodes.
  2. Enable SSH password authentication.
    1. Open /etc/ssh/sshd_config with your favorite editor.
    2. Ensure that the line PasswordAuthentication yes is active.
    3. Restart SSH.
      sudo service ssh restart
      
  1. Go on master node.
  2. Configure the connection to the targets.
    1. Open /etc/salt/roster with your favorite editor.
    2. Add for every target following content
          <Salt ID>:   # The id to reference the target system with
              host:    # The IP address or DNS name of the remote host
              user:    # The user to log in as
              passwd:  # The password to log in with
      
    1. Save the file.
  1. Test the communication.
    salt-ssh <Salt ID> test.ping
    

Public/Private Key Authentication

  1. Go on the master node.
  2. Prepare SSH for key authentication
    1. Call
      ssh-keygen
      
    2. Reply following question
          Enter file in which to save the key (/home/skosmalla/.ssh/id_rsa):
          Enter passphrase (empty for no passphrase):
          Enter same passphrase again:
      
    3. Keep the following information in mind.
          Your identification has been saved in /home/skosmalla/.ssh/id_rsa.
          Your public key has been saved in /home/skosmalla/.ssh/id_rsa.pub.
          The key fingerprint is:
          44:3e:ef:58:94:15:52:c2:88:ca:ab:21:43:53:3d:42 skosmalla@computer
      
    4. Copy the public key (in our example id_rsa.pub) to the targets.
      ssh-copy-id -i /home/skosmalla/.ssh/id_rsa.pub username@target_host
      
    5. Check, if the ssh access is working without password.
      ssh username@target_host
      
      
  1. Configure the connection to the targets.
    1. Open /etc/salt/roster with your favorite editor.
    2. Add for every target following content.
          <Salt ID>:   # The id to reference the target system with
              host:    # The IP address or DNS name of the remote host
              user:    # The user to log in as
              priv:    # File path to ssh private key, defaults to salt-ssh.rsa, in our example it is /home/skosmalla/.ssh/id_rsa.
      
  2. Test the communication.
    salt-ssh <Salt ID> test.ping
    

 Further Information


Leave a comment

Cygwin Embedded In Console2 Under Windows 7

I like to use Cygwin for having a bash shell on a windows machine. In combination with Console2 you have a powerful command-line tool for windows. I’d like to describe how to install Cygwin and Console2 under windows 7 (I think this instruction works on Windows XP, too) and how to embed Cygwin in Console2. I used for Cygwin version 1.7.17-1 32bit and for Console2 version 2.00b148-Beta_32bit.

Cygwin Installation

  1. Download setup.exe.
  2. Double click on setup.exe starts the installation.
  3. Follow the set up instruction. As installation location I use c:\cygwin.
  4. Go to c:\cygwin and run Cygwin.bat for setting up Cygwin user home etc.

Console2 Installation

  1. Download zip file.
  2. Unzip it into installation location.
  3. Start Console2 with a double click on Console2.exe.

How to embed Cygwin in Console2

  1. Open Console2.
  2. Go to Edit -> Settings.
  3. Go to  Tab
  4. In field title insert for example bash. It is the name of the first tab in Console2.
  5. In field Shell you have to insert C:\cygwin\bin\bash.exe –login -i (Don’t forget c:\cygwin is your installation folder).
  6. In field Startup dir you can insert C:\cygwin\home\user.name. This folder is used at every Console2 start.

Links

  1. Cygwin Homepage
  2. Console2 Homepage
  3. Good short feature overview of Cygwin on the Wikipedia page


Leave a comment

Distinctive Feature of Running Nexus on Linux

I installed Nexus on Linux according to the step-by-step instruction of Sonatype. Everything looked fine during the installation. To find out, whether the installation was successful, I tried to go to the welcome page of my nexus installation. I got an error message. I looked in the log file of Nexus and found following exception:

 com.google.inject.internal.ComputationException: com.google.inject.internal.ComputationException: java.lang.TypeNotPresentException: Type org.codehaus.enunciate.contract.jaxrs.ResourceMethodSignature not present
 ....

ERROR [er_start_runner] - /nexus - unavailable java.lang.IllegalStateException: The PlexusServerServlet couldn't lookup the target component (role='org.restlet.Application', hint='nexus')

With Google’s help I found a fixed bug in the Nexus bug tracking system, that describes my problem. The reason for my problem was:
I had on my Linux machine an IBM JVM in an elder version. With this version Nexus doesn’t run because of a bug in the IBM JVM.  Two solutions and one workaround exist for this problem:

  • Workaround: Copying enunciate-core-*.jar to /runtime/apps/nexus/lib.
  •  First solution: Update the version of IBM JVM to 5.0.0 SR12 / 6.0.0 SR8 FP1 or later
  •  Second solution: Use the JVM of Oracle.

I decided to change the JVM to an Oracle JVM and after that, Nexus ran without errors.

Links:

  1. Installation Guide for Nexus by Sonatype
  2. Bug reported to Nexus 
  3. Bug reported to IBM