zenoss_client 0.5.4 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +3 -1
- data/.travis.yml +9 -0
- data/Gemfile +1 -1
- data/README.textile +6 -1
- data/Rakefile +5 -4
- data/VERSION +1 -1
- data/lib/zenoss.rb +2 -2
- data/lib/zenoss/connection.rb +3 -2
- data/lib/zenoss/jsonapi/events_router.rb +0 -1
- data/lib/zenoss/model/devices/device.rb +9 -0
- data/test/docker/3.2.1/Dockerfile +11 -0
- data/test/docker/3.2.1/remote_start.sh +3 -0
- data/test/docker/3.2.1/start.sh +2 -0
- data/test/docker/4.2.5/Dockerfile +10 -0
- data/test/docker/4.2.5/remote_start.sh +12 -0
- data/test/docker/4.2.5/start.sh +2 -0
- data/test/fixtures/.gitkeep +0 -0
- data/test/fixtures/vcr_cassettes/3_2_1_initial_connection.yml +437 -0
- data/test/fixtures/vcr_cassettes/3_2_1_test_0001_returns_an_Array_of_devices_when_searched_by_name.yml +85 -0
- data/test/fixtures/vcr_cassettes/3_2_1_test_0002_returns_device_uptime_when_asked.yml +110 -0
- data/test/fixtures/vcr_cassettes/3_2_1_test_0003_returns_an_Array_of_events_for_a_device.yml +80 -0
- data/test/fixtures/vcr_cassettes/3_2_1_test_0004_returns_an_Array_of_historical_events_for_a_device.yml +80 -0
- data/test/fixtures/vcr_cassettes/3_2_1_test_0005_returns_info_for_a_device_in_the_form_of_a_Hash.yml +251 -0
- data/test/fixtures/vcr_cassettes/3_2_1_test_0006_returns_an_Array_of_events_for_all_devices.yml +86 -0
- data/test/fixtures/vcr_cassettes/3_2_1_test_0007_fetches_the_report_tree.yml +181 -0
- data/test/fixtures/vcr_cassettes/3_2_1_test_0008_fetches_available_report_types_and_returns_a_Hash.yml +82 -0
- data/test/fixtures/vcr_cassettes/3_2_1_test_0009_renames_the_device.yml +151 -0
- data/test/fixtures/vcr_cassettes/4_2_5_initial_connection.yml +594 -0
- data/test/fixtures/vcr_cassettes/4_2_5_test_0001_returns_an_Array_of_devices_when_searched_by_name.yml +93 -0
- data/test/fixtures/vcr_cassettes/4_2_5_test_0002_returns_device_uptime_when_asked.yml +114 -0
- data/test/fixtures/vcr_cassettes/4_2_5_test_0003_returns_an_Array_of_events_for_a_device.yml +99 -0
- data/test/fixtures/vcr_cassettes/4_2_5_test_0004_returns_an_Array_of_historical_events_for_a_device.yml +99 -0
- data/test/fixtures/vcr_cassettes/4_2_5_test_0005_returns_info_for_a_device_in_the_form_of_a_Hash.yml +234 -0
- data/test/fixtures/vcr_cassettes/4_2_5_test_0006_returns_an_Array_of_events_for_all_devices.yml +203 -0
- data/test/fixtures/vcr_cassettes/4_2_5_test_0007_fetches_the_report_tree.yml +203 -0
- data/test/fixtures/vcr_cassettes/4_2_5_test_0008_fetches_available_report_types_and_returns_a_Hash.yml +86 -0
- data/test/fixtures/vcr_cassettes/4_2_5_test_0009_renames_the_device.yml +160 -0
- data/test/test_helper.rb +20 -11
- data/test/zenoss_client_test.rb +140 -114
- data/zenoss_client.gemspec +13 -9
- metadata +104 -37
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: f8f07405207ee82f6bcaa25d7269cef6efceee00
         | 
| 4 | 
            +
              data.tar.gz: 098b6361c48aba30c8167547d57e906fa73c052b
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 49f02e82b15399437c4e5f9d4d8b8e4ec719a29af079171b79ce92c106e042b17d901e64bc3598d7f3549354a7b14dd643481fea872ae8c551d874dd7ecb52a7
         | 
| 7 | 
            +
              data.tar.gz: 2512bd62eab7f087dbb737b2173b62673b7c740f613342409291a624dc0d02d664d02a9e4238518b6d22601f85f1519219be771fcc6b50696d1785ce792ddb6f
         | 
    
        data/.gitignore
    CHANGED
    
    | @@ -12,6 +12,8 @@ spec/reports | |
| 12 12 | 
             
            test/tmp
         | 
| 13 13 | 
             
            test/version_tmp
         | 
| 14 14 | 
             
            tmp
         | 
| 15 | 
            +
            # Gemfile.lock shouldn't be checked in for gems
         | 
| 16 | 
            +
            Gemfile.lock
         | 
| 15 17 |  | 
| 16 18 | 
             
            # YARD artifacts
         | 
| 17 19 | 
             
            .yardoc
         | 
| @@ -21,4 +23,4 @@ doc/ | |
| 21 23 |  | 
| 22 24 | 
             
            # Extra's not part of the template
         | 
| 23 25 | 
             
            .buildpath
         | 
| 24 | 
            -
            .project
         | 
| 26 | 
            +
            .project
         | 
    
        data/.travis.yml
    ADDED
    
    
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.textile
    CHANGED
    
    | @@ -72,7 +72,7 @@ Have fun and let me know what needs to be fixed / added. | |
| 72 72 | 
             
            == Testing
         | 
| 73 73 | 
             
            You can invoke a series of minitest based spec test using the supplied
         | 
| 74 74 | 
             
            tests and rake task. Simply run the following to kick off the tests
         | 
| 75 | 
            -
            @rake test@
         | 
| 75 | 
            +
            @bundle exec rake test@
         | 
| 76 76 |  | 
| 77 77 | 
             
            You should see output similar to the following (The number of tests will
         | 
| 78 78 | 
             
            of course grow over time):
         | 
| @@ -80,3 +80,8 @@ of course grow over time): | |
| 80 80 |  | 
| 81 81 | 
             
            If you get any failures, you should of course address them
         | 
| 82 82 |  | 
| 83 | 
            +
            Since the test suite requires a working Zenoss installation to test against,
         | 
| 84 | 
            +
            some docker files are provided under test/docker. From a docker host, clone this
         | 
| 85 | 
            +
            repo, cd to the appropriate test/docker/ subdirectory, and run @sh start.sh@ to
         | 
| 86 | 
            +
            build and start the container. Once the container is running, you should be able
         | 
| 87 | 
            +
            to run the tests as described above.
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -1,8 +1,9 @@ | |
| 1 1 | 
             
            require 'rubygems'
         | 
| 2 2 | 
             
            require 'rake/clean'
         | 
| 3 | 
            -
            require ' | 
| 4 | 
            -
            require ' | 
| 3 | 
            +
            require 'rubygems/package_task'
         | 
| 4 | 
            +
            require 'rdoc/task'
         | 
| 5 5 | 
             
            require 'rake/testtask'
         | 
| 6 | 
            +
            require 'date'
         | 
| 6 7 |  | 
| 7 8 | 
             
            CLEAN.include("pkg")
         | 
| 8 9 | 
             
            CLEAN.include("doc")
         | 
| @@ -33,8 +34,8 @@ GEMSPEC = Gem::Specification.new do |gem| | |
| 33 34 | 
             
              gem.add_runtime_dependency  'tzinfo'
         | 
| 34 35 | 
             
              gem.post_install_message	= "See README.rdoc"
         | 
| 35 36 | 
             
            end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 37 | 
            +
             | 
| 38 | 
            +
            Gem::PackageTask.new(GEMSPEC) do |pkg|
         | 
| 38 39 | 
             
              pkg.need_tar = true
         | 
| 39 40 | 
             
            end
         | 
| 40 41 |  | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0. | 
| 1 | 
            +
            0.6.0
         | 
    
        data/lib/zenoss.rb
    CHANGED
    
    | @@ -32,8 +32,8 @@ module Zenoss | |
