$( document).ready( function() { var parts = $(location).attr( 'href').split( '/'); parts.pop() var baseurl = parts.join( '/'); $('#query button').attr('disabled','disabled'); var disableWhenDependsOnValueBlank = false; var help = Object(); var true_false = { "valid_values": [ "True", "False", ] }; function buildSelect( label, name, option) { var optlist = Array(); optlist.push( $( '') .attr({ value: option.valid_values[ x] }) .text( option.valid_values[ x]) ); } } else if( option.valid_values instanceof Object) { for( var key in option.valid_values) { var valid_value = option.valid_values[ key]; optlist.push( $( '') .attr({ value: key, title: valid_value.description }) .text( key) ); } } var html = $( '') .addClass( 'generated') .attr( 'id', name + 'row').append( $( '') .addClass( 'label') .text( label), $( '').append( $( '') .attr({ id: name, name: name }) .append( $( optlist).map( function() { return this.toArray() }) ) ) ); return html; } function buildCheckbox( label, name, option) { var inputs = Array(); if( option.valid_values instanceof Array) { for( var x = 0; x < option.valid_values.length; x++) { inputs.push( $('') .attr({ type: 'checkbox', name: name, value: option.valid_values[ x] }) ); inputs.push( $( '').text( option.valid_values[ x])); inputs.push( $( '
')); } } else if( option.valid_values instanceof Object) { for( var key in option.valid_values) { var valid_value = option.valid_values[ key]; inputs.push( $('') .attr({ type: 'checkbox', name: name, value: key, title: valid_value.description }) ); inputs.push( $( '').text( key)); inputs.push( $( '
')); } } var html = $('') .addClass('generated') .attr('id', name + 'row') .append( $('').addClass( 'label').text( label), $('').append( $( inputs).map( function() { return this.toArray() }) ) ); return html; } function buildRadioButtons( label, name, option) { var inputs = Array(); if( option.valid_values instanceof Array) { for( var x = 0; x < option.valid_values.length; x++) { inputs.push( $('') .attr({ type: 'radio', name: name, value: option.valid_values[ x] }) ); inputs.push( $( '').text( option.valid_values[ x])); inputs.push( $( '
')); } } else if( option.valid_values instanceof Object) { for( var key in option.valid_values) { inputs.push( $('') .attr({ type: 'radio', name: name, value: key }) ); inputs.push( $( '').text( key)); inputs.push( $( '
')); } } var html = $('') .addClass('generated') .attr('id', name + 'row') .append( $('').addClass( 'label').text( label), $('').append( $( inputs).map( function() { return this.toArray() }) ) ); return html; } function buildTextField( label, name, option) { var html = $('') .addClass('generated') .attr('id', name + 'row') .append( $('').addClass('label').text( label), $('').append( $('').attr({ type: "text", name: name, title: option.description }) ) ); return html; } function isRequired( option, query) { var required = false; if( option.hasOwnProperty( 'required') && ( option.required.length > 0)) { if( option.required[ 0] == "all") { required = true; } else { for( var x = 0; x < option.required.length; x++) { if( option.required[ x] == query) { required = true; } } } } return required; } function isOptional( option, query) { var optional = false; if( option.hasOwnProperty( 'optional') && ( option.optional.length > 0)) { if( option.optional[ 0] == "all") { optional = true; } else { for( var x = 0; x < option.optional.length; x++) { if( option.optional[ x] == query) { optional = true; } } } } return optional; } function getNagiosObject( key, option) { var queryspec = option.type.substr( "nagios:".length); var slash = queryspec.search( "/"); var cgi = queryspec.substr( 0, slash); var query = queryspec.substr( slash+1); var success = function(data, results) { var nagobjs = {}; nagobjs[ 'valid_values'] = new Object(); for( var vvkey in option.valid_values) { nagobjs.valid_values[ vvkey] = option.valid_values[ vvkey]; } if( query == "servicelist") { // Special case because services are nested under hosts var services = new Array(); for( var hostname in data.data[ query]) { var host = data.data[ query][ hostname]; for( var x = 0; x < host.length; x++) { if( services.indexOf( host[ x]) == -1) { services.push( host[ x]); } } } services.sort(); for( var x = 0; x < services.length; x++) { nagobjs.valid_values[ services[ x]] = {}; } } else { for( var x = 0; x < data.data[ query].length; x++) { nagobjs.valid_values[ data.data[ query][ x]] = new Object(); nagobjs.valid_values[ data.data[ query][ x]][ 'description'] = data.data[ query][ x]; } } var selector = '#cgiform #' + key + 'row'; $(selector).replaceWith( buildSelect( option.label, key, nagobjs) ); }; var parameters = Object(); parameters.query = query; if( option.depends_on != "") { var dependsOnValue = getValue( option.depends_on, help.data.options[ option.depends_on]); if( dependsOnValue != "") { parameters[ option.depends_on] = dependsOnValue; } } $.ajax({ url: baseurl + '/cgi-bin/' + cgi + '.cgi', data: parameters, success: success, async: false }); } function updateOption(query, key, option) { var required = isRequired( option, query); var optional = isOptional( option, query); var row = '#' + key + 'row'; // row selector // If either optional or required, show the parameter if( required || optional) { // If the parameter is Nagios object, fetch it if( /^nagios:/.test( option.type)) { if( option.depends_on == "") { getNagiosObject( key, option); } else { var dependsOnValue = getValue( option.depends_on, help.data.options[ option.depends_on]); if(( dependsOnValue == "") && disableWhenDependsOnValueBlank) { $(row + ' select').attr( "disabled", "disabled"); } else { getNagiosObject( key, option); $(row + ' select').removeAttr( "disabled"); } $('select#' + option.depends_on).change(function() { var query = getValue( 'query', help.data.options.query); for( var key in help.data.options) { var option = help.data.options[ key]; if( option.depends_on === $(this).attr( "id")) { updateOption(query, key, option); } } }); } } $( row).show(); } else { $( row).hide(); } // If required, highlight the label if( required) { $( row + ' td.label').addClass( 'required'); } else { $( row + ' td.label').removeClass( 'required'); } } function updateForm(query) { $('#query button').attr('disabled','disabled'); for( var key in help.data.options ) { updateOption(query, key, help.data.options[ key]); } } function getValue( name, option) { switch( option.type) { case "enumeration": return $( '#' + name + 'row select option:selected').val(); break; case "list": output = Array(); if( option.valid_values instanceof Array) { for( var x = 0; x < option.valid_values.length; x++) { if( $( '#' + name + 'row input[value=' + valid_values[ x] + ']').attr( 'checked') == 'checked') { output.push( valid_values[ x]); } } } else if( option.valid_values instanceof Object) { for( var key in option.valid_values) { if( $( '#' + name + 'row input[value=' + key + ']').attr( 'checked') == 'checked') { output.push( key); }; } } return output; break; case "integer": case "string": return $( '#' + name + 'row input').val(); break; case "boolean": if( $( '#' + name + 'row input:radio[name=' + name + ']:checked').val() == "True") { return true; } else { return false; } break; default: if( /^nagios:/.test( option.type)) { return $( '#' + name + 'row select option:selected').val(); } break; } } function buildForm() { $('#cgiform tr.generated').remove(); $('#cgiform').append( buildSelect( 'Query', 'query', help.data.options.query)); $('#queryrow td.label').addClass( 'required'); for( var key in help.data.options ) { if( key != "query") { var option = help.data.options[ key] switch( option.type) { case "enumeration": $('#cgiform').append( buildSelect( option.label, key, option)); break; case "list": $('#cgiform').append( buildCheckbox( option.label, key, option)); break; case "integer": case "string": $('#cgiform').append( buildTextField( option.label, key, option)); break; case "boolean": $('#cgiform').append( buildRadioButtons( option.label, key, true_false)); break; default: if( /^nagios:/.test( option.type)) { var nagobjs = { "valid_values": [ ] }; $('#cgiform').append( buildSelect( option.label, key, nagobjs)); } else { $('#cgiform').append( '' + option.type + ': ' + key + ''); } break; } if( !(( option.hasOwnProperty( 'required') && ( option.required.length > 0) && ( option.required[ 0] === "all")) || ( option.hasOwnProperty( 'optional') && ( option.optional.length > 0) && ( option.optional[ 0] === "all")))) { $('#' + key + 'row').hide(); } } } $('select#query').change(function() { var query = $('select#query').val(); updateForm(query); $('#query button').removeAttr('disabled'); }); $('#query button').removeAttr('disabled'); } $('select#cginame').change(function() { var cginame = $('select#cginame').val(); if( cginame == 'none') { $('#cgiform tr.generated').remove(); $('#query button').attr('disabled','disabled'); } else { $.get( baseurl + '/cgi-bin/' + cginame, { query: "help" }, function(data, results) { help = data; buildForm(data); }); } }); function indentf(padding, text) { var result = ""; for( var padvar = 0; padvar < padding; padvar++) { result = result.concat( "    "); } result = result.concat( text); return result; } function arrayToString( padding, arr) { var result = ""; var members = Array(); result = result.concat( "[
"); padding++; for( var x = 0; x < arr.length; x++) { members.push( memberToString( padding, null, arr[ x])); } result = result.concat( members.join( ",
") + "
"); padding--; result = result.concat( indentf(padding, "]")); return result; } function isString(o) { return typeof o == "string" || (typeof o == "object" && o.constructor === String); } function memberToString( padding, key, value) { var result = ""; if( key == null) { result = result.concat( indentf( padding, '')); } else { result = result.concat( indentf( padding, '"' + key + '": ')); } if( value instanceof Array) { result = result.concat( arrayToString( padding, value)); } else if( value instanceof Object) { result = result.concat( objectToString( padding, value)); } else if(isString(value)) { result = result.concat( '"' + value + '"') } else { result = result.concat( value); } return result; } function objectToString( padding, obj) { var result = ""; var members = Array(); result = result.concat( "{
"); padding++; for( var key in obj) { members.push( memberToString( padding, key, obj[ key])); } result = result.concat( members.join( ",
") + "
"); padding--; result = result.concat( indentf(padding, "}")); return result; } $('#query').submit( function() { $('#results').html( ""); var cginame = $('select#cginame').val(); if( cginame != 'none') { var query = $('select#query').val(); var parameters = Object(); for( var key in help.data.options) { var option = help.data.options[ key]; var required = isRequired( option, query); var optional = isOptional( option, query); if( required || optional) { var value = getValue( key, option); if(( value == null) || ( value == "")) { if( required) { $('#results').append( $( '

'). addClass( 'error'). append( option.label + " missing") ); } } else { if( value instanceof Array) { parameters[ key] = value.join( ' '); } else { parameters[ key] = value; } } } } var p = jQuery.param( parameters); var url = baseurl + '/cgi-bin/' + cginame + '?' + p $('#results').append( $('

').text( 'URL: ').append( $('').attr({ href: url, target: "_blank" }).text( url) ) ); $.get( baseurl + '/cgi-bin/' + cginame, parameters, function(data, results) { $('#results').append( $('

').html( objectToString( 0, data)) ); } ); } return false; }); $('select#cginame').val( 'none'); });