Archive for the ‘Open Source’ Category.

Using QlikView and DistroWatch to report on the most popular open source distributions (BSD, Linux, Unix)

Ok, so I am into FreeBSD and open source software, but I have recently had to do a QlikView implementation for my company LANDesk. QlikView has a feature where you can pull data from the web and report on it. So I needed to learn how to use the web-based reporting, so I decided to do a report from www.distrowatch.com.

Report Goals
There are few things that interests me from the data at DistroWatch:

  • Which base platforms are the most used?
  • Which platforms should software companies focus on supporting?
  • Where does BSD sit in the rankings.

How the report was made
So on the main DistroWatch page, there is a report that will give you the average hits per day (hpd) that a Distro’s web site gets. At the bottom there is a link to full popularity page of just these reports:
http://distrowatch.com/stats.php?section=popularity

So at first glance, you see Ubuntu is the best and Fedora is second and so on. I wanted to take the statistics a bit further. I wanted to know what main base distribution was the most used. What I mean by base distro is this: Ubuntu is #1. But Ubuntu is not a base distribution, instead it is based on Debian. Mint is #3 and is also based on Debian. Debian itself is #6 and it is a base distribution. Fedora is a base distribution.

QlikView can connect to this web page and consume this data. It was also able to loop through and click go to the link for each distribution where it was able to pull the “Based on” results. I did a few little tweaks to clean it up.

So I used QlikView to match each Distribution to its base distribution and built my report. I gathered the cumulative hits per day (hpd) of each base distro by summing the hpd from itself and its child distros. The results are staggering.

Result of the Report
I am going to show you a screen shot of the report, but I am only going to show the top 10 base distributions because otherwise it is to hard to view the report.

# 1 – Debian
Well, I have to say that I new that Debian (13818 hpd) was popular because of Ubuntu, but I didn’t know how far ahead it was compared to other base distributions. I expected Red Hat to be a lot closer but its just not. Lets look at the top ten Debian platforms by hits. In QlikView this is easy, I can simply click on the Debian pillar in the report.

So not only is Debian’s cumulative hits per day first, but it is first by a long ways. The cumulative hits per day of distros based on Debian is more than three times larger than any other base distribution’s cumulative hits. It is pulling away from the pack and nobody is going to catch up any time soon.

What I don’t know is are these new users or are other distributions losing members to Debian or Debian-based distros?

You might be grumbling to yourself and saying some incorrect statement like: Well, Ubuntu doesn’t have Enterprise support like Red Hat. But like I said, that is an incorrect statement. See their support page:
http://www.ubuntu.com/support

# 2 – Red Hat
Now, lets look at the top ten distros under Red Hat.

Ok, can I tell you that I was surprised at these results. I realize that Fedora was huge, I mean it is second on the distro list under Ubuntu, but I had missed the fact that CentOS was getting more than twice the hits Red Hat itself gets. The rest are hardly worth mentioning.

Historically mong Enterprise environments Red Hat is the most known distro, but when you look at these stats, you have to wonder if Ubuntu has taken over. The numbers for Fedora are fine, but for Red Hat they are not really that good. In fact, I keep hearing about companies using CentOS instead of Red Hat and as you can see, CentOS is getting a lot more exposure than Red Hat.

I will make this statement. Based on this data, if you are a software company considering whether to support Debian or Red Hat first, based on this data you have to choose Debian. If you were to make up some fuzzy logic for Red Hat (which due to its enterprise presence may or may not actually be valid) and weight the distributions based on other factors and somehow found a way to say Red Hat and its distro’s cumulative hits per day were worth three for every one, it would still be less than the cumulative hits per day Debian gets.

# 3 and #4 – Mandriva and Slackware
Ok, back to the report. Something that shocked me from the first chart and I had to analyze it further. Slackware? I had no idea that it was third. However, is it really third? It has a lot of very small distros based on it and Slackware itself gets 590 hpd and most the distros get less than 100 hpd. Mandriva is fourth but arguable could be third over Slackware. In fact, I have to call Mandriva third over Slackware. Sometimes you have to look at the data and make a judgment like this. Sorry Slackware, I am not trying to be biased (otherwise I would be talking up FreeBSD). I have no bias to any Linux distribution. I just say this based on the fact that Mandriva (1048 hpd) and the based-on-Mandriva version PCLinuxOS (773 hpd) both get more hits by a long way than Slackware’s top distros. The only reason Slackware got more hpd was because it has a lot of distros that were really small, while there were very few small distros based on Mandriva. The difference in the amount of small base distros is most likely due to the fact that Slackware is one of the oldest Linux distros, if not the oldest remaining distro, so naturally it has more distros based on it.

# 5 – Gentoo
Gentoo’s cumulative 1804 hpd was fourth. I have to apologize to Sabayon (760 hpd) as I had never heard of it until now. Gentoo itself only gets 428 hpd.

# 6 – BSD
What is next. Well, finally BSD shows up at number 6 with 1743 hpd. For those of you that are reading this and only know about Linux, BSD is NOT Linux. It does not run on the Linux kernel and is not likely to use many GNU tools. I hope I don’t drip with too much bias as FreeBSD is my favorite open source distribution.

Lets pull up the chart of BSD distros. There are 15 distributions listed under BSD, which is probably more than most people would believe since BSD often claims that it is not as broken up as Linux, but it has had its share of forks.

FreeBSD (553 hpd) is the main distribution. Of the Linux distributions, only Debian has more software packages available than FreeBSD.

PC-BSD (355 hpd) is to FreeBSD as Ubuntu is to Debian. For being such a new distribution PC-BSD is doing rather well. It is pretty comparable in ease of use to Ubuntu, Fedora, and OpenSUSE. Yes, PC-BSD is fully featured, running a nice windows environment with everything you could want, including a working Flash Player, the ability to configure your wireless card, and more. I recommend that if you are looking for a new desktop distribution, you at least install PC-BSD and give it a try. Ok, so my bias does show a little here.

# 7 – SUSE
So I was very surprised that SUSE wasn’t on this list until #7. Well, OpenSUSE is doing its part getting 1327 hpd. Remember, OpenSUSE is #4 if you just go by distro and not cumulative base distros. I think in time SUSE could be more popular. SUSE is newer than some of the other base distros and so it only has four distros listed. Novell’s SUSE Linux Enterprise (121 hpd) is the second most popular SUSE distro, however, it just not getting any were near the hits I expected it to be getting.

The others
And then there are the rest of the top ten: #8 Arch, #9 Puppy, and #10 Solaris (Or is that Oracle now?). Sorry if your distro was left out, this report is in the control of those who visit the distro’s web pages.

How accurate is this data?
On DistroWatch’s popularity page, it says:

The Page Hit Ranking statistics have attracted plenty of attention and feedback. Originally, each distribution-specific page was pure HTML with a third-party counter at the bottom to monitor interest of visitors. Later the pages were transformed into plain text files with PHP generating all the HTML code, but the original counter remained unchanged. In May 2004 the site switched from publicly viewable third-party counters to internal counters. This was prompted by a continuous abuse of the counters by a handful of undisciplined individuals who had confused DistroWatch with a voting station. The counters are no longer displayed on the individual distributions pages, but all visits (on the main site, as well as on mirrors) are logged. Only one hit per IP address per day is counted.

