Year End Message to our Open Source Community

Hello Everyone,

As a public company CEO, I write a “Letter to Shareholders” once per year, leading up to our Annual General Meeting. But shareholders are one of the multiple ‘key constituencies’ at Sangoma (others would include customers, employees, and yes, our valued open source community). So, as 2019 draws to a close, I thought I’d write to you too, given the importance of the community to Sangoma! I realize it’s turned into a long letter, but open source is critical to Sangoma, so there is lots to cover in a year. And hopefully this will help us to continue increasing communication between Sangoma and the community. Perhaps this can even become a yearly tradition if you find it useful?

At AstriCon this year, in addition to all the discussions about products (and your wishes in that regard), I personally received 3 requests from the community, more than any others: communicate with us more frequently (from all parts of Sangoma right up to the CEO, not just engineering), do so more carefully (ensuring all at Sangoma are sensitive to the perspectives from the community), and give us a chance to engage more with Sangoma (& tell us how to do so). So, here you go!

In this first inaugural letter, I’d like to start modestly by saying that we at Sangoma know we’re not perfect. After all, it’s just a company made up of a good group of (mostly) engineers trying our very best to do a great job for customers, including you. So, while we’re human and imperfect, you have over 300 people doing our sincere best for you every day, and we are “ALL IN” on open source and the community. And if the community is united, we can create an ecosystem that helps so many companies (both users and resellers/integrators alike) build their businesses. Let’s do that together, cooperatively!

Sangoma’s Unwavering Commitment to Open Source

As many of you have heard me say (too many times?), Sangoma takes our stewardship of Asterisk and FreePBX extremely seriously! As I said above, open source is SUCH a major part of what we do. In 2019, we have continued to invest millions & millions of dollars into FreePBX and Asterisk. Over the past several years, Sangoma has grown quickly, becoming a significant company with well over $100 million in revenue. We are the only substantial player in our industry for whom open source is a vital part of our business, arguably the only proven firm with the strategy and financial resources that can continue making these large investments in open source, and we fully intend to maintain our leadership in this category.

And I thought you might be interested to know that our investment in FreePBX and Asterisk, takes many forms, well beyond software development. On the product side, of course it’s true that we spend heavily in engineering, but we also provide community forums (for discussion, feature requests, support), offer free bug fixing, product training (both live and online), technical support, and extensive infrastructure for things like mirror servers and a translation platform. In addition to those product focused initiatives, Sangoma also invests deeply in the broader open source telephony ecosystem, helping to support/grow it with our own conferences and user meetings, by supporting other open source projects (by using them in our products, speaking at their conferences and inviting them our events), by encouraging better inter-op between projects, etc. No one else comes close to Asterisk’s 25 million downloads!

Executive Appointment of Sangoma’s new Open Source Leader

As those of you at AstriCon heard, Sangoma has appointed Jared Smith as Vice President of Open Source Community Development. I’m very proud to have an executive of Jared’s stature leading us in this area! Jared has tremendous experience in open source, has contributed code for over 20 years, and is well known/respected by many of you. He has worked on Asterisk, FreePBX, Red Hat’s Fedora Project, and ran the open source programs at Bluehost & Capital One.

Jared will focus on growing the Asterisk/FreePBX communities, ensuring we are meeting YOUR needs. You will be hearing more from him in the next week, but central to Jared’s role is our desire to work much more collaboratively with the community, have you more directly determine the product direction, and to ensure Sangoma communicates with you in a more respectful/professional manner, without any rude or antagonistic tendencies in forums/etc. Everyone knows Sangoma’s pedigree in open source, but our company’s commitment to it was concentrated too much in too few people. I take responsibility for that, and with Jared’s help, we are changing that. Please give him a warm welcome!

Product/Software Development

We know that (of course!) you care more about Sangoma’s development of the software you depend upon, than anything else we say. In Jared’s words: “Hey Bill, the community is going to look at our actions more than our words. Open source communities are obviously technical and therefore can be pretty skeptical about what companies say. They are really good at looking past marketing language and evaluating whether or not a company really does what it says it will do. Let’s show them that we’re the leaders in the community, not just tell them.” So this section is meant to do exactly that!

Firstly, in 2019 Sangoma focused most of our open source product work on ongoing software development for FreePBX and Asterisk (and bug fixing of our two core projects, naturally). Our focus was on core platform work and new features (both key parts of the major releases of Asterisk 17 and FreePBX 15 in October). But we’re also working to even extend the products into new novel areas. One such example is that Sangoma is introducing new IoT functionality to integrate with FreePBX and enable Access Control in an office from our Softphone/UC client software (no more white swipe cards!). We know you count on Sangoma to innovate on both Asterisk and FreePBX to keep them current, and we’re committed to doing so. In fact, we’re making a special effort in 2020 to roll out significant new capability monthly! It will start in January with FreePBX functionality to comply with Kari’s law, which comes into effect in February. And finally, on the software development topic, Sangoma will be making a concerted effort to further strengthen product quality on FreePBX and Asterisk in new releases during 2020, with less ‘throw it out there & let the community find bugs’. Jared will cover all this, including the plans for Feb/Mar/April monthly releases in his coming note.

The second key product initiative at Sangoma in 2019 has been investment in building up our open source engineering teams even more. It’s no secret that there has been some change in staff during the year and we’re not hiding from that. But with change comes an opportunity for renewal, and that’s exactly what we’re doing! Our dev teams are growing, we’re hiring (hint!) around the globe and now have open source development staff at Sangoma on 5 continents (with Asterisk and FreePBX devs in Huntsville, Toronto, Bangalore, San Diego, Columbia/Ecuador/Uruguay, Atlanta, Eastern Canada, France, and Niger Africa). With so many users around the world, we want engineering talent around the globe too. So if you had any concern about some of the changes in staff, please don’t worry. Sangoma is growing faster than most all companies in our space, is the only one with resources to contribute this kind of investment into open source, and we’re 100% committed.

And thirdly, I thought you’d like to know that product training has gotten a significant ramp-up in attention at Sangoma over the last 6 months. We have been investing more effort into content and course delivery, especially on open source. So, I’m very proud to share that it’s working. We’ve had an astounding 10k trainees take our online courses in the past 6mo!! 70% of these have been open source, with ~2000 in Asterisk & ~5000 in FreePBX. Nobody else even comes close.

Community Engagement and Promotion of our Open Source Projects

In 2019, Sangoma continued our investment to build awareness for our open source platforms, to ensure that both FreePBX and Asterisk receive the credibility they deserve (and that you count on in your business). These efforts range from social media activity, to press releases, to speaking with leading industry analysts (and stock market research analysts), to organizing/hosting events, to fostering healthy/professional relationships with you, the community. I’d like to cover the last two in a bit more detail below.

For 2020, we have already begun planning several of our key events for the year, including the following for open source:

  • AstriCon 2020 will take place in October in Florida. We had suggestions for other locations (including Toronto) but travel proved to be a possible concern, so we’re playing it safe. And we also received some very good feedback from the 2019 event, so we will be adding an additional open source track, making presentations longer (to leave more time for Q&A), and we’ll be bringing back the Dangerous Demos. Details to follow by April.
  • By popular demand we are also bringing back FreePBX World! It will be co-located at AstriCon in October.
  • Asterisk and FreePBX training sessions: As you’ve heard, product training has really accelerated at Sangoma over the past 6 months, and only Sangoma can provide you with official Certification. Better yet, because we see training as a key way to strengthen community interaction, Sangoma has decided to offer Half Price Training, during January through June of 2020 to get as many members certified as possible. That means a $1500 course is available for a very limited time for $750! More on this from Jared shortly, but please note that the first 4 courses of the year are already scheduled and are filling fast (January is Asterisk Advanced in the US (Wi), February is FreePBX in Europe (Italy), March is FreePBX for the US, and April has Asterisk again).

In addition to the above, in 2020 Sangoma will be reinventing the ways in which we foster relationships with you, our open source community, under the new theme of “Care, Engage, Support”. Care about your open source projects, Engage more easily/frequently with Sangoma as the steward of your projects, Support Asterisk/FreePBX in your decisions/deployments. This theme goes beyond my earlier point of ensuring professional communication. And we’re of course not taking away any of the mechanisms you already use and value, such as forums, AstriCon, etc. But we want to encourage more substantive, more respectful interaction between Sangoma, and you as the users. In that spirit, we ask for your input on what you’d like (and Jared will follow up on this point in his coming note). In the meantime, we have several new initiatives that I have personally spearheaded, being launched under the “Care, Engage, Support” theme for 2020, which Jared will cover in detail.

  • A new FreePBX/Asterisk “Voice of the Community” (VoC) Program, where Sangoma facilitates key community influencers and regulars, to post to the community on Sangoma websites/forums/blogs. I hope this encourages thought leaders in the community to communicate powerfully to all members, foster loyalty, and profile those that echo the cause we all believe in so strongly. In my view, not all messaging needs to come from Sangoma.
  • A new mechanism available to ALL community members to submit ideas/input/questions to Sangoma via confidential email without requiring every request to be publicly visible immediately. Some members may feel more comfortable being able to provide ideas/questions this way, and if it facilitates more input, then all the better.
  • A new 1-day, live, “Open-Source Reseller Advisory Council” (OSRAC). Sangoma does this with selected resellers in our non-open source business, and it’s always incredibly well received by partners (plus it helps us gather market needs). Our first OSRAC meeting will be the week of Feb 10, by invitation, and will involve awards. We’ll cover part of your cost, so to be considered, speak with Jared and he’ll connect you to our organizers.
  • Quarterly newsletters dedicated to FreePBX/Asterisk/open source. Community input sought, so reach out to Jared.
  • More direct engagement with Sangoma engineers. We are committing more time from our devs to engage directly with you, empowering them by giving them time away from coding to ‘make it happen’. You’ll see more blog posts, more answers in the forums, and a new series of videos delivered by our Engineers on FreePBX & Asterisk.
  • Keeping open source lively and fun by creating an online merchandise store and new areas of the web for contests and trivia. Show off your passion and excitement for FreePBX, Asterisk and open source!

In summary, Sangoma is FULLY committed to our stewardship of FreePBX and Asterisk, and we take our responsibility very seriously. It is important to us in so many ways, we have the resources to continue supporting/funding it, and the desire to listen to you… in order to make changes that continuously improve your projects. Sure, we’re human, so we’ll make honest mistakes, but I personally pledge that we will always do our sincere best (Sangoma is ALL IN, on you!). After all, open source projects thrive when the community is engaged and throws their support behind the project/company/steward. As Taylor Swift says: “the haters are gonna hate hate hate”. Let’s please NOT join them. There are enough folks in our industry who wish it would all just go away. We don’t need in-fighting nor attacks… let’s cooperate, because after all, we’re in this together, so let’s unite to support Asterisk/FreePBX, as one community/company/project/steward?

Thank you, we appreciate you, and we are looking forward to a great 2020 together! Finally, I wish you and your family/friends a very happy holiday season.

Warm Personal Regards,
Bill Wignall
President and CEO, Sangoma Technologies

FreePBX 15 is Released!

Hello Everyone!

We’d like to announce that FreePBX 15 is now fully released! It has been a long road in getting things shored up with some of the new included functionality but we’re very excited that we’ve finally come to this moment. I’d like to take a moment to thank all of you who have helped to test, submit bugs, submit patches, answer questions on the forums, and otherwise participated in getting this release out. It takes the diligent efforts of many to ensure that everything comes together.

As a final note, updated ISOs should be available on the download site with updated versions of SangomaOS and FreePBX 15. Thanks so much again, and happy upgrade/release day to you all!

– The FreePBX Dev Team

FreePBX Team Update

Hey,

The last few blog posts we’ve done have been technical, so this week I’d like to take a step back from that and introduce you to some recent additions to the FreePBX team. As a company, we have been redoubling our investment into the FreePBX project, and it’s good from a community perspective to see some of the fruits of those efforts.

The first person is Walter Moon (picture above). Walter began his career in telecommunications back in 2005 at Switchvox, during its earlier days. “During my time in multiple roles with Switchvox, I built a good understanding of how companies use a PBX, and what they expect from them. That perspective really helps when I approach things as a developer.” After joining the FreePBX team in June of this year, he’s looking forward to what’s to come, saying “I’m happy to be on board as a developer for the FreePBX team. The benefits of being an open source project are notable, and it’s exciting when there’s a strong community contributing in numerous ways. It keeps things interesting. I always liked FreePBX as a product. It offers so much for so little cost. It’s something I’d use myself, and I like that.“ When he’s not working, Walter likes to spend his time tinkering with cars, and playing video games.

Another recent addition is Matt Brooks (also pictured above). Like Walter, Matt also began his career at Digium in 2005. For the most part, Matt has worked many years behind the scenes at Digium and Sangoma building the website infrastructure and business systems. “I’m excited to make the transition from a supporting development role to an active product development role in FreePBX. I have been playing around with Linux and Open Source software since I was a teenager and finally getting the opportunity to work on a Great Open Source Project, such as FreePBX, has always been a dream of mine. I have many ideas for the project and I can’t wait to see how I can apply them to help push the project forward.” Matt’s hobbies outside of work include building and supporting local tech communities in Huntsville, AL by organizing technical workshops and innovation competitions through local non-profit Urban Engine. Here, Matt has been key in organizing many events such as the NASA International Space Apps Challenge, the Hudson Alpha Tech Challenge, HackHSV High School Hackathon, and 4 Hours to Product.

I think we’re excited as a team to see them grow into their roles as FreePBX developers and start interacting with different members of the community. Hope you all enjoyed getting to know Matt and Walter a bit better, and best wishes to you all!

– Matthew Fredrickson

GraphQL support in FreePBX 15

As you’re probably already aware, we’re very close to the release of version 15 of FreePBX.  One of my favorite new features in FreePBX is the GraphQL support that was added earlier this year.  The support that was added for GraphQL makes it easier for external programs or systems to interact with a FreePBX system.  For those of you not familiar with GraphQL, I hope this blog post makes a good introduction, and helps you to catch my enthusiasm for supporting GraphQL in FreePBX.

What is GraphQL?

GraphQL is a more modern way of programmatically querying applications. GraphQL allows the API user to be more specific about the query they would like to issue to the API. This allows the interaction between the client and server to be more streamlined, make fewer API calls, and be more performant.

GraphQL is a “data query language”, that was developed by Facebook.  It is a specification for how to query an API over HTTP or HTTPS. You can think of it as being somewhat REST-like, but more declarative.  With typical REST APIs, you ask the server to send you a representation of some sort of object. For example, you might do an HTTP GET to http://my.example.com/rest/v1/book/42 and the server would return some sort of stateful representation of object “book” with an identifier of “42”.  If the “book” object has a large number of fields, the server is going to return every single one.

GraphQL is also used to query a server via HTTP or HTTPS and get a response — just like REST.  Unlike REST however, GraphQL lets you specify the exact fields that you want returned. How? A client tells the GraphQL server exactly what it wants the response to look like, by sending the server the layout it wants for the responses.  For example, let’s assume we have a GraphQL server that serves up information about books. The following GraphQL query shows how you would query the server to get the book with ID 42, with only its ID and title fields returned:

query {
  book(id: 42) {
    id
    title
  }
}

Why GraphQL instead of REST?

GraphQL is better at dealing with hierarchical data.  To extend our “books” example a bit more, let’s say that each book has a link to an “author” object as well.  Using REST, we’d have to GET a book object, parse the response to get the author ID, then GET the author object with that ID.  It makes for a lot of back-and-forth requests for linked data. GraphQL, on the other hand, follows relationships between objects.  For example, the following example query would automatically follow the link between the book and the author, and return the “firstName” and “lastName” of the author(s) associated with the books.

query {
  allBooks {
    book {
      id
      title
      author {
        firstName
        lastName
      }
    }
  }
}

GraphQL is also strongly typed.  This means each field is either a built-in type (such as a string or an integer), or a specified type (such as a book or an author).  With GraphQL, you never have to worry about what type of values you’re going to get back from the server.

GraphQL comes with a set of default scalar types out of the box:

  • Int: A signed 32‐bit integer.
  • Float: A signed double-precision floating-point value.
  • String: A UTF‐8 character sequence.
  • Boolean: true or false.
  • ID: Represents a unique identifier for an object

Of course, a GraphQL server can (and often does!) define its own custom types.

GraphQL is also introspective.  This means that there is built-in support for asking the server which methods are available, and which types of data can be returned.  This makes a server self-describing in a way that makes it much easier for developers to explore the API and understand the results. Some GraphQL clients use this introspection to make developing with GraphQL much easier, as will be explained below.

GraphQL basic concepts

GraphQL has three basic types of operations that you can perform: queries, mutations, and subscriptions.  A query is a request for information from the server. A query typically begins with the word “query”, and then the method you are querying, along with the details from that query that you want returned.  For simplicity’s sake, if you leave off the word “query”, GraphQL will assume you’re doing a query. This means that the following two queries are functionally identical:

query {
  book(id: 42) {
    id
    title
  }
}

{
  book(id: 42) {
    id
    title
  }
}

Mutations are used to either create a new object, or to change values on an existing object.  You can think of them as being roughly analogous to using POST, PUT, and PATCH on REST APIs. In the case of GraphQL, however, you’re always using an HTTP POST for your queries, mutations, and subscriptions. For example, the following mutation could be used to create a new book in our example API, and then return its ID:

mutation {
  createBook(input: {
    author: "John Q. Public",
    title: "Hoping for Better Weather",
  }) {
    id
  }
}

The last basic operation is a subscription.  You use subscriptions to be notified when a new object is created, or an existing object is modified.  Assuming the API has a subscription type of “newBook”, the following example would wait until a new book is created, then return it’s title and ID.

subscription {
  newBook {
    id
    title
  }
}

How do I get started with GraphQL in FreePBX 15?

Now that we have covered the basics of GraphQL, let’s dive into using the GraphQL support in FreePBX 15. To begin with, you’ll want to make sure that all of your FreePBX modules are up to date, and that you have the “API” module installed.

IMPORTANT NOTE: Please note that GraphQL support in FreePBX 15 is a technology preview, and that GraphQL support has not been added to every single FreePBX module. Over time, we hope to expand the GraphQL support in FreePBX to cover more modules and more functionality.

Once that is done, you’ll want to create a new API “Application” in FreePBX. Simply go to the FreePBX administrators panel, and choose “API” from the “Connectivity” menu. Then click on the “Add Application” button and choose “Machine-to-Machine app” as shown below:

Adding a Machine-to-Machine App

On the next page, give your application a name (such as “GraphQL demo”) and a description.  For now, leave the “Scopes” field empty. Scopes are a way of limiting the permissions of an application, but by leaving the field blank, we’re giving this application full permissions.  Click on the “Add Application” button.

On the next page, you’ll be presented with all the necessary information to connect to FreePBX via GraphQL.  Your information will obviously be slightly different than mine, but it should look something like the following:

It is vitally important that you copy the “Client Secret” because as soon as you hit the “Close” button you cannot retrieve that value.

Now that we’ve created application credentials, we can use them to play with GraphQL.  There are two methods for doing this. The first is the built-in GraphQL Explorer panel.  The second is using an external application. I’ll briefly explain how to use both.

Using the GraphQL explorer

Within the API module in FreePBX, simply click on the “GraphQL” explorer tab.  Then, simply type “gql” in the scopes text box, and click the “Reload Explorer” button.  This will load the GraphQL explorer with the “gql” scope, which means that you’ll be able to see everything with GraphQL.

GraphQL Explorer Scope

You’ll then see the GraphQL Explorer interface, which allows you to test GraphQL queries and mutations directly from your web browser.  For example, type the following query to get a list of all the FreePBX modules on your system and their current version:

{
  allModules {
    modules {
      name
      version
    }
  }
}

GraphiQL Explorer

Note how the “data” object returned matches the layout of our query? That’s one of the beauties of GraphQL — the results match the format and layout of the query.

Use an external program for testing

Another way to interact with GraphQL (without writing your own GraphQL client in the programming language of your choice) is to use an external program.  There are two popular REST development clients which have added GraphQL support, namely Postman and Insomnia. Since Insomnia was the first to support GraphQL and seems to have more robust GraphQL support, I’ll show you how to configure Insomnia to connect to the GraphQL endpoint in FreePBX.

First, download and install the Insomnia program from https://www.insomnia.rest.  Insomnia has clients for Linux and Mac and Windows.  Once the program has installed, run the Insomnia client.

