Friday, April 24, 2009

Upgrade to Ubuntu 9.04

I was pleasantly surprised to see the dist upgrade to Ubuntu 9.04 from the previous 8.10 installation going well. It did not work so well last time during upgrade from 8.04 to 8.10. It crashed the root file system for me then. But the lazy me, hoped that it will work this time and it did and upgrade went fine. Web is already replete with praises for jaunty release.

Monday, March 16, 2009

Installing Subversion 1.5.3 on windows

Steps are:

svnadmin create "C:\svnrepo"

  • Edit C:\svnrepo\conf\svnserve.conf and uncomment the following lines:

anon-access = read
auth-access = write
password-db = passwd

  • Edit C:\svnrepo\conf\passwd file:add users in the format username = password one per line and remove the default users.
  • Set environment variable SVN_EDITOR to your favorite text editor (say Textpad.exe).
  • Set Subversion as a service with the following command at cmd prompt:
    • sc create Subversion binpath= "c:\svn\bin\svnserve.exe --service --root c:\svnrepo --listen-port 9999" displayname= "Subversion Repo" depend= Tcpip start= auto
    • Go to service control manager to start the Subversion service or type the following on :
      net start “Subversion Repo”





  • Import an existing project in subversion repo:




svn import C:\myproject svn://localhost:9999/myproject





  • After importing data, note that the original tree is not under version control. To start working, you still need to svn checkout a fresh working copy of the tree.




svn checkout svn://localhost:9999/myproject





  • Install 32 or 64 bit version of tortoise SVN from http://tortoisesvn.net/. After installing you will need to reboot your system. Tortoise SVN is a windows shell extension which makes the use of SVN from windows explorer very easy and intuitive.



There's a standard convention in Subversion to start with the "TTB folders" at the root of any project:



Because Subversion uses regular directory copies for branching and tagging (see Chapter 4, Branching and Merging), the Subversion community recommends that you choose a repository location for each project root -- the "top-most" directory which contains data related to that project -- and then create three subdirectories beneath that root: trunk, meaning the directory under which the main project development occurs; branches, which is a directory in which to create various named branches of the main development line; tags, which is a collection of tree snapshots that are created, and perhaps destroyed, but never changed.

So make it a practice to add the trunk, tags and branches directories to your project and all your project files will go under trunk then.

Monday, February 16, 2009

Introduction to Vim for Programmers

Vim editor:

It has 3 modes:

Ex mode <----> Command mode <-----> Insert mode.

You can never go from Insert to Ex mode directly or vice versa. You always
first need to go to command mode. Enter command mode by typing Esc and enter Ex mode by typing :.

For cursor movement:


k
h l
j
Cursor movement commands: {motion} commands:
G - Last line in file
gg - First line in file
% - Jump to matching brace (()}{[])
m{1etter} - example ma to mark a line. There can be at
max 26 marks in the file.
`{mark} - example `a to jump to the named mark.
`` - Jump to the last line where you jumped or searched from.
/expr - forward search where expr = is a regex.
?expr - backward search.
n - repeat last search in the same direction.
N - repeat last search in the opposite direction.
w - move cursor forward by one word.
b - move cursor backward by one word.
Some more cursor movement commands:
Cntl + F - move one screen forward.
Cntl + B - move one screen backward.
f{char} - position cursor at the matching {char} to the right.
t{char} - position cursor just before the matching {char} to the right.
F{char} - position cursor at the matching {char} to the left.
T{char} - position cursor just before the matching {char} to the left.


Basic insert commands:
i - enter insert mode.
a - enter insert mode after character under cursor.
I - enter insert mode starting before first non blank character on the line.
A - enter insert mode starting after last non blank character on the line.
o - enter insert mode starting on a new line after current cursor line.
O - enter insert mode starting on a new line before current cursor line.


Change commands:
C - delete everything from cursor to end of line.
c{motion} - delete everything from cursor position as determined by the motion (one of the cursor movement commands).
Example:
c5{h}
- deletes 5 chars to the left (as h is for
left movement).
c2w - deletes 2 words and puts in insert mode.
S - Substitute/change current line entirely. Delete all text on current line and put in insert mode.


Patterns for using change commands:
2cw - change 2 words.
cta - delete everything upto next occurrence of letter a.
5cta - delete everything upto 5th occurrence of letter a.
5S - delete current line and subsequent 4 lines.


Miscellaneous commands:
u - undo
Cntl + R - redo
Cntl + N/Cntl + P - autocompletion with text that already exists in the in the document.
. - repeat the last change.
zt - redraw the screen placing current line to top of screen.
zz - redraw the screen placing current line to the center of screen.
zb - redraw the screen placing current line to the bottom of screen.