There are other factors to consider, such as the fact that some of the distributions are Live CD distros and not really platforms meant to be installed. It would be interesting to exclude them and only include installable distros but for lack of time, I didn’t.

I did nothing to verify the accuracy of the data at DistroWatch and any errors you see are not likely mine, as all the data was pulled from DistroWatch, please report any error to them and once they fix these errors, the QlikView report’s data can be reloaded.

Also, this data includes all hits from all areas: Consumer, Enterprise, Education, etc. Unfortunately there is no way I know of to tell where the hits came from. If there is a distribution that is 100% education hits, there would be no way to know that. Obviously if your target is Enterprise, you are left wondering which open source distros are really the most used in Enterprise environments. Unfortunately this report doesn’t answer that question. This is not a report of installed platforms, it is a report of cumulative hits per day. It is what it is.


Copyright ® Rhyous.com – Linking to this article is allowed without permission and as many as ten lines of this article can be used along with this link. Any other use of this article is allowed only by permission of Rhyous.com.

Why are key executables missing from Windows 7 and previous and where to download such tools free: telnet, ssh, md5, sha1, sha256, and more

Ok, so is anyone else frustrated that Microsoft fails to include certain executable tools that are standard on BSD and Linux? On my FreeBSD system, I don’t have to install anything special to telnet, or ssh, or check any type of hash (md5, sha1, sha256, etc…) and ump-teen other simple free features.

Especially the ability to check a hash, which is a key step to verify that a file was downloaded securely, and was not tampered with. In fact, it is a security risk that Microsoft doesn’t have these tools. We pay a lot of money for a Microsoft operating system and yet they fail to provide me with the tools I need to maintain security, tools that are ubiquitous and free. Also you wrote a tool for this already, were you just too thoughtless to include it in Windows 7? See http://support.microsoft.com/kb/841290.

So here is what you have to do to get these tools added to your windows platform.

Telnet See this post or google for a 3rd party telnet tool. Where is telnet in Windows 7? Or Windows 7 is missing telnet.exe
ssh Download PuTTY from here: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html. I like to rename it to ssh.exe and put it in the system32 directory.

A quick search in Google led me to this download which will provide you with most the tools you need for comparing hashes or check sums.
http://www.nfllab.com/sums/sums611.zip

However, here is what I had before:

md5 I use md5sums which you can get here: http://www.pc-tools.net/win32/md5sums/
sha1 You can use this one: ftp://ftp.gnupg.org/gcrypt/binary/sha1sum.exe
sha256 This will work for you: http://www.labtestproject.com/files/win/sha256sum/sha256sum.exe

And if you want more tools that are ubiquitous to open source platforms but somehow Microsoft has excluded from their operating systems, check these out:

Other GNU Utilities Download them from here: http://gnuwin32.sourceforge.net/packages.html

I hope this page helps you. I mostly wrote it for myself, so I could remember where I find this stuff again.

(Resolved) ShrewSoft VPN Proxy Services Blocks DNS Requests for VMWare Workstation Guests

UPDATE: 3/5/2010
2.1.6 beta 6 addresses this issue, so please install this version and ignore the rest of the comments below.

Ok, so I am big support of ShrewSoft VPN Client and I am also a user of VMWare Workstation. However, I have found an incompatibility between the two.

I tell everyone here at work to use ShrewSoft VPN Client on their Windows 7 64 bit clients. However, they are all running VMWare as well. So I feel it is my responsibility to also inform them of this issue that was found by one of my coworkers.

PROBLEM
Well, a strange problem is seen on VMWare Guests running on a host with ShrewSoft VPN Client installed. No DNS requests are going out for the Guest. A DNS Request never leaves the host.

Troubleshooting
I seached the following term on the VMWare forums: DNS Bridged

The following VMWare Community discussion appeared:
DNS Name Resolution using a bridged network connection not working

Resolution
If you stop the ShrewSoft DNS Proxy Daemon, then the issue goes away.

Also, this is not really a reason to stop using ShrewSoft VPN. There is a post about Cisco’s VPN Client firewall causing the same issue.
Problems with networking using Workstation 7

PDFForge released a new version of PDFCreator 0.9.9

Hey all,

PDFCreator is a nice tool that lets you

I am not sure if you noticed, but PDFForge released a new version of PDFCreator.

I just want everyone to know that I use PDFCreator with Windows 7.

PDFCreator allows me to print from any application to PDF, so if you thought you had to buy Adobe Acrobat Professional to get this feature, you are mistaken. PDFCreator gives you this feature at zero cost to you or your organization.

Save paper and print to PDF.

How to compile and install K-3D 0.7.12 on FreeBSD 8? (Update K-3D 0.8.0.0)

Ok, so I found a port that is need of updating. K-3D. FreeBSD has K-3D version 6.7 in ports but K-3D is on release 7.11 and approaching their version 8 release. So lets see what we need to do to get this port updated.

To start out, I have informed both FreeBSD and K-3D that I am going to help with this using their forums.
http://forums.freebsd.org/showthread.php?t=10647
http://www.k-3d.org/forums/topic/updated-port-for-freebsd-8

Step 1 – Build a FreeBSD 8 Desktop Environment
Build yourself a desktop as described here (or however you want if you know what you are doing):
How to install and configure a FreeBSD 8 Desktop with Xorg and KDE?

Step 2 – Install dependencies
The following are dependencies that are required to build K-3D on FreeBSD 8.

  1. Install mercurial
    K-3D uses Mercurial as its version managed system for its code (it used to use subversion but now uses mercurial). So to download the code you need to install Mercurial.

    As root do this:

    # cd /usr/ports/devel/mercurial
    # make install

  2. Install cmake 2.8 or later.
    K-3D now uses cmake as its build management system as opposed to make or gmake. Since cmake is not installed on FreeBSD by default, lets install it.

    # cd /usr/ports/devel/cmake
    # make install

  3. Install cairomm.

    # cd /usr/ports/graphics/cairomm
    # make install

    Note: This will also install glibmm and sigc++.

  4. Install gnome-vfs.

    # cd /usr/ports/devel/gnome-vfs
    # make install

  5. Install gtkglex.

    # cd /usr/ports/x11-toolkits/gtkglext
    # make install

  6. Install gtkmm24.

    # cd /usr/ports/x11-toolkits/gtkmm24
    # make install

  7. Install gtksourceview2.

    # cd /usr/ports/x11-toolkits/gtksourceview2
    # make install

  8. Install gts.

    # cd /usr/ports/graphics/gts
    # make install

  9. Install ImageMagick.

    # cd /usr/ports/graphics/ImageMagick
    # make install

  10. Install e2fsprogs-libuuid.

    # cd /usr/ports/misc/e2fsprogs-libuuid
    # make install

  11. Install Doxygen.

    # cd /usr/ports/devel/doxygen
    # make install

    Note: This took quite a long time to compile because it also had a lot of large depencies.

  12. Install libexecinfo.

    # cd /usr/ports/devel/libexecinfo
    # make install

