Sunday, 26 July 2015

speedtest mini : check your internet speed locally - CentOS 7

speedtest.net is one of the most popular internet speed tests. It is very helpful if you want to determine your Internet download and upload speed similarly speedtest-mini can be performed on local server. 

Install your apache, PHP,  start httpd service and make sure 'httpd' service is allowed by your firewall. 

#yum install -y httpd php php-mysql php-gd php-mcrypt
#systemctl start httpd
#firewall-cmd --add-service=http 

Download "speedtest mini" from speedtest.net from their official site : 
#cd /var/www/html

Register to speedtest.net and download the latest version of mini. 
#unzip mini.zip

Make sure your apache doccument root is in /var/www/html
# grep -i "^documentroot" /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"
#cd /var/www/html/mini
#mv index-php.html index.html

point your browser to http://<ipaddress>/mini and start testing your speed on the local servers. 

Thanks

Wednesday, 8 July 2015

Configure Network Teaming - RHEL 7

Network teaming is method for linking NIC's together logically to allow for failover or higher throughput. 

RHEL 7 implements network teaming with a small kernel driver and a user space daemon, teamd. The kernel handles network packets efficiently and teamd handles logic and interface processing. Software, called runners, implement load balancing and active-backup logic, such as roundrobin. The following runners are available to teamd:

- broadcast : a simple runner transmits each packet from all ports

- roundrobin : simple runner which transmits packets in a rounf-robin fashion from each port

- activebackup : failover runner which watches for link changes and selects an active port for data transfers

- loadbalance : this runner monitors traffic and uses a hash function to try to reach a perfect balance when selecting ports for packet transmission.

- lacp : implements the 802.3ad Link aggregation control protocol. can use the same transmit port selection possibilities as the loadbalance runner.

Steps:

- Create team interface 
- Assigning the IPv4 or IPv6 attributes of the team interface
- Assign the port interfaces
- Bring the team and port interfaces up/down

Current existing network interfaces are beow, "eno33554984" and "eno50332208" will be the interfaces that will be the ports for the teamed interface.

# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:14:ef:0e brd ff:ff:ff:ff:ff:ff
3: eno33554984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:14:ef:18 brd ff:ff:ff:ff:ff:ff
4: eno50332208: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:0c:29:14:ef:22 brd ff:ff:ff:ff:ff:ff
#

- Create team interface:
# nmcli connection add type team con-name team0 ifname team0 config '{"runner": {"name": "activebackup"}}'
Connection 'team0' (b781d554-6d28-4baa-9af8-5f3331acd427) successfully added.
#

'{"runner": {"name": "activebackup"}}' - In this setup i'm using method 'activebackup' 

- Assign IPv4 attributes to team interface.
# nmcli connection modify team0 ipv4.addresses '192.168.229.181/24'
# nmcli connection modify team0 ipv4.method manual

- assign the port interfaces
# nmcli connection add type team-slave con-name team0-port1 ifname eno33554984 master team0
Connection 'team0-port1' (d7ae4a56-4872-4264-8f2f-215742deae92) successfully added.
# nmcli connection add type team-slave con-name team0-port2 ifname eno50332208 master team0
Connection 'team0-port2' (c6755f4b-8071-4294-b3d5-691da53cf264) successfully added.
#

- check the current state of teamed interfaces. 
# ip a show team0
7: team0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 00:0c:29:14:ef:18 brd ff:ff:ff:ff:ff:ff
    inet 192.168.229.181/24 brd 192.168.229.255 scope global team0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe14:ef18/64 scope link
       valid_lft forever preferred_lft forever
#

# teamdctl team0 state
setup:
  runner: activebackup
ports:
  eno33554984
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
  eno50332208
    link watches:
      link summary: up
      instance[link_watch_0]:
        name: ethtool
        link: up
runner:
  active port: eno33554984
#

Ping from your network gateway through the 'team0' interface, and when the 'eno33554984' || 'eno50332208' have been disconnected, you still have no interruptions in the PING. 

how to disconnect one of the interface:
#nmcli device disconnect eno33554984
#teamdctl team0 state
#nmcli device connect eno33554984

- Display team ports of the team0 interface
# teamnl team0 ports

- Display the active port
# teamnl team0 getoption activeport

Thanks