Delete, cut and paste commands:
D - Delete from current cursor position to the end of line.
d{motion} - delete from current curson position to the position determined by {motion} command. Example,
d5w - delete next 5 words.
dn - delete till next matching search pattern.
d`a - delete till marked line named a.
y{motion} - yank or copy from current cursor position to the position
determined by {motion} command. Example,
y5w - copy next 5 words.
yG - copy till the end of file.
p - put the character in registry/clipboard after current character under cursor.
P - put the character in registry/clipboard before current character under cursor.
dfa - delete until character first character a from current cursor position.
dta - delete upto character first character a from current cursor position.
yy4p - copy current line and paste it 4 times.
dG - delete everything from current line till end of file.
y50G - copy everything from current line till line 50.
d5l - delete 5 characters to the right (l is for right motion).
5dd - delete 5 lines including current one.


Ex mode:
Ex mode commands are of the form:
:[firstline][,lastline]command


Example:
:25,30d - delete lines from 25 to 30.
Line numbers are optional.
If no line number is specified, command applies to current line.
If only one line number is specified, command applies to that line.
To affect a range of lines, we need to specify both firstline and lastline.

Shortcuts for specifying line numbers in Ex mode:
. - current line number. Example- :.,50d - delete from current to line 50.
$ - last line number in file.
% - entire file - same as specifying 1,$.
`a - line number of bookmarked line a.
/expr/ - next line that matches expr.
?expr? - previous line that matches expr.
\/ - next line that matches the most recent expr.
\? - prev line that matches the most recent expr.
\& - next line that matches the most recent substitution.


Examples:
:/Begin/,/End/d - deletes lines from first line that has word Begin till
last line which has word End.

10,40w bkup.dat - saves the lines 10 to 40 in a file bkup.dat.

Essential Ex Commands:
:w {filename} - save the current buffer to filename.
:q - quite the current buffer.
:x - same as :wq - quite and save unsaved data.
:e {filename} - open named file for editing in a new buffer.
:d - delete current line or range of lines
:map {a} {b} - remap the keys used in command mode.
:set {arguments} - configure vim (mostly to be used in .vimrc)
:help - vim help.


Search and Replace:
:s/search/replacement/flags


If search or replacement string contains / character then either we can
escape it with a \ or use a different delimiter (like #) other than / for
eg:
:s#/usr/share/file1#/usr/share/file2/#


Usage examples:
  1. first occurrence single line :s/bash/perl/
  2. all occurrences single line :s/bash/perl/g
  3. first occurrence between line range: :23,100s/bash/perl/
  4. all occurrences between line range: :23,100s/bash/perl/g
  5. first occurrence in whole text: :%s/bash/perl/
  6. all occurrences whole text: :%s/bash/perl/g
Code browsing:
Run ctags as follows in the source directory and it generates an index file
called tags of source files in current directory and its subdirectories.

ctags -R

Now in vim we can use each source file as a web page with each symbol
(variable, function) having hyperlinks, such that, if you do a cntl + ] on
the current symbol then it will take you to the definition of the symbol.

Following are commands for browsing code in vim:
Cntl + ] - jump to the tag under cursor (ie go to definition of function,
class, declaration of variable).
Cntl + T - Return to current tag from most recent jump off point.
:pop - Same as Cntl + T except that we can specify count to go back
multiple levels.
:tn - Jump to next match (when tag produces more than one match in
case of C++ overloaded functions).
:tp - Jump to previous match (in case of multiple matches).
:ts name - Shows a list of matching tags you can select from.
:tags - Show current tag stack with one line for each tag.

Lastly, to build c/c++ code:
:make {args} - invokes the make program. We can change the make program in to say ant by using Ex mode (or in .vimrc) as
:set makeprg=ant

One nice .vimrc can be found at:
http://research.iiit.ac.in/~masatran/config/.vimrc

Use
wget http://research.iiit.ac.in/~masatran/config/.vimrc
to get it.


Sunday, February 15, 2009

A short introduction to GNU make

A make rule looks like the following:

target: prerequisite
commands

Example:

.PHONY: all
all: program1 program2
program1: a.o b.o
gcc -o program1 a.o b.o
program2: c.o d.o
gcc -o program2 c.o d.o


This tells make not to search for a file named all and to assume that this target
is always obsolete.


Defining variables:

Variables in a make file are like in an ant build script but they
can only be set once unlike ant properties and dont change value.

