Small Changes Big Consequences

I sat around this Saturday morning clearing out some recent bugs so I could head off to Maui tomorrow with a clear conscious and enjoy my vacation. As I did so I pondered what to blog about having just given you a well received sneak preview of the next v2 release. One of today’s bugs made me think it would be good to talk about the hard choices of what goes in a release and what does not. Before I go on though, if any of you readers are out in Maui in the next 1.5 weeks, send me a PM, maybe we can have a drink!

Many of you have a favorite feature request you want in the next release. Sometimes it may come complete with a fully functioning patch sitting in the tracker and it can be very frustrating to you when we decide it is not going to go in the release. “Why won’t you just put it in, it’s just a few lines of code and it’s all right there…” is something I’ve encountered on more than one occasion. It may appear to be simple and sometimes things are, but more often then not they are not. Unfortunately when looking at your own feature you may not always see the subtle things it may break, and often we don’t see them right away either but experience has taught us that they are there.

An example is the addition of the CallerID field for outbound routing that was introduced in 2.7. It was presented to us at the tail end of the 2.6 release cycle by a very knowledgeable community member who said “look, if you simply modify the javascript validation that restricts the use of “/” in dialpatterns for outbound routes, we can add the ability to support outbound routing by extension with the use of the CallerID field.” This sounded harmless enough that one of the developers decided to checkin the code even though we were in feature freeze and close to release. Well one of the privileges / curses of being the project leader is that I get to be the one who says “that has to go, it’s too late to add features so put it in the next release.” Something that is never appreciated. None the less I took it out and moved it into 2.7 where it would have ample time to be tested and run through proper beta cycles.

Needless to say, small changes can have big consequences, especially when they are sitting in a critical call flow path. The first issue that came up and was included in the original checkin was the fact that we don’t even know the true “CID” of the extension until Macro(user-callerid) is executed which doesn’t happen until you are in the route. Well that’s just a minor change, we’ll just move that instruction out of the route and in the outbound-allroutes context. Sure enough that does the trick and all looks great, or does it? Eventually someone comes along with a route that has multiple trunks and you start scratching your head wondering how a call is completing on a trunk that is not part of your route?!? Oops … the CID is changed by Macro(outbound-callerid) so if the trunk falls through to another trunk, “everything has changed.” Well that’s an easy enough fix once again (after many hours of scratching your head..), We’ll just reset the CID each time we exit one of the Macro(dialout-trunk) or equivalents. Now we’re getting somewhere, it all seems to work, right? So far, so good but that’s not to say that everything else that used to work is still working.

Our first casualty comes in, the popular third party module Custom Contexts is broken. This is not one of our modules so who cares, right? Isn’t that why it is not a core module and not supported by the core team? Well technically that’s true however it is not in our interest to break other things that worked and FreePBX has always tried hard to not break compatibility and things that used to work. So after spending yet more time thinking about the failure mode and what we could do differently out comes another change and this time we are feeling pretty good about “that small change to the javascript validation allowing the “/” character” finally being put to rest. Then comes the day before my trip to Maui and in comes the next report, the AMPBADNUMBER=false configuration that allows “Early Dial” configured phones to work properly has been broken by our nifty little fix of moving Macro(user-callerid) into outbound-allroutes. So once again off to spend more time thinking about and testing various alternatives to resolve the newest bug without knocking down the rest of the card castle… For now, once again we think its finally licked, at least until the next issue gets presented. (If that happens in the next couple weeks though, you can rest assured that I’ll let the power of open source solve the problem in my absence because despite how much I may enjoy working on FreePBX, it’s not going to happen in Maui!)

I hope this digression helps to understand that there is often much more than meets the eyes when thinking about new features and capabilities for FreePBX. When you have an installed base counted in the hundreds of thousands you are going to find people doing all sorts of things that you haven’t anticipated. We try to take this into account when considering new feature development. We look at many other factors as well. Who’s interested in doing the feature? How popular is the request? Are there other ways of doing certain things today that may make one feature less urgent then another one? What do we anticipate the consequence and required support to be? Is the author of a requested feature going to be around/willing to maintain the new code and be responsive to issues when they come up? Is the feature important enough that a customer is willing to pay the true anticipated cost of implementing and future support of that feature? (Remember the javascript change above; imagine the reaction if a customer had made such a request and were told it would cost them $1000, which would have been a bargain when considering the time it has taken so far…).