Thursday, 2 July 2015

Install and configure Git - CentOS 7

In this article i'll try to explain how to install, configure and use Git.

Environment: CentOS 7
Git version: 1.8.3.1

Git is a distribute version control system used by developers, but since it can also store .files(files with '.') system admin's can use to store their customized configurations files like .bashrc, .vimrc or other important scripts ..etc

Git takes a snapshot of how the files look at that instant in time and will store a reference to it. It wouldn't matter to Git what data you insert as it will check-sum it using SHA1 algorithm and create 40-character hex key. Git is based on key-value data system.

- Install Git by using 'yum' 

#yum install git -y

# git --version
git version 1.8.3.1
#

I already have a Git account registered if you don't have, signup to http://www.github.com and complete your registration. create your first repository by '+' 
NOTE: repository name you choose or the directory name which you create should be the alike. Git usually sync the directory or the files from your laptop or desktop to the one having the same name as in the GitHub.

 


setup your name and e-mail (similar email ID that you used to create GitHub account) on your local laptop or desktop which must be run very first time inorder to setup Git.

sunilka@centos7]$ git config --global user.name "sunilka"
sunilka@centos7]$ git config --global user.email "sunilka@gmail.com"
sunilka@centos7]$ git config --list

Create a directory and initialize Git by running git init, after that you have .git created with few files and directory under it. According to Git it's now been the working tree. now, everything under it can be uploaded to GitHub.

sunilka@centos7]$ mkdir configs
sunilka@centos7]$ cd configs; git init
sunilka@centos7]$ ls -ld .git

few files were been created and added into the directory, the moment we added the files into Git it creates a hash checksum and refers it by checksum.

sunilka@centos7 configs]$ git ls-files --stage
100755 af7ec7a5b7b361c10dcbf3db7286f97ef7df57d6 0       ks.cfg
100755 3e84972fcf7f688f98999d1bd5c38eaf250efcc9 0       ks_centos7.cfg
sunilka@centos7 configs]$

Now, lest pust to Gitgub which is our remote repository. first check you have remote repository already existing there
sunilka@centos7 configs]$ git remote -v
sunilka@centos7 configs]$ 

add the remote repository, URL which you had while creating the repository.
sunilka@centos7 configs]$ git remote add origin https://github.com/sunilka/configs.git

sunilka@centos7 configs]$  git remote -v
sunilka@centos7 configs]$ 

where, 
      git remote add - add remote directory to Git
              origin - default name of the remote location

Push the file to GitHub using, use the same username and password which you use to create and access your GitHub account.
sunilka@centos7 configs]$ git push origin master

any changes made to the files, must be committed before Git push. 

sunilka@centos7 configs]$ git commit -m "CentOS 7 kickstart file" ks_centos7.cfg
[master 08632bb] CentOS 7 kickstart file
 1 file changed, 1 deletion(-)
sunilka@centos7 configs]$ git commit -m "CentOS 6 kickstart file" ks.cfg
[master 498a0ca] CentOS 6 kickstart file
 1 file changed, 2 deletions(-)
sunilka@centos7 configs]$ 

sunilka@centos7 configs]$ git push origin master
.
.
Counting objects: 9, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 591 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
   57a7eb3..498a0ca  master -> master
sunilka@centos7 configs]$ 

Take a look at your GitHub page, it should have been uploaded. 











you can make a localcopy from your GitHub account using the clone feature

sunilka@centos7 configs]$ mkdir gitclones
sunilka@centos7 configs]$ cd gitclones/
sunilka@centos7 gitclones]$ git clone https://github.com/sunilka/configs.git
Cloning into 'configs'...
remote: Counting objects: 10, done.
remote: Total 10 (delta 0), reused 0 (delta 0), pack-reused 10
Unpacking objects: 100% (10/10), done.
sunilka@centos7 gitclones]$ ls
configs
sunilka@centos7 gitclones]$ ls configs/
ks_centos7.cfg  ks.cfg
sunilka@centos7 gitclones]$

you have same files are in your GitHub repository. 

Thursday, 11 June 2015

Kernel up-gradation on OpenSUSE(13.2) to latest kernel (4.1)

OpenSUSE 13.2 had it's kernel version 3.16.6-2, I have upgraded the latest kernel version 4.1.0-rc7-1. 

