Search This Blog

Thursday, November 9, 2017

Code Snippet on your Blog



Hello :)

While writing my previous post i was unaware how to copy code snippets (as their alignment have to be correct).

So here is how you do it

Go to HTML view of your blog and then add this at the header or at the top

<script language="javascript" src="https://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript">
<script language='javascript' type='text/javascript' src='https://google-code-prettify.googlecode.com/svn/trunk/src/lang-css.js' />

<script type='text/javascript'>
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}
addLoadEvent(prettyPrint);
</script>


and then paste your code snippet between the below mentioned tag

<pre class="prettyprint">
---your code here---
</pre>

Wednesday, November 8, 2017

VMware keystroke based automation (The Pythonic Way)




Hi all,

This is based on my another day at work.

I was stuck with an issue "Press any key to boot from CDrom" while automating the unattend windows installation using autounattend.xml

Ofcourse i could have cracked the ISO to fix this up but my company would n't agree to it :)
This really blew me down until i found the following link (URL)

https://www.virtuallyghetto.com/2017/09/automating-vm-keystrokes-using-the-vsphere-api-powercli.html

https://github.com/lamw/vghetto-scripts/blob/master/powershell/VMKeystrokes.ps1

By referring that, i was able to write my own python based implementation of the same (Only takes return"Enter" keystroke as this is my need)
The code snippet is pasted below, feel free to reuse them (pressEnter.py)

import atexit
import argparse
import getpass
import sys
import textwrap
import time

from pyVim import connect
from pyVmomi import vim


def get_args():
    parser = argparse.ArgumentParser()

    # because -h is reserved for 'help' we use -s for service
    parser.add_argument('-s', '--host',
                        required=True,
                        action='store',
                        help='vSphere service to connect to')

    # because we want -p for password, we use -o for port
    parser.add_argument('-o', '--port',
                        type=int,
                        default=443,
                        action='store',
                        help='Port to connect on')

    parser.add_argument('-u', '--user',
                        required=True,
                        action='store',
                        help='User name to use when connecting to host')

    parser.add_argument('-p', '--password',
                        required=False,
                        action='store',
                        help='Password to use when connecting to host')
    parser.add_argument('-n', '--name',
                        required=True,
                        action='store',
                        help='Name of the virtual_machine to look for.')

    args = parser.parse_args()

    if not args.password:
        args.password = getpass.getpass(
            prompt='Enter password for host %s and user %s: ' %
                   (args.host, args.user))

    return args

args = get_args()
si = connect.SmartConnectNoSSL(host=args.host, user=args.user,
                            pwd=args.password, port=args.port)

# doing this means you don't need to remember to
# disconnect your script/objects
atexit.register(connect.Disconnect, si)

# search the whole inventory tree recursively... a brutish but
# effective tactic
vm = None
entity_stack = si.content.rootFolder.childEntity
while entity_stack:
    entity = entity_stack.pop()

    if entity.name == args.name:
        vm = entity
        del entity_stack[0:len(entity_stack)]
    elif hasattr(entity, 'childEntity'):
        entity_stack.extend(entity.childEntity)
    elif isinstance(entity, vim.Datacenter):
        entity_stack.append(entity.vmFolder)

if not isinstance(vm, vim.VirtualMachine):
    print "virtual machine %s not found" % args.name
    sys.exit(-1)

print "Found VirtualMachine: %s Name: %s" % (vm, vm.name)

tmp=vim.UsbScanCodeSpecKeyEvent()
h="0x28"
hidCodeHexToInt = int(h, 16)
hidCodeValue = (hidCodeHexToInt << 16) | 0007
tmp.usbHidCode = hidCodeValue
sp = vim.UsbScanCodeSpec()
sp.keyEvents = [tmp]
r = vm.PutUsbScanCodes(sp)
print r

Here is how you run it.

python pressEnter.py -s <vmware host> -u <user> -p <password> -n <target vm> -o 443

and ofcourse you need pyVmomi library pre-installed :) :P

Monday, September 4, 2017

Supervisord Tweaks

Hello all,
"Necessity is the mother of invention"

As always while i was working on, i came across some requirements with supervisord. It was quite interesting and useful. So i thought i will blog it on.

Tweak 1: Send emails from supervisord when something is broken


Step 1: Install sendmail. You need this to send emails

# yum install sendmail supervisor

Step 2: Configure sendmail

# vim /etc/mail/sendmail.mc

Modify from

