Thursday, January 30, 2020

git - revert a file to older version away by few commits

Lets's say there is config.cfg on which 6 commits have been done. We need to revert the file to version as it was on 2nd commit.


Latest git repository looks like this after committing 6 changes:

 $ cd myapp                         
$ git init                             
Initialized empty Git repository in myapp/.git/

$ for i in 1 2 3 4 5 6               
do                                 
  echo $i >>config.cfg                 
  echo $i >>static.cfg               
  git add config.cfg static.cfg
  git commit -m "Commiting version $i"
done

[master (root-commit) 9b0d011] Commiting version 1
2 files changed, 2 insertions(+)
create mode 100644 config.cfg
create mode 100644 static.cfg
[master 68387a7] Commiting version 2
2 files changed, 2 insertions(+)
[master c16b5bb] Commiting version 3
2 files changed, 2 insertions(+)
[master 405f4c4] Commiting version 4
2 files changed, 2 insertions(+)
[master 768bb51] Commiting version 5
2 files changed, 2 insertions(+)
[master 45a8393] Commiting version 6
2 files changed, 2 insertions(+)

Version 6 of config.cfg file looks like this:

$ cat config.cfg 
1
2
3
4
5
6
$ cat static.cfg
1
2
3
4
5
6

git repository commit log look like this at this stage

$ git log --oneline 
45a8393 (HEAD -> master) Committing version 6     
768bb51 Commiting version 5                                   405f4c4 Commiting version 4                                 
c16b5bb Commiting version 3                                 
68387a7 Commiting version 2                                 
9b0d011 Commiting version 1                                                                                                          

Attempt to revert to version 2 commit fails as there are few more commit on config.cfg between version 2 and version 6.

$ git revert 68387a7   
error: could not revert 68387a7... Commiting version 2  
hint: after resolving the conflicts, mark the corrected paths 
hint: with 'git add ' or 'git rm '  
hint: and commit the result with 'git commit'                                                                                         
$ git status       
On branch master   
You are currently reverting commit 68387a7.                 
  (fix conflicts and run "git revert --continue")           
  (use "git revert --abort" to cancel the revert operation)    Changes to be committed:                                        (use "git reset HEAD ..." to unstage)                  (use "git add ..." to mark resolution)
both modified:   static.cfg

The correct way to revert to version 2 of config file is:
  1- checkout config.cfg file from version 2 commit 
  2- Check status and verify that checked out file in staging area is modified and it looks same as version 2 file
  3- commit this file on top of HEAD commit 45a8393

$ git status
On branch master
nothing to commit, working tree clean
$ git checkout 68387a7 config.cfg
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)
modified:   config.cfg

$ cat config.cfg 
1
2
$ git commit -m'Commit config file as version 2'
[master f30f027] Commit config file as version 2
1 file changed, 4 deletions(-)

        $ git log --oneline
f30f027 (HEAD -> master) Commit config file as version 2
45a8393 Commiting version 6
768bb51 Commiting version 5
405f4c4 Commiting version 4
c16b5bb Commiting version 3
68387a7 Commiting version 2
9b0d011 Commiting version 1

$ git status
On branch master
nothing to commit, working tree clean

Verify that config.cfg has been reverted back to same as version 2 and there is no change in any other file

$ cat config.cfg 
1
2
$ cat static.cfg 
1
2
3
4
5
6


Share if you know a better way!










Saturday, January 13, 2018

Puppet: concatenate existing variable to make new variable

Oftenly, we have to need to create a new variable by concatenating two existing variable. Below is some of way we can do.

CODE:

  1 $first = 'jelly'
  2 $last = 'fish'
  3 $full = "$first$last"
  4 notice("I am $full")


OUTPUT

Notice: Scope(Class[main]): I am jellyfish


Modify code in a different way to see how it change output.    

CODE:

$full = "${first}$last"

OUTPUT:  
Notice: Scope(Class[main]): I am jellyfish


CODE:

$full = "${first}${last}"

OUTPUT: 

Notice: Scope(Class[main]): I am jellyfish


CODE:
   
$full = "${first}_${last}"

OUTPUT: 

Notice: Scope(Class[main]): I am jelly_fish


CODE:

  1 $first = ['jelly', 'start']  # Now, it is list
  2 $last = 'fish'

OUTPUT: ( Possibly, this is not what you want to use)
Notice: Scope(Class[main]): I am [jelly, start]_fish


CODE: Looping using each does not work on Puppet 3

$first = ['jelly', 'star']
$last = 'fish'
$first.each | $name | {
  $full = "${name}_${last}"
  notice("I am $full")
}

OUTPUT:

Notice: Scope(Class[main]): I am jelly_fish
Notice: Scope(Class[main]): I am star_fish







Saturday, November 4, 2017

Making vagrant and virtualbox on Ubuntu 16.04

MY ENVIRONMENT

$ grep RELEASE /etc/lsb-release
DISTRIB_RELEASE=16.04
$
$ vagrant --version
Vagrant 2.0.1
$
$ VBoxManage -v
5.0.40_Ubuntur115130
$ vagrant plugin list
vagrant-hostmanager (1.8.7)
vagrant-share (1.1.9, system)
vagrant-vbguest (0.15.0)
$ 
$ vagrant plugin list
vagrant-hostmanager (1.8.7)
vagrant-share (1.1.9, system)
vagrant-vbguest (0.15.0)
$ 

STEPS TO INSTALL VITUALBOX AND VAGRANT ON UBUNTU 16.04



VIRTUALBOX

sudo apt-get install virutalbox virtualbox-dkms linux-headers-generic virtualbox-guest-x11
VBoxManage --version # if this complains about device /dev/vboxdrv, do following
sudo dpkg-reconfigure virtualbox-dkms
sudo dpkg-reconfigure virtualbox
sudo modprobe vboxdrv
sudo modprobe vboxnetctl
VBoxManage --version
sudo modprobe vboxnetadp # sudo modprobe vboxnetadp
sudo modprobe vboxnetadp #  sudo modprobe vboxnetadp


VAGRANT

sudo apt-get install vagrant
vagrant plugin install vagrant-vbguest
vagrant plugin install vagrant-hostmanager
sudo apt-get -y install dkms build-essential \
  linux-headers-$(uname -r) virtualbox-guest-additions-iso
apt-get install linux-headers-virtual


ADD A BOX IN VAGRANT
Add a box and start it as mention here 

vagrant status
vagrant ssh


SAMPLE CONFIG FILE TO START 2 VAGRANT BOXES

#Sample Vagrantfile file to start 2 ubuntu boxes
# https://www.vagrantup.com/docs/multi-machine/  multi machine configuration reference
# only first machin in below config has been set to start by default

Vagrant.configure("2") do |config|

    config.vm.provider "virtualbox"
    config.vm.network "public_network", bridge: "wlp6s0"

    config.vm.provision 'shell', path: 'install_docker.sh', run: 'always'

   config.vm.define "vm1", primary: true, autostart: true do | vm1 |
      vm1.vm.box = "minimal/xenial64"
      vm1.vm.hostname = 'vm1'

      vm1.vm.provider :virtualbox do |v|
        v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
        v.customize ["modifyvm", :id, "--memory", 1024]
        v.customize ["modifyvm", :id, "--name", "vm1"]
      end
   end

   config.vm.define "vm2", autostart: false do | vm2 |
      vm2.vm.box = "minimal/xenial64"
      vm2.vm.hostname = 'vm2'

      vm2.vm.provider :virtualbox do |v|
        v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
        v.customize ["modifyvm", :id, "--memory", 1024]
        v.customize ["modifyvm", :id, "--name", "vm2"]
      end
    end
end



References:
https://gist.github.com/larsar/1687725
https://github.com/rekibnikufesin

Sunday, April 16, 2017

How to fix youtube plugin error "quota limit exceeded" on Kodi ( example illustrating OSMC)

Problem: Recently, you might have started getting an error "quota limit exceeded" when you are trying to use youtube plugin on Kodi.

Cause: Reason is - youtube plugin uses google API to get information. Non-paid version has certain Quota limit per day per API Key.

Fix: You can generate and add your own API Key and Secret.

How to Fix it?

I use OSMC on Raspberry Pi. It runs Kodi 16 and youtube plugin. I am listing file path below from my system. It may vary depending on which platform you are using youtube plugin of Kodi.

- Go to https://console.cloud.google.com
- Click on top down-drop error and click 'Create project'. Name it something like - kodi_youtube
- Go to 'API Manager' -> Credentials
- Click Credentials Tab and click 'Create Credential'
- Create API Key and OAuthr 2.0 Client ID as per below document
  https://support.google.com/cloud/answer/6158857?hl=en
- Now you have three strings (1) Client ID (2) API Key (3) Client Secret
- ssh to you kodi installation.
- Add or update (if already existing) below lines in settings.xml (my osmc absolute path is be)
>>>File Name: /home/osmc/.kodi/userdata/addon_data/plugin.video.youtube/settings.xml
>>>You need to add following lines

   
   
   



And you are done! Did this step help you?


Also refer this article.



Friday, September 23, 2016