FLAGS = first
all:
@echo FLAGS=$(FLAGS)

FLAGS = second
other:
@echo FLAGS=$(FLAGS)


The FLAGS variable is assigned the last value which is set in the build file
viz. second and so even if we run all target, the value echoed for FLAGS
will be second.
* So, a variable should be set just once in the make file. *

VAR = value
VAR := value


The := form allows variables to reference themselves without recursion.

VAR = value
# Wrong! Causes infinite recursion
VAR = $(VAR) more

# Okay, the := prevents recursion
VAR := $(VAR) more


# A GNU extension that does the same thing
VAR = value
VAR += more

make automatically removes leading and trailing white space from your
variable values when you use the traditional syntax.

TRAD= Hello World
all:
@echo "$(TRAD)" -- removes the spaces in the o/p


If we want to preserve the spaces:

TRAD=$() Hello World $()


we can use the built-in empty variables $() to mark the beginning and end.

GNU make comes with many implicit rules to do almost everything you need.


.c.o:
$(COMPILE.c) $(OUTPUT_OPTION) $<

where,
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
CC = gcc

This says, “If you see a target with an .o extension, and there is no explicit
rulefor it, look for a file with the same base and the .c extension. If you find
it, run these commands.”

We can checkout such implicit rules and built-in variables by:
make -p

CFLAGS and others are not defined but make allows referencing not defined
variables and will replace them with empty strings.

We can set CFLAGS= -g to enable debugging.

Common variables used in implicit rules:
CC = gcc - C Compiler
CXX = g++ - C++ compiler.
CFLAGS = none - flags passed to C compiler.
CXXFLAGS = none - flags passed to C++ compiler.
CPPFLAGS = none - flags passed to C Pre Processor. Typical flags include -I, -D and -U.



Default suffix rules to create object code:
.c = $(CC) -c $(CPPFLAGS) $(CFLAGS)
.cpp, .cc, .C = $(CXX) -c $(CPPFLAGS) $(CXXFLAGS)
.s = $(AS) $(ASFLAGS) -- for assembley code.


Automatic Variables:
Their values can change in the context they are used. Regular variables can
also contain automatic variables.

Example:
build_C_program=$(CC) -o $@ $^

program1: mod1.o mod2.o
$(build_C_program)
program2: mod3.o mod4.o
$(build_C_program)


Note: implicit rule will be used to create the pre-requisites modx.o:

.c.o:
$(COMPILE.c) $(OUTPUT_OPTION) $<


then modx.o will be fed to the build_C_program to generate the programx
executables.

Useful automatic variables in GNU make:
  1. $@ = target filename
  2. $^ = all pre-requisites with duplicate names removed.
  3. $+ = all pre-requisites with duplicate names.
  4. $< = name of first pre-requisite in the rule.
  5. $? = name of pre-requisite newer than target.
  6. $* = base name of target file (without extension).


Manipulating variables with functions:

CSRCS=foo.c
CXXSRCS=foo.cpp
OBJS=$(CSRCS:.c=.o) $(CXXSRCS:.cpp=.o)


or use:
OBJS:=$(addsuffix .o, $(basename $(SRCS)))


shell function:
CURRENT_TIME=$(shell date +%T)
something:
@echo started $(CURRENT_TIME)


Other functions provided by GNU make are:
  • $(subst from, to, text)
  • $(patsubst from-pattern, to-pattern, filenames)
  • $(strip string) -- removes the whitespace chars.
  • $(findstring match, string)
  • $(filter patterns, filenames) -- returns files that match one or more space
  • separated patterns
  • $(sort text) - lexical order sort
  • $(word n, text) - nth word in text
  • $(error message) - fails the build after printing the message.


User can define custom functions which can be called as:
myfunction = @echo $(1) $(2)
all:
$(call myfunction,hello,world)


Conditionals:
ifeq, ifneq
ifdef, ifndef

ifeq ($(shell uname -o),GNU/Linux)
CPPFLAGS += -DLINUX
endif


Note: The text that appears inside the conditional clause may be any valid make lines, but conditionals may not be used inside the command section of rules or inside variable/function definitions.

To ensure that A_VITAL_VARIABLE is defined or else the build has to fail:

ifndef (A_VITAL_VARIABLE)
$(error A_VITAL_VARIABLE is not set)
endif
Generally, projects will have a Makefile for each project source directory.

A sample makefile:
The below makefile resides in the bin/ directory and compiles C and C++ sources in src/ directory. The executables are created in bin/ directory.
.PHONY: all