dnl define(`SMART_HOST', `smtp.your.provider')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl



to

define(`SMART_HOST', `<smtp server>')dnl
dnl # DAEMON_OPTIONS(`Port=smtp,Addr=<smtp server>, Name=MTA')dnl


Step 3: Install in your native python or virtual environment

# pip install superlance

Step 4: Configure crashmail as a part of your supervisord configuration

Add the section below to your supervisord conf

[eventlistener:crashmail]
command=/path/to/your/app -a -m <To email id> -s "/usr/sbin/sendmail -t -i"
events=PROCESS_STATE
buffer_size=500


Step 5: Restart supervisord service

# systemctl restart supervisord.service

With the above changes, an email is triggered when ever a process(s)/program(s) mentioned in the supervisord configuration file crashes or moves into fatal state.


Tweak 2: Creating process groups


Step 1: Lets assume our original supervisord configuration is as mentioned below

[program:process_worker1]

directory=/usr/share/test/
command=/usr/bin/test1
process_name=%(process_num)s
autostart=true
autorestart=true
stdout_logfile=/var/log/test/process_worker1.log
stderr_logfile=/var/log/test/process_worker1_err.log
environment=PYTHONPATH="/usr/share/test/",xyz="/opt/config.ini"

[program:process_worker2]
directory=/usr/share/test/
command=/usr/bin/test2
process_name=%(process_num)s
autostart=true
autorestart=true
stdout_logfile=/var/log/test/process_worker2.log
stderr_logfile=/var/log/test/process_worker2_err.log
environment=PYTHONPATH="/usr/share/test/",xyz="/opt/config.ini"

Step 2: Add these changes mentioned below to create a group service

[group:test_groups]
programs=process_worker1,process_worker2


Step 3: Restart supervisord

# systemctl restart supervisord.service

Step 4: Now to stop/start/restart/status a group, do the following

# supervisorctl -c supervisor.conf restart test_groups:*

This configuration lets us group multiple programs/process together in supervisord


Tweak 3: Limited Retries for failed programs


Supervisord tries to keep all the process/programs alive by making constant retries. There could be number of use cases, where we may need to limit the retries.

The highlighted values in the section mentioned below would describe about the parameters that would help us limit the retries

[program:test_worker]
directory=/usr/share/test/
command=/usr/bin/test_worker
process_name=%(process_num)s
autostart=true
autorestart=unexpected
startsecs=10
startretries=3
stdout_logfile=/var/log/test/test_worker.log
stdout_logfile=/var/log/test/test_worker_err.log
environment=PYTHONPATH="/usr/share/test/",xyz="/opt/config.ini"


startsecs - It means the number of seconds the system has to wait to consider the process running

startretries - It means the number of retries the process can take. But this retry is applied only on process which is not in running state

So in the example above if the program crashes (in less than 10 sec), the maximum retries that can happen is 3

Thursday, July 20, 2017

One line Simple FTP Server

Hey Guys,

As always this is an accidental discovery while working on some automation project.
How to create a FTP server in one line of command.

Here we go,
I will assume that you already have Python on your system :)

    python -m pyftpdlib -p 21 -w -d /some/dest/directory -D -n <Your IP>

If you wish to see the console output later in a file and push the process to background then,

    python -m pyftpdlib -p 21 -w -d /some/dest/directory -D -n <Your IP> > ftp.log 2>&1 &

you can ofcourse change the port from port 21 to some other.

Looks simple isn't it ???? 

Monday, May 22, 2017

Apply SSL Certificate via HAproxy


Hi Again,


Just thought to share, how a SSL certificate is applied to HAproxy LB

First we need to generate “pem” file which includes private key  from “pfx”. It promts for password

# openssl pkcs12 -in dummy.pfx -out dummy.pem  -nodes

Note: pem file which includes private key is important and not just pem file without private key content

Copy this "pem" file to a specific location, say like

# cp dummy.pem /etc/haproxy/ssl/

Configure SSL cert to Haproxy  - In the front end section

frontend www-https
    mode http
    option forwardfor
    option http-server-close
    bind 0.0.0.0:443 ssl crt /etc/haproxy/ssl/dummy.pem
    reqadd X-Forwarded-Proto:\ https
    default_backend web-backend

and Restart haproxy service

# service haproxy restart

Ola!!!!   When you access your application you must see something like this on the address bar J



Thursday, March 9, 2017

Centos - How to undo a package Installation - Yum 


Hi Friends,

Yesterday someone in my server, accidently updated libvirt packages while trying to install something else.

Puff !!!
All my VMs started failing on reboot
Identified that verions of libvirt and qemu does nt work anymore.

Ona  quick research learnt this

"YUM HISTORY UNDO <NUM>"

It is a life saver

I initially tried "yum downgrade" - but it usually failed in downgrading dependency.

So let me explain you the magic.


Step 1: Find the history

# yum history
Loaded plugins: product-id, refresh-packagekit, subscription-manager
Updating Red Hat repositories.
ID     | Login user               | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
     8 | root <root>              | 2011-10-03 14:40 | Install        |    1   
     7 | root <root>              | 2011-09-21 04:24 | Install        |    1 ##
     6 | root <root>              | 2011-09-21 04:23 | Install        |    1 ##
     5 | root <root>              | 2011-09-16 13:35 | Install        |    1   
     4 | root <root>              | 2011-09-16 13:33 | Erase          |    1   
     3 | root <root>              | 2011-09-14 14:36 | Install        |    1   
     2 | root <root>              | 2011-09-12 15:48 | I, U           |   80   
     1 | System <unset>           | 2011-09-12 14:57 | Install        | 1025  

Step 2: Revert the change

# yum history undo 8

Loaded plugins: product-id, refresh-packagekit, subscription-manager
Updating Red Hat repositories.
Undoing transaction 8, from Mon Oct  3 14:40:01 2011
    Install screen-4.0.3-16.el6.i686
Resolving Dependencies
--> Running transaction check
---> Package screen.i686 0:4.0.3-16.el6 will be erased
--> Finished Dependency Resolution

Dependencies Resolved
================================================================================
 Package          Arch       Version            Repository              Size
================================================================================
Removing:
 screen           i686       4.0.3-16.el6       @rhel-6-server-rpms     783 k

<snip>

Removed:
  screen.i686 0:4.0.3-16.el6
Complete!
Hope this helps someone. Ola ... have a great day

Wednesday, October 15, 2014

OpenStack - Do you know how to evacuate Instances from server which has gone down - "nova host-evacuate"

Hello again,

Recently my server running openstack-compute had to be brought down for maintenance (which was running some 60 VMs). This is when i learnt how to use "nova evacuate"

This is a cool feature in openstack using which you can get back instances from the server which has gone down. Ya, but it requires some prior configuration.

The important stuff is how you keep you root disk. Openstack allows three different configurations to fetch the root disk.

1. Root on volume (EBS volumes) - By this instance can be brought up in other server with the same EBS(root) volume.

2. Instances folder in shared mode using NFS, GlusterFS, etc - Basically the disk file needs to be accessed across all nodes, i.e mount point for instances folder must be shared across all nodes. GlusterFS appears to work super cool in this method.

3. Disks are cleaned but instances are recreated from fresh disk from glance - Even though the disk is ultra new, instance information (like IP, instance Id,etc.,) are retained just as it was before evacuation.

Once the server is down, all you need to do is issue the following command

# nova host-evacuate --target_host <server where the VMs need to be transferred> --on-shared-storage <server which got down>

Eg:

# nova host-evacuate --target_host old_node --on-shared-storage new_node

I have added a video demonstration of the entire flow. I hope this helps someone. Have a great day


                                                  :) :) :) :) :) :) :) :)

Tuesday, October 14, 2014

Cool aliases that i found from my friend's GitHub

Hey Guys,
If you are a linux fan, you probably will love these aliases (short cuts or short forms of commands)

https://github.com/rushiagr/myutils/tree/master/aliases

If you are tired to copy it to your system, just use the script below to install these aliases :)

https://github.com/rushiagr/myutils/blob/master/install-aliases.sh

These save a lot of time for developers..

Thanks to Rushi Agarwal













See ya all.

Monday, August 18, 2014

Really Cool Python debugging Tool - "PUDB"