Step 3 – Download the code and build it

  1. As a regular user, run these commands:

    $ cd ~
    $ hg clone http://k3d.hg.sf.net/hgweb/k3d/k3d

    The code will take a minute or two (or more if you have a slow connection) to download.

  2. – Make a build directory
    K-3D cannot be built in the same directory where the code resides. So lets create a build directory and change to that directory.

    $ mkdir ~/k3d-build
    $ cd k3d-build

  3. Run cmake against k3d

    $ cmake ~/k3d

    Note: If you forget to install the dependencies, you will get errors. Here is the output of my attempt to compile before I installed the dependencies.

    $ cd k3d-build
    $ cmake ~/k3d
    -- checking the width of std::vector<>::size_type for this platform
    --   std::vector<>::size_type is 64 bits
    -- checking for module 'cairomm-1.0'
    gnome-config: not found
    --   package 'cairomm-1.0' not found
    -- checking for module 'dbus-glib-1'
    --   found dbus-glib-1, version 0.82
    -- checking for module 'freetype2'
    --   found freetype2, version 9.20.3
    -- checking for module 'glibmm-2.4'
    gnome-config: not found
    --   package 'glibmm-2.4' not found
    -- checking for module 'gnome-vfs-2.0'
    gnome-config: not found
    --   package 'gnome-vfs-2.0' not found
    -- checking for module 'gtkglext-1.0'
    gnome-config: not found
    --   package 'gtkglext-1.0' not found
    -- checking for module 'gtkmm-2.4'
    gnome-config: not found
    --   package 'gtkmm-2.4' not found
    -- checking for module 'gtksourceview-2.0'
    gnome-config: not found
    --   package 'gtksourceview-2.0' not found
    -- checking for module 'gts'
    gnome-config: not found
    --   package 'gts' not found
    -- checking for module 'ImageMagick++'
    gnome-config: not found
    --   package 'ImageMagick++' not found
    -- checking for module 'OpenEXR'
    --   found OpenEXR, version 1.6.1
    -- checking for module 'libpng12'
    --   found libpng12, version 1.2.40
    -- checking for module 'sigc++-2.0'
    gnome-config: not found
    --   package 'sigc++-2.0' not found
    CMake Error at cmake/modules/K3DDependencies.cmake:18 (MESSAGE):
      Couldn't find glibmm, which is required to build K-3D.  You can obtain
      glibmm from http://gtkmm.org.
    Call Stack (most recent call first):
      CMakeLists.txt:248 (K3D_CHECK_REQUIRED_DEPENDENCY)
    
    
    CMake Error at cmake/modules/K3DDependencies.cmake:18 (MESSAGE):
      Couldn't find libsigc++, which is required to build K-3D.  You can obtain
      libsigc++ from http://libsigc.sourceforge.net.
    Call Stack (most recent call first):
      CMakeLists.txt:251 (K3D_CHECK_REQUIRED_DEPENDENCY)
    
    
    -- checking for module 'uuid'
    gnome-config: not found
    --   package 'uuid' not found
    CMake Error at cmake/modules/K3DDependencies.cmake:18 (MESSAGE):
      Couldn't find uuid, which is required to build K-3D.  You can obtain uuid
      from http://www.ossp.org/pkg/lib/uuid.
    Call Stack (most recent call first):
      CMakeLists.txt:257 (K3D_CHECK_REQUIRED_DEPENDENCY)
    
    
    CMake Error at cmake/modules/K3DDependencies.cmake:28 (MESSAGE):
      Couldn't find the gtkglext library, which is required by
      K3D_BUILD_NGUI_MODULE.
    Call Stack (most recent call first):
      CMakeLists.txt:272 (K3D_CHECK_OPTIONAL_DEPENDENCY)
    
    
    CMake Error at cmake/modules/K3DDependencies.cmake:28 (MESSAGE):
      Couldn't find the gtkmm library, which is required by
      K3D_BUILD_NGUI_MODULE.
    Call Stack (most recent call first):
      CMakeLists.txt:273 (K3D_CHECK_OPTIONAL_DEPENDENCY)
    
    
    CMake Error at cmake/modules/K3DDependencies.cmake:28 (MESSAGE):
      Couldn't find the cairomm library, which is required by
      K3D_BUILD_NGUI_PIPELINE_PANEL_MODULE.
    Call Stack (most recent call first):
      CMakeLists.txt:274 (K3D_CHECK_OPTIONAL_DEPENDENCY)
    
    
    -- checking for module 'gthread-2.0'
    --   found gthread-2.0, version 2.20.5
    -- generating i18n catalog
    --   done
    -- Could NOT find Doxygen  (missing:  DOXYGEN_EXECUTABLE)
    -- Configuring incomplete, errors occurred!
    $
    

    Hopefully you installed the dependencies and didn’t see any of the above errors.

Step 4 – Test Running the application
We can test running this from the build directory before installing, so lets do that.

  1. From the k3d-build directory, type make run:

    $ make run

  2. Ok, so now that it is compiling it is failing to run…hopefully we can get that fixed. Stay tuned.

UPDATE: 2/2/2010

Ok, so I am back. Here is the what I have done.