Below are the steps involved :

1. Make sure you retain multiple kernel configurations in /etc/zypp/zypp.conf which includes the oldest. 
2. Add kernel HEAD repository and perform distribution upgrade from kernel HEAD repository.
3. Reboot the system.

# tail -2 /etc/zypp/zypp.conf
multiversion = provides:multiversion(kernel)
multiversion.kernels = latest,latest-1,running,oldest
#

Adding repository 'kernel-repo' ..................................................................................................................................[done]
Repository 'kernel-repo' successfully added
Enabled: Yes
Autorefresh: Yes
GPG check: Yes
#

# zypper lr kernel-repo
Alias          : kernel-repo
Name           : kernel-repo
Enabled        : Yes
Priority       : 99
Auto-refresh   : On
Keep Packages  : Off
Type           : NONE
GPG Check      : On
GPG Key URI    :
Path Prefix    :
Parent Service :
Repo Info Path : /etc/zypp/repos.d/kernel-repo.repo
MD Cache Path  : /var/cache/zypp/raw/kernel-repo
#

# zypper dist-upgrade -r kernel-repo
Retrieving repository 'kernel-repo' metadata ------------------------------------------------------------------------------------------------------------------------[\]

New repository or package signing key received:

  Repository:       kernel-repo
  Key Name:         Kernel OBS Project <Kernel@build.opensuse.org>
  Key Fingerprint:  4529410A B52F94C4 03BAB484 ECEEF210 03579C1D
  Key Created:      Wed Apr 22 17:55:51 2015
  Key Expires:      Fri Jun 30 17:55:51 2017
  Rpm Name:         gpg-pubkey-03579c1d-5537934f


Do you want to reject the key, trust temporarily, or trust always? [r/t/a/? shows all options] (r): a
Retrieving repository 'kernel-repo' metadata .....................................................................................................................[done]
Building repository 'kernel-repo' cache ..........................................................................................................................[done]
Loading repository data...
Reading installed packages...
Computing distribution upgrade...

The following NEW package is going to be installed:
  kernel-desktop-4.1.rc7-1.1.gabe587d

1 new package to install.
Overall download size: 48.1 MiB. Already cached: 0 B  After the operation, additional 221.3 MiB will be used.
Continue? [y/n/? shows all options] (y): y
Retrieving package kernel-desktop-4.1.rc7-1.1.gabe587d.x86_64                                                                      (1/1),  48.1 MiB (221.3 MiB unpacked)
Retrieving: kernel-desktop-4.1.rc7-1.1.gabe587d.x86_64.rpm .........................................................................................[done (365.2 KiB/s)]
Checking for file conflicts: .....................................................................................................................................[done]
(1/1) Installing: kernel-desktop-4.1.rc7-1.1.gabe587d ............................................................................................................[done]
Additional rpm output:
Creating initrd: /boot/initrd-4.1.0-rc7-1.gabe587d-desktop
Executing: /usr/bin/dracut --logfile /var/log/YaST2/mkinitrd.log --force /boot/initrd-4.1.0-rc7-1.gabe587d-desktop 4.1.0-rc7-1.gabe587d-desktop
*** Including module: bash ***
*** Including module: warpclock ***
*** Including module: i18n ***
*** Including module: ifcfg ***
*** Including module: drm ***
*** Including module: plymouth ***
*** Including module: btrfs ***
*** Including module: kernel-modules ***
Omitting driver i2o_scsi
*** Including module: resume ***
*** Including module: rootfs-block ***
*** Including module: terminfo ***
*** Including module: udev-rules ***
Skipping udev rule: 91-permissions.rules
Skipping udev rule: 80-drivers-modprobe.rules
*** Including module: systemd ***
*** Including module: usrmount ***
*** Including module: base ***
*** Including module: fs-lib ***
*** Including module: shutdown ***
*** Including module: suse ***
*** Including modules done ***
*** Installing kernel module dependencies and firmware ***
*** Installing kernel module dependencies and firmware done ***
*** Resolving executable dependencies ***
*** Resolving executable dependencies done***
*** Hardlinking files ***
*** Hardlinking files done ***
*** Stripping files ***
*** Stripping files done ***
*** Generating early-microcode cpio image ***
*** Store current command line parameters ***
Stored kernel commandline:
 resume=UUID=963537e9-1bf1-49de-b90c-6227ade69572
