Presentation on theme: "Components and Dashlets"— Presentation transcript:

1 Components and Dashlets

Custom Wizards, Components and Dashlets in Nagios XI Troy Lea Good morning all and thank you for coming to my session. My name is Troy Lea and I'm here to talk to you about custom configuration wizards, components and dashlets in Nagios XI.



2 Cloud Computing Specialist

About Me IT Consultant Strategic Group Cloud Computing Specialist VAULT One of Australia's most mature cloud computing solutions Before I take you through my presentation I wanted to spend a few moments telling you about who I am and how I've come to speak to you at this conference. Who am I? I am just like you, I am passionate about IT and everyday I get to work for an organisation where I can make a difference in the value that my company delivers to our clients. The company I work for is called Strategic Group, and as you can tell by my accent we are Australian. I have spent the last seven years of my life with Strategic Group. My journey with Strategic Group started with helping clients by supporting their onsite infrastructure and creating solutions around that. The last few years have been quite different, in 2005, as a company we made a decision to jump into the cloud with both feet. We designed and created a complete server replacement platform that we call VAULT. I think the irony with this is, that while we called it VAULT, the world would soon catch up and call this cloud. Nagios XI is the monitoring solution we use for VAULT. The value it has brought to VAULT has been in the historical data that we can observe to understand the baseline performance of our environment. Additionally receiving a text message on my cell phone when the comms room temperature is increasing is somewhat handy. Although the VAULT journey has been exciting in itself, VAULT has grown and matured by taking our clients feedback and utilising our expertise to make VAULT a complete solution. It's this approach that sets us apart from the rest, some of us at the company like to think that it was good planning, some of us will admit that it was good luck when we came across the idea for VAULT, but it's how we've approached everyday after that that has defined who we are as an organisation. And it's this approach that I'm excited to contribute to, it's helped defined who I am as a technician and how I approach my work. At the beginning of this year I was awarded one of eight Nagios MVP awards for my contributions to the Nagios worldwide community for 2011 and it's one of the key reasons how I've come to be in front of you today. 2012



3 It’s a virtual appliance - ready to go Why customize?

Why Nagios XI? It’s a virtual appliance - ready to go Why customize? Improve functionality To help others / share the knowledge Why Nagios XI? My journey started ... actually I tend to use the word journey a lot because I see life as a series of journeys, now where was I? Thats right, when I played with Nagios a couple of months before Nagios XI was released, I liked it and I could see it was a very powerful monitoring solution however I knew very little about Linux and that became a barrier for me. But it got to me, a few months later Nagios was still lingering in my head, something was telling me to have another look at it. So I did what anyone of us would do, I jumped on google cause google knows everything ... and I did a search for Nagios. Google and it's infinite wisdom told me that Nagios XI had just been released. I love Nagios XI, why do i love it? Because it took away that barrier of the Linux component. I love how I can just download Nagios XI and instantly you have a fully . functional . monitoring . product . I believe this is a perfect example of what a virtual appliance should be. Out of all the things you can do with Nagios XI, why did I choose to focus on customising and creating configuration wizards? To an administrator that is new to Nagios XI it can get a bit confusing trying to learn how to configure Nagios. So lets say you have an xyz device you want to monitor, I guess that sounds like something everyone in this room would want to do. You would search the Nagios Exchange and find a plugin for xyz device and download it. Then you would have to learn how to test the plugin at the CLI. Then you would have to learn how to add a command to Nagios XI. Then you would have to learn how to add a service to Nagios XI using the command you just defined. That sounds like a lot of things for a beginner to learn with a new product. So what's the point of all of this? When I work out how to monitor xyz device in my environment, I am then able to turn around and write a Configuration Wizard for that xyz device. For you, that Configuration Wizard will automate the whole process and ONLY after a few mouse clicks you are monitoring the same xyz device in your environment. 2012



4 Configuration Wizards - Current Portfolio

Downloads Box293 Demonstration Wizard 2,300+ Dell OpenManage 46,000+ Dell UPS Monitoring Wizard 42,000+ EMC CLARiiON Monitoring Wizard Available for adoption 78,000+ Group Creation Tool Host Creation Tool 115,000+ Plugin Tool 40,000+ VMware ESX / vSphere / vCenter Monitoring Wizard 70,000+ Here is a summary of the Configuration Wizards I have created so far. The host creation tool is one that I am particularly proud of, because not only does it have a few downloads, it was the inspiration for the Bulk Host Import wizard that Nagios Enterprises developed. In 2010 the the VMware Monitoring wizard I created helped me win the Nagios Seedcamp competition. These are all available for download at the Nagios Exchange, and if you can’t find them I'm sure google will be more than happy to tell you where to go. 2012



5 Configuration Wizards - My Documentation

Existing Documentation Created By Me Tips For Customising Configuration Wizards Documentation/Tips-For-Customising-Configuration-Wizards/details NOTE: Outdated Nagios XI Service Relationship Map Documentation/Nagios-XI-Service-Relationship-Map/details Box293 Demonstration Wizard Wizards/Box293-Demonstration-Wizard/details This is the wizard I will focus on in this presentation When I first started out there was no available documentation on how to create Configuration Wizards. So after playing around a bit and creating a couple of Wizards I made some notes about how I did it and published this on the Nagios Exchange. They are now out-dated, as the official documentation is more current however the service relationship map is a very handy diagram, I'll show you this on the next slide. I do plan on updating these documents. The Box293 Demonstration Wizard is what I will focus on in this presentation. I kind of call this documentation as when you look through the code you'll find it is heavily commented, this makes it very easy for anyone to understand how it all works. 2012



6 Nagios XI Service Relationship Map

This is the Nagios XI Service Relationship Map. I can remember the day when all of this started to fall into place. The reason why I created this was so I wouldn't forget how it all fitted together but also this is a handy reference for any new administrator to Nagios XI. It shows how a plugin / command relationship works. You can see how monitoring a windows performance counter object translates against a command, service and also inside of the configuration wizard. Even if you aren't creating custom configuration wizards this map is still very helpful. I also think it would be helpful to a Nagios admin that is migrating to Nagios XI. This will get updated to reflect the new core configuration manager interface that is being released soon as part of Nagios XI 2012. 2012



7 Configuration Wizards - Official Documentation

Writing Custom Wizards For Nagios XI custom-wizards-for-nagios-xi Box293 Demonstration Wizard was derived from this documentation Nagios XI Component Development nagios-xi-component-development Since then Nagios Enterprises has released official documentation which is a must read. Also the Component Development document has handy information about querying the backend databases. 2012



8 Configuration Wizards - Customizing

Key Concepts Provide help / documentation at the start This can be in collapsible / expandable DIVs The more help you provide, the less road blocks there are Preserve existing data user has entered No-one likes re-populating multiple fields Automate the data collection process Where possible Good Example: Network Switch / Router wizard Bad Example: VMware ESX / vSphere / vCenter Monitoring Wizard (revamp planned) Lets talk about configuration wizards. Firstly I will say that a lot of what I am going to talk about might seem like programming common sense. I'm the first to admit that I'm not a real programmer, so some of the stuff I will go over are things that I have learnt through my journey. One of the key concepts I aim for with a configuration wizard is putting all of the help on the first page of the wizard. This means the end user doesn't have to go off and find a separate manual. Things like how to configure SNMP on a Windows server. Its these little extra configuration steps that remove the barriers for a new admin to Nagios XI. It's all in hidden DIVs that are expandable/collapsible; so it's not like this information "gets in the way" every time you run the wizard. I strive to provide all the steps required to make the wizard work in your environment. There are multiple stages that you are stepped through to collect information about the object that you want to monitor. It is important that you program your configuration wizard to preserve the data the end user has already entered. If a user clicks the Back button then they won't need to choose all their options again. Where possible you should automate the data collection process. The Network Switch/Router configuration wizard is a great example of this between step 2 and 3. It talks to the Switch or Router and finds out what ports are active, gets information about them and then presents this in a nice table in step 3, with check boxes to select the desired monitoring options. This just makes things easier for the end user. An example where I did not do this and should have was with my VMware Monitoring Wizard. Instead I ask the user to type some information in and there is no validation to ensure that information exists in vCenter, a big revamp is planned for this wizard. Some of my configurations wizards need to be updated to reflect the current best practices, as outlined in official documentation and clearly demonstrated in my Box293 Demonstration Wizard. 2012



9 Configuration Wizards - Stages

Step 1 This is the list of all the available wizards Now I am going to delve into how configuration wizards work and how they can be customized. From the Configure tab in Nagios XI you can run the monitoring wizard. Step 1 presents you with the list of all the available wizards on your Nagios XI host. As we go through the different Steps in the configuration wizard, you will see that these do not directly correlate with the stage numbers in the php code, I will show you this. Why? I’m not entirely sure to be honest but it’s important that you know about this to avoid confusion. 2012



10 Configuration Wizards - Stages

Step 1 The information that is presented here is taken from the $args array defined at the beginning of the configuration wizard Information also used on the Manage Config Wizards page $args=array( CONFIGWIZARD_NAME => $name, CONFIGWIZARD_TYPE => CONFIGWIZARD_TYPE_MONITORING, CONFIGWIZARD_DESCRIPTION => 'This wizard is an example of how to code ...', CONFIGWIZARD_DISPLAYTITLE => 'Box293 Demonstration Wizard', CONFIGWIZARD_FUNCTION => 'box293demo_configwizard_func', CONFIGWIZARD_PREVIEWIMAGE => 'screen2.png', CONFIGWIZARD_VERSION => ' ', CONFIGWIZARD_DATE => ' ', CONFIGWIZARD_AUTHOR => 'Troy Lea aka Box293', ); Step 1 Inside each configuration wizard php file is the $args array. The information here is used in Step 1 and also on the Manage Config Wizards page Once you click on a wizard you want to run, you are taken to Step 2. 2012



11 Configuration Wizards - Stages

Before Step 2 Fresh Wizard Run? Define variables User is returning from Step 3? Check for existing Step 2 data and re-populate Step 2 ← Step 3 User provided data on Step 2 failed error checking? Check for Step 2 data and re-populate Step 2 ← Step 2 Validation Before I can talk about Step 2 there is the following to consider. Is this the first time the wizard has been run? If so we define the variables that have default values. Or was the user on step 3 and they clicked the back button? If so we need to repopulate the data originally provided when on Step 2. Or did the user provided data on step 2 fail the required error checking? If so we need to repopulate the data provided when on Step 2, so they can correct it. For example they may have used invalid characters or left fields empty. 2012



12 Configuration Wizards - Stages

Here is step 2. Firstly you will see what I was talking about earlier where the step and stage numbers are not aligned. The Overview, Discount Offer, License and Project Hours are examples of the hidden DIVs that are expandable/collapsible. Here you can see we are asking for an IP Address or FQDN of the host we want to monitor. Also there is a select option for demonstration purposes. You will notice throughout the Box293 Configuration Wizard there is a lot of text that explains what each step is all about. 2012



13 Configuration Wizards - Stages

Step 2 CONFIGWIZARD_MODE_GETSTAGE1HTML This is the first step you can customise Completely customisable except for the Back and Next buttons Put all of your overview, help and configuration steps here This will educate the end user about how the wizard works and also informs them of the requirements / pre-requisites You'll need to get the IP Address or FQDN of the host you want to monitor along with anything else you require Step 2 This is the first step you can customise, it is completely customisable except for the Back and Next buttons. As I talked about earlier, you should put all of your overview, help and configuration steps here. I made the mistake in one of my earlier wizards by putting all this stuff at step 3 and it wasn't a logical place to put it. 2012



14 Configuration Wizards - Stages

Between Step 2 and Step 3 CONFIGWIZARD_MODE_VALIDATESTAGE1DATA Is the user returning from Step 3? If so, no data validation required on Step 2 data Reality checks on Step 2 data If supplied data is not correct the wizard will go back to Step 2 Refer to the code in the Box293 Demonstration Wizard to see how the error checking is performed Before Step 3 we have a validation stage. Firstly there should be a check performed to see if the user pressed the back button to go from Step 3 to Step 2. If they did this then there is no need for data validation on the Step 2 data as this would have already been done when they proceeded from Step 2 to Step 3. Otherwise the user is proceeding to Step 3 so there needs to be reality checks on the information provided in Step 2. For example the IP Address / FQDN field may not be populated. Some configuration wizards like the Network Switch/Router will use the address to contact the device and gather information, if it's not provided or its incorrect then the wizard is not going to work. If supplied data is not correct the wizard will go back to Step 2 informing them of the problem. 2012



15 Configuration Wizards - Stages

Here is Step 3. This is the Box293 Demonstration Wizard. You can see that the IP address from Step 2 is populated, also a DNS lookup was done and this information has been populated in the Host Name field. 2012



16 Configuration Wizards - Stages

The picture on the left is the Network Switch/Router wizard. This is an example of how the data collection process has been automated like I talked about before. The picture on the right is taken from the Dell OpenManage Monitoring Wizard. With this wizard it's just a simple list of check boxes the user can select. 2012



17 Configuration Wizards - Stages

Step 3 CONFIGWIZARD_MODE_GETSTAGE2HTML Completely customisable except for the Back and Next buttons You can use data gathered in Step 2 to query the device, manipulate the results and present them to the user Example: Network Switch/Router wizard Alternatively you may have pre-defined options Example: Dell OpenManage Wizard Step 3 This step is completely customisable except for the Back and Next buttons. This should be the section that you get the user to select what options they want to monitor. If I refer back to the last slide, these may all be populated based on what the device you queried returned or predefined. 2012



18 Configuration Wizards - Stages

User coming from Step 2? Check for Step 2 data and populate/manipulate Step 2 → Step 3 User is returning from Step 4? Check for existing Step 3 data and re-populate Step 3 ← Step 4 User provided data on Step 3 failed error checking? Check for Step 3 user data and re-populate Step 3 ← Step 3 Validation Additionally there is the following to consider. Is the user coming from on step 2? Check for Step 2 data and manipulate or populate. Or was the user on step 4 and they clicked the back button? If so we need to repopulate the data originally provided when on Step 3. Or did the user provided data on step 3 fail the required error checking? If so we need to repopulate the data provided when on Step 3, so they can correct it. For example they may have used invalid characters or left fields empty. 2012



19 Configuration Wizards - Stages

Between Step 3 and Step 4 CONFIGWIZARD_MODE_VALIDATESTAGE2DATA Is the user returning from Step 4? If so, no data validation required on Step 3 data Reality checks on Step 3 data If supplied data is not correct the wizard will go back to Step 3 Things like: Allowed characters Specific options selected but their sub-options are not defined Empty fields Refer to the code in the Box293 Demonstration Wizard to see how the error checking is performed Before Step 4 we have a validation stage. Firstly there should be a check performed to see if the user pressed the back button to go from Step 4 to Step 3. If they did this then there is no need for data validation on the Step 3 data as this would have already been done when they proceeded from Step 3 to Step 4. Otherwise the user is proceeding to Step 4 so there needs to be reality checks on the information provided in Step 3. Things like allowed characters or specific options selected but their sub options were not defined. If supplied data is not correct the wizard will go back to Step 3 informing them of the problem. 2012



20 Configuration Wizards - Stages

Step 4 You can see the standard monitoring settings on the top image. The bottom image shows how these can be hidden. 2012



21 Configuration Wizards - Stages

Between Step 3 and Step 4 CONFIGWIZARD_MODE_GETSTAGE3OPTS Optional, does not need to exist Allows you to hide the Monitoring Settings in Step 4 This was ideal for the Plugin Tool In step 4 you are asked for Monitor Settings. Sometimes you don't want to ask the user this and actually program that in yourself. Refer to the code in the Box293 Demonstration Wizard on how to do this. 2012



22 Configuration Wizards - Stages

Step 4 CONFIGWIZARD_MODE_GETSTAGE3HTML Any additional html here will appear on the "Monitoring Settings" step, "Notification Settings" step, "Host Groups/Service Groups/Parent Host" step and the "Final" step Options for how often you want to monitor the device As per the previous slide these can be hidden This step will always be titled "Monitoring Settings" Step 4 In this step you are asked how often you want to monitor the device. As per the previous slide these can be hidden. Any additional html here will appear on the "Monitoring Settings" step, "Notification Settings" step, "Host Groups/Service Groups/Parent Host" step and the "Final" step. This step will always be titled "Monitoring Settings" 2012



23 Configuration Wizards - Stages

Between Step 4 and Step 5 CONFIGWIZARD_MODE_VALIDATESTAGE3DATA Nothing you really need to put here unless you gathered more data in Step 4 If so don't forget to do reality checks on Step 4 data Before Step 5 we have a validation stage. There is nothing you need to put here unless you asked the user to provide more settings in step 4. If you did do this then there should also be reality checks on the Step 4 data as shown on previous slides. 2012



24 Configuration Wizards - Stages

Step 5 You can see the standard notification settings on the left image. The right image shows how these can be hidden. 2012



25 Configuration Wizards - Stages

Between Step 4 and Step 5 CONFIGWIZARD_MODE_GETSTAGE4OPTS Optional, does not need to exist Allows you to hide the Notification Settings in Step 5 This was ideal for the Plugin Tool In step 5 you are asked for Notification Settings. Sometimes you don't want to ask the user this and actually program that in yourself. Several components can be hidden. Refer to the code in the Box293 Demonstration Wizard on how to do this. 2012



26 Configuration Wizards - Stages

Step 5 Options for Notification Settings As per the previous slide these can be hidden You CANNOT add additional code to this screen It will always be titled "Notification Settings" Step 5 You CANNOT add additional code to this step and it will always be titled "Notification Settings" 2012



27 Configuration Wizards - Stages

Step 6 Options for Groups and Parents This Step CANNOT be modified This Step CANNOT be hidden In Step 6 you are asked about group memberships. You CANNOT modify or hide this step. 2012



28 Configuration Wizards - Stages

Final Step CONFIGWIZARD_MODE_GETFINALSTAGEHTML You can add additional code to this screen however it will always be titled "Final Settings" This is the final summary screen. You can add additional code to this screen if you want however it will always be titled "Final Settings" If you wanted you could provide a summary of what is being monitored. 2012



29 Configuration Wizards - Stages

Creating the Host and Service Objects CONFIGWIZARD_MODE_GETOBJECTS Using all the data you have gathered you "create" all the host and service objects and add them to an $objs array If you didn't do reality checks on the data then it's possible that an invalid configuration will be applied and fail Using all the data you have gathered you "create" all the host and service objects and add them to an array. I won't go into details here because I don't have the time today, however refer to the Box293 Demonstration Wizard for detailed information or talk to me here at the conference. But be careful, if you didn't do reality checks on the data then it's possible that an invalid configuration will be applied and fail. There's a simple rule to this, test, test and test again! Then do some more testing. 2012



30 Configuration Wizards - Templates

Adding a Command Definition You've supplied a plugin with your wizard Defining the command is done in a .cfg file referenced in the config.xml Other objects like Groups can also be defined Refer to official documentation about the config.xml file # 'check_dell_ups' command definition define command{ command_name check_dell_ups command_line $USER1$/check_dell_ups.pl -H $HOSTADDRESS$ -C $ARG1$ -T $ARG2$ $ARG3$ $ARG4$ $ARG5$ $ARG6$ $ARG7$ $ARG8$ } If you supply a plugin with your wizard then you'll need to also define the command. Defining the command is done in a .cfg file referenced in the config.xml file. Something that I need you to take note of here, make sure you define your commands with all of the $ARG?$ values. This allow others to manipulate the command they way they see fit. Other objects like Groups can also be defined Refer to official documentation for more information about the config.xml file, this is all covered in the Wizard File Structure Overview section. 2012



31 Components - Current Portfolio

Downloads History Tab 37,000+ This takes us to components. I understand some of you may have questions about configuration wizards and I'll be happy to answer all of these at the end. The only component I have created so far is the History tab. Although I'm not going to spend a lot of time speaking about this, it's one of those components that I can't do without, as it makes it really easy to see the comment and acknowledgement history for the host or service I am currently looking at. 2012



32 Official Documentation

Components Official Documentation Nagios XI Component Development component-development I won't delve into component development as it's quite complex and is a whole topic in itself, but like anything I'll be happy to talk to people about it offline. Here is the link for the official documentation for Nagios XI Component Development. 2012



33 Dashlets and Dashboards - Overview

Extract from the user guide: Dashboards are designed to provide individual users with customized information they find useful Dashboards are often used to display important, relevant information where it is needed most Dashboards are specific to individual Nagios XI users. Each user can create their own unique set of dashboards to customize Nagios XI to fit their needs Dashboards can be deployed to multiple users and can be kept synced with the original Dashlets are added to Dashboards Moving onto Dashlets and Dashboards Dashboards are designed to provide individual users with customized information they find useful, they do this by adding dashlets to them. Each user can create their own unique set of dashboards to customize Nagios XI to fit their needs They can be deployed to multiple users and can be kept synced with the original 2012



34 Dashboards Tab 2012 Here is the Dashboards tab.

By default when you click on the Dashboards tab the Home Page dashboard is displayed 2012



35 Dashlets - Current Portfolio

Downloads Text Dashlet 24,000+ Status Info Dashlet 4,000+ I have created two dashlets so far. The Text Dashlet simply allows you to create some HTML formatted text to be displayed on a Dashboard. I created the text dashlet as an exercise in understanding how I can create my own Dashlets. I already had the concept of the Status Info Dashlet in my head but I was a little overwhelmed with how I would actually make it work. As you can see, the Status Info Dashlet allows you to take a service and display it's current status information as a Dashlet, formatted they way you want. You can even remove part of the status information, in the example above you can see I removed "OK - " from the beginning. I love the Status Info Dashlet, it's right up there as one of my favorite projects I've created so far! I will explain the basics of how Dashlets can be created using the Text Dashlet, as this is a very simple Dashlet. 2012



36 There are four parts to creating a Dashlet

Dashlets - Modes There are four parts to creating a Dashlet DASHLET_MODE_PREVIEW DASHLET_MODE_GETCONFIGHTML DASHLET_MODE_INBOARD DASHLET_MODE_OUTBOARD There are four parts to a Dashlet, in the next slides I will explain each one. 2012



37 DASHLET_MODE_PREVIEW

Dashlets - Modes DASHLET_MODE_PREVIEW This is for when you click the Available Dashlets link DASHLET_MODE_PREVIEW When you click the Available Dashlets link, the PREVIEW mode contains all the code that explains the purpose of your dashlet along with a screenshot. 2012



38 DASHLET_MODE_GETCONFIGHTML

Dashlets - Modes DASHLET_MODE_GETCONFIGHTML When you click on the "Add This To A Dashboard" icon, DASHLET_MODE_GETCONFIGHTML is used DASHLET_MODE_GETCONFIGHTML When you click on the "Add This To A Dashboard" icon, DASHLET_MODE_GETCONFIGHTML is used 2012



39 Dashlets - Modes DASHLET_MODE_GETCONFIGHTML

Here you can specify the options you require for your dashlet There is no error checking when you click the Add It button DASHLET_MODE_GETCONFIGHTML This is what is displayed. Here you can specify the options you require for your dashlet. There is no error checking when you click the Add It button. So if you had a field that the user needed to type into, and they left it blank, then that part of the dashlet is not going to work when it is on a dashboard. This can lead to lots of errors in the log every time that dashlet is refreshed. 2012



40 Dashlets - Modes DASHLET_MODE_GETCONFIGHTML

In the Status Info Dashlet I implement my own error checking by providing a preview function Play around with the Status Info Dashlet to see how this can be achieved DASHLET_MODE_GETCONFIGHTML One way of working around this is to provide a preview function in this section. For example in my Status Info Dashlet, the user can see exactly what the Dashlet will look like when they click the preview tab. If they haven't selected a required option then a message will appear telling them this. 2012



41 Dashlets - Modes DASHLET_MODE_INBOARD

This is the section that makes the dashlet appear on any dashboard you add it to DASHLET_MODE_INBOARD This is the section that makes the dashlet appear on any dashboard you add it to. For example with the text dashlet, it gets the options the user chose such as the font size, weight, style, variant and color. It then applies these to the text that the user typed in and presents this in the dashlet. The Status Info Dashlet uses the same basic concept except it is much more complicated due to the amount of options available that allows the user to manipulate the output. 2012



42 Dashlets - Modes DASHLET_MODE_OUTBOARD

This is for some dashlets that are built into the pages of Nagios XI DASHLET_MODE_OUTBOARD This is for some dashlets that are built into the pages of XI. When you see the Service Status Summary table on the Service Details page, that's a dashlet that's in OUTBOARD mode, but if you add it to one of your dashboards, it would then be using the INBOARD mode. 2012



43 Don't miss out as stocks are limited*

Discount Offer But wait, there's more ... Get a 10% discount on your Nagios XI Unlimited Nodes license when purchased through this link: Don't miss out as stocks are limited* *Stocks are not limited This about wraps up my presentation, thank you all for coming. If you are interested in buying Nagios XI then you can get a 10% discount off the price by purchasing it through this link. 2012



44 Questions Questions ? Does anyone have any questions? 2012