Step 5 – Fixing run errors

  1. Compiled with debugging. I ran ccmake ~/k3d again and this time I set the CMAKE_BUILD_TYPE to Debug before choosing to configure. Once configure was done, I ran make again.
  2. Grepped for the error in the code. Specifically, this term:

    $ grep -Rn k3d::iuser_interface ~/k3d/*

    I found the problem code was in this file and line number:
    File: /home/jared/k3d/application/k3d_main.cpp
    line: 460

  3. Went to the problematic code and investigated it. It seems to be a simple check, so I commented that block of code out so it would continue:
    //      if(!dynamic_cast<k3d::iuser_interface*>(g_user_interface))
    //     {
    //              delete g_user_interface;
    //              g_user_interface = 0;
    //              handle_error("UI plugin module [" + module_name + "] does not impleme
    //              return;
    //      }
    
  4. I recompiled (everything remained compiled except the one part with the file I changed so compiling was quick).
  5. I launched make run again:

    # make run

    This time, as I had hoped, it loaded the application completely.

    However, I noticed some errors.

    The first two error lines occurred early in the load process. I am not sure but they seem to be unrelated:

    INFO: Gtk: Failed to load module “atk-bridge”: Shared object “libatk-bridge.so” not found, required by “k3d”
    :1: error: unexpected character `\241′, expected keyword – e.g. `style’

    ERROR: /home/jared/k3d/modules/virtual_opengl_painters/sds_point_painter.cpp line 73: assertion `delegate’ failed
    ERROR: Error creating document plugin: VirtualOpenGLSDSPointPainter
    ERROR: /home/jared/k3d/modules/virtual_opengl_painters/sds_edge_painter.cpp line 73: assertion `delegate’ failed
    ERROR: Error creating document plugin: VirtualOpenGLSDSEdgePainter
    ERROR: /home/jared/k3d/modules/virtual_opengl_painters/sds_face_painter.cpp line 73: assertion `delegate’ failed
    ERROR: Error creating document plugin: VirtualOpenGLSDSFacePainter

  6. I searched the ports tree for the libatk-bridge.so file.

    # /usr/ports
    # grep -R libatk-bridge *

    It looks like there is a at-spi package that provides this library.

  7. Install the at-spi package

    # cd /usr/ports/accessibility/at-spi
    # make install

  8. Tried to make run again.

    # exit
    $ cd ~/k3d-build
    $ make run

    The application loaded and the libatk-bridge error was gone but it was replaced with a warning:

    (k3d:55092): atk-bridge-WARNING **: AT_SPI_REGISTRY was not started at session startup.

    (k3d:55092): atk-bridge-WARNING **: IOR not set.

    (k3d:55092): atk-bridge-WARNING **: Could not locate registry

  9. Ok, so now that it is running, I think it is time to submit bugs to K-3d for the remaining errors.

As of right now, I don’t think it is worth the effort to create a port of version 7.11 as it has bugs for FreeBSD. I feel comfortable that when the next revision of K-3D comes out, version 8.x, the code will work well and we will create a port for it.

UPDATE: February 8, 2010

The main developer has made some changes so that K-3D launches now. The error that prevent the launch is gone (the others that seem somewhat benign are still occurring).

There is now a problem with K-3D on FreeBSD in that the faces cannot be properly selected, so the user-interface is not working perfectly.

Again, I will work on this problem and update this post.

Update: The problem is now resolved. There are couple lingering issues that you can read about at the K-3D forums.
http://www.k-3d.org/forums/topic/updated-port-for-freebsd-8

Hopefully all will be resolved when version 8 releases and we can make a new port.

Update: March 31, 2010

Ok, it looks like we need to move to Mesa 7.6.1 to get the latest versions of K-3D to work. Mesa 7.6.1 is available on FreeBSD.

You just have do make WITHOUT_NOUVEAU in order for the new version to be pulled. Here is what I did.

portsnap fetch update

cd /usr/ports/graphics/libGL/
make deinstall
make WITHOUT_NOUVEAU=yes install

cd /usr/ports/graphics/libGLU/
make deinstall
make WITHOUT_NOUVEAU=yes install

cd /usr/ports/graphics/libGLw/
make deinstall
make WITHOUT_NOUVEAU=yes install

cd /usr/ports/graphics/libglut/
make deinstall
make WITHOUT_NOUVEAU=yes install

cd /usr/ports/graphics/libdrm/
make deinstall
make WITHOUT_NOUVEAU=yes install

cd /usr/ports/graphics/dri/
make deinstall
make WITHOUT_NOUVEAU=yes install

Now things are working rather well, though the rendering with Aqsis is just giving me a black box. Hopefully I will fix that.

I fixed the black box just be restarting K-3D (I had installed Aqsis while K-3D was running).

However, now I am seeing a problem with Rendering the mug example. The handle does not appear to be rendered correctly.

It should look like this:

However, on FreeBSD it looks like this:

How to add a new Project Type option in dotProject 2.x

Hey all,

So in dotProject 2.x, you can select a project type.

There are three values by default:

Unknown
Administrative
Operative

Of course, these are generic and more granular types that you may want to add. Such changes can be made by a dotProject Administrator by going to System Admin | System Lookup Type and clicking the edit icon next to Select List | Project Type.

The format is quite simple:

0|Unknown
1|Administrative
2|Operative

So if you want to change it you just add in text more values in the same format.

0|Unknown
1|Administrative
2|Operative
3|Salesforce
4|Reporting
5|Community
6|Internal Tool

And interestingly enough there is not an apply button. Instead there is an “Edit” button (which doesn’t make sense, because you are already in edit mode). An “Apply” button would make much more sense.

Why does Firefox prompt for Domain (AD) Authentication? or How to get Firefox to automatically login to web sites with Domain Credentials (Sharepoint for example)?

Why does Firefox prompt for Domain (AD) Authentication? or How to get Firefox to automatically login to web sites with Domain Credentials (Sharepoint for example)?

Hey all,

I am sure you have been annoyed by the fact that when you use Firefox, the sites that require Domain credentials can popup and ask you to login. Sites like Sharepoint can ask you to log in over and over and over and over again. And then just when you are about as annoyed as you can be with typing your Domain user name and password, it prompts you some more.

For those of you who know, I work for LANDesk and we have server software and our Web Console uses NTLM authentication or Active Directory Domain credentials. You can log into the LDMS Web Console using Firefox using this method.

Well, this is really easy to make this “authentication prompt” go away. A quick search in your favorite search engine will resolve this (on a Windows box at least).

I found this site rather quickly:
http://www.1stbyte.com/2008/03/15/automatic-windows-authentication-with-firefox-networkautomatic-ntlm-authtrusted-uris/

Step 1 – Gather the lists of Sites that require domain authentication

  1. Determine all the sites you go to at work that require domain or active directory credentials and put them in a text file.

    http://CompanyName-Sharepoint
    http://CompanyName-HelpDesk
    http://InternalServer1
    http://InternalServer2
    http://InternalServer3
    http://LDMSCore

  2. Now format them like this:

    CompanyName-Sharepoint, CompanyName-HelpDesk, InternalServer1, InternalServer2, InternalServer3, LDMSCore

    Don’t worry if you don’t get them all, you can add new sites at any time.

    Note: Save this text file as you may want to do this again for someone else or you may want to do it again yourself computer gets rebuilt/upgraded.

Step 2 – Configure Firefox to Automatically Authenticate to these sites

  1. Open Firefox.
  2. Enter the following for the URL:
    about:config

  3. When warned to be careful, click the “I’ll be careful, I promise” button.
  4. In the Filter field, enter this value: network.automatic-ntlm-auth.trusted-uris
    Note: If the value is not there, you can add it as a new string.

  5. Right click on the value and choose Modify.
  6. Enter your servers as we formatted them above:

    CompanyName-Sharepoint, CompanyName-HelpDesk, InternalServer1, InternalServer2, InternalServer3, LDMSCore

  7. Click Ok.
  8. You shouldn’t have to close and re-open firefox but some poeple like to do this anyway.

You should now be able to browse your sites without having to enter credentials.

What files are required to create a theme for dotProject 2.1.2?

Ok, so I want to create a theme for dotProject. I love doing something for open source projects but it is never easy. So much is not documented.

I would imagine that since dotProject is free, it would be worth it to a company to pay for some customization and some really shiny themes. I know another open source project, SquirrellMail, has a lot of themes that can be purchased out there.

So I am going to look at the three themes that come with dotProject by default and determine what it takes to make my own.

Files in a dotProject Theme

So each them appears to have most of the following files (though each theme does not have all files):

  • footer.php
  • header.php
  • images (directory)
  • index.html
  • login.php
  • lostpass.php
  • main.css
  • overrides.php

So the only directory is the images directory. So what images does it usually contain? I usually contains the following files in general. Some contain more, some less. Some similar files with different names. But that gives you a basic idea.

  • dp_icon.gif
  • favicon.ico
  • index.html
  • obj (directory)
  • titlegrad.jpg
  • tabBg.png
  • tabLeft.png
  • tabRight.png
  • tabSelectedBg.png
  • tabSelectedLeft.png
  • tabSelectedRight.png

Again, there is often a directory in images called obj. The obj directory has the following files.

  • index.html
  • tick.gif

Well, that is pretty much it for the file structure of a dotProject theme.

So lets look at the common files and what is in them? However, how should we group them? How about by extension first, then by name:

HTML File (Optional)

There is only one, but it is in each folder, and as I suspected, it is optional.

  1. index.html – Ok, so why are there these random index.html files? They all only contain one line:
    <html><body bgcolor="#FFFFFF"></body></html>
    

    I have to say that these index.html files are for no other reason that to prevent directory browsing, which should probably be done by a security setting in your web server, so these files are completely optional.

CSS File (Required)

There appears to be only one CSS file, but that doesn’t mean you can’t have multiple CSS files in your theme. However, this is probably the most important file for your theme, so obviously it is required.

  1. main.css – This is of course the file that determines all the style information for the web page. Each HTML element has a style and this is where you change it.

PHP Files – (Requirements unknown)

  1. footer.php – By the name, you can tell this script has to do with the footer of your web page.

    There doesn’t seem to be much variation on this file. It seems to usually have the following script:

    <?php
    	echo $AppUI->getMsg();
    ?>
    	</td>
    </tr>
    </table>
    </body>
    </html>
    
  2. header.php – This file is a lot more complex and has over 100 lines in each theme I have looked at. It will take some time to see what is required. It looks like this is actually both the header and the body. The body appears to be formatted with an HTML table instead of using CSS. So here is the code from the default theme.
    <?php /* STYLE/DEFAULT $Id: header.php 5544 2007-11-27 01:04:12Z merlinyoda $ */
    if (!defined('DP_BASE_DIR')) {
    	die('You should not access this file directly');
    }
    $dialog = dPgetParam( $_GET, 'dialog', 0 );
    if ($dialog)
    	$page_title = '';
    else
    	$page_title = ($dPconfig&#91;'page_title'&#93; == 'dotProject') ? $dPconfig&#91;'page_title'&#93; . '&nbsp;' . $AppUI->getVersion() : $dPconfig['page_title'];
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    	   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
    	<meta name="Description" content="dotProject Default Style" />
    	<meta name="Version" content="<?php echo @$AppUI->getVersion();?>" />
    	<meta http-equiv="Content-Type" content="text/html;charset=<?php echo isset( $locale_char_set ) ? $locale_char_set : 'UTF-8';?>" />
    	<title><?php echo @dPgetConfig( 'page_title' );?></title>
    	<link rel="stylesheet" type="text/css" href="./style/<?php echo $uistyle;?>/main.css" media="all" />
    	<style type="text/css" media="all">@import "./style/<?php echo $uistyle;?>/main.css";</style>
    	<link rel="shortcut icon" href="./style/<?php echo $uistyle;?>/images/favicon.ico" type="image/ico" />
    	<?php @$AppUI->loadJS(); ?>
    </head>
    
    <body onload="this.focus();">
    <table width="100%" cellpadding="0" cellspacing="0" border="0">
    <tr>
    	<td><table width="100%" cellpadding="3" cellspacing="0" border="0"><tr>
    	<th background="style/<?php echo $uistyle;?>/images/titlegrad.jpg" class="banner" align="left"><strong><?php
    		echo "<a style='color: white' href='{$dPconfig&#91;'base_url'&#93;}'>$page_title</a>";
    	?></strong></th>
    	<th align="right" width='50'><a href='http://www.dotproject.net/' <?php if ($dialog) echo "target='_blank'"; ?>><img src="style/<?php echo $uistyle;?>/images/dp_icon.gif" border="0" /></a></th>
    	</tr></table></td>
    </tr>
    <?php if (!$dialog) {
    	// top navigation menu
    	$nav = $AppUI->getMenuModules();
    	$perms =& $AppUI->acl();
    ?>
    <tr>
    	<td class="nav" align="left">
    	<table width="100%" cellpadding="3" cellspacing="0">
    	<tr>
    		<td>
    		<?php
    		$links = array();
    		foreach ($nav as $module) {
    			if ($perms->checkModule($module['mod_directory'], 'access')) {
    				$links[] = '<a href="?m='.$module&#91;'mod_directory'&#93;.'">'.$AppUI->_($module['mod_ui_name']).'</a>';
    			}
    		}
    		echo implode( ' | ', $links );
    		echo "\n";
    		?>
    		</td>
    		<td nowrap="nowrap" align="right">
    		<form name="frm_new" method=GET action="./index.php">
    		<table cellpadding="0" cellspacing="0">
    		<tr><td>
    <?php
    	$newItem = array( 0=>'- New Item -' );
    	if ($perms->checkModule( 'companies', 'add' )) $newItem["companies"] = "Company";
    	if ($perms->checkModule( 'contacts', 'add' )) $newItem["contacts"] = "Contact";
    	if ($perms->checkModule( 'calendar', 'add' )) $newItem["calendar"] = "Event";
    	if ($perms->checkModule( 'files', 'add' )) $newItem["files"] = "File";
    	if ($perms->checkModule( 'projects', 'add' )) $newItem["projects"] = "Project";
    
    	echo arraySelect( $newItem, 'm', 'style="font-size:10px" onChange="f=document.frm_new;mod=f.m.options[f.m.selectedIndex].value;if(mod) f.submit();"', '', true);
    
    	echo "        <input type=\"hidden\" name=\"a\" value=\"addedit\" />\n";
    
    //build URI string
    	if (isset( $company_id )) {
    		echo '<input type="hidden" name="company_id" value="'.$company_id.'" />';
    	}
    	if (isset( $task_id )) {
    		echo '<input type="hidden" name="task_parent" value="'.$task_id.'" />';
    	}
    	if (isset( $file_id )) {
    		echo '<input type="hidden" name="file_id" value="'.$file_id.'" />';
    	}
    ?>
    		</td></tr>
    		</table>
    		</form>
    		</td>
    	</tr>
    	</table>
    	</td>
    </tr>
    <tr>
    	<td>
    		<table cellspacing="0" cellpadding="3" border="0" width="100%">
    		<tr>
    			<td width="100%"><?php echo $AppUI->_('Welcome').' '.$AppUI->user_first_name.' '.$AppUI->user_last_name; ?></td>
    			<td nowrap="nowrap">
    				<?php echo dPcontextHelp( 'Help' );?> |
    				<a href="./index.php?m=admin&a=viewuser&user_id=<?php echo $AppUI->user_id;?>"><?php echo $AppUI->_('My Info');?></a> |
    <?php
    	if ($perms->checkModule('calendar', 'access')) {
    		$now = new CDate();
    ?>                              <b><a href="./index.php?m=tasks&a=todo"><?php echo $AppUI->_('Todo');?></a></b> |
    				<a href="./index.php?m=calendar&a=day_view&date=<?php echo $now->format( FMT_TIMESTAMP_DATE );?>"><?php echo $AppUI->_('Today');?></a> |
    <?php } ?>
    				<a href="./index.php?logout=-1"><?php echo $AppUI->_('Logout');?></a>
    			</td>
    		</tr>
    		</table>
    	</td>
    </tr>
    <?php } // END showMenu ?>
    </table>
    
    <table width="100%" cellspacing="0" cellpadding="4" border="0">
    <tr>
    <td valign="top" align="left" width="98%">
    <?php
    	echo $AppUI->getMsg();
    ?>
    
  3. login.php – These all seem to be a login web page and each seem to have almost the exact same code.
    <?php /* STYLE/DEFAULT $Id: login.php 4842 2007-03-17 15:56:19Z caseydk $ */
    if (!defined('DP_BASE_DIR')) {
    	die('You should not access this file directly');
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    	   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
    	<title><?php echo $dPconfig&#91;'page_title'&#93;;?></title>
    	<meta http-equiv="Content-Type" content="text/html;charset=<?php echo isset( $locale_char_set ) ? $locale_char_set : 'UTF-8';?>" />
           	<title><?php echo $dPconfig&#91;'company_name'&#93;;?> :: dotProject Login</title>
    	<meta http-equiv="Pragma" content="no-cache" />
    	<meta name="Version" content="<?php echo @$AppUI->getVersion();?>" />
    	<link rel="stylesheet" type="text/css" href="./style/<?php echo $uistyle;?>/main.css" media="all" />
    	<style type="text/css" media="all">@import "./style/<?php echo $uistyle;?>/main.css";</style>
    	<link rel="shortcut icon" href="./style/<?php echo $uistyle;?>/images/favicon.ico" type="image/ico" />
    </head>
    
    <body bgcolor="#f0f0f0" onload="document.loginform.username.focus();">
    <br /><br /><br /><br />
    <?php //please leave action argument empty ?>
    <!--form action="./index.php" method="post" name="loginform"-->
    <form method="post" action="<?php echo $loginFromPage; ?>" name="loginform">
    <table align="center" border="0" width="250" cellpadding="6" cellspacing="0" class="std">
    <input type="hidden" name="login" value="<?php echo time();?>" />
    <input type="hidden" name="lostpass" value="0" />
    <input type="hidden" name="redirect" value="<?php echo $redirect;?>" />
    <tr>
    	<th colspan="2"><em><?php echo $dPconfig&#91;'company_name'&#93;;?></em></th>
    </tr>
    <tr>
    	<td align="right" nowrap><?php echo $AppUI->_('Username');?>:</td>
    	<td align="left" nowrap><input type="text" size="25" maxlength="255" name="username" class="text" /></td>
    </tr>
    <tr>
    	<td align="right" nowrap><?php echo $AppUI->_('Password');?>:</td>
    	<td align="left" nowrap><input type="password" size="25" maxlength="32" name="password" class="text" /></td>
    </tr>
    <tr>
    	<td align="left" nowrap><a href="http://www.dotproject.net/"><img src="./style/default/images/dp_icon.gif" border="0" alt="dotProject logo" /></a></td>
    	<td align="right" valign="bottom" nowrap><input type="submit" name="login" value="<?php echo $AppUI->_('login');?>" class="button" /></td>
    </tr>
    <tr>
    	<td colspan="2"><a href="#" onclick="f=document.loginform;f.lostpass.value=1;f.submit();"><?php echo $AppUI->_('forgotPassword');?></a></td>
    </tr>
    </table>
    <?php if (@$AppUI->getVersion()) { ?>
    <div align="center">
    	<span style="font-size:7pt">Version <?php echo @$AppUI->getVersion();?></span>
    </div>
    <?php } ?>
    </form>
    <div align="center">
    <?php
    	echo '<span class="error">'.$AppUI->getMsg().'</span>';
    
    	$msg = '';
    	$msg .=  phpversion() < '4.1' ? '<br /><span class="warning">WARNING: dotproject is NOT SUPPORT for this PHP Version ('.phpversion().')</span>' : '';
    	$msg .= function_exists( 'mysql_pconnect' ) ? '': '<br /><span class="warning">WARNING: PHP may not be compiled with MySQL support.  This will prevent proper operation of dotProject.  Please check you system setup.</span>';
    	echo $msg;
    ?>
    </div>
    <center><?php echo "* ".$AppUI->_("You must have cookies enabled in your browser"); ?></center>
    </body>
    </html>
    
  4. lostpass.php – These all seem to be a full web page to provide a lost password interface and each seem to have almost the exact same code.
    <?php /* STYLE/DEFAULT $Id: lostpass.php 4771 2007-02-18 03:06:27Z ajdonnison $ */
    if (!defined('DP_BASE_DIR')) {
    	die('You should not access this file directly');
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    	   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
    	<title><?php echo @dPgetConfig( 'page_title' );?></title>
    	<meta http-equiv="Content-Type" content="text/html;charset=<?php echo isset( $locale_char_set ) ? $locale_char_set : 'UTF-8';?>" />
           	<title><?php echo $dPconfig&#91;'company_name'&#93;;?> :: dotProject Login</title>
    	<meta http-equiv="Pragma" content="no-cache" />
    	<meta name="Version" content="<?php echo @$AppUI->getVersion();?>" />
    	<link rel="stylesheet" type="text/css" href="./style/<?php echo $uistyle;?>/main.css" media="all" />
    	<style type="text/css" media="all">@import "./style/<?php echo $uistyle;?>/main.css";</style>
    	<link rel="shortcut icon" href="./style/<?php echo $uistyle;?>/images/favicon.ico" type="image/ico" />
    </head>
    
    <body bgcolor="#f0f0f0" onload="document.lostpassform.checkusername.focus();">
    <br /><br /><br /><br />
    <?php //please leave action argument empty ?>
    <!--form action="./index.php" method="post" name="loginform"-->
    <form method="post" name="lostpassform">
    <table align="center" border="0" width="250" cellpadding="6" cellspacing="0" class="std">
    <input type="hidden" name="lostpass" value="1" />
    <input type="hidden" name="redirect" value="<?php echo $redirect;?>" />
    <tr>
    	<th colspan="2"><em><?php echo $dPconfig&#91;'company_name'&#93;;?></em></th>
    </tr>
    <tr>
    	<td align="right" nowrap><?php echo $AppUI->_('Username');?>:</td>
    	<td align="left" nowrap><input type="text" size="25" maxlength="20" name="checkusername" class="text" /></td>
    </tr>
    <tr>
    	<td align="right" nowrap><?php echo $AppUI->_('EMail');?>:</td>
    	<td align="left" nowrap><input type="email" size="25" maxlength="64" name="checkemail" class="text" /></td>
    </tr>
    <tr>
    	<td align="left" nowrap><a href="http://www.dotproject.net/"><img src="./style/default/images/dp_icon.gif" width="120" height="20" border="0" alt="dotProject logo" /></a></td>
    	<td align="right" valign="bottom" nowrap><input type="submit" name="sendpass" value="<?php echo $AppUI->_('send password');?>" class="button" /></td>
    </tr>
    </table>
    <?php if (@$AppUI->getVersion()) { ?>
    <div align="center">
    	<span style="font-size:7pt">Version <?php echo @$AppUI->getVersion();?></span>
    </div>
    <?php } ?>
    </form>
    <div align="center">
    <?php
    	echo '<span class="error">'.$AppUI->getMsg().'</span>';
    
    	$msg = '';
    	$msg .=  phpversion() < '4.1' ? '<br /><span class="warning">WARNING: dotproject is NOT SUPPORT for this PHP Version ('.phpversion().')</span>' : '';
    	$msg .= function_exists( 'mysql_pconnect' ) ? '': '<br /><span class="warning">WARNING: PHP may not be compiled with MySQL support.  This will prevent proper operation of dotProject.  Please check you system setup.</span>';
    	echo $msg;
    ?>
    </div>
    </body>
    </html>
    
  5. overrides.php – I will have to analyze this more to see what it is for. The code looks pretty similar in each file, though the files are slightly different lengths.
    <?php /* STYLE/DEFAULT $Id: overrides.php 5725 2008-06-02 16:20:34Z merlinyoda $ */
    
    if (!defined('DP_BASE_DIR')) {
    	die('You should not access this file directly');
    }
    class CTitleBlock extends CTitleBlock_core {
    }
    
    ##
    ##  This overrides the show function of the CTabBox_core function
    ##
    class CTabBox extends CTabBox_core {
    	function show( $extra='', $js_tabs = false ) {
    		GLOBAL $AppUI, $dPconfig, $currentTabId, $currentTabName;
    		$uistyle = ($AppUI->getPref( 'UISTYLE' )
    		            ? $AppUI->getPref( 'UISTYLE' )
    		            : (($dPconfig['host_style']) ? $dPconfig['host_style'] : 'default'));
    		reset( $this->tabs );
    		$s = '';
    
    		// tabbed / flat view options
    		if (@$AppUI->getPref( 'TABVIEW' ) == 0) {
    			$s .= '<table border="0" cellpadding="2" cellspacing="0" width="100%">' . "\n";
    			$s .= "<tr>\n";
    			$s .= '<td nowrap="nowrap">' . "\n";
    			$s .= '<a href="' . $this->baseHRef . 'tab=0">' . $AppUI->_('tabbed') . '</a> : ';
    			$s .= '<a href="' . $this->baseHRef . 'tab=-1">' . $AppUI->_('flat') . '</a>' . "\n";
    			$s .= "</td>\n" . $extra . "\n</tr>\n</table>\n";
    			echo $s;
    		} else {
    			if ($extra) {
    				echo ('<table border="0" cellpadding="2" cellspacing="0" width="100%">'
    				      . "\n<tr>\n" . $extra . "</tr>\n</table>\n");
    			} else {
    				echo '<img src="./images/shim.gif" height="10" width="1" alt="" />' . "\n";
    			}
    		}
    
    		if ($this->active < 0 || @$AppUI->getPref( 'TABVIEW' ) == 2 ) {
    			// flat view, active = -1
    			echo '<table border="0" cellpadding="2" cellspacing="0" width="100%">' . "\n";
    			foreach ($this->tabs as $k => $v) {
    				echo '<tr><td><strong>'.($v[2] ? $v[1] : $AppUI->_($v[1]))."</strong></td></tr>\n";
    				echo '<tr><td>';
    				$currentTabId = $k;
    				$currentTabName = $v[1];
    				include $this->baseInc.$v[0].".php";
    				echo "</td></tr>\n";
    			}
    			echo "</table>\n";
    		} else {
    			// tabbed view
    			$s = '<table width="100%" border="0" cellpadding="0" cellspacing="0">' . "\n";
    			$s .= '<tr><td>' . "\n" .'<table border="0" cellpadding="0" cellspacing="0"><tr>' . "\n";
    
    			if ( count($this->tabs)-1 < $this->active ) {
    				//Last selected tab is not available in this view. eg. Child tasks
    //				$this->active = 0;
    			}
    			foreach( $this->tabs as $k => $v ) {
    				$class = ($k == $this->active) ? 'tabon' : 'taboff';
    				$sel = ($k == $this->active) ? 'Selected' : '';
    				$s .= '<td valign="middle"><img src="./style/' . $uistyle . '/images/tab' . $sel . 'Left.png" id="lefttab_' . $k .'" border="0" alt="" /></td>' . "\n";
    				$s .= '<td id="toptab_'.$k.'" valign="middle" nowrap="nowrap"';
    
    				$s .= (($js_tabs)
    					   ? (' class="' . $class . '"')
    					   : (' background="./style/' . $uistyle . '/images/tab' . $sel . 'Bg.png"'));
    				$s .= '>&nbsp;<a href="';
    
    				if ($this->javascript) {
    					$s .= "javascript:" . $this->javascript . "({$this->active}, $k)";
    				} else if ($js_tabs) {
    					$s .= 'javascript:show_tab(' . $k . ')';
    				} else {
    					$s .= $this->baseHRef.'tab='.$k;
    				}
    
    				$s .='">'.(($v[2]) ? $v[1] : $AppUI->_($v[1])).'</a>&nbsp;</td>' . "\n";
    				$s .= ('<td valign="middle"><img id="righttab_' . $k . '" src="./style/' . $uistyle . '/images/tab'
    					   . $sel . 'Right.png" border="0" alt="" /></td>' . "\n");
    				$s .= '<td class="tabsp"><img src="./images/shim.gif" height="1" width="3" /></td>' . "\n";
    			}
    			$s .= '</tr></table>' . "\n" .'</td></tr>' . "\n";
    			$s .= '<tr><td width="100%" colspan="'.(count($this->tabs)*4 + 1).'" class="tabox">' . "\n";
    			echo $s;
    			//Will be null if the previous selection tab is not available in the new window eg. Children tasks
    			if ( $this->tabs[$this->active][0] != "" ) {
    				$currentTabId = $this->active;
    				$currentTabName = $this->tabs[$this->active][1];
    				if (!$js_tabs)
    					require $this->baseInc.$this->tabs[$this->active][0].'.php';
    			}
    			if ($js_tabs)
    			{
    				foreach( $this->tabs as $k => $v )
    				{
    					echo '<div class="tab" id="tab_'.$k.'">';
    					$currentTabId = $k;
    					$currentTabName = $v[1];
    					require $this->baseInc.$v[0].'.php';
    					echo '</div>';
    					echo ('<script language="JavaScript" type="text/javascript">' . "\n"
    						  . '//<!--' . "\n"
    						  . 'show_tab('.$this->active.');' . "\n"
    						  . '//-->' . "\n"
    						  . '</script>');
    				}
    			}
    			echo '</td></tr>' . "\n" . '</table>' . "\n";
    		}
    	}
    }
    ?>
    

Image files, gif, jpg, png

These are all just images. You can change them if you want. The image type doesn’t have to remain constant. If you do change them, your theme will be noticeably different.

  1. Tab Images – These are images for the tabs you click on at the top of the web page.
    • tabBg.png
    • tabLeft.png
    • tabRight.png
  2. Tab Selected Images – These are images for the tab that is currently selected at the top of the web page.
    • tabSelectedBg.png
    • tabSelectedLeft.png
    • tabSelectedRight.png

    favicon.ico

    This is the icon that shows up in the tool bar of your browser next to the URL.

A guide for analyzing the quality of an open source application?

Ok, so you want to evaluate and open source application?

What guidelines should you use? Here is a guideline. I will continue to update this as I find valid items to measure. If you have something I should add to the list, please let me know.

Obtaining the Software

  1. A top link in search engine when searching for open source app’s name?
  2. A quick download link?
  3. Clear description of different downloads per platform?

Installation of Open Source App

  1. Clear description of different downloads per platform?
    List of platforms:

  2. Ease of install score:
  3. Ease of initial configuration score:

Authentication

  1. Integration with Active Directory?
    Score:

  2. Integration with LDAP?
    Score:

  3. Database authentication?
    Explanation: Can authentication occur in a database such as Postgresql, MySQL, etc…
    Supported Database list:
    Score:

  4. Authentication to a 3rd party programs database?
    Explanation: So that if you have an application A with a database that hosts a username a password, can this open source application B use your database from application A to authenticate?
    Score:

Security

  1. How secure is this application?
  2. What security holes have been reported and fixed?
  3. What development designs were taken into consideration to enhance security?
  4. What security analysis tools such as Nessus has this open source application been analyzed with?

Documentation

  1. Install guide exists?
    Quality Score:

  2. Users guide exists?
    Quality Score:

  3. Admin guide exists?
    Quality Score:

  4. Developer’s guide exists?
  5. Compile/Debug guide on how to load in an IDE and compile and debug (Visual Studio 2008, Eclipse, KDevelop, other, etc…)
  6. Guide for submitting a bug or suggestion?
  7. Guide for contributing documentation?
  8. Ease of contribution Documentation?

Ease of Use

  1. Is the application easy to use?
  2. Can non-technical users use the application with minimal training?

Stability

  1. How stable is the application? Determine this from normal use for a period of time.
  2. How stable is the platform(s) and/or 3rd party dependencies the application runs/depends on?
  3. Does the application crash with normal use?
  4. Does the application crash with abnormal use?
  5. Does the application crash with prolonged use?
  6. Is the process for submitting a bug simple?
  7. Is the process for applying a patch simple?
  8. Does applying patches decrease stability?

Community Strength

  1. Is it being maintained by a strong community?
  2. Is there a high adoption rate for this application?
  3. What is the average turn around time for a bug in the community?
  4. Is there a forum? What is forums user base? How quick do questions get responses?
  5. Is there a mailing list?
  6. Is there an RSS feed?

Customization of Open Source Application

  1. What language is this written in?
  2. Ease of customization.
  3. Ease of contributing to project
  4. Ease of compiling/debugging?
  5. Ease of getting fixes committed to source?

Scalability

  1. Does the application scale well with increased usage?
  2. Does this application integrate with the two most used operating systems for desktops? Windows and OS X?

Windows 7 64 bit VPN Client – ShrewSoft

Ok, so I couldn’t get Cisco’s VPN client to work for Windows 7 64 bit. So I went in search of another VPN solution that would be more compatible.

(UPDATE: I got ShrewSoft’s VPN Client working, so keep reading down below.)

I came across ShrewSoft’s VPN Client a while ago, but it originally blue screened my Windows 7 box, but it was a version that didn’t support Windows 7. However they have a new version that is out that is for Windows 7 64 bit. Actually they now have a release version on their download site but there is a beta of the next version (Update 3/05/2010)2.1.6-beta-6 that your may want to use (or a later version if you are reading this well after I wrote or updated it). See the comments on why.

I installed it and it requested a reboot so I rebooted, and the first good news is that I didn’t blue screen when my workstation booted up. Horray!!!

After installing, I tested undocking my laptop from its docking station and then docking my laptop, and again, no blue screens, so I think it is good to go. Now I just have to figure out how to configure it to connect here at work.

I like the license, they say:

The Shrew Soft Client for Windows is free for both commercial and private use. Please read below for complete license details. Click here…

Stay tuned for more testing….

Ok…I am back for more notes.

At work we are using a Cisco VPN solution, so it turns out that when my Cisco VPN would install on a 32 bit machine, it used a .pcf file. Well, guess what is awesome about ShrewSoft’s VPN Client? It can import a .pcf file.

I imported the .pcf file and I appear to connect, then disconnect. Not sure what is going on. I am at work, but I should be able to connect to the VPN while at work, at least that is what my IT staff said.

So hopefully it connects when I am at home.

Here is my log:

config loaded for site ‘MyConfig.pcf’
configuring client settings …
attached to key daemon …
peer configured
iskamp proposal configured
esp proposal configured
client configured
local id configured
pre-shared key configured
bringing up tunnel …
network device configured
tunnel enabled
session terminated by gateway
tunnel disabled
detached from key daemon …

I will try to debug later…

All right I am back again and I am trying to debug. I found this post:
http://lists.shrew.net/pipermail/vpn-help/2009-October/002282.html

There is a program under Start | All Programs | Shrew Soft VPN Client called “Trace Utility” that is installed with the Shrew Soft VPN Client can be used for debugging. However, it wouldn’t work for me. The buttons weren’t enabled.

I had to right-click on the “Trace Utility” shortcut and choose “Run as administrator” then I was able to turn on debugging.

Positives for Shrew Soft VPN Client
– It has a debugging utility.
– It supports Windows 7 64 bit
– It imports cisco .pcf files.
– There is a lot of documentation.

Negatives for Shrew Soft VPN Client
– I don’t have it working yet
– There is not really any clear failure reason for a user.

So I will keep at it. I think I am about going to email the developer, but I sure don’t want to bug him.

Hopefully for some of you, it worked first time for you when you imported the .pcf file.

Got it working

Another positive. The developer has a mailing list, as you saw with one of my links above. I found this link:
http://lists.shrew.net/pipermail/vpn-help/2009-October/002275.html

The key piece of information I needed was this:

If it gets to the ‘tunnel enabled’ point, that means you completed phase1, Xauth and modecfg negotiations. Its probably a phase2 option. As I mentioned to others on the list, try playing with the PFS setting or enabling the cisco-udp NAT-T option.

In the tool, after importing my .pcf file, I only had to make one configuration change. I had to change the PFS setting to “group 2”. See this screen shot.

VPN Setting

So I have this working now.

I have to say that I am very impressed with Shrew Soft. It took me some time to figure it out, but it works. Now the only question time will tell is how stable it is. Expect an update in a week or two about whether I think the Shrew Soft VPN Client is stable.

The steps are easy for me to connect to my VPN at work. Now every VPN is different so I am sorry if these steps don’t work for you:

  1. Use the correct (and latest) version: 2.1.6-beta-6 or later
  2. Install Shrew Soft VPN Client
  3. Reboot.
  4. Import the .pcf file.
  5. Modify the configuration and change the PFS setting to “group 2”.
  6. Apply the configuration.
  7. Click connect.
  8. Enter your domain user and password and you will connect.

Success!!!!

Also, I exported my configuration as a Shrew Soft VPN Client export, which is a .VPN file. When I import it, I don’t have to make a configuration change like I did with the Cisco .pcf file.

Key words: cisco vpn window 7 64 bit