| 32 32 |  | 
| 33 33 | 
             
              # initialize a connection to a Zenoss server. This is the same as doing
         | 
| 34 34 | 
             
              #   Zenoss::Connection.new(server,user,pass)
         | 
| 35 | 
            -
              def Zenoss.connect(server, user, pass, &block)
         | 
| 36 | 
            -
                Connection.new(server,user,pass | 
| 35 | 
            +
              def Zenoss.connect(server, user, pass, opts = {}, &block)
         | 
| 36 | 
            +
                Connection.new(server, user, pass, opts, &block)
         | 
| 37 37 | 
             
              end
         | 
| 38 38 |  | 
| 39 39 | 
             
              # Some of the REST methods return Strings that are formated like a Python list.
         | 
    
        data/lib/zenoss/connection.rb
    CHANGED
    
    | @@ -31,13 +31,13 @@ module Zenoss | |
| 31 31 | 
             
                include Zenoss::JSONAPI::ReportRouter
         | 
| 32 32 | 
             
                include Zenoss::RESTAPI
         | 
| 33 33 |  | 
| 34 | 
            -
                def initialize(url, user, pass, &block)
         | 
| 34 | 
            +
                def initialize(url, user, pass, opts = {}, &block)
         | 
| 35 35 | 
             
                  @zenoss_uri = (url.is_a?(URI) ? url : URI.parse(url))
         | 
| 36 36 | 
             
                  @request_number = 1
         | 
| 37 37 | 
             
                  @httpcli = HTTPClient.new
         | 
| 38 38 | 
             
                  @httpcli.receive_timeout = 360  # six minutes should be more that sufficient
         | 
| 39 39 | 
             
                  yield(@httpcli) if block_given?
         | 
| 40 | 
            -
                  sign_in(user,pass)
         | 
| 40 | 
            +
                  sign_in(user, pass) unless opts[:no_sign_in]
         | 
| 41 41 | 
             
                end
         | 
| 42 42 |  | 
| 43 43 | 
             
                private
         | 
| @@ -54,6 +54,7 @@ module Zenoss | |
| 54 54 | 
             
                  resp = @httpcli.post login_path, login_parms
         | 
| 55 55 | 
             
                  if(resp.status == 302)
         | 
| 56 56 | 
             
                    login_path = resp.header['Location'].first
         | 
| 57 | 
            +
                    login_path = "#{@zenoss_uri}/#{login_path}"
         | 
| 57 58 | 
             
                    resp = @httpcli.post login_path, login_parms 
         | 
| 58 59 | 
             
                    raise ZenossError, "(HTTP Response #{resp.status}) Could not authenticate to #{@zenoss_uri}" unless resp.status == 200
         | 
| 59 60 | 
             
                  end
         | 
| @@ -202,6 +202,15 @@ module Zenoss | |
| 202 202 | 
             
                    rest("getSystemNamesString?sep=#{sep}")
         | 
| 203 203 | 
             
                  end
         | 
| 204 204 |  | 
| 205 | 
            +
                  # Change name of the device
         | 
| 206 | 
            +
                  def rename_device(new_name)
         | 
| 207 | 
            +
                    ret = rest("renameDevice?newId=#{new_name}")
         | 
| 208 | 
            +
                    if ret
         | 
| 209 | 
            +
                      self.name  = new_name
         | 
| 210 | 
            +
                    end
         | 
| 211 | 
            +
                    return ret
         | 
| 212 | 
            +
                  end
         | 
| 213 | 
            +
             | 
| 205 214 |  | 
| 206 215 | 
             
                  private
         | 
| 207 216 |  | 
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            FROM centos:5
         | 
| 2 | 
            +
            RUN mkdir /opt/zenoss
         | 
| 3 | 
            +
            WORKDIR /opt/zenoss
         | 
| 4 | 
            +
            RUN yum -y install mysql-server net-snmp net-snmp-utils gmp \
         | 
| 5 | 
            +
                libgomp libgcj liberation-fonts libaio wget
         | 
| 6 | 
            +
            RUN wget http://downloads.sourceforge.net/project/zenoss/zenoss-3.2/zenoss-3.2.1/zenoss-3.2.1.el5.x86_64.rpm
         | 
| 7 | 
            +
            RUN service mysqld start && mysqladmin -u root password '' && \
         | 
| 8 | 
            +
                mysqladmin -u root -h localhost password ''
         | 
| 9 | 
            +
            RUN rpm -ivh ./zenoss-3.2.1.el5.x86_64.rpm
         | 
| 10 | 
            +
            RUN service zenoss start
         | 
| 11 | 
            +
            ADD remote_start.sh ./
         | 
| @@ -0,0 +1,10 @@ | |
| 1 | 
            +
            FROM centos:6
         | 
| 2 | 
            +
            RUN mkdir /opt/zenoss
         | 
| 3 | 
            +
            WORKDIR /opt/zenoss
         | 
| 4 | 
            +
            RUN yum -y install wget which
         | 
| 5 | 
            +
            ADD https://raw.githubusercontent.com/zenoss/core-autodeploy/4.2.5/core-autodeploy.sh ./
         | 
| 6 | 
            +
            ADD https://raw.githubusercontent.com/zenoss/core-autodeploy/4.2.5/secure_zenoss.sh ./
         | 
| 7 | 
            +
            ADD https://raw.githubusercontent.com/zenoss/core-autodeploy/4.2.5/zenpack_actions.txt ./
         | 
| 8 | 
            +
            RUN chmod +x /core-autodeploy.sh
         | 
| 9 | 
            +
            RUN echo -e "\ny\n" | /core-autodeploy.sh
         | 
| 10 | 
            +
            ADD remote_start.sh ./
         | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            #!/bin/sh
         | 
| 2 | 
            +
            service zenoss start &
         | 
| 3 | 
            +
            service mysql start &
         | 
| 4 | 
            +
            service rabbitmq-server start
         | 
| 5 | 
            +
            rabbitmqctl stop_app
         | 
| 6 | 
            +
            rabbitmqctl reset
         | 
| 7 | 
            +
            rabbitmqctl start_app
         | 
| 8 | 
            +
            rabbitmqctl add_vhost "/zenoss"
         | 
| 9 | 
            +
            rabbitmqctl add_user zenoss \
         | 
| 10 | 
            +
                        "$(sed -n 's/amqppassword \(.*\)/\1/p' /opt/zenoss/etc/global.conf)"
         | 
| 11 | 
            +
            rabbitmqctl set_permissions -p "/zenoss" zenoss ".*" ".*" ".*"
         | 
| 12 | 
            +
            tail -F /opt/zenoss/log/event.log
         | 
| 
            File without changes
         | 
| @@ -0,0 +1,437 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            http_interactions:
         | 
| 3 | 
            +
            - request:
         | 
| 4 | 
            +
                method: post
         | 
| 5 | 
            +
                uri: http://192.168.56.2:9080/zport/dmd/zport/acl_users/cookieAuthHelper/login
         | 
| 6 | 
            +
                body:
         | 
| 7 | 
            +
                  encoding: UTF-8
         | 
| 8 | 
            +
                  string: __ac_name=admin&__ac_password=zenoss&submitted=true&came_from=http%3A%2F%2F192.168.56.2%3A9080%2Fzport%2Fdmd%2Fzport%2Fdmd
         | 
| 9 | 
            +
                headers:
         | 
| 10 | 
            +
                  User-Agent:
         | 
| 11 | 
            +
                  - HTTPClient/1.0 (2.6.0.1, ruby 2.2.0 (2014-12-25))
         | 
| 12 | 
            +
                  Accept:
         | 
| 13 | 
            +
                  - "*/*"
         | 
| 14 | 
            +
                  Date:
         | 
| 15 | 
            +
                  - Fri, 22 May 2015 12:19:38 GMT
         | 
| 16 | 
            +
                  Content-Type:
         | 
| 17 | 
            +
                  - application/x-www-form-urlencoded
         | 
| 18 | 
            +
              response:
         | 
| 19 | 
            +
                status:
         | 
| 20 | 
            +
                  code: 302
         | 
| 21 | 
            +
                  message: Moved Temporarily
         | 
| 22 | 
            +
                headers:
         | 
| 23 | 
            +
                  Server:
         | 
| 24 | 
            +
                  - Zope/(2.12.1, python 2.6.2, linux2) ZServer/1.1
         | 
| 25 | 
            +
                  Date:
         | 
| 26 | 
            +
                  - Fri, 22 May 2015 12:19:38 GMT
         | 
| 27 | 
            +
                  Content-Length:
         | 
| 28 | 
            +
                  - '59'
         | 
| 29 | 
            +
                  Content-Type:
         | 
| 30 | 
            +
                  - text/plain; charset=utf-8
         | 
| 31 | 
            +
                  Location:
         | 
| 32 | 
            +
                  - http://192.168.56.2:9080/zport/dmd/zport/dmd?submitted=true
         | 
| 33 | 
            +
                  Set-Cookie:
         | 
| 34 | 
            +
                  - __ginger_snap="NjE2NDZkNjk2ZTo3YTY1NmU2ZjczNzM%253D"; Path=/
         | 
| 35 | 
            +
                body:
         | 
| 36 | 
            +
                  encoding: UTF-8
         | 
| 37 | 
            +
                  string: http://192.168.56.2:9080/zport/dmd/zport/dmd?submitted=true
         | 
| 38 | 
            +
                http_version: 
         | 
| 39 | 
            +
              recorded_at: Fri, 22 May 2015 12:19:38 GMT
         | 
| 40 | 
            +
            - request:
         | 
| 41 | 
            +
                method: post
         | 
| 42 | 
            +
                uri: http://192.168.56.2:9080/zport/dmd/http://192.168.56.2:9080/zport/dmd/zport/dmd?submitted=true
         | 
| 43 | 
            +
                body:
         | 
| 44 | 
            +
                  encoding: UTF-8
         | 
| 45 | 
            +
                  string: __ac_name=admin&__ac_password=zenoss&submitted=true&came_from=http%3A%2F%2F192.168.56.2%3A9080%2Fzport%2Fdmd%2Fzport%2Fdmd
         | 
| 46 | 
            +
                headers:
         | 
| 47 | 
            +
                  User-Agent:
         | 
| 48 | 
            +
                  - HTTPClient/1.0 (2.6.0.1, ruby 2.2.0 (2014-12-25))
         | 
| 49 | 
            +
                  Accept:
         | 
| 50 | 
            +
                  - "*/*"
         | 
| 51 | 
            +
                  Date:
         | 
| 52 | 
            +
                  - Fri, 22 May 2015 12:19:38 GMT
         | 
| 53 | 
            +
                  Content-Type:
         | 
| 54 | 
            +
                  - application/x-www-form-urlencoded
         | 
| 55 | 
            +
                  Cookie:
         | 
| 56 | 
            +
                  - __ginger_snap=NjE2NDZkNjk2ZTo3YTY1NmU2ZjczNzM%253D
         | 
| 57 | 
            +
              response:
         | 
| 58 | 
            +
                status:
         | 
| 59 | 
            +
                  code: 200
         | 
| 60 | 
            +
                  message: OK
         | 
| 61 | 
            +
                headers:
         | 
| 62 | 
            +
                  Server:
         | 
| 63 | 
            +
                  - Zope/(2.12.1, python 2.6.2, linux2) ZServer/1.1
         | 
| 64 | 
            +
                  Date:
         | 
| 65 | 
            +
                  - Fri, 22 May 2015 12:19:38 GMT
         | 
| 66 | 
            +
                  Content-Length:
         | 
| 67 | 
            +
                  - '23063'
         | 
| 68 | 
            +
                  Content-Type:
         | 
| 69 | 
            +
                  - text/html; charset=utf-8
         | 
| 70 | 
            +
                body:
         | 
| 71 | 
            +
                  encoding: UTF-8
         | 
| 72 | 
            +
                  string: "\n<html>\n    <head>\n<base href=\"http://192.168.56.2:9080/zport/dmd/zport/dmd/\"
         | 
| 73 | 
            +
                    />\n\n        <title>\n            Zenoss:\n            \n    Dashboard\n\n
         | 
| 74 | 
            +
                    \       </title>\n        <link rel=\"icon\" href=\"/zport/dmd/favicon.ico\"
         | 
| 75 | 
            +
                    type=\"image/x-icon\" />\n        <link rel=\"shortcut icon\" href=\"/zport/dmd/favicon.ico\"
         | 
| 76 | 
            +
                    type=\"image/x-icon\" />\n        <link rel=\"stylesheet\" type=\"text/css\"
         | 
| 77 | 
            +
                    href=\"/++resource++extjs/resources/css/ext-all.css\" />\n        <link rel=\"stylesheet\"
         | 
| 78 | 
            +
                    type=\"text/css\" href=\"/++resource++extjs/treegrid/treegrid.css\" />\n        <link
         | 
| 79 | 
            +
                    rel=\"stylesheet\" type=\"text/css\" href=\"/++resource++zenui/js/livegrid/resources/css/ext-ux-livegrid.css\"
         | 
| 80 | 
            +
                    />\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"/++resource++zenui/css/xtheme-zenoss.css\"
         | 
| 81 | 
            +
                    />\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"/++resource++zenui/css/zenoss.css\"
         | 
| 82 | 
            +
                    />\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"/++resource++zenui/css/zenui3.css\"
         | 
| 83 | 
            +
                    />\n        \n<script type=\"text/javascript\">\n    function _global_permissions(){\n
         | 
| 84 | 
            +
                    \       return {\"modify cookie crumblers\": true, \"add ram cache managers\":
         | 
| 85 | 
            +
                    true, \"reply to item\": true, \"zproperties edit\": true, \"maintenance windows
         | 
| 86 | 
            +
                    view\": true, \"maintenance windows edit\": true, \"define commands edit\":
         | 
| 87 | 
            +
                    true, \"add folders\": true, \"set own password\": true, \"add portal content\":
         | 
| 88 | 
            +
                    true, \"edit user groups\": true, \"review portal content\": true, \"manage
         | 
| 89 | 
            +
                    relations\": true, \"change cache managers\": true, \"add ofolders\": true,
         | 
| 90 | 
            +
                    \"create transient objects\": true, \"list undoable changes\": true, \"webdav
         | 
| 91 | 
            +
                    unlock items\": true, \"view modifications\": true, \"manage portal\": true,
         | 
| 92 | 
            +
                    \"change bindings\": true, \"delete device\": true, \"access transient objects\":
         | 
| 93 | 
            +
                    true, \"add dmd objects\": true, \"manage site\": true, \"gensummary\": true,
         | 
| 94 | 
            +
                    \"add restructuredtext documents\": true, \"zencommon\": true, \"manage transient
         | 
| 95 | 
            +
                    object container\": true, \"zproperties view\": true, \"request review\":
         | 
| 96 | 
            +
                    true, \"mail forgotten password\": true, \"change cache settings\": true,
         | 
| 97 | 
            +
                    \"add page templates\": true, \"change session data manager\": true, \"change
         | 
| 98 | 
            +
                    external methods\": true, \"managableindex: manage\": true, \"administrators
         | 
| 99 | 
            +
                    view\": true, \"add external methods\": true, \"define commands view\": true,
         | 
| 100 | 
            +
                    \"change device production state\": true, \"add site roots\": true, \"add
         | 
| 101 | 
            +
                    zentablemanager\": true, \"set own properties\": true, \"add plugin registrys\":
         | 
| 102 | 
            +
                    true, \"webdav lock items\": true, \"add mysqleventmanagers\": true, \"search
         | 
| 103 | 
            +
                    zcatalog\": true, \"access contents information\": true, \"add browser id
         | 
| 104 | 
            +
                    manager\": true, \"change dtml documents\": true, \"use mailhost services\":
         | 
| 105 | 
            +
                    true, \"change dtml methods\": true, \"view history\": true, \"add content
         | 
| 106 | 
            +
                    type registrys\": true, \"ftp access\": true, \"add vocabularies\": true,
         | 
| 107 | 
            +
                    \"edit local templates\": true, \"manage groups\": true, \"manage webdav locks\":
         | 
| 108 | 
            +
                    true, \"add toonerelationships\": true, \"add user folders\": true, \"add
         | 
| 109 | 
            +
                    cmf caching policy managers\": true, \"add temporary folder\": true, \"add
         | 
| 110 | 
            +
                    btreefolder2s\": true, \"administrators edit\": true, \"admin device\": true,
         | 
| 111 | 
            +
                    \"change python scripts\": true, \"change images and files\": true, \"change
         | 
| 112 | 
            +
                    database methods\": true, \"add python scripts\": true, \"change configuration\":
         | 
| 113 | 
            +
                    true, \"view\": true, \"access inactive portal content\": true, \"undo changes\":
         | 
| 114 | 
            +
                    true, \"run commands\": true, \"change admin objects\": true, \"webdav access\":
         | 
| 115 | 
            +
                    true, \"view management screens\": true, \"add session data manager\": true,
         | 
| 116 | 
            +
                    \"add mailhost objects\": true, \"add cmf core tools\": true, \"add database
         | 
| 117 | 
            +
                    methods\": true, \"change network\": true, \"import/export objects\": true,
         | 
| 118 | 
            +
                    \"manage vocabulary\": true, \"access arbitrary user session data\": true,
         | 
| 119 | 
            +
                    \"open/close database connections\": true, \"delete objects\": true, \"change
         | 
| 120 | 
            +
                    settings\": true, \"change page templates\": true, \"change device\": true,
         | 
| 121 | 
            +
                    \"add portal member\": true, \"change browser id manager\": true, \"manage
         | 
| 122 | 
            +
                    zcatalog entries\": true, \"send events\": true, \"manage eventmanager\":
         | 
| 123 | 
            +
                    true, \"access session data\": true, \"copy or move\": true, \"add filesystem
         | 
| 124 | 
            +
                    directory views\": true, \"add cookie crumblers\": true, \"add virtual host
         | 
| 125 | 
            +
                    monsters\": true, \"define permissions\": true, \"change event views\": true,
         | 
| 126 | 
            +
                    \"add tomanycontrelationships\": true, \"add documents, images, and files\":
         | 
| 127 | 
            +
                    true, \"manage access rules\": true, \"change alerting rules\": true, \"query
         | 
| 128 | 
            +
                    vocabulary\": true, \"modify portal content\": true, \"edit restructuredtext\":
         | 
| 129 | 
            +
                    true, \"manage dmd\": true, \"add generic setup tools\": true, \"zenupdate\":
         | 
| 130 | 
            +
                    true, \"add pluggable index\": true, \"add zcatalogs\": true, \"add portal
         | 
| 131 | 
            +
                    folders\": true, \"manage device status\": true, \"change local roles\": true,
         | 
| 132 | 
            +
                    \"add transient object container\": true, \"manage five local sites\": true,
         | 
| 133 | 
            +
                    \"add tomanyrelationships\": true, \"list portal members\": true, \"edit users\":
         | 
| 134 | 
            +
                    true, \"manage users\": true, \"change permissions\": true, \"use database
         | 
| 135 | 
            +
                    methods\": true, \"add accelerated http cache managers\": true, \"manage zcatalogindex
         | 
| 136 | 
            +
                    entries\": true, \"search for principals\": true, \"log to the event log\":
         | 
| 137 | 
            +
                    true, \"manage events\": true, \"ofolder: reorder\": true, \"log site errors\":
         | 
| 138 | 
            +
                    true, \"list folder contents\": true, \"add relationship managers\": true,
         | 
| 139 | 
            +
                    \"change proxy roles\": true, \"manage properties\": true, \"add zodb mount
         | 
| 140 | 
            +
                    points\": true, \"manage device\": true};\n    }\n</script>\n        \n        <script
         | 
| 141 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/adapters/ext/ext-base.js\"></script>\n\n\n<script
         | 
| 142 | 
            +
                    type=\"text/javascript\">\n\n         (function() {\n            var ua =
         | 
| 143 | 
            +
                    navigator.userAgent.toLowerCase();\n            if (ua.indexOf(\"firefox/3.6\")
         | 
| 144 | 
            +
                    > -1) {\n                Ext.toArray = function(a, i, j, res) {\n                    res
         | 
| 145 | 
            +
                    = [];\n                    Ext.each(a, function(v) { res.push(v); });\n                    return
         | 
| 146 | 
            +
                    res.slice(i || 0, j || res.length);\n                }\n            }\n        })();\n
         | 
| 147 | 
            +
                    \       \n</script>\n\n<script type=\"text/javascript\" src=\"/++resource++extjs/ext-all.js\"></script>\n\n<script
         | 
| 148 | 
            +
                    type=\"text/javascript\" src=\"/++resource++zenui/js/livegrid/livegrid-all.js\"></script>\n\n\n<script
         | 
| 149 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridSorter.js\"></script>\n<script
         | 
| 150 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridColumnResizer.js\"></script>\n<script
         | 
| 151 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridNodeUI.js\"></script>\n<script
         | 
| 152 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridLoader.js\"></script>\n<script
         | 
| 153 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridColumns.js\"></script>\n<script
         | 
| 154 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/fileuploadfield/FileUploadField.js\"></script>\n<script
         | 
| 155 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridLoader.js\"></script>\n<script
         | 
| 156 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGridColumns.js\"></script>\n<script
         | 
| 157 | 
            +
                    type=\"text/javascript\" src=\"/++resource++extjs/treegrid/TreeGrid.js\"></script>\n<script
         | 
| 158 | 
            +
                    type=\"text/javascript\" src=\"extdirect.js\"></script>\n\n<script type=\"text/javascript\"
         | 
| 159 | 
            +
                    src=\"zenoss-all.js?v=3.2.1\"></script>\n\n<script type=\"text/javascript\"
         | 
| 160 | 
            +
                    src=\"i18n.js\"></script>\n\n        <script></script>\n        \n        \n
         | 
| 161 | 
            +
                    \   \n    \n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"
         | 
| 162 | 
            +
                    />\n    <link rel=\"shortcut icon\" href=\"/zport/dmd/favicon.ico\" type=\"image/x-icon\"
         | 
| 163 | 
            +
                    />\n    <link rel=\"stylesheet\" href=\"yui/reset-fonts-grids/reset-fonts-grids.css\"
         | 
| 164 | 
            +
                    />\n    <link rel=\"stylesheet\" href=\"yui/base/base-min.css\" />\n    <link
         | 
| 165 | 
            +
                    rel=\"stylesheet\" href=\"/zport/portal_skins/zenoss.css\">\n    <!--[if IE
         | 
| 166 | 
            +
                    7]>\n        <link rel=\"stylesheet\" type=\"text/css\" title=\"zenoss\"\n
         | 