So … next time you are wondering why that small feature of yours may still be outstanding, or why a knowledgeable developer may have quoted you what sounded like an exaggerated sum for something that seemed easy and small, I hope you can appreciate the job and challenge we have when evaluating such requests and considering what is in or out of a release.

For now, I’m signing off and thinking about beaches and sunshine….I’ll be back in a couple weeks!

Philippe – On behalf of the FreePBX Team

Sneak Preview of 2.8

Work on FreePBX 2.8 is progressing at break neck speeds (has it been just a week since my last blog?) and I couldn’t hold back giving you a sneak preview! Although 3.0 takes the cake in visual improvements and web 2.0 features, 2.8 is taking steps to improve on a few areas that long time FreePBX users can really appreciate. Where as we set out to work on internal plumbing along with a few features, we naturally find areas to digress, to your benefit.

So what’s so exciting that I had to go blogging about it just a week after announcing 2.8 plans? If you spend much time in FreePBX you probably become skilled at navigating land mines! (You know, those annoying tooltips which are scattered around the page to help all those newbies but popup instantly the minute you get your cursor within detonation range!) Seriously though, this has annoyed me for years especially knowing that there was surely 2-3 lines of magic that could make it much more usable. Well kudos to Moshe again (lazytt) with for solving the problem after I put the bug in his ear. Sure enough a very minor change to the CSS file, and depending on how you count, one line of jquery magic and 5.5 years of frustration solved in a puff of smoke! Here’s the secret sauce:

[code] $(“”).hover(function(){
var pos = $(this).offset();
var left = (200 – pos.left)+”px”;
$(this).find(“span”).css(“left”,left).stop(true, true).delay(500).animate({opacity: “show”}, 750);
}, function() {$(this).find(“span”).stop(true, true).animate({opacity: “hide”}, “fast”);

Between that snippet of code and a few changed lines in the CSS file, we get this:

So what’s different about that tooltip other than looking a heck of a lot nicer? Well the code snippet does the magic but for most of you it’s probably greek, so here’s what it does… If you move the mouse over a label with tooltip, you will have a 1/2 second grace period before the land mine goes off. Once that time has passed though it doesn’t explode open like before, it fades in over a 3/4 second period and as soon as the cursor is moved from the target, it quickly fades away. The end result, you can move the cursor freely across the screen without being bombarded by exploding tooltips!

That’s not the only magic Moshe has been up to. In my last blog I commented on the cascading select boxes that would make those long cluttered destination targets a thing of the past. It took a few more lines of jquery and some other code changes but the results are spectacular! A picture of the new IVR layout tells the whole story, and these cascading select boxes now replace all modules that have a “Destination if no Answer” style selection. Here’ s the new look:

Now imagine that screen with a dozen choices compared to the old look! (And behind the scene, we’ve also increased the server side rendering performance of such multiple destination options significantly!)

Moving on to Outbound Routes and Trunks. While working on the internal plumbing I decided to get rid of those dialrule textareas in favor of a GUI that might make it more intuitive and less error prone. So out goes the textarea and in comes something that looks like this:

Let me translate this for those used to the old format. Recall outbound routes can match on a pattern including an optional dial prefix, and send the resulting number (less the prefix) to the trunks. In addition, FreePBX 2.7 added the ability to match on the CID portion as well. The results might look like the following, these rules allow access to this route by dialing 9 first (like those traditional inflexible PBXs that we love running circles around):

[code] 9|011.

This example allows for 7 and 11 digit NPA dialing, as well as international, 311 and 411 access using a prefix of 9. It drops the 9 and sends the resulting number to the trunks.

You can see where a CallerID (typically an extension number or pattern matching a group of extensions) can be added as part of the match. There is also an optional prepend field not previously available. These digits are prepended to the resulting match prior to going to the trunks. This new feature can solve some powerful problems. One example, providing 7 digit dialing to extensions that are remote. For example, your main office is in Seattle where 7 digit dialing results in 206 being prepended. However you have branches with remote extensions in Chicago and you want their 7 digit dialing to prepend a 312. I’ll leave it as an exercise to the readers to see how to achieve this and for those coming to our upcoming OTTS Training at Digium, I’ll give you the answer if you have not figured it out.

The trunk page has been modified with a similar GUI interface. It has also added the ability to include the “+” as a valid digit which was previously not possible. You light-weight appliance users will also appreciate the elimination of the underlying fixlocalprefix AGI script in place of native dialplan used to apply these rules.

Enough blogging, it’s time for you to get your hands dirty and help us make this a reality! You can download the 2.8.0beta1 tarball and see all this for yourselves. If tarballs intimidate you (or, what’s a tarball comes to mind…) then download the version upgrade module to your desktop, then upload it in Module Admin through the GUI and get yourself on the bleeding edge without touching the command line! (You won’t find the upgrade module in the Online Repository yet, you will have to install it this way). There’s still more feature development to come on 2.8 so there will be at least another beta release before we do a feature freeze. If you don’t see all the advertised features there like the great Company Directory that is working on (yup … Moshe again) that is why.

For now, have fun and thanks for getting involved!

Philippe – on behalf of the FreePBX team!

OTTS Training, v3, 2.8 – Times are Busy

Are you keeping an eye on the ticket trackers (v2 and v3), blogs or the website in general because there is a lot happening and it’s a really exciting time for FreePBX! On the v2 front we pushed 2.7 out the door a couple of weeks ago with several exciting enhancements and over 4000 systems already upgraded! Work is going strong on 2.8 discussed below, and we’ve got an OTTS FreePBX training coming next month well timed for the subsequent release scheduled for mid May! The v3 side has been extremely active as well with an upcoming general preview release just weeks away!

OTTS FreePBX Training

If you’re not familiar with our training program you can get details on the OTTS training link on this site. It’s the only officially sponsored FreePBX training that is hands on and heavily lab oriented. The next class is scheduled for April 27-29 at Digium’s Headquarters so if you are thinking of coming, get registered now. If you are a previous attendee to our training series (all you Leap Frogs out there) and are interested in coming for a refresher with all that has happened in the last few releases, contact us for a repeat customer discount! This should be an exciting class and as always when at Digium you have the opportunity to meet some of the great minds behind Asterisk, which is almost as good as meeting with us! We’ll also try to have a v3 system configured and available for show & tell if the timing works out!

v3 Happenings

While on the subject of v3 let me brief you on what is going on. In the last couple of months the v3 team has done an amazing job stabilizing the release with heavy work on both the Asterisk and FreeSWITCH engines! The new platform promises to be a fantastic foundation to launch the next generation of FreePBX and we are super excited to what the future potential holds!. The bulk of the work over the last year has been an intense journey exploring the different dimensions involved in redesigning a new platform to launch a next generation FreePBX product. The team is working hard to stabilize the current capabilities so that we can deliver a general preview release in the next weeks, complete with ISO, so that we can start to get some heavy involvement of the broader community. We then have some ideas of ways to have a little fun in getting developers to come pouring in and helping to rapidly accelerate v3 with new modules and features in a similar way to what we saw happen in the FreePBX 2.0-2.3 era, a time of rapid expansion… We’ll follow with another blog and more details on what is going on with v3 soon!

v2 Happenings

The mainstream v2 bread and butter is doing anything but standing still despite the rapid and intense work going on with v3! Version 2.7, released less than two weeks ago, made some great contributions but the momentum has done anything but slowed down! I’ll digress briefly to make a comment on the general shift in release philosophy with v2. In the past we targeted releases every 6-9 months which resulted in significant change when the releases came out. Despite our stellar track record of near perfect migrations (all the way back to AMP 1.0!), system admins still get a little nervous when they see significant change and thus hesitate to dive in (as they should, though you never heard that from me!). With v2’s level of maturity being over 5 years old, we are shifting to more frequent and smaller releases. This helps us realize a few goals. We can continue to limit updates within a release to bug fixes only which makes most of you more comfortable accepting updates knowing we are not introducing new features. At the same time, we can get new capabilities delivered to you quicker with the introduction of new releases. Lastly, the new releases can be smaller in scope which allows us to focus into the changes required for the new features being introduced and thus continue our un-matched record in increased stability with each new version!

So back to 2.8 and what’s going on there! You can have a look at the 2.8 Milestone to keep track on it’s progress and focus. This release is going to be a mix of internal plumbing upgrades and cool new features (as always!). I won’t dwell on the internal changes, it’s one of those necessary areas that us engineers thrive on but usually go un-noticed by most users who don’t quite understand why it’s needed and what it brings in potential. On the feature front there are several areas being reviewed and worked on. In addition to some great new capabilities introduced for Outbound Routes, we are looking at a scattering of smaller features on several fronts.

One small and one big feature that I’m really excited about is somethings that Moshe (lazytt) over at is actively developing for 2.8. On the small side, we’ll see all those cluttered destinations made up of rows of select boxes with radio buttons give way to a cascading pair of select boxes, the first being the module and the second being the destination within that module, the existing select to the right of each radio button. This will do wonders to cleanup modules like IVR, Time Conditions, Day Night and even the Extension page when the Fax Detection option is enabled! On the big side, Schmooze is developing a long overdue real company directory module that will finally enable the creation of multiple company directories that can include/exclude existing extensions on the system as well as custom entries to allow for maximum flexibility. Not only will these be available as a destination to the IVR or any other module (to replace the existing directory which is based off of the voicemail.conf file), but the same directories will be available to control direct extension dialing solving many common challenges people face wanting to direct dial a Ring Group, Conference bridge, Queue, etc. We also look forward to a much cleaner user experience when calling into the company directory then today’s less then optimal implementation.

I could go on but this blog is getting a bit long. For now I encourage you to poke around if you haven’t already and get a feel for all of the excitement and energy going into this project! It’s all possible because of the great chemistry created by Open Source so come and get involved if you have been just watching from the side lines! (If you are not a developer, there are plenty of other areas from testing to documentation on the site to bribing other developers to build features that are important to you!).

Philippe – on behalf of the FreePBX Team!

FreePBX 2.7 Is Final

I’m excited to announce FreePBX 2.7 Final available for immediate download. We have over 2000 systems running 2.7 at the time of this posting and continue to see more features and increased stability as FreePBX evolves. The bugs encountered during this release were minimal and most of those addressed in the bug tracker were already existing bugs from earlier releases fixed during this Milestone (and most of those not back ported to 2.6.

The biggest changes in 2.7 were around the Fax handling and the new FAX module which provides a much more intuitive GUI for dealing with FAXes with both shared voice/FAX DIDs that require detection or dedicated FAX DIDs. It also introduced support for FAX For Asterisk (FFA) in addition to the legacy support for spanddsp based FAX reception. You can get more details about the changes in the 2.7.0 Beta1 Release announcement.

Outside of FAX, you can see a more comprehensive list of features and bugs addressed as well as an overall summary in the 2.7 Milestone along with direct links and stats to all 142 closed Feature Request and Bug tickets addressed during this run!

A few highlights include some great enhancements to Queues and Backup, as well as additional abilities in Outbound Routes, Follow Me, Ring Groups, Trunks and Conferences to name just a few. If you are particularly interested in Queues you may want to have a look at the recent Heavy Queue Usage in FreePBX Technical Corner article we just put out which talks about various advanced capabilities in the Queue module that may be of interest.

With 2.7 now final it means that FreePBX 2.5 is now off support so if you are still running 2.5 or older versions, you may want to seriously think about an upgrade plan. The project’s support policy is to support the current and previous major releases.

We have started to compile up a list of what we want to target for our next v2 release and you can see the plans as they evolve in the 2.8 Milestone. More to come on that as we better define it. We will also be working hard to get our v3 General Preview Release Candidate out with support for both Asterisk and FreeSWITCH. It has been available as a Developer release since last August and is now getting to the point where we will be able to get more user feedback to really shape its development going forward!

For now go have fun with all the great new stuff we are getting out to all of you and we will be back shortly with more news to come!

Philippe – On behalf of the FreePBX Team!