VPATH=../src
CFLAGS += -Wall -Wformat-nonliteral -Wformat-y2k
build_C_program=$(CC) $(CFLAGS) -Wstrict-prototypes -o test $^
build_CXX_program=$(CXX) $(CXXFLAGS) -Weffc++ -o hello $^
CSRCS=test.c
CXXSRCS=hello.cpp
COBJS=$(CSRCS: .c=.o)
CPPOBJS=$(CXXSRCS: .cpp=.o)
CURRENT_TIME=$(shell date +%T)

ifdef (debug)
CFLAGS += -g
CXXFLAGS += -g
else
CFLAGS += -O2
CXXFLAGS += -O2
endif


all: empty.so ccode cppcode
@echo started $(CURRENT_TIME);

ccode: $(COBJS)
@echo Building C code; \
$(build_C_program)

cppcode: $(CPPOBJS)
@echo Building CPP code;\
$(build_CXX_program)

empty.so: empty.c
$(CC) -shared -fpic -o $@ $^

run: all
LD_LIBRARY_PATH=../src ./test

clean:
rm -f empty.so $(COBJS) $(CPPOBJS)

cleanall: clean
rm -f $(basename $(COBJS) $(CPPOBJS))

Friday, February 13, 2009

VNCServer Configuration

In the ~/.vnc/xstartup we can configure vnc session to start in gnome or kde, as shown below:

#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
/usr/dt/bin/dtwm &
startkde &

#gnome-session &

Then start vnc server as:

$ vncserver

This will tell you the hostname:sessionnum and set the password:

$ vncpasswd

Now you are all set to connect with your favorite vnc client (i use realvnc).

Monday, February 09, 2009

Port Forwarding : Accessing your home computer from work

In order to access the home ubuntu desktop from work, following is what i needed to do:

  1. Installed open-ssh demon on ubuntu with: sudo apt-get install open-ssh
  2. Tested that i could use a windows box on the home lan to access the sshd using putty.
  3. Once sshd is setup, followed the instructions at http://www.portforward.com/help/pfprogression.htm, which is broadly the following:
  • First we need to setup static/manual IP on the host computer to which we want to forward the port(s) to. Mine was setup to obtain IP address using DHCP so i first changed that to manual.
  • Then login to the router (mine is an Air-link AR670W) and enable Port Forwarding for the SSH application port 22 for both TCP/UDP protocols and provided the static IP of my ubuntu desktop.
  • Saved the configuration and router reboots after that.


Then i noted down the ISP assigned public IP to my router's external interface and used that IP (external IP of my router) from a windows box to putty to. Since the SSH port 22 on router is configured to be forwarded to my ubuntu desktop, so i was allowed my way to the ubuntu desktop.

http://www.portforward.com/routers.htm has a listing of several routers and the documentation on how to configure that router for port forwarding.