Manually installing UEFI and grub2 on USB already have Ubuntu

You might have installed Ubuntu on USB drive ( using steps similar to my other blog)  but UEFI and grub is not installed on USB drive hence you can not use same USB drive to boot Ubuntu on other system.

A Little Theory


1-UEFI industry standard boot procedure for personal computers from 2006. Firmware of your computer hardware knows that it need to look far 'Unifed Extensible Firmware Interface' install on available storage.

2-System native firmware scans all storage devices for ESP ( EFI System Partition - a variant of vfat32 partition with boot flag enabled). gparted shows boot and esp flags for this partition. Each storage device must have only on ESP.

3-Firmware mounts this (a variant of vfat32) partition to /boot/efi and locates /boot/efi/EFI/

/*..efi file and execute it. ( remember - filename on vfat32 partition is case insensitive).  It triggers grub. This file has location of grub. See this for more detail. 

4-UEFI does not rely on boot sector. Instead it invoke boot manager like - grub. In turn, grub menu will appear. Grub configuration have /boot partition information from where  kernel and initrd will be  loaded, uncopressed and executed. they will mount root flesystem and trigger user space process init ( pid=1 ).


Installing UEFI and grub2 on a same USB from which Ubuntu is booted


You are able to boot Ubuntu installed on an USB via a chainloder boot loader and want to install EFI and grub2 on this. Follow below seps to install EFI and grub.

1-Ensure you have an ESP partition of USB Flash drive - sdX and it is mount on /boot/efi. Use gparted to check flag of this partition - boot, esp
     df -PhalT /boot/efi Filesystem Type Size Used Avail Use% Mounted on /dev/sdb2 vfat 286M 132K 286M 1% /boot/efi


2-Move old stuff somewhere and install EFI and grub

mkdir /var/tmp/boot_efi_backup
mv /boot/efi/* /var/tmp/boot_efi_backup
apt-get install --reinstall grub-efi-amd64
grub-install --removable  --boot-directory=/boot --efi-directory=/boot/efi /dev/sdX
( above command use whole disk as last argument - do not partition /dev/sdX1 )
find /boot/efi/ /boot/efi/ /boot/efi/EFI /boot/efi/EFI/BOOT /boot/efi/EFI/BOOT/BOOTX64.EFI

3-Look for some interesting thing it has.

strings /boot/efi/EFI/BOOT/BOOTX64.EFI |grep -Ei "grub|hd|setuuid|root|boot|set"|less 
 ghex /boot/efi/EFI/BOOT/BOOTX64.EFI

4-Reboot with UEFI ready USB
 


Installing EFI and grub2 on a USB having Ubuntu while booted from other Ubuntu


If you want to install EFI and grub2 on a USB having an Ubuntu by mounting it on another instance of Ubuntu, Installer Media OS, Rescue CD, Live DVD etc., follow below steps. Creates ESp partition on USB if it dows not have. If you can not create it, you can not install UEFI !

1-Mount root, boot and EFI partition
   mount /dev/sdYn  /mnt
   mount /dev/sdYn  /mnt/boot
   mount /dev/sdYp  /mnt/boot/efi

2-Take backup, chroot, install EFI and grub2

  mkdir /mnt/boot_efi_backup
  mv /mnt/boot/efi/* /mnt/boot_efi_backup/
  chroot /mnt
apt-get install --reinstall grub-efi-amd64
grub-install --removable  --target=x86_64-efi --boot-directory=/mnt/boot --efi-directory=/mnt/boot/efi /dev/sdY

4-Reboot with UEFI ready USB

Installing grub2 in BIOS mode.

If your system do not support UEFI mode, you need to install grub2 in legacy BIOS mode. It will install grub on MBR of disk sdX

apt-get install grub-pc-bin grub-install --removable --target=i386-pc --debug --boot-directory=/boot /dev/sdX


  

Install and use Ubuntu from a Removable USB Flash Drive

Ubuntu is fantastic Linux distribution. It takes jut 600 MB RAM on fresh book. It is much faster than other propitiatory desktop operating systems.

Normally, a home compute have SATA hard disk ( 300 Mbps for SATA 2.0 and 600 MBps for SATA3.0. Now a days, USB 3.0  comes with 150 MBps and upto 200GB !

My Objective

1-Being Linux professional, use Ubuntu Linux for all daily work I do at home. So, install and run desktop OS from a USB Flash drive and Propitiatory  OS only when firmware need to be upgraded ( most vendor do not release firmware for Linux !). I have achieved it !
2-Bring your operating system in where ever you go ! Use your USB to run your own Personal Desktop OS at school, office, Cafe, hotel etc.


Let me share steps.


What you need


1-A 2 GB USB drive to be used as Latest Ubuntu installer media

2-At least 8 GB Usb drive to install Ubuntu . I use ScanDisk Ultra Fit USB 3.0 Flash drive - 32 GB (SGD 16) 

Prepare Install Media


1- Download latest Ubuntu iso : http://www.ubuntu.com/download

2- Download Rufus . Use it to burn Ubuntu iso on USB flash drive you are intended to use as installer : http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-windows

If you are already on one of Ubuntu system, use Startup Disk Creator to burn iso on USB Srive

3-Boot Ubuntu from installer USB. You may need to change boot order in setup. Usually accessed by F2 key when pressed during POST. F12 - one time boot menu. Turn off Secure Boot if your BIOS has this option.

This installer USB is a FAT32 filesystem and it will not save any changes you will made on this as it similar to live CD. Though, there is work-around to save your changes (if you need) - search for casper-rw. Though, this is not our interest at this moment.

4- (skip this if you can boot with USB installer) If you can not boot from installer USB with all your efforts, possibly, your system does not support USB boot , does not support USB 3.0 or you need to upgrade bios etc. You may try re-burning iso once more. Obviously, if you can not boot installer from USB, you can not install and run Ubuntu from USB too. Stop here !

5- If above fails and you wish to install Ubuntu on free space of existing disk or on second disk :
a- Burn iso on a DVD ( you have bootable DVD, right !)
b- Download macrorit disk partition expert portable version
c- Reduce your disk ( BTW can be use dor USB too) partition to free up around 8 GB
d- Follow steps somewhat similar to below to install Ubuntu ( You do not need BIOS Boot and EFI System partition ESP)

Ubuntu Installation on USB Drive

1-Boot from USB installer media prepared in above step. Open an terminal and check if installer has booted in UEFI mode:

[ -d /sys/firmware/efi ] && echo "EFI boot on HDD" || echo "Legacy boot on HDD" ]

2- Select "Install Ubuntu". Refer : http://www.ubuntu.com/download/desktop/install-ubuntu-desktop . Select language, contact to wifi, Check both check boxes - to install update and third party update.

3- Plug in USB Flash drive on which you are going to install Ubuntu. Identify USB correctly and destroy partition table and create GPT disklabel. [ CAUTION: identify USB correctly, this operation is destructibve ]
         dd if=/dev/zero of=/dev/sdX count=100
         eject  /dev/sdX
         ( re-insert USB to re-read partition
         parted /dev/sdX mklabel gpt

4-You must select "Something Else" in installation type. It will allow you to manual partition USB Drive

5- USB Partition : You must have minimum 3 partition. swap partition (point c) can be ignored, though it is recommended.
Note : If you  do not see BIOS Boot and ESP partition option in below steps, installer has not booted in UEFI mode. So, you  will not be installed Ubuntu in UEFI mode. But you can install it in Legacy mode. It mean, your flash drive will not appear as boot device on other system that support UEFI. Enable UEFI in system setup and again if you need to install it in UEFI mode.

a- A 10 MB partition "BIOS boot" partition - Unformulated, no filesystem on it, no mount point, Set bios_grub flag on it ( it is required by GPT partition type - ignoring details discussion here)

b- A 100 MB  flag "EFI System Partition - ESP". DO NOT select mount poin /boot/efi and DO NOT select to format it as vfat32  ( ESP is a variant of vfat32 for not exact vfat32). Selecting ESP partition will automatically will set boot and esp flags on it. Leave mount point blank as installer know what to do with this. More detail is here.
c- 1 or 2 GB Swap partition of "Linux swap" type

d - All remaining space as - ext4 Linux FIlesystem, format it

Important Note #1 :You MUST select your USB drive in "Device for boot loader installation"

6- Select Download updates while installing and Install this third-party software now. It will install many 3rd party packages that Ubuntu repository do not have because of Licensing issues.

7- Go ahead and kick off installation and grab a coffee you deserve ! Once you will be back,  Installation might be completed. Take out installation media, label it, keep it safe ( Trust me, you  need it in future). Reboot system. If USB is your first boot device, your Ubuntu will be on your screen in 2 minutes. If required, bring one time boot menu, select USB flash drive, boot it.

8-Is your newly installed Ubuntu is portable and you can use it on any other systems ?  Hint : If you see UEFI : USB 3.0 ScanDisk (32GB), [ see this image]. It depends how much attention you paid to Important Note #1. Try to boot some other system to boot from USB.

Important Note #2 :If you do not see a boot option similar to above, it indicate that boot loader was installed on some other existing ( first hard disk) disk that already had a UEFI ESP. Follow steps on my next blog.

Important Note #2 : There is fantastic tool boot-repair is you have messed up you windows boot manager or installer USB boot record.

Also see https://www.ventoy.net/en/index.html to boot multiple Linux from USB

Install and use Ubuntu from a Removable USB Flash Drive

Ubuntu is fantastic Linux distribution. It takes jut 600 MB RAM on fresh book. It is much faster than other propitiatory desktop operating systems.

Normally, a home compute have SATA hard disk ( 300 Mbps for SATA 2.0 and 600 MBps for SATA3.0. Now a days, USB 3.0  comes with 150 MBps and upto 200GB !

My Objective

1-Being Linux professional, use Ubuntu Linux for all daily work I do at home. So, install and run desktop OS from a USB Flash drive and Propitiatory  OS only when firmware need to be upgraded ( most vendor do not release firmware for Linux !). I have achieved it !
2-Bring your operating system in where ever you go ! Use your USB to run your own Personal Desktop OS at school, office, Cafe, hotel etc.


Let me share steps.


What you need


1-A 2 GB USB drive to be used as Latest Ubuntu installer media

2-At least 8 GB Usb drive to install Ubuntu . I use ScanDisk Ultra Fit USB 3.0 Flash drive - 32 GB (SGD 16) 

Prepare Install Media


1- Download latest Ubuntu iso : http://www.ubuntu.com/download

2- Download Rufus . Use it to burn Ubuntu iso on USB flash drive you are intended to use as installer : http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-windows

3-Boot Ubuntu from installer USB. You may need to change boot order in setup. Usually accessed by F2 key when pressed during POST. F12 - one time boot menu. Turn off Secure Boot if your BIOS has this option.

This installer USB is a FAT32 filesystem and it will not save any changes you will made on this as it similar to live CD. Though, there is work-around to save your changes (if you need) - search for casper-rw. Though, this is not our interest at this moment.

4- (skip this if you can boot with USB installer) If you can not boot from installer USB with all your efforts, possibly, your system does not support USB boot , does not support USB 3.0 or you need to upgrade bios etc. You may try re-burning iso once more. Obviously, if you can not boot installer from USB, you can not install and run Ubuntu from USB too. Stop here !

5- If above fails and you wish to install Ubuntu on free space of existing disk or on second disk :
a- Burn iso on a DVD ( you have bootable DVD, right !)
b- Download macrorit disk partition expert portable version
c- Reduce your disk ( BTW can be use dor USB too) partition to free up around 8 GB
d- Follow steps somewhat similar to below to install Ubuntu ( You do not need BIOS Boot and EFI System partition ESP)

Ubuntu Installation on USB Drive

1-Boot from USB installer media prepared in above step

2- Select "Install Ubuntu". Refer : http://www.ubuntu.com/download/desktop/install-ubuntu-desktop

3- Plug in USB Flash drive on which you are going to install Ubuntu

4-You must select "Something Else" in installation type. It will allow you to manual partition USB Drive

5- USB Partition : You must have minimum 3 partition. swap partition (point c) can be ignored, though it is recommended.

a- A 10 MB partition "BIOS boot" partition - Unformulated, no filesystem on it, no mount point, Set bios_grub flag on it ( it is required by GPT partition type - ignoring details discussion here)

b- A 200 MB fat32 partition, flag "EFI System Partition - ESP". DO NOT select mount poin /boot/efi . Leave mount point blank as installer know what to do with this. More detail is here.

c- 1 or 2 GB Swap partition of "Linux swap" type

d - All remaining space as - ext4 Linux FIlesystem, format it

Important Note #1 :You MUST select your usb drive in "Device for boot loader installation"

6- Select Download updates while installing and Install this third-party software now. It will install many 3rd party packages that Ubuntu repository do not have because of Licensing issues.

7- Go ahead and kick off installation and grab a coffee you deserve ! Once you will be back,  Installation might be completed. Take out installation media, label it, keep it safe ( Trust me, you  need it in future). Reboot system. If USB is your first boot device, your Ubuntu will be on your screen in 2 minutes. If required, bring one time boot menu, select USB flash drive, boot it.

8-Is your newly installed Ubuntu is portable and you can use it on any other systems ?  Hint : If you see UEFI : USB 3.0 ScanDisk (32GB), [ see this image]. It depends how much attention you paid to Important Note #1. Try to boot some other system to boot from USB.

Important Note #2 :Is you do not see a boot option similar to above, it indicate that boot loader was installed on some other existing ( first hard disk) disk that already had a UEFI ESP. Follow steps on my next blog.