| 167 | 
            +
                    \           href=\"zenoss_ie.css\" >\n    <![endif]-->\n    <!--[if IE 6]>\n
         | 
| 168 | 
            +
                    \       <link rel=\"stylesheet\" type=\"text/css\" title=\"zenoss\"\n            href=\"zenoss_ie6.css\"
         | 
| 169 | 
            +
                    >\n    <![endif]-->\n    <script>\n        var DEBUG_MODE = false;\n        var
         | 
| 170 | 
            +
                    VERSION_ID = '321';\n    </script>\n    <script type=\"text/javascript\" src=\"js/MochiKit.js\"></script>\n
         | 
| 171 | 
            +
                    \   <script type=\"text/javascript\" language=\"javascript\" src=\"/zport/dmd/yui/yahoo/yahoo-min.js\"></script>\n
         | 
| 172 | 
            +
                    \   <script type=\"text/javascript\" language=\"javascript\" src=\"/zport/dmd/yui/yuiloader/yuiloader-min.js\"></script>\n
         | 
| 173 | 
            +
                    \   <script type=\"text/javascript\" src=\"javascript/zenoss-core.js\"></script>\n
         | 
| 174 | 
            +
                    \   <script>\n    var loader = YAHOO.zenoss.getLoader();\n    loader.require(['zenossutils']);\n
         | 