Also checkout how to setup a easy to remember domain name for your router so that you dont have to remember your router IP (http://www.techthrob.com/tech/dyndns.php). This way even if your router is assigned a new external IP by your ISP, the ddclient demon will automatically update the mapping of your domain id to the new IP. The dyndns.com site has a script generator which can generate the ddclient.conf file for you. Use the generator and it will work without fail. You can find it here.

To configure ubuntu 8.10 for static IP, just use the System > Preferences > Network Configuration UI and select Manual for Method in IPv4 Settings tab and provide your static IP address (say 192.168.1.100), the netmask and the gateway (router ip - like 192.168.1.1). Also you may provide DNS servers (check your router's status page for knowing what DNS servers to use - it will automatically have got it from your ISP).

Wednesday, November 26, 2008

Extending Net-SNMP 5.4.2.1 Agent

This article describes how to extend Net-SNMP agent toolkit to instrument the EtherLike-MIB (RFC 3635) with hardcoded defaults. This article will describe the setup on windows (I used XP SP3) and Linux (I used openSUSE 11.0) required to develop this agent.

The following instructions were carried out for net-snmp source version 5.4.2.1. This article assumes the following default paths:

  1. Net-SNMP un-archived on windows in C:\net-snmp and ~/net-snmp on Linux.
  2. Net-SNMP installed in C:\usr on Windows and /usr/local on Linux.

1.1. Setup the development environment

  1. Download and install MSVC++ Express 2005 from http://www.microsoft.com/express/2005/download/default.aspx. There is some compilation issue of the net-snmp code with MSVC++ 2008 (Orcas) and i did not bother to fix it but used the 2005 instead.
  2. Download and setup platform sdk as described in http://www.microsoft.com/express/2005/platformsdk/default.aspx. Be sure to setup the development environment using the PSDK as described in the link step-wise.
  3. Download net-snmp source from http://www.net-snmp.org/download.html. The net-snmp version 5.4.2.1 can be downloaded from there.

1.2. Build and install net-snmp from source on windows

  1. Un-archive the net-snmp source to say c:\net-snmp.
  2. Follow the README.win32 to build the net-snmp code (Read the section Microsoft Visual C++ - Workspace – Building).
    1. We need to first load the winsdk.dsw in the MSVC++ 2005 express. Below is the screenshot of all projects that make up the win32sdk workspace in MSVC++.

clip_image002

Figure 1 - Projects in win32sdk.dsw

    1. Modify the win32\netsnmp\netsnmpconfig.h file to add:
               #define HAVE_WIN32_PLATFORM_SDK 1






    1. Build in order, the following project for (Release | Debug) configuration.





i. libagent



ii. libhelpers



iii. libnetsnmptrapd



iv. libsnmp



v. netsnmpmibsdk






    1. Go to Build > Batch Build… and select the (Debug | Release) configuration of all projects except for the ones you built in step c above.





  1. If everything is okay with setup, then build should go fine too.




  2. Using cmd line on windows, go to c:\net-snmp and run the command: win32\install_netsnmp.bat to install net-snmp you built above to location c:\usr.




  3. Set the c:\usr\bin to PATH environment variable for easy access to the command line snmp client and agent executables.




1.3. Build and install net-snmp from source on Linux





  1. Un-archive the net-snmp source to say ~/net-snmp.




  2. Follow the INSTALL to build the net-snmp code. Run the following commands on shell prompt:




    1. cd ~/net-snmp




    2. ./configure




    3. make




    4. make install (run as root)






The make install step will install the net-snmp binaries by default in /usr/local path.



1.4. Configuring the snmpd agent (snmpd.conf)





  1. Configure snmp agent by running snmpconf command (see man page) or copy the C:/net-snmp/Example.conf and modify.




    1. snmpconf –g basic_setup






  2. I used the following configuration. Copy-paste the text below into a file named snmpd.conf. The agent is configured for snmp v2c and with rwcommunity string of public.







com2sec local     localhost       public


 


group MyRWGroup    v1         local


group MyRWGroup    v2c        local


group MyRWGroup    usm        local


 


 


view all    included  .1                               80


 


 


#                context sec.model sec.level match  read   write  notif


access MyROGroup ""      any       noauth    exact  all    none   none


access MyRWGroup ""      any       noauth    exact  all    all    none


 


 


syslocation Right here, right now.


syscontact Me <me@somewhere.org>







  1. Save the file in path :




    1. C:\usr\etc\snmp\snmpd.conf (on Windows)




    2. /etc/snmp/snmpd.conf (on Linux)






1.5. Load the MIB module and generate the C code





  1. The EtherLike-MIB has 5 tables (columnar variables).




  2. For mib2c code generation I used linux host. Run the following commands on shell prompt:







mkdir ethmib_src


cd ethmib_src 


export MIBS=ALL 





EtherLike-MIB was part of the net-snmp distribution so all we need is to tell mib2c to use it by setting the environment variable MIBS.






mib2c –c mib2c.create-dataset.conf dot3StatsTable 





This will generate dot3StatsTable.c and dot3StatsTable.h files.



Similarly run the similar command for the other tables in the mib.






mib2c –c mib2c.create-dataset.conf dot3PauseTable 


mib2c –c mib2c.create-dataset.conf dot3HCStatsTable 


mib2c –c mib2c.create-dataset.conf dot3CollTable 


mib2c –c mib2c.create-dataset.conf dot3ControlTable 





Use the ethmib_src and use it for windows agent extension too.



1.6. Use the generated source files to instrument the mib on Windows





  • On Windows, the above generated source files can be copied to c:\net-snmp\agent\mibgroups. You may also create a folder names EtherLike-MIB and sub-folders for each table like dot3StatsTable etc, and keep the respective table *.c and *.h files in the folder with the table name.




  • Add the generated sources in the MSVC++ netsnmpmibssdk project as shown below:




clip_image004



Figure 2 - EtherLike-MIB files added to the netsnmpmibssdk project.





  • Add the dot3StatsTable.h and dot3StatsTable.c files to your 'netsnmpmibssdk' project in VC++.




  • Next edit the '<sourcedir>\win32\mib_module_includes.h' file to add an include to your .h file.







#include "mibgroup/EtherLike-MIB/dot3StatsTable/dot3StatsTable.h"


#include "mibgroup/EtherLike-MIB/dot3HCStatsTable/dot3HCStatsTable.h"


#include "mibgroup/EtherLike-MIB/dot3CollTable/dot3CollTable.h"


#include "mibgroup/EtherLike-MIB/dot3ControlTable/dot3ControlTable.h"


#include "mibgroup/EtherLike-MIB/dot3PauseTable/dot3PauseTable.h"





 





  • Next edit the '<sourcedir>\win32\mib_module_inits.h' file to add code to call your initialize function.







if (should_init("dot3StatsTable")) init_dot3StatsTable();


if (should_init("dot3HCStatsTable")) init_dot3HCStatsTable();


if (should_init("dot3CollTable")) init_dot3CollTable();


if (should_init("dot3ControlTable")) init_dot3ControlTable();


if (should_init("dot3PauseTable")) init_dot3PauseTable();





 



1.7. Instrument the EtherLike-MIB



This section only instruments the dot3StatsTable generated source to return some default data. Other table instrumentation can be done in the similar manner.





  1. Edit the dot3StatsTable.c file as shown below to return some hardcoded data. The changes to the generated code have been highlighted.







/*


 * Note: this file originally auto-generated by mib2c using


 *        : mib2c.create-dataset.conf 9375 2004-02-02 19:06:54Z rstory $


 */


 


#include <net-snmp/net-snmp-config.h>


#include <net-snmp/net-snmp-includes.h>


#include <net-snmp/agent/net-snmp-agent-includes.h>


#include "dot3StatsTable.h"


 


/** Initialize the dot3StatsTable table by defining its contents and how it's structured */


void


initialize_table_dot3StatsTable(void)


{


    static oid dot3StatsTable_oid[] = {1,3,6,1,2,1,10,7,2};


    size_t dot3StatsTable_oid_len = OID_LENGTH(dot3StatsTable_oid);


    netsnmp_table_data_set *table_set;


    


    // variables declared – wrajnees


    netsnmp_table_row *row;


    static int _max_cols = 21; // there are 18 columns in this table.


    int column = 0;


    int index = 1;


    int val = 20;


    static oid      objid_etherchipset[] = { 0 };     /* ethernetChipset vendor oid */


 


    // end variables declared.


 


    /* create the table structure itself */


    table_set = netsnmp_create_table_data_set("dot3StatsTable");


 


    /* comment this out or delete if you don't support creation of new rows */


    


    table_set->allow_creation = 1;


 


    /***************************************************


     * Adding indexes


     */


    DEBUGMSGTL(("initialize_table_dot3StatsTable",


                "adding indexes to table dot3StatsTable\n"));


 


    netsnmp_table_set_add_indexes(table_set,


                           ASN_INTEGER,  /* index: dot3StatsIndex */


                           0);


 


    


    DEBUGMSGTL(("initialize_table_dot3StatsTable",


                "adding column types to table dot3StatsTable\n"));         


    netsnmp_table_set_multi_add_default_row(table_set,


                                            /*COLUMN_DOT3STATSINDEX, ASN_INTEGER, 0,


                                            NULL, 0,*/


                                            COLUMN_DOT3STATSALIGNMENTERRORS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSFCSERRORS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSSINGLECOLLISIONFRAMES, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSMULTIPLECOLLISIONFRAMES, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSSQETESTERRORS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSDEFERREDTRANSMISSIONS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSLATECOLLISIONS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSEXCESSIVECOLLISIONS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSINTERNALMACTRANSMITERRORS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSCARRIERSENSEERRORS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSFRAMETOOLONGS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSINTERNALMACRECEIVEERRORS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSETHERCHIPSET, ASN_OBJECT_ID, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSSYMBOLERRORS, ASN_COUNTER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSDUPLEXSTATUS, ASN_INTEGER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSRATECONTROLABILITY, ASN_INTEGER, 0,


                                            NULL, 0,


                                            COLUMN_DOT3STATSRATECONTROLSTATUS, ASN_INTEGER, 0,


                                            NULL, 0,


                              0);


 


 


    


    /* registering the table with the master agent */


    /* note: if you don't need a subhandler to deal with any aspects


       of the request, change dot3StatsTable_handler to "NULL" */


    netsnmp_register_table_data_set(netsnmp_create_handler_registration("dot3StatsTable", NULL,


                                                        dot3StatsTable_oid,


                                                        dot3StatsTable_oid_len,


                                                        HANDLER_CAN_RONLY),


                            table_set, NULL);


    // Add code - wrajnees


 


    /*


     * create the a row for the table, and add the data 


     */


    row = netsnmp_create_table_data_row();


    /*


     * set the index to the IETF WG name "snmpv3" 


     */


    netsnmp_table_row_add_index(row, ASN_INTEGER, (u_char*)&index, sizeof(index));


    /*


     * set the column 2 and above


     */


    for (column = 2; column <= _max_cols; column++) {


        // Following columns are not valid.


        switch(column) {


            case 12: // INVALIDs


            case 14:


            case 15:


                break;


            case 17: // OID


                netsnmp_set_row_column(row, column, ASN_OBJECT_ID,


                               (u_char*)objid_etherchipset, 1*sizeof(oid));


                break;


            case 19: // INTEGER


            case 21:


                netsnmp_set_row_column(row, column, ASN_INTEGER,


                               (u_char*)&val, sizeof(val));    


                break;


            case 20: // TRUTH_VALUE


                netsnmp_set_row_column(row, column, ASN_INTEGER,


                               (u_char*)&val, sizeof(val));    


                break;


            default: // COUNTER


                netsnmp_set_row_column(row, column, ASN_COUNTER,


                               (u_char*)&val, sizeof(val));    


                break;


        }


 


 


    }


    /*


     * add the row to the table 


     */


    netsnmp_table_dataset_add_row(table_set, row);


 


    /*


     * Finally, this actually allows the "add_row" token it the


     * * snmpd.conf file to add rows to this table.


     * * Example snmpd.conf line:


     * *   add_row netSnmpIETFWGTable eos "Glenn Waters" "Dale Francisco"


     */


    netsnmp_register_auto_data_table(table_set, NULL);


 


    // End add code - wrajnees


}


 


/** Initializes the dot3StatsTable module */


void


init_dot3StatsTable(void)


{


 


  /* here we initialize all the tables we're planning on supporting */


    initialize_table_dot3StatsTable();


}







  1. Now rebuild the netsnmpmibssdk project and then snmpdsdk project, in order.




  2. Run the following command to re-install the modified agent with the dot3StatsTable changes.







cd c:\net-snmp 


win32\install_netsnmp.bat 







  1. Start the new agent as follows:







cd c:\usr\bin 


snmpd.exe –f –Lo –V 







  1. Open a MIB Browser to walk the dot3StatsTable instrumentation:




clip_image006



1.8. Instrumentation on Linux





  1. Copy the generated source to the path ~/net-snmp/agent/mibgroups and run the following commands:







./configure –with-mib-modules=”dot3StatsTable dot3PauseTable dot3HCStatsTable dot3CollTable dot3ControlTable” 


make 


make install (run as root)







  1. Start the snmpd as:







/usr/local/sbin/snmpd –f –Lo –V 







  1. Run a command line snmpwalk to test it.







$ snmpwalk -v 2c -mAll -c public localhost dot3StatsTable 


 


EtherLike-MIB::dot3StatsAlignmentErrors.1 = Counter32: 20 


EtherLike-MIB::dot3StatsFCSErrors.1 = Counter32: 20 


EtherLike-MIB::dot3StatsSingleCollisionFrames.1 = Counter32: 20 


EtherLike-MIB::dot3StatsMultipleCollisionFrames.1 = Counter32: 20 


EtherLike-MIB::dot3StatsSQETestErrors.1 = Counter32: 20 


EtherLike-MIB::dot3StatsDeferredTransmissions.1 = Counter32: 20 


EtherLike-MIB::dot3StatsLateCollisions.1 = Counter32: 20 


EtherLike-MIB::dot3StatsExcessiveCollisions.1 = Counter32: 20 


EtherLike-MIB::dot3StatsInternalMacTransmitErrors.1 = Counter32: 20 


EtherLike-MIB::dot3StatsCarrierSenseErrors.1 = Counter32: 20





2. Co-existance with MS Windows SNMP Agent



We have 2 approaches to getting the net-snmp agent to co-exist with the Microsoft provided SNMP agent:





  • As of Net-SNMP 5.4, the Net-SNMP agent is able to load the Windows SNMP service extension DLLs by using the Net-SNMP winExtDLL extension. In this scenario, MS SNMP agent is installed but disabled. This is required because winExtDLL extension and existing windows extensions use Windows SNMP API from snmpapi.dll. The limitations of this approach are:





    • linkUp/Down generic traps are not received for some unknown reason.




    • sysUpTime.0 does not report the correct uptime for the agent. This is because the Windows extension checks for the uptime of the SNMP service, which is not running when Net-SNMP is running.





  • Alternatively, Net-SNMP agent can run as a proxy SNMP agent and will proxy for the MS SNMP agent (running at a non-default port) for those MIBs that MS SNMP agent instruments. For all other MIBs, Net-SNMP agent can service the SNMP requests. This approach does not suffer from the winExtDLL approach’s limitation, but then we need to run two snmp agents (net-snmp and MS snmp agents).




This sums up in short, the development setup required to get started with extending the net-snmp agent.

Wednesday, October 22, 2008

SCDJWS 1.4 Study Guide | Pothi.com

SCDJWS 1.4 Study Guide | Pothi.com

Posted using ShareThis

Sunday, August 17, 2008

Vim quick reference

The following content is excerpted from http://linuxconfig.org/Vim_Tutorial. It covers most of the essentials that one needs while editing code. One thing which i know and use and is not covered is :e < filename > to open multiple files without exiting vim and then navigating among the open files using :b < num > , where num is file buffer number for the open files . Other than that, there were quite a few points in the tutorial that were really good and i did not use/know them before. Also see other good links to learn more on vi/vim at http://delicious.com/rwatsh/vi.

Vim Tutorial Summary

VIM novice level Summary

  • Moving around with cursor:
    h key = LEFT, l key = RIGHT, k key = UP, j key = DOWN
  • Exiting vim editor without saving:
    press ESC to get into command mode, enter :q! to exit.
  • Deleting characters in vim command mode:
    delete with x key
  • Inserting / appending text:
    Press i or a in command mode and type
  • Saving changes and exit:
    in command mode :wq or SHIFT+zz

VIM Operators and Motions summary

  • Deleting words:
    delete word with d operator and w or e motion
  • Deleting to the end of the line:
    delete to th end of the line with d operator and $ motion
  • Using operators, motions and counts:
    beginning of th line 0, end of the line $, end of the 2nd word 2e beginning of the 4th word 4w
  • Deleting multiple words:
    to delete 3 words you would use d3w
  • Deleting lines:
    to delete single line dd, delete n lines ndd
  • Undo changes:
    undo changes with u

VIM apprentice user summary

  • Paste command:
    paste your cache memory with p command
  • Replace characters:
    rt replace current character with t
  • Change characters:
    ce to change single word, c$ to change to the end of the line

VIM experienced user summary

  • Advanced Navigation:
    end of the file G, begging of the file gg or 1G, to get on line n use nG
    instruct vim display file information CTRL+g
  • Search text with vim:
    search forward /, search backward ?, next search n , previous search N
  • Vim Substitution :
    first occurrence single line :s/bash/perl/
    all occurrences single line :s/bash/perl/g
    first occurrence between line range: :23,100s/bash/perl/
    all occurrences between line range: :23,100s/bash/perl/g
    first occurrence in whole text: :%s/bash/perl/
    all occurrences whole text: :%s/bash/perl/g

VIM veteran user summary

  • Execute external commands on shell from vim:
    :!ls will execute ls command on your shell
  • Writing to files advanced::w saves current file without quit, :w bash.sh whites to file bash.sh
  • Highlight text ans save to different file:highlight text with v operator and save it with :w
  • Retrieve text from different file::r will retrieve content of file

VIM expert user summary

  • Using o operator:
    :o insert line bellow you cursor, O inserts line above your cursor
  • Copy and paste:
    yank line with y and paste it with p
  • Customize vim's environment:
    edit ~/.vimrc file to customize vim's environment

Friday, April 18, 2008

Free Java Programmer's Test



I stumbled on the site http://www.betterprogrammer.com today and found that it offers an open book programming test meaning you can use all reference (like one can do at work) but complete 5 programming exercises pertaining to use of core Java language for writing algorithms. It requires lots of Java collections framework usage and writing some recursion algorithms, writing tree traversal code, calculating prime numbers and stuff like that. The time limit is not very strict and it even allows you to take a break and then continue with the test. In the end you are given a free certificate based on percentile (which it states will keep changing - read may improve - with time, as more people take this free test). The questions were good quality and if you have some free time and like to write code then its quite a good avenue to spend some time on.

My certificate is here: http://www.betterprogrammer.com/certificate/BP1Q9GB5

They claim to maintain this certificate for you in their database and that you can retake the tests to improve (not sure if the questions remain the same - if they dont change then thats a bummer) but anyway take it once and you will love it. If you have taken this test already then feel free to leave your comments on how you liked it or discuss the questions you liked/found interesting.