Hi once again,
I came across this really cool python debugging tool called "PUDB". Now i would rather say am using this tool for every code trace on openstack.

" PuDB is a full-screen, console-based visual debugger for Python. Its goal is to provide all the niceties of modern GUI-based debuggers in a more lightweight and keyboard-friendly package. PuDB allows you to debug code right where you write and test it--in a terminal. If you've worked with the excellent DOS-based Turbo Pascal or C tools, PuDB's UI might look familier. "

How to install PUDB

# sudo pip install pudb

How to debug

The place you feel debugger needs to start, insert the following piece of code  

import pudb;pu.db 

How does it look like ?



PUDB has the following panes
  • Debugger pane
  • Console Pane
  • Variables Pane
  • Stack Pane
  • BreakPoints pane
Basic Key Navigations
  • Use Left,Right,Up,Down arrow keys to navigate between the panes.
  • press 's' for step into a method
  • press 'n' for executing next line
  • press 'b' key to toggle break points
  • press 'r' for completing the method
  • press 'q' to quit debugger
  • press '?' for help and more key navigations
  • ctrl + x to navigate between debugger pane and console pane.
  • TAB key acts as auto-suggest/auto-fill while in console pane. It also brings down methods available.
Credits to my friend Rushi Agarwal - who pointed out to me about this tool while i was struggling to debug a piece of code with pdb :)
 

Tuesday, July 8, 2014

"apt-mirror" does not understand non standard port

Hey,
Today when i was setting up configuration for apt-mirror, i faced this problem of apt-mirror not recognizing non-standard port. I thought i would post the fix for the bug, as this might be helpful for others as well

Step 1: Edit the apt-mirror script

# nano /usr/bin/apt-mirror

Step 2: Look for the line

$uri =~ s&:\d+/&/&; # and port information

Change it to,

$uri =~ s&:\d+/$&/&; # and port information

Step 3: Run your apt-mirror command

There you go !!! You have your mirror fetching from non-standard port.

Monday, April 7, 2014

Eth0 Getting Incremented while Cloning

Hi everybody,
Today i came across a situation, that my network interface(s) number gets incremented when ever i clone my virtual machine (by virtual box or other means). For some or the other reason certain people do not like their interfaces to be changed.
   Started investigating the cause and found that udev was the daemon which increments the number on the interface. It has certain set of rules written which reinitiate the device number. Here is the small patch that can be handy for some users.

Note: These commands has to be performed as root

Step 1: Edit the file /lib/udev/write_net_rules and make the following changes

# vi /lib/udev/write_net_rules

Orginally looks like this

#!/bin/sh -e

# This script is run to create persistent network device naming rules
# based on properties of the device.
# If the interface needs to be renamed, INTERFACE_NEW=<name> will be printed
# on stdout to allow udev to IMPORT it.

# variables used to communicate:
#   MATCHADDR             MAC address used for the match
#   MATCHID               bus_id used for the match
#   MATCHDEVID            dev_id used for the match
#   MATCHDRV              driver name used for the match
#   MATCHIFTYPE           interface type match
#   COMMENT               comment to add to the generated rule
#   INTERFACE_NAME        requested name supplied by external tool
#   INTERFACE_NEW         new interface name returned by rule writer

# Copyright (C) 2006 Marco d'Itri <md@Linux.IT>
# Copyright (C) 2007 Kay Sievers <kay.sievers@vrfy.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# debug, if UDEV_LOG=<debug>
if [ -n "$UDEV_LOG" ]; then
if [ "$UDEV_LOG" -ge 7 ]; then
set -x
fi
fi

RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules'
. /lib/udev/rule_generator.functions

interface_name_taken() {
local value="$(find_all_rules 'NAME=' $INTERFACE)"
if [ "$value" ]; then
return 0
else
return 1
fi
}

find_next_available() {
raw_find_next_available "$(find_all_rules 'NAME=' "$1")"
}

write_rule() {
local match="$1"
local name="$2"
local comment="$3"

{
if [ "$PRINT_HEADER" ]; then
PRINT_HEADER=
echo "# This file was automatically generated by the $0"
echo "# program, run by the persistent-net-generator.rules rules file."
echo "#"
echo "# You can modify it, as long as you keep each rule on a single"
echo "# line, and change only the value of the NAME= key."
fi

echo ""
[ "$comment" ] && echo "# $comment"
echo "SUBSYSTEM==\"net\", ACTION==\"add\"$match, NAME=\"$name\""
} >> $RULES_FILE
}

if [ -z "$INTERFACE" ]; then
echo "missing \$INTERFACE" >&2
exit 1
fi

# Prevent concurrent processes from modifying the file at the same time.
lock_rules_file

# Check if the rules file is writeable.
choose_rules_file

# the DRIVERS key is needed to not match bridges and VLAN sub-interfaces
if [ "$MATCHADDR" ]; then
match="$match, DRIVERS==\"?*\", ATTR{address}==\"$MATCHADDR\""
fi

if [ "$MATCHDRV" ]; then
match="$match, DRIVERS==\"$MATCHDRV\""
fi

if [ "$MATCHDEVID" ]; then
match="$match, ATTR{dev_id}==\"$MATCHDEVID\""
fi

if [ "$MATCHID" ]; then
match="$match, KERNELS==\"$MATCHID\""
fi

if [ "$MATCHIFTYPE" ]; then
match="$match, ATTR{type}==\"$MATCHIFTYPE\""
fi

if [ -z "$match" ]; then
echo "missing valid match" >&2
unlock_rules_file
exit 1
fi

basename=${INTERFACE%%[0-9]*}
match="$match, KERNEL==\"$basename*\""

if [ "$INTERFACE_NAME" ]; then
# external tools may request a custom name
COMMENT="$COMMENT (custom name provided by external tool)"
if [ "$INTERFACE_NAME" != "$INTERFACE" ]; then
INTERFACE=$INTERFACE_NAME;
echo "INTERFACE_NEW=$INTERFACE"
fi
else
# if a rule using the current name already exists, find a new name
if interface_name_taken; then
INTERFACE="$basename$(find_next_available "$basename[0-9]*")"
# prevent INTERFACE from being "eth" instead of "eth0"
[ "$INTERFACE" = "${INTERFACE%%[ \[\]0-9]*}" ] && INTERFACE=${INTERFACE}0
echo "INTERFACE_NEW=$INTERFACE"
fi
fi