| 175 | 
            +
                    \   loader.insert({onSuccess:function(){\n        removeElementAutoCompletes();\n
         | 
| 176 | 
            +
                    \       applyBrowserSpecificStyles();\n        addSelectionBar();\n        checkForCollapsed();\n
         | 
| 177 | 
            +
                    \       connectCheckboxListeners();\n        notifyParentOfNewUrl();\n        zenPageInit();\n
         | 
| 178 | 
            +
                    \   }});\n    </script>\n\n\n    \n<script>\n\nvar submitFormToMethod = function(formname,
         | 
| 179 | 
            +
                    method) {\n//Basically for use in menu items, to obviate creating dummy forms\n//or
         | 
| 180 | 
            +
                    menu items that are actually buttons.\n   f = document.forms[formname];\n
         | 
| 181 | 
            +
                    \  f.action = '/zport/dmd/' + method;\n   f.submit();\n}\n\nvar goExport =
         | 
| 182 | 
            +
                    function() {\n    var params = {};\n    if (eventZenGrid.lastparams['severity'])\n
         | 
| 183 | 
            +
                    \       params['sev'] = eventZenGrid.lastparams['severity'];\n    if (eventZenGrid.lastparams['state'])\n
         | 
| 184 | 
            +
                    \       params['state'] = eventZenGrid.lastparams['state'];\n    if (eventZenGrid.lastparams['filter'])\n
         | 
| 185 | 
            +
                    \       params['filter'] = eventZenGrid.lastparams['filter'];\n    if (eventZenGrid.lastparams['startdate'])\n
         | 
| 186 | 
            +
                    \       params['startdate'] = eventZenGrid.lastparams['startdate'];\n    if
         | 
| 187 | 
            +
                    (eventZenGrid.lastparams['enddate'])\n        params['enddate'] = eventZenGrid.lastparams['enddate'];\n
         | 
| 188 | 
            +
                    \   if (eventZenGrid.lastparams['orderby'])\n        params['orderby'] = eventZenGrid.lastparams['orderby'];\n
         | 
| 189 | 
            +
                    \   log(keys(params));\n    log(queryString(params));\n    url = '/zport/dmd/exportEvents?'
         | 
| 190 | 
            +
                    + queryString(params);\n    parent.location = url;\n}\n\naddLoadEvent(function()
         | 
| 191 | 
            +
                    {\n\n    YAHOO.zenoss.templateFreeURL = '/zport/dmd';\n    YAHOO.zenoss.ZENOSS_VERSION
         | 
| 192 | 
            +
                    = '3.2.1';\n    YAHOO.zenoss.ZENOSS_PRODUCT = 'core';\n\n});\n\n\n\n</script>\n\n
         | 