Click on the “New Request” button, give the request a name, select “POST” as the request type, and “GraphQL Query” as the body type.  Then click the “Create” button.

Create Request

First, let’s tell Insomnia where to send GraphQL requests.  In the URL bar at the top (to the right of where it says “POST”, enter the GraphQL URL from the client credentials we created above.  From my example credentials, the URL would be http://192.168.55.153/admin/api/api/gql. Yours will obviously be slightly different.

GraphQL URL

Next, click on the “Auth” tab at the top of the middle pane.  Click the small arrow next to “Auth” to open the drop-down, and select “OAuth 2”.  Select “Client Credentials” as the “Grant Type”. Enter the Token URL from the client credentials, as well as the Client ID and Client Secret.  Make sure the “Enabled” box is checked. Now, click the “Refresh Token” button at the bottom of the screen. If the “Access Token” is filled in with a long list of letters and numbers, your authentication is working correctly.  If you get a 401 error instead, double-check your Client ID and Client Secret and try again.

GraphQL Authentication

Finally, we can write our query in the “Body” tab.  For our first query, let’s list the FreePBX modules and their versions.  Click the small arrow next to the “Body” tab, and select “GraphQL Query”.  Then type (or copy/paste) the following query in to the “GraphQL” tab:

query {
  allModules {
    modules {
      name
      version
    }
  }
}

Now we can press the “Send” button, and see our results:

GraphQL results

There you go!  You’re on your way to playing with GraphQL and FreePBX 15!  Feel free to look at the documentation, either in the GraphQL Documentation tab in the API module of the FreePBX GUI, or by clicking on the “schema” button in Insomnia.

Technology Preview

Just as a final reminder, please remember that GraphQL support in FreePBX 15 is a technology preview.  Not all of the desired functionality has been baked into the FreePBX 15 release. Future module updates will likely add additional functionality to the GraphQL API.  We hope that this blog post inspires you to start looking at the GraphQL API.  Please give us feedback on what features you would like to see added to FreePBX in the future!

FreePBX 15 – Backup and Restore Rewrite

First, some history: we started development of the new backup and restore system in mid 2017. Some of the goals of that effort were to redesign the feature to allow for more simplicity, flexibility, and maintainability.

Some of the major reasons it was decided to rewrite include:
– There was no choice for backup on a per module basis.
– There was no option to restore the backup from an older version to a newer version.
– No choice of restoring only a particular module.

The redesign ended up being a new concept/structure of taking backup from the way it used to be. Each module handles its own backup and restore. This makes the QA process more complicated due to having to test each and every module and many combinations of modules.

New Backup & Restore functionality:

The new backup and restore functionality in Freepbx 15 is very simple and easy. Each module handles its own backup and restore implementation. It allows you to do backups per module – and 15 backup does only the data backup so it is very lightweight. Prior to 15, backup could potentially include not just configuration files and database information, but also could include FreePBX PHP files and other similar unnecessary additional program related data (depending on how a user constructed their backup templates). In FreePBX 15, we have also removed the backup templates concept from backup and restore to make the backup data selection process more simple and clear for users. We decided that the previous template system was overly complicated for what it was intended to do. If someone is not familiar with the details of which underlying applications and modules needed to be backed up, it was challenging to figure out how to properly construct a template for some particular part of the system. The new system simplifies the module selection interface and it allows you to restore any particular module from a full backup. So if users would like to backup or restore only one particular module, the new interface allows users to easily do so.

FreePBX 15 backup also allows you to restore from legacy backups. This means that people can take a backup from an older version of FreePBX (specifically versions 13 and 14) and restore to a FreePBX 15 system. This makes it easy for the users of FreePBX to migrate from older versions to a new or more current major version of FreePBX.

Backup storage options are now handled in the Filestore module which offers more options on where to store your backups. These options include local storage, remote FTP, SSH/SCP, Amazon’s S3, Email, and Dropbox.

As previously mentioned, due to the scope and complexity of these efforts, it required a much longer QA cycle to make sure it was ready to go (or ready enough). That being said, we hope it to be a lot more “baked” at release time than it would have been otherwise.

We hope you all are able to enjoy and try this new functionality out. As always, for any issues that are found, feel free to open a bug at issues.freepbx.org.

Thanks,
Philip Joseph