write_rule "$match" "$INTERFACE" "$COMMENT"

unlock_rules_file

exit 0


Change it as follows

#!/bin/sh -e

# This script is run to create persistent network device naming rules
# based on properties of the device.
# If the interface needs to be renamed, INTERFACE_NEW=<name> will be printed
# on stdout to allow udev to IMPORT it.

# variables used to communicate:
#   MATCHADDR             MAC address used for the match
#   MATCHID               bus_id used for the match
#   MATCHDEVID            dev_id used for the match
#   MATCHDRV              driver name used for the match
#   MATCHIFTYPE           interface type match
#   COMMENT               comment to add to the generated rule
#   INTERFACE_NAME        requested name supplied by external tool
#   INTERFACE_NEW         new interface name returned by rule writer

# Copyright (C) 2006 Marco d'Itri <md@Linux.IT>
# Copyright (C) 2007 Kay Sievers <kay.sievers@vrfy.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# debug, if UDEV_LOG=<debug>
if [ -n "$UDEV_LOG" ]; then
if [ "$UDEV_LOG" -ge 7 ]; then
set -x
fi
fi

RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules'
dnc='/etc/udev/rules.d/dnc-network'
. /lib/udev/rule_generator.functions

interface_name_taken() {
local value="$(find_all_rules 'NAME=' $INTERFACE)"
if [ "$value" ]; then
return 0
else
return 1
fi
}

find_next_available() {
raw_find_next_available "$(find_all_rules 'NAME=' "$1")"
}

write_rule() {
local match="$1"
local name="$2"
local comment="$3"

{
if [ "$PRINT_HEADER" ]; then
PRINT_HEADER=
echo "# This file was automatically generated by the $0"
echo "# program, run by the persistent-net-generator.rules rules file."
echo "#"
echo "# You can modify it, as long as you keep each rule on a single"
echo "# line, and change only the value of the NAME= key."
fi

echo ""
[ "$comment" ] && echo "# $comment"
echo "SUBSYSTEM==\"net\", ACTION==\"add\"$match, NAME=\"$name\""
} >> $RULES_FILE
}

if [ -z "$INTERFACE" ]; then
echo "missing \$INTERFACE" >&2
exit 1
fi

# Prevent concurrent processes from modifying the file at the same time.
lock_rules_file

# Check if the rules file is writeable.
choose_rules_file

# the DRIVERS key is needed to not match bridges and VLAN sub-interfaces
if [ "$MATCHADDR" ]; then
match="$match, DRIVERS==\"?*\", ATTR{address}==\"$MATCHADDR\""
fi

if [ "$MATCHDRV" ]; then
match="$match, DRIVERS==\"$MATCHDRV\""
fi

if [ "$MATCHDEVID" ]; then
match="$match, ATTR{dev_id}==\"$MATCHDEVID\""
fi

if [ "$MATCHID" ]; then
match="$match, KERNELS==\"$MATCHID\""
fi

if [ "$MATCHIFTYPE" ]; then
match="$match, ATTR{type}==\"$MATCHIFTYPE\""
fi

if [ -z "$match" ]; then
echo "missing valid match" >&2
unlock_rules_file
exit 1
fi

basename=${INTERFACE%%[0-9]*}
match="$match, KERNEL==\"$basename*\""

if [ "$INTERFACE_NAME" ]; then
# external tools may request a custom name
COMMENT="$COMMENT (custom name provided by external tool)"
if [ "$INTERFACE_NAME" != "$INTERFACE" ]; then
INTERFACE=$INTERFACE_NAME;
echo "INTERFACE_NEW=$INTERFACE"
fi
else
# if a rule using the current name already exists, find a new name
if interface_name_taken; then
  if ! [ -e $dnc ]; then
INTERFACE="$basename$(find_next_available "$basename[0-9]*")"
# prevent INTERFACE from being "eth" instead of "eth0"
[ "$INTERFACE" = "${INTERFACE%%[ \[\]0-9]*}" ] && INTERFACE=${INTERFACE}0
echo "INTERFACE_NEW=$INTERFACE"
  fi
fi
fi

write_rule "$match" "$INTERFACE" "$COMMENT"

unlock_rules_file

exit 0


Step 2: Create a file named /etc/udev/rules.d/dnc-network

# touch /etc/udev/rules.d/dnc-network

Step 3: Shutdown the virtual machine and clone the machine to test

Enjoy :)

Friday, March 7, 2014

Seagate Backup Plus Not Getting Detected in Linux

Hi all,

Today i just bought my brand new Seagate backup plus 1 TB external hard disk and i was shocked when it did not get detected in my Linux PC. At first i was thinking, there was some fault with the drive and i almost started checking the process for claiming warranty.

Suddenly something stuck me, thought to check it over windows and mac and to my surprise it worked great. So then googled over net and found that Seagate backup plus does not support for Linux.

Some investigation on dmesg


[2610653.068031] usb 2-6: new high-speed USB device number 5 using ehci_hcd
[2610653.201801] usb 2-6: New USB device found, idVendor=0bc2, idProduct=a013
[2610653.201804] usb 2-6: New USB device strings: Mfr=2, Product=3, SerialNumber=1
[2610653.201806] usb 2-6: Product: Backup+ BK
[2610653.201807] usb 2-6: Manufacturer: Seagate
[2610653.201808] usb 2-6: SerialNumber: NA5CME4T
[2610653.202497] scsi7 : uas
[2610653.203558] scsi 7:0:0:0: Direct-Access     Seagate  Backup+ BK       0412 PQ: 0 ANSI: 6
[2610659.808099] scsi 7:0:0:0: uas_eh_abort_handler tag 0
[2610659.808105] scsi 7:0:0:0: uas_eh_device_reset_handler tag 0
[2610659.808108] scsi 7:0:0:0: uas_eh_target_reset_handler tag 0
[2610659.808111] scsi 7:0:0:0: uas_eh_bus_reset_handler tag 0
[2610659.920091] usb 2-6: reset high-speed USB device number 5 using ehci_hcd
[2610660.053560] scsi 7:0:0:0: Device offlined - not ready after error recovery
[2610660.053581] scsi 7:0:0:0: rejecting I/O to offline device
[2610660.053589] scsi 7:0:0:0: rejecting I/O to offline device
[2610660.054693] scsi 7:0:0:1: Direct-Access     Seagate  Backup+ BK       0412 PQ: 0 ANSI: 6
[2610660.055693] scsi 7:0:0:2: Direct-Access     Seagate  Backup+ BK       0412 PQ: 0 ANSI: 6
[2610660.056694] scsi 7:0:0:3: Direct-Access     Seagate  Backup+ BK       0412 PQ: 0 ANSI: 6
[2610660.057691] scsi 7:0:0:4: Direct-Access     Seagate  Backup+ BK       0412 PQ: 0 ANSI: 6
[2610660.058691] scsi 7:0:0:5: Direct-Access     Seagate  Backup+ BK       0412 PQ: 0 ANSI: 6
[2610660.059691] scsi 7:0:0:6: Direct-Access     Seagate  Backup+ BK       0412 PQ: 0 ANSI: 6
[2610660.060693] scsi 7:0:0:7: Direct-Access     Seagate  Backup+ BK       0412 PQ: 0 ANSI: 6
[2610660.061185] sd 7:0:0:0: Attached scsi generic sg2 type 0
[2610660.061637] sd 7:0:0:1: Attached scsi generic sg3 type 0
[2610660.062191] sd 7:0:0:2: Attached scsi generic sg4 type 0
[2610660.062493] sd 7:0:0:3: Attached scsi generic sg5 type 0
[2610660.062727] sd 7:0:0:4: Attached scsi generic sg6 type 0
[2610660.062963] sd 7:0:0:5: Attached scsi generic sg7 type 0
[2610660.063257] sd 7:0:0:6: Attached scsi generic sg8 type 0
[2610660.063516] sd 7:0:0:7: Attached scsi generic sg9 type 0
[2610690.848080] sd 7:0:0:2: uas_eh_abort_handler tag 0
[2610690.848084] sd 7:0:0:3: uas_eh_abort_handler tag 0
[2610690.848086] sd 7:0:0:4: uas_eh_abort_handler tag 0
[2610690.848088] sd 7:0:0:5: uas_eh_abort_handler tag 0
[2610690.848090] sd 7:0:0:6: uas_eh_abort_handler tag 0
[2610690.848093] sd 7:0:0:7: uas_eh_abort_handler tag 0
[2610690.848095] sd 7:0:0:0: uas_eh_abort_handler tag 0
[2610690.848097] sd 7:0:0:1: uas_eh_abort_handler tag 0
[2610690.848105] sd 7:0:0:0: uas_eh_device_reset_handler tag 0
[2610690.848108] sd 7:0:0:1: uas_eh_device_reset_handler tag 0
[2610690.848110] sd 7:0:0:2: uas_eh_device_reset_handler tag 0
[2610690.848112] sd 7:0:0:3: uas_eh_device_reset_handler tag 0
[2610690.848115] sd 7:0:0:4: uas_eh_device_reset_handler tag 0
[2610690.848117] sd 7:0:0:5: uas_eh_device_reset_handler tag 0
[2610690.848119] sd 7:0:0:6: uas_eh_device_reset_handler tag 0
[2610690.848122] sd 7:0:0:7: uas_eh_device_reset_handler tag 0
[2610690.848124] sd 7:0:0:2: uas_eh_target_reset_handler tag 0
[2610690.848127] sd 7:0:0:1: uas_eh_bus_reset_handler tag 0
[2610690.960091] usb 2-6: reset high-speed USB device number 5 using ehci_hcd
[2610691.093310] sd 7:0:0:1: Device offlined - not ready after error recovery
[2610691.093313] sd 7:0:0:0: Device offlined - not ready after error recovery
[2610691.093315] sd 7:0:0:7: Device offlined - not ready after error recovery
[2610691.093317] sd 7:0:0:6: Device offlined - not ready after error recovery
[2610691.093318] sd 7:0:0:5: Device offlined - not ready after error recovery
[2610691.093320] sd 7:0:0:4: Device offlined - not ready after error recovery
[2610691.093322] sd 7:0:0:3: Device offlined - not ready after error recovery
[2610691.093324] sd 7:0:0:2: Device offlined - not ready after error recovery
[2610691.093347] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093355] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093358] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093361] sd 7:0:0:0: [sdc] READ CAPACITY(16) failed
[2610691.093364] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093364] sd 7:0:0:0: [sdc]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093369] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093369] sd 7:0:0:0: [sdc] Sense not available.
[2610691.093372] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093374] sd 7:0:0:1: [sdd] READ CAPACITY(16) failed
[2610691.093374] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093378] sd 7:0:0:1: [sdd]  
[2610691.093378] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093382] Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093382] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093385] sd 7:0:0:1: [sdd] Sense not available.
[2610691.093386] sd 7:0:0:0: [sdc] READ CAPACITY failed
[2610691.093387] sd 7:0:0:0: [sdc]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093390] sd 7:0:0:0: [sdc] Sense not available.
[2610691.093394] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093394] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093397] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093400] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093403] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093403] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093405] sd 7:0:0:0: [sdc] Write Protect is off
[2610691.093408] sd 7:0:0:1: [sdd] READ CAPACITY failed
[2610691.093410] sd 7:0:0:1: [sdd]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093413] sd 7:0:0:1: [sdd] Sense not available.
[2610691.093413] sd 7:0:0:0: [sdc] Mode Sense: 00 00 00 00
[2610691.093416] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093418] sd 7:0:0:0: rejecting I/O to offline device
[2610691.093421] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093422] sd 7:0:0:0: [sdc] Asking for cache data failed
[2610691.093426] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093426] sd 7:0:0:0: [sdc] Assuming drive cache: write through
[2610691.093429] sd 7:0:0:1: [sdd] Write Protect is off
[2610691.093431] sd 7:0:0:1: [sdd] Mode Sense: 00 00 00 00
[2610691.093434] sd 7:0:0:1: rejecting I/O to offline device
[2610691.093436] sd 7:0:0:1: [sdd] Asking for cache data failed
[2610691.093437] sd 7:0:0:1: [sdd] Assuming drive cache: write through
[2610691.093479] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093482] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093485] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093487] sd 7:0:0:6: [sdi] READ CAPACITY(16) failed
[2610691.093488] sd 7:0:0:6: [sdi]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093491] sd 7:0:0:6: [sdi] Sense not available.
[2610691.093491] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093494] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093497] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093497] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093500] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093503] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093505] sd 7:0:0:6: [sdi] READ CAPACITY failed
[2610691.093506] sd 7:0:0:7: [sdj] READ CAPACITY(16) failed
[2610691.093507] sd 7:0:0:7: [sdj]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093510] sd 7:0:0:7: [sdj] Sense not available.
[2610691.093513] sd 7:0:0:6: [sdi]  
[2610691.093513] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093517] Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093517] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093520] sd 7:0:0:6: [sdi] Sense not available.
[2610691.093520] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093522] sd 7:0:0:7: [sdj] READ CAPACITY failed
[2610691.093525] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093526] sd 7:0:0:7: [sdj]  
[2610691.093528] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093529] Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093532] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093532] sd 7:0:0:7: [sdj] Sense not available.
[2610691.093535] sd 7:0:0:6: [sdi] Write Protect is off
[2610691.093537] sd 7:0:0:6: [sdi] Mode Sense: 00 00 00 00
[2610691.093540] sd 7:0:0:6: rejecting I/O to offline device
[2610691.093540] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093544] sd 7:0:0:6: [sdi] Asking for cache data failed
[2610691.093544] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093548] sd 7:0:0:6: [sdi] Assuming drive cache: write through
[2610691.093548] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093550] sd 7:0:0:7: [sdj] Write Protect is off
[2610691.093552] sd 7:0:0:7: [sdj] Mode Sense: 00 00 00 00
[2610691.093554] sd 7:0:0:7: rejecting I/O to offline device
[2610691.093556] sd 7:0:0:7: [sdj] Asking for cache data failed
[2610691.093557] sd 7:0:0:7: [sdj] Assuming drive cache: write through
[2610691.093568] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093571] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093574] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093576] sd 7:0:0:4: [sdg] READ CAPACITY(16) failed
[2610691.093577] sd 7:0:0:4: [sdg]  
[2610691.093577] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093581] Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093581] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093584] sd 7:0:0:4: [sdg] Sense not available.
[2610691.093584] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093587] sd 7:0:0:5: [sdh] READ CAPACITY(16) failed
[2610691.093590] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093590] sd 7:0:0:5: [sdh]  
[2610691.093593] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093593] Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093596] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093597] sd 7:0:0:5: [sdh] Sense not available.
[2610691.093600] sd 7:0:0:4: [sdg] READ CAPACITY failed
[2610691.093602] sd 7:0:0:4: [sdg]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093604] sd 7:0:0:4: [sdg] Sense not available.
[2610691.093607] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093607] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093609] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093613] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093616] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093616] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093618] sd 7:0:0:5: [sdh] READ CAPACITY failed
[2610691.093621] sd 7:0:0:4: [sdg] Write Protect is off
[2610691.093623] sd 7:0:0:4: [sdg] Mode Sense: 00 00 00 00
[2610691.093623] sd 7:0:0:5: [sdh]  
[2610691.093626] sd 7:0:0:4: rejecting I/O to offline device
[2610691.093627] Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093630] sd 7:0:0:4: [sdg] Asking for cache data failed
[2610691.093632] sd 7:0:0:4: [sdg] Assuming drive cache: write through
[2610691.093632] sd 7:0:0:5: [sdh] Sense not available.
[2610691.093634] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093637] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093640] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093642] sd 7:0:0:5: [sdh] Write Protect is off
[2610691.093644] sd 7:0:0:5: [sdh] Mode Sense: 00 00 00 00
[2610691.093646] sd 7:0:0:5: rejecting I/O to offline device
[2610691.093648] sd 7:0:0:5: [sdh] Asking for cache data failed
[2610691.093650] sd 7:0:0:5: [sdh] Assuming drive cache: write through
[2610691.093657] sd 7:0:0:3: rejecting I/O to offline device
[2610691.093660] sd 7:0:0:3: rejecting I/O to offline device
[2610691.093663] sd 7:0:0:3: rejecting I/O to offline device
[2610691.093665] sd 7:0:0:3: [sdf] READ CAPACITY(16) failed
[2610691.093666] sd 7:0:0:3: [sdf]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093670] sd 7:0:0:3: [sdf] Sense not available.
[2610691.093692] sd 7:0:0:2: rejecting I/O to offline device
[2610691.093695] sd 7:0:0:2: rejecting I/O to offline device
[2610691.093697] sd 7:0:0:2: rejecting I/O to offline device
[2610691.093700] sd 7:0:0:2: [sde] READ CAPACITY(16) failed
[2610691.093701] sd 7:0:0:2: [sde]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093703] sd 7:0:0:2: [sde] Sense not available.
[2610691.093705] sd 7:0:0:2: rejecting I/O to offline device
[2610691.093975] sd 7:0:0:3: rejecting I/O to offline device
[2610691.093979] sd 7:0:0:3: rejecting I/O to offline device
[2610691.093982] sd 7:0:0:3: rejecting I/O to offline device
[2610691.093984] sd 7:0:0:3: [sdf] READ CAPACITY failed
[2610691.093986] sd 7:0:0:3: [sdf]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.093988] sd 7:0:0:3: [sdf] Sense not available.
[2610691.093990] sd 7:0:0:3: rejecting I/O to offline device
[2610691.093993] sd 7:0:0:3: rejecting I/O to offline device
[2610691.093996] sd 7:0:0:3: rejecting I/O to offline device
[2610691.093998] sd 7:0:0:3: [sdf] Write Protect is off
[2610691.094000] sd 7:0:0:3: [sdf] Mode Sense: 00 00 00 00
[2610691.094002] sd 7:0:0:3: rejecting I/O to offline device
[2610691.094004] sd 7:0:0:3: [sdf] Asking for cache data failed
[2610691.094005] sd 7:0:0:3: [sdf] Assuming drive cache: write through
[2610691.094022] sd 7:0:0:2: rejecting I/O to offline device
[2610691.094025] sd 7:0:0:2: rejecting I/O to offline device
[2610691.094027] sd 7:0:0:2: [sde] READ CAPACITY failed
[2610691.094029] sd 7:0:0:2: [sde]  Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[2610691.094031] sd 7:0:0:2: [sde] Sense not available.
[2610691.094033] sd 7:0:0:2: rejecting I/O to offline device
[2610691.094035] sd 7:0:0:2: rejecting I/O to offline device
[2610691.094038] sd 7:0:0:2: rejecting I/O to offline device
[2610691.094040] sd 7:0:0:2: [sde] Write Protect is off
[2610691.094042] sd 7:0:0:2: [sde] Mode Sense: 00 00 00 00
[2610691.094044] sd 7:0:0:2: rejecting I/O to offline device
[2610691.094054] sd 7:0:0:2: [sde] Asking for cache data failed
[2610691.094056] sd 7:0:0:2: [sde] Assuming drive cache: write through
[2610691.094078] sd 7:0:0:7: [sdj] Attached SCSI disk
[2610691.094692] sd 7:0:0:2: [sde] Attached SCSI disk
[2610691.094822] sd 7:0:0:5: [sdh] Attached SCSI disk
[2610691.094859] sd 7:0:0:6: [sdi] Attached SCSI disk
[2610691.094894] sd 7:0:0:1: [sdd] Attached SCSI disk
[2610691.094951] sd 7:0:0:0: [sdc] Attached SCSI disk
[2610691.095008] sd 7:0:0:3: [sdf] Attached SCSI disk
[2610691.095044] sd 7:0:0:4: [sdg] Attached SCSI disk



So here is the procedure to make it detect on a Linux PC.

There is a kernel module called UAC, which is the culprit. Disabling the kernel module, made my disk getting detected.

# rmmod uac

unplug and plug hard disk and it gets detected.
Its simple :)

Saturday, January 18, 2014

Postgreql - Import All Tables to CSV

Hi all,
Today  i came across a situation where i need to import and export csv to postgresql db and to migrate all tables in a db to csv format. Lets see what i did,

Step 1: Change to 'postgres user'

# su postgres

Step 2: Login to a database (In my case i used a local database to test)

# psql <database name>

Example:
# psql testdb

Step 3: Lets see how to export just one table

# COPY <table name> to '/path/to/csv file' delimeters',';

Example:
# COPY zones to '/tmp/test.csv' delimeters',';

Step 4: Lets see how to import from csv

# COPY <table name> from '/path/to/csv file' delimeters',';

Example:
# COPY zones from '/tmp/test.csv' delimeters',';

Step 4: Lets see how to import all tables in a database. For that we need to create a function like below

# CREATE OR REPLACE FUNCTION all_csv(path TEXT) RETURNS void AS $$
   declare
      tables RECORD;
      statement TEXT;
   begin
      FOR tables IN 
         SELECT (table_schema || '.' || table_name) AS schema_table
         FROM information_schema.tables t INNER JOIN information_schema.schemata s 
         ON s.schema_name = t.table_schema 
         WHERE t.table_schema NOT IN ('pg_catalog', 'information_schema', 'configuration')
         ORDER BY schema_table
     LOOP
     statement := 'COPY ' || tables.schema_table || ' TO ''' || path || '/' || tables.schema_table || '.csv' ||'''          DELIMITER '';'' CSV HEADER';
         EXECUTE statement;
     END LOOP;
     return;  
     end;
     $$ LANGUAGE plpgsql;

Next we can use the above function to export to a folder

# SELECT all_csv('/path/to/directiry');

example:
SELECT all_csv('/tmp/tt');

Thats it, we are done. Enjoy with your work....

Tuesday, December 17, 2013

Shared Storage with OCFS2

Hi Friends,
How is it going ? Well today i am here to share with you how to share your shared storage (SAN in shared mode or shared iscsi lun ) across multiple nodes. Here we go

Do these steps on all nodes you wish to have shared storage

Step 1: Install ocfs2 tools on each of the nodes. Lets me assume you have debian based distro. Use relative commands for other distro

# apt-get install ocfs2-tools ocfs2console

Step 2: Edit default configuration file and enable O2CB

# vi /etc/default/o2cb

change

O2CB_ENABLED = false

to

O2CB_ENABLED = true

Step 3: Create the clustering configuration

# vi /etc/ocfs2/cluster.conf

Add these contents

node:
        ip_port = 7777
        ip_address = <node 1 ip>
        number = 1
        name = <node 1 host name>
        cluster = ocfs2
node:
        ip_port = 7777
        ip_address = <node 2 ip>
        number = 2
        name = <node 2 host name>
        cluster = ocfs2
cluster:
        node_count = 2
        name = ocfs2

Here
        <node # ip> is the node ip
        <node # host name> is the host name of node

I have assumed that my cluster consists of 2 nodes. If there are more nodes add more node parameter group and change node_count = <total of nodes in the cluster>

Step 4: start or restart o2cb service

# /etc/init.d/o2cb restart

Step 5: Change vm.dirty_ratio to reduce caching of files as it would create some lag in shared cluster.

# vi /etc/sysctl.conf

Add this line to the end of file, if it does not exists anywhere in the file

vm.dirty_ratio=10

Save the file and exit

Step 6: This step is performed on only one of the nodes. Here we format the file system to ocfs2 format

# mkfs.ocfs2 -b 4k -C 32k -L <any cluster name> -N <max no. of nodes> /dev/<shared device path>

example

# mkfs.ocfs2 -b 4k -C 32k  -L "cluster-storage" -N2 /dev/sdb1

Step 7: Perform the following steps on all nodes

# modprobe ocfs2_stackglue

Mount the shared partition on all nodes

# mount /dev/<shared device path> <mount point>

example

# mount /dev/sdb1 /mnt/

Step 8: Testing the shared storage

# touch <mounted location>/a

list it across all the other nodes

# ls <mounted location>

You must be able to see the shared data on all nodes :)

Sunday, December 15, 2013

Solution to Problem installing BCM Wireless drivers in linux

Hi All,
This is another page i write today which might help few people like me who struggled installing bcm wireless drivers on linux (debian). It may work for other flavors too. So steps are as follows.

Get to the terminal as root user and typw,

# lspci

and if you find something like this on the output of the command

Network controller: Broadcom Corporation BCM4313 802.11b/g/n Wireless LAN Controller (rev 01)

Then this solution might help you.

Download the bcm drivers from (choose your architecture)

http://www.broadcom.com/support/802.11/linux_sta.php

Also download the patch from the following site


Get to the folder where you downloaded the drivers

# cd <download driver>

Extract the driver and apply the patch

# tar zxvf <downloaded file name>
# cd <extracted folder>
# mv <patch> .
# patch -p0 src/wl/sys/wl_linux.c < bc_wl_abiupdate.patch

Compile the drivers

# make
# make install

Insert the module

# insmod /lib/modules/`uname -r`/wl.ko
# modprobe wl

There you go

Your wireless drivers are up. Tadaaaaaaaaaaa 

Thursday, June 27, 2013

Mounting VHD Image file in Linux

Back again,

So i have been playing around with so called VHD based image for a while. Here came the requirement, where i needed to mount this image and push in some keys... This is the solution i found

Step 1: Install the virtualbox fuse package which is required to open up this vhd image into its raw form

# apt-get install virtualbox-fuse

Step 2: Open up VHD image

# vdfuse -w -f <path to vhd image> <path to mount point>

Step 3: Check the extracted Files

# ls <path to mount point>

Here it could list either 

# EntireDisk

Lets mark this CASE 1

     (or)

# EntireDisk Partition1 Partion2 . ...

Depending on the number of partitions made on the Disk while creating and lets mark this as CASE 2

Step 4: Mount the extracted RAW image

# mount <path to vhd image>/EntireDisk <path to one more new mount point path>

In case of CASE 1

     (or)

# mount <path to vhd image>/Partition1 <path to one more new mount point>

In case of CASE 2
Partition here could be the one you wanted to mount

Step 5: unmounting the IMG and VHD after usage

# umount <path to mounted IMG partition>

# umount <path to vhd image>

Hope this is useful for all of you who see this :)

Tuesday, April 9, 2013

XCP hidden console

Hi all,

    Today am gonna introduce a hidden command on XCP's "xe tool stack"
Most of you who are familiar with xen's, xm console command, might wonder why such a command is missing in xe toolstack.

For those of you who wonder,
yes, xe tool-stack does have such a command, but it is hidden from help option.

So, you can access your VM, if you know its uuid

# xe console uuid=<uuid of VM>

Wednesday, January 30, 2013

Interesting problems from Facebook hackers cup

Hi friends,
Yesterday i participated on a coding contest.. Felt it is worth sharing :)
Hope you enjoy it too...........

BEAUTIFUL STRINGS

When John was a little kid he didn't have much to do. There was no internet, no Facebook, and no programs to hack on. So he did the only thing he could... he evaluated the beauty of strings in a quest to discover the most beautiful string in the world.

Given a string s, little Johnny defined the beauty of the string as the sum of the beauty of the letters in it.

The beauty of each letter is an integer between 1 and 26, inclusive, and no two letters have the same beauty. Johnny doesn't care about whether letters are uppercase or lowercase, so that doesn't affect the beauty of a letter. (Uppercase 'F' is exactly as beautiful as lowercase 'f', for example.)

You're a student writing a report on the youth of this famous hacker. You found the string that Johnny considered most beautiful. What is the maximum possible beauty of this string?

Input
The input file consists of a single integer m followed by m lines.

Output
Your output should consist of, for each test case, a line containing the string "Case #x: y" where x is the case number (with 1 being the first case in the input file, 2 being the second, etc.) and y is the maximum beauty for that test case.


Constraints
5 ≤ m ≤ 50
2 ≤ length of s ≤ 500

Example input

5
ABbCcc
Good luck in the Facebook Hacker Cup this year!
Ignore punctuation, please :)
Sometimes test cases are hard to make up.
So I just go consult Professor Dalves

Example output

Case #1: 152
Case #2: 754
Case #3: 491
Case #4: 729
Case #5: 646


*********************************************************************************


BALANCED SMILEYS


Your friend John uses a lot of emoticons when you talk to him on Messenger. In addition to being a person who likes to express himself through emoticons, he hates unbalanced parenthesis so much that it makes him go :(

Sometimes he puts emoticons within parentheses, and you find it hard to tell if a parenthesis really is a parenthesis or part of an emoticon.

A message has balanced parentheses if it consists of one of the following:
- An empty string ""
- One or more of the following characters: 'a' to 'z', ' ' (a space) or ':' (a colon)
- An open parenthesis '(', followed by a message with balanced parentheses, followed by a close parenthesis ')'.
- A message with balanced parentheses followed by another message with balanced parentheses.
- A smiley face ":)" or a frowny face ":("

Write a program that determines if there is a way to interpret his message while leaving the parentheses balanced.

Input
The first line of the input contains a number T (1 ≤ T ≤ 50), the number of test cases. The following T lines each contain a message of length s that you got from John.

Output
For each of the test cases numbered in order from 1 to T, output "Case #i: " followed by a string stating whether or not it is possible that the message had balanced parentheses. If it is, the string should be "YES", else it should be "NO" (all quotes for clarity only)

Constraints
1 ≤ length of s ≤ 100

Example input

5
:((
i am sick today (:()
(:)
hacker cup: started :):)
)(

Example output
Case #1: NO
Case #2: YES
Case #3: YES
Case #4: YES
Case #5: NO


*********************************************************************************

FIND MIN


After sending smileys, John decided to play with arrays. Did you know that hackers enjoy playing with arrays? John has a zero-based index array, m, which contains n non-negative integers. However, only the first k values of the array are known to him, and he wants to figure out the rest.

John knows the following: for each index i, where k <= i < n, m[i] is the minimum non-negative integer which is *not* contained in the previous *k* values of m.

For example, if k = 3, n = 4 and the known values of m are [2, 3, 0], he can figure out that m[3] = 1.

John is very busy making the world more open and connected, as such, he doesn't have time to figure out the rest of the array. It is your task to help him.

Given the first k values of m, calculate the nth value of this array. (i.e. m[n - 1]).

Because the values of n and k can be very large, we use a pseudo-random number generator to calculate the first k values of m. Given non-negative integers a, b, c and positive integer r, the known values of m can be calculated as follows:
m[0] = a
m[i] = (b * m[i - 1] + c) % r, 0 < i < k

Input
The first line contains an integer T (T <= 20), the number of test cases. This is followed by T test cases, consisting of 2 lines each. The first line of each test case contains 2 space separated integers, n, k (1 <= k <= 105, k < n <= 109). The second line of each test case contains 4 space separated integers a, b, c, r (0 <= a, b, c <= 109, 1 <= r <= 109).

Output
For each test case, output a single line containing the case number and the nth element of m.

Example input

5
97 39
34 37 656 97
186 75
68 16 539 186
137 49
48 17 461 137
98 59
6 30 524 98
46 18
7 11 9 46

Example output

Case #1: 8
Case #2: 38
Case #3: 41
Case #4: 40
Case #5: 12