root=UUID=940ff654-d7da-43f3-a4c6-ed18ecbb231f rootflags=rw,relatime,space_cache rootfstype=btrfs
*** Creating image file ***
*** Creating image file done ***
Update bootloader...
#
- Finally, reboot is required and you would boot up in the latest Linux Kernel 4.1.
# uname -r
4.1.0-rc7-1.gabe587d-desktop
#

Wednesday, 10 June 2015

Glances - Max information in Minimum space #CentOS 7

Glances is a cross-platform curses-based system monitoring tool which aims to present a maximum of information in a minimum of space.It can adapt dynamically the displayed information depending on the terminal size.

Glances is written in Python and uses the psutil library to get information from your system.

Environment : CentOS 7
Installation 
Actually, package exists for CentOS in EPEL repository and install using your favorite package managers. 

#yum install epel-release
#yum install -y glances.noarch

I found this utility very useful as I don't have to type multiple commands to monitor the system, instead all data would be displayed in one single screen, 

CPU information (user, system, and idle programs )
Memory & Swap information 
CPU load for 1min, 5min, 15mins
Total number of process currently running 
Network download/uploads of network connections
Disk read/write speed
Disk usages
Date and time at the right bottom


You can press 'h' hot keys for fine tuning. 


If any one are more interested to know on this utility  here it is, http://glances.readthedocs.org/en/latest/

Simple utility to capture all the data in one screen.

Saturday, 6 June 2015

script to build your local YUM repository - CentOS 7

If you had installed your CentOS 7 as Minimal installation and incase if you need to install, update security fixes now and then in your local network, it would be better if it's been configured as a YUM server, saving you internet bandwidth.

readers who would like to create local repository would only need to mount the installation image to the drive and provide the path which they think there is enough free space on the drive to build the repository.

how it works shortly,

checks for the installation image in the drive, if found mount and then copy the contents from installation media to the path where you wanted to build the repository. create the repository file in /etc/yum.repos.d and build the repository. query your repository and then safely unmount the device.

this can be downloaded from the 'github' as well
https://github.com/sunilka/bashrepo/blob/master/localcentosrepo7.sh

# chmod +x localcentosrepo7.sh
#./ localcentosrepo7.sh

code:
#!/bin/bash
#
# Description:
# If there are no requirement for you to pull packages from Internet to installing the packages,
# you can use this script to build your local repository at your desired localtion.

# Summary:
# You are required to mount the installation CD/DVD/ISO image in your drive.
# this script is designed so that it would check image is mounted and would then mount to the '/media' mount point.
# It would copy all the contents from the media to your desired folder where you wanted to build your repository
# YUM pointed also added to the repository mentioned which comes pre-defined in the script.
# creates and builds your repository.
# checks are you able to query your repository
# Finally, unmounts the your media which is mounted
# you can remove your CD/DVD/ISo from the drive.

# this script is designed and tested on CentOS7


# Author: sunlnx
# email : sunlnx@gmail.com
#
##################################################################################################################

LOCALREPO=localrepo
REPONAME=centos7
LOGFILE=/tmp/centosrepo_output.log

# Check your DVD is available in the drive
function check_drive {
blkid /dev/sr0 >/dev/null
if [ $? -eq 0 ]
then
return 0
else
return 1
fi
}

# mount your DVD to some temp mount point
function mount_drive {

#fucntion call to check_drive
check_drive

#getting the return status from the fucntion called.
DRIVESTAT=$?

#mount DVD/ISO to some mount point on successful

if [ $DRIVESTAT -eq 0 ]
then
echo "checking for /media as mount point"
if [ -d "/media" ]
then
echo "media exists && attempting to mounting image...."
mount /dev/sr0 /media 2>/dev/null
[ $? -eq 0 ] && echo "image mount successful!";echo || echo "image unable to mount";echo
else
echo "/media doesn't exist, creating and mounting image";echo
mkdir /media
mount /dev/sr0 /media >/dev/null;echo
fi

else
echo "Please insert the DVD/ISO image... exiting .."
exit
fi

}

#function call for mounting the media to mount point
mount_drive