| 193 | 
            +
                    \   <link rel=\"stylesheet\" href=\"/++resource++zenui/css/backcompat.css\"
         | 
| 194 | 
            +
                    />\n\n        \n<script type=\"text/javascript\">\n\n        Ext.onReady(function(){\n
         | 
| 195 | 
            +
                    \           Zenoss.env.EVENT_CLASSES = ['/App', '/App/Citrix', '/App/Conn',
         | 
| 196 | 
            +
                    '/App/Conn/Max', '/App/Email', '/App/Email/Loop', '/App/Failed', '/App/Info',
         | 
| 197 | 
            +
                    '/App/Install', '/App/Job', '/App/Job/Fail', '/App/Log', '/App/Print', '/App/Reload',
         | 
| 198 | 
            +
                    '/App/Start', '/App/Stop', '/App/VNC', '/Archive', '/Change', '/Change/Add',
         | 
| 199 | 
            +
                    '/Change/Add/Blocked', '/Change/Remove', '/Change/Remove/Blocked', '/Change/Set',
         | 
| 200 | 
            +
                    '/Change/Set/Blocked', '/Cisco', '/Cisco/FW', '/Cluster', '/Cluster/Heartbeat',
         | 
| 201 | 
            +
                    '/Cmd', '/Cmd/Fail', '/Cmd/Ok', '/Config', '/DB', '/DB/Filemaker', '/Environ',
         | 
| 202 | 
            +
                    '/HW', '/HW/Backup', '/HW/Backup/Robot', '/HW/Backup/SCSI', '/HW/Backup/Tape
         | 
| 203 | 
            +
                    Drive', '/HW/Backup/Tape Media', '/HW/Blade', '/HW/Management', '/HW/Memory',
         | 
| 204 | 
            +
                    '/HW/Network', '/HW/Network/AdapterDown', '/HW/Network/TeamDown', '/HW/Power',
         | 
| 205 | 
            +
                    '/HW/Power/PowerLoss', '/HW/Power/UPS', '/HW/Power/UPS/SmartBoost', '/HW/Store',
         | 
| 206 | 
            +
                    '/HW/Store/FiberChannel', '/HW/Temperature', '/HW/Temperature/Fan', '/Heartbeat',
         | 
| 207 | 
            +
                    '/Ignore', '/Ignore/Win', '/License', '/Net', '/Net/Conflict', '/Net/Dhcp',
         | 
| 208 | 
            +
                    '/Net/Dhcp/Ack', '/Net/Dhcp/Inform', '/Net/Dhcp/Obtained', '/Net/Dhcp/Request',
         | 
| 209 | 
            +
                    '/Net/Link', '/Net/NS', '/Net/SpanTree', '/Net/Time', '/OS', '/OS/Pagefile',
         | 
| 210 | 
            +
                    '/OS/Reboot', '/Perf', '/Perf/CPU', '/Perf/Filesystem', '/Perf/Interface',
         | 
| 211 | 
            +
                    '/Perf/Memory', '/Perf/Snmp', '/Perf/XmlRpc', '/Security', '/Security/Auth',
         | 
| 212 | 
            +
                    '/Security/Conn', '/Security/Conn/Close', '/Security/Conn/Open', '/Security/Login',
         | 
| 213 | 
            +
                    '/Security/Login/BadPass', '/Security/Login/Fail', '/Security/Sudo', '/Security/Virus',
         | 
| 214 | 
            +
                    '/Status', '/Status/Heartbeat', '/Status/IpService', '/Status/Nagios', '/Status/OSProcess',
         | 
| 215 | 
            +
                    '/Status/Perf', '/Status/Ping', '/Status/Snmp', '/Status/Update', '/Status/Web',
         | 
| 216 | 
            +
                    '/Status/WinService', '/Status/Wmi', '/Status/Wmi/Conn', '/Status/XmlRpc',
         | 
| 217 | 
            +
                    '/Status/zenwinmodeler', '/Storage', '/Storage/Full', '/Storage/SAN', '/Unknown',
         | 
| 218 | 
            +
                    '/Users', '/Win', '/Win/AD', '/Win/DCOM', '/Win/Exchange', '/Win/NetBios',
         | 
| 219 | 
            +
                    '/Win/PWMgr', '/Win/SharePoint', '/Win/Shell', '/Win/Userenv', '/Win/WindowsUpdate',
         | 
| 220 | 
            +
                    '/Win/WindowsUpdate/Failure', '/Win/WindowsUpdate/Pending', '/Win/WindowsUpdate/Success',
         | 
| 221 | 
            +
                    '/Win/evtsys'];\n        })\n        \nExt.onReady(function(){Zenoss.env.COLUMN_DEFINITIONS=[\n{\"sortable\":
         | 
| 222 | 
            +
                    true, \"header\": \"Status\", \"filter\": {\"text\": \"...\", \"xtype\": \"multiselectmenu\",
         | 
| 223 | 
            +
                    \"source\": [{\"name\": \"New\", \"value\": 0}, {\"name\": \"Acknowledged\",
         | 
| 224 | 
            +
                    \"value\": 1}, {\"checked\": false, \"name\": \"Suppressed\", \"value\": 2}]},
         | 
| 225 | 
            +
                    \"width\": 60, \"dataIndex\": \"eventState\", \"id\": \"eventState\", \"renderer\":
         | 
| 226 | 
            +
                    Zenoss.util.render_status},\n{\"sortable\": true, \"header\": \"Severity\",
         | 
| 227 | 
            +
                    \"filter\": {\"text\": \"...\", \"xtype\": \"multiselectmenu\", \"source\":
         | 
| 228 | 
            +
                    [{\"name\": \"Critical\", \"value\": 5}, {\"name\": \"Error\", \"value\":
         | 
| 229 | 
            +
                    4}, {\"name\": \"Warning\", \"value\": 3}, {\"name\": \"Info\", \"value\":
         | 
| 230 | 
            +
                    2}, {\"checked\": false, \"name\": \"Debug\", \"value\": 1}, {\"checked\":
         | 
| 231 | 
            +
                    false, \"name\": \"Clear\", \"value\": 0}]}, \"width\": 60, \"dataIndex\":
         | 
| 232 | 
            +
                    \"severity\", \"id\": \"severity\", \"renderer\": Zenoss.util.render_severity},\n{\"sortable\":
         | 
| 233 | 
            +
                    true, \"filter\": {\"xtype\": \"textfield\"}, \"header\": \"Device\", \"dataIndex\":
         | 
| 234 | 
            +
                    \"device\", \"id\": \"device\", \"renderer\": Zenoss.render.linkFromGrid},\n{\"sortable\":
         | 
| 235 | 
            +
                    true, \"header\": \"Component\", \"filter\": {\"xtype\": \"textfield\"}, \"width\":
         | 
| 236 | 
            +
                    80, \"dataIndex\": \"component\", \"id\": \"component\", \"renderer\": Zenoss.render.DeviceComponent},\n{\"sortable\":
         | 
| 237 | 
            +
                    true, \"header\": \"Event Class\", \"filter\": {\"xtype\": \"textfield\"},
         | 
| 238 | 
            +
                    \"width\": 80, \"dataIndex\": \"eventClass\", \"id\": \"eventClass\", \"renderer\":
         | 
| 239 | 
            +
                    Zenoss.render.linkFromGrid},\n{\"filter\": {\"xtype\": \"textfield\"}, \"header\":
         | 
| 240 | 
            +
                    \"Summary\", \"sortable\": true, \"id\": \"summary\", \"dataIndex\": \"summary\"},\n{\"sortable\":
         | 
| 241 | 
            +
                    true, \"header\": \"First Seen\", \"filter\": {\"xtype\": \"datefield\", \"format\":
         | 
| 242 | 
            +
                    \"Y-m-d H:i:s\"}, \"width\": 100, \"dataIndex\": \"firstTime\", \"id\": \"firstTime\",
         | 
| 243 | 
            +
                    \"renderer\": Ext.util.Format.dateRenderer(Zenoss.date.ISO8601NoYear)},\n{\"sortable\":
         | 
| 244 | 
            +
                    true, \"header\": \"Last Seen\", \"filter\": {\"xtype\": \"datefield\", \"format\":
         | 
| 245 | 
            +
                    \"Y-m-d H:i:s\"}, \"width\": 100, \"dataIndex\": \"lastTime\", \"id\": \"lastTime\",
         | 
| 246 | 
            +
                    \"renderer\": Ext.util.Format.dateRenderer(Zenoss.date.ISO8601NoYear)},\n{\"sortable\":
         | 
| 247 | 
            +
                    true, \"header\": \"Count\", \"filter\": {\"vtype\": \"numcmp\", \"xtype\":
         | 
| 248 | 
            +
                    \"textfield\"}, \"width\": 60, \"dataIndex\": \"count\", \"id\": \"count\"}\n];\nZenoss.env.EVENT_AUTO_EXPAND_COLUMN='summary';});\n\n
         | 
| 249 | 
            +
                    \           Ext.namespace('Zenoss.settings');\n            Zenoss.settings.enableLiveSearch
         | 
| 250 | 
            +
                    = true;\n        \n        \n</script>\n\n    </head>\n\n    <body>\n        <div
         | 
| 251 | 
            +
                    id=\"header\">\n            <div class=\"bg\">\n                <div class=\"bg-leftcap\">\n
         | 
| 252 | 
            +
                    \                   <div class=\"bg-tile\">\n                        <div
         | 
| 253 | 
            +
                    class=\"bg-logo\"></div>\n                        <div id=\"primarynav\">\n
         | 
| 254 | 
            +
                    \                           <ul><li class=\"nav-item-active\">\n<div class=\"sd-left\">\n
         | 
| 255 | 
            +
                    \   <div class=\"sd-right\">\n        <a href=\"/zport/dmd/Dashboard\" target=\"_self\">Dashboard</a>\n
         | 
| 256 | 
            +
                    \  </div>\n</div>\n</li>\n\n<li class=\"nav-item-inactive\">\n<div class=\"sd-left\">\n
         | 
| 257 | 
            +
                    \   <div class=\"sd-right\">\n        <a href=\"/zport/dmd/Events/evconsole\"
         | 
| 258 | 
            +
                    target=\"_self\">Events</a>\n   </div>\n</div>\n</li>\n\n<li class=\"nav-item-inactive\">\n<div
         | 
| 259 | 
            +
                    class=\"sd-left\">\n    <div class=\"sd-right\">\n        <a href=\"/zport/dmd/itinfrastructure\"
         | 
| 260 | 
            +
                    target=\"_self\">Infrastructure</a>\n   </div>\n</div>\n</li>\n\n<li class=\"nav-item-inactive\">\n<div
         | 
| 261 | 
            +
                    class=\"sd-left\">\n    <div class=\"sd-right\">\n        <a href=\"/zport/dmd/reports\"
         | 
| 262 | 
            +
                    target=\"_self\">Reports</a>\n   </div>\n</div>\n</li>\n\n<li class=\"nav-item-inactive\">\n<div
         | 
| 263 | 
            +
                    class=\"sd-left\">\n    <div class=\"sd-right\">\n        <a href=\"/zport/dmd/editSettings\"
         | 
| 264 | 
            +
                    target=\"_self\">Advanced</a>\n   </div>\n</div>\n</li>\n</ul>\n                            <div
         | 
| 265 | 
            +
                    id=\"header-extra\">\n                                <div id=\"searchbox-container\"></div>\n
         | 
| 266 | 
            +
                    \                               <div id=\"saved-search-container\"></div>\n
         | 
| 267 | 
            +
                    \                               <div id=\"user-link-container\">\n                                    <a\n
         | 
| 268 | 
            +
                    \   href=\"/zport/dmd/ZenUsers/admin\">\n                                    admin\n
         | 
| 269 | 
            +
                    \                                   </a>\n                                </div>\n
         | 
| 270 | 
            +
                    \                               <div id=\"sign-out-link\">\n                                    <a
         | 
| 271 | 
            +
                    href=\"/zport/dmd/logoutUser\">sign out</a>\n                                </div>\n
         | 
| 272 | 
            +
                    \                               <div>\n                                    <div
         | 
| 273 | 
            +
                    id=\"help-icon-container\">\n                                        <span></span><!--
         | 
| 274 | 
            +
                    ie needs empty span tags in some versions -->\n                                        <a
         | 
| 275 | 
            +
                    target=\"_blank\"\n    alt=\"Help\"\n    href=\"http://www.zenoss.com/help?version=3.2.1\"> </a>\n
         | 
| 276 | 
            +
                    \                                   </div>\n                                </div>\n
         | 
| 277 | 
            +
                    \                           </div>\n                        </div>\n                        <div
         | 
| 278 | 
            +
                    id=\"secondarynav\">\n                            <ul></ul>\n                            \n\n
         | 
| 279 | 
            +
                    \                       </div>\n                    </div>\n                </div>\n
         | 
| 280 | 
            +
                    \           </div>\n        </div>\n        <div id=\"center\">\n            \n
         | 
| 281 | 
            +
                    \   \n<form name=\"proxy_form\" id=\"proxy_form\"\n      style=\"position:absolute;visibility:hidden\"\n
         | 
| 282 | 
            +
                    \     action=\"/zport/dmd\"></form>\n<form method=\"post\" name=\"proxyForm\"
         | 
| 283 | 
            +
                    action=\"here/absolute_url\"> \n    <input type=\"hidden\" name=\"zenScreenName\"\n
         | 
| 284 | 
            +
                    \          value=\"Dashboard.pt\" /> \n</form>\n\n    \n\n<div id=\"dialog\"
         | 
| 285 | 
            +
                    class=\"dialog\" style=\"visibility:hidden;position:absolute\"> \n<div id=\"dialog_innercontent\">\n
         | 
| 286 | 
            +
                    \   \n\n<div style=\"text-align:center\">\n<h2>Loading...</h2>\n<br />\n<img
         | 
| 287 | 
            +
                    src=\"img/spinning_wheel_throbber.gif\" />\n</div>\n\n\n</div>\n<img id=\"dialog_close\"
         | 
| 288 | 
            +
                    src=\"/++resource++zenui/img/xtheme-zenoss/window/close-button.png\" class=\"dialog_close\"
         | 
| 289 | 
            +
                    />\n</div>\n<script>\nloader = YAHOO.zenoss.getLoader();\nloader.require(['zenossutils']);\nloader.insert({\n
         | 
| 290 | 
            +
                    \   onSuccess: function(){\n        mydialog = new Dialog.Box($('dialog'));\n
         | 
| 291 | 
            +
                    \       connect('dialog_close','onclick', mydialog.box.hide);\n        $('dialog').style.visibility
         | 
| 292 | 
            +
                    = '';\n    }\n});\n</script>\n\n\n    \n        <div id=\"contentPaneContainer\">\n
         | 
| 293 | 
            +
                    \           \n<div id=\"portletContainer\"></div>\n<script>\n    var start_time
         | 
| 294 | 
            +
                    = '2015-05-22 12:19:38';\n    var state = '';\n    if(state) var dashboardState
         | 
| 295 | 
            +
                    = evalJSON(state);\n</script>\n<script>\nvar server_time = isoTimestamp(start_time).getTime();\nvar
         | 
| 296 | 
            +
                    updateTime = {\n    run: function () {\n        server_time += 1000;\n    },\n
         | 
| 297 | 
            +
                    \   interval: 1000\n}\nExt.TaskMgr.start(updateTime);\n\nfunction getServerTimestamp()
         | 
| 298 | 
            +
                    {\n    var server_now = new Date(server_time);\n    return toISOTimestamp(server_now);\n}\n\n//
         | 
| 299 | 
            +
                    Initialization of dashboard portlets\nvar ContainerObject;\nfunction initDashboardPortlets()
         | 
| 300 | 
            +
                    {\n    ContainerObject = new YAHOO.zenoss.portlet.PortletContainer(\n        'portletContainer');\n
         | 
| 301 | 
            +
                    \   YAHOO.zenoss.globalPortletContainer = ContainerObject;\n    if (dashboardState)
         | 
| 302 | 
            +
                    {\n        ContainerObject.restore(dashboardState);\n    } else {\n        //
         | 
| 303 | 
            +
                    Create a default dashboard\n        ContainerObject.setLayout('2coleq', false);\n
         | 
| 304 | 
            +
                    \       ContainerObject.restoreDefaults();\n    }\n}\nvar loader = YAHOO.zenoss.getLoader();\nloader.require(['portletsource']);\nloader.insert({
         | 
| 305 | 
            +
                    'onSuccess':initDashboardPortlets });\n\n</script>\n<style>\n    .z-bc .z-bc-content-pane
         | 
| 306 | 
            +
                    {\n        background-color: #888;\n    }\n</style>\n\n        </div>\n    \n\n
         | 
| 307 | 
            +
                    \       </div>\n        <div id=\"footer\">\n        </div>\n        <div
         | 
| 308 | 
            +
                    id=\"footer_extra\">\n        </div>\n\n\n<form id=\"exportform\" method=\"post\"
         | 
| 309 | 
            +
                    action=\"/zport/dmd/Events/export\">\n    <input type=\"hidden\" id=\"export_body\"
         | 
| 310 | 
            +
                    name=\"body\" />\n</form>\n<script type=\"text/javascript\">\nExt.onReady(function(){\nvar
         | 
| 311 | 
            +
                    viewport = new Ext.Viewport({\n    id: 'viewport',\n    layout: 'border',\n
         | 
| 312 | 
            +
                    \   cls: 'zenui3',\n    defaults: {\n        'border': false\n    },\n    items:
         | 
| 313 | 
            +
                    [\n        new Ext.BoxComponent({\n            region: 'north',\n            el:
         | 
| 314 | 
            +
                    'header',\n            height: 75,\n            id: 'header_panel'\n        }),{\n
         | 
| 315 | 
            +
                    \           id: 'footer_panel',\n            region: 'south',\n            height:
         | 
| 316 | 
            +
                    30,\n            layout: 'fit',\n            el: 'footer',\n            items:
         | 
| 317 | 
            +
                    [\n                new Ext.Toolbar({\n                    border: false,\n
         | 
| 318 | 
            +
                    \                   id: 'footer_bar',\n                    listeners: {\n
         | 
| 319 | 
            +
                    \                       render: function(bar){\n                            Ext.get('footer_extra').appendTo(bar.getEl());\n
         | 
| 320 | 
            +
                    \                       }\n                    }\n                })\n            ],\n
         | 
| 321 | 
            +
                    \           border: false\n        },{\n            id: 'center_panel',\n
         | 
| 322 | 
            +
                    \           region: 'center',\n            el: 'center',\n            layout:
         | 
| 323 | 
            +
                    'fit',\n            border: false,\n            defaults: {\n                'border':
         | 
| 324 | 
            +
                    false\n            }\n        }\n    ]\n});\n});\n</script>\n\n\n<script>\n//
         | 
| 325 | 
            +
                    A little pre-javascript layout hackery to prevent appearance of re-layout.\n//
         | 
| 326 | 
            +
                    If there are breadcrumbs the tabs pane needs to be bumped up.\nif (Zenoss.env.pageHasBreadCrumbs)
         | 
| 327 | 
            +
                    {\n    try {\n        Ext.get('newTabsPane').setStyle({\n            top:
         | 
| 328 | 
            +
                    -23,\n            position: 'relative'\n        });\n    } catch(e) {}\n}\nExt.onReady(function(){\n
         | 
| 329 | 
            +
                    \   var outerItems = [],\n    innerItems = [{\n        region: 'center',\n
         | 
| 330 | 
            +
                    \       autoScroll: true,\n        bodyCssClass: 'z-bc-content-pane',\n        contentEl:
         | 
| 331 | 
            +
                    'contentPaneContainer',\n        split: true\n    }];\n    if (Zenoss.env.pageHasTabs)
         | 
| 332 | 
            +
                    {\n        outerItems.push({\n            region: 'west',\n            width:
         | 
| 333 | 
            +
                    200,\n            bodyCssClass: 'z-bc-tab-pane',\n            contentEl: 'newTabsPane',\n
         | 
| 334 | 
            +
                    \           split: true\n        });\n    }\n    if (Zenoss.env.pageHasBreadCrumbs)
         | 
| 335 | 
            +
                    {\n        innerItems.push({\n            region: 'north',\n            height:
         | 
| 336 | 
            +
                    24,\n            bodyCssClass: 'z-bc-bread-crumb-pane',\n            contentEl:
         | 
| 337 | 
            +
                    'breadCrumbPane'\n        });\n    }\n    outerItems.push({\n        region:
         | 
| 338 | 
            +
                    'center',\n        layout: 'border',\n        defaults: {\n            border:
         | 
| 339 | 
            +
                    false\n        },\n        items: innerItems\n    });\n\n    // Undo all the
         | 
| 340 | 
            +
                    pre-layout css\n    try {\n        Ext.get('contentPaneContainer').setStyle({\n
         | 
| 341 | 
            +
                    \           marginLeft: 0\n        });\n    } catch(e) {}\n    try {\n        Ext.get('newTabsPane').setStyle({\n
         | 
| 342 | 
            +
                    \           top: 0,\n            position: 'static'\n        });\n    } catch(e)
         | 
| 343 | 
            +
                    {}\n    try {\n        Ext.get('breadCrumbPane').setStyle({\n            marginLeft:
         | 
| 344 | 
            +
                    0,\n            position: 'static'\n        });\n    } catch(e) {}\n\n\n    Zenoss.util.callWhenReady('center_panel',
         | 
| 345 | 
            +
                    function(){\n        Ext.getCmp('center_panel').add({\n           layout:
         | 
| 346 | 
            +
                    'border',\n            id: 'backcompat-layout-panel',\n            defaults:
         | 
| 347 | 
            +
                    {\n                border: false\n            },\n            bodyCssClass:
         | 
| 348 | 
            +
                    'z-bc', // Zenoss back compat\n            items: outerItems\n        });\n
         | 
| 349 | 
            +
                    \       Ext.getCmp('center_panel').doLayout();\n    });\n});\n</script>\n\n\n<!--
         | 
| 350 | 
            +
                    Make sure everything on the page gets laid out -->\n<script type=\"text/javascript\">\n
         | 
| 351 | 
            +
                    \   Ext.onReady(function(){Ext.getCmp('viewport').doLayout()});\n</script>\n\n\n
         | 
| 352 | 
            +
                    \   \n\n\n<!-- Load tooltips for this screen -->\n<script type=\"text/javascript\"
         | 
| 353 | 
            +
                    src=\"tooltips.js\"></script>\n\n<!-- Fields required for history management
         | 
| 354 | 
            +
                    -->\n<form id=\"history-form\" class=\"x-hidden\" action=\"\">\n    <input
         | 
| 355 | 
            +
                    type=\"hidden\" id=\"x-history-field\" />\n    <iframe id=\"x-history-frame\"></iframe>\n</form>\n<script
         | 
| 356 | 
            +
                    type=\"text/javascript\">\nExt.History.init(function(mgr){\n    Ext.History.selectByToken(mgr.getToken());\n});\n</script>\n</body>\n</html>
         | 
| 357 | 
            +
                    <!-- metal:use-macro=\"context/page_macros/base-new\" -->\n\n\n"
         | 
| 358 | 
            +
                http_version: 
         | 
| 359 | 
            +
              recorded_at: Fri, 22 May 2015 12:19:38 GMT
         | 
| 360 | 
            +
            - request:
         | 
| 361 | 
            +
                method: post
         | 
| 362 | 
            +
                uri: http://192.168.56.2:9080/zport/dmd/zport/dmd/device_router
         | 
| 363 | 
            +
                body:
         | 
| 364 | 
            +
                  encoding: UTF-8
         | 
| 365 | 
            +
                  string: '[{"action":"DeviceRouter","method":"addDevice","data":[{"deviceName":"UnitTestDevice","deviceClass":"/Devices/Server"}],"type":"rpc","tid":1}]'
         | 
| 366 | 
            +
                headers:
         | 
| 367 | 
            +
                  User-Agent:
         | 
| 368 | 
            +
                  - HTTPClient/1.0 (2.6.0.1, ruby 2.2.0 (2014-12-25))
         | 
| 369 | 
            +
                  Accept:
         | 
| 370 | 
            +
                  - "*/*"
         | 
| 371 | 
            +
                  Date:
         | 
| 372 | 
            +
                  - Fri, 22 May 2015 12:19:38 GMT
         | 
| 373 | 
            +
                  Content-Type:
         | 
| 374 | 
            +
                  - application/json; charset=utf-8
         | 
| 375 | 
            +
                  Cookie:
         | 
| 376 | 
            +
                  - __ginger_snap=NjE2NDZkNjk2ZTo3YTY1NmU2ZjczNzM%253D
         | 
| 377 | 
            +
              response:
         | 
| 378 | 
            +
                status:
         | 
| 379 | 
            +
                  code: 200
         | 
| 380 | 
            +
                  message: OK
         | 
| 381 | 
            +
                headers:
         | 
| 382 | 
            +
                  Server:
         | 
| 383 | 
            +
                  - Zope/(2.12.1, python 2.6.2, linux2) ZServer/1.1
         | 
| 384 | 
            +
                  Date:
         | 
| 385 | 
            +
                  - Fri, 22 May 2015 12:19:38 GMT
         | 
| 386 | 
            +
                  Content-Length:
         | 
| 387 | 
            +
                  - '176'
         | 
| 388 | 
            +
                  Content-Type:
         | 
| 389 | 
            +
                  - application/json
         | 
| 390 | 
            +
                body:
         | 
| 391 | 
            +
                  encoding: UTF-8
         | 
| 392 | 
            +
                  string: '{"tid": 1, "action": "DeviceRouter", "type": "rpc", "method": "addDevice",
         | 
| 393 | 
            +
                    "result": {"success": true, "jobId": "DeviceCreationJobStatus_77b6d227-2f37-4260-a016-0892d66ad838"}}'
         | 
| 394 | 
            +
                http_version: 
         | 
| 395 | 
            +
              recorded_at: Fri, 22 May 2015 12:19:38 GMT
         | 
| 396 | 
            +
            - request:
         | 
| 397 | 
            +
                method: post
         | 
| 398 | 
            +
                uri: http://192.168.56.2:9080/zport/dmd/zport/dmd/device_router
         | 
| 399 | 
            +
                body:
         | 
| 400 | 
            +
                  encoding: UTF-8
         | 
| 401 | 
            +
                  string: '[{"action":"DeviceRouter","method":"getDevices","data":[{"uid":"/zport/dmd/Devices","params":{"name":"UnitTestDevice"}}],"type":"rpc","tid":2}]'
         | 
| 402 | 
            +
                headers:
         | 
| 403 | 
            +
                  User-Agent:
         | 
| 404 | 
            +
                  - HTTPClient/1.0 (2.6.0.1, ruby 2.2.0 (2014-12-25))
         | 
| 405 | 
            +
                  Accept:
         | 
| 406 | 
            +
                  - "*/*"
         | 
| 407 | 
            +
                  Date:
         | 
| 408 | 
            +
                  - Fri, 22 May 2015 12:19:38 GMT
         | 
| 409 | 
            +
                  Content-Type:
         | 
| 410 | 
            +
                  - application/json; charset=utf-8
         | 
| 411 | 
            +
                  Cookie:
         | 
| 412 | 
            +
                  - __ginger_snap=NjE2NDZkNjk2ZTo3YTY1NmU2ZjczNzM%253D
         | 
| 413 | 
            +
              response:
         | 
| 414 | 
            +
                status:
         | 
| 415 | 
            +
                  code: 200
         | 
| 416 | 
            +
                  message: OK
         | 
| 417 | 
            +
                headers:
         | 
| 418 | 
            +
                  Server:
         | 
| 419 | 
            +
                  - Zope/(2.12.1, python 2.6.2, linux2) ZServer/1.1
         | 
| 420 | 
            +
                  Date:
         | 
| 421 | 
            +
                  - Fri, 22 May 2015 12:19:38 GMT
         | 
| 422 | 
            +
                  Content-Length:
         | 
| 423 | 
            +
                  - '576'
         | 
| 424 | 
            +
                  Content-Type:
         | 
| 425 | 
            +
                  - application/json
         | 
| 426 | 
            +
                body:
         | 
| 427 | 
            +
                  encoding: UTF-8
         | 
| 428 | 
            +
                  string: '{"tid": 2, "action": "DeviceRouter", "type": "rpc", "method": "getDevices",
         | 
| 429 | 
            +
                    "result": {"totalCount": 1, "hash": "1", "success": true, "devices": [{"groups":
         | 
| 430 | 
            +
                    [], "serialNumber": "", "name": "UnitTestDevice", "collector": "localhost",
         | 
| 431 | 
            +
                    "osModel": null, "productionState": "Production", "location": null, "priority":
         | 
| 432 | 
            +
                    "Normal", "hwModel": null, "tagNumber": "", "osManufacturer": null, "systems":
         | 
| 433 | 
            +
                    [], "hwManufacturer": null, "ipAddress": null, "events": {"info": 0, "debug":
         | 
| 434 | 
            +
                    0, "critical": 0, "warning": 0, "error": 0}, "uid": "/zport/dmd/Devices/Server/devices/UnitTestDevice"}]}}'
         | 
| 435 | 
            +
                http_version: 
         | 
| 436 | 
            +
              recorded_at: Fri, 22 May 2015 12:19:38 GMT
         | 
| 437 | 
            +
            recorded_with: VCR 2.9.3
         |