foreman_discovery 1.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +619 -0
- data/README.md +128 -0
- data/Rakefile +111 -0
- data/app/controllers/discovers_controller.rb +151 -0
- data/app/helpers/discovers_helper.rb +37 -0
- data/app/models/host/discovered.rb +97 -0
- data/app/models/host/managed_extensions.rb +32 -0
- data/app/models/setting/discovered.rb +28 -0
- data/app/overrides/add_build_flag.rb +4 -0
- data/app/views/discovers/_discovers_list.html.erb +54 -0
- data/app/views/discovers/_selected_hosts.html.erb +29 -0
- data/app/views/discovers/index.html.erb +2 -0
- data/app/views/discovers/multiple_destroy.html.erb +5 -0
- data/app/views/discovers/select_multiple_location.html.erb +10 -0
- data/app/views/discovers/select_multiple_organization.html.erb +10 -0
- data/app/views/discovers/show.html.erb +16 -0
- data/config/environment.rb +0 -0
- data/config/initializers/discovery_setup.rb +20 -0
- data/config/routes.rb +26 -0
- data/lib/discovery_home_helper_patch.rb +21 -0
- data/lib/foreman_discovery.rb +4 -0
- data/lib/foreman_discovery/engine.rb +32 -0
- data/lib/foreman_discovery/facts.rb +12 -0
- data/lib/foreman_discovery/version.rb +3 -0
- data/lib/tasks.rake +72 -0
- data/test/foreman_app/CHANGELOG +3969 -0
- data/test/foreman_app/Contributors +94 -0
- data/test/foreman_app/Gemfile +33 -0
- data/test/foreman_app/README.md +17 -0
- data/test/foreman_app/Rakefile +7 -0
- data/test/foreman_app/VERSION +1 -0
- data/test/foreman_app/app/assets/images/Archlinux.png +0 -0
- data/test/foreman_app/app/assets/images/Centos.png +0 -0
- data/test/foreman_app/app/assets/images/Darwin.png +0 -0
- data/test/foreman_app/app/assets/images/Debian.png +0 -0
- data/test/foreman_app/app/assets/images/Fedora.png +0 -0
- data/test/foreman_app/app/assets/images/Redhat.png +0 -0
- data/test/foreman_app/app/assets/images/SLC.png +0 -0
- data/test/foreman_app/app/assets/images/Scientific.png +0 -0
- data/test/foreman_app/app/assets/images/Solaris.png +0 -0
- data/test/foreman_app/app/assets/images/Suse.png +0 -0
- data/test/foreman_app/app/assets/images/Ubuntu.png +0 -0
- data/test/foreman_app/app/assets/images/Windows.png +0 -0
- data/test/foreman_app/app/assets/images/bullet_toggle_plus.png +0 -0
- data/test/foreman_app/app/assets/images/edit-hover.png +0 -0
- data/test/foreman_app/app/assets/images/edit.png +0 -0
- data/test/foreman_app/app/assets/images/false.png +0 -0
- data/test/foreman_app/app/assets/images/foreman.png +0 -0
- data/test/foreman_app/app/assets/images/foreman_background.png +0 -0
- data/test/foreman_app/app/assets/images/foreman_large.png +0 -0
- data/test/foreman_app/app/assets/images/foreman_white.png +0 -0
- data/test/foreman_app/app/assets/images/pie_chart_icon.png +0 -0
- data/test/foreman_app/app/assets/images/pie_overlay.png +0 -0
- data/test/foreman_app/app/assets/images/spinner.gif +0 -0
- data/test/foreman_app/app/assets/images/switch.png +0 -0
- data/test/foreman_app/app/assets/images/toggle_check.png +0 -0
- data/test/foreman_app/app/assets/images/true.png +0 -0
- data/test/foreman_app/app/assets/images/user.jpg +0 -0
- data/test/foreman_app/app/assets/javascripts/application.js +348 -0
- data/test/foreman_app/app/assets/javascripts/charts.js +317 -0
- data/test/foreman_app/app/assets/javascripts/compute_resource.js +120 -0
- data/test/foreman_app/app/assets/javascripts/config_template.js +153 -0
- data/test/foreman_app/app/assets/javascripts/host_checkbox.js +151 -0
- data/test/foreman_app/app/assets/javascripts/host_edit.js +591 -0
- data/test/foreman_app/app/assets/javascripts/lookup_keys.js +184 -0
- data/test/foreman_app/app/assets/javascripts/nfs_visibility.js +33 -0
- data/test/foreman_app/app/assets/javascripts/noVNC.js +47 -0
- data/test/foreman_app/app/assets/javascripts/reports.js +27 -0
- data/test/foreman_app/app/assets/javascripts/spice.js +53 -0
- data/test/foreman_app/app/assets/javascripts/taxonomy.js +18 -0
- data/test/foreman_app/app/assets/javascripts/topbar.js +39 -0
- data/test/foreman_app/app/assets/javascripts/trends.js +10 -0
- data/test/foreman_app/app/assets/stylesheets/application.scss +350 -0
- data/test/foreman_app/app/assets/stylesheets/bootstrap_and_overrides.scss +130 -0
- data/test/foreman_app/app/assets/stylesheets/charts.scss +138 -0
- data/test/foreman_app/app/assets/stylesheets/dashboard.scss +42 -0
- data/test/foreman_app/app/assets/stylesheets/login.scss +77 -0
- data/test/foreman_app/app/assets/stylesheets/topbar.scss +83 -0
- data/test/foreman_app/app/assets/stylesheets/wizard.scss +60 -0
- data/test/foreman_app/app/controllers/api/base_controller.rb +162 -0
- data/test/foreman_app/app/controllers/api/v1/architectures_controller.rb +53 -0
- data/test/foreman_app/app/controllers/api/v1/audits_controller.rb +26 -0
- data/test/foreman_app/app/controllers/api/v1/auth_source_ldaps_controller.rb +72 -0
- data/test/foreman_app/app/controllers/api/v1/base_controller.rb +12 -0
- data/test/foreman_app/app/controllers/api/v1/bookmarks_controller.rb +59 -0
- data/test/foreman_app/app/controllers/api/v1/common_parameters_controller.rb +53 -0
- data/test/foreman_app/app/controllers/api/v1/compute_resources_controller.rb +71 -0
- data/test/foreman_app/app/controllers/api/v1/config_templates_controller.rb +102 -0
- data/test/foreman_app/app/controllers/api/v1/dashboard_controller.rb +20 -0
- data/test/foreman_app/app/controllers/api/v1/domains_controller.rb +74 -0
- data/test/foreman_app/app/controllers/api/v1/environments_controller.rb +50 -0
- data/test/foreman_app/app/controllers/api/v1/fact_values_controller.rb +23 -0
- data/test/foreman_app/app/controllers/api/v1/home_controller.rb +25 -0
- data/test/foreman_app/app/controllers/api/v1/hostgroups_controller.rb +70 -0
- data/test/foreman_app/app/controllers/api/v1/hosts_controller.rb +113 -0
- data/test/foreman_app/app/controllers/api/v1/images_controller.rb +73 -0
- data/test/foreman_app/app/controllers/api/v1/lookup_keys_controller.rb +63 -0
- data/test/foreman_app/app/controllers/api/v1/media_controller.rb +75 -0
- data/test/foreman_app/app/controllers/api/v1/models_controller.rb +56 -0
- data/test/foreman_app/app/controllers/api/v1/operatingsystems_controller.rb +79 -0
- data/test/foreman_app/app/controllers/api/v1/ptables_controller.rb +55 -0
- data/test/foreman_app/app/controllers/api/v1/puppetclasses_controller.rb +56 -0
- data/test/foreman_app/app/controllers/api/v1/reports_controller.rb +43 -0
- data/test/foreman_app/app/controllers/api/v1/roles_controller.rb +49 -0
- data/test/foreman_app/app/controllers/api/v1/settings_controller.rb +35 -0
- data/test/foreman_app/app/controllers/api/v1/smart_proxies_controller.rb +69 -0
- data/test/foreman_app/app/controllers/api/v1/subnets_controller.rb +77 -0
- data/test/foreman_app/app/controllers/api/v1/template_kinds_controller.rb +14 -0
- data/test/foreman_app/app/controllers/api/v1/usergroups_controller.rb +51 -0
- data/test/foreman_app/app/controllers/api/v1/users_controller.rb +102 -0
- data/test/foreman_app/app/controllers/api/v2/base_controller.rb +12 -0
- data/test/foreman_app/app/controllers/api/v2/compute_resources_controller.rb +20 -0
- data/test/foreman_app/app/controllers/api/v2/config_templates_controller.rb +26 -0
- data/test/foreman_app/app/controllers/api/v2/domains_controller.rb +20 -0
- data/test/foreman_app/app/controllers/api/v2/environments_controller.rb +20 -0
- data/test/foreman_app/app/controllers/api/v2/host_classes_controller.rb +49 -0
- data/test/foreman_app/app/controllers/api/v2/hostgroup_classes_controller.rb +44 -0
- data/test/foreman_app/app/controllers/api/v2/hostgroups_controller.rb +20 -0
- data/test/foreman_app/app/controllers/api/v2/locations_controller.rb +9 -0
- data/test/foreman_app/app/controllers/api/v2/media_controller.rb +20 -0
- data/test/foreman_app/app/controllers/api/v2/organizations_controller.rb +9 -0
- data/test/foreman_app/app/controllers/api/v2/parameters_controller.rb +131 -0
- data/test/foreman_app/app/controllers/api/v2/puppetclasses_controller.rb +60 -0
- data/test/foreman_app/app/controllers/api/v2/smart_proxies_controller.rb +20 -0
- data/test/foreman_app/app/controllers/api/v2/subnets_controller.rb +20 -0
- data/test/foreman_app/app/controllers/api/v2/template_combinations_controller.rb +46 -0
- data/test/foreman_app/app/controllers/api/v2/users_controller.rb +20 -0
- data/test/foreman_app/app/controllers/application_controller.rb +349 -0
- data/test/foreman_app/app/controllers/architectures_controller.rb +51 -0
- data/test/foreman_app/app/controllers/audits_controller.rb +19 -0
- data/test/foreman_app/app/controllers/auth_source_ldaps_controller.rb +49 -0
- data/test/foreman_app/app/controllers/bookmarks_controller.rb +55 -0
- data/test/foreman_app/app/controllers/common_parameters_controller.rb +46 -0
- data/test/foreman_app/app/controllers/compute_resources_controller.rb +103 -0
- data/test/foreman_app/app/controllers/compute_resources_vms_controller.rb +78 -0
- data/test/foreman_app/app/controllers/concerns/api/taxonomy_scope.rb +15 -0
- data/test/foreman_app/app/controllers/concerns/api/v2/taxonomies_controller.rb +99 -0
- data/test/foreman_app/app/controllers/config_templates_controller.rb +105 -0
- data/test/foreman_app/app/controllers/dashboard_controller.rb +21 -0
- data/test/foreman_app/app/controllers/domains_controller.rb +55 -0
- data/test/foreman_app/app/controllers/environments_controller.rb +59 -0
- data/test/foreman_app/app/controllers/fact_values_controller.rb +60 -0
- data/test/foreman_app/app/controllers/facts_controller.rb +25 -0
- data/test/foreman_app/app/controllers/home_controller.rb +37 -0
- data/test/foreman_app/app/controllers/hostgroups_controller.rb +115 -0
- data/test/foreman_app/app/controllers/hosts_controller.rb +570 -0
- data/test/foreman_app/app/controllers/images_controller.rb +57 -0
- data/test/foreman_app/app/controllers/locations_controller.rb +4 -0
- data/test/foreman_app/app/controllers/lookup_keys_controller.rb +60 -0
- data/test/foreman_app/app/controllers/lookup_values_controller.rb +58 -0
- data/test/foreman_app/app/controllers/media_controller.rb +56 -0
- data/test/foreman_app/app/controllers/models_controller.rb +49 -0
- data/test/foreman_app/app/controllers/notices_controller.rb +9 -0
- data/test/foreman_app/app/controllers/operatingsystems_controller.rb +77 -0
- data/test/foreman_app/app/controllers/organizations_controller.rb +4 -0
- data/test/foreman_app/app/controllers/ptables_controller.rb +56 -0
- data/test/foreman_app/app/controllers/puppetclasses_controller.rb +85 -0
- data/test/foreman_app/app/controllers/reports_controller.rb +60 -0
- data/test/foreman_app/app/controllers/roles_controller.rb +78 -0
- data/test/foreman_app/app/controllers/settings_controller.rb +21 -0
- data/test/foreman_app/app/controllers/smart_proxies/autosign_controller.rb +47 -0
- data/test/foreman_app/app/controllers/smart_proxies/puppetca_controller.rb +59 -0
- data/test/foreman_app/app/controllers/smart_proxies_controller.rb +43 -0
- data/test/foreman_app/app/controllers/statistics_controller.rb +27 -0
- data/test/foreman_app/app/controllers/subnets_controller.rb +88 -0
- data/test/foreman_app/app/controllers/tasks_controller.rb +16 -0
- data/test/foreman_app/app/controllers/topbar_sweeper.rb +24 -0
- data/test/foreman_app/app/controllers/trends_controller.rb +56 -0
- data/test/foreman_app/app/controllers/unattended_controller.rb +257 -0
- data/test/foreman_app/app/controllers/usergroups_controller.rb +44 -0
- data/test/foreman_app/app/controllers/users_controller.rb +150 -0
- data/test/foreman_app/app/helpers/application_helper.rb +317 -0
- data/test/foreman_app/app/helpers/architecture_helper.rb +2 -0
- data/test/foreman_app/app/helpers/architectures_helper.rb +2 -0
- data/test/foreman_app/app/helpers/audits_helper.rb +138 -0
- data/test/foreman_app/app/helpers/auth_source_ldaps_helper.rb +8 -0
- data/test/foreman_app/app/helpers/auth_sources_helper.rb +2 -0
- data/test/foreman_app/app/helpers/bookmarks_helper.rb +2 -0
- data/test/foreman_app/app/helpers/common_parameters_helper.rb +22 -0
- data/test/foreman_app/app/helpers/compute_resources_helper.rb +28 -0
- data/test/foreman_app/app/helpers/compute_resources_vms_helper.rb +45 -0
- data/test/foreman_app/app/helpers/config_templates_helper.rb +10 -0
- data/test/foreman_app/app/helpers/dashboard_helper.rb +35 -0
- data/test/foreman_app/app/helpers/domains_helper.rb +3 -0
- data/test/foreman_app/app/helpers/environments_helper.rb +3 -0
- data/test/foreman_app/app/helpers/fact_values_helper.rb +8 -0
- data/test/foreman_app/app/helpers/home_helper.rb +116 -0
- data/test/foreman_app/app/helpers/hostgroups_helper.rb +14 -0
- data/test/foreman_app/app/helpers/hosts_and_hostgroups_helper.rb +99 -0
- data/test/foreman_app/app/helpers/hosts_helper.rb +267 -0
- data/test/foreman_app/app/helpers/images_helper.rb +11 -0
- data/test/foreman_app/app/helpers/layout_helper.rb +214 -0
- data/test/foreman_app/app/helpers/lookup_keys_helper.rb +108 -0
- data/test/foreman_app/app/helpers/media_helper.rb +2 -0
- data/test/foreman_app/app/helpers/medium_helper.rb +2 -0
- data/test/foreman_app/app/helpers/model_helper.rb +2 -0
- data/test/foreman_app/app/helpers/models_helper.rb +2 -0
- data/test/foreman_app/app/helpers/notices_helper.rb +3 -0
- data/test/foreman_app/app/helpers/operatingsystems_helper.rb +40 -0
- data/test/foreman_app/app/helpers/organization_helper.rb +2 -0
- data/test/foreman_app/app/helpers/ptables_helper.rb +2 -0
- data/test/foreman_app/app/helpers/puppetclasses_and_environments_helper.rb +39 -0
- data/test/foreman_app/app/helpers/puppetclasses_helper.rb +16 -0
- data/test/foreman_app/app/helpers/reports_helper.rb +48 -0
- data/test/foreman_app/app/helpers/settings_helper.rb +27 -0
- data/test/foreman_app/app/helpers/smart_proxies/autosign_helper.rb +6 -0
- data/test/foreman_app/app/helpers/smart_proxies/puppetca_helper.rb +20 -0
- data/test/foreman_app/app/helpers/smart_proxies_helper.rb +2 -0
- data/test/foreman_app/app/helpers/statistics_helper.rb +16 -0
- data/test/foreman_app/app/helpers/subnets_helper.rb +9 -0
- data/test/foreman_app/app/helpers/tasks_helper.rb +22 -0
- data/test/foreman_app/app/helpers/taxonomy_helper.rb +107 -0
- data/test/foreman_app/app/helpers/trends_helper.rb +46 -0
- data/test/foreman_app/app/helpers/unattended_helper.rb +16 -0
- data/test/foreman_app/app/helpers/usergroups_helper.rb +2 -0
- data/test/foreman_app/app/helpers/users_helper.rb +21 -0
- data/test/foreman_app/app/models/architecture.rb +23 -0
- data/test/foreman_app/app/models/archlinux.rb +27 -0
- data/test/foreman_app/app/models/auth_source.rb +70 -0
- data/test/foreman_app/app/models/auth_source_internal.rb +17 -0
- data/test/foreman_app/app/models/auth_source_ldap.rb +147 -0
- data/test/foreman_app/app/models/authorization.rb +51 -0
- data/test/foreman_app/app/models/bookmark.rb +30 -0
- data/test/foreman_app/app/models/classification.rb +126 -0
- data/test/foreman_app/app/models/common_parameter.rb +13 -0
- data/test/foreman_app/app/models/compute_resource.rb +232 -0
- data/test/foreman_app/app/models/config_template.rb +172 -0
- data/test/foreman_app/app/models/dashboard.rb +53 -0
- data/test/foreman_app/app/models/debian.rb +47 -0
- data/test/foreman_app/app/models/domain.rb +90 -0
- data/test/foreman_app/app/models/domain_parameter.rb +22 -0
- data/test/foreman_app/app/models/environment.rb +57 -0
- data/test/foreman_app/app/models/environment_class.rb +25 -0
- data/test/foreman_app/app/models/fact_name.rb +17 -0
- data/test/foreman_app/app/models/fact_trend.rb +57 -0
- data/test/foreman_app/app/models/fact_value.rb +83 -0
- data/test/foreman_app/app/models/facts_importer.rb +121 -0
- data/test/foreman_app/app/models/feature.rb +4 -0
- data/test/foreman_app/app/models/foreman_trend.rb +38 -0
- data/test/foreman_app/app/models/group_parameter.rb +22 -0
- data/test/foreman_app/app/models/host.rb +30 -0
- data/test/foreman_app/app/models/host/base.rb +141 -0
- data/test/foreman_app/app/models/host/hostmix.rb +13 -0
- data/test/foreman_app/app/models/host/managed.rb +854 -0
- data/test/foreman_app/app/models/host_class.rb +13 -0
- data/test/foreman_app/app/models/host_common.rb +95 -0
- data/test/foreman_app/app/models/host_mailer.rb +77 -0
- data/test/foreman_app/app/models/host_observer.rb +19 -0
- data/test/foreman_app/app/models/host_parameter.rb +20 -0
- data/test/foreman_app/app/models/host_template_helpers.rb +43 -0
- data/test/foreman_app/app/models/hostext/search.rb +128 -0
- data/test/foreman_app/app/models/hostgroup.rb +159 -0
- data/test/foreman_app/app/models/hostgroup_class.rb +15 -0
- data/test/foreman_app/app/models/image.rb +14 -0
- data/test/foreman_app/app/models/key_pair.rb +5 -0
- data/test/foreman_app/app/models/location.rb +25 -0
- data/test/foreman_app/app/models/log.rb +25 -0
- data/test/foreman_app/app/models/lookup_key.rb +261 -0
- data/test/foreman_app/app/models/lookup_value.rb +61 -0
- data/test/foreman_app/app/models/medium.rb +58 -0
- data/test/foreman_app/app/models/message.rb +19 -0
- data/test/foreman_app/app/models/model.rb +14 -0
- data/test/foreman_app/app/models/nic.rb +61 -0
- data/test/foreman_app/app/models/nic/bmc.rb +22 -0
- data/test/foreman_app/app/models/nic/bootable.rb +31 -0
- data/test/foreman_app/app/models/nic/interface.rb +23 -0
- data/test/foreman_app/app/models/nic/managed.rb +57 -0
- data/test/foreman_app/app/models/notice.rb +36 -0
- data/test/foreman_app/app/models/operatingsystem.rb +196 -0
- data/test/foreman_app/app/models/orchestration.rb +184 -0
- data/test/foreman_app/app/models/orchestration/compute.rb +157 -0
- data/test/foreman_app/app/models/orchestration/dhcp.rb +154 -0
- data/test/foreman_app/app/models/orchestration/dns.rb +130 -0
- data/test/foreman_app/app/models/orchestration/puppetca.rb +79 -0
- data/test/foreman_app/app/models/orchestration/ssh_provision.rb +115 -0
- data/test/foreman_app/app/models/orchestration/tftp.rb +133 -0
- data/test/foreman_app/app/models/organization.rb +24 -0
- data/test/foreman_app/app/models/os_default_template.rb +11 -0
- data/test/foreman_app/app/models/os_parameter.rb +16 -0
- data/test/foreman_app/app/models/parameter.rb +34 -0
- data/test/foreman_app/app/models/ptable.rb +25 -0
- data/test/foreman_app/app/models/puppet_class_importer.rb +269 -0
- data/test/foreman_app/app/models/puppetclass.rb +172 -0
- data/test/foreman_app/app/models/redhat.rb +61 -0
- data/test/foreman_app/app/models/report.rb +356 -0
- data/test/foreman_app/app/models/report_common.rb +52 -0
- data/test/foreman_app/app/models/role.rb +156 -0
- data/test/foreman_app/app/models/setting.rb +174 -0
- data/test/foreman_app/app/models/setting/auth.rb +29 -0
- data/test/foreman_app/app/models/setting/general.rb +27 -0
- data/test/foreman_app/app/models/setting/provisioning.rb +28 -0
- data/test/foreman_app/app/models/setting/puppet.rb +36 -0
- data/test/foreman_app/app/models/smart_proxies/puppet_ca.rb +66 -0
- data/test/foreman_app/app/models/smart_proxy.rb +96 -0
- data/test/foreman_app/app/models/solaris.rb +114 -0
- data/test/foreman_app/app/models/source.rb +18 -0
- data/test/foreman_app/app/models/subnet.rb +146 -0
- data/test/foreman_app/app/models/subnet_domain.rb +12 -0
- data/test/foreman_app/app/models/suse.rb +22 -0
- data/test/foreman_app/app/models/tax_host.rb +181 -0
- data/test/foreman_app/app/models/taxable_taxonomy.rb +14 -0
- data/test/foreman_app/app/models/taxonomix.rb +47 -0
- data/test/foreman_app/app/models/taxonomy.rb +135 -0
- data/test/foreman_app/app/models/template_combination.rb +12 -0
- data/test/foreman_app/app/models/template_kind.rb +6 -0
- data/test/foreman_app/app/models/token.rb +23 -0
- data/test/foreman_app/app/models/trend.rb +22 -0
- data/test/foreman_app/app/models/trend_counter.rb +7 -0
- data/test/foreman_app/app/models/trend_importer.rb +50 -0
- data/test/foreman_app/app/models/user.rb +251 -0
- data/test/foreman_app/app/models/user_fact.rb +26 -0
- data/test/foreman_app/app/models/user_hostgroup.rb +10 -0
- data/test/foreman_app/app/models/user_role.rb +32 -0
- data/test/foreman_app/app/models/usergroup.rb +61 -0
- data/test/foreman_app/app/models/usergroup_member.rb +5 -0
- data/test/foreman_app/app/models/windows.rb +20 -0
- data/test/foreman_app/app/views/api/v1/architectures/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/architectures/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/architectures/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/audits/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/audits/show.json.rabl +5 -0
- data/test/foreman_app/app/views/api/v1/auth_source_ldaps/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/auth_source_ldaps/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/bookmarks/create.json.rabl +2 -0
- data/test/foreman_app/app/views/api/v1/bookmarks/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/bookmarks/show.json.rabl +2 -0
- data/test/foreman_app/app/views/api/v1/bookmarks/update.json.rabl +8 -0
- data/test/foreman_app/app/views/api/v1/common_parameters/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/common_parameters/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/common_parameters/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/compute_resources/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/compute_resources/ec2.json.rabl +1 -0
- data/test/foreman_app/app/views/api/v1/compute_resources/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/compute_resources/libvirt.json.rabl +0 -0
- data/test/foreman_app/app/views/api/v1/compute_resources/openstack.json.rabl +1 -0
- data/test/foreman_app/app/views/api/v1/compute_resources/ovirt.json.rabl +1 -0
- data/test/foreman_app/app/views/api/v1/compute_resources/rackspace.json.rabl +1 -0
- data/test/foreman_app/app/views/api/v1/compute_resources/show.json.rabl +8 -0
- data/test/foreman_app/app/views/api/v1/compute_resources/vmware.json.rabl +1 -0
- data/test/foreman_app/app/views/api/v1/config_templates/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/config_templates/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/config_templates/show.json.rabl +11 -0
- data/test/foreman_app/app/views/api/v1/domains/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/domains/show.json.rabl +2 -0
- data/test/foreman_app/app/views/api/v1/environments/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/environments/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/environments/show.json.rabl +5 -0
- data/test/foreman_app/app/views/api/v1/errors/access_denied.json.rabl +4 -0
- data/test/foreman_app/app/views/api/v1/errors/not_found.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/errors/param_error.json.rabl +7 -0
- data/test/foreman_app/app/views/api/v1/errors/route_error.json.rabl +4 -0
- data/test/foreman_app/app/views/api/v1/errors/standard_error.json.rabl +5 -0
- data/test/foreman_app/app/views/api/v1/errors/unauthorized.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/errors/unprocessable_entity.json.rabl +6 -0
- data/test/foreman_app/app/views/api/v1/home/index.json.rabl +24 -0
- data/test/foreman_app/app/views/api/v1/home/status.json.rabl +6 -0
- data/test/foreman_app/app/views/api/v1/hostgroups/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/hostgroups/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/hostgroups/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/hosts/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/hosts/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/hosts/show.json.rabl +12 -0
- data/test/foreman_app/app/views/api/v1/images/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/images/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/lookup_keys/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/lookup_keys/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/media/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/media/show.json.rabl +9 -0
- data/test/foreman_app/app/views/api/v1/models/index.rabl +4 -0
- data/test/foreman_app/app/views/api/v1/models/show.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/operatingsystems/create.json.rabl +4 -0
- data/test/foreman_app/app/views/api/v1/operatingsystems/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/operatingsystems/show.json.rabl +22 -0
- data/test/foreman_app/app/views/api/v1/operatingsystems/update.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/ptables/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/ptables/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/reports/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/reports/show.json.rabl +16 -0
- data/test/foreman_app/app/views/api/v1/roles/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/roles/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/roles/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/settings/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/settings/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/smart_proxies/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/smart_proxies/show.json.rabl +9 -0
- data/test/foreman_app/app/views/api/v1/subnets/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/subnets/index.json.rabl +5 -0
- data/test/foreman_app/app/views/api/v1/subnets/show.json.rabl +17 -0
- data/test/foreman_app/app/views/api/v1/subnets/update.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/template_kinds/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/template_kinds/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/usergroups/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/usergroups/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/users/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v1/users/index.json.rabl +5 -0
- data/test/foreman_app/app/views/api/v1/users/show.json.rabl +13 -0
- data/test/foreman_app/app/views/api/v2/config_templates/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/config_templates/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/config_templates/show.json.rabl +33 -0
- data/test/foreman_app/app/views/api/v2/errors/access_denied.json.rabl +4 -0
- data/test/foreman_app/app/views/api/v2/errors/not_found.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/errors/param_error.json.rabl +7 -0
- data/test/foreman_app/app/views/api/v2/errors/route_error.json.rabl +4 -0
- data/test/foreman_app/app/views/api/v2/errors/standard_error.json.rabl +5 -0
- data/test/foreman_app/app/views/api/v2/errors/unauthorized.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/errors/unprocessable_entity.json.rabl +6 -0
- data/test/foreman_app/app/views/api/v2/parameters/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/parameters/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/parameters/show.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/parameters/update.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/puppetclasses/show.json.rabl +7 -0
- data/test/foreman_app/app/views/api/v2/taxonomies/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/taxonomies/show.json.rabl +7 -0
- data/test/foreman_app/app/views/api/v2/taxonomies/update.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/template_combinations/create.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/template_combinations/index.json.rabl +3 -0
- data/test/foreman_app/app/views/api/v2/template_combinations/show.json.rabl +3 -0
- data/test/foreman_app/app/views/architectures/_form.html.erb +6 -0
- data/test/foreman_app/app/views/architectures/edit.html.erb +3 -0
- data/test/foreman_app/app/views/architectures/index.html.erb +21 -0
- data/test/foreman_app/app/views/architectures/new.html.erb +3 -0
- data/test/foreman_app/app/views/architectures/welcome.html.erb +14 -0
- data/test/foreman_app/app/views/audits/_list.erb +24 -0
- data/test/foreman_app/app/views/audits/index.html.erb +6 -0
- data/test/foreman_app/app/views/audits/show.html.erb +56 -0
- data/test/foreman_app/app/views/auth_source_ldaps/_form.html.erb +23 -0
- data/test/foreman_app/app/views/auth_source_ldaps/edit.html.erb +3 -0
- data/test/foreman_app/app/views/auth_source_ldaps/index.html.erb +22 -0
- data/test/foreman_app/app/views/auth_source_ldaps/new.html.erb +3 -0
- data/test/foreman_app/app/views/auth_source_ldaps/welcome.html.erb +8 -0
- data/test/foreman_app/app/views/bookmarks/_form.html.erb +8 -0
- data/test/foreman_app/app/views/bookmarks/_list.html.erb +7 -0
- data/test/foreman_app/app/views/bookmarks/edit.html.erb +3 -0
- data/test/foreman_app/app/views/bookmarks/index.html.erb +25 -0
- data/test/foreman_app/app/views/bookmarks/new.html.erb +3 -0
- data/test/foreman_app/app/views/bookmarks/welcome.html.erb +8 -0
- data/test/foreman_app/app/views/common/403.html.erb +9 -0
- data/test/foreman_app/app/views/common/404.html.erb +8 -0
- data/test/foreman_app/app/views/common/500.html.erb +19 -0
- data/test/foreman_app/app/views/common/_domain.html.erb +9 -0
- data/test/foreman_app/app/views/common/_domain_subnet.html.erb +10 -0
- data/test/foreman_app/app/views/common/_edit_habtm.erb +20 -0
- data/test/foreman_app/app/views/common/_notice.erb +20 -0
- data/test/foreman_app/app/views/common/_puppetclasses_or_envs_changed.html.erb +32 -0
- data/test/foreman_app/app/views/common/_searchbar.erb +37 -0
- data/test/foreman_app/app/views/common/_show_habtm.html.erb +1 -0
- data/test/foreman_app/app/views/common/os_selection/_architecture.html.erb +9 -0
- data/test/foreman_app/app/views/common/os_selection/_image_details.html.erb +7 -0
- data/test/foreman_app/app/views/common/os_selection/_initial.html.erb +15 -0
- data/test/foreman_app/app/views/common/os_selection/_operatingsystem.html.erb +15 -0
- data/test/foreman_app/app/views/common_parameters/_form.html.erb +6 -0
- data/test/foreman_app/app/views/common_parameters/_inherited_parameters.erb +23 -0
- data/test/foreman_app/app/views/common_parameters/_parameter.erb +14 -0
- data/test/foreman_app/app/views/common_parameters/_parameters.erb +6 -0
- data/test/foreman_app/app/views/common_parameters/_puppetclass_parameter.erb +16 -0
- data/test/foreman_app/app/views/common_parameters/_puppetclasses_parameters.erb +7 -0
- data/test/foreman_app/app/views/common_parameters/_show_parameter.html.erb +5 -0
- data/test/foreman_app/app/views/common_parameters/edit.html.erb +3 -0
- data/test/foreman_app/app/views/common_parameters/index.html.erb +22 -0
- data/test/foreman_app/app/views/common_parameters/new.html.erb +3 -0
- data/test/foreman_app/app/views/compute_resources/_form.html.erb +44 -0
- data/test/foreman_app/app/views/compute_resources/edit.html.erb +3 -0
- data/test/foreman_app/app/views/compute_resources/form/_ec2.html.erb +8 -0
- data/test/foreman_app/app/views/compute_resources/form/_libvirt.html.erb +9 -0
- data/test/foreman_app/app/views/compute_resources/form/_openstack.html.erb +9 -0
- data/test/foreman_app/app/views/compute_resources/form/_ovirt.html.erb +8 -0
- data/test/foreman_app/app/views/compute_resources/form/_rackspace.html.erb +8 -0
- data/test/foreman_app/app/views/compute_resources/form/_vmware.html.erb +8 -0
- data/test/foreman_app/app/views/compute_resources/index.html.erb +24 -0
- data/test/foreman_app/app/views/compute_resources/new.html.erb +3 -0
- data/test/foreman_app/app/views/compute_resources/show.html.erb +56 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/_ec2.html.erb +10 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/_libvirt.html.erb +33 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/_openstack.html.erb +9 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/_ovirt.html.erb +43 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/_rackspace.html.erb +7 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/_vmware.html.erb +37 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/libvirt/_network.html.erb +9 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/libvirt/_volume.html.erb +6 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/ovirt/_network.html.erb +13 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/ovirt/_volume.html.erb +18 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/vmware/_network.html.erb +8 -0
- data/test/foreman_app/app/views/compute_resources_vms/form/vmware/_volume.html.erb +8 -0
- data/test/foreman_app/app/views/compute_resources_vms/index.html.erb +3 -0
- data/test/foreman_app/app/views/compute_resources_vms/index/_ec2.html.erb +25 -0
- data/test/foreman_app/app/views/compute_resources_vms/index/_libvirt.html.erb +23 -0
- data/test/foreman_app/app/views/compute_resources_vms/index/_openstack.html.erb +23 -0
- data/test/foreman_app/app/views/compute_resources_vms/index/_ovirt.html.erb +24 -0
- data/test/foreman_app/app/views/compute_resources_vms/index/_rackspace.html.erb +22 -0
- data/test/foreman_app/app/views/compute_resources_vms/index/_vmware.html.erb +27 -0
- data/test/foreman_app/app/views/compute_resources_vms/new.html.erb +9 -0
- data/test/foreman_app/app/views/compute_resources_vms/show.html.erb +8 -0
- data/test/foreman_app/app/views/compute_resources_vms/show/_ec2.html.erb +19 -0
- data/test/foreman_app/app/views/compute_resources_vms/show/_libvirt.html.erb +53 -0
- data/test/foreman_app/app/views/compute_resources_vms/show/_openstack.html.erb +19 -0
- data/test/foreman_app/app/views/compute_resources_vms/show/_ovirt.html.erb +47 -0
- data/test/foreman_app/app/views/compute_resources_vms/show/_rackspace.html.erb +19 -0
- data/test/foreman_app/app/views/compute_resources_vms/show/_vmware.html.erb +16 -0
- data/test/foreman_app/app/views/config_templates/_combination.html.erb +5 -0
- data/test/foreman_app/app/views/config_templates/_combinations.html.erb +6 -0
- data/test/foreman_app/app/views/config_templates/_diff.erb +14 -0
- data/test/foreman_app/app/views/config_templates/_form.html.erb +94 -0
- data/test/foreman_app/app/views/config_templates/edit.html.erb +3 -0
- data/test/foreman_app/app/views/config_templates/index.html.erb +31 -0
- data/test/foreman_app/app/views/config_templates/new.html.erb +3 -0
- data/test/foreman_app/app/views/dashboard/_status_table.html.erb +32 -0
- data/test/foreman_app/app/views/dashboard/index.html.erb +24 -0
- data/test/foreman_app/app/views/dashboard/welcome.html.erb +118 -0
- data/test/foreman_app/app/views/domains/_form.html.erb +43 -0
- data/test/foreman_app/app/views/domains/edit.html.erb +3 -0
- data/test/foreman_app/app/views/domains/index.html.erb +20 -0
- data/test/foreman_app/app/views/domains/new.html.erb +3 -0
- data/test/foreman_app/app/views/domains/welcome.html.erb +13 -0
- data/test/foreman_app/app/views/environments/_form.html.erb +38 -0
- data/test/foreman_app/app/views/environments/edit.html.erb +3 -0
- data/test/foreman_app/app/views/environments/index.html.erb +27 -0
- data/test/foreman_app/app/views/environments/new.html.erb +3 -0
- data/test/foreman_app/app/views/environments/welcome.html.erb +15 -0
- data/test/foreman_app/app/views/fact_values/index.html.erb +40 -0
- data/test/foreman_app/app/views/fact_values/welcome.html.erb +9 -0
- data/test/foreman_app/app/views/facts/show.html.erb +3 -0
- data/test/foreman_app/app/views/home/_location_dropdown.html.erb +17 -0
- data/test/foreman_app/app/views/home/_org_switcher.html.erb +11 -0
- data/test/foreman_app/app/views/home/_organization_dropdown.html.erb +17 -0
- data/test/foreman_app/app/views/home/_settings.html.erb +22 -0
- data/test/foreman_app/app/views/home/_topbar.html.erb +33 -0
- data/test/foreman_app/app/views/home/_user_dropdown.html.erb +10 -0
- data/test/foreman_app/app/views/host_mailer/_active_hosts.html.erb +30 -0
- data/test/foreman_app/app/views/host_mailer/_link_to_host.html.erb +5 -0
- data/test/foreman_app/app/views/host_mailer/_list.html.erb +13 -0
- data/test/foreman_app/app/views/host_mailer/_nonactive_hosts.html.erb +30 -0
- data/test/foreman_app/app/views/host_mailer/error_state.html.erb +10 -0
- data/test/foreman_app/app/views/host_mailer/summary.html.erb +17 -0
- data/test/foreman_app/app/views/hostgroups/_form.html.erb +69 -0
- data/test/foreman_app/app/views/hostgroups/edit.html.erb +3 -0
- data/test/foreman_app/app/views/hostgroups/index.html.erb +23 -0
- data/test/foreman_app/app/views/hostgroups/new.html.erb +3 -0
- data/test/foreman_app/app/views/hostgroups/welcome.html.erb +20 -0
- data/test/foreman_app/app/views/hosts/_assign_hosts.html.erb +42 -0
- data/test/foreman_app/app/views/hosts/_compute.html.erb +12 -0
- data/test/foreman_app/app/views/hosts/_conflicts.html.erb +28 -0
- data/test/foreman_app/app/views/hosts/_form.html.erb +109 -0
- data/test/foreman_app/app/views/hosts/_interfaces.html.erb +29 -0
- data/test/foreman_app/app/views/hosts/_list.html.erb +47 -0
- data/test/foreman_app/app/views/hosts/_metrics.html.erb +13 -0
- data/test/foreman_app/app/views/hosts/_operating_system.erb +41 -0
- data/test/foreman_app/app/views/hosts/_overview.html.erb +25 -0
- data/test/foreman_app/app/views/hosts/_progress.erb +8 -0
- data/test/foreman_app/app/views/hosts/_provisioning.html.erb +9 -0
- data/test/foreman_app/app/views/hosts/_selected_hosts.html.erb +31 -0
- data/test/foreman_app/app/views/hosts/_taxonomy_import_option.html.erb +2 -0
- data/test/foreman_app/app/views/hosts/_unattended.html.erb +34 -0
- data/test/foreman_app/app/views/hosts/assign_hosts.html.erb +5 -0
- data/test/foreman_app/app/views/hosts/console/log.html.erb +17 -0
- data/test/foreman_app/app/views/hosts/console/spice.html.erb +18 -0
- data/test/foreman_app/app/views/hosts/console/vnc.html.erb +21 -0
- data/test/foreman_app/app/views/hosts/edit.html.erb +7 -0
- data/test/foreman_app/app/views/hosts/index.html.erb +4 -0
- data/test/foreman_app/app/views/hosts/multiple_build.html.erb +6 -0
- data/test/foreman_app/app/views/hosts/multiple_destroy.html.erb +6 -0
- data/test/foreman_app/app/views/hosts/multiple_disable.html.erb +6 -0
- data/test/foreman_app/app/views/hosts/multiple_enable.html.erb +6 -0
- data/test/foreman_app/app/views/hosts/multiple_parameters.html.erb +12 -0
- data/test/foreman_app/app/views/hosts/multiple_puppetrun.html.erb +5 -0
- data/test/foreman_app/app/views/hosts/new.html.erb +3 -0
- data/test/foreman_app/app/views/hosts/query.html.erb +3 -0
- data/test/foreman_app/app/views/hosts/select_multiple_environment.html.erb +8 -0
- data/test/foreman_app/app/views/hosts/select_multiple_hostgroup.html.erb +6 -0
- data/test/foreman_app/app/views/hosts/select_multiple_location.html.erb +6 -0
- data/test/foreman_app/app/views/hosts/select_multiple_organization.html.erb +6 -0
- data/test/foreman_app/app/views/hosts/show.html.erb +55 -0
- data/test/foreman_app/app/views/hosts/storeconfig_klasses.html.erb +12 -0
- data/test/foreman_app/app/views/hosts/update_multiple_parameters.html.erb +18 -0
- data/test/foreman_app/app/views/hosts/welcome.html.erb +10 -0
- data/test/foreman_app/app/views/images/_form.html.erb +16 -0
- data/test/foreman_app/app/views/images/edit.html.erb +3 -0
- data/test/foreman_app/app/views/images/index.html.erb +26 -0
- data/test/foreman_app/app/views/images/new.html.erb +4 -0
- data/test/foreman_app/app/views/layouts/application.html.erb +69 -0
- data/test/foreman_app/app/views/locations/welcome.html.erb +9 -0
- data/test/foreman_app/app/views/lookup_keys/_fields.html.erb +42 -0
- data/test/foreman_app/app/views/lookup_keys/_value.html.erb +6 -0
- data/test/foreman_app/app/views/lookup_keys/edit.html.erb +7 -0
- data/test/foreman_app/app/views/lookup_keys/index.html.erb +22 -0
- data/test/foreman_app/app/views/media/_form.html.erb +53 -0
- data/test/foreman_app/app/views/media/edit.html.erb +3 -0
- data/test/foreman_app/app/views/media/index.html.erb +26 -0
- data/test/foreman_app/app/views/media/new.html.erb +3 -0
- data/test/foreman_app/app/views/media/welcome.html.erb +19 -0
- data/test/foreman_app/app/views/models/_form.html.erb +8 -0
- data/test/foreman_app/app/views/models/edit.html.erb +3 -0
- data/test/foreman_app/app/views/models/index.html.erb +26 -0
- data/test/foreman_app/app/views/models/new.html.erb +3 -0
- data/test/foreman_app/app/views/operatingsystems/_form.html.erb +38 -0
- data/test/foreman_app/app/views/operatingsystems/_template_defaults.html.erb +19 -0
- data/test/foreman_app/app/views/operatingsystems/_templates.html.erb +2 -0
- data/test/foreman_app/app/views/operatingsystems/edit.html.erb +3 -0
- data/test/foreman_app/app/views/operatingsystems/index.html.erb +22 -0
- data/test/foreman_app/app/views/operatingsystems/new.html.erb +3 -0
- data/test/foreman_app/app/views/organizations/welcome.html.erb +14 -0
- data/test/foreman_app/app/views/ptables/_form.html.erb +8 -0
- data/test/foreman_app/app/views/ptables/edit.html.erb +3 -0
- data/test/foreman_app/app/views/ptables/index.html.erb +23 -0
- data/test/foreman_app/app/views/ptables/new.html.erb +3 -0
- data/test/foreman_app/app/views/ptables/welcome.html.erb +52 -0
- data/test/foreman_app/app/views/puppetclasses/_class_parameters.html.erb +16 -0
- data/test/foreman_app/app/views/puppetclasses/_class_selection.html.erb +44 -0
- data/test/foreman_app/app/views/puppetclasses/_classes.html.erb +23 -0
- data/test/foreman_app/app/views/puppetclasses/_classes_parameters.html.erb +14 -0
- data/test/foreman_app/app/views/puppetclasses/_form.html.erb +90 -0
- data/test/foreman_app/app/views/puppetclasses/_selectedClasses.html.erb +4 -0
- data/test/foreman_app/app/views/puppetclasses/edit.html.erb +3 -0
- data/test/foreman_app/app/views/puppetclasses/index.html.erb +33 -0
- data/test/foreman_app/app/views/puppetclasses/new.html.erb +3 -0
- data/test/foreman_app/app/views/puppetclasses/no_route.html.erb +11 -0
- data/test/foreman_app/app/views/reports/_list.html.erb +34 -0
- data/test/foreman_app/app/views/reports/_metrics.html.erb +25 -0
- data/test/foreman_app/app/views/reports/_output.html.erb +13 -0
- data/test/foreman_app/app/views/reports/index.html.erb +3 -0
- data/test/foreman_app/app/views/reports/show.html.erb +37 -0
- data/test/foreman_app/app/views/reports/welcome.html.erb +11 -0
- data/test/foreman_app/app/views/roles/_form.html.erb +28 -0
- data/test/foreman_app/app/views/roles/edit.html.erb +3 -0
- data/test/foreman_app/app/views/roles/index.html.erb +28 -0
- data/test/foreman_app/app/views/roles/new.html.erb +3 -0
- data/test/foreman_app/app/views/roles/report.html.erb +52 -0
- data/test/foreman_app/app/views/settings/index.html.erb +29 -0
- data/test/foreman_app/app/views/smart_proxies/_form.html.erb +38 -0
- data/test/foreman_app/app/views/smart_proxies/autosign/_form.html.erb +9 -0
- data/test/foreman_app/app/views/smart_proxies/autosign/index.html.erb +21 -0
- data/test/foreman_app/app/views/smart_proxies/autosign/new.html.erb +3 -0
- data/test/foreman_app/app/views/smart_proxies/edit.html.erb +3 -0
- data/test/foreman_app/app/views/smart_proxies/index.html.erb +37 -0
- data/test/foreman_app/app/views/smart_proxies/new.html.erb +3 -0
- data/test/foreman_app/app/views/smart_proxies/puppetca/index.html.erb +36 -0
- data/test/foreman_app/app/views/statistics/index.html.erb +5 -0
- data/test/foreman_app/app/views/subnets/_fields.html.erb +17 -0
- data/test/foreman_app/app/views/subnets/_form.html.erb +34 -0
- data/test/foreman_app/app/views/subnets/edit.html.erb +3 -0
- data/test/foreman_app/app/views/subnets/import.html.erb +26 -0
- data/test/foreman_app/app/views/subnets/index.html.erb +28 -0
- data/test/foreman_app/app/views/subnets/new.html.erb +3 -0
- data/test/foreman_app/app/views/tasks/_list.html.erb +5 -0
- data/test/foreman_app/app/views/tasks/show.html.erb +1 -0
- data/test/foreman_app/app/views/taxonomies/_form.html.erb +111 -0
- data/test/foreman_app/app/views/taxonomies/_step1.html.erb +14 -0
- data/test/foreman_app/app/views/taxonomies/_step2.html.erb +18 -0
- data/test/foreman_app/app/views/taxonomies/clone.html.erb +3 -0
- data/test/foreman_app/app/views/taxonomies/edit.html.erb +4 -0
- data/test/foreman_app/app/views/taxonomies/index.html.erb +39 -0
- data/test/foreman_app/app/views/taxonomies/mismatches.html.erb +37 -0
- data/test/foreman_app/app/views/taxonomies/new.html.erb +3 -0
- data/test/foreman_app/app/views/taxonomies/step2.html.erb +3 -0
- data/test/foreman_app/app/views/trends/_fields.html.erb +7 -0
- data/test/foreman_app/app/views/trends/_form.html.erb +9 -0
- data/test/foreman_app/app/views/trends/_hosts.html.erb +13 -0
- data/test/foreman_app/app/views/trends/edit.html.erb +33 -0
- data/test/foreman_app/app/views/trends/index.html.erb +47 -0
- data/test/foreman_app/app/views/trends/new.html.erb +3 -0
- data/test/foreman_app/app/views/trends/show.html.erb +19 -0
- data/test/foreman_app/app/views/unattended/autowaik.xml.erb +2 -0
- data/test/foreman_app/app/views/unattended/autoyast.xml.erb +80 -0
- data/test/foreman_app/app/views/unattended/gpxe_kickstart_config.erb +5 -0
- data/test/foreman_app/app/views/unattended/grubby.erb +9 -0
- data/test/foreman_app/app/views/unattended/jumpstart.html.erb +10 -0
- data/test/foreman_app/app/views/unattended/jumpstart_finish.html.erb +51 -0
- data/test/foreman_app/app/views/unattended/kickstart.html.erb +71 -0
- data/test/foreman_app/app/views/unattended/preseed.html.erb +66 -0
- data/test/foreman_app/app/views/unattended/preseed_finish.html.erb +7 -0
- data/test/foreman_app/app/views/unattended/pxe_autowaik.erb +3 -0
- data/test/foreman_app/app/views/unattended/pxe_autoyast.erb +4 -0
- data/test/foreman_app/app/views/unattended/pxe_debian_config.erb +4 -0
- data/test/foreman_app/app/views/unattended/pxe_default.erb +23 -0
- data/test/foreman_app/app/views/unattended/pxe_jumpstart_config.erb +10 -0
- data/test/foreman_app/app/views/unattended/pxe_kickstart_config.erb +4 -0
- data/test/foreman_app/app/views/unattended/pxe_local.erb +11 -0
- data/test/foreman_app/app/views/unattended/snippets/_epel.erb +15 -0
- data/test/foreman_app/app/views/unattended/snippets/_http_proxy.erb +8 -0
- data/test/foreman_app/app/views/unattended/snippets/_puppet.conf.erb +15 -0
- data/test/foreman_app/app/views/unattended/snippets/_puppet.init.erb +8 -0
- data/test/foreman_app/app/views/unattended/snippets/_redhat_register.erb +67 -0
- data/test/foreman_app/app/views/unattended/snippets/_vmware.erb +62 -0
- data/test/foreman_app/app/views/usergroups/_form.html.erb +7 -0
- data/test/foreman_app/app/views/usergroups/edit.html.erb +3 -0
- data/test/foreman_app/app/views/usergroups/index.html.erb +24 -0
- data/test/foreman_app/app/views/usergroups/new.html.erb +3 -0
- data/test/foreman_app/app/views/users/_filters.html.erb +38 -0
- data/test/foreman_app/app/views/users/_form.html.erb +58 -0
- data/test/foreman_app/app/views/users/_user_fact.html.erb +14 -0
- data/test/foreman_app/app/views/users/edit.html.erb +3 -0
- data/test/foreman_app/app/views/users/index.html.erb +31 -0
- data/test/foreman_app/app/views/users/login.html.erb +22 -0
- data/test/foreman_app/app/views/users/new.html.erb +3 -0
- data/test/foreman_app/bundler.d/Gemfile.local.rb +2 -0
- data/test/foreman_app/bundler.d/assets.rb +12 -0
- data/test/foreman_app/bundler.d/console.rb +5 -0
- data/test/foreman_app/bundler.d/development.rb +17 -0
- data/test/foreman_app/bundler.d/fog.rb +3 -0
- data/test/foreman_app/bundler.d/i18n.rb +5 -0
- data/test/foreman_app/bundler.d/jsonp.rb +3 -0
- data/test/foreman_app/bundler.d/libvirt.rb +3 -0
- data/test/foreman_app/bundler.d/mysql.rb +3 -0
- data/test/foreman_app/bundler.d/mysql2.rb +3 -0
- data/test/foreman_app/bundler.d/openid.rb +3 -0
- data/test/foreman_app/bundler.d/ovirt.rb +3 -0
- data/test/foreman_app/bundler.d/postgresql.rb +3 -0
- data/test/foreman_app/bundler.d/sqlite.rb +3 -0
- data/test/foreman_app/bundler.d/test.rb +17 -0
- data/test/foreman_app/bundler.d/vmware.rb +3 -0
- data/test/foreman_app/config.ru +8 -0
- data/test/foreman_app/config/application.rb +114 -0
- data/test/foreman_app/config/boot.rb +6 -0
- data/test/foreman_app/config/database.yml +22 -0
- data/test/foreman_app/config/database.yml.example +22 -0
- data/test/foreman_app/config/email.yaml.example +9 -0
- data/test/foreman_app/config/environment.rb +5 -0
- data/test/foreman_app/config/environments/development.rb +38 -0
- data/test/foreman_app/config/environments/production.rb +112 -0
- data/test/foreman_app/config/environments/test.rb +42 -0
- data/test/foreman_app/config/ignored_environments.yml.sample +9 -0
- data/test/foreman_app/config/initializers/apipie.rb +71 -0
- data/test/foreman_app/config/initializers/backtrace_silencers.rb +7 -0
- data/test/foreman_app/config/initializers/email.rb +17 -0
- data/test/foreman_app/config/initializers/fast_gettext.rb +49 -0
- data/test/foreman_app/config/initializers/foreman.rb +24 -0
- data/test/foreman_app/config/initializers/hostable.rb +3 -0
- data/test/foreman_app/config/initializers/inflections.rb +10 -0
- data/test/foreman_app/config/initializers/local_secret_token.rb.example +10 -0
- data/test/foreman_app/config/initializers/mime_types.rb +6 -0
- data/test/foreman_app/config/initializers/puppet.rb +22 -0
- data/test/foreman_app/config/initializers/rack_openid.rb +8 -0
- data/test/foreman_app/config/initializers/secret_token.rb +15 -0
- data/test/foreman_app/config/initializers/session_store.rb +8 -0
- data/test/foreman_app/config/initializers/will_paginate.rb +27 -0
- data/test/foreman_app/config/initializers/wrap_parameters.rb +13 -0
- data/test/foreman_app/config/locales/README +24 -0
- data/test/foreman_app/config/locales/de.yml +203 -0
- data/test/foreman_app/config/locales/en.yml +205 -0
- data/test/foreman_app/config/locales/es.yml +199 -0
- data/test/foreman_app/config/locales/ja.yml +197 -0
- data/test/foreman_app/config/model.mappings.example +342 -0
- data/test/foreman_app/config/routes.rb +332 -0
- data/test/foreman_app/config/routes/api/apipiedoc.rb +4 -0
- data/test/foreman_app/config/routes/api/v1.rb +65 -0
- data/test/foreman_app/config/routes/api/v2.rb +208 -0
- data/test/foreman_app/config/settings.rb +13 -0
- data/test/foreman_app/config/settings.yaml +18 -0
- data/test/foreman_app/config/settings.yaml.example +17 -0
- data/test/foreman_app/db/migrate/20090714132448_create_hosts.rb +47 -0
- data/test/foreman_app/db/migrate/20090714132449_add_audits_table.rb +27 -0
- data/test/foreman_app/db/migrate/20090715143858_create_architectures.rb +19 -0
- data/test/foreman_app/db/migrate/20090717025820_create_media.rb +19 -0
- data/test/foreman_app/db/migrate/20090718060746_create_domains.rb +15 -0
- data/test/foreman_app/db/migrate/20090718064254_create_subnets.rb +18 -0
- data/test/foreman_app/db/migrate/20090720134126_create_operatingsystems.rb +16 -0
- data/test/foreman_app/db/migrate/20090722140138_create_models.rb +16 -0
- data/test/foreman_app/db/migrate/20090722141107_create_environments.rb +18 -0
- data/test/foreman_app/db/migrate/20090729132209_create_reports.rb +14 -0
- data/test/foreman_app/db/migrate/20090730152224_create_ptables.rb +24 -0
- data/test/foreman_app/db/migrate/20090802062223_create_puppetclasses.rb +26 -0
- data/test/foreman_app/db/migrate/20090804130144_create_parameters.rb +13 -0
- data/test/foreman_app/db/migrate/20090820130541_create_auth_sources.rb +25 -0
- data/test/foreman_app/db/migrate/20090905150131_create_hostgroups.rb +24 -0
- data/test/foreman_app/db/migrate/20090905155444_add_type_to_parameter.rb +9 -0
- data/test/foreman_app/db/migrate/20090907045751_add_domain_to_parameter.rb +10 -0
- data/test/foreman_app/db/migrate/20090915030726_change_report_field_type_to_text.rb +13 -0
- data/test/foreman_app/db/migrate/20090916053824_change_host_build_default_to_false.rb +11 -0
- data/test/foreman_app/db/migrate/20090920043521_add_index_to_host.rb +25 -0
- data/test/foreman_app/db/migrate/20090920064156_add_index_to_parameters.rb +15 -0
- data/test/foreman_app/db/migrate/20090920065522_add_index_to_reports.rb +9 -0
- data/test/foreman_app/db/migrate/20091012135004_create_users.rb +19 -0
- data/test/foreman_app/db/migrate/20091016031017_create_sessions.rb +16 -0
- data/test/foreman_app/db/migrate/20091022054108_add_status_to_report.rb +15 -0
- data/test/foreman_app/db/migrate/20091214045923_calc_existing_reports.rb +19 -0
- data/test/foreman_app/db/migrate/20091219132338_create_lookup_keys.rb +14 -0
- data/test/foreman_app/db/migrate/20091219132839_create_lookup_values.rb +17 -0
- data/test/foreman_app/db/migrate/20100115021803_change_mysql_reports_column.rb +14 -0
- data/test/foreman_app/db/migrate/20100310080727_add_family_to_os.rb +33 -0
- data/test/foreman_app/db/migrate/20100325142616_update_fact_names_and_values_to_bin.rb +15 -0
- data/test/foreman_app/db/migrate/20100414125652_add_releasename_to_os.rb +24 -0
- data/test/foreman_app/db/migrate/20100416124600_create_usergroups.rb +17 -0
- data/test/foreman_app/db/migrate/20100419151910_add_owner_to_hosts.rb +26 -0
- data/test/foreman_app/db/migrate/20100523114430_add_ubuntu_custom_lvm_ptable.rb +67 -0
- data/test/foreman_app/db/migrate/20100523141204_create_media_operatingsystems_and_migrate_data.rb +34 -0
- data/test/foreman_app/db/migrate/20100524080302_migrate_installation_medium_uri.rb +15 -0
- data/test/foreman_app/db/migrate/20100525094200_simplify_parameters.rb +62 -0
- data/test/foreman_app/db/migrate/20100601221000_update_os_minor.rb +13 -0
- data/test/foreman_app/db/migrate/20100616114400_change_family_in_os.rb +50 -0
- data/test/foreman_app/db/migrate/20100625155400_create_notices.rb +21 -0
- data/test/foreman_app/db/migrate/20100628123400_add_internal_auth.rb +33 -0
- data/test/foreman_app/db/migrate/20100629093200_create_roles.rb +23 -0
- data/test/foreman_app/db/migrate/20100701081235_add_user_domains_and_hostgroups.rb +20 -0
- data/test/foreman_app/db/migrate/20100822072954_create_user_facts.rb +18 -0
- data/test/foreman_app/db/migrate/20100823181036_add_enabled_to_hosts.rb +9 -0
- data/test/foreman_app/db/migrate/20100914092104_add_my_booleans_to_user.rb +13 -0
- data/test/foreman_app/db/migrate/20101018120548_create_messages.rb +18 -0
- data/test/foreman_app/db/migrate/20101018120603_create_sources.rb +18 -0
- data/test/foreman_app/db/migrate/20101018120621_create_logs.rb +22 -0
- data/test/foreman_app/db/migrate/20101019122857_add_metrics_to_report.rb +9 -0
- data/test/foreman_app/db/migrate/20101019183859_convert_reports.rb +38 -0
- data/test/foreman_app/db/migrate/20101103150254_add_owned_filter_to_user.rb +9 -0
- data/test/foreman_app/db/migrate/20101118130026_correct_media.rb +35 -0
- data/test/foreman_app/db/migrate/20101121080425_create_config_templates.rb +15 -0
- data/test/foreman_app/db/migrate/20101121135521_create_template_combinations.rb +15 -0
- data/test/foreman_app/db/migrate/20101122132041_create_operatingsystems_config_templates.rb +12 -0
- data/test/foreman_app/db/migrate/20101123152150_create_template_kinds.rb +18 -0
- data/test/foreman_app/db/migrate/20101123153303_create_os_default_templates.rb +15 -0
- data/test/foreman_app/db/migrate/20101125153351_add_default_templates.rb +59 -0
- data/test/foreman_app/db/migrate/20101130093613_add_sub_systems_to_subnet.rb +13 -0
- data/test/foreman_app/db/migrate/20101130100315_create_proxies.rb +13 -0
- data/test/foreman_app/db/migrate/20101202104444_add_proxy_to_domain.rb +11 -0
- data/test/foreman_app/db/migrate/20101213085232_add_grubby_template.rb +15 -0
- data/test/foreman_app/db/migrate/20110117162722_add_host_group_defaults.rb +21 -0
- data/test/foreman_app/db/migrate/20110128130239_add_default_pxe_menu_template.rb +15 -0
- data/test/foreman_app/db/migrate/20110213104226_create_proxy_features.rb +28 -0
- data/test/foreman_app/db/migrate/20110216101848_change_puppetmaster_column.rb +21 -0
- data/test/foreman_app/db/migrate/20110301154453_add_managed_to_hosts.rb +15 -0
- data/test/foreman_app/db/migrate/20110321070954_revert_face_names_and_values_to_text_records.rb +13 -0
- data/test/foreman_app/db/migrate/20110327123639_add_priority_to_parameter.rb +11 -0
- data/test/foreman_app/db/migrate/20110404150043_add_media_path_to_medium.rb +13 -0
- data/test/foreman_app/db/migrate/20110407091150_add_image_to_host.rb +15 -0
- data/test/foreman_app/db/migrate/20110412103238_remove_unused_fields_from_puppet_classes.rb +9 -0
- data/test/foreman_app/db/migrate/20110417102947_add_table_bookmarks.rb +31 -0
- data/test/foreman_app/db/migrate/20110420150600_add_solaris_templates.rb +42 -0
- data/test/foreman_app/db/migrate/20110613141800_add_solaris_disks.rb +16 -0
- data/test/foreman_app/db/migrate/20110616080444_add_look_up_key_id_to_puppet_class.rb +28 -0
- data/test/foreman_app/db/migrate/20110617190131_add_sparc_info_to_model.rb +11 -0
- data/test/foreman_app/db/migrate/20110619130336_add_ancestry_to_hostgroup.rb +11 -0
- data/test/foreman_app/db/migrate/20110628115422_create_settings.rb +18 -0
- data/test/foreman_app/db/migrate/20110712064120_update_audits_table.rb +16 -0
- data/test/foreman_app/db/migrate/20110712070522_create_host_class.rb +11 -0
- data/test/foreman_app/db/migrate/20110725142054_add_suse_templates.rb +46 -0
- data/test/foreman_app/db/migrate/20110801090318_add_vm_defaults_to_hostgroup.rb +9 -0
- data/test/foreman_app/db/migrate/20110803114134_add_subnet_and_domain_to_host_groups.rb +11 -0
- data/test/foreman_app/db/migrate/20111124095053_rename_changes_to_audited_changes.rb +9 -0
- data/test/foreman_app/db/migrate/20111124095054_add_remote_address_to_audits.rb +10 -0
- data/test/foreman_app/db/migrate/20111124095055_rename_parent_to_association.rb +11 -0
- data/test/foreman_app/db/migrate/20111205231500_add_gateway_and_dns_to_subnets.rb +13 -0
- data/test/foreman_app/db/migrate/20111227095806_ensure_all_hostnames_are_lowercase.rb +9 -0
- data/test/foreman_app/db/migrate/20120102071633_add_from_and_to_ranges_to_subnets.rb +13 -0
- data/test/foreman_app/db/migrate/20120110113051_create_subnet_domain.rb +21 -0
- data/test/foreman_app/db/migrate/20120122131037_create_compute_resources.rb +19 -0
- data/test/foreman_app/db/migrate/20120126113850_add_uuid_and_compute_id_to_host.rb +11 -0
- data/test/foreman_app/db/migrate/20120127141602_add_windows_templates.rb +47 -0
- data/test/foreman_app/db/migrate/20120311081257_create_nics.rb +52 -0
- data/test/foreman_app/db/migrate/20120313081913_add_puppet_master_proxy_to_host_and_host_group.rb +41 -0
- data/test/foreman_app/db/migrate/20120502105518_update_report_field_to_large_int.rb +9 -0
- data/test/foreman_app/db/migrate/20120506143325_create_images.rb +18 -0
- data/test/foreman_app/db/migrate/20120509131302_add_cert_name_to_host.rb +12 -0
- data/test/foreman_app/db/migrate/20120510113417_create_key_pairs.rb +15 -0
- data/test/foreman_app/db/migrate/20120521142924_add_dns_id_to_subnet.rb +9 -0
- data/test/foreman_app/db/migrate/20120523065531_add_image_id_to_host.rb +9 -0
- data/test/foreman_app/db/migrate/20120529113900_add_user_compute_resources.rb +14 -0
- data/test/foreman_app/db/migrate/20120529115814_add_compute_resources_boolean_to_user.rb +9 -0
- data/test/foreman_app/db/migrate/20120604114049_add_epel_snippets.rb +10 -0
- data/test/foreman_app/db/migrate/20120607074318_convert_params_to_text.rb +11 -0
- data/test/foreman_app/db/migrate/20120612070100_change_bookmark_column_to_text.rb +10 -0
- data/test/foreman_app/db/migrate/20120613082125_rename_association_to_associated.rb +25 -0
- data/test/foreman_app/db/migrate/20120620124658_fix_auditable_type.rb +9 -0
- data/test/foreman_app/db/migrate/20120620124659_fix_associated_type.rb +9 -0
- data/test/foreman_app/db/migrate/20120621135042_create_taxonomies.rb +14 -0
- data/test/foreman_app/db/migrate/20120623002052_add_ok_hosts_book_mark.rb +13 -0
- data/test/foreman_app/db/migrate/20120624081510_add_auditable_name_and_associated_name_to_audit.rb +29 -0
- data/test/foreman_app/db/migrate/20120624093958_add_os_family_to_media.rb +14 -0
- data/test/foreman_app/db/migrate/20120624094034_add_os_family_to_ptable.rb +17 -0
- data/test/foreman_app/db/migrate/20120705130038_add_attributes_to_compute_resources.rb +9 -0
- data/test/foreman_app/db/migrate/20120824142048_add_some_indexes.rb +23 -0
- data/test/foreman_app/db/migrate/20120905095532_create_environment_classes.rb +16 -0
- data/test/foreman_app/db/migrate/20120905131841_add_lookup_keys_override_and_required.rb +15 -0
- data/test/foreman_app/db/migrate/20120916080843_add_lookup_values_count_to_lookup_keys.rb +9 -0
- data/test/foreman_app/db/migrate/20120916080926_cache_lookup_values_count.rb +8 -0
- data/test/foreman_app/db/migrate/20120921000313_add_iam_role_to_images.rb +9 -0
- data/test/foreman_app/db/migrate/20120921105349_create_tokens.rb +15 -0
- data/test/foreman_app/db/migrate/20120927020752_add_bmc_feature_to_proxy.rb +8 -0
- data/test/foreman_app/db/migrate/20121003172526_add_taxonomy_ids_to_hosts.rb +11 -0
- data/test/foreman_app/db/migrate/20121011115320_change_domain_character_count.rb +9 -0
- data/test/foreman_app/db/migrate/20121012170851_create_trends.rb +25 -0
- data/test/foreman_app/db/migrate/20121012170936_create_trend_counters.rb +16 -0
- data/test/foreman_app/db/migrate/20121015113502_update_media_path_limit.rb +9 -0
- data/test/foreman_app/db/migrate/20121018152459_create_hostgroup_classes.rb +11 -0
- data/test/foreman_app/db/migrate/20121026160433_add_localboot_template.rb +15 -0
- data/test/foreman_app/db/migrate/20121029164911_rename_reply_adress_setting.rb +9 -0
- data/test/foreman_app/db/migrate/20121101141448_add_locations_organizations.rb +12 -0
- data/test/foreman_app/db/migrate/20121118120028_migrate_hypervisors_to_compute_resources.rb +20 -0
- data/test/foreman_app/db/migrate/20121118125341_create_taxable_taxonomies.rb +19 -0
- data/test/foreman_app/db/migrate/20121119102104_add_my_taxonomy_to_user.rb +11 -0
- data/test/foreman_app/db/migrate/20121218084123_change_smart_variable_length.rb +9 -0
- data/test/foreman_app/db/migrate/20121219040534_remove_replay_address_setting.rb +8 -0
- data/test/foreman_app/db/migrate/20130109155024_add_ignore_types_to_taxonomy.rb +9 -0
- data/test/foreman_app/db/migrate/20130121130826_add_digest_to_messages.rb +18 -0
- data/test/foreman_app/db/migrate/20130211160200_add_sti_to_hosts.rb +11 -0
- data/test/foreman_app/db/migrate/20130228145456_add_digest_to_sources.rb +22 -0
- data/test/foreman_app/db/migrate/20130329195742_remove_duplicate_snippets.rb +20 -0
- data/test/foreman_app/db/migrate/20130409081924_add_label_to_host_group.rb +18 -0
- data/test/foreman_app/db/migrate/20130417110127_add_sti_to_settings.rb +17 -0
- data/test/foreman_app/db/migrate/20130418134513_fix_sti_host_auditable_type.rb +9 -0
- data/test/foreman_app/db/migrate/20130419145808_add_id_to_user_hostgroup.rb +9 -0
- data/test/foreman_app/db/schema.rb +746 -0
- data/test/foreman_app/db/seeds.rb +9 -0
- data/test/foreman_app/db/test.sqlite3 +0 -0
- data/test/foreman_app/doc/README_FOR_APP +2 -0
- data/test/foreman_app/doc/apipie_examples.yml +4645 -0
- data/test/foreman_app/extras/changelog +39 -0
- data/test/foreman_app/extras/ci/migration.sh +64 -0
- data/test/foreman_app/extras/ci/setup.sh +19 -0
- data/test/foreman_app/extras/cli/foremancli +210 -0
- data/test/foreman_app/extras/dbmigrate +10 -0
- data/test/foreman_app/extras/foreman-release.spec +41 -0
- data/test/foreman_app/extras/foreman.repo +11 -0
- data/test/foreman_app/extras/git2nightly_snapshot +9 -0
- data/test/foreman_app/extras/git2release +22 -0
- data/test/foreman_app/extras/ignored_environments.yml.sample +10 -0
- data/test/foreman_app/extras/jumpstart/README +2 -0
- data/test/foreman_app/extras/jumpstart/admin +11 -0
- data/test/foreman_app/extras/jumpstart/curl +0 -0
- data/test/foreman_app/extras/jumpstart/curl-license +22 -0
- data/test/foreman_app/extras/jumpstart/curl.i386 +0 -0
- data/test/foreman_app/extras/jumpstart/curl.sparc +0 -0
- data/test/foreman_app/extras/jumpstart/dynamic_finish +18 -0
- data/test/foreman_app/extras/jumpstart/dynamic_profile +17 -0
- data/test/foreman_app/extras/jumpstart/nsswitch.conf +34 -0
- data/test/foreman_app/extras/jumpstart/rules +1 -0
- data/test/foreman_app/extras/jumpstart/rules.ok +2 -0
- data/test/foreman_app/extras/jumpstart/sysidcfg/sysidcfg_primary/sysidcfg +12 -0
- data/test/foreman_app/extras/noVNC/websockify.py +5 -0
- data/test/foreman_app/extras/noVNC/websockify/__init__.py +2 -0
- data/test/foreman_app/extras/noVNC/websockify/websocket.py +982 -0
- data/test/foreman_app/extras/noVNC/websockify/websocketproxy.py +393 -0
- data/test/foreman_app/extras/packaging/rpm/rel-eng/comps/comps-foreman-fedora18.xml +76 -0
- data/test/foreman_app/extras/packaging/rpm/rel-eng/comps/comps-foreman-rhel6.xml +115 -0
- data/test/foreman_app/extras/packaging/rpm/rel-eng/packages/foreman +1 -0
- data/test/foreman_app/extras/packaging/rpm/rel-eng/releasers.conf +59 -0
- data/test/foreman_app/extras/packaging/rpm/rel-eng/tito.props +3 -0
- data/test/foreman_app/extras/packaging/rpm/sources/0001-rubygem-actionmailer-fix-dep-versions.patch +19 -0
- data/test/foreman_app/extras/packaging/rpm/sources/foreman.cron.d +27 -0
- data/test/foreman_app/extras/packaging/rpm/sources/foreman.init +154 -0
- data/test/foreman_app/extras/packaging/rpm/sources/foreman.logrotate +10 -0
- data/test/foreman_app/extras/packaging/rpm/sources/foreman.repo +11 -0
- data/test/foreman_app/extras/packaging/rpm/sources/foreman.spec-devel.patch +55 -0
- data/test/foreman_app/extras/packaging/rpm/sources/foreman.sysconfig +21 -0
- data/test/foreman_app/extras/query/ssh_using_foreman +136 -0
- data/test/foreman_app/extras/rdoc/rdoc_prepare_script.rb +51 -0
- data/test/foreman_app/foreman.spec +621 -0
- data/test/foreman_app/lib/api/api_responder.rb +17 -0
- data/test/foreman_app/lib/api/authorization.rb +78 -0
- data/test/foreman_app/lib/api/version1.rb +7 -0
- data/test/foreman_app/lib/api/version2.rb +7 -0
- data/test/foreman_app/lib/api_constraints.rb +15 -0
- data/test/foreman_app/lib/audit_extensions.rb +63 -0
- data/test/foreman_app/lib/core_extensions.rb +100 -0
- data/test/foreman_app/lib/fog_extensions.rb +45 -0
- data/test/foreman_app/lib/fog_extensions/aws/flavor.rb +9 -0
- data/test/foreman_app/lib/fog_extensions/aws/server.rb +18 -0
- data/test/foreman_app/lib/fog_extensions/libvirt/server.rb +24 -0
- data/test/foreman_app/lib/fog_extensions/model.rb +27 -0
- data/test/foreman_app/lib/fog_extensions/openstack/flavor.rb +13 -0
- data/test/foreman_app/lib/fog_extensions/openstack/server.rb +40 -0
- data/test/foreman_app/lib/fog_extensions/ovirt/server.rb +15 -0
- data/test/foreman_app/lib/fog_extensions/ovirt/volume.rb +11 -0
- data/test/foreman_app/lib/fog_extensions/vsphere/folder.rb +14 -0
- data/test/foreman_app/lib/fog_extensions/vsphere/mini_server.rb +20 -0
- data/test/foreman_app/lib/fog_extensions/vsphere/mini_servers.rb +22 -0
- data/test/foreman_app/lib/fog_extensions/vsphere/server.rb +19 -0
- data/test/foreman_app/lib/foreman.rb +14 -0
- data/test/foreman_app/lib/foreman/access_control.rb +120 -0
- data/test/foreman_app/lib/foreman/access_permissions.rb +572 -0
- data/test/foreman_app/lib/foreman/controller.rb +2 -0
- data/test/foreman_app/lib/foreman/controller/auto_complete_search.rb +23 -0
- data/test/foreman_app/lib/foreman/controller/environments.rb +36 -0
- data/test/foreman_app/lib/foreman/controller/host_details.rb +69 -0
- data/test/foreman_app/lib/foreman/controller/smart_proxy_auth.rb +68 -0
- data/test/foreman_app/lib/foreman/controller/taxonomies_controller.rb +178 -0
- data/test/foreman_app/lib/foreman/controller/taxonomy_multiple.rb +56 -0
- data/test/foreman_app/lib/foreman/default_data/loader.rb +166 -0
- data/test/foreman_app/lib/foreman/exception.rb +37 -0
- data/test/foreman_app/lib/foreman/importer_puppetclass.rb +48 -0
- data/test/foreman_app/lib/foreman/model.rb +2 -0
- data/test/foreman_app/lib/foreman/model/ec2.rb +128 -0
- data/test/foreman_app/lib/foreman/model/libvirt.rb +150 -0
- data/test/foreman_app/lib/foreman/model/openstack.rb +130 -0
- data/test/foreman_app/lib/foreman/model/ovirt.rb +250 -0
- data/test/foreman_app/lib/foreman/model/rackspace.rb +108 -0
- data/test/foreman_app/lib/foreman/model/vmware.rb +181 -0
- data/test/foreman_app/lib/foreman/provision.rb +3 -0
- data/test/foreman_app/lib/foreman/provision/ssh.rb +102 -0
- data/test/foreman_app/lib/foreman/renderer.rb +68 -0
- data/test/foreman_app/lib/foreman/sti.rb +30 -0
- data/test/foreman_app/lib/foreman/thread_session.rb +163 -0
- data/test/foreman_app/lib/foreman/util.rb +25 -0
- data/test/foreman_app/lib/foreman/wrapped_exception.rb +23 -0
- data/test/foreman_app/lib/net.rb +50 -0
- data/test/foreman_app/lib/net/dhcp.rb +6 -0
- data/test/foreman_app/lib/net/dhcp/record.rb +56 -0
- data/test/foreman_app/lib/net/dhcp/sparc_record.rb +25 -0
- data/test/foreman_app/lib/net/dns.rb +78 -0
- data/test/foreman_app/lib/net/dns/a_record.rb +47 -0
- data/test/foreman_app/lib/net/dns/ptr_record.rb +52 -0
- data/test/foreman_app/lib/net/validations.rb +47 -0
- data/test/foreman_app/lib/orchestration/queue.rb +58 -0
- data/test/foreman_app/lib/proxy_api.rb +6 -0
- data/test/foreman_app/lib/proxy_api/bmc.rb +120 -0
- data/test/foreman_app/lib/proxy_api/dhcp.rb +70 -0
- data/test/foreman_app/lib/proxy_api/dns.rb +26 -0
- data/test/foreman_app/lib/proxy_api/features.rb +12 -0
- data/test/foreman_app/lib/proxy_api/puppet.rb +28 -0
- data/test/foreman_app/lib/proxy_api/puppetca.rb +38 -0
- data/test/foreman_app/lib/proxy_api/resource.rb +90 -0
- data/test/foreman_app/lib/proxy_api/tftp.rb +54 -0
- data/test/foreman_app/lib/puppet_setting.rb +69 -0
- data/test/foreman_app/lib/regexp_extensions.rb +14 -0
- data/test/foreman_app/lib/sso.rb +13 -0
- data/test/foreman_app/lib/sso/apache.rb +16 -0
- data/test/foreman_app/lib/sso/base.rb +27 -0
- data/test/foreman_app/lib/sso/signo.rb +60 -0
- data/test/foreman_app/lib/task.rb +39 -0
- data/test/foreman_app/lib/tasks/convert.rake +127 -0
- data/test/foreman_app/lib/tasks/exception.rake +32 -0
- data/test/foreman_app/lib/tasks/gettext.rake +9 -0
- data/test/foreman_app/lib/tasks/hosts.rake +67 -0
- data/test/foreman_app/lib/tasks/jenkins.rake +19 -0
- data/test/foreman_app/lib/tasks/load_default_data.rake +16 -0
- data/test/foreman_app/lib/tasks/locale.rake +43 -0
- data/test/foreman_app/lib/tasks/model.rake +83 -0
- data/test/foreman_app/lib/tasks/patches.rake +19 -0
- data/test/foreman_app/lib/tasks/pkg.rake +19 -0
- data/test/foreman_app/lib/tasks/puppet.rake +178 -0
- data/test/foreman_app/lib/tasks/reports.rake +82 -0
- data/test/foreman_app/lib/tasks/reset_permissions.rake +20 -0
- data/test/foreman_app/lib/tasks/security.rake +21 -0
- data/test/foreman_app/lib/tasks/smartproxy.rake +58 -0
- data/test/foreman_app/lib/tasks/test_api_dir.rake +10 -0
- data/test/foreman_app/lib/tasks/test_lib_dir.rake +14 -0
- data/test/foreman_app/lib/tasks/trends.rake +32 -0
- data/test/foreman_app/lib/timed_cached_store.rb +55 -0
- data/test/foreman_app/lib/ws_proxy.rb +78 -0
- data/test/foreman_app/locale/Makefile +54 -0
- data/test/foreman_app/locale/README +26 -0
- data/test/foreman_app/locale/de/foreman.po +4477 -0
- data/test/foreman_app/locale/en/foreman.po +4198 -0
- data/test/foreman_app/locale/es/foreman.po +4494 -0
- data/test/foreman_app/locale/foreman.pot +4198 -0
- data/test/foreman_app/locale/ja/foreman.po +4215 -0
- data/test/foreman_app/locale/model_attributes.rb +442 -0
- data/test/foreman_app/log/test.log +36021 -0
- data/test/foreman_app/public/404.html +26 -0
- data/test/foreman_app/public/422.html +26 -0
- data/test/foreman_app/public/500.html +26 -0
- data/test/foreman_app/public/blank.html +33 -0
- data/test/foreman_app/public/favicon.ico +0 -0
- data/test/foreman_app/public/robots.txt +5 -0
- data/test/foreman_app/script/foreman-config +147 -0
- data/test/foreman_app/script/performance/benchmarker +3 -0
- data/test/foreman_app/script/performance/profiler +3 -0
- data/test/foreman_app/script/rails +6 -0
- data/test/foreman_app/script/show-missing-rails-locales.sh +25 -0
- data/test/foreman_app/script/update-rails-locales.sh +16 -0
- data/test/foreman_app/test/fixtures/architectures.yml +10 -0
- data/test/foreman_app/test/fixtures/audits.yml +18 -0
- data/test/foreman_app/test/fixtures/auth_sources.yml +20 -0
- data/test/foreman_app/test/fixtures/bookmarks.yml +13 -0
- data/test/foreman_app/test/fixtures/brslc022.facts.yaml +68 -0
- data/test/foreman_app/test/fixtures/compute_resources.yml +28 -0
- data/test/foreman_app/test/fixtures/config_templates.yml +47 -0
- data/test/foreman_app/test/fixtures/domains.yml +18 -0
- data/test/foreman_app/test/fixtures/environment_classes.yml +15 -0
- data/test/foreman_app/test/fixtures/environments.yml +10 -0
- data/test/foreman_app/test/fixtures/fact_names.yml +5 -0
- data/test/foreman_app/test/fixtures/fact_values.yml +11 -0
- data/test/foreman_app/test/fixtures/features.yml +23 -0
- data/test/foreman_app/test/fixtures/host_classes.yml +9 -0
- data/test/foreman_app/test/fixtures/hostgroup_classes.yml +9 -0
- data/test/foreman_app/test/fixtures/hostgroups.yml +24 -0
- data/test/foreman_app/test/fixtures/hosts.yml +198 -0
- data/test/foreman_app/test/fixtures/images.yml +16 -0
- data/test/foreman_app/test/fixtures/key_pairs.yml +7 -0
- data/test/foreman_app/test/fixtures/logs.yml +11 -0
- data/test/foreman_app/test/fixtures/lookup_keys.yml +32 -0
- data/test/foreman_app/test/fixtures/media.yml +25 -0
- data/test/foreman_app/test/fixtures/messages.yml +7 -0
- data/test/foreman_app/test/fixtures/models.yml +10 -0
- data/test/foreman_app/test/fixtures/notices.yml +7 -0
- data/test/foreman_app/test/fixtures/operatingsystems.yml +49 -0
- data/test/foreman_app/test/fixtures/os_default_templates.yml +21 -0
- data/test/foreman_app/test/fixtures/parameters.yml +30 -0
- data/test/foreman_app/test/fixtures/ptables.yml +17 -0
- data/test/foreman_app/test/fixtures/puppetclasses.yml +13 -0
- data/test/foreman_app/test/fixtures/report-2.6.12-noops.yaml +627 -0
- data/test/foreman_app/test/fixtures/report-2.6.5-errors.yaml +60 -0
- data/test/foreman_app/test/fixtures/report-2.6.5.yaml +413 -0
- data/test/foreman_app/test/fixtures/report-3.0.1.yaml +283 -0
- data/test/foreman_app/test/fixtures/report-applied.yaml +86 -0
- data/test/foreman_app/test/fixtures/report-empty.yaml +31 -0
- data/test/foreman_app/test/fixtures/report-errors.yaml +66 -0
- data/test/foreman_app/test/fixtures/report-skipped.yaml +86 -0
- data/test/foreman_app/test/fixtures/reports.yml +13 -0
- data/test/foreman_app/test/fixtures/roles.yml +198 -0
- data/test/foreman_app/test/fixtures/sample_http_preseed_template +66 -0
- data/test/foreman_app/test/fixtures/sample_tokenised_template +66 -0
- data/test/foreman_app/test/fixtures/settings.yml +176 -0
- data/test/foreman_app/test/fixtures/smart_proxies.yml +23 -0
- data/test/foreman_app/test/fixtures/sources.yml +7 -0
- data/test/foreman_app/test/fixtures/subnet_domains.yml +9 -0
- data/test/foreman_app/test/fixtures/subnets.yml +26 -0
- data/test/foreman_app/test/fixtures/taxable_taxonomies.yml +15 -0
- data/test/foreman_app/test/fixtures/taxonomies.yml +15 -0
- data/test/foreman_app/test/fixtures/template_combinations.yml +19 -0
- data/test/foreman_app/test/fixtures/template_kinds.yml +14 -0
- data/test/foreman_app/test/fixtures/trend_counters.yml +9 -0
- data/test/foreman_app/test/fixtures/trends.yml +9 -0
- data/test/foreman_app/test/fixtures/trends_controller_test.rb +8 -0
- data/test/foreman_app/test/fixtures/user_facts.yml +7 -0
- data/test/foreman_app/test/fixtures/usergroups.yml +7 -0
- data/test/foreman_app/test/fixtures/users.yml +52 -0
- data/test/foreman_app/test/functional/api/v1/architectures_controller_test.rb +79 -0
- data/test/foreman_app/test/functional/api/v1/audits_controller_test.rb +20 -0
- data/test/foreman_app/test/functional/api/v1/auth_source_ldaps_controller_test.rb +41 -0
- data/test/foreman_app/test/functional/api/v1/bookmarks_controller_test.rb +60 -0
- data/test/foreman_app/test/functional/api/v1/common_parameters_controller_test.rb +41 -0
- data/test/foreman_app/test/functional/api/v1/compute_resources_controller_test.rb +50 -0
- data/test/foreman_app/test/functional/api/v1/config_templates_controller_test.rb +82 -0
- data/test/foreman_app/test/functional/api/v1/dashboard_controller_test.rb +12 -0
- data/test/foreman_app/test/functional/api/v1/domains_controller_test.rb +50 -0
- data/test/foreman_app/test/functional/api/v1/environments_controller_test.rb +40 -0
- data/test/foreman_app/test/functional/api/v1/fact_values_controller_test.rb +19 -0
- data/test/foreman_app/test/functional/api/v1/home_controller_test.rb +11 -0
- data/test/foreman_app/test/functional/api/v1/hostgroups_controller_test.rb +41 -0
- data/test/foreman_app/test/functional/api/v1/hosts_controller_test.rb +66 -0
- data/test/foreman_app/test/functional/api/v1/images_controller_test.rb +47 -0
- data/test/foreman_app/test/functional/api/v1/lookup_keys_controller_test.rb +41 -0
- data/test/foreman_app/test/functional/api/v1/media_controller_test.rb +48 -0
- data/test/foreman_app/test/functional/api/v1/models_controller_test.rb +43 -0
- data/test/foreman_app/test/functional/api/v1/operatingsystems_controller_test.rb +55 -0
- data/test/foreman_app/test/functional/api/v1/ptables_controller_test.rb +48 -0
- data/test/foreman_app/test/functional/api/v1/puppetclasses_controller_test.rb +40 -0
- data/test/foreman_app/test/functional/api/v1/reports_controller_test.rb +66 -0
- data/test/foreman_app/test/functional/api/v1/roles_controller_test.rb +41 -0
- data/test/foreman_app/test/functional/api/v1/settings_controller_test.rb +25 -0
- data/test/foreman_app/test/functional/api/v1/smart_proxies_controller_test.rb +72 -0
- data/test/foreman_app/test/functional/api/v1/subnets_controller_test.rb +58 -0
- data/test/foreman_app/test/functional/api/v1/template_kinds_controller_test.rb +11 -0
- data/test/foreman_app/test/functional/api/v1/usergroups_controller_test.rb +41 -0
- data/test/foreman_app/test/functional/api/v1/users_controller_test.rb +137 -0
- data/test/foreman_app/test/functional/api/v2/config_templates_controller_test.rb +80 -0
- data/test/foreman_app/test/functional/api/v2/domains_controller_test.rb +32 -0
- data/test/foreman_app/test/functional/api/v2/host_classes_controller_test.rb +29 -0
- data/test/foreman_app/test/functional/api/v2/hostgroup_class_controller_test.rb +29 -0
- data/test/foreman_app/test/functional/api/v2/locations_controller_test.rb +85 -0
- data/test/foreman_app/test/functional/api/v2/parameters_controller_test.rb +180 -0
- data/test/foreman_app/test/functional/api/v2/puppetclasses_controller_test.rb +103 -0
- data/test/foreman_app/test/functional/api/v2/template_combinations_controller_test.rb +38 -0
- data/test/foreman_app/test/functional/architectures_controller_test.rb +97 -0
- data/test/foreman_app/test/functional/audits_controller_test.rb +29 -0
- data/test/foreman_app/test/functional/auth_source_ldaps_controller_test.rb +66 -0
- data/test/foreman_app/test/functional/bookmarks_controller_test.rb +51 -0
- data/test/foreman_app/test/functional/common_parameters_controller_test.rb +69 -0
- data/test/foreman_app/test/functional/compute_resources_controller_test.rb +157 -0
- data/test/foreman_app/test/functional/compute_resources_vms_controller_test.rb +160 -0
- data/test/foreman_app/test/functional/config_templates_controller_test.rb +132 -0
- data/test/foreman_app/test/functional/dashboard_controller_test.rb +38 -0
- data/test/foreman_app/test/functional/domains_controller_test.rb +101 -0
- data/test/foreman_app/test/functional/environments_controller_test.rb +234 -0
- data/test/foreman_app/test/functional/fact_values_controller_test.rb +138 -0
- data/test/foreman_app/test/functional/facts_controller_test.rb +12 -0
- data/test/foreman_app/test/functional/home_controller_test.rb +9 -0
- data/test/foreman_app/test/functional/hostgroups_controller_test.rb +125 -0
- data/test/foreman_app/test/functional/hosts_controller_test.rb +830 -0
- data/test/foreman_app/test/functional/images_controller_test.rb +55 -0
- data/test/foreman_app/test/functional/locations_controller_test.rb +149 -0
- data/test/foreman_app/test/functional/lookup_keys_controller_test.rb +43 -0
- data/test/foreman_app/test/functional/lookup_values_controller_test.rb +8 -0
- data/test/foreman_app/test/functional/media_controller_test.rb +95 -0
- data/test/foreman_app/test/functional/models_controller_test.rb +66 -0
- data/test/foreman_app/test/functional/notices_controller_test.rb +36 -0
- data/test/foreman_app/test/functional/operatingsystems_controller_test.rb +104 -0
- data/test/foreman_app/test/functional/organizations_controller_test.rb +148 -0
- data/test/foreman_app/test/functional/ptables_controller_test.rb +142 -0
- data/test/foreman_app/test/functional/puppetclasses_controller_test.rb +66 -0
- data/test/foreman_app/test/functional/reports_controller_test.rb +191 -0
- data/test/foreman_app/test/functional/roles_controller_test.rb +124 -0
- data/test/foreman_app/test/functional/settings_controller_test.rb +34 -0
- data/test/foreman_app/test/functional/smart_proxies/autosign_controller_test.rb +8 -0
- data/test/foreman_app/test/functional/smart_proxies/puppetca_controller_test.rb +8 -0
- data/test/foreman_app/test/functional/smart_proxies_controller_test.rb +85 -0
- data/test/foreman_app/test/functional/statistics_controller_test.rb +21 -0
- data/test/foreman_app/test/functional/subnets_controller_test.rb +89 -0
- data/test/foreman_app/test/functional/tasks_controller_test.rb +8 -0
- data/test/foreman_app/test/functional/unattended_controller_test.rb +141 -0
- data/test/foreman_app/test/functional/usergroups_controller_test.rb +66 -0
- data/test/foreman_app/test/functional/users_controller_test.rb +147 -0
- data/test/foreman_app/test/lib/foreman/access_permissions_test.rb +50 -0
- data/test/foreman_app/test/lib/foreman/default_settings/loader_test.rb +39 -0
- data/test/foreman_app/test/lib/foreman/model/ovirt_test.rb +72 -0
- data/test/foreman_app/test/lib/foreman/renderer_test.rb +32 -0
- data/test/foreman_app/test/lib/foreman/util_test.rb +40 -0
- data/test/foreman_app/test/lib/net/dhcp_test.rb +39 -0
- data/test/foreman_app/test/lib/net/net_test.rb +21 -0
- data/test/foreman_app/test/lib/net/validations_test.rb +19 -0
- data/test/foreman_app/test/lib/proxy_api/bmc_test.rb +256 -0
- data/test/foreman_app/test/lib/proxy_api/dhcp_test.rb +60 -0
- data/test/foreman_app/test/lib/puppet_setting_test.rb +92 -0
- data/test/foreman_app/test/performance/browsing_test.rb +9 -0
- data/test/foreman_app/test/test_helper.rb +164 -0
- data/test/foreman_app/test/unit/architecture_test.rb +106 -0
- data/test/foreman_app/test/unit/auth_source_ldap_test.rb +205 -0
- data/test/foreman_app/test/unit/auth_source_test.rb +34 -0
- data/test/foreman_app/test/unit/bookmark_test.rb +32 -0
- data/test/foreman_app/test/unit/classification_test.rb +46 -0
- data/test/foreman_app/test/unit/common_parameter_test.rb +100 -0
- data/test/foreman_app/test/unit/compute_resource_test.rb +88 -0
- data/test/foreman_app/test/unit/config_template_test.rb +67 -0
- data/test/foreman_app/test/unit/domain_parameter_test.rb +106 -0
- data/test/foreman_app/test/unit/domain_test.rb +161 -0
- data/test/foreman_app/test/unit/environment_class_test.rb +9 -0
- data/test/foreman_app/test/unit/environment_test.rb +35 -0
- data/test/foreman_app/test/unit/fact_value_test.rb +25 -0
- data/test/foreman_app/test/unit/facts.yml +91 -0
- data/test/foreman_app/test/unit/facts_importer_test.rb +50 -0
- data/test/foreman_app/test/unit/facts_with_caps.yml +91 -0
- data/test/foreman_app/test/unit/feature_test.rb +8 -0
- data/test/foreman_app/test/unit/group_parameter_test.rb +108 -0
- data/test/foreman_app/test/unit/helpers/architecture_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/audit_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/auth_sources_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/bookmarks_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/compute_resources_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/dashboard_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/domain_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/environments_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/fact_values_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/home_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/host_groups_helper_test.rb +14 -0
- data/test/foreman_app/test/unit/helpers/hosts_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/images_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/lookup_keys_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/medium_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/model_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/operatingsystem_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/parameters_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/ptables_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/puppetclasses_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/reports_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/smart_proxies/autosign_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/smart_proxies/puppetca_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/statistics_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/tasks_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/trends_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/unattended_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/usergroups_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/helpers/users_helper_test.rb +4 -0
- data/test/foreman_app/test/unit/host_class_test.rb +8 -0
- data/test/foreman_app/test/unit/host_mailer_test.rb +70 -0
- data/test/foreman_app/test/unit/host_observer_test.rb +35 -0
- data/test/foreman_app/test/unit/host_parameter_test.rb +119 -0
- data/test/foreman_app/test/unit/host_test.rb +606 -0
- data/test/foreman_app/test/unit/hostgroup_class_test.rb +11 -0
- data/test/foreman_app/test/unit/hostgroup_test.rb +178 -0
- data/test/foreman_app/test/unit/image_test.rb +5 -0
- data/test/foreman_app/test/unit/key_pair_test.rb +4 -0
- data/test/foreman_app/test/unit/location_test.rb +162 -0
- data/test/foreman_app/test/unit/log_test.rb +8 -0
- data/test/foreman_app/test/unit/lookup_key_test.rb +88 -0
- data/test/foreman_app/test/unit/medium_test.rb +120 -0
- data/test/foreman_app/test/unit/message_test.rb +8 -0
- data/test/foreman_app/test/unit/model_test.rb +90 -0
- data/test/foreman_app/test/unit/nic_test.rb +49 -0
- data/test/foreman_app/test/unit/notice_test.rb +19 -0
- data/test/foreman_app/test/unit/operatingsystem_test.rb +139 -0
- data/test/foreman_app/test/unit/orchestration/dhcp_test.rb +161 -0
- data/test/foreman_app/test/unit/orchestration/dns_test.rb +54 -0
- data/test/foreman_app/test/unit/orchestration/pxe_local_template +11 -0
- data/test/foreman_app/test/unit/orchestration/pxe_template +4 -0
- data/test/foreman_app/test/unit/orchestration/tftp_test.rb +49 -0
- data/test/foreman_app/test/unit/orchestration_test.rb +25 -0
- data/test/foreman_app/test/unit/organization_test.rb +163 -0
- data/test/foreman_app/test/unit/os_default_template_test.rb +8 -0
- data/test/foreman_app/test/unit/parameter_test.rb +44 -0
- data/test/foreman_app/test/unit/ptable_test.rb +119 -0
- data/test/foreman_app/test/unit/puppet_class_importer_test.rb +67 -0
- data/test/foreman_app/test/unit/puppetclass_test.rb +90 -0
- data/test/foreman_app/test/unit/report_test.rb +196 -0
- data/test/foreman_app/test/unit/role_test.rb +104 -0
- data/test/foreman_app/test/unit/setting_test.rb +158 -0
- data/test/foreman_app/test/unit/smart_proxy_test.rb +27 -0
- data/test/foreman_app/test/unit/source_test.rb +8 -0
- data/test/foreman_app/test/unit/sso.rb +26 -0
- data/test/foreman_app/test/unit/sso/apache_test.rb +38 -0
- data/test/foreman_app/test/unit/sso/base_test.rb +14 -0
- data/test/foreman_app/test/unit/sso/signo_test.rb +81 -0
- data/test/foreman_app/test/unit/subnet_domain_test.rb +8 -0
- data/test/foreman_app/test/unit/subnet_test.rb +182 -0
- data/test/foreman_app/test/unit/suse_test.rb +46 -0
- data/test/foreman_app/test/unit/taxable_taxonomy_test.rb +8 -0
- data/test/foreman_app/test/unit/template_combination_test.rb +8 -0
- data/test/foreman_app/test/unit/template_kind_test.rb +8 -0
- data/test/foreman_app/test/unit/token_test.rb +67 -0
- data/test/foreman_app/test/unit/trend_counter_test.rb +8 -0
- data/test/foreman_app/test/unit/trend_test.rb +8 -0
- data/test/foreman_app/test/unit/user_fact_test.rb +8 -0
- data/test/foreman_app/test/unit/user_test.rb +196 -0
- data/test/foreman_app/test/unit/usergroup_test.rb +161 -0
- data/test/foreman_app/tmp/cache/505/030/idle_timeout +1 -0
- data/test/foreman_app/tmp/cache/505/C00/use_gravatar +1 -0
- data/test/foreman_app/tmp/cache/7D9/CD0/email_reply_address +1 -0
- data/test/foreman_app/tmp/cache/94D/A30/discovery_organization +1 -0
- data/test/foreman_app/tmp/cache/ACF/DB0/authorize_login_delegation +1 -0
- data/test/foreman_app/tmp/secret_token +1 -0
- data/test/foreman_app/vendor/assets/fonts/overpass_bold-web.eot +0 -0
- data/test/foreman_app/vendor/assets/fonts/overpass_bold-web.svg +470 -0
- data/test/foreman_app/vendor/assets/fonts/overpass_bold-web.ttf +0 -0
- data/test/foreman_app/vendor/assets/fonts/overpass_bold-web.woff +0 -0
- data/test/foreman_app/vendor/assets/fonts/overpass_regular-web.eot +0 -0
- data/test/foreman_app/vendor/assets/fonts/overpass_regular-web.svg +470 -0
- data/test/foreman_app/vendor/assets/fonts/overpass_regular-web.ttf +0 -0
- data/test/foreman_app/vendor/assets/fonts/overpass_regular-web.woff +0 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/ace.js +10 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/cockpit.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/ext-static_highlight.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/ext-textarea.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/keybinding-emacs.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/keybinding-vim.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/mode-diff.js +165 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/mode-ruby.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/mode-sh.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/theme-clouds.js +137 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/theme-dawn.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/theme-textmate.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/theme-twilight.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/worker-coffee.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/worker-css.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/worker-javascript.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/worker-json.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/ace/worker-xquery.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/background-size.htc +7 -0
- data/test/foreman_app/vendor/assets/javascripts/diff.js +296 -0
- data/test/foreman_app/vendor/assets/javascripts/flot.js +5 -0
- data/test/foreman_app/vendor/assets/javascripts/jquery.cookie.js +91 -0
- data/test/foreman_app/vendor/assets/javascripts/jquery.dataTables.bootstrap-paging.js +101 -0
- data/test/foreman_app/vendor/assets/javascripts/jquery.dataTables.min.js +155 -0
- data/test/foreman_app/vendor/assets/javascripts/jquery.jeditable.js +556 -0
- data/test/foreman_app/vendor/assets/javascripts/jquery.jnotify.js +209 -0
- data/test/foreman_app/vendor/assets/javascripts/jquery.multi-select.js +503 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/base64.js +147 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/des.js +273 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/display.js +700 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/input.js +1911 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/jsunzip.js +668 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/logo.js +1 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/playback.js +90 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/rfb.js +1846 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/ui.js +649 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/util.js +303 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/web-socket-js/README.txt +109 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/web-socket-js/swfobject.js +4 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/web-socket-js/web_socket.js +341 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/websock.js +356 -0
- data/test/foreman_app/vendor/assets/javascripts/noVNC/webutil.js +148 -0
- data/test/foreman_app/vendor/assets/javascripts/vendor.js +7 -0
- data/test/foreman_app/vendor/assets/stylesheets/jquery.jnotify.css +97 -0
- data/test/foreman_app/vendor/assets/stylesheets/multi-select.scss +126 -0
- data/test/foreman_app/vendor/assets/stylesheets/vendor.css +3 -0
- data/test/functional/discovers_controller_test.rb +40 -0
- data/test/test_helper.rb +28 -0
- data/test/unit/facts.yml +91 -0
- data/test/unit/host_discovered_test.rb +23 -0
- data/test/unit/setting_discovered_test.rb +9 -0
- metadata +2816 -0
@@ -0,0 +1 @@
|
|
1
|
+
noVNC_logo = {"width": 640, "height": 435, "data": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAGzCAYAAAC/y6a9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAStAAAErQBBHTWggAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7N13fBvlwQfw3522ZMm2vPdIGCFkA4GyoYyGsCmjk+7dQksHL2/H2/dtC4W2tLTlfelu2VA2lEILFCgQIHEGJCQkdjzkLdmWZGvfvX8oOkmJEy/pNO73/Xz44DtLzz2RT7qfnnXC8uXLZUxDlqfdnUYQhIP+bjbPn+5xhypzrmUf6rGzOc5cjzVduXN9/nTPyfRrMt/jzOcY05U5n3L2f95s/34LPW4m/p6FbLp/73xe+5nKnWuZs/07ZOOcnusx5nucbJU727LneuxslDmdTBxn/2NmusyEuZS7kHMxG/XP5Gf3TOVmQzY+u/PhPMnkMcSsH5WIiIiI8goDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHGMAASERERaQwDIBEREZHG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"};
|
@@ -0,0 +1,90 @@
|
|
1
|
+
/*
|
2
|
+
* noVNC: HTML5 VNC client
|
3
|
+
* Copyright (C) 2011 Joel Martin
|
4
|
+
* Licensed under LGPL-3 (see LICENSE.LGPL-3)
|
5
|
+
*/
|
6
|
+
|
7
|
+
"use strict";
|
8
|
+
/*jslint browser: true, white: false */
|
9
|
+
/*global Util, VNC_frame_data, finish */
|
10
|
+
|
11
|
+
var rfb, mode, test_state, frame_idx, frame_length,
|
12
|
+
iteration, iterations, istart_time,
|
13
|
+
|
14
|
+
// Pre-declarations for jslint
|
15
|
+
send_array, next_iteration, queue_next_packet, do_packet;
|
16
|
+
|
17
|
+
// Override send_array
|
18
|
+
send_array = function (arr) {
|
19
|
+
// Stub out send_array
|
20
|
+
};
|
21
|
+
|
22
|
+
next_iteration = function () {
|
23
|
+
if (iteration === 0) {
|
24
|
+
frame_length = VNC_frame_data.length;
|
25
|
+
test_state = 'running';
|
26
|
+
} else {
|
27
|
+
rfb.disconnect();
|
28
|
+
}
|
29
|
+
|
30
|
+
if (test_state !== 'running') { return; }
|
31
|
+
|
32
|
+
iteration += 1;
|
33
|
+
if (iteration > iterations) {
|
34
|
+
finish();
|
35
|
+
return;
|
36
|
+
}
|
37
|
+
|
38
|
+
frame_idx = 0;
|
39
|
+
istart_time = (new Date()).getTime();
|
40
|
+
rfb.connect('test', 0, "bogus");
|
41
|
+
|
42
|
+
queue_next_packet();
|
43
|
+
|
44
|
+
};
|
45
|
+
|
46
|
+
queue_next_packet = function () {
|
47
|
+
var frame, foffset, toffset, delay;
|
48
|
+
if (test_state !== 'running') { return; }
|
49
|
+
|
50
|
+
frame = VNC_frame_data[frame_idx];
|
51
|
+
while ((frame_idx < frame_length) && (frame.charAt(0) === "}")) {
|
52
|
+
//Util.Debug("Send frame " + frame_idx);
|
53
|
+
frame_idx += 1;
|
54
|
+
frame = VNC_frame_data[frame_idx];
|
55
|
+
}
|
56
|
+
|
57
|
+
if (frame === 'EOF') {
|
58
|
+
Util.Debug("Finished, found EOF");
|
59
|
+
next_iteration();
|
60
|
+
return;
|
61
|
+
}
|
62
|
+
if (frame_idx >= frame_length) {
|
63
|
+
Util.Debug("Finished, no more frames");
|
64
|
+
next_iteration();
|
65
|
+
return;
|
66
|
+
}
|
67
|
+
|
68
|
+
if (mode === 'realtime') {
|
69
|
+
foffset = frame.slice(1, frame.indexOf('{', 1));
|
70
|
+
toffset = (new Date()).getTime() - istart_time;
|
71
|
+
delay = foffset - toffset;
|
72
|
+
if (delay < 1) {
|
73
|
+
delay = 1;
|
74
|
+
}
|
75
|
+
|
76
|
+
setTimeout(do_packet, delay);
|
77
|
+
} else {
|
78
|
+
setTimeout(do_packet, 1);
|
79
|
+
}
|
80
|
+
};
|
81
|
+
|
82
|
+
do_packet = function () {
|
83
|
+
//Util.Debug("Processing frame: " + frame_idx);
|
84
|
+
var frame = VNC_frame_data[frame_idx];
|
85
|
+
rfb.recv_message({'data' : frame.slice(frame.indexOf('{', 1) + 1)});
|
86
|
+
frame_idx += 1;
|
87
|
+
|
88
|
+
queue_next_packet();
|
89
|
+
};
|
90
|
+
|
@@ -0,0 +1,1846 @@
|
|
1
|
+
/*
|
2
|
+
* noVNC: HTML5 VNC client
|
3
|
+
* Copyright (C) 2011 Joel Martin
|
4
|
+
* Licensed under LGPL-3 (see LICENSE.txt)
|
5
|
+
*
|
6
|
+
* See README.md for usage and integration instructions.
|
7
|
+
*
|
8
|
+
* TIGHT decoder portion:
|
9
|
+
* (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca)
|
10
|
+
*/
|
11
|
+
|
12
|
+
/*jslint white: false, browser: true, bitwise: false, plusplus: false */
|
13
|
+
/*global window, Util, Display, Keyboard, Mouse, Websock, Websock_native, Base64, DES */
|
14
|
+
|
15
|
+
|
16
|
+
function RFB(defaults) {
|
17
|
+
"use strict";
|
18
|
+
|
19
|
+
var that = {}, // Public API methods
|
20
|
+
conf = {}, // Configuration attributes
|
21
|
+
|
22
|
+
// Pre-declare private functions used before definitions (jslint)
|
23
|
+
init_vars, updateState, fail, handle_message,
|
24
|
+
init_msg, normal_msg, framebufferUpdate, print_stats,
|
25
|
+
|
26
|
+
pixelFormat, clientEncodings, fbUpdateRequest, fbUpdateRequests,
|
27
|
+
keyEvent, pointerEvent, clientCutText,
|
28
|
+
|
29
|
+
getTightCLength, extract_data_uri, scan_tight_imgQ,
|
30
|
+
keyPress, mouseButton, mouseMove,
|
31
|
+
|
32
|
+
checkEvents, // Overridable for testing
|
33
|
+
|
34
|
+
|
35
|
+
//
|
36
|
+
// Private RFB namespace variables
|
37
|
+
//
|
38
|
+
rfb_host = '',
|
39
|
+
rfb_port = 5900,
|
40
|
+
rfb_password = '',
|
41
|
+
rfb_path = '',
|
42
|
+
|
43
|
+
rfb_state = 'disconnected',
|
44
|
+
rfb_version = 0,
|
45
|
+
rfb_max_version= 3.8,
|
46
|
+
rfb_auth_scheme= '',
|
47
|
+
|
48
|
+
|
49
|
+
// In preference order
|
50
|
+
encodings = [
|
51
|
+
['COPYRECT', 0x01 ],
|
52
|
+
['TIGHT', 0x07 ],
|
53
|
+
['TIGHT_PNG', -260 ],
|
54
|
+
['HEXTILE', 0x05 ],
|
55
|
+
['RRE', 0x02 ],
|
56
|
+
['RAW', 0x00 ],
|
57
|
+
['DesktopSize', -223 ],
|
58
|
+
['Cursor', -239 ],
|
59
|
+
|
60
|
+
// Psuedo-encoding settings
|
61
|
+
//['JPEG_quality_lo', -32 ],
|
62
|
+
['JPEG_quality_med', -26 ],
|
63
|
+
//['JPEG_quality_hi', -23 ],
|
64
|
+
//['compress_lo', -255 ],
|
65
|
+
['compress_hi', -247 ],
|
66
|
+
['last_rect', -224 ]
|
67
|
+
],
|
68
|
+
|
69
|
+
encHandlers = {},
|
70
|
+
encNames = {},
|
71
|
+
encStats = {}, // [rectCnt, rectCntTot]
|
72
|
+
|
73
|
+
ws = null, // Websock object
|
74
|
+
display = null, // Display object
|
75
|
+
keyboard = null, // Keyboard input handler object
|
76
|
+
mouse = null, // Mouse input handler object
|
77
|
+
sendTimer = null, // Send Queue check timer
|
78
|
+
connTimer = null, // connection timer
|
79
|
+
disconnTimer = null, // disconnection timer
|
80
|
+
msgTimer = null, // queued handle_message timer
|
81
|
+
|
82
|
+
// Frame buffer update state
|
83
|
+
FBU = {
|
84
|
+
rects : 0,
|
85
|
+
subrects : 0, // RRE
|
86
|
+
lines : 0, // RAW
|
87
|
+
tiles : 0, // HEXTILE
|
88
|
+
bytes : 0,
|
89
|
+
x : 0,
|
90
|
+
y : 0,
|
91
|
+
width : 0,
|
92
|
+
height : 0,
|
93
|
+
encoding : 0,
|
94
|
+
subencoding : -1,
|
95
|
+
background : null,
|
96
|
+
imgQ : [], // TIGHT_PNG image queue
|
97
|
+
zlibs : [] // TIGHT zlib streams
|
98
|
+
},
|
99
|
+
|
100
|
+
fb_Bpp = 4,
|
101
|
+
fb_depth = 3,
|
102
|
+
fb_width = 0,
|
103
|
+
fb_height = 0,
|
104
|
+
fb_name = "",
|
105
|
+
|
106
|
+
scan_imgQ_rate = 40, // 25 times per second or so
|
107
|
+
last_req_time = 0,
|
108
|
+
rre_chunk_sz = 100,
|
109
|
+
|
110
|
+
timing = {
|
111
|
+
last_fbu : 0,
|
112
|
+
fbu_total : 0,
|
113
|
+
fbu_total_cnt : 0,
|
114
|
+
full_fbu_total : 0,
|
115
|
+
full_fbu_cnt : 0,
|
116
|
+
|
117
|
+
fbu_rt_start : 0,
|
118
|
+
fbu_rt_total : 0,
|
119
|
+
fbu_rt_cnt : 0,
|
120
|
+
pixels : 0
|
121
|
+
},
|
122
|
+
|
123
|
+
test_mode = false,
|
124
|
+
|
125
|
+
def_con_timeout = Websock_native ? 10 : 25,
|
126
|
+
|
127
|
+
/* Mouse state */
|
128
|
+
mouse_buttonMask = 0,
|
129
|
+
mouse_arr = [],
|
130
|
+
viewportDragging = false,
|
131
|
+
viewportDragPos = {};
|
132
|
+
|
133
|
+
// Configuration attributes
|
134
|
+
Util.conf_defaults(conf, that, defaults, [
|
135
|
+
['target', 'wo', 'dom', null, 'VNC display rendering Canvas object'],
|
136
|
+
['focusContainer', 'wo', 'dom', document, 'DOM element that captures keyboard input'],
|
137
|
+
|
138
|
+
['encrypt', 'rw', 'bool', false, 'Use TLS/SSL/wss encryption'],
|
139
|
+
['true_color', 'rw', 'bool', true, 'Request true color pixel data'],
|
140
|
+
['local_cursor', 'rw', 'bool', false, 'Request locally rendered cursor'],
|
141
|
+
['shared', 'rw', 'bool', true, 'Request shared mode'],
|
142
|
+
['view_only', 'rw', 'bool', false, 'Disable client mouse/keyboard'],
|
143
|
+
|
144
|
+
['connectTimeout', 'rw', 'int', def_con_timeout, 'Time (s) to wait for connection'],
|
145
|
+
['disconnectTimeout', 'rw', 'int', 10, 'Time (s) to wait for disconnection'],
|
146
|
+
|
147
|
+
['viewportDrag', 'rw', 'bool', false, 'Move the viewport on mouse drags'],
|
148
|
+
|
149
|
+
['check_rate', 'rw', 'int', 217, 'Timing (ms) of send/receive check'],
|
150
|
+
['fbu_req_rate', 'rw', 'int', 1413, 'Timing (ms) of frameBufferUpdate requests'],
|
151
|
+
|
152
|
+
// Callback functions
|
153
|
+
['onUpdateState', 'rw', 'func', function() { },
|
154
|
+
'onUpdateState(rfb, state, oldstate, statusMsg): RFB state update/change '],
|
155
|
+
['onPasswordRequired', 'rw', 'func', function() { },
|
156
|
+
'onPasswordRequired(rfb): VNC password is required '],
|
157
|
+
['onClipboard', 'rw', 'func', function() { },
|
158
|
+
'onClipboard(rfb, text): RFB clipboard contents received'],
|
159
|
+
['onBell', 'rw', 'func', function() { },
|
160
|
+
'onBell(rfb): RFB Bell message received '],
|
161
|
+
['onFBUReceive', 'rw', 'func', function() { },
|
162
|
+
'onFBUReceive(rfb, fbu): RFB FBU received but not yet processed '],
|
163
|
+
['onFBUComplete', 'rw', 'func', function() { },
|
164
|
+
'onFBUComplete(rfb, fbu): RFB FBU received and processed '],
|
165
|
+
|
166
|
+
// These callback names are deprecated
|
167
|
+
['updateState', 'rw', 'func', function() { },
|
168
|
+
'obsolete, use onUpdateState'],
|
169
|
+
['clipboardReceive', 'rw', 'func', function() { },
|
170
|
+
'obsolete, use onClipboard']
|
171
|
+
]);
|
172
|
+
|
173
|
+
|
174
|
+
// Override/add some specific configuration getters/setters
|
175
|
+
that.set_local_cursor = function(cursor) {
|
176
|
+
if ((!cursor) || (cursor in {'0':1, 'no':1, 'false':1})) {
|
177
|
+
conf.local_cursor = false;
|
178
|
+
} else {
|
179
|
+
if (display.get_cursor_uri()) {
|
180
|
+
conf.local_cursor = true;
|
181
|
+
} else {
|
182
|
+
Util.Warn("Browser does not support local cursor");
|
183
|
+
}
|
184
|
+
}
|
185
|
+
};
|
186
|
+
|
187
|
+
// These are fake configuration getters
|
188
|
+
that.get_display = function() { return display; };
|
189
|
+
|
190
|
+
that.get_keyboard = function() { return keyboard; };
|
191
|
+
|
192
|
+
that.get_mouse = function() { return mouse; };
|
193
|
+
|
194
|
+
|
195
|
+
|
196
|
+
//
|
197
|
+
// Setup routines
|
198
|
+
//
|
199
|
+
|
200
|
+
// Create the public API interface and initialize values that stay
|
201
|
+
// constant across connect/disconnect
|
202
|
+
function constructor() {
|
203
|
+
var i, rmode;
|
204
|
+
Util.Debug(">> RFB.constructor");
|
205
|
+
|
206
|
+
// Create lookup tables based encoding number
|
207
|
+
for (i=0; i < encodings.length; i+=1) {
|
208
|
+
encHandlers[encodings[i][1]] = encHandlers[encodings[i][0]];
|
209
|
+
encNames[encodings[i][1]] = encodings[i][0];
|
210
|
+
encStats[encodings[i][1]] = [0, 0];
|
211
|
+
}
|
212
|
+
// Initialize display, mouse, keyboard, and websock
|
213
|
+
try {
|
214
|
+
display = new Display({'target': conf.target});
|
215
|
+
} catch (exc) {
|
216
|
+
Util.Error("Display exception: " + exc);
|
217
|
+
updateState('fatal', "No working Display");
|
218
|
+
}
|
219
|
+
keyboard = new Keyboard({'target': conf.focusContainer,
|
220
|
+
'onKeyPress': keyPress});
|
221
|
+
mouse = new Mouse({'target': conf.target,
|
222
|
+
'onMouseButton': mouseButton,
|
223
|
+
'onMouseMove': mouseMove});
|
224
|
+
|
225
|
+
rmode = display.get_render_mode();
|
226
|
+
|
227
|
+
ws = new Websock();
|
228
|
+
ws.on('message', handle_message);
|
229
|
+
ws.on('open', function() {
|
230
|
+
if (rfb_state === "connect") {
|
231
|
+
updateState('ProtocolVersion', "Starting VNC handshake");
|
232
|
+
} else {
|
233
|
+
fail("Got unexpected WebSockets connection");
|
234
|
+
}
|
235
|
+
});
|
236
|
+
ws.on('close', function(e) {
|
237
|
+
if (e.code) {
|
238
|
+
Util.Info("Close code: " + e.code + ", reason: " + e.reason + ", wasClean: " + e.wasClean);
|
239
|
+
}
|
240
|
+
if (rfb_state === 'disconnect') {
|
241
|
+
updateState('disconnected', 'VNC disconnected');
|
242
|
+
} else if (rfb_state === 'ProtocolVersion') {
|
243
|
+
fail('Failed to connect to server');
|
244
|
+
} else if (rfb_state in {'failed':1, 'disconnected':1}) {
|
245
|
+
Util.Error("Received onclose while disconnected");
|
246
|
+
} else {
|
247
|
+
fail('Server disconnected');
|
248
|
+
}
|
249
|
+
});
|
250
|
+
ws.on('error', function(e) {
|
251
|
+
fail("WebSock error: " + e);
|
252
|
+
});
|
253
|
+
|
254
|
+
|
255
|
+
init_vars();
|
256
|
+
|
257
|
+
/* Check web-socket-js if no builtin WebSocket support */
|
258
|
+
if (Websock_native) {
|
259
|
+
Util.Info("Using native WebSockets");
|
260
|
+
updateState('loaded', 'noVNC ready: native WebSockets, ' + rmode);
|
261
|
+
} else {
|
262
|
+
Util.Warn("Using web-socket-js bridge. Flash version: " +
|
263
|
+
Util.Flash.version);
|
264
|
+
if ((! Util.Flash) ||
|
265
|
+
(Util.Flash.version < 9)) {
|
266
|
+
updateState('fatal', "WebSockets or <a href='http://get.adobe.com/flashplayer'>Adobe Flash<\/a> is required");
|
267
|
+
} else if (document.location.href.substr(0, 7) === "file://") {
|
268
|
+
updateState('fatal',
|
269
|
+
"'file://' URL is incompatible with Adobe Flash");
|
270
|
+
} else {
|
271
|
+
updateState('loaded', 'noVNC ready: WebSockets emulation, ' + rmode);
|
272
|
+
}
|
273
|
+
}
|
274
|
+
|
275
|
+
Util.Debug("<< RFB.constructor");
|
276
|
+
return that; // Return the public API interface
|
277
|
+
}
|
278
|
+
|
279
|
+
function connect() {
|
280
|
+
Util.Debug(">> RFB.connect");
|
281
|
+
var uri;
|
282
|
+
|
283
|
+
if (typeof UsingSocketIO !== "undefined") {
|
284
|
+
uri = "http://" + rfb_host + ":" + rfb_port + "/" + rfb_path;
|
285
|
+
} else {
|
286
|
+
if (conf.encrypt) {
|
287
|
+
uri = "wss://";
|
288
|
+
} else {
|
289
|
+
uri = "ws://";
|
290
|
+
}
|
291
|
+
uri += rfb_host + ":" + rfb_port + "/" + rfb_path;
|
292
|
+
}
|
293
|
+
Util.Info("connecting to " + uri);
|
294
|
+
ws.open(uri);
|
295
|
+
|
296
|
+
Util.Debug("<< RFB.connect");
|
297
|
+
}
|
298
|
+
|
299
|
+
// Initialize variables that are reset before each connection
|
300
|
+
init_vars = function() {
|
301
|
+
var i;
|
302
|
+
|
303
|
+
/* Reset state */
|
304
|
+
ws.init();
|
305
|
+
|
306
|
+
FBU.rects = 0;
|
307
|
+
FBU.subrects = 0; // RRE and HEXTILE
|
308
|
+
FBU.lines = 0; // RAW
|
309
|
+
FBU.tiles = 0; // HEXTILE
|
310
|
+
FBU.imgQ = []; // TIGHT_PNG image queue
|
311
|
+
FBU.zlibs = []; // TIGHT zlib encoders
|
312
|
+
mouse_buttonMask = 0;
|
313
|
+
mouse_arr = [];
|
314
|
+
|
315
|
+
// Clear the per connection encoding stats
|
316
|
+
for (i=0; i < encodings.length; i+=1) {
|
317
|
+
encStats[encodings[i][1]][0] = 0;
|
318
|
+
}
|
319
|
+
|
320
|
+
for (i=0; i < 4; i++) {
|
321
|
+
//FBU.zlibs[i] = new InflateStream();
|
322
|
+
FBU.zlibs[i] = new TINF();
|
323
|
+
FBU.zlibs[i].init();
|
324
|
+
}
|
325
|
+
};
|
326
|
+
|
327
|
+
// Print statistics
|
328
|
+
print_stats = function() {
|
329
|
+
var i, s;
|
330
|
+
Util.Info("Encoding stats for this connection:");
|
331
|
+
for (i=0; i < encodings.length; i+=1) {
|
332
|
+
s = encStats[encodings[i][1]];
|
333
|
+
if ((s[0] + s[1]) > 0) {
|
334
|
+
Util.Info(" " + encodings[i][0] + ": " +
|
335
|
+
s[0] + " rects");
|
336
|
+
}
|
337
|
+
}
|
338
|
+
Util.Info("Encoding stats since page load:");
|
339
|
+
for (i=0; i < encodings.length; i+=1) {
|
340
|
+
s = encStats[encodings[i][1]];
|
341
|
+
if ((s[0] + s[1]) > 0) {
|
342
|
+
Util.Info(" " + encodings[i][0] + ": " +
|
343
|
+
s[1] + " rects");
|
344
|
+
}
|
345
|
+
}
|
346
|
+
};
|
347
|
+
|
348
|
+
//
|
349
|
+
// Utility routines
|
350
|
+
//
|
351
|
+
|
352
|
+
|
353
|
+
/*
|
354
|
+
* Page states:
|
355
|
+
* loaded - page load, equivalent to disconnected
|
356
|
+
* disconnected - idle state
|
357
|
+
* connect - starting to connect (to ProtocolVersion)
|
358
|
+
* normal - connected
|
359
|
+
* disconnect - starting to disconnect
|
360
|
+
* failed - abnormal disconnect
|
361
|
+
* fatal - failed to load page, or fatal error
|
362
|
+
*
|
363
|
+
* RFB protocol initialization states:
|
364
|
+
* ProtocolVersion
|
365
|
+
* Security
|
366
|
+
* Authentication
|
367
|
+
* password - waiting for password, not part of RFB
|
368
|
+
* SecurityResult
|
369
|
+
* ClientInitialization - not triggered by server message
|
370
|
+
* ServerInitialization (to normal)
|
371
|
+
*/
|
372
|
+
updateState = function(state, statusMsg) {
|
373
|
+
var func, cmsg, oldstate = rfb_state;
|
374
|
+
|
375
|
+
if (state === oldstate) {
|
376
|
+
/* Already here, ignore */
|
377
|
+
Util.Debug("Already in state '" + state + "', ignoring.");
|
378
|
+
return;
|
379
|
+
}
|
380
|
+
|
381
|
+
/*
|
382
|
+
* These are disconnected states. A previous connect may
|
383
|
+
* asynchronously cause a connection so make sure we are closed.
|
384
|
+
*/
|
385
|
+
if (state in {'disconnected':1, 'loaded':1, 'connect':1,
|
386
|
+
'disconnect':1, 'failed':1, 'fatal':1}) {
|
387
|
+
if (sendTimer) {
|
388
|
+
clearInterval(sendTimer);
|
389
|
+
sendTimer = null;
|
390
|
+
}
|
391
|
+
|
392
|
+
if (msgTimer) {
|
393
|
+
clearInterval(msgTimer);
|
394
|
+
msgTimer = null;
|
395
|
+
}
|
396
|
+
|
397
|
+
if (display && display.get_context()) {
|
398
|
+
keyboard.ungrab();
|
399
|
+
mouse.ungrab();
|
400
|
+
display.defaultCursor();
|
401
|
+
if ((Util.get_logging() !== 'debug') ||
|
402
|
+
(state === 'loaded')) {
|
403
|
+
// Show noVNC logo on load and when disconnected if
|
404
|
+
// debug is off
|
405
|
+
display.clear();
|
406
|
+
}
|
407
|
+
}
|
408
|
+
|
409
|
+
ws.close();
|
410
|
+
}
|
411
|
+
|
412
|
+
if (oldstate === 'fatal') {
|
413
|
+
Util.Error("Fatal error, cannot continue");
|
414
|
+
}
|
415
|
+
|
416
|
+
if ((state === 'failed') || (state === 'fatal')) {
|
417
|
+
func = Util.Error;
|
418
|
+
} else {
|
419
|
+
func = Util.Warn;
|
420
|
+
}
|
421
|
+
|
422
|
+
if ((oldstate === 'failed') && (state === 'disconnected')) {
|
423
|
+
// Do disconnect action, but stay in failed state.
|
424
|
+
rfb_state = 'failed';
|
425
|
+
} else {
|
426
|
+
rfb_state = state;
|
427
|
+
}
|
428
|
+
|
429
|
+
cmsg = typeof(statusMsg) !== 'undefined' ? (" Msg: " + statusMsg) : "";
|
430
|
+
func("New state '" + rfb_state + "', was '" + oldstate + "'." + cmsg);
|
431
|
+
|
432
|
+
if (connTimer && (rfb_state !== 'connect')) {
|
433
|
+
Util.Debug("Clearing connect timer");
|
434
|
+
clearInterval(connTimer);
|
435
|
+
connTimer = null;
|
436
|
+
}
|
437
|
+
|
438
|
+
if (disconnTimer && (rfb_state !== 'disconnect')) {
|
439
|
+
Util.Debug("Clearing disconnect timer");
|
440
|
+
clearInterval(disconnTimer);
|
441
|
+
disconnTimer = null;
|
442
|
+
}
|
443
|
+
|
444
|
+
switch (state) {
|
445
|
+
case 'normal':
|
446
|
+
if ((oldstate === 'disconnected') || (oldstate === 'failed')) {
|
447
|
+
Util.Error("Invalid transition from 'disconnected' or 'failed' to 'normal'");
|
448
|
+
}
|
449
|
+
|
450
|
+
break;
|
451
|
+
|
452
|
+
|
453
|
+
case 'connect':
|
454
|
+
|
455
|
+
connTimer = setTimeout(function () {
|
456
|
+
fail("Connect timeout");
|
457
|
+
}, conf.connectTimeout * 1000);
|
458
|
+
|
459
|
+
init_vars();
|
460
|
+
connect();
|
461
|
+
|
462
|
+
// WebSocket.onopen transitions to 'ProtocolVersion'
|
463
|
+
break;
|
464
|
+
|
465
|
+
|
466
|
+
case 'disconnect':
|
467
|
+
|
468
|
+
if (! test_mode) {
|
469
|
+
disconnTimer = setTimeout(function () {
|
470
|
+
fail("Disconnect timeout");
|
471
|
+
}, conf.disconnectTimeout * 1000);
|
472
|
+
}
|
473
|
+
|
474
|
+
print_stats();
|
475
|
+
|
476
|
+
// WebSocket.onclose transitions to 'disconnected'
|
477
|
+
break;
|
478
|
+
|
479
|
+
|
480
|
+
case 'failed':
|
481
|
+
if (oldstate === 'disconnected') {
|
482
|
+
Util.Error("Invalid transition from 'disconnected' to 'failed'");
|
483
|
+
}
|
484
|
+
if (oldstate === 'normal') {
|
485
|
+
Util.Error("Error while connected.");
|
486
|
+
}
|
487
|
+
if (oldstate === 'init') {
|
488
|
+
Util.Error("Error while initializing.");
|
489
|
+
}
|
490
|
+
|
491
|
+
// Make sure we transition to disconnected
|
492
|
+
setTimeout(function() { updateState('disconnected'); }, 50);
|
493
|
+
|
494
|
+
break;
|
495
|
+
|
496
|
+
|
497
|
+
default:
|
498
|
+
// No state change action to take
|
499
|
+
|
500
|
+
}
|
501
|
+
|
502
|
+
if ((oldstate === 'failed') && (state === 'disconnected')) {
|
503
|
+
// Leave the failed message
|
504
|
+
conf.updateState(that, state, oldstate); // Obsolete
|
505
|
+
conf.onUpdateState(that, state, oldstate);
|
506
|
+
} else {
|
507
|
+
conf.updateState(that, state, oldstate, statusMsg); // Obsolete
|
508
|
+
conf.onUpdateState(that, state, oldstate, statusMsg);
|
509
|
+
}
|
510
|
+
};
|
511
|
+
|
512
|
+
fail = function(msg) {
|
513
|
+
updateState('failed', msg);
|
514
|
+
return false;
|
515
|
+
};
|
516
|
+
|
517
|
+
handle_message = function() {
|
518
|
+
//Util.Debug(">> handle_message ws.rQlen(): " + ws.rQlen());
|
519
|
+
//Util.Debug("ws.rQslice(0,20): " + ws.rQslice(0,20) + " (" + ws.rQlen() + ")");
|
520
|
+
if (ws.rQlen() === 0) {
|
521
|
+
Util.Warn("handle_message called on empty receive queue");
|
522
|
+
return;
|
523
|
+
}
|
524
|
+
switch (rfb_state) {
|
525
|
+
case 'disconnected':
|
526
|
+
case 'failed':
|
527
|
+
Util.Error("Got data while disconnected");
|
528
|
+
break;
|
529
|
+
case 'normal':
|
530
|
+
if (normal_msg() && ws.rQlen() > 0) {
|
531
|
+
// true means we can continue processing
|
532
|
+
// Give other events a chance to run
|
533
|
+
if (msgTimer === null) {
|
534
|
+
Util.Debug("More data to process, creating timer");
|
535
|
+
msgTimer = setTimeout(function () {
|
536
|
+
msgTimer = null;
|
537
|
+
handle_message();
|
538
|
+
}, 10);
|
539
|
+
} else {
|
540
|
+
Util.Debug("More data to process, existing timer");
|
541
|
+
}
|
542
|
+
}
|
543
|
+
break;
|
544
|
+
default:
|
545
|
+
init_msg();
|
546
|
+
break;
|
547
|
+
}
|
548
|
+
};
|
549
|
+
|
550
|
+
|
551
|
+
function genDES(password, challenge) {
|
552
|
+
var i, passwd = [];
|
553
|
+
for (i=0; i < password.length; i += 1) {
|
554
|
+
passwd.push(password.charCodeAt(i));
|
555
|
+
}
|
556
|
+
return (new DES(passwd)).encrypt(challenge);
|
557
|
+
}
|
558
|
+
|
559
|
+
function flushClient() {
|
560
|
+
if (mouse_arr.length > 0) {
|
561
|
+
//send(mouse_arr.concat(fbUpdateRequests()));
|
562
|
+
ws.send(mouse_arr);
|
563
|
+
setTimeout(function() {
|
564
|
+
ws.send(fbUpdateRequests());
|
565
|
+
}, 50);
|
566
|
+
|
567
|
+
mouse_arr = [];
|
568
|
+
return true;
|
569
|
+
} else {
|
570
|
+
return false;
|
571
|
+
}
|
572
|
+
}
|
573
|
+
|
574
|
+
// overridable for testing
|
575
|
+
checkEvents = function() {
|
576
|
+
var now;
|
577
|
+
if (rfb_state === 'normal' && !viewportDragging) {
|
578
|
+
if (! flushClient()) {
|
579
|
+
now = new Date().getTime();
|
580
|
+
if (now > last_req_time + conf.fbu_req_rate) {
|
581
|
+
last_req_time = now;
|
582
|
+
ws.send(fbUpdateRequests());
|
583
|
+
}
|
584
|
+
}
|
585
|
+
}
|
586
|
+
setTimeout(checkEvents, conf.check_rate);
|
587
|
+
};
|
588
|
+
|
589
|
+
keyPress = function(keysym, down) {
|
590
|
+
var arr;
|
591
|
+
|
592
|
+
if (conf.view_only) { return; } // View only, skip keyboard events
|
593
|
+
|
594
|
+
arr = keyEvent(keysym, down);
|
595
|
+
arr = arr.concat(fbUpdateRequests());
|
596
|
+
ws.send(arr);
|
597
|
+
};
|
598
|
+
|
599
|
+
mouseButton = function(x, y, down, bmask) {
|
600
|
+
if (down) {
|
601
|
+
mouse_buttonMask |= bmask;
|
602
|
+
} else {
|
603
|
+
mouse_buttonMask ^= bmask;
|
604
|
+
}
|
605
|
+
|
606
|
+
if (conf.viewportDrag) {
|
607
|
+
if (down && !viewportDragging) {
|
608
|
+
viewportDragging = true;
|
609
|
+
viewportDragPos = {'x': x, 'y': y};
|
610
|
+
|
611
|
+
// Skip sending mouse events
|
612
|
+
return;
|
613
|
+
} else {
|
614
|
+
viewportDragging = false;
|
615
|
+
ws.send(fbUpdateRequests()); // Force immediate redraw
|
616
|
+
}
|
617
|
+
}
|
618
|
+
|
619
|
+
if (conf.view_only) { return; } // View only, skip mouse events
|
620
|
+
|
621
|
+
mouse_arr = mouse_arr.concat(
|
622
|
+
pointerEvent(display.absX(x), display.absY(y)) );
|
623
|
+
flushClient();
|
624
|
+
};
|
625
|
+
|
626
|
+
mouseMove = function(x, y) {
|
627
|
+
//Util.Debug('>> mouseMove ' + x + "," + y);
|
628
|
+
var deltaX, deltaY;
|
629
|
+
|
630
|
+
if (viewportDragging) {
|
631
|
+
//deltaX = x - viewportDragPos.x; // drag viewport
|
632
|
+
deltaX = viewportDragPos.x - x; // drag frame buffer
|
633
|
+
//deltaY = y - viewportDragPos.y; // drag viewport
|
634
|
+
deltaY = viewportDragPos.y - y; // drag frame buffer
|
635
|
+
viewportDragPos = {'x': x, 'y': y};
|
636
|
+
|
637
|
+
display.viewportChange(deltaX, deltaY);
|
638
|
+
|
639
|
+
// Skip sending mouse events
|
640
|
+
return;
|
641
|
+
}
|
642
|
+
|
643
|
+
if (conf.view_only) { return; } // View only, skip mouse events
|
644
|
+
|
645
|
+
mouse_arr = mouse_arr.concat(
|
646
|
+
pointerEvent(display.absX(x), display.absY(y)) );
|
647
|
+
};
|
648
|
+
|
649
|
+
|
650
|
+
//
|
651
|
+
// Server message handlers
|
652
|
+
//
|
653
|
+
|
654
|
+
// RFB/VNC initialisation message handler
|
655
|
+
init_msg = function() {
|
656
|
+
//Util.Debug(">> init_msg [rfb_state '" + rfb_state + "']");
|
657
|
+
|
658
|
+
var strlen, reason, length, sversion, cversion,
|
659
|
+
i, types, num_types, challenge, response, bpp, depth,
|
660
|
+
big_endian, red_max, green_max, blue_max, red_shift,
|
661
|
+
green_shift, blue_shift, true_color, name_length;
|
662
|
+
|
663
|
+
//Util.Debug("ws.rQ (" + ws.rQlen() + ") " + ws.rQslice(0));
|
664
|
+
switch (rfb_state) {
|
665
|
+
|
666
|
+
case 'ProtocolVersion' :
|
667
|
+
if (ws.rQlen() < 12) {
|
668
|
+
return fail("Incomplete protocol version");
|
669
|
+
}
|
670
|
+
sversion = ws.rQshiftStr(12).substr(4,7);
|
671
|
+
Util.Info("Server ProtocolVersion: " + sversion);
|
672
|
+
switch (sversion) {
|
673
|
+
case "003.003": rfb_version = 3.3; break;
|
674
|
+
case "003.006": rfb_version = 3.3; break; // UltraVNC
|
675
|
+
case "003.007": rfb_version = 3.7; break;
|
676
|
+
case "003.008": rfb_version = 3.8; break;
|
677
|
+
case "004.000": rfb_version = 3.8; break; // Intel AMT KVM
|
678
|
+
default:
|
679
|
+
return fail("Invalid server version " + sversion);
|
680
|
+
}
|
681
|
+
if (rfb_version > rfb_max_version) {
|
682
|
+
rfb_version = rfb_max_version;
|
683
|
+
}
|
684
|
+
|
685
|
+
if (! test_mode) {
|
686
|
+
sendTimer = setInterval(function() {
|
687
|
+
// Send updates either at a rate of one update
|
688
|
+
// every 50ms, or whatever slower rate the network
|
689
|
+
// can handle.
|
690
|
+
ws.flush();
|
691
|
+
}, 50);
|
692
|
+
}
|
693
|
+
|
694
|
+
cversion = "00" + parseInt(rfb_version,10) +
|
695
|
+
".00" + ((rfb_version * 10) % 10);
|
696
|
+
ws.send_string("RFB " + cversion + "\n");
|
697
|
+
updateState('Security', "Sent ProtocolVersion: " + cversion);
|
698
|
+
break;
|
699
|
+
|
700
|
+
case 'Security' :
|
701
|
+
if (rfb_version >= 3.7) {
|
702
|
+
// Server sends supported list, client decides
|
703
|
+
num_types = ws.rQshift8();
|
704
|
+
if (ws.rQwait("security type", num_types, 1)) { return false; }
|
705
|
+
if (num_types === 0) {
|
706
|
+
strlen = ws.rQshift32();
|
707
|
+
reason = ws.rQshiftStr(strlen);
|
708
|
+
return fail("Security failure: " + reason);
|
709
|
+
}
|
710
|
+
rfb_auth_scheme = 0;
|
711
|
+
types = ws.rQshiftBytes(num_types);
|
712
|
+
Util.Debug("Server security types: " + types);
|
713
|
+
for (i=0; i < types.length; i+=1) {
|
714
|
+
if ((types[i] > rfb_auth_scheme) && (types[i] < 3)) {
|
715
|
+
rfb_auth_scheme = types[i];
|
716
|
+
}
|
717
|
+
}
|
718
|
+
if (rfb_auth_scheme === 0) {
|
719
|
+
return fail("Unsupported security types: " + types);
|
720
|
+
}
|
721
|
+
|
722
|
+
ws.send([rfb_auth_scheme]);
|
723
|
+
} else {
|
724
|
+
// Server decides
|
725
|
+
if (ws.rQwait("security scheme", 4)) { return false; }
|
726
|
+
rfb_auth_scheme = ws.rQshift32();
|
727
|
+
}
|
728
|
+
updateState('Authentication',
|
729
|
+
"Authenticating using scheme: " + rfb_auth_scheme);
|
730
|
+
init_msg(); // Recursive fallthrough (workaround JSLint complaint)
|
731
|
+
break;
|
732
|
+
|
733
|
+
// Triggered by fallthough, not by server message
|
734
|
+
case 'Authentication' :
|
735
|
+
//Util.Debug("Security auth scheme: " + rfb_auth_scheme);
|
736
|
+
switch (rfb_auth_scheme) {
|
737
|
+
case 0: // connection failed
|
738
|
+
if (ws.rQwait("auth reason", 4)) { return false; }
|
739
|
+
strlen = ws.rQshift32();
|
740
|
+
reason = ws.rQshiftStr(strlen);
|
741
|
+
return fail("Auth failure: " + reason);
|
742
|
+
case 1: // no authentication
|
743
|
+
if (rfb_version >= 3.8) {
|
744
|
+
updateState('SecurityResult');
|
745
|
+
return;
|
746
|
+
}
|
747
|
+
// Fall through to ClientInitialisation
|
748
|
+
break;
|
749
|
+
case 2: // VNC authentication
|
750
|
+
if (rfb_password.length === 0) {
|
751
|
+
// Notify via both callbacks since it is kind of
|
752
|
+
// a RFB state change and a UI interface issue.
|
753
|
+
updateState('password', "Password Required");
|
754
|
+
conf.onPasswordRequired(that);
|
755
|
+
return;
|
756
|
+
}
|
757
|
+
if (ws.rQwait("auth challenge", 16)) { return false; }
|
758
|
+
challenge = ws.rQshiftBytes(16);
|
759
|
+
//Util.Debug("Password: " + rfb_password);
|
760
|
+
//Util.Debug("Challenge: " + challenge +
|
761
|
+
// " (" + challenge.length + ")");
|
762
|
+
response = genDES(rfb_password, challenge);
|
763
|
+
//Util.Debug("Response: " + response +
|
764
|
+
// " (" + response.length + ")");
|
765
|
+
|
766
|
+
//Util.Debug("Sending DES encrypted auth response");
|
767
|
+
ws.send(response);
|
768
|
+
updateState('SecurityResult');
|
769
|
+
return;
|
770
|
+
default:
|
771
|
+
fail("Unsupported auth scheme: " + rfb_auth_scheme);
|
772
|
+
return;
|
773
|
+
}
|
774
|
+
updateState('ClientInitialisation', "No auth required");
|
775
|
+
init_msg(); // Recursive fallthrough (workaround JSLint complaint)
|
776
|
+
break;
|
777
|
+
|
778
|
+
case 'SecurityResult' :
|
779
|
+
if (ws.rQwait("VNC auth response ", 4)) { return false; }
|
780
|
+
switch (ws.rQshift32()) {
|
781
|
+
case 0: // OK
|
782
|
+
// Fall through to ClientInitialisation
|
783
|
+
break;
|
784
|
+
case 1: // failed
|
785
|
+
if (rfb_version >= 3.8) {
|
786
|
+
length = ws.rQshift32();
|
787
|
+
if (ws.rQwait("SecurityResult reason", length, 8)) {
|
788
|
+
return false;
|
789
|
+
}
|
790
|
+
reason = ws.rQshiftStr(length);
|
791
|
+
fail(reason);
|
792
|
+
} else {
|
793
|
+
fail("Authentication failed");
|
794
|
+
}
|
795
|
+
return;
|
796
|
+
case 2: // too-many
|
797
|
+
return fail("Too many auth attempts");
|
798
|
+
}
|
799
|
+
updateState('ClientInitialisation', "Authentication OK");
|
800
|
+
init_msg(); // Recursive fallthrough (workaround JSLint complaint)
|
801
|
+
break;
|
802
|
+
|
803
|
+
// Triggered by fallthough, not by server message
|
804
|
+
case 'ClientInitialisation' :
|
805
|
+
ws.send([conf.shared ? 1 : 0]); // ClientInitialisation
|
806
|
+
updateState('ServerInitialisation', "Authentication OK");
|
807
|
+
break;
|
808
|
+
|
809
|
+
case 'ServerInitialisation' :
|
810
|
+
if (ws.rQwait("server initialization", 24)) { return false; }
|
811
|
+
|
812
|
+
/* Screen size */
|
813
|
+
fb_width = ws.rQshift16();
|
814
|
+
fb_height = ws.rQshift16();
|
815
|
+
|
816
|
+
/* PIXEL_FORMAT */
|
817
|
+
bpp = ws.rQshift8();
|
818
|
+
depth = ws.rQshift8();
|
819
|
+
big_endian = ws.rQshift8();
|
820
|
+
true_color = ws.rQshift8();
|
821
|
+
|
822
|
+
red_max = ws.rQshift16();
|
823
|
+
green_max = ws.rQshift16();
|
824
|
+
blue_max = ws.rQshift16();
|
825
|
+
red_shift = ws.rQshift8();
|
826
|
+
green_shift = ws.rQshift8();
|
827
|
+
blue_shift = ws.rQshift8();
|
828
|
+
ws.rQshiftStr(3); // padding
|
829
|
+
|
830
|
+
Util.Info("Screen: " + fb_width + "x" + fb_height +
|
831
|
+
", bpp: " + bpp + ", depth: " + depth +
|
832
|
+
", big_endian: " + big_endian +
|
833
|
+
", true_color: " + true_color +
|
834
|
+
", red_max: " + red_max +
|
835
|
+
", green_max: " + green_max +
|
836
|
+
", blue_max: " + blue_max +
|
837
|
+
", red_shift: " + red_shift +
|
838
|
+
", green_shift: " + green_shift +
|
839
|
+
", blue_shift: " + blue_shift);
|
840
|
+
|
841
|
+
if (big_endian !== 0) {
|
842
|
+
Util.Warn("Server native endian is not little endian");
|
843
|
+
}
|
844
|
+
if (red_shift !== 16) {
|
845
|
+
Util.Warn("Server native red-shift is not 16");
|
846
|
+
}
|
847
|
+
if (blue_shift !== 0) {
|
848
|
+
Util.Warn("Server native blue-shift is not 0");
|
849
|
+
}
|
850
|
+
|
851
|
+
/* Connection name/title */
|
852
|
+
name_length = ws.rQshift32();
|
853
|
+
fb_name = ws.rQshiftStr(name_length);
|
854
|
+
|
855
|
+
if (conf.true_color && fb_name === "Intel(r) AMT KVM")
|
856
|
+
{
|
857
|
+
Util.Warn("Intel AMT KVM only support 8/16 bit depths. Disabling true color");
|
858
|
+
conf.true_color = false;
|
859
|
+
}
|
860
|
+
|
861
|
+
display.set_true_color(conf.true_color);
|
862
|
+
display.resize(fb_width, fb_height);
|
863
|
+
keyboard.grab();
|
864
|
+
mouse.grab();
|
865
|
+
|
866
|
+
if (conf.true_color) {
|
867
|
+
fb_Bpp = 4;
|
868
|
+
fb_depth = 3;
|
869
|
+
} else {
|
870
|
+
fb_Bpp = 1;
|
871
|
+
fb_depth = 1;
|
872
|
+
}
|
873
|
+
|
874
|
+
response = pixelFormat();
|
875
|
+
response = response.concat(clientEncodings());
|
876
|
+
response = response.concat(fbUpdateRequests());
|
877
|
+
timing.fbu_rt_start = (new Date()).getTime();
|
878
|
+
ws.send(response);
|
879
|
+
|
880
|
+
/* Start pushing/polling */
|
881
|
+
setTimeout(checkEvents, conf.check_rate);
|
882
|
+
setTimeout(scan_tight_imgQ, scan_imgQ_rate);
|
883
|
+
|
884
|
+
if (conf.encrypt) {
|
885
|
+
updateState('normal', "Connected (encrypted) to: " + fb_name);
|
886
|
+
} else {
|
887
|
+
updateState('normal', "Connected (unencrypted) to: " + fb_name);
|
888
|
+
}
|
889
|
+
break;
|
890
|
+
}
|
891
|
+
//Util.Debug("<< init_msg");
|
892
|
+
};
|
893
|
+
|
894
|
+
|
895
|
+
/* Normal RFB/VNC server message handler */
|
896
|
+
normal_msg = function() {
|
897
|
+
//Util.Debug(">> normal_msg");
|
898
|
+
|
899
|
+
var ret = true, msg_type, length, text,
|
900
|
+
c, first_colour, num_colours, red, green, blue;
|
901
|
+
|
902
|
+
if (FBU.rects > 0) {
|
903
|
+
msg_type = 0;
|
904
|
+
} else {
|
905
|
+
msg_type = ws.rQshift8();
|
906
|
+
}
|
907
|
+
switch (msg_type) {
|
908
|
+
case 0: // FramebufferUpdate
|
909
|
+
ret = framebufferUpdate(); // false means need more data
|
910
|
+
break;
|
911
|
+
case 1: // SetColourMapEntries
|
912
|
+
Util.Debug("SetColourMapEntries");
|
913
|
+
ws.rQshift8(); // Padding
|
914
|
+
first_colour = ws.rQshift16(); // First colour
|
915
|
+
num_colours = ws.rQshift16();
|
916
|
+
if (ws.rQwait("SetColourMapEntries", num_colours*6, 6)) { return false; }
|
917
|
+
|
918
|
+
for (c=0; c < num_colours; c+=1) {
|
919
|
+
red = ws.rQshift16();
|
920
|
+
//Util.Debug("red before: " + red);
|
921
|
+
red = parseInt(red / 256, 10);
|
922
|
+
//Util.Debug("red after: " + red);
|
923
|
+
green = parseInt(ws.rQshift16() / 256, 10);
|
924
|
+
blue = parseInt(ws.rQshift16() / 256, 10);
|
925
|
+
display.set_colourMap([blue, green, red], first_colour + c);
|
926
|
+
}
|
927
|
+
Util.Debug("colourMap: " + display.get_colourMap());
|
928
|
+
Util.Info("Registered " + num_colours + " colourMap entries");
|
929
|
+
//Util.Debug("colourMap: " + display.get_colourMap());
|
930
|
+
break;
|
931
|
+
case 2: // Bell
|
932
|
+
Util.Debug("Bell");
|
933
|
+
conf.onBell(that);
|
934
|
+
break;
|
935
|
+
case 3: // ServerCutText
|
936
|
+
Util.Debug("ServerCutText");
|
937
|
+
if (ws.rQwait("ServerCutText header", 7, 1)) { return false; }
|
938
|
+
ws.rQshiftBytes(3); // Padding
|
939
|
+
length = ws.rQshift32();
|
940
|
+
if (ws.rQwait("ServerCutText", length, 8)) { return false; }
|
941
|
+
|
942
|
+
text = ws.rQshiftStr(length);
|
943
|
+
conf.clipboardReceive(that, text); // Obsolete
|
944
|
+
conf.onClipboard(that, text);
|
945
|
+
break;
|
946
|
+
default:
|
947
|
+
fail("Disconnected: illegal server message type " + msg_type);
|
948
|
+
Util.Debug("ws.rQslice(0,30):" + ws.rQslice(0,30));
|
949
|
+
break;
|
950
|
+
}
|
951
|
+
//Util.Debug("<< normal_msg");
|
952
|
+
return ret;
|
953
|
+
};
|
954
|
+
|
955
|
+
framebufferUpdate = function() {
|
956
|
+
var now, hdr, fbu_rt_diff, ret = true;
|
957
|
+
|
958
|
+
if (FBU.rects === 0) {
|
959
|
+
//Util.Debug("New FBU: ws.rQslice(0,20): " + ws.rQslice(0,20));
|
960
|
+
if (ws.rQwait("FBU header", 3)) {
|
961
|
+
ws.rQunshift8(0); // FBU msg_type
|
962
|
+
return false;
|
963
|
+
}
|
964
|
+
ws.rQshift8(); // padding
|
965
|
+
FBU.rects = ws.rQshift16();
|
966
|
+
//Util.Debug("FramebufferUpdate, rects:" + FBU.rects);
|
967
|
+
FBU.bytes = 0;
|
968
|
+
timing.cur_fbu = 0;
|
969
|
+
if (timing.fbu_rt_start > 0) {
|
970
|
+
now = (new Date()).getTime();
|
971
|
+
Util.Info("First FBU latency: " + (now - timing.fbu_rt_start));
|
972
|
+
}
|
973
|
+
}
|
974
|
+
|
975
|
+
while (FBU.rects > 0) {
|
976
|
+
if (rfb_state !== "normal") {
|
977
|
+
return false;
|
978
|
+
}
|
979
|
+
if (ws.rQwait("FBU", FBU.bytes)) { return false; }
|
980
|
+
if (FBU.bytes === 0) {
|
981
|
+
if (ws.rQwait("rect header", 12)) { return false; }
|
982
|
+
/* New FramebufferUpdate */
|
983
|
+
|
984
|
+
hdr = ws.rQshiftBytes(12);
|
985
|
+
FBU.x = (hdr[0] << 8) + hdr[1];
|
986
|
+
FBU.y = (hdr[2] << 8) + hdr[3];
|
987
|
+
FBU.width = (hdr[4] << 8) + hdr[5];
|
988
|
+
FBU.height = (hdr[6] << 8) + hdr[7];
|
989
|
+
FBU.encoding = parseInt((hdr[8] << 24) + (hdr[9] << 16) +
|
990
|
+
(hdr[10] << 8) + hdr[11], 10);
|
991
|
+
|
992
|
+
conf.onFBUReceive(that,
|
993
|
+
{'x': FBU.x, 'y': FBU.y,
|
994
|
+
'width': FBU.width, 'height': FBU.height,
|
995
|
+
'encoding': FBU.encoding,
|
996
|
+
'encodingName': encNames[FBU.encoding]});
|
997
|
+
|
998
|
+
if (encNames[FBU.encoding]) {
|
999
|
+
// Debug:
|
1000
|
+
/*
|
1001
|
+
var msg = "FramebufferUpdate rects:" + FBU.rects;
|
1002
|
+
msg += " x: " + FBU.x + " y: " + FBU.y;
|
1003
|
+
msg += " width: " + FBU.width + " height: " + FBU.height;
|
1004
|
+
msg += " encoding:" + FBU.encoding;
|
1005
|
+
msg += "(" + encNames[FBU.encoding] + ")";
|
1006
|
+
msg += ", ws.rQlen(): " + ws.rQlen();
|
1007
|
+
Util.Debug(msg);
|
1008
|
+
*/
|
1009
|
+
} else {
|
1010
|
+
fail("Disconnected: unsupported encoding " +
|
1011
|
+
FBU.encoding);
|
1012
|
+
return false;
|
1013
|
+
}
|
1014
|
+
}
|
1015
|
+
|
1016
|
+
timing.last_fbu = (new Date()).getTime();
|
1017
|
+
|
1018
|
+
ret = encHandlers[FBU.encoding]();
|
1019
|
+
|
1020
|
+
now = (new Date()).getTime();
|
1021
|
+
timing.cur_fbu += (now - timing.last_fbu);
|
1022
|
+
|
1023
|
+
if (ret) {
|
1024
|
+
encStats[FBU.encoding][0] += 1;
|
1025
|
+
encStats[FBU.encoding][1] += 1;
|
1026
|
+
timing.pixels += FBU.width * FBU.height;
|
1027
|
+
}
|
1028
|
+
|
1029
|
+
if (FBU.rects === 0 || (timing.pixels >= (fb_width * fb_height))) {
|
1030
|
+
if (((FBU.width === fb_width) &&
|
1031
|
+
(FBU.height === fb_height)) ||
|
1032
|
+
(timing.fbu_rt_start > 0)) {
|
1033
|
+
timing.full_fbu_total += timing.cur_fbu;
|
1034
|
+
timing.full_fbu_cnt += 1;
|
1035
|
+
Util.Info("Timing of full FBU, cur: " +
|
1036
|
+
timing.cur_fbu + ", total: " +
|
1037
|
+
timing.full_fbu_total + ", cnt: " +
|
1038
|
+
timing.full_fbu_cnt + ", avg: " +
|
1039
|
+
(timing.full_fbu_total /
|
1040
|
+
timing.full_fbu_cnt));
|
1041
|
+
}
|
1042
|
+
if (timing.fbu_rt_start > 0) {
|
1043
|
+
fbu_rt_diff = now - timing.fbu_rt_start;
|
1044
|
+
timing.fbu_rt_total += fbu_rt_diff;
|
1045
|
+
timing.fbu_rt_cnt += 1;
|
1046
|
+
Util.Info("full FBU round-trip, cur: " +
|
1047
|
+
fbu_rt_diff + ", total: " +
|
1048
|
+
timing.fbu_rt_total + ", cnt: " +
|
1049
|
+
timing.fbu_rt_cnt + ", avg: " +
|
1050
|
+
(timing.fbu_rt_total /
|
1051
|
+
timing.fbu_rt_cnt));
|
1052
|
+
timing.fbu_rt_start = 0;
|
1053
|
+
}
|
1054
|
+
}
|
1055
|
+
if (! ret) {
|
1056
|
+
return ret; // false ret means need more data
|
1057
|
+
}
|
1058
|
+
}
|
1059
|
+
|
1060
|
+
conf.onFBUComplete(that,
|
1061
|
+
{'x': FBU.x, 'y': FBU.y,
|
1062
|
+
'width': FBU.width, 'height': FBU.height,
|
1063
|
+
'encoding': FBU.encoding,
|
1064
|
+
'encodingName': encNames[FBU.encoding]});
|
1065
|
+
|
1066
|
+
return true; // We finished this FBU
|
1067
|
+
};
|
1068
|
+
|
1069
|
+
//
|
1070
|
+
// FramebufferUpdate encodings
|
1071
|
+
//
|
1072
|
+
|
1073
|
+
encHandlers.RAW = function display_raw() {
|
1074
|
+
//Util.Debug(">> display_raw (" + ws.rQlen() + " bytes)");
|
1075
|
+
|
1076
|
+
var cur_y, cur_height;
|
1077
|
+
|
1078
|
+
if (FBU.lines === 0) {
|
1079
|
+
FBU.lines = FBU.height;
|
1080
|
+
}
|
1081
|
+
FBU.bytes = FBU.width * fb_Bpp; // At least a line
|
1082
|
+
if (ws.rQwait("RAW", FBU.bytes)) { return false; }
|
1083
|
+
cur_y = FBU.y + (FBU.height - FBU.lines);
|
1084
|
+
cur_height = Math.min(FBU.lines,
|
1085
|
+
Math.floor(ws.rQlen()/(FBU.width * fb_Bpp)));
|
1086
|
+
display.blitImage(FBU.x, cur_y, FBU.width, cur_height,
|
1087
|
+
ws.get_rQ(), ws.get_rQi());
|
1088
|
+
ws.rQshiftBytes(FBU.width * cur_height * fb_Bpp);
|
1089
|
+
FBU.lines -= cur_height;
|
1090
|
+
|
1091
|
+
if (FBU.lines > 0) {
|
1092
|
+
FBU.bytes = FBU.width * fb_Bpp; // At least another line
|
1093
|
+
} else {
|
1094
|
+
FBU.rects -= 1;
|
1095
|
+
FBU.bytes = 0;
|
1096
|
+
}
|
1097
|
+
//Util.Debug("<< display_raw (" + ws.rQlen() + " bytes)");
|
1098
|
+
return true;
|
1099
|
+
};
|
1100
|
+
|
1101
|
+
encHandlers.COPYRECT = function display_copy_rect() {
|
1102
|
+
//Util.Debug(">> display_copy_rect");
|
1103
|
+
|
1104
|
+
var old_x, old_y;
|
1105
|
+
|
1106
|
+
if (ws.rQwait("COPYRECT", 4)) { return false; }
|
1107
|
+
old_x = ws.rQshift16();
|
1108
|
+
old_y = ws.rQshift16();
|
1109
|
+
display.copyImage(old_x, old_y, FBU.x, FBU.y, FBU.width, FBU.height);
|
1110
|
+
FBU.rects -= 1;
|
1111
|
+
FBU.bytes = 0;
|
1112
|
+
return true;
|
1113
|
+
};
|
1114
|
+
|
1115
|
+
encHandlers.RRE = function display_rre() {
|
1116
|
+
//Util.Debug(">> display_rre (" + ws.rQlen() + " bytes)");
|
1117
|
+
var color, x, y, width, height, chunk;
|
1118
|
+
|
1119
|
+
if (FBU.subrects === 0) {
|
1120
|
+
if (ws.rQwait("RRE", 4+fb_Bpp)) { return false; }
|
1121
|
+
FBU.subrects = ws.rQshift32();
|
1122
|
+
color = ws.rQshiftBytes(fb_Bpp); // Background
|
1123
|
+
display.fillRect(FBU.x, FBU.y, FBU.width, FBU.height, color);
|
1124
|
+
}
|
1125
|
+
while ((FBU.subrects > 0) && (ws.rQlen() >= (fb_Bpp + 8))) {
|
1126
|
+
color = ws.rQshiftBytes(fb_Bpp);
|
1127
|
+
x = ws.rQshift16();
|
1128
|
+
y = ws.rQshift16();
|
1129
|
+
width = ws.rQshift16();
|
1130
|
+
height = ws.rQshift16();
|
1131
|
+
display.fillRect(FBU.x + x, FBU.y + y, width, height, color);
|
1132
|
+
FBU.subrects -= 1;
|
1133
|
+
}
|
1134
|
+
//Util.Debug(" display_rre: rects: " + FBU.rects +
|
1135
|
+
// ", FBU.subrects: " + FBU.subrects);
|
1136
|
+
|
1137
|
+
if (FBU.subrects > 0) {
|
1138
|
+
chunk = Math.min(rre_chunk_sz, FBU.subrects);
|
1139
|
+
FBU.bytes = (fb_Bpp + 8) * chunk;
|
1140
|
+
} else {
|
1141
|
+
FBU.rects -= 1;
|
1142
|
+
FBU.bytes = 0;
|
1143
|
+
}
|
1144
|
+
//Util.Debug("<< display_rre, FBU.bytes: " + FBU.bytes);
|
1145
|
+
return true;
|
1146
|
+
};
|
1147
|
+
|
1148
|
+
encHandlers.HEXTILE = function display_hextile() {
|
1149
|
+
//Util.Debug(">> display_hextile");
|
1150
|
+
var subencoding, subrects, color, cur_tile,
|
1151
|
+
tile_x, x, w, tile_y, y, h, xy, s, sx, sy, wh, sw, sh,
|
1152
|
+
rQ = ws.get_rQ(), rQi = ws.get_rQi();
|
1153
|
+
|
1154
|
+
if (FBU.tiles === 0) {
|
1155
|
+
FBU.tiles_x = Math.ceil(FBU.width/16);
|
1156
|
+
FBU.tiles_y = Math.ceil(FBU.height/16);
|
1157
|
+
FBU.total_tiles = FBU.tiles_x * FBU.tiles_y;
|
1158
|
+
FBU.tiles = FBU.total_tiles;
|
1159
|
+
}
|
1160
|
+
|
1161
|
+
/* FBU.bytes comes in as 1, ws.rQlen() at least 1 */
|
1162
|
+
while (FBU.tiles > 0) {
|
1163
|
+
FBU.bytes = 1;
|
1164
|
+
if (ws.rQwait("HEXTILE subencoding", FBU.bytes)) { return false; }
|
1165
|
+
subencoding = rQ[rQi]; // Peek
|
1166
|
+
if (subencoding > 30) { // Raw
|
1167
|
+
fail("Disconnected: illegal hextile subencoding " + subencoding);
|
1168
|
+
//Util.Debug("ws.rQslice(0,30):" + ws.rQslice(0,30));
|
1169
|
+
return false;
|
1170
|
+
}
|
1171
|
+
subrects = 0;
|
1172
|
+
cur_tile = FBU.total_tiles - FBU.tiles;
|
1173
|
+
tile_x = cur_tile % FBU.tiles_x;
|
1174
|
+
tile_y = Math.floor(cur_tile / FBU.tiles_x);
|
1175
|
+
x = FBU.x + tile_x * 16;
|
1176
|
+
y = FBU.y + tile_y * 16;
|
1177
|
+
w = Math.min(16, (FBU.x + FBU.width) - x);
|
1178
|
+
h = Math.min(16, (FBU.y + FBU.height) - y);
|
1179
|
+
|
1180
|
+
/* Figure out how much we are expecting */
|
1181
|
+
if (subencoding & 0x01) { // Raw
|
1182
|
+
//Util.Debug(" Raw subencoding");
|
1183
|
+
FBU.bytes += w * h * fb_Bpp;
|
1184
|
+
} else {
|
1185
|
+
if (subencoding & 0x02) { // Background
|
1186
|
+
FBU.bytes += fb_Bpp;
|
1187
|
+
}
|
1188
|
+
if (subencoding & 0x04) { // Foreground
|
1189
|
+
FBU.bytes += fb_Bpp;
|
1190
|
+
}
|
1191
|
+
if (subencoding & 0x08) { // AnySubrects
|
1192
|
+
FBU.bytes += 1; // Since we aren't shifting it off
|
1193
|
+
if (ws.rQwait("hextile subrects header", FBU.bytes)) { return false; }
|
1194
|
+
subrects = rQ[rQi + FBU.bytes-1]; // Peek
|
1195
|
+
if (subencoding & 0x10) { // SubrectsColoured
|
1196
|
+
FBU.bytes += subrects * (fb_Bpp + 2);
|
1197
|
+
} else {
|
1198
|
+
FBU.bytes += subrects * 2;
|
1199
|
+
}
|
1200
|
+
}
|
1201
|
+
}
|
1202
|
+
|
1203
|
+
/*
|
1204
|
+
Util.Debug(" tile:" + cur_tile + "/" + (FBU.total_tiles - 1) +
|
1205
|
+
" (" + tile_x + "," + tile_y + ")" +
|
1206
|
+
" [" + x + "," + y + "]@" + w + "x" + h +
|
1207
|
+
", subenc:" + subencoding +
|
1208
|
+
"(last: " + FBU.lastsubencoding + "), subrects:" +
|
1209
|
+
subrects +
|
1210
|
+
", ws.rQlen():" + ws.rQlen() + ", FBU.bytes:" + FBU.bytes +
|
1211
|
+
" last:" + ws.rQslice(FBU.bytes-10, FBU.bytes) +
|
1212
|
+
" next:" + ws.rQslice(FBU.bytes-1, FBU.bytes+10));
|
1213
|
+
*/
|
1214
|
+
if (ws.rQwait("hextile", FBU.bytes)) { return false; }
|
1215
|
+
|
1216
|
+
/* We know the encoding and have a whole tile */
|
1217
|
+
FBU.subencoding = rQ[rQi];
|
1218
|
+
rQi += 1;
|
1219
|
+
if (FBU.subencoding === 0) {
|
1220
|
+
if (FBU.lastsubencoding & 0x01) {
|
1221
|
+
/* Weird: ignore blanks after RAW */
|
1222
|
+
Util.Debug(" Ignoring blank after RAW");
|
1223
|
+
} else {
|
1224
|
+
display.fillRect(x, y, w, h, FBU.background);
|
1225
|
+
}
|
1226
|
+
} else if (FBU.subencoding & 0x01) { // Raw
|
1227
|
+
display.blitImage(x, y, w, h, rQ, rQi);
|
1228
|
+
rQi += FBU.bytes - 1;
|
1229
|
+
} else {
|
1230
|
+
if (FBU.subencoding & 0x02) { // Background
|
1231
|
+
FBU.background = rQ.slice(rQi, rQi + fb_Bpp);
|
1232
|
+
rQi += fb_Bpp;
|
1233
|
+
}
|
1234
|
+
if (FBU.subencoding & 0x04) { // Foreground
|
1235
|
+
FBU.foreground = rQ.slice(rQi, rQi + fb_Bpp);
|
1236
|
+
rQi += fb_Bpp;
|
1237
|
+
}
|
1238
|
+
|
1239
|
+
display.startTile(x, y, w, h, FBU.background);
|
1240
|
+
if (FBU.subencoding & 0x08) { // AnySubrects
|
1241
|
+
subrects = rQ[rQi];
|
1242
|
+
rQi += 1;
|
1243
|
+
for (s = 0; s < subrects; s += 1) {
|
1244
|
+
if (FBU.subencoding & 0x10) { // SubrectsColoured
|
1245
|
+
color = rQ.slice(rQi, rQi + fb_Bpp);
|
1246
|
+
rQi += fb_Bpp;
|
1247
|
+
} else {
|
1248
|
+
color = FBU.foreground;
|
1249
|
+
}
|
1250
|
+
xy = rQ[rQi];
|
1251
|
+
rQi += 1;
|
1252
|
+
sx = (xy >> 4);
|
1253
|
+
sy = (xy & 0x0f);
|
1254
|
+
|
1255
|
+
wh = rQ[rQi];
|
1256
|
+
rQi += 1;
|
1257
|
+
sw = (wh >> 4) + 1;
|
1258
|
+
sh = (wh & 0x0f) + 1;
|
1259
|
+
|
1260
|
+
display.subTile(sx, sy, sw, sh, color);
|
1261
|
+
}
|
1262
|
+
}
|
1263
|
+
display.finishTile();
|
1264
|
+
}
|
1265
|
+
ws.set_rQi(rQi);
|
1266
|
+
FBU.lastsubencoding = FBU.subencoding;
|
1267
|
+
FBU.bytes = 0;
|
1268
|
+
FBU.tiles -= 1;
|
1269
|
+
}
|
1270
|
+
|
1271
|
+
if (FBU.tiles === 0) {
|
1272
|
+
FBU.rects -= 1;
|
1273
|
+
}
|
1274
|
+
|
1275
|
+
//Util.Debug("<< display_hextile");
|
1276
|
+
return true;
|
1277
|
+
};
|
1278
|
+
|
1279
|
+
|
1280
|
+
// Get 'compact length' header and data size
|
1281
|
+
getTightCLength = function (arr) {
|
1282
|
+
var header = 1, data = 0;
|
1283
|
+
data += arr[0] & 0x7f;
|
1284
|
+
if (arr[0] & 0x80) {
|
1285
|
+
header += 1;
|
1286
|
+
data += (arr[1] & 0x7f) << 7;
|
1287
|
+
if (arr[1] & 0x80) {
|
1288
|
+
header += 1;
|
1289
|
+
data += arr[2] << 14;
|
1290
|
+
}
|
1291
|
+
}
|
1292
|
+
return [header, data];
|
1293
|
+
};
|
1294
|
+
|
1295
|
+
function display_tight(isTightPNG) {
|
1296
|
+
//Util.Debug(">> display_tight");
|
1297
|
+
|
1298
|
+
if (fb_depth === 1) {
|
1299
|
+
fail("Tight protocol handler only implements true color mode");
|
1300
|
+
}
|
1301
|
+
|
1302
|
+
var ctl, cmode, clength, color, img, data;
|
1303
|
+
var filterId = -1, resetStreams = 0, streamId = -1;
|
1304
|
+
var rQ = ws.get_rQ(), rQi = ws.get_rQi();
|
1305
|
+
|
1306
|
+
FBU.bytes = 1; // compression-control byte
|
1307
|
+
if (ws.rQwait("TIGHT compression-control", FBU.bytes)) { return false; }
|
1308
|
+
|
1309
|
+
var checksum = function(data) {
|
1310
|
+
var sum=0, i;
|
1311
|
+
for (i=0; i<data.length;i++) {
|
1312
|
+
sum += data[i];
|
1313
|
+
if (sum > 65536) sum -= 65536;
|
1314
|
+
}
|
1315
|
+
return sum;
|
1316
|
+
}
|
1317
|
+
|
1318
|
+
var decompress = function(data) {
|
1319
|
+
for (var i=0; i<4; i++) {
|
1320
|
+
if ((resetStreams >> i) & 1) {
|
1321
|
+
FBU.zlibs[i].reset();
|
1322
|
+
Util.Info("Reset zlib stream " + i);
|
1323
|
+
}
|
1324
|
+
}
|
1325
|
+
var uncompressed = FBU.zlibs[streamId].uncompress(data, 0);
|
1326
|
+
if (uncompressed.status !== 0) {
|
1327
|
+
Util.Error("Invalid data in zlib stream");
|
1328
|
+
}
|
1329
|
+
//Util.Warn("Decompressed " + data.length + " to " +
|
1330
|
+
// uncompressed.data.length + " checksums " +
|
1331
|
+
// checksum(data) + ":" + checksum(uncompressed.data));
|
1332
|
+
|
1333
|
+
return uncompressed.data;
|
1334
|
+
}
|
1335
|
+
|
1336
|
+
var handlePalette = function() {
|
1337
|
+
var numColors = rQ[rQi + 2] + 1;
|
1338
|
+
var paletteSize = numColors * fb_depth;
|
1339
|
+
FBU.bytes += paletteSize;
|
1340
|
+
if (ws.rQwait("TIGHT palette " + cmode, FBU.bytes)) { return false; }
|
1341
|
+
|
1342
|
+
var bpp = (numColors <= 2) ? 1 : 8;
|
1343
|
+
var rowSize = Math.floor((FBU.width * bpp + 7) / 8);
|
1344
|
+
var raw = false;
|
1345
|
+
if (rowSize * FBU.height < 12) {
|
1346
|
+
raw = true;
|
1347
|
+
clength = [0, rowSize * FBU.height];
|
1348
|
+
} else {
|
1349
|
+
clength = getTightCLength(ws.rQslice(3 + paletteSize,
|
1350
|
+
3 + paletteSize + 3));
|
1351
|
+
}
|
1352
|
+
FBU.bytes += clength[0] + clength[1];
|
1353
|
+
if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; }
|
1354
|
+
|
1355
|
+
// Shift ctl, filter id, num colors, palette entries, and clength off
|
1356
|
+
ws.rQshiftBytes(3);
|
1357
|
+
var palette = ws.rQshiftBytes(paletteSize);
|
1358
|
+
ws.rQshiftBytes(clength[0]);
|
1359
|
+
|
1360
|
+
if (raw) {
|
1361
|
+
data = ws.rQshiftBytes(clength[1]);
|
1362
|
+
} else {
|
1363
|
+
data = decompress(ws.rQshiftBytes(clength[1]));
|
1364
|
+
}
|
1365
|
+
|
1366
|
+
// Convert indexed (palette based) image data to RGB
|
1367
|
+
// TODO: reduce number of calculations inside loop
|
1368
|
+
var dest = [];
|
1369
|
+
var x, y, b, w, w1, dp, sp;
|
1370
|
+
if (numColors === 2) {
|
1371
|
+
w = Math.floor((FBU.width + 7) / 8);
|
1372
|
+
w1 = Math.floor(FBU.width / 8);
|
1373
|
+
for (y = 0; y < FBU.height; y++) {
|
1374
|
+
for (x = 0; x < w1; x++) {
|
1375
|
+
for (b = 7; b >= 0; b--) {
|
1376
|
+
dp = (y*FBU.width + x*8 + 7-b) * 3;
|
1377
|
+
sp = (data[y*w + x] >> b & 1) * 3;
|
1378
|
+
dest[dp ] = palette[sp ];
|
1379
|
+
dest[dp+1] = palette[sp+1];
|
1380
|
+
dest[dp+2] = palette[sp+2];
|
1381
|
+
}
|
1382
|
+
}
|
1383
|
+
for (b = 7; b >= 8 - FBU.width % 8; b--) {
|
1384
|
+
dp = (y*FBU.width + x*8 + 7-b) * 3;
|
1385
|
+
sp = (data[y*w + x] >> b & 1) * 3;
|
1386
|
+
dest[dp ] = palette[sp ];
|
1387
|
+
dest[dp+1] = palette[sp+1];
|
1388
|
+
dest[dp+2] = palette[sp+2];
|
1389
|
+
}
|
1390
|
+
}
|
1391
|
+
} else {
|
1392
|
+
for (y = 0; y < FBU.height; y++) {
|
1393
|
+
for (x = 0; x < FBU.width; x++) {
|
1394
|
+
dp = (y*FBU.width + x) * 3;
|
1395
|
+
sp = data[y*FBU.width + x] * 3;
|
1396
|
+
dest[dp ] = palette[sp ];
|
1397
|
+
dest[dp+1] = palette[sp+1];
|
1398
|
+
dest[dp+2] = palette[sp+2];
|
1399
|
+
}
|
1400
|
+
}
|
1401
|
+
}
|
1402
|
+
|
1403
|
+
FBU.imgQ.push({
|
1404
|
+
'type': 'rgb',
|
1405
|
+
'img': {'complete': true, 'data': dest},
|
1406
|
+
'x': FBU.x,
|
1407
|
+
'y': FBU.y,
|
1408
|
+
'width': FBU.width,
|
1409
|
+
'height': FBU.height});
|
1410
|
+
return true;
|
1411
|
+
}
|
1412
|
+
|
1413
|
+
var handleCopy = function() {
|
1414
|
+
var raw = false;
|
1415
|
+
var uncompressedSize = FBU.width * FBU.height * fb_depth;
|
1416
|
+
if (uncompressedSize < 12) {
|
1417
|
+
raw = true;
|
1418
|
+
clength = [0, uncompressedSize];
|
1419
|
+
} else {
|
1420
|
+
clength = getTightCLength(ws.rQslice(1, 4));
|
1421
|
+
}
|
1422
|
+
FBU.bytes = 1 + clength[0] + clength[1];
|
1423
|
+
if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; }
|
1424
|
+
|
1425
|
+
// Shift ctl, clength off
|
1426
|
+
ws.rQshiftBytes(1 + clength[0]);
|
1427
|
+
|
1428
|
+
if (raw) {
|
1429
|
+
data = ws.rQshiftBytes(clength[1]);
|
1430
|
+
} else {
|
1431
|
+
data = decompress(ws.rQshiftBytes(clength[1]));
|
1432
|
+
}
|
1433
|
+
|
1434
|
+
FBU.imgQ.push({
|
1435
|
+
'type': 'rgb',
|
1436
|
+
'img': {'complete': true, 'data': data},
|
1437
|
+
'x': FBU.x,
|
1438
|
+
'y': FBU.y,
|
1439
|
+
'width': FBU.width,
|
1440
|
+
'height': FBU.height});
|
1441
|
+
return true;
|
1442
|
+
}
|
1443
|
+
|
1444
|
+
ctl = ws.rQpeek8();
|
1445
|
+
|
1446
|
+
// Keep tight reset bits
|
1447
|
+
resetStreams = ctl & 0xF;
|
1448
|
+
|
1449
|
+
// Figure out filter
|
1450
|
+
ctl = ctl >> 4;
|
1451
|
+
streamId = ctl & 0x3;
|
1452
|
+
|
1453
|
+
if (ctl === 0x08) cmode = "fill";
|
1454
|
+
else if (ctl === 0x09) cmode = "jpeg";
|
1455
|
+
else if (ctl === 0x0A) cmode = "png";
|
1456
|
+
else if (ctl & 0x04) cmode = "filter";
|
1457
|
+
else if (ctl < 0x04) cmode = "copy";
|
1458
|
+
else throw("Illegal tight compression received, ctl: " + ctl);
|
1459
|
+
|
1460
|
+
if (isTightPNG && (cmode === "filter" || cmode === "copy")) {
|
1461
|
+
throw("filter/copy received in tightPNG mode");
|
1462
|
+
}
|
1463
|
+
|
1464
|
+
switch (cmode) {
|
1465
|
+
// fill uses fb_depth because TPIXELs drop the padding byte
|
1466
|
+
case "fill": FBU.bytes += fb_depth; break; // TPIXEL
|
1467
|
+
case "jpeg": FBU.bytes += 3; break; // max clength
|
1468
|
+
case "png": FBU.bytes += 3; break; // max clength
|
1469
|
+
case "filter": FBU.bytes += 2; break; // filter id + num colors if palette
|
1470
|
+
case "copy": break;
|
1471
|
+
}
|
1472
|
+
|
1473
|
+
if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; }
|
1474
|
+
|
1475
|
+
//Util.Debug(" ws.rQslice(0,20): " + ws.rQslice(0,20) + " (" + ws.rQlen() + ")");
|
1476
|
+
//Util.Debug(" cmode: " + cmode);
|
1477
|
+
|
1478
|
+
// Determine FBU.bytes
|
1479
|
+
switch (cmode) {
|
1480
|
+
case "fill":
|
1481
|
+
ws.rQshift8(); // shift off ctl
|
1482
|
+
color = ws.rQshiftBytes(fb_depth);
|
1483
|
+
FBU.imgQ.push({
|
1484
|
+
'type': 'fill',
|
1485
|
+
'img': {'complete': true},
|
1486
|
+
'x': FBU.x,
|
1487
|
+
'y': FBU.y,
|
1488
|
+
'width': FBU.width,
|
1489
|
+
'height': FBU.height,
|
1490
|
+
'color': [color[2], color[1], color[0]] });
|
1491
|
+
break;
|
1492
|
+
case "png":
|
1493
|
+
case "jpeg":
|
1494
|
+
clength = getTightCLength(ws.rQslice(1, 4));
|
1495
|
+
FBU.bytes = 1 + clength[0] + clength[1]; // ctl + clength size + jpeg-data
|
1496
|
+
if (ws.rQwait("TIGHT " + cmode, FBU.bytes)) { return false; }
|
1497
|
+
|
1498
|
+
// We have everything, render it
|
1499
|
+
//Util.Debug(" jpeg, ws.rQlen(): " + ws.rQlen() + ", clength[0]: " +
|
1500
|
+
// clength[0] + ", clength[1]: " + clength[1]);
|
1501
|
+
ws.rQshiftBytes(1 + clength[0]); // shift off ctl + compact length
|
1502
|
+
img = new Image();
|
1503
|
+
//img.onload = scan_tight_imgQ;
|
1504
|
+
FBU.imgQ.push({
|
1505
|
+
'type': 'img',
|
1506
|
+
'img': img,
|
1507
|
+
'x': FBU.x,
|
1508
|
+
'y': FBU.y});
|
1509
|
+
img.src = "data:image/" + cmode +
|
1510
|
+
extract_data_uri(ws.rQshiftBytes(clength[1]));
|
1511
|
+
img = null;
|
1512
|
+
break;
|
1513
|
+
case "filter":
|
1514
|
+
filterId = rQ[rQi + 1];
|
1515
|
+
if (filterId === 1) {
|
1516
|
+
if (!handlePalette()) { return false; }
|
1517
|
+
} else {
|
1518
|
+
// Filter 0, Copy could be valid here, but servers don't send it as an explicit filter
|
1519
|
+
// Filter 2, Gradient is valid but not used if jpeg is enabled
|
1520
|
+
throw("Unsupported tight subencoding received, filter: " + filterId);
|
1521
|
+
}
|
1522
|
+
break;
|
1523
|
+
case "copy":
|
1524
|
+
if (!handleCopy()) { return false; }
|
1525
|
+
break;
|
1526
|
+
}
|
1527
|
+
|
1528
|
+
FBU.bytes = 0;
|
1529
|
+
FBU.rects -= 1;
|
1530
|
+
//Util.Debug(" ending ws.rQslice(0,20): " + ws.rQslice(0,20) + " (" + ws.rQlen() + ")");
|
1531
|
+
//Util.Debug("<< display_tight_png");
|
1532
|
+
return true;
|
1533
|
+
}
|
1534
|
+
|
1535
|
+
extract_data_uri = function(arr) {
|
1536
|
+
//var i, stra = [];
|
1537
|
+
//for (i=0; i< arr.length; i += 1) {
|
1538
|
+
// stra.push(String.fromCharCode(arr[i]));
|
1539
|
+
//}
|
1540
|
+
//return "," + escape(stra.join(''));
|
1541
|
+
return ";base64," + Base64.encode(arr);
|
1542
|
+
};
|
1543
|
+
|
1544
|
+
scan_tight_imgQ = function() {
|
1545
|
+
var data, imgQ, ctx;
|
1546
|
+
ctx = display.get_context();
|
1547
|
+
if (rfb_state === 'normal') {
|
1548
|
+
imgQ = FBU.imgQ;
|
1549
|
+
while ((imgQ.length > 0) && (imgQ[0].img.complete)) {
|
1550
|
+
data = imgQ.shift();
|
1551
|
+
if (data.type === 'fill') {
|
1552
|
+
display.fillRect(data.x, data.y, data.width, data.height, data.color);
|
1553
|
+
} else if (data.type === 'rgb') {
|
1554
|
+
display.blitRgbImage(data.x, data.y, data.width, data.height, data.img.data, 0);
|
1555
|
+
} else {
|
1556
|
+
ctx.drawImage(data.img, data.x, data.y);
|
1557
|
+
}
|
1558
|
+
}
|
1559
|
+
setTimeout(scan_tight_imgQ, scan_imgQ_rate);
|
1560
|
+
}
|
1561
|
+
};
|
1562
|
+
|
1563
|
+
encHandlers.TIGHT = function () { return display_tight(false); };
|
1564
|
+
encHandlers.TIGHT_PNG = function () { return display_tight(true); };
|
1565
|
+
|
1566
|
+
encHandlers.last_rect = function last_rect() {
|
1567
|
+
Util.Debug(">> set_desktopsize");
|
1568
|
+
FBU.rects = 0;
|
1569
|
+
Util.Debug("<< set_desktopsize");
|
1570
|
+
return true;
|
1571
|
+
};
|
1572
|
+
|
1573
|
+
encHandlers.DesktopSize = function set_desktopsize() {
|
1574
|
+
Util.Debug(">> set_desktopsize");
|
1575
|
+
fb_width = FBU.width;
|
1576
|
+
fb_height = FBU.height;
|
1577
|
+
display.resize(fb_width, fb_height);
|
1578
|
+
timing.fbu_rt_start = (new Date()).getTime();
|
1579
|
+
// Send a new non-incremental request
|
1580
|
+
ws.send(fbUpdateRequests());
|
1581
|
+
|
1582
|
+
FBU.bytes = 0;
|
1583
|
+
FBU.rects -= 1;
|
1584
|
+
|
1585
|
+
Util.Debug("<< set_desktopsize");
|
1586
|
+
return true;
|
1587
|
+
};
|
1588
|
+
|
1589
|
+
encHandlers.Cursor = function set_cursor() {
|
1590
|
+
var x, y, w, h, pixelslength, masklength;
|
1591
|
+
//Util.Debug(">> set_cursor");
|
1592
|
+
x = FBU.x; // hotspot-x
|
1593
|
+
y = FBU.y; // hotspot-y
|
1594
|
+
w = FBU.width;
|
1595
|
+
h = FBU.height;
|
1596
|
+
|
1597
|
+
pixelslength = w * h * fb_Bpp;
|
1598
|
+
masklength = Math.floor((w + 7) / 8) * h;
|
1599
|
+
|
1600
|
+
FBU.bytes = pixelslength + masklength;
|
1601
|
+
if (ws.rQwait("cursor encoding", FBU.bytes)) { return false; }
|
1602
|
+
|
1603
|
+
//Util.Debug(" set_cursor, x: " + x + ", y: " + y + ", w: " + w + ", h: " + h);
|
1604
|
+
|
1605
|
+
display.changeCursor(ws.rQshiftBytes(pixelslength),
|
1606
|
+
ws.rQshiftBytes(masklength),
|
1607
|
+
x, y, w, h);
|
1608
|
+
|
1609
|
+
FBU.bytes = 0;
|
1610
|
+
FBU.rects -= 1;
|
1611
|
+
|
1612
|
+
//Util.Debug("<< set_cursor");
|
1613
|
+
return true;
|
1614
|
+
};
|
1615
|
+
|
1616
|
+
encHandlers.JPEG_quality_lo = function set_jpeg_quality() {
|
1617
|
+
Util.Error("Server sent jpeg_quality pseudo-encoding");
|
1618
|
+
};
|
1619
|
+
|
1620
|
+
encHandlers.compress_lo = function set_compress_level() {
|
1621
|
+
Util.Error("Server sent compress level pseudo-encoding");
|
1622
|
+
};
|
1623
|
+
|
1624
|
+
/*
|
1625
|
+
* Client message routines
|
1626
|
+
*/
|
1627
|
+
|
1628
|
+
pixelFormat = function() {
|
1629
|
+
//Util.Debug(">> pixelFormat");
|
1630
|
+
var arr;
|
1631
|
+
arr = [0]; // msg-type
|
1632
|
+
arr.push8(0); // padding
|
1633
|
+
arr.push8(0); // padding
|
1634
|
+
arr.push8(0); // padding
|
1635
|
+
|
1636
|
+
arr.push8(fb_Bpp * 8); // bits-per-pixel
|
1637
|
+
arr.push8(fb_depth * 8); // depth
|
1638
|
+
arr.push8(0); // little-endian
|
1639
|
+
arr.push8(conf.true_color ? 1 : 0); // true-color
|
1640
|
+
|
1641
|
+
arr.push16(255); // red-max
|
1642
|
+
arr.push16(255); // green-max
|
1643
|
+
arr.push16(255); // blue-max
|
1644
|
+
arr.push8(16); // red-shift
|
1645
|
+
arr.push8(8); // green-shift
|
1646
|
+
arr.push8(0); // blue-shift
|
1647
|
+
|
1648
|
+
arr.push8(0); // padding
|
1649
|
+
arr.push8(0); // padding
|
1650
|
+
arr.push8(0); // padding
|
1651
|
+
//Util.Debug("<< pixelFormat");
|
1652
|
+
return arr;
|
1653
|
+
};
|
1654
|
+
|
1655
|
+
clientEncodings = function() {
|
1656
|
+
//Util.Debug(">> clientEncodings");
|
1657
|
+
var arr, i, encList = [];
|
1658
|
+
|
1659
|
+
for (i=0; i<encodings.length; i += 1) {
|
1660
|
+
if ((encodings[i][0] === "Cursor") &&
|
1661
|
+
(! conf.local_cursor)) {
|
1662
|
+
Util.Debug("Skipping Cursor pseudo-encoding");
|
1663
|
+
} else {
|
1664
|
+
//Util.Debug("Adding encoding: " + encodings[i][0]);
|
1665
|
+
encList.push(encodings[i][1]);
|
1666
|
+
}
|
1667
|
+
}
|
1668
|
+
|
1669
|
+
arr = [2]; // msg-type
|
1670
|
+
arr.push8(0); // padding
|
1671
|
+
|
1672
|
+
arr.push16(encList.length); // encoding count
|
1673
|
+
for (i=0; i < encList.length; i += 1) {
|
1674
|
+
arr.push32(encList[i]);
|
1675
|
+
}
|
1676
|
+
//Util.Debug("<< clientEncodings: " + arr);
|
1677
|
+
return arr;
|
1678
|
+
};
|
1679
|
+
|
1680
|
+
fbUpdateRequest = function(incremental, x, y, xw, yw) {
|
1681
|
+
//Util.Debug(">> fbUpdateRequest");
|
1682
|
+
if (typeof(x) === "undefined") { x = 0; }
|
1683
|
+
if (typeof(y) === "undefined") { y = 0; }
|
1684
|
+
if (typeof(xw) === "undefined") { xw = fb_width; }
|
1685
|
+
if (typeof(yw) === "undefined") { yw = fb_height; }
|
1686
|
+
var arr;
|
1687
|
+
arr = [3]; // msg-type
|
1688
|
+
arr.push8(incremental);
|
1689
|
+
arr.push16(x);
|
1690
|
+
arr.push16(y);
|
1691
|
+
arr.push16(xw);
|
1692
|
+
arr.push16(yw);
|
1693
|
+
//Util.Debug("<< fbUpdateRequest");
|
1694
|
+
return arr;
|
1695
|
+
};
|
1696
|
+
|
1697
|
+
// Based on clean/dirty areas, generate requests to send
|
1698
|
+
fbUpdateRequests = function() {
|
1699
|
+
var cleanDirty = display.getCleanDirtyReset(),
|
1700
|
+
arr = [], i, cb, db;
|
1701
|
+
|
1702
|
+
cb = cleanDirty.cleanBox;
|
1703
|
+
if (cb.w > 0 && cb.h > 0) {
|
1704
|
+
// Request incremental for clean box
|
1705
|
+
arr = arr.concat(fbUpdateRequest(1, cb.x, cb.y, cb.w, cb.h));
|
1706
|
+
}
|
1707
|
+
for (i = 0; i < cleanDirty.dirtyBoxes.length; i++) {
|
1708
|
+
db = cleanDirty.dirtyBoxes[i];
|
1709
|
+
// Force all (non-incremental for dirty box
|
1710
|
+
arr = arr.concat(fbUpdateRequest(0, db.x, db.y, db.w, db.h));
|
1711
|
+
}
|
1712
|
+
return arr;
|
1713
|
+
};
|
1714
|
+
|
1715
|
+
|
1716
|
+
|
1717
|
+
keyEvent = function(keysym, down) {
|
1718
|
+
//Util.Debug(">> keyEvent, keysym: " + keysym + ", down: " + down);
|
1719
|
+
var arr;
|
1720
|
+
arr = [4]; // msg-type
|
1721
|
+
arr.push8(down);
|
1722
|
+
arr.push16(0);
|
1723
|
+
arr.push32(keysym);
|
1724
|
+
//Util.Debug("<< keyEvent");
|
1725
|
+
return arr;
|
1726
|
+
};
|
1727
|
+
|
1728
|
+
pointerEvent = function(x, y) {
|
1729
|
+
//Util.Debug(">> pointerEvent, x,y: " + x + "," + y +
|
1730
|
+
// " , mask: " + mouse_buttonMask);
|
1731
|
+
var arr;
|
1732
|
+
arr = [5]; // msg-type
|
1733
|
+
arr.push8(mouse_buttonMask);
|
1734
|
+
arr.push16(x);
|
1735
|
+
arr.push16(y);
|
1736
|
+
//Util.Debug("<< pointerEvent");
|
1737
|
+
return arr;
|
1738
|
+
};
|
1739
|
+
|
1740
|
+
clientCutText = function(text) {
|
1741
|
+
//Util.Debug(">> clientCutText");
|
1742
|
+
var arr, i, n;
|
1743
|
+
arr = [6]; // msg-type
|
1744
|
+
arr.push8(0); // padding
|
1745
|
+
arr.push8(0); // padding
|
1746
|
+
arr.push8(0); // padding
|
1747
|
+
arr.push32(text.length);
|
1748
|
+
n = text.length;
|
1749
|
+
for (i=0; i < n; i+=1) {
|
1750
|
+
arr.push(text.charCodeAt(i));
|
1751
|
+
}
|
1752
|
+
//Util.Debug("<< clientCutText:" + arr);
|
1753
|
+
return arr;
|
1754
|
+
};
|
1755
|
+
|
1756
|
+
|
1757
|
+
|
1758
|
+
//
|
1759
|
+
// Public API interface functions
|
1760
|
+
//
|
1761
|
+
|
1762
|
+
that.connect = function(host, port, password, path) {
|
1763
|
+
//Util.Debug(">> connect");
|
1764
|
+
|
1765
|
+
rfb_host = host;
|
1766
|
+
rfb_port = port;
|
1767
|
+
rfb_password = (password !== undefined) ? password : "";
|
1768
|
+
rfb_path = (path !== undefined) ? path : "";
|
1769
|
+
|
1770
|
+
if ((!rfb_host) || (!rfb_port)) {
|
1771
|
+
return fail("Must set host and port");
|
1772
|
+
}
|
1773
|
+
|
1774
|
+
updateState('connect');
|
1775
|
+
//Util.Debug("<< connect");
|
1776
|
+
|
1777
|
+
};
|
1778
|
+
|
1779
|
+
that.disconnect = function() {
|
1780
|
+
//Util.Debug(">> disconnect");
|
1781
|
+
updateState('disconnect', 'Disconnecting');
|
1782
|
+
//Util.Debug("<< disconnect");
|
1783
|
+
};
|
1784
|
+
|
1785
|
+
that.sendPassword = function(passwd) {
|
1786
|
+
rfb_password = passwd;
|
1787
|
+
rfb_state = "Authentication";
|
1788
|
+
setTimeout(init_msg, 1);
|
1789
|
+
};
|
1790
|
+
|
1791
|
+
that.sendCtrlAltDel = function() {
|
1792
|
+
if (rfb_state !== "normal" || conf.view_only) { return false; }
|
1793
|
+
Util.Info("Sending Ctrl-Alt-Del");
|
1794
|
+
var arr = [];
|
1795
|
+
arr = arr.concat(keyEvent(0xFFE3, 1)); // Control
|
1796
|
+
arr = arr.concat(keyEvent(0xFFE9, 1)); // Alt
|
1797
|
+
arr = arr.concat(keyEvent(0xFFFF, 1)); // Delete
|
1798
|
+
arr = arr.concat(keyEvent(0xFFFF, 0)); // Delete
|
1799
|
+
arr = arr.concat(keyEvent(0xFFE9, 0)); // Alt
|
1800
|
+
arr = arr.concat(keyEvent(0xFFE3, 0)); // Control
|
1801
|
+
arr = arr.concat(fbUpdateRequests());
|
1802
|
+
ws.send(arr);
|
1803
|
+
};
|
1804
|
+
|
1805
|
+
// Send a key press. If 'down' is not specified then send a down key
|
1806
|
+
// followed by an up key.
|
1807
|
+
that.sendKey = function(code, down) {
|
1808
|
+
if (rfb_state !== "normal" || conf.view_only) { return false; }
|
1809
|
+
var arr = [];
|
1810
|
+
if (typeof down !== 'undefined') {
|
1811
|
+
Util.Info("Sending key code (" + (down ? "down" : "up") + "): " + code);
|
1812
|
+
arr = arr.concat(keyEvent(code, down ? 1 : 0));
|
1813
|
+
} else {
|
1814
|
+
Util.Info("Sending key code (down + up): " + code);
|
1815
|
+
arr = arr.concat(keyEvent(code, 1));
|
1816
|
+
arr = arr.concat(keyEvent(code, 0));
|
1817
|
+
}
|
1818
|
+
arr = arr.concat(fbUpdateRequests());
|
1819
|
+
ws.send(arr);
|
1820
|
+
};
|
1821
|
+
|
1822
|
+
that.clipboardPasteFrom = function(text) {
|
1823
|
+
if (rfb_state !== "normal") { return; }
|
1824
|
+
//Util.Debug(">> clipboardPasteFrom: " + text.substr(0,40) + "...");
|
1825
|
+
ws.send(clientCutText(text));
|
1826
|
+
//Util.Debug("<< clipboardPasteFrom");
|
1827
|
+
};
|
1828
|
+
|
1829
|
+
// Override internal functions for testing
|
1830
|
+
that.testMode = function(override_send) {
|
1831
|
+
test_mode = true;
|
1832
|
+
that.recv_message = ws.testMode(override_send);
|
1833
|
+
|
1834
|
+
checkEvents = function () { /* Stub Out */ };
|
1835
|
+
that.connect = function(host, port, password) {
|
1836
|
+
rfb_host = host;
|
1837
|
+
rfb_port = port;
|
1838
|
+
rfb_password = password;
|
1839
|
+
updateState('ProtocolVersion', "Starting VNC handshake");
|
1840
|
+
};
|
1841
|
+
};
|
1842
|
+
|
1843
|
+
|
1844
|
+
return constructor(); // Return the public API interface
|
1845
|
+
|
1846
|
+
} // End of RFB()
|