#if you had installed minimal installation on the server, then you need to install the 'deps' package before
#creating the repository
echo --------------------------------
echo " Logs written @ $LOGFILE"
echo --------------------------------

echo;
echo "Installing the dependencies before creating reposiotry" 2>&1 | tee $LOGFILE
echo;
rpm -ivh /media/Packages/libxml2-python-2.9.1-5.el7.x86_64.rpm >>$LOGFILE 2>&1
rpm -ivh /media/Packages/deltarpm-3.6-3.el7.x86_64.rpm >>$LOGFILE 2>&1
rpm -ivh /media/Packages/python-deltarpm-3.6-3.el7.x86_64.rpm >>$LOGFILE 2>&1
rpm -ivh /media/Packages/createrepo-0.9.9-23.el7.noarch.rpm >>$LOGFILE 2>&1
echo;

#dump your packages from DVD to the folder which has capacity of 4.2GB in your hard disk space
echo "Enter your path to create your repository"
read DIR
echo

#on your mentioned path, creating directory localrepo in which all packages do exists
echo "creating folder '$LOCALREPO' in $DIR"
mkdir $DIR/$LOCALREPO
echo


#check capacity on the disk to store packages
read -n1 -p "$DIR has 4.2G of free space in the Disk or LV ?[y/n]:" ch
#echo "$DIR has 4.2G of free space in the Disk or LV ?:[y/n] "
#read ch
echo
case $ch in
y|Y) echo "copying packages to $DIR/$LOCALREPO"
cp -arvf /media/* $DIR/$LOCALREPO >>$LOGFILE 2>&1
[ $? -eq 0 ] && echo "copy completed" ;echo;
;;

n|N) echo "script aborted"
exit
;;

*)echo "Invalid option, re-run script"
exit
;;

esac

cat >/etc/yum.repos.d/$REPONAME.repo <>$LOGFILE 2>&1
echo;echo "repo build completed"

#cleaing the repository
echo "refreshing repository..";echo
yum clean all >>$LOGFILE 2>&1
echo "clean completed.." ;echo

#Listing repositories
echo "Listing repositories";echo
yum list all
yum grouplist

#unmount the mounted media
echo "umounting the /media";echo
umount /media
[ $? -eq 0 ] && echo "filesystem unmounted successfully !!" || echo "media unsuccessful"
echo;echo "it's safe to remove your installation image from the drive !"
echo;
echo "LOCAL YUM REPOSITORY CREATED & SUCCESSFUL !!! :) "

Thursday, 4 June 2015

Monitor your disks/filesystems

Here is the script which will monitor the disk space and will generate alert once the file system usage has crossed WARING or CRITICAL threshold. 

I have re-directed the alert to the local domain and it can be configured to your inbox. 

script is self explanatory and can be found here :

#!/bin/bash
#this will monitor the disk uaage of the partitions and would generate an e-mail to the concerned. alert had been set to below 90 as WARNING and ABOVE 95 as CRITICAL

#Change your domain name according to your domain's & email's to the user account
ADMIN=root
WARNING=90
CRITICAL=95

#sda1 is the boot partition and /dev/sda2 being swap parition which I want to exclude
#you can also add other partitions if you don't want to monitor
EXCLHDD=/dev/sda1 /dev/sda2

function disk_monitoring()
{
while read output
do
#echo $output
usedpar=$(echo $output | awk '{print $1}' | cut -d'%' -f1)
tpar=$(echo $output | awk '{print $2}')
if ([ $usedpar -eq $WARNING ] && [ $usedpar -lt $CRITICAL ])
then
echo "WARNING|FILESYSTEM - $tpar|$usedpar%|$HOSTNAME" | \
mail -s "WARNING|ALERT|Housekeep the FileSystem" $ADMIN@
elif [ $usedpar -ge $CRITICAL ]
then
echo "CRITICAL|FILESYSTEM - $tpar|$usedpar%|$HOSTNAME" | \
mail -s "CRITICAL|ALERT|Filesystem running out of space" $ADMIN
fi
done
}
if [ "$EXCLHDD" != "" ]
then
df -H | grep -vE "^Filesystem|tmpfs|$EXCLHDD" | awk '{print $5 " " $6}' | disk_monitoring
else
df -H | grep -vE "^Filesystem|tmpfs"| awk '{print $5 " " $6}' | disk_monitoring
fi