/* Authors: * Pavel Zuna * Endi S. Dewata * * Copyright (C) 2010 Red Hat * see file 'COPYING' for use and warranty information * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ define(['./ipa', './jquery', './phases', './reg', './text', './details', './search', './association', './entity', './certificate'], function(IPA, $, phases, reg, text) { var exp = IPA.host = {}; var make_spec = function() { return { name: 'host', policies: [ IPA.search_facet_update_policy, IPA.details_facet_update_policy, { $factory: IPA.cert.cert_update_policy, source_facet: 'details', dest_entity: 'cert', dest_facet: 'details' }, { $factory: IPA.cert.cert_update_policy, source_facet: 'details', dest_entity: 'cert', dest_facet: 'search' } ], facets: [ { $type: 'search', columns: [ 'fqdn', 'description', { name: 'has_keytab', label: '@i18n:objects.host.enrolled', formatter: 'boolean' } ], actions: [ 'select', { $type: 'automember_rebuild', name: 'automember_rebuild', label: '@i18n:actions.automember_rebuild' } ], header_actions: ['select_action', 'automember_rebuild'] }, { $type: 'details', $factory: IPA.host.details_facet, sections: [ { name: 'details', fields: [ { $type: 'host_dnsrecord_entity_link', name: 'fqdn', other_entity: 'dnsrecord' }, 'krbprincipalname', { $type: 'textarea', name: 'description' }, 'userclass', 'l', 'nshostlocation', 'nshardwareplatform', 'nsosversion', { $type: 'sshkeys', name: 'ipasshpubkey', label: '@i18n:objects.sshkeystore.keys' }, { $type: 'multivalued', name: 'macaddress', flags: ['w_if_no_aci'] }, { name: 'ipakrbokasdelegate', $type: 'checkbox', acl_param: 'krbticketflags', flags: ['w_if_no_aci'] } ] }, { name: 'enrollment', action_panel: { $factory: IPA.action_panel, name: 'enrollment_actions', actions: ['unprovision', 'set_otp', 'reset_otp'] }, fields: [ { $factory: IPA.host_keytab_widget, name: 'has_keytab', label: '@i18n:objects.host.keytab' }, { $type: 'host_password', name: 'has_password', label: '@i18n:objects.host.password' } ] }, { name: 'certificate', action_panel: { $factory: IPA.action_panel, name: 'cert_actions', actions: [ 'request_cert', 'view_cert', 'get_cert', 'revoke_cert', 'restore_cert' ] }, fields: [ { $type: 'certificate_status', name: 'certificate_status', label: '@i18n:objects.host.status' } ] } ], actions: [ 'select', { $type: 'automember_rebuild', name: 'automember_rebuild', label: '@i18n:actions.automember_rebuild' }, 'host_unprovision', { $type: 'password', name: 'set_otp', label: '@i18n:objects.host.password_set_title', dialog: { title: '@i18n:objects.host.password_set_title', confirm_button_label: '@i18n:objects.host.password_set_button', password_name: 'userpassword', success_message: '@i18n:objects.host.password_set_success' }, enable_cond: ['userpassword_w'], hide_cond: ['has_password'] }, { $type: 'password', name: 'reset_otp', label: '@i18n:objects.host.password_reset_title', dialog: { title: '@i18n:objects.host.password_reset_title', confirm_button_label: '@i18n:objects.host.password_reset_button', password_name: 'userpassword', success_message: '@i18n:objects.host.password_set_success' }, enable_cond: ['userpassword_w'], show_cond: ['has_password'] }, 'cert_view', 'cert_get', 'cert_request', 'cert_revoke', 'cert_restore' ], header_actions: ['select_action', 'automember_rebuild'], state: { evaluators: [ IPA.host.has_password_evaluator, IPA.host.has_keytab_evaluator, IPA.host.userpassword_acl_evaluator, IPA.host.krbprincipalkey_acl_evaluator, IPA.cert.certificate_evaluator ] }, policies: [ IPA.host.enrollment_policy, IPA.host.certificate_policy ] }, { $type: 'association', name: 'managedby_host', add_method: 'add_managedby', remove_method: 'remove_managedby' }, { $type: 'association', name: 'memberof_hostgroup', associator: IPA.serial_associator }, { $type: 'association', name: 'memberof_netgroup', associator: IPA.serial_associator }, { $type: 'association', name: 'memberof_role', associator: IPA.serial_associator }, { $type: 'association', name: 'memberof_hbacrule', associator: IPA.serial_associator, add_method: 'add_host', remove_method: 'remove_host' }, { $type: 'association', name: 'memberof_sudorule', associator: IPA.serial_associator, add_method: 'add_host', remove_method: 'remove_host' } ], standard_association_facets: true, adder_dialog: { $factory: IPA.host_adder_dialog, height: 300, sections: [ { $factory: IPA.composite_widget, name: 'fqdn', fields: [ { $type: 'host_fqdn', name: 'fqdn', required: true } ] }, { name: 'other', fields: [ 'userclass', { name: 'ip_address', validators: [ 'ip_address' ], metadata: '@mc-opt:host_add:ip_address' }, { $type: 'force_host_add_checkbox', name: 'force', metadata: '@mc-opt:host_add:force' } ] } ] }, deleter_dialog: { $factory: IPA.host_deleter_dialog } };}; IPA.host.details_facet = function(spec, no_init) { var that = IPA.details_facet(spec, true); that.certificate_loaded = IPA.observer(); that.certificate_updated = IPA.observer(); that.get_refresh_command_name = function() { return that.entity.name+'_show_'+that.get_pkey(); }; if (!no_init) that.init_details_facet(); return that; }; IPA.host_fqdn_widget = function(spec) { spec = spec || {}; spec.widgets = [ { $type: 'text', name: 'hostname', label: '@i18n:objects.service.host', required: true }, { $type: 'dnszone_select', name: 'dnszone', label: '@mo:dnszone.label_singular', editable: true, empty_option: false, required: true, searchable: true } ]; var that = IPA.composite_widget(spec); that.create = function(container) { that.container = container; var hostname = that.widgets.get_widget('hostname'); var dnszone = that.widgets.get_widget('dnszone'); var layout = IPA.fluid_layout({ cont_cls: 'row-fluid', group_cls: 'control-group span6', widget_cls: 'control', label_cls: 'control-label' }); var html = layout.create([hostname, dnszone]); that.container.append(html); var hostname_input = $('input', hostname.container); var dnszone_input = $('input', dnszone.container); hostname_input.keyup(function(e) { var value = hostname_input.val(); var i = value.indexOf('.'); if (i >= 0) { var hostname = value.substr(0, i); var dnszone = value.substr(i+1); hostname_input.val(hostname); if (dnszone) { dnszone_input.val(dnszone); dnszone_input.focus(); } IPA.select_range(dnszone_input, 0, dnszone_input.val().length); } }); }; return that; }; IPA.host_fqdn_field = function(spec) { spec = spec || {}; var that = IPA.field(spec); that.has_value = function(widget) { var value = widget.save(); var has_value = !!value.length && value[0] !== ''; return has_value; }; that.validate_required = function() { var valid = true; if (!that.has_value(that.hostname_widget)) { that.hostname_widget.show_error(text.get('@i18n:widget.validation.required')); that.valid = valid = false; } if (!that.has_value(that.dns_zone_widget)) { that.dns_zone_widget.show_error(text.get('@i18n:widget.validation.required')); that.valid = valid = false; } return valid; }; that.hide_error = function() { if (that.has_value(that.hostname_widget)) { that.hostname_widget.hide_error(); } if (that.has_value(that.dns_zone_widget)) { that.dns_zone_widget.hide_error(); } }; that.save = function(record) { if(!record) record = {}; var hostname = that.hostname_widget.save()[0]; var dnszone = that.dns_zone_widget.save()[0]; record.fqdn = hostname && dnszone ? [ hostname+'.'+dnszone ] : []; return record.fqdn; }; that.reset = function() { that.hostname_widget.update([]); that.dns_zone_widget.update([]); }; that.widgets_created = function() { that.widget = that.container.widgets.get_widget(that.widget_name); that.hostname_widget = that.widget.widgets.get_widget('hostname'); that.dns_zone_widget = that.widget.widgets.get_widget('dnszone'); that.hostname_widget.value_changed.attach(that.child_value_changed); that.dns_zone_widget.value_changed.attach(that.child_value_changed); }; that.child_value_changed = function() { that.validate(); }; return that; }; IPA.host_adder_dialog = function(spec) { spec = spec || {}; spec.retry = spec.retry !== undefined ? spec.retry : false; if (!IPA.dns_enabled) { //When server is installed without DNS support, a use of host_fqdn_widget //is bad because there are no DNS zones. IP address field is useless as //well. Special section and IP address field should be removed and normal //fqdn textbox has to be added. spec.sections.shift(); spec.sections[0].fields.shift(); spec.sections[0].fields.unshift('fqdn'); delete spec.height; } var that = IPA.entity_adder_dialog(spec); that.create_content = function() { that.entity_adder_dialog_create_content(); that.container.addClass('host-adder-dialog'); }; that.on_error = IPA.create_4304_error_handler(that); return that; }; IPA.host_deleter_dialog = function(spec) { spec = spec || {}; var that = IPA.search_deleter_dialog(spec); that.create_content = function() { that.deleter_dialog_create_content(); var metadata = IPA.get_command_option('host_del', 'updatedns'); var updatedns = IPA.standalone_option({ type: 'checkbox', name: 'updatedns', title: metadata.doc }, that.container, metadata.doc); that.updatedns = updatedns[0]; }; that.create_command = function() { var batch = that.search_deleter_dialog_create_command(); var updatedns = that.updatedns.is(':checked'); for (var i=0; i', { name: 'missing', style: 'display: none;' }).appendTo(container); $('', { 'class': 'fa fa-warning' }).appendTo(that.missing_el); that.missing_el.append(' '); that.missing_el.append(text.get('@i18n:objects.host.keytab_missing')); that.present_el = $('