diff --git a/.github/DISCUSSION_TEMPLATE/2-4.yml b/.github/DISCUSSION_TEMPLATE/2-4.yml index 9c897d2bd..af5fa3a84 100644 --- a/.github/DISCUSSION_TEMPLATE/2-4.yml +++ b/.github/DISCUSSION_TEMPLATE/2-4.yml @@ -22,6 +22,7 @@ body: - 2.4.90 - 2.4.100 - 2.4.110 + - 2.4.120 - Other (please provide detail below) validations: required: true diff --git a/DOWNLOAD_AND_VERIFY_ISO.md b/DOWNLOAD_AND_VERIFY_ISO.md index ffeb0fe32..18a38a91c 100644 --- a/DOWNLOAD_AND_VERIFY_ISO.md +++ b/DOWNLOAD_AND_VERIFY_ISO.md @@ -1,17 +1,17 @@ -### 2.4.100-20240903 ISO image released on 2024/09/03 +### 2.4.110-20241010 ISO image released on 2024/10/10 ### Download and Verify -2.4.100-20240903 ISO image: -https://download.securityonion.net/file/securityonion/securityonion-2.4.100-20240903.iso +2.4.110-20241010 ISO image: +https://download.securityonion.net/file/securityonion/securityonion-2.4.110-20241010.iso -MD5: 856BBB4F0764C0A479D8949725FC096B -SHA1: B3FCFB8F1031EB8AA833A90C6C5BB61328A73842 -SHA256: 0103EB9D78970396BB47CBD18DA1FFE64524F5C1C559487A1B2D293E1882B265 +MD5: A8003DEBC4510D538F06238D9DBB86C0 +SHA1: 441DE90A192C8FE8BEBAB9ACE1A3CC18F71A2B1F +SHA256: B087A0D12FC2CA3CCD02BD52E52421F4F60DC09BF826337A057E05A04D114CCE Signature for ISO image: -https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.100-20240903.iso.sig +https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.110-20241010.iso.sig Signing key: https://raw.githubusercontent.com/Security-Onion-Solutions/securityonion/2.4/main/KEYS @@ -25,22 +25,22 @@ wget https://raw.githubusercontent.com/Security-Onion-Solutions/securityonion/2. Download the signature file for the ISO: ``` -wget https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.100-20240903.iso.sig +wget https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.110-20241010.iso.sig ``` Download the ISO image: ``` -wget https://download.securityonion.net/file/securityonion/securityonion-2.4.100-20240903.iso +wget https://download.securityonion.net/file/securityonion/securityonion-2.4.110-20241010.iso ``` Verify the downloaded ISO image using the signature file: ``` -gpg --verify securityonion-2.4.100-20240903.iso.sig securityonion-2.4.100-20240903.iso +gpg --verify securityonion-2.4.110-20241010.iso.sig securityonion-2.4.110-20241010.iso ``` The output should show "Good signature" and the Primary key fingerprint should match what's shown below: ``` -gpg: Signature made Sat 31 Aug 2024 05:05:05 PM EDT using RSA key ID FE507013 +gpg: Signature made Thu 10 Oct 2024 07:05:30 AM EDT using RSA key ID FE507013 gpg: Good signature from "Security Onion Solutions, LLC " gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. diff --git a/VERSION b/VERSION index 3cda1f5a4..b47ca7775 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.4.110 +2.4.120 diff --git a/pillar/top.sls b/pillar/top.sls index 76d1a14e1..b8d694e23 100644 --- a/pillar/top.sls +++ b/pillar/top.sls @@ -16,6 +16,8 @@ base: - sensoroni.adv_sensoroni - telegraf.soc_telegraf - telegraf.adv_telegraf + - versionlock.soc_versionlock + - versionlock.adv_versionlock '* and not *_desktop': - firewall.soc_firewall @@ -47,6 +49,8 @@ base: - kibana.adv_kibana - kratos.soc_kratos - kratos.adv_kratos + - hydra.soc_hydra + - hydra.adv_hydra - redis.nodes - redis.soc_redis - redis.adv_redis @@ -96,6 +100,7 @@ base: - kibana.secrets {% endif %} - kratos.soc_kratos + - kratos.adv_kratos - elasticsearch.soc_elasticsearch - elasticsearch.adv_elasticsearch - elasticfleet.soc_elasticfleet @@ -113,8 +118,8 @@ base: - kibana.adv_kibana - strelka.soc_strelka - strelka.adv_strelka - - kratos.soc_kratos - - kratos.adv_kratos + - hydra.soc_hydra + - hydra.adv_hydra - redis.soc_redis - redis.adv_redis - influxdb.soc_influxdb @@ -149,6 +154,8 @@ base: - idstools.adv_idstools - kratos.soc_kratos - kratos.adv_kratos + - hydra.soc_hydra + - hydra.adv_hydra - redis.nodes - redis.soc_redis - redis.adv_redis @@ -262,6 +269,7 @@ base: - kibana.secrets {% endif %} - kratos.soc_kratos + - kratos.adv_kratos - elasticsearch.soc_elasticsearch - elasticsearch.adv_elasticsearch - elasticfleet.soc_elasticfleet @@ -277,8 +285,8 @@ base: - kibana.adv_kibana - backup.soc_backup - backup.adv_backup - - kratos.soc_kratos - - kratos.adv_kratos + - hydra.soc_hydra + - hydra.adv_hydra - redis.soc_redis - redis.adv_redis - influxdb.soc_influxdb @@ -310,3 +318,5 @@ base: '*_desktop': - minions.{{ grains.id }} - minions.adv_{{ grains.id }} + - stig.soc_stig + - soc.license diff --git a/salt/allowed_states.map.jinja b/salt/allowed_states.map.jinja index 37795e9d7..a3d5c1354 100644 --- a/salt/allowed_states.map.jinja +++ b/salt/allowed_states.map.jinja @@ -24,6 +24,7 @@ 'influxdb', 'soc', 'kratos', + 'hydra', 'elasticfleet', 'elastic-fleet-package-registry', 'firewall', @@ -68,6 +69,7 @@ 'strelka.manager', 'soc', 'kratos', + 'hydra', 'influxdb', 'telegraf', 'firewall', @@ -95,6 +97,7 @@ 'strelka.manager', 'soc', 'kratos', + 'hydra', 'elasticfleet', 'elastic-fleet-package-registry', 'firewall', @@ -117,6 +120,7 @@ 'strelka.manager', 'soc', 'kratos', + 'hydra', 'elastic-fleet-package-registry', 'elasticfleet', 'firewall', @@ -151,6 +155,7 @@ 'influxdb', 'soc', 'kratos', + 'hydra', 'elastic-fleet-package-registry', 'elasticfleet', 'firewall', @@ -202,7 +207,8 @@ 'so-desktop': [ 'ssl', 'docker_clean', - 'telegraf' + 'telegraf', + 'stig' ], }, grain='role') %} diff --git a/salt/backup/defaults.yaml b/salt/backup/defaults.yaml index 1aae64910..dde128a80 100644 --- a/salt/backup/defaults.yaml +++ b/salt/backup/defaults.yaml @@ -4,4 +4,5 @@ backup: - /etc/pki - /etc/salt - /nsm/kratos + - /nsm/hydra destination: "/nsm/backup" \ No newline at end of file diff --git a/salt/common/init.sls b/salt/common/init.sls index 8dd727f72..f385bd96d 100644 --- a/salt/common/init.sls +++ b/salt/common/init.sls @@ -182,6 +182,7 @@ sostatus_log: file.managed: - name: /opt/so/log/sostatus/status.log - mode: 644 + - replace: False # Install sostatus check cron. This is used to populate Grid. so-status_check_cron: diff --git a/salt/common/soup_scripts.sls b/salt/common/soup_scripts.sls index 508b95b67..60215f949 100644 --- a/salt/common/soup_scripts.sls +++ b/salt/common/soup_scripts.sls @@ -11,6 +11,7 @@ {% else %} {% set UPDATE_DIR='/tmp/sogh/securityonion' %} {% endif %} +{% set SOVERSION = salt['file.read']('/etc/soversion').strip() %} remove_common_soup: file.absent: @@ -107,6 +108,17 @@ copy_so-repo-sync_sbin: - force: True - preserve: True +{# this is added in 2.4.120 to remove salt repo files pointing to saltproject.io to accomodate the move to broadcom and new bootstrap-salt script #} +{% if salt['pkg.version_cmp'](SOVERSION, '2.4.120') == -1 %} +{% set saltrepofile = '/etc/yum.repos.d/salt.repo' %} +{% if grains.os_family == 'Debian' %} +{% set saltrepofile = '/etc/apt/sources.list.d/salt.list' %} +{% endif %} +remove_saltproject_io_repo_manager: + file.absent: + - name: {{ saltrepofile }} +{% endif %} + {% else %} fix_23_soup_sbin: cmd.run: diff --git a/salt/common/tools/sbin/so-image-common b/salt/common/tools/sbin/so-image-common index bb827c0af..7fd35d5ac 100755 --- a/salt/common/tools/sbin/so-image-common +++ b/salt/common/tools/sbin/so-image-common @@ -29,6 +29,7 @@ container_list() { "so-influxdb" "so-kibana" "so-kratos" + "so-hydra" "so-nginx" "so-pcaptools" "so-soc" @@ -53,6 +54,7 @@ container_list() { "so-kafka" "so-kibana" "so-kratos" + "so-hydra" "so-logstash" "so-nginx" "so-pcaptools" @@ -159,9 +161,11 @@ update_docker_containers() { fi local highest_es_version=$(compare_es_versions "$v1" "$v2") local image=$i:$highest_es_version$IMAGE_TAG_SUFFIX + local sig_url=https://sigs.securityonion.net/es-$highest_es_version/$image.sig else # this is not an es container so use the so version for the version local image=$i:$VERSION$IMAGE_TAG_SUFFIX + local sig_url=https://sigs.securityonion.net/$VERSION/$image.sig fi # Pull down the trusted docker image run_check_net_err \ @@ -170,7 +174,7 @@ update_docker_containers() { # Get signature run_check_net_err \ - "curl --retry 5 --retry-delay 60 -A '$CURLTYPE/$CURRENTVERSION/$OS/$(uname -r)' https://sigs.securityonion.net/$VERSION/$image.sig --output $SIGNPATH/$image.sig" \ + "curl --retry 5 --retry-delay 60 -A '$CURLTYPE/$CURRENTVERSION/$OS/$(uname -r)' $sig_url --output $SIGNPATH/$image.sig" \ "Could not pull signature file for $image, please ensure connectivity to https://sigs.securityonion.net " \ noretry >> "$LOG_FILE" 2>&1 # Dump our hash values diff --git a/salt/docker/defaults.yaml b/salt/docker/defaults.yaml index 161dde485..21cdf606c 100644 --- a/salt/docker/defaults.yaml +++ b/salt/docker/defaults.yaml @@ -51,6 +51,14 @@ docker: custom_bind_mounts: [] extra_hosts: [] extra_env: [] + 'so-hydra': + final_octet: 30 + port_bindings: + - 0.0.0.0:4444:4444 + - 0.0.0.0:4445:4445 + custom_bind_mounts: [] + extra_hosts: [] + extra_env: [] 'so-logstash': final_octet: 29 port_bindings: diff --git a/salt/docker/soc_docker.yaml b/salt/docker/soc_docker.yaml index e7ecba6be..dacbf2302 100644 --- a/salt/docker/soc_docker.yaml +++ b/salt/docker/soc_docker.yaml @@ -45,6 +45,7 @@ docker: so-influxdb: *dockerOptions so-kibana: *dockerOptions so-kratos: *dockerOptions + so-hydra: *dockerOptions so-logstash: *dockerOptions so-nginx: *dockerOptions so-nginx-fleet-node: *dockerOptions diff --git a/salt/elastalert/soc_elastalert.yaml b/salt/elastalert/soc_elastalert.yaml index 905fd3884..764ec87fc 100644 --- a/salt/elastalert/soc_elastalert.yaml +++ b/salt/elastalert/soc_elastalert.yaml @@ -1,6 +1,6 @@ elastalert: enabled: - description: You can enable or disable Elastalert. + description: Enables or disables the ElastAlert 2 process. This process is critical for ensuring alerts arrive in SOC, and for outbound notification delivery. helpLink: elastalert.html alerter_parameters: title: Custom Configuration Parameters diff --git a/salt/elastic-fleet-package-registry/soc_elastic-fleet-package-registry.yaml b/salt/elastic-fleet-package-registry/soc_elastic-fleet-package-registry.yaml index 70886c447..3d8a2112b 100644 --- a/salt/elastic-fleet-package-registry/soc_elastic-fleet-package-registry.yaml +++ b/salt/elastic-fleet-package-registry/soc_elastic-fleet-package-registry.yaml @@ -1,4 +1,4 @@ elastic_fleet_package_registry: enabled: - description: You can enable or disable Elastic Fleet Package Registry. + description: Enables or disables the Fleet package registry process. This process must remain enabled to allow Elastic Agent packages to be updated. advanced: True diff --git a/salt/elasticagent/soc_elasticagent.yaml b/salt/elasticagent/soc_elasticagent.yaml new file mode 100644 index 000000000..a24ac1985 --- /dev/null +++ b/salt/elasticagent/soc_elasticagent.yaml @@ -0,0 +1,4 @@ +elasticagent: + enabled: + description: Enables or disables the Elastic Agent process. This process must remain enabled to allow collection of node events. + advanced: True diff --git a/salt/elasticfleet/config.sls b/salt/elasticfleet/config.sls index f8566ed94..208fa2306 100644 --- a/salt/elasticfleet/config.sls +++ b/salt/elasticfleet/config.sls @@ -63,6 +63,14 @@ eastatedir: - group: 939 - makedirs: True +custommappingsdir: + file.directory: + - name: /nsm/custom-mappings + - user: 947 + - group: 939 + - makedirs: True + + eapackageupgrade: file.managed: - name: /usr/sbin/so-elastic-fleet-package-upgrade @@ -73,6 +81,56 @@ eapackageupgrade: - template: jinja {% if GLOBALS.role != "so-fleet" %} + +{% if not GLOBALS.airgap %} +soresourcesrepoclone: + git.latest: + - name: https://github.com/Security-Onion-Solutions/securityonion-resources.git + - target: /nsm/securityonion-resources + - rev: 'main' + - depth: 1 + - force_reset: True +{% endif %} + +elasticdefendconfdir: + file.directory: + - name: /opt/so/conf/elastic-fleet/defend-exclusions/rulesets + - user: 947 + - group: 939 + - makedirs: True + +elasticdefenddisabled: + file.managed: + - name: /opt/so/conf/elastic-fleet/defend-exclusions/disabled-filters.yaml + - source: salt://elasticfleet/files/soc/elastic-defend-disabled-filters.yaml + - user: 947 + - group: 939 + - mode: 600 + +elasticdefendcustom: + file.managed: + - name: /opt/so/conf/elastic-fleet/defend-exclusions/rulesets/custom-filters-raw + - source: salt://elasticfleet/files/soc/elastic-defend-custom-filters.yaml + - user: 947 + - group: 939 + - mode: 600 + +{% if ELASTICFLEETMERGED.config.defend_filters.enable_auto_configuration %} +{% set ap = "present" %} +{% else %} +{% set ap = "absent" %} +{% endif %} +cron-elastic-defend-filters: + cron.{{ap}}: + - name: python3 /sbin/so-elastic-defend-manage-filters.py -c /opt/so/conf/elasticsearch/curl.config -d /opt/so/conf/elastic-fleet/defend-exclusions/disabled-filters.yaml -i /nsm/securityonion-resources/event_filters/ -i /opt/so/conf/elastic-fleet/defend-exclusions/rulesets/custom-filters/ &>> /opt/so/log/elasticfleet/elastic-defend-manage-filters.log + - identifier: elastic-defend-filters + - user: root + - minute: '0' + - hour: '3' + - daymonth: '*' + - month: '*' + - dayweek: '*' + eaintegrationsdir: file.directory: - name: /opt/so/conf/elastic-fleet/integrations diff --git a/salt/elasticfleet/defaults.yaml b/salt/elasticfleet/defaults.yaml index 48b24809e..2f237cac1 100644 --- a/salt/elasticfleet/defaults.yaml +++ b/salt/elasticfleet/defaults.yaml @@ -8,6 +8,8 @@ elasticfleet: endpoints_enrollment: '' es_token: '' grid_enrollment: '' + defend_filters: + enable_auto_configuration: False logging: zeek: excluded: @@ -36,6 +38,7 @@ elasticfleet: - aws - azure - barracuda + - barracuda_cloudgen_firewall - carbonblack_edr - cef - checkpoint @@ -45,6 +48,7 @@ elasticfleet: - cisco_ios - cisco_ise - cisco_meraki + - cisco_secure_email_gateway - cisco_umbrella - citrix_adc - citrix_waf @@ -66,6 +70,7 @@ elasticfleet: - http_endpoint - httpjson - iis + - imperva_cloud_waf - journald - juniper - juniper_srx @@ -104,8 +109,11 @@ elasticfleet: - ti_cybersixgill - ti_misp - ti_otx + - ti_rapid7_threat_command - ti_recordedfuture - ti_threatq + - trendmicro + - trend_micro_vision_one - udp - vsphere - windows diff --git a/salt/elasticfleet/enabled.sls b/salt/elasticfleet/enabled.sls index af5e552eb..f91074b39 100644 --- a/salt/elasticfleet/enabled.sls +++ b/salt/elasticfleet/enabled.sls @@ -17,10 +17,12 @@ include: - elasticfleet.sostatus - ssl +{% if grains.role not in ['so-fleet'] %} # Wait for Elasticsearch to be ready - no reason to try running Elastic Fleet server if ES is not ready wait_for_elasticsearch_elasticfleet: cmd.run: - name: so-elasticsearch-wait +{% endif %} # If enabled, automatically update Fleet Logstash Outputs {% if ELASTICFLEETMERGED.config.server.enable_auto_configuration and grains.role not in ['so-import', 'so-eval', 'so-fleet'] %} @@ -141,7 +143,22 @@ so-elastic-fleet-integrations: so-elastic-agent-grid-upgrade: cmd.run: - name: /usr/sbin/so-elastic-agent-grid-upgrade - - retry: True + - retry: + attempts: 12 + interval: 5 + +so-elastic-fleet-integration-upgrade: + cmd.run: + - name: /usr/sbin/so-elastic-fleet-integration-upgrade + +{% if ELASTICFLEETMERGED.config.defend_filters.enable_auto_configuration %} +so-elastic-defend-manage-filters-file-watch: + cmd.run: + - name: python3 /sbin/so-elastic-defend-manage-filters.py -c /opt/so/conf/elasticsearch/curl.config -d /opt/so/conf/elastic-fleet/defend-exclusions/disabled-filters.yaml -i /nsm/securityonion-resources/event_filters/ -i /opt/so/conf/elastic-fleet/defend-exclusions/rulesets/custom-filters/ &>> /opt/so/log/elasticfleet/elastic-defend-manage-filters.log + - onchanges: + - file: elasticdefendcustom + - file: elasticdefenddisabled +{% endif %} {% endif %} delete_so-elastic-fleet_so-status.disabled: diff --git a/salt/elasticfleet/files/integrations/grid-nodes_general/hydra-logs.json b/salt/elasticfleet/files/integrations/grid-nodes_general/hydra-logs.json new file mode 100644 index 000000000..f1b1dace9 --- /dev/null +++ b/salt/elasticfleet/files/integrations/grid-nodes_general/hydra-logs.json @@ -0,0 +1,30 @@ +{ + "package": { + "name": "log", + "version": "" + }, + "name": "hydra-logs", + "namespace": "so", + "description": "Hydra logs", + "policy_id": "so-grid-nodes_general", + "inputs": { + "logs-logfile": { + "enabled": true, + "streams": { + "log.logs": { + "enabled": true, + "vars": { + "paths": [ + "/opt/so/log/hydra/hydra.log" + ], + "data_stream.dataset": "hydra", + "tags": ["so-hydra"], + "processors": "- decode_json_fields:\n fields: [\"message\"]\n target: \"\"\n add_error_key: true \n- add_fields:\n target: event\n fields:\n category: iam\n module: hydra", + "custom": "pipeline: hydra" + } + } + } + } + }, + "force": true +} diff --git a/salt/elasticfleet/files/integrations/grid-nodes_general/so-ip-mappings.json b/salt/elasticfleet/files/integrations/grid-nodes_general/so-ip-mappings.json new file mode 100644 index 000000000..fdcd36815 --- /dev/null +++ b/salt/elasticfleet/files/integrations/grid-nodes_general/so-ip-mappings.json @@ -0,0 +1,35 @@ +{ + "package": { + "name": "log", + "version": "" + }, + "name": "so-ip-mappings", + "namespace": "so", + "description": "IP Description mappings", + "policy_id": "so-grid-nodes_general", + "vars": {}, + "inputs": { + "logs-logfile": { + "enabled": true, + "streams": { + "log.logs": { + "enabled": true, + "vars": { + "paths": [ + "/nsm/custom-mappings/ip-descriptions.csv" + ], + "data_stream.dataset": "hostnamemappings", + "tags": [ + "so-ip-mappings" + ], + "processors": "- decode_csv_fields:\n fields:\n message: decoded.csv\n separator: \",\"\n ignore_missing: false\n overwrite_keys: true\n trim_leading_space: true\n fail_on_error: true\n\n- extract_array:\n field: decoded.csv\n mappings:\n so.ip_address: '0'\n so.description: '1'\n\n- script:\n lang: javascript\n source: >\n function process(event) {\n var ip = event.Get('so.ip_address');\n var validIpRegex = /^((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)$/\n if (!validIpRegex.test(ip)) {\n event.Cancel();\n }\n }\n- fingerprint:\n fields: [\"so.ip_address\"]\n target_field: \"@metadata._id\"\n", + "custom": "" + } + } + } + } + }, + "force": true +} + + diff --git a/salt/elasticfleet/files/soc/elastic-defend-custom-filters.yaml b/salt/elasticfleet/files/soc/elastic-defend-custom-filters.yaml new file mode 100644 index 000000000..ed8121a71 --- /dev/null +++ b/salt/elasticfleet/files/soc/elastic-defend-custom-filters.yaml @@ -0,0 +1,27 @@ +title: 'Template 1' +id: 'This needs to be a UUIDv4 id - https://www.uuidgenerator.net/version4' +description: 'Short description detailing what this rule is filtering and why.' +references: 'Relevant urls, etc' +author: '@SecurityOnion' +date: 'MM/DD/YY' +event_type: 'dns_query' +filter_type: 'exclude' +filter: + selection_1: + TargetField: 'QueryName' + Condition: 'end with' + Pattern: '.thawte.com' +--- +title: 'Template 2' +id: 'This needs to be a UUIDv4 id - https://www.uuidgenerator.net/version4' +description: 'Short description detailing what this rule is filtering and why.' +references: 'Relevant urls, etc' +author: '@SecurityOnion' +date: 'MM/DD/YY' +event_type: 'process_creation' +filter_type: 'exclude' +filter: + selection_1: + TargetField: 'ParentImage' + Condition: 'is' + Pattern: 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngentask.exe' \ No newline at end of file diff --git a/salt/elasticfleet/files/soc/elastic-defend-disabled-filters.yaml b/salt/elasticfleet/files/soc/elastic-defend-disabled-filters.yaml new file mode 100644 index 000000000..52a646385 --- /dev/null +++ b/salt/elasticfleet/files/soc/elastic-defend-disabled-filters.yaml @@ -0,0 +1,3 @@ +'9EDAA51C-BB12-49D9-8748-2B61371F2E7D': + Date: '10/10/2024' + Notes: 'Example Disabled Filter - Leave this entry here, just copy and paste as needed.' \ No newline at end of file diff --git a/salt/elasticfleet/soc_elasticfleet.yaml b/salt/elasticfleet/soc_elasticfleet.yaml index 7ed97e6ec..0b32628ea 100644 --- a/salt/elasticfleet/soc_elasticfleet.yaml +++ b/salt/elasticfleet/soc_elasticfleet.yaml @@ -1,6 +1,6 @@ elasticfleet: enabled: - description: You can enable or disable Elastic Fleet. + description: Enables or disables the Elastic Fleet process. This process is critical for managing Elastic Agents. advanced: True helpLink: elastic-fleet.html enable_manager_output: @@ -9,6 +9,24 @@ elasticfleet: global: True forcedType: bool helpLink: elastic-fleet.html + files: + soc: + elastic-defend-disabled-filters__yaml: + title: Disabled Elastic Defend filters + description: Enter the ID of the filter that should be disabled. + syntax: yaml + file: True + global: True + helpLink: elastic-fleet.html + advanced: True + elastic-defend-custom-filters__yaml: + title: Custom Elastic Defend filters + description: Enter custom filters seperated by --- + syntax: yaml + file: True + global: True + helpLink: elastic-fleet.html + advanced: True logging: zeek: excluded: @@ -16,6 +34,12 @@ elasticfleet: forcedType: "[]string" helpLink: zeek.html config: + defend_filters: + enable_auto_configuration: + description: Enable auto-configuration and management of the Elastic Defend Exclusion filters. + global: True + helpLink: elastic-fleet.html + advanced: True server: custom_fqdn: description: Custom FQDN for Agents to connect to. One per line. diff --git a/salt/elasticfleet/tools/sbin/so-elastic-defend-manage-filters.py b/salt/elasticfleet/tools/sbin/so-elastic-defend-manage-filters.py new file mode 100644 index 000000000..f7ce39d1d --- /dev/null +++ b/salt/elasticfleet/tools/sbin/so-elastic-defend-manage-filters.py @@ -0,0 +1,251 @@ +from datetime import datetime +import sys +import getopt +from so_elastic_defend_filters_helper import * +import logging + +logging.basicConfig(level=logging.INFO, format='%(message)s') + +# Define mappings for Target Field, Event Type, Conditions +TARGET_FIELD_MAPPINGS = { + "Image": "process.executable", + "ParentImage": "process.parent.executable", + "CommandLine": "process.command_line", + "ParentCommandLine": "process.parent.command_line", + "DestinationHostname": "destination.domain", + "QueryName": "dns.question.name", + "DestinationIp": "destination.ip", + "TargetObject": "registry.path", + "TargetFilename": "file.path" +} + +DATASET_MAPPINGS = { + "process_create": "endpoint.events.process", + "network_connection": "endpoint.events.network", + "file_create": "endpoint.events.file", + "file_delete": "endpoint.events.file", + "registry_event": "endpoint.events.registry", + "dns_query": "endpoint.events.network" +} + +CONDITION_MAPPINGS = { + "is": ("included", "match"), + "end with": ("included", "wildcard"), + "begin with": ("included", "wildcard"), + "contains": ("included", "wildcard") +} + +# Extract entries for a rule +def extract_entries(data, event_type): + entries = [] + filter_data = data.get('filter', {}) + for value in filter_data.values(): + target_field = TARGET_FIELD_MAPPINGS.get(value.get('TargetField', '')) + condition = value.get('Condition', '') + pattern = value.get('Pattern', '') + + if condition not in CONDITION_MAPPINGS: + logging.error(f"Invalid condition: {condition}") + + # Modify the pattern based on the condition + pattern = modify_pattern(condition, pattern) + + operator, match_type = CONDITION_MAPPINGS[condition] + + entries.append({ + "field": target_field, + "operator": operator, + "type": match_type, + "value": pattern + }) + + # Add the event.dataset entry from DATASET_MAPPINGS + dataset_value = DATASET_MAPPINGS.get(event_type, '') + if dataset_value: + entries.append({ + "field": "event.dataset", + "operator": "included", + "type": "match", + "value": dataset_value + }) + else: + logging.error(f"No dataset mapping found for event_type: {event_type}") + + return entries + +# Build the JSON +def build_json_entry(entries, guid, event_type, context): + return { + "comments": [], + "entries": entries, + "item_id": guid, + "name": f"SO - {event_type} - {guid}", + "description": f"{context}\n\n <<- Note: This filter is managed by Security Onion. ->>", + "namespace_type": "agnostic", + "tags": ["policy:all"], + "type": "simple", + "os_types": ["windows"], + "entries": entries + } + +# Check to see if the rule is disabled +# If it is, make sure it is not active +def disable_check(guid, disabled_rules, username, password): + if guid in disabled_rules: + logging.info(f"Rule {guid} is in the disabled rules list, confirming that is is actually disabled...") + existing_rule = api_request("GET", guid, username, password) + + if existing_rule: + if api_request("DELETE", guid, username, password): + logging.info(f"Successfully deleted rule {guid}") + return True, "deleted" + else: + logging.error(f"Error deleting rule {guid}.") + return True, "Error deleting" + return True, "NOP" + return False, None + +def modify_pattern(condition, pattern): + """ + Modify the pattern based on the condition. + - 'end with': Add '*' to the beginning of the pattern. + - 'begin with': Add '*' to the end of the pattern. + - 'contains': Add '*' to both the beginning and end of the pattern. + """ + if isinstance(pattern, list): + # Apply modification to each pattern in the list if it's a list of patterns + return [modify_pattern(condition, p) for p in pattern] + + if condition == "end with": + return f"*{pattern}" + elif condition == "begin with": + return f"{pattern}*" + elif condition == "contains": + return f"*{pattern}*" + return pattern + + +def process_rule_update_or_create(guid, json_entry, username, password): + existing_rule = api_request("GET", guid, username, password) + + if existing_rule: + existing_rule_data = extract_relevant_fields(existing_rule) + new_rule_data = extract_relevant_fields(json_entry) + if generate_hash(existing_rule_data) != generate_hash(new_rule_data): + logging.info(f"Updating rule {guid}") + json_entry.pop("list_id", None) + api_request("PUT", guid, username, password, json_data=json_entry) + return "updated" + logging.info(f"Rule {guid} is up to date.") + return "no_change" + else: + logging.info(f"Creating new rule {guid}") + json_entry["list_id"] = "endpoint_event_filters" + api_request("POST", guid, username, password, json_data=json_entry) + return "new" + +# Main function for processing rules +def process_rules(yaml_files, disabled_rules, username, password): + stats = {"rule_count": 0, "new": 0, "updated": 0, "no_change": 0, "disabled": 0, "deleted": 0} + for data in yaml_files: + logging.info(f"Processing rule: {data.get('id', '')}") + event_type = data.get('event_type', '') + guid = data.get('id', '') + dataset = DATASET_MAPPINGS.get(event_type, '') + context = data.get('description', '') + + rule_deleted, state = disable_check(guid, disabled_rules, username, password) + if rule_deleted: + stats["disabled"] += 1 + if state == "deleted": + stats["deleted"] += 1 + continue + + # Extract entries and build JSON + entries = extract_entries(data, event_type) + json_entry = build_json_entry(entries, guid, event_type, context) + + # Process rule creation or update + status = process_rule_update_or_create(guid, json_entry, username, password) + + stats[status] += 1 + stats["rule_count"] += 1 + return stats + +def parse_args(argv): + try: + opts, args = getopt.getopt(argv, "i:d:c:f:", ["input=", "disabled=", "credentials=", "flags_file="]) + except getopt.GetoptError: + print("Usage: python so-elastic-defend-manage-filters.py -c -d -i [-f ]") + sys.exit(2) + return opts + +def load_flags(file_path): + with open(file_path, 'r') as flags_file: + return flags_file.read().splitlines() + +def validate_inputs(credentials_file, disabled_file, yaml_directories): + if not credentials_file or not disabled_file or not yaml_directories: + print("Usage: python so-elastic-defend-manage-filters.py -c -d -i [-f ]") + sys.exit(2) + +def main(argv): + credentials_file = "" + disabled_file = "" + yaml_directories = [] + + opts = parse_args(argv) + + for opt, arg in opts: + if opt in ("-c", "--credentials"): + credentials_file = arg + elif opt in ("-d", "--disabled"): + disabled_file = arg + elif opt in ("-i", "--input"): + yaml_directories.append(arg) + elif opt in ("-f", "--flags_file"): + flags = load_flags(arg) + return main(argv + flags) + + timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + logging.info(f"\n{timestamp}") + + validate_inputs(credentials_file, disabled_file, yaml_directories) + + credentials = load_credentials(credentials_file) + if not credentials: + raise Exception("Failed to load credentials") + + username, password = extract_auth_details(credentials) + if not username or not password: + raise Exception("Invalid credentials format") + + custom_rules_input = '/opt/so/conf/elastic-fleet/defend-exclusions/rulesets/custom-filters-raw' + custom_rules_output = '/opt/so/conf/elastic-fleet/defend-exclusions/rulesets/custom-filters' + prepare_custom_rules(custom_rules_input, custom_rules_output) + disabled_rules = load_disabled(disabled_file) + + total_stats = {"rule_count": 0, "new": 0, "updated": 0, "no_change": 0, "disabled": 0, "deleted": 0} + + for yaml_dir in yaml_directories: + yaml_files = load_yaml_files(yaml_dir) + stats = process_rules(yaml_files, disabled_rules, username, password) + + for key in total_stats: + total_stats[key] += stats[key] + + logging.info(f"\nProcessing Summary") + logging.info(f" - Total processed rules: {total_stats['rule_count']}") + logging.info(f" - New rules: {total_stats['new']}") + logging.info(f" - Updated rules: {total_stats['updated']}") + logging.info(f" - Disabled rules: {total_stats['deleted']}") + logging.info(f" - Rules with no changes: {total_stats['no_change']}") + logging.info(f"Rule status Summary") + logging.info(f" - Active rules: {total_stats['rule_count'] - total_stats['disabled']}") + logging.info(f" - Disabled rules: {total_stats['disabled']}") + timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + logging.info(f"Execution completed at: {timestamp}") + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/salt/elasticfleet/tools/sbin/so-elastic-fleet-common b/salt/elasticfleet/tools/sbin/so-elastic-fleet-common index 48ff3518a..296e578fc 100644 --- a/salt/elasticfleet/tools/sbin/so-elastic-fleet-common +++ b/salt/elasticfleet/tools/sbin/so-elastic-fleet-common @@ -102,6 +102,70 @@ elastic_fleet_package_is_installed() { curl -s -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X GET -H 'kbn-xsrf: true' "localhost:5601/api/fleet/epm/packages/$PACKAGE" | jq -r '.item.status' } +elastic_fleet_agent_policy_ids() { + curl -s -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X GET "localhost:5601/api/fleet/agent_policies" | jq -r .items[].id + if [ $? -ne 0 ]; then + echo "Error: Failed to retrieve agent policies." + exit 1 + fi +} + +elastic_fleet_agent_policy_names() { + curl -s -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X GET "localhost:5601/api/fleet/agent_policies" | jq -r .items[].name + if [ $? -ne 0 ]; then + echo "Error: Failed to retrieve agent policies." + exit 1 + fi +} + +elastic_fleet_integration_policy_names() { + AGENT_POLICY=$1 + curl -s -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X GET "localhost:5601/api/fleet/agent_policies/$AGENT_POLICY" | jq -r .item.package_policies[].name + if [ $? -ne 0 ]; then + echo "Error: Failed to retrieve integrations for '$AGENT_POLICY'." + exit 1 + fi +} + +elastic_fleet_integration_policy_package_name() { + AGENT_POLICY=$1 + INTEGRATION=$2 + curl -s -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X GET "localhost:5601/api/fleet/agent_policies/$AGENT_POLICY" | jq -r --arg INTEGRATION "$INTEGRATION" '.item.package_policies[] | select(.name==$INTEGRATION)| .package.name' + if [ $? -ne 0 ]; then + echo "Error: Failed to retrieve package name for '$INTEGRATION' in '$AGENT_POLICY'." + exit 1 + fi +} + +elastic_fleet_integration_policy_package_version() { + AGENT_POLICY=$1 + INTEGRATION=$2 + curl -s -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X GET "localhost:5601/api/fleet/agent_policies/$AGENT_POLICY" | jq -r --arg INTEGRATION "$INTEGRATION" '.item.package_policies[] | select(.name==$INTEGRATION)| .package.version' + if [ $? -ne 0 ]; then + echo "Error: Failed to retrieve package version for '$INTEGRATION' in '$AGENT_POLICY'." + exit 1 + fi +} + +elastic_fleet_integration_id() { + AGENT_POLICY=$1 + INTEGRATION=$2 + curl -s -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X GET "localhost:5601/api/fleet/agent_policies/$AGENT_POLICY" | jq -r --arg INTEGRATION "$INTEGRATION" '.item.package_policies[] | select(.name==$INTEGRATION)| .id' + if [ $? -ne 0 ]; then + echo "Error: Failed to retrieve integration ID for '$INTEGRATION' in '$AGENT_POLICY'." + exit 1 + fi +} + +elastic_fleet_integration_policy_dryrun_upgrade() { + INTEGRATION_ID=$1 + curl -s -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -H "Content-Type: application/json" -H 'kbn-xsrf: true' -L -X POST "localhost:5601/api/fleet/package_policies/upgrade/dryrun" -d "{\"packagePolicyIds\":[\"$INTEGRATION_ID\"]}" + if [ $? -ne 0 ]; then + echo "Error: Failed to complete dry run for '$INTEGRATION_ID'." + exit 1 + fi +} + elastic_fleet_policy_create() { NAME=$1 diff --git a/salt/elasticfleet/tools/sbin/so-elastic-fleet-integration-upgrade b/salt/elasticfleet/tools/sbin/so-elastic-fleet-integration-upgrade new file mode 100644 index 000000000..baad389eb --- /dev/null +++ b/salt/elasticfleet/tools/sbin/so-elastic-fleet-integration-upgrade @@ -0,0 +1,62 @@ +#!/bin/bash +# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one +# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at +# https://securityonion.net/license; you may not use this file except in compliance with the +# Elastic License 2.0. + +. /usr/sbin/so-elastic-fleet-common + +curl_output=$(curl -s -K /opt/so/conf/elasticsearch/curl.config -c - -X GET http://localhost:5601/) +if [ $? -ne 0 ]; then + echo "Error: Failed to connect to Kibana." + exit 1 +fi + +IFS=$'\n' +agent_policies=$(elastic_fleet_agent_policy_ids) +if [ $? -ne 0 ]; then + echo "Error: Failed to retrieve agent policies." + exit 1 +fi + +for AGENT_POLICY in $agent_policies; do + integrations=$(elastic_fleet_integration_policy_names "$AGENT_POLICY") + for INTEGRATION in $integrations; do + if ! [[ "$INTEGRATION" == "elastic-defend-endpoints" ]] && ! [[ "$INTEGRATION" == "fleet_server-"* ]]; then + # Get package name so we know what package to look for when checking the current and latest available version + PACKAGE_NAME=$(elastic_fleet_integration_policy_package_name "$AGENT_POLICY" "$INTEGRATION") + + # Get currently installed version of package + PACKAGE_VERSION=$(elastic_fleet_integration_policy_package_version "$AGENT_POLICY" "$INTEGRATION") + + # Get latest available version of package + AVAILABLE_VERSION=$(elastic_fleet_package_latest_version_check "$PACKAGE_NAME") + + # Get integration ID + INTEGRATION_ID=$(elastic_fleet_integration_id "$AGENT_POLICY" "$INTEGRATION") + + if [[ "$PACKAGE_VERSION" != "$AVAILABLE_VERSION" ]]; then + # Dry run of the upgrade + echo "Current $PACKAGE_NAME package version ($PACKAGE_VERSION) is not the same as the latest available package ($AVAILABLE_VERSION)..." + echo "Upgrading $INTEGRATION..." + echo "Starting dry run..." + DRYRUN_OUTPUT=$(elastic_fleet_integration_policy_dryrun_upgrade "$INTEGRATION_ID") + DRYRUN_ERRORS=$(echo "$DRYRUN_OUTPUT" | jq .[].hasErrors) + + # If no errors with dry run, proceed with actual upgrade + if [[ "$DRYRUN_ERRORS" == "false" ]]; then + echo "No errors detected. Proceeding with upgrade..." + elastic_fleet_integration_policy_upgrade "$INTEGRATION_ID" + if [ $? -ne 0 ]; then + echo "Error: Upgrade failed for integration ID '$INTEGRATION_ID'." + exit 1 + fi + else + echo "Errors detected during dry run. Stopping upgrade..." + exit 1 + fi + fi + fi + done +done +echo diff --git a/salt/elasticfleet/tools/sbin/so_elastic_defend_filters_helper.py b/salt/elasticfleet/tools/sbin/so_elastic_defend_filters_helper.py new file mode 100644 index 000000000..90031a237 --- /dev/null +++ b/salt/elasticfleet/tools/sbin/so_elastic_defend_filters_helper.py @@ -0,0 +1,128 @@ + +import hashlib +import os +import json +import yaml +import requests +from requests.auth import HTTPBasicAuth +import shutil + +# Extract 'entries', 'description' and 'os_types' fields +def extract_relevant_fields(filter): + return { + 'entries': filter.get('entries', []), + 'description': filter.get('description', '') + } + +# Sort for consistency, so that a hash can be generated +def sorted_data(value): + if isinstance(value, dict): + # Recursively sort the dictionary by key + return {k: sorted_data(v) for k, v in sorted(value.items())} + elif isinstance(value, list): + # Sort lists; for dictionaries, sort by a specific key + return sorted(value, key=lambda x: tuple(sorted(x.items())) if isinstance(x, dict) else x) + return value + +# Generate a hash based on sorted relevant fields +def generate_hash(data): + sorted_data_string = json.dumps(sorted_data(data), sort_keys=True) + return hashlib.sha256(sorted_data_string.encode('utf-8')).hexdigest() + +# Load Elasticsearch credentials from the config file +def load_credentials(config_path): + with open(config_path, 'r') as file: + for line in file: + if line.startswith("user"): + credentials = line.split('=', 1)[1].strip().strip('"') + return credentials + return None + +# Extract username and password from credentials +def extract_auth_details(credentials): + if ':' in credentials: + return credentials.split(':', 1) + return None, None + +# Generalized API request function +def api_request(method, guid, username, password, json_data=None): + headers = { + 'kbn-xsrf': 'true', + 'Content-Type': 'application/json' + } + auth = HTTPBasicAuth(username, password) + + if method == "POST": + url = "http://localhost:5601/api/exception_lists/items?namespace_type=agnostic" + else: + url = f"http://localhost:5601/api/exception_lists/items?item_id={guid}&namespace_type=agnostic" + + response = requests.request(method, url, headers=headers, auth=auth, json=json_data) + + if response.status_code in [200, 201]: + return response.json() if response.content else True + elif response.status_code == 404 and method == "GET": + return None + else: + print(f"Error with {method} request: {response.status_code} - {response.text}") + return False + + +# Load YAML data for GUIDs to skip +def load_disabled(disabled_file_path): + if os.path.exists(disabled_file_path): + with open(disabled_file_path, 'r') as file: + return yaml.safe_load(file) or {} + return {} + +def load_yaml_files(*dirs): + yaml_files = [] + + for dir_path in dirs: + if os.path.isdir(dir_path): + # Recurse through the directory and subdirectories + for root, dirs, files in os.walk(dir_path): + for file_name in files: + if file_name.endswith(".yaml"): + full_path = os.path.join(root, file_name) + with open(full_path, 'r') as f: + try: + yaml_content = yaml.safe_load(f) + yaml_files.append(yaml_content) + except yaml.YAMLError as e: + print(f"Error loading {full_path}: {e}") + else: + print(f"Invalid directory: {dir_path}") + + return yaml_files + +def prepare_custom_rules(input_file, output_dir): + # Clear the output directory first + if os.path.exists(output_dir): + shutil.rmtree(output_dir) + os.makedirs(output_dir, exist_ok=True) + + try: + # Load the YAML file + with open(input_file, 'r') as f: + docs = yaml.safe_load_all(f) + + for doc in docs: + if 'id' not in doc: + print(f"Skipping rule, no 'id' found: {doc}") + continue + if doc.get('title') in ["Template 1", "Template 2"]: + print(f"Skipping template rule with title: {doc['title']}") + continue + # Create a filename using the 'id' field + file_name = os.path.join(output_dir, f"{doc['id']}.yaml") + + # Write the individual YAML file + with open(file_name, 'w') as output_file: + yaml.dump(doc, output_file, default_flow_style=False) + print(f"Created file: {file_name}") + + except yaml.YAMLError as e: + print(f"Error parsing YAML: {e}") + except Exception as e: + print(f"Error processing file: {e}") \ No newline at end of file diff --git a/salt/elasticsearch/defaults.yaml b/salt/elasticsearch/defaults.yaml index 15df57f4c..56ac2475c 100644 --- a/salt/elasticsearch/defaults.yaml +++ b/salt/elasticsearch/defaults.yaml @@ -111,15 +111,23 @@ elasticsearch: match_mapping_type: string settings: index: + lifecycle: + name: so-case-logs mapping: total_fields: limit: 1500 number_of_replicas: 0 + auto_expand_replicas: 0-2 number_of_shards: 1 refresh_interval: 30s sort: field: '@timestamp' order: desc + policy: + phases: + hot: + actions: {} + min_age: 0ms so-common: close: 30 delete: 365 @@ -258,15 +266,23 @@ elasticsearch: match_mapping_type: string settings: index: + lifecycle: + name: so-detection-logs mapping: total_fields: limit: 1500 number_of_replicas: 0 + auto_expand_replicas: 0-2 number_of_shards: 1 refresh_interval: 30s sort: field: '@timestamp' order: desc + policy: + phases: + hot: + actions: {} + min_age: 0ms so-endgame: index_sorting: false index_template: @@ -599,6 +615,35 @@ elasticsearch: set_priority: priority: 50 min_age: 30d + so-ip-mappings: + index_sorting: false + index_template: + composed_of: + - so-ip-mappings + ignore_missing_component_templates: [] + index_patterns: + - so-ip* + priority: 500 + template: + mappings: + date_detection: false + dynamic_templates: + - strings_as_keyword: + mapping: + ignore_above: 1024 + type: keyword + match_mapping_type: string + settings: + index: + mapping: + total_fields: + limit: 1500 + number_of_replicas: 0 + number_of_shards: 1 + refresh_interval: 30s + sort: + field: '@timestamp' + order: desc so-items: index_sorting: false index_template: @@ -794,6 +839,116 @@ elasticsearch: priority: 50 min_age: 30d warm: 7 + so-hydra: + close: 30 + delete: 365 + index_sorting: false + index_template: + composed_of: + - agent-mappings + - dtc-agent-mappings + - base-mappings + - dtc-base-mappings + - client-mappings + - dtc-client-mappings + - container-mappings + - destination-mappings + - dtc-destination-mappings + - pb-override-destination-mappings + - dll-mappings + - dns-mappings + - dtc-dns-mappings + - ecs-mappings + - dtc-ecs-mappings + - error-mappings + - event-mappings + - dtc-event-mappings + - file-mappings + - dtc-file-mappings + - group-mappings + - host-mappings + - dtc-host-mappings + - http-mappings + - dtc-http-mappings + - log-mappings + - network-mappings + - dtc-network-mappings + - observer-mappings + - dtc-observer-mappings + - organization-mappings + - package-mappings + - process-mappings + - dtc-process-mappings + - related-mappings + - rule-mappings + - dtc-rule-mappings + - server-mappings + - service-mappings + - dtc-service-mappings + - source-mappings + - dtc-source-mappings + - pb-override-source-mappings + - threat-mappings + - tls-mappings + - url-mappings + - user_agent-mappings + - dtc-user_agent-mappings + - common-settings + - common-dynamic-mappings + data_stream: + allow_custom_routing: false + hidden: false + ignore_missing_component_templates: [] + index_patterns: + - logs-hydra-so* + priority: 500 + template: + mappings: + date_detection: false + dynamic_templates: + - strings_as_keyword: + mapping: + ignore_above: 1024 + type: keyword + match_mapping_type: string + settings: + index: + lifecycle: + name: so-hydra-logs + mapping: + total_fields: + limit: 5000 + number_of_replicas: 0 + number_of_shards: 1 + refresh_interval: 30s + sort: + field: '@timestamp' + order: desc + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d + warm: 7 so-lists: index_sorting: false index_template: @@ -2366,6 +2521,52 @@ elasticsearch: set_priority: priority: 50 min_age: 30d + so-logs-barracuda_cloudgen_firewall_x_log: + index_sorting: False + index_template: + ignore_missing_component_templates: + - logs-barracuda_cloudgen_firewall.log@custom + index_patterns: + - "logs-barracuda_cloudgen_firewall.log-*" + template: + settings: + index: + lifecycle: + name: so-logs-barracuda_cloudgen_firewall.log-logs + number_of_replicas: 0 + composed_of: + - "logs-barracuda_cloudgen_firewall.log@package" + - "logs-barracuda_cloudgen_firewall.log@custom" + - "so-fleet_globals-1" + - "so-fleet_agent_id_verification-1" + priority: 501 + data_stream: + hidden: false + allow_custom_routing: false + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 30d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d so-logs-carbonblack_edr_x_log: index_sorting: false index_template: @@ -3010,6 +3211,50 @@ elasticsearch: set_priority: priority: 50 min_age: 30d + so-logs-cisco_secure_email_gateway_x_log: + index_sorting: false + index_template: + composed_of: + - logs-cisco_secure_email_gateway.log@package + - logs-cisco_secure_email_gateway.log@custom + - so-fleet_globals-1 + - so-fleet_agent_id_verification-1 + data_stream: + hidden: false + allow_custom_routing: false + ignore_missing_component_templates: + - logs-cisco_secure_email_gateway.log@custom + index_patterns: + - logs-cisco_secure_email_gateway.log-* + priority: 501 + template: + settings: + index: + number_of_replicas: 0 + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d so-logs-cisco_umbrella_x_log: index_sorting: false index_template: @@ -3424,28 +3669,70 @@ elasticsearch: set_priority: priority: 50 min_age: 30d - so-logs-crowdstrike_x_falcon: - index_sorting: false + so-logs-crowdstrike_x_alert: + index_sorting: False index_template: + index_patterns: + - logs-crowdstrike.alert-* + template: + settings: + index: + number_of_replicas: 0 + composed_of: + - logs-crowdstrike.alert@package + - logs-crowdstrike.alert@custom + - so-fleet_globals-1 + - so-fleet_agent_id_verification-1 + priority: 501 + data_stream: + hidden: false + allow_custom_routing: false + ignore_missing_component_templates: + - logs-crowdstrike.alert@custom + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d + so-logs-crowdstrike_x_falcon: + index_sorting: False + index_template: + index_patterns: + - logs-crowdstrike.falcon-* + template: + settings: + index: + number_of_replicas: 0 composed_of: - logs-crowdstrike.falcon@package - logs-crowdstrike.falcon@custom - so-fleet_globals-1 - so-fleet_agent_id_verification-1 + priority: 501 data_stream: - allow_custom_routing: false hidden: false + allow_custom_routing: false ignore_missing_component_templates: - logs-crowdstrike.falcon@custom - index_patterns: - - logs-crowdstrike.falcon-* - priority: 501 - template: - settings: - index: - lifecycle: - name: so-logs-crowdstrike.falcon-logs - number_of_replicas: 0 policy: phases: cold: @@ -3471,27 +3758,69 @@ elasticsearch: priority: 50 min_age: 30d so-logs-crowdstrike_x_fdr: - index_sorting: false + index_sorting: False index_template: + index_patterns: + - logs-crowdstrike.fdr-* + template: + settings: + index: + number_of_replicas: 0 composed_of: - logs-crowdstrike.fdr@package - logs-crowdstrike.fdr@custom - so-fleet_globals-1 - so-fleet_agent_id_verification-1 + priority: 501 data_stream: - allow_custom_routing: false hidden: false + allow_custom_routing: false ignore_missing_component_templates: - logs-crowdstrike.fdr@custom + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d + so-logs-crowdstrike_x_host: + index_sorting: False + index_template: index_patterns: - - logs-crowdstrike.fdr-* - priority: 501 + - logs-crowdstrike.host-* template: settings: index: - lifecycle: - name: so-logs-crowdstrike.fdr-logs number_of_replicas: 0 + composed_of: + - logs-crowdstrike.host@package + - logs-crowdstrike.host@custom + - so-fleet_globals-1 + - so-fleet_agent_id_verification-1 + priority: 501 + data_stream: + hidden: false + allow_custom_routing: false + ignore_missing_component_templates: + - logs-crowdstrike.host@custom policy: phases: cold: @@ -6556,6 +6885,52 @@ elasticsearch: set_priority: priority: 50 min_age: 30d + so-logs-imperva_cloud_waf_x_event: + index_sorting: False + index_template: + ignore_missing_component_templates: + - logs-imperva_cloud_waf.event@custom + index_patterns: + - "logs-imperva_cloud_waf.event-*" + template: + settings: + index: + lifecycle: + name: so-logs-imperva_cloud_waf.event-logs + number_of_replicas: 0 + composed_of: + - "logs-imperva_cloud_waf.event@package" + - "logs-imperva_cloud_waf.event@custom" + - "so-fleet_globals-1" + - "so-fleet_agent_id_verification-1" + priority: 501 + data_stream: + hidden: false + allow_custom_routing: false + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 30d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d so-logs-juniper_srx_x_log: index_sorting: false index_template: @@ -10068,6 +10443,138 @@ elasticsearch: set_priority: priority: 50 min_age: 30d + so-logs-ti_rapid7_threat_command_x_alert: + index_sorting: false + index_template: + composed_of: + - logs-ti_rapid7_threat_command.alert@package + - logs-ti_rapid7_threat_command.alert@custom + - so-fleet_globals-1 + - so-fleet_agent_id_verification-1 + data_stream: + hidden: false + allow_custom_routing: false + ignore_missing_component_templates: + - logs-ti_rapid7_threat_command.alert@custom + index_patterns: + - logs-ti_rapid7_threat_command.alert-* + priority: 501 + template: + settings: + index: + number_of_replicas: 0 + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d + so-logs-ti_rapid7_threat_command_x_ioc: + index_sorting: false + index_template: + composed_of: + - logs-ti_rapid7_threat_command.ioc@package + - logs-ti_rapid7_threat_command.ioc@custom + - so-fleet_globals-1 + - so-fleet_agent_id_verification-1 + data_stream: + hidden: false + allow_custom_routing: false + ignore_missing_component_templates: + - logs-ti_rapid7_threat_command.ioc@custom + index_patterns: + - logs-ti_rapid7_threat_command.ioc-* + priority: 501 + template: + settings: + index: + number_of_replicas: 0 + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d + so-logs-ti_rapid7_threat_command_x_vulnerability: + index_sorting: false + index_template: + composed_of: + - logs-ti_rapid7_threat_command.vulnerability@package + - logs-ti_rapid7_threat_command.vulnerability@custom + - so-fleet_globals-1 + - so-fleet_agent_id_verification-1 + data_stream: + hidden: false + allow_custom_routing: false + ignore_missing_component_templates: + - logs-ti_rapid7_threat_command.vulnerability@custom + index_patterns: + - logs-ti_rapid7_threat_command.vulnerability-* + priority: 501 + template: + settings: + index: + number_of_replicas: 0 + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d so-logs-ti_recordedfuture_x_latest_ioc-template: index_sorting: false index_template: @@ -10206,6 +10713,182 @@ elasticsearch: set_priority: priority: 50 min_age: 30d + so-logs-trend_micro_vision_one_x_alert: + index_sorting: False + index_template: + index_patterns: + - "logs-trend_micro_vision_one.alert-*" + template: + settings: + index: + number_of_replicas: 0 + composed_of: + - "logs-trend_micro_vision_one.alert@package" + - "logs-trend_micro_vision_one.alert@custom" + - "so-fleet_globals-1" + - "so-fleet_agent_id_verification-1" + ignore_missing_component_templates: + - "logs-trend_micro_vision_one.alert@custom" + priority: 501 + data_stream: + hidden: false + allow_custom_routing: false + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d + so-logs-trend_micro_vision_one_x_audit: + index_sorting: False + index_template: + index_patterns: + - "logs-trend_micro_vision_one.audit-*" + template: + settings: + index: + number_of_replicas: 0 + ignore_missing_component_templates: + - "logs-trend_micro_vision_one.audit@custom" + composed_of: + - "logs-trend_micro_vision_one.audit@package" + - "logs-trend_micro_vision_one.audit@custom" + - "so-fleet_globals-1" + - "so-fleet_agent_id_verification-1" + priority: 501 + data_stream: + hidden: false + allow_custom_routing: false + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d + so-logs-trend_micro_vision_one_x_detection: + index_sorting: False + index_template: + index_patterns: + - "logs-trend_micro_vision_one.detection-*" + template: + settings: + index: + number_of_replicas: 0 + ignore_missing_component_templates: + - "logs-trend_micro_vision_one.detection@custom" + composed_of: + - "logs-trend_micro_vision_one.detection@package" + - "logs-trend_micro_vision_one.detection@custom" + - "so-fleet_globals-1" + - "so-fleet_agent_id_verification-1" + priority: 501 + data_stream: + hidden: false + allow_custom_routing: false + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d + so-logs-trendmicro_x_deep_security: + index_sorting: False + index_template: + index_patterns: + - "logs-trendmicro.deep_security-*" + template: + settings: + index: + number_of_replicas: 0 + ignore_missing_component_templates: + - "logs-trendmicro.deep_security@custom" + composed_of: + - "logs-trendmicro.deep_security@package" + - "logs-trendmicro.deep_security@custom" + - "so-fleet_globals-1" + - "so-fleet_agent_id_verification-1" + priority: 501 + data_stream: + hidden: false + allow_custom_routing: false + policy: + phases: + cold: + actions: + set_priority: + priority: 0 + min_age: 60d + delete: + actions: + delete: {} + min_age: 365d + hot: + actions: + rollover: + max_age: 30d + max_primary_shard_size: 50gb + set_priority: + priority: 100 + min_age: 0ms + warm: + actions: + set_priority: + priority: 50 + min_age: 30d so-logs-vsphere_x_log: index_sorting: false index_template: diff --git a/salt/elasticsearch/files/ingest/hydra b/salt/elasticsearch/files/ingest/hydra new file mode 100644 index 000000000..6bb2c22d8 --- /dev/null +++ b/salt/elasticsearch/files/ingest/hydra @@ -0,0 +1,9 @@ +{ + "description" : "hydra", + "processors" : [ + {"set":{"field":"audience","value":"access","override":false,"ignore_failure":true}}, + {"set":{"field":"event.dataset","ignore_empty_value":true,"ignore_failure":true,"value":"hydra.{{{audience}}}","media_type":"text/plain"}}, + {"set":{"field":"event.action","ignore_failure":true,"copy_from":"msg" }}, + { "pipeline": { "name": "common" } } + ] +} \ No newline at end of file diff --git a/salt/elasticsearch/files/ingest/logs-pfsense.log-1.16.0 b/salt/elasticsearch/files/ingest/logs-pfsense.log-1.16.0 index af31e1518..f53abb0e3 100644 --- a/salt/elasticsearch/files/ingest/logs-pfsense.log-1.16.0 +++ b/salt/elasticsearch/files/ingest/logs-pfsense.log-1.16.0 @@ -1,5 +1,5 @@ { - "description": "Pipeline for pfSense", + "description": "Pipeline for PFsense", "processors": [ { "set": { diff --git a/salt/elasticsearch/files/ingest/logs-pfsense.log-1.16.0-suricata b/salt/elasticsearch/files/ingest/logs-pfsense.log-1.16.0-suricata index f3a14af44..9cb10c2bb 100644 --- a/salt/elasticsearch/files/ingest/logs-pfsense.log-1.16.0-suricata +++ b/salt/elasticsearch/files/ingest/logs-pfsense.log-1.16.0-suricata @@ -1,9 +1,14 @@ { "description": "Pipeline for parsing pfSense Suricata logs.", "processors": [ + { "set": { + "field": "event.module", + "value": "suricata" + } + }, { "pipeline": { - "name": "suricata.common" + "name": "suricata.common_pfsense" } } ], diff --git a/salt/elasticsearch/files/ingest/logs-pfsense.log-1.19.1 b/salt/elasticsearch/files/ingest/logs-pfsense.log-1.19.1 new file mode 100644 index 000000000..6166f6b55 --- /dev/null +++ b/salt/elasticsearch/files/ingest/logs-pfsense.log-1.19.1 @@ -0,0 +1,414 @@ +{ + "description": "Pipeline for PFsense", + "processors": [ + { + "set": { + "field": "ecs.version", + "value": "8.11.0" + } + }, + { + "set": { + "field": "observer.vendor", + "value": "netgate" + } + }, + { + "set": { + "field": "observer.type", + "value": "firewall" + } + }, + { + "rename": { + "field": "message", + "target_field": "event.original", + "ignore_missing": true, + "if": "ctx.event?.original == null" + } + }, + { + "set": { + "field": "event.kind", + "value": "event" + } + }, + { + "set": { + "field": "event.timezone", + "value": "{{_tmp.tz_offset}}", + "if": "ctx._tmp?.tz_offset != null && ctx._tmp?.tz_offset != 'local'" + } + }, + { + "grok": { + "description": "Parse syslog header", + "field": "event.original", + "patterns": [ + "^(%{ECS_SYSLOG_PRI})?%{TIMESTAMP} %{GREEDYDATA:message}" + ], + "pattern_definitions": { + "ECS_SYSLOG_PRI": "<%{NONNEGINT:log.syslog.priority:long}>(\\d )?", + "TIMESTAMP": "(?:%{BSD_TIMESTAMP_FORMAT}|%{SYSLOG_TIMESTAMP_FORMAT})", + "BSD_TIMESTAMP_FORMAT": "%{SYSLOGTIMESTAMP:_tmp.timestamp}(%{SPACE}%{BSD_PROCNAME}|%{SPACE}%{OBSERVER}%{SPACE}%{BSD_PROCNAME})(\\[%{POSINT:process.pid:long}\\])?:", + "BSD_PROCNAME": "(?:\\b%{NAME:process.name}|\\(%{NAME:process.name}\\))", + "NAME": "[[[:alnum:]]_-]+", + "SYSLOG_TIMESTAMP_FORMAT": "%{TIMESTAMP_ISO8601:_tmp.timestamp8601}%{SPACE}%{OBSERVER}%{SPACE}%{PROCESS}%{SPACE}(%{POSINT:process.pid:long}|-) - (-|%{META})", + "TIMESTAMP_ISO8601": "%{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE:event.timezone}?", + "OBSERVER": "(?:%{IP:observer.ip}|%{HOSTNAME:observer.name})", + "UNIXPATH": "(/([\\w_%!$@:.,+~-]+|\\\\.)*)*", + "PROCESS": "(\\(%{DATA:process.name}\\)|(?:%{UNIXPATH})%{BASEPATH:process.name})", + "BASEPATH": "[[[:alnum:]]_%!$@:.,+~-]+", + "META": "\\[[^\\]]*\\]" + } + } + }, + { + "date": { + "if": "ctx._tmp.timestamp8601 != null", + "field": "_tmp.timestamp8601", + "target_field": "@timestamp", + "formats": [ + "ISO8601" + ] + } + }, + { + "date": { + "if": "ctx.event?.timezone != null && ctx._tmp?.timestamp != null", + "field": "_tmp.timestamp", + "target_field": "@timestamp", + "formats": [ + "MMM d HH:mm:ss", + "MMM d HH:mm:ss", + "MMM dd HH:mm:ss" + ], + "timezone": "{{ event.timezone }}" + } + }, + { + "grok": { + "description": "Set Event Provider", + "field": "process.name", + "patterns": [ + "^%{HYPHENATED_WORDS:event.provider}" + ], + "pattern_definitions": { + "HYPHENATED_WORDS": "\\b[A-Za-z0-9_]+(-[A-Za-z_]+)*\\b" + } + } + }, + { + "pipeline": { + "name": "logs-pfsense.log-1.19.1-firewall", + "if": "ctx.event.provider == 'filterlog'" + } + }, + { + "pipeline": { + "name": "logs-pfsense.log-1.19.1-openvpn", + "if": "ctx.event.provider == 'openvpn'" + } + }, + { + "pipeline": { + "name": "logs-pfsense.log-1.19.1-ipsec", + "if": "ctx.event.provider == 'charon'" + } + }, + { + "pipeline": { + "name": "logs-pfsense.log-1.19.1-dhcp", + "if": "[\"dhcpd\", \"dhclient\", \"dhcp6c\"].contains(ctx.event.provider)" + } + }, + { + "pipeline": { + "name": "logs-pfsense.log-1.19.1-unbound", + "if": "ctx.event.provider == 'unbound'" + } + }, + { + "pipeline": { + "name": "logs-pfsense.log-1.19.1-haproxy", + "if": "ctx.event.provider == 'haproxy'" + } + }, + { + "pipeline": { + "name": "logs-pfsense.log-1.19.1-php-fpm", + "if": "ctx.event.provider == 'php-fpm'" + } + }, + { + "pipeline": { + "name": "logs-pfsense.log-1.19.1-squid", + "if": "ctx.event.provider == 'squid'" + } + }, + { + "pipeline": { + "name": "logs-pfsense.log-1.16.0-suricata", + "if": "ctx.event.provider == 'suricata'" + } + }, + { + "drop": { + "if": "![\"filterlog\", \"openvpn\", \"charon\", \"dhcpd\", \"dhclient\", \"dhcp6c\", \"unbound\", \"haproxy\", \"php-fpm\", \"squid\", \"suricata\"].contains(ctx.event?.provider)" + } + }, + { + "append": { + "field": "event.category", + "value": "network", + "if": "ctx.network != null" + } + }, + { + "convert": { + "field": "source.address", + "target_field": "source.ip", + "type": "ip", + "ignore_failure": true, + "ignore_missing": true + } + }, + { + "convert": { + "field": "destination.address", + "target_field": "destination.ip", + "type": "ip", + "ignore_failure": true, + "ignore_missing": true + } + }, + { + "set": { + "field": "network.type", + "value": "ipv6", + "if": "ctx.source?.ip != null && ctx.source.ip.contains(\":\")" + } + }, + { + "set": { + "field": "network.type", + "value": "ipv4", + "if": "ctx.source?.ip != null && ctx.source.ip.contains(\".\")" + } + }, + { + "geoip": { + "field": "source.ip", + "target_field": "source.geo", + "ignore_missing": true + } + }, + { + "geoip": { + "field": "destination.ip", + "target_field": "destination.geo", + "ignore_missing": true + } + }, + { + "geoip": { + "ignore_missing": true, + "database_file": "GeoLite2-ASN.mmdb", + "field": "source.ip", + "target_field": "source.as", + "properties": [ + "asn", + "organization_name" + ] + } + }, + { + "geoip": { + "database_file": "GeoLite2-ASN.mmdb", + "field": "destination.ip", + "target_field": "destination.as", + "properties": [ + "asn", + "organization_name" + ], + "ignore_missing": true + } + }, + { + "rename": { + "field": "source.as.asn", + "target_field": "source.as.number", + "ignore_missing": true + } + }, + { + "rename": { + "field": "source.as.organization_name", + "target_field": "source.as.organization.name", + "ignore_missing": true + } + }, + { + "rename": { + "field": "destination.as.asn", + "target_field": "destination.as.number", + "ignore_missing": true + } + }, + { + "rename": { + "field": "destination.as.organization_name", + "target_field": "destination.as.organization.name", + "ignore_missing": true + } + }, + { + "community_id": { + "target_field": "network.community_id", + "ignore_failure": true + } + }, + { + "grok": { + "field": "observer.ingress.interface.name", + "patterns": [ + "%{DATA}.%{NONNEGINT:observer.ingress.vlan.id}" + ], + "ignore_missing": true, + "ignore_failure": true + } + }, + { + "set": { + "field": "network.vlan.id", + "copy_from": "observer.ingress.vlan.id", + "ignore_empty_value": true + } + }, + { + "append": { + "field": "related.ip", + "value": "{{destination.ip}}", + "allow_duplicates": false, + "if": "ctx.destination?.ip != null" + } + }, + { + "append": { + "field": "related.ip", + "value": "{{source.ip}}", + "allow_duplicates": false, + "if": "ctx.source?.ip != null" + } + }, + { + "append": { + "field": "related.ip", + "value": "{{source.nat.ip}}", + "allow_duplicates": false, + "if": "ctx.source?.nat?.ip != null" + } + }, + { + "append": { + "field": "related.hosts", + "value": "{{destination.domain}}", + "if": "ctx.destination?.domain != null" + } + }, + { + "append": { + "field": "related.user", + "value": "{{user.name}}", + "if": "ctx.user?.name != null" + } + }, + { + "set": { + "field": "network.direction", + "value": "{{network.direction}}bound", + "if": "ctx.network?.direction != null && ctx.network?.direction =~ /^(in|out)$/" + } + }, + { + "remove": { + "field": [ + "_tmp" + ], + "ignore_failure": true + } + }, + { + "script": { + "lang": "painless", + "description": "This script processor iterates over the whole document to remove fields with null values.", + "source": "void handleMap(Map map) {\n for (def x : map.values()) {\n if (x instanceof Map) {\n handleMap(x);\n } else if (x instanceof List) {\n handleList(x);\n }\n }\n map.values().removeIf(v -> v == null || (v instanceof String && v == \"-\"));\n}\nvoid handleList(List list) {\n for (def x : list) {\n if (x instanceof Map) {\n handleMap(x);\n } else if (x instanceof List) {\n handleList(x);\n }\n }\n}\nhandleMap(ctx);\n" + } + }, + { + "remove": { + "field": "event.original", + "if": "ctx.tags == null || !(ctx.tags.contains('preserve_original_event'))", + "ignore_failure": true, + "ignore_missing": true + } + }, + { + "pipeline": { + "name": "global@custom", + "ignore_missing_pipeline": true, + "description": "[Fleet] Global pipeline for all data streams" + } + }, + { + "pipeline": { + "name": "logs@custom", + "ignore_missing_pipeline": true, + "description": "[Fleet] Pipeline for all data streams of type `logs`" + } + }, + { + "pipeline": { + "name": "logs-pfsense.integration@custom", + "ignore_missing_pipeline": true, + "description": "[Fleet] Pipeline for all data streams of type `logs` defined by the `pfsense` integration" + } + }, + { + "pipeline": { + "name": "logs-pfsense.log@custom", + "ignore_missing_pipeline": true, + "description": "[Fleet] Pipeline for the `pfsense.log` dataset" + } + } + ], + "on_failure": [ + { + "remove": { + "field": [ + "_tmp" + ], + "ignore_failure": true + } + }, + { + "set": { + "field": "event.kind", + "value": "pipeline_error" + } + }, + { + "append": { + "field": "error.message", + "value": "{{{ _ingest.on_failure_message }}}" + } + } + ], + "_meta": { + "managed_by": "fleet", + "managed": true, + "package": { + "name": "pfsense" + } + } +} diff --git a/salt/elasticsearch/files/ingest/suricata.alert_pfsense b/salt/elasticsearch/files/ingest/suricata.alert_pfsense new file mode 100644 index 000000000..32b0a285d --- /dev/null +++ b/salt/elasticsearch/files/ingest/suricata.alert_pfsense @@ -0,0 +1,16 @@ +{ + "description" : "suricata.alert", + "processors" : [ + { "set": { "field": "data_stream.dataset", "value": "suricata" } }, + { "set": { "field": "data_stream.namespace", "value": "so" } }, + { "set": { "field": "_index", "value": "logs-suricata.alerts-so" } }, + { "set": { "field": "tags","value": "alert" }}, + { "rename":{ "field": "message2.alert", "target_field": "rule", "ignore_failure": true } }, + { "rename":{ "field": "rule.signature", "target_field": "rule.name", "ignore_failure": true } }, + { "rename":{ "field": "rule.ref", "target_field": "rule.version", "ignore_failure": true } }, + { "rename":{ "field": "rule.signature_id", "target_field": "rule.uuid", "ignore_failure": true } }, + { "rename":{ "field": "rule.signature_id", "target_field": "rule.signature", "ignore_failure": true } }, + { "rename":{ "field": "message2.payload_printable", "target_field": "network.data.decoded", "ignore_failure": true } }, + { "pipeline": { "name": "common.nids" } } + ] +} diff --git a/salt/elasticsearch/files/ingest/suricata.common_pfsense b/salt/elasticsearch/files/ingest/suricata.common_pfsense new file mode 100644 index 000000000..04da7b482 --- /dev/null +++ b/salt/elasticsearch/files/ingest/suricata.common_pfsense @@ -0,0 +1,23 @@ +{ + "description" : "suricata.common", + "processors" : [ + { "json": { "field": "message", "target_field": "message2", "ignore_failure": true } }, + { "rename": { "field": "message2.pkt_src", "target_field": "network.packet_source","ignore_failure": true } }, + { "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_failure": true } }, + { "rename": { "field": "message2.in_iface", "target_field": "observer.ingress.interface.name", "ignore_failure": true } }, + { "rename": { "field": "message2.flow_id", "target_field": "log.id.uid", "ignore_failure": true } }, + { "rename": { "field": "message2.src_ip", "target_field": "source.ip", "ignore_failure": true } }, + { "rename": { "field": "message2.src_port", "target_field": "source.port", "ignore_failure": true } }, + { "rename": { "field": "message2.dest_ip", "target_field": "destination.ip", "ignore_failure": true } }, + { "rename": { "field": "message2.dest_port", "target_field": "destination.port", "ignore_failure": true } }, + { "rename": { "field": "message2.vlan", "target_field": "network.vlan.id", "ignore_failure": true } }, + { "rename": { "field": "message2.community_id", "target_field": "network.community_id", "ignore_missing": true } }, + { "rename": { "field": "message2.xff", "target_field": "xff.ip", "ignore_missing": true } }, + { "set": { "field": "event.dataset", "value": "{{ message2.event_type }}" } }, + { "set": { "field": "observer.name", "value": "{{agent.name}}" } }, + { "set": { "field": "event.ingested", "value": "{{@timestamp}}" } }, + { "date": { "field": "message2.timestamp", "target_field": "@timestamp", "formats": ["ISO8601", "UNIX"], "timezone": "UTC", "ignore_failure": true } }, + { "remove":{ "field": "agent", "ignore_failure": true } }, + { "pipeline": { "if": "ctx?.event?.dataset != null", "name": "suricata.{{event.dataset}}_pfsense" } } + ] +} diff --git a/salt/elasticsearch/files/ingest/zeek.http2 b/salt/elasticsearch/files/ingest/zeek.http2 new file mode 100644 index 000000000..eeeecef8c --- /dev/null +++ b/salt/elasticsearch/files/ingest/zeek.http2 @@ -0,0 +1,37 @@ +{ + "description" : "zeek.http2", + "processors" : [ + { "set": { "field": "event.dataset", "value": "http2" } }, + { "set": { "field": "network.transport", "value": "tcp" } }, + { "json": { "field": "message", "target_field": "message2", "ignore_failure": true } }, + { "rename": { "field": "message2.trans_depth", "target_field": "http.trans_depth", "ignore_missing": true } }, + { "rename": { "field": "message2.method", "target_field": "http.method", "ignore_missing": true } }, + { "rename": { "field": "message2.host", "target_field": "http.virtual_host", "ignore_missing": true } }, + { "rename": { "field": "message2.uri", "target_field": "http.uri", "ignore_missing": true } }, + { "rename": { "field": "message2.referrer", "target_field": "http.referrer", "ignore_missing": true } }, + { "rename": { "field": "message2.version", "target_field": "http.version", "ignore_missing": true } }, + { "rename": { "field": "message2.user_agent", "target_field": "http.useragent", "ignore_missing": true } }, + { "rename": { "field": "message2.request_body_len", "target_field": "http.request.body.length", "ignore_missing": true } }, + { "rename": { "field": "message2.response_body_len", "target_field": "http.response.body.length", "ignore_missing": true } }, + { "rename": { "field": "message2.status_code", "target_field": "http.status_code", "ignore_missing": true } }, + { "rename": { "field": "message2.status_msg", "target_field": "http.status_message", "ignore_missing": true } }, + { "rename": { "field": "message2.info_code", "target_field": "http.info_code", "ignore_missing": true } }, + { "rename": { "field": "message2.info_msg", "target_field": "http.info_message", "ignore_missing": true } }, + { "rename": { "field": "message2.username", "target_field": "http.user", "ignore_missing": true } }, + { "rename": { "field": "message2.password", "target_field": "http.password", "ignore_missing": true } }, + { "rename": { "field": "message2.proxied", "target_field": "http.proxied", "ignore_missing": true } }, + { "rename": { "field": "message2.orig_fuids", "target_field": "log.id.orig_fuids", "ignore_missing": true } }, + { "rename": { "field": "message2.orig_filenames", "target_field": "file.orig_filenames", "ignore_missing": true } }, + { "rename": { "field": "message2.orig_mime_types", "target_field": "file.orig_mime_types", "ignore_missing": true } }, + { "rename": { "field": "message2.resp_fuids", "target_field": "log.id.resp_fuids", "ignore_missing": true } }, + { "rename": { "field": "message2.resp_filenames", "target_field": "file.resp_filenames", "ignore_missing": true } }, + { "rename": { "field": "message2.resp_mime_types", "target_field": "file.resp_mime_types", "ignore_missing": true } }, + { "rename": { "field": "message2.stream_id", "target_field": "http2.stream_id", "ignore_missing": true } }, + { "remove": { "field": "message2.tags", "ignore_failure": true } }, + { "remove": { "field": ["host"], "ignore_failure": true } }, + { "script": { "lang": "painless", "source": "ctx.uri_length = ctx.uri.length()", "ignore_failure": true } }, + { "script": { "lang": "painless", "source": "ctx.useragent_length = ctx.useragent.length()", "ignore_failure": true } }, + { "script": { "lang": "painless", "source": "ctx.virtual_host_length = ctx.virtual_host.length()", "ignore_failure": true } }, + { "pipeline": { "name": "zeek.common" } } + ] +} diff --git a/salt/elasticsearch/soc_elasticsearch.yaml b/salt/elasticsearch/soc_elasticsearch.yaml index a4c350254..88ea45b89 100644 --- a/salt/elasticsearch/soc_elasticsearch.yaml +++ b/salt/elasticsearch/soc_elasticsearch.yaml @@ -1,6 +1,7 @@ elasticsearch: enabled: - description: You can enable or disable Elasticsearch. + description: Enables or disables the Elasticsearch process. This process provides the log event storage system. WARNING - Disabling this process is unsupported. + advanced: True helpLink: elasticsearch.html version: description: "This specifies the version of the following containers: so-elastic-fleet-package-registry, so-elastic-agent, so-elastic-fleet, so-kibana, so-logstash and so-elasticsearch. Modifying this value in the Elasticsearch defaults.yaml will result in catastrophic grid failure." @@ -381,6 +382,7 @@ elasticsearch: so-logs-azure_x_signinlogs: *indexSettings so-logs-azure_x_springcloudlogs: *indexSettings so-logs-barracuda_x_waf: *indexSettings + so-logs-barracuda_cloudgen_firewall_x_log: *indexSettings so-logs-cef_x_log: *indexSettings so-logs-cisco_asa_x_log: *indexSettings so-logs-cisco_ftd_x_log: *indexSettings @@ -394,8 +396,10 @@ elasticsearch: so-logs-citrix_waf_x_log: *indexSettings so-logs-cloudflare_x_audit: *indexSettings so-logs-cloudflare_x_logpull: *indexSettings + so-logs-crowdstrike_x_alert: *indexSettings so-logs-crowdstrike_x_falcon: *indexSettings so-logs-crowdstrike_x_fdr: *indexSettings + so-logs-crowdstrike_x_host: *indexSettings so-logs-darktrace_x_ai_analyst_alert: *indexSettings so-logs-darktrace_x_model_breach_alert: *indexSettings so-logs-darktrace_x_system_status_alert: *indexSettings @@ -435,6 +439,7 @@ elasticsearch: so-logs-httpjson_x_generic: *indexSettings so-logs-iis_x_access: *indexSettings so-logs-iis_x_error: *indexSettings + so-logs-imperva_cloud_waf_x_event: *indexSettings so-logs-juniper_x_junos: *indexSettings so-logs-juniper_x_netscreen: *indexSettings so-logs-juniper_x_srx: *indexSettings @@ -491,6 +496,10 @@ elasticsearch: so-logs-ti_recordedfuture_x_latest_ioc-template: *indexSettings so-logs-ti_recordedfuture_x_threat: *indexSettings so-logs-ti_threatq_x_threat: *indexSettings + so-logs-trend_micro_vision_one_x_alert: *indexSettings + so-logs-trend_micro_vision_one_x_audit: *indexSettings + so-logs-trend_micro_vision_one_x_detection: *indexSettings + so-logs-trendmicro_x_deep_security: *indexSettings so-logs-zscaler_zia_x_alerts: *indexSettings so-logs-zscaler_zia_x_dns: *indexSettings so-logs-zscaler_zia_x_firewall: *indexSettings @@ -536,6 +545,7 @@ elasticsearch: so-suricata_x_alerts: *indexSettings so-import: *indexSettings so-kratos: *indexSettings + so-hydra: *indexSettings so-kismet: *indexSettings so-logstash: *indexSettings so-redis: *indexSettings diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-1password.item_usages@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-1password.item_usages@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-1password.item_usages@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-1password.signin_attempts@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-1password.signin_attempts@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-1password.signin_attempts@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-apache.access@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-apache.access@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-apache.access@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-apache.error@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-apache.error@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-apache.error@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-auditd.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-auditd.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-auditd.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-auth0.logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-auth0.logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-auth0.logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.cloudfront_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.cloudfront_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.cloudfront_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.cloudtrail@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.cloudtrail@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.cloudtrail@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.cloudwatch_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.cloudwatch_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.cloudwatch_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.ec2_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.ec2_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.ec2_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.elb_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.elb_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.elb_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.firewall_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.firewall_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.firewall_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.guardduty@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.guardduty@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.guardduty@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.inspector@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.inspector@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.inspector@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.route53_public_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.route53_public_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.route53_public_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.route53_resolver_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.route53_resolver_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.route53_resolver_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.s3access@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.s3access@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.s3access@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.securityhub_findings@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.securityhub_findings@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.securityhub_findings@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.securityhub_insights@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.securityhub_insights@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.securityhub_insights@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.vpcflow@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.vpcflow@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.vpcflow@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-aws.waf@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.waf@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-aws.waf@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.activitylogs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.activitylogs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.activitylogs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.application_gateway@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.application_gateway@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.application_gateway@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.auditlogs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.auditlogs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.auditlogs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.eventhub@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.eventhub@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.eventhub@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.firewall_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.firewall_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.firewall_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.identity_protection@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.identity_protection@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.identity_protection@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.platformlogs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.platformlogs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.platformlogs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.provisioning@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.provisioning@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.provisioning@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.signinlogs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.signinlogs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.signinlogs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-azure.springcloudlogs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.springcloudlogs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-azure.springcloudlogs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-barracuda.waf@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-barracuda.waf@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-barracuda.waf@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-barracuda_cloudgen_firewall.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-barracuda_cloudgen_firewall.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-barracuda_cloudgen_firewall.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-carbonblack_edr.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-carbonblack_edr.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-carbonblack_edr.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cef.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cef.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cef.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-checkpoint.firewall@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-checkpoint.firewall@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-checkpoint.firewall@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_asa.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_asa.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_asa.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.admin@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.admin@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.admin@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.auth@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.auth@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.auth@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.offline_enrollment@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.offline_enrollment@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.offline_enrollment@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.summary@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.summary@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.summary@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.telephony@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.telephony@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_duo.telephony@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_ftd.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_ftd.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_ftd.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_ios.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_ios.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_ios.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_ise.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_ise.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_ise.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_meraki.events@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_meraki.events@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_meraki.events@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_meraki.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_meraki.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_meraki.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_secure_email_gateway.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_secure_email_gateway.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_secure_email_gateway.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_umbrella.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_umbrella.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cisco_umbrella.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.interface@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.interface@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.interface@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.lbvserver@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.lbvserver@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.lbvserver@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.service@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.service@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.service@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.system@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.system@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.system@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.vpn@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.vpn@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_adc.vpn@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_waf.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_waf.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-citrix_waf.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cloudflare.audit@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cloudflare.audit@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cloudflare.audit@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-cloudflare.logpull@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-cloudflare.logpull@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-cloudflare.logpull@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.alert@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.alert@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.alert@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.falcon@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.falcon@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.falcon@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.fdr@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.fdr@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.fdr@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.host@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.host@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-crowdstrike.host@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-darktrace.ai_analyst_alert@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-darktrace.ai_analyst_alert@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-darktrace.ai_analyst_alert@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-darktrace.model_breach_alert@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-darktrace.model_breach_alert@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-darktrace.model_breach_alert@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-darktrace.system_status_alert@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-darktrace.system_status_alert@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-darktrace.system_status_alert@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.apm_server@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.apm_server@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.apm_server@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.auditbeat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.auditbeat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.auditbeat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.cloudbeat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.cloudbeat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.cloudbeat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.endpoint_security@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.endpoint_security@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.endpoint_security@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.filebeat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.filebeat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.filebeat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.fleet_server@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.fleet_server@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.fleet_server@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.heartbeat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.heartbeat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.heartbeat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.metricbeat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.metricbeat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.metricbeat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.osquerybeat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.osquerybeat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.osquerybeat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.packetbeat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.packetbeat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent.packetbeat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent@custom.json index fe77af1db..d8d14a5a9 100644 --- a/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent@custom.json +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-elastic_agent@custom.json @@ -1,6 +1,37 @@ { "template": { - "settings": {} + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } }, "_meta": { "package": { diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.alerts@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.alerts@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.alerts@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.diagnostic.collection@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.diagnostic.collection@custom.json index 1bf9313a9..5bbe3c1fa 100644 --- a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.diagnostic.collection@custom.json +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.diagnostic.collection@custom.json @@ -1,6 +1,37 @@ { "template": { - "settings": {} + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } }, "_meta": { "package": { diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.api@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.api@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.api@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.file@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.file@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.file@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.library@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.library@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.library@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.network@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.network@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.network@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.process@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.process@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.process@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.registry@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.registry@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.registry@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.security@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.security@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-endpoint.events.security@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-f5_bigip.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-f5_bigip.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-f5_bigip.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-fim.event@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-fim.event@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-fim.event@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-fireeye.nx@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-fireeye.nx@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-fireeye.nx@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.clientendpoint@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.clientendpoint@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.clientendpoint@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.firewall@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.firewall@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.firewall@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.fortimail@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.fortimail@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.fortimail@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.fortimanager@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.fortimanager@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet.fortimanager@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet_fortigate.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet_fortigate.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-fortinet_fortigate.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.audit@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.audit@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.audit@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.dns@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.dns@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.dns@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.firewall@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.firewall@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.firewall@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.loadbalancing_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.loadbalancing_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.loadbalancing_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.vpcflow@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.vpcflow@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-gcp.vpcflow@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-github.audit@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-github.audit@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-github.audit@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-github.code_scanning@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-github.code_scanning@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-github.code_scanning@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-github.dependabot@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-github.dependabot@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-github.dependabot@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-github.issues@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-github.issues@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-github.issues@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-github.secret_scanning@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-github.secret_scanning@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-github.secret_scanning@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.access_transparency@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.access_transparency@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.access_transparency@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.admin@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.admin@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.admin@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.alert@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.alert@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.alert@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.context_aware_access@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.context_aware_access@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.context_aware_access@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.device@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.device@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.device@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.drive@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.drive@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.drive@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.gcp@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.gcp@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.gcp@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.group_enterprise@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.group_enterprise@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.group_enterprise@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.groups@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.groups@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.groups@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.login@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.login@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.login@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.rules@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.rules@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.rules@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.saml@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.saml@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.saml@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.token@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.token@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.token@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.user_accounts@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.user_accounts@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-google_workspace.user_accounts@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-http_endpoint.generic@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-http_endpoint.generic@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-http_endpoint.generic@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-httpjson.generic@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-httpjson.generic@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-httpjson.generic@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-iis.access@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-iis.access@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-iis.access@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-iis.error@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-iis.error@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-iis.error@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-imperva_cloud_waf.event@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-imperva_cloud_waf.event@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-imperva_cloud_waf.event@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-juniper.junos@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-juniper.junos@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-juniper.junos@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-juniper.netscreen@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-juniper.netscreen@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-juniper.netscreen@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-juniper.srx@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-juniper.srx@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-juniper.srx@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-juniper_srx.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-juniper_srx.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-juniper_srx.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-kafka_log.generic@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-kafka_log.generic@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-kafka_log.generic@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-lastpass.detailed_shared_folder@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-lastpass.detailed_shared_folder@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-lastpass.detailed_shared_folder@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-lastpass.event_report@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-lastpass.event_report@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-lastpass.event_report@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-lastpass.user@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-lastpass.user@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-lastpass.user@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-m365_defender.event@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-m365_defender.event@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-m365_defender.event@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-m365_defender.incident@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-m365_defender.incident@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-m365_defender.incident@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-m365_defender.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-m365_defender.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-m365_defender.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_defender_endpoint.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_defender_endpoint.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_defender_endpoint.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_dhcp.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_dhcp.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_dhcp.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_sqlserver.audit@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_sqlserver.audit@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_sqlserver.audit@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_sqlserver.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_sqlserver.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-microsoft_sqlserver.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.audit_events@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.audit_events@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.audit_events@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.dlp_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.dlp_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.dlp_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.siem_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.siem_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.siem_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.threat_intel_malware_customer@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.threat_intel_malware_customer@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.threat_intel_malware_customer@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.threat_intel_malware_grid@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.threat_intel_malware_grid@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.threat_intel_malware_grid@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.ttp_ap_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.ttp_ap_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.ttp_ap_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.ttp_ip_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.ttp_ip_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.ttp_ip_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.ttp_url_logs@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.ttp_url_logs@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mimecast.ttp_url_logs@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mysql.error@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mysql.error@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mysql.error@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-mysql.slowlog@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-mysql.slowlog@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-mysql.slowlog@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-netflow.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-netflow.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-netflow.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-nginx.access@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-nginx.access@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-nginx.access@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-nginx.error@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-nginx.error@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-nginx.error@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-o365.audit@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-o365.audit@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-o365.audit@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-okta.system@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-okta.system@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-okta.system@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-panw.panos@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-panw.panos@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-panw.panos@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-pfsense.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-pfsense.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-pfsense.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.clicks_blocked@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.clicks_blocked@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.clicks_blocked@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.clicks_permitted@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.clicks_permitted@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.clicks_permitted@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.message_blocked@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.message_blocked@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.message_blocked@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.message_delivered@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.message_delivered@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-proofpoint_tap.message_delivered@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-pulse_connect_secure.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-pulse_connect_secure.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-pulse_connect_secure.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.activity@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.activity@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.activity@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.agent@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.agent@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.agent@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.alert@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.alert@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.alert@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.group@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.group@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.group@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.threat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.threat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sentinel_one.threat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-snort.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-snort.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-snort.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-snyk.audit@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-snyk.audit@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-snyk.audit@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-snyk.vulnerabilities@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-snyk.vulnerabilities@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-snyk.vulnerabilities@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sonicwall_firewall.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sonicwall_firewall.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sonicwall_firewall.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sophos.utm@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sophos.utm@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sophos.utm@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sophos.xg@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sophos.xg@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sophos.xg@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sophos_central.alert@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sophos_central.alert@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sophos_central.alert@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-sophos_central.event@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-sophos_central.event@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-sophos_central.event@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-symantec_endpoint.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-symantec_endpoint.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-symantec_endpoint.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-system.application@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-system.application@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-system.application@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-system.auth@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-system.auth@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-system.auth@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-system.security@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-system.security@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-system.security@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-system.syslog@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-system.syslog@custom.json index 0123fb956..95a902bb9 100644 --- a/salt/elasticsearch/templates/component/elastic-agent/logs-system.syslog@custom.json +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-system.syslog@custom.json @@ -8,7 +8,35 @@ "type": "match_only_text" } } - } + }, + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } } } }, diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-system.system@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-system.system@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-system.system@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.asset@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.asset@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.asset@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.plugin@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.plugin@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.plugin@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.scan@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.scan@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.scan@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.vulnerability@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.vulnerability@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_io.vulnerability@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_sc.asset@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_sc.asset@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_sc.asset@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_sc.plugin@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_sc.plugin@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_sc.plugin@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_sc.vulnerability@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_sc.vulnerability@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-tenable_sc.vulnerability@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.malware@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.malware@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.malware@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.malwarebazaar@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.malwarebazaar@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.malwarebazaar@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.threatfox@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.threatfox@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.threatfox@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.url@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.url@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_abusech.url@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_anomali.threatstream@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_anomali.threatstream@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_anomali.threatstream@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_cybersixgill.threat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_cybersixgill.threat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_cybersixgill.threat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_misp.threat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_misp.threat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_misp.threat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_misp.threat_attributes@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_misp.threat_attributes@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_misp.threat_attributes@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_otx.pulses_subscribed@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_otx.pulses_subscribed@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_otx.pulses_subscribed@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_otx.threat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_otx.threat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_otx.threat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_rapid7_threat_command.alert@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_rapid7_threat_command.alert@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_rapid7_threat_command.alert@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_rapid7_threat_command.ioc@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_rapid7_threat_command.ioc@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_rapid7_threat_command.ioc@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_rapid7_threat_command.vulnerability@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_rapid7_threat_command.vulnerability@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_rapid7_threat_command.vulnerability@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_recordedfuture.latest_ioc-template@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_recordedfuture.latest_ioc-template@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_recordedfuture.latest_ioc-template@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_recordedfuture.threat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_recordedfuture.threat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_recordedfuture.threat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-ti_threatq.threat@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_threatq.threat@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-ti_threatq.threat@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-trend_micro_vision_one.alert@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-trend_micro_vision_one.alert@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-trend_micro_vision_one.alert@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-trend_micro_vision_one.audit@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-trend_micro_vision_one.audit@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-trend_micro_vision_one.audit@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-trend_micro_vision_one.detection@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-trend_micro_vision_one.detection@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-trend_micro_vision_one.detection@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-trendmicro.deep_security@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-trendmicro.deep_security@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-trendmicro.deep_security@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-vsphere.log@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-vsphere.log@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-vsphere.log@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-windows.forwarded@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-windows.forwarded@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-windows.forwarded@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-windows.powershell@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-windows.powershell@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-windows.powershell@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-windows.powershell_operational@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-windows.powershell_operational@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-windows.powershell_operational@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-windows.sysmon_operational@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-windows.sysmon_operational@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-windows.sysmon_operational@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-winlog.winlog@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-winlog.winlog@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-winlog.winlog@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.alerts@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.alerts@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.alerts@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.dns@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.dns@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.dns@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.firewall@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.firewall@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.firewall@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.tunnel@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.tunnel@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.tunnel@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.web@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.web@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zia.web@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.app_connector_status@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.app_connector_status@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.app_connector_status@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.audit@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.audit@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.audit@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.browser_access@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.browser_access@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.browser_access@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.user_activity@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.user_activity@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.user_activity@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.user_status@custom.json b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.user_status@custom.json new file mode 100644 index 000000000..17319ab9f --- /dev/null +++ b/salt/elasticsearch/templates/component/elastic-agent/logs-zscaler_zpa.user_status@custom.json @@ -0,0 +1,36 @@ +{ + "template": { + "mappings": { + "properties": { + "host": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "related": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "destination": { + "properties":{ + "ip": { + "type": "ip" + } + } + }, + "source": { + "properties":{ + "ip": { + "type": "ip" + } + } + } + } + } + } +} diff --git a/salt/elasticsearch/templates/component/so/detection-mappings.json b/salt/elasticsearch/templates/component/so/detection-mappings.json index 5e51b872b..4dd5b45e7 100644 --- a/salt/elasticsearch/templates/component/so/detection-mappings.json +++ b/salt/elasticsearch/templates/component/so/detection-mappings.json @@ -21,10 +21,10 @@ "properties": { "publicId": { "ignore_above": 1024, - "type": "keyword" + "type": "keyword" }, "title": { - "ignore_above": 1024, + "ignore_above": 1024, "type": "keyword" }, "severity": { @@ -38,15 +38,15 @@ "description": { "type": "text" }, - "category": { + "category": { "ignore_above": 1024, "type": "keyword" }, - "product": { + "product": { "ignore_above": 1024, "type": "keyword" }, - "service": { + "service": { "ignore_above": 1024, "type": "keyword" }, @@ -64,7 +64,7 @@ }, "tags": { "ignore_above": 1024, - "type": "keyword" + "type": "keyword" }, "ruleset": { "ignore_above": 1024, @@ -82,6 +82,12 @@ "ignore_above": 1024, "type": "keyword" }, + "sourceCreated": { + "type": "date" + }, + "sourceUpdated": { + "type": "date" + }, "overrides": { "properties": { "type": { @@ -97,6 +103,9 @@ "updatedAt": { "type": "date" }, + "note": { + "type": "text" + }, "regex": { "type": "text" }, diff --git a/salt/elasticsearch/templates/component/so/so-ip-mappings.json b/salt/elasticsearch/templates/component/so/so-ip-mappings.json new file mode 100644 index 000000000..a61eae5fd --- /dev/null +++ b/salt/elasticsearch/templates/component/so/so-ip-mappings.json @@ -0,0 +1,25 @@ +{ + "_meta": { + "documentation": "https://www.elastic.co/guide/en/ecs/current/ecs-network.html", + "ecs_version": "1.12.2" + }, + "template": { + "mappings": { + "properties": { + "@timestamp": { + "type": "date" + }, + "so": { + "properties": { + "ip_address": { + "type": "ip" + }, + "description": { + "type": "text" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/salt/elasticsearch/tools/sbin_jinja/so-elasticsearch-templates-load b/salt/elasticsearch/tools/sbin_jinja/so-elasticsearch-templates-load index 76b1cc193..758f601eb 100755 --- a/salt/elasticsearch/tools/sbin_jinja/so-elasticsearch-templates-load +++ b/salt/elasticsearch/tools/sbin_jinja/so-elasticsearch-templates-load @@ -23,6 +23,9 @@ else echo "This is the initial template load" fi +# If soup is running, ignore errors +pgrep soup > /dev/null && should_exit_on_failure=0 + load_failures=0 load_template() { @@ -30,7 +33,7 @@ load_template() { file=$2 echo "Loading template file $i" - if ! retry 3 5 "so-elasticsearch-query $uri -d@$file -XPUT" "{\"acknowledged\":true}"; then + if ! retry 3 1 "so-elasticsearch-query $uri -d@$file -XPUT" "{\"acknowledged\":true}"; then if [[ $should_exit_on_failure -eq 1 ]]; then fail "Could not load template file: $file" else diff --git a/salt/firewall/containers.map.jinja b/salt/firewall/containers.map.jinja index 02a1b7cac..cc0a20299 100644 --- a/salt/firewall/containers.map.jinja +++ b/salt/firewall/containers.map.jinja @@ -9,6 +9,7 @@ 'so-influxdb', 'so-kibana', 'so-kratos', + 'so-hydra', 'so-nginx', 'so-redis', 'so-soc', @@ -30,6 +31,7 @@ 'so-kafka', 'so-kibana', 'so-kratos', + 'so-hydra', 'so-logstash', 'so-nginx', 'so-redis', @@ -73,6 +75,7 @@ 'so-influxdb', 'so-kibana', 'so-kratos', + 'so-hydra', 'so-nginx', 'so-soc' ] %} diff --git a/salt/firewall/defaults.yaml b/salt/firewall/defaults.yaml index fc5368e12..b9bfdbf63 100644 --- a/salt/firewall/defaults.yaml +++ b/salt/firewall/defaults.yaml @@ -10,6 +10,7 @@ firewall: elasticsearch_rest: [] endgame: [] eval: [] + external_suricata: [] fleet: [] heavynode: [] idh: [] @@ -86,6 +87,10 @@ firewall: tcp: - 3765 udp: [] + external_suricata: + tcp: + - 7789 + udp: [] influxdb: tcp: - 8086 @@ -216,6 +221,9 @@ firewall: analyst: portgroups: - nginx + external_suricata: + portgroups: + - external_suricata customhostgroup0: portgroups: [] customhostgroup1: @@ -462,6 +470,9 @@ firewall: endgame: portgroups: - endgame + external_suricata: + portgroups: + - external_suricata desktop: portgroups: - docker_registry @@ -654,6 +665,9 @@ firewall: endgame: portgroups: - endgame + external_suricata: + portgroups: + - external_suricata desktop: portgroups: - docker_registry @@ -850,6 +864,9 @@ firewall: endgame: portgroups: - endgame + external_suricata: + portgroups: + - external_suricata strelka_frontend: portgroups: - strelka_frontend @@ -1216,6 +1233,9 @@ firewall: - elastic_agent_control - elastic_agent_data - elastic_agent_update + external_suricata: + portgroups: + - external_suricata analyst: portgroups: - nginx diff --git a/salt/firewall/soc_firewall.yaml b/salt/firewall/soc_firewall.yaml index 3a8b4d3a0..222bcc8a2 100644 --- a/salt/firewall/soc_firewall.yaml +++ b/salt/firewall/soc_firewall.yaml @@ -32,6 +32,7 @@ firewall: elasticsearch_rest: *hostgroupsettingsadv endgame: *hostgroupsettingsadv eval: *hostgroupsettings + external_suricata: *hostgroupsettings fleet: *hostgroupsettings heavynode: *hostgroupsettings idh: *hostgroupsettings @@ -117,6 +118,9 @@ firewall: endgame: tcp: *tcpsettings udp: *udpsettings + external_suricata: + tcp: *tcpsettings + udp: *udpsettings influxdb: tcp: *tcpsettings udp: *udpsettings @@ -215,6 +219,8 @@ firewall: portgroups: *portgroupsdocker elastic_agent_endpoint: portgroups: *portgroupsdocker + external_suricata: + portgroups: *portgroupsdocker strelka_frontend: portgroups: *portgroupsdocker syslog: @@ -370,6 +376,8 @@ firewall: portgroups: *portgroupsdocker endgame: portgroups: *portgroupsdocker + external_suricata: + portgroups: *portgroupsdocker analyst: portgroups: *portgroupsdocker desktop: @@ -463,6 +471,8 @@ firewall: portgroups: *portgroupsdocker analyst: portgroups: *portgroupsdocker + external_suricata: + portgroups: *portgroupsdocker desktop: portgroups: *portgroupsdocker customhostgroup0: @@ -554,6 +564,8 @@ firewall: portgroups: *portgroupsdocker endgame: portgroups: *portgroupsdocker + external_suricata: + portgroups: *portgroupsdocker strelka_frontend: portgroups: *portgroupsdocker syslog: @@ -828,6 +840,8 @@ firewall: portgroups: *portgroupsdocker analyst: portgroups: *portgroupsdocker + external_suricata: + portgroups: *portgroupsdocker desktop: portgroups: *portgroupsdocker customhostgroup0: diff --git a/salt/hydra/config.sls b/salt/hydra/config.sls new file mode 100644 index 000000000..f74726cc1 --- /dev/null +++ b/salt/hydra/config.sls @@ -0,0 +1,51 @@ +# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one +# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at +# https://securityonion.net/license; you may not use this file except in compliance with the +# Elastic License 2.0. + +{% from 'allowed_states.map.jinja' import allowed_states %} +{% if sls.split('.')[0] in allowed_states %} +{% from "hydra/map.jinja" import HYDRAMERGED %} + +hydradir: + file.directory: + - name: /nsm/hydra + - user: 928 + - group: 928 + - mode: 700 + - makedirs: True + +hydradbdir: + file.directory: + - name: /nsm/hydra/db + - user: 928 + - group: 928 + - mode: 700 + - makedirs: True + +hydralogdir: + file.directory: + - name: /opt/so/log/hydra + - user: 928 + - group: 928 + - makedirs: True + +hydraconfig: + file.managed: + - name: /opt/so/conf/hydra/hydra.yaml + - source: salt://hydra/files/hydra.yaml.jinja + - user: 928 + - group: 928 + - mode: 600 + - template: jinja + - makedirs: True + - defaults: + HYDRAMERGED: {{ HYDRAMERGED }} + +{% else %} + +{{sls}}_state_not_allowed: + test.fail_without_changes: + - name: {{sls}}_state_not_allowed + +{% endif %} diff --git a/salt/hydra/defaults.yaml b/salt/hydra/defaults.yaml new file mode 100644 index 000000000..cbea72b97 --- /dev/null +++ b/salt/hydra/defaults.yaml @@ -0,0 +1,30 @@ +hydra: + enabled: False + config: + serve: + public: + port: 4444 + admin: + port: 4445 + urls: + self: + issuer: https://URL_BASE/connect + public: https://URL_BASE/connect + admin: http://localhost:4445 + + secrets: + system: [] + ttl: + access_token: 1h + oidc: + subject_identifiers: + supported_types: + - pairwise + - public + pairwise: + salt: "" + log: + level: debug + format: json + sqa: + opt_out: true \ No newline at end of file diff --git a/salt/hydra/disabled.sls b/salt/hydra/disabled.sls new file mode 100644 index 000000000..c940a5bd6 --- /dev/null +++ b/salt/hydra/disabled.sls @@ -0,0 +1,27 @@ +# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one +# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at +# https://securityonion.net/license; you may not use this file except in compliance with the +# Elastic License 2.0. + +{% from 'allowed_states.map.jinja' import allowed_states %} +{% if sls.split('.')[0] in allowed_states %} + +include: + - hydra.sostatus + +so-hydra: + docker_container.absent: + - force: True + +so-hydra_so-status.disabled: + file.comment: + - name: /opt/so/conf/so-status/so-status.conf + - regex: ^so-hydra$ + +{% else %} + +{{sls}}_state_not_allowed: + test.fail_without_changes: + - name: {{sls}}_state_not_allowed + +{% endif %} diff --git a/salt/hydra/enabled.sls b/salt/hydra/enabled.sls new file mode 100644 index 000000000..e0f03e184 --- /dev/null +++ b/salt/hydra/enabled.sls @@ -0,0 +1,103 @@ +# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one +# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at +# https://securityonion.net/license; you may not use this file except in compliance with the +# Elastic License 2.0. +# +# Note: Per the Elastic License 2.0, the second limitation states: +# +# "You may not move, change, disable, or circumvent the license key functionality +# in the software, and you may not remove or obscure any functionality in the +# software that is protected by the license key." + +{% from 'allowed_states.map.jinja' import allowed_states %} +{% if sls.split('.')[0] in allowed_states %} +{% from 'docker/docker.map.jinja' import DOCKER %} +{% from 'vars/globals.map.jinja' import GLOBALS %} +{% if 'api' in salt['pillar.get']('features', []) %} + +include: + - hydra.config + - hydra.sostatus + +so-hydra: + docker_container.running: + - image: {{ GLOBALS.registry_host }}:5000/{{ GLOBALS.image_repo }}/so-hydra:{{ GLOBALS.so_version }} + - hostname: hydra + - name: so-hydra + - networks: + - sobridge: + - ipv4_address: {{ DOCKER.containers['so-hydra'].ip }} + - binds: + - /opt/so/conf/hydra/:/hydra-conf:ro + - /opt/so/log/hydra/:/hydra-log:rw + - /nsm/hydra/db:/hydra-data:rw + {% if DOCKER.containers['so-hydra'].custom_bind_mounts %} + {% for BIND in DOCKER.containers['so-hydra'].custom_bind_mounts %} + - {{ BIND }} + {% endfor %} + {% endif %} + - port_bindings: + {% for BINDING in DOCKER.containers['so-hydra'].port_bindings %} + - {{ BINDING }} + {% endfor %} + {% if DOCKER.containers['so-hydra'].extra_hosts %} + - extra_hosts: + {% for XTRAHOST in DOCKER.containers['so-hydra'].extra_hosts %} + - {{ XTRAHOST }} + {% endfor %} + {% endif %} + {% if DOCKER.containers['so-hydra'].extra_env %} + - environment: + {% for XTRAENV in DOCKER.containers['so-hydra'].extra_env %} + - {{ XTRAENV }} + {% endfor %} + {% endif %} + - restart_policy: unless-stopped + - watch: + - file: hydraconfig + - require: + - file: hydraconfig + - file: hydralogdir + - file: hydradir + +delete_so-hydra_so-status.disabled: + file.uncomment: + - name: /opt/so/conf/so-status/so-status.conf + - regex: ^so-hydra$ + +wait_for_hydra: + http.wait_for_successful_query: + - name: 'http://{{ GLOBALS.manager }}:4444/' + - ssl: True + - verify_ssl: False + - status: + - 200 + - 301 + - 302 + - 404 + - status_type: list + - wait_for: 300 + - request_interval: 10 + - require: + - docker_container: so-hydra + +{% else %} + +{{sls}}_no_license_detected: + test.fail_without_changes: + - name: {{sls}}_no_license_detected + - comment: + - "This is a feature supported only for customers with a valid license. + Contact Security Onion Solutions, LLC via our website at https://securityonionsolutions.com + for more information about purchasing a license to enable this feature." +include: + - hydra.disabled +{% endif %} + +{% else %} + +{{sls}}_state_not_allowed: + test.fail_without_changes: + - name: {{sls}}_state_not_allowed + +{% endif %} diff --git a/salt/hydra/files/hydra.yaml.jinja b/salt/hydra/files/hydra.yaml.jinja new file mode 100644 index 000000000..fe6a33546 --- /dev/null +++ b/salt/hydra/files/hydra.yaml.jinja @@ -0,0 +1 @@ +{{ HYDRAMERGED.config | yaml(false) }} diff --git a/salt/hydra/init.sls b/salt/hydra/init.sls new file mode 100644 index 000000000..eb7792bca --- /dev/null +++ b/salt/hydra/init.sls @@ -0,0 +1,13 @@ +# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one +# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at +# https://securityonion.net/license; you may not use this file except in compliance with the +# Elastic License 2.0. + +{% from 'hydra/map.jinja' import HYDRAMERGED %} + +include: +{% if HYDRAMERGED.enabled %} + - hydra.enabled +{% else %} + - hydra.disabled +{% endif %} diff --git a/salt/hydra/map.jinja b/salt/hydra/map.jinja new file mode 100644 index 000000000..81e92073e --- /dev/null +++ b/salt/hydra/map.jinja @@ -0,0 +1,13 @@ +{# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one + or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at + https://securityonion.net/license; you may not use this file except in compliance with the + Elastic License 2.0. #} + +{% from 'vars/globals.map.jinja' import GLOBALS %} +{% import_yaml 'hydra/defaults.yaml' as HYDRADEFAULTS %} + +{% do HYDRADEFAULTS.hydra.config.urls.self.update({'issuer': HYDRADEFAULTS.hydra.config.urls.self.issuer | replace("URL_BASE", GLOBALS.url_base)}) %} +{% do HYDRADEFAULTS.hydra.config.urls.self.update({'public': HYDRADEFAULTS.hydra.config.urls.self.public | replace("URL_BASE", GLOBALS.url_base)}) %} +{% do HYDRADEFAULTS.hydra.config.urls.self.update({'admin': HYDRADEFAULTS.hydra.config.urls.self.admin | replace("URL_BASE", GLOBALS.url_base)}) %} + +{% set HYDRAMERGED = salt['pillar.get']('hydra', default=HYDRADEFAULTS.hydra, merge=true) %} \ No newline at end of file diff --git a/salt/hydra/soc_hydra.yaml b/salt/hydra/soc_hydra.yaml new file mode 100644 index 000000000..1e33f00ea --- /dev/null +++ b/salt/hydra/soc_hydra.yaml @@ -0,0 +1,28 @@ +hydra: + enabled: + description: Enables or disables the API authentication system, used for service account authentication. Enabling this feature requires a valid Security Onion license key. Defaults to False. + helpLink: connect.html + config: + ttl: + access_token: + description: Amount of time that the generated access token will be valid. Specified in the form of 2h, which means 2 hours. + global: True + forcedType: string + helpLink: connect.html + log: + level: + description: Log level to use for Kratos logs. + global: True + helpLink: connect.html + format: + description: Log output format for Kratos logs. + global: True + helpLink: connect.html + secrets: + system: + description: Secrets used for token generation. Generated during installation. + global: True + sensitive: True + advanced: True + forcedType: "[]string" + helpLink: connect.html diff --git a/salt/hydra/sostatus.sls b/salt/hydra/sostatus.sls new file mode 100644 index 000000000..8878bed4f --- /dev/null +++ b/salt/hydra/sostatus.sls @@ -0,0 +1,21 @@ +# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one +# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at +# https://securityonion.net/license; you may not use this file except in compliance with the +# Elastic License 2.0. + +{% from 'allowed_states.map.jinja' import allowed_states %} +{% if sls.split('.')[0] in allowed_states %} + +append_so-hydra_so-status.conf: + file.append: + - name: /opt/so/conf/so-status/so-status.conf + - text: so-hydra + - unless: grep -q so-hydra /opt/so/conf/so-status/so-status.conf + +{% else %} + +{{sls}}_state_not_allowed: + test.fail_without_changes: + - name: {{sls}}_state_not_allowed + +{% endif %} diff --git a/salt/idh/config.sls b/salt/idh/config.sls index dcde9c8e5..91f809f9e 100644 --- a/salt/idh/config.sls +++ b/salt/idh/config.sls @@ -43,6 +43,29 @@ idhconfdir: - group: 939 - makedirs: True +idhhttpskinsdir: + file.directory: + - name: /opt/so/conf/idh/http-skins + - user: 939 + - group: 939 + - makedirs: True + +# Copy over default http skins +idhhttpskins: + file.recurse: + - name: /opt/so/conf/idh/http-skins + - user: 939 + - group: 939 + - source: salt://idh/skins/http/opencanary + +# Copy over custom http skins +idhcustomhttpskins: + file.recurse: + - name: /opt/so/conf/idh/http-skins + - user: 939 + - group: 939 + - source: salt://idh/skins/http/custom + # Create a log directory idhlogdir: file.directory: diff --git a/salt/idh/enabled.sls b/salt/idh/enabled.sls index 7ef0ebb46..e08e6647f 100644 --- a/salt/idh/enabled.sls +++ b/salt/idh/enabled.sls @@ -20,6 +20,7 @@ so-idh: - network_mode: host - binds: - /nsm/idh:/var/tmp:rw + - /opt/so/conf/idh/http-skins:/usr/local/lib/python3.12/site-packages/opencanary/modules/data/http/skin:ro - /opt/so/conf/idh/opencanary.conf:/etc/opencanaryd/opencanary.conf:ro {% if DOCKER.containers['so-idh'].custom_bind_mounts %} {% for BIND in DOCKER.containers['so-idh'].custom_bind_mounts %} diff --git a/salt/idh/skins/http/custom/basicCustomLogin/403.html b/salt/idh/skins/http/custom/basicCustomLogin/403.html new file mode 100644 index 000000000..6bc5d8eda --- /dev/null +++ b/salt/idh/skins/http/custom/basicCustomLogin/403.html @@ -0,0 +1,10 @@ + + +403 Forbidden + +

Forbidden

+

You don't have permission to access [[URL]] +on this server.

+
+
[[BANNER]] Server
+ diff --git a/salt/idh/skins/http/custom/basicCustomLogin/404.html b/salt/idh/skins/http/custom/basicCustomLogin/404.html new file mode 100644 index 000000000..631b905ec --- /dev/null +++ b/salt/idh/skins/http/custom/basicCustomLogin/404.html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL [[URL]] was not found on this server.

+
+
[[BANNER]] Server
+ diff --git a/salt/idh/skins/http/custom/basicCustomLogin/index.html b/salt/idh/skins/http/custom/basicCustomLogin/index.html new file mode 100644 index 000000000..3a62e843e --- /dev/null +++ b/salt/idh/skins/http/custom/basicCustomLogin/index.html @@ -0,0 +1,41 @@ + + + Login + + + +
+
+

Network Storage v5.13

+ +

Login failed

+ +
+
+
CustomUsername:
+
+
Password:
+
+
+
+
+
+
+
+ + diff --git a/salt/idh/skins/http/opencanary/basicLogin/403.html b/salt/idh/skins/http/opencanary/basicLogin/403.html new file mode 100644 index 000000000..6bc5d8eda --- /dev/null +++ b/salt/idh/skins/http/opencanary/basicLogin/403.html @@ -0,0 +1,10 @@ + + +403 Forbidden + +

Forbidden

+

You don't have permission to access [[URL]] +on this server.

+
+
[[BANNER]] Server
+ diff --git a/salt/idh/skins/http/opencanary/basicLogin/404.html b/salt/idh/skins/http/opencanary/basicLogin/404.html new file mode 100644 index 000000000..631b905ec --- /dev/null +++ b/salt/idh/skins/http/opencanary/basicLogin/404.html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL [[URL]] was not found on this server.

+
+
[[BANNER]] Server
+ diff --git a/salt/idh/skins/http/opencanary/basicLogin/index.html b/salt/idh/skins/http/opencanary/basicLogin/index.html new file mode 100644 index 000000000..73b776a0f --- /dev/null +++ b/salt/idh/skins/http/opencanary/basicLogin/index.html @@ -0,0 +1,41 @@ + + + Login + + + +
+
+

Network Storage v5.13

+ +

Login failed

+ +
+
+
Username:
+
+
Password:
+
+
+
+
+
+
+
+ + diff --git a/salt/idh/skins/http/opencanary/nasLogin/403.html b/salt/idh/skins/http/opencanary/nasLogin/403.html new file mode 100644 index 000000000..6bc5d8eda --- /dev/null +++ b/salt/idh/skins/http/opencanary/nasLogin/403.html @@ -0,0 +1,10 @@ + + +403 Forbidden + +

Forbidden

+

You don't have permission to access [[URL]] +on this server.

+
+
[[BANNER]] Server
+ diff --git a/salt/idh/skins/http/opencanary/nasLogin/404.html b/salt/idh/skins/http/opencanary/nasLogin/404.html new file mode 100644 index 000000000..631b905ec --- /dev/null +++ b/salt/idh/skins/http/opencanary/nasLogin/404.html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL [[URL]] was not found on this server.

+
+
[[BANNER]] Server
+ diff --git a/salt/idh/skins/http/opencanary/nasLogin/index.html b/salt/idh/skins/http/opencanary/nasLogin/index.html new file mode 100644 index 000000000..47b1dd3d3 --- /dev/null +++ b/salt/idh/skins/http/opencanary/nasLogin/index.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + +Synology DiskStation + + + + + + + + + + + +
+ +
+ + + + + + diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/css/desktop.css b/salt/idh/skins/http/opencanary/nasLogin/static/css/desktop.css new file mode 100644 index 000000000..85bcd44ad --- /dev/null +++ b/salt/idh/skins/http/opencanary/nasLogin/static/css/desktop.css @@ -0,0 +1 @@ +.scrollgeneric{line-height:1px;font-size:1px;position:absolute;top:0;left:0}.vscrollerbase,.hscrollerbase{width:0px;height:0px}.vscrollerbar,.hscrollerbar{background-position:0 0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=20);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=20);opacity:0.2;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0.2s;-moz-transition-duration:0.2s;-o-transition-duration:0.2s;transition-duration:0.2s}.vscrollerbar:hover,.hscrollerbar:hover{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=30);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=30);opacity:0.3}.vscrollerbar:active,.hscrollerbar:active{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=40);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);opacity:0.4}.vscrollerbar{width:10px;margin-left:-10px}.hscrollerbar{height:10px;margin-top:-10px}.vscrollerbar{background-image:url("images/scrollbar/scrollbar_black_v.png");background-repeat:repeat-y}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .vscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_black_v.png");background-size:10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .vscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_black_v.png");background-size:10px;outline:1px green dashed}}.white-scrollerbar .vscrollerbar{background-image:url("images/scrollbar/scrollbar_white_v.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .white-scrollerbar .vscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_white_v.png");background-size:10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .white-scrollerbar .vscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_white_v.png");background-size:10px;outline:1px green dashed}}.hscrollerbar{background-image:url "images/scrollbar/scrollbar_black_h.png";background-repeat:repeat-x}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .hscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_black_h.png");background-size:10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .hscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_black_h.png");background-size:10px;outline:1px green dashed}}.white-scrollerbar .hscrollerbar{background-image:url "images/scrollbar/scrollbar_white_h.png"}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .white-scrollerbar .hscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_white_h.png");background-size:10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .white-scrollerbar .hscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_white_h.png");background-size:10px;outline:1px green dashed}}.flexcrollactive{outline:none}.vscrollerbar{background-image:url("../../../scripts/scrollbar/images/scrollbar/scrollbar_black_v.png");background-repeat:repeat-y}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .vscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_black_v.png");background-size:10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .vscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_black_v.png");background-size:10px;outline:1px green dashed}}.white-scrollerbar .vscrollerbar{background-image:url("../../../scripts/scrollbar/images/scrollbar/scrollbar_white_v.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .white-scrollerbar .vscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_white_v.png");background-size:10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .white-scrollerbar .vscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_white_v.png");background-size:10px;outline:1px green dashed}}.hscrollerbar{background-image:url("../../../scripts/scrollbar/images/scrollbar/scrollbar_black_h.png");background-repeat:repeat-x}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .hscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_black_h.png");background-size:10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .hscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_black_h.png");background-size:10px;outline:1px green dashed}}.white-scrollerbar .hscrollerbar{background-image:url("../../../scripts/scrollbar/images/scrollbar/scrollbar_white_h.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .white-scrollerbar .hscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_white_h.png");background-size:10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .white-scrollerbar .hscrollerbar{background-image:url("../img/synohdpack/images/scrollbar/scrollbar_white_h.png");background-size:10px;outline:1px green dashed}}body{font-size:12px}body,.normal-font{color:#505a64}.disable-font{color:#96a0aa}.note-font{color:#00a66e}.link-font{font-weight:bold}.link-font{color:#0086e5}.green-status{color:#1ca600}.red-status{color:#fa4b4b}.orange-status{color:#ff7f00}a,.blue-status{color:#0086e5}.sds-logo{position:absolute;display:inline-block;height:32px;right:20px;bottom:8px}.sds-logo.light .logo-0{background-image:url("../images/login/light/0.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.light .logo-0{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/0.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.light .logo-0{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/0.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.light .logo-1{background-image:url("../images/login/light/1.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.light .logo-1{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/1.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.light .logo-1{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/1.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.light .logo-2{background-image:url("../images/login/light/2.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.light .logo-2{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/2.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.light .logo-2{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/2.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.light .logo-3{background-image:url("../images/login/light/3.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.light .logo-3{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/3.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.light .logo-3{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/3.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.light .logo-4{background-image:url("../images/login/light/4.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.light .logo-4{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/4.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.light .logo-4{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/4.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.light .logo-5dot{background-image:url("../images/login/light/5dot.png");width:19px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.light .logo-5dot{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/5dot.png");background-size:19px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.light .logo-5dot{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/5dot.png");background-size:19px 32px;outline:1px green dashed}}.sds-logo.light .logo-DSM{background-image:url("../images/login/light/DSM.png");width:56px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.light .logo-DSM{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/DSM.png");background-size:56px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.light .logo-DSM{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/DSM.png");background-size:56px 32px;outline:1px green dashed}}.sds-logo.light .logo-synology{background-image:url("../images/login/light/synology.png");width:111px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.light .logo-synology{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/synology.png");background-size:111px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.light .logo-synology{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/synology.png");background-size:111px 32px;outline:1px green dashed}}.sds-logo.light .logo-beta{background-image:url("../images/login/light/beta.png");width:45px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.light .logo-beta{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/beta.png");background-size:45px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.light .logo-beta{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/beta.png");background-size:45px 32px;outline:1px green dashed}}.sds-logo.dark .logo-0{background-image:url("../images/login/dark/0.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.dark .logo-0{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/0.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.dark .logo-0{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/0.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.dark .logo-1{background-image:url("../images/login/dark/1.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.dark .logo-1{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/1.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.dark .logo-1{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/1.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.dark .logo-2{background-image:url("../images/login/dark/2.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.dark .logo-2{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/2.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.dark .logo-2{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/2.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.dark .logo-3{background-image:url("../images/login/dark/3.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.dark .logo-3{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/3.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.dark .logo-3{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/3.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.dark .logo-4{background-image:url("../images/login/dark/4.png");width:17px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.dark .logo-4{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/4.png");background-size:17px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.dark .logo-4{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/4.png");background-size:17px 32px;outline:1px green dashed}}.sds-logo.dark .logo-5dot{background-image:url("../images/login/dark/5dot.png");width:19px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.dark .logo-5dot{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/5dot.png");background-size:19px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.dark .logo-5dot{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/5dot.png");background-size:19px 32px;outline:1px green dashed}}.sds-logo.dark .logo-DSM{background-image:url("../images/login/dark/DSM.png");width:56px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.dark .logo-DSM{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/DSM.png");background-size:56px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.dark .logo-DSM{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/DSM.png");background-size:56px 32px;outline:1px green dashed}}.sds-logo.dark .logo-synology{background-image:url("../images/login/dark/synology.png");width:111px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.dark .logo-synology{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/synology.png");background-size:111px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.dark .logo-synology{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/synology.png");background-size:111px 32px;outline:1px green dashed}}.sds-logo.dark .logo-beta{background-image:url("../images/login/dark/beta.png");width:45px;height:32px;display:inline-block}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-logo.dark .logo-beta{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/beta.png");background-size:45px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-logo.dark .logo-beta{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/beta.png");background-size:45px 32px;outline:1px green dashed}}#sds-desktop .sds-logo{bottom:12px}#sds-login .sds-logo{bottom:28px}#sds-copyright{position:absolute;width:248px;height:20px;bottom:8px;right:20px}#sds-copyright.light .logo-copyright_2014{background-image:url("../images/login/light/copyright_2014.png");height:100%}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-copyright.light .logo-copyright_2014{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/copyright_2014.png");background-size:248px 20px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-copyright.light .logo-copyright_2014{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/copyright_2014.png");background-size:248px 20px;outline:1px green dashed}}#sds-copyright.light .logo-copyright_2015{background-image:url("../images/login/light/copyright_2015.png");height:100%}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-copyright.light .logo-copyright_2015{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/copyright_2015.png");background-size:248px 20px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-copyright.light .logo-copyright_2015{background-image:url("../img/synohdpack/images/dsm/resources/images/login/light/copyright_2015.png");background-size:248px 20px;outline:1px green dashed}}#sds-copyright.dark .logo-copyright_2014{background-image:url("../images/login/dark/copyright_2014.png");height:100%}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-copyright.dark .logo-copyright_2014{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/copyright_2014.png");background-size:248px 20px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-copyright.dark .logo-copyright_2014{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/copyright_2014.png");background-size:248px 20px;outline:1px green dashed}}#sds-copyright.dark .logo-copyright_2015{background-image:url("../images/login/dark/copyright_2015.png");height:100%}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-copyright.dark .logo-copyright_2015{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/copyright_2015.png");background-size:248px 20px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-copyright.dark .logo-copyright_2015{background-image:url("../img/synohdpack/images/dsm/resources/images/login/dark/copyright_2015.png");background-size:248px 20px;outline:1px green dashed}}#sds-bug-report-container,#sds-mobile-edition-container{position:absolute;bottom:0px;height:36px;width:100%;text-align:center}#sds-mobile-edition,#sds-bug-report{position:absolute;bottom:0px;background-position:0 0}#sds-mobile-edition:hover,#sds-bug-report:hover{background-position:0 -40px;cursor:pointer}#sds-mobile-edition:active,#sds-bug-report:active{background-position:0 -80px}#sds-mobile-edition{background-image:url("../images/bt_dsm_mobile.png");left:50%;margin-left:-84px;width:168px;height:40px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-mobile-edition{background-image:url("../img/synohdpack/images/dsm/resources/images/bt_dsm_mobile.png");background-size:168px 160px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-mobile-edition{background-image:url("../img/synohdpack/images/dsm/resources/images/bt_dsm_mobile.png");background-size:168px 160px;outline:1px green dashed}}#sds-bug-report{background-image:url("../images/bt_bugs.png");left:50%;margin-left:-84px;width:168px;height:40px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-bug-report{background-image:url("../img/synohdpack/images/dsm/resources/images/bt_bugs.png");background-size:168px 160px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-bug-report{background-image:url("../img/synohdpack/images/dsm/resources/images/bt_bugs.png");background-size:168px 160px;outline:1px green dashed}}.desktop-timeout-mask.ext-el-mask{background-color:#000000;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=20);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=20);opacity:0.2}.x-window-tl .x-window-header{font-family:verdana, tahoma, arial ,sans-serif;background-size:16px 16px}.sds-desktop-dd-ct li.launch-icon,li.launch-icon .image,li.launch-icon .image .virtual-group-icon-background{width:64px;height:64px;background-size:64px 64px}.sds-desktop-dd-ct li.launch-icon.classical,li.launch-icon.classical .image,li.launch-icon.classical .image .virtual-group-icon-background{width:48px;height:48px;background-size:48px 48px}#sds-desktop li.launch-icon{width:136px;height:100px;padding-top:16px;position:absolute;float:left;overflow:visible;cursor:pointer}#sds-desktop li.launch-icon.classical{height:84px}.sds-desktop-dd-ct{position:absolute;width:144px;height:240px;overflow:visible;top:-10000px;list-style:none}.sds-desktop-dd-ct li.launch-icon .text,.sds-desktop-dd-ct li.launch-icon .text a{white-space:normal;visibility:hidden}.sds-desktop-dd-ct .sds-desktop-icon-selected{border-radius:0;-moz-border-radius:0;background-color:transparent;filter:none}li.launch-icon .image{position:relative;background-position:center center;background-repeat:no-repeat;margin:0 auto 4px auto}li.launch-icon .image .virtual-group-icon-background{position:absolute;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=75);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=75);opacity:0.75;background:#282d32;background:#282d32;border-radius:5px}.sds-launch-icon-dragging-proxy.x-dd-drop-ok-add .x-dd-drop-icon{width:64px;height:64px;background-image:url(../images/icon_drag_add.png)}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-launch-icon-dragging-proxy.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/icon_drag_add.png");background-size:36px 36px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-launch-icon-dragging-proxy.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/icon_drag_add.png");background-size:36px 36px;outline:1px green dashed}}.sds-launch-icon-dragging-proxy.x-dd-drop-nodrop .x-dd-drop-icon{width:64px;height:64px;background-image:url(../images/icon_drag_ban.png)}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-launch-icon-dragging-proxy.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/icon_drag_ban.png");background-size:36px 36px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-launch-icon-dragging-proxy.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/icon_drag_ban.png");background-size:36px 36px;outline:1px green dashed}}.classical.sds-launch-icon-dragging-proxy.x-dd-drop-ok-add .x-dd-drop-icon,.classical.sds-launch-icon-dragging-proxy.x-dd-drop-nodrop .x-dd-drop-icon{width:48px;height:48px}.sds-grouping-preview-icon{position:absolute;width:24px;height:24px}.classical .sds-grouping-preview-icon{width:16px;height:16px}.sds-grouping-big-preview-icon{position:absolute;visibility:hidden;left:8px;top:8px;width:48px;height:48px}.classical .sds-grouping-big-preview-icon{width:32px;height:32px}#sds-desktop{overflow:hidden;position:absolute;width:100%;height:100%;border:0 none;overflow:hidden;cursor:default;zoom:1;top:39px}#sds-desktop.sds-desktop-hide{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=0);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0}#sds-desktop.semi-transparent{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=60);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=60);opacity:0.6}#sds-desktop.sent-back{z-index:0}.ext-ie8m #sds-desktop.semi-transparent .x-window,.ext-ie8m #sds-desktop.semi-transparent .x-ie-shadow{z-index:0 !important}.sds-launch-icon-dragging-proxy .x-dd-drag-ghost{border:none !important;background-color:transparent !important;opacity:1 !important;filter:none !important}.sds-launch-icon-dragging-proxy .x-dd-drag-ghost .text{visibility:hidden !important}.sds-launch-icon-dragging-proxy .image{white-space:normal}.sds-launch-icon-dragging-proxy li{list-style:none}#sds-sub-container{position:absolute;width:316px;height:192px;overflow:visible;z-index:14002;border-radius:5px}#sds-sub-container .virtual-group-background{position:absolute;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=75);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=75);opacity:0.75;background:#282d32;background:#282d32;top:0px;left:0px;right:0px;bottom:0px;box-shadow:0 2px 4px rgba(0,0,0,0.5);border-radius:5px}#sds-sub-container .virtual-group-background .virtual-group-arrow{left:-22px;top:84px;position:absolute;overflow:hidden;width:22px;height:35px}#sds-sub-container .virtual-group-background .virtual-group-arrow.right-arrow{left:316px}.ext-ie8m #sds-sub-container .virtual-group-background .virtual-group-arrow{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=75);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=75);opacity:0.75;left:-12px;width:0px;height:0px;border:12px solid transparent;border-right-color:#282d32;border-left-width:0px}.ext-ie8m #sds-sub-container .virtual-group-background .virtual-group-arrow.right-arrow{border-left-color:#282d32;border-left-width:12px;border-right-width:0px;left:316px}#sds-sub-container .virtual-group-background .virtual-group-arrow::after{background:#282d32;background:#282d32;content:'';position:absolute;left:6px;width:16px;height:16px;-webkit-transform-origin:right top;-moz-transform-origin:right top;-ms-transform-origin:right top;-o-transform-origin:right top;transform-origin:right top;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);box-shadow:0 2px 4px rgba(0,0,0,0.5)}#sds-sub-container .virtual-group-background .virtual-group-arrow.right-arrow::after{left:0px;-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left top;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}#sds-sub-container hr{margin:0px 10px;position:relative;border:0px solid;border-top-width:1px;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=50);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5;border-color:#b4bec8;border-color:#b4bec8}#sds-sub-container .sds-sub-container-desc{color:#FFF;font-size:14px;font-weight:bold;margin:7px 20px;padding:2px;width:268px;height:18px;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap;font-family:verdana, tahoma, arial, helvetica, sans-serif;border:2px solid transparent;background-color:transparent}#sds-sub-container .sds-sub-container-desc:hover{border-color:#3182c1;background-color:#b4d7f0;color:#000}#sds-sub-container .sds-sub-container-desc:focus{border-color:#3182c1;background-color:#FFF;color:#000}#sds-sub-container .sds-sub-container-div-ct{height:152px;width:276px;overflow:hidden;padding:0 20px}.ext-ie8m #sds-sub-container .sds-sub-container-div-ct div.mcontentwrapper,.ext-ie8m #sds-sub-container .sds-sub-container-div-ct div.scrollwrapper{height:100% !important}#sds-sub-container .sds-sub-container-div-ct .sds-desktop-shortcut li.launch-icon .text,#sds-sub-container .sds-sub-container-div-ct .sds-desktop-shortcut li.launch-icon .text a{overflow:hidden}#sds-sub-container .sds-desktop-shortcut{float:none;width:276px;margin:0px}#sds-sub-container .sds-desktop-shortcut li{float:none;height:84px;padding-top:0}#sds-sub-container .sds-desktop-shortcut li.launch-icon{width:64px;height:128px;margin:0px;padding:0px;overflow:visible}#sds-sub-container .sds-desktop-shortcut li.launch-icon div.image{margin:0px auto}#sds-sub-container .sds-desktop-shortcut li.launch-icon .text,#sds-sub-container .sds-desktop-shortcut li.launch-icon .text a{color:#FFFFFF}#sds-sub-container.classical{height:176px}#sds-sub-container.classical .sds-sub-container-div-ct{height:136px}#sds-sub-container.classical .sds-desktop-shortcut li.launch-icon{width:74px;height:112px}#sds-sub-container-shim{background-color:#000;opacity:0;filter:alpha(opacity=0);position:absolute;width:100%;height:100%;left:0px;top:0px;border:0px;z-index:14000}html,body{height:100%;overflow-x:hidden;overflow-y:hidden;user-select:none;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}body{position:relative}*::-moz-focus-inner{border:0;padding:0}input{position:relative}input[type=text],input[type=password],input[type=textarea]{user-select:text;-moz-user-select:text;-khtml-user-select:text;-webkit-user-select:text;-ms-user-select:text}input[type=text][readonly],input[type=password][readonly],input[type=textarea][readonly]{user-select:none;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-ms-user-select:none}.x-box-item input{position:static}.x-window-header{height:18px}.x-window-header-text{line-height:18px;white-space:nowrap;display:block;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x-masked{overflow:visible !important}.sds-window-mask{z-index:102}.ext-el-mask{z-index:20000}#sds-wallpaper{visibility:hidden;position:absolute;z-index:-2}.ext-ie #sds-desktop{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVR42mNgAAIAAAUAAen63NgAAAAASUVORK5CYII=)}.x-window-ml{padding-left:0px}.x-window-mr{padding-right:0px}.x-window-mc,.x-window-dlg .x-window-mc,.x-window-plain .x-window-mc{border-width:0 1px 0 1px !important;border-style:solid !important;border-color:#D0D0D0 #AAAFB4 !important}.x-window-dlg .x-window-mc{border-bottom:0 !important}.x-window-maximized .x-window-mc{border-left:1px solid #AAAFB4;border-right:1px solid #AAAFB4}.x-window-body{background-color:#FAFAFA;border-top:1px solid #AAA;border-bottom:1px solid #AAA}.x-window-dlg .x-window-footer{margin-left:-6px}.x-panel-nofooter .x-panel-bc,.x-panel-nofooter .x-window-bc{height:0px}.x-window-maximized .x-window-bc{height:0}.x-resizable-over .x-resizable-handle-southeast,.x-resizable-pinned .x-resizable-handle-southeast{width:12px;height:12px;margin:3px;background:transparent;-moz-opacity:1.0;opacity:1.0;filter:none}ul.x-tab-strip li{margin-left:4px}.x-tab-strip span.x-tab-strip-text{padding-left:10px;padding-right:10px;color:#3C3C3C}.x-tab-strip-active span.x-tab-strip-text{color:#002D4D}.x-form-display-field{padding-top:3px;padding-bottom:4px}.ext-gecko .x-form-display-field,.ext-strict .ext-ie7 .x-form-display-field{padding-top:3px;padding-bottom:4px}.x-form-check-wrap{padding:2px 0}.ext-ie7 .x-form-check-wrap{padding:1px 0}.x-window-mc{background:#ffffff none}.x-border-layout-ct,.x-panel-body{background:transparent none}.x-tree .x-panel-body{background-color:transparent}.x-window .x-toolbar-cell .x-btn{margin:2px 3px}.x-window .x-btn button{padding-left:15px;padding-right:15px}.x-window-bbar .x-toolbar-cell .x-btn,.x-panel-bbar .x-toolbar-cell .x-btn{margin:0}.x-window-bbar .x-btn button,.x-panel-bbar .x-btn button{padding:0}.ext-opera .x-form-field-trigger-wrap{overflow:hidden}ul.sds-desktop-shortcut{position:relative;float:left;width:86px;margin:0 0 0 16px}li.launch-icon .text,li.launch-icon .text a{width:100%;font-size:12px;line-height:16px;text-align:center;margin:0 auto;overflow:visible;text-overflow:ellipsis;-o-text-overflow:ellipsis}li.launch-icon{list-style-type:none}li.launch-icon.transition-cls{transition-property:left, top;transition-duration:0.5s;-webkit-transition-property:left, top;-webkit-transition-duration:0.5s;-moz-transition-property:left, top;-moz-transition-duration:0.5s;-o-transition-property:left, top;-o-transition-duration:0.5s}#sds-desktop li.launch-icon .text,#sds-desktop li.launch-icon .text a{color:#FFFFFF}.ext-chrome.syno-cjk #sds-appview .app-panel-title,.ext-chrome.syno-cjk #sds-appview .sds-appview-app-item-title,.ext-chrome.syno-cjk #sds-desktop li.launch-icon .text,.ext-chrome.syno-cjk #sds-desktop li.launch-icon .text a{text-shadow:none}#sds-desktop li.launch-icon.x-btn-click .text,#sds-desktop li.launch-icon.x-btn-click .text a{color:#8C8C8C}.sds-desktop-select-range{position:absolute;background-color:rgba(255,255,255,0.3);border:solid 1px white;opacity:1}.ext-ie .sds-desktop-select-range{background:transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4CFFFFFF,endColorstr=#4CFFFFFF);zoom:1}.sds-desktop-icon-selected{background-color:rgba(255,255,255,0.3);border-radius:10px;-moz-border-radius:10px}.ext-ie .sds-desktop-icon-selected{background:transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4CFFFFFF,endColorstr=#4CFFFFFF);zoom:1}.sds-launchbox li.launch-icon{position:absolute;width:95px;height:98px;margin:12px 0 0 7px}.sds-launchbox li.launch-icon .image{width:48px;height:48px}.sds-launchbox li.launch-icon .text,.sds-launchbox li.launch-icon .text a{font-size:11px;color:#3C3C3C}.sds-launchbox li.launch-icon.x-btn-over .text,.sds-launchbox li.launch-icon.x-btn-over .text a{color:#000000}.sds-launchbox li.launch-icon.x-btn-click .text,.sds-launchbox li.launch-icon.x-btn-click .text a{font-size:11px;color:#3C3C3C}.x-panel-body,.x-tab-panel-body,.x-tab-panel-footer,.x-window-plain .x-window-mc{background-color:#FAFAFA}.x-fieldset,.x-tab-panel-bwrap,.x-tab-panel-body{border-color:#7AAACC}.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer{background-color:#D2EDFD;border-color:#3D7299}ul.x-tab-strip-top{border-bottom-color:#3D7299}.x-btn button{color:#3C3C3C}.x-tab-strip-top .x-tab-right,.x-tab-strip-top .x-tab-left,.x-tab-strip-top .x-tab-strip-inner{background-image:url(../images/tab_a.png)}.x-tab-strip-top .x-tab-right{padding-left:8px;background-position:0 0}.x-tab-strip-top .x-tab-left{padding-right:8px;background-position:right -100px}.x-tab-strip-top .x-tab-strip-inner{background-position:0 -50px}.x-tab-strip-top .x-tab-strip-over .x-tab-right{background-position:0 -150px}.x-tab-strip-top .x-tab-strip-over .x-tab-left{background-position:right -250px}.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner{background-position:0 -200px}.x-tab-strip-top .x-tab-strip-active .x-tab-right{background-position:0 -300px}.x-tab-strip-top .x-tab-strip-active .x-tab-left{background-position:right -400px}.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner{background-position:0 -350px}ul.x-tab-strip-bottom{background:url("../images/tab_bg_b.png") repeat-x !important;padding-bottom:2px;border-top-color:#AAAFB4}.x-tab-panel-noborder .x-tab-panel-footer-noborder{background-color:#F6F7F8;border-color:#AAAFB4}.x-layout-split.x-splitbar-v{background:url("../images/split_hcolumn.png") repeat-x scroll 0 0 transparent}.x-tab-strip-bottom .x-tab-right,.x-tab-strip-bottom .x-tab-left,.x-tab-strip-bottom .x-tab-strip-inner{background-image:url("../images/tab_b.png") !important}.x-tab-strip-bottom .x-tab-right{background-position:right -128px;padding-right:5px}.x-tab-strip-bottom .x-tab-left{background-position:0 -28px;padding-left:5px;padding-right:0}.x-tab-strip-bottom .x-tab-strip-inner{background-position:0 -78px;height:23px}.x-tab-strip-bottom .x-tab-strip-over .x-tab-right{background-position:right -278px}.x-tab-strip-bottom .x-tab-strip-over .x-tab-left{background-position:0 -178px}.x-tab-strip-bottom .x-tab-strip-over .x-tab-strip-inner{background-position:0 -228px}.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{background-position:right -427px}.x-tab-strip-bottom .x-tab-strip-active .x-tab-left{background-position:0 -327px}.x-tab-strip-bottom .x-tab-strip-active .x-tab-strip-inner{background-position:0 -377px}.deactive-win .x-tool-minimize{background-position:0 -306px}.deactive-win .x-tool-maximize{background-position:0 -288px}.deactive-win .x-tool-close{background-position:0 -270px}.deactive-win .x-tool-restore{background-position:0 -324px}.deactive-win .x-tool-help{background-position:0 -342px}.x-tool-minimize{background-position:0 -108px;background-image:url(../images/bt_rt.png);width:18px;height:18px}.x-tool-minimize-over{background-position:0 -126px}.x-tool-maximize{background-position:0 -54px;background-image:url(../images/bt_rt.png);width:18px;height:18px}.x-tool-maximize-over{background-position:0 -72px}.x-tool-close{background-position:0 0;background-image:url(../images/bt_rt.png);width:18px;height:18px}.x-tool-close-over{background-position:0 -18px}.x-tool-restore{background-position:0 -162px;background-image:url(../images/bt_rt.png);width:18px;height:18px}.x-tool-restore-over{background-position:0 -180px;background-image:url(../images/bt_rt.png)}.x-tool-help{background-position:0 -216px;background-image:url(../images/bt_rt.png);width:18px;height:18px}.x-tool-help-over{background-position:0 -234px;background-image:url(../images/bt_rt.png)}.sds-window .x-btn .sds-window-tbar-help{background-position:0 0;background-image:url(../images/help_a.png);width:22px;height:22px;padding:0px}.sds-window .x-btn-over .sds-window-tbar-help{background-position:0 -22px}.sds-window .x-btn-click .sds-window-tbar-help{background-position:0 -44px}.active-win .x-window-tl{background-image:url("../images/title3_01.png");padding-left:8px}.active-win .x-window-tr{background-image:url("../images/title3_03.png");padding-right:8px}.active-win .x-window-tc{background-image:url("../images/title3_02.png")}.active-win .x-window-tbar .x-toolbar{background-image:url("../images/title3_02.png");background-position:0 -26px}.deactive-win .x-window-tl{background-image:url("../images/title3_01.png");padding-left:8px;background-position:0 -88px}.deactive-win .x-window-tr{background-image:url("../images/title3_03.png");padding-right:8px;background-position:right -88px}.deactive-win .x-window-tc{background-image:url("../images/title3_02.png");background-position:0 -88px}.deactive-win .x-window-tbar .x-toolbar{background-image:url("../images/title3_02.png");background-position:0 -114px}.active-win .x-window-bl{background-image:url("../images/bottom48_01.png")}.active-win .x-window-br{background-image:url("../images/bottom48_03_01.png");padding-right:8px}.active-win .x-window-bc{background-image:url("../images/bottom48_02_01.png")}.deactive-win .x-window-bl{background-image:url("../images/bottom48_01.png");background-position:-8px bottom}.deactive-win .x-window-br{background-image:url("../images/bottom48_03_02.png");padding-right:8px}.deactive-win .x-window-bc{background-image:url("../images/bottom48_02_02.png")}.pre-load-deactive-win-x-window-br{background-image:url("../images/bottom48_03_02.png");position:-9999px -99999px}.x-fieldset legend{color:#003C66}.sds-window .x-window-bc .x-window-footer{padding:0}body,.ext-el-mask-msg div,.x-tab-strip span.x-tab-strip-text,.x-form-field,.x-form-grow-sizer,.x-form-grow-sizer,.x-form-item,.x-form-invalid-msg,.x-fieldset legend,.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label,.x-grid-group-hd div.x-grid-group-title,.x-grid-empty,.x-tip .x-tip-mc,.x-tip .x-tip-header-text,.x-tip .x-tip-body,.x-window-mc,.x-window-dlg .ext-mb-textarea{font-family:verdana, tahoma, arial, helvetica, sans-serif}.x-small-editor .x-form-field,.ext-webkit .x-small-editor .x-form-field,.x-grid3-hd-row td,.x-grid3-row td,.x-grid3-summary-row td,.x-grid3-topbar,.x-grid3-bottombar,.x-tree-node,.x-date-inner th,.x-date-inner a,.x-date-mp td,.x-date-mp-btns button,.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label,.x-list-header-inner div em,.x-list-body dt em{font-family:verdana, arial, tahoma, helvetica, sans-serif}.x-btn{font-family:verdana, tahoma, helvetica}.x-btn button{font-family:verdana, arial, tahoma, helvetica}.x-dd-drag-ghost{font-family:verdana, arial, helvetica, sans-serif}.x-date-middle,.x-date-left,.x-date-right{font-family:verdana, "sans serif", tahoma, verdana, helvetica}.x-menu-list-item{font-family:verdana, arial, tahoma, sans-serif}.x-combo-list,.x-combo-list-hd,.x-combo-list-small,.x-panel-tl .x-panel-header,.x-panel-mc{font-family:verdana, tahoma, arial, helvetica, sans-serif}.x-btn button{font-family:verdana, arial,tahoma,verdana,helvetica}.x-ie-shadow{background-color:#333}.x-shadow .xsmc{background-image:url(../images/shadow-c.png)}.x-shadow .xsml,.x-shadow .xsmr{background-image:url(../images/shadow-lr.png)}.x-shadow .xstl,.x-shadow .xstc,.x-shadow .xstr,.x-shadow .xsbl,.x-shadow .xsbc,.x-shadow .xsbr{background-image:url(../images/shadow.png)}.without-dirty-red-grid .x-grid3-dirty-cell{background:none}.x-grid-group-hd{background-image:url(../images/grid_title_bg.png);padding-top:2px;border:none}.x-grid-group-hd div.x-grid-group-title{color:#003C66}.x-grid3-row{background-color:#FAFAFA}.x-grid3-row-alt{background-color:#F5F5F5}.x-grid3-row-over{background-image:none;background-color:#E6F0FA;border-color:#DCE6F0}.x-grid3-row-selected{background-color:#CEE0F3 !important}.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell{border-right-color:#E1E6EB}.x-btn-icon .x-btn-small .x-btn-tl,.x-btn-icon .x-btn-small .x-btn-tr,.x-btn-icon .x-btn-small .x-btn-tc,.x-btn-icon .x-btn-small .x-btn-ml,.x-btn-icon .x-btn-small .x-btn-mr,.x-btn-icon .x-btn-small .x-btn-mc,.x-btn-icon .x-btn-small .x-btn-bl,.x-btn-icon .x-btn-small .x-btn-br,.x-btn-icon .x-btn-small .x-btn-bc{background-image:none}.x-btn-icon .x-btn-small .x-tbar-page-first{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 0}.x-btn-icon .x-btn-small .x-tbar-loading{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 -72px}.x-btn-icon .x-btn-small .x-tbar-page-last{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 -54px}.x-btn-icon .x-btn-small .x-tbar-page-next{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 -36px}.x-btn-icon .x-btn-small .x-tbar-page-prev{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 -18px}.x-btn-icon.x-item-disabled .x-tbar-loading,.x-btn-icon .x-btn-small .x-item-disabled .x-tbar-loading{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 -342px}.x-btn-icon.x-item-disabled .x-tbar-page-first,.x-btn-icon .x-btn-small .x-item-disabled .x-tbar-page-first{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 -270px}.x-btn-icon.x-item-disabled .x-tbar-page-last,.x-btn-icon .x-btn-small .x-item-disabled .x-tbar-page-last{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 -324px}.x-btn-icon.x-item-disabled .x-tbar-page-next,.x-btn-icon .x-btn-small .x-item-disabled .x-tbar-page-next{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 -306px}.x-btn-icon.x-item-disabled .x-tbar-page-prev,.x-btn-icon .x-btn-small .x-item-disabled .x-tbar-page-prev{width:22px;height:18px;background-image:url(../images/bt_pagebar.png) !important;background-position:0 -288px}.x-btn-over .x-btn-small .x-tbar-page-first{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -90px}.x-btn-over .x-btn-small .x-tbar-loading{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -162px}.x-btn-over .x-btn-small .x-tbar-page-last{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -144px}.x-btn-over .x-btn-small .x-tbar-page-next{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -126px}.x-btn-over .x-btn-small .x-tbar-page-prev{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -108px}.x-btn-click .x-btn-small .x-tbar-page-first{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -180px}.x-btn-click .x-btn-small .x-tbar-loading{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -252px}.x-btn-click .x-btn-small .x-tbar-page-last{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -234px}.x-btn-click .x-btn-small .x-tbar-page-next{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -216px}.x-btn-click .x-btn-small .x-tbar-page-prev{background-image:url(../images/bt_pagebar.png) !important;background-position:0 -198px}.x-btn-tl,.x-btn-tr,.x-btn-tc,.x-btn-bl,.x-btn-br,.x-btn-bc{background-image:none;display:none}.x-btn-icon .x-btn-small .x-tbar-loading-process{background-image:url("../images/desktop/icon_loading.gif") !important;height:18px;width:22px}.x-btn-tl,.x-btn-tr,.x-btn-tc,.x-btn-bl,.x-btn-br,.x-btn-bc{background-image:none;display:none}.x-btn-ml,.x-btn-mr,.x-btn-mc{background-image:url("../images/bt_b.png");height:22px}.x-btn-ml{background-position:0 0 !important}.x-btn-mc{background-position:0 -22px !important}.x-btn-mr{background-position:right -44px !important}.x-btn-over .x-btn-ml{background-position:0 -66px !important}.x-btn-over .x-btn-mc{background-position:0 -88px !important}.x-btn-over .x-btn-mr{background-position:right -110px !important}.x-btn-click .x-btn-ml{background-position:0 -132px !important}.x-btn-click .x-btn-mc{background-position:0 -154px !important}.x-btn-click .x-btn-mr{background-position:right -176px !important}.x-item-disabled .x-btn-ml{background-position:0 -198px !important}.x-item-disabled .x-btn-mc{background-position:0 -220px !important}.x-item-disabled .x-btn-mr{background-position:right -242px !important}.x-btn-text{color:#3C3C3C}.x-btn-over .x-btn-text{color:#004A80}.x-btn-click .x-btn-text{color:#003C66}.x-item-disabled .x-btn-text{color:#8C8C8C}.x-form-field-wrap .x-form-trigger{background-image:url("../images/trigger.png");border-bottom-color:#6E7378}.x-form-field-wrap .x-form-date-trigger{background-image:url("../images/date-trigger.png");border-bottom-color:#6E7378}.x-form-field-wrap .x-form-trigger-over{border-bottom-color:#2E6C99}.x-trigger-wrap-focus .x-form-trigger{border-bottom-color:#2E6C99}.x-form-focus,textarea.x-form-focus{border-color:#2E6C99}.x-form-text,textarea.x-form-field{border-color:#6E7378}.active-win .x-window-tl .x-window-header{color:#3c3c3c}.deactive-win .x-window-tl .x-window-header{color:#787878}.x-window-dlg.sds-window .x-window-body{background:#D2D7DC;border-top:1px solid #AAAAAA !important}.x-window-dlg.sds-window .x-window-bc{padding-bottom:8px}.x-item-disabled{opacity:1 !important;-moz-opacity:1 !important;filter:none !important}input.x-item-disabled.x-form-text,.x-item-disabled input.x-form-text,input.x-item-disabled.x-form-file,.x-item-disabled input.x-form-file{background:#EEE;border:1px solid #AAA}.ext-webkit input.x-item-disabled.x-form-file,.ext-webkit .x-item-disabled input.x-form-file{background:none;border:none}.x-fieldset-header-text{line-height:1.5}#sds-apply-preview-form{position:absolute;background-image:url(../images/preview_bar_bg.png);width:100%;height:39px;color:#ddd;padding-top:5px;z-index:20001}#sds-apply-preview-form div.x-form-item{float:left;padding:2px 8px 0px}.ext-ie #sds-apply-preview-form div.x-form-item{padding:6px 8px 0px}#sds-apply-preview-form .x-btn{float:left;padding-left:10px}#sds-apply-preview-form td{background-image:none}#sds-apply-preview-form td.x-btn-ml,#sds-apply-preview-form td.x-btn-mc,#sds-apply-preview-form td.x-btn-mr{height:24px;background-image:url(../images/preview_bar_bt.png)}#sds-apply-preview-form .x-btn td.x-btn-ml,#sds-apply-preview-form .x-btn td.x-btn-mr{width:6px}#sds-apply-preview-form .x-btn td.x-btn-ml{background-position:0px 0px !important}#sds-apply-preview-form .x-btn td.x-btn-mc{background-position:0px -24px !important}#sds-apply-preview-form .x-btn td.x-btn-mr{background-position:0px -48px !important}#sds-apply-preview-form .x-btn-over td.x-btn-ml{background-position:0px -72px !important}#sds-apply-preview-form .x-btn-over td.x-btn-mc{background-position:0px -96px !important}#sds-apply-preview-form .x-btn-over td.x-btn-mr{background-position:0px -120px !important}#sds-apply-preview-form button{color:#fff}.x-tip .x-tip-body,.x-window-dlg .ext-mb-text,.x-window-dlg .ext-mb-content{word-wrap:break-word}.x-panel-ghost-simple{z-index:12000;position:absolute;border:2px solid #808080;cursor:move !important}.x-tree-node-collapsed .x-tree-node-icon{background-image:url("../images/folder.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .x-tree-node-collapsed .x-tree-node-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/folder.png");background-size:16px 16px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .x-tree-node-collapsed .x-tree-node-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/folder.png");background-size:16px 16px;outline:1px green dashed}}.x-tree-node-expanded .x-tree-node-icon{background-image:url("../images/folder.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .x-tree-node-expanded .x-tree-node-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/folder.png");background-size:16px 16px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .x-tree-node-expanded .x-tree-node-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/folder.png");background-size:16px 16px;outline:1px green dashed}}.ext-ie9 .x-btn button,.ext-ie8 .x-btn button{padding-top:0px}.ext-ie9.syno-cjk .x-form-check-wrap{line-height:15px}.ext-ie9.syno-cjk .x-btn .ux-pathbutton-center button{padding-top:4px;line-height:16px}.ext-ie9.syno-cjk .x-btn button,.ext-ie8.syno-cjk .x-btn button{padding-top:2px}.syno-webfm .file-drag-over .ext-el-mask{background-color:#75fa32;background-color:rgba(117,250,50,0.05)}.syno-webfm .file-drag-over .ext-el-mask-msg{background-color:transparent !important;background-image:url(../images/drop_files_texts_area.png);width:258px;height:48px;border:0 !important;padding:0;box-shadow:0px 0px 0px !important}.syno-webfm .file-drag-over .ext-el-mask-msg div{background-color:transparent !important;border-color:transparent;font-size:16px;width:258px;line-height:48px;text-align:center;border:0px !important;padding:0;color:#FFFFFF !important}.file-drag-over.file-drop-curved .ext-el-mask{background-color:#8ab8e6;-moz-opacity:0.75;opacity:0.75}.file-drag-over.file-drop-curved .ext-el-mask-msg{height:108px;width:236px;background-image:url(../images/drop_files_area_curved.png);background-color:transparent !important;border:0 !important;padding:0 !important}.file-drag-over.file-drop-curved .ext-el-mask-msg div{font-size:13px;color:#000;padding-top:50px;height:58px;text-align:center;line-height:58px;background-color:transparent !important;border:none;margin-right:auto;margin-left:auto}.ext-gecko4 .x-window-tc,.x-window-bc{background-color:gray}.ext-gecko4 .x-window-bl,.ext-gecko4 .x-window-br{border-bottom-right-radius:2px}.ext-gecko4 .x-window-bl{background-color:gray;border-bottom-left-radius:2px}.ext-gecko4 .x-window-tl,.ext-gecko4 .x-window-tr{background-color:gray;border-top-right-radius:2px}.ext-gecko4 .x-window-tl{border-top-left-radius:2px}.syno-input-non-border{background-color:#FAFAFA;background-image:none;border:1px solid transparent !important;padding:0;margin:0}.sds-expose-mask{position:absolute;left:0px;top:0px;width:100%;height:100%;background:#000;opacity:0;transition-delay:0s;transition-property:opacity;transition-duration:0.8s;-webkit-transition-delay:0s;-webkit-transition-property:opacity;-webkit-transition-duration:0.8s;-moz-transition-delay:0s;-moz-transition-property:opacity;-moz-transition-duration:0.8s}.sds-expose-win-mask{position:absolute;left:0px;top:0px;width:100%;height:100%;background:transparent;z-index:9999;box-shadow:0 0 10px 10px rgba(0,0,0,0.3);-moz-box-shadow:0 0 10px 10px rgba(0,0,0,0.3);border-radius:5px;-moz-border-radius:5px}.sds-expose-win-mask.sds-expose-win-over{box-shadow:0 0 10px 10px rgba(255,255,255,0.5);-moz-box-shadow:0 0 10px 10px rgba(255,255,255,0.5);border-radius:5px;-moz-border-radius:5px}.sds-expose-win-transform{-webkit-transform-origin:0% 0%;-moz-transform-origin:0% 0%;-o-transform-origin:0% 0%;transform-origin:0% 0%;-webkit-transition-delay:0.1s;-webkit-transition-property:-webkit-transform;-webkit-transition-duration:0.8s;-webkit-backface-visibility:hidden;-webkit-perspective:1000;-moz-transition-delay:0.1s;-moz-transition-property:-moz-transform;-moz-transition-duration:0.8s;transition-delay:0.1s;transition-property:transform;transition-duration:0.8s}.sds-expose-win-transform.sds-expose-win-transform-restore{transition-duration:0.3s;-webkit-transition-duration:0.3s;-moz-transition-duration:0.3s}.sds-expose-win-hidden{position:absolute !important;top:-10000px !important;left:-10000px !important}.sds-expose-desc-ct{position:absolute;text-align:center;z-index:12000;cursor:default}.sds-expose-desc-img{display:inline-block}.sds-expose-desc-text{display:inline-block;font-size:12pt;color:#FFFFFF;font-weight:bold;vertical-align:4px;margin-left:15px;text-shadow:0.1em 0.1em 0.1em #000000}.sds-grouping-show-big-preview .sds-grouping-preview-icon{visibility:hidden}.sds-grouping-show-big-preview .sds-grouping-big-preview-icon{visibility:visible}.x-dd-drag-ghost .sds-grouping-show-big-preview .sds-grouping-preview-icon{visibility:visible;position:relative !important;left:7px !important;top:6px !important;padding:0 1px}.x-dd-drag-ghost .sds-grouping-show-big-preview .sds-grouping-big-preview-icon{visibility:hidden}.sds-launch-icon-input{position:absolute;border-color:#3182c1;background-color:#FFF;color:#000;font-size:14px;padding:1px;width:86px;font-family:verdana, tahoma, arial, helvetica, sans-serif;border:2px solid transparent}.sds-ellipsis{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap}.ext-strict .ext-ie9 .x-date-menu{height:auto}.x-tree-node,.launch-icon,.x-grid3-cell,.x-menu-item{-webkit-touch-callout:none}input.x-form-text{border-radius:0}#sds-desktop.sds-is-gesture-switching .x-shadow{visibility:hidden}.sds-hidden-scrollpanel .x-list-body-inner{display:inline-block;width:100%;height:100%}.x-panel-ghost ul{background-color:#f2f2f2}.x-panel-ghost{background-color:transparent}.sds-user-about-mask{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#000000;z-index:1000;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=20);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=20);opacity:0.2}a{text-decoration:none}.ext-ie9 #sds-desktop li.launch-icon .text,.ext-ie8m #sds-desktop li.launch-icon .text,.ext-ie9 #sds-desktop li.launch-icon .text a,.ext-ie8m #sds-desktop li.launch-icon .text a,.ext-ie9 #sds-login-dialog-title,.ext-ie8m #sds-login-dialog-title{filter:none !important}input[type=text]::-ms-clear{display:none}input[type=password]::-ms-reveal{display:none}div{-ms-touch-action:none;touch-action:none}.ext-ie11 .x-tree-node-indent img,.ext-ie11 .x-tree-node-icon,.ext-ie11 .x-tree-ec-icon{vertical-align:middle !important}.sds-switch-win-gesture-hide-to-left{-webkit-transform-origin:0% 0%;-moz-transform-origin:0% 0%;-ms-transform-origin:0% 0%;-o-transform-origin:0% 0%;transform-origin:0% 0%;-webkit-transition-delay:0.1s;-moz-transition-delay:0.1s;-o-transition-delay:0.1s;transition-delay:0.1s;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:0.8s;-moz-transition-duration:0.8s;-o-transition-duration:0.8s;transition-duration:0.8s;-webkit-transform:translate3d(-2000px, 0px, 0);-moz-transform:translate3d(-2000px, 0px, 0);-ms-transform:translate3d(-2000px, 0px, 0);-o-transform:translate3d(-2000px, 0px, 0);transform:translate3d(-2000px, 0px, 0);-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;-moz-perspective:1000;-ms-perspective:1000;-o-perspective:1000;perspective:1000}.sds-switch-win-gesture-hide-to-right{-webkit-transform-origin:0% 0%;-moz-transform-origin:0% 0%;-ms-transform-origin:0% 0%;-o-transform-origin:0% 0%;transform-origin:0% 0%;-webkit-transition-delay:0.1s;-moz-transition-delay:0.1s;-o-transition-delay:0.1s;transition-delay:0.1s;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:0.8s;-moz-transition-duration:0.8s;-o-transition-duration:0.8s;transition-duration:0.8s;-webkit-transform:translate3d(2000px, 0px, 0);-moz-transform:translate3d(2000px, 0px, 0);-ms-transform:translate3d(2000px, 0px, 0);-o-transform:translate3d(2000px, 0px, 0);transform:translate3d(2000px, 0px, 0);-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;-moz-perspective:1000;-ms-perspective:1000;-o-perspective:1000;perspective:1000}.sds-switch-win-gesture-show-from-left{-webkit-transform-origin:0% 0%;-moz-transform-origin:0% 0%;-ms-transform-origin:0% 0%;-o-transform-origin:0% 0%;transform-origin:0% 0%;-webkit-transform:translate3d(-2000px, 0px, 0);-moz-transform:translate3d(-2000px, 0px, 0);-ms-transform:translate3d(-2000px, 0px, 0);-o-transform:translate3d(-2000px, 0px, 0);transform:translate3d(-2000px, 0px, 0)}.sds-switch-win-gesture-show-from-right{-webkit-transform-origin:0% 0%;-moz-transform-origin:0% 0%;-ms-transform-origin:0% 0%;-o-transform-origin:0% 0%;transform-origin:0% 0%;-webkit-transform:translate3d(2000px, 0px, 0);-moz-transform:translate3d(2000px, 0px, 0);-ms-transform:translate3d(2000px, 0px, 0);-o-transform:translate3d(2000px, 0px, 0);transform:translate3d(2000px, 0px, 0)}.sds-switch-win-gesture-show-force-hidden{visibility:hidden !important}.sds-switch-win-gesture-show-transition{-webkit-transition-delay:0.1s;-moz-transition-delay:0.1s;-o-transition-delay:0.1s;transition-delay:0.1s;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:0.5s;-moz-transition-duration:0.5s;-o-transition-duration:0.5s;transition-duration:0.5s;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;-moz-perspective:1000;-ms-perspective:1000;-o-perspective:1000;perspective:1000}.sds-widget-window .x-window-tl .x-window-header .x-tool,.sds-widget-window .x-window-tl .x-window-header.sds-widget-over .x-tool{-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0.2s;-moz-transition-duration:0.2s;-o-transition-duration:0.2s;transition-duration:0.2s}.sds-window-v5 .ext-el-mask-msg div,.sds-widget-window .ext-el-mask-msg div{line-height:24px;font-size:16px;color:#505A64;border:0px}.sds-window-v5 .ext-el-mask-msg,.sds-widget-window .ext-el-mask-msg{-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;padding:0;border-color:#C8D2DC;overflow:hidden;box-shadow:0px 1px 4px rgba(0,0,0,0.25)}.sds-window-v5,.sds-widget-window{box-shadow:0px 2px 8px rgba(0,0,0,0.5)}.sds-window-v5 .x-panel-tbar .x-toolbar-layout-ct,.sds-widget-window .x-panel-tbar .x-toolbar-layout-ct{padding-bottom:8px}.ext-ie8 .sds-window-v5,.ext-ie8 .sds-widget-window{border:1px solid #999;border-top-style:none}.sds-window-v5.sds-window-v5-no-shadow,.sds-window-v5-no-shadow.sds-widget-window{box-shadow:none}.sds-window-v5.no-resize .x-resizable-handle,.no-resize.sds-widget-window .x-resizable-handle{width:0px !important;height:0px !important}.sds-window-v5 .ext-el-mask,.sds-widget-window .ext-el-mask{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=50);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5;background-color:#FFFFFF}.sds-window-v5 .ext-el-mask-msg,.sds-widget-window .ext-el-mask-msg{background-color:#FFFFFF}.sds-window-v5 .ext-el-mask-msg div,.sds-widget-window .ext-el-mask-msg div{padding:7px 20px 7px 20px;background-color:#FFFFFF}.sds-window-v5 .x-window-tl,.sds-widget-window .x-window-tl,.sds-window-v5 .x-window-tc,.sds-widget-window .x-window-tc,.sds-window-v5 .x-window-tr,.sds-widget-window .x-window-tr{background-image:none}.sds-window-v5 .x-window-ml,.sds-widget-window .x-window-ml,.sds-window-v5 .x-window-mc,.sds-widget-window .x-window-mc,.sds-window-v5 .x-window-mr,.sds-widget-window .x-window-mr{background-image:none}.sds-window-v5 .x-window-bwrap .x-window-bl,.sds-widget-window .x-window-bwrap .x-window-bl,.sds-window-v5 .x-window-bwrap .x-window-bc,.sds-widget-window .x-window-bwrap .x-window-bc,.sds-window-v5 .x-window-bwrap .x-window-br,.sds-widget-window .x-window-bwrap .x-window-br{background-image:none;padding:0}.sds-window-v5 .x-window-mc,.sds-widget-window .x-window-mc{border:0 !important;background-color:#FFFFFF}.sds-window-v5 .x-window-tl,.sds-widget-window .x-window-tl{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwODZlNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0086e5), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(#0086e5,#ffffff);background-image:-moz-linear-gradient(#0086e5,#ffffff);background-image:-o-linear-gradient(#0086e5,#ffffff);background-image:linear-gradient(#0086e5,#ffffff);background-color:#FFFFFF;border-top:3px solid #0086E5;padding-left:12px;padding-bottom:0}.sds-window-v5 .x-window-tr,.sds-widget-window .x-window-tr{padding-right:12px}.sds-window-v5 .x-window-header,.sds-widget-window .x-window-header{height:24px;padding:4px 0 5px 0;padding-left:0px !important;background-size:24px 24px}.sds-window-v5 .x-window-header-text,.sds-widget-window .x-window-header-text{line-height:24px;font-size:13px;font-weight:bold;text-align:center;color:#0086E5}.sds-window-v5 .x-tool,.sds-widget-window .x-tool{width:24px;height:24px;margin-left:8px;background-image:url("../images/rt_button.png");background-repeat:no-repeat}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5 .x-tool,.synohdpack .sds-widget-window .x-tool{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/rt_button.png");background-size:24px 768px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5 .x-tool,.synohdpackdebug .sds-widget-window .x-tool{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/rt_button.png");background-size:24px 768px;outline:1px green dashed}}.sds-window-v5 .x-tool-close,.sds-widget-window .x-tool-close{background-position:0 0px}.sds-window-v5 .x-tool-close-over,.sds-widget-window .x-tool-close-over{background-position:0 -24px}.sds-window-v5 .x-tool-maximize,.sds-widget-window .x-tool-maximize{background-position:0 -96px}.sds-window-v5 .x-tool-maximize-over,.sds-widget-window .x-tool-maximize-over{background-position:0 -120px}.sds-window-v5 .x-tool-restore,.sds-widget-window .x-tool-restore{background-position:0 -192px}.sds-window-v5 .x-tool-restore-over,.sds-widget-window .x-tool-restore-over{background-position:0 -216px}.sds-window-v5 .x-tool-minimize,.sds-widget-window .x-tool-minimize{background-position:0 -288px}.sds-window-v5 .x-tool-minimize-over,.sds-widget-window .x-tool-minimize-over{background-position:0 -312px}.sds-window-v5 .x-tool-help,.sds-widget-window .x-tool-help{background-position:0 -384px}.sds-window-v5 .x-tool-help-over,.sds-widget-window .x-tool-help-over{background-position:0 -408px}.sds-window-v5.deactive-win .x-window-tl,.deactive-win.sds-widget-window .x-window-tl{border-top-color:#8C96A0;background-image:linear-gradient(#e6ebf0,#ffffff);background-position:0 0}.sds-window-v5.deactive-win .x-window-header,.deactive-win.sds-widget-window .x-window-header{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=60);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=60);opacity:0.6}.sds-window-v5.deactive-win .x-window-header-text,.deactive-win.sds-widget-window .x-window-header-text{color:#8C96A0}.sds-window-v5.deactive-win .x-tool-close,.deactive-win.sds-widget-window .x-tool-close{background-position:0 -72px}.sds-window-v5.deactive-win .x-tool-maximize,.deactive-win.sds-widget-window .x-tool-maximize{background-position:0 -168px}.sds-window-v5.deactive-win .x-tool-restore,.deactive-win.sds-widget-window .x-tool-restore{background-position:0 -264px}.sds-window-v5.deactive-win .x-tool-minimize,.deactive-win.sds-widget-window .x-tool-minimize{background-position:0 -360px}.sds-window-v5.deactive-win .x-tool-help,.deactive-win.sds-widget-window .x-tool-help{background-position:0 -456px}.sds-window-v5.syno-window-hide .vscrollerbar.scrollgeneric,.syno-window-hide.sds-widget-window .vscrollerbar.scrollgeneric,.sds-window-v5.syno-window-hide .hscrollerbar.scrollgeneric,.syno-window-hide.sds-widget-window .hscrollerbar.scrollgeneric{visibility:hidden !important}.sds-window-v5.x-window-maximized .x-window-tc,.x-window-maximized.sds-widget-window .x-window-tc{background-color:transparent}.sds-window-v5 .x-window-tbar .x-toolbar,.sds-widget-window .x-window-tbar .x-toolbar{background-image:none;background-color:white;padding:0 12px;border:0}.sds-window-v5 .x-window-body,.sds-widget-window .x-window-body{border:none;background-color:#FFF}.sds-window-v5 .x-window-bl,.sds-widget-window .x-window-bl{background-color:#FFF}.sds-window-v5 .x-window-bc,.sds-widget-window .x-window-bc{background-color:transparent}.sds-window-v5 .x-window-br,.sds-widget-window .x-window-br{padding-right:6px}.sds-window-v5 .x-panel-body,.sds-widget-window .x-panel-body{background-color:transparent}.sds-window-v5 .x-window-bc .x-window-footer,.sds-widget-window .x-window-bc .x-window-footer{padding:0}.sds-window-v5 .x-mask-loading div,.sds-widget-window .x-mask-loading div{padding:7px 20px 7px 52px;background-position:20px;background-image:url("../../../scripts/ext-3.4/ux/images/Components/icon_loading.gif")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5 .x-mask-loading div,.synohdpack .sds-widget-window .x-mask-loading div{background-image:url("../img/synohdpack/images/Components/icon_loading.gif");background-size:24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5 .x-mask-loading div,.synohdpackdebug .sds-widget-window .x-mask-loading div{background-image:url("../img/synohdpack/images/Components/icon_loading.gif");background-size:24px;outline:1px green dashed}}.sds-window-v5.x-window .x-toolbar-cell .x-btn,.x-window.sds-widget-window .x-toolbar-cell .x-btn{margin:0px 3px}.sds-window-v5 .x-toolbar,.sds-widget-window .x-toolbar{background-color:transparent;background-image:none}.sds-widget-window{width:322px;box-shadow:none;background:#f5faff;background:rgba(245,250,255,0.85);border:1px solid #AFB9C3}.ext-ie8 .sds-widget-window{border-top-style:solid}.sds-widget-window.x-window-maximized.scale-item.add-wdiget-effect{-webkit-transform:scale(0.8, 0.8);-moz-transform:scale(0.8, 0.8);-ms-transform:scale(0.8, 0.8);-o-transform:scale(0.8, 0.8);transform:scale(0.8, 0.8)}.sds-widget-window .x-window-mc{background-color:transparent}.sds-widget-window.sds-widget-window-medium .x-window-body{margin-bottom:1px}.sds-widget-window .x-window-body{-webkit-transition-property:height;-moz-transition-property:height;-o-transition-property:height;transition-property:height;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0.2s;-moz-transition-duration:0.2s;-o-transition-duration:0.2s;transition-duration:0.2s;margin-bottom:3px;background-color:transparent}.sds-widget-window.x-window-maximized .x-window-tl .x-window-tc{padding:0px}.sds-widget-window .x-window-tl{background-color:transparent !important;padding:1px 0 2px 4px;background-image:none !important;border-top:0px !important}.sds-widget-window .x-window-tl .x-window-header{background-repeat:no-repeat;padding:4px 0 4px 0;background-size:32px}.sds-widget-window .x-window-tl .x-window-header .icon-click{cursor:pointer;position:absolute;top:4px;width:32px;height:30px}.sds-widget-window .x-window-tl .x-window-header .x-window-header-text{text-align:left;color:#505A64;padding-left:34px;cursor:move}.sds-widget-window .x-window-tl .x-window-header .x-tool-add{background-position:0 -384px}.sds-widget-window .x-window-tl .x-window-header .x-tool-add.x-tool-disabled{background-position:0 -456px !important;cursor:move}.sds-widget-window .x-window-tl .x-window-header .x-tool-add-over{background-position:0 -408px}.sds-widget-window .x-window-tl .x-window-header .x-tool-pin{background-position:0 -480px}.sds-widget-window .x-window-tl .x-window-header .x-tool-pin.x-tool-disabled{background-position:0 -552px !important;cursor:move}.sds-widget-window .x-window-tl .x-window-header .x-tool-pin.x-tool-toggled{background-position:0 -528px}.sds-widget-window .x-window-tl .x-window-header .x-tool-pin-over{background-position:0 -504px}.sds-widget-window .x-window-tl .x-window-header .x-tool-close:active{background-position:0 -48px}.sds-widget-window .x-window-tl .x-window-header .x-tool-maximize:active{background-position:0 -144px}.sds-widget-window .x-window-tl .x-window-header .x-tool-restore:active{background-position:0 -240px}.sds-widget-window .x-window-tl .x-window-header .x-tool-minimize:active{background-position:0 -336px}.sds-widget-window .x-window-tl .x-window-header .x-tool-add:active{background-position:0 -432px}.sds-widget-window .x-window-tl .x-window-header .x-tool-pin:active{background-position:0 -528px}.sds-widget-window .x-window-tl .x-window-header .x-tool{opacity:0;visibility:hidden;background-image:url("../images/widget_window/widget_rt_button.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-widget-window .x-window-tl .x-window-header .x-tool{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/widget_window/widget_rt_button.png");background-size:24px 672px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-widget-window .x-window-tl .x-window-header .x-tool{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/widget_window/widget_rt_button.png");background-size:24px 672px;outline:1px green dashed}}.sds-widget-window .x-window-tl .x-window-header.sds-widget-over .x-tool{opacity:1;visibility:visible}.sds-widget-window .x-window-tr{padding-right:6px}.sds-widget-window.x-panel-ghost .x-tool{visibility:hidden}.sds-widget-window.x-window-maximized .x-window-draggable .x-window-header-text{cursor:move}.sds-widget-window.sds-widget-window-nodrop{cursor:no-drop}.sds-widget-window.sds-widget-window-nodrop .x-window-draggable .x-window-header-text{cursor:no-drop}.sds-widget-window .x-grid3-body,.sds-widget-window .x-grid3-row,.sds-widget-window .x-table-layout-ct{width:100% !important}.sds-widget-window .syno-sysinfo-system-health,.sds-widget-window .resource-monitor-widget,.sds-widget-window .sys-storage-grid{margin-top:-4px}.sds-window-v5.x-window-dlg,.x-window-dlg.sds-widget-window{color:#505a64}.ext-ie8 .sds-window-v5.x-window-dlg,.ext-ie8 .x-window-dlg.sds-widget-window{border-top-style:solid}.sds-window-v5.x-window-dlg input,.x-window-dlg.sds-widget-window input,.sds-window-v5.x-window-dlg textarea,.x-window-dlg.sds-widget-window textarea{color:#505a64}.sds-window-v5.x-window-dlg .x-window-tl,.x-window-dlg.sds-widget-window .x-window-tl{border-top:none;padding-bottom:0px}.sds-window-v5.x-window-dlg .ext-mb-icon,.x-window-dlg.sds-widget-window .ext-mb-icon{width:48px;height:48px}.sds-window-v5.x-window-dlg .ext-mb-question,.x-window-dlg.sds-widget-window .ext-mb-question{background-image:url("../images/icon_question.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5.x-window-dlg .ext-mb-question,.synohdpack .x-window-dlg.sds-widget-window .ext-mb-question{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/icon_question.png");background-size:48px 48px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5.x-window-dlg .ext-mb-question,.synohdpackdebug .x-window-dlg.sds-widget-window .ext-mb-question{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/icon_question.png");background-size:48px 48px;outline:1px green dashed}}.sds-window-v5.x-window-dlg .x-window-footer,.x-window-dlg.sds-widget-window .x-window-footer{padding:24px 20px 20px 20px;margin-left:0px}.sds-window-v5.x-window-dlg td.x-toolbar-cell,.x-window-dlg.sds-widget-window td.x-toolbar-cell{padding:0 0 0 10px}.sds-window-v5.x-window-dlg .x-toolbar-cell .x-btn,.x-window-dlg.sds-widget-window .x-toolbar-cell .x-btn{margin:0}.sds-window-v5.x-window-dlg .syno-mb-custom-btn,.x-window-dlg.sds-widget-window .syno-mb-custom-btn{position:absolute;bottom:20px;left:84px}.sds-window-v5.x-window-dlg .ext-mb-input,.x-window-dlg.sds-widget-window .ext-mb-input{height:24px}.sds-window-v5.x-window-dlg .ext-mb-content,.x-window-dlg.sds-widget-window .ext-mb-content{line-height:28px}.sds-window-v5.x-window-dlg .x-dlg-icon .ext-mb-content,.x-window-dlg.sds-widget-window .x-dlg-icon .ext-mb-content{margin-left:64px}.sds-window-v5.x-window-dlg .syno-mb-progress-status,.x-window-dlg.sds-widget-window .syno-mb-progress-status{position:absolute;right:20px;bottom:4px;line-height:16px}.sds-window-v5.x-window-dlg .syno-mb-progress .x-progress-text,.x-window-dlg.sds-widget-window .syno-mb-progress .x-progress-text{display:none}.sds-window-v5 .x-progress-wrap,.sds-widget-window .x-progress-wrap{border:none;margin-bottom:4px}.sds-window-v5 .x-progress-inner,.sds-widget-window .x-progress-inner{background:#D2DCE6;border-radius:3px;overflow:hidden;height:16px}.sds-window-v5 .x-progress-bar,.sds-widget-window .x-progress-bar{position:relative;background-color:#0086E5;background-image:none;border:none}.sds-window-v5 .x-progress-bar::before,.sds-widget-window .x-progress-bar::before{content:'';width:100%;height:100%;position:absolute;top:0;left:0;border-radius:3px;background-image:repeating-linear-gradient(-45deg, transparent, transparent 6.5px, rgba(255,255,255,0.15) 1px, rgba(255,255,255,0.15) 13px)}.sds-window-v5 .syno-ux-tab-panel .x-tab-panel-body,.sds-widget-window .syno-ux-tab-panel .x-tab-panel-body{padding-top:5px}.sds-window-v5 .syno-ux-tab-panel form.x-form,.sds-widget-window .syno-ux-tab-panel form.x-form{padding:0 10px}.sds-window-v5 .syno-ux-tab-panel form.x-form .syno-ux-fieldset,.sds-widget-window .syno-ux-tab-panel form.x-form .syno-ux-fieldset{margin:0 -10px 8px -10px}.sds-window-v5 .syno-ux-tab-panel .syno-ux-formpanel-has-fieldset form.x-form,.sds-widget-window .syno-ux-tab-panel .syno-ux-formpanel-has-fieldset form.x-form{padding-left:0;padding-right:0}.sds-window-v5 .syno-ux-tab-panel .syno-ux-formpanel-has-fieldset form.x-form .x-form-item,.sds-widget-window .syno-ux-tab-panel .syno-ux-formpanel-has-fieldset form.x-form .x-form-item{margin-left:10px;margin-right:10px}.sds-window-v5 .syno-ux-tab-panel .syno-ux-formpanel-has-fieldset form.x-form .syno-ux-fieldset,.sds-widget-window .syno-ux-tab-panel .syno-ux-formpanel-has-fieldset form.x-form .syno-ux-fieldset{margin-left:0;margin-right:0}.sds-window-v5 .syno-ux-tab-panel .syno-ux-formpanel-has-fieldset form.x-form .syno-ux-fieldset .x-form-item,.sds-widget-window .syno-ux-tab-panel .syno-ux-formpanel-has-fieldset form.x-form .syno-ux-fieldset .x-form-item{margin-left:0;margin-right:0}.sds-window .x-statusbar .x-window-bc{background-image:url(/scripts/ext-3/resources/images/gray/window/top-bottom.png)}.sds-window .x-statusbar .x-status-text{height:20px;line-height:20px;padding-left:25px !important;background-position:1px 2px}.sds-window .x-statusbar .x-toolbar-right{padding-right:16px}.sds-window .x-statusbar .x-toolbar-right .x-btn{padding-top:6px;padding-bottom:6px}.sds-window .x-window-body .x-statusbar .x-toolbar-right .x-btn{padding-top:0;padding-bottom:0}.sds-window .x-tab-panel-fbar.x-statusbar .x-status-text,.sds-window .x-panel-fbar.x-statusbar .x-status-text{white-space:normal;line-height:14px;background-position:1px 0px}.sds-window-v5 .x-window-footer .x-statusbar,.sds-widget-window .x-window-footer .x-statusbar{padding-left:20px;padding-right:20px}.sds-window-v5 .x-window-footer .x-statusbar .x-toolbar-ct,.sds-widget-window .x-window-footer .x-statusbar .x-toolbar-ct{background-image:url("../images/shadow_footbar.png");background-repeat:repeat-x;background-color:transparent;border:0px;padding-top:4px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5 .x-window-footer .x-statusbar .x-toolbar-ct,.synohdpack .sds-widget-window .x-window-footer .x-statusbar .x-toolbar-ct{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/shadow_footbar.png");background-size:8px 4px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5 .x-window-footer .x-statusbar .x-toolbar-ct,.synohdpackdebug .sds-widget-window .x-window-footer .x-statusbar .x-toolbar-ct{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/shadow_footbar.png");background-size:8px 4px;outline:1px green dashed}}.sds-window-v5 .x-window-footer .x-statusbar .x-toolbar-cell,.sds-widget-window .x-window-footer .x-statusbar .x-toolbar-cell{padding:0}.sds-window-v5 .x-window-footer .x-statusbar .x-toolbar-right .syno-ux-button,.sds-widget-window .x-window-footer .x-statusbar .x-toolbar-right .syno-ux-button{margin:8px 10px 8px 0px}.x-dd-drag-proxy .x-dd-drag-ghost{padding:0px}.x-dd-drag-proxy .x-dd-drop-icon{top:0px;left:0px}.x-dd-drop-ok,.x-dd-drop-ok-add,.x-tree-drop-ok-append,.x-tree-drop-ok-above,.x-tree-drop-ok-between,.x-tree-drop-ok-below,.x-dd-drop-nodrop{background-color:#FFFFFF;-webkit-box-shadow:0px 1px 4px #000;-moz-box-shadow:0px 1px 4px #000;box-shadow:0px 1px 4px #000;-webkit-box-shadow:0px 1px 4px rgba(0,0,0,0.25);-moz-box-shadow:0px 1px 4px rgba(0,0,0,0.25);box-shadow:0px 1px 4px rgba(0,0,0,0.25);border:1px;border-color:#C8D2DC;border-radius:3px;padding:7px 11px 7px 41px}.x-dd-drop-ok .x-dd-drop-icon,.x-dd-drop-ok-add .x-dd-drop-icon,.x-tree-drop-ok-append .x-dd-drop-icon,.x-tree-drop-ok-above .x-dd-drop-icon,.x-tree-drop-ok-between .x-dd-drop-icon,.x-tree-drop-ok-below .x-dd-drop-icon,.x-dd-drop-nodrop .x-dd-drop-icon{width:24px;height:24px;left:10px;top:7px;background-image:url("../images/item_drag_status.png");background-position:0 0}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .x-dd-drop-ok .x-dd-drop-icon,.synohdpack .x-dd-drop-ok-add .x-dd-drop-icon,.synohdpack .x-tree-drop-ok-append .x-dd-drop-icon,.synohdpack .x-tree-drop-ok-above .x-dd-drop-icon,.synohdpack .x-tree-drop-ok-between .x-dd-drop-icon,.synohdpack .x-tree-drop-ok-below .x-dd-drop-icon,.synohdpack .x-dd-drop-nodrop .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/item_drag_status.png");background-size:72px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .x-dd-drop-ok .x-dd-drop-icon,.synohdpackdebug .x-dd-drop-ok-add .x-dd-drop-icon,.synohdpackdebug .x-tree-drop-ok-append .x-dd-drop-icon,.synohdpackdebug .x-tree-drop-ok-above .x-dd-drop-icon,.synohdpackdebug .x-tree-drop-ok-between .x-dd-drop-icon,.synohdpackdebug .x-tree-drop-ok-below .x-dd-drop-icon,.synohdpackdebug .x-dd-drop-nodrop .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/item_drag_status.png");background-size:72px 24px;outline:1px green dashed}}.x-dd-drop-ok .x-dd-drag-ghost,.x-dd-drop-ok-add .x-dd-drag-ghost,.x-tree-drop-ok-append .x-dd-drag-ghost,.x-tree-drop-ok-above .x-dd-drag-ghost,.x-tree-drop-ok-between .x-dd-drag-ghost,.x-tree-drop-ok-below .x-dd-drag-ghost,.x-dd-drop-nodrop .x-dd-drag-ghost{border:none;color:#505A64;font-size:16px;line-height:24px;height:24px}.x-dd-drop-ok .x-dd-drag-ghost .x-tree-node-icon,.x-dd-drop-ok-add .x-dd-drag-ghost .x-tree-node-icon,.x-tree-drop-ok-append .x-dd-drag-ghost .x-tree-node-icon,.x-tree-drop-ok-above .x-dd-drag-ghost .x-tree-node-icon,.x-tree-drop-ok-between .x-dd-drag-ghost .x-tree-node-icon,.x-tree-drop-ok-below .x-dd-drag-ghost .x-tree-node-icon,.x-dd-drop-nodrop .x-dd-drag-ghost .x-tree-node-icon{display:none}.x-dd-drop-ok .x-dd-drag-ghost .x-grid3-hd-inner,.x-dd-drop-ok .x-dd-drag-ghost span,.x-dd-drop-ok-add .x-dd-drag-ghost .x-grid3-hd-inner,.x-dd-drop-ok-add .x-dd-drag-ghost span,.x-tree-drop-ok-append .x-dd-drag-ghost .x-grid3-hd-inner,.x-tree-drop-ok-append .x-dd-drag-ghost span,.x-tree-drop-ok-above .x-dd-drag-ghost .x-grid3-hd-inner,.x-tree-drop-ok-above .x-dd-drag-ghost span,.x-tree-drop-ok-between .x-dd-drag-ghost .x-grid3-hd-inner,.x-tree-drop-ok-between .x-dd-drag-ghost span,.x-tree-drop-ok-below .x-dd-drag-ghost .x-grid3-hd-inner,.x-tree-drop-ok-below .x-dd-drag-ghost span,.x-dd-drop-nodrop .x-dd-drag-ghost .x-grid3-hd-inner,.x-dd-drop-nodrop .x-dd-drag-ghost span{padding:0px;color:#505A64;font-size:16px;line-height:24px}.x-dd-drop-ok .x-dd-drag-ghost .x-grid3-hd-inner,.x-dd-drop-ok-add .x-dd-drag-ghost .x-grid3-hd-inner,.x-tree-drop-ok-append .x-dd-drag-ghost .x-grid3-hd-inner,.x-tree-drop-ok-above .x-dd-drag-ghost .x-grid3-hd-inner,.x-tree-drop-ok-between .x-dd-drag-ghost .x-grid3-hd-inner,.x-tree-drop-ok-below .x-dd-drag-ghost .x-grid3-hd-inner,.x-dd-drop-nodrop .x-dd-drag-ghost .x-grid3-hd-inner{border:none;background-color:white;background-image:none}.x-dd-drop-ok .x-dd-drop-icon{background-position:-24px 0}.x-dd-drop-nodrop .x-dd-drop-icon{background-position:-48px 0}.x-dd-drop-nodrop.x-dd-drag-repair{display:none}.sds-launch-icon-dragging-proxy .sds-application-notify-badge-num{display:none}.sds-launch-icon-dragging-proxy .x-dd-drag-ghost{border:none !important;background-color:transparent !important;opacity:1 !important;filter:none !important}.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-reposition-ok,.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-nodrop,.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok-add,.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok,.x-dd-drag-proxy.x-dd-drop-nodrop.x-dd-drag-repair{background-color:transparent;border:none;padding:0px;box-shadow:none}.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-reposition-ok .x-dd-drag-ghost,.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-nodrop .x-dd-drag-ghost,.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok-add .x-dd-drag-ghost,.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok .x-dd-drag-ghost,.x-dd-drag-proxy.x-dd-drop-nodrop.x-dd-drag-repair .x-dd-drag-ghost{width:82px}.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok-add .x-dd-drop-icon{width:36px;height:36px;top:40px;left:46px;background-image:url("../images/icon_drag_add.png");background-position:center}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/icon_drag_add.png");background-size:36px 36px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/icon_drag_add.png");background-size:36px 36px;outline:1px green dashed}}.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok .x-dd-drop-icon,.sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-nodrop .x-dd-drop-icon{width:36px;height:36px;top:40px;left:46px;background-image:url("../images/icon_drag_ban.png");background-position:center}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok .x-dd-drop-icon,.synohdpack .sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/icon_drag_ban.png");background-size:36px 36px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-ok .x-dd-drop-icon,.synohdpackdebug .sds-launch-icon-dragging-proxy.x-dd-drag-proxy.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/icon_drag_ban.png");background-size:36px 36px;outline:1px green dashed}}.sds-launch-icon-dragging-proxy .x-dd-drag-ghost .text{visibility:hidden !important}.sds-launch-icon-dragging-proxy .image{white-space:normal}.sds-launch-icon-dragging-proxy li{list-style:none}.sds-launch-icon-dragging-proxy li.launch-icon .image{margin-left:6px;margin-top:6px}.sds-shim-for-iframe{position:absolute;top:0;width:100%;height:100%;zIndex:20;background-color:transparent}#sds-taskbar{z-index:5;position:relative;height:39px;background:repeat-x scroll 0 0 transparent;background-image:url("../images/taskbar/taskbar_bg.png")}#sds-taskbar .x-btn-tl,#sds-taskbar .x-btn-tc,#sds-taskbar .x-btn-tr,#sds-taskbar .x-btn-bl,#sds-taskbar .x-btn-bc,#sds-taskbar .x-btn-br{display:none}#sds-taskbar .x-btn tr:first-child,#sds-taskbar .x-btn tr:last-child{display:none}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bg.png");background-size:4px 39px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bg.png");background-size:4px 39px;outline:1px green dashed}}#sds-taskbar-shadow{z-index:4;position:absolute;width:100%;height:43px;background:repeat-x scroll 0 39px transparent;background-image:url("../images/taskbar/taskbar_shadow.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-shadow{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_shadow.png");background-size:4px 4px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-shadow{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_shadow.png");background-size:4px 4px;outline:1px green dashed}}#sds-taskbar li .x-btn-text{padding:0}#sds-taskbar-panel-wrap{background:transparent;height:39px}.sds-taskbar-overflow-menu-button.x-btn-noicon.x-box-item{padding:3px 25px 3px 15px;width:72px;background:no-repeat;background-image:url("../images/taskbar/taskbar_split.png");background-position:62px 5px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-taskbar-overflow-menu-button.x-btn-noicon.x-box-item{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_split.png");background-size:2px 28px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-taskbar-overflow-menu-button.x-btn-noicon.x-box-item{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_split.png");background-size:2px 28px;outline:1px green dashed}}.sds-taskbar-overflow-menu-button .x-btn-ml,.sds-taskbar-overflow-menu-button .x-btn-mr,.sds-taskbar-overflow-menu-button .x-btn-tl,.sds-taskbar-overflow-menu-button .x-btn-tc,.sds-taskbar-overflow-menu-button .x-btn-tr,.sds-taskbar-overflow-menu-button .x-btn-bl,.sds-taskbar-overflow-menu-button .x-btn-bc,.sds-taskbar-overflow-menu-button .x-btn-br{display:none}.sds-taskbar-overflow-menu-button .x-btn-mc{background:no-repeat;background-image:url("../images/taskbar/more_apps.png");background-position:0px 0px !important;width:32px;height:32px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-taskbar-overflow-menu-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/more_apps.png");background-size:32px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-taskbar-overflow-menu-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/more_apps.png");background-size:32px 96px;outline:1px green dashed}}.sds-taskbar-overflow-menu-button.x-btn-over .x-btn-mc{background-position:0px -32px !important}.sds-taskbar-overflow-menu-button.x-btn-click .x-btn-mc{background-position:0px -64px !important}#sds-taskbar-right .x-btn-ml,#sds-taskbar-right .x-btn-mr,#sds-taskbar-right .x-btn-tl,#sds-taskbar-right .x-btn-tc,#sds-taskbar-right .x-btn-tr,#sds-taskbar-right .x-btn-bl,#sds-taskbar-right .x-btn-bc,#sds-taskbar-right .x-btn-br{display:none}#sds-taskbar-right .sds-taskbar-right-left,#sds-taskbar-right .sds-taskbar-right-center,#sds-taskbar-right .sds-taskbar-right-right{height:39px;float:left}#sds-taskbar-right .sds-taskbar-right-left{width:20px;background:no-repeat;background-image:url("../images//taskbar/taskbar_split.png");background-position:10px 6px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-right .sds-taskbar-right-left{background-image:url("../img/synohdpack/images/dsm/resources/css/../images//taskbar/taskbar_split.png");background-size:2px 28px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-right .sds-taskbar-right-left{background-image:url("../img/synohdpack/images/dsm/resources/css/../images//taskbar/taskbar_split.png");background-size:2px 28px;outline:1px green dashed}}#sds-taskbar-right .sds-taskbar-right-right{width:6px}#sds-taskbar-right table,#sds-taskbar-right table button{width:32px;height:32px}#sds-taskbar-right .x-btn-mc{width:202px;height:32px;background-image:none;background-color:transparent}.sds-tray-panel{box-shadow:0px 2px 6px rgba(0,0,0,0.5);background-color:#FFFFFF;border:0px none;padding:4px 10px;color:#505050}.sds-tray-panel .x-panel-body{background-color:#FFFFFF;border:none}.sds-tray-panel .x-panel-header{background:transparent;border:0;border-bottom:solid 1px #EBF0F5;text-align:center}.sds-tray-panel .x-panel-header .x-panel-header-text{font-size:13px;color:#505A64;font-weight:bold;line-height:23px}.sds-tray-panel .sds-tray-panel-arrow{background:transparent;width:24px;height:18px;position:absolute;overflow:hidden}.ext-ie8m .sds-tray-panel .sds-tray-panel-arrow{width:0px;height:0px;border:10px solid transparent;border-bottom-width:13px;border-bottom-color:#fff;border-top-width:0px}.sds-tray-panel .sds-tray-panel-arrow::after{background:#fff;background:#fff;content:'';position:absolute;bottom:0px;left:2px;width:14px;height:14px;-webkit-transform-origin:left bottom;-moz-transform-origin:left bottom;-ms-transform-origin:left bottom;-o-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);box-shadow:2px 2px 6px rgba(0,0,0,0.5)}#sds-taskbar-notification-button,#sds-taskbar-user-button,#sds-taskbar-search-button,#sds-taskbar-widget-button,#sds-taskbar-preview-button{float:left;margin:0px 6px 0px 6px;padding-top:4px;cursor:pointer}#sds-taskbar-user-button .x-btn-mc{background-image:url("../images/taskbar/tray_icon_user_menu.png");background-position:0px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-user-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_user_menu.png");background-size:32px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-user-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_user_menu.png");background-size:32px 96px;outline:1px green dashed}}#sds-taskbar-user-button .x-btn-over .x-btn-mc{background-position:0px -32px !important}#sds-taskbar-user-button .x-btn-click .x-btn-mc,#sds-taskbar-user-button .x-btn-pressed .x-btn-mc{background-position:0px -64px !important}#sds-taskbar-search-button .x-btn-mc{background-image:url("../images/taskbar/tray_icon_search.png");background-position:0px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-search-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_search.png");background-size:32px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-search-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_search.png");background-size:32px 96px;outline:1px green dashed}}#sds-taskbar-search-button .x-btn-over .x-btn-mc{background-position:0px -32px !important}#sds-taskbar-search-button .x-btn-click .x-btn-mc,#sds-taskbar-search-button .x-btn-pressed .x-btn-mc{background-position:0px -64px !important}#sds-taskbar-notification-button .x-btn-mc{background-image:url("../images/taskbar/tray_icon_notification.png");background-position:0px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-notification-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_notification.png");background-size:32px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-notification-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_notification.png");background-size:32px 96px;outline:1px green dashed}}#sds-taskbar-notification-button .x-btn-over .x-btn-mc{background-position:0px -32px !important}#sds-taskbar-notification-button .x-btn-click .x-btn-mc,#sds-taskbar-notification-button .x-btn-pressed .x-btn-mc{background-position:0px -64px !important}#sds-taskbar-widget-button .x-btn-mc{background-image:url("../images/taskbar/tray_icon_widget.png");background-position:0px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-widget-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_widget.png");background-size:32px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-widget-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_widget.png");background-size:32px 96px;outline:1px green dashed}}#sds-taskbar-widget-button .x-btn-over .x-btn-mc{background-position:0px -32px !important}#sds-taskbar-widget-button .x-btn-click .x-btn-mc,#sds-taskbar-widget-button .x-btn-pressed .x-btn-mc{background-position:0px -64px !important}#sds-taskbar-preview-button .x-btn-mc{background-image:url("../images/taskbar/tray_icon_pilot_view.png");background-position:0px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-preview-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_pilot_view.png");background-size:32px 128px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-preview-button .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/tray_icon_pilot_view.png");background-size:32px 128px;outline:1px green dashed}}#sds-taskbar-preview-button .x-btn-over .x-btn-mc{background-position:0px -32px !important}#sds-taskbar-preview-button .x-btn-click .x-btn-mc,#sds-taskbar-preview-button .x-btn-pressed .x-btn-mc{background-position:0px -64px !important}#sds-taskbar-preview-button .x-item-disabled .x-btn-mc{background-position:0px -96px !important}#sds-taskbar-showall{float:left}#sds-taskbar-showall .x-btn-ml,#sds-taskbar-showall .x-btn-mr{display:none}#sds-taskbar-showall .x-btn-text{width:22px;height:39px}#sds-taskbar-showall .x-btn-mc{background:transparent no-repeat;background-image:url("../images/taskbar/showdesktop.png") !important;background-position:0px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-showall .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/showdesktop.png") !important;background-size:22px 117px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-showall .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/showdesktop.png") !important;background-size:22px 117px;outline:1px green dashed}}#sds-taskbar-showall .x-btn-over .x-btn-mc{background-position:0px -39px !important}#sds-taskbar-showall .x-btn-click .x-btn-mc{background-position:0px -78px !important}#sds-taskbar-startbutton{float:left}#sds-taskbar-startbutton .x-btn-ml{display:none}#sds-taskbar-startbutton .x-btn-text{width:89px;height:39px}#sds-taskbar-startbutton .x-btn-mc{background:transparent no-repeat;background-image:url("../images/taskbar/taskbar_bt_apps.png") !important;background-position:0px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-startbutton .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt_apps.png") !important;background-size:89px 117px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-startbutton .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt_apps.png") !important;background-size:89px 117px;outline:1px green dashed}}#sds-taskbar-startbutton .x-btn-over .x-btn-mc{background-position:0px -39px !important}#sds-taskbar-startbutton .x-btn-click .x-btn-mc{background-position:0px -78px !important}#sds-taskbar-startbutton .x-btn-pressed .x-btn-mc{background-position:0px -78px !important}#sds-taskbar-startbutton .x-btn-mr{background:transparent no-repeat;background-position:right 0px !important;background-image:url("../images/taskbar/taskbar_bt_widgets_shadow.png") !important;width:8px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbar-startbutton .x-btn-mr{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt_widgets_shadow.png") !important;background-size:8px 39px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbar-startbutton .x-btn-mr{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt_widgets_shadow.png") !important;background-size:8px 39px;outline:1px green dashed}}#sds-taskbar-startbutton .x-btn-pressed .x-btn-mr{visibility:hidden}#sds-tray-panel{right:0 !important;left:auto !important;padding:4px 0 3px 0}#sds-tray-panel .sds-tray-strip-wrap{width:100%;zoom:1}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-device{background-image:url("../../modules/ExternalDevices/images/tray_icon_device.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-device{background-image:url("../img/synohdpack/images/dsm/modules/ExternalDevices/images/tray_icon_device.png");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-device{background-image:url("../img/synohdpack/images/dsm/modules/ExternalDevices/images/tray_icon_device.png");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-disk-port{background-image:url("../../modules/PollingTask/images/tray_icon_disk_port.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-disk-port{background-image:url("../img/synohdpack/images/dsm/modules/PollingTask/images/tray_icon_disk_port.png");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-disk-port{background-image:url("../img/synohdpack/images/dsm/modules/PollingTask/images/tray_icon_disk_port.png");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-upload{background-image:url(../../modules/FileTaskMonitor/images/tray_icon_upload.png);background-position:0 0 !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-upload{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.png");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-upload{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.png");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-upload{background-image:url(../../modules/FileTaskMonitor/images/tray_icon_upload.gif);background-position:0 0 !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-upload{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.gif");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-upload{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.gif");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-bgtask{background-image:url(../../modules/FileTaskMonitor/images/tray_icon_bgtask.png);background-position:0 0 !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-bgtask{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.png");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-bgtask{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.png");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-bgtask{background-image:url(../../modules/FileTaskMonitor/images/tray_icon_bgtask.gif);background-position:0 0 !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-bgtask{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.gif");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-bgtask{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.gif");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-download{background-image:url(../../modules/FileTaskMonitor/images/tray_icon_download.png);background-position:0 0 !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-download{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.png");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-download{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.png");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-download{background-image:url(../../modules/FileTaskMonitor/images/tray_icon_download.gif);background-position:0 0 !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-download{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.gif");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-download{background-image:url("../img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.gif");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-creating-thumbnail{background-image:url(../../modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.png);background-position:0 0 !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-creating-thumbnail{background-image:url("../img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.png");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-static-creating-thumbnail{background-image:url("../img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.png");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-creating-thumbnail{background-image:url(../../modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.gif);background-position:0 0 !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-creating-thumbnail{background-image:url("../img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.gif");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon .x-btn-mc .sds-tray-item-ani-creating-thumbnail{background-image:url("../img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.gif");background-size:32px;outline:1px green dashed}}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon button{background-position:0px 0px !important}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon.x-btn-over button{background-position:0px -32px !important}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon.x-btn-click button{background-position:0px -64px !important}#sds-tray-panel .sds-tray-strip-wrap .x-btn.x-btn-icon.x-btn-pressed button{background-position:0px -64px !important}#sds-tray-panel .sds-tray-strip{display:block;zoom:1}#sds-tray-panel .sds-widget-tray{cursor:pointer;margin:0px 6px 0px 6px}#sds-tray-panel li{float:right}#sds-tray-panel li .x-btn-text{height:32px;width:32px;margin:0px 6px 0px 6px}#sds-tray-panel .x-btn-ml,#sds-tray-panel .x-btn-mr{background:none transparent;display:none}#sds-tray-panel .x-btn-mc{background:none transparent}.sds-tray-item-notification{position:relative}#sds-taskbuttons-panel li{position:relative;float:left}#sds-taskbuttons-panel li .loading{position:absolute;left:0;top:0;width:62px;height:39px;background:no-repeat scroll center center transparent;background-image:url("../images/desktop/taskbar_spinner.gif")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbuttons-panel li .loading{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/desktop/taskbar_spinner.gif");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbuttons-panel li .loading{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/desktop/taskbar_spinner.gif");background-size:24px 24px;outline:1px green dashed}}#sds-taskbuttons-panel li.sds-taskbuttons-edge{float:left;margin:0 !important;padding:0 !important;border:0 none !important;font-size:1px !important;line-height:1px !important;overflow:hidden;zoom:1;background:transparent !important;width:1px}#sds-taskbuttons-panel li .x-btn-text{width:62px;height:39px}#sds-taskbuttons-panel li .x-btn-ml,#sds-taskbuttons-panel li .x-btn-mr{display:none}#sds-taskbuttons-panel li .x-btn.x-btn-icon button{background-size:32px 32px}#sds-taskbuttons-panel li .x-btn.x-btn-icon.launched .x-btn-mc{background:transparent no-repeat;background-image:url("../images/taskbar/taskbar_bt.png") !important;background-position:0px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbuttons-panel li .x-btn.x-btn-icon.launched .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt.png") !important;background-size:186px 39px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbuttons-panel li .x-btn.x-btn-icon.launched .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt.png") !important;background-size:186px 39px;outline:1px green dashed}}#sds-taskbuttons-panel li .x-btn.x-btn-icon.x-btn-over .x-btn-mc{background:transparent no-repeat;background-image:url("../images/taskbar/taskbar_bt.png") !important;background-position:-62px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbuttons-panel li .x-btn.x-btn-icon.x-btn-over .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt.png") !important;background-size:186px 39px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbuttons-panel li .x-btn.x-btn-icon.x-btn-over .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt.png") !important;background-size:186px 39px;outline:1px green dashed}}#sds-taskbuttons-panel li .x-btn.x-btn-icon.x-btn-click .x-btn-mc,#sds-taskbuttons-panel li .x-btn.x-btn-icon.launched.active .x-btn-mc{background:transparent no-repeat;background-image:url("../images/taskbar/taskbar_bt.png") !important;background-position:-124px 0px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-taskbuttons-panel li .x-btn.x-btn-icon.x-btn-click .x-btn-mc,.synohdpack #sds-taskbuttons-panel li .x-btn.x-btn-icon.launched.active .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt.png") !important;background-size:186px 39px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-taskbuttons-panel li .x-btn.x-btn-icon.x-btn-click .x-btn-mc,.synohdpackdebug #sds-taskbuttons-panel li .x-btn.x-btn-icon.launched.active .x-btn-mc{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_bt.png") !important;background-size:186px 39px;outline:1px green dashed}}.sds-user-menu{min-width:140px;padding:4px 10px 4px 10px;position:absolute;top:39px;right:0px;overflow:hidden;z-index:12000;background:#fff repeat-x;background-image:url("../images/taskbar/taskbar_shadow.png");box-shadow:-2px 5px 8px rgba(0,0,0,0.5);user-select:none;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-user-menu{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_shadow.png");background-size:4px 4px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-user-menu{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_shadow.png");background-size:4px 4px;outline:1px green dashed}}.sds-user-menu .x-menu{background-color:transparent !important;background-image:none !important}.sds-user-menu .x-menu .x-menu-item-text{font-size:12px;line-height:32px;padding-left:6px}.sds-user-menu .x-menu .x-menu-item-icon{top:4px}.sds-user-menu .x-menu-item{padding-top:0;padding-bottom:0}.sds-user-menu .x-menu-sep-li{height:7px}.sds-user-menu .x-menu-sep-li .x-menu-sep{margin:0px;border-bottom-color:#EBF0F5;background-color:transparent}.sds-user-menu .x-menu-list-item{padding:0px}.sds-user-menu .x-menu-item-active,.sds-user-menu .x-menu-item-active .x-menu-item{background-image:none;background-color:transparent;border-color:transparent;border:0px}.sds-user-menu .sds-user-menu-username{display:inline-block;width:136px;font-weight:bold;color:#505A64;line-height:24px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.sds-user-menu .sds-user-menu-options{width:24px;height:24px;background-image:url("../images/taskbar/user_menu_options.png");background-position:0 0}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-user-menu .sds-user-menu-options{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_options.png");background-size:24px 72px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-user-menu .sds-user-menu-options{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_options.png");background-size:24px 72px;outline:1px green dashed}}.sds-user-menu .sds-user-menu-restart{width:24px;height:24px;background-image:url("../images/taskbar/user_menu_restart.png");background-position:0 0}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-user-menu .sds-user-menu-restart{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_restart.png");background-size:24px 72px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-user-menu .sds-user-menu-restart{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_restart.png");background-size:24px 72px;outline:1px green dashed}}.sds-user-menu .sds-user-menu-shutdown{width:24px;height:24px;background-image:url("../images/taskbar/user_menu_shutdown.png");background-position:0 0}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-user-menu .sds-user-menu-shutdown{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_shutdown.png");background-size:24px 72px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-user-menu .sds-user-menu-shutdown{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_shutdown.png");background-size:24px 72px;outline:1px green dashed}}.sds-user-menu .sds-user-menu-logout{width:24px;height:24px;background-image:url("../images/taskbar/user_menu_logout.png");background-position:0 0}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-user-menu .sds-user-menu-logout{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_logout.png");background-size:24px 72px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-user-menu .sds-user-menu-logout{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_logout.png");background-size:24px 72px;outline:1px green dashed}}.sds-user-menu .sds-user-menu-about{width:24px;height:24px;background-image:url("../images/taskbar/user_menu_about.png");background-position:0 0}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-user-menu .sds-user-menu-about{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_about.png");background-size:24px 72px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-user-menu .sds-user-menu-about{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/user_menu_about.png");background-size:24px 72px;outline:1px green dashed}}.sds-user-menu .sds-user-menu-options-over img,.sds-user-menu .sds-user-menu-restart-over img,.sds-user-menu .sds-user-menu-about-over img,.sds-user-menu .sds-user-menu-shutdown-over img,.sds-user-menu .sds-user-menu-logout-over img{background-position:0px -24px !important}.sds-user-menu .sds-user-menu-options-over .x-menu-item-text,.sds-user-menu .sds-user-menu-restart-over .x-menu-item-text,.sds-user-menu .sds-user-menu-about-over .x-menu-item-text,.sds-user-menu .sds-user-menu-shutdown-over .x-menu-item-text,.sds-user-menu .sds-user-menu-logout-over .x-menu-item-text{color:#78828C}.sds-user-menu .sds-user-menu-options-click img,.sds-user-menu .sds-user-menu-restart-click img,.sds-user-menu .sds-user-menu-about-click img,.sds-user-menu .sds-user-menu-shutdown-click img,.sds-user-menu .sds-user-menu-logout-click img{background-position:0px -48px !important}.sds-user-menu .sds-user-menu-options-click .x-menu-item-text,.sds-user-menu .sds-user-menu-restart-click .x-menu-item-text,.sds-user-menu .sds-user-menu-about-click .x-menu-item-text,.sds-user-menu .sds-user-menu-shutdown-click .x-menu-item-text,.sds-user-menu .sds-user-menu-logout-click .x-menu-item-text{color:#0086E5}.sds-overflow-menu{min-width:240px;position:absolute;top:39px;overflow:hidden;z-index:12000;user-select:none;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none}.sds-overflow-menu .x-menu{background-color:transparent !important;background-image:none !important}.sds-overflow-menu .x-menu .x-menu-item-text{font-size:13px;line-height:48px;padding-left:20px}.sds-overflow-menu .x-menu .x-menu-item-text:hover{height:100%}.sds-overflow-menu .x-menu .x-menu-item-icon{top:8px;left:8px;height:32px;width:32px}.sds-overflow-menu .x-menu-item{padding-top:0;padding-bottom:0}.sds-overflow-menu .x-menu-sep-li{height:7px}.sds-overflow-menu .x-menu-sep-li .x-menu-sep{margin:0px;border-bottom-color:#EBF0F5;background-color:transparent}.sds-overflow-menu .x-menu-list{padding:0px}.sds-overflow-menu .x-menu-list-item{padding:0px}.sds-overflow-menu .x-menu-item-active,.sds-overflow-menu .x-menu-item-active .x-menu-item{background-image:none;background-color:transparent;border-color:transparent;border:0px;color:#78828C}.sds-overflow-menu .sds-overflow-items-click .x-menu-item-text{color:#0086E5}.sds-taskbutton-overflowed{visibility:hidden !important}.sds-user-menu.sds-overflow-menu .x-menu .x-menu-item .x-menu-item-icon{left:4px;top:4px}.sds-previewbox{box-shadow:0px 2px 6px rgba(0,0,0,0.5);position:absolute;top:46px;left:0px;width:240px;height:180px;z-index:13000;user-select:none;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-webkit-transform:translate3d(0, 0, 0)}.sds-previewbox .sds-previewbox-mc{margin:0px 10px;height:160px}.sds-previewbox .sds-previewbox-background{z-index:-1;zoom:1;position:absolute;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=85);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=85);opacity:0.85;background:#f5faff;background:#f5faff;top:0px;left:0px;right:0px;bottom:0px}.sds-previewbox .sds-previewbox-win{position:absolute}.sds-previewbox .sds-previewbox-win-mask{position:absolute;background:transparent;z-index:9999;width:100%;height:100%;top:0px;box-shadow:0px 3px 6px rgba(0,0,0,0.5)}.sds-previewbox .sds-previewbox-arrow{position:absolute;top:-18px;left:108px;width:24px;height:18px;overflow:hidden}.ext-ie8m .sds-previewbox .sds-previewbox-arrow{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=85);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=85);opacity:0.85;width:0px;height:0px;border:10px solid transparent;border-bottom-width:13px;border-bottom-color:#f5faff;border-top-width:0px}.sds-previewbox .sds-previewbox-arrow::after{background:#f5faff;background:rgba(245,250,255,0.85);content:'';position:absolute;bottom:0px;left:2px;width:14px;height:14px;-webkit-transform-origin:left bottom;-moz-transform-origin:left bottom;-ms-transform-origin:left bottom;-o-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);box-shadow:2px 2px 6px rgba(0,0,0,0.5)}.sds-previewbox-desc{color:#28323C;font-size:13px;font-weight:bold;padding:6px 0px;text-align:center;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap}.sds-previewbox-win-transform{transform-origin:0% 0%;-webkit-transform-origin:0% 0%;-moz-transform-origin:0% 0%;-o-transform-origin:0% 0%;-ms-transform-origin:0% 0%}.sds-previewbox-transition{transition-delay:0s;transition-property:top, left, opacity;transition-duration:0.8s;-webkit-transition-delay:0s;-webkit-transition-property:top, left, opacity;-webkit-transition-duration:0.8s;-moz-transition-delay:0s;-moz-transition-property:top, left, opacity;-moz-transition-duration:0.8s;-o-transition-delay:0s;-o-transition-property:top, left, opacity;-o-transition-duration:0.8s;-ms-transition-delay:0s;-ms-transition-property:top, left, opacity;-ms-transition-duration:0.8s}.sds-tray-msg-window{background-color:white;box-shadow:0px 2px 6px rgba(0,0,0,0.5);border-radius:3px}.sds-tray-msg-window .x-tool-close{position:absolute;right:2px;top:2px;background-image:url("../images/rt_button.png");width:24px;height:24px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-tray-msg-window .x-tool-close{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/rt_button.png");background-size:24px 768px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-tray-msg-window .x-tool-close{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/rt_button.png");background-size:24px 768px;outline:1px green dashed}}.sds-tray-msg-window .x-tool-close-over{background-position:0 -24px}.sds-tray-msg-window .x-plain-tl .x-plain-header{overflow:hidden;zoom:1;padding:5px 12px 5px 12px;font-size:15px;color:#0086E5;height:17px}.sds-tray-msg-window .x-plain-body{overflow:hidden;position:relative;padding:0px 12px 10px 12px;font-size:12px;color:#505A64;word-wrap:break-word}.sds-taskbar-no-display{display:none}.sds-appview-searchfiled{top:5px;left:-10px}.sds-searchbox{position:absolute;top:39px;right:0px;overflow:hidden;z-index:12000;width:340px;background:#fff repeat-x;background-image:url("../images/taskbar/taskbar_shadow.png");user-select:none;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;box-shadow:-2px 5px 8px rgba(0,0,0,0.5)}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-searchbox{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_shadow.png");background-size:4px 4px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-searchbox{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/taskbar/taskbar_shadow.png");background-size:4px 4px;outline:1px green dashed}}.sds-searchbox .sds-searchbox-input-wrap{right:-10px;top:10px}.sds-searchbox .sds-searchbox-header .x-small-editor .sds-searchbox-input{width:265px;height:26px !important;line-height:24px;background-color:transparent;background-image:none;padding:0 4px 0 0;padding-left:27px;padding-right:22px;border-color:#C8D2DC}.sds-searchbox .sds-searchbox-header .x-small-editor .sds-searchbox-input:hover{border-color:#B4BEC8}.sds-searchbox .sds-searchbox-header .x-small-editor .sds-searchbox-input.x-form-focus{border-color:#0086E6}.sds-searchbox .sds-searchbox-header .x-toolbar{background-image:none;background-color:transparent;background-repeat:no-repeat;padding:0;border:none;overflow:visible}.sds-searchbox .sds-searchbox-header .x-toolbar .x-toolbar-ct{height:42px}.sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-left{background-image:url(/scripts/ext-3/ux/images/Components/icon_search.png);width:24px;height:24px;margin:2px 0px 0px 4px;background-position:0 0}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-left{background-image:url("../img/synohdpack/images/Components/icon_search.png");background-size:24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-left{background-image:url("../img/synohdpack/images/Components/icon_search.png");background-size:24px;outline:1px green dashed}}.sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-cancel{background-image:url(/scripts/ext-3.4/ux/images/Components/icon_search_clear.png);background-position:0 -0px;left:290px;width:24px;height:24px;margin-top:3px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-cancel{background-image:url("../img/synohdpack/images/Components/icon_search_clear.png");background-size:24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-cancel{background-image:url("../img/synohdpack/images/Components/icon_search_clear.png");background-size:24px;outline:1px green dashed}}.sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-cancel.x-btn-over{background-position:0 -24px}.sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-cancel.x-btn-click{background-position:0 -48px}.sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-cancel .x-btn-ml,.sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-cancel .x-btn-mr{display:none}.sds-searchbox .sds-searchbox-header .x-toolbar .sds-searchbox-input-cancel .x-btn-mc{background-image:none !important}.sds-searchbox .sds-searchbox-header .x-toolbar .ext-chrome .sds-searchbox-input-cancel{left:290px}.sds-searchbox .x-toolbar td{vertical-align:baseline}.sds-searchbox.sds-searchbox-init-state .sds-searchbox-header .x-toolbar-ct{height:48px}.sds-searchbox.sds-searchbox-init-state .sds-searchbox-bwrap{display:none}.sds-searchbox .sds-search-result{overflow-x:hidden;overflow-y:hidden;font-size:12px;padding:0px 0px 10px 10px}.sds-searchbox .sds-search-result .section{padding:0px 0px 0px 8px;color:#0086E5;background:transparent;font-size:15px;line-height:32px}.sds-searchbox .sds-search-result .sds-searchbox-result-splitline{height:8px}.sds-searchbox .sds-search-result .sds-searchbox-result-item{padding:4px 0 4px 8px;line-height:16px;white-space:nowrap;width:322px;cursor:pointer}.sds-searchbox .sds-search-result .sds-searchbox-result-item:hover{background:#F5FaFF}.sds-searchbox .sds-search-result .sds-searchbox-result-item:active{background:#E6F5FF}.sds-searchbox .sds-search-result .sds-searchbox-result-item .topic{padding-left:8px;font-size:11px}.sds-searchbox .sds-search-result .sds-searchbox-result-item .topic div{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;width:168px}.sds-searchbox .sds-search-result .sds-searchbox-result-item .module{color:#96A0AA;font-size:12px}.sds-searchbox .sds-search-result .sds-searchbox-result-item .module div{width:110px;right:0px;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;text-align:right}.sds-searchbox.sds-searchbox-init-state .sds-searchbox-input-cancel{display:none}.ext-opera .sds-searchbox .x-toolbar-left{vertical-align:middle}.ext-opera .sds-searchbox .x-toolbar-right{vertical-align:top}.sds-user-about-window.x-window-dlg .sds-user-about-desc{line-height:20px;height:120px;margin-bottom:8px}.sds-user-about-window.x-window-dlg .sds-user-about-terms-and-cond{line-height:20px;font-weight:bold;margin-bottom:24px}.syno-sds-appview{outline:none}.syno-sds-appview:after{content:"";position:absolute;height:8px;width:100%;bottom:0px;z-index:10;background-repeat:no-repeat;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0icmdiYSgwLDAsMCwwKSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiYSgwLDAsMCwwLjQpIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0)), color-stop(100%, rgba(0,0,0,0.4)));background-image:-webkit-linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.4));background-image:-moz-linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.4));background-image:-o-linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.4));background-image:linear-gradient(top, rgba(0,0,0,0),rgba(0,0,0,0.4))}.syno-sds-appview .crossbrowser-background{position:absolute;width:inherit;height:inherit;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=70);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=70);opacity:0.7}.syno-sds-appview .syno-sds-appview-container{outline:none;padding:16px 0px 0px 0px}.syno-sds-appview .syno-sds-appview-container.hide-scroll .vscrollerbar{visibility:hidden !important}.syno-sds-appview .app-panel-title{color:#FFFFFF;height:32px;line-height:32px;padding-left:32px;font-size:13px;font-weight:bold;text-shadow:0px 1px 3px #000000;margin-bottom:8px}.syno-sds-appview .system-app-panel-title{visibility:hidden}.syno-sds-appview .search-result-app-panel-title{background-image:url(../images/desktop/icon_app_category.png);background-position:0 -96px;background-repeat:no-repeat}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-sds-appview .search-result-app-panel-title{background-image:url("../img/synohdpack/images/dsm/resources/images/desktop/icon_app_category.png");background-size:32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-sds-appview .search-result-app-panel-title{background-image:url("../img/synohdpack/images/dsm/resources/images/desktop/icon_app_category.png");background-size:32px;outline:1px green dashed}}.syno-sds-appview .sds-app-items-panel{display:inline-block}.syno-sds-appview .sds-app-items-panel.frequently-used-panel{height:136px;overflow:hidden}.syno-sds-appview .sds-appview-app-item{width:136px;height:120px;padding:16px 8px 0px 8px;float:left;cursor:pointer}.syno-sds-appview .sds-appview-app-item.new-app{background-image:url(../images/desktop/spotlight.png);background-position:8px 0px;background-repeat:no-repeat;overflow:visible}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-sds-appview .sds-appview-app-item.new-app{background-image:url("../img/synohdpack/images/dsm/resources/images/desktop/spotlight.png");background-size:136px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-sds-appview .sds-appview-app-item.new-app{background-image:url("../img/synohdpack/images/dsm/resources/images/desktop/spotlight.png");background-size:136px;outline:1px green dashed}}.syno-sds-appview .sds-appview-app-item img{opacity:1;width:72px;margin-left:32px}.syno-sds-appview .sds-appview-app-item .sds-appview-app-item-title{color:#FFFFFF;font:12px verdana, tahoma, arial, helvetica, sans-serif;text-align:center;text-shadow:0.1em 0.1em 0.1em #000000;padding-top:8px}.syno-sds-appview .ux-float-layout-ct.sds-float-layout-ct-animate .x-box-item{-webkit-transition-property:top,left;-moz-transition-property:top,left;-o-transition-property:top,left;transition-property:top,left;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0.3s;-moz-transition-duration:0.3s;-o-transition-duration:0.3s;transition-duration:0.3s}.syno-sds-appview .on-mouse-out .sds-app-panel,.syno-sds-appview .on-instruction .sds-app-panel{opacity:0.5}.classical.syno-sds-appview{padding-left:22px;position:absolute}.classical.syno-sds-appview .crossbrowser-background{background-color:#F5FAFF;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=100);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;box-shadow:0 2px 6px rgba(0,0,0,0.5)}.classical.syno-sds-appview:after{background-image:none}.classical.syno-sds-appview .sds-appview-searchfiled{top:0;left:0;margin:12px 20px 12px 16px}.classical.syno-sds-appview .syno-sds-appview-container{padding:0}.classical.syno-sds-appview .sds-app-items-panel{display:block}.classical.syno-sds-appview .sds-app-items-panel.search-result-app-panel{overflow:hidden}.classical.syno-sds-appview .sds-appview-app-item{width:136px;height:100px;padding:0}.classical.syno-sds-appview .sds-appview-app-item img{display:block;opacity:1;width:48px;margin-left:44px}.classical.syno-sds-appview .sds-appview-app-item .sds-appview-app-item-title{color:#505a64;text-shadow:none;padding-top:4px}.classical.syno-sds-appview.x-hide-offsets .sds-appview-app-item,.classical.syno-sds-appview.x-hide-offsets .syno-ux-textfilter-trigger,.classical.syno-sds-appview.x-hide-offsets .vscrollerbar.scrollgeneric{visibility:hidden !important}.sds-search-result{background-image:none;color:#505A64}.sds-search-result.x-layer{border-color:#C8D2DC;background-color:#FFFFFF;padding:4px;box-shadow:0 2px 4px rgba(0,0,0,0.5)}.sds-search-result .x-combo-list-hd{border:none}.sds-search-result .x-combo-list-hd,.sds-search-result .section{height:32px;line-height:32px;background:#FFF;padding:0 0 0 16px;color:#0086E5;font-size:15px;font-weight:normal;cursor:default}.sds-search-result .section{padding-left:8px}.sds-search-result .x-combo-list-inner{background-color:#FFF;padding-left:8px}.sds-search-result .x-combo-list-item{white-space:no-wrap;width:100%;padding:0px;height:32px;line-height:32px}.sds-search-result .x-combo-list-item,.sds-search-result .x-combo-list-item.x-combo-selected{border:none !important}.sds-search-result .x-combo-list-item img{padding:8px}.sds-search-result .x-combo-list-item .topic{padding-left:0}.sds-search-result .x-combo-selected{background:#F5FAFF}.sds-search-result .x-combo-selected:active{background:#E6F5FF}.sds-search-result .loading-indicator{margin-top:0px}.sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.ext-webkit .sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-text{font-size:12px;color:#505A64;background-image:url(/scripts/ext-3/ux/images/Components/icon_search.png);background-position:4px 0px;padding-left:30px;padding-top:0px;height:24px !important;line-height:24px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.sds-window-v5 .syno-textfilter .x-form-field-wrap .synohdpack .syno-textfilter-text,.synohdpack .sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.sds-widget-window .syno-textfilter .x-form-field-wrap .synohdpack .syno-textfilter-text{background-image:url("../img/synohdpack/images/Components/icon_search.png");background-size:24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.sds-window-v5 .syno-textfilter .x-form-field-wrap .synohdpackdebug .syno-textfilter-text,.synohdpackdebug .sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.sds-widget-window .syno-textfilter .x-form-field-wrap .synohdpackdebug .syno-textfilter-text{background-image:url("../img/synohdpack/images/Components/icon_search.png");background-size:24px;outline:1px green dashed}}.sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-text{margin-top:1px}.ext-ie .sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.ext-ie .sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-text{margin-top:1px !important}.sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-text.x-form-empty-field,.sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-text.x-form-empty-field{color:#96A0AA}.sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger,.sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger{background:url(/scripts/ext-3/ux/images/Components/icon_search_clear.png) 0px 0px no-repeat;border:none;width:24px;height:24px;right:0px;margin-top:1px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger,.synohdpack .sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger{background-image:url("../img/synohdpack/images/Components/icon_search_clear.png");background-size:24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger,.synohdpackdebug .sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger{background-image:url("../img/synohdpack/images/Components/icon_search_clear.png");background-size:24px;outline:1px green dashed}}.sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger.x-form-trigger-over,.sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger.x-form-trigger-over{background-position:0 -24px}.sds-window-v5 .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger:active,.sds-widget-window .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger:active{background-position:0 -48px}.sds-desktop-view-animate{position:absolute;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=40);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);opacity:0.4;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0.15s;-moz-transition-duration:0.15s;-o-transition-duration:0.15s;transition-duration:0.15s}.sds-desktop-view-animate .scale-item{-o-transform:scale(0.95);-moz-transform:scale(0.95);-ms-transform:scale(0.95);-webkit-transform:scale(0.95);transform:scale(0.95);-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition-property:top,left,opacity,-webkit-transform;-moz-transition-property:top,left,opacity,-moz-transform;-o-transition-property:top,left,opacity,-o-transform;transition-property:top,left,opacity,transform;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0.2s;-moz-transition-duration:0.2s;-o-transition-duration:0.2s;transition-duration:0.2s}.sds-desktop-view-animate.sds-widgetview .scale-item{-webkit-transition-property:top,left,opacity,-webkit-transform;-moz-transition-property:top,left,opacity,-moz-transform;-o-transition-property:top,left,opacity,-o-transform;transition-property:top,left,opacity,transform;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0.2s;-moz-transition-duration:0.2s;-o-transition-duration:0.2s;transition-duration:0.2s}.sds-desktop-view-animate.sds-desktop-view-show{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=100);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.sds-desktop-view-animate.sds-desktop-view-show .scale-item{-o-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1)}.sds-desktop-view-animate.no-transition{-webkit-transition-property:none;-moz-transition-property:none;-o-transition-property:none;transition-property:none;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0s;-moz-transition-duration:0s;-o-transition-duration:0s;transition-duration:0s}.sds-desktop-view-animate.no-transition .scale-item{-webkit-transition-property:none;-moz-transition-property:none;-o-transition-property:none;transition-property:none;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0s;-moz-transition-duration:0s;-o-transition-duration:0s;transition-duration:0s}.bounce-effect-fast{-webkit-animation:bounce 400ms ease-out;-moz-animation:bounce 400ms ease-out;-o-animation:bounce 400ms ease-out;animation:bounce 400ms ease-out}.sds-app-widget-instruction{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=0);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;position:absolute;z-index:3;top:0}.sds-app-widget-instruction.show{-webkit-transition-property:opacity, filter;-moz-transition-property:opacity, filter;-o-transition-property:opacity, filter;transition-property:opacity, filter;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0.2s;-moz-transition-duration:0.2s;-o-transition-duration:0.2s;transition-duration:0.2s;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=100);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.sds-app-widget-instruction .message-arrow{position:absolute;overflow:hidden;width:22px;height:35px}.ext-ie8m .sds-app-widget-instruction .message-arrow{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=75);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=75);opacity:0.75;left:-12px;width:0px;height:0px;border:12px solid transparent;border-right-color:#fff;border-left-width:0px}.sds-app-widget-instruction .message-arrow::after{background:#282d32;background:#282d32;content:'';position:absolute;left:6px;width:16px;height:16px;-webkit-transform-origin:right top;-moz-transform-origin:right top;-ms-transform-origin:right top;-o-transform-origin:right top;transform-origin:right top;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);box-shadow:0 2px 4px rgba(0,0,0,0.5);border-top:solid 1px white;border-left:solid 1px white}.sds-app-widget-instruction .message-container{visibility:visible;position:absolute;max-width:218px;height:auto;font-size:16px;line-height:22px;color:#FFFFFF;padding:10px 16px;box-shadow:0 1px 4px rgba(0,0,0,0.25);border:solid 1px;border-color:#fff;border-color:rgba(255,255,255,0.75);background:#000;background:rgba(0,0,0,0.75)}body,.ext-el-mask-msg div,.x-tab-strip span.x-tab-strip-text,.x-form-field,.x-form-grow-sizer,.x-form-item,.x-form-invalid-msg,.x-fieldset legend,.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label,.x-grid-group-hd div.x-grid-group-title,.x-grid-empty,.x-tip .x-tip-mc,.x-tip .x-tip-header-text,.x-tip .x-tip-body,.x-window-mc,.x-window-dlg .ext-mb-textarea,.x-small-editor .x-form-field,.ext-webkit .x-small-editor .x-form-field,.x-grid3-hd-row td,.x-grid3-row td,.x-grid3-summary-row td,.x-grid3-topbar,.x-grid3-bottombar,.x-tree-node,.x-date-inner th,.x-date-inner a,.x-date-mp td,.x-date-mp-btns button,.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label,.x-list-header-inner div em,.x-list-body dt em,.x-btn,.x-btn button,.x-dd-drag-ghost,.x-date-middle,.x-date-left,.x-date-right,.x-menu-list-item,.x-combo-list,.x-combo-list-hd,.x-combo-list-small,.x-panel-tl .x-panel-header,.x-panel .x-panel-header,.x-panel-mc,.x-window-tl .x-window-header{font-family:verdana,tahoma,arial,helvetica,sans-serif}.syno-ux-modulelist .x-tree-root-node{width:212px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .x-tree-node-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_general.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .x-tree-node-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_general.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-CMS{background-image:url("../images/module_list_icon/c_icon_CMS.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-CMS{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_CMS.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-CMS{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_CMS.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-backup{background-image:url("../images/module_list_icon/c_icon_backup.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-backup{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_backup.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-backup{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_backup.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-business{background-image:url("../images/module_list_icon/c_icon_business.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-business{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_business.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-business{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_business.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-contact{background-image:url("../images/module_list_icon/c_icon_contact.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-contact{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_contact.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-contact{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_contact.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-directory-service{background-image:url("../images/module_list_icon/c_icon_directory_service.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-directory-service{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_directory_service.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-directory-service{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_directory_service.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-dsm-apps{background-image:url("../images/module_list_icon/c_icon_dsm_apps.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-dsm-apps{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_dsm_apps.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-dsm-apps{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_dsm_apps.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-expansion{background-image:url("../images/module_list_icon/c_icon_expansion.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-expansion{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_expansion.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-expansion{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_expansion.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-external-devices{background-image:url("../images/module_list_icon/c_icon_external_devices.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-external-devices{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_external_devices.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-external-devices{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_external_devices.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-file-services{background-image:url("../images/module_list_icon/c_icon_file_services.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-file-services{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_file_services.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-file-services{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_file_services.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-groups{background-image:url("../images/module_list_icon/c_icon_groups.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-groups{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_groups.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-groups{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_groups.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-hardware-and-power{background-image:url("../images/module_list_icon/c_icon_hardware_and_power.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-hardware-and-power{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hardware_and_power.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-hardware-and-power{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hardware_and_power.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-purchases{background-image:url("../images/module_list_icon/c_icon_purchases.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-purchases{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_purchases.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-purchases{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_purchases.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-syslog{background-image:url("../images/module_list_icon/c_icon_syslog.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-syslog{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_syslog.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-syslog{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_syslog.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-hdd-management{background-image:url("../images/module_list_icon/c_icon_hdd_management.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-hdd-management{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_hdd_management.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-hdd-management{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_hdd_management.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-hot-spare{background-image:url("../images/module_list_icon/c_icon_hot_spare.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-hot-spare{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_hot_spare.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-hot-spare{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_hot_spare.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-info-center{background-image:url("../images/module_list_icon/c_icon_info_center.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-info-center{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_info_center.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-info-center{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_info_center.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-installed{background-image:url("../images/module_list_icon/c_icon_installed.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-installed{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_installed.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-installed{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_installed.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-iscsi-lun{background-image:url("../images/module_list_icon/c_icon_iscsi_lun.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-iscsi-lun{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_iscsi_lun.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-iscsi-lun{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_iscsi_lun.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-iscsi-target{background-image:url("../images/module_list_icon/c_icon_iscsi_target.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-iscsi-target{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_iscsi_target.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-iscsi-target{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_iscsi_target.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-login-style{background-image:url("../images/module_list_icon/c_icon_login_style.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-login-style{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_login_style.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-login-style{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_login_style.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-media-library{background-image:url("../images/module_list_icon/c_icon_media_library.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-media-library{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_media_library.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-media-library{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_media_library.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-network{background-image:url("../images/module_list_icon/c_icon_network.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-network{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_network.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-network{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_network.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-networkmap{background-image:url("../images/module_list_icon/c_icon_networkmap.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-networkmap{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_networkmap.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-networkmap{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_networkmap.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-notifications{background-image:url("../images/module_list_icon/c_icon_notifications.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-notifications{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_notifications.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-notifications{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_notifications.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-overview{background-image:url("../images/module_list_icon/c_icon_overview.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-overview{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_overview.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-overview{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_overview.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-portal{background-image:url("../images/module_list_icon/c_icon_portal.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-portal{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_portal.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-portal{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_portal.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-privilege{background-image:url("../images/module_list_icon/c_icon_privilege.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-privilege{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_privilege.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-privilege{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_privilege.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-public-access{background-image:url("../images/module_list_icon/c_icon_public_access.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-public-access{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_public_access.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-public-access{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_public_access.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-quickconnect{background-image:url("../images/module_list_icon/c_icon_quickconnect.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-quickconnect{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_quickconnect.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-quickconnect{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_quickconnect.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-raid-group{background-image:url("../images/module_list_icon/c_icon_raid_group.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-raid-group{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_raid_group.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-raid-group{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_raid_group.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-recommend{background-image:url("../images/module_list_icon/c_icon_recommend.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-recommend{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_recommend.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-recommend{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_recommend.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-region{background-image:url("../images/module_list_icon/c_icon_region.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-region{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_region.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-region{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_region.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-security{background-image:url("../images/module_list_icon/c_icon_security.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-security{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_security.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-security{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_security.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-shared-folders{background-image:url("../images/module_list_icon/c_icon_shared_folders.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-shared-folders{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_shared_folders.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-shared-folders{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_shared_folders.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-ssd-cache{background-image:url("../images/module_list_icon/c_icon_ssd_cache.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-ssd-cache{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_ssd_cache.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-ssd-cache{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_ssd_cache.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-task-scheduler{background-image:url("../images/module_list_icon/c_icon_task_scheduler.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-task-scheduler{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_task_scheduler.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-task-scheduler{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_task_scheduler.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-terminal-and-SNMP{background-image:url("../images/module_list_icon/c_icon_terminal_and_SNMP.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-terminal-and-SNMP{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_terminal_and_SNMP.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-terminal-and-SNMP{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_terminal_and_SNMP.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-update-and-reset{background-image:url("../images/module_list_icon/c_icon_update_and_reset.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-update-and-reset{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_update_and_reset.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-update-and-reset{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_update_and_reset.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-users{background-image:url("../images/module_list_icon/c_icon_users.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-users{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_users.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-users{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_users.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-utilities{background-image:url("../images/module_list_icon/c_icon_utilities.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-utilities{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_utilities.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-utilities{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_utilities.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-volume{background-image:url("../images/module_list_icon/c_icon_volume.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-volume{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_volume.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-volume{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_volume.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-web-server{background-image:url("../images/module_list_icon/c_icon_web_server.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-web-server{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_web_server.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-web-server{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_web_server.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-wireless{background-image:url("../images/module_list_icon/c_icon_wireless.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-wireless{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_wireless.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-wireless{background-image:url("../img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_wireless.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-performance{background-image:url("../images/module_list_icon/c_icon_performance.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-performance{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_performance.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-performance{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_performance.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-process{background-image:url("../images/module_list_icon/c_icon_process.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-process{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_process.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-process{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_process.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-connect{background-image:url("../images/module_list_icon/c_icon_connect.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-connect{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_connect.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-connect{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_connect.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-speed{background-image:url("../images/module_list_icon/c_icon_speed.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-speed{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_speed.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-speed{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_speed.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf .icon-community{background-image:url("../images/module_list_icon/c_icon_community.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .icon-community{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_community.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .icon-community{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/module_list_icon/c_icon_community.png");background-size:24px 96px;outline:1px green dashed}}.x-tip{box-shadow:0 1px 4px rgba(0,0,0,0.25);border:solid 1px;border-color:#fff;border-color:rgba(255,255,255,0.75);background:#000;background:rgba(0,0,0,0.75)}.x-tip .x-tip-ml,.x-tip .x-tip-mr,.x-tip .x-tip-mc,.x-tip .x-tip-tl,.x-tip .x-tip-tr,.x-tip .x-tip-tc,.x-tip .x-tip-bl,.x-tip .x-tip-br,.x-tip .x-tip-bc{padding:0px;background-image:none;background-color:transparent}.x-tip .x-tip-bwrap{padding:3px 10px}.x-tip .x-tip-body,.x-tip .x-tip-body span,.x-tip .x-tip-body div{font-size:12px !important;color:#FFFFFF !important}.sds-wizard-banner .x-panel-body{background-color:transparent}.ext-ie7 .sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct,.ext-ie7 .sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct,.ext-ie7 .sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct,.ext-ie7 .sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct,.ext-ie8 .sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct,.ext-ie8 .sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct,.ext-ie8 .sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct,.ext-ie8 .sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct,.ext-ie9 .sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct,.ext-ie9 .sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct,.ext-ie9 .sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct,.ext-ie9 .sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct{width:auto !important}.sds-window-v5 .sds-wizard-banner-wrap,.sds-widget-window .sds-wizard-banner-wrap{background-image:url("../images/wizard_bkg_h.png");background-repeat:no-repeat;background-position:top right;background-color:#008def;height:112px !important;display:table}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5 .sds-wizard-banner-wrap,.synohdpack .sds-widget-window .sds-wizard-banner-wrap{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/wizard_bkg_h.png");background-size:414px 112px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5 .sds-wizard-banner-wrap,.synohdpackdebug .sds-widget-window .sds-wizard-banner-wrap{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/wizard_bkg_h.png");background-size:414px 112px;outline:1px green dashed}}.sds-window-v5 .x-panel-body.sds-wizard-banner,.sds-widget-window .x-panel-body.sds-wizard-banner{background-image:none;background-color:transparent;border-bottom:0px;display:table-cell;vertical-align:middle}.sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct,.sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct,.sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct,.sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct{padding-right:20px;padding-left:20px;background-image:none}.sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct,.sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct,.sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct,.sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct{background-image:url("../images/shadow_footbar.png");background-repeat:repeat-x;background-color:transparent;border:0px;padding-top:4px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct,.synohdpack .sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct,.synohdpack .sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct,.synohdpack .sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/shadow_footbar.png");background-size:8px 4px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct,.synohdpackdebug .sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct,.synohdpackdebug .sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct,.synohdpackdebug .sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/shadow_footbar.png");background-size:8px 4px;outline:1px green dashed}}.sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-left,.sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-left,.sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-left,.sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-left{padding:0px 0px 0px 10px}.sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-cell,.sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-cell,.sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-cell,.sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-cell{padding:0}.sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-cell .syno-ux-button,.sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-cell .syno-ux-button,.sds-window-v5 .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-cell .syno-ux-button,.sds-widget-window .x-window-footer.sds-wizard-footer .x-panel-fbar.x-toolbar-layout-ct .x-toolbar-ct .x-toolbar-cell .syno-ux-button{margin:8px 10px 8px 0px}.sds-window-v5 .x-window-footer.sds-wizard-footer-welcome,.sds-widget-window .x-window-footer.sds-wizard-footer-welcome{background-image:url("../images/dsmv5_wizard_bkg_v_01.png");background-position:bottom left;background-repeat:no-repeat}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5 .x-window-footer.sds-wizard-footer-welcome,.synohdpack .sds-widget-window .x-window-footer.sds-wizard-footer-welcome{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/dsmv5_wizard_bkg_v_01.png");background-size:140px 48px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5 .x-window-footer.sds-wizard-footer-welcome,.synohdpackdebug .sds-widget-window .x-window-footer.sds-wizard-footer-welcome{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/dsmv5_wizard_bkg_v_01.png");background-size:140px 48px;outline:1px green dashed}}.sds-window-v5 .x-window-footer.sds-wizard-footer-welcome .x-toolbar-layout-ct,.sds-widget-window .x-window-footer.sds-wizard-footer-welcome .x-toolbar-layout-ct{margin-left:140px}.sds-window-v5 .sds-wizard-banner .wizard-headline,.sds-widget-window .sds-wizard-banner .wizard-headline{font-size:18px;line-height:24px;font-weight:bold;color:#FFFFFF;overflow:hidden;padding-top:0px}.sds-window-v5 .sds-wizard-banner .wizard-description,.sds-widget-window .sds-wizard-banner .wizard-description{font-size:14px;line-height:18px;color:#FFFFFF;overflow:hidden}.sds-window-v5 .sds-wizard-step .sds-wizard-step-bwrap,.sds-widget-window .sds-wizard-step .sds-wizard-step-bwrap{padding:12px 20px 8px 20px}.sds-window-v5 .sds-wizard-step .welcome-headline,.sds-widget-window .sds-wizard-step .welcome-headline{font-size:15px;font-weight:bold;color:#505a64;padding:12px 20px 12px 20px;border-bottom:0px}.sds-window-v5 .sds-wizard-step .welcome-text,.sds-widget-window .sds-wizard-step .welcome-text{color:#505a64;font-size:13px;padding-right:20px;padding-left:20px}.sds-window-v5 .sds-wizard-step .welcome-image,.sds-widget-window .sds-wizard-step .welcome-image{background-image:url("../images/dsmv5_wizard_bkg_v_02.png") !important;background-position:bottom left;background-repeat:no-repeat}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5 .sds-wizard-step .welcome-image,.synohdpack .sds-widget-window .sds-wizard-step .welcome-image{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/dsmv5_wizard_bkg_v_02.png") !important;background-size:140px 366px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5 .sds-wizard-step .welcome-image,.synohdpackdebug .sds-widget-window .sds-wizard-step .welcome-image{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/dsmv5_wizard_bkg_v_02.png") !important;background-size:140px 366px;outline:1px green dashed}}.sds-window-v5 .sds-wizard-step .welcome-image-text,.sds-widget-window .sds-wizard-step .welcome-image-text{position:relative;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;left:17px;font-size:18px;font-weight:bold;line-height:24px;color:#FFFFFF;background-color:transparent;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:left bottom;-moz-transform-origin:left bottom;-ms-transform-origin:left bottom;-o-transform-origin:left bottom;transform-origin:left bottom;filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.00000000, M12=-1.00000000, M21=1.00000000, M22=0.00000000, SizingMethod='auto expand');-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0, M12=-1, M21=1, M22=0, SizingMethod='auto expand')"}.sds-wizard-banner{padding-left:20px;padding-right:20px;background:url(../images/wizard-banner.png) repeat top right;background-color:#FAFAFA;border-top:0px;border-right:0px;border-left:0px;border-bottom:1px solid #ddd}.sds-wizard-banner .wizard-headline{font-size:12px;font-weight:bold;color:#222;padding-top:10px}.sds-wizard-banner .wizard-description{font-size:11px}.sds-wizard-step .welcome-headline{font-size:12px;font-weight:bold;color:#222;padding:10px;padding-left:30px;border-bottom:1px solid #ddd}.sds-wizard-step .welcome-image{background:url(../images/wizard_welcome.png) left bottom no-repeat !important}.sds-wizard-step .welcome-text{font-size:12px;padding:10px;padding-left:30px}.sds-wizard-step .welcome-text li{list-style-image:none;list-style-position:inside;list-style-type:square;padding-top:5px}.sds-wizard-step .x-status-loading{background-image:url("../images/components/status_loading.gif");background-repeat:no-repeat;background-position:center center}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-wizard-step .x-status-loading{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/status_loading.gif");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-wizard-step .x-status-loading{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/status_loading.gif");background-size:24px 24px;outline:1px green dashed}}.sds-wizard-step .x-status-success{background-image:url("../images/components/status_success.png");background-repeat:no-repeat;background-position:center center}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-wizard-step .x-status-success{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/status_success.png");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-wizard-step .x-status-success{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/status_success.png");background-size:24px 24px;outline:1px green dashed}}.sds-wizard-step .x-status-fail{background-image:url("../images/components/status_fail.png");background-repeat:no-repeat;background-position:center center}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-wizard-step .x-status-fail{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/status_fail.png");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-wizard-step .x-status-fail{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/status_fail.png");background-size:24px 24px;outline:1px green dashed}}.sds-wizard-step .x-status-warning{background-image:url("../images/components/icon_error.png");background-size:100% 100%;background-repeat:no-repeat;background-position:center center}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-wizard-step .x-status-warning{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/icon_error.png");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-wizard-step .x-status-warning{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/icon_error.png");background-size:24px 24px;outline:1px green dashed}}.syno-sds-image-selector input.image-selector-upload-file{width:1px;height:1px}.ext-firefox3 .image-selector-upload-form form,.ext-ie .syno-sds-image-selector .image-selector-upload-form form{width:140px}.ext-firefox3 input.image-selector-upload-file,.ext-ie .syno-sds-image-selector input.image-selector-upload-file{opacity:0 !important;filter:alpha(opacity=0) !important;width:120px;height:20px;font-size:30px;cursor:pointer;margin-left:10px}.syno-sds-image-selector label.image-selector-fake-upload-button{position:absolute;left:10px;color:blue;width:120px;text-align:center}.syno-sds-image-selector table.x-btn-over button{text-decoration:underline}.syno-sds-image-selector label{color:#505A64}.syno-sds-image-selector .tree_myimage .x-tree-ec-icon.x-tree-elbow,.syno-sds-image-selector .tree_myimage .x-tree-ec-icon.x-tree-elbow-end{display:none}.syno-sds-image-selector .tree_myimage .x-tree-node-icon{margin:6px 8px 0 8px;height:16px}.syno-sds-image-selector .tree_myimage .icon_my_image{background-position:0 0;background-repeat:no-repeat;background-image:url("../images/components/icon_image_selector.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-sds-image-selector .tree_myimage .icon_my_image{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/icon_image_selector.png");background-size:16px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-sds-image-selector .tree_myimage .icon_my_image{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/icon_image_selector.png");background-size:16px 32px;outline:1px green dashed}}.syno-sds-image-selector .tree_myimage .icon_default_image{background-position:0 -16px;background-repeat:no-repeat;background-image:url("../images/components/icon_image_selector.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-sds-image-selector .tree_myimage .icon_default_image{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/icon_image_selector.png");background-size:16px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-sds-image-selector .tree_myimage .icon_default_image{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/components/icon_image_selector.png");background-size:16px 32px;outline:1px green dashed}}.syno-sds-image-selector .tree_filestation .x-tree-node-icon{display:none}.syno-sds-image-selector .x-layout-split{background-position:right 0;background-repeat:repeat-y;background-image:url("../../../scripts/ext-3.4/ux/images/Components/shadow_category.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-sds-image-selector .x-layout-split{background-image:url("../img/synohdpack/images/Components/shadow_category.png");background-size:4px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-sds-image-selector .x-layout-split{background-image:url("../img/synohdpack/images/Components/shadow_category.png");background-size:4px;outline:1px green dashed}}.syno-sds-image-selector .image-selector-upload-form .x-form-item{margin-bottom:0}.syno-sds-image-selector div.thumb-wrap{margin-bottom:4px;margin-right:8px;float:left;height:166px}.syno-sds-image-selector .x-view-selected .thumb{background:#E6F5FF;border:1px solid #A6DAFF}.syno-sds-image-selector .thumb{padding:8px 8px 4px 8px;height:150px;width:120px;border:1px solid;border-color:#fff;border-color:rgba(255,255,255,0);position:relative;display:table-cell;vertical-align:bottom}.syno-sds-image-selector .thumb img{box-shadow:0 1px 3px rgba(0,0,0,0.5);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.5);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.5);max-height:120px;max-width:120px;width:auto;height:auto}.syno-sds-image-selector .thumb .thumb-loading{background-repeat:no-repeat;background-position:center center;background-color:transparent;background-image:url("../../modules/PhotoViewer/images/loading.gif")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-sds-image-selector .thumb .thumb-loading{background-image:url("../img/synohdpack/images/dsm/resources/css/../../modules/PhotoViewer/images/loading.gif");background-size:16px 16px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-sds-image-selector .thumb .thumb-loading{background-image:url("../img/synohdpack/images/dsm/resources/css/../../modules/PhotoViewer/images/loading.gif");background-size:16px 16px;outline:1px green dashed}}.syno-sds-image-selector .thumb .thumb-hover{height:120px;width:120px;display:table-cell;text-align:center;vertical-align:bottom}.syno-sds-image-selector .thumb:hover{background-color:#E6F5FF}.syno-sds-image-selector .thumb span{display:block;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap;height:24px;margin-top:4px;line-height:24px;font-size:12px;max-width:120px}.sds-notify-badge-num{background-image:url("../images/dsm5_notification_num.png");width:19px;height:14px;overflow:hidden;cursor:pointer;pointer-events:none}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-notify-badge-num{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/dsm5_notification_num.png");background-size:19px 1400px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-notify-badge-num{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/dsm5_notification_num.png");background-size:19px 1400px;outline:1px green dashed}}.sds-application-notify-badge-num{background-image:url("../images/dsm5_badge_num.png");width:34px;height:24px;overflow:hidden;z-index:3}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-application-notify-badge-num{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/dsm5_badge_num.png");background-size:34px 2400px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-application-notify-badge-num{background-image:url("../img/synohdpack/images/dsm/resources/css/../images/dsm5_badge_num.png");background-size:34px 2400px;outline:1px green dashed}}.sds-notify-badge-num.badge-fix-position{top:15px !important;left:14px !important}.ext-ie9 .sds-notify-badge-num.badge-fix-position,.ext-ie10 .sds-notify-badge-num.badge-fix-position,.ext-ie11 .sds-notify-badge-num.badge-fix-position{top:7px !important;left:6px !important}.bounce-effect{-webkit-animation:bounce 800ms ease-out;-moz-animation:bounce 800ms ease-out;-o-animation:bounce 800ms ease-out;animation:bounce 800ms ease-out}@-webkit-keyframes bounce{0%,5%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%);opacity:0}15%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}30%{-webkit-transform:translateY(-80%);-moz-transform:translateY(-80%);-ms-transform:translateY(-80%);-o-transform:translateY(-80%);transform:translateY(-80%)}40%,80%,100%{-webkit-transform:translateY(0%);-moz-transform:translateY(0%);-ms-transform:translateY(0%);-o-transform:translateY(0%);transform:translateY(0%)}60%{-webkit-transform:translateY(-30%);-moz-transform:translateY(-30%);-ms-transform:translateY(-30%);-o-transform:translateY(-30%);transform:translateY(-30%)}90%{-webkit-transform:translateY(-10%);-moz-transform:translateY(-10%);-ms-transform:translateY(-10%);-o-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1}}@-o-keyframes bounce{0%,5%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%);opacity:0}15%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}30%{-webkit-transform:translateY(-80%);-moz-transform:translateY(-80%);-ms-transform:translateY(-80%);-o-transform:translateY(-80%);transform:translateY(-80%)}40%,80%,100%{-webkit-transform:translateY(0%);-moz-transform:translateY(0%);-ms-transform:translateY(0%);-o-transform:translateY(0%);transform:translateY(0%)}60%{-webkit-transform:translateY(-30%);-moz-transform:translateY(-30%);-ms-transform:translateY(-30%);-o-transform:translateY(-30%);transform:translateY(-30%)}90%{-webkit-transform:translateY(-10%);-moz-transform:translateY(-10%);-ms-transform:translateY(-10%);-o-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1}}@-moz-keyframes bounce{0%,5%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%);opacity:0}15%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}30%{-webkit-transform:translateY(-80%);-moz-transform:translateY(-80%);-ms-transform:translateY(-80%);-o-transform:translateY(-80%);transform:translateY(-80%)}40%,80%,100%{-webkit-transform:translateY(0%);-moz-transform:translateY(0%);-ms-transform:translateY(0%);-o-transform:translateY(0%);transform:translateY(0%)}60%{-webkit-transform:translateY(-30%);-moz-transform:translateY(-30%);-ms-transform:translateY(-30%);-o-transform:translateY(-30%);transform:translateY(-30%)}90%{-webkit-transform:translateY(-10%);-moz-transform:translateY(-10%);-ms-transform:translateY(-10%);-o-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1}}@keyframes bounce{0%,5%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%);opacity:0}15%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}30%{-webkit-transform:translateY(-80%);-moz-transform:translateY(-80%);-ms-transform:translateY(-80%);-o-transform:translateY(-80%);transform:translateY(-80%)}40%,80%,100%{-webkit-transform:translateY(0%);-moz-transform:translateY(0%);-ms-transform:translateY(0%);-o-transform:translateY(0%);transform:translateY(0%)}60%{-webkit-transform:translateY(-30%);-moz-transform:translateY(-30%);-ms-transform:translateY(-30%);-o-transform:translateY(-30%);transform:translateY(-30%)}90%{-webkit-transform:translateY(-10%);-moz-transform:translateY(-10%);-ms-transform:translateY(-10%);-o-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1}}#sds-weather-info{position:absolute;width:280px;height:330px;padding-left:20px;padding-top:8px;color:#FFFFFF;text-shadow:0px 1px 2px rgba(0,0,0,0.8)}#sds-weather-info .weather-temp{width:56px;height:24px;font-size:16px;font-weight:bold;font-family:"Roboto",verdana,tahoma,arial,helvetica,sans-serif;line-height:24px;padding-top:56px;padding-left:24px;float:left;cursor:pointer}#sds-weather-info .weather-icon{width:200px;height:200px;padding:0px;float:left}#sds-weather-info .weather-icon.thunder{background-image:url("../images/login/weather/login_icon_weather_thunder.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.thunder{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_thunder.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.thunder{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_thunder.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.rain{background-image:url("../images/login/weather/login_icon_weather_rain.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.rain{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_rain.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.rain{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_rain.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.snow{background-image:url("../images/login/weather/login_icon_weather_snow.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.snow{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_snow.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.snow{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_snow.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.fog{background-image:url("../images/login/weather/login_icon_weather_fog.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.fog{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_fog.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.fog{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_fog.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.sun{background-image:url("../images/login/weather/login_icon_weather_sun.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.sun{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.sun{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.moon{background-image:url("../images/login/weather/login_icon_weather_moon.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.moon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.moon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.sun_clouds{background-image:url("../images/login/weather/login_icon_weather_sun_clouds.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.sun_clouds{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun_clouds.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.sun_clouds{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun_clouds.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.moon_clouds{background-image:url("../images/login/weather/login_icon_weather_moon_clouds.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.moon_clouds{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon_clouds.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.moon_clouds{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon_clouds.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.cloudy{background-image:url("../images/login/weather/login_icon_weather_cloudy.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.cloudy{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cloudy.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.cloudy{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cloudy.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.tornado{background-image:url("../images/login/weather/login_icon_weather_tornado.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.tornado{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_tornado.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.tornado{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_tornado.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.cold{background-image:url("../images/login/weather/login_icon_weather_cold.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.cold{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cold.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.cold{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cold.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.windy{background-image:url("../images/login/weather/login_icon_weather_windy.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.windy{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_windy.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.windy{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_windy.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .weather-icon.hail{background-image:url("../images/login/weather/login_icon_weather_hail.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-weather-info .weather-icon.hail{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_hail.png");background-size:200px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-weather-info .weather-icon.hail{background-image:url("../img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_hail.png");background-size:200px;outline:1px green dashed}}#sds-weather-info .current-time{width:280px;height:80px;text-align:center;font-size:90px;line-height:70px;font-family:"Roboto",verdana,tahoma,arial,helvetica,sans-serif;padding-top:0px;padding-bottom:9px;float:left;border-bottom:solid 1px #FFFFFF;cursor:pointer}#sds-weather-info .current-time .time-tag{font-size:24px;padding-left:10px}#sds-weather-info .current-date{width:280px;height:21px;padding:9px 0px;font-size:15px;font-weight:bold;line-height:21px;font-family:verdana;text-align:center;float:left;border-top:solid 1px #000000}#sds-login{position:absolute;width:100%;height:100%;overflow:hidden;z-index:20000}#sds-login-bgimg{position:absolute;z-index:-1}#sds-login-cuslogo-wrapper{position:absolute;margin:20px 330px;overflow:hidden}#sds-login-background,#sds-steup-otp-background{position:absolute}#edit-otp-dialog,.enforce-wizard-err-message-dialog,.x-tip-invalid{z-index:2147483647 !important}#sds-login-dialog{position:absolute}#sds-login-dialog-form .x-form-text{height:24px;font-size:20px;line-height:20px;border-width:0px;color:#F3F3F3;background-image:none;background-color:transparent}.ext-ie8m .sds-login-light #sds-login-dialog-form .x-form-text{background-color:#FFFFFF;color:#000000}.ext-ie8m .sds-login-dark #sds-login-dialog-form .x-form-text{background-color:#000000;color:#FFFFFF}.sds-login-light #sds-login-dialog-form .x-form-text{text-shadow:0px 1px 1px rgba(0,0,0,0.7)}#sds-login-dialog-form div.x-panel-body{background-color:transparent;border-width:0px;padding:0px}#sds-login-icon{position:absolute;z-index:20001}#sds-login-dialog-form #login_rememberme{position:absolute;top:-1000000px;left:-1000000px}#x-form-el-login_rememberme{padding-top:8px}.sds-login-light #sds-login-dialog-form .syno-ux-checkbox-label{color:#F3F3F3;text-shadow:0px 1px 1px rgba(0,0,0,0.7)}.sds-login-light #sds-login-dialog-form .syno-ux-checkbox-label.syno-ux-cb-disabled{color:#F3F3F3 !important}.sds-login-dark #sds-login-dialog-form .syno-ux-checkbox-label{color:#888787;text-shadow:0px 1px 0px rgba(0,0,0,0.5)}.sds-login-dark #sds-login-dialog-form .syno-ux-checkbox-label.syno-ux-cb-disabled{color:#888787 !important}.sds-login-dark #sds-login-dialog-form .link,.sds-login-light #sds-login-dialog-form .link{font-size:14px;text-decoration:underline;text-align:right;padding-bottom:0px;padding-top:8px}.sds-login-dark #sds-login-dialog-form .link.appicon-ident,.sds-login-light #sds-login-dialog-form .link.appicon-ident{padding-right:52px}.sds-login-dark #sds-login-dialog-form .link:hover,.sds-login-light #sds-login-dialog-form .link:hover{cursor:pointer;color:#50ecff}.sds-login-dark #sds-login-dialog-form .link:active,.sds-login-light #sds-login-dialog-form .link:active{cursor:pointer;color:#00d6f0}.sds-login-dark #sds-login-dialog-form .link{color:#888787}.sds-login-light #sds-login-dialog-form .link{color:#F3F3F3}#sds-login-dialog-form #login-form{min-height:240px}#sds-login-dialog-form .x-form-item{margin:0px}#login-btn{min-width:120px}#login-btn.syno-ux-button.x-btn em button{font-size:20px;line-height:26px;margin-top:6px;padding-left:30px;padding-right:30px}#login-btn.x-btn.syno-ux-button{border-radius:2px;box-shadow:inset 0px 1px 0px rgba(255,255,255,0.3),0px 1px 0px rgba(0,0,0,0.2)}.sds-login-dark #login-btn.x-btn.syno-ux-button{border-color:#0b6fb6;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwODhlOSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzEzN2NjNiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0088e9), color-stop(100%, #137cc6));background-image:-webkit-linear-gradient(top, #0088e9,#137cc6);background-image:-moz-linear-gradient(top, #0088e9,#137cc6);background-image:-o-linear-gradient(top, #0088e9,#137cc6);background-image:linear-gradient(top, #0088e9,#137cc6)}.sds-login-dark #login-btn.x-btn.syno-ux-button:hover{border-color:#0b5e9a;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwOTBmNyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzE3ODhkOCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0090f7), color-stop(100%, #1788d8));background-image:-webkit-linear-gradient(top, #0090f7,#1788d8);background-image:-moz-linear-gradient(top, #0090f7,#1788d8);background-image:-o-linear-gradient(top, #0090f7,#1788d8);background-image:linear-gradient(top, #0090f7,#1788d8)}.sds-login-dark #login-btn.x-btn.syno-ux-button:active{border-color:#0b5e9a;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwN2NkNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzExNmZiMyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #007cd5), color-stop(100%, #116fb3));background-image:-webkit-linear-gradient(top, #007cd5,#116fb3);background-image:-moz-linear-gradient(top, #007cd5,#116fb3);background-image:-o-linear-gradient(top, #007cd5,#116fb3);background-image:linear-gradient(top, #007cd5,#116fb3)}#sds-login-dialog #sds-login-bkg-highlight{width:336px;min-height:336px;position:absolute}#sds-login-dialog #sds-login-bkg-highlight .highlight-top{width:336px;height:120px;background-image:url("../img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_top.png");background-size:336px 120px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-login-dialog #sds-login-bkg-highlight .highlight-top{background-image:url("../img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_top.png");background-size:336px 120px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-login-dialog #sds-login-bkg-highlight .highlight-top{background-image:url("../img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_top.png");background-size:336px 120px;outline:1px green dashed}}#sds-login-dialog #sds-login-bkg-highlight .highlight-bottom{width:336px;height:94px;background-image:url("../img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_bottom.png");background-size:336px 94px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack #sds-login-dialog #sds-login-bkg-highlight .highlight-bottom{background-image:url("../img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_bottom.png");background-size:336px 94px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug #sds-login-dialog #sds-login-bkg-highlight .highlight-bottom{background-image:url("../img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_bottom.png");background-size:336px 94px;outline:1px green dashed}}#sds-login-dialog-form{width:567px}.sds-login-light .sds-login-dialog-form-table.x-panel{box-shadow:0px 1px 0px rgba(0,0,0,0.2)}.sds-login-dark .sds-login-dialog-form-table.x-panel{box-shadow:0px 1px 0px rgba(0,0,0,0.5)}.sds-login-light .sds-login-dialog-form-table td{height:58px;border-bottom:solid 1px;border-color:#fff;border-color:rgba(255,255,255,0.6);box-shadow:0px 1px 0px rgba(0,0,0,0.2)}.sds-login-dark .sds-login-dialog-form-table td{height:58px;border-bottom:solid 1px;border-color:#fff;border-color:rgba(255,255,255,0.3);box-shadow:0px 1px 0px rgba(0,0,0,0.5)}.sds-login-dialog-form-table td.prefix{width:200px;background-image:none}.sds-login-dialog-form-table td.username-icon,.sds-login-dialog-form-table td.passwd-icon,.sds-login-dialog-form-table td.otp-icon{width:32px;background-repeat:no-repeat;background-position:10px 13px}.sds-login-dialog-form-table td.username-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/icon_user.png");background-size:32px 32px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-login-dialog-form-table td.username-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/icon_user.png");background-size:32px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-login-dialog-form-table td.username-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/icon_user.png");background-size:32px 32px;outline:1px green dashed}}.sds-login-dialog-form-table td.passwd-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/icon_pw.png");background-size:32px 32px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-login-dialog-form-table td.passwd-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/icon_pw.png");background-size:32px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-login-dialog-form-table td.passwd-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/icon_pw.png");background-size:32px 32px;outline:1px green dashed}}.sds-login-dialog-form-table td.otp-icon{background-image:url(../images/login/icon_phone.png)}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-login-dialog-form-table td.otp-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/icon_phone.png");background-size:32px 32px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-login-dialog-form-table td.otp-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/login/icon_phone.png");background-size:32px 32px;outline:1px green dashed}}.sds-login-dialog-form-table td.center{width:240px}#sds-fp-dialog{width:345px;height:333px}#sds-login-dialog{width:336px;min-height:336px;border-radius:3px}.sds-login-light #sds-login-dialog{background-color:#fff;background-color:rgba(255,255,255,0.36);border:solid 1px;border-color:rgba(255,255,255,0.7);box-shadow:0px 2px 4px 1px rgba(0,0,0,0.2)}.sds-login-dark #sds-login-dialog{background-color:#000;background-color:rgba(0,0,0,0.7);border:solid 1px;border-color:#4b4b4b;box-shadow:0px 2px 4px rgba(0,0,0,0.4)}.ext-ie8 #sds-login-dialog,.ext-ie7 #sds-login-dialog{background-color:transparent !important;border:none !important}.ext-ie8 .sds-login-light #sds-login-bkg-highlight,.ext-ie7 .sds-login-light #sds-login-bkg-highlight{background-color:#FFFFFF;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=36);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=36);opacity:0.36;border:solid 1px #FFFFFF}.ext-ie8 .sds-login-dark #sds-login-bkg-highlight,.ext-ie7 .sds-login-dark #sds-login-bkg-highlight{background-color:#000000;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=70);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=70);opacity:0.7;border:solid 1px #4b4b4b}#sds-login-dialog-title{position:absolute;font-weight:bold;line-height:76px;height:76px;width:296px;left:20px;top:1px;color:#F3F3F3;font-size:30px;text-shadow:0px 1px 2px rgba(0,0,0,0.7);overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;white-space:nowrap;text-align:center}.sds-login-light #sds-login-dialog-title{border-bottom:solid 1px;border-color:#fff;border-color:rgba(255,255,255,0.6);box-shadow:0px 1px 0px rgba(0,0,0,0.2)}.sds-login-dark #sds-login-dialog-title{border-bottom:solid 1px;border-color:#fff;border-color:rgba(255,255,255,0.3);box-shadow:0px 1px 0px rgba(0,0,0,0.5)}#sds-login-dialog-status{font-size:14px;padding-top:12px;padding-bottom:0px;line-height:17px}.sds-login-light #sds-login-dialog-status{color:#F3F3F3}.sds-login-dark #sds-login-dialog-status{color:#888787}.sds-login-light #sds-login-dialog-form,.sds-login-dark #sds-login-dialog-form{width:296px;padding:76px 20px 20px 20px}.sds-standalone-main-window .x-window-tl .x-window-header{background-size:24px 24px}.sds-standalone-main-window .x-window-tc .x-panel-icon{height:28px;padding-left:24px !important;padding-top:0;margin-top:3px}.sds-window-v5.sds-standalone-main-window .x-window-tc .x-panel-icon,.sds-standalone-main-window.sds-widget-window .x-window-tc .x-panel-icon{background-position:0 3px}.sds-standalone-main-window .sds-standalone-main-window-header{position:absolute;top:8px;right:4px;height:30px;z-index:2}.sds-window-v5.sds-standalone-main-window .sds-standalone-main-window-header,.sds-standalone-main-window.sds-widget-window .sds-standalone-main-window-header{top:7px}.sds-standalone-main-window .sds-standalone-main-window-header-text{margin-top:7px;margin-left:7px;margin-right:31px;overflow:hidden}.sds-window-v5.sds-standalone-main-window .sds-standalone-main-window-header-text,.sds-standalone-main-window.sds-widget-window .sds-standalone-main-window-header-text{margin-top:3px}.sds-window-v5.sds-standalone-main-window .sds-standalone-main-window-header .sds-standalone-welcome-text,.sds-standalone-main-window.sds-widget-window .sds-standalone-main-window-header .sds-standalone-welcome-text{margin-right:16px}.sds-window-v5.sds-standalone-main-window .sds-standalone-main-window-header .sds-standalone-welcome-text:hover,.sds-standalone-main-window.sds-widget-window .sds-standalone-main-window-header .sds-standalone-welcome-text:hover{color:#0086e5}.sds-window-v5.sds-standalone-main-window .x-window-header-text,.sds-standalone-main-window.sds-widget-window .x-window-header-text{cursor:default;font-size:16px}.sds-standalone-main-window .sds-standalone-main-window-header .sds-standalone-welcome-text{margin-right:14px;font-size:12px;color:#282828}.sds-standalone-main-window .x-window-header-text{cursor:default;font-size:16px}.sds-window.sds-standalone-main-window .x-window-header-text{color:#282828}.sds-standalone-main-window .sds-standalone-logout.syno-ux-button,.sds-standalone-main-window .sds-standalone-help.syno-ux-button{border-color:transparent;background-color:transparent;background-image:none}.sds-standalone-main-window .sds-standalone-logout.syno-ux-button em button,.sds-standalone-main-window .sds-standalone-help.syno-ux-button em button{padding-left:16px;padding-right:7px;margin-left:7px;background-repeat:no-repeat;background-position-y:center;color:#282828}.sds-standalone-main-window .sds-standalone-logout.syno-ux-button.x-btn-over,.sds-standalone-main-window .sds-standalone-logout.syno-ux-button.x-btn-click,.sds-standalone-main-window .sds-standalone-help.syno-ux-button.x-btn-over,.sds-standalone-main-window .sds-standalone-help.syno-ux-button.x-btn-click{border-color:#969a9f;border-width:1px;color:#282828}.sds-standalone-main-window .sds-standalone-logout.syno-ux-button em button.sds-standalone-help-icon,.sds-standalone-main-window .sds-standalone-help.syno-ux-button em button.sds-standalone-help-icon{background-image:url(../images/ico_help.png) !important}.sds-standalone-main-window .sds-standalone-logout.syno-ux-button em button.sds-standalone-logout-icon,.sds-standalone-main-window .sds-standalone-help.syno-ux-button em button.sds-standalone-logout-icon{background-image:url(../images/ico_logout.png) !important}.sds-window-v5.sds-standalone-main-window .sds-standalone-help.syno-ux-button,.sds-standalone-main-window.sds-widget-window .sds-standalone-help.syno-ux-button{margin-right:12px !important;height:24px;width:24px;border:none;background-color:transparent;background-image:none}.sds-window-v5.sds-standalone-main-window .sds-standalone-help.syno-ux-button em button.sds-standalone-help-icon,.sds-standalone-main-window.sds-widget-window .sds-standalone-help.syno-ux-button em button.sds-standalone-help-icon{background-image:url("../images/rt_button.png") !important;background-position:0 -384px;width:auto;background-repeat:no-repeat;padding-left:24px}.sds-window-v5.sds-standalone-main-window .sds-standalone-help.syno-ux-button.x-btn-over em button,.sds-standalone-main-window.sds-widget-window .sds-standalone-help.syno-ux-button.x-btn-over em button{color:#1ca600}.sds-window-v5.sds-standalone-main-window .sds-standalone-help.syno-ux-button.x-btn-over em button.sds-standalone-help-icon,.sds-standalone-main-window.sds-widget-window .sds-standalone-help.syno-ux-button.x-btn-over em button.sds-standalone-help-icon{background-position:0 -408px}.sds-window-v5.sds-standalone-main-window .sds-standalone-help.syno-ux-button.x-btn-click em button,.sds-standalone-main-window.sds-widget-window .sds-standalone-help.syno-ux-button.x-btn-click em button{color:#1ca600}.sds-window-v5.sds-standalone-main-window .sds-standalone-help.syno-ux-button.x-btn-click em button.sds-standalone-help-icon,.sds-standalone-main-window.sds-widget-window .sds-standalone-help.syno-ux-button.x-btn-click em button.sds-standalone-help-icon{background-position:0 -432px}.sds-window-v5.sds-standalone-main-window .x-toolbar-cell .sds-standalone-logout.x-btn,.sds-standalone-main-window.sds-widget-window .x-toolbar-cell .sds-standalone-logout.x-btn{background-image:none;background-color:transparent;border:none;margin-right:0px !important}.sds-window-v5.sds-standalone-main-window .x-toolbar-cell .sds-standalone-logout.x-btn .sds-standalone-logout-icon,.sds-standalone-main-window.sds-widget-window .x-toolbar-cell .sds-standalone-logout.x-btn .sds-standalone-logout-icon{background-image:url("../images/rt_button.png") !important;padding-left:26px;background-position:0 -672px;background-repeat:no-repeat}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .sds-window-v5.sds-standalone-main-window .x-toolbar-cell .sds-standalone-logout.x-btn .sds-standalone-logout-icon,.synohdpack .sds-standalone-main-window.sds-widget-window .x-toolbar-cell .sds-standalone-logout.x-btn .sds-standalone-logout-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/rt_button.png");background-size:"24px" "24px"}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .sds-window-v5.sds-standalone-main-window .x-toolbar-cell .sds-standalone-logout.x-btn .sds-standalone-logout-icon,.synohdpackdebug .sds-standalone-main-window.sds-widget-window .x-toolbar-cell .sds-standalone-logout.x-btn .sds-standalone-logout-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/../images/rt_button.png");background-size:"24px" "24px";outline:1px green dashed}}.sds-window-v5.sds-standalone-main-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-btn-over .sds-standalone-logout-icon,.sds-standalone-main-window.sds-widget-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-btn-over .sds-standalone-logout-icon,.sds-window-v5.sds-standalone-main-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-btn-click .sds-standalone-logout-icon,.sds-standalone-main-window.sds-widget-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-btn-click .sds-standalone-logout-icon{background-position:0 -696px;color:#0086e5}.sds-window-v5.sds-standalone-main-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-item-disabled .sds-standalone-logout-icon,.sds-standalone-main-window.sds-widget-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-item-disabled .sds-standalone-logout-icon{background-position:0 -720px}.sds-window-v5.sds-standalone-main-window .sds-standalone-main-window-header-toolbar em button,.sds-standalone-main-window.sds-widget-window .sds-standalone-main-window-header-toolbar em button{height:24px;line-height:24px}.syno-sds-shortcut-zone-wrapper{position:absolute;overflow:visible;z-index:-1}.syno-sds-shortcut-zone-wrapper.on-instruction{background-color:#fff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$ieOpacity)";filter:alpha(opacity=25);filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=25);opacity:0.25;z-index:2 !important}.syno-sds-shortcut-zone-wrapper.on-dropped{z-index:2 !important}.syno-sds-appview.on-mouse-drag .syno-sds-shortcut-zone-wrapper{z-index:2 !important}.syno-sds-shortcut-zone .add-icon{visibility:hidden;position:absolute;width:80px;height:64px;background:url(../images/desktop/add_one.png) no-repeat}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-sds-shortcut-zone .add-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/desktop/add_one.png");background-size:80px 64px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-sds-shortcut-zone .add-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/desktop/add_one.png");background-size:80px 64px;outline:1px green dashed}}.classical .syno-sds-shortcut-zone-wrapper{left:0px}.classical.syno-sds-appview.on-mouse-drag .syno-sds-shortcut-zone-wrapper{z-index:0 !important}.appview-icon-dragging-proxy .sds-application-notify-badge-num{display:none}.appview-icon-dragging-proxy .x-dd-drag-ghost{border:none !important;background-color:transparent !important;opacity:1 !important;filter:none !important}.appview-icon-dragging-proxy .x-dd-drag-ghost .text{visibility:hidden !important}.appview-icon-dragging-proxy .image{white-space:normal}.appview-icon-dragging-proxy.x-dd-drag-proxy{background-color:transparent;border:none;padding:0px;box-shadow:none}.appview-icon-dragging-proxy .x-dd-drop-icon{width:36px;height:36px;top:40px;left:46px;background-position:center}.appview-icon-dragging-proxy.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url(../images/icon_drag_add.png)}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .appview-icon-dragging-proxy.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/icon_drag_add.png");background-size:36px 36px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .appview-icon-dragging-proxy.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/icon_drag_add.png");background-size:36px 36px;outline:1px green dashed}}.appview-icon-dragging-proxy.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url(../images/icon_drag_ban.png)}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .appview-icon-dragging-proxy.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/icon_drag_ban.png");background-size:36px 36px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .appview-icon-dragging-proxy.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url("../img/synohdpack/images/dsm/resources/images/icon_drag_ban.png");background-size:36px 36px;outline:1px green dashed}}.classical.appview-icon-dragging-proxy.x-dd-drop-ok-add .x-dd-drop-icon,.classical.appview-icon-dragging-proxy.x-dd-drop-nodrop .x-dd-drop-icon{width:48px;height:48px;top:16px;left:22px;background-position:center}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local("Roboto Regular"),local("Roboto-Regular"),url(../fonts/roboto.woff) format("woff")}.sds-search-result .x-combo-list-hd,.sds-search-result .section{color:#0086e5}.sds-window-v5.sds-standalone-main-window .sds-standalone-main-window-header .sds-standalone-welcome-text,.sds-standalone-main-window.sds-widget-window .sds-standalone-main-window-header .sds-standalone-welcome-text{margin-right:16px}.sds-window-v5.sds-standalone-main-window .sds-standalone-main-window-header .sds-standalone-welcome-text:hover,.sds-standalone-main-window.sds-widget-window .sds-standalone-main-window-header .sds-standalone-welcome-text:hover{color:#0086e5}.sds-window-v5.sds-standalone-main-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-btn-over .sds-standalone-logout-icon,.sds-standalone-main-window.sds-widget-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-btn-over .sds-standalone-logout-icon,.sds-window-v5.sds-standalone-main-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-btn-click .sds-standalone-logout-icon,.sds-standalone-main-window.sds-widget-window .x-toolbar-cell .sds-standalone-logout.x-btn.x-btn-click .sds-standalone-logout-icon{color:#0086e5}.sds-user-menu .sds-user-menu-options-click .x-menu-item-text,.sds-user-menu .sds-user-menu-restart-click .x-menu-item-text,.sds-user-menu .sds-user-menu-shutdown-click .x-menu-item-text,.sds-user-menu .sds-user-menu-logout-click .x-menu-item-text{color:#0086e5}.sds-overflow-menu .sds-overflow-items-click .x-menu-item-text{color:#0086e5}.sds-tray-msg-window .x-plain-tl .x-plain-header{color:#0086e5}.sds-searchbox .sds-search-result .section{color:#0086e5}.sds-window-v5 .x-window-mc,.sds-widget-window .x-window-mc{background-color:#fff}.sds-window-v5 .x-window-tl,.sds-widget-window .x-window-tl{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Q4ZWNmYiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d8ecfb), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(#d8ecfb,#ffffff);background-image:-moz-linear-gradient(#d8ecfb,#ffffff);background-image:-o-linear-gradient(#d8ecfb,#ffffff);background-image:linear-gradient(#d8ecfb,#ffffff);background-color:#fff;border-top:3px solid #0086e5}.sds-window-v5.deactive-win .x-window-tl,.deactive-win.sds-widget-window .x-window-tl{background-image:linear-gradient(#e6ebf0,#ffffff)}.sds-window-v5 .x-window-header-text,.sds-widget-window .x-window-header-text{color:#0086e5}.sds-window-v5 .x-window-body,.sds-widget-window .x-window-body{background-color:#fff}.sds-window-v5 .x-window-bl,.sds-widget-window .x-window-bl{background-color:#fff}.sds-window-v5 .x-window-tbar .x-toolbar,.sds-widget-window .x-window-tbar .x-toolbar{background-color:#fff}.sds-window-v5 .x-progress-bar,.sds-widget-window .x-progress-bar{background-color:#0086e5}.sds-window-v5 .ext-el-mask,.sds-widget-window .ext-el-mask{background-color:#fff}.sds-window-v5 .ext-el-mask-msg,.sds-widget-window .ext-el-mask-msg{background-color:#fff}.sds-window-v5 .ext-el-mask-msg div,.sds-widget-window .ext-el-mask-msg div{background-color:#fff}.syno-sds-fs-thumbnailsView .thumb-wrap{float:left;padding:0px;margin:0px 16px 8px 16px;-moz-transition-property:margin;-moz-transition-timing-function:ease-out;-moz-transition-duration:218ms;-webkit-transition-property:margin;-webkit-transition-timing-function:ease-out;-webkit-transition-duration:218ms;-o-transition-property:margin;-o-transition-timing-function:ease-out;-o-transition-duration:218ms;transition-timing-function:ease-out;transition-duration:218ms;transition-property:margin}#sds-desktop li.launch-icon .text,#sds-desktop li.launch-icon .text a{text-shadow:0.1em 0.1em 0.1em #000000;filter:Shadow(Color=#000, Direction=135, Strength=1)} diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/css/ext-all.css b/salt/idh/skins/http/opencanary/nasLogin/static/css/ext-all.css new file mode 100644 index 000000000..2fd3718f4 --- /dev/null +++ b/salt/idh/skins/http/opencanary/nasLogin/static/css/ext-all.css @@ -0,0 +1 @@ +html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';}.ext-forced-border-box,.ext-forced-border-box *{-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;}.ext-el-mask{z-index:100;position:absolute;top:0;left:0;-moz-opacity:.5;opacity:.50;filter:alpha(opacity=50);width:100%;height:100%;zoom:1;}.ext-el-mask-msg{z-index:20001;position:absolute;top:0;left:0;border:1px solid;background:repeat-x 0 -16px;padding:2px;}.ext-el-mask-msg div{padding:5px 10px 5px 10px;border:1px solid;cursor:wait;}.ext-shim{position:absolute;visibility:hidden;left:0;top:0;overflow:hidden;}.ext-ie .ext-shim{filter:alpha(opacity=0);}.ext-ie6 .ext-shim{margin-left:5px;margin-top:3px;}.x-mask-loading div{padding:5px 10px 5px 25px;background:no-repeat 5px 5px;line-height:16px;}.x-hidden,.x-hide-offsets{position:absolute!important;left:-10000px;top:-10000px;visibility:hidden;}.x-hide-display{display:none!important;}.x-hide-nosize,.x-hide-nosize *{height:0!important;width:0!important;visibility:hidden!important;border:none!important;zoom:1;}.x-hide-visibility{visibility:hidden!important;}.x-masked{overflow:hidden!important;}.x-masked-relative{position:relative!important;}.x-masked select,.x-masked object,.x-masked embed{visibility:hidden;}.x-layer{visibility:hidden;}.x-unselectable,.x-unselectable *{user-select:none;-o-user-select:none;-ms-user-select:none;-moz-user-select:-moz-none;-webkit-user-select:none;}.x-repaint{zoom:1;background-color:transparent;-moz-outline:0;outline:0;}.x-item-disabled{cursor:default;opacity:.6;-moz-opacity:.6;filter:alpha(opacity=60);}.x-item-disabled *{cursor:default!important;}.x-form-radio-group .x-item-disabled{filter:none;}.x-splitbar-proxy{position:absolute;visibility:hidden;z-index:20001;zoom:1;line-height:1px;font-size:1px;overflow:hidden;}.x-splitbar-h,.x-splitbar-proxy-h{cursor:e-resize;cursor:col-resize;}.x-splitbar-v,.x-splitbar-proxy-v{cursor:s-resize;cursor:row-resize;}.x-color-palette{width:150px;height:92px;cursor:pointer;}.x-color-palette a{border:1px solid;float:left;padding:2px;text-decoration:none;-moz-outline:0 none;outline:0 none;cursor:pointer;}.x-color-palette a:hover,.x-color-palette a.x-color-palette-sel{border:1px solid;}.x-color-palette em{display:block;border:1px solid;}.x-color-palette em span{cursor:pointer;display:block;height:10px;line-height:10px;width:10px;}.x-ie-shadow{display:none;position:absolute;overflow:hidden;left:0;top:0;zoom:1;}.x-shadow{display:none;position:absolute;overflow:hidden;left:0;top:0;}.x-shadow *{overflow:hidden;}.x-shadow *{padding:0;border:0;margin:0;clear:none;zoom:1;}.x-shadow .xstc,.x-shadow .xsbc{height:6px;float:left;}.x-shadow .xstl,.x-shadow .xstr,.x-shadow .xsbl,.x-shadow .xsbr{width:6px;height:6px;float:left;}.x-shadow .xsc{width:100%;}.x-shadow .xsml,.x-shadow .xsmr{width:6px;float:left;height:100%;}.x-shadow .xsmc{float:left;height:100%;background-color:transparent;}.x-shadow .xst,.x-shadow .xsb{height:6px;overflow:hidden;width:100%;}.x-shadow .xsml{background:transparent repeat-y 0 0;}.x-shadow .xsmr{background:transparent repeat-y -6px 0;}.x-shadow .xstl{background:transparent no-repeat 0 0;}.x-shadow .xstc{background:transparent repeat-x 0 -30px;}.x-shadow .xstr{background:transparent repeat-x 0 -18px;}.x-shadow .xsbl{background:transparent no-repeat 0 -12px;}.x-shadow .xsbc{background:transparent repeat-x 0 -36px;}.x-shadow .xsbr{background:transparent repeat-x 0 -6px;}.loading-indicator{background:no-repeat left;padding-left:20px;line-height:16px;margin:3px;}.x-text-resize{position:absolute;left:-1000px;top:-1000px;visibility:hidden;zoom:1;}.x-drag-overlay{width:100%;height:100%;display:none;position:absolute;left:0;top:0;background-image:url(../images/default/s.gif);z-index:20000;}.x-clear{clear:both;height:0;overflow:hidden;line-height:0;font-size:0;}.x-spotlight{z-index:8999;position:absolute;top:0;left:0;-moz-opacity:.5;opacity:.50;filter:alpha(opacity=50);width:0;height:0;zoom:1;}#x-history-frame{position:absolute;top:-1px;left:0;width:1px;height:1px;visibility:hidden;}#x-history-field{position:absolute;top:0;left:-1px;width:1px;height:1px;visibility:hidden;}.x-resizable-handle{position:absolute;z-index:100;font-size:1px;line-height:6px;overflow:hidden;filter:alpha(opacity=0);opacity:0;zoom:1;}.x-resizable-handle-east{width:6px;cursor:e-resize;right:0;top:0;height:100%;}.ext-ie .x-resizable-handle-east{margin-right:-1px;}.x-resizable-handle-south{width:100%;cursor:s-resize;left:0;bottom:0;height:6px;}.ext-ie .x-resizable-handle-south{margin-bottom:-1px;}.x-resizable-handle-west{width:6px;cursor:w-resize;left:0;top:0;height:100%;}.x-resizable-handle-north{width:100%;cursor:n-resize;left:0;top:0;height:6px;}.x-resizable-handle-southeast{width:6px;cursor:se-resize;right:0;bottom:0;height:6px;z-index:101;}.x-resizable-handle-northwest{width:6px;cursor:nw-resize;left:0;top:0;height:6px;z-index:101;}.x-resizable-handle-northeast{width:6px;cursor:ne-resize;right:0;top:0;height:6px;z-index:101;}.x-resizable-handle-southwest{width:6px;cursor:sw-resize;left:0;bottom:0;height:6px;z-index:101;}.x-resizable-over .x-resizable-handle,.x-resizable-pinned .x-resizable-handle{filter:alpha(opacity=100);opacity:1;}.x-resizable-over .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-east,.x-resizable-over .x-resizable-handle-west,.x-resizable-pinned .x-resizable-handle-west{background-position:left;}.x-resizable-over .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-south,.x-resizable-over .x-resizable-handle-north,.x-resizable-pinned .x-resizable-handle-north{background-position:top;}.x-resizable-over .x-resizable-handle-southeast,.x-resizable-pinned .x-resizable-handle-southeast{background-position:top left;}.x-resizable-over .x-resizable-handle-northwest,.x-resizable-pinned .x-resizable-handle-northwest{background-position:bottom right;}.x-resizable-over .x-resizable-handle-northeast,.x-resizable-pinned .x-resizable-handle-northeast{background-position:bottom left;}.x-resizable-over .x-resizable-handle-southwest,.x-resizable-pinned .x-resizable-handle-southwest{background-position:top right;}.x-resizable-proxy{border:1px dashed;position:absolute;overflow:hidden;display:none;left:0;top:0;z-index:50000;}.x-resizable-overlay{width:100%;height:100%;display:none;position:absolute;left:0;top:0;z-index:200000;-moz-opacity:0;opacity:0;filter:alpha(opacity=0);}.x-tab-panel{overflow:hidden;}.x-tab-panel-header,.x-tab-panel-footer{border:1px solid;overflow:hidden;zoom:1;}.x-tab-panel-header{border:1px solid;padding-bottom:2px;}.x-tab-panel-footer{border:1px solid;padding-top:2px;}.x-tab-strip-wrap{width:100%;overflow:hidden;position:relative;zoom:1;}ul.x-tab-strip{display:block;width:5000px;zoom:1;}ul.x-tab-strip-top{padding-top:1px;background:repeat-x bottom;border-bottom:1px solid;}ul.x-tab-strip-bottom{padding-bottom:1px;background:repeat-x top;border-top:1px solid;border-bottom:0 none;}.x-tab-panel-header-plain .x-tab-strip-top{background:transparent!important;padding-top:0!important;}.x-tab-panel-header-plain{background:transparent!important;border-width:0!important;padding-bottom:0!important;}.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer{border:1px solid;height:2px;font-size:1px;line-height:1px;}.x-tab-panel-header-plain .x-tab-strip-spacer{border-top:0 none;}.x-tab-panel-footer-plain .x-tab-strip-spacer{border-bottom:0 none;}.x-tab-panel-footer-plain .x-tab-strip-bottom{background:transparent!important;padding-bottom:0!important;}.x-tab-panel-footer-plain{background:transparent!important;border-width:0!important;padding-top:0!important;}.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer,.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer{height:3px;}ul.x-tab-strip li{float:left;margin-left:2px;}ul.x-tab-strip li.x-tab-edge{float:left;margin:0!important;padding:0!important;border:0 none!important;font-size:1px!important;line-height:1px!important;overflow:hidden;zoom:1;background:transparent!important;width:1px;}.x-tab-strip a,.x-tab-strip span,.x-tab-strip em{display:block;}.x-tab-strip a{text-decoration:none!important;-moz-outline:0;outline:0;cursor:pointer;}.x-tab-strip-inner{overflow:hidden;text-overflow:ellipsis;}.x-tab-strip span.x-tab-strip-text{white-space:nowrap;cursor:pointer;padding:4px 0;}.x-tab-strip-top .x-tab-with-icon .x-tab-right{padding-left:6px;}.x-tab-strip .x-tab-with-icon span.x-tab-strip-text{padding-left:20px;background-position:0 3px;background-repeat:no-repeat;}.x-tab-strip-active,.x-tab-strip-active a.x-tab-right{cursor:default;}.x-tab-strip-active span.x-tab-strip-text{cursor:default;}.x-tab-strip-disabled .x-tabs-text{cursor:default;}.x-tab-panel-body{overflow:hidden;}.x-tab-panel-bwrap{overflow:hidden;}.ext-ie .x-tab-strip .x-tab-right{position:relative;}.x-tab-strip-top .x-tab-strip-active .x-tab-right{margin-bottom:-1px;}.ext-ie8 .x-tab-strip li{position:relative;}.ext-border-box .ext-ie8 .x-tab-strip-top .x-tab-right,.ext-border-box .ext-ie9 .x-tab-strip-top .x-tab-right{top:1px;}.ext-ie8 .x-tab-strip-top,.ext-ie9 .x-tab-strip-top{padding-top:1px;}.ext-border-box .ext-ie8 .x-tab-strip-top,.ext-border-box .ext-ie9 .x-tab-strip-top{padding-top:0;}.ext-ie8 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close,.ext-ie9 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close{top:3px;}.ext-border-box .ext-ie8 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close,.ext-border-box .ext-ie9 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close{top:4px;}.ext-ie8 .x-tab-strip-bottom .x-tab-right,.ext-ie9 .x-tab-strip-bottom .x-tab-right{top:0;}.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text{padding-bottom:5px;}.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{margin-top:-1px;}.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text{padding-top:5px;}.x-tab-strip-top .x-tab-right{background:transparent no-repeat 0 -51px;padding-left:10px;}.x-tab-strip-top .x-tab-left{background:transparent no-repeat right -351px;padding-right:10px;}.x-tab-strip-top .x-tab-strip-inner{background:transparent repeat-x 0 -201px;}.x-tab-strip-top .x-tab-strip-over .x-tab-right{background-position:0 -101px;}.x-tab-strip-top .x-tab-strip-over .x-tab-left{background-position:right -401px;}.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner{background-position:0 -251px;}.x-tab-strip-top .x-tab-strip-active .x-tab-right{background-position:0 0;}.x-tab-strip-top .x-tab-strip-active .x-tab-left{background-position:right -301px;}.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner{background-position:0 -151px;}.x-tab-strip-bottom .x-tab-right{background:no-repeat bottom right;}.x-tab-strip-bottom .x-tab-left{background:no-repeat bottom left;}.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{background:no-repeat bottom right;}.x-tab-strip-bottom .x-tab-strip-active .x-tab-left{background:no-repeat bottom left;}.x-tab-strip-bottom .x-tab-left{margin-right:3px;padding:0 10px;}.x-tab-strip-bottom .x-tab-right{padding:0;}.x-tab-strip .x-tab-strip-close{display:none;}.x-tab-strip-closable{position:relative;}.x-tab-strip-closable .x-tab-left{padding-right:19px;}.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close{opacity:.6;-moz-opacity:.6;background-repeat:no-repeat;display:block;width:11px;height:11px;position:absolute;top:3px;right:3px;cursor:pointer;z-index:2;}.x-tab-strip .x-tab-strip-active a.x-tab-strip-close{opacity:.8;-moz-opacity:.8;}.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{opacity:1;-moz-opacity:1;}.x-tab-panel-body{border:1px solid;}.x-tab-panel-body-top{border-top:0 none;}.x-tab-panel-body-bottom{border-bottom:0 none;}.x-tab-scroller-left{background:transparent no-repeat -18px 0;border-bottom:1px solid;width:18px;position:absolute;left:0;top:0;z-index:10;cursor:pointer;}.x-tab-scroller-left-over{background-position:0 0;}.x-tab-scroller-left-disabled{background-position:-18px 0;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);cursor:default;}.x-tab-scroller-right{background:transparent no-repeat 0 0;border-bottom:1px solid;width:18px;position:absolute;right:0;top:0;z-index:10;cursor:pointer;}.x-tab-scroller-right-over{background-position:-18px 0;}.x-tab-scroller-right-disabled{background-position:0 0;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);cursor:default;}.x-tab-scrolling-bottom .x-tab-scroller-left,.x-tab-scrolling-bottom .x-tab-scroller-right{margin-top:1px;}.x-tab-scrolling .x-tab-strip-wrap{margin-left:18px;margin-right:18px;}.x-tab-scrolling{position:relative;}.x-tab-panel-bbar .x-toolbar{border:1px solid;border-top:0 none;overflow:hidden;padding:2px;}.x-tab-panel-tbar .x-toolbar{border:1px solid;border-top:0 none;overflow:hidden;padding:2px;}.x-form-field{margin:0;}.ext-webkit *:focus{outline:none!important;}.x-form-text,textarea.x-form-field{padding:1px 3px;background:repeat-x 0 0;border:1px solid;}textarea.x-form-field{padding:2px 3px;}.x-form-text,.ext-ie .x-form-file{height:22px;line-height:18px;vertical-align:middle;}.ext-ie6 .x-form-text,.ext-ie7 .x-form-text{margin:-1px 0;height:22px;line-height:18px;}.x-quirks .ext-ie9 .x-form-text{height:22px;padding-top:3px;padding-bottom:0;}.x-quirks .ext-ie9 .x-input-wrapper .x-form-text,.x-quirks .ext-ie9 .x-form-field-trigger-wrap .x-form-text{margin-top:-1px;margin-bottom:-1px;}.x-quirks .ext-ie9 .x-input-wrapper .x-form-element{margin-bottom:-1px;}.ext-ie6 .x-form-field-wrap .x-form-file-btn,.ext-ie7 .x-form-field-wrap .x-form-file-btn{top:-1px;}.ext-ie6 textarea.x-form-field,.ext-ie7 textarea.x-form-field{margin:-1px 0;}.ext-strict .x-form-text{height:18px;}.ext-safari.ext-mac textarea.x-form-field{margin-bottom:-2px;}.ext-gecko .x-form-text,.ext-ie8 .x-form-text{padding-top:2px;padding-bottom:0;}.ext-ie6 .x-form-composite .x-form-text.x-box-item,.ext-ie7 .x-form-composite .x-form-text.x-box-item{margin:0!important;}textarea{resize:none;}.x-form-select-one{height:20px;line-height:18px;vertical-align:middle;border:1px solid;}.x-form-check-wrap{line-height:18px;height:auto;}.ext-ie .x-form-check-wrap input{width:15px;height:15px;}.x-form-check-wrap input{vertical-align:bottom;}.x-editor .x-form-check-wrap{padding:3px;}.x-editor .x-form-checkbox{height:13px;}.x-form-check-group-label{border-bottom:1px solid;margin-bottom:5px;padding-left:3px!important;float:none!important;}.x-form-field-wrap .x-form-trigger{width:17px;height:21px;border:0;background:transparent no-repeat 0 0;cursor:pointer;border-bottom:1px solid;position:absolute;top:0;}.x-form-field-wrap .x-form-date-trigger,.x-form-field-wrap .x-form-clear-trigger,.x-form-field-wrap .x-form-search-trigger{cursor:pointer;}.x-form-field-wrap .x-form-twin-triggers .x-form-trigger{position:static;top:auto;vertical-align:top;}.x-form-field-wrap{position:relative;left:0;top:0;text-align:left;zoom:1;white-space:nowrap;}.ext-strict .ext-ie8 .x-toolbar-cell .x-form-field-trigger-wrap .x-form-trigger{right:0;}.x-form-field-wrap .x-form-trigger-over{background-position:-17px 0;}.x-form-field-wrap .x-form-trigger-click{background-position:-34px 0;}.x-trigger-wrap-focus .x-form-trigger{background-position:-51px 0;}.x-trigger-wrap-focus .x-form-trigger-over{background-position:-68px 0;}.x-trigger-wrap-focus .x-form-trigger-click{background-position:-85px 0;}.x-trigger-wrap-focus .x-form-trigger{border-bottom:1px solid;}.x-item-disabled .x-form-trigger-over{background-position:0 0!important;border-bottom:1px solid;}.x-item-disabled .x-form-trigger-click{background-position:0 0!important;border-bottom:1px solid;}.x-trigger-noedit{cursor:pointer;}.x-form-focus,textarea.x-form-focus{border:1px solid;}.x-form-invalid,textarea.x-form-invalid{background:repeat-x bottom;border:1px solid;}.x-form-inner-invalid,textarea.x-form-inner-invalid{background:repeat-x bottom;}.x-editor{visibility:hidden;padding:0;margin:0;}.x-form-grow-sizer{left:-10000px;padding:8px 3px;position:absolute;visibility:hidden;top:-10000px;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;zoom:1;}.x-form-grow-sizer p{margin:0!important;border:0 none!important;padding:0!important;}.x-form-item{display:block;margin-bottom:4px;zoom:1;}.x-form-item label.x-form-item-label{display:block;float:left;width:100px;padding:3px;padding-left:0;clear:left;z-index:2;position:relative;}.x-form-element{padding-left:105px;position:relative;}.x-form-invalid-msg{padding:2px;padding-left:18px;background:transparent no-repeat 0 2px;line-height:16px;width:200px;}.x-form-label-left label.x-form-item-label{text-align:left;}.x-form-label-right label.x-form-item-label{text-align:right;}.x-form-label-top .x-form-item label.x-form-item-label{width:auto;float:none;clear:none;display:inline;margin-bottom:4px;position:static;}.x-form-label-top .x-form-element{padding-left:0;padding-top:4px;}.x-form-label-top .x-form-item{padding-bottom:4px;}.x-small-editor .x-form-text{height:20px;line-height:16px;vertical-align:middle;}.ext-ie6 .x-small-editor .x-form-text,.ext-ie7 .x-small-editor .x-form-text{margin-top:-1px!important;margin-bottom:-1px!important;height:20px!important;line-height:16px!important;}.ext-strict .x-small-editor .x-form-text{height:16px!important;}.ext-ie6 .x-small-editor .x-form-text,.ext-ie7 .x-small-editor .x-form-text{height:20px;line-height:16px;}.ext-border-box .x-small-editor .x-form-text{height:20px;}.x-small-editor .x-form-select-one{height:20px;line-height:16px;vertical-align:middle;}.x-small-editor .x-form-num-field{text-align:right;}.x-small-editor .x-form-field-wrap .x-form-trigger{height:19px;}.ext-webkit .x-small-editor .x-form-text{padding-top:3px;font-size:100%;}.ext-strict .ext-webkit .x-small-editor .x-form-text{height:14px!important;}.x-form-clear{clear:both;height:0;overflow:hidden;line-height:0;font-size:0;}.x-form-clear-left{clear:left;height:0;overflow:hidden;line-height:0;font-size:0;}.ext-ie6 .x-form-check-wrap input,.ext-border-box .x-form-check-wrap input{margin-top:3px;}.x-form-cb-label{position:relative;margin-left:4px;top:2px;}.ext-ie .x-form-cb-label{top:1px;}.ext-ie6 .x-form-cb-label,.ext-border-box .x-form-cb-label{top:3px;}.x-form-display-field{padding-top:2px;}.ext-gecko .x-form-display-field,.ext-strict .ext-ie7 .x-form-display-field{padding-top:1px;}.ext-ie .x-form-display-field{padding-top:3px;}.ext-strict .ext-ie8 .x-form-display-field{padding-top:0;}.x-form-column{float:left;padding:0;margin:0;width:48%;overflow:hidden;zoom:1;}.x-form .x-form-btns-ct .x-btn{float:right;clear:none;}.x-form .x-form-btns-ct .x-form-btns td{border:0;padding:0;}.x-form .x-form-btns-ct .x-form-btns-right table{float:right;clear:none;}.x-form .x-form-btns-ct .x-form-btns-left table{float:left;clear:none;}.x-form .x-form-btns-ct .x-form-btns-center{text-align:center;}.x-form .x-form-btns-ct .x-form-btns-center table{margin:0 auto;}.x-form .x-form-btns-ct table td.x-form-btn-td{padding:3px;}.x-form .x-form-btns-ct .x-btn-focus .x-btn-left{background-position:0 -147px;}.x-form .x-form-btns-ct .x-btn-focus .x-btn-right{background-position:0 -168px;}.x-form .x-form-btns-ct .x-btn-focus .x-btn-center{background-position:0 -189px;}.x-form .x-form-btns-ct .x-btn-click .x-btn-center{background-position:0 -126px;}.x-form .x-form-btns-ct .x-btn-click .x-btn-right{background-position:0 -84px;}.x-form .x-form-btns-ct .x-btn-click .x-btn-left{background-position:0 -63px;}.x-form-invalid-icon{width:16px;height:18px;visibility:hidden;position:absolute;left:0;top:0;display:block;background:transparent no-repeat 0 2px;}.x-fieldset{border:1px solid;padding:10px;margin-bottom:10px;display:block;}.ext-webkit .x-fieldset-header{padding-top:1px;}.ext-ie .x-fieldset legend{margin-bottom:10px;}.ext-strict .ext-ie9 .x-fieldset legend.x-fieldset-header{padding-top:1px;}.ext-ie .x-fieldset{padding-top:0;padding-bottom:10px;}.x-fieldset legend .x-tool-toggle{margin-right:3px;margin-left:0;float:left!important;}.x-fieldset legend input{margin-right:3px;float:left!important;height:13px;width:13px;}fieldset.x-panel-collapsed{padding-bottom:0!important;border-width:1px 1px 0 1px!important;border-left-color:transparent;border-right-color:transparent;}.ext-ie6 fieldset.x-panel-collapsed{padding-bottom:0!important;border-width:1px 0 0 0!important;margin-left:1px;margin-right:1px;}fieldset.x-panel-collapsed .x-fieldset-bwrap{visibility:hidden;position:absolute;left:-1000px;top:-1000px;}.ext-ie .x-fieldset-bwrap{zoom:1;}.x-fieldset-noborder{border:0 none transparent;}.x-fieldset-noborder legend{margin-left:-3px;}.ext-ie .x-fieldset-noborder legend{position:relative;margin-bottom:23px;}.ext-ie .x-fieldset-noborder legend span{position:absolute;left:16px;}.ext-gecko .x-window-body .x-form-item{-moz-outline:0;outline:0;overflow:auto;}.ext-mac.ext-gecko .x-window-body .x-form-item{overflow:hidden;}.ext-gecko .x-form-item{-moz-outline:0;outline:0;}.x-hide-label label.x-form-item-label{display:none;}.x-hide-label .x-form-element{padding-left:0!important;}.x-form-label-top .x-hide-label label.x-form-item-label{display:none;}.x-fieldset{overflow:hidden;}.x-fieldset-bwrap{overflow:hidden;zoom:1;}.x-fieldset-body{overflow:hidden;}.x-btn{cursor:pointer;white-space:nowrap;}.x-btn button{border:0 none;background-color:transparent;padding-left:3px;padding-right:3px;cursor:pointer;margin:0;overflow:visible;width:auto;-moz-outline:0 none;outline:0 none;}* html .ext-ie .x-btn button{width:1px;}.ext-gecko .x-btn button,.ext-webkit .x-btn button{padding-left:0;padding-right:0;}.ext-gecko .x-btn button::-moz-focus-inner{padding:0;}.ext-ie .x-btn button{padding-top:2px;}.x-btn td{padding:0!important;}.x-btn-text{cursor:pointer;white-space:nowrap;padding:0;}.x-btn-noicon .x-btn-small .x-btn-text{height:16px;}.x-btn-noicon .x-btn-medium .x-btn-text{height:24px;}.x-btn-noicon .x-btn-large .x-btn-text{height:32px;}.x-btn-icon .x-btn-text{background-position:center;background-repeat:no-repeat;}.x-btn-icon .x-btn-small .x-btn-text{height:16px;width:16px;}.x-btn-icon .x-btn-medium .x-btn-text{height:24px;width:24px;}.x-btn-icon .x-btn-large .x-btn-text{height:32px;width:32px;}.x-btn-text-icon .x-btn-icon-small-left .x-btn-text{background-position:0 center;background-repeat:no-repeat;padding-left:18px;height:16px;}.x-btn-text-icon .x-btn-icon-medium-left .x-btn-text{background-position:0 center;background-repeat:no-repeat;padding-left:26px;height:24px;}.x-btn-text-icon .x-btn-icon-large-left .x-btn-text{background-position:0 center;background-repeat:no-repeat;padding-left:34px;height:32px;}.x-btn-text-icon .x-btn-icon-small-top .x-btn-text{background-position:center 0;background-repeat:no-repeat;padding-top:18px;}.x-btn-text-icon .x-btn-icon-medium-top .x-btn-text{background-position:center 0;background-repeat:no-repeat;padding-top:26px;}.x-btn-text-icon .x-btn-icon-large-top .x-btn-text{background-position:center 0;background-repeat:no-repeat;padding-top:34px;}.x-btn-text-icon .x-btn-icon-small-right .x-btn-text{background-position:right center;background-repeat:no-repeat;padding-right:18px;height:16px;}.x-btn-text-icon .x-btn-icon-medium-right .x-btn-text{background-position:right center;background-repeat:no-repeat;padding-right:26px;height:24px;}.x-btn-text-icon .x-btn-icon-large-right .x-btn-text{background-position:right center;background-repeat:no-repeat;padding-right:34px;height:32px;}.x-btn-text-icon .x-btn-icon-small-bottom .x-btn-text{background-position:center bottom;background-repeat:no-repeat;padding-bottom:18px;}.x-btn-text-icon .x-btn-icon-medium-bottom .x-btn-text{background-position:center bottom;background-repeat:no-repeat;padding-bottom:26px;}.x-btn-text-icon .x-btn-icon-large-bottom .x-btn-text{background-position:center bottom;background-repeat:no-repeat;padding-bottom:34px;}.x-btn-tr i,.x-btn-tl i,.x-btn-mr i,.x-btn-ml i,.x-btn-br i,.x-btn-bl i{font-size:1px;line-height:1px;width:3px;display:block;overflow:hidden;}.x-btn-tr i,.x-btn-tl i,.x-btn-br i,.x-btn-bl i{height:3px;}.x-btn-tl{width:3px;height:3px;background:no-repeat 0 0;}.x-btn-tr{width:3px;height:3px;background:no-repeat -3px 0;}.x-btn-tc{height:3px;background:repeat-x 0 -6px;}.x-btn-ml{width:3px;background:no-repeat 0 -24px;}.x-btn-mr{width:3px;background:no-repeat -3px -24px;}.x-btn-mc{background:repeat-x 0 -1096px;vertical-align:middle;text-align:center;padding:0 5px;cursor:pointer;white-space:nowrap;}.ext-strict .ext-ie6 .x-btn-mc,.ext-strict .ext-ie7 .x-btn-mc{height:100%;}.x-btn-bl{width:3px;height:3px;background:no-repeat 0 -3px;}.x-btn-br{width:3px;height:3px;background:no-repeat -3px -3px;}.x-btn-bc{height:3px;background:repeat-x 0 -15px;}.x-btn-over .x-btn-tl{background-position:-6px 0;}.x-btn-over .x-btn-tr{background-position:-9px 0;}.x-btn-over .x-btn-tc{background-position:0 -9px;}.x-btn-over .x-btn-ml{background-position:-6px -24px;}.x-btn-over .x-btn-mr{background-position:-9px -24px;}.x-btn-over .x-btn-mc{background-position:0 -2168px;}.x-btn-over .x-btn-bl{background-position:-6px -3px;}.x-btn-over .x-btn-br{background-position:-9px -3px;}.x-btn-over .x-btn-bc{background-position:0 -18px;}.x-btn-click .x-btn-tl,.x-btn-menu-active .x-btn-tl,.x-btn-pressed .x-btn-tl{background-position:-12px 0;}.x-btn-click .x-btn-tr,.x-btn-menu-active .x-btn-tr,.x-btn-pressed .x-btn-tr{background-position:-15px 0;}.x-btn-click .x-btn-tc,.x-btn-menu-active .x-btn-tc,.x-btn-pressed .x-btn-tc{background-position:0 -12px;}.x-btn-click .x-btn-ml,.x-btn-menu-active .x-btn-ml,.x-btn-pressed .x-btn-ml{background-position:-12px -24px;}.x-btn-click .x-btn-mr,.x-btn-menu-active .x-btn-mr,.x-btn-pressed .x-btn-mr{background-position:-15px -24px;}.x-btn-click .x-btn-mc,.x-btn-menu-active .x-btn-mc,.x-btn-pressed .x-btn-mc{background-position:0 -3240px;}.x-btn-click .x-btn-bl,.x-btn-menu-active .x-btn-bl,.x-btn-pressed .x-btn-bl{background-position:-12px -3px;}.x-btn-click .x-btn-br,.x-btn-menu-active .x-btn-br,.x-btn-pressed .x-btn-br{background-position:-15px -3px;}.x-btn-click .x-btn-bc,.x-btn-menu-active .x-btn-bc,.x-btn-pressed .x-btn-bc{background-position:0 -21px;}.x-btn-disabled *{cursor:default!important;}.x-btn-mc em.x-btn-arrow{display:block;background:transparent no-repeat right center;padding-right:10px;}.x-btn-mc em.x-btn-split{display:block;background:transparent no-repeat right center;padding-right:14px;}.x-btn-mc em.x-btn-arrow-bottom{display:block;background:transparent no-repeat center bottom;padding-bottom:14px;}.x-btn-mc em.x-btn-split-bottom{display:block;background:transparent no-repeat center bottom;padding-bottom:14px;}.x-btn-as-arrow .x-btn-mc em{display:block;background-color:transparent;padding-bottom:14px;}.x-btn-group{padding:1px;}.x-btn-group-header{padding:2px;text-align:center;}.x-btn-group-tc{background:transparent repeat-x 0 0;overflow:hidden;}.x-btn-group-tl{background:transparent no-repeat 0 0;padding-left:3px;zoom:1;}.x-btn-group-tr{background:transparent no-repeat right 0;zoom:1;padding-right:3px;}.x-btn-group-bc{background:transparent repeat-x 0 bottom;zoom:1;}.x-btn-group-bc .x-panel-footer{zoom:1;}.x-btn-group-bl{background:transparent no-repeat 0 bottom;padding-left:3px;zoom:1;}.x-btn-group-br{background:transparent no-repeat right bottom;padding-right:3px;zoom:1;}.x-btn-group-mc{border:0 none;padding:1px 0 0 0;margin:0;}.x-btn-group-mc .x-btn-group-body{background-color:transparent;border:0 none;}.x-btn-group-ml{background:transparent repeat-y 0 0;padding-left:3px;zoom:1;}.x-btn-group-mr{background:transparent repeat-y right 0;padding-right:3px;zoom:1;}.x-btn-group-bc .x-btn-group-footer{padding-bottom:6px;}.x-panel-nofooter .x-btn-group-bc{height:3px;font-size:0;line-height:0;}.x-btn-group-bwrap{overflow:hidden;zoom:1;}.x-btn-group-body{overflow:hidden;zoom:1;}.x-btn-group-notitle .x-btn-group-tc{background:transparent repeat-x 0 0;overflow:hidden;height:2px;}.x-toolbar{border-style:solid;border-width:0 0 1px 0;display:block;padding:2px;background:repeat-x top left;position:relative;left:0;top:0;zoom:1;overflow:hidden;}.x-toolbar-left{width:100%;}.x-toolbar .x-item-disabled .x-btn-icon{opacity:.35;-moz-opacity:.35;filter:alpha(opacity=35);}.x-toolbar td{vertical-align:middle;}.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{white-space:nowrap;}.x-toolbar .x-item-disabled{cursor:default;opacity:.6;-moz-opacity:.6;filter:alpha(opacity=60);}.x-toolbar .x-item-disabled *{cursor:default;}.x-toolbar .x-toolbar-cell{vertical-align:middle;}.x-toolbar .x-btn-tl,.x-toolbar .x-btn-tr,.x-toolbar .x-btn-tc,.x-toolbar .x-btn-ml,.x-toolbar .x-btn-mr,.x-toolbar .x-btn-mc,.x-toolbar .x-btn-bl,.x-toolbar .x-btn-br,.x-toolbar .x-btn-bc{background-position:500px 500px;}.x-toolbar .x-btn-over .x-btn-tl{background-position:-6px 0;}.x-toolbar .x-btn-over .x-btn-tr{background-position:-9px 0;}.x-toolbar .x-btn-over .x-btn-tc{background-position:0 -9px;}.x-toolbar .x-btn-over .x-btn-ml{background-position:-6px -24px;}.x-toolbar .x-btn-over .x-btn-mr{background-position:-9px -24px;}.x-toolbar .x-btn-over .x-btn-mc{background-position:0 -2168px;}.x-toolbar .x-btn-over .x-btn-bl{background-position:-6px -3px;}.x-toolbar .x-btn-over .x-btn-br{background-position:-9px -3px;}.x-toolbar .x-btn-over .x-btn-bc{background-position:0 -18px;}.x-toolbar .x-btn-click .x-btn-tl,.x-toolbar .x-btn-menu-active .x-btn-tl,.x-toolbar .x-btn-pressed .x-btn-tl{background-position:-12px 0;}.x-toolbar .x-btn-click .x-btn-tr,.x-toolbar .x-btn-menu-active .x-btn-tr,.x-toolbar .x-btn-pressed .x-btn-tr{background-position:-15px 0;}.x-toolbar .x-btn-click .x-btn-tc,.x-toolbar .x-btn-menu-active .x-btn-tc,.x-toolbar .x-btn-pressed .x-btn-tc{background-position:0 -12px;}.x-toolbar .x-btn-click .x-btn-ml,.x-toolbar .x-btn-menu-active .x-btn-ml,.x-toolbar .x-btn-pressed .x-btn-ml{background-position:-12px -24px;}.x-toolbar .x-btn-click .x-btn-mr,.x-toolbar .x-btn-menu-active .x-btn-mr,.x-toolbar .x-btn-pressed .x-btn-mr{background-position:-15px -24px;}.x-toolbar .x-btn-click .x-btn-mc,.x-toolbar .x-btn-menu-active .x-btn-mc,.x-toolbar .x-btn-pressed .x-btn-mc{background-position:0 -3240px;}.x-toolbar .x-btn-click .x-btn-bl,.x-toolbar .x-btn-menu-active .x-btn-bl,.x-toolbar .x-btn-pressed .x-btn-bl{background-position:-12px -3px;}.x-toolbar .x-btn-click .x-btn-br,.x-toolbar .x-btn-menu-active .x-btn-br,.x-toolbar .x-btn-pressed .x-btn-br{background-position:-15px -3px;}.x-toolbar .x-btn-click .x-btn-bc,.x-toolbar .x-btn-menu-active .x-btn-bc,.x-toolbar .x-btn-pressed .x-btn-bc{background-position:0 -21px;}.x-toolbar div.xtb-text{padding:2px 2px 0;line-height:16px;display:block;}.x-toolbar .xtb-sep{background-position:center;background-repeat:no-repeat;display:block;font-size:1px;height:16px;width:4px;overflow:hidden;cursor:default;margin:0 2px 0;border:0;}.x-toolbar .xtb-spacer{width:2px;}.x-tbar-page-number{width:30px;height:14px;}.ext-ie .x-tbar-page-number{margin-top:2px;}.x-paging-info{position:absolute;top:5px;right:8px;}.x-toolbar-ct{width:100%;}.x-toolbar-right td{text-align:center;}.x-panel-tbar,.x-panel-bbar,.x-window-tbar,.x-window-bbar,.x-tab-panel-tbar,.x-tab-panel-bbar,.x-plain-tbar,.x-plain-bbar{overflow:hidden;zoom:1;}.x-toolbar-more .x-btn-small .x-btn-text{height:16px;width:12px;}.x-toolbar-more em.x-btn-arrow{display:inline;background-color:transparent;padding-right:0;}.x-toolbar-more .x-btn-mc em.x-btn-arrow{background-image:none;}div.x-toolbar-no-items{color:gray!important;padding:5px 10px!important;}.ext-border-box .x-toolbar-cell .x-form-text{margin-bottom:-1px!important;}.ext-border-box .x-toolbar-cell .x-form-field-wrap .x-form-text{margin:0!important;}.ext-ie .x-toolbar-cell .x-form-field-wrap{height:21px;}.ext-ie .x-toolbar-cell .x-form-text{position:relative;top:-1px;}.ext-strict .ext-ie8 .x-toolbar-cell .x-form-field-trigger-wrap .x-form-text,.ext-strict .ext-ie .x-toolbar-cell .x-form-text{top:0;}.x-toolbar-right td .x-form-field-trigger-wrap{text-align:left;}.x-toolbar-cell .x-form-checkbox,.x-toolbar-cell .x-form-radio{margin-top:5px;}.x-toolbar-cell .x-form-cb-label{vertical-align:bottom;top:1px;}.ext-ie .x-toolbar-cell .x-form-checkbox,.ext-ie .x-toolbar-cell .x-form-radio{margin-top:4px;}.ext-ie .x-toolbar-cell .x-form-cb-label{top:0;}.x-grid3{position:relative;overflow:hidden;}.x-grid-panel .x-panel-body{overflow:hidden!important;}.x-grid-panel .x-panel-mc .x-panel-body{border:1px solid;}.x-grid3 table{table-layout:fixed;}.x-grid3-viewport{overflow:hidden;}.x-grid3-hd-row td,.x-grid3-row td,.x-grid3-summary-row td{-moz-outline:0;outline:0;-moz-user-focus:normal;}.x-grid3-row td,.x-grid3-summary-row td{line-height:13px;vertical-align:top;padding-left:1px;padding-right:1px;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;}.x-grid3-cell{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;}.x-grid3-hd-row td{line-height:15px;vertical-align:middle;border-left:1px solid;border-right:1px solid;}.x-grid3-hd-row .x-grid3-marker-hd{padding:3px;}.x-grid3-row .x-grid3-marker{padding:3px;}.x-grid3-cell-inner,.x-grid3-hd-inner{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;padding:3px 3px 3px 5px;white-space:nowrap;}.x-action-col-cell .x-grid3-cell-inner{padding-top:1px;padding-bottom:1px;}.x-action-col-icon{cursor:pointer;}.x-grid3-hd-inner{position:relative;cursor:inherit;padding:4px 3px 4px 5px;}.x-grid3-row-body{white-space:normal;}.x-grid3-body-cell{-moz-outline:0 none;outline:0 none;}.ext-ie .x-grid3-cell-inner,.ext-ie .x-grid3-hd-inner{width:100%;}.ext-strict .x-grid3-cell-inner,.ext-strict .x-grid3-hd-inner{width:auto;}.x-grid-row-loading{background:no-repeat center center;}.x-grid-page{overflow:hidden;}.x-grid3-row{cursor:default;border:1px solid;width:100%;}.x-grid3-row-over{border:1px solid;background:repeat-x left top;}.x-grid3-resize-proxy{width:1px;left:0;cursor:e-resize;cursor:col-resize;position:absolute;top:0;height:100px;overflow:hidden;visibility:hidden;border:0 none;z-index:7;}.x-grid3-resize-marker{width:1px;left:0;position:absolute;top:0;height:100px;overflow:hidden;visibility:hidden;border:0 none;z-index:7;}.x-grid3-focus{position:absolute;left:0;top:0;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:text;-khtml-user-select:text;-webkit-user-select:ignore;}.x-grid3-header{background:repeat-x 0 bottom;cursor:default;zoom:1;padding:1px 0 0 0;}.x-grid3-header-pop{border-left:1px solid;float:right;clear:none;}.x-grid3-header-pop-inner{border-left:1px solid;width:14px;height:19px;background:transparent no-repeat center center;}.ext-ie .x-grid3-header-pop-inner{width:15px;}.ext-strict .x-grid3-header-pop-inner{width:14px;}.x-grid3-header-inner{overflow:hidden;zoom:1;float:left;}.x-grid3-header-offset{padding-left:1px;text-align:left;}td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open{border-left:1px solid;border-right:1px solid;}td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner{background:repeat-x left bottom;}.x-grid3-sort-icon{background-repeat:no-repeat;display:none;height:4px;width:13px;margin-left:3px;vertical-align:middle;}.sort-asc .x-grid3-sort-icon,.sort-desc .x-grid3-sort-icon{display:inline;}.ext-strict .ext-ie .x-grid3-header-inner,.ext-strict .ext-ie6 .x-grid3-hd{position:relative;}.ext-strict .ext-ie6 .x-grid3-hd-inner{position:static;}.x-grid3-body{zoom:1;}.x-grid3-scroller{overflow:auto;zoom:1;position:relative;}.x-grid3-cell-text,.x-grid3-hd-text{display:block;padding:3px 5px 3px 5px;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;}.x-grid3-split{background-position:center;background-repeat:no-repeat;cursor:e-resize;cursor:col-resize;display:block;font-size:1px;height:16px;overflow:hidden;position:absolute;top:2px;width:6px;z-index:3;}.x-dd-drag-proxy .x-grid3-hd-inner{background:repeat-x left bottom;width:120px;padding:3px;border:1px solid;overflow:hidden;}.col-move-top,.col-move-bottom{width:9px;height:9px;position:absolute;top:0;line-height:1px;font-size:1px;overflow:hidden;visibility:hidden;z-index:20000;background:transparent no-repeat left top;}.x-grid3-row-selected{border:1px dotted;}.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{background:repeat-x 0 bottom!important;vertical-align:middle!important;padding:0;border-top:1px solid;border-bottom:none!important;border-right:1px solid!important;text-align:center;}.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{padding:0 4px;text-align:center;}.x-grid3-dirty-cell{background:transparent no-repeat 0 0;}.x-grid3-topbar,.x-grid3-bottombar{overflow:hidden;display:none;zoom:1;position:relative;}.x-grid3-topbar .x-toolbar{border-right:0 none;}.x-grid3-bottombar .x-toolbar{border-right:0 none;border-bottom:0 none;border-top:1px solid;}.x-props-grid .x-grid3-cell{padding:1px;}.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{background:transparent repeat-y -16px!important;padding-left:12px;}.x-props-grid .x-grid3-body .x-grid3-td-name{padding:1px;padding-right:0;border:0 none;border-right:1px solid;}.x-grid3-col-dd{border:0 none;padding:0;background-color:transparent;}.x-dd-drag-ghost .x-grid3-dd-wrap{padding:1px 3px 3px 1px;}.x-grid3-hd{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;}.x-grid3-hd-btn{display:none;position:absolute;width:14px;background:no-repeat left center;right:0;top:0;z-index:2;cursor:pointer;}.x-grid3-hd-over .x-grid3-hd-btn,.x-grid3-hd-menu-open .x-grid3-hd-btn{display:block;}a.x-grid3-hd-btn:hover{background-position:-14px center;}.x-grid3-body .x-grid3-td-expander{background:transparent repeat-y right;}.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner{padding:0!important;height:100%;}.x-grid3-row-expander{width:100%;height:18px;background-position:4px 2px;background-repeat:no-repeat;background-color:transparent;}.x-grid3-row-collapsed .x-grid3-row-expander{background-position:4px 2px;}.x-grid3-row-expanded .x-grid3-row-expander{background-position:-21px 2px;}.x-grid3-row-collapsed .x-grid3-row-body{display:none!important;}.x-grid3-row-expanded .x-grid3-row-body{display:block!important;}.x-grid3-body .x-grid3-td-checker{background:transparent repeat-y right;}.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner,.x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner{padding:0!important;height:100%;}.x-grid3-row-checker,.x-grid3-hd-checker{width:100%;height:18px;background-position:2px 2px;background-repeat:no-repeat;background-color:transparent;}.x-grid3-row .x-grid3-row-checker{background-position:2px 2px;}.x-grid3-row-selected .x-grid3-row-checker,.x-grid3-hd-checker-on .x-grid3-hd-checker,.x-grid3-row-checked .x-grid3-row-checker{background-position:-23px 2px;}.x-grid3-hd-checker{background-position:2px 1px;}.ext-border-box .x-grid3-hd-checker{background-position:2px 3px;}.x-grid3-hd-checker-on .x-grid3-hd-checker{background-position:-23px 1px;}.ext-border-box .x-grid3-hd-checker-on .x-grid3-hd-checker{background-position:-23px 3px;}.x-grid3-body .x-grid3-td-numberer{background:transparent repeat-y right;}.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner{padding:3px 5px 0 0!important;text-align:right;}.x-grid3-body .x-grid3-td-row-icon{background:transparent repeat-y right;vertical-align:top;text-align:center;}.x-grid3-body .x-grid3-td-row-icon .x-grid3-cell-inner{padding:0!important;background-position:center center;background-repeat:no-repeat;width:16px;height:16px;margin-left:2px;margin-top:3px;}.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander{background:transparent repeat-y right;}.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner{padding:1px 0 0 0!important;}.x-grid3-check-col{width:100%;height:16px;background-position:center center;background-repeat:no-repeat;background-color:transparent;}.x-grid3-check-col-on{width:100%;height:16px;background-position:center center;background-repeat:no-repeat;background-color:transparent;}.x-grid-group,.x-grid-group-body,.x-grid-group-hd{zoom:1;}.x-grid-group-hd{border-bottom:2px solid;cursor:pointer;padding-top:6px;}.x-grid-group-hd div.x-grid-group-title{background:transparent no-repeat 3px 3px;padding:4px 4px 4px 17px;}.x-grid-group-collapsed .x-grid-group-body{display:none;}.ext-ie6 .x-grid3 .x-editor .x-form-text,.ext-ie7 .x-grid3 .x-editor .x-form-text{position:relative;top:-1px;}.x-grid-editor .x-form-check-wrap{text-align:center;margin-top:-4px;}.ext-ie .x-props-grid .x-editor .x-form-text{position:static;top:0;}.x-grid-empty{padding:10px;}.ext-ie7 .x-grid-panel .x-panel-bbar{position:relative;}.ext-ie7 .x-grid-panel .x-panel-mc .x-panel-bbar{position:static;}.ext-ie6 .x-grid3-header{position:relative;}.ext-webkit .x-grid-panel .x-panel-bwrap{-webkit-user-select:none;}.ext-webkit .x-tbar-page-number{-webkit-user-select:ignore;}.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell{padding-right:0;border-right:1px solid;}.x-pivotgrid .x-grid3-header-offset table{width:100%;border-collapse:collapse;}.x-pivotgrid .x-grid3-header-offset table td{padding:4px 3px 4px 5px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:11px;line-height:13px;font-family:tahoma;}.x-pivotgrid .x-grid3-row-headers{display:block;float:left;}.x-pivotgrid .x-grid3-row-headers table{height:100%;width:100%;border-collapse:collapse;}.x-pivotgrid .x-grid3-row-headers table td{height:18px;padding:2px 7px 0 0;text-align:right;text-overflow:ellipsis;font-size:11px;font-family:tahoma;}.ext-gecko .x-pivotgrid .x-grid3-row-headers table td{height:21px;}.x-grid3-header-title{top:0;left:0;position:absolute;text-align:center;vertical-align:middle;font-family:tahoma;font-size:11px;padding:auto 1px;display:table-cell;}.x-grid3-header-title span{position:absolute;top:50%;left:0;width:100%;margin-top:-6px;}.x-dd-drag-proxy{position:absolute;left:0;top:0;visibility:hidden;z-index:15000;}.x-dd-drag-ghost{-moz-opacity:.85;opacity:.85;filter:alpha(opacity=85);border:1px solid;padding:3px;padding-left:20px;white-space:nowrap;}.x-dd-drag-repair .x-dd-drag-ghost{-moz-opacity:.4;opacity:.4;filter:alpha(opacity=40);border:0 none;padding:0;background-color:transparent;}.x-dd-drag-repair .x-dd-drop-icon{visibility:hidden;}.x-dd-drop-icon{position:absolute;top:3px;left:3px;display:block;width:16px;height:16px;background-color:transparent;background-position:center;background-repeat:no-repeat;z-index:1;}.x-view-selector{position:absolute;left:0;top:0;width:0;border:1px dotted;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);zoom:1;}.ext-strict .ext-ie .x-tree .x-panel-bwrap{position:relative;overflow:hidden;}.x-tree-icon,.x-tree-ec-icon,.x-tree-elbow-line,.x-tree-elbow,.x-tree-elbow-end,.x-tree-elbow-plus,.x-tree-elbow-minus,.x-tree-elbow-end-plus,.x-tree-elbow-end-minus{border:0 none;height:18px;margin:0;padding:0;vertical-align:top;width:16px;background-repeat:no-repeat;}.x-tree-node-collapsed .x-tree-node-icon,.x-tree-node-expanded .x-tree-node-icon,.x-tree-node-leaf .x-tree-node-icon{border:0 none;height:18px;margin:0;padding:0;vertical-align:top;width:16px;background-position:center;background-repeat:no-repeat;}.ext-ie .x-tree-node-indent img,.ext-ie .x-tree-node-icon,.ext-ie .x-tree-ec-icon{vertical-align:middle!important;}.ext-strict .ext-ie8 .x-tree-node-indent img,.ext-strict .ext-ie8 .x-tree-node-icon,.ext-strict .ext-ie8 .x-tree-ec-icon{vertical-align:top!important;}input.x-tree-node-cb{margin-left:1px;height:19px;vertical-align:bottom;}.ext-ie input.x-tree-node-cb{margin-left:0;margin-top:1px;width:16px;height:16px;vertical-align:middle;}.ext-strict .ext-ie8 input.x-tree-node-cb{margin:1px 1px;height:14px;vertical-align:bottom;}.ext-strict .ext-ie8 input.x-tree-node-cb+a{vertical-align:bottom;}.ext-opera input.x-tree-node-cb{height:14px;vertical-align:middle;}.x-tree-noicon .x-tree-node-icon{width:0;height:0;}.x-tree-no-lines .x-tree-elbow{background-color:transparent;}.x-tree-no-lines .x-tree-elbow-end{background-color:transparent;}.x-tree-no-lines .x-tree-elbow-line{background-color:transparent;}.x-tree-arrows .x-tree-elbow{background-color:transparent;}.x-tree-arrows .x-tree-elbow-plus{background:transparent no-repeat 0 0;}.x-tree-arrows .x-tree-elbow-minus{background:transparent no-repeat -16px 0;}.x-tree-arrows .x-tree-elbow-end{background-color:transparent;}.x-tree-arrows .x-tree-elbow-end-plus{background:transparent no-repeat 0 0;}.x-tree-arrows .x-tree-elbow-end-minus{background:transparent no-repeat -16px 0;}.x-tree-arrows .x-tree-elbow-line{background-color:transparent;}.x-tree-arrows .x-tree-ec-over .x-tree-elbow-plus{background-position:-32px 0;}.x-tree-arrows .x-tree-ec-over .x-tree-elbow-minus{background-position:-48px 0;}.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-plus{background-position:-32px 0;}.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-minus{background-position:-48px 0;}.x-tree-elbow-plus,.x-tree-elbow-minus,.x-tree-elbow-end-plus,.x-tree-elbow-end-minus{cursor:pointer;}.ext-ie ul.x-tree-node-ct{font-size:0;line-height:0;zoom:1;}.x-tree-node{white-space:nowrap;}.x-tree-node-el{line-height:18px;cursor:pointer;}.x-tree-node a,.x-dd-drag-ghost a{text-decoration:none;-khtml-user-select:none;-moz-user-select:none;-webkit-user-select:ignore;-kthml-user-focus:normal;-moz-user-focus:normal;-moz-outline:0 none;outline:0 none;}.x-tree-node a span,.x-dd-drag-ghost a span{text-decoration:none;padding:1px 3px 1px 2px;}.x-tree-node .x-tree-node-disabled .x-tree-node-icon{-moz-opacity:.5;opacity:.5;filter:alpha(opacity=50);}.x-tree-node .x-tree-node-inline-icon{background-color:transparent;}.x-tree-node a:hover,.x-dd-drag-ghost a:hover{text-decoration:none;}.x-tree-node div.x-tree-drag-insert-below{border-bottom:1px dotted;}.x-tree-node div.x-tree-drag-insert-above{border-top:1px dotted;}.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below{border-bottom:0 none;}.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above{border-top:0 none;}.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{border-bottom:2px solid;}.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{border-top:2px solid;}.x-tree-node .x-tree-drag-append a span{border:1px dotted;}.x-dd-drag-ghost .x-tree-node-indent,.x-dd-drag-ghost .x-tree-ec-icon{display:none!important;}.x-tree-root-ct{zoom:1;}.x-date-picker{border:1px solid;border-top:0 none;position:relative;}.x-date-picker a{-moz-outline:0 none;outline:0 none;}.x-date-inner,.x-date-inner td,.x-date-inner th{border-collapse:separate;}.x-date-middle,.x-date-left,.x-date-right{background:repeat-x 0 -83px;overflow:hidden;}.x-date-middle .x-btn-tc,.x-date-middle .x-btn-tl,.x-date-middle .x-btn-tr,.x-date-middle .x-btn-mc,.x-date-middle .x-btn-ml,.x-date-middle .x-btn-mr,.x-date-middle .x-btn-bc,.x-date-middle .x-btn-bl,.x-date-middle .x-btn-br{background:transparent!important;vertical-align:middle;}.x-date-middle .x-btn-mc em.x-btn-arrow{background:transparent no-repeat right 0;}.x-date-right,.x-date-left{width:18px;}.x-date-right{text-align:right;}.x-date-middle{padding-top:2px;padding-bottom:2px;width:130px;}.x-date-right a,.x-date-left a{display:block;width:16px;height:16px;background-position:center;background-repeat:no-repeat;cursor:pointer;-moz-opacity:.6;opacity:.6;filter:alpha(opacity=60);}.x-date-right a:hover,.x-date-left a:hover{-moz-opacity:1;opacity:1;filter:alpha(opacity=100);}.x-item-disabled .x-date-right a:hover,.x-item-disabled .x-date-left a:hover{-moz-opacity:.6;opacity:.6;filter:alpha(opacity=60);}.x-date-right a{margin-right:2px;text-decoration:none!important;}.x-date-left a{margin-left:2px;text-decoration:none!important;}table.x-date-inner{width:100%;table-layout:fixed;}.ext-webkit table.x-date-inner{width:175px;}.x-date-inner th{width:25px;}.x-date-inner th{background:repeat-x left top;text-align:right!important;border-bottom:1px solid;cursor:default;padding:0;border-collapse:separate;}.x-date-inner th span{display:block;padding:2px;padding-right:7px;}.x-date-inner td{border:1px solid;text-align:right;padding:0;}.x-date-inner a{padding:2px 5px;display:block;text-decoration:none;text-align:right;zoom:1;}.x-date-inner .x-date-active{cursor:pointer;color:black;}.x-date-inner .x-date-selected a{background:repeat-x left top;border:1px solid;padding:1px 4px;}.x-date-inner .x-date-today a{border:1px solid;padding:1px 4px;}.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a{text-decoration:none!important;}.x-date-bottom{padding:4px;border-top:1px solid;background:repeat-x left top;}.x-date-inner a:hover,.x-date-inner .x-date-disabled a:hover{text-decoration:none!important;}.x-item-disabled .x-date-inner a:hover{background:0;}.x-date-inner .x-date-disabled a{cursor:default;}.x-date-menu .x-menu-item{padding:1px 24px 1px 4px;white-space:nowrap;}.x-date-menu .x-menu-item .x-menu-item-icon{width:10px;height:10px;margin-right:5px;background-position:center -4px!important;}.x-date-mp{position:absolute;left:0;top:0;display:none;}.x-date-mp td{padding:2px;font:normal 11px arial,helvetica,tahoma,sans-serif;}td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn{border:0 none;text-align:center;vertical-align:middle;width:25%;}.x-date-mp-ok{margin-right:3px;}.x-date-mp-btns button{text-decoration:none;text-align:center;text-decoration:none!important;border:1px solid;padding:1px 3px 1px;cursor:pointer;}.x-date-mp-btns{background:repeat-x left top;}.x-date-mp-btns td{border-top:1px solid;text-align:center;}td.x-date-mp-month a,td.x-date-mp-year a{display:block;padding:2px 4px;text-decoration:none;text-align:center;}td.x-date-mp-month a:hover,td.x-date-mp-year a:hover{text-decoration:none;cursor:pointer;}td.x-date-mp-sel a{padding:1px 3px;background:repeat-x left top;border:1px solid;}.x-date-mp-ybtn a{overflow:hidden;width:15px;height:15px;cursor:pointer;background:transparent no-repeat;display:block;margin:0 auto;}.x-date-mp-ybtn a.x-date-mp-next{background-position:0 -120px;}.x-date-mp-ybtn a.x-date-mp-next:hover{background-position:-15px -120px;}.x-date-mp-ybtn a.x-date-mp-prev{background-position:0 -105px;}.x-date-mp-ybtn a.x-date-mp-prev:hover{background-position:-15px -105px;}.x-date-mp-ybtn{text-align:center;}td.x-date-mp-sep{border-right:1px solid;}.x-tip{position:absolute;top:0;left:0;visibility:hidden;z-index:20002;border:0 none;}.x-tip .x-tip-close{height:15px;float:right;width:15px;margin:0 0 2px 2px;cursor:pointer;display:none;}.x-tip .x-tip-tc{background:transparent no-repeat 0 -62px;padding-top:3px;overflow:hidden;zoom:1;}.x-tip .x-tip-tl{background:transparent no-repeat 0 0;padding-left:6px;overflow:hidden;zoom:1;}.x-tip .x-tip-tr{background:transparent no-repeat right 0;padding-right:6px;overflow:hidden;zoom:1;}.x-tip .x-tip-bc{background:transparent no-repeat 0 -121px;height:3px;overflow:hidden;}.x-tip .x-tip-bl{background:transparent no-repeat 0 -59px;padding-left:6px;zoom:1;}.x-tip .x-tip-br{background:transparent no-repeat right -59px;padding-right:6px;zoom:1;}.x-tip .x-tip-mc{border:0 none;}.x-tip .x-tip-ml{background:no-repeat 0 -124px;padding-left:6px;zoom:1;}.x-tip .x-tip-mr{background:transparent no-repeat right -124px;padding-right:6px;zoom:1;}.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc{font-size:0;line-height:0;}.ext-border-box .x-tip .x-tip-header,.ext-border-box .x-tip .x-tip-tc{line-height:1px;}.x-tip .x-tip-header-text{padding:0;margin:0 0 2px 0;}.x-tip .x-tip-body{margin:0!important;line-height:14px;padding:0;}.x-tip .x-tip-body .loading-indicator{margin:0;}.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text{cursor:move;}.x-form-invalid-tip .x-tip-tc{background:repeat-x 0 -12px;padding-top:6px;}.x-form-invalid-tip .x-tip-bc{background:repeat-x 0 -18px;height:6px;}.x-form-invalid-tip .x-tip-bl{background:no-repeat 0 -6px;}.x-form-invalid-tip .x-tip-br{background:no-repeat right -6px;}.x-form-invalid-tip .x-tip-body{padding:2px;}.x-form-invalid-tip .x-tip-body{padding-left:24px;background:transparent no-repeat 2px 2px;}.x-tip-anchor{position:absolute;width:9px;height:10px;overflow:hidden;background:transparent no-repeat 0 0;zoom:1;}.x-tip-anchor-bottom{background-position:-9px 0;}.x-tip-anchor-right{background-position:-18px 0;width:10px;}.x-tip-anchor-left{background-position:-28px 0;width:10px;}.x-menu{z-index:15000;zoom:1;background:repeat-y;}.x-menu-floating{border:1px solid;}.x-menu a{text-decoration:none!important;}.ext-ie .x-menu{zoom:1;overflow:hidden;}.x-menu-list{padding:2px;background-color:transparent;border:0 none;overflow:hidden;overflow-y:hidden;}.ext-strict .ext-ie .x-menu-list{position:relative;}.x-menu li{line-height:100%;}.x-menu li.x-menu-sep-li{font-size:1px;line-height:1px;}.x-menu-list-item{white-space:nowrap;display:block;padding:1px;}.x-menu-item{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;}.x-menu-item-arrow{background:transparent no-repeat right;}.x-menu-sep{display:block;font-size:1px;line-height:1px;margin:2px 3px;border-bottom:1px solid;overflow:hidden;}.x-menu-focus{position:absolute;left:-1px;top:-1px;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;overflow:hidden;display:block;}a.x-menu-item{cursor:pointer;display:block;line-height:16px;outline-color:-moz-use-text-color;outline-style:none;outline-width:0;padding:3px 21px 3px 27px;position:relative;text-decoration:none;white-space:nowrap;}.x-menu-item-active{background-repeat:repeat-x;background-position:left bottom;border-style:solid;border-width:1px 0;margin:0 1px;padding:0;}.x-menu-item-active a.x-menu-item{border-style:solid;border-width:0 1px;margin:0 -1px;}.x-menu-item-icon{border:0 none;height:16px;padding:0;vertical-align:top;width:16px;position:absolute;left:3px;top:3px;margin:0;background-position:center;}.ext-ie .x-menu-item-icon{left:-24px;}.ext-strict .x-menu-item-icon{left:3px;}.ext-ie6 .x-menu-item-icon{left:-24px;}.ext-ie .x-menu-item-icon{vertical-align:middle;}.x-menu-check-item .x-menu-item-icon{background:transparent no-repeat center;}.x-menu-group-item .x-menu-item-icon{background-color:transparent;}.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{background:transparent no-repeat center;}.x-date-menu .x-menu-list{padding:0;}.x-menu-date-item{padding:0;}.x-menu .x-color-palette,.x-menu .x-date-picker{margin-left:26px;margin-right:4px;}.x-menu .x-date-picker{border:1px solid;margin-top:2px;margin-bottom:2px;}.x-menu-plain .x-color-palette,.x-menu-plain .x-date-picker{margin:0;border:0 none;}.x-date-menu{padding:0!important;}.ext-strict .ext-ie6 .x-menu-sep-li{padding:3px 4px;}.ext-strict .ext-ie6 .x-menu-sep{margin:0;height:1px;}.ext-webkit .x-menu-sep{height:1px;}.ext-ie .x-date-menu{height:199px;}.ext-strict .ext-ie .x-date-menu,.ext-border-box .ext-ie8 .x-date-menu{height:197px;}.ext-strict .ext-ie7 .x-date-menu{height:195px;}.ext-strict .ext-ie8 .x-date-menu{height:auto;}.x-cycle-menu .x-menu-item-checked{border:1px dotted!important;padding:0;}.x-menu .x-menu-scroller{width:100%;background-repeat:no-repeat;background-position:center;height:8px;line-height:8px;cursor:pointer;margin:0;padding:0;}.x-menu .x-menu-scroller-active{height:6px;line-height:6px;}.x-menu-list-item-indent{padding-left:27px;}.x-box-tl{background:transparent no-repeat 0 0;zoom:1;}.x-box-tc{height:8px;background:transparent repeat-x 0 0;overflow:hidden;}.x-box-tr{background:transparent no-repeat right -8px;}.x-box-ml{background:transparent repeat-y 0;padding-left:4px;overflow:hidden;zoom:1;}.x-box-mc{background:repeat-x 0 -16px;padding:4px 10px;}.x-box-mc h3{margin:0 0 4px 0;zoom:1;}.x-box-mr{background:transparent repeat-y right;padding-right:4px;overflow:hidden;}.x-box-bl{background:transparent no-repeat 0 -16px;zoom:1;}.x-box-bc{background:transparent repeat-x 0 -8px;height:8px;overflow:hidden;}.x-box-br{background:transparent no-repeat right -24px;}.x-box-tl,.x-box-bl{padding-left:8px;overflow:hidden;}.x-box-tr,.x-box-br{padding-right:8px;overflow:hidden;}.x-combo-list{border:1px solid;zoom:1;overflow:hidden;}.x-combo-list-inner{overflow:auto;position:relative;zoom:1;overflow-x:hidden;}.x-combo-list-hd{border-bottom:1px solid;padding:3px;}.x-resizable-pinned .x-combo-list-inner{border-bottom:1px solid;}.x-combo-list-item{padding:2px;border:1px solid;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.x-combo-list .x-combo-selected{border:1px dotted!important;cursor:pointer;}.x-combo-list .x-toolbar{border-top:1px solid;border-bottom:0 none;}.x-panel{border-style:solid;border-width:0;}.x-panel-header{overflow:hidden;zoom:1;padding:5px 3px 4px 5px;border:1px solid;line-height:15px;background:transparent repeat-x 0 -1px;}.x-panel-body{border:1px solid;border-top:0 none;overflow:hidden;position:relative;}.x-panel-bbar .x-toolbar,.x-panel-tbar .x-toolbar{border:1px solid;border-top:0 none;overflow:hidden;padding:2px;}.x-panel-tbar-noheader .x-toolbar,.x-panel-mc .x-panel-tbar .x-toolbar{border-top:1px solid;border-bottom:0 none;}.x-panel-body-noheader,.x-panel-mc .x-panel-body{border-top:1px solid;}.x-panel-header{overflow:hidden;zoom:1;}.x-panel-tl .x-panel-header{padding:5px 0 4px 0;border:0 none;background:transparent no-repeat;}.x-panel-tl .x-panel-icon,.x-window-tl .x-panel-icon{padding-left:20px!important;background-repeat:no-repeat;background-position:0 4px;zoom:1;}.x-panel-inline-icon{width:16px;height:16px;background-repeat:no-repeat;background-position:0 0;vertical-align:middle;margin-right:4px;margin-top:-1px;margin-bottom:-1px;}.x-panel-tc{background:transparent repeat-x 0 0;overflow:hidden;}.ext-strict .ext-ie7 .x-panel-tc{overflow:visible;}.x-panel-tl{background:transparent no-repeat 0 0;padding-left:6px;zoom:1;border-bottom:1px solid;}.x-panel-tr{background:transparent no-repeat right 0;zoom:1;padding-right:6px;}.x-panel-bc{background:transparent repeat-x 0 bottom;zoom:1;}.x-panel-bc .x-panel-footer{zoom:1;}.x-panel-bl{background:transparent no-repeat 0 bottom;padding-left:6px;zoom:1;}.x-panel-br{background:transparent no-repeat right bottom;padding-right:6px;zoom:1;}.x-panel-mc{border:0 none;padding:0;margin:0;padding-top:6px;}.x-panel-mc .x-panel-body{background-color:transparent;border:0 none;}.x-panel-ml{background:repeat-y 0 0;padding-left:6px;zoom:1;}.x-panel-mr{background:transparent repeat-y right 0;padding-right:6px;zoom:1;}.x-panel-bc .x-panel-footer{padding-bottom:6px;}.x-panel-nofooter .x-panel-bc,.x-panel-nofooter .x-window-bc{height:6px;font-size:0;line-height:0;}.x-panel-bwrap{overflow:hidden;zoom:1;left:0;top:0;}.x-panel-body{overflow:hidden;zoom:1;}.x-panel-collapsed .x-resizable-handle{display:none;}.ext-gecko .x-panel-animated div{overflow:hidden!important;}.x-plain-body{overflow:hidden;}.x-plain-bbar .x-toolbar{overflow:hidden;padding:2px;}.x-plain-tbar .x-toolbar{overflow:hidden;padding:2px;}.x-plain-bwrap{overflow:hidden;zoom:1;}.x-plain{overflow:hidden;}.x-tool{overflow:hidden;width:15px;height:15px;float:right;cursor:pointer;background:transparent no-repeat;margin-left:2px;}.x-tool-toggle{background-position:0 -60px;}.x-tool-toggle-over{background-position:-15px -60px;}.x-panel-collapsed .x-tool-toggle{background-position:0 -75px;}.x-panel-collapsed .x-tool-toggle-over{background-position:-15px -75px;}.x-tool-close{background-position:0 -0;}.x-tool-close-over{background-position:-15px 0;}.x-tool-minimize{background-position:0 -15px;}.x-tool-minimize-over{background-position:-15px -15px;}.x-tool-maximize{background-position:0 -30px;}.x-tool-maximize-over{background-position:-15px -30px;}.x-tool-restore{background-position:0 -45px;}.x-tool-restore-over{background-position:-15px -45px;}.x-tool-gear{background-position:0 -90px;}.x-tool-gear-over{background-position:-15px -90px;}.x-tool-prev{background-position:0 -105px;}.x-tool-prev-over{background-position:-15px -105px;}.x-tool-next{background-position:0 -120px;}.x-tool-next-over{background-position:-15px -120px;}.x-tool-pin{background-position:0 -135px;}.x-tool-pin-over{background-position:-15px -135px;}.x-tool-unpin{background-position:0 -150px;}.x-tool-unpin-over{background-position:-15px -150px;}.x-tool-right{background-position:0 -165px;}.x-tool-right-over{background-position:-15px -165px;}.x-tool-left{background-position:0 -180px;}.x-tool-left-over{background-position:-15px -180px;}.x-tool-down{background-position:0 -195px;}.x-tool-down-over{background-position:-15px -195px;}.x-tool-up{background-position:0 -210px;}.x-tool-up-over{background-position:-15px -210px;}.x-tool-refresh{background-position:0 -225px;}.x-tool-refresh-over{background-position:-15px -225px;}.x-tool-plus{background-position:0 -240px;}.x-tool-plus-over{background-position:-15px -240px;}.x-tool-minus{background-position:0 -255px;}.x-tool-minus-over{background-position:-15px -255px;}.x-tool-search{background-position:0 -270px;}.x-tool-search-over{background-position:-15px -270px;}.x-tool-save{background-position:0 -285px;}.x-tool-save-over{background-position:-15px -285px;}.x-tool-help{background-position:0 -300px;}.x-tool-help-over{background-position:-15px -300px;}.x-tool-print{background-position:0 -315px;}.x-tool-print-over{background-position:-15px -315px;}.x-tool-expand{background-position:0 -330px;}.x-tool-expand-over{background-position:-15px -330px;}.x-tool-collapse{background-position:0 -345px;}.x-tool-collapse-over{background-position:-15px -345px;}.x-tool-resize{background-position:0 -360px;}.x-tool-resize-over{background-position:-15px -360px;}.x-tool-move{background-position:0 -375px;}.x-tool-move-over{background-position:-15px -375px;}.x-panel-ghost{z-index:12000;overflow:hidden;position:absolute;left:0;top:0;opacity:.65;-moz-opacity:.65;filter:alpha(opacity=65);}.x-panel-ghost ul{margin:0;padding:0;overflow:hidden;font-size:0;line-height:0;border:1px solid;border-top:0 none;display:block;}.x-panel-ghost *{cursor:move!important;}.x-panel-dd-spacer{border:2px dashed;}.x-panel-btns{padding:5px;overflow:hidden;}.x-panel-btns td.x-toolbar-cell{padding:3px;}.x-panel-btns .x-btn-focus .x-btn-left{background-position:0 -147px;}.x-panel-btns .x-btn-focus .x-btn-right{background-position:0 -168px;}.x-panel-btns .x-btn-focus .x-btn-center{background-position:0 -189px;}.x-panel-btns .x-btn-over .x-btn-left{background-position:0 -63px;}.x-panel-btns .x-btn-over .x-btn-right{background-position:0 -84px;}.x-panel-btns .x-btn-over .x-btn-center{background-position:0 -105px;}.x-panel-btns .x-btn-click .x-btn-center{background-position:0 -126px;}.x-panel-btns .x-btn-click .x-btn-right{background-position:0 -84px;}.x-panel-btns .x-btn-click .x-btn-left{background-position:0 -63px;}.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{white-space:nowrap;}.x-panel-reset .x-panel-body html,.x-panel-reset .x-panel-body address,.x-panel-reset .x-panel-body blockquote,.x-panel-reset .x-panel-body body,.x-panel-reset .x-panel-body dd,.x-panel-reset .x-panel-body div,.x-panel-reset .x-panel-body dl,.x-panel-reset .x-panel-body dt,.x-panel-reset .x-panel-body fieldset,.x-panel-reset .x-panel-body form,.x-panel-reset .x-panel-body frame,frameset,.x-panel-reset .x-panel-body h1,.x-panel-reset .x-panel-body h2,.x-panel-reset .x-panel-body h3,.x-panel-reset .x-panel-body h4,.x-panel-reset .x-panel-body h5,.x-panel-reset .x-panel-body h6,.x-panel-reset .x-panel-body noframes,.x-panel-reset .x-panel-body ol,.x-panel-reset .x-panel-body p,.x-panel-reset .x-panel-body ul,.x-panel-reset .x-panel-body center,.x-panel-reset .x-panel-body dir,.x-panel-reset .x-panel-body hr,.x-panel-reset .x-panel-body menu,.x-panel-reset .x-panel-body pre{display:block;}.x-panel-reset .x-panel-body li{display:list-item;}.x-panel-reset .x-panel-body head{display:none;}.x-panel-reset .x-panel-body table{display:table;}.x-panel-reset .x-panel-body tr{display:table-row;}.x-panel-reset .x-panel-body thead{display:table-header-group;}.x-panel-reset .x-panel-body tbody{display:table-row-group;}.x-panel-reset .x-panel-body tfoot{display:table-footer-group;}.x-panel-reset .x-panel-body col{display:table-column;}.x-panel-reset .x-panel-body colgroup{display:table-column-group;}.x-panel-reset .x-panel-body td,.x-panel-reset .x-panel-body th{display:table-cell;}.x-panel-reset .x-panel-body caption{display:table-caption;}.x-panel-reset .x-panel-body th{font-weight:bolder;text-align:center;}.x-panel-reset .x-panel-body caption{text-align:center;}.x-panel-reset .x-panel-body body{margin:8px;}.x-panel-reset .x-panel-body h1{font-size:2em;margin:.67em 0;}.x-panel-reset .x-panel-body h2{font-size:1.5em;margin:.75em 0;}.x-panel-reset .x-panel-body h3{font-size:1.17em;margin:.83em 0;}.x-panel-reset .x-panel-body h4,.x-panel-reset .x-panel-body p,.x-panel-reset .x-panel-body blockquote,.x-panel-reset .x-panel-body ul,.x-panel-reset .x-panel-body fieldset,.x-panel-reset .x-panel-body form,.x-panel-reset .x-panel-body ol,.x-panel-reset .x-panel-body dl,.x-panel-reset .x-panel-body dir,.x-panel-reset .x-panel-body menu{margin:1.12em 0;}.x-panel-reset .x-panel-body h5{font-size:.83em;margin:1.5em 0;}.x-panel-reset .x-panel-body h6{font-size:.75em;margin:1.67em 0;}.x-panel-reset .x-panel-body h1,.x-panel-reset .x-panel-body h2,.x-panel-reset .x-panel-body h3,.x-panel-reset .x-panel-body h4,.x-panel-reset .x-panel-body h5,.x-panel-reset .x-panel-body h6,.x-panel-reset .x-panel-body b,.x-panel-reset .x-panel-body strong{font-weight:bolder;}.x-panel-reset .x-panel-body blockquote{margin-left:40px;margin-right:40px;}.x-panel-reset .x-panel-body i,.x-panel-reset .x-panel-body cite,.x-panel-reset .x-panel-body em,.x-panel-reset .x-panel-body var,.x-panel-reset .x-panel-body address{font-style:italic;}.x-panel-reset .x-panel-body pre,.x-panel-reset .x-panel-body tt,.x-panel-reset .x-panel-body code,.x-panel-reset .x-panel-body kbd,.x-panel-reset .x-panel-body samp{font-family:monospace;}.x-panel-reset .x-panel-body pre{white-space:pre;}.x-panel-reset .x-panel-body button,.x-panel-reset .x-panel-body textarea,.x-panel-reset .x-panel-body input,.x-panel-reset .x-panel-body select{display:inline-block;}.x-panel-reset .x-panel-body big{font-size:1.17em;}.x-panel-reset .x-panel-body small,.x-panel-reset .x-panel-body sub,.x-panel-reset .x-panel-body sup{font-size:.83em;}.x-panel-reset .x-panel-body sub{vertical-align:sub;}.x-panel-reset .x-panel-body sup{vertical-align:super;}.x-panel-reset .x-panel-body table{border-spacing:2px;}.x-panel-reset .x-panel-body thead,.x-panel-reset .x-panel-body tbody,.x-panel-reset .x-panel-body tfoot{vertical-align:middle;}.x-panel-reset .x-panel-body td,.x-panel-reset .x-panel-body th{vertical-align:inherit;}.x-panel-reset .x-panel-body s,.x-panel-reset .x-panel-body strike,.x-panel-reset .x-panel-body del{text-decoration:line-through;}.x-panel-reset .x-panel-body hr{border:1px inset;}.x-panel-reset .x-panel-body ol,.x-panel-reset .x-panel-body ul,.x-panel-reset .x-panel-body dir,.x-panel-reset .x-panel-body menu,.x-panel-reset .x-panel-body dd{margin-left:40px;}.x-panel-reset .x-panel-body ul,.x-panel-reset .x-panel-body menu,.x-panel-reset .x-panel-body dir{list-style-type:disc;}.x-panel-reset .x-panel-body ol{list-style-type:decimal;}.x-panel-reset .x-panel-body ol ul,.x-panel-reset .x-panel-body ul ol,.x-panel-reset .x-panel-body ul ul,.x-panel-reset .x-panel-body ol ol{margin-top:0;margin-bottom:0;}.x-panel-reset .x-panel-body u,.x-panel-reset .x-panel-body ins{text-decoration:underline;}.x-panel-reset .x-panel-body br:before{content:"\A";}.x-panel-reset .x-panel-body :before,.x-panel-reset .x-panel-body :after{white-space:pre-line;}.x-panel-reset .x-panel-body center{text-align:center;}.x-panel-reset .x-panel-body :link,.x-panel-reset .x-panel-body :visited{text-decoration:underline;}.x-panel-reset .x-panel-body :focus{outline:invert dotted thin;}.x-panel-reset .x-panel-body BDO[DIR="ltr"]{direction:ltr;unicode-bidi:bidi-override;}.x-panel-reset .x-panel-body BDO[DIR="rtl"]{direction:rtl;unicode-bidi:bidi-override;}.x-window{zoom:1;}.x-window .x-window-handle{opacity:0;-moz-opacity:0;filter:alpha(opacity=0);}.x-window-proxy{border:1px solid;z-index:12000;overflow:hidden;position:absolute;left:0;top:0;display:none;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);}.x-window-header{overflow:hidden;zoom:1;}.x-window-bwrap{z-index:1;position:relative;zoom:1;left:0;top:0;}.x-window-tl .x-window-header{padding:5px 0 4px 0;}.x-window-header-text{cursor:pointer;}.x-window-tc{background:transparent repeat-x 0 0;overflow:hidden;zoom:1;}.x-window-tl{background:transparent no-repeat 0 0;padding-left:6px;zoom:1;z-index:1;position:relative;}.x-window-tr{background:transparent no-repeat right 0;padding-right:6px;}.x-window-bc{background:transparent repeat-x 0 bottom;zoom:1;}.x-window-bc .x-window-footer{padding-bottom:6px;zoom:1;font-size:0;line-height:0;}.x-window-bl{background:transparent no-repeat 0 bottom;padding-left:6px;zoom:1;}.x-window-br{background:transparent no-repeat right bottom;padding-right:6px;zoom:1;}.x-window-mc{border:1px solid;padding:0;margin:0;}.x-window-ml{background:transparent repeat-y 0 0;padding-left:6px;zoom:1;}.x-window-mr{background:transparent repeat-y right 0;padding-right:6px;zoom:1;}.x-window-body{overflow:hidden;}.x-window-bwrap{overflow:hidden;}.x-window-maximized .x-window-bl,.x-window-maximized .x-window-br,.x-window-maximized .x-window-ml,.x-window-maximized .x-window-mr,.x-window-maximized .x-window-tl,.x-window-maximized .x-window-tr{padding:0;}.x-window-maximized .x-window-footer{padding-bottom:0;}.x-window-maximized .x-window-tc{padding-left:3px;padding-right:3px;}.x-window-maximized .x-window-mc{border-left:0 none;border-right:0 none;}.x-window-tbar .x-toolbar,.x-window-bbar .x-toolbar{border-left:0 none;border-right:0 none;}.x-window-bbar .x-toolbar{border-top:1px solid;border-bottom:0 none;}.x-window-draggable,.x-window-draggable .x-window-header-text{cursor:move;}.x-window-maximized .x-window-draggable,.x-window-maximized .x-window-draggable .x-window-header-text{cursor:default;}.x-window-body{background-color:transparent;}.x-panel-ghost .x-window-tl{border-bottom:1px solid;}.x-panel-collapsed .x-window-tl{border-bottom:1px solid;}.x-window-maximized-ct{overflow:hidden;}.x-window-maximized .x-window-handle{display:none;}.x-window-sizing-ghost ul{border:0 none!important;}.x-dlg-focus{-moz-outline:0 none;outline:0 none;width:0;height:0;overflow:hidden;position:absolute;top:0;left:0;}.ext-webkit .x-dlg-focus{width:1px;height:1px;}.x-dlg-mask{z-index:10000;display:none;position:absolute;top:0;left:0;-moz-opacity:.5;opacity:.50;filter:alpha(opacity=50);}body.ext-ie6.x-body-masked select{visibility:hidden;}body.ext-ie6.x-body-masked .x-window select{visibility:visible;}.x-window-plain .x-window-mc{border:1px solid;}.x-window-plain .x-window-body{border:1px solid;background:transparent!important;}.x-html-editor-wrap{border:1px solid;}.x-html-editor-tb .x-btn-text{background:transparent no-repeat;}.x-html-editor-tb .x-edit-bold,.x-menu-item img.x-edit-bold{background-position:0 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-italic,.x-menu-item img.x-edit-italic{background-position:-16px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-underline,.x-menu-item img.x-edit-underline{background-position:-32px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-forecolor,.x-menu-item img.x-edit-forecolor{background-position:-160px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-backcolor,.x-menu-item img.x-edit-backcolor{background-position:-176px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-justifyleft,.x-menu-item img.x-edit-justifyleft{background-position:-112px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-justifycenter,.x-menu-item img.x-edit-justifycenter{background-position:-128px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-justifyright,.x-menu-item img.x-edit-justifyright{background-position:-144px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-insertorderedlist,.x-menu-item img.x-edit-insertorderedlist{background-position:-80px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-insertunorderedlist,.x-menu-item img.x-edit-insertunorderedlist{background-position:-96px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-increasefontsize,.x-menu-item img.x-edit-increasefontsize{background-position:-48px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-decreasefontsize,.x-menu-item img.x-edit-decreasefontsize{background-position:-64px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-sourceedit,.x-menu-item img.x-edit-sourceedit{background-position:-192px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tb .x-edit-createlink,.x-menu-item img.x-edit-createlink{background-position:-208px 0;background-image:url(../images/default/editor/tb-sprite.gif);}.x-html-editor-tip .x-tip-bd .x-tip-bd-inner{padding:5px;padding-bottom:1px;}.x-html-editor-tb .x-toolbar{position:static!important;}.x-panel-noborder .x-panel-body-noborder{border-width:0;}.x-panel-noborder .x-panel-header-noborder{border-width:0 0 1px;border-style:solid;}.x-panel-noborder .x-panel-tbar-noborder .x-toolbar{border-width:0 0 1px;border-style:solid;}.x-panel-noborder .x-panel-bbar-noborder .x-toolbar{border-width:1px 0 0 0;border-style:solid;}.x-window-noborder .x-window-mc{border-width:0;}.x-window-plain .x-window-body-noborder{border-width:0;}.x-tab-panel-noborder .x-tab-panel-body-noborder{border-width:0;}.x-tab-panel-noborder .x-tab-panel-header-noborder{border-width:0 0 1px 0;}.x-tab-panel-noborder .x-tab-panel-footer-noborder{border-width:1px 0 0 0;}.x-tab-panel-bbar-noborder .x-toolbar{border-width:1px 0 0 0;border-style:solid;}.x-tab-panel-tbar-noborder .x-toolbar{border-width:0 0 1px;border-style:solid;}.x-border-layout-ct{position:relative;}.x-border-panel{position:absolute;left:0;top:0;}.x-tool-collapse-south{background-position:0 -195px;}.x-tool-collapse-south-over{background-position:-15px -195px;}.x-tool-collapse-north{background-position:0 -210px;}.x-tool-collapse-north-over{background-position:-15px -210px;}.x-tool-collapse-west{background-position:0 -180px;}.x-tool-collapse-west-over{background-position:-15px -180px;}.x-tool-collapse-east{background-position:0 -165px;}.x-tool-collapse-east-over{background-position:-15px -165px;}.x-tool-expand-south{background-position:0 -210px;}.x-tool-expand-south-over{background-position:-15px -210px;}.x-tool-expand-north{background-position:0 -195px;}.x-tool-expand-north-over{background-position:-15px -195px;}.x-tool-expand-west{background-position:0 -165px;}.x-tool-expand-west-over{background-position:-15px -165px;}.x-tool-expand-east{background-position:0 -180px;}.x-tool-expand-east-over{background-position:-15px -180px;}.x-tool-expand-north,.x-tool-expand-south{float:right;margin:3px;}.x-tool-expand-east,.x-tool-expand-west{float:none;margin:3px 2px;}.x-accordion-hd .x-tool-toggle{background-position:0 -255px;}.x-accordion-hd .x-tool-toggle-over{background-position:-15px -255px;}.x-panel-collapsed .x-accordion-hd .x-tool-toggle{background-position:0 -240px;}.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over{background-position:-15px -240px;}.x-accordion-hd{padding-top:4px;padding-bottom:3px;border-top:0 none;background:transparent repeat-x 0 -9px;}.x-layout-collapsed{position:absolute;left:-10000px;top:-10000px;visibility:hidden;width:20px;height:20px;overflow:hidden;border:1px solid;z-index:20;}.ext-border-box .x-layout-collapsed{width:22px;height:22px;}.x-layout-collapsed-over{cursor:pointer;}.x-layout-collapsed-west .x-layout-collapsed-tools,.x-layout-collapsed-east .x-layout-collapsed-tools{position:absolute;top:0;left:0;width:20px;height:20px;}.x-layout-split{position:absolute;height:5px;width:5px;line-height:1px;font-size:1px;z-index:3;background-color:transparent;}.ext-strict .ext-ie6 .x-layout-split{background-color:#fff!important;filter:alpha(opacity=1);}.x-layout-split-h{background-image:url(../images/default/s.gif);background-position:left;}.x-layout-split-v{background-image:url(../images/default/s.gif);background-position:top;}.x-column-layout-ct{overflow:hidden;zoom:1;}.x-column{float:left;padding:0;margin:0;overflow:hidden;zoom:1;}.x-column-inner{overflow:hidden;zoom:1;}.x-layout-mini{position:absolute;top:0;left:0;display:block;width:5px;height:35px;cursor:pointer;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);}.x-layout-mini-over,.x-layout-collapsed-over .x-layout-mini{opacity:1;-moz-opacity:1;filter:none;}.x-layout-split-west .x-layout-mini{top:48%;}.x-layout-split-east .x-layout-mini{top:48%;}.x-layout-split-north .x-layout-mini{left:48%;height:5px;width:35px;}.x-layout-split-south .x-layout-mini{left:48%;height:5px;width:35px;}.x-layout-cmini-west .x-layout-mini{top:48%;}.x-layout-cmini-east .x-layout-mini{top:48%;}.x-layout-cmini-north .x-layout-mini{left:48%;height:5px;width:35px;}.x-layout-cmini-south .x-layout-mini{left:48%;height:5px;width:35px;}.x-layout-cmini-west,.x-layout-cmini-east{border:0 none;width:5px!important;padding:0;background-color:transparent;}.x-layout-cmini-north,.x-layout-cmini-south{border:0 none;height:5px!important;padding:0;background-color:transparent;}.x-viewport,.x-viewport body{margin:0;padding:0;border:0 none;overflow:hidden;height:100%;}.x-abs-layout-item{position:absolute;left:0;top:0;}.ext-ie input.x-abs-layout-item,.ext-ie textarea.x-abs-layout-item{margin:0;}.x-box-layout-ct{overflow:hidden;zoom:1;}.x-box-inner{overflow:hidden;zoom:1;position:relative;left:0;top:0;}.x-box-item{position:absolute;left:0;top:0;}.x-progress-wrap{border:1px solid;overflow:hidden;}.x-progress-inner{height:18px;background:repeat-x;position:relative;}.x-progress-bar{height:18px;float:left;width:0;background:repeat-x left center;border-top:1px solid;border-bottom:1px solid;border-right:1px solid;}.x-progress-text{padding:1px 5px;overflow:hidden;position:absolute;left:0;text-align:center;}.x-progress-text-back{line-height:16px;}.ext-ie .x-progress-text-back{line-height:15px;}.ext-strict .ext-ie7 .x-progress-text-back{width:100%;}.x-list-header{background:repeat-x 0 bottom;cursor:default;zoom:1;height:22px;}.x-list-header-inner div{display:block;float:left;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;}.x-list-header-inner div em{display:block;border-left:1px solid;padding:4px 4px;overflow:hidden;-moz-user-select:none;-khtml-user-select:none;line-height:14px;}.x-list-body{overflow:auto;overflow-x:hidden;overflow-y:auto;zoom:1;float:left;width:100%;}.x-list-body dl{zoom:1;}.x-list-body dt{display:block;float:left;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;zoom:1;}.x-list-body dt em{display:block;padding:3px 4px;overflow:hidden;-moz-user-select:none;-khtml-user-select:none;}.x-list-resizer{border-left:1px solid;border-right:1px solid;position:absolute;left:0;top:0;}.x-list-header-inner em.sort-asc{background:transparent no-repeat center 0;border-style:solid;border-width:0 1px 1px;padding-bottom:3px;}.x-list-header-inner em.sort-desc{background:transparent no-repeat center -23px;border-style:solid;border-width:0 1px 1px;padding-bottom:3px;}.x-slider{zoom:1;}.x-slider-inner{position:relative;left:0;top:0;overflow:visible;zoom:1;}.x-slider-focus{position:absolute;left:0;top:0;width:1px;height:1px;line-height:1px;font-size:1px;-moz-outline:0 none;outline:0 none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:ignore;display:block;overflow:hidden;}.x-slider-horz{padding-left:7px;background:transparent no-repeat 0 -22px;}.x-slider-horz .x-slider-end{padding-right:7px;zoom:1;background:transparent no-repeat right -44px;}.x-slider-horz .x-slider-inner{background:transparent repeat-x 0 0;height:22px;}.x-slider-horz .x-slider-thumb{width:14px;height:15px;position:absolute;left:0;top:3px;background:transparent no-repeat 0 0;}.x-slider-horz .x-slider-thumb-over{background-position:-14px -15px;}.x-slider-horz .x-slider-thumb-drag{background-position:-28px -30px;}.x-slider-vert{padding-top:7px;background:transparent no-repeat -44px 0;width:22px;}.x-slider-vert .x-slider-end{padding-bottom:7px;zoom:1;background:transparent no-repeat -22px bottom;}.x-slider-vert .x-slider-inner{background:transparent repeat-y 0 0;}.x-slider-vert .x-slider-thumb{width:15px;height:14px;position:absolute;left:3px;bottom:0;background:transparent no-repeat 0 0;}.x-slider-vert .x-slider-thumb-over{background-position:-15px -14px;}.x-slider-vert .x-slider-thumb-drag{background-position:-30px -28px;}.x-window-dlg .x-window-body{border:0 none!important;padding:5px 10px;overflow:hidden!important;}.x-window-dlg .x-window-mc{border:0 none!important;}.x-window-dlg .ext-mb-input{margin-top:4px;width:95%;}.x-window-dlg .ext-mb-textarea{margin-top:4px;}.x-window-dlg .x-progress-wrap{margin-top:4px;}.ext-ie .x-window-dlg .x-progress-wrap{margin-top:6px;}.x-window-dlg .x-msg-box-wait{background:transparent no-repeat left;display:block;width:300px;padding-left:18px;line-height:18px;}.x-window-dlg .ext-mb-icon{float:left;width:47px;height:32px;}.x-window-dlg .x-dlg-icon .ext-mb-content{zoom:1;margin-left:47px;}.x-window-dlg .ext-mb-info,.x-window-dlg .ext-mb-warning,.x-window-dlg .ext-mb-question,.x-window-dlg .ext-mb-error{background:transparent no-repeat top left;}.ext-gecko2 .ext-mb-fix-cursor{overflow:auto;}.ext-el-mask{background-color:#ccc;}.ext-el-mask-msg{border-color:#6593cf;background-color:#c3daf9;background-image:url(../images/default/box/tb-blue.gif);}.ext-el-mask-msg div{background-color:#eee;border-color:#a3bad9;color:#222;font:normal 11px tahoma,arial,helvetica,sans-serif;}.x-mask-loading div{background-color:#fbfbfb;background-image:url(../images/default/grid/loading.gif);}.x-item-disabled{color:gray;}.x-item-disabled *{color:gray!important;}.x-splitbar-proxy{background-color:#aaa;}.x-color-palette a{border-color:#fff;}.x-color-palette a:hover,.x-color-palette a.x-color-palette-sel{border-color:#8bb8f3;background-color:#deecfd;}.x-color-palette em{border-color:#aca899;}.x-ie-shadow{background-color:#777;}.x-shadow .xsmc{background-image:url(../images/default/shadow-c.png);}.x-shadow .xsml,.x-shadow .xsmr{background-image:url(../images/default/shadow-lr.png);}.x-shadow .xstl,.x-shadow .xstc,.x-shadow .xstr,.x-shadow .xsbl,.x-shadow .xsbc,.x-shadow .xsbr{background-image:url(../images/default/shadow.png);}.loading-indicator{font-size:11px;background-image:url(../images/default/grid/loading.gif);}.x-spotlight{background-color:#ccc;}.x-tab-panel-header,.x-tab-panel-footer{background-color:#deecfd;border-color:#8db2e3;overflow:hidden;zoom:1;}.x-tab-panel-header,.x-tab-panel-footer{border-color:#8db2e3;}ul.x-tab-strip-top{background-color:#cedff5;background-image:url(../images/default/tabs/tab-strip-bg.gif);border-bottom-color:#8db2e3;}ul.x-tab-strip-bottom{background-color:#cedff5;background-image:url(../images/default/tabs/tab-strip-btm-bg.gif);border-top-color:#8db2e3;}.x-tab-panel-header-plain .x-tab-strip-spacer,.x-tab-panel-footer-plain .x-tab-strip-spacer{border-color:#8db2e3;background-color:#deecfd;}.x-tab-strip span.x-tab-strip-text{font:normal 11px tahoma,arial,helvetica;color:#416aa3;}.x-tab-strip-over span.x-tab-strip-text{color:#15428b;}.x-tab-strip-active span.x-tab-strip-text{color:#15428b;font-weight:bold;}.x-tab-strip-disabled .x-tabs-text{color:#aaa;}.x-tab-strip-top .x-tab-right,.x-tab-strip-top .x-tab-left,.x-tab-strip-top .x-tab-strip-inner{background-image:url(../images/default/tabs/tabs-sprite.gif);}.x-tab-strip-bottom .x-tab-right{background-image:url(../images/default/tabs/tab-btm-inactive-right-bg.gif);}.x-tab-strip-bottom .x-tab-left{background-image:url(../images/default/tabs/tab-btm-inactive-left-bg.gif);}.x-tab-strip-bottom .x-tab-strip-over .x-tab-right{background-image:url(../images/default/tabs/tab-btm-over-right-bg.gif);}.x-tab-strip-bottom .x-tab-strip-over .x-tab-left{background-image:url(../images/default/tabs/tab-btm-over-left-bg.gif);}.x-tab-strip-bottom .x-tab-strip-active .x-tab-right{background-image:url(../images/default/tabs/tab-btm-right-bg.gif);}.x-tab-strip-bottom .x-tab-strip-active .x-tab-left{background-image:url(../images/default/tabs/tab-btm-left-bg.gif);}.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close{background-image:url(../images/default/tabs/tab-close.gif);}.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{background-image:url(../images/default/tabs/tab-close.gif);}.x-tab-panel-body{border-color:#8db2e3;background-color:#fff;}.x-tab-panel-body-top{border-top:0 none;}.x-tab-panel-body-bottom{border-bottom:0 none;}.x-tab-scroller-left{background-image:url(../images/default/tabs/scroll-left.gif);border-bottom-color:#8db2e3;}.x-tab-scroller-left-over{background-position:0 0;}.x-tab-scroller-left-disabled{background-position:-18px 0;opacity:.5;-moz-opacity:.5;filter:alpha(opacity=50);cursor:default;}.x-tab-scroller-right{background-image:url(../images/default/tabs/scroll-right.gif);border-bottom-color:#8db2e3;}.x-tab-panel-bbar .x-toolbar,.x-tab-panel-tbar .x-toolbar{border-color:#99bbe8;}.x-form-field{font:normal 12px tahoma,arial,helvetica,sans-serif;}.x-form-text,textarea.x-form-field{background-color:#fff;background-image:url(../images/default/form/text-bg.gif);border-color:#b5b8c8;}.x-form-select-one{background-color:#fff;border-color:#b5b8c8;}.x-form-check-group-label{border-bottom:1px solid #99bbe8;color:#15428b;}.x-editor .x-form-check-wrap{background-color:#fff;}.x-form-field-wrap .x-form-trigger{background-image:url(../images/default/form/trigger.gif);border-bottom-color:#b5b8c8;}.x-form-field-wrap .x-form-date-trigger{background-image:url(../images/default/form/date-trigger.gif);}.x-form-field-wrap .x-form-clear-trigger{background-image:url(../images/default/form/clear-trigger.gif);}.x-form-field-wrap .x-form-search-trigger{background-image:url(../images/default/form/search-trigger.gif);}.x-trigger-wrap-focus .x-form-trigger{border-bottom-color:#7eadd9;}.x-item-disabled .x-form-trigger-over{border-bottom-color:#b5b8c8;}.x-item-disabled .x-form-trigger-click{border-bottom-color:#b5b8c8;}.x-form-focus,textarea.x-form-focus{border-color:#7eadd9;}.x-form-invalid,textarea.x-form-invalid{background-color:#fff;background-image:url(../images/default/grid/invalid_line.gif);border-color:#c30;}.x-form-invalid.x-form-composite{border:0;background-image:none;}.x-form-invalid.x-form-composite .x-form-invalid{background-color:#fff;background-image:url(../images/default/grid/invalid_line.gif);border-color:#c30;}.x-form-inner-invalid,textarea.x-form-inner-invalid{background-color:#fff;background-image:url(../images/default/grid/invalid_line.gif);}.x-form-grow-sizer{font:normal 12px tahoma,arial,helvetica,sans-serif;}.x-form-item{font:normal 12px tahoma,arial,helvetica,sans-serif;}.x-form-invalid-msg{color:#c0272b;font:normal 11px tahoma,arial,helvetica,sans-serif;background-image:url(../images/default/shared/warning.gif);}.x-form-empty-field{color:gray;}.x-small-editor .x-form-field{font:normal 11px arial,tahoma,helvetica,sans-serif;}.ext-webkit .x-small-editor .x-form-field{font:normal 11px arial,tahoma,helvetica,sans-serif;}.x-form-invalid-icon{background-image:url(../images/default/form/exclamation.gif);}.x-fieldset{border-color:#b5b8c8;}.x-fieldset legend{font:bold 11px tahoma,arial,helvetica,sans-serif;color:#15428b;}.x-btn{font:normal 11px tahoma,verdana,helvetica;}.x-btn button{font:normal 11px arial,tahoma,verdana,helvetica;color:#333;}.x-btn em{font-style:normal;font-weight:normal;}.x-btn-tl,.x-btn-tr,.x-btn-tc,.x-btn-ml,.x-btn-mr,.x-btn-mc,.x-btn-bl,.x-btn-br,.x-btn-bc{background-image:url(../images/default/button/btn.gif);}.x-btn-click .x-btn-text,.x-btn-menu-active .x-btn-text,.x-btn-pressed .x-btn-text{color:#000;}.x-btn-disabled *{color:gray!important;}.x-btn-mc em.x-btn-arrow{background-image:url(../images/default/button/arrow.gif);}.x-btn-mc em.x-btn-split{background-image:url(../images/default/button/s-arrow.gif);}.x-btn-over .x-btn-mc em.x-btn-split,.x-btn-click .x-btn-mc em.x-btn-split,.x-btn-menu-active .x-btn-mc em.x-btn-split,.x-btn-pressed .x-btn-mc em.x-btn-split{background-image:url(../images/default/button/s-arrow-o.gif);}.x-btn-mc em.x-btn-arrow-bottom{background-image:url(../images/default/button/s-arrow-b-noline.gif);}.x-btn-mc em.x-btn-split-bottom{background-image:url(../images/default/button/s-arrow-b.gif);}.x-btn-over .x-btn-mc em.x-btn-split-bottom,.x-btn-click .x-btn-mc em.x-btn-split-bottom,.x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,.x-btn-pressed .x-btn-mc em.x-btn-split-bottom{background-image:url(../images/default/button/s-arrow-bo.gif);}.x-btn-group-header{color:#3e6aaa;}.x-btn-group-tc{background-image:url(../images/default/button/group-tb.gif);}.x-btn-group-tl{background-image:url(../images/default/button/group-cs.gif);}.x-btn-group-tr{background-image:url(../images/default/button/group-cs.gif);}.x-btn-group-bc{background-image:url(../images/default/button/group-tb.gif);}.x-btn-group-bl{background-image:url(../images/default/button/group-cs.gif);}.x-btn-group-br{background-image:url(../images/default/button/group-cs.gif);}.x-btn-group-ml{background-image:url(../images/default/button/group-lr.gif);}.x-btn-group-mr{background-image:url(../images/default/button/group-lr.gif);}.x-btn-group-notitle .x-btn-group-tc{background-image:url(../images/default/button/group-tb.gif);}.x-toolbar{border-color:#a9bfd3;background-color:#d0def0;background-image:url(../images/default/toolbar/bg.gif);}.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{font:normal 11px arial,tahoma,helvetica,sans-serif;}.x-toolbar .x-item-disabled{color:gray;}.x-toolbar .x-item-disabled *{color:gray;}.x-toolbar .x-btn-mc em.x-btn-split{background-image:url(../images/default/button/s-arrow-noline.gif);}.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split{background-image:url(../images/default/button/s-arrow-o.gif);}.x-toolbar .x-btn-mc em.x-btn-split-bottom{background-image:url(../images/default/button/s-arrow-b-noline.gif);}.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom,.x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom{background-image:url(../images/default/button/s-arrow-bo.gif);}.x-toolbar .xtb-sep{background-image:url(../images/default/grid/grid-blue-split.gif);}.x-tbar-page-first{background-image:url(../images/default/grid/page-first.gif)!important;}.x-tbar-loading{background-image:url(../images/default/grid/refresh.gif)!important;}.x-tbar-page-last{background-image:url(../images/default/grid/page-last.gif)!important;}.x-tbar-page-next{background-image:url(../images/default/grid/page-next.gif)!important;}.x-tbar-page-prev{background-image:url(../images/default/grid/page-prev.gif)!important;}.x-item-disabled .x-tbar-loading{background-image:url(../images/default/grid/refresh-disabled.gif)!important;}.x-item-disabled .x-tbar-page-first{background-image:url(../images/default/grid/page-first-disabled.gif)!important;}.x-item-disabled .x-tbar-page-last{background-image:url(../images/default/grid/page-last-disabled.gif)!important;}.x-item-disabled .x-tbar-page-next{background-image:url(../images/default/grid/page-next-disabled.gif)!important;}.x-item-disabled .x-tbar-page-prev{background-image:url(../images/default/grid/page-prev-disabled.gif)!important;}.x-paging-info{color:#444;}.x-toolbar-more-icon{background-image:url(../images/default/toolbar/more.gif)!important;}.x-resizable-handle{background-color:#fff;}.x-resizable-over .x-resizable-handle-east,.x-resizable-pinned .x-resizable-handle-east,.x-resizable-over .x-resizable-handle-west,.x-resizable-pinned .x-resizable-handle-west{background-image:url(../images/default/sizer/e-handle.gif);}.x-resizable-over .x-resizable-handle-south,.x-resizable-pinned .x-resizable-handle-south,.x-resizable-over .x-resizable-handle-north,.x-resizable-pinned .x-resizable-handle-north{background-image:url(../images/default/sizer/s-handle.gif);}.x-resizable-over .x-resizable-handle-north,.x-resizable-pinned .x-resizable-handle-north{background-image:url(../images/default/sizer/s-handle.gif);}.x-resizable-over .x-resizable-handle-southeast,.x-resizable-pinned .x-resizable-handle-southeast{background-image:url(../images/default/sizer/se-handle.gif);}.x-resizable-over .x-resizable-handle-northwest,.x-resizable-pinned .x-resizable-handle-northwest{background-image:url(../images/default/sizer/nw-handle.gif);}.x-resizable-over .x-resizable-handle-northeast,.x-resizable-pinned .x-resizable-handle-northeast{background-image:url(../images/default/sizer/ne-handle.gif);}.x-resizable-over .x-resizable-handle-southwest,.x-resizable-pinned .x-resizable-handle-southwest{background-image:url(../images/default/sizer/sw-handle.gif);}.x-resizable-proxy{border-color:#3b5a82;}.x-resizable-overlay{background-color:#fff;}.x-grid3{background-color:#fff;}.x-grid-panel .x-panel-mc .x-panel-body{border-color:#99bbe8;}.x-grid3-row td,.x-grid3-summary-row td{font:normal 11px/13px arial,tahoma,helvetica,sans-serif;}.x-grid3-hd-row td{font:normal 11px/15px arial,tahoma,helvetica,sans-serif;}.x-grid3-hd-row td{border-left-color:#eee;border-right-color:#d0d0d0;}.x-grid-row-loading{background-color:#fff;background-image:url(../images/default/shared/loading-balls.gif);}.x-grid3-row{border-color:#ededed;border-top-color:#fff;}.x-grid3-row-alt{background-color:#fafafa;}.x-grid3-row-over{border-color:#ddd;background-color:#efefef;background-image:url(../images/default/grid/row-over.gif);}.x-grid3-resize-proxy{background-color:#777;}.x-grid3-resize-marker{background-color:#777;}.x-grid3-header{background-color:#f9f9f9;background-image:url(../images/default/grid/grid3-hrow.gif);}.x-grid3-header-pop{border-left-color:#d0d0d0;}.x-grid3-header-pop-inner{border-left-color:#eee;background-image:url(../images/default/grid/hd-pop.gif);}td.x-grid3-hd-over,td.sort-desc,td.sort-asc,td.x-grid3-hd-menu-open{border-left-color:#aaccf6;border-right-color:#aaccf6;}td.x-grid3-hd-over .x-grid3-hd-inner,td.sort-desc .x-grid3-hd-inner,td.sort-asc .x-grid3-hd-inner,td.x-grid3-hd-menu-open .x-grid3-hd-inner{background-color:#ebf3fd;background-image:url(../images/default/grid/grid3-hrow-over.gif);}.sort-asc .x-grid3-sort-icon{background-image:url(../images/default/grid/sort_asc.gif);}.sort-desc .x-grid3-sort-icon{background-image:url(../images/default/grid/sort_desc.gif);}.x-grid3-cell-text,.x-grid3-hd-text{color:#000;}.x-grid3-split{background-image:url(../images/default/grid/grid-split.gif);}.x-grid3-hd-text{color:#15428b;}.x-dd-drag-proxy .x-grid3-hd-inner{background-color:#ebf3fd;background-image:url(../images/default/grid/grid3-hrow-over.gif);border-color:#aaccf6;}.col-move-top{background-image:url(../images/default/grid/col-move-top.gif);}.col-move-bottom{background-image:url(../images/default/grid/col-move-bottom.gif);}td.grid-hd-group-cell{background:url(../images/default/grid/grid3-hrow.gif) repeat-x bottom;}.x-grid3-row-selected{background-color:#dfe8f6!important;background-image:none;border-color:#a3bae9;}.x-grid3-cell-selected{background-color:#b8cfee!important;color:#000;}.x-grid3-cell-selected span{color:#000!important;}.x-grid3-cell-selected .x-grid3-cell-text{color:#000;}.x-grid3-locked td.x-grid3-row-marker,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{background-color:#ebeadb!important;background-image:url(../images/default/grid/grid-hrow.gif)!important;color:#000;border-top-color:#fff;border-right-color:#6fa0df!important;}.x-grid3-locked td.x-grid3-row-marker div,.x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{color:#15428b!important;}.x-grid3-dirty-cell{background-image:url(../images/default/grid/dirty.gif);}.x-grid3-topbar,.x-grid3-bottombar{font:normal 11px arial,tahoma,helvetica,sans-serif;}.x-grid3-bottombar .x-toolbar{border-top-color:#a9bfd3;}.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{background-image:url(../images/default/grid/grid3-special-col-bg.gif)!important;color:#000!important;}.x-props-grid .x-grid3-body .x-grid3-td-name{background-color:#fff!important;border-right-color:#eee;}.xg-hmenu-sort-asc .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-asc.gif);}.xg-hmenu-sort-desc .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-desc.gif);}.xg-hmenu-lock .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-lock.gif);}.xg-hmenu-unlock .x-menu-item-icon{background-image:url(../images/default/grid/hmenu-unlock.gif);}.x-grid3-hd-btn{background-color:#c3daf9;background-image:url(../images/default/grid/grid3-hd-btn.gif);}.x-grid3-body .x-grid3-td-expander{background-image:url(../images/default/grid/grid3-special-col-bg.gif);}.x-grid3-row-expander{background-image:url(../images/default/grid/row-expand-sprite.gif);}.x-grid3-body .x-grid3-td-checker{background-image:url(../images/default/grid/grid3-special-col-bg.gif);}.x-grid3-row-checker,.x-grid3-hd-checker{background-image:url(../images/default/grid/row-check-sprite.gif);}.x-grid3-body .x-grid3-td-numberer{background-image:url(../images/default/grid/grid3-special-col-bg.gif);}.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner{color:#444;}.x-grid3-body .x-grid3-td-row-icon{background-image:url(../images/default/grid/grid3-special-col-bg.gif);}.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer,.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker,.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander{background-image:url(../images/default/grid/grid3-special-col-sel-bg.gif);}.x-grid3-check-col{background-image:url(../images/default/menu/unchecked.gif);}.x-grid3-check-col-on{background-image:url(../images/default/menu/checked.gif);}.x-grid-group,.x-grid-group-body,.x-grid-group-hd{zoom:1;}.x-grid-group-hd{border-bottom-color:#99bbe8;}.x-grid-group-hd div.x-grid-group-title{background-image:url(../images/default/grid/group-collapse.gif);color:#3764a0;font:bold 11px tahoma,arial,helvetica,sans-serif;}.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title{background-image:url(../images/default/grid/group-expand.gif);}.x-group-by-icon{background-image:url(../images/default/grid/group-by.gif);}.x-cols-icon{background-image:url(../images/default/grid/columns.gif);}.x-show-groups-icon{background-image:url(../images/default/grid/group-by.gif);}.x-grid-empty{color:gray;font:normal 11px tahoma,arial,helvetica,sans-serif;}.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell{border-right-color:#ededed;}.x-grid-with-col-lines .x-grid3-row-selected{border-top-color:#a3bae9;}.x-pivotgrid .x-grid3-header-offset table td{background:url(../images/default/grid/grid3-hrow.gif) repeat-x 50% 100%;border-left:1px solid;border-right:1px solid;border-left-color:#EEE;border-right-color:#d0d0d0;}.x-pivotgrid .x-grid3-row-headers{background-color:#f9f9f9;}.x-pivotgrid .x-grid3-row-headers table td{background:#EEE url(../images/default/grid/grid3-rowheader.gif) repeat-x left top;border-left:1px solid;border-right:1px solid;border-left-color:#EEE;border-right-color:#d0d0d0;border-bottom:1px solid;border-bottom-color:#d0d0d0;height:18px;}.x-dd-drag-ghost{color:#000;font:normal 11px arial,helvetica,sans-serif;border-color:#ddd #bbb #bbb #ddd;background-color:#fff;}.x-dd-drop-nodrop .x-dd-drop-icon{background-image:url(../images/default/dd/drop-no.gif);}.x-dd-drop-ok .x-dd-drop-icon{background-image:url(../images/default/dd/drop-yes.gif);}.x-dd-drop-ok-add .x-dd-drop-icon{background-image:url(../images/default/dd/drop-add.gif);}.x-view-selector{background-color:#c3daf9;border-color:#39b;}.x-tree-node-expanded .x-tree-node-icon{background-image:url(../images/default/tree/folder-open.gif);}.x-tree-node-leaf .x-tree-node-icon{background-image:url(../images/default/tree/leaf.gif);}.x-tree-node-collapsed .x-tree-node-icon{background-image:url(../images/default/tree/folder.gif);}.x-tree-node-loading .x-tree-node-icon{background-image:url(../images/default/tree/loading.gif)!important;}.x-tree-node .x-tree-node-inline-icon{background-image:none;}.x-tree-node-loading a span{font-style:italic;color:#444;}.x-tree-lines .x-tree-elbow{background-image:url(../images/default/tree/elbow.gif);}.x-tree-lines .x-tree-elbow-plus{background-image:url(../images/default/tree/elbow-plus.gif);}.x-tree-lines .x-tree-elbow-minus{background-image:url(../images/default/tree/elbow-minus.gif);}.x-tree-lines .x-tree-elbow-end{background-image:url(../images/default/tree/elbow-end.gif);}.x-tree-lines .x-tree-elbow-end-plus{background-image:url(../images/default/tree/elbow-end-plus.gif);}.x-tree-lines .x-tree-elbow-end-minus{background-image:url(../images/default/tree/elbow-end-minus.gif);}.x-tree-lines .x-tree-elbow-line{background-image:url(../images/default/tree/elbow-line.gif);}.x-tree-no-lines .x-tree-elbow-plus{background-image:url(../images/default/tree/elbow-plus-nl.gif);}.x-tree-no-lines .x-tree-elbow-minus{background-image:url(../images/default/tree/elbow-minus-nl.gif);}.x-tree-no-lines .x-tree-elbow-end-plus{background-image:url(../images/default/tree/elbow-end-plus-nl.gif);}.x-tree-no-lines .x-tree-elbow-end-minus{background-image:url(../images/default/tree/elbow-end-minus-nl.gif);}.x-tree-arrows .x-tree-elbow-plus{background-image:url(../images/default/tree/arrows.gif);}.x-tree-arrows .x-tree-elbow-minus{background-image:url(../images/default/tree/arrows.gif);}.x-tree-arrows .x-tree-elbow-end-plus{background-image:url(../images/default/tree/arrows.gif);}.x-tree-arrows .x-tree-elbow-end-minus{background-image:url(../images/default/tree/arrows.gif);}.x-tree-node{color:#000;font:normal 11px arial,tahoma,helvetica,sans-serif;}.x-tree-node a,.x-dd-drag-ghost a{color:#000;}.x-tree-node a span,.x-dd-drag-ghost a span{color:#000;}.x-tree-node .x-tree-node-disabled a span{color:gray!important;}.x-tree-node div.x-tree-drag-insert-below{border-bottom-color:#36c;}.x-tree-node div.x-tree-drag-insert-above{border-top-color:#36c;}.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{border-bottom-color:#36c;}.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{border-top-color:#36c;}.x-tree-node .x-tree-drag-append a span{background-color:#ddd;border-color:gray;}.x-tree-node .x-tree-node-over{background-color:#eee;}.x-tree-node .x-tree-selected{background-color:#d9e8fb;}.x-tree-drop-ok-append .x-dd-drop-icon{background-image:url(../images/default/tree/drop-add.gif);}.x-tree-drop-ok-above .x-dd-drop-icon{background-image:url(../images/default/tree/drop-over.gif);}.x-tree-drop-ok-below .x-dd-drop-icon{background-image:url(../images/default/tree/drop-under.gif);}.x-tree-drop-ok-between .x-dd-drop-icon{background-image:url(../images/default/tree/drop-between.gif);}.x-date-picker{border-color:#1b376c;background-color:#fff;}.x-date-middle,.x-date-left,.x-date-right{background-image:url(../images/default/shared/hd-sprite.gif);color:#fff;font:bold 11px "sans serif",tahoma,verdana,helvetica;}.x-date-middle .x-btn .x-btn-text{color:#fff;}.x-date-middle .x-btn-mc em.x-btn-arrow{background-image:url(../images/default/toolbar/btn-arrow-light.gif);}.x-date-right a{background-image:url(../images/default/shared/right-btn.gif);}.x-date-left a{background-image:url(../images/default/shared/left-btn.gif);}.x-date-inner th{background-color:#dfecfb;background-image:url(../images/default/shared/glass-bg.gif);border-bottom-color:#a3bad9;font:normal 10px arial,helvetica,tahoma,sans-serif;color:#233d6d;}.x-date-inner td{border-color:#fff;}.x-date-inner a{font:normal 11px arial,helvetica,tahoma,sans-serif;color:#000;}.x-date-inner .x-date-active{color:#000;}.x-date-inner .x-date-selected a{background-color:#dfecfb;background-image:url(../images/default/shared/glass-bg.gif);border-color:#8db2e3;}.x-date-inner .x-date-today a{border-color:darkred;}.x-date-inner .x-date-selected span{font-weight:bold;}.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a{color:#aaa;}.x-date-bottom{border-top-color:#a3bad9;background-color:#dfecfb;background-image:url(../images/default/shared/glass-bg.gif);}.x-date-inner a:hover,.x-date-inner .x-date-disabled a:hover{color:#000;background-color:#ddecfe;}.x-date-inner .x-date-disabled a{background-color:#eee;color:#bbb;}.x-date-mmenu{background-color:#eee!important;}.x-date-mmenu .x-menu-item{font-size:10px;color:#000;}.x-date-mp{background-color:#fff;}.x-date-mp td{font:normal 11px arial,helvetica,tahoma,sans-serif;}.x-date-mp-btns button{background-color:#083772;color:#fff;border-color:#36c #005 #005 #36c;font:normal 11px arial,helvetica,tahoma,sans-serif;}.x-date-mp-btns{background-color:#dfecfb;background-image:url(../images/default/shared/glass-bg.gif);}.x-date-mp-btns td{border-top-color:#c5d2df;}td.x-date-mp-month a,td.x-date-mp-year a{color:#15428b;}td.x-date-mp-month a:hover,td.x-date-mp-year a:hover{color:#15428b;background-color:#ddecfe;}td.x-date-mp-sel a{background-color:#dfecfb;background-image:url(../images/default/shared/glass-bg.gif);border-color:#8db2e3;}.x-date-mp-ybtn a{background-image:url(../images/default/panel/tool-sprites.gif);}td.x-date-mp-sep{border-right-color:#c5d2df;}.x-tip .x-tip-close{background-image:url(../images/default/qtip/close.gif);}.x-tip .x-tip-tc,.x-tip .x-tip-tl,.x-tip .x-tip-tr,.x-tip .x-tip-bc,.x-tip .x-tip-bl,.x-tip .x-tip-br,.x-tip .x-tip-ml,.x-tip .x-tip-mr{background-image:url(../images/default/qtip/tip-sprite.gif);}.x-tip .x-tip-mc{font:normal 11px tahoma,arial,helvetica,sans-serif;}.x-tip .x-tip-ml{background-color:#fff;}.x-tip .x-tip-header-text{font:bold 11px tahoma,arial,helvetica,sans-serif;color:#444;}.x-tip .x-tip-body{font:normal 11px tahoma,arial,helvetica,sans-serif;color:#444;}.x-form-invalid-tip .x-tip-tc,.x-form-invalid-tip .x-tip-tl,.x-form-invalid-tip .x-tip-tr,.x-form-invalid-tip .x-tip-bc,.x-form-invalid-tip .x-tip-bl,.x-form-invalid-tip .x-tip-br,.x-form-invalid-tip .x-tip-ml,.x-form-invalid-tip .x-tip-mr{background-image:url(../images/default/form/error-tip-corners.gif);}.x-form-invalid-tip .x-tip-body{background-image:url(../images/default/form/exclamation.gif);}.x-tip-anchor{background-image:url(../images/default/qtip/tip-anchor-sprite.gif);}.x-menu{background-color:#f0f0f0;background-image:url(../images/default/menu/menu.gif);}.x-menu-floating{border-color:#718bb7;}.x-menu-nosep{background-image:none;}.x-menu-list-item{font:normal 11px arial,tahoma,sans-serif;}.x-menu-item-arrow{background-image:url(../images/default/menu/menu-parent.gif);}.x-menu-sep{background-color:#e0e0e0;border-bottom-color:#fff;}a.x-menu-item{color:#222;}.x-menu-item-active{background-image:url(../images/default/menu/item-over.gif);background-color:#dbecf4;border-color:#aaccf6;}.x-menu-item-active a.x-menu-item{border-color:#aaccf6;}.x-menu-check-item .x-menu-item-icon{background-image:url(../images/default/menu/unchecked.gif);}.x-menu-item-checked .x-menu-item-icon{background-image:url(../images/default/menu/checked.gif);}.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{background-image:url(../images/default/menu/group-checked.gif);}.x-menu-group-item .x-menu-item-icon{background-image:none;}.x-menu-plain{background-color:#f0f0f0!important;background-image:none;}.x-date-menu,.x-color-menu{background-color:#fff!important;}.x-menu .x-date-picker{border-color:#a3bad9;}.x-cycle-menu .x-menu-item-checked{border-color:#a3bae9!important;background-color:#def8f6;}.x-menu-scroller-top{background-image:url(../images/default/layout/mini-top.gif);}.x-menu-scroller-bottom{background-image:url(../images/default/layout/mini-bottom.gif);}.x-box-tl{background-image:url(../images/default/box/corners.gif);}.x-box-tc{background-image:url(../images/default/box/tb.gif);}.x-box-tr{background-image:url(../images/default/box/corners.gif);}.x-box-ml{background-image:url(../images/default/box/l.gif);}.x-box-mc{background-color:#eee;background-image:url(../images/default/box/tb.gif);font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif;color:#393939;font-size:12px;}.x-box-mc h3{font-size:14px;font-weight:bold;}.x-box-mr{background-image:url(../images/default/box/r.gif);}.x-box-bl{background-image:url(../images/default/box/corners.gif);}.x-box-bc{background-image:url(../images/default/box/tb.gif);}.x-box-br{background-image:url(../images/default/box/corners.gif);}.x-box-blue .x-box-bl,.x-box-blue .x-box-br,.x-box-blue .x-box-tl,.x-box-blue .x-box-tr{background-image:url(../images/default/box/corners-blue.gif);}.x-box-blue .x-box-bc,.x-box-blue .x-box-mc,.x-box-blue .x-box-tc{background-image:url(../images/default/box/tb-blue.gif);}.x-box-blue .x-box-mc{background-color:#c3daf9;}.x-box-blue .x-box-mc h3{color:#17385b;}.x-box-blue .x-box-ml{background-image:url(../images/default/box/l-blue.gif);}.x-box-blue .x-box-mr{background-image:url(../images/default/box/r-blue.gif);}.x-combo-list{border-color:#98c0f4;background-color:#ddecfe;font:normal 12px tahoma,arial,helvetica,sans-serif;}.x-combo-list-inner{background-color:#fff;}.x-combo-list-hd{font:bold 11px tahoma,arial,helvetica,sans-serif;color:#15428b;background-image:url(../images/default/layout/panel-title-light-bg.gif);border-bottom-color:#98c0f4;}.x-resizable-pinned .x-combo-list-inner{border-bottom-color:#98c0f4;}.x-combo-list-item{border-color:#fff;}.x-combo-list .x-combo-selected{border-color:#a3bae9!important;background-color:#dfe8f6;}.x-combo-list .x-toolbar{border-top-color:#98c0f4;}.x-combo-list-small{font:normal 11px tahoma,arial,helvetica,sans-serif;}.x-panel{border-color:#99bbe8;}.x-panel-header{color:#15428b;font-weight:bold;font-size:11px;font-family:tahoma,arial,verdana,sans-serif;border-color:#99bbe8;background-image:url(../images/default/panel/white-top-bottom.gif);}.x-panel-body{border-color:#99bbe8;background-color:#fff;}.x-panel-bbar .x-toolbar,.x-panel-tbar .x-toolbar{border-color:#99bbe8;}.x-panel-tbar-noheader .x-toolbar,.x-panel-mc .x-panel-tbar .x-toolbar{border-top-color:#99bbe8;}.x-panel-body-noheader,.x-panel-mc .x-panel-body{border-top-color:#99bbe8;}.x-panel-tl .x-panel-header{color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;}.x-panel-tc{background-image:url(../images/default/panel/top-bottom.gif);}.x-panel-tl,.x-panel-tr,.x-panel-bl,.x-panel-br{background-image:url(../images/default/panel/corners-sprite.gif);border-bottom-color:#99bbe8;}.x-panel-bc{background-image:url(../images/default/panel/top-bottom.gif);}.x-panel-mc{font:normal 11px tahoma,arial,helvetica,sans-serif;background-color:#dfe8f6;}.x-panel-ml{background-color:#fff;background-image:url(../images/default/panel/left-right.gif);}.x-panel-mr{background-image:url(../images/default/panel/left-right.gif);}.x-tool{background-image:url(../images/default/panel/tool-sprites.gif);}.x-panel-ghost{background-color:#cbddf3;}.x-panel-ghost ul{border-color:#99bbe8;}.x-panel-dd-spacer{border-color:#99bbe8;}.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{font:normal 11px arial,tahoma,helvetica,sans-serif;}.x-window-proxy{background-color:#c7dffc;border-color:#99bbe8;}.x-window-tl .x-window-header{color:#15428b;font:bold 11px tahoma,arial,verdana,sans-serif;}.x-window-tc{background-image:url(../images/default/window/top-bottom.png);}.x-window-tl{background-image:url(../images/default/window/left-corners.png);}.x-window-tr{background-image:url(../images/default/window/right-corners.png);}.x-window-bc{background-image:url(../images/default/window/top-bottom.png);}.x-window-bl{background-image:url(../images/default/window/left-corners.png);}.x-window-br{background-image:url(../images/default/window/right-corners.png);}.x-window-mc{border-color:#99bbe8;font:normal 11px tahoma,arial,helvetica,sans-serif;background-color:#dfe8f6;}.x-window-ml{background-image:url(../images/default/window/left-right.png);}.x-window-mr{background-image:url(../images/default/window/left-right.png);}.x-window-maximized .x-window-tc{background-color:#fff;}.x-window-bbar .x-toolbar{border-top-color:#99bbe8;}.x-panel-ghost .x-window-tl{border-bottom-color:#99bbe8;}.x-panel-collapsed .x-window-tl{border-bottom-color:#84a0c4;}.x-dlg-mask{background-color:#ccc;}.x-window-plain .x-window-mc{background-color:#ccd9e8;border-color:#a3bae9 #dfe8f6 #dfe8f6 #a3bae9;}.x-window-plain .x-window-body{border-color:#dfe8f6 #a3bae9 #a3bae9 #dfe8f6;}body.x-body-masked .x-window-plain .x-window-mc{background-color:#ccd9e8;}.x-html-editor-wrap{border-color:#a9bfd3;background-color:#fff;}.x-html-editor-tb .x-btn-text{background-image:url(../images/default/editor/tb-sprite.gif);}.x-panel-noborder .x-panel-header-noborder{border-bottom-color:#99bbe8;}.x-panel-noborder .x-panel-tbar-noborder .x-toolbar{border-bottom-color:#99bbe8;}.x-panel-noborder .x-panel-bbar-noborder .x-toolbar{border-top-color:#99bbe8;}.x-tab-panel-bbar-noborder .x-toolbar{border-top-color:#99bbe8;}.x-tab-panel-tbar-noborder .x-toolbar{border-bottom-color:#99bbe8;}.x-border-layout-ct{background-color:#dfe8f6;}.x-accordion-hd{color:#222;font-weight:normal;background-image:url(../images/default/panel/light-hd.gif);}.x-layout-collapsed{background-color:#d2e0f2;border-color:#98c0f4;}.x-layout-collapsed-over{background-color:#d9e8fb;}.x-layout-split-west .x-layout-mini{background-image:url(../images/default/layout/mini-left.gif);}.x-layout-split-east .x-layout-mini{background-image:url(../images/default/layout/mini-right.gif);}.x-layout-split-north .x-layout-mini{background-image:url(../images/default/layout/mini-top.gif);}.x-layout-split-south .x-layout-mini{background-image:url(../images/default/layout/mini-bottom.gif);}.x-layout-cmini-west .x-layout-mini{background-image:url(../images/default/layout/mini-right.gif);}.x-layout-cmini-east .x-layout-mini{background-image:url(../images/default/layout/mini-left.gif);}.x-layout-cmini-north .x-layout-mini{background-image:url(../images/default/layout/mini-bottom.gif);}.x-layout-cmini-south .x-layout-mini{background-image:url(../images/default/layout/mini-top.gif);}.x-progress-wrap{border-color:#6593cf;}.x-progress-inner{background-color:#e0e8f3;background-image:url(../images/default/qtip/bg.gif);}.x-progress-bar{background-color:#9cbfee;background-image:url(../images/default/progress/progress-bg.gif);border-top-color:#d1e4fd;border-bottom-color:#7fa9e4;border-right-color:#7fa9e4;}.x-progress-text{font-size:11px;font-weight:bold;color:#fff;}.x-progress-text-back{color:#396095;}.x-list-header{background-color:#f9f9f9;background-image:url(../images/default/grid/grid3-hrow.gif);}.x-list-header-inner div em{border-left-color:#ddd;font:normal 11px arial,tahoma,helvetica,sans-serif;}.x-list-body dt em{font:normal 11px arial,tahoma,helvetica,sans-serif;}.x-list-over{background-color:#eee;}.x-list-selected{background-color:#dfe8f6;}.x-list-resizer{border-left-color:#555;border-right-color:#555;}.x-list-header-inner em.sort-asc,.x-list-header-inner em.sort-desc{background-image:url(../images/default/grid/sort-hd.gif);border-color:#99bbe8;}.x-slider-horz,.x-slider-horz .x-slider-end,.x-slider-horz .x-slider-inner{background-image:url(../images/default/slider/slider-bg.png);}.x-slider-horz .x-slider-thumb{background-image:url(../images/default/slider/slider-thumb.png);}.x-slider-vert,.x-slider-vert .x-slider-end,.x-slider-vert .x-slider-inner{background-image:url(../images/default/slider/slider-v-bg.png);}.x-slider-vert .x-slider-thumb{background-image:url(../images/default/slider/slider-v-thumb.png);}.x-window-dlg .ext-mb-text,.x-window-dlg .x-window-header-text{font-size:12px;}.x-window-dlg .ext-mb-textarea{font:normal 12px tahoma,arial,helvetica,sans-serif;}.x-window-dlg .x-msg-box-wait{background-image:url(../images/default/grid/loading.gif);}.x-window-dlg .ext-mb-info{background-image:url(../images/default/window/icon-info.gif);}.x-window-dlg .ext-mb-warning{background-image:url(../images/default/window/icon-warning.gif);}.x-window-dlg .ext-mb-question{background-image:url(../images/default/window/icon-question.gif);}.x-window-dlg .ext-mb-error{background-image:url(../images/default/window/icon-error.gif);}.ext-mac.ext-webkit .x-form-check-wrap{padding-left:1px;}.ext-strict .ext-webkit .x-small-editor .x-form-text{padding-top:1px;}.x-window-body{overflow:hidden;position:relative;} diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/css/style.css b/salt/idh/skins/http/opencanary/nasLogin/static/css/style.css new file mode 100644 index 000000000..b6f74eadb --- /dev/null +++ b/salt/idh/skins/http/opencanary/nasLogin/static/css/style.css @@ -0,0 +1 @@ +.syno-backup-repo-cloud-azure_blob{background-image:url("/webman/3rdparty/addon-azure_blob/images/icon.png") !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-backup-repo-cloud-azure_blob{background-image:url("/webman/3rdparty/addon-azure_blob/images/icon@2x.png") !important;background-size:32px 32px !important}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-backup-repo-cloud-azure_blob{background-image:url("/webman/3rdparty/addon-azure_blob/images/icon@2x.png") !important;background-size:32px 32px !important;outline:1px red dashed}}.syno-backup-task-cloud-azure_blob{background-image:url("/webman/3rdparty/addon-azure_blob/images/icon.png") !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-backup-task-cloud-azure_blob{background-image:url("/webman/3rdparty/addon-azure_blob/images/icon@2x.png") !important;background-size:32px 32px !important}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-backup-task-cloud-azure_blob{background-image:url("/webman/3rdparty/addon-azure_blob/images/icon@2x.png") !important;background-size:32px 32px !important;outline:1px red dashed}} diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/css/ux-all.css b/salt/idh/skins/http/opencanary/nasLogin/static/css/ux-all.css new file mode 100644 index 000000000..efd7a572a --- /dev/null +++ b/salt/idh/skins/http/opencanary/nasLogin/static/css/ux-all.css @@ -0,0 +1,11 @@ +.syno-ux-gridpanel div,.syno-ux-editorgridpanel div,.syno-ux-grid-hd-menu li.x-menu-list-item span,.syno-ux-editorgrid-hd-menu li.x-menu-list-item span,.syno-ux-groupcheck-menu li.x-menu-list-item span,.syno-ux-searchfield-menu li.x-menu-list-item span,.syno-ux-menu li.x-menu-list-item span,.syno-ux-schedule-menu li.x-menu-list-item span,.syno-ux-button-menu li.x-menu-list-item span,.syno-ux-textfield,.syno-ux-numberfield,.x-form-item .x-form-item-label.syno-ux-item-label,.syno-ux-triggerfield,.syno-ux-combobox,.syno-ux-colorfield,.syno-ux-schedulefield,.syno-ux-datefield,.syno-ux-timefield,.syno-ux-superboxselect,.syno-ux-checkbox-label,.syno-ux-displayfield.x-form-display-field,.syno-ux-button-grey.x-btn button,.syno-ux-button-grey.x-btn-over.x-btn button,.syno-ux-button-grey:hover.x-btn button,.syno-ux-button-grey.x-btn-click.x-btn button,.syno-ux-button-grey:active.x-btn button,.syno-ux-button-default.x-btn button,.syno-ux-button-default.x-btn-over.x-btn button,.syno-ux-button-default:hover.x-btn button,.syno-ux-button-default.x-btn-click.x-btn button,.syno-ux-button-default:active.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-right.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-left.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-middle.x-btn button,.syno-ux-modulelist .x-tree-node-leaf a span,.syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.syno-ux-datefield-menu table.x-date-inner tbody tr td span,.syno-ux-datefield-menu .x-date-bottom .x-btn-noicon .x-btn-small button,.syno-ux-datefield-menu .x-date-bottom .x-btn-over.x-btn-noicon .x-btn-small button,.syno-ux-datefield-menu .x-date-bottom .x-btn-click.x-btn-noicon .x-btn-small button,.syno-ux-datefield-menu .x-date-mp tr td a,.syno-ux-datefield-menu .x-date-mp-btns button.x-date-mp-cancel,.syno-ux-datefield-menu .x-date-mp-btns button.x-date-mp-cancel:hover,.syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-text.x-form-text,.syno-ux-tab-panel .x-tab-strip-top li .x-tab-strip-text,.syno-ux-expandable-listview .item-summary .item-title,.syno-ux-treepanel .x-tree-node a span,.syno-ux-superboxselect-item,.syno-ux-combobox-list .x-combo-list-item,.syno-ux-textarea{color:#505a64}.x-item-disabled.x-form-text.syno-ux-textfield,.x-item-disabled.x-form-text.syno-ux-numberfield,.x-item-disabled .x-form-text.syno-ux-triggerfield,.x-item-disabled .x-form-text.syno-ux-combobox,.x-item-disabled .x-form-text.syno-ux-colorfield,.x-item-disabled .x-form-text.syno-ux-schedulefield,.x-item-disabled .x-form-text.syno-ux-datefield,.x-item-disabled .x-form-text.syno-ux-timefield,.x-item-disabled .x-form-text.syno-ux-superboxselect,.syno-ux-displayfield.x-form-display-field.x-item-disabled,.syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-text.x-form-empty-field,.syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-text.x-form-text.x-form-empty-field,.syno-ux-textfilter .x-form-field-wrap.x-item-disabled,.syno-ux-superboxselect-item.x-item-disabled,.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-disabled span,.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-prevday span,.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-nextday span,.syno-ux-textarea.x-item-disabled.x-form-field{color:#96a0aa}.syno-ux-grid-hd-menu li.x-menu-list-item.x-item-disabled span,.syno-ux-editorgrid-hd-menu li.x-menu-list-item.x-item-disabled span,.syno-ux-groupcheck-menu li.x-menu-list-item.x-item-disabled span,.syno-ux-searchfield-menu li.x-menu-list-item.x-item-disabled span,.syno-ux-menu li.x-menu-list-item.x-item-disabled span,.syno-ux-schedule-menu li.x-menu-list-item.x-item-disabled span,.syno-ux-button-menu li.x-menu-list-item.x-item-disabled span,.syno-ux-cb-disabled.syno-ux-checkbox-label,.syno-ux-button-grey.x-item-disabled.x-btn button,.syno-ux-button-default.x-item-disabled.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-right.x-item-disabled.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-left.x-item-disabled.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-middle.x-item-disabled.x-btn button,.syno-ux-modulelist .x-tree-node-leaf.x-tree-node-disabled a span,.syno-ux-tab-panel .x-tab-strip-top li.x-item-disabled .x-tab-strip-text{color:#96a0aa !important}.syno-ux-displayfield.x-form-display-field .syno-ux-note{color:#00a66e}.x-statusbar .syno-ux-statusbar-success{color:#1ca600}.x-statusbar .syno-ux-statusbar-error{color:#fa4b4b}.syno-ux-grid-mask-info,.x-panel .ext-el-mask-msg.syno-ux-mask-info,.x-panel .ext-el-mask-msg.syno-ux-grid-mask-info{margin:24px;padding:10px 20px 10px 80px;max-width:400px;min-height:48px;border:1px solid #BEC8D2;border-radius:6px;box-shadow:0px 1px 4px rgba(0,0,0,0.25);background-image:url("./images/Components/icon_information.png");background-position:20px 10px;background-repeat:no-repeat;cursor:default}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-grid-mask-info,.synohdpack .x-panel .ext-el-mask-msg.syno-ux-mask-info,.x-panel .synohdpack .ext-el-mask-msg.syno-ux-mask-info,.synohdpack .x-panel .ext-el-mask-msg.syno-ux-grid-mask-info,.x-panel .synohdpack .ext-el-mask-msg.syno-ux-grid-mask-info{background-image:url("../img/synohdpack/./images/Components/icon_information.png");background-size:48px 48px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-grid-mask-info,.synohdpackdebug .x-panel .ext-el-mask-msg.syno-ux-mask-info,.x-panel .synohdpackdebug .ext-el-mask-msg.syno-ux-mask-info,.synohdpackdebug .x-panel .ext-el-mask-msg.syno-ux-grid-mask-info,.x-panel .synohdpackdebug .ext-el-mask-msg.syno-ux-grid-mask-info{background-image:url("../img/synohdpack/./images/Components/icon_information.png");background-size:48px 48px;outline:1px green dashed}}.syno-ux-grid-mask-info div,.x-panel .ext-el-mask-msg.syno-ux-mask-info div,.x-panel .ext-el-mask-msg.syno-ux-grid-mask-info div{padding:0px;height:48px;display:table-cell;vertical-align:middle;word-wrap:break-word;cursor:default;font-size:13px}.syno-ux-grid-mask-info div a,.x-panel .ext-el-mask-msg.syno-ux-mask-info div a,.x-panel .ext-el-mask-msg.syno-ux-grid-mask-info div a{color:#0086e5;font-weight:bold}.syno-ux-gridpanel div,.syno-ux-editorgridpanel div{font-size:12px}.syno-ux-gridpanel .x-panel-ml,.syno-ux-editorgridpanel .x-panel-ml,.syno-ux-gridpanel .x-panel-mr,.syno-ux-editorgridpanel .x-panel-mr{background-image:none;padding:0px}.syno-ux-gridpanel .x-panel-mc,.syno-ux-editorgridpanel .x-panel-mc{padding:0px}.syno-ux-gridpanel .x-panel-tl,.syno-ux-editorgridpanel .x-panel-tl{border:0px}.syno-ux-gridpanel .x-panel-header,.syno-ux-editorgridpanel .x-panel-header{border-bottom:0px dashed transparent !important;margin-bottom:0px !important}.syno-ux-gridpanel .x-panel-tbar .x-toolbar-layout-ct,.syno-ux-editorgridpanel .x-panel-tbar .x-toolbar-layout-ct,.syno-ux-gridpanel .x-panel-tbar-noheader .x-toolbar-layout-ct,.syno-ux-editorgridpanel .x-panel-tbar-noheader .x-toolbar-layout-ct,.syno-ux-gridpanel .x-panel-tbar-noborder .x-toolbar-layout-ct,.syno-ux-editorgridpanel .x-panel-tbar-noborder .x-toolbar-layout-ct{padding:0px 0px 8px 0px;padding-bottom:8px;background-image:none;background-color:transparent;border:0px}.x-grid-panel.syno-ux-gridpanel .x-panel-bwrap,.x-grid-panel.syno-ux-editorgridpanel .x-panel-bwrap{padding-bottom:12px}.x-grid-panel.syno-ux-gridpanel .x-panel-bwrap .x-panel-body,.x-grid-panel.syno-ux-editorgridpanel .x-panel-bwrap .x-panel-body{border:0px}.x-grid-panel.syno-ux-gridpanel .x-panel-bwrap .x-panel-body .x-grid3-scroller,.x-grid-panel.syno-ux-editorgridpanel .x-panel-bwrap .x-panel-body .x-grid3-scroller{padding-right:10px}.x-grid-panel.syno-ux-gridpanel .x-panel-bwrap .x-panel-body .x-grid3,.x-grid-panel.syno-ux-editorgridpanel .x-panel-bwrap .x-panel-body .x-grid3{background-color:transparent;border-top:solid 1px #D7E1EB}.syno-ux-gridpanel .x-grid3-header,.syno-ux-editorgridpanel .x-grid3-header{background-image:none;background-color:transparent;border-bottom:solid 1px #EBF0F5;padding-top:0px;height:26px}.syno-ux-gridpanel .x-grid3-hd,.syno-ux-editorgridpanel .x-grid3-hd{height:26px;border-left:0px;border-right:solid 1px #E1EBF5}.syno-ux-gridpanel .x-grid3-hd .x-grid3-hd-inner,.syno-ux-editorgridpanel .x-grid3-hd .x-grid3-hd-inner{height:26px;line-height:26px;color:#0086e5;background-color:transparent;padding:0 8px}.syno-ux-gridpanel .x-grid3-hd.x-grid3-hd-over .x-grid3-hd-inner,.syno-ux-editorgridpanel .x-grid3-hd.x-grid3-hd-over .x-grid3-hd-inner,.syno-ux-gridpanel .x-grid3-hd.x-grid3-hd-menu-open .x-grid3-hd-inner,.syno-ux-editorgridpanel .x-grid3-hd.x-grid3-hd-menu-open .x-grid3-hd-inner{background-image:none;background-color:transparent}.syno-ux-gridpanel .x-grid3-hd.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-hd-btn,.syno-ux-editorgridpanel .x-grid3-hd.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-hd-btn,.syno-ux-gridpanel .x-grid3-hd.x-grid3-hd-menu-open .x-grid3-hd-inner .x-grid3-hd-btn,.syno-ux-editorgridpanel .x-grid3-hd.x-grid3-hd-menu-open .x-grid3-hd-inner .x-grid3-hd-btn{background-color:transparent;background-image:url("images/Components/trigger.png");background-repeat:no-repeat;background-position:-26px 0px;width:26px;height:26px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-gridpanel .x-grid3-hd.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-hd-btn,.synohdpack .syno-ux-editorgridpanel .x-grid3-hd.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-hd-btn,.synohdpack .syno-ux-gridpanel .x-grid3-hd.x-grid3-hd-menu-open .x-grid3-hd-inner .x-grid3-hd-btn,.synohdpack .syno-ux-editorgridpanel .x-grid3-hd.x-grid3-hd-menu-open .x-grid3-hd-inner .x-grid3-hd-btn{background-image:url("../img/synohdpack/images/Components/trigger.png");background-size:104px 28px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-gridpanel .x-grid3-hd.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-hd-btn,.synohdpackdebug .syno-ux-editorgridpanel .x-grid3-hd.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-hd-btn,.synohdpackdebug .syno-ux-gridpanel .x-grid3-hd.x-grid3-hd-menu-open .x-grid3-hd-inner .x-grid3-hd-btn,.synohdpackdebug .syno-ux-editorgridpanel .x-grid3-hd.x-grid3-hd-menu-open .x-grid3-hd-inner .x-grid3-hd-btn{background-image:url("../img/synohdpack/images/Components/trigger.png");background-size:104px 28px;outline:1px green dashed}}.syno-ux-gridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner,.syno-ux-editorgridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner,.syno-ux-gridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner,.syno-ux-editorgridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner{background-image:none;background-color:transparent}.syno-ux-gridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner .x-grid3-sort-icon,.syno-ux-editorgridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner .x-grid3-sort-icon,.syno-ux-gridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner .x-grid3-sort-icon,.syno-ux-editorgridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner .x-grid3-sort-icon{background-color:transparent;background-image:url("images/Components/bt_grid_dropdown.png");background-repeat:no-repeat;margin-left:4px;width:6px;height:26px;vertical-align:top}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-gridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner .x-grid3-sort-icon,.synohdpack .syno-ux-editorgridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner .x-grid3-sort-icon,.synohdpack .syno-ux-gridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner .x-grid3-sort-icon,.synohdpack .syno-ux-editorgridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner .x-grid3-sort-icon{background-image:url("../img/synohdpack/images/Components/bt_grid_dropdown.png");background-size:6px 168px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-gridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner .x-grid3-sort-icon,.synohdpackdebug .syno-ux-editorgridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner .x-grid3-sort-icon,.synohdpackdebug .syno-ux-gridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner .x-grid3-sort-icon,.synohdpackdebug .syno-ux-editorgridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner .x-grid3-sort-icon{background-image:url("../img/synohdpack/images/Components/bt_grid_dropdown.png");background-size:6px 168px;outline:1px green dashed}}.syno-ux-gridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner .x-grid3-sort-icon,.syno-ux-editorgridpanel .x-grid3-hd.sort-desc .x-grid3-hd-inner .x-grid3-sort-icon{background-position:0px 0px}.syno-ux-gridpanel .x-grid3-hd.sort-desc.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-sort-icon,.syno-ux-editorgridpanel .x-grid3-hd.sort-desc.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-sort-icon{background-position:0px -28px}.syno-ux-gridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner .x-grid3-sort-icon,.syno-ux-editorgridpanel .x-grid3-hd.sort-asc .x-grid3-hd-inner .x-grid3-sort-icon{background-position:0px -84px}.syno-ux-gridpanel .x-grid3-hd.sort-asc.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-sort-icon,.syno-ux-editorgridpanel .x-grid3-hd.sort-asc.x-grid3-hd-over .x-grid3-hd-inner .x-grid3-sort-icon{background-position:0px -112px}.syno-ux-gridpanel .x-grid3-row,.syno-ux-editorgridpanel .x-grid3-row{background-color:transparent;border-bottom:1px solid #EBF0F5;border-width:0 0 1px 0;padding-top:0px}.syno-ux-gridpanel .x-grid3-row.x-grid3-row-over,.syno-ux-editorgridpanel .x-grid3-row.x-grid3-row-over{background-color:#f5faff;border-width:0 0 1px 0}.syno-ux-gridpanel .x-grid3-row.x-grid3-row-selected,.syno-ux-editorgridpanel .x-grid3-row.x-grid3-row-selected{background-color:#e6f5ff !important;border-width:0 0 1px 0}.syno-ux-gridpanel .x-grid3-row .x-grid3-cell,.syno-ux-editorgridpanel .x-grid3-row .x-grid3-cell{height:27px}.syno-ux-gridpanel .x-grid3-row .x-grid3-cell .x-grid3-cell-inner,.syno-ux-editorgridpanel .x-grid3-row .x-grid3-cell .x-grid3-cell-inner{line-height:27px;padding:0 0 0 8px}.syno-ux-gridpanel .x-grid-group .x-grid-group-body .x-grid3-cell-first .x-grid3-cell-inner,.syno-ux-editorgridpanel .x-grid-group .x-grid-group-body .x-grid3-cell-first .x-grid3-cell-inner{padding-left:28px}.syno-ux-gridpanel .x-grid-group .x-grid-group-hd,.syno-ux-editorgridpanel .x-grid-group .x-grid-group-hd{background-image:none;height:27px;border-bottom:1px solid #EBF0F5;padding-top:0px}.syno-ux-gridpanel .x-grid-group .x-grid-group-hd div.x-grid-group-title,.syno-ux-editorgridpanel .x-grid-group .x-grid-group-hd div.x-grid-group-title{background-image:url("./images/Components/category_expand.png");background-position:2px -72px;padding:0 0 0 28px;font-size:12px;color:#6B95B2;height:28px;line-height:28px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-gridpanel .x-grid-group .x-grid-group-hd div.x-grid-group-title,.synohdpack .syno-ux-editorgridpanel .x-grid-group .x-grid-group-hd div.x-grid-group-title{background-image:url("../img/synohdpack/./images/Components/category_expand.png");background-size:24px 144px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-gridpanel .x-grid-group .x-grid-group-hd div.x-grid-group-title,.synohdpackdebug .syno-ux-editorgridpanel .x-grid-group .x-grid-group-hd div.x-grid-group-title{background-image:url("../img/synohdpack/./images/Components/category_expand.png");background-size:24px 144px;outline:1px green dashed}}.syno-ux-gridpanel .x-grid-group .syno-ux-grid-group-hd-over div.x-grid-group-title,.syno-ux-editorgridpanel .x-grid-group .syno-ux-grid-group-hd-over div.x-grid-group-title{color:#5C9DCC;background-position:2px -96px}.syno-ux-gridpanel .x-grid-group .syno-ux-grid-group-hd-click div.x-grid-group-title,.syno-ux-editorgridpanel .x-grid-group .syno-ux-grid-group-hd-click div.x-grid-group-title{color:#5383A6;background-position:2px -120px}.syno-ux-gridpanel .x-grid-group.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title,.syno-ux-editorgridpanel .x-grid-group.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title{background-image:url("./images/Components/category_expand.png");background-position:2px 0px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-gridpanel .x-grid-group.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title,.synohdpack .syno-ux-editorgridpanel .x-grid-group.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title{background-image:url("../img/synohdpack/./images/Components/category_expand.png");background-size:24px 144px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-gridpanel .x-grid-group.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title,.synohdpackdebug .syno-ux-editorgridpanel .x-grid-group.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title{background-image:url("../img/synohdpack/./images/Components/category_expand.png");background-size:24px 144px;outline:1px green dashed}}.syno-ux-gridpanel .x-grid-group.x-grid-group-collapsed .syno-ux-grid-group-hd-over div.x-grid-group-title,.syno-ux-editorgridpanel .x-grid-group.x-grid-group-collapsed .syno-ux-grid-group-hd-over div.x-grid-group-title{background-position:2px -24px}.syno-ux-gridpanel .x-grid-group.x-grid-group-collapsed .syno-ux-grid-group-hd-click div.x-grid-group-title,.syno-ux-editorgridpanel .x-grid-group.x-grid-group-collapsed .syno-ux-grid-group-hd-click div.x-grid-group-title{background-position:2px -48px}.syno-ux-gridpanel .x-grid-group .x-grid-group-body.x-grid3-row-over,.syno-ux-editorgridpanel .x-grid-group .x-grid-group-body.x-grid3-row-over{border:none}.col-move-top{background-image:url("images/Components/col-move-bottom.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .col-move-top{background-image:url("../img/synohdpack/images/Components/col-move-bottom.png");background-size:9px 9px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .col-move-top{background-image:url("../img/synohdpack/images/Components/col-move-bottom.png");background-size:9px 9px;outline:1px green dashed}}.col-move-bottom{background-image:url("images/Components/col-move-bottom.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .col-move-bottom{background-image:url("../img/synohdpack/images/Components/col-move-bottom.png");background-size:9px 9px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .col-move-bottom{background-image:url("../img/synohdpack/images/Components/col-move-bottom.png");background-size:9px 9px;outline:1px green dashed}}.syno-ux-grid-hd-menu,.syno-ux-editorgrid-hd-menu,.syno-ux-groupcheck-menu,.syno-ux-searchfield-menu,.syno-ux-menu,.syno-ux-schedule-menu,.syno-ux-button-menu{background-image:none}.x-layer.syno-ux-grid-hd-menu,.x-layer.syno-ux-editorgrid-hd-menu,.x-layer.syno-ux-groupcheck-menu,.x-layer.syno-ux-searchfield-menu,.x-layer.syno-ux-menu,.x-layer.syno-ux-schedule-menu,.x-layer.syno-ux-button-menu{border-color:#C8D2DC;background-color:#FFFFFF;padding:4px;box-shadow:0 2px 4px rgba(0,0,0,0.5)}.syno-ux-grid-hd-menu ul,.syno-ux-editorgrid-hd-menu ul,.syno-ux-groupcheck-menu ul,.syno-ux-searchfield-menu ul,.syno-ux-menu ul,.syno-ux-schedule-menu ul,.syno-ux-button-menu ul{padding:0px}.syno-ux-grid-hd-menu .x-menu-sep,.syno-ux-editorgrid-hd-menu .x-menu-sep,.syno-ux-groupcheck-menu .x-menu-sep,.syno-ux-searchfield-menu .x-menu-sep,.syno-ux-menu .x-menu-sep,.syno-ux-schedule-menu .x-menu-sep,.syno-ux-button-menu .x-menu-sep{height:1px;background-color:#EBF0F5}.syno-ux-grid-hd-menu li.x-menu-list-item,.syno-ux-editorgrid-hd-menu li.x-menu-list-item,.syno-ux-groupcheck-menu li.x-menu-list-item,.syno-ux-searchfield-menu li.x-menu-list-item,.syno-ux-menu li.x-menu-list-item,.syno-ux-schedule-menu li.x-menu-list-item,.syno-ux-button-menu li.x-menu-list-item{background-image:none;background-color:#FFFFFF;border:none;padding:0px}.syno-ux-grid-hd-menu li.x-menu-list-item span,.syno-ux-editorgrid-hd-menu li.x-menu-list-item span,.syno-ux-groupcheck-menu li.x-menu-list-item span,.syno-ux-searchfield-menu li.x-menu-list-item span,.syno-ux-menu li.x-menu-list-item span,.syno-ux-schedule-menu li.x-menu-list-item span,.syno-ux-button-menu li.x-menu-list-item span{padding-left:4px}.syno-ux-grid-hd-menu li.x-menu-list-item a,.syno-ux-editorgrid-hd-menu li.x-menu-list-item a,.syno-ux-groupcheck-menu li.x-menu-list-item a,.syno-ux-searchfield-menu li.x-menu-list-item a,.syno-ux-menu li.x-menu-list-item a,.syno-ux-schedule-menu li.x-menu-list-item a,.syno-ux-button-menu li.x-menu-list-item a{line-height:28px;height:28px;padding-top:0px;padding-bottom:0px;border:0px;font-size:12px}.syno-ux-grid-hd-menu li.x-menu-list-item a.x-menu-item-arrow,.syno-ux-editorgrid-hd-menu li.x-menu-list-item a.x-menu-item-arrow,.syno-ux-groupcheck-menu li.x-menu-list-item a.x-menu-item-arrow,.syno-ux-searchfield-menu li.x-menu-list-item a.x-menu-item-arrow,.syno-ux-menu li.x-menu-list-item a.x-menu-item-arrow,.syno-ux-schedule-menu li.x-menu-list-item a.x-menu-item-arrow,.syno-ux-button-menu li.x-menu-list-item a.x-menu-item-arrow{background-image:url("./images/Components/dropdown_menu_parent.png");background-position:right 0px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-grid-hd-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpack .syno-ux-editorgrid-hd-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpack .syno-ux-groupcheck-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpack .syno-ux-searchfield-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpack .syno-ux-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpack .syno-ux-schedule-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpack .syno-ux-button-menu li.x-menu-list-item a.x-menu-item-arrow{background-image:url("../img/synohdpack/./images/Components/dropdown_menu_parent.png");background-size:16px 56px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-grid-hd-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpackdebug .syno-ux-editorgrid-hd-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpackdebug .syno-ux-groupcheck-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpackdebug .syno-ux-searchfield-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpackdebug .syno-ux-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpackdebug .syno-ux-schedule-menu li.x-menu-list-item a.x-menu-item-arrow,.synohdpackdebug .syno-ux-button-menu li.x-menu-list-item a.x-menu-item-arrow{background-image:url("../img/synohdpack/./images/Components/dropdown_menu_parent.png");background-size:16px 56px;outline:1px green dashed}}.syno-ux-grid-hd-menu li.x-menu-list-item.x-menu-item-active,.syno-ux-editorgrid-hd-menu li.x-menu-list-item.x-menu-item-active,.syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-active,.syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-active,.syno-ux-menu li.x-menu-list-item.x-menu-item-active,.syno-ux-schedule-menu li.x-menu-list-item.x-menu-item-active,.syno-ux-button-menu li.x-menu-list-item.x-menu-item-active{background-color:#0086e5}.syno-ux-grid-hd-menu li.x-menu-list-item.x-menu-item-active span,.syno-ux-editorgrid-hd-menu li.x-menu-list-item.x-menu-item-active span,.syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-active span,.syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-active span,.syno-ux-menu li.x-menu-list-item.x-menu-item-active span,.syno-ux-schedule-menu li.x-menu-list-item.x-menu-item-active span,.syno-ux-button-menu li.x-menu-list-item.x-menu-item-active span{color:#FFFFFF}.syno-ux-grid-hd-menu li.x-menu-list-item.x-menu-item-active a.x-menu-item-arrow,.syno-ux-editorgrid-hd-menu li.x-menu-list-item.x-menu-item-active a.x-menu-item-arrow,.syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-active a.x-menu-item-arrow,.syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-active a.x-menu-item-arrow,.syno-ux-menu li.x-menu-list-item.x-menu-item-active a.x-menu-item-arrow,.syno-ux-schedule-menu li.x-menu-list-item.x-menu-item-active a.x-menu-item-arrow,.syno-ux-button-menu li.x-menu-list-item.x-menu-item-active a.x-menu-item-arrow{background-position:right -28px}.syno-ux-grid-hd-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.syno-ux-editorgrid-hd-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.syno-ux-groupcheck-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.syno-ux-searchfield-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.syno-ux-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.syno-ux-schedule-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.syno-ux-button-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;background-position:0px 0px;width:22px;height:22px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-grid-hd-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpack .syno-ux-editorgrid-hd-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpack .syno-ux-groupcheck-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpack .syno-ux-searchfield-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpack .syno-ux-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpack .syno-ux-schedule-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpack .syno-ux-button-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-grid-hd-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpackdebug .syno-ux-editorgrid-hd-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpackdebug .syno-ux-groupcheck-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpackdebug .syno-ux-searchfield-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpackdebug .syno-ux-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpackdebug .syno-ux-schedule-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon,.synohdpackdebug .syno-ux-button-menu li.x-menu-list-item .x-menu-check-item .x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;outline:1px green dashed}}.syno-ux-grid-hd-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.syno-ux-editorgrid-hd-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.syno-ux-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.syno-ux-schedule-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.syno-ux-button-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;background-position:0px -66px;width:22px;height:22px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-grid-hd-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpack .syno-ux-editorgrid-hd-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpack .syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpack .syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpack .syno-ux-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpack .syno-ux-schedule-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpack .syno-ux-button-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-grid-hd-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpackdebug .syno-ux-editorgrid-hd-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpackdebug .syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpackdebug .syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpackdebug .syno-ux-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpackdebug .syno-ux-schedule-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon,.synohdpackdebug .syno-ux-button-menu li.x-menu-list-item.x-menu-item-checked .x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;outline:1px green dashed}}.syno-ux-groupcheck-menu li.x-menu-list-item .x-menu-check-item img.x-menu-item-icon,.syno-ux-searchfield-menu li.x-menu-list-item .x-menu-check-item img.x-menu-item-icon{background-image:none}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-groupcheck-menu li.x-menu-list-item .x-menu-check-item img.x-menu-item-icon,.synohdpack .syno-ux-searchfield-menu li.x-menu-list-item .x-menu-check-item img.x-menu-item-icon{background-image:none}}.syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-checked img.x-menu-item-icon,.syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-checked img.x-menu-item-icon{background-image:url("images/Components/dropdown_menu_tick.png");background-position:0px 0px;background-repeat:no-repeat;width:28px;height:28px;left:0px;top:0px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-checked img.x-menu-item-icon,.synohdpack .syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-checked img.x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/dropdown_menu_tick.png");background-size:28px 56px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-checked img.x-menu-item-icon,.synohdpackdebug .syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-checked img.x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/dropdown_menu_tick.png");background-size:28px 56px;outline:1px green dashed}}.syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-checked.x-menu-item-active img.x-menu-item-icon,.syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-checked.x-menu-item-active img.x-menu-item-icon{background-image:url("images/Components/dropdown_menu_tick.png");background-position:0px -28px;background-repeat:no-repeat;width:28px;height:28px;left:0px;top:0px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-checked.x-menu-item-active img.x-menu-item-icon,.synohdpack .syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-checked.x-menu-item-active img.x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/dropdown_menu_tick.png");background-size:28px 56px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-groupcheck-menu li.x-menu-list-item.x-menu-item-checked.x-menu-item-active img.x-menu-item-icon,.synohdpackdebug .syno-ux-searchfield-menu li.x-menu-list-item.x-menu-item-checked.x-menu-item-active img.x-menu-item-icon{background-image:url("../img/synohdpack/images/Components/dropdown_menu_tick.png");background-size:28px 56px;outline:1px green dashed}}.syno-ux-textfield,.ext-strict .x-small-editor .syno-ux-textfield.x-form-text,.syno-ux-numberfield{font-size:12px;background-color:#FFFFFF;box-shadow:inset 0px 1px 0px rgba(80,90,100,0.08);background-image:none;padding-left:8px}.x-form-text.syno-ux-textfield,.ext-strict .x-small-editor .x-form-text.syno-ux-textfield,.x-form-text.syno-ux-numberfield{border-color:#C8D2DC;height:24px}.syno-ux-textfield.syno-ux-textfield-hover,.syno-ux-textfield.syno-ux-numberfield-hover,.syno-ux-textfield-hover.syno-ux-numberfield,.syno-ux-numberfield.syno-ux-numberfield-hover{border-color:#B4BEC8}.x-form-focus.syno-ux-textfield,.ext-strict .x-small-editor .x-form-focus.syno-ux-textfield.x-form-text,.x-form-focus.syno-ux-numberfield{border-color:#0086e5}.x-form-invalid.syno-ux-textfield,.ext-strict .x-small-editor .x-form-invalid.syno-ux-textfield.x-form-text,.x-form-invalid.syno-ux-numberfield{border-color:#FF8C8C;background-color:#FFF0F0;background-image:none}.x-item-disabled.x-form-text.syno-ux-textfield,.ext-strict .x-small-editor .x-item-disabled.x-form-text.syno-ux-textfield,.x-item-disabled.x-form-text.syno-ux-numberfield{border-color:#C8D2DC;background-color:#F6F8FA}.ext-strict .x-small-editor .x-form-text.syno-ux-textfield,.ext-strict .x-small-editor .x-form-text.syno-ux-numberfield{height:24px !important}.x-form-item .x-form-item-label.syno-ux-item-label{font-size:12px;line-height:28px;padding:0px}.syno-ux-triggerfield,.syno-ux-combobox,.syno-ux-colorfield,.syno-ux-schedulefield,.syno-ux-datefield,.syno-ux-timefield,.syno-ux-superboxselect{font-size:12px;background-color:#FFFFFF;box-shadow:inset 0px 1px 0px rgba(80,90,100,0.08);background-image:none;padding-left:8px;border-right:0px}.ext-gecko .syno-ux-triggerfield,.ext-gecko .syno-ux-combobox,.ext-gecko .syno-ux-colorfield,.ext-gecko .syno-ux-schedulefield,.ext-gecko .syno-ux-datefield,.ext-gecko .syno-ux-timefield,.ext-gecko .syno-ux-superboxselect{padding-top:1px;padding-bottom:1px}.syno-ux-triggerfield-readonly.syno-ux-triggerfield,.syno-ux-triggerfield-readonly.syno-ux-combobox,.syno-ux-triggerfield-readonly.syno-ux-colorfield,.syno-ux-triggerfield-readonly.syno-ux-schedulefield,.syno-ux-triggerfield-readonly.syno-ux-datefield,.syno-ux-triggerfield-readonly.syno-ux-timefield,.syno-ux-triggerfield-readonly.syno-ux-superboxselect,.syno-ux-triggerfield-no-trigger.syno-ux-triggerfield,.syno-ux-triggerfield-no-trigger.syno-ux-combobox,.syno-ux-triggerfield-no-trigger.syno-ux-colorfield,.syno-ux-triggerfield-no-trigger.syno-ux-schedulefield,.syno-ux-triggerfield-no-trigger.syno-ux-datefield,.syno-ux-triggerfield-no-trigger.syno-ux-timefield,.syno-ux-triggerfield-no-trigger.syno-ux-superboxselect{border-right:1px solid #C8D2DC}.x-form-text.syno-ux-triggerfield,.x-form-text.syno-ux-combobox,.x-form-text.syno-ux-colorfield,.x-form-text.syno-ux-schedulefield,.x-form-text.syno-ux-datefield,.x-form-text.syno-ux-timefield,.x-form-text.syno-ux-superboxselect{border-color:#C8D2DC;height:24px;line-height:24px}.syno-ux-triggerfield.syno-ux-triggerfield-hover,.syno-ux-triggerfield.syno-ux-combobox-hover,.syno-ux-triggerfield.syno-ux-colorfield-hover,.syno-ux-triggerfield.syno-ux-schedulefield-hover,.syno-ux-triggerfield.syno-ux-datefield-hover,.syno-ux-triggerfield.syno-ux-timefield-hover,.syno-ux-triggerfield-hover.syno-ux-combobox,.syno-ux-triggerfield-hover.syno-ux-colorfield,.syno-ux-triggerfield-hover.syno-ux-schedulefield,.syno-ux-triggerfield-hover.syno-ux-datefield,.syno-ux-triggerfield-hover.syno-ux-timefield,.syno-ux-triggerfield-hover.syno-ux-superboxselect,.syno-ux-combobox.syno-ux-combobox-hover,.syno-ux-combobox.syno-ux-colorfield-hover,.syno-ux-combobox.syno-ux-schedulefield-hover,.syno-ux-combobox.syno-ux-datefield-hover,.syno-ux-combobox.syno-ux-timefield-hover,.syno-ux-combobox-hover.syno-ux-colorfield,.syno-ux-combobox-hover.syno-ux-schedulefield,.syno-ux-combobox-hover.syno-ux-datefield,.syno-ux-combobox-hover.syno-ux-timefield,.syno-ux-combobox-hover.syno-ux-superboxselect,.syno-ux-colorfield.syno-ux-colorfield-hover,.syno-ux-colorfield.syno-ux-schedulefield-hover,.syno-ux-colorfield.syno-ux-datefield-hover,.syno-ux-colorfield.syno-ux-timefield-hover,.syno-ux-colorfield-hover.syno-ux-schedulefield,.syno-ux-colorfield-hover.syno-ux-datefield,.syno-ux-colorfield-hover.syno-ux-timefield,.syno-ux-colorfield-hover.syno-ux-superboxselect,.syno-ux-schedulefield.syno-ux-schedulefield-hover,.syno-ux-schedulefield.syno-ux-datefield-hover,.syno-ux-schedulefield.syno-ux-timefield-hover,.syno-ux-schedulefield-hover.syno-ux-datefield,.syno-ux-schedulefield-hover.syno-ux-timefield,.syno-ux-schedulefield-hover.syno-ux-superboxselect,.syno-ux-datefield.syno-ux-datefield-hover,.syno-ux-datefield.syno-ux-timefield-hover,.syno-ux-datefield-hover.syno-ux-timefield,.syno-ux-datefield-hover.syno-ux-superboxselect,.syno-ux-timefield.syno-ux-timefield-hover,.syno-ux-timefield-hover.syno-ux-superboxselect{border-color:#B4BEC8}.x-form-focus.syno-ux-triggerfield,.x-form-focus.syno-ux-combobox,.x-form-focus.syno-ux-colorfield,.x-form-focus.syno-ux-schedulefield,.x-form-focus.syno-ux-datefield,.x-form-focus.syno-ux-timefield,.x-form-focus.syno-ux-superboxselect{border-color:#0086e5}.x-form-invalid.syno-ux-triggerfield,.x-form-invalid.syno-ux-combobox,.x-form-invalid.syno-ux-colorfield,.x-form-invalid.syno-ux-schedulefield,.x-form-invalid.syno-ux-datefield,.x-form-invalid.syno-ux-timefield,.x-form-invalid.syno-ux-superboxselect{border-color:#FF8C8C;background-color:#FFF0F0;background-image:none}.x-item-disabled .x-form-text.syno-ux-triggerfield,.x-item-disabled .x-form-text.syno-ux-combobox,.x-item-disabled .x-form-text.syno-ux-colorfield,.x-item-disabled .x-form-text.syno-ux-schedulefield,.x-item-disabled .x-form-text.syno-ux-datefield,.x-item-disabled .x-form-text.syno-ux-timefield,.x-item-disabled .x-form-text.syno-ux-superboxselect{border-color:#C8D2DC;background-color:#F6F8FA;background-image:none;border-right:0px}.x-item-disabled .x-form-text.syno-ux-triggerfield-readonly.syno-ux-triggerfield,.x-item-disabled .x-form-text.syno-ux-triggerfield-readonly.syno-ux-combobox,.x-item-disabled .x-form-text.syno-ux-triggerfield-readonly.syno-ux-colorfield,.x-item-disabled .x-form-text.syno-ux-triggerfield-readonly.syno-ux-schedulefield,.x-item-disabled .x-form-text.syno-ux-triggerfield-readonly.syno-ux-datefield,.x-item-disabled .x-form-text.syno-ux-triggerfield-readonly.syno-ux-timefield,.x-item-disabled .x-form-text.syno-ux-triggerfield-readonly.syno-ux-superboxselect,.x-item-disabled .x-form-text.syno-ux-triggerfield-no-trigger.syno-ux-triggerfield,.x-item-disabled .x-form-text.syno-ux-triggerfield-no-trigger.syno-ux-combobox,.x-item-disabled .x-form-text.syno-ux-triggerfield-no-trigger.syno-ux-colorfield,.x-item-disabled .x-form-text.syno-ux-triggerfield-no-trigger.syno-ux-schedulefield,.x-item-disabled .x-form-text.syno-ux-triggerfield-no-trigger.syno-ux-datefield,.x-item-disabled .x-form-text.syno-ux-triggerfield-no-trigger.syno-ux-timefield,.x-item-disabled .x-form-text.syno-ux-triggerfield-no-trigger.syno-ux-superboxselect{border-right:1px solid #C8D2DC}.x-form-field-trigger-wrap .x-form-trigger.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-combobox-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-datefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-timefield-trigger{background-image:url("images/Components/trigger.png");background-position:0px -1px;background-color:#FFFFFF;border:1px solid #C8D2DC;border-left:0px;width:26px;height:26px;box-shadow:inset 0px 1px 0px rgba(80,90,100,0.08)}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .x-form-field-trigger-wrap .x-form-trigger.syno-ux-triggerfield-trigger,.synohdpack .x-form-field-trigger-wrap .x-form-trigger.syno-ux-combobox-trigger,.synohdpack .x-form-field-trigger-wrap .x-form-trigger.syno-ux-colorfield-trigger,.synohdpack .x-form-field-trigger-wrap .x-form-trigger.syno-ux-schedulefield-trigger,.synohdpack .x-form-field-trigger-wrap .x-form-trigger.syno-ux-datefield-trigger,.synohdpack .x-form-field-trigger-wrap .x-form-trigger.syno-ux-timefield-trigger{background-image:url("../img/synohdpack/images/Components/trigger.png");background-size:104px 28px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .x-form-field-trigger-wrap .x-form-trigger.syno-ux-triggerfield-trigger,.synohdpackdebug .x-form-field-trigger-wrap .x-form-trigger.syno-ux-combobox-trigger,.synohdpackdebug .x-form-field-trigger-wrap .x-form-trigger.syno-ux-colorfield-trigger,.synohdpackdebug .x-form-field-trigger-wrap .x-form-trigger.syno-ux-schedulefield-trigger,.synohdpackdebug .x-form-field-trigger-wrap .x-form-trigger.syno-ux-datefield-trigger,.synohdpackdebug .x-form-field-trigger-wrap .x-form-trigger.syno-ux-timefield-trigger{background-image:url("../img/synohdpack/images/Components/trigger.png");background-size:104px 28px;outline:1px green dashed}}.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-combobox-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-datefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-timefield-trigger{background-position:-26px -1px;border-color:#B4BECB}.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-trigger-invalid.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-trigger-invalid.syno-ux-combobox-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-trigger-invalid.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-trigger-invalid.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-trigger-invalid.syno-ux-datefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-over.syno-ux-trigger-invalid.syno-ux-timefield-trigger{border-color:#FF8C8C;background-color:#FFF0F0}.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-click.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-click.syno-ux-combobox-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-click.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-click.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-click.syno-ux-datefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.x-form-trigger-click.syno-ux-timefield-trigger{background-position:-52px -1px}.x-form-field-trigger-wrap .x-form-trigger.syno-ux-trigger-invalid.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-trigger-invalid.syno-ux-combobox-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-trigger-invalid.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-trigger-invalid.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-trigger-invalid.syno-ux-datefield-trigger,.x-form-field-trigger-wrap .x-form-trigger.syno-ux-trigger-invalid.syno-ux-timefield-trigger{border-color:#FF8C8C;background-color:#FFF0F0}.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-combobox-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-datefield-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-timefield-trigger{border-color:#0086e5}.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-trigger-invalid.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-trigger-invalid.syno-ux-combobox-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-trigger-invalid.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-trigger-invalid.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-trigger-invalid.syno-ux-datefield-trigger,.x-form-field-trigger-wrap.x-trigger-wrap-focus .x-form-trigger.syno-ux-trigger-invalid.syno-ux-timefield-trigger{border-color:#FF8C8C}.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.syno-ux-combobox-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.syno-ux-datefield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.syno-ux-timefield-trigger{background-position:-78px -1px;background-color:#F6F8FA;border-color:#C8D2DC}.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-over.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-over.syno-ux-combobox-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-over.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-over.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-over.syno-ux-datefield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-over.syno-ux-timefield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-click.syno-ux-triggerfield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-click.syno-ux-combobox-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-click.syno-ux-colorfield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-click.syno-ux-schedulefield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-click.syno-ux-datefield-trigger,.x-form-field-trigger-wrap.x-item-disabled .x-form-trigger.x-form-trigger-click.syno-ux-timefield-trigger{background-position:-78px -1px !important;border-color:#C8D2DC}/*! + * Ext JS Library 3.2.1 + * Copyright(c) 2006-2010 Ext JS, Inc. + * licensing@extjs.com + * http://www.extjs.com/license + */#images-view .x-panel-body{background:white;font:11px Arial, Helvetica, sans-serif}#images-view .thumb{background:#dddddd;padding:3px}#images-view .thumb img{height:60px;width:80px}#images-view .thumb-wrap{float:left;margin:4px;margin-right:0;padding:5px}#images-view .thumb-wrap span{display:block;overflow:hidden;text-align:center}#images-view .x-view-over{border:1px solid #dddddd;background:#efefef url(../resources/images/default/grid/row-over.gif) repeat-x left top;padding:4px}#images-view .x-view-selected{background:#eff5fb url(images/data-view/selected.gif) no-repeat right bottom;border:1px solid #99bbe8;padding:4px}#images-view .x-view-selected .thumb{background:transparent}#images-view .loading-indicator{font-size:11px;background-image:url("../resources/images/default/grid/loading.gif");background-repeat:no-repeat;background-position:left;padding-left:20px;margin:10px}/*! + * Ext JS Library 3.2.1 + * Copyright(c) 2006-2010 Ext JS, Inc. + * licensing@extjs.com + * http://www.extjs.com/license + */.x-statusbar .x-status-text{cursor:default}.x-statusbar .x-status-busy{padding-left:25px !important;background:transparent no-repeat 3px 2px}.x-statusbar .x-status-error{padding-left:25px !important;background:transparent no-repeat 3px 2px}.x-statusbar .x-status-valid{padding-left:25px !important;background:transparent no-repeat 3px 2px}.x-statusbar .x-status-busy{background-image:url(images/statusbar/loading.gif)}.x-statusbar .x-status-error{color:#C33;background-image:url(images/statusbar/exclamation.gif)}.x-statusbar .x-status-valid{background-image:url(images/statusbar/accept.png)}.ext-strict .x-form-checkbox,.x-form-radio{margin-right:2px}.ext-strict .ext-ie .x-form-checkbox,.ext-ie .x-form-radio{margin-right:0px}.syno-textfilter .x-form-field-wrap{border:1px solid #B5B8C8;background-color:#FFF}.ext-strict .ext-webkit .syno-textfilter .x-form-field-wrap .syno-textfilter-text,.syno-textfilter .x-form-field-wrap .syno-textfilter-text{font-size:11px;line-height:18px;height:18px !important;padding-left:18px;background-color:transparent;background-image:url(images/TextFilter/search-icon.png);background-position:0 0;background-repeat:no-repeat;border:none}.syno-textfilter .x-form-field-trigger-wrap .syno-textfilter-trigger{height:20px;background-color:transparent;background-image:url(images/TextFilter/search-cancel.png);background-position:0 0;background-repeat:no-repeat;right:0px;border:none}.syno-textfilter .x-form-field-trigger-wrap.x-item-disabled .syno-textfilter-trigger{background-image:url(images/TextFilter/search_icon_cancel.png) !important;background-position:0 -20px !important}.syno-search-field .x-form-field-wrap-right{padding-right:6px;background-image:url(images/TextFilter/search_box.png);background-repeat:no-repeat;height:24px;background-position:right -48px}.syno-search-field .x-form-field-wrap-center{background-image:url(images/TextFilter/search_box.png);background-position:0 -24px;background-repeat:repeat-x;height:24px}.syno-search-field .x-form-field-wrap .syno-textfilter-text{line-height:16px !important;height:16px !important;font-size:12px;background-position:0 0;background-color:transparent;padding-bottom:0 !important}.ext-gecko .syno-search-field .x-form-field-wrap .syno-textfilter-text,.ext-ie9 .syno-search-field .x-form-field-wrap .syno-textfilter-text,.ext-ie8 .syno-search-field .x-form-field-wrap .syno-textfilter-text{padding-top:0 !important}.ext-trident6 .syno-search-field .x-form-field-wrap .syno-textfilter-text{margin-top:2px !important}.syno-search-field .x-form-field-wrap-left{background-image:url(images/TextFilter/search_box.png);background-position:0 0;background-repeat:no-repeat;height:24px !important;border:0;padding-left:6px;background-color:transparent}.syno-search-field .x-form-field-trigger-wrap .syno-textfilter-trigger{top:2px;padding-right:3px}.x-form-field-wrap-center-img{background-image:url(images/TextFilter/search-icon.png);width:16px;height:16px;line-height:16px;display:table-cell;padding-right:2px;background-repeat:no-repeat;background-position:0 2px}.ext-ie9 .x-form-field-wrap-center-img,.ext-ie8 .x-form-field-wrap-center-img{background-position:0 1px}.ext-trident6 .x-form-field-wrap-center-img{background-position:0 2px}.syno-grid-enable-column-checked{height:16px;background-repeat:no-repeat;background-position:center center;background-image:url(images/EnableColumn/checked.gif)}.syno-grid-enable-column-unchecked{height:16px;background-repeat:no-repeat;background-position:center center;background-image:url(images/EnableColumn/unchecked.gif)}.syno-grid-enable-column-grayed{height:16px;background-repeat:no-repeat;background-position:center center;background-image:url(images/EnableColumn/grayed.gif)}.x-checkbox{height:13px;width:13px;background:url(images/TriCheckbox/checkbox.gif) no-repeat -13px 0;vertical-align:bottom}.x-form-focus .x-checkbox,.x-checkbox-over .x-checkbox{background-position:-13px 0}.x-checkbox-down .x-checkbox{background-position:-26px 0}.x-item-disabled .x-checkbox{background-position:-39px 0}.x-checkbox-checked .x-checkbox{background-position:-13px -13px}.x-checkbox-checked .x-form-focus .x-checkbox,.x-checkbox-checked .x-checkbox-over .x-checkbox{background-position:-13px -13px}.x-checkbox-checked .x-checkbox-down .x-checkbox{background-position:-26px -13px}.x-checkbox-checked .x-item-disabled .x-checkbox{background-position:-39px -13px}.ext-ie9.syno-cjk .x-form-check-wrap{line-height:15px}.x-checkbox-grayed .x-checkbox{background-position:-13px -26px}.x-checkbox-grayed .x-form-focus .x-checkbox,.x-checkbox-grayed .x-checkbox-over .x-checkbox{background-position:-13px -26px}.x-checkbox-grayed .x-checkbox-down .x-checkbox{background-position:-26px -26px}.x-checkbox-grayed .x-item-disabled .x-checkbox{background-position:-39px -26px}.ux-cell-value{position:relative;zoom:1}.ux-cell-actions{position:absolute;right:0;top:-2px}.ux-cell-actions-left{left:0;top:-2px}.ux-cell-action{width:16px;height:16px;float:left;cursor:pointer;margin:0 0 0 4px}.ux-cell-actions-left .ux-cell-action{margin:0 4px 0 0}.syno-radiobox .x-form-check-wrap .x-form-radio+label.x-form-cb-label{padding-left:22px;padding-bottom:2px;background-repeat:no-repeat;background-image:url(images/CustRadio/radio_button.png)}.ext-gecko .syno-radiobox .x-form-check-wrap .x-form-radio+label.x-form-cb-label{padding-bottom:1px}.syno-radiobox .x-form-check-wrap.x-item-disabled .x-form-radio+label.x-form-cb-label{background-image:url(images/CustRadio/radio_button.png)}.syno-radiobox .x-form-check-wrap input.x-form-radio{width:0px}.ext-gecko .syno-radiobox .x-form-check-wrap input.x-form-radio,.ext-opera .syno-radiobox .x-form-check-wrap input.x-form-radio,.ext-webkit .syno-radiobox .x-form-check-wrap input.x-form-radio{display:none}.syno-radiobox .x-form-cb-label{margin-left:0px}.syno-radiobox .x-form-check-wrap label{background-position:0px 0px}.syno-radiobox.x-checkbox-over .x-form-check-wrap label{background-position:0px -16px}.syno-radiobox .x-form-check-wrap label.x-checkbox-checked{background-position:0px -32px}.syno-radiobox.x-checkbox-over .x-form-check-wrap label.x-checkbox-checked{background-position:0px -48px}.syno-rounded-menu{background:transparent none;border:0px none}.syno-rounded-menu .x-menu-list{padding:0}.syno-rounded-menu .x-menu-item-active{background-color:#b6def2;background-image:none;border-color:#b6def2}.syno-rounded-menu .x-menu-item-active a.x-menu-item{border-color:#b6def2}.syno-rounded-menu-tl{background:transparent url(images/RoundedMenu/dropdown_menu_bg_a.png) no-repeat 0 0;padding-left:10px;zoom:1;z-index:1;position:relative}.syno-rounded-menu-tc{background:transparent url(images/RoundedMenu/dropdown_menu_bg_a.png) repeat-x 0 -10px;overflow:hidden;zoom:1;height:10px}.syno-rounded-menu-tr{background:transparent url(images/RoundedMenu/dropdown_menu_bg_a.png) no-repeat right -20px;padding-right:10px}.syno-rounded-menu-ml{background:transparent url(images/RoundedMenu/dropdown_menu_bg_bl.png) repeat-y 0 0;padding-left:10px;zoom:1}.syno-rounded-menu-mc{background:transparent url(images/RoundedMenu/dropdown_menu_bg_c.png) repeat 0 0;margin-left:-5px;margin-right:-5px}.syno-rounded-menu-mr{background:transparent url(images/RoundedMenu/dropdown_menu_bg_br.png) repeat-y right 0;padding-right:10px;zoom:1}.syno-rounded-menu-bl{background:transparent url(images/RoundedMenu/dropdown_menu_bg_a.png) no-repeat 0 -30px;padding-left:10px;zoom:1}.syno-rounded-menu-bc{background:transparent url(images/RoundedMenu/dropdown_menu_bg_a.png) repeat-x 0 -40px;zoom:1;height:10px}.syno-rounded-menu-br{background:transparent url(images/RoundedMenu/dropdown_menu_bg_a.png) no-repeat right -50px;padding-right:10px;zoom:1}.syno-rounded-menu-bwrap{background:transparent none;border:0px none}.syno-ux-gridpanel .x-panel-tbar .x-toolbar,.syno-ux-editorgridpanel .x-panel-tbar .x-toolbar,.syno-ux-panel .x-panel-tbar .x-toolbar,.syno-ux-formpanel .x-panel-tbar .x-toolbar,.syno-ux-tab-panel .x-panel-tbar .x-toolbar{border-bottom-color:#D7E1EB;padding:0px 0px 8px 0px}.syno-ux-gridpanel .x-panel-bbar .x-toolbar,.syno-ux-editorgridpanel .x-panel-bbar .x-toolbar,.syno-ux-panel .x-panel-bbar .x-toolbar,.syno-ux-formpanel .x-panel-bbar .x-toolbar,.syno-ux-tab-panel .x-panel-bbar .x-toolbar{border-top-color:#EBF0F5;height:23px}.syno-ux-gridpanel .x-panel-bbar .x-toolbar .xtb-text,.syno-ux-editorgridpanel .x-panel-bbar .x-toolbar .xtb-text,.syno-ux-panel .x-panel-bbar .x-toolbar .xtb-text,.syno-ux-formpanel .x-panel-bbar .x-toolbar .xtb-text,.syno-ux-tab-panel .x-panel-bbar .x-toolbar .xtb-text{line-height:23px;padding-top:0px}.syno-ux-gridpanel .x-panel-ml,.syno-ux-editorgridpanel .x-panel-ml,.syno-ux-panel .x-panel-ml,.syno-ux-formpanel .x-panel-ml,.syno-ux-tab-panel .x-panel-ml,.syno-ux-gridpanel .x-panel-mc,.syno-ux-editorgridpanel .x-panel-mc,.syno-ux-panel .x-panel-mc,.syno-ux-formpanel .x-panel-mc,.syno-ux-tab-panel .x-panel-mc{background-color:transparent}.syno-ux-gridpanel .x-panel-header,.syno-ux-editorgridpanel .x-panel-header,.syno-ux-panel .x-panel-header,.syno-ux-formpanel .x-panel-header,.syno-ux-tab-panel .x-panel-header{background-image:none;border-bottom:1px dashed #D7E1EB;font-size:15px;font-weight:normal;padding:0px 0px 0px 8px}.syno-ux-gridpanel .x-panel-header .x-panel-header-text,.syno-ux-editorgridpanel .x-panel-header .x-panel-header-text,.syno-ux-panel .x-panel-header .x-panel-header-text,.syno-ux-formpanel .x-panel-header .x-panel-header-text,.syno-ux-tab-panel .x-panel-header .x-panel-header-text{color:#0086e5;line-height:28px}.syno-ux-checkbox-icon,.syno-ux-radio-icon{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;background-position:0 0;background-color:transparent;width:22px;height:22px;border:0px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-checkbox-icon,.synohdpack .syno-ux-radio-icon{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-checkbox-icon,.synohdpackdebug .syno-ux-radio-icon{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;outline:1px green dashed}}.ext-ie .x-form-check-wrap .syno-ux-checkbox-icon,.ext-ie .x-form-check-wrap .syno-ux-radio-icon{width:22px;height:22px}.syno-ux-cb-focus.syno-ux-checkbox-icon,.syno-ux-cb-focus.syno-ux-radio-icon,.syno-ux-cb-hover.syno-ux-checkbox-icon,.syno-ux-cb-hover.syno-ux-radio-icon{background-position:0 -22px}.syno-ux-cb-disabled.syno-ux-checkbox-icon,.syno-ux-cb-disabled.syno-ux-radio-icon{background-position:0 -44px}.syno-ux-cb-disabled.syno-ux-cb-checked.syno-ux-checkbox-icon,.syno-ux-cb-disabled.syno-ux-cb-checked.syno-ux-radio-icon{background-position:0 -110px}.syno-ux-cb-disabled.syno-ux-cb-checked.syno-ux-cb-focus.syno-ux-checkbox-icon,.syno-ux-cb-disabled.syno-ux-cb-checked.syno-ux-cb-focus.syno-ux-radio-icon,.syno-ux-cb-disabled.syno-ux-cb-checked.syno-ux-cb-hover.syno-ux-checkbox-icon,.syno-ux-cb-disabled.syno-ux-cb-checked.syno-ux-cb-hover.syno-ux-radio-icon{background-position:0 -110px}.syno-ux-cb-disabled.syno-ux-cb-grayed.syno-ux-checkbox-icon,.syno-ux-cb-disabled.syno-ux-cb-grayed.syno-ux-radio-icon{background-position:0 -176px}.syno-ux-cb-disabled.syno-ux-cb-grayed.syno-ux-cb-grayed.syno-ux-checkbox-icon,.syno-ux-cb-disabled.syno-ux-cb-grayed.syno-ux-cb-grayed.syno-ux-radio-icon{background-position:0 -176px}.syno-ux-cb-checked.syno-ux-checkbox-icon,.syno-ux-cb-checked.syno-ux-radio-icon{background-position:0 -66px}.syno-ux-cb-checked.syno-ux-cb-focus.syno-ux-checkbox-icon,.syno-ux-cb-checked.syno-ux-cb-focus.syno-ux-radio-icon,.syno-ux-cb-checked.syno-ux-cb-hover.syno-ux-checkbox-icon,.syno-ux-cb-checked.syno-ux-cb-hover.syno-ux-radio-icon{background-position:0 -88px}.syno-ux-cb-grayed.syno-ux-checkbox-icon,.syno-ux-cb-grayed.syno-ux-radio-icon{background-position:0 -132px}.syno-ux-cb-grayed.syno-ux-cb-focus.syno-ux-checkbox-icon,.syno-ux-cb-grayed.syno-ux-cb-focus.syno-ux-radio-icon,.syno-ux-cb-grayed.syno-ux-cb-hover.syno-ux-checkbox-icon,.syno-ux-cb-grayed.syno-ux-cb-hover.syno-ux-radio-icon{background-position:0 -154px}.x-form-element .x-form-check-wrap .syno-ux-checkbox-icon,.x-form-element .x-form-check-wrap .syno-ux-radio-icon{position:absolute}.syno-ux-checkbox-label{font-size:12px;line-height:22px !important;padding-left:8px}.x-form-element .x-form-check-wrap .syno-ux-checkbox-label{display:inline-block;padding-left:30px}.syno-ux-fieldset{border:0px;padding:0px;margin-bottom:8px}.syno-ux-fieldset .x-fieldset-bwrap{padding:8px}.syno-ux-fieldset .x-fieldset-header{font-size:15px;font-weight:normal;height:28px;border-bottom:1px dashed #D7E1EB;padding:0}.syno-ux-fieldset .x-fieldset-header .x-fieldset-header-text{line-height:28px}.syno-ux-fieldset legend,.syno-ux-fieldset legend span{cursor:pointer}.syno-ux-fieldset.syno-ux-fieldset-default .x-fieldset-header-text{padding-left:8px}.syno-ux-fieldset.syno-ux-fieldset-default legend,.syno-ux-fieldset.syno-ux-fieldset-default legend span{cursor:default}.syno-ux-fieldset .x-tool.x-tool-toggle{background-image:url("images/Components/fieldset_expand.png");margin-top:2px;background-position:0px -72px;width:24px;height:24px;margin-left:4px;margin-right:4px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-fieldset .x-tool.x-tool-toggle{background-image:url("../img/synohdpack/images/Components/fieldset_expand.png");background-size:24px 288px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-fieldset .x-tool.x-tool-toggle{background-image:url("../img/synohdpack/images/Components/fieldset_expand.png");background-size:24px 288px;outline:1px green dashed}}.syno-ux-fieldset .syno-ux-fieldset-legend-hover{color:#0095FF;border-color:#C3CDD7}.syno-ux-fieldset .syno-ux-fieldset-legend-hover .x-tool.x-tool-toggle{background-position:0px -96px}.syno-ux-fieldset .syno-ux-fieldset-legend-click{color:#0077CC;border-color:#C3CDD7}.syno-ux-fieldset .syno-ux-fieldset-legend-click .x-tool.x-tool-toggle{background-position:0px -120px}.syno-ux-fieldset.x-panel-collapsed .x-tool.x-tool-toggle{background-position:0px 0px}.syno-ux-fieldset.x-panel-collapsed .syno-ux-fieldset-legend-hover .x-tool.x-tool-toggle{background-position:0px -24px}.syno-ux-fieldset.x-panel-collapsed .syno-ux-fieldset-legend-click .x-tool.x-tool-toggle{background-position:0px -48px}.ext-ie .x-fieldset.syno-ux-fieldset{padding-bottom:0px}.ext-ie .x-fieldset.syno-ux-fieldset legend{margin-bottom:0px}.syno-ux-displayfield.x-form-display-field{font-size:12px;padding-top:4px;padding-bottom:4px;line-height:20px}.syno-ux-displayfield.x-form-display-field a{font-weight:bold}.syno-ux-combobox-list.x-layer.x-combo-list{border-color:#C8D2DC;background-color:#FFFFFF;padding:4px;box-shadow:0 2px 4px rgba(0,0,0,0.5)}.syno-ux-combobox-list .x-combo-list-item{height:26px;line-height:26px;background-color:#FFFFFF;font-size:12px;color:#505A64;padding:0px;padding-left:8px}.syno-ux-combobox-list .x-combo-list-item.x-combo-selected{color:#FFFFFF}.syno-ux-combobox-list .x-combo-list-inner{margin-bottom:0px}.syno-ux-combobox-list .syno-ux-pagingtoolbar{border-top:1px solid #EBF0F5;border-bottom:1px solid #D7E1EB;padding:0px}.ext-strict .x-small-editor .x-form-field-wrap .x-form-text.syno-ux-combobox{height:24px !important}.syno-ux-colormenu{background-image:none}.syno-ux-colormenu.x-layer{border-color:#C8D2DC;background-color:#FFFFFF;padding:4px;box-shadow:0 2px 4px rgba(0,0,0,0.5)}.x-form-item .x-form-item-label.syno-ux-item-label{font-size:12px;line-height:28px;padding:0px}.syno-ux-button{height:26px;line-height:26px;border-radius:3px;display:inline-block;text-align:center}.syno-ux-button.x-btn em button{height:26px;font-size:12px;padding-left:14px;padding-right:14px;background-repeat:no-repeat}.syno-ux-button.syno-ux-button-dropdown{padding-right:14px}.syno-ux-button.syno-ux-button-dropdown.syno-ux-button-split{padding-right:6px}.syno-ux-button em{cursor:pointer}.syno-ux-button em.x-btn-arrow{display:block;padding-right:6px;background-image:url("./images/Components/bt_dropdown.png");background-repeat:no-repeat;background-position:top right}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-button em.x-btn-arrow{background-image:url("../img/synohdpack/./images/Components/bt_dropdown.png");background-size:6px 112px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-button em.x-btn-arrow{background-image:url("../img/synohdpack/./images/Components/bt_dropdown.png");background-size:6px 112px;outline:1px green dashed}}.syno-ux-button em.x-btn-arrow button{padding-right:6px}.syno-ux-button em.x-btn-split{display:block;padding-right:12px;background-image:url("./images/Components/bt_dropdown.png");background-repeat:no-repeat;background-position:top right}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-button em.x-btn-split{background-image:url("../img/synohdpack/./images/Components/bt_dropdown.png");background-size:6px 112px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-button em.x-btn-split{background-image:url("../img/synohdpack/./images/Components/bt_dropdown.png");background-size:6px 112px;outline:1px green dashed}}.syno-ux-button em.x-btn-split button{border-right:1px solid #C8D2DC;padding-right:8px}.syno-ux-button.x-item-disabled{cursor:default}.syno-ux-button.x-item-disabled em.x-btn-arrow{background-position-y:-28px}.syno-ux-button.x-item-disabled em.x-btn-split{background-position-y:-28px}.syno-ux-button.syno-ux-button-blue em.x-btn-arrow,.syno-ux-button.syno-ux-button-blue em.x-btn-split,.syno-ux-button.syno-ux-button-red em.x-btn-arrow,.syno-ux-button.syno-ux-button-red em.x-btn-split,.syno-ux-button.syno-ux-button-green em.x-btn-arrow,.syno-ux-button.syno-ux-button-green em.x-btn-split,.syno-ux-button.syno-ux-button-orange em.x-btn-arrow,.syno-ux-button.syno-ux-button-orange em.x-btn-split{background-position-y:-56px}.syno-ux-button.syno-ux-button-blue.x-item-disabled em.x-btn-arrow,.syno-ux-button.syno-ux-button-blue.x-item-disabled em.x-btn-split,.syno-ux-button.syno-ux-button-red.x-item-disabled em.x-btn-arrow,.syno-ux-button.syno-ux-button-red.x-item-disabled em.x-btn-split,.syno-ux-button.syno-ux-button-green.x-item-disabled em.x-btn-arrow,.syno-ux-button.syno-ux-button-green.x-item-disabled em.x-btn-split,.syno-ux-button.syno-ux-button-orange.x-item-disabled em.x-btn-arrow,.syno-ux-button.syno-ux-button-orange.x-item-disabled em.x-btn-split{background-position-y:-84px}.syno-ux-button-blue,.syno-ux-button-red,.syno-ux-button-grey,.syno-ux-button-green,.syno-ux-button-orange{min-width:80px;text-align:center}.syno-ux-button-blue.syno-ux-button-dropdown,.syno-ux-button-blue.syno-ux-button-split,.syno-ux-button-red.syno-ux-button-dropdown,.syno-ux-button-red.syno-ux-button-split,.syno-ux-button-grey.syno-ux-button-dropdown,.syno-ux-button-grey.syno-ux-button-split,.syno-ux-button-green.syno-ux-button-dropdown,.syno-ux-button-green.syno-ux-button-split,.syno-ux-button-orange.syno-ux-button-dropdown,.syno-ux-button-orange.syno-ux-button-split{min-width:0px}.syno-ux-button-grey{border:solid 1px #C8D2DC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ViZjBmNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #ebf0f5));background-image:-webkit-linear-gradient(#f5faff,#ebf0f5);background-image:-moz-linear-gradient(#f5faff,#ebf0f5);background-image:-o-linear-gradient(#f5faff,#ebf0f5);background-image:linear-gradient(#f5faff,#ebf0f5);background-color:#ebf0f5}.syno-ux-button-grey.x-btn-over,.syno-ux-button-grey:hover{border:solid 1px #B4BEC8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2U3ZWNmMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #e7ecf1));background-image:-webkit-linear-gradient(#f5faff,#e7ecf1);background-image:-moz-linear-gradient(#f5faff,#e7ecf1);background-image:-o-linear-gradient(#f5faff,#e7ecf1);background-image:linear-gradient(#f5faff,#e7ecf1);background-color:#e7ecf1}.syno-ux-button-grey.x-btn-click,.syno-ux-button-grey:active{border:solid 1px #B4BEC8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ViZjBmNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UxZTZlYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ebf0f5), color-stop(100%, #e1e6eb));background-image:-webkit-linear-gradient(#ebf0f5,#e1e6eb);background-image:-moz-linear-gradient(#ebf0f5,#e1e6eb);background-image:-o-linear-gradient(#ebf0f5,#e1e6eb);background-image:linear-gradient(#ebf0f5,#e1e6eb);background-color:#e1e6eb}.syno-ux-button-grey.x-item-disabled{border:solid 1px #C8D2DC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ViZjBmNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #ebf0f5));background-image:-webkit-linear-gradient(#f5faff,#ebf0f5);background-image:-moz-linear-gradient(#f5faff,#ebf0f5);background-image:-o-linear-gradient(#f5faff,#ebf0f5);background-image:linear-gradient(#f5faff,#ebf0f5);background-color:#ebf0f5}.syno-ux-button-default{border:solid 1px #C8D2DC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2YwZjVmYSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #f0f5fa));background-image:-webkit-linear-gradient(#f5faff,#f0f5fa);background-image:-moz-linear-gradient(#f5faff,#f0f5fa);background-image:-o-linear-gradient(#f5faff,#f0f5fa);background-image:linear-gradient(#f5faff,#f0f5fa);background-color:#f0f5fa;margin-right:6px !important}.syno-ux-button-default.x-btn-over,.syno-ux-button-default:hover{border:solid 1px #B4BEC8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ViZjBmNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #ebf0f5));background-image:-webkit-linear-gradient(#f5faff,#ebf0f5);background-image:-moz-linear-gradient(#f5faff,#ebf0f5);background-image:-o-linear-gradient(#f5faff,#ebf0f5);background-image:linear-gradient(#f5faff,#ebf0f5);background-color:#ebf0f5}.syno-ux-button-default.x-btn-click,.syno-ux-button-default:active{border:solid 1px #B4BEC8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ViZjBmNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2U2ZWJmMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ebf0f5), color-stop(100%, #e6ebf0));background-image:-webkit-linear-gradient(#ebf0f5,#e6ebf0);background-image:-moz-linear-gradient(#ebf0f5,#e6ebf0);background-image:-o-linear-gradient(#ebf0f5,#e6ebf0);background-image:linear-gradient(#ebf0f5,#e6ebf0);background-color:#e6ebf0}.syno-ux-button-default.x-item-disabled{border:solid 1px #C8D2DC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2YwZjVmYSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #f0f5fa));background-image:-webkit-linear-gradient(#f5faff,#f0f5fa);background-image:-moz-linear-gradient(#f5faff,#f0f5fa);background-image:-o-linear-gradient(#f5faff,#f0f5fa);background-image:linear-gradient(#f5faff,#f0f5fa);background-color:#f0f5fa}.syno-ux-button-blue{border:solid 1px #1687D9;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzMyYWFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzE5OTRlYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #32aaff), color-stop(100%, #1994eb));background-image:-webkit-linear-gradient(#32aaff,#1994eb);background-image:-moz-linear-gradient(#32aaff,#1994eb);background-image:-o-linear-gradient(#32aaff,#1994eb);background-image:linear-gradient(#32aaff,#1994eb);background-color:#1994EB}.syno-ux-button-blue.x-btn button{color:#FFFFFF}.syno-ux-button-blue.x-btn-over,.syno-ux-button-blue:hover{border:solid 1px #0077CC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzI1YTRmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAyOGFlYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #25a4ff), color-stop(100%, #028aeb));background-image:-webkit-linear-gradient(#25a4ff,#028aeb);background-image:-moz-linear-gradient(#25a4ff,#028aeb);background-image:-o-linear-gradient(#25a4ff,#028aeb);background-image:linear-gradient(#25a4ff,#028aeb);background-color:#028AEB}.syno-ux-button-blue.x-btn-over.x-btn button,.syno-ux-button-blue:hover.x-btn button{color:#FFFFFF}.syno-ux-button-blue.x-btn-click,.syno-ux-button-blue:active{border:solid 1px #0077CC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzE4OTdmMiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAxODJkZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1897f2), color-stop(100%, #0182df));background-image:-webkit-linear-gradient(#1897f2,#0182df);background-image:-moz-linear-gradient(#1897f2,#0182df);background-image:-o-linear-gradient(#1897f2,#0182df);background-image:linear-gradient(#1897f2,#0182df);background-color:#0182DF}.syno-ux-button-blue.x-btn-click.x-btn button,.syno-ux-button-blue:active.x-btn button{color:#FFFFFF}.syno-ux-button-blue.x-item-disabled{border:solid 1px #1687D9;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzMyYWFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzE5OTRlYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #32aaff), color-stop(100%, #1994eb));background-image:-webkit-linear-gradient(#32aaff,#1994eb);background-image:-moz-linear-gradient(#32aaff,#1994eb);background-image:-o-linear-gradient(#32aaff,#1994eb);background-image:linear-gradient(#32aaff,#1994eb);background-color:#1994EB}.syno-ux-button-blue.x-item-disabled.x-btn button{color:#99D4FF !important}.syno-ux-button-blue.syno-ux-button-dropdown.syno-ux-button-split button{border-right-color:#1687D9}.syno-ux-button-blue.syno-ux-button-dropdown.syno-ux-button-split.x-btn-over button{border-right-color:#0077CC}.syno-ux-button-blue.syno-ux-button-dropdown.syno-ux-button-split.x-btn-click button{border-right-color:#0077CC}.syno-ux-button-blue.syno-ux-button-dropdown.syno-ux-button-split.x-item-disabled button{border-right-color:#1687D9}.syno-ux-button-red{border:solid 1px #D14949;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZhNzA3MCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ViNWY1ZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fa7070), color-stop(100%, #eb5f5f));background-image:-webkit-linear-gradient(#fa7070,#eb5f5f);background-image:-moz-linear-gradient(#fa7070,#eb5f5f);background-image:-o-linear-gradient(#fa7070,#eb5f5f);background-image:linear-gradient(#fa7070,#eb5f5f);background-color:#EB5F5F}.syno-ux-button-red.x-btn button{color:#FFFFFF}.syno-ux-button-red.x-btn-over,.syno-ux-button-red:hover{border:solid 1px #C43B38;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y5Njg2OCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2RmNDg0OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f96868), color-stop(100%, #df4848));background-image:-webkit-linear-gradient(#f96868,#df4848);background-image:-moz-linear-gradient(#f96868,#df4848);background-image:-o-linear-gradient(#f96868,#df4848);background-image:linear-gradient(#f96868,#df4848);background-color:#DF4848}.syno-ux-button-red.x-btn-over.x-btn button,.syno-ux-button-red:hover.x-btn button{color:#FFFFFF}.syno-ux-button-red.x-btn-click,.syno-ux-button-red:active{border:solid 1px #C43B38;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2U4NTY1NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2Q5NDY0NiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e85656), color-stop(100%, #d94646));background-image:-webkit-linear-gradient(#e85656,#d94646);background-image:-moz-linear-gradient(#e85656,#d94646);background-image:-o-linear-gradient(#e85656,#d94646);background-image:linear-gradient(#e85656,#d94646);background-color:#D94646}.syno-ux-button-red.x-btn-click.x-btn button,.syno-ux-button-red:active.x-btn button{color:#FFFFFF}.syno-ux-button-red.x-item-disabled{border:solid 1px #D14949;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZhNzA3MCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ViNWY1ZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fa7070), color-stop(100%, #eb5f5f));background-image:-webkit-linear-gradient(#fa7070,#eb5f5f);background-image:-moz-linear-gradient(#fa7070,#eb5f5f);background-image:-o-linear-gradient(#fa7070,#eb5f5f);background-image:linear-gradient(#fa7070,#eb5f5f);background-color:#EB5F5F}.syno-ux-button-red.x-item-disabled.x-btn button{color:#FFB2B2 !important}.syno-ux-button-red.syno-ux-button-dropdown.syno-ux-button-split button{border-right-color:#D14949}.syno-ux-button-red.syno-ux-button-dropdown.syno-ux-button-split.x-btn-over button{border-right-color:#C43B38}.syno-ux-button-red.syno-ux-button-dropdown.syno-ux-button-split.x-btn-click button{border-right-color:#C43B38}.syno-ux-button-red.syno-ux-button-dropdown.syno-ux-button-split.x-item-disabled button{border-right-color:#D14949}.syno-ux-button-green{border:solid 1px #7db012;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzlhY2YyOSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg4YmYxNCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #9acf29), color-stop(100%, #88bf14));background-image:-webkit-linear-gradient(#9acf29,#88bf14);background-image:-moz-linear-gradient(#9acf29,#88bf14);background-image:-o-linear-gradient(#9acf29,#88bf14);background-image:linear-gradient(#9acf29,#88bf14);background-color:#88bf14}.syno-ux-button-green.x-btn button{color:#FFFFFF}.syno-ux-button-green.x-btn-over,.syno-ux-button-green:hover{border:solid 1px #63a100;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzg4YzUyNyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzc4YjcxNCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #88c527), color-stop(100%, #78b714));background-image:-webkit-linear-gradient(#88c527,#78b714);background-image:-moz-linear-gradient(#88c527,#78b714);background-image:-o-linear-gradient(#88c527,#78b714);background-image:linear-gradient(#88c527,#78b714);background-color:#78b714}.syno-ux-button-green.x-btn-over.x-btn button,.syno-ux-button-green:hover.x-btn button{color:#FFFFFF}.syno-ux-button-green.x-btn-click,.syno-ux-button-green:active{border:solid 1px #63a100;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzc2YmIyNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzY3YWQxMyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #76bb25), color-stop(100%, #67ad13));background-image:-webkit-linear-gradient(#76bb25,#67ad13);background-image:-moz-linear-gradient(#76bb25,#67ad13);background-image:-o-linear-gradient(#76bb25,#67ad13);background-image:linear-gradient(#76bb25,#67ad13);background-color:#67ad13}.syno-ux-button-green.x-btn-click.x-btn button,.syno-ux-button-green:active.x-btn button{color:#FFFFFF}.syno-ux-button-green.x-item-disabled{border:solid 1px #7db012;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzdkYjAxMiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg4YmYxNCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #7db012), color-stop(100%, #88bf14));background-image:-webkit-linear-gradient(#7db012,#88bf14);background-image:-moz-linear-gradient(#7db012,#88bf14);background-image:-o-linear-gradient(#7db012,#88bf14);background-image:linear-gradient(#7db012,#88bf14);background-color:#88bf14}.syno-ux-button-green.x-item-disabled.x-btn button{color:#cde894 !important}.syno-ux-button-green.syno-ux-button-dropdown.syno-ux-button-split button{border-right-color:#7db012}.syno-ux-button-green.syno-ux-button-dropdown.syno-ux-button-split.x-btn-over button{border-right-color:#63a100}.syno-ux-button-green.syno-ux-button-dropdown.syno-ux-button-split.x-btn-click button{border-right-color:#63a100}.syno-ux-button-green.syno-ux-button-dropdown.syno-ux-button-split.x-item-disabled button{border-right-color:#7db012}.syno-ux-button-orange{border:solid 1px #ef8202;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZhYTI0NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2Y0OTgyZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #faa246), color-stop(100%, #f4982d));background-image:-webkit-linear-gradient(#faa246,#f4982d);background-image:-moz-linear-gradient(#faa246,#f4982d);background-image:-o-linear-gradient(#faa246,#f4982d);background-image:linear-gradient(#faa246,#f4982d);background-color:#faa246}.syno-ux-button-orange.x-btn button{color:#FFFFFF}.syno-ux-button-orange.x-btn-over,.syno-ux-button-orange:hover{border:solid 1px #ea7702;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZhYTI0NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VmOGUyYyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #faa246), color-stop(100%, #ef8e2c));background-image:-webkit-linear-gradient(#faa246,#ef8e2c);background-image:-moz-linear-gradient(#faa246,#ef8e2c);background-image:-o-linear-gradient(#faa246,#ef8e2c);background-image:linear-gradient(#faa246,#ef8e2c);background-color:#faa246}.syno-ux-button-orange.x-btn-over.x-btn button,.syno-ux-button-orange:hover.x-btn button{color:#FFFFFF}.syno-ux-button-orange.x-btn-click,.syno-ux-button-orange:active{border:solid 1px #ea7702;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZhOTk0NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VmODQyYyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fa9946), color-stop(100%, #ef842c));background-image:-webkit-linear-gradient(#fa9946,#ef842c);background-image:-moz-linear-gradient(#fa9946,#ef842c);background-image:-o-linear-gradient(#fa9946,#ef842c);background-image:linear-gradient(#fa9946,#ef842c);background-color:#fa9946}.syno-ux-button-orange.x-btn-click.x-btn button,.syno-ux-button-orange:active.x-btn button{color:#FFFFFF}.syno-ux-button-orange.x-item-disabled{border:solid 1px #ef8202;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZhYTI0NiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2Y0OTgyZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #faa246), color-stop(100%, #f4982d));background-image:-webkit-linear-gradient(#faa246,#f4982d);background-image:-moz-linear-gradient(#faa246,#f4982d);background-image:-o-linear-gradient(#faa246,#f4982d);background-image:linear-gradient(#faa246,#f4982d);background-color:#faa246}.syno-ux-button-orange.x-item-disabled.x-btn button{color:#ffe1be !important}.syno-ux-button-orange.syno-ux-button-dropdown.syno-ux-button-split button{border-right-color:#ef8202}.syno-ux-button-orange.syno-ux-button-dropdown.syno-ux-button-split.x-btn-over button{border-right-color:#ea7702}.syno-ux-button-orange.syno-ux-button-dropdown.syno-ux-button-split.x-btn-click button{border-right-color:#ea7702}.syno-ux-button-orange.syno-ux-button-dropdown.syno-ux-button-split.x-item-disabled button{border-right-color:#ef8202}.syno-ux-button.syno-ux-statebuttongroup-right,.syno-ux-button.syno-ux-statebuttongroup-left,.syno-ux-button.syno-ux-statebuttongroup-middle{margin-right:0px !important;border-color:#C8D2DC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2YwZjVmYSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #f0f5fa));background-image:-webkit-linear-gradient(#f5faff,#f0f5fa);background-image:-moz-linear-gradient(#f5faff,#f0f5fa);background-image:-o-linear-gradient(#f5faff,#f0f5fa);background-image:linear-gradient(#f5faff,#f0f5fa);background-color:#C8D2DC}.syno-ux-button.syno-ux-statebuttongroup-right.x-btn em button,.syno-ux-button.syno-ux-statebuttongroup-left.x-btn em button,.syno-ux-button.syno-ux-statebuttongroup-middle.x-btn em button{padding-right:18px;padding-left:18px}.syno-ux-button.syno-ux-statebuttongroup-right.x-btn-over,.syno-ux-button.syno-ux-statebuttongroup-right:hover,.syno-ux-button.syno-ux-statebuttongroup-left.x-btn-over,.syno-ux-button.syno-ux-statebuttongroup-left:hover,.syno-ux-button.syno-ux-statebuttongroup-middle.x-btn-over,.syno-ux-button.syno-ux-statebuttongroup-middle:hover{border-color:#C8D2DC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ViZjBmNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #ebf0f5));background-image:-webkit-linear-gradient(#f5faff,#ebf0f5);background-image:-moz-linear-gradient(#f5faff,#ebf0f5);background-image:-o-linear-gradient(#f5faff,#ebf0f5);background-image:linear-gradient(#f5faff,#ebf0f5);background-color:#EBF0F5}.syno-ux-button.syno-ux-statebuttongroup-right.x-btn-click,.syno-ux-button.syno-ux-statebuttongroup-right.syno-ux-statebuttongroup-pressed,.syno-ux-button.syno-ux-statebuttongroup-left.x-btn-click,.syno-ux-button.syno-ux-statebuttongroup-left.syno-ux-statebuttongroup-pressed,.syno-ux-button.syno-ux-statebuttongroup-middle.x-btn-click,.syno-ux-button.syno-ux-statebuttongroup-middle.syno-ux-statebuttongroup-pressed{border-color:#0970CB;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzE3OTNlYiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzNiYTZmMyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1793eb), color-stop(100%, #3ba6f3));background-image:-webkit-linear-gradient(#1793eb,#3ba6f3);background-image:-moz-linear-gradient(#1793eb,#3ba6f3);background-image:-o-linear-gradient(#1793eb,#3ba6f3);background-image:linear-gradient(#1793eb,#3ba6f3);background-color:#3BA6F3;box-shadow:inset 0px 1px 2px #007bd3}.syno-ux-button.syno-ux-statebuttongroup-right.x-btn-click.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-right.syno-ux-statebuttongroup-pressed.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-left.x-btn-click.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-left.syno-ux-statebuttongroup-pressed.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-middle.x-btn-click.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-middle.syno-ux-statebuttongroup-pressed.x-btn button{color:#FFFFFF;text-shadow:0px 1px 0px rgba(0,0,0,0.15)}.syno-ux-button.syno-ux-statebuttongroup-right.x-item-disabled,.syno-ux-button.syno-ux-statebuttongroup-left.x-item-disabled,.syno-ux-button.syno-ux-statebuttongroup-middle.x-item-disabled{border-color:#C8D2DC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2YwZjVmYSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #f0f5fa));background-image:-webkit-linear-gradient(#f5faff,#f0f5fa);background-image:-moz-linear-gradient(#f5faff,#f0f5fa);background-image:-o-linear-gradient(#f5faff,#f0f5fa);background-image:linear-gradient(#f5faff,#f0f5fa);background-color:#F0F5FA}.syno-ux-button.syno-ux-statebuttongroup-right,.syno-ux-button.syno-ux-statebuttongroup-middle{border-top-left-radius:0px;border-bottom-left-radius:0px}.syno-ux-button.syno-ux-statebuttongroup-left,.syno-ux-button.syno-ux-statebuttongroup-middle{border-right:0px;border-top-right-radius:0px;border-bottom-right-radius:0px}.syno-ux-modulelist{padding-right:6px;background-position:right 0;background-repeat:repeat-y;background-image:url("./images/Components/shadow_category.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist{background-image:url("../img/synohdpack/./images/Components/shadow_category.png");background-size:4px 8px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist{background-image:url("../img/synohdpack/./images/Components/shadow_category.png");background-size:4px 8px;outline:1px green dashed}}.syno-ux-modulelist .x-panel-body{overflow-y:hidden}.syno-ux-modulelist .x-panel-body:before,.syno-ux-modulelist .x-panel-body:after{position:absolute;display:block;height:6px;content:"";width:94%}.syno-ux-modulelist .x-panel-body:before{top:0px;z-index:99;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, rgba(255,255,255,0)));background-image:-webkit-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-moz-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-o-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:linear-gradient(#ffffff,rgba(255,255,255,0))}.syno-ux-modulelist .x-panel-body:after{bottom:0;z-index:99;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(255,255,255,0)), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-moz-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-o-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:linear-gradient(rgba(255,255,255,0),#ffffff)}.syno-ux-modulelist.scroll-at-top .x-panel-body:before{display:none}.syno-ux-modulelist.scroll-at-bottom .x-panel-body:after{display:none}.syno-ux-modulelist .x-tree-root-ct{width:auto !important}.syno-ux-modulelist .x-tree-root-node{padding-bottom:8px}.syno-ux-modulelist .x-tree-elbow,.syno-ux-modulelist .x-tree-elbow-end{display:none}.syno-ux-modulelist .x-tree-node,.syno-ux-modulelist .x-tree-node *{cursor:pointer}.syno-ux-modulelist .x-tree-node .x-tree-selected,.syno-ux-modulelist .x-tree-node .x-tree-node-over{background-color:transparent}.syno-ux-modulelist .x-tree-node-icon{width:24px;height:24px;margin:13px 6px 0 8px}.syno-ux-modulelist .syno-modulelist-toggle,.syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-minus,.syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-end-minus,.syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-minus,.syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-end-minus,.syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-plus,.syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-end-plus,.syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-plus,.syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-end-plus{width:24px;height:24px;margin:2px}.syno-ux-modulelist .x-tree-node-collapsed,.syno-ux-modulelist .x-tree-node-expanded{height:27px;margin:4px 0;font-size:12px;font-weight:bold;border-bottom:1px solid #EBF0F5}.syno-ux-modulelist .x-tree-node-collapsed .x-tree-node-icon,.syno-ux-modulelist .x-tree-node-expanded .x-tree-node-icon{display:none}.syno-ux-modulelist .x-tree-node-collapsed a,.syno-ux-modulelist .x-tree-node-expanded a{display:inline-block;width:100%;position:absolute;left:0;color:#6B95B2;overflow:hidden;text-overflow:ellipsis;line-height:27px}.syno-ux-modulelist .x-tree-node-collapsed a span,.syno-ux-modulelist .x-tree-node-expanded a span{color:#6B95B2;margin-left:28px}.syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-minus,.syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-end-minus,.syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-minus,.syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-end-minus{background-image:url("./images/Components/category_expand.png");background-position:0 -72px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-minus,.synohdpack .syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-end-minus,.synohdpack .syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-minus,.synohdpack .syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-end-minus{background-image:url("../img/synohdpack/./images/Components/category_expand.png");background-size:24px 144px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-minus,.synohdpackdebug .syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-end-minus,.synohdpackdebug .syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-minus,.synohdpackdebug .syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-end-minus{background-image:url("../img/synohdpack/./images/Components/category_expand.png");background-size:24px 144px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-plus,.syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-end-plus,.syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-plus,.syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-end-plus{background-image:url("./images/Components/category_expand.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-plus,.synohdpack .syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-end-plus,.synohdpack .syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-plus,.synohdpack .syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-end-plus{background-image:url("../img/synohdpack/./images/Components/category_expand.png");background-size:24px 144px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-plus,.synohdpackdebug .syno-ux-modulelist .x-tree-node-collapsed .x-tree-elbow-end-plus,.synohdpackdebug .syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-plus,.synohdpackdebug .syno-ux-modulelist .x-tree-node-expanded .x-tree-elbow-end-plus{background-image:url("../img/synohdpack/./images/Components/category_expand.png");background-size:24px 144px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-collapsed:hover,.syno-ux-modulelist .x-tree-node-expanded:hover{border-bottom:1px solid #D7E1EB}.syno-ux-modulelist .x-tree-node-collapsed:hover a span,.syno-ux-modulelist .x-tree-node-expanded:hover a span{color:#5C9DCC}.syno-ux-modulelist .x-tree-node-collapsed:hover .x-tree-elbow-minus,.syno-ux-modulelist .x-tree-node-expanded:hover .x-tree-elbow-minus{background-position:0 -96px}.syno-ux-modulelist .x-tree-node-collapsed:hover .x-tree-elbow-plus,.syno-ux-modulelist .x-tree-node-expanded:hover .x-tree-elbow-plus{background-position:0 -24px}.syno-ux-modulelist .x-tree-node-collapsed:active a span,.syno-ux-modulelist .x-tree-node-expanded:active a span{color:#5383A6}.syno-ux-modulelist .x-tree-node-collapsed:active .x-tree-elbow-minus,.syno-ux-modulelist .x-tree-node-expanded:active .x-tree-elbow-minus{background-position:0 -120px}.syno-ux-modulelist .x-tree-node-collapsed:active .x-tree-elbow-plus,.syno-ux-modulelist .x-tree-node-expanded:active .x-tree-elbow-plus{background-position:0 -48px}.syno-ux-modulelist .x-tree-node-leaf{height:50px;font-size:14px}.syno-ux-modulelist .x-tree-node-leaf a{display:inline-block;width:100%;position:absolute;left:0}.syno-ux-modulelist .x-tree-node-leaf a span{padding:0 0 0 38px;display:table-cell;line-height:20px;height:50px;white-space:normal;vertical-align:middle}.syno-ux-modulelist .x-tree-node-leaf .x-tree-node-icon{position:absolute;background-position:0 0;background-image:url("images/Components/c_icon_general.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .x-tree-node-leaf .x-tree-node-icon{background-image:url("../img/synohdpack/images/Components/c_icon_general.png");background-size:24px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .x-tree-node-leaf .x-tree-node-icon{background-image:url("../img/synohdpack/images/Components/c_icon_general.png");background-size:24px 96px;outline:1px green dashed}}.syno-ux-modulelist .x-tree-node-leaf.x-tree-node-over .x-tree-node-icon{background-position:0 -24px}.syno-ux-modulelist .x-tree-node-leaf.x-tree-selected{border-radius:3px}.syno-ux-modulelist .x-tree-node-leaf.x-tree-selected a span{color:#FFFFFF;text-shadow:0 1px 0 rgba(0,0,0,0.15)}.syno-ux-modulelist .x-tree-node-leaf.x-tree-selected .x-tree-node-icon{background-position:0 -48px}.syno-ux-modulelist .x-tree-node-leaf.x-tree-node-disabled .x-tree-node-icon{background-position:0 -72px;opacity:1}.syno-ux-modulelist .x-toolbar{border:none !important;background:none;padding:0 12px}.syno-ux-modulelist .x-panel-bwrap .x-panel-tbar .x-toolbar{padding-bottom:0}.syno-ux-modulelist .syno-textfilter .x-form-field-wrap{border-color:#C8D2DC;background-color:transparent;box-shadow:inset 0px 1px 0px rgba(80,90,100,0.08);background-image:none}.syno-ux-modulelist .syno-textfilter .x-form-field-wrap:hover{border-color:#B4BEC8}.syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger{width:24px;margin-top:2px;visibility:hidden;background-image:url("./images/Components/icon_search_clear.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger{background-image:url("../img/synohdpack/./images/Components/icon_search_clear.png");background-size:24px 144px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger{background-image:url("../img/synohdpack/./images/Components/icon_search_clear.png");background-size:24px 144px;outline:1px green dashed}}.syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger:hover{background-position:0 -24px}.syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-trigger:active{background-position:0 -48px}.syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-text{font-size:12px;height:24px !important;padding-left:30px;background-position:4px 1px;background-repeat:no-repeat;background-image:url("./images/Components/icon_search.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-text{background-image:url("../img/synohdpack/./images/Components/icon_search.png");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-modulelist .syno-textfilter .x-form-field-wrap .syno-textfilter-text{background-image:url("../img/synohdpack/./images/Components/icon_search.png");background-size:24px 24px;outline:1px green dashed}}.syno-ux-radio-icon{background-image:url("images/Components/radio_button.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-radio-icon{background-image:url("../img/synohdpack/images/Components/radio_button.png");background-size:22px 132px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-radio-icon{background-image:url("../img/synohdpack/images/Components/radio_button.png");background-size:22px 132px;outline:1px green dashed}}.x-form-field-trigger-wrap.x-form-field-wrap .syno-ux-datefield-trigger.x-form-trigger{background-image:url("images/Components/trigger_date.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .x-form-field-trigger-wrap.x-form-field-wrap .syno-ux-datefield-trigger.x-form-trigger{background-image:url("../img/synohdpack/images/Components/trigger_date.png");background-size:104px 28px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .x-form-field-trigger-wrap.x-form-field-wrap .syno-ux-datefield-trigger.x-form-trigger{background-image:url("../img/synohdpack/images/Components/trigger_date.png");background-size:104px 28px;outline:1px green dashed}}.syno-ux-datefield-menu{border-color:#C8D2DC}.syno-ux-datefield-menu .x-menu-list-item.x-menu-date-item{padding-top:6px;padding-right:6px;padding-left:6px}.syno-ux-datefield-menu .x-date-right,.syno-ux-datefield-menu .x-date-middle,.syno-ux-datefield-menu .x-date-left{background-image:none;height:28px}.syno-ux-datefield-menu .x-date-right a,.syno-ux-datefield-menu .x-date-left a{width:24px;height:24px;background-image:url("images/Components/date_prev_next.png");opacity:1}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-datefield-menu .x-date-right a,.synohdpack .syno-ux-datefield-menu .x-date-left a{background-image:url("../img/synohdpack/images/Components/date_prev_next.png");background-size:24px 192px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-datefield-menu .x-date-right a,.synohdpackdebug .syno-ux-datefield-menu .x-date-left a{background-image:url("../img/synohdpack/images/Components/date_prev_next.png");background-size:24px 192px;outline:1px green dashed}}.syno-ux-datefield-menu .x-date-left a{background-position:0px 0px}.syno-ux-datefield-menu .x-date-right a{background-position:0px -96px}.syno-ux-datefield-menu .x-date-middle{padding:0px}.syno-ux-datefield-menu .x-date-middle .x-btn button{height:28px;font-size:12px}.syno-ux-datefield-menu .x-date-middle .x-btn-mc em.x-btn-arrow{background-image:url("images/Components/date_dropdown.png");background-position:right 0px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-datefield-menu .x-date-middle .x-btn-mc em.x-btn-arrow{background-image:url("../img/synohdpack/images/Components/date_dropdown.png");background-size:6px 112px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-datefield-menu .x-date-middle .x-btn-mc em.x-btn-arrow{background-image:url("../img/synohdpack/images/Components/date_dropdown.png");background-size:6px 112px;outline:1px green dashed}}.syno-ux-datefield-menu .x-date-middle .x-btn-over em.x-btn-arrow{background-position:right -28px}.syno-ux-datefield-menu .x-date-middle .x-btn-click em.x-btn-arrow{background-position:right -56px}.syno-ux-datefield-menu table.x-date-inner{padding-bottom:4px;width:223px}.syno-ux-datefield-menu table.x-date-inner thead th{background-image:none;background-color:white;border:0px}.syno-ux-datefield-menu table.x-date-inner thead th span{height:28px;line-height:28px;padding:0px;margin-bottom:3px;text-align:center;border-bottom:1px solid #D7E1EB}.syno-ux-datefield-menu table.x-date-inner tbody tr td{height:24px;width:32px;border:0px}.syno-ux-datefield-menu table.x-date-inner tbody tr td a{background-color:transparent;border:0px;padding:0px;text-align:center;width:28px;height:24px;line-height:24px;margin-left:2px;margin-right:2px}.syno-ux-datefield-menu table.x-date-inner tbody tr td span{font-size:12px}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-disabled span,.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-prevday span,.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-nextday span{color:#96A0AA}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-disabled a{background-color:transparent}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-selected a span{color:white;font-weight:bold}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-today a{border-bottom:2px solid #FA4B4B;height:22px}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-today a span{color:#FA4B4B;font-weight:bold}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-selected.x-date-active:hover span{color:white}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-today.x-date-active:hover span{color:#FA4B4B}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-today.x-date-selected.x-date-active:hover span{color:white}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-selected.x-date-today a{border:0px;background-color:#FA4B4B;height:24px}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-selected.x-date-today a span{color:white;font-weight:bold}.syno-ux-datefield-menu .x-date-bottom{margin-top:4px;background-image:none;background-color:white;border-top:1px solid #D7E1EB;padding:0px;height:37px}.syno-ux-datefield-menu .x-date-bottom .x-btn-ml,.syno-ux-datefield-menu .x-date-bottom .x-btn-mc,.syno-ux-datefield-menu .x-date-bottom .x-btn-mr{background-image:none}.syno-ux-datefield-menu .x-date-bottom .x-btn-noicon .x-btn-small button{width:70px;height:24px;border-radius:3px;border:solid 1px #C8D2DC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ViZjBmNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #ebf0f5));background-image:-webkit-linear-gradient(#f5faff,#ebf0f5);background-image:-moz-linear-gradient(#f5faff,#ebf0f5);background-image:-o-linear-gradient(#f5faff,#ebf0f5);background-image:linear-gradient(#f5faff,#ebf0f5);background-color:#EBF0F5}.syno-ux-datefield-menu .x-date-bottom .x-btn-over.x-btn-noicon .x-btn-small button{border:solid 1px #B4BEC8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2U3ZWNmMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #e7ecf1));background-image:-webkit-linear-gradient(#f5faff,#e7ecf1);background-image:-moz-linear-gradient(#f5faff,#e7ecf1);background-image:-o-linear-gradient(#f5faff,#e7ecf1);background-image:linear-gradient(#f5faff,#e7ecf1);background-color:#E7ECF1}.syno-ux-datefield-menu .x-date-bottom .x-btn-click.x-btn-noicon .x-btn-small button{border:solid 1px #B4BEC8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ViZjBmNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UxZTZlYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ebf0f5), color-stop(100%, #e1e6eb));background-image:-webkit-linear-gradient(#ebf0f5,#e1e6eb);background-image:-moz-linear-gradient(#ebf0f5,#e1e6eb);background-image:-o-linear-gradient(#ebf0f5,#e1e6eb);background-image:linear-gradient(#ebf0f5,#e1e6eb);background-color:#E1E6EB}.ext-ie9 .syno-ux-datefield-menu .x-date-picker,.ext-ie8 .syno-ux-datefield-menu .x-date-picker{width:auto !important}.ext-ie9 .syno-ux-datefield-menu .x-date-picker .x-date-mp,.ext-ie8 .syno-ux-datefield-menu .x-date-picker .x-date-mp{width:auto !important}.syno-ux-datefield-menu .x-date-mp tr td a{width:50px;height:24px;line-height:24px;padding:0px;font-size:12px;border:0px}.syno-ux-datefield-menu .x-date-mp tr td.x-date-mp-sel a{color:white;font-weight:bold;background-image:none}.syno-ux-datefield-menu .x-date-mp-year{padding-left:6px;padding-right:0px}.syno-ux-datefield-menu .x-date-mp-month{padding-right:6px;padding-left:0px}.syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-prev,.syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-next{background-image:url("images/Components/date_prev_next.png");width:24px;height:24px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-prev,.synohdpack .syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-next{background-image:url("../img/synohdpack/images/Components/date_prev_next.png");background-size:24px 192px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-prev,.synohdpackdebug .syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-next{background-image:url("../img/synohdpack/images/Components/date_prev_next.png");background-size:24px 192px;outline:1px green dashed}}.syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-prev{background-position:0px 0px}.syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-prev:hover{background-position:0px -24px}.syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-next{background-position:0px -96px}.syno-ux-datefield-menu .x-date-mp-ybtn .x-date-mp-next:hover{background-position:0px -120px}.syno-ux-datefield-menu .x-date-mp-btns{background-image:none;background-color:white}.syno-ux-datefield-menu .x-date-mp-btns td{border-top:1px solid #D7E1EB;padding:0px;height:37px}.syno-ux-datefield-menu .x-date-mp-btns button{width:70px;height:24px;border-radius:3px}.syno-ux-datefield-menu .x-date-mp-btns button.x-date-mp-ok{margin-right:10px;border:solid 1px #1687D9;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzMyYWFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzE5OTRlYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #32aaff), color-stop(100%, #1994eb));background-image:-webkit-linear-gradient(#32aaff,#1994eb);background-image:-moz-linear-gradient(#32aaff,#1994eb);background-image:-o-linear-gradient(#32aaff,#1994eb);background-image:linear-gradient(#32aaff,#1994eb);background-color:#1994EB;color:#FFFFFF}.syno-ux-datefield-menu .x-date-mp-btns button.x-date-mp-ok:hover{border:solid 1px #0077CC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzI1YTRmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAyOGFlYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #25a4ff), color-stop(100%, #028aeb));background-image:-webkit-linear-gradient(#25a4ff,#028aeb);background-image:-moz-linear-gradient(#25a4ff,#028aeb);background-image:-o-linear-gradient(#25a4ff,#028aeb);background-image:linear-gradient(#25a4ff,#028aeb);background-color:#028AEB}.syno-ux-datefield-menu .x-date-mp-btns button.x-date-mp-cancel{border:solid 1px #C8D2DC;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ViZjBmNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #ebf0f5));background-image:-webkit-linear-gradient(#f5faff,#ebf0f5);background-image:-moz-linear-gradient(#f5faff,#ebf0f5);background-image:-o-linear-gradient(#f5faff,#ebf0f5);background-image:linear-gradient(#f5faff,#ebf0f5);background-color:#EBF0F5}.syno-ux-datefield-menu .x-date-mp-btns button.x-date-mp-cancel:hover{border:solid 1px #B4BEC8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZmFmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2U3ZWNmMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f5faff), color-stop(100%, #e7ecf1));background-image:-webkit-linear-gradient(#f5faff,#e7ecf1);background-image:-moz-linear-gradient(#f5faff,#e7ecf1);background-image:-o-linear-gradient(#f5faff,#e7ecf1);background-image:linear-gradient(#f5faff,#e7ecf1);background-color:#E7ECF1}.x-form-item .x-form-item-label.syno-ux-item-label{font-size:12px;line-height:28px;padding:0px}.syno-ux-textarea{font-size:12px;color:#505A64;background-color:#FFFFFF;box-shadow:inset 0px 1px 0px rgba(80,90,100,0.08)}.syno-ux-textarea.x-form-field{padding-left:8px;background-image:none;border-color:#C8D2DC;height:24px}.syno-ux-textarea.syno-ux-textarea-hover{border-color:#B4BEC8}.syno-ux-textarea.x-form-invalid{border-color:#FF8C8C;background-color:#FFF0F0;background-image:none}.syno-ux-textarea.x-item-disabled.x-form-field{color:#96A0AA;border-color:#C8D2DC;background-color:#F6F8FA}.x-form-item .x-form-item-label.syno-ux-item-label{font-size:12px;color:#505A64;line-height:28px;padding:0px}.syno-ux-form-fleXcroll-wrap{position:relative;display:inline-block}.syno-ux-form-fleXcroll-wrap .syno-ux-form-fleXcroll-element{position:absolute;right:0px;top:0px;width:10px}.syno-ux-form-fleXcroll-wrap .syno-ux-form-fleXcroll-element .syno-ux-form-fleXcroll-inner-element{width:10px}.syno-ux-textfilter .x-form-field-wrap{border:1px solid #C8D2DC;background-color:#FFFFFF;box-shadow:inset 0px 1px 0px rgba(80,90,100,0.08);background-image:none}.syno-ux-textfilter .x-form-field-wrap div{background-color:transparent}.syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-text.x-form-text{font-size:12px;height:24px !important;padding-left:30px;border:0px;background-position:4px 1px;background-repeat:no-repeat;background-color:transparent;background-image:url("./images/Components/icon_search.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-text.x-form-text{background-image:url("../img/synohdpack/./images/Components/icon_search.png");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-text.x-form-text{background-image:url("../img/synohdpack/./images/Components/icon_search.png");background-size:24px 24px;outline:1px green dashed}}.syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-text.x-form-text.syno-ux-textfilter-filter-icon{background-position:4px 1px;background-repeat:no-repeat;background-image:url("./images/Components/icon_filter.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-text.x-form-text.syno-ux-textfilter-filter-icon{background-image:url("../img/synohdpack/./images/Components/icon_filter.png");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-text.x-form-text.syno-ux-textfilter-filter-icon{background-image:url("../img/synohdpack/./images/Components/icon_filter.png");background-size:24px 24px;outline:1px green dashed}}.syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-trigger{background-position:0px 0px;background-repeat:no-repeat;background-image:url("./images/Components/icon_search_clear.png");border:none;width:24px;height:24px;right:0px;margin-top:1px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-trigger{background-image:url("../img/synohdpack/./images/Components/icon_search_clear.png");background-size:24px 144px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-trigger{background-image:url("../img/synohdpack/./images/Components/icon_search_clear.png");background-size:24px 144px;outline:1px green dashed}}.syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-trigger.x-form-trigger-over{background-position:0px -24px}.syno-ux-textfilter .x-form-field-wrap .syno-ux-textfilter-trigger.x-form-trigger-click{background-position:0px -48px}.syno-ux-textfilter .x-form-field-wrap:hover{border-color:#B4BEC8}.syno-ux-textfilter .x-form-field-wrap.x-form-field-wrap{background-image:none}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-textfilter .x-form-field-wrap.x-form-field-wrap{background-image:none}}.syno-ux-textfilter .x-form-field-wrap.x-form-field-wrap .x-form-field-wrap-center-img{width:34px;height:24px;background-position:0px 1px;background-repeat:no-repeat;background-image:url("images/Components/icon_advanced_search.png");padding-top:1px;padding-bottom:1px;display:table-cell;cursor:pointer}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-textfilter .x-form-field-wrap.x-form-field-wrap .x-form-field-wrap-center-img{background-image:url("../img/synohdpack/images/Components/icon_advanced_search.png");background-size:34px 96px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-textfilter .x-form-field-wrap.x-form-field-wrap .x-form-field-wrap-center-img{background-image:url("../img/synohdpack/images/Components/icon_advanced_search.png");background-size:34px 96px;outline:1px green dashed}}.syno-ux-textfilter .x-form-field-wrap.x-form-field-wrap .x-form-field-wrap-center-img:hover{background-position:0px -23px}.syno-ux-textfilter .x-form-field-wrap.x-item-disabled{border-color:#C8D2DC;background-color:#F6F8FA}.syno-ux-textfilter .x-form-field-wrap.x-item-disabled .x-form-field-wrap-center-img{background-position:0 -71px}.syno-ux-textfilter .x-form-field-wrap.x-item-disabled .x-form-field-wrap-center-img:hover{background-position:0 -71px}.syno-ux-textfilter.syno-ux-searchfield .x-form-field-wrap .syno-ux-textfilter-text.x-form-text{background-image:none;padding-left:0;display:block;vertical-align:inherit}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-textfilter.syno-ux-searchfield .x-form-field-wrap .syno-ux-textfilter-text.x-form-text{background-image:none}}input[type="file"]::-webkit-file-upload-button{cursor:pointer}.syno-ux-filebutton{filter:Alpha(opacity=0);opacity:0;position:absolute !important;padding:0px;border:none;cursor:pointer;z-index:1}.ext-ie .syno-ux-filebutton{font-size:1000px}.syno-ux-filebutton.x-item-disabled{filter:Alpha(opacity=0) !important;opacity:0 !important}.syno-ux-filebutton-btn-wrap{display:inline-block}.syno-ux-filebutton-txt{vertical-align:top}.syno-ux-formpanel .x-panel-body{padding-top:3px;padding-right:10px}.syno-ux-formpanel.syno-ux-formpanel-gradient.syno-ux-formpanel-no-tbar:before{position:absolute;display:block;height:6px;content:"";width:90%;z-index:99;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, rgba(255,255,255,0)));background-image:-webkit-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-moz-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-o-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:linear-gradient(#ffffff,rgba(255,255,255,0))}.syno-ux-formpanel.syno-ux-formpanel-gradient.syno-ux-formpanel-no-tbar.scroll-at-top:before{display:none}.syno-ux-formpanel.syno-ux-formpanel-gradient .x-panel-tbar:after{position:absolute;display:block;height:6px;content:"";width:90%;z-index:99;margin-top:0px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, rgba(255,255,255,0)));background-image:-webkit-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-moz-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-o-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:linear-gradient(#ffffff,rgba(255,255,255,0))}.syno-ux-formpanel.syno-ux-formpanel-gradient.scroll-at-bottom .x-panel-tbar:after{display:none}.syno-ux-formpanel.syno-ux-formpanel-gradient.syno-ux-formpanel-no-fbar:after{position:absolute;display:block;height:6px;content:"";width:90%;z-index:99;margin-top:-6px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(255,255,255,0)), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-moz-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-o-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:linear-gradient(rgba(255,255,255,0),#ffffff)}.syno-ux-formpanel.syno-ux-formpanel-gradient.syno-ux-formpanel-no-fbar.scroll-at-bottom:after{display:none}.syno-ux-formpanel.syno-ux-formpanel-gradient .x-panel-footer:before{position:absolute;display:block;height:6px;content:"";width:90%;z-index:99;margin-top:-10px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(255,255,255,0)), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-moz-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-o-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:linear-gradient(rgba(255,255,255,0),#ffffff)}.syno-ux-formpanel.syno-ux-formpanel-gradient.scroll-at-bottom .x-panel-footer:before{display:none}.syno-ux-formpanel .x-panel-footer{background-image:url("./images/Components/shadow_footbar.png");background-repeat:repeat-x;padding:4px 0 0 0}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-formpanel .x-panel-footer{background-image:url("../img/synohdpack/./images/Components/shadow_footbar.png");background-size:8px 4px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-formpanel .x-panel-footer{background-image:url("../img/synohdpack/./images/Components/shadow_footbar.png");background-size:8px 4px;outline:1px green dashed}}.syno-ux-formpanel .x-panel-footer .x-toolbar-ct{height:44px}.syno-ux-formpanel .x-panel-tbar .x-toolbar{background-image:none;background-color:transparent;border-bottom:1px solid #D7E1EB}.syno-ux-formpanel .x-panel-btns td.x-toolbar-cell{padding-right:7px;padding-left:0px}.syno-ux-tab-panel .x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text{padding-bottom:0}.syno-ux-tab-panel .x-tab-strip-top{border:none;background-repeat:repeat-x !important;background-position:0 24px !important;background-size:16px 10px !important;background-image:url("./images/Components/tab_shadow.png") !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-tab-panel .x-tab-strip-top{background-image:url("../img/synohdpack/./images/Components/tab_shadow.png") !important;background-size:16px 10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-tab-panel .x-tab-strip-top{background-image:url("../img/synohdpack/./images/Components/tab_shadow.png") !important;background-size:16px 10px;outline:1px green dashed}}.syno-ux-tab-panel .x-tab-strip-top .x-tab-left{padding:0}.syno-ux-tab-panel .x-tab-strip-top .x-tab-right{padding:0}.syno-ux-tab-panel .x-tab-strip-top .x-tab-strip-text{height:24px;line-height:24px;padding:0 16px;border-left:1px solid #D7E1EB}.syno-ux-tab-panel .x-tab-strip-top li{height:34px;margin:0}.syno-ux-tab-panel .x-tab-strip-top li.x-tab-strip-over .x-tab-strip-text{color:#78828C}.syno-ux-tab-panel .x-tab-strip-top li.x-tab-strip-active{font-weight:bold;background-image:url("./images/Components/tab_arrow.png");background-repeat:no-repeat;background-position:center 24px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-tab-panel .x-tab-strip-top li.x-tab-strip-active{background-image:url("../img/synohdpack/./images/Components/tab_arrow.png");background-size:16px 10px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-tab-panel .x-tab-strip-top li.x-tab-strip-active{background-image:url("../img/synohdpack/./images/Components/tab_arrow.png");background-size:16px 10px;outline:1px green dashed}}.syno-ux-tab-panel .x-tab-strip-top .x-tab-right,.syno-ux-tab-panel .x-tab-strip-top .x-tab-left,.syno-ux-tab-panel .x-tab-strip-top .x-tab-strip-inner{background-image:none}.syno-ux-tab-panel .x-tab-strip-top .x-tab-strip-closable .x-tab-strip-text{padding:0 30px 0 16px}.syno-ux-tab-panel .x-tab-strip-top .x-tab-strip-closable a.x-tab-strip-close{background-image:url("./images/Components/icon_search_clear.png");margin-top:-3px;width:24px;height:24px;opacity:1;filter:alpha(opacity=100)}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-tab-panel .x-tab-strip-top .x-tab-strip-closable a.x-tab-strip-close{background-image:url("../img/synohdpack/./images/Components/icon_search_clear.png");background-size:24px 144px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-tab-panel .x-tab-strip-top .x-tab-strip-closable a.x-tab-strip-close{background-image:url("../img/synohdpack/./images/Components/icon_search_clear.png");background-size:24px 144px;outline:1px green dashed}}.syno-ux-tab-panel .x-tab-strip-top .x-tab-strip-closable.x-tab-strip-over a.x-tab-strip-close{background-position:0px -24px}.syno-ux-tab-panel .x-tab-strip-spacer{display:none}.syno-ux-tab-panel .x-tab-panel-body{background-color:transparent;border:none}.syno-ux-tab-panel .x-tab-panel-footer{background-image:url("./images/Components/shadow_footbar.png");background-repeat:repeat-x;background-color:transparent;border:0px;padding:4px 0 0 0}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-tab-panel .x-tab-panel-footer{background-image:url("../img/synohdpack/./images/Components/shadow_footbar.png");background-size:8px 4px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-tab-panel .x-tab-panel-footer{background-image:url("../img/synohdpack/./images/Components/shadow_footbar.png");background-size:8px 4px;outline:1px green dashed}}.syno-ux-tab-panel .x-tab-panel-footer .x-toolbar-ct{height:44px}.syno-ux-tab-panel .x-panel-btns td.x-toolbar-cell{padding-right:7px;padding-left:0px}.syno-ux-grid-enable-column-checked{height:22px;margin-top:3px;background-repeat:no-repeat;background-position:center -66px;background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-grid-enable-column-checked{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-grid-enable-column-checked{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;outline:1px green dashed}}.syno-ux-grid-enable-column-checked:hover{background-position:center -88px}.syno-ux-grid-enable-column-unchecked{height:22px;margin-top:3px;background-repeat:no-repeat;background-position:center 0px;background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;)}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-grid-enable-column-unchecked{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-grid-enable-column-unchecked{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;outline:1px green dashed}}.syno-ux-grid-enable-column-unchecked:hover{background-position:center -22px}.syno-ux-grid-enable-column-grayed{height:22px;margin-top:3px;background-repeat:no-repeat;background-position:center -132px;background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-grid-enable-column-grayed{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-grid-enable-column-grayed{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;outline:1px green dashed}}.syno-ux-grid-enable-column-grayed:hover{background-position:center -154px}.syno-ux-checkbox-icon:hover{background-position:0 -22px}.syno-ux-checkbox-icon:hover.syno-ux-cb-checked{background-position:0 -88px}.syno-ux-checkbox-icon:hover.syno-ux-cb-checked.syno-ux-cb-disabled{background-position:0 -110px}.syno-ux-checkbox-icon:hover.syno-ux-cb-disabled{background-position:0 -44px}.syno-ux-grid-enable-column-disabled{height:22px;margin-top:3px;background-repeat:no-repeat;background-position:center -44px;background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-grid-enable-column-disabled{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-grid-enable-column-disabled{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;outline:1px green dashed}}.syno-ux-grid-enable-column-disabled-checked{height:22px;margin-top:3px;background-repeat:no-repeat;background-position:center -110px;background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-grid-enable-column-disabled-checked{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-grid-enable-column-disabled-checked{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;outline:1px green dashed}}.x-panel-noborder .x-panel-bbar-noborder.x-panel-bbar .syno-ux-pagingtoolbar{border-top-color:#EBF0F5;border-bottom:1px solid #D7E1EB;padding:0px;height:26px}.syno-ux-pagingtoolbar{background-color:transparent;background-image:none;line-height:28px}.syno-ux-pagingtoolbar .x-toolbar-right div{padding:2px 8px 2px 2px;font-size:12px;height:24px;line-height:24px}.syno-ux-pagingtoolbar .xtb-sep{height:20px;background-image:none;border-left:1px solid #D7E1EB;width:0px;margin:0px}.syno-ux-pagingtoolbar .x-btn-icon .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .x-btn-mr{width:2px}.syno-ux-pagingtoolbar .x-btn-icon .x-btn-ml i,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-mr i,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .x-btn-ml i,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .x-btn-mr i,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-ml i,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-mr i,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .x-btn-ml i,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .x-btn-mr i{width:2px}.syno-ux-pagingtoolbar .x-btn-icon button,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small button,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled button,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small button{background-image:url("images/Components/bt_pagebar.png") !important;min-width:28px;width:auto;height:28px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-pagingtoolbar .x-btn-icon button,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small button,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled button,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small button{background-image:url("../img/synohdpack/images/Components/bt_pagebar.png") !important;background-size:28px 560px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-pagingtoolbar .x-btn-icon button,.synohdpackdebug .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small button,.synohdpackdebug .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled button,.synohdpackdebug .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small button{background-image:url("../img/synohdpack/images/Components/bt_pagebar.png") !important;background-size:28px 560px;outline:1px green dashed}}.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn,.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn-focus,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn-focus,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn-focus,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn-focus{padding:0 3px;background-image:none !important;font-size:12px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn-focus,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn-focus,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn-focus,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn-focus{background-image:none !important}}.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn .x-btn-mc,.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn-focus .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn-focus .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn-focus .x-btn-mc,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn .x-btn-mc,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn-focus .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn-focus .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn-focus .x-btn-mc,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn .x-btn-mc,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn-focus .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn-focus .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn-focus .x-btn-mc,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn .x-btn-mc,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn-focus .x-btn-ml,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn-focus .x-btn-mr,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn-focus .x-btn-mc{background-image:none !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn .x-btn-ml,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn .x-btn-mr,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn .x-btn-mc,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn-focus .x-btn-ml,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn-focus .x-btn-mr,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn-focus .x-btn-mc,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn .x-btn-ml,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn .x-btn-mr,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn .x-btn-mc,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn-focus .x-btn-ml,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn-focus .x-btn-mr,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn-focus .x-btn-mc,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn .x-btn-ml,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn .x-btn-mr,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn .x-btn-mc,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn-focus .x-btn-ml,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn-focus .x-btn-mr,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn-focus .x-btn-mc,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn .x-btn-ml,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn .x-btn-mr,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn .x-btn-mc,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn-focus .x-btn-ml,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn-focus .x-btn-mr,.synohdpack .syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn-focus .x-btn-mc{background-image:none !important}}.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .x-tbar-page-first{background-position:0 0}.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .x-tbar-page-prev{background-position:0 -28px}.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .x-tbar-page-next{background-position:0 -56px}.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .x-tbar-page-last{background-position:0 -84px}.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .x-tbar-loading{background-position:0 -112px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-over .x-btn-small .x-tbar-page-first{background-position:0 -140px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-over .x-btn-small .x-tbar-page-prev{background-position:0 -168px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-over .x-btn-small .x-tbar-page-next{background-position:0 -196px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-over .x-btn-small .x-tbar-page-last{background-position:0 -224px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-over .x-btn-small .x-tbar-loading{background-position:0 -252px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-click .x-btn-small .x-tbar-page-first{background-position:0 -280px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-click .x-btn-small .x-tbar-page-prev{background-position:0 -308px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-click .x-btn-small .x-tbar-page-next{background-position:0 -336px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-click .x-btn-small .x-tbar-page-last{background-position:0 -364px}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-click .x-btn-small .x-tbar-loading{background-position:0 -392px}.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .x-tbar-page-first{background-position:0 -420px}.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .x-tbar-page-prev{background-position:0 -448px}.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .x-tbar-page-next{background-position:0 -476px}.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .x-tbar-page-last{background-position:0 -504px}.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .x-tbar-loading{background-position:0 -532px}.syno-ux-toolbar{background-color:transparent;background-image:none}.syno-ux-expandable-listview .item-summary .item-toggle,.syno-ux-expandable-listview .item-summary .item-toggle.item-toggle-expanded,.syno-ux-expandable-listview .item-summary .item-entry,.syno-ux-expandable-listview .item-summary .item-entry.item-toggle-exit,.syno-ux-expandable-listview .item-summary .item-exit{display:inline-block;position:absolute;top:0px;right:0px;width:36px;height:50px}.syno-ux-expandable-listview .item-summary .item-toggle .item-toggle-img,.syno-ux-expandable-listview .item-summary .item-toggle.item-toggle-expanded .item-toggle-img,.syno-ux-expandable-listview .item-summary .item-entry .item-entry-img,.syno-ux-expandable-listview .item-summary .item-entry.item-toggle-exit .item-entry-img,.syno-ux-expandable-listview .item-summary .item-exit .item-exit-img{position:relative;left:6px;top:13px;width:24px;height:24px;background-repeat:no-repeat;background-image:url("images/Components/fieldset_expand.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-expandable-listview .item-summary .item-toggle .item-toggle-img,.syno-ux-expandable-listview .item-summary .item-toggle .synohdpack .item-toggle-img,.synohdpack .syno-ux-expandable-listview .item-summary .item-entry .item-entry-img,.syno-ux-expandable-listview .item-summary .item-entry .synohdpack .item-entry-img,.synohdpack .syno-ux-expandable-listview .item-summary .item-exit .item-exit-img,.syno-ux-expandable-listview .item-summary .item-exit .synohdpack .item-exit-img{background-image:url("../img/synohdpack/images/Components/fieldset_expand.png");background-size:24px 288px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-expandable-listview .item-summary .item-toggle .item-toggle-img,.syno-ux-expandable-listview .item-summary .item-toggle .synohdpackdebug .item-toggle-img,.synohdpackdebug .syno-ux-expandable-listview .item-summary .item-entry .item-entry-img,.syno-ux-expandable-listview .item-summary .item-entry .synohdpackdebug .item-entry-img,.synohdpackdebug .syno-ux-expandable-listview .item-summary .item-exit .item-exit-img,.syno-ux-expandable-listview .item-summary .item-exit .synohdpackdebug .item-exit-img{background-image:url("../img/synohdpack/images/Components/fieldset_expand.png");background-size:24px 288px;outline:1px green dashed}}.syno-ux-expandable-listview .item-wrap{position:relative;padding-left:60px;border-bottom:1px solid #EBF0F5}.syno-ux-expandable-listview .item-wrap.item-over{background-color:#F5FAFF}.syno-ux-expandable-listview .item-wrap.item-selected{background-color:#E6F5FF}.syno-ux-expandable-listview .item-summary{height:50px}.syno-ux-expandable-listview .item-summary .item-icon{display:inline-block;width:32px;height:32px;position:absolute;top:9px;left:12px}.syno-ux-expandable-listview .item-summary .item-toggle .item-toggle-img{background-position:0 0px}.syno-ux-expandable-listview .item-summary .item-toggle:hover{cursor:pointer}.syno-ux-expandable-listview .item-summary .item-toggle:hover .item-toggle-img{background-position:0 -24px}.syno-ux-expandable-listview .item-summary .item-toggle:active .item-toggle-img{background-position:0 -48px}.syno-ux-expandable-listview .item-summary .item-toggle.item-toggle-expanded .item-toggle-img{background-position:0 -72px}.syno-ux-expandable-listview .item-summary .item-toggle.item-toggle-expanded:hover{cursor:pointer}.syno-ux-expandable-listview .item-summary .item-toggle.item-toggle-expanded:hover .item-toggle-img{background-position:0 -96px}.syno-ux-expandable-listview .item-summary .item-toggle.item-toggle-expanded:active .item-toggle-img{background-position:0 -120px}.syno-ux-expandable-listview .item-summary .item-entry .item-entry-img{background-position:0 -144px}.syno-ux-expandable-listview .item-summary .item-entry:hover{cursor:pointer}.syno-ux-expandable-listview .item-summary .item-entry:hover .item-entry-img{background-position:0 -168px}.syno-ux-expandable-listview .item-summary .item-entry:active .item-entry-img{background-position:0 -192px}.syno-ux-expandable-listview .item-summary .item-entry.item-toggle-exit .item-entry-img{background-position:0 -216px}.syno-ux-expandable-listview .item-summary .item-entry.item-toggle-exit:hover{cursor:pointer}.syno-ux-expandable-listview .item-summary .item-entry.item-toggle-exit:hover .item-entry-img{background-position:0 -240px}.syno-ux-expandable-listview .item-summary .item-entry.item-toggle-exit:active .item-entry-img{background-position:0 -264px}.syno-ux-expandable-listview .item-summary .item-exit .item-exit-img{background-position:0 -216px}.syno-ux-expandable-listview .item-summary .item-exit:hover{cursor:pointer}.syno-ux-expandable-listview .item-summary .item-exit:hover .item-exit-img{background-position:0 -240px}.syno-ux-expandable-listview .item-summary .item-exit:active .item-exit-img{background-position:0 -264px}.syno-ux-expandable-listview .item-summary .item-title{font-size:14px;font-weight:bold;line-height:28px}.syno-ux-expandable-listview .item-detail{padding:0 40px 12px 0}.ux-float-layout-ct{position:relative}.ux-float-layout-ct .ux-float-layout-sizer{background:transparent none;border:0 none;padding:0;margin:0;width:0}.ux-float-layout-ct .x-box-item{position:absolute}.ux-float-layout-ct.ux-float-layout-ct-animate .x-box-item{-webkit-transition-property:top,left;-moz-transition-property:top,left;-o-transition-property:top,left;transition-property:top,left;-webkit-transition-timing-function:ease-in;-moz-transition-timing-function:ease-in;-o-transition-timing-function:ease-in;transition-timing-function:ease-in;-webkit-transition-duration:0.3s;-moz-transition-duration:0.3s;-o-transition-duration:0.3s;transition-duration:0.3s}.syno-ux-treepanel{overflow-x:hidden}.syno-ux-treepanel .x-border-panel{background-color:transparent}.syno-ux-treepanel .x-tree-root-ct{width:auto !important;overflow:hidden}.syno-ux-treepanel .x-tree-node-el{display:table;width:100%;line-height:28px;height:28px;overflow:hidden}.syno-ux-treepanel .x-tree-node{text-overflow:ellipsis;white-space:nowrap}.syno-ux-treepanel .x-tree-node a span{font-size:12px;padding-left:2px}.syno-ux-treepanel .x-tree-node .x-tree-node-over{background-color:#E6F5FF;border-radius:3px}.syno-ux-treepanel .x-tree-node .x-tree-node-over .syno-ux-cb-grayed{background-position:0 -154px}.syno-ux-treepanel .x-tree-node .x-tree-node-over .syno-ux-cb-disabled.syno-ux-cb-checked{background-position:0 -110px}.syno-ux-treepanel .x-tree-node .x-tree-selected{border-radius:3px}.syno-ux-treepanel .x-tree-node .x-tree-selected a span{color:#FFFFFF}.syno-ux-treepanel .x-tree-arrows .x-tree-node-indent .x-tree-elbow-line,.syno-ux-treepanel .x-tree-arrows .x-tree-node-indent .x-tree-icon{width:18px}.syno-ux-treepanel .x-tree-arrows .x-tree-elbow-minus,.syno-ux-treepanel .x-tree-arrows .x-tree-elbow-plus,.syno-ux-treepanel .x-tree-arrows .x-tree-elbow-end-minus,.syno-ux-treepanel .x-tree-arrows .x-tree-elbow-end-plus{background-image:url("./images/Components/tree_arrow.png");height:22px;margin-top:6px}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-treepanel .x-tree-arrows .x-tree-elbow-minus,.synohdpack .syno-ux-treepanel .x-tree-arrows .x-tree-elbow-plus,.synohdpack .syno-ux-treepanel .x-tree-arrows .x-tree-elbow-end-minus,.synohdpack .syno-ux-treepanel .x-tree-arrows .x-tree-elbow-end-plus{background-image:url("../img/synohdpack/./images/Components/tree_arrow.png");background-size:64px 16px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-treepanel .x-tree-arrows .x-tree-elbow-minus,.synohdpackdebug .syno-ux-treepanel .x-tree-arrows .x-tree-elbow-plus,.synohdpackdebug .syno-ux-treepanel .x-tree-arrows .x-tree-elbow-end-minus,.synohdpackdebug .syno-ux-treepanel .x-tree-arrows .x-tree-elbow-end-plus{background-image:url("../img/synohdpack/./images/Components/tree_arrow.png");background-size:64px 16px;outline:1px green dashed}}.syno-ux-treepanel .x-tree-arrows .x-tree-ec-over .x-tree-elbow-minus,.syno-ux-treepanel .x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-minus{background-position:0px 0}.syno-ux-treepanel .x-tree-arrows .x-tree-selected .x-tree-elbow-minus,.syno-ux-treepanel .x-tree-arrows .x-tree-selected .x-tree-elbow-end-minus{background-position:-16px 0}.syno-ux-treepanel .x-tree-arrows .x-tree-ec-over .x-tree-elbow-plus,.syno-ux-treepanel .x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-plus{background-position:-32px 0}.syno-ux-treepanel .x-tree-arrows .x-tree-selected .x-tree-elbow-plus,.syno-ux-treepanel .x-tree-arrows .x-tree-selected .x-tree-elbow-end-plus{background-position:-48px 0}.syno-ux-treepanel .x-tree-arrows .x-tree-elbow-minus,.syno-ux-treepanel .x-tree-arrows .x-tree-elbow-end-minus{background-position:0px 0}.syno-ux-treepanel .x-tree-arrows .x-tree-elbow-plus,.syno-ux-treepanel .x-tree-arrows .x-tree-elbow-end-plus{background-position:-32px 0}.syno-ux-treepanel .x-checkbox{margin-top:-3px !important;height:22px;width:22px;background-repeat:no-repeat;background-position:0px 0;background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;);vertical-align:middle;margin-left:4px !important;margin-right:8px !important}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-treepanel .x-checkbox{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-treepanel .x-checkbox{background-image:url("../img/synohdpack/images/Components/checkbox.png");background-size:22px 198px;outline:1px green dashed}}.syno-ux-treepanel .x-checkbox:hover{background-position:0 -22px}.syno-ux-treepanel .x-item-disabled .x-checkbox{background-position:0 -44px}.syno-ux-treepanel .x-checkbox-checked .x-checkbox{background-position:0 -66px}.syno-ux-treepanel .x-checkbox-checked .x-checkbox:hover{background-position:0 -88px}.syno-ux-treepanel .x-item-disabled .x-checkbox-checked .x-checkbox{background-position:0 -110px}.syno-ux-treepanel .x-checkbox-grayed .x-checkbox{background-position:0 -132px}.syno-ux-treepanel .x-checkbox-grayed .x-checkbox:hover{background-position:0 -154px}.syno-ux-treepanel .x-item-disabled .x-checkbox-grayed .x-checkbox{background-position:0 -176px}.syno-ux-treepanel.syno-ux-treepanel-gradient .x-panel-bwrap:before{position:absolute;display:block;height:6px;content:"";width:100%;z-index:99;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, rgba(255,255,255,0)));background-image:-webkit-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-moz-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-o-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:linear-gradient(#ffffff,rgba(255,255,255,0))}.syno-ux-treepanel.syno-ux-treepanel-gradient .x-panel-bwrap:after{position:absolute;display:block;height:6px;content:"";width:100%;z-index:99;margin-top:-6px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(255,255,255,0)), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-moz-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-o-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:linear-gradient(rgba(255,255,255,0),#ffffff)}.syno-ux-treepanel.syno-ux-treepanel-gradient.scroll-at-top .x-panel-bwrap:before,.syno-ux-treepanel.syno-ux-treepanel-gradient.scroll-at-bottom .x-panel-bwrap:after{display:none}.x-tip-invalid{box-shadow:0 1px 4px rgba(0,0,0,0.25);border:solid 1px;border-color:#FFCCCC;border-color:rgba(255,204,204,0.75);background-color:#FA4B4B;background-color:rgba(250,75,75,0.75)}.x-tip-invalid .x-tip-invalid-ml,.x-tip-invalid .x-tip-invalid-mr,.x-tip-invalid .x-tip-invalid-mc,.x-tip-invalid .x-tip-invalid-tl,.x-tip-invalid .x-tip-invalid-tr,.x-tip-invalid .x-tip-invalid-tc,.x-tip-invalid .x-tip-invalid-bl,.x-tip-invalid .x-tip-invalid-br,.x-tip-invalid .x-tip-invalid-bc{padding:0px;background-image:none;background-color:transparent}.x-tip-invalid .x-tip-invalid-bwrap{padding:3px 10px}.x-tip-invalid .x-tip-invalid-body,.x-tip-invalid .x-tip-invalid-body span,.x-tip-invalid .x-tip-invalid-body div{font-size:12px !important;color:#FFFFFF !important}.ext-gecko .x-window-body .x-form-item{overflow:hidden}.ext-ie .x-toolbar .x-toolbar-cell .x-form-field-wrap{height:auto}.ext-ie .x-toolbar .x-toolbar-cell .x-form-field-wrap .syno-textfilter-text,.ext-ie .x-toolbar .x-toolbar-cell .x-form-field-wrap .syno-ux-textfilter-text{line-height:24px;padding-top:0px;padding-bottom:0px}.selectabletext{-moz-user-select:text;-khtml-user-select:text;-webkit-user-select:text;-ms-user-select:text;user-select:text}input[type=text][readonly].selectabletext,input[type=textarea][readonly].selectabletext,input[type=password][readonly].selectabletext{-moz-user-select:text;-khtml-user-select:text;-webkit-user-select:text;-ms-user-select:text;user-select:text}.x-statusbar .syno-ux-statusbar-loading,.x-statusbar .syno-ux-statusbar-success,.x-statusbar .syno-ux-statusbar-error{display:table-cell;vertical-align:middle;white-space:normal;word-break:break-all;margin-left:2px;height:24px;line-height:12px;font-size:12px;padding-left:30px;padding-right:6px}.x-statusbar .syno-ux-statusbar-loading{background-position:0 0;background-repeat:no-repeat;background-image:url("images/Components/icon_loading.gif")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .x-statusbar .syno-ux-statusbar-loading{background-image:url("../img/synohdpack/images/Components/icon_loading.gif");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .x-statusbar .syno-ux-statusbar-loading{background-image:url("../img/synohdpack/images/Components/icon_loading.gif");background-size:24px 24px;outline:1px green dashed}}.x-statusbar .syno-ux-statusbar-success{background-position:0 0;background-repeat:no-repeat;background-image:url("./images/Components/icon_success.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .x-statusbar .syno-ux-statusbar-success{background-image:url("../img/synohdpack/./images/Components/icon_success.png");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .x-statusbar .syno-ux-statusbar-success{background-image:url("../img/synohdpack/./images/Components/icon_success.png");background-size:24px 24px;outline:1px green dashed}}.x-statusbar .syno-ux-statusbar-error{background-position:0 0;background-repeat:no-repeat;background-image:url("./images/Components/icon_error.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .x-statusbar .syno-ux-statusbar-error{background-image:url("../img/synohdpack/./images/Components/icon_error.png");background-size:24px 24px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .x-statusbar .syno-ux-statusbar-error{background-image:url("../img/synohdpack/./images/Components/icon_error.png");background-size:24px 24px;outline:1px green dashed}}.syno-ux-superboxselect{position:relative;height:auto !important;margin:0px;overflow:hidden;padding:1px 2px 1px 4px;display:block;outline:0px !important;border-right:1px solid #C8D2DC}.x-item-disabled .syno-ux-superboxselect.x-form-focus{border-right:1px solid #C8D2DC}.syno-ux-superboxselect.x-form-invalid{border-right:1px solid #FF8C8C;background-color:#FFF0F0}.x-item-disabled .syno-ux-superboxselect.x-form-text{background-color:#F6F8FA;border-right:1px solid #C8D2DC}.syno-ux-superboxselect input[disabled]{background-color:transparent}.syno-ux-superboxselect ul{overflow:hidden;cursor:text}.syno-ux-superboxselect-display-btns ul{padding-right:50px}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns{position:absolute;right:1px;top:0;overflow:hidden;padding:1px}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns div{float:left}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-clear{width:24px;height:22px;background-repeat:no-repeat;background-attachment:scroll;background-position:0px -1px;background-image:url("./images/Components/icon_search_clear.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-clear{background-image:url("../img/synohdpack/./images/Components/icon_search_clear.png");background-size:24px 144px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-clear{background-image:url("../img/synohdpack/./images/Components/icon_search_clear.png");background-size:24px 144px;outline:1px green dashed}}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-clear.syno-ux-superboxselect-btn-over{background-position:0px -25px}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-clear.syno-ux-superboxselect-btn-over.syno-ux-superboxselect-btn-click{background-position:0px -49px}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-clear.syno-ux-superboxselect-btn-click{background-position:0px -49px}.x-item-disabled .syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-clear{background-position:0px -1px}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-expand{width:26px;height:22px;background-repeat:no-repeat;background-attachment:scroll;background-position:0px -3px;background-image:url("images/Components/trigger.png")}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-expand{background-image:url("../img/synohdpack/images/Components/trigger.png");background-size:104px 28px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-expand{background-image:url("../img/synohdpack/images/Components/trigger.png");background-size:104px 28px;outline:1px green dashed}}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-expand.syno-ux-superboxselect-btn-over{background-position:-26px -3px}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-expand.syno-ux-superboxselect-btn-over.syno-ux-superboxselect-btn-click{background-position:-52px -3px}.syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-expand.syno-ux-superboxselect-btn-click{background-position:-52px -3px}.x-item-disabled .syno-ux-superboxselect-display-btns .syno-ux-superboxselect-btns .syno-ux-superboxselect-btn-expand{background-position:-78px -3px}.syno-ux-superboxselect-btn-hide{display:none}.syno-ux-superboxselect li{float:left;margin:1px 4px 1px 0px;padding:0;line-height:20px}.syno-ux-superboxselect-stacked li{float:none !important}.syno-ux-superboxselect-input input{border:none;outline:0px;margin-top:4px;margin-bottom:4px;background-color:transparent}body.ext-ie .x-superboxselect-input input{background:none;border:none;margin-top:3px}.syno-ux-superboxselect-item{position:relative;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;o-border-radius:2px;khtml-border-radius:2px;border:1px solid #C8D2DC;background-color:#E7F3FE;padding:0px 26px 0px 8px !important;font-size:12px}.syno-ux-superboxselect-item.syno-ux-superboxselect-item-hover{background:#F2F9FF;border:1px solid #B6C4D2}.syno-ux-superboxselect-item.syno-ux-superboxselect-item-focus{border-color:#B6C4D2;background:#E0F0FE}.syno-ux-superboxselect-item-close{background-repeat:no-repeat;background-attachment:scroll;background-position:left 0px;background-image:url("./images/Components/superbox_button_cancel.png");border:none;font-size:1px;height:22px;padding:0;position:absolute;right:0px;top:0px;width:16px;display:block;cursor:pointer;background-color:transparent}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpack .syno-ux-superboxselect-item-close{background-image:url("../img/synohdpack/./images/Components/superbox_button_cancel.png");background-size:8px 88px}}@media (-webkit-min-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (min-resolution: 144dpi){.synohdpackdebug .syno-ux-superboxselect-item-close{background-image:url("../img/synohdpack/./images/Components/superbox_button_cancel.png");background-size:8px 88px;outline:1px green dashed}}.syno-ux-superboxselect-item-close:hover,.syno-ux-superboxselect-item-close:active{background-position:left -22px}.syno-ux-superboxselect-item-focus .syno-ux-superboxselect-item-close{background-position:left -44px}.x-item-disabled .syno-ux-superboxselect-item-close{background-position:left -66px}.syno-gridtree.syno-ux-treepanel div.x-tree-node-el{display:block}.syno-gridtree .syno-gridtree-col{border:none}.syno-gridtree .syno-gridtree-icons{float:left}.syno-gridtree .syno-gridtree-static .x-tree-ec-icon{display:none}.syno-gridtree .syno-gridtree-static .x-tree-node-el{cursor:default}.syno-gridtree .no-node-icon .x-tree-node-leaf .x-tree-node-icon,.syno-gridtree .no-node-icon .x-tree-node-collapsed .x-tree-node-icon,.syno-gridtree .no-node-icon .x-tree-node-expanded .x-tree-node-icon{display:none}.syno-ux-combobox-list .x-combo-list-item.x-combo-selected{background-color:#0086e5;border:1px solid #0086e5 !important}.syno-ux-datefield-menu .x-date-middle .x-btn button{color:#0086e5}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-selected a{background-color:#0086e5}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-active:hover span{color:#0086e5}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-today a{border-bottom:2px solid #fa4b4b}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-today a span{color:#fa4b4b}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-today.x-date-active:hover span{color:#fa4b4b}.syno-ux-datefield-menu table.x-date-inner tbody tr td.x-date-selected.x-date-today a{background-color:#fa4b4b}.syno-ux-datefield-menu .x-date-mp tr td.x-date-mp-sel a{background-color:#0086e5}.syno-ux-displayfield.x-form-display-field a{color:#0086e5}.syno-ux-expandable-listview .item-wrap.item-over{background-color:#f5faff}.syno-ux-expandable-listview .item-wrap.item-selected{background-color:#e6f5ff}.syno-ux-expandable-listview .item-summary .item-status{color:#0086e5}.syno-ux-fieldset .x-fieldset-header{color:#0086e5}.syno-ux-modulelist .x-panel-body:before{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, rgba(255,255,255,0)));background-image:-webkit-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-moz-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-o-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:linear-gradient(#ffffff,rgba(255,255,255,0))}.syno-ux-modulelist .x-panel-body:after{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(255,255,255,0)), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-moz-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-o-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:linear-gradient(rgba(255,255,255,0),#ffffff)}.syno-ux-modulelist .x-tree-node-leaf.x-tree-node-over a span{color:#0086e5}.syno-ux-modulelist .x-tree-node-leaf.x-tree-selected{background-color:#0086e5}.syno-ux-modulelist .x-tree-node-leaf.x-tree-selected.x-tree-node-over a span{color:#FFFFFF}.syno-ux-modulelist .syno-textfilter .x-form-field-wrap.x-trigger-wrap-focus{border-color:#0086e5}.syno-ux-pagingtoolbar .x-toolbar-right div{color:#0086e5}.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn{color:#0086e5}.syno-ux-pagingtoolbar .x-btn-icon .syno-ux-page-btn-focus,.syno-ux-pagingtoolbar .x-btn-icon .x-btn-small .syno-ux-page-btn-focus,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn-focus,.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .x-btn-small .syno-ux-page-btn-focus{background-color:#0086e5;color:white}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-over .syno-ux-page-btn{background-color:#e6f5ff}.syno-ux-pagingtoolbar .x-btn-icon.x-btn-click .syno-ux-page-btn{color:white;background-color:#0086e5}.syno-ux-pagingtoolbar .x-btn-icon.x-item-disabled .syno-ux-page-btn{background-color:transparent}.syno-ux-button.syno-ux-statebuttongroup-right.x-btn-over.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-right:hover.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-left.x-btn-over.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-left:hover.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-middle.x-btn-over.x-btn button,.syno-ux-button.syno-ux-statebuttongroup-middle:hover.x-btn button{color:#0086e5}.x-statusbar .syno-ux-statusbar-loading{color:#0086e5}.syno-ux-superboxselect.x-form-focus{border-right:1px solid #0086e5}.syno-ux-superboxselect.x-form-focus.x-form-invalid{border-right:1px solid #FF8C8C}.syno-ux-tab-panel .x-tab-strip-top li.x-tab-strip-active .x-tab-strip-text{color:#0086e5}.syno-ux-textarea.x-form-focus{border-color:#0086e5}.syno-ux-textfilter .x-form-field-wrap.x-trigger-wrap-focus{border-color:#0086e5}.syno-ux-treepanel .x-tree-node .x-tree-node-over{background-color:#e6f5ff}.syno-ux-treepanel .x-tree-node .x-tree-selected{background-color:#0086e5}.syno-ux-treepanel.syno-ux-treepanel-gradient .x-panel-bwrap:before{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, rgba(255,255,255,0)));background-image:-webkit-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-moz-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:-o-linear-gradient(#ffffff,rgba(255,255,255,0));background-image:linear-gradient(#ffffff,rgba(255,255,255,0))}.syno-ux-treepanel.syno-ux-treepanel-gradient .x-panel-bwrap:after{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0icmdiYSgyNTUsMjU1LDI1NSwwKSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(255,255,255,0)), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-moz-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:-o-linear-gradient(rgba(255,255,255,0),#ffffff);background-image:linear-gradient(rgba(255,255,255,0),#ffffff)} diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/css/xtheme-gray.css b/salt/idh/skins/http/opencanary/nasLogin/static/css/xtheme-gray.css new file mode 100644 index 000000000..919e73297 --- /dev/null +++ b/salt/idh/skins/http/opencanary/nasLogin/static/css/xtheme-gray.css @@ -0,0 +1,1682 @@ +/*! + * Ext JS Library 3.4.0 + * Copyright(c) 2006-2011 Sencha Inc. + * licensing@sencha.com + * http://www.sencha.com/license + */ +.ext-el-mask { + background-color: #ccc; +} + +.ext-el-mask-msg { + border-color:#999; + background-color:#ddd; + background-image:url(../images/gray/panel/white-top-bottom.gif); + background-position: 0 -1px; +} +.ext-el-mask-msg div { + background-color: #eee; + border-color:#d0d0d0; + color:#222; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} + +.x-mask-loading div { + background-color:#fbfbfb; + background-image:url(../images/default/grid/loading.gif); +} + +.x-item-disabled { + color: gray; +} + +.x-item-disabled * { + color: gray !important; +} + +.x-splitbar-proxy { + background-color: #aaa; +} + +.x-color-palette a { + border-color:#fff; +} + +.x-color-palette a:hover, .x-color-palette a.x-color-palette-sel { + border-color:#CFCFCF; + background-color: #eaeaea; +} + +/* +.x-color-palette em:hover, .x-color-palette span:hover{ + background-color: #eaeaea; +} +*/ + +.x-color-palette em { + border-color:#aca899; +} + +.x-ie-shadow { + background-color:#777; +} + +.x-shadow .xsmc { + background-image: url(../images/default/shadow-c.png); +} + +.x-shadow .xsml, .x-shadow .xsmr { + background-image: url(../images/default/shadow-lr.png); +} + +.x-shadow .xstl, .x-shadow .xstc, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbc, .x-shadow .xsbr{ + background-image: url(../images/default/shadow.png); +} + +.loading-indicator { + font-size: 11px; + background-image: url(../images/default/grid/loading.gif); +} + +.x-spotlight { + background-color: #ccc; +}.x-tab-panel-header, .x-tab-panel-footer { + background-color: #eaeaea; + border-color:#d0d0d0; + overflow:hidden; + zoom:1; +} + +.x-tab-panel-header, .x-tab-panel-footer { + border-color:#d0d0d0; +} + +ul.x-tab-strip-top{ + background-color:#dbdbdb; + background-image: url(../images/gray/tabs/tab-strip-bg.gif); + border-bottom-color:#d0d0d0; +} + +ul.x-tab-strip-bottom{ + background-color:#dbdbdb; + background-image: url(../images/gray/tabs/tab-strip-btm-bg.gif); + border-top-color:#d0d0d0; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer, +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-color:#d0d0d0; + background-color: #eaeaea; +} + +.x-tab-strip span.x-tab-strip-text { + font:normal 11px tahoma,arial,helvetica; + color:#333; +} + +.x-tab-strip-over span.x-tab-strip-text { + color:#111; +} + +.x-tab-strip-active span.x-tab-strip-text { + color:#333; + font-weight:bold; +} + +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} + +.x-tab-strip-top .x-tab-right, .x-tab-strip-top .x-tab-left, .x-tab-strip-top .x-tab-strip-inner{ + background-image: url(../images/gray/tabs/tabs-sprite.gif); +} + +.x-tab-strip-bottom .x-tab-right { + background-image: url(../images/gray/tabs/tab-btm-inactive-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-left { + background-image: url(../images/gray/tabs/tab-btm-inactive-left-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-over .x-tab-left { + background-image: url(../images/gray/tabs/tab-btm-over-left-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-over .x-tab-right { + background-image: url(../images/gray/tabs/tab-btm-over-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image: url(../images/gray/tabs/tab-btm-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image: url(../images/gray/tabs/tab-btm-left-bg.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/gray/tabs/tab-close.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/gray/tabs/tab-close.gif); +} + +.x-tab-panel-body { + border-color:#d0d0d0; + background-color:#fff; +} + +.x-tab-panel-body-top { + border-top: 0 none; +} + +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} + +.x-tab-scroller-left { + background-image:url(../images/gray/tabs/scroll-left.gif); + border-bottom-color:#d0d0d0; +} + +.x-tab-scroller-left-over { + background-position: 0 0; +} + +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); + cursor:default; +} + +.x-tab-scroller-right { + background-image:url(../images/gray/tabs/scroll-right.gif); + border-bottom-color:#d0d0d0; +} + +.x-tab-panel-bbar .x-toolbar, .x-tab-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} +.x-form-field{ + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-text, textarea.x-form-field{ + background-color:#fff; + background-image:url(../images/default/form/text-bg.gif); + border-color:#C1C1C1; +} + +.x-form-select-one { + background-color:#fff; + border-color:#C1C1C1; +} + +.x-form-check-group-label { + border-bottom: 1px solid #d0d0d0; + color: #333; +} + +.x-editor .x-form-check-wrap { + background-color:#fff; +} + +.x-form-field-wrap .x-form-trigger{ + background-image:url(../images/gray/form/trigger.gif); + border-bottom-color:#b5b8c8; +} + +.x-form-field-wrap .x-form-date-trigger{ + background-image: url(../images/gray/form/date-trigger.gif); +} + +.x-form-field-wrap .x-form-clear-trigger{ + background-image: url(../images/gray/form/clear-trigger.gif); +} + +.x-form-field-wrap .x-form-search-trigger{ + background-image: url(../images/gray/form/search-trigger.gif); +} + +.x-trigger-wrap-focus .x-form-trigger{ + border-bottom-color: #777777; +} + +.x-item-disabled .x-form-trigger-over{ + border-bottom-color:#b5b8c8; +} + +.x-item-disabled .x-form-trigger-click{ + border-bottom-color:#b5b8c8; +} + +.x-form-focus, textarea.x-form-focus{ + border-color:#777777; +} + +.x-form-invalid, textarea.x-form-invalid{ + background-color:#fff; + background-image:url(../images/default/grid/invalid_line.gif); + border-color:#c30; +} + +.ext-webkit .x-form-invalid{ + background-color:#fee; + border-color:#ff7870; +} + +.x-form-inner-invalid, textarea.x-form-inner-invalid{ + background-color:#fff; + background-image:url(../images/default/grid/invalid_line.gif); +} + +.x-form-grow-sizer { + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-item { + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-invalid-msg { + color:#c0272b; + font:normal 11px tahoma, arial, helvetica, sans-serif; + background-image:url(../images/default/shared/warning.gif); +} + +.x-form-empty-field { + color:gray; +} + +.x-small-editor .x-form-field { + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.ext-webkit .x-small-editor .x-form-field { + font:normal 12px arial, tahoma, helvetica, sans-serif; +} + +.x-form-invalid-icon { + background-image:url(../images/default/form/exclamation.gif); +} + +.x-fieldset { + border-color:#CCCCCC; +} + +.x-fieldset legend { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#777777; +}.x-btn{ + font:normal 11px tahoma, verdana, helvetica; +} + +.x-btn button{ + font:normal 11px arial,tahoma,verdana,helvetica; + color:#333; +} + +.x-btn em { + font-style:normal; + font-weight:normal; +} + +.x-btn-tl, .x-btn-tr, .x-btn-tc, .x-btn-ml, .x-btn-mr, .x-btn-mc, .x-btn-bl, .x-btn-br, .x-btn-bc{ + background-image:url(../images/gray/button/btn.gif); +} + +.x-btn-click .x-btn-text, .x-btn-menu-active .x-btn-text, .x-btn-pressed .x-btn-text{ + color:#000; +} + +.x-btn-disabled *{ + color:gray !important; +} + +.x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/button/arrow.gif); +} + +.x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow.gif); +} + +.x-btn-over .x-btn-mc em.x-btn-split, .x-btn-click .x-btn-mc em.x-btn-split, .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-btn-pressed .x-btn-mc em.x-btn-split { + background-image:url(../images/gray/button/s-arrow-o.gif); +} + +.x-btn-mc em.x-btn-arrow-bottom { + background-image:url(../images/default/button/s-arrow-b-noline.gif); +} + +.x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-b.gif); +} + +.x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/gray/button/s-arrow-bo.gif); +} + +.x-btn-group-header { + color: #666; +} + +.x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} + +.x-btn-group-tl { + background-image: url(../images/gray/button/group-cs.gif); +} + +.x-btn-group-tr { + background-image: url(../images/gray/button/group-cs.gif); +} + +.x-btn-group-bc { + background-image: url(../images/gray/button/group-tb.gif); +} + +.x-btn-group-bl { + background-image: url(../images/gray/button/group-cs.gif); +} + +.x-btn-group-br { + background-image: url(../images/gray/button/group-cs.gif); +} + +.x-btn-group-ml { + background-image: url(../images/gray/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/gray/button/group-lr.gif); +} + +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/gray/button/group-tb.gif); +} +.x-toolbar{ + border-color:#d0d0d0; + background-color:#f0f0f0; + background-image:url(../images/gray/toolbar/bg.gif); +} + +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + font:normal 11px arial,tahoma, helvetica, sans-serif; +} + +.x-toolbar .x-item-disabled { + color:gray; +} + +.x-toolbar .x-item-disabled * { + color:gray; +} + +.x-toolbar .x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split, +.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split +{ + background-image:url(../images/gray/button/s-arrow-o.gif); +} + +.x-toolbar .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-b-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom, +.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom +{ + background-image:url(../images/gray/button/s-arrow-bo.gif); +} + +.x-toolbar .xtb-sep { + background-image: url(../images/default/grid/grid-split.gif); +} + +.x-tbar-page-first{ + background-image: url(../images/gray/grid/page-first.gif) !important; +} + +.x-tbar-loading{ + background-image: url(../images/gray/grid/refresh.gif) !important; +} + +.x-tbar-page-last{ + background-image: url(../images/gray/grid/page-last.gif) !important; +} + +.x-tbar-page-next{ + background-image: url(../images/gray/grid/page-next.gif) !important; +} + +.x-tbar-page-prev{ + background-image: url(../images/gray/grid/page-prev.gif) !important; +} + +.x-item-disabled .x-tbar-loading{ + background-image: url(../images/default/grid/loading.gif) !important; +} + +.x-item-disabled .x-tbar-page-first{ + background-image: url(../images/default/grid/page-first-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-last{ + background-image: url(../images/default/grid/page-last-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-next{ + background-image: url(../images/default/grid/page-next-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-prev{ + background-image: url(../images/default/grid/page-prev-disabled.gif) !important; +} + +.x-paging-info { + color:#444; +} + +.x-toolbar-more-icon { + background-image: url(../images/gray/toolbar/more.gif) !important; +} +.x-resizable-handle { + background-color:#fff; +} + +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-image:url(../images/gray/sizer/e-handle.gif); +} + +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-image:url(../images/gray/sizer/s-handle.gif); +} + +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ + background-image:url(../images/gray/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-image:url(../images/gray/sizer/se-handle.gif); +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-image:url(../images/gray/sizer/nw-handle.gif); +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-image:url(../images/gray/sizer/ne-handle.gif); +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-image:url(../images/gray/sizer/sw-handle.gif); +} +.x-resizable-proxy{ + border-color:#565656; +} +.x-resizable-overlay{ + background-color:#fff; +} +.x-grid3 { + background-color:#fff; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border-color:#d0d0d0; +} + +.x-grid3-row td, .x-grid3-summary-row td{ + font:normal 11px/13px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-hd-row td { + font:normal 11px/15px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-hd-row td { + border-left-color:#eee; + border-right-color:#d0d0d0; +} + +.x-grid-row-loading { + background-color: #fff; + background-image:url(../images/default/shared/loading-balls.gif); +} + +.x-grid3-row { + border-color:#ededed; + border-top-color:#fff; +} + +.x-grid3-row-alt{ + background-color:#fafafa; +} + +.x-grid3-row-over { + border-color:#ddd; + background-color:#efefef; + background-image:url(../images/default/grid/row-over.gif); +} + +.x-grid3-resize-proxy { + background-color:#777; +} + +.x-grid3-resize-marker { + background-color:#777; +} + +.x-grid3-header{ + background-color:#f9f9f9; + background-image:url(../images/gray/grid/grid3-hrow2.gif); +} + +.x-grid3-header-pop { + border-left-color:#d0d0d0; +} + +.x-grid3-header-pop-inner { + border-left-color:#eee; + background-image:url(../images/default/grid/hd-pop.gif); +} + +td.x-grid3-hd-over, td.sort-desc, td.sort-asc, td.x-grid3-hd-menu-open { + border-left-color:#ACACAC; + border-right-color:#ACACAC; +} + +td.x-grid3-hd-over .x-grid3-hd-inner, td.sort-desc .x-grid3-hd-inner, td.sort-asc .x-grid3-hd-inner, td.x-grid3-hd-menu-open .x-grid3-hd-inner { + background-color:#f9f9f9; + background-image:url(../images/gray/grid/grid3-hrow-over2.gif); + +} + +.sort-asc .x-grid3-sort-icon { + background-image: url(../images/gray/grid/sort_asc.gif); +} + +.sort-desc .x-grid3-sort-icon { + background-image: url(../images/gray/grid/sort_desc.gif); +} + +.x-grid3-cell-text, .x-grid3-hd-text { + color:#000; +} + +.x-grid3-split { + background-image: url(../images/default/grid/grid-split.gif); +} + +.x-grid3-hd-text { + color:#333; +} + +.x-dd-drag-proxy .x-grid3-hd-inner{ + background-color:#f9f9f9; + background-image:url(../images/gray/grid/grid3-hrow-over2.gif); + border-color:#ACACAC; +} + +.col-move-top{ + background-image:url(../images/gray/grid/col-move-top.gif); +} + +.col-move-bottom{ + background-image:url(../images/gray/grid/col-move-bottom.gif); +} + +.x-grid3-row-selected { + background-color:#CCCCCC !important; + background-image: none; + border-color:#ACACAC; +} + +.x-grid3-cell-selected{ + background-color: #CBCBCB !important; + color:#000; +} + +.x-grid3-cell-selected span{ + color:#000 !important; +} + +.x-grid3-cell-selected .x-grid3-cell-text{ + color:#000; +} + +.x-grid3-locked td.x-grid3-row-marker, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{ + background-color:#ebeadb !important; + background-image:url(../images/default/grid/grid-hrow.gif) !important; + color:#000; + border-top-color:#fff; + border-right-color:#6fa0df !important; +} + +.x-grid3-locked td.x-grid3-row-marker div, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{ + color:#333 !important; +} + +.x-grid3-dirty-cell { + background-image:url(../images/default/grid/dirty.gif); +} + +.x-grid3-topbar, .x-grid3-bottombar{ + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-bottombar .x-toolbar{ + border-top-color:#a9bfd3; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{ + background-image:url(../images/default/grid/grid3-special-col-bg.gif) !important; + color:#000 !important; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name{ + background-color:#fff !important; + border-right-color:#eee; +} + +.xg-hmenu-sort-asc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-asc.gif); +} + +.xg-hmenu-sort-desc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-desc.gif); +} + +.xg-hmenu-lock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-lock.gif); +} + +.xg-hmenu-unlock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-unlock.gif); +} + +.x-grid3-hd-btn { + background-color:#f9f9f9; + background-image:url(../images/gray/grid/grid3-hd-btn.gif); +} + +.x-grid3-body .x-grid3-td-expander { + background-image:url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-expander { + background-image:url(../images/gray/grid/row-expand-sprite.gif); +} + +.x-grid3-body .x-grid3-td-checker { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-checker, .x-grid3-hd-checker { + background-image:url(../images/default/grid/row-check-sprite.gif); +} + +.x-grid3-body .x-grid3-td-numberer { + background-image:url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + color:#444; +} + +.x-grid3-body .x-grid3-td-row-icon { + background-image:url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer, +.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker, +.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander { + background-image:url(../images/gray/grid/grid3-special-col-sel-bg.gif); +} + +.x-grid3-check-col { + background-image:url(../images/default/menu/unchecked.gif); +} + +.x-grid3-check-col-on { + background-image:url(../images/default/menu/checked.gif); +} + +.x-grid-group, .x-grid-group-body, .x-grid-group-hd { + zoom:1; +} + +.x-grid-group-hd { + border-bottom-color:#d0d0d0; +} + +.x-grid-group-hd div.x-grid-group-title { + background-image:url(../images/gray/grid/group-collapse.gif); + color:#5F5F5F; + font:bold 11px tahoma, arial, helvetica, sans-serif; +} + +.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title { + background-image:url(../images/gray/grid/group-expand.gif); +} + +.x-group-by-icon { + background-image:url(../images/default/grid/group-by.gif); +} + +.x-cols-icon { + background-image:url(../images/default/grid/columns.gif); +} + +.x-show-groups-icon { + background-image:url(../images/default/grid/group-by.gif); +} + +.x-grid-empty { + color:gray; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} + +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + border-right-color:#ededed; +} + +.x-grid-with-col-lines .x-grid3-row{ + border-top-color:#ededed; +} + +.x-grid-with-col-lines .x-grid3-row-selected { + border-top-color:#B9B9B9; +} +.x-pivotgrid .x-grid3-header-offset table td { + background: url(../images/gray/grid/grid3-hrow2.gif) repeat-x 50% 100%; + border-left: 1px solid; + border-right: 1px solid; + border-left-color: #D0D0D0; + border-right-color: #D0D0D0; +} + +.x-pivotgrid .x-grid3-row-headers { + background-color: #f9f9f9; +} + +.x-pivotgrid .x-grid3-row-headers table td { + background: #EEE url(../images/default/grid/grid3-rowheader.gif) repeat-x left top; + border-left: 1px solid; + border-right: 1px solid; + border-left-color: #EEE; + border-right-color: #D0D0D0; + border-bottom: 1px solid; + border-bottom-color: #D0D0D0; + height: 18px; +} +.x-dd-drag-ghost{ + color:#000; + font: normal 11px arial, helvetica, sans-serif; + border-color: #ddd #bbb #bbb #ddd; + background-color:#fff; +} + +.x-dd-drop-nodrop .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-no.gif); +} + +.x-dd-drop-ok .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-yes.gif); +} + +.x-dd-drop-ok-add .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-add.gif); +} + +.x-view-selector { + background-color:#D6D6D6; + border-color:#888888; +}.x-tree-node-expanded .x-tree-node-icon{ + background-image:url(../images/default/tree/folder-open.gif); +} + +.x-tree-node-leaf .x-tree-node-icon{ + background-image:url(../images/default/tree/leaf.gif); +} + +.x-tree-node-collapsed .x-tree-node-icon{ + background-image:url(../images/default/tree/folder.gif); +} + +.x-tree-node-loading .x-tree-node-icon{ + background-image:url(../images/default/tree/loading.gif) !important; +} + +.x-tree-node .x-tree-node-inline-icon { + background-image: none; +} + +.x-tree-node-loading a span{ + font-style: italic; + color:#444444; +} + +.ext-ie .x-tree-node-el input { + width:15px; + height:15px; +} + +.x-tree-lines .x-tree-elbow{ + background-image:url(../images/default/tree/elbow.gif); +} + +.x-tree-lines .x-tree-elbow-plus{ + background-image:url(../images/default/tree/elbow-plus.gif); +} + +.x-tree-lines .x-tree-elbow-minus{ + background-image:url(../images/default/tree/elbow-minus.gif); +} + +.x-tree-lines .x-tree-elbow-end{ + background-image:url(../images/default/tree/elbow-end.gif); +} + +.x-tree-lines .x-tree-elbow-end-plus{ + background-image:url(../images/gray/tree/elbow-end-plus.gif); +} + +.x-tree-lines .x-tree-elbow-end-minus{ + background-image:url(../images/gray/tree/elbow-end-minus.gif); +} + +.x-tree-lines .x-tree-elbow-line{ + background-image:url(../images/default/tree/elbow-line.gif); +} + +.x-tree-no-lines .x-tree-elbow-plus{ + background-image:url(../images/default/tree/elbow-plus-nl.gif); +} + +.x-tree-no-lines .x-tree-elbow-minus{ + background-image:url(../images/default/tree/elbow-minus-nl.gif); +} + +.x-tree-no-lines .x-tree-elbow-end-plus{ + background-image:url(../images/gray/tree/elbow-end-plus-nl.gif); +} + +.x-tree-no-lines .x-tree-elbow-end-minus{ + background-image:url(../images/gray/tree/elbow-end-minus-nl.gif); +} + +.x-tree-arrows .x-tree-elbow-plus{ + background-image:url(../images/gray/tree/arrows.gif); +} + +.x-tree-arrows .x-tree-elbow-minus{ + background-image:url(../images/gray/tree/arrows.gif); +} + +.x-tree-arrows .x-tree-elbow-end-plus{ + background-image:url(../images/gray/tree/arrows.gif); +} + +.x-tree-arrows .x-tree-elbow-end-minus{ + background-image:url(../images/gray/tree/arrows.gif); +} + +.x-tree-node{ + color:#000; + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-tree-node a, .x-dd-drag-ghost a{ + color:#000; +} + +.x-tree-node a span, .x-dd-drag-ghost a span{ + color:#000; +} + +.x-tree-node .x-tree-node-disabled a span{ + color:gray !important; +} + +.x-tree-node div.x-tree-drag-insert-below{ + border-bottom-color:#36c; +} + +.x-tree-node div.x-tree-drag-insert-above{ + border-top-color:#36c; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{ + border-bottom-color:#36c; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{ + border-top-color:#36c; +} + +.x-tree-node .x-tree-drag-append a span{ + background-color:#ddd; + border-color:gray; +} + +.x-tree-node .x-tree-node-over { + background-color: #eee; +} + +.x-tree-node .x-tree-selected { + background-color: #ddd; +} + +.x-tree-drop-ok-append .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-add.gif); +} + +.x-tree-drop-ok-above .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-over.gif); +} + +.x-tree-drop-ok-below .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-under.gif); +} + +.x-tree-drop-ok-between .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-between.gif); +} +.x-date-picker { + border-color:#585858; + background-color:#fff; +} + +.x-date-middle,.x-date-left,.x-date-right { + background-image: url(../images/gray/shared/hd-sprite.gif); + color:#fff; + font:bold 11px "sans serif", tahoma, verdana, helvetica; +} + +.x-date-middle .x-btn .x-btn-text { + color:#fff; +} + +.x-date-middle .x-btn-mc em.x-btn-arrow { + background-image:url(../images/gray/toolbar/btn-arrow-light.gif); +} + +.x-date-right a { + background-image: url(../images/gray/shared/right-btn.gif); +} + +.x-date-left a{ + background-image: url(../images/gray/shared/left-btn.gif); +} + +.x-date-inner th { + background-color:#D8D8D8; + background-image: url(../images/gray/panel/white-top-bottom.gif); + border-bottom-color:#AFAFAF; + font:normal 10px arial, helvetica,tahoma,sans-serif; + color:#595959; +} + +.x-date-inner td { + border-color:#fff; +} + +.x-date-inner a { + font:normal 11px arial, helvetica,tahoma,sans-serif; + color:#000; +} + +.x-date-inner .x-date-active{ + color:#000; +} + +.x-date-inner .x-date-selected a{ + background-image: none; + background-color:#D8D8D8; + border-color:#DCDCDC; +} + +.x-date-inner .x-date-today a{ + border-color:darkred; +} + +.x-date-inner .x-date-selected span{ + font-weight:bold; +} + +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + color:#aaa; +} + +.x-date-bottom { + border-top-color:#AFAFAF; + background-color:#D8D8D8; + background:#D8D8D8 url(../images/gray/panel/white-top-bottom.gif) 0 -2px; +} + +.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ + color:#000; + background-color:#D8D8D8; +} + +.x-date-inner .x-date-disabled a { + background-color:#eee; + color:#bbb; +} + +.x-date-mmenu{ + background-color:#eee !important; +} + +.x-date-mmenu .x-menu-item { + font-size:10px; + color:#000; +} + +.x-date-mp { + background-color:#fff; +} + +.x-date-mp td { + font:normal 11px arial, helvetica,tahoma,sans-serif; +} + +.x-date-mp-btns button { + background-color:#4E565F; + color:#fff; + border-color:#C0C0C0 #434343 #434343 #C0C0C0; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} + +.x-date-mp-btns { + background-color:#D8D8D8; + background:#D8D8D8 url(../images/gray/panel/white-top-bottom.gif) 0 -2px; +} + +.x-date-mp-btns td { + border-top-color:#AFAFAF; +} + +td.x-date-mp-month a,td.x-date-mp-year a { + color: #333; +} + +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { + color:#333; + background-color:#FDFDFD; +} + +td.x-date-mp-sel a { + background-color:#D8D8D8; + background:#D8D8D8 url(../images/gray/panel/white-top-bottom.gif) 0 -2px; + border-color:#DCDCDC; +} + +.x-date-mp-ybtn a { + background-image:url(../images/gray/panel/tool-sprites.gif); +} + +td.x-date-mp-sep { + border-right-color:#D7D7D7; +}.x-tip .x-tip-close{ + background-image: url(../images/gray/qtip/close.gif); +} + +.x-tip .x-tip-tc, .x-tip .x-tip-tl, .x-tip .x-tip-tr, .x-tip .x-tip-bc, .x-tip .x-tip-bl, .x-tip .x-tip-br, .x-tip .x-tip-ml, .x-tip .x-tip-mr { + background-image: url(../images/gray/qtip/tip-sprite.gif); +} + +.x-tip .x-tip-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; +} +.x-tip .x-tip-ml { + background-color: #fff; +} + +.x-tip .x-tip-header-text { + font: bold 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} + +.x-tip .x-tip-body { + font: normal 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} + +.x-form-invalid-tip .x-tip-tc, .x-form-invalid-tip .x-tip-tl, .x-form-invalid-tip .x-tip-tr, .x-form-invalid-tip .x-tip-bc, +.x-form-invalid-tip .x-tip-bl, .x-form-invalid-tip .x-tip-br, .x-form-invalid-tip .x-tip-ml, .x-form-invalid-tip .x-tip-mr +{ + background-image: url(../images/default/form/error-tip-corners.gif); +} + +.x-form-invalid-tip .x-tip-body { + background-image:url(../images/default/form/exclamation.gif); +} + +.x-tip-anchor { + background-image:url(../images/gray/qtip/tip-anchor-sprite.gif); +}.x-menu { + background-color:#f0f0f0; + background-image:url(../images/default/menu/menu.gif); +} + +.x-menu-floating{ + border-color:#7D7D7D; +} + +.x-menu-nosep { + background-image:none; +} + +.x-menu-list-item{ + font:normal 11px arial,tahoma,sans-serif; +} + +.x-menu-item-arrow{ + background-image:url(../images/gray/menu/menu-parent.gif); +} + +.x-menu-sep { + background-color:#e0e0e0; + border-bottom-color:#fff; +} + +a.x-menu-item { + color:#222; +} + +.x-menu-item-active { + background-image: url(../images/gray/menu/item-over.gif); + background-color: #f1f1f1; + border-color:#ACACAC; +} + +.x-menu-item-active a.x-menu-item { + border-color:#ACACAC; +} + +.x-menu-check-item .x-menu-item-icon{ + background-image:url(../images/default/menu/unchecked.gif); +} + +.x-menu-item-checked .x-menu-item-icon{ + background-image:url(../images/default/menu/checked.gif); +} + +.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{ + background-image:url(../images/gray/menu/group-checked.gif); +} + +.x-menu-group-item .x-menu-item-icon{ + background-image:none; +} + +.x-menu-plain { + background-color:#fff !important; +} + +.x-menu .x-date-picker{ + border-color:#AFAFAF; +} + +.x-cycle-menu .x-menu-item-checked { + border-color:#B9B9B9 !important; + background-color:#F1F1F1; +} + +.x-menu-scroller-top { + background-image:url(../images/default/layout/mini-top.gif); +} + +.x-menu-scroller-bottom { + background-image:url(../images/default/layout/mini-bottom.gif); +}.x-box-tl { + background-image: url(../images/default/box/corners.gif); +} + +.x-box-tc { + background-image: url(../images/default/box/tb.gif); +} + +.x-box-tr { + background-image: url(../images/default/box/corners.gif); +} + +.x-box-ml { + background-image: url(../images/default/box/l.gif); +} + +.x-box-mc { + background-color: #eee; + background-image: url(../images/default/box/tb.gif); + font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; + color: #393939; + font-size: 12px; +} + +.x-box-mc h3 { + font-size: 14px; + font-weight: bold; +} + +.x-box-mr { + background-image: url(../images/default/box/r.gif); +} + +.x-box-bl { + background-image: url(../images/default/box/corners.gif); +} + +.x-box-bc { + background-image: url(../images/default/box/tb.gif); +} + +.x-box-br { + background-image: url(../images/default/box/corners.gif); +} + +.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { + background-image: url(../images/default/box/corners-blue.gif); +} + +.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { + background-image: url(../images/default/box/tb-blue.gif); +} + +.x-box-blue .x-box-mc { + background-color: #c3daf9; +} + +.x-box-blue .x-box-mc h3 { + color: #17385b; +} + +.x-box-blue .x-box-ml { + background-image: url(../images/default/box/l-blue.gif); +} + +.x-box-blue .x-box-mr { + background-image: url(../images/default/box/r-blue.gif); +} +.x-combo-list { + border-color:#ccc; + background-color:#ddd; + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-combo-list-inner { + background-color:#fff; +} + +.x-combo-list-hd { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#333; + background-image: url(../images/default/layout/panel-title-light-bg.gif); + border-bottom-color:#BCBCBC; +} + +.x-resizable-pinned .x-combo-list-inner { + border-bottom-color:#BEBEBE; +} + +.x-combo-list-item { + border-color:#fff; +} + +.x-combo-list .x-combo-selected{ + border-color:#777 !important; + background-color:#f0f0f0; +} + +.x-combo-list .x-toolbar { + border-top-color:#BCBCBC; +} + +.x-combo-list-small { + font:normal 11px tahoma, arial, helvetica, sans-serif; +}.x-panel { + border-color: #d0d0d0; +} + +.x-panel-header { + color:#333; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; + border-color:#d0d0d0; + background-image: url(../images/gray/panel/white-top-bottom.gif); +} + +.x-panel-body { + border-color:#d0d0d0; + background-color:#fff; +} + +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border-color:#d0d0d0; +} + +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top-color:#d0d0d0; +} + +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top-color:#d0d0d0; +} + +.x-panel-tl .x-panel-header { + color:#333; + font:bold 11px tahoma,arial,verdana,sans-serif; +} + +.x-panel-tc { + background-image: url(../images/gray/panel/top-bottom.gif); +} + +.x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br{ + background-image: url(../images/gray/panel/corners-sprite.gif); + border-bottom-color:#d0d0d0; +} + +.x-panel-bc { + background-image: url(../images/gray/panel/top-bottom.gif); +} + +.x-panel-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#f1f1f1; +} + +.x-panel-ml { + background-color: #fff; + background-image:url(../images/gray/panel/left-right.gif); +} + +.x-panel-mr { + background-image: url(../images/gray/panel/left-right.gif); +} + +.x-tool { + background-image:url(../images/gray/panel/tool-sprites.gif); +} + +.x-panel-ghost { + background-color:#f2f2f2; +} + +.x-panel-ghost ul { + border-color:#d0d0d0; +} + +.x-panel-dd-spacer { + border-color:#d0d0d0; +} + +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + font:normal 11px arial,tahoma, helvetica, sans-serif; +} +.x-window-proxy { + background-color:#fcfcfc; + border-color:#d0d0d0; +} + +.x-window-tl .x-window-header { + color:#555; + font:bold 11px tahoma,arial,verdana,sans-serif; +} + +.x-window-tc { + background-image: url(../images/gray/window/top-bottom.png); +} + +.x-window-tl { + background-image: url(../images/gray/window/left-corners.png); +} + +.x-window-tr { + background-image: url(../images/gray/window/right-corners.png); +} + +.x-window-bc { + background-image: url(../images/gray/window/top-bottom.png); +} + +.x-window-bl { + background-image: url(../images/gray/window/left-corners.png); +} + +.x-window-br { + background-image: url(../images/gray/window/right-corners.png); +} + +.x-window-mc { + border-color:#d0d0d0; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#e8e8e8; +} + +.x-window-ml { + background-image: url(../images/gray/window/left-right.png); +} + +.x-window-mr { + background-image: url(../images/gray/window/left-right.png); +} + +.x-window-maximized .x-window-tc { + background-color:#fff; +} + +.x-window-bbar .x-toolbar { + border-top-color:#d0d0d0; +} + +.x-panel-ghost .x-window-tl { + border-bottom-color:#d0d0d0; +} + +.x-panel-collapsed .x-window-tl { + border-bottom-color:#d0d0d0; +} + +.x-dlg-mask{ + background-color:#ccc; +} + +.x-window-plain .x-window-mc { + background-color: #E8E8E8; + border-color: #D0D0D0 #EEEEEE #EEEEEE #D0D0D0; +} + +.x-window-plain .x-window-body { + border-color: #EEEEEE #D0D0D0 #D0D0D0 #EEEEEE; +} + +body.x-body-masked .x-window-plain .x-window-mc { + background-color: #E4E4E4; +} +.x-html-editor-wrap { + border-color:#BCBCBC; + background-color:#fff; +} +.x-html-editor-tb .x-btn-text { + background-image:url(../images/default/editor/tb-sprite.gif); +} +.x-panel-noborder .x-panel-header-noborder { + border-bottom-color:#d0d0d0; +} + +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-bottom-color:#d0d0d0; +} + +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-top-color:#d0d0d0; +} + +.x-tab-panel-bbar-noborder .x-toolbar { + border-top-color:#d0d0d0; +} + +.x-tab-panel-tbar-noborder .x-toolbar { + border-bottom-color:#d0d0d0; +} + +.x-border-layout-ct { + background-color:#f0f0f0; +} +.x-border-layout-ct { + background-color:#f0f0f0; +} + +.x-accordion-hd { + color:#222; + font-weight:normal; + background-image: url(../images/gray/panel/light-hd.gif); +} + +.x-layout-collapsed{ + background-color:#dfdfdf; + border-color:#d0d0d0; +} + +.x-layout-collapsed-over{ + background-color:#e7e7e7; +} + +.x-layout-split-west .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-split-east .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-split-north .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-layout-split-south .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} + +.x-layout-cmini-west .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} + +.x-layout-cmini-east .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} + +.x-layout-cmini-north .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} + +.x-layout-cmini-south .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-progress-wrap { + border-color:#8E8E8E; +} + +.x-progress-inner { + background-color:#E7E7E7; + background-image:url(../images/gray/qtip/bg.gif); +} + +.x-progress-bar { + background-color:#BCBCBC; + background-image:url(../images/gray/progress/progress-bg.gif); + border-top-color:#E2E2E2; + border-bottom-color:#A4A4A4; + border-right-color:#A4A4A4; +} + +.x-progress-text { + font-size:11px; + font-weight:bold; + color:#fff; +} + +.x-progress-text-back { + color:#5F5F5F; +} +.x-list-header{ + background-color:#f9f9f9; + background-image:url(../images/gray/grid/grid3-hrow2.gif); +} + +.x-list-header-inner div em { + border-left-color:#ddd; + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-list-body dt em { + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-list-over { + background-color:#eee; +} + +.x-list-selected { + background-color:#f0f0f0; +} + +.x-list-resizer { + border-left-color:#555; + border-right-color:#555; +} + +.x-list-header-inner em.sort-asc, .x-list-header-inner em.sort-desc { + background-image:url(../images/gray/grid/sort-hd.gif); + border-color: #d0d0d0; +} +.x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner { + background-image:url(../images/default/slider/slider-bg.png); +} + +.x-slider-horz .x-slider-thumb { + background-image:url(../images/gray/slider/slider-thumb.png); +} + +.x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner { + background-image:url(../images/default/slider/slider-v-bg.png); +} + +.x-slider-vert .x-slider-thumb { + background-image:url(../images/gray/slider/slider-v-thumb.png); +} +.x-window-dlg .ext-mb-text, +.x-window-dlg .x-window-header-text { + font-size:12px; +} + +.x-window-dlg .ext-mb-textarea { + font:normal 12px tahoma,arial,helvetica,sans-serif; +} + +.x-window-dlg .x-msg-box-wait { + background-image:url(../images/default/grid/loading.gif); +} + +.x-window-dlg .ext-mb-info { + background-image:url(../images/gray/window/icon-info.gif); +} + +.x-window-dlg .ext-mb-warning { + background-image:url(../images/gray/window/icon-warning.gif); +} + +.x-window-dlg .ext-mb-question { + background-image:url(../images/gray/window/icon-question.gif); +} + +.x-window-dlg .ext-mb-error { + background-image:url(../images/gray/window/icon-error.gif); +} diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/fonts/roboto.woff b/salt/idh/skins/http/opencanary/nasLogin/static/fonts/roboto.woff new file mode 100644 index 000000000..1440b1be6 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/fonts/roboto.woff differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/02.jpg b/salt/idh/skins/http/opencanary/nasLogin/static/img/02.jpg new file mode 100644 index 000000000..b84b76f92 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/02.jpg differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/favicon.ico b/salt/idh/skins/http/opencanary/nasLogin/static/img/favicon.ico new file mode 100644 index 000000000..cafbf0458 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/favicon.ico differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_16.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_16.png new file mode 100644 index 000000000..f2ae9dae8 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_16.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_32.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_32.png new file mode 100644 index 000000000..b7193aaa0 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_32.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_48.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_48.png new file mode 100644 index 000000000..d8f5388e5 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_48.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_64.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_64.png new file mode 100644 index 000000000..cd79763d8 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_64.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_96.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_96.png new file mode 100644 index 000000000..0fb84d4d3 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_dsm_96.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_tile.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_tile.png new file mode 100644 index 000000000..e3ed42ece Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/icon_tile.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/bt_dropdown.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/bt_dropdown.png new file mode 100644 index 000000000..8b3b0efe7 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/bt_dropdown.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/bt_grid_dropdown.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/bt_grid_dropdown.png new file mode 100644 index 000000000..3d33c8698 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/bt_grid_dropdown.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/bt_pagebar.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/bt_pagebar.png new file mode 100644 index 000000000..b86eccb2f Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/bt_pagebar.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/c_icon_general.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/c_icon_general.png new file mode 100644 index 000000000..ff5e6bb19 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/c_icon_general.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/category_expand.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/category_expand.png new file mode 100644 index 000000000..54bc5dc74 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/category_expand.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/checkbox.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/checkbox.png new file mode 100644 index 000000000..d33494c73 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/checkbox.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/col-move-bottom.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/col-move-bottom.png new file mode 100644 index 000000000..730c355e8 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/col-move-bottom.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/date_dropdown.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/date_dropdown.png new file mode 100644 index 000000000..e8ba17a37 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/date_dropdown.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/date_prev_next.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/date_prev_next.png new file mode 100644 index 000000000..8d0805e86 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/date_prev_next.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/dropdown_menu_parent.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/dropdown_menu_parent.png new file mode 100644 index 000000000..034893ac7 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/dropdown_menu_parent.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/dropdown_menu_tick.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/dropdown_menu_tick.png new file mode 100644 index 000000000..f7818d510 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/dropdown_menu_tick.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/fieldset_expand.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/fieldset_expand.png new file mode 100644 index 000000000..ac42a1736 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/fieldset_expand.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_advanced_search.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_advanced_search.png new file mode 100644 index 000000000..6a2e5c69e Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_advanced_search.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_error.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_error.png new file mode 100644 index 000000000..fe6e9e18a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_error.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_filter.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_filter.png new file mode 100644 index 000000000..dea078087 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_filter.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_information.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_information.png new file mode 100644 index 000000000..ba07815aa Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_information.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_loading.gif b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_loading.gif new file mode 100644 index 000000000..1c073f400 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_loading.gif differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_search.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_search.png new file mode 100644 index 000000000..d5e69e50a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_search.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_search_clear.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_search_clear.png new file mode 100644 index 000000000..b3a7b7486 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_search_clear.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_success.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_success.png new file mode 100644 index 000000000..998025eb2 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/icon_success.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/radio_button.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/radio_button.png new file mode 100644 index 000000000..94ee76f3a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/radio_button.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/shadow_category.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/shadow_category.png new file mode 100644 index 000000000..7d3c08b20 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/shadow_category.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/shadow_footbar.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/shadow_footbar.png new file mode 100644 index 000000000..3f7831369 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/shadow_footbar.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/superbox_button_cancel.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/superbox_button_cancel.png new file mode 100644 index 000000000..9d89ffa35 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/superbox_button_cancel.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/tab_arrow.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/tab_arrow.png new file mode 100644 index 000000000..546739246 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/tab_arrow.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/tab_shadow.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/tab_shadow.png new file mode 100644 index 000000000..32e3fa57c Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/tab_shadow.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/tree_arrow.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/tree_arrow.png new file mode 100644 index 000000000..3ca5234fb Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/tree_arrow.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/trigger.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/trigger.png new file mode 100644 index 000000000..89cc0e4c8 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/trigger.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/trigger_date.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/trigger_date.png new file mode 100644 index 000000000..f96efaa7f Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/Components/trigger_date.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/ExternalDevices/images/tray_icon_device.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/ExternalDevices/images/tray_icon_device.png new file mode 100644 index 000000000..e9a566619 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/ExternalDevices/images/tray_icon_device.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.gif b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.gif new file mode 100644 index 000000000..d0d9218ff Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.gif differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.png new file mode 100644 index 000000000..2db01970b Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_bgtask.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.gif b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.gif new file mode 100644 index 000000000..de877b8eb Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.gif differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.png new file mode 100644 index 000000000..9d7951dbf Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_download.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.gif b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.gif new file mode 100644 index 000000000..cda7be6f0 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.gif differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.png new file mode 100644 index 000000000..7f9d2781d Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/FileTaskMonitor/images/tray_icon_upload.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/PollingTask/images/tray_icon_disk_port.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/PollingTask/images/tray_icon_disk_port.png new file mode 100644 index 000000000..b66b079d4 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/PollingTask/images/tray_icon_disk_port.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.gif b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.gif new file mode 100644 index 000000000..72717ba26 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.gif differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.png new file mode 100644 index 000000000..0050b8054 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/modules/ThumbConvertProgress/images/tray_icon_creating_thumbnail.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/bt_bugs.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/bt_bugs.png new file mode 100644 index 000000000..c1f28e6b6 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/bt_bugs.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/bt_dsm_mobile.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/bt_dsm_mobile.png new file mode 100644 index 000000000..befd6ecb4 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/bt_dsm_mobile.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/icon_error.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/icon_error.png new file mode 100644 index 000000000..e33d02828 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/icon_error.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/icon_image_selector.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/icon_image_selector.png new file mode 100644 index 000000000..4ae2f3a71 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/icon_image_selector.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/status_fail.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/status_fail.png new file mode 100644 index 000000000..faaa183a8 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/status_fail.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/status_loading.gif b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/status_loading.gif new file mode 100644 index 000000000..824fde78c Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/status_loading.gif differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/status_success.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/status_success.png new file mode 100644 index 000000000..388c5275e Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/components/status_success.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/add_one.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/add_one.png new file mode 100644 index 000000000..ca1d78cb3 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/add_one.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/icon_app_category.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/icon_app_category.png new file mode 100644 index 000000000..0e613466b Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/icon_app_category.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/spotlight.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/spotlight.png new file mode 100644 index 000000000..ec846e9d1 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/spotlight.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/taskbar_spinner.gif b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/taskbar_spinner.gif new file mode 100644 index 000000000..c28099211 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/desktop/taskbar_spinner.gif differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsm5_badge_num.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsm5_badge_num.png new file mode 100644 index 000000000..b90aa0345 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsm5_badge_num.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsm5_notification_num.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsm5_notification_num.png new file mode 100644 index 000000000..daa7909be Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsm5_notification_num.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsmv5_wizard_bkg_v_01.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsmv5_wizard_bkg_v_01.png new file mode 100644 index 000000000..74fce0530 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsmv5_wizard_bkg_v_01.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsmv5_wizard_bkg_v_02.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsmv5_wizard_bkg_v_02.png new file mode 100644 index 000000000..acfc1b352 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/dsmv5_wizard_bkg_v_02.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/folder.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/folder.png new file mode 100644 index 000000000..5545cbb85 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/folder.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/icon_drag_add.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/icon_drag_add.png new file mode 100644 index 000000000..9fc453da0 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/icon_drag_add.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/icon_drag_ban.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/icon_drag_ban.png new file mode 100644 index 000000000..db8d20c63 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/icon_drag_ban.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/icon_question.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/icon_question.png new file mode 100644 index 000000000..6c0cace9a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/icon_question.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/item_drag_status.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/item_drag_status.png new file mode 100644 index 000000000..0e3e45abd Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/item_drag_status.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/0.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/0.png new file mode 100644 index 000000000..13983c458 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/0.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/1.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/1.png new file mode 100644 index 000000000..7b425ef11 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/1.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/2.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/2.png new file mode 100644 index 000000000..895e68ba5 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/2.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/3.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/3.png new file mode 100644 index 000000000..c81985ab1 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/3.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/4.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/4.png new file mode 100644 index 000000000..5b155a1e9 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/4.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/5dot.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/5dot.png new file mode 100644 index 000000000..a7c8c7c34 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/5dot.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/DSM.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/DSM.png new file mode 100644 index 000000000..60c92f2dc Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/DSM.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/beta.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/beta.png new file mode 100644 index 000000000..84aab8f89 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/beta.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/copyright_2014.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/copyright_2014.png new file mode 100644 index 000000000..6c151700e Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/copyright_2014.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/copyright_2015.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/copyright_2015.png new file mode 100644 index 000000000..0a12707e4 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/copyright_2015.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/synology.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/synology.png new file mode 100644 index 000000000..704aeb1be Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/dark/synology.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/icon_phone.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/icon_phone.png new file mode 100644 index 000000000..05009714a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/icon_phone.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/icon_pw.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/icon_pw.png new file mode 100644 index 000000000..acb35fd3f Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/icon_pw.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/icon_user.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/icon_user.png new file mode 100644 index 000000000..70a4f7091 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/icon_user.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/0.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/0.png new file mode 100644 index 000000000..cc04df60a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/0.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/1.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/1.png new file mode 100644 index 000000000..b600e46d1 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/1.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/2.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/2.png new file mode 100644 index 000000000..e20d1bbec Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/2.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/3.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/3.png new file mode 100644 index 000000000..25e8a7407 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/3.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/4.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/4.png new file mode 100644 index 000000000..485c56560 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/4.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/5dot.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/5dot.png new file mode 100644 index 000000000..5e1af80e8 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/5dot.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/DSM.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/DSM.png new file mode 100644 index 000000000..4834292b5 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/DSM.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/beta.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/beta.png new file mode 100644 index 000000000..52c96e4fb Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/beta.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/copyright_2014.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/copyright_2014.png new file mode 100644 index 000000000..6c151700e Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/copyright_2014.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/copyright_2015.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/copyright_2015.png new file mode 100644 index 000000000..0a12707e4 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/copyright_2015.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/synology.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/synology.png new file mode 100644 index 000000000..61da232c4 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/light/synology.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_bottom.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_bottom.png new file mode 100644 index 000000000..dc1e35bf8 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_bottom.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_top.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_top.png new file mode 100644 index 000000000..2076eec05 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/login_bkg_highlight_top.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cloudy.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cloudy.png new file mode 100644 index 000000000..a55e57e7c Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cloudy.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cold.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cold.png new file mode 100644 index 000000000..27a7d8b1d Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_cold.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_fog.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_fog.png new file mode 100644 index 000000000..171f6e374 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_fog.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_hail.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_hail.png new file mode 100644 index 000000000..4ab0372f9 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_hail.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon.png new file mode 100644 index 000000000..fce03fd79 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon_clouds.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon_clouds.png new file mode 100644 index 000000000..c7999b257 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_moon_clouds.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_rain.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_rain.png new file mode 100644 index 000000000..e2efcfa32 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_rain.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_snow.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_snow.png new file mode 100644 index 000000000..3587ab8c2 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_snow.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun.png new file mode 100644 index 000000000..e3a53804c Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun_clouds.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun_clouds.png new file mode 100644 index 000000000..1ec55095e Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_sun_clouds.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_thunder.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_thunder.png new file mode 100644 index 000000000..1048e4548 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_thunder.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_tornado.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_tornado.png new file mode 100644 index 000000000..7991621fd Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_tornado.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_windy.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_windy.png new file mode 100644 index 000000000..ca93ce5f3 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/login/weather/login_icon_weather_windy.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_CMS.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_CMS.png new file mode 100644 index 000000000..3903649fd Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_CMS.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_backup.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_backup.png new file mode 100644 index 000000000..5ca546c49 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_backup.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_business.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_business.png new file mode 100644 index 000000000..e2eaede30 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_business.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_community.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_community.png new file mode 100644 index 000000000..75249b172 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_community.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_connect.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_connect.png new file mode 100644 index 000000000..4985683cf Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_connect.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_contact.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_contact.png new file mode 100644 index 000000000..63df0c657 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_contact.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_directory_service.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_directory_service.png new file mode 100644 index 000000000..7c841025a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_directory_service.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_dsm_apps.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_dsm_apps.png new file mode 100644 index 000000000..434ac2671 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_dsm_apps.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_expansion.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_expansion.png new file mode 100644 index 000000000..c13cd5297 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_expansion.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_external_devices.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_external_devices.png new file mode 100644 index 000000000..68e06d6ba Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_external_devices.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_file_services.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_file_services.png new file mode 100644 index 000000000..e59fecdd6 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_file_services.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_general.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_general.png new file mode 100644 index 000000000..ff5e6bb19 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_general.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_groups.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_groups.png new file mode 100644 index 000000000..db5cc8092 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_groups.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hardware_and_power.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hardware_and_power.png new file mode 100644 index 000000000..cbf3c75f1 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hardware_and_power.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hdd_management.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hdd_management.png new file mode 100644 index 000000000..1413da3b5 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hdd_management.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hot_spare.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hot_spare.png new file mode 100644 index 000000000..6e157d45e Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_hot_spare.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_info_center.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_info_center.png new file mode 100644 index 000000000..2138638c5 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_info_center.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_installed.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_installed.png new file mode 100644 index 000000000..76ef52532 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_installed.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_iscsi_lun.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_iscsi_lun.png new file mode 100644 index 000000000..8698a8336 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_iscsi_lun.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_iscsi_target.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_iscsi_target.png new file mode 100644 index 000000000..96c6a5c7c Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_iscsi_target.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_login_style.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_login_style.png new file mode 100644 index 000000000..a1ca3685e Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_login_style.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_media_library.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_media_library.png new file mode 100644 index 000000000..7e1477f60 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_media_library.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_network.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_network.png new file mode 100644 index 000000000..4914a1a4b Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_network.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_networkmap.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_networkmap.png new file mode 100644 index 000000000..85b699cce Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_networkmap.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_notifications.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_notifications.png new file mode 100644 index 000000000..c950dbde7 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_notifications.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_overview.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_overview.png new file mode 100644 index 000000000..d5c822fbd Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_overview.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_performance.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_performance.png new file mode 100644 index 000000000..68ceedf07 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_performance.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_portal.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_portal.png new file mode 100644 index 000000000..1a717dc6b Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_portal.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_privilege.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_privilege.png new file mode 100644 index 000000000..e2fc6c2a8 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_privilege.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_process.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_process.png new file mode 100644 index 000000000..fd1d6061a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_process.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_public_access.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_public_access.png new file mode 100644 index 000000000..4933fe14c Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_public_access.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_purchases.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_purchases.png new file mode 100644 index 000000000..ba6c8e2a1 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_purchases.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_quickconnect.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_quickconnect.png new file mode 100644 index 000000000..c3045a6a6 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_quickconnect.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_raid_group.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_raid_group.png new file mode 100644 index 000000000..e0ab69a9f Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_raid_group.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_recommend.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_recommend.png new file mode 100644 index 000000000..37a41fda2 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_recommend.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_region.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_region.png new file mode 100644 index 000000000..a41231806 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_region.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_security.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_security.png new file mode 100644 index 000000000..027d9811c Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_security.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_shared_folders.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_shared_folders.png new file mode 100644 index 000000000..84d068766 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_shared_folders.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_speed.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_speed.png new file mode 100644 index 000000000..4d3a18c01 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_speed.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_ssd_cache.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_ssd_cache.png new file mode 100644 index 000000000..acd9539c3 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_ssd_cache.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_syslog.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_syslog.png new file mode 100644 index 000000000..612513cff Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_syslog.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_task_scheduler.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_task_scheduler.png new file mode 100644 index 000000000..291c4c71f Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_task_scheduler.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_terminal_and_SNMP.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_terminal_and_SNMP.png new file mode 100644 index 000000000..82b688da0 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_terminal_and_SNMP.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_update_and_reset.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_update_and_reset.png new file mode 100644 index 000000000..33e9b7091 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_update_and_reset.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_users.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_users.png new file mode 100644 index 000000000..5b26404dc Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_users.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_utilities.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_utilities.png new file mode 100644 index 000000000..579bba939 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_utilities.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_volume.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_volume.png new file mode 100644 index 000000000..fad9aa6d0 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_volume.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_web_server.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_web_server.png new file mode 100644 index 000000000..101e5e7b3 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_web_server.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_wireless.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_wireless.png new file mode 100644 index 000000000..7ae063c77 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/module_list_icon/c_icon_wireless.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/rt_button.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/rt_button.png new file mode 100644 index 000000000..3d4f4d68a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/rt_button.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/shadow_footbar.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/shadow_footbar.png new file mode 100644 index 000000000..3f7831369 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/shadow_footbar.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/more_apps.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/more_apps.png new file mode 100644 index 000000000..e533d7c2d Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/more_apps.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/showdesktop.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/showdesktop.png new file mode 100644 index 000000000..7838c6bed Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/showdesktop.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bg.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bg.png new file mode 100644 index 000000000..8d02f577f Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bg.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bt.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bt.png new file mode 100644 index 000000000..8639e527b Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bt.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bt_apps.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bt_apps.png new file mode 100644 index 000000000..7be67834d Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bt_apps.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bt_widgets_shadow.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bt_widgets_shadow.png new file mode 100644 index 000000000..f17628080 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_bt_widgets_shadow.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_shadow.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_shadow.png new file mode 100644 index 000000000..a333532af Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_shadow.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_split.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_split.png new file mode 100644 index 000000000..b731ff8f5 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/taskbar_split.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_notification.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_notification.png new file mode 100644 index 000000000..9db54ed49 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_notification.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_pilot_view.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_pilot_view.png new file mode 100644 index 000000000..5c1672c80 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_pilot_view.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_search.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_search.png new file mode 100644 index 000000000..665d12961 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_search.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_user_menu.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_user_menu.png new file mode 100644 index 000000000..6d7c3f7f3 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_user_menu.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_widget.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_widget.png new file mode 100644 index 000000000..00fcee5bf Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/tray_icon_widget.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_about.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_about.png new file mode 100644 index 000000000..905febfed Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_about.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_logout.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_logout.png new file mode 100644 index 000000000..e848c372a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_logout.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_options.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_options.png new file mode 100644 index 000000000..b979d9e28 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_options.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_restart.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_restart.png new file mode 100644 index 000000000..8a0d37d58 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_restart.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_shutdown.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_shutdown.png new file mode 100644 index 000000000..419280030 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/taskbar/user_menu_shutdown.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/widget_window/widget_rt_button.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/widget_window/widget_rt_button.png new file mode 100644 index 000000000..828bd5e2a Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/widget_window/widget_rt_button.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/wizard_bkg_h.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/wizard_bkg_h.png new file mode 100644 index 000000000..b1d95bc84 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/dsm/resources/images/wizard_bkg_h.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_black_h.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_black_h.png new file mode 100644 index 000000000..33ccb4751 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_black_h.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_black_v.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_black_v.png new file mode 100644 index 000000000..152de2531 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_black_v.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_white_h.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_white_h.png new file mode 100644 index 000000000..f3680b1eb Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_white_h.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_white_v.png b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_white_v.png new file mode 100644 index 000000000..4991e7d54 Binary files /dev/null and b/salt/idh/skins/http/opencanary/nasLogin/static/img/synohdpack/images/scrollbar/scrollbar_white_v.png differ diff --git a/salt/idh/skins/http/opencanary/nasLogin/static/js/misc.js b/salt/idh/skins/http/opencanary/nasLogin/static/js/misc.js new file mode 100644 index 000000000..d602a0e4c --- /dev/null +++ b/salt/idh/skins/http/opencanary/nasLogin/static/js/misc.js @@ -0,0 +1,53 @@ +"use strict"; + +var montharray = new Array(); +montharray[0] = "Jan"; +montharray[1] = "Feb"; +montharray[2] = "Mar"; +montharray[3] = "Apr"; +montharray[4] = "May"; +montharray[5] = "Jun"; +montharray[6] = "Jul"; +montharray[7] = "Aug"; +montharray[8] = "Sep"; +montharray[9] = "Oct"; +montharray[10] = "Nov"; +montharray[11] = "Dec"; + +var dayarray = new Array(); +dayarray[0] = "Sun"; +dayarray[1] = "Mon"; +dayarray[2] = "Tue"; +dayarray[3] = "Wed"; +dayarray[4] = "Thu"; +dayarray[5] = "Fri"; +dayarray[6] = "Sat"; + + +function updateTime() { +var d = new Date(); +var h = d.getHours(); +var m = d.getMinutes(); +m = new String(m); +if (m.length == 1) + m = "0" + m; + +var pms = "AM"; +if (h > 12) +{ +pms = "PM" +h = h % 12; +} + +document.getElementById('ext-comp-1007').innerHTML = h + ":" + m + '' + pms + ''; + +var month = montharray[d.getMonth()]; +var wkday = dayarray[d.getDay()]; +var day = d.getDate(); + +document.getElementById('ext-comp-1008').innerHTML = wkday + ", " + month + " " + day; + +} + +updateTime(); +window.setInterval(updateTime, 2000); diff --git a/salt/idh/soc_idh.yaml b/salt/idh/soc_idh.yaml index d3baaaab5..0d8ccb393 100644 --- a/salt/idh/soc_idh.yaml +++ b/salt/idh/soc_idh.yaml @@ -1,6 +1,6 @@ idh: enabled: - description: You can enable or disable IDH. + description: Enables or disables the Intrusion Detection Honeypot (IDH) process. helpLink: idh.html opencanary: config: diff --git a/salt/idstools/soc_idstools.yaml b/salt/idstools/soc_idstools.yaml index 993abfd51..4f7a53e91 100644 --- a/salt/idstools/soc_idstools.yaml +++ b/salt/idstools/soc_idstools.yaml @@ -1,6 +1,6 @@ idstools: enabled: - description: You can enable or disable IDSTools. + description: Enables or disables the IDStools process which is used by the Detection system. config: oinkcode: description: Enter your registration code or oinkcode for paid NIDS rulesets. diff --git a/salt/influxdb/soc_influxdb.yaml b/salt/influxdb/soc_influxdb.yaml index 42566a0a8..846152cf3 100644 --- a/salt/influxdb/soc_influxdb.yaml +++ b/salt/influxdb/soc_influxdb.yaml @@ -1,6 +1,6 @@ influxdb: enabled: - description: You can enable or disable InfluxDB. + description: Enables the grid metrics collection storage system. Security Onion grid health monitoring requires this process to remain enabled. WARNING - Disabling the process is unsupported, and will cause unexpected results. helpLink: influxdb.html config: assets-path: diff --git a/salt/kibana/files/saved_objects.ndjson b/salt/kibana/files/saved_objects.ndjson index 01b69b081..7aabe4404 100644 --- a/salt/kibana/files/saved_objects.ndjson +++ b/salt/kibana/files/saved_objects.ndjson @@ -167,7 +167,7 @@ {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[]}"},"savedSearchRefName":"search_0","title":"OSSEC - Log Count Over Time","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"OSSEC - Log Count Over Time\",\"type\":\"line\",\"params\":{\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{\"text\":\"@timestamp per 12 hours\"}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"mode\":\"normal\",\"type\":\"line\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"linear\",\"lineWidth\":2,\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"showCircles\":true,\"interpolate\":\"linear\",\"scale\":\"linear\",\"drawLinesBetweenPoints\":true,\"radiusRatio\":9,\"times\":[],\"addTimeMarker\":false,\"defaultYExtents\":false,\"setYExtents\":false,\"legendSize\":\"auto\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1,\"extended_bounds\":{}}}],\"listeners\":{}}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"2817b300-3643-11e7-a6f7-4f44d7bf1c33","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"efba60c0-3642-11e7-a6f7-4f44d7bf1c33","name":"search_0","type":"search"}],"sort":[1689866817180,4686],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQyNDIsMV0="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Security Onion - PE - Machine","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","version":1,"visState":"{\"title\":\"Security Onion - PE - Machine\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{\"emptyAsNull\":false},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"file.machine\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":25,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"includeIsRegex\":true,\"excludeIsRegex\":true,\"customLabel\":\"Machine\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\",\"showToolbar\":true,\"autoFitRowToContent\":false}}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"282bf2c0-c763-11ea-bebb-37c5ab5894ea","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"logs-*","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1689866817180,4688],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQyNDMsMV0="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Security Onion - X.509 - Key Type (Donut)","uiStateJSON":"{}","version":1,"visState":"{\"type\":\"pie\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"x509.certificate.key.type.keyword\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":25,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"}}],\"params\":{\"type\":\"pie\",\"addTooltip\":true,\"legendPosition\":\"right\",\"isDonut\":true,\"labels\":{\"show\":false,\"values\":true,\"last_level\":true,\"truncate\":100},\"dimensions\":{\"metric\":{\"accessor\":1,\"format\":{\"id\":\"number\"},\"params\":{},\"label\":\"Count\",\"aggType\":\"count\"},\"buckets\":[{\"accessor\":0,\"format\":{\"id\":\"terms\",\"params\":{\"id\":\"boolean\",\"otherBucketLabel\":\"Other\",\"missingBucketLabel\":\"Missing\",\"parsedUrl\":{\"origin\":\"https://PLACEHOLDER\",\"pathname\":\"/kibana/app/kibana\",\"basePath\":\"/kibana\"}}},\"params\":{},\"label\":\"x509.basic_constraints.ca: Descending\",\"aggType\":\"terms\"}]},\"palette\":{\"type\":\"palette\",\"name\":\"kibana_palette\"},\"distinctColors\":true,\"legendDisplay\":\"show\",\"legendSize\":\"auto\"},\"title\":\"Security Onion - X.509 - Key Type (Donut)\"}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"2895c940-75ef-11ea-9565-7315f4ee5cac","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"logs-*","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1689866817180,4690],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQyNDQsMV0="} -{"attributes":{"columns":["_source"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"tags:http\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Security Onion - HTTP","version":1},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"9ee33aa0-6eb1-11ea-9266-1fd14ca6af34","migrationVersion":{"search":"8.0.0"},"references":[{"id":"logs-*","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1689866817180,4692],"type":"search","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQyNDUsMV0="} +{"attributes":{"columns":["_source"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"tags:http or http2\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Security Onion - HTTP","version":1},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"9ee33aa0-6eb1-11ea-9266-1fd14ca6af34","migrationVersion":{"search":"8.0.0"},"references":[{"id":"logs-*","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1689866817180,4692],"type":"search","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQyNDUsMV0="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"Security Onion - HTTP - Virtual Host","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","version":1,"visState":"{\"title\":\"Security Onion - HTTP - Virtual Host\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{\"emptyAsNull\":false},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.virtual_host\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"includeIsRegex\":true,\"excludeIsRegex\":true,\"customLabel\":\"Virtual Host\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\",\"dimensions\":{\"metrics\":[{\"accessor\":0,\"format\":{\"id\":\"number\"},\"params\":{},\"label\":\"Count\",\"aggType\":\"count\"}],\"buckets\":[]},\"showToolbar\":true,\"autoFitRowToContent\":false}}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"28bf2ef0-6eb7-11ea-9266-1fd14ca6af34","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"9ee33aa0-6eb1-11ea-9266-1fd14ca6af34","name":"search_0","type":"search"}],"sort":[1689866817180,4694],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQyNDYsMV0="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[]}"},"savedSearchRefName":"search_0","title":"Connections - Top Source IPs","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Connections - Top Source IPs\",\"type\":\"pie\",\"params\":{\"addTooltip\":true,\"legendPosition\":\"right\",\"isDonut\":false,\"palette\":{\"type\":\"palette\",\"name\":\"kibana_palette\"},\"distinctColors\":true,\"legendDisplay\":\"show\",\"legendSize\":\"auto\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"source_ip\",\"size\":5,\"order\":\"desc\",\"orderBy\":\"1\"}}],\"listeners\":{}}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"28c27f80-3b05-11e7-a83b-b1b4da7d15f4","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"9bf42190-342d-11e7-9e93-53b62e1857b2","name":"search_0","type":"search"}],"sort":[1689866817180,4696],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQyNDcsMV0="} {"attributes":{"columns":["source_ip","source_port","destination_ip","destination_port","request_type","uid","_id"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"version\":true,\"filter\":[],\"query\":{\"query_string\":{\"query\":\"event_type:bro_kerberos\",\"analyze_wildcard\":true}},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"Kerberos - Logs","version":1},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"452daa10-342e-11e7-9e93-53b62e1857b2","migrationVersion":{"search":"8.0.0"},"references":[{"id":"*:logstash-*","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"sort":[1689866817180,4698],"type":"search","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQyNDgsMV0="} @@ -263,7 +263,7 @@ {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{}"},"savedSearchRefName":"search_0","title":"Security Onion - HTTP - Destination Port","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","version":1,"visState":"{\"title\":\"Security Onion - HTTP - Destination Port\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\",\"dimensions\":{\"metrics\":[{\"accessor\":1,\"format\":{\"id\":\"number\"},\"params\":{},\"label\":\"Count\",\"aggType\":\"count\"}],\"buckets\":[{\"accessor\":0,\"format\":{\"id\":\"terms\",\"params\":{\"id\":\"number\",\"otherBucketLabel\":\"Other\",\"missingBucketLabel\":\"Missing\",\"parsedUrl\":{\"origin\":\"https://PLACEHOLDER\",\"pathname\":\"/kibana/app/kibana\",\"basePath\":\"/kibana\"}}},\"params\":{},\"label\":\"destination.port: Descending\",\"aggType\":\"terms\"}]},\"showToolbar\":true},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"destination.port\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Port\"}}]}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"51ad64d0-6eb7-11ea-9266-1fd14ca6af34","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"9ee33aa0-6eb1-11ea-9266-1fd14ca6af34","name":"search_0","type":"search"}],"sort":[1689866817180,4907],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQzMzgsMV0="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"Security Onion - HTTP - UserAgent","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","version":1,"visState":"{\"title\":\"Security Onion - HTTP - UserAgent\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{\"emptyAsNull\":false},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.useragent\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":100,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"includeIsRegex\":true,\"excludeIsRegex\":true,\"customLabel\":\"UserAgent\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\",\"dimensions\":{\"metrics\":[{\"accessor\":0,\"format\":{\"id\":\"number\"},\"params\":{},\"label\":\"Count\",\"aggType\":\"count\"}],\"buckets\":[]},\"showToolbar\":true,\"autoFitRowToContent\":false}}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"c2f93f40-6ed7-11ea-9266-1fd14ca6af34","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"9ee33aa0-6eb1-11ea-9266-1fd14ca6af34","name":"search_0","type":"search"}],"sort":[1689866817180,4909],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQzMzksMV0="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"Security Onion - HTTP - URI","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","version":1,"visState":"{\"title\":\"Security Onion - HTTP - URI\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{\"emptyAsNull\":false},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.uri\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"includeIsRegex\":true,\"excludeIsRegex\":true,\"customLabel\":\"URI\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\",\"dimensions\":{\"metrics\":[{\"accessor\":1,\"format\":{\"id\":\"number\"},\"params\":{},\"label\":\"Count\",\"aggType\":\"count\"}],\"buckets\":[{\"accessor\":0,\"format\":{\"id\":\"terms\",\"params\":{\"id\":\"string\",\"otherBucketLabel\":\"Other\",\"missingBucketLabel\":\"Missing\",\"parsedUrl\":{\"origin\":\"https://PLACEHOLDER\",\"pathname\":\"/kibana/app/kibana\",\"basePath\":\"/kibana\"}}},\"params\":{},\"label\":\"http.uri.keyword: Descending\",\"aggType\":\"terms\"}]},\"showToolbar\":true,\"autoFitRowToContent\":false}}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"f22e8660-6eb6-11ea-9266-1fd14ca6af34","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"9ee33aa0-6eb1-11ea-9266-1fd14ca6af34","name":"search_0","type":"search"}],"sort":[1689866817180,4911],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQzNDAsMV0="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"tags:http\",\"language\":\"kuery\"},\"filter\":[]}"},"optionsJSON":"{\"useMargins\":true,\"syncColors\":false,\"syncCursor\":true,\"syncTooltips\":false,\"hidePanelTitles\":false}","panelsJSON":"[{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":0,\"w\":14,\"h\":9,\"i\":\"6e3caf86-a1ea-4363-9c73-205de5f43ba9\"},\"panelIndex\":\"6e3caf86-a1ea-4363-9c73-205de5f43ba9\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_6e3caf86-a1ea-4363-9c73-205de5f43ba9\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":14,\"y\":0,\"w\":16,\"h\":9,\"i\":\"0b0546ef-637b-4a40-b87b-a454b78cc810\"},\"panelIndex\":\"0b0546ef-637b-4a40-b87b-a454b78cc810\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_0b0546ef-637b-4a40-b87b-a454b78cc810\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":30,\"y\":0,\"w\":18,\"h\":9,\"i\":\"9c49b93a-5b5d-4613-8342-c01c69970bce\"},\"panelIndex\":\"9c49b93a-5b5d-4613-8342-c01c69970bce\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_9c49b93a-5b5d-4613-8342-c01c69970bce\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":9,\"w\":8,\"h\":18,\"i\":\"15d7c88b-1619-4290-8968-fa2adfddd72f\"},\"panelIndex\":\"15d7c88b-1619-4290-8968-fa2adfddd72f\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_15d7c88b-1619-4290-8968-fa2adfddd72f\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":8,\"y\":9,\"w\":8,\"h\":18,\"i\":\"d1219968-6b7f-4040-9c75-0611b9cbf8a0\"},\"panelIndex\":\"d1219968-6b7f-4040-9c75-0611b9cbf8a0\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_d1219968-6b7f-4040-9c75-0611b9cbf8a0\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":16,\"y\":9,\"w\":9,\"h\":18,\"i\":\"377e3099-7aec-474c-9201-2f1845c58d24\"},\"panelIndex\":\"377e3099-7aec-474c-9201-2f1845c58d24\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_377e3099-7aec-474c-9201-2f1845c58d24\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":25,\"y\":9,\"w\":23,\"h\":18,\"i\":\"1b444602-2f1c-4c32-85fc-1e5f46235303\"},\"panelIndex\":\"1b444602-2f1c-4c32-85fc-1e5f46235303\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_1b444602-2f1c-4c32-85fc-1e5f46235303\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":27,\"w\":11,\"h\":18,\"i\":\"9b1df72c-b6fd-4abd-a961-32176c26cc3d\"},\"panelIndex\":\"9b1df72c-b6fd-4abd-a961-32176c26cc3d\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_9b1df72c-b6fd-4abd-a961-32176c26cc3d\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":11,\"y\":27,\"w\":10,\"h\":18,\"i\":\"52c3ab70-9b8d-4c26-953d-f1a943fdff38\"},\"panelIndex\":\"52c3ab70-9b8d-4c26-953d-f1a943fdff38\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_52c3ab70-9b8d-4c26-953d-f1a943fdff38\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":21,\"y\":27,\"w\":27,\"h\":18,\"i\":\"ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2\"},\"panelIndex\":\"ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2\"},{\"version\":\"8.7.1\",\"type\":\"search\",\"gridData\":{\"x\":0,\"y\":45,\"w\":48,\"h\":29,\"i\":\"17d41692-eb81-4c13-aaa3-2a4bccc125df\"},\"panelIndex\":\"17d41692-eb81-4c13-aaa3-2a4bccc125df\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_17d41692-eb81-4c13-aaa3-2a4bccc125df\"}]","timeRestore":false,"title":"Security Onion - HTTP","version":1},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"44e9c820-6eb1-11ea-9266-1fd14ca6af34","migrationVersion":{"dashboard":"8.7.0"},"references":[{"id":"7f822930-6ea4-11ea-9266-1fd14ca6af34","name":"6e3caf86-a1ea-4363-9c73-205de5f43ba9:panel_6e3caf86-a1ea-4363-9c73-205de5f43ba9","type":"visualization"},{"id":"d04b5130-6e99-11ea-9266-1fd14ca6af34","name":"0b0546ef-637b-4a40-b87b-a454b78cc810:panel_0b0546ef-637b-4a40-b87b-a454b78cc810","type":"visualization"},{"id":"6411e5b0-6eb2-11ea-9266-1fd14ca6af34","name":"9c49b93a-5b5d-4613-8342-c01c69970bce:panel_9c49b93a-5b5d-4613-8342-c01c69970bce","type":"visualization"},{"id":"6d0fb2b0-6eb6-11ea-9266-1fd14ca6af34","name":"15d7c88b-1619-4290-8968-fa2adfddd72f:panel_15d7c88b-1619-4290-8968-fa2adfddd72f","type":"visualization"},{"id":"30e97190-6eb6-11ea-9266-1fd14ca6af34","name":"d1219968-6b7f-4040-9c75-0611b9cbf8a0:panel_d1219968-6b7f-4040-9c75-0611b9cbf8a0","type":"visualization"},{"id":"51ad64d0-6eb7-11ea-9266-1fd14ca6af34","name":"377e3099-7aec-474c-9201-2f1845c58d24:panel_377e3099-7aec-474c-9201-2f1845c58d24","type":"visualization"},{"id":"c2f93f40-6ed7-11ea-9266-1fd14ca6af34","name":"1b444602-2f1c-4c32-85fc-1e5f46235303:panel_1b444602-2f1c-4c32-85fc-1e5f46235303","type":"visualization"},{"id":"088aad70-7377-11ea-a3da-cbdb4f8a90c0","name":"9b1df72c-b6fd-4abd-a961-32176c26cc3d:panel_9b1df72c-b6fd-4abd-a961-32176c26cc3d","type":"visualization"},{"id":"28bf2ef0-6eb7-11ea-9266-1fd14ca6af34","name":"52c3ab70-9b8d-4c26-953d-f1a943fdff38:panel_52c3ab70-9b8d-4c26-953d-f1a943fdff38","type":"visualization"},{"id":"f22e8660-6eb6-11ea-9266-1fd14ca6af34","name":"ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2:panel_ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2","type":"visualization"},{"id":"8b6f3150-72a2-11ea-8dd2-9d8795a1200b","name":"17d41692-eb81-4c13-aaa3-2a4bccc125df:panel_17d41692-eb81-4c13-aaa3-2a4bccc125df","type":"search"}],"sort":[1689866817180,4923],"type":"dashboard","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQzNDEsMV0="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"tags:http or http2\",\"language\":\"kuery\"},\"filter\":[]}"},"optionsJSON":"{\"useMargins\":true,\"syncColors\":false,\"syncCursor\":true,\"syncTooltips\":false,\"hidePanelTitles\":false}","panelsJSON":"[{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":0,\"w\":14,\"h\":9,\"i\":\"6e3caf86-a1ea-4363-9c73-205de5f43ba9\"},\"panelIndex\":\"6e3caf86-a1ea-4363-9c73-205de5f43ba9\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_6e3caf86-a1ea-4363-9c73-205de5f43ba9\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":14,\"y\":0,\"w\":16,\"h\":9,\"i\":\"0b0546ef-637b-4a40-b87b-a454b78cc810\"},\"panelIndex\":\"0b0546ef-637b-4a40-b87b-a454b78cc810\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_0b0546ef-637b-4a40-b87b-a454b78cc810\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":30,\"y\":0,\"w\":18,\"h\":9,\"i\":\"9c49b93a-5b5d-4613-8342-c01c69970bce\"},\"panelIndex\":\"9c49b93a-5b5d-4613-8342-c01c69970bce\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_9c49b93a-5b5d-4613-8342-c01c69970bce\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":9,\"w\":8,\"h\":18,\"i\":\"15d7c88b-1619-4290-8968-fa2adfddd72f\"},\"panelIndex\":\"15d7c88b-1619-4290-8968-fa2adfddd72f\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_15d7c88b-1619-4290-8968-fa2adfddd72f\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":8,\"y\":9,\"w\":8,\"h\":18,\"i\":\"d1219968-6b7f-4040-9c75-0611b9cbf8a0\"},\"panelIndex\":\"d1219968-6b7f-4040-9c75-0611b9cbf8a0\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_d1219968-6b7f-4040-9c75-0611b9cbf8a0\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":16,\"y\":9,\"w\":9,\"h\":18,\"i\":\"377e3099-7aec-474c-9201-2f1845c58d24\"},\"panelIndex\":\"377e3099-7aec-474c-9201-2f1845c58d24\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_377e3099-7aec-474c-9201-2f1845c58d24\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":25,\"y\":9,\"w\":23,\"h\":18,\"i\":\"1b444602-2f1c-4c32-85fc-1e5f46235303\"},\"panelIndex\":\"1b444602-2f1c-4c32-85fc-1e5f46235303\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_1b444602-2f1c-4c32-85fc-1e5f46235303\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":27,\"w\":11,\"h\":18,\"i\":\"9b1df72c-b6fd-4abd-a961-32176c26cc3d\"},\"panelIndex\":\"9b1df72c-b6fd-4abd-a961-32176c26cc3d\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_9b1df72c-b6fd-4abd-a961-32176c26cc3d\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":11,\"y\":27,\"w\":10,\"h\":18,\"i\":\"52c3ab70-9b8d-4c26-953d-f1a943fdff38\"},\"panelIndex\":\"52c3ab70-9b8d-4c26-953d-f1a943fdff38\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_52c3ab70-9b8d-4c26-953d-f1a943fdff38\"},{\"version\":\"8.7.1\",\"type\":\"visualization\",\"gridData\":{\"x\":21,\"y\":27,\"w\":27,\"h\":18,\"i\":\"ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2\"},\"panelIndex\":\"ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2\"},{\"version\":\"8.7.1\",\"type\":\"search\",\"gridData\":{\"x\":0,\"y\":45,\"w\":48,\"h\":29,\"i\":\"17d41692-eb81-4c13-aaa3-2a4bccc125df\"},\"panelIndex\":\"17d41692-eb81-4c13-aaa3-2a4bccc125df\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_17d41692-eb81-4c13-aaa3-2a4bccc125df\"}]","timeRestore":false,"title":"Security Onion - HTTP","version":1},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"44e9c820-6eb1-11ea-9266-1fd14ca6af34","migrationVersion":{"dashboard":"8.7.0"},"references":[{"id":"7f822930-6ea4-11ea-9266-1fd14ca6af34","name":"6e3caf86-a1ea-4363-9c73-205de5f43ba9:panel_6e3caf86-a1ea-4363-9c73-205de5f43ba9","type":"visualization"},{"id":"d04b5130-6e99-11ea-9266-1fd14ca6af34","name":"0b0546ef-637b-4a40-b87b-a454b78cc810:panel_0b0546ef-637b-4a40-b87b-a454b78cc810","type":"visualization"},{"id":"6411e5b0-6eb2-11ea-9266-1fd14ca6af34","name":"9c49b93a-5b5d-4613-8342-c01c69970bce:panel_9c49b93a-5b5d-4613-8342-c01c69970bce","type":"visualization"},{"id":"6d0fb2b0-6eb6-11ea-9266-1fd14ca6af34","name":"15d7c88b-1619-4290-8968-fa2adfddd72f:panel_15d7c88b-1619-4290-8968-fa2adfddd72f","type":"visualization"},{"id":"30e97190-6eb6-11ea-9266-1fd14ca6af34","name":"d1219968-6b7f-4040-9c75-0611b9cbf8a0:panel_d1219968-6b7f-4040-9c75-0611b9cbf8a0","type":"visualization"},{"id":"51ad64d0-6eb7-11ea-9266-1fd14ca6af34","name":"377e3099-7aec-474c-9201-2f1845c58d24:panel_377e3099-7aec-474c-9201-2f1845c58d24","type":"visualization"},{"id":"c2f93f40-6ed7-11ea-9266-1fd14ca6af34","name":"1b444602-2f1c-4c32-85fc-1e5f46235303:panel_1b444602-2f1c-4c32-85fc-1e5f46235303","type":"visualization"},{"id":"088aad70-7377-11ea-a3da-cbdb4f8a90c0","name":"9b1df72c-b6fd-4abd-a961-32176c26cc3d:panel_9b1df72c-b6fd-4abd-a961-32176c26cc3d","type":"visualization"},{"id":"28bf2ef0-6eb7-11ea-9266-1fd14ca6af34","name":"52c3ab70-9b8d-4c26-953d-f1a943fdff38:panel_52c3ab70-9b8d-4c26-953d-f1a943fdff38","type":"visualization"},{"id":"f22e8660-6eb6-11ea-9266-1fd14ca6af34","name":"ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2:panel_ea97cb71-fbb6-46ae-bb4a-4d01c3a6edb2","type":"visualization"},{"id":"8b6f3150-72a2-11ea-8dd2-9d8795a1200b","name":"17d41692-eb81-4c13-aaa3-2a4bccc125df:panel_17d41692-eb81-4c13-aaa3-2a4bccc125df","type":"search"}],"sort":[1689866817180,4923],"type":"dashboard","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQzNDEsMV0="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}"},"savedSearchRefName":"search_0","title":"Modbus - Function","uiStateJSON":"{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}","version":1,"visState":"{\"title\":\"Modbus - Function\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"showToolbar\":true},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"function.keyword\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":20,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Function\"}}]}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"453f8b90-4a58-11e8-9b0a-f1d33346f773","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"52dc9fe0-342e-11e7-9e93-53b62e1857b2","name":"search_0","type":"search"}],"sort":[1689866817180,4925],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQzNDIsMV0="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}"},"savedSearchRefName":"search_0","title":"NIDS Alerts - Category","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"NIDS Alerts - Category\",\"type\":\"histogram\",\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":200},\"position\":\"left\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Category\"},\"type\":\"category\"}],\"defaultYExtents\":false,\"drawLinesBetweenPoints\":true,\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"interpolate\":\"linear\",\"legendPosition\":\"right\",\"radiusRatio\":9,\"scale\":\"linear\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"mode\":\"normal\",\"show\":true,\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\",\"circlesRadius\":1}],\"setYExtents\":false,\"showCircles\":true,\"times\":[],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":true,\"rotate\":75,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"bottom\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Count\"},\"type\":\"value\"}],\"type\":\"histogram\",\"palette\":{\"type\":\"palette\",\"name\":\"kibana_palette\"},\"isVislibVis\":true,\"detailedTooltip\":true,\"legendSize\":\"auto\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"category.keyword\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":100,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Category\"}}]}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"45464b50-3af6-11e7-a83b-b1b4da7d15f4","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"9a5a35c0-342f-11e7-9e93-53b62e1857b2","name":"search_0","type":"search"}],"sort":[1689866817180,4927],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQzNDMsMV0="} {"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"}}"},"savedSearchRefName":"search_0","title":"DNS - Query Class (Pie Chart)","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"DNS - Query Class (Pie Chart)\",\"type\":\"pie\",\"params\":{\"addTooltip\":true,\"legendPosition\":\"right\",\"isDonut\":true,\"type\":\"pie\",\"labels\":{\"show\":false,\"values\":true,\"last_level\":true,\"truncate\":100},\"palette\":{\"type\":\"palette\",\"name\":\"kibana_palette\"},\"distinctColors\":true,\"legendDisplay\":\"show\",\"legendSize\":\"auto\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"query_class_name.keyword\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"Query Class\"}}]}"},"coreMigrationVersion":"8.7.1","created_at":"2023-07-20T15:26:57.180Z","id":"45a652b0-34c1-11e7-917c-af7a9d11771a","migrationVersion":{"visualization":"8.5.0"},"references":[{"id":"d46522e0-342d-11e7-9e93-53b62e1857b2","name":"search_0","type":"search"}],"sort":[1689866817180,4929],"type":"visualization","updated_at":"2023-07-20T15:26:57.180Z","version":"WzQzNDQsMV0="} diff --git a/salt/kibana/soc_kibana.yaml b/salt/kibana/soc_kibana.yaml index c95512b58..2c097ce1c 100644 --- a/salt/kibana/soc_kibana.yaml +++ b/salt/kibana/soc_kibana.yaml @@ -1,6 +1,6 @@ kibana: enabled: - description: You can enable or disable Kibana. + description: Enables or disables the Kibana front-end interface to Elasticsearch. Due to Kibana being used for loading certain configuration details in Elasticsearch, this process should remain enabled. WARNING - Disabling the process is unsupported, and will cause unexpected results. helpLink: kibana.html config: elasticsearch: diff --git a/salt/kibana/tools/sbin_jinja/so-kibana-space-defaults b/salt/kibana/tools/sbin_jinja/so-kibana-space-defaults index 430054e06..6e4959194 100755 --- a/salt/kibana/tools/sbin_jinja/so-kibana-space-defaults +++ b/salt/kibana/tools/sbin_jinja/so-kibana-space-defaults @@ -13,6 +13,6 @@ echo "Setting up default Space:" {% if HIGHLANDER %} curl -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X PUT "localhost:5601/api/spaces/space/default" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d' {"id":"default","name":"Default","disabledFeatures":["enterpriseSearch"]} ' >> /opt/so/log/kibana/misc.log {% else %} -curl -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X PUT "localhost:5601/api/spaces/space/default" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d' {"id":"default","name":"Default","disabledFeatures":["ml","enterpriseSearch","siem","logs","infrastructure","apm","uptime","monitoring","stackAlerts","actions","securitySolutionCases"]} ' >> /opt/so/log/kibana/misc.log +curl -K /opt/so/conf/elasticsearch/curl.config -b "sid=$SESSIONCOOKIE" -L -X PUT "localhost:5601/api/spaces/space/default" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d' {"id":"default","name":"Default","disabledFeatures":["ml","enterpriseSearch","logs","infrastructure","apm","uptime","monitoring","stackAlerts","actions","securitySolutionCases"]} ' >> /opt/so/log/kibana/misc.log {% endif %} echo diff --git a/salt/kratos/defaults.yaml b/salt/kratos/defaults.yaml index 1e2eef5ed..598a94fa1 100644 --- a/salt/kratos/defaults.yaml +++ b/salt/kratos/defaults.yaml @@ -6,6 +6,7 @@ kratos: id: SSO mapper_url: file:///kratos-conf/oidc.jsonnet subject_source: userinfo + pkce: auto scope: - email - profile @@ -49,6 +50,10 @@ kratos: ui_url: https://URL_BASE/login/ registration: ui_url: https://URL_BASE/login/ + after: + oidc: + hooks: + - hook: session default_browser_return_url: https://URL_BASE/ allowed_return_urls: - http://127.0.0.1 diff --git a/salt/kratos/soc_kratos.yaml b/salt/kratos/soc_kratos.yaml index 6285bf1ad..86227aa37 100644 --- a/salt/kratos/soc_kratos.yaml +++ b/salt/kratos/soc_kratos.yaml @@ -1,6 +1,6 @@ kratos: enabled: - description: You can enable or disable Kratos. + description: Enables or disables the Kratos authentication system. WARNING - Disabling this process will cause the grid to malfunction. Re-enabling this setting will require manual effort via SSH. advanced: True helpLink: kratos.html @@ -70,6 +70,11 @@ kratos: global: True forcedType: "[]string" helpLink: oidc.html + pkce: + description: Set to 'force' if the OIDC provider does not support auto-detection of PKCE, but does support PKCE. Set to `never` to disable PKCE. The default setting automatically attempts to detect if PKCE is supported. The provider's `well-known/openid-configuration` JSON response must contain the `S256` algorithm within the `code_challenge_methods_supported` list in order for the auto-detection to correctly detect PKCE is supported. + global: True + forcedType: string + helpLink: oidc.html requested_claims: id_token: email: diff --git a/salt/logrotate/defaults.yaml b/salt/logrotate/defaults.yaml index 7333c78e9..2f7247ff2 100644 --- a/salt/logrotate/defaults.yaml +++ b/salt/logrotate/defaults.yaml @@ -40,6 +40,16 @@ logrotate: - extension .log - dateext - dateyesterday + /opt/so/log/hydra/*_x_log: + - daily + - rotate 14 + - missingok + - copytruncate + - compress + - create + - extension .log + - dateext + - dateyesterday /opt/so/log/kibana/*_x_log: - daily - rotate 14 diff --git a/salt/logrotate/soc_logrotate.yaml b/salt/logrotate/soc_logrotate.yaml index 62aa935c9..56f879e4f 100644 --- a/salt/logrotate/soc_logrotate.yaml +++ b/salt/logrotate/soc_logrotate.yaml @@ -28,6 +28,13 @@ logrotate: multiline: True global: True forcedType: "[]string" + "/opt/so/log/hydra/*_x_log": + description: List of logrotate options for this file. + title: /opt/so/log/hydra/*.log + advanced: True + multiline: True + global: True + forcedType: "[]string" "/opt/so/log/kibana/*_x_log": description: List of logrotate options for this file. title: /opt/so/log/kibana/*.log diff --git a/salt/logstash/map.jinja b/salt/logstash/map.jinja index 8fc3291e5..da2bc341a 100644 --- a/salt/logstash/map.jinja +++ b/salt/logstash/map.jinja @@ -1,5 +1,5 @@ {# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one - or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at + or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at https://securityonion.net/license; you may not use this file except in compliance with the Elastic License 2.0. #} @@ -42,4 +42,4 @@ {% do LOGSTASH_MERGED.update({'enabled': False}) %} {% endif %} {% endif %} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/salt/logstash/pipelines/config/so/9805_output_elastic_agent.conf.jinja b/salt/logstash/pipelines/config/so/9805_output_elastic_agent.conf.jinja index 3a86cd8be..be7ec6898 100644 --- a/salt/logstash/pipelines/config/so/9805_output_elastic_agent.conf.jinja +++ b/salt/logstash/pipelines/config/so/9805_output_elastic_agent.conf.jinja @@ -1,18 +1,45 @@ output { - if "elastic-agent" in [tags] { - if [metadata][pipeline] { - if [metadata][_id] { - elasticsearch { - hosts => "{{ GLOBALS.hostname }}" - ecs_compatibility => v8 - data_stream => true - user => "{{ ES_USER }}" - password => "{{ ES_PASS }}" - document_id => "%{[metadata][_id]}" - pipeline => "%{[metadata][pipeline]}" - silence_errors_in_log => ["version_conflict_engine_exception"] - ssl => true - ssl_certificate_verification => false + if "elastic-agent" in [tags] and "so-ip-mappings" in [tags] { + elasticsearch { + hosts => "{{ GLOBALS.hostname }}" + data_stream => false + user => "{{ ES_USER }}" + password => "{{ ES_PASS }}" + document_id => "%{[metadata][_id]}" + index => "so-ip-mappings" + silence_errors_in_log => ["version_conflict_engine_exception"] + ssl => true + ssl_certificate_verification => false + } + } + else { + if "elastic-agent" in [tags] { + if [metadata][pipeline] { + if [metadata][_id] { + elasticsearch { + hosts => "{{ GLOBALS.hostname }}" + ecs_compatibility => v8 + data_stream => true + user => "{{ ES_USER }}" + password => "{{ ES_PASS }}" + document_id => "%{[metadata][_id]}" + pipeline => "%{[metadata][pipeline]}" + silence_errors_in_log => ["version_conflict_engine_exception"] + ssl => true + ssl_certificate_verification => false + } + } + else { + elasticsearch { + hosts => "{{ GLOBALS.hostname }}" + ecs_compatibility => v8 + data_stream => true + user => "{{ ES_USER }}" + password => "{{ ES_PASS }}" + pipeline => "%{[metadata][pipeline]}" + ssl => true + ssl_certificate_verification => false + } } } else { @@ -22,22 +49,10 @@ output { data_stream => true user => "{{ ES_USER }}" password => "{{ ES_PASS }}" - pipeline => "%{[metadata][pipeline]}" ssl => true ssl_certificate_verification => false } } } - else { - elasticsearch { - hosts => "{{ GLOBALS.hostname }}" - ecs_compatibility => v8 - data_stream => true - user => "{{ ES_USER }}" - password => "{{ ES_PASS }}" - ssl => true - ssl_certificate_verification => false - } - } } } diff --git a/salt/logstash/soc_logstash.yaml b/salt/logstash/soc_logstash.yaml index cc81d3103..b617abfdd 100644 --- a/salt/logstash/soc_logstash.yaml +++ b/salt/logstash/soc_logstash.yaml @@ -1,6 +1,6 @@ logstash: enabled: - description: You can enable or disable Logstash. + description: Enables or disables the Logstash log event forwarding process. On most grid installations, when this process is disabled log events are unable to be ingested into the SOC backend. helpLink: logstash.html assigned_pipelines: roles: diff --git a/salt/manager/init.sls b/salt/manager/init.sls index 2feda45ae..c4b2ad136 100644 --- a/salt/manager/init.sls +++ b/salt/manager/init.sls @@ -6,10 +6,7 @@ {% from 'allowed_states.map.jinja' import allowed_states %} {% if sls in allowed_states %} {% from 'vars/globals.map.jinja' import GLOBALS %} -{% from 'strelka/map.jinja' import STRELKAMERGED %} -{% import_yaml 'manager/defaults.yaml' as MANAGERDEFAULTS %} -{% set MANAGERMERGED = salt['pillar.get']('manager', MANAGERDEFAULTS.manager, merge=true) %} -{% from 'strelka/map.jinja' import STRELKAMERGED %} +{% from 'manager/map.jinja' import MANAGERMERGED %} include: - salt.minion @@ -45,6 +42,12 @@ yara_log_dir: - user - group +{% if GLOBALS.os_family == 'RedHat' %} +install_createrepo: + pkg.installed: + - name: createrepo_c +{% endif %} + repo_conf_dir: file.directory: - name: /opt/so/conf/reposync @@ -135,6 +138,16 @@ rules_dir: - group: socore - makedirs: True +git_config_set_safe_dirs: + git.config_set: + - name: safe.directory + - global: True + - user: socore + - multivar: + - /nsm/rules/custom-local-repos/local-sigma + - /nsm/rules/custom-local-repos/local-yara + - /nsm/securityonion-resources + - /opt/so/conf/soc/ai_summary_repos/securityonion-resources {% else %} {{sls}}_state_not_allowed: diff --git a/salt/manager/map.jinja b/salt/manager/map.jinja index 1ab9c12c3..4ea04a1cf 100644 --- a/salt/manager/map.jinja +++ b/salt/manager/map.jinja @@ -4,4 +4,8 @@ Elastic License 2.0. #} {% import_yaml 'manager/defaults.yaml' as MANAGERDEFAULTS %} -{% set MANAGERMERGED = salt['pillar.get']('manager', MANAGERDEFAULTS.manager, merge=True) %} \ No newline at end of file +{% set MANAGERMERGED = salt['pillar.get']('manager', MANAGERDEFAULTS.manager, merge=True) %} + +{% if grains.os != 'OEL' %} +{% do MANAGERMERGED.reposync.update({'enabled': False}) %} +{% endif %} diff --git a/salt/manager/soc_manager.yaml b/salt/manager/soc_manager.yaml index 076725691..cf78658de 100644 --- a/salt/manager/soc_manager.yaml +++ b/salt/manager/soc_manager.yaml @@ -1,7 +1,7 @@ manager: reposync: enabled: - description: This is the daily task of syncing the Security Onion OS packages. It is recommended that you leave this enabled. + description: This is the daily task of syncing the Security Onion OS packages. It is recommended that this setting remain enabled to ensure important updates are applied to the grid on an automated, scheduled basis. global: True helpLink: soup.html hour: diff --git a/salt/manager/sync_es_users.sls b/salt/manager/sync_es_users.sls index 03645c699..c46b58ce2 100644 --- a/salt/manager/sync_es_users.sls +++ b/salt/manager/sync_es_users.sls @@ -6,6 +6,10 @@ so-user.lock: file.missing: - name: /var/tmp/so-user.lock +so-client.lock: + file.missing: + - name: /var/tmp/so-client.lock + # Must run before elasticsearch docker container is started! sync_es_users: cmd.run: @@ -16,11 +20,13 @@ sync_es_users: - /opt/so/saltstack/local/salt/elasticsearch/files/users - /opt/so/saltstack/local/salt/elasticsearch/files/users_roles - /opt/so/conf/soc/soc_users_roles + - /opt/so/conf/soc/soc_clients_roles - show_changes: False - require: - docker_container: so-kratos - http: wait_for_kratos - file: so-user.lock # require so-user.lock file to be missing + - file: so-client.lock # require so-client.lock file to be missing # we dont want this added too early in setup, so we add the onlyif to verify 'startup_states: highstate' # is in the minion config. That line is added before the final highstate during setup diff --git a/salt/manager/tools/sbin/so-client b/salt/manager/tools/sbin/so-client new file mode 100755 index 000000000..e55ef70b5 --- /dev/null +++ b/salt/manager/tools/sbin/so-client @@ -0,0 +1,411 @@ +#!/bin/bash + +# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one +# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at +# https://securityonion.net/license; you may not use this file except in compliance with the +# Elastic License 2.0. + +if [[ -f /usr/sbin/so-common ]]; then + source /usr/sbin/so-common +else + source $(dirname $0)/../../../common/tools/sbin/so-common +fi + +function usage() { + cat < [supporting parameters] + + where is one of the following: + + list: Lists all client IDs and permissions currently defined in the oauth2 system + + add: Adds a new client to the oauth2 system and outputs the generated secret + Required parameters: + --name + Optional parameters: + --note (defaults to blank) + --json output as JSON + + delete: Deletes a client from the oauth2 system + Required parameters: + --id + + addperm: Grants a permission to an existing client + Required parameters: + --id + --permission + + delperm: Removes a permission from an existing client + Required parameters: + --id + --permission + + update: Updates a client name and note. + Required parameters: + --id + --name + --note + --searchusername + + generate-secret: Regenerates a client's secret and outputs the new secret. + Required parameters: + --id + Optional parameters: + --json output as JSON + +USAGE_EOF + exit 1 +} + +if [[ $# -lt 1 || $1 == --help || $1 == -h || $1 == -? || $1 == --h ]]; then + usage +fi + +operation=$1 +shift + +searchUsername=__MISSING__ +note=__MISSING__ + +while [[ $# -gt 0 ]]; do + param=$1 + shift + case "$param" in + --id) + id=$(echo $1 | sed 's/"/\\"/g') + [[ ${#id} -gt 55 ]] && fail "id cannot be longer than 55 characters" + shift + ;; + --permission) + perm=$(echo $1 | sed 's/"/\\"/g') + [[ ${#perm} -gt 50 ]] && fail "permission cannot be longer than 50 characters" + shift + ;; + --name) + name=$(echo $1 | sed 's/"/\\"/g') + [[ ${#name} -gt 50 ]] && fail "name cannot be longer than 50 characters" + shift + ;; + --note) + note=$(echo $1 | sed 's/"/\\"/g') + [[ ${#note} -gt 100 ]] && fail "note cannot be longer than 100 characters" + shift + ;; + --searchusername) + searchUsername=$(echo $1 | sed 's/"/\\"/g') + [[ ${#searchUsername} -gt 50 ]] && fail "search username cannot be longer than 50 characters" + shift + ;; + --json) + json=1 + ;; + *) + echo "Encountered unexpected parameter: $param" + usage + ;; + esac +done + +hydraUrl=${HYDRA_URL:-http://127.0.0.1:4445} +socRolesFile=${SOC_ROLES_FILE:-/opt/so/conf/soc/soc_clients_roles} +soUID=${SOCORE_UID:-939} +soGID=${SOCORE_GID:-939} + +function lock() { + # Obtain file descriptor lock + exec 99>/var/tmp/so-client.lock || fail "Unable to create lock descriptor; if the system was not shutdown gracefully you may need to remove /var/tmp/so-client.lock manually." + flock -w 10 99 || fail "Another process is using so-client; if the system was not shutdown gracefully you may need to remove /var/tmp/so-client.lock manually." + trap 'rm -f /var/tmp/so-client.lock' EXIT +} + +function fail() { + msg=$1 + echo "$1" + exit 1 +} + +function require() { + cmd=$1 + which "$1" 2>&1 > /dev/null + [[ $? != 0 ]] && fail "This script requires the following command be installed: ${cmd}" +} + +# Verify this environment is capable of running this script +function verifyEnvironment() { + require "jq" + require "curl" + response=$(curl -Ss -L ${hydraUrl}/) + [[ "$response" != *"Error 404"* ]] && fail "Unable to communicate with Hydra; specify URL via HYDRA_URL environment variable" +} + +function createFile() { + filename=$1 + uid=$2 + gid=$3 + + mkdir -p $(dirname "$filename") + truncate -s 0 "$filename" + chmod 600 "$filename" + chown "${uid}:${gid}" "$filename" +} + +function ensureRoleFileExists() { + if [[ ! -f "$socRolesFile" || ! -s "$socRolesFile" ]]; then + # Generate the new roles file + rolesTmpFile="${socRolesFile}.tmp" + createFile "$rolesTmpFile" "$soUID" "$soGID" + + if [[ -d "$socRolesFile" ]]; then + echo "Removing invalid roles directory created by Docker" + rm -fr "$socRolesFile" + fi + mv "${rolesTmpFile}" "${socRolesFile}" + fi +} + +function listClients() { + response=$(curl -Ss -L -f ${hydraUrl}/admin/clients) + [[ $? != 0 ]] && fail "Unable to communicate with Hydra" + + clientIds=$(echo "${response}" | jq -r ".[] | .client_id" | sort) + for clientId in $clientIds; do + perms=$(grep ":$clientId\$" "$socRolesFile" | cut -d: -f1 | tr '\n' ' ') + echo "$clientId: $perms" + done +} + +function addClientPermission() { + id=$1 + perm=$2 + + adjustClientPermission "$id" "$perm" "add" +} + +function deleteClientPermission() { + id=$1 + perm=$2 + + adjustClientPermission "$id" "$perm" "del" +} + +function adjustClientPermission() { + identityId=$1 + perm=$2 + op=$3 + + [[ ${identityId} == "" ]] && fail "Client not found" + + ensureRoleFileExists + + filename="$socRolesFile" + hasPerm=0 + grep "^$perm:" "$socRolesFile" | grep -q "$identityId" && hasPerm=1 + if [[ "$op" == "add" ]]; then + if [[ "$hasPerm" == "1" ]]; then + echo "Client '$identityId' already has the permission: $perm" + return 1 + else + echo "$perm:$identityId" >> "$filename" + fi + elif [[ "$op" == "del" ]]; then + if [[ "$hasPerm" -ne 1 ]]; then + fail "Client '$identityId' does not have the permission: $perm" + else + sed -e "\!^$perm:$identityId\$!d" "$filename" > "$filename.tmp" + cat "$filename".tmp > "$filename" + rm -f "$filename".tmp + fi + else + fail "Unsupported permission adjustment operation: $op" + fi + return 0 +} + +function convertNameToId() { + name=$1 + + name=${name//[^[:alnum:]]/_} + echo "socl_$name" | tr '[:upper:]' '[:lower:]' +} + +function createClient() { + name=$1 + note=$2 + + id=$(convertNameToId "$name") + now=$(date -u +%FT%TZ) + secret=$(get_random_value) + body=$(cat < "$rolesTmpFile" + cat "$rolesTmpFile" > "$socRolesFile" +} + +case "${operation}" in + "add") + verifyEnvironment + [[ "$name" == "" ]] && fail "A short client name must be provided" + + lock + createClient "$name" "$note" + if [[ "$json" == "1" ]]; then + echo "{\"id\":\"$id\",\"secret\":\"$secret\"}" + else + echo "Successfully added client ID $id with generated secret: $secret" + fi + ;; + + "list") + verifyEnvironment + listClients + ;; + + "addperm") + verifyEnvironment + [[ "$id" == "" ]] && fail "Id must be provided" + [[ "$perm" == "" ]] && fail "Permission must be provided" + + lock + if addClientPermission "$id" "$perm"; then + echo "Successfully added permission to client" + fi + ;; + + "delperm") + verifyEnvironment + [[ "$id" == "" ]] && fail "Id must be provided" + [[ "$perm" == "" ]] && fail "Permission must be provided" + + lock + deleteClientPermission "$id" "$perm" + echo "Successfully removed permission from client" + ;; + + "update") + verifyEnvironment + [[ "$id" == "" ]] && fail "Id must be provided" + [[ "$name" == "" ]] && fail "Name must be provided" + [[ "$note" == "__MISSING__" ]] && fail "Note must be provided" + [[ "$searchUsername" == "__MISSING__" ]] && fail "Search Username must be provided" + + lock + update "$id" "$name" "$note" "$searchUsername" + echo "Successfully updated client" + ;; + + "generate-secret") + verifyEnvironment + [[ "$id" == "" ]] && fail "Id must be provided" + + lock + generateSecret "$id" + if [[ "$json" == "1" ]]; then + echo "{\"secret\":\"$secret\"}" + else + echo "Successfully generated secret: $secret" + fi + ;; + + "delete") + verifyEnvironment + [[ "$id" == "" ]] && fail "Id must be provided" + + lock + deleteClient "$id" + echo "Successfully deleted client." + ;; + *) + fail "Unsupported operation: $operation" + usage + ;; +esac + +exit 0 diff --git a/salt/manager/tools/sbin/so-user b/salt/manager/tools/sbin/so-user index 40e0b01f8..f34681c04 100755 --- a/salt/manager/tools/sbin/so-user +++ b/salt/manager/tools/sbin/so-user @@ -100,23 +100,23 @@ while [[ $# -gt 0 ]]; do shift case "$param" in --email) - email=$1 + email=$(echo $1 | sed 's/"/\\"/g') shift ;; --role) - role=$1 + role=$(echo $1 | sed 's/"/\\"/g') shift ;; --firstName) - firstName=$1 + firstName=$(echo $1 | sed 's/"/\\"/g') shift ;; --lastName) - lastName=$1 + lastName=$(echo $1 | sed 's/"/\\"/g') shift ;; --note) - note=$1 + note=$(echo $1 | sed 's/"/\\"/g') shift ;; --skip-sync) @@ -173,7 +173,7 @@ function verifyEnvironment() { } function findIdByEmail() { - email=$1 + email=${1,,} response=$(curl -Ss -L ${kratosUrl}/identities) identityId=$(echo "${response}" | jq -r ".[] | select(.verifiable_addresses[0].value == \"$email\") | .id") @@ -195,12 +195,13 @@ function validatePassword() { function validateEmail() { email=$1 + requireLower=$2 # (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) if [[ ! "$email" =~ ^[[:alnum:]._%+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}$ ]]; then fail "Email address is invalid" fi - if [[ "$email" =~ [A-Z] ]]; then + if [[ "$requireLower" == "true" && "$email" =~ [A-Z] ]]; then fail "Email addresses cannot contain uppercase letters" fi } @@ -356,7 +357,6 @@ function syncElastic() { random_crypt=$(get_random_value 53) user_data_formatted=$(echo "${user_data_formatted}" | sed -r "s/^(.+:)\$/\\1\$2a\$12${random_crypt}/") fi - echo "${user_data_formatted}" >> "$usersTmpFile" # Append the user roles @@ -372,7 +372,6 @@ function syncElastic() { sqlite3 -cmd ".timeout ${databaseTimeout}" "$databasePath" >> "$rolesTmpFile" [[ $? != 0 ]] && fail "Unable to read role identities from database" done < "$socRolesFile" - else echo "Database file or soc roles file does not exist yet, skipping users export" fi @@ -581,7 +580,7 @@ case "${operation}" in [[ "$email" == "" ]] && fail "Email address must be provided" lock - validateEmail "$email" + validateEmail "$email" true updatePassword createUser "$email" "${role:-$DEFAULT_ROLE}" "${firstName}" "${lastName}" "${note}" syncAll @@ -687,13 +686,13 @@ case "${operation}" in ;; "validate") - validateEmail "$email" + validateEmail "$email" true updatePassword echo "Email and password are acceptable" ;; "valemail") - validateEmail "$email" + validateEmail "$email" true echo "Email is acceptable" ;; diff --git a/salt/manager/tools/sbin/soup b/salt/manager/tools/sbin/soup index 7807c9884..27e6c8217 100755 --- a/salt/manager/tools/sbin/soup +++ b/salt/manager/tools/sbin/soup @@ -19,6 +19,8 @@ SOUP_LOG=/root/soup.log WHATWOULDYOUSAYYAHDOHERE=soup whiptail_title='Security Onion UPdater' NOTIFYCUSTOMELASTICCONFIG=false +TOPFILE=/opt/so/saltstack/default/salt/top.sls +BACKUPTOPFILE=/opt/so/saltstack/default/salt/top.sls.backup # used to display messages to the user at the end of soup declare -a FINAL_MESSAGE_QUEUE=() @@ -32,10 +34,7 @@ check_err() { if [[ $exit_code -ne 0 ]]; then set +e - systemctl_func "start" "$cron_service_name" - systemctl_func "start" "salt-master" - systemctl_func "start" "salt-minion" - enable_highstate + failed_soup_restore_items printf '%s' "Soup failed with error $exit_code: " case $exit_code in @@ -347,8 +346,6 @@ highstate() { masterlock() { echo "Locking Salt Master" - TOPFILE=/opt/so/saltstack/default/salt/top.sls - BACKUPTOPFILE=/opt/so/saltstack/default/salt/top.sls.backup mv -v $TOPFILE $BACKUPTOPFILE echo "base:" > $TOPFILE echo " $MINIONID:" >> $TOPFILE @@ -358,8 +355,12 @@ masterlock() { } masterunlock() { - echo "Unlocking Salt Master" - mv -v $BACKUPTOPFILE $TOPFILE + if [ -f $BACKUPTOPFILE ]; then + echo "Unlocking Salt Master" + mv -v $BACKUPTOPFILE $TOPFILE + else + echo "Salt Master does not need unlocked." + fi } phases_pillar_2_4_80() { @@ -402,6 +403,8 @@ preupgrade_changes() { [[ "$INSTALLEDVERSION" == 2.4.70 ]] && up_to_2.4.80 [[ "$INSTALLEDVERSION" == 2.4.80 ]] && up_to_2.4.90 [[ "$INSTALLEDVERSION" == 2.4.90 ]] && up_to_2.4.100 + [[ "$INSTALLEDVERSION" == 2.4.100 ]] && up_to_2.4.110 + [[ "$INSTALLEDVERSION" == 2.4.110 ]] && up_to_2.4.120 true } @@ -422,6 +425,8 @@ postupgrade_changes() { [[ "$POSTVERSION" == 2.4.70 ]] && post_to_2.4.80 [[ "$POSTVERSION" == 2.4.80 ]] && post_to_2.4.90 [[ "$POSTVERSION" == 2.4.90 ]] && post_to_2.4.100 + [[ "$POSTVERSION" == 2.4.100 ]] && post_to_2.4.110 + [[ "$POSTVERSION" == 2.4.110 ]] && post_to_2.4.120 true } @@ -509,6 +514,16 @@ post_to_2.4.100() { POSTVERSION=2.4.100 } +post_to_2.4.110() { + echo "Nothing to apply" + POSTVERSION=2.4.110 +} + +post_to_2.4.120() { + update_elasticsearch_index_settings + POSTVERSION=2.4.120 +} + repo_sync() { echo "Sync the local repo." su socore -c '/usr/sbin/so-repo-sync' || fail "Unable to complete so-repo-sync." @@ -525,11 +540,17 @@ stop_salt_master() { pkill -9 -ef "/usr/bin/python3 /bin/salt" >> $SOUP_LOG 2>&1 echo "" - echo "Storing salt-master pid." + echo "Storing salt-master PID." MASTERPID=$(pgrep -f '/opt/saltstack/salt/bin/python3.10 /usr/bin/salt-master MainProcess') - echo "Found salt-master PID $MASTERPID" - systemctl_func "stop" "salt-master" - timeout 30 tail --pid=$MASTERPID -f /dev/null || echo "salt-master still running at $(date +"%T.%6N") after waiting 30s. We cannot kill due to systemd restart option." + if [ ! -z "$MASTERPID" ]; then + echo "Found salt-master PID $MASTERPID" + systemctl_func "stop" "salt-master" + if ps -p "$MASTERPID" > /dev/null 2>&1; then + timeout 30 tail --pid=$MASTERPID -f /dev/null || echo "salt-master still running at $(date +"%T.%6N") after waiting 30s. We cannot kill due to systemd restart option." + fi + else + echo "The salt-master PID was not found. The process '/usr/bin/salt-master MainProcess' is not running." + fi set -e } @@ -680,12 +701,52 @@ up_to_2.4.90() { INSTALLEDVERSION=2.4.90 } + up_to_2.4.100() { # Elastic Update for this release, so download Elastic Agent files determine_elastic_agent_upgrade INSTALLEDVERSION=2.4.100 } +up_to_2.4.110() { + echo "Nothing to do for 2.4.110" + + INSTALLEDVERSION=2.4.110 +} + +up_to_2.4.120() { + add_hydra_pillars + + # this is needed for the new versionlock state + mkdir -p /opt/so/saltstack/local/pillar/versionlock + touch /opt/so/saltstack/local/pillar/versionlock/adv_versionlock.sls /opt/so/saltstack/local/pillar/versionlock/soc_versionlock.sls + + # New Grid Integration added this release + rm -f /opt/so/state/eaintegrations.txt + + INSTALLEDVERSION=2.4.120 +} + +add_hydra_pillars() { + mkdir -p /opt/so/saltstack/local/pillar/hydra + touch /opt/so/saltstack/local/pillar/hydra/soc_hydra.sls + chmod 660 /opt/so/saltstack/local/pillar/hydra/soc_hydra.sls + touch /opt/so/saltstack/local/pillar/hydra/adv_hydra.sls + HYDRAKEY=$(get_random_value) + HYDRASALT=$(get_random_value) + printf '%s\n'\ + "hydra:"\ + " config:"\ + " secrets:"\ + " system:"\ + " - '$HYDRAKEY'"\ + " oidc:"\ + " subject_identifiers:"\ + " pairwise:"\ + " salt: '$HYDRASALT'"\ + "" > /opt/so/saltstack/local/pillar/hydra/soc_hydra.sls +} + add_detection_test_pillars() { if [[ -n "$SOUP_INTERNAL_TESTING" ]]; then echo "Adding detection pillar values for automated testing" @@ -837,8 +898,10 @@ determine_elastic_agent_upgrade() { if [[ $is_airgap -eq 0 ]]; then update_elastic_agent_airgap else + set +e # the new elasticsearch defaults.yaml file is not yet placed in /opt/so/saltstack/default/salt/elasticsearch yet update_elastic_agent "$UPDATE_DIR" + set -e fi } @@ -880,6 +943,12 @@ update_airgap_rules() { rsync -av $UPDATE_DIR/agrules/suricata/* /nsm/rules/suricata/ rsync -av $UPDATE_DIR/agrules/detect-sigma/* /nsm/rules/detect-sigma/ rsync -av $UPDATE_DIR/agrules/detect-yara/* /nsm/rules/detect-yara/ + # Copy the securityonion-resorces repo over for SOC Detection Summaries and checkout the published summaries branch + rsync -av --chown=socore:socore $UPDATE_DIR/agrules/securityonion-resources /opt/so/conf/soc/ai_summary_repos + git config --global --add safe.directory /opt/so/conf/soc/ai_summary_repos/securityonion-resources + git -C /opt/so/conf/soc/ai_summary_repos/securityonion-resources checkout generated-summaries-published + # Copy the securityonion-resorces repo over to nsm + rsync -av $UPDATE_DIR/agrules/securityonion-resources/* /nsm/securityonion-resources/ } update_airgap_repo() { @@ -887,10 +956,34 @@ update_airgap_repo() { echo "Syncing new updates to /nsm/repo" rsync -av $AGREPO/* /nsm/repo/ echo "Creating repo" - dnf -y install yum-utils createrepo + dnf -y install yum-utils createrepo_c createrepo /nsm/repo } +update_elasticsearch_index_settings() { + # Update managed indices to reflect latest index template + for idx in "so-detection" "so-detectionhistory" "so-case" "so-casehistory"; do + ilm_name=$idx + if [ "$idx" = "so-detectionhistory" ]; then + ilm_name="so-detection" + elif [ "$idx" = "so-casehistory" ]; then + ilm_name="so-case" + fi + JSON_STRING=$( jq -n --arg ILM_NAME "$ilm_name" '{"settings": {"index.auto_expand_replicas":"0-2","index.lifecycle.name":($ILM_NAME + "-logs")}}') + + echo "Checking if index \"$idx\" exists" + exists=$(curl -K /opt/so/conf/elasticsearch/curl.config -s -o /dev/null -w "%{http_code}" -k -L -H "Content-Type: application/json" "https://localhost:9200/$idx") + if [ $exists -eq 200 ]; then + echo "$idx index found..." + echo "Updating $idx index settings" + curl -K /opt/so/conf/elasticsearch/curl.config -s -k -L -H "Content-Type: application/json" "https://localhost:9200/$idx/_settings" -d "$JSON_STRING" -XPUT + echo -e "\n" + else + echo -e "Skipping $idx... index does not exist\n" + fi + done +} + update_salt_mine() { echo "Populating the mine with mine_functions for each host." set +e @@ -956,12 +1049,12 @@ upgrade_salt() { # if oracle run with -r to ignore repos set by bootstrap if [[ $OS == 'oracle' ]]; then run_check_net_err \ - "sh $UPDATE_DIR/salt/salt/scripts/bootstrap-salt.sh -X -r -F -M -x python3 stable \"$NEWSALTVERSION\"" \ + "sh $UPDATE_DIR/salt/salt/scripts/bootstrap-salt.sh -X -r -F -M stable \"$NEWSALTVERSION\"" \ "Could not update salt, please check $SOUP_LOG for details." # if another rhel family variant we want to run without -r to allow the bootstrap script to manage repos else run_check_net_err \ - "sh $UPDATE_DIR/salt/salt/scripts/bootstrap-salt.sh -X -F -M -x python3 stable \"$NEWSALTVERSION\"" \ + "sh $UPDATE_DIR/salt/salt/scripts/bootstrap-salt.sh -X -F -M stable \"$NEWSALTVERSION\"" \ "Could not update salt, please check $SOUP_LOG for details." fi set -e @@ -981,7 +1074,7 @@ upgrade_salt() { echo "" set +e run_check_net_err \ - "sh $UPDATE_DIR/salt/salt/scripts/bootstrap-salt.sh -X -F -M -x python3 stable \"$NEWSALTVERSION\"" \ + "sh $UPDATE_DIR/salt/salt/scripts/bootstrap-salt.sh -X -F -M stable \"$NEWSALTVERSION\"" \ "Could not update salt, please check $SOUP_LOG for details." set -e echo "Applying apt hold for Salt." @@ -1065,6 +1158,16 @@ apply_hotfix() { fi } +failed_soup_restore_items() { + local services=("$cron_service_name" "salt-master" "salt-minion") + for SERVICE_NAME in "${services[@]}"; do + if ! systemctl is-active --quiet "$SERVICE_NAME"; then + systemctl_func "start" "$SERVICE_NAME" + fi + done + enable_highstate + masterunlock +} #upgrade salt to 3004.1 #2_3_10_hotfix_1() { @@ -1104,6 +1207,8 @@ main() { echo "" require_manager + failed_soup_restore_items + check_pillar_items echo "Checking to see if this is an airgap install." diff --git a/salt/nginx/defaults.yaml b/salt/nginx/defaults.yaml index 088ba9257..3e36233e7 100644 --- a/salt/nginx/defaults.yaml +++ b/salt/nginx/defaults.yaml @@ -1,5 +1,6 @@ nginx: enabled: False + external_suricata: False ssl: replace_cert: False config: diff --git a/salt/nginx/enabled.sls b/salt/nginx/enabled.sls index 273fb65be..91ea0fd24 100644 --- a/salt/nginx/enabled.sls +++ b/salt/nginx/enabled.sls @@ -130,6 +130,9 @@ so-nginx: - /opt/so/conf/navigator/config.json:/opt/socore/html/navigator/assets/config.json:ro - /nsm/repo:/opt/socore/html/repo:ro - /nsm/rules:/nsm/rules:ro + {% if NGINXMERGED.external_suricata %} + - /opt/so/rules/nids/suri:/surirules:ro + {% endif %} {% endif %} {% if DOCKER.containers[container_config].custom_bind_mounts %} {% for BIND in DOCKER.containers[container_config].custom_bind_mounts %} diff --git a/salt/nginx/etc/nginx.conf b/salt/nginx/etc/nginx.conf index 52ea68daa..09c40624e 100644 --- a/salt/nginx/etc/nginx.conf +++ b/salt/nginx/etc/nginx.conf @@ -84,7 +84,8 @@ http { } server { - listen 443 ssl http2 default_server; + listen 443 ssl default_server; + http2 on; server_name _; return 307 https://{{ GLOBALS.url_base }}$request_uri; @@ -116,9 +117,34 @@ http { autoindex_localtime on; } } + {%- if NGINXMERGED.external_suricata %} + server { + listen 7789 ssl; + http2 on; + server_name {{ GLOBALS.url_base }}; + root /surirules; + ssl_certificate "/etc/pki/nginx/server.crt"; + ssl_certificate_key "/etc/pki/nginx/server.key"; + ssl_session_cache shared:SSL:1m; + ssl_session_timeout 10m; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + ssl_protocols TLSv1.2; + location / { + allow all; + sendfile on; + sendfile_max_chunk 1m; + autoindex on; + autoindex_exact_size off; + autoindex_format html; + autoindex_localtime on; + } + } + {%- endif %} server { - listen 443 ssl http2; + listen 443 ssl; + http2 on; server_name {{ GLOBALS.url_base }}; root /opt/socore/html; index index.html; @@ -167,7 +193,7 @@ http { proxy_set_header X-Forwarded-Proto $scheme; } - location ~ ^/auth/.*?(login|oidc/callback/) { + location ~ ^/auth/.*?(login|oidc/callback) { rewrite /auth/(.*) /$1 break; limit_req zone=auth_throttle burst={{ NGINXMERGED.config.throttle_login_burst }} nodelay; limit_req_status 429; @@ -193,6 +219,37 @@ http { proxy_set_header X-Forwarded-Proto $scheme; } +{% if 'api' in salt['pillar.get']('features', []) %} + location ~* (^/oauth2/token.*|^.well-known/jwks.json|^.well-known/openid-configuration) { + limit_req zone=auth_throttle burst={{ NGINXMERGED.config.throttle_login_burst }} nodelay; + limit_req_status 429; + proxy_pass http://{{ GLOBALS.manager }}:4444; + proxy_read_timeout 90; + proxy_connect_timeout 90; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Proxy ""; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /connect/ { + if ($http_authorization !~ "Bearer .*") { + return 401; + } + rewrite /connect/(.*) /api/$1 break; + proxy_pass http://{{ GLOBALS.manager }}:9822/; + proxy_read_timeout 300; + proxy_connect_timeout 300; + proxy_set_header x-user-id ""; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Proxy ""; + proxy_set_header X-Forwarded-Proto $scheme; + } +{%- endif %} + location /cyberchef/ { auth_request /auth/sessions/whoami; proxy_read_timeout 90; @@ -251,20 +308,20 @@ http { proxy_cookie_path /api/ /influxdb/api/; } - location /app/dashboards/ { - auth_request /auth/sessions/whoami; - rewrite /app/dashboards/(.*) /app/dashboards/$1 break; - proxy_pass http://{{ GLOBALS.manager }}:5601/app/; - proxy_read_timeout 300; - proxy_connect_timeout 300; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Proxy ""; - proxy_set_header X-Forwarded-Proto $scheme; - } + location /app/dashboards/ { + auth_request /auth/sessions/whoami; + rewrite /app/dashboards/(.*) /app/dashboards/$1 break; + proxy_pass http://{{ GLOBALS.manager }}:5601/app/; + proxy_read_timeout 300; + proxy_connect_timeout 300; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Proxy ""; + proxy_set_header X-Forwarded-Proto $scheme; + } - location /kibana/ { + location /kibana/ { auth_request /auth/sessions/whoami; rewrite /kibana/(.*) /$1 break; proxy_pass http://{{ GLOBALS.manager }}:5601/; @@ -303,6 +360,9 @@ http { error_page 429 = @error429; location @error401 { + if ($request_uri ~* (^/connect/.*|^/oauth2/.*)) { + return 401; + } if ($request_uri ~* ^/(?!(^/api/.*))) { add_header Set-Cookie "AUTH_REDIRECT=$request_uri;Path=/;Max-Age=14400"; } @@ -310,6 +370,9 @@ http { } location @error403 { + if ($request_uri ~* (^/connect/.*|^/oauth2/.*)) { + return 403; + } add_header Set-Cookie "ory_kratos_session=;Path=/;Max-Age=0;expires=Thu, 01 Jan 1970 00:00:00 GMT;"; return 302 /auth/self-service/login/browser; } diff --git a/salt/nginx/soc_nginx.yaml b/salt/nginx/soc_nginx.yaml index 924a45ae9..07abd32ce 100644 --- a/salt/nginx/soc_nginx.yaml +++ b/salt/nginx/soc_nginx.yaml @@ -1,8 +1,13 @@ nginx: enabled: - description: You can enable or disable Nginx. + description: Enables or disables the Nginx web server and reverse proxy. WARNING - Disabling this process will prevent access to SOC and other important web interfaces and APIs. Re-enabling the process is a manual effort. Do not change this setting without instruction from Security Onion support. advanced: True helpLink: nginx.html + external_suricata: + description: Enable this to allow external access to Suricata Rulesets managed by Detections. + advanced: True + helplink: nginx.html + forcedType: bool ssl: replace_cert: description: Enable this if you would like to replace the Security Onion Certificate with your own. diff --git a/salt/patch/soc_patch.yaml b/salt/patch/soc_patch.yaml index ba9b5a4b3..1618a0f75 100644 --- a/salt/patch/soc_patch.yaml +++ b/salt/patch/soc_patch.yaml @@ -1,7 +1,7 @@ patch: os: enabled: - description: Enable OS updates. + description: Enable OS updates. WARNING - Disabling this setting will prevent important operating system updates from being applied on a scheduled basis. helpLink: soup.html schedule_to_run: description: Currently running schedule for updates. diff --git a/salt/pcap/soc_pcap.yaml b/salt/pcap/soc_pcap.yaml index 65fb99d86..c9136512f 100644 --- a/salt/pcap/soc_pcap.yaml +++ b/salt/pcap/soc_pcap.yaml @@ -1,6 +1,6 @@ pcap: enabled: - description: You can enable or disable Stenographer on all sensors or a single sensor. + description: Enables or disables the Stenographer packet recording process. This process may already be disabled if Suricata is being used as the packet capture process. helpLink: stenographer.html config: maxdirectoryfiles: diff --git a/salt/redis/soc_redis.yaml b/salt/redis/soc_redis.yaml index 45c63ffd3..621cc0fbb 100644 --- a/salt/redis/soc_redis.yaml +++ b/salt/redis/soc_redis.yaml @@ -1,6 +1,6 @@ redis: enabled: - description: You can enable or disable Redis. + description: Enables the log event in-memory buffering process. This process might already be disabled on some installation types. Disabling this process on distributed-capable grids can result in loss of log events. helpLink: redis.html config: bind: diff --git a/salt/registry/soc_registry.yaml b/salt/registry/soc_registry.yaml index 7fc3a161f..7d6cefe8c 100644 --- a/salt/registry/soc_registry.yaml +++ b/salt/registry/soc_registry.yaml @@ -1,4 +1,4 @@ registry: enabled: - description: You can enable or disable the registry. + description: Enables or disables the Docker registry on the manager node. WARNING - If this process is disabled the grid will malfunction and a manual effort may be needed to re-enable the setting. advanced: True diff --git a/salt/salt/map.jinja b/salt/salt/map.jinja index cc388edb4..8feb06763 100644 --- a/salt/salt/map.jinja +++ b/salt/salt/map.jinja @@ -15,9 +15,9 @@ {% if grains.saltversion|string != SALTVERSION|string %} {% if grains.os_family|lower == 'redhat' %} - {% set UPGRADECOMMAND = 'yum clean all ; /usr/sbin/bootstrap-salt.sh -s 120 -r -F -x python3 stable ' ~ SALTVERSION %} + {% set UPGRADECOMMAND = 'yum clean all ; /usr/sbin/bootstrap-salt.sh -s 120 -r -F stable ' ~ SALTVERSION %} {% elif grains.os_family|lower == 'debian' %} - {% set UPGRADECOMMAND = '/usr/sbin/bootstrap-salt.sh -s 120 -F -x python3 stable ' ~ SALTVERSION %} + {% set UPGRADECOMMAND = '/usr/sbin/bootstrap-salt.sh -s 120 -F stable ' ~ SALTVERSION %} {% endif %} {% else %} {% set UPGRADECOMMAND = 'echo Already running Salt Minion version ' ~ SALTVERSION %} diff --git a/salt/salt/minion.sls b/salt/salt/minion.sls index a5953e8e1..ee7c1f14c 100644 --- a/salt/salt/minion.sls +++ b/salt/salt/minion.sls @@ -19,6 +19,17 @@ include: {% if INSTALLEDSALTVERSION|string != SALTVERSION|string %} +{# this is added in 2.4.120 to remove salt repo files pointing to saltproject.io to accomodate the move to broadcom and new bootstrap-salt script #} +{% if salt['pkg.version_cmp'](GLOBALS.so_version, '2.4.120') == -1 %} +{% set saltrepofile = '/etc/yum.repos.d/salt.repo' %} +{% if grains.os_family == 'Debian' %} +{% set saltrepofile = '/etc/apt/sources.list.d/salt.list' %} +{% endif %} +remove_saltproject_io_repo_minion: + file.absent: + - name: {{ saltrepofile }} +{% endif %} + unhold_salt_packages: pkg.unheld: - pkgs: diff --git a/salt/salt/scripts/bootstrap-salt.sh b/salt/salt/scripts/bootstrap-salt.sh index a016524e6..4e65008dc 100644 --- a/salt/salt/scripts/bootstrap-salt.sh +++ b/salt/salt/scripts/bootstrap-salt.sh @@ -1,9 +1,12 @@ -#!/bin/sh - +#!/bin/sh # WARNING: Changes to this file in the salt repo will be overwritten! # Please submit pull requests against the salt-bootstrap repo: # https://github.com/saltstack/salt-bootstrap - +# shellcheck disable=SC2317 +# shellcheck disable=SC2086 +# shellcheck disable=SC2329 +# #====================================================================================================================== # vim: softtabstop=4 shiftwidth=4 expandtab fenc=utf-8 spell spelllang=en cc=120 #====================================================================================================================== @@ -14,7 +17,7 @@ # # BUGS: https://github.com/saltstack/salt-bootstrap/issues # -# COPYRIGHT: (c) 2012-2022 by the SaltStack Team, see AUTHORS.rst for more +# COPYRIGHT: (c) 2012-2024 by the SaltStack Team, see AUTHORS.rst for more # details. # # LICENSE: Apache 2.0 @@ -23,7 +26,7 @@ #====================================================================================================================== set -o nounset # Treat unset variables as an error -__ScriptVersion="2023.08.03" +__ScriptVersion="2024.11.07" __ScriptName="bootstrap-salt.sh" __ScriptFullName="$0" @@ -121,16 +124,35 @@ __check_command_exists() { command -v "$1" > /dev/null 2>&1 } +#--- FUNCTION ------------------------------------------------------------------------------------------------------- +# NAME: __check_services_systemd_functional +# DESCRIPTION: Set _SYSTEMD_FUNCTIONAL = BS_TRUE or BS_FALSE case where systemd is functional (for example: container may not have systemd) +#---------------------------------------------------------------------------------------------------------------------- +__check_services_systemd_functional() { + + # check if systemd is functional, having systemctl present is insufficient + + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_FALSE ]; then + # already determined systemd is not functional, default is 1 + return + fi + + if __check_command_exists systemctl; then + # shellcheck disable=SC2034 + _SYSTEMD_HELP="$(systemctl --help)" + else + _SYSTEMD_FUNCTIONAL=$BS_FALSE + echoerror "systemctl: command not found, assume systemd not implemented, _SYSTEMD_FUNCTIONAL $_SYSTEMD_FUNCTIONAL" + fi +} # ---------- end of function __check_services_systemd_functional ---------- + #--- FUNCTION ------------------------------------------------------------------------------------------------------- # NAME: __check_pip_allowed # DESCRIPTION: Simple function to let the users know that -P needs to be used. #---------------------------------------------------------------------------------------------------------------------- __check_pip_allowed() { - if [ $# -eq 1 ]; then - _PIP_ALLOWED_ERROR_MSG=$1 - else - _PIP_ALLOWED_ERROR_MSG="pip based installations were not allowed. Retry using '-P'" - fi + + _PIP_ALLOWED_ERROR_MSG="pip based installations were not allowed. Retry using '-P'" if [ "$_PIP_ALLOWED" -eq $BS_FALSE ]; then echoerror "$_PIP_ALLOWED_ERROR_MSG" @@ -228,6 +250,7 @@ _TEMP_KEYS_DIR="null" _SLEEP="${__DEFAULT_SLEEP}" _INSTALL_MASTER=$BS_FALSE _INSTALL_SYNDIC=$BS_FALSE +_INSTALL_SALT_API=$BS_FALSE _INSTALL_MINION=$BS_TRUE _INSTALL_CLOUD=$BS_FALSE _VIRTUALENV_DIR=${BS_VIRTUALENV_DIR:-"null"} @@ -266,19 +289,16 @@ _CUSTOM_REPO_URL="null" _CUSTOM_MASTER_CONFIG="null" _CUSTOM_MINION_CONFIG="null" _QUIET_GIT_INSTALLATION=$BS_FALSE -_REPO_URL="repo.saltproject.io" -_ONEDIR_DIR="salt" -_ONEDIR_NIGHTLY_DIR="salt-dev/${_ONEDIR_DIR}" +_REPO_URL="packages.broadcom.com/artifactory" _PY_EXE="python3" -_INSTALL_PY="$BS_FALSE" -_TORNADO_MAX_PY3_VERSION="5.0" -_POST_NEON_INSTALL=$BS_FALSE _MINIMUM_PIP_VERSION="9.0.1" -_MINIMUM_SETUPTOOLS_VERSION="9.1" -_POST_NEON_PIP_INSTALL_ARGS="--prefix=/usr" +_MINIMUM_SETUPTOOLS_VERSION="65.6.3" +_MAXIMUM_SETUPTOOLS_VERSION="69.0" +_PIP_INSTALL_ARGS="--prefix=/usr" _PIP_DOWNLOAD_ARGS="" _QUICK_START="$BS_FALSE" _AUTO_ACCEPT_MINION_KEYS="$BS_FALSE" +_SYSTEMD_FUNCTIONAL=$BS_TRUE # Defaults for install arguments ITYPE="stable" @@ -297,9 +317,9 @@ __usage() { - stable Install latest stable release. This is the default install type - stable [branch] Install latest version on a branch. Only supported - for packages available at repo.saltproject.io + for packages available at packages.broadcom.com - stable [version] Install a specific version. Only supported for - packages available at repo.saltproject.io + packages available at packages.broadcom.com To pin a 3xxx minor version, specify it as 3xxx.0 - testing RHEL-family specific: configure EPEL testing repo - git Install from the head of the master branch @@ -307,17 +327,11 @@ __usage() { commit) - onedir Install latest onedir release. - onedir [version] Install a specific version. Only supported for - onedir packages available at repo.saltproject.io + onedir packages available at packages.broadcom.com - onedir_rc Install latest onedir RC release. - onedir_rc [version] Install a specific version. Only supported for - onedir RC packages available at repo.saltproject.io - - old-stable Install latest old stable release. - - old-stable [branch] Install latest version on a branch. Only supported - for packages available at repo.saltproject.io - - old-stable [version] Install a specific version. Only supported for - packages available at repo.saltproject.io - To pin a 3xxx minor version, specify it as 3xxx.0 + onedir RC packages available at packages.broadcom.com Examples: - ${__ScriptName} @@ -326,16 +340,15 @@ __usage() { - ${__ScriptName} stable 3006.1 - ${__ScriptName} testing - ${__ScriptName} git - - ${__ScriptName} git 2017.7 - - ${__ScriptName} git v2017.7.2 + - ${__ScriptName} git 3006.7 + - ${__ScriptName} git v3006.8 + - ${__ScriptName} git 3007.1 + - ${__ScriptName} git v3007.1 - ${__ScriptName} git 06f249901a2e2f1ed310d58ea3921a129f214358 - ${__ScriptName} onedir - ${__ScriptName} onedir 3006 - ${__ScriptName} onedir_rc - - ${__ScriptName} onedir_rc 3006 - - ${__ScriptName} old-stable - - ${__ScriptName} old-stable 3005 - - ${__ScriptName} old-stable 3005.1 + - ${__ScriptName} onedir_rc 3008 Options: @@ -349,7 +362,7 @@ __usage() { step. -c Temporary configuration directory -C Only run the configuration function. Implies -F (forced overwrite). - To overwrite Master or Syndic configs, -M or -S, respectively, must + To overwrite Master, Syndic or Api configs, -M,-S or -W, respectively, must also be specified. Salt installation will be ommitted, but some of the dependencies could be installed to write configuration with -j or -J. -d Disables checking if Salt services are enabled to start on system boot. @@ -401,8 +414,8 @@ __usage() { And automatically accept the minion key. -R Specify a custom repository URL. Assumes the custom repository URL points to a repository that mirrors Salt packages located at - repo.saltproject.io. The option passed with -R replaces the - "repo.saltproject.io". If -R is passed, -r is also set. Currently only + packages.broadcom.com. The option passed with -R replaces the + "packages.broadcom.com". If -R is passed, -r is also set. Currently only works on CentOS/RHEL and Debian based distributions and macOS. -s Sleep time used when waiting for daemons to start, restart and when checking for the services running. Default: ${__DEFAULT_SLEEP} @@ -414,23 +427,15 @@ __usage() { -v Display script version -V Install Salt into virtualenv (only available for Ubuntu based distributions) - -x Changes the Python version used to install Salt. - For CentOS 6 git installations python2.7 is supported. - Fedora git installation, CentOS 7, Ubuntu 18.04 support python3. + -W Also install salt-api + -x Changes the Python version used to install Salt (default: Python 3). + Python 2.7 is no longer supported. -X Do not start daemons after installation - -y Installs a different python version on host. Currently this has only been - tested with CentOS 6 and is considered experimental. This will install the - ius repo on the box if disable repo is false. This must be used in conjunction - with -x . For example: - sh bootstrap.sh -P -y -x python2.7 git v2017.7.2 - The above will install python27 and install the git version of salt using the - python2.7 executable. This only works for git and pip installations. EOT } # ---------- end of function __usage ---------- - -while getopts ':hvnDc:g:Gyx:k:s:MSNXCPFUKIA:i:Lp:dH:bflV:J:j:rR:aqQ' opt +while getopts ':hvnDc:g:Gx:k:s:MSWNXCPFUKIA:i:Lp:dH:bflV:J:j:rR:aqQ' opt do case "${opt}" in @@ -450,6 +455,7 @@ do s ) _SLEEP=$OPTARG ;; M ) _INSTALL_MASTER=$BS_TRUE ;; S ) _INSTALL_SYNDIC=$BS_TRUE ;; + W ) _INSTALL_SALT_API=$BS_TRUE ;; N ) _INSTALL_MINION=$BS_FALSE ;; X ) _START_DAEMONS=$BS_FALSE ;; C ) _CONFIG_ONLY=$BS_TRUE ;; @@ -476,7 +482,6 @@ do q ) _QUIET_GIT_INSTALLATION=$BS_TRUE ;; Q ) _QUICK_START=$BS_TRUE ;; x ) _PY_EXE="$OPTARG" ;; - y ) _INSTALL_PY="$BS_TRUE" ;; \?) echo echoerror "Option does not exist : $OPTARG" @@ -488,7 +493,6 @@ do done shift $((OPTIND-1)) - # Define our logging file and pipe paths LOGFILE="/tmp/$( echo "$__ScriptName" | sed s/.sh/.log/g )" LOGPIPE="/tmp/$( echo "$__ScriptName" | sed s/.sh/.logpipe/g )" @@ -596,7 +600,15 @@ fi echoinfo "Running version: ${__ScriptVersion}" echoinfo "Executed by: ${CALLER}" echoinfo "Command line: '${__ScriptFullName} ${__ScriptArgs}'" -echowarn "Running the unstable version of ${__ScriptName}" + +# Defaults +STABLE_REV="latest" +ONEDIR_REV="latest" +_ONEDIR_REV="latest" +YUM_REPO_FILE="/etc/yum.repos.d/salt.repo" + +# check if systemd is functional +__check_services_systemd_functional # Define installation type if [ "$#" -gt 0 ];then @@ -606,17 +618,11 @@ if [ "$#" -gt 0 ];then fi # Check installation type -if [ "$(echo "$ITYPE" | grep -E '(stable|testing|git|onedir|onedir_rc|old-stable)')" = "" ]; then +if [ "$(echo "$ITYPE" | grep -E '(stable|testing|git|onedir|onedir_rc)')" = "" ]; then echoerror "Installation type \"$ITYPE\" is not known..." exit 1 fi -# Due to our modifications to install_centos_onedir it is easiest to just lock down to only allowing stable install -if [ "$(echo "$ITYPE" | grep stable)" = "" ]; then - echoerror "This script has been modified to only support stable installation type. Installation type \"$ITYPE\" is not allowed..." - exit 1 -fi - # If doing a git install, check what branch/tag/sha will be checked out if [ "$ITYPE" = "git" ]; then if [ "$#" -eq 0 ];then @@ -632,45 +638,25 @@ if [ "$ITYPE" = "git" ]; then # If doing stable install, check if version specified elif [ "$ITYPE" = "stable" ]; then if [ "$#" -eq 0 ];then + STABLE_REV="latest" ONEDIR_REV="latest" _ONEDIR_REV="latest" ITYPE="onedir" else - if [ "$(echo "$1" | grep -E '^(nightly|latest|3005|3006)$')" != "" ]; then + if [ "$(echo "$1" | grep -E '^(latest|3006|3007)$')" != "" ]; then + STABLE_REV="$1" ONEDIR_REV="$1" _ONEDIR_REV="$1" ITYPE="onedir" shift elif [ "$(echo "$1" | grep -E '^([3-9][0-5]{2}[5-9](\.[0-9]*)?)')" != "" ]; then - ONEDIR_REV="minor/$1" + STABLE_REV="$1" + ONEDIR_REV="$1" _ONEDIR_REV="$1" ITYPE="onedir" shift else - echo "Unknown stable version: $1 (valid: 3005, 3006, latest)" - exit 1 - fi - fi - -# If doing old-stable install, check if version specified -elif [ "$ITYPE" = "old-stable" ]; then - if [ "$#" -eq 0 ];then - ITYPE="stable" - else - if [ "$(echo "$1" | grep -E '^(3003|3004|3005)$')" != "" ]; then - STABLE_REV="$1" - ITYPE="stable" - shift - elif [ "$(echo "$1" | grep -E '^([3-9][0-5]{3}(\.[0-9]*)?)$')" != "" ]; then - # Handle the 3xxx.0 version as 3xxx archive (pin to minor) and strip the fake ".0" suffix - ITYPE="stable" - STABLE_REV=$(echo "$1" | sed -E 's/^([3-9][0-9]{3})\.0$/\1/') - if [ "$(uname)" != "Darwin" ]; then - STABLE_REV="archive/$STABLE_REV" - fi - shift - else - echo "Unknown old stable version: $1 (valid: 3003, 3004, 3005)" + echo "Unknown stable version: $1 (valid: 3006, 3007, latest), versions older than 3006 are not available" exit 1 fi fi @@ -678,52 +664,54 @@ elif [ "$ITYPE" = "old-stable" ]; then elif [ "$ITYPE" = "onedir" ]; then if [ "$#" -eq 0 ];then ONEDIR_REV="latest" + STABLE_REV="latest" else - if [ "$(echo "$1" | grep -E '^(nightly|latest|3005|3006)$')" != "" ]; then + if [ "$(echo "$1" | grep -E '^(latest|3006|3007)$')" != "" ]; then ONEDIR_REV="$1" - shift - elif [ "$(echo "$1" | grep -E '^(3005(\.[0-9]*)?)')" != "" ]; then - # Handle the 3005.0 version as 3005 archive (pin to minor) and strip the fake ".0" suffix - ONEDIR_REV=$(echo "$1" | sed -E 's/^(3005)\.0$/\1/') - ONEDIR_REV="minor/$ONEDIR_REV" + STABLE_REV="$1" shift elif [ "$(echo "$1" | grep -E '^([3-9][0-9]{3}(\.[0-9]*)?)')" != "" ]; then - ONEDIR_REV="minor/$1" + ONEDIR_REV="$1" + STABLE_REV="$1" shift else - echo "Unknown onedir version: $1 (valid: 3005, 3006, latest, nightly.)" + echo "Unknown onedir version: $1 (valid: 3006, 3007, latest), versions older than 3006 are not available" exit 1 fi fi elif [ "$ITYPE" = "onedir_rc" ]; then - # Change the _ONEDIR_DIR to be the location for the RC packages - _ONEDIR_DIR="salt_rc/salt" + echoerror "RC Releases are not supported at this time" - # Change ITYPE to onedir so we use the regular onedir functions - ITYPE="onedir" - - if [ "$#" -eq 0 ];then - ONEDIR_REV="latest" - else - if [ "$(echo "$1" | grep -E '^(latest)$')" != "" ]; then - ONEDIR_REV="$1" - shift - elif [ "$(echo "$1" | grep -E '^([3-9][0-9]{3}?rc[0-9]-[0-9]$)')" != "" ]; then - # Handle the 3xxx.0 version as 3xxx archive (pin to minor) and strip the fake ".0" suffix - #ONEDIR_REV=$(echo "$1" | sed -E 's/^([3-9][0-9]{3})\.0$/\1/') - ONEDIR_REV="minor/$1" - shift - elif [ "$(echo "$1" | grep -E '^([3-9][0-9]{3}\.[0-9]?rc[0-9]$)')" != "" ]; then - # Handle the 3xxx.0 version as 3xxx archive (pin to minor) and strip the fake ".0" suffix - #ONEDIR_REV=$(echo "$1" | sed -E 's/^([3-9][0-9]{3})\.0$/\1/') - ONEDIR_REV="minor/$1" - shift - else - echo "Unknown onedir_rc version: $1 (valid: 3005-1, latest.)" - exit 1 - fi - fi +## # Change the _ONEDIR_DIR to be the location for the RC packages +## _ONEDIR_DIR="salt_rc/salt" +## +## # Change ITYPE to onedir so we use the regular onedir functions +## ITYPE="onedir" +## +## if [ "$#" -eq 0 ];then +## ONEDIR_REV="latest" +## else +## if [ "$(echo "$1" | grep -E '^(latest)$')" != "" ]; then +## ONEDIR_REV="$1" +## shift +## elif [ "$(echo "$1" | grep -E '^([3-9][0-9]{3}?rc[0-9]-[0-9]$)')" != "" ]; then +## # Handle the 3xxx.0 version as 3xxx archive (pin to minor) and strip the fake ".0" suffix +## #ONEDIR_REV=$(echo "$1" | sed -E 's/^([3-9][0-9]{3})\.0$/\1/') +## ## ONEDIR_REV="minor/$1" don't have minor directory anymore +## ONEDIR_REV="$1" +## shift +## elif [ "$(echo "$1" | grep -E '^([3-9][0-9]{3}\.[0-9]?rc[0-9]$)')" != "" ]; then +## # Handle the 3xxx.0 version as 3xxx archive (pin to minor) and strip the fake ".0" suffix +## #ONEDIR_REV=$(echo "$1" | sed -E 's/^([3-9][0-9]{3})\.0$/\1/') +## ## ONEDIR_REV="minor/$1" don't have minor directory anymore +## ONEDIR_REV="$1" +## shift +## else +## echo "Unknown onedir_rc version: $1 (valid: 3006-8, 3007-1, latest)" +## exit 1 +## fi +## fi fi # Doing a quick start, so install master @@ -773,7 +761,7 @@ if [ "$($whoami)" != "root" ]; then fi # Check that we're actually installing one of minion/master/syndic -if [ "$_INSTALL_MINION" -eq $BS_FALSE ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then +if [ "$_INSTALL_MINION" -eq $BS_FALSE ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && [ "$_INSTALL_SALT_API" -eq $BS_FALSE ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then echowarn "Nothing to install or configure" exit 1 fi @@ -806,6 +794,12 @@ if [ "$_CUSTOM_MINION_CONFIG" != "null" ]; then fi fi + +# Default to Python 3, no longer support for Python 2 +PY_PKG_VER=3 +_PY_PKG_VER="python3" +_PY_MAJOR_VERSION="3" + # Check if we're installing via a different Python executable and set major version variables if [ -n "$_PY_EXE" ]; then if [ "$(uname)" = "Darwin" ]; then @@ -814,19 +808,21 @@ if [ -n "$_PY_EXE" ]; then _PY_PKG_VER=$(echo "$_PY_EXE" | sed -E "s/\\.//g") fi - _PY_MAJOR_VERSION=$(echo "$_PY_PKG_VER" | cut -c 7) - if [ "$_PY_MAJOR_VERSION" != 3 ] && [ "$_PY_MAJOR_VERSION" != 2 ]; then - echoerror "Detected -x option, but Python major version is not 2 or 3." - echoerror "The -x option must be passed as python2, python27, or python2.7 (or use the Python '3' versions of examples)." + TEST_PY_MAJOR_VERSION=$(echo "$_PY_PKG_VER" | cut -c 7) + if [ "$TEST_PY_MAJOR_VERSION" -eq 2 ]; then + echoerror "Python 2 is no longer supported, only Python 3" + return 1 + fi + + if [ "$TEST_PY_MAJOR_VERSION" != 3 ]; then + echoerror "Detected -x option, but Python major version is not 3." + echoerror "The -x option must be passed as python3, python38, or python3.8 (use the Python '3' versions of examples)." exit 1 fi if [ "$_PY_EXE" != "python3" ]; then echoinfo "Detected -x option. Using $_PY_EXE to install Salt." fi -else - _PY_PKG_VER="" - _PY_MAJOR_VERSION="" fi # If the configuration directory or archive does not exist, error out @@ -843,7 +839,7 @@ fi # -a and -V only work from git if [ "$ITYPE" != "git" ]; then - if [ $_PIP_ALL -eq $BS_TRUE ]; then + if [ "$_PIP_ALL" -eq $BS_TRUE ]; then echoerror "Pip installing all python packages with -a is only possible when installing Salt via git" exit 1 fi @@ -853,7 +849,7 @@ if [ "$ITYPE" != "git" ]; then fi fi -# Set the _REPO_URL value based on if -R was passed or not. Defaults to repo.saltproject.io. +# Set the _REPO_URL value based on if -R was passed or not. Defaults to packages.broadcom.com if [ "$_CUSTOM_REPO_URL" != "null" ]; then _REPO_URL="$_CUSTOM_REPO_URL" @@ -938,6 +934,7 @@ __fetch_url() { # DESCRIPTION: Retrieves a URL, verifies its content and writes it to standard output #---------------------------------------------------------------------------------------------------------------------- __fetch_verify() { + fetch_verify_url="$1" fetch_verify_sum="$2" fetch_verify_size="$3" @@ -959,6 +956,7 @@ __fetch_verify() { # DESCRIPTION: Checks if a URL exists #---------------------------------------------------------------------------------------------------------------------- __check_url_exists() { + _URL="$1" if curl --output /dev/null --silent --fail "${_URL}"; then return 0 @@ -1035,17 +1033,12 @@ __derive_debian_numeric_version() { INPUT_VERSION="$(cat /etc/debian_version)" fi if [ -z "$NUMERIC_VERSION" ]; then - if [ "$INPUT_VERSION" = "wheezy/sid" ]; then - # I've found an EC2 wheezy image which did not tell its version - NUMERIC_VERSION=$(__parse_version_string "7.0") - elif [ "$INPUT_VERSION" = "jessie/sid" ]; then - NUMERIC_VERSION=$(__parse_version_string "8.0") - elif [ "$INPUT_VERSION" = "stretch/sid" ]; then - NUMERIC_VERSION=$(__parse_version_string "9.0") - elif [ "$INPUT_VERSION" = "buster/sid" ]; then - NUMERIC_VERSION=$(__parse_version_string "10.0") - elif [ "$INPUT_VERSION" = "bullseye/sid" ]; then + if [ "$INPUT_VERSION" = "bullseye/sid" ]; then NUMERIC_VERSION=$(__parse_version_string "11.0") + elif [ "$INPUT_VERSION" = "bookworm/sid" ]; then + NUMERIC_VERSION=$(__parse_version_string "12.0") + elif [ "$INPUT_VERSION" = "trixie/sid" ]; then + NUMERIC_VERSION=$(__parse_version_string "13.0") else echowarn "Unable to parse the Debian Version (codename: '$INPUT_VERSION')" fi @@ -1129,6 +1122,7 @@ __gather_linux_system_info() { DISTRO_VERSION="" # Let's test if the lsb_release binary is available + # shellcheck disable=SC2327,SC2328 rv=$(lsb_release >/dev/null 2>&1) # shellcheck disable=SC2181 @@ -1186,7 +1180,7 @@ __gather_linux_system_info() { # We already have the distribution name and version return fi - # shellcheck disable=SC2035,SC2086 + # shellcheck disable=SC2035,SC2086,SC2269 for rsource in $(__sort_release_files "$( cd /etc && /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \ sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \ @@ -1288,127 +1282,6 @@ __gather_linux_system_info() { } -#--- FUNCTION ------------------------------------------------------------------------------------------------------- -# NAME: __install_python() -# DESCRIPTION: Install a different version of python on a host. Currently this has only been tested on CentOS 6 and -# is considered experimental. -#---------------------------------------------------------------------------------------------------------------------- -__install_python() { - if [ "$_PY_EXE" = "" ]; then - echoerror "Must specify -x with -y to install a specific python version" - exit 1 - fi - - __PACKAGES="$_PY_PKG_VER" - - if [ ${_DISABLE_REPOS} -eq ${BS_FALSE} ]; then - echoinfo "Attempting to install a repo to help provide a separate python package" - echoinfo "$DISTRO_NAME_L" - case "$DISTRO_NAME_L" in - "red_hat"|"centos") - __PYTHON_REPO_URL="https://repo.ius.io/ius-release-el${DISTRO_MAJOR_VERSION}.rpm" - ;; - *) - echoerror "Installing a repo to provide a python package is only supported on Redhat/CentOS. - If a repo is already available, please try running script with -r." - exit 1 - ;; - esac - - echoinfo "Installing IUS repo" - __yum_install_noinput "${__PYTHON_REPO_URL}" || return 1 - fi - - echoinfo "Installing ${__PACKAGES}" - __yum_install_noinput "${__PACKAGES}" || return 1 -} - - -#--- FUNCTION ------------------------------------------------------------------------------------------------------- -# NAME: __gather_sunos_system_info -# DESCRIPTION: Discover SunOS system info -#---------------------------------------------------------------------------------------------------------------------- -__gather_sunos_system_info() { - if [ -f /sbin/uname ]; then - DISTRO_VERSION=$(/sbin/uname -X | awk '/[kK][eE][rR][nN][eE][lL][iI][dD]/ { print $3 }') - fi - - DISTRO_NAME="" - if [ -f /etc/release ]; then - while read -r line; do - [ "${DISTRO_NAME}" != "" ] && break - case "$line" in - *OpenIndiana*oi_[0-9]*) - DISTRO_NAME="OpenIndiana" - DISTRO_VERSION=$(echo "$line" | sed -nE "s/OpenIndiana(.*)oi_([[:digit:]]+)(.*)/\\2/p") - break - ;; - *OpenSolaris*snv_[0-9]*) - DISTRO_NAME="OpenSolaris" - DISTRO_VERSION=$(echo "$line" | sed -nE "s/OpenSolaris(.*)snv_([[:digit:]]+)(.*)/\\2/p") - break - ;; - *Oracle*Solaris*[0-9]*) - DISTRO_NAME="Oracle Solaris" - DISTRO_VERSION=$(echo "$line" | sed -nE "s/(Oracle Solaris) ([[:digit:]]+)(.*)/\\2/p") - break - ;; - *Solaris*) - DISTRO_NAME="Solaris" - # Let's make sure we not actually on a Joyent's SmartOS VM since some releases - # don't have SmartOS in `/etc/release`, only `Solaris` - if uname -v | grep joyent >/dev/null 2>&1; then - DISTRO_NAME="SmartOS" - fi - break - ;; - *NexentaCore*) - DISTRO_NAME="Nexenta Core" - break - ;; - *SmartOS*) - DISTRO_NAME="SmartOS" - break - ;; - *OmniOS*) - DISTRO_NAME="OmniOS" - DISTRO_VERSION=$(echo "$line" | awk '{print $3}') - _SIMPLIFY_VERSION=$BS_FALSE - break - ;; - esac - done < /etc/release - fi - - if [ "${DISTRO_NAME}" = "" ]; then - DISTRO_NAME="Solaris" - DISTRO_VERSION=$( - echo "${OS_VERSION}" | - sed -e 's;^4\.;1.;' \ - -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \ - -e 's;^5\.\([0-9][0-9]*\).*;\1;' - ) - fi - - if [ "${DISTRO_NAME}" = "SmartOS" ]; then - VIRTUAL_TYPE="smartmachine" - if [ "$(zonename)" = "global" ]; then - VIRTUAL_TYPE="global" - fi - fi -} - - -#--- FUNCTION ------------------------------------------------------------------------------------------------------- -# NAME: __gather_bsd_system_info -# DESCRIPTION: Discover OpenBSD, NetBSD and FreeBSD systems information -#---------------------------------------------------------------------------------------------------------------------- -__gather_bsd_system_info() { - DISTRO_NAME=${OS_NAME} - DISTRO_VERSION=$(echo "${OS_VERSION}" | sed -e 's;[()];;' -e 's/-.*$//') -} - - #--- FUNCTION ------------------------------------------------------------------------------------------------------- # NAME: __gather_osx_system_info # DESCRIPTION: Discover MacOS X @@ -1428,12 +1301,6 @@ __gather_system_info() { linux ) __gather_linux_system_info ;; - sunos ) - __gather_sunos_system_info - ;; - openbsd|freebsd|netbsd ) - __gather_bsd_system_info - ;; darwin ) __gather_osx_system_info ;; @@ -1454,21 +1321,23 @@ __gather_system_info() { #---------------------------------------------------------------------------------------------------------------------- # shellcheck disable=SC2034 __ubuntu_derivatives_translation() { - UBUNTU_DERIVATIVES="(trisquel|linuxmint|linaro|elementary_os|neon|pop)" + UBUNTU_DERIVATIVES="(trisquel|linuxmint|elementary_os|pop|neon)" # Mappings - trisquel_6_ubuntu_base="12.04" - linuxmint_13_ubuntu_base="12.04" - linuxmint_17_ubuntu_base="14.04" - linuxmint_18_ubuntu_base="16.04" - linuxmint_19_ubuntu_base="18.04" - linuxmint_20_ubuntu_base="20.04" - linaro_12_ubuntu_base="12.04" - elementary_os_02_ubuntu_base="12.04" - neon_16_ubuntu_base="16.04" - neon_18_ubuntu_base="18.04" + trisquel_10_ubuntu_base="20.04" + trisquel_11_ubuntu_base="22.04" + trisquel_12_ubuntu_base="24.04" neon_20_ubuntu_base="20.04" neon_22_ubuntu_base="22.04" + neon_24_ubuntu_base="24.04" + linuxmint_20_ubuntu_base="20.04" + linuxmint_21_ubuntu_base="22.04" + linuxmint_22_ubuntu_base="24.04" + elementary_os_06_ubuntu_base="20.04" + elementary_os_07_ubuntu_base="22.04" + elementary_os_08_ubuntu_base="24.04" + pop_20_ubuntu_base="22.04" pop_22_ubuntu_base="22.04" + pop_24_ubuntu_base="24.04" # Translate Ubuntu derivatives to their base Ubuntu version match=$(echo "$DISTRO_NAME_L" | grep -E ${UBUNTU_DERIVATIVES}) @@ -1511,42 +1380,24 @@ __check_dpkg_architecture() { return 1 fi - __REPO_ARCH="$DPKG_ARCHITECTURE" - __REPO_ARCH_DEB='deb [signed-by=/usr/share/keyrings/salt-archive-keyring.gpg]' __return_code=0 case $DPKG_ARCHITECTURE in "i386") - error_msg="$_REPO_URL likely doesn't have all required 32-bit packages for $DISTRO_NAME $DISTRO_MAJOR_VERSION." + error_msg="$_REPO_URL likely doesn't have required 32-bit packages for $DISTRO_NAME $DISTRO_MAJOR_VERSION." # amd64 is just a part of repository URI, 32-bit pkgs are hosted under the same location - __REPO_ARCH="amd64" + __return_code=1 ;; "amd64") error_msg="" ;; "arm64") - if [ "$_CUSTOM_REPO_URL" != "null" ]; then - warn_msg="Support for arm64 is experimental, make sure the custom repository used has the expected structure and contents." - else - # Saltstack official repository has arm64 metadata beginning with Debian 11, - # use amd64 repositories on arm64 for anything older, since all pkgs are arch-independent - if [ "$DISTRO_NAME_L" = "debian" ] && [ "$DISTRO_MAJOR_VERSION" -lt 11 ]; then - __REPO_ARCH="amd64" - else - __REPO_ARCH="arm64" - fi - __REPO_ARCH_DEB="deb [signed-by=/usr/share/keyrings/salt-archive-keyring.gpg arch=$__REPO_ARCH]" - warn_msg="Support for arm64 packages is experimental and might rely on architecture-independent packages from the amd64 repository." - fi + # Saltstack official repository has full arm64 support since 3006 error_msg="" ;; "armhf") - if [ "$DISTRO_NAME_L" = "ubuntu" ] || [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then - error_msg="Support for armhf packages at $_REPO_URL is limited to Debian/Raspbian 8 platforms." - __return_code=1 - else - error_msg="" - fi + error_msg="$_REPO_URL doesn't have packages for your system architecture: $DPKG_ARCHITECTURE." + __return_code=1 ;; *) error_msg="$_REPO_URL doesn't have packages for your system architecture: $DPKG_ARCHITECTURE." @@ -1562,10 +1413,10 @@ __check_dpkg_architecture() { if [ "${error_msg}" != "" ]; then echoerror "${error_msg}" if [ "$ITYPE" != "git" ]; then - echoerror "You can try git installation mode, i.e.: sh ${__ScriptName} git v2017.7.2." + echoerror "You can try git installation mode, i.e.: sh ${__ScriptName} git v3006.6." echoerror "It may be necessary to use git installation mode with pip and disable the SaltStack apt repository." echoerror "For example:" - echoerror " sh ${__ScriptName} -r -P git v2017.7.2" + echoerror " sh ${__ScriptName} -r -P git v3006.6" fi fi @@ -1617,8 +1468,14 @@ __ubuntu_codename_translation() { "22") DISTRO_CODENAME="jammy" ;; + "23") + DISTRO_CODENAME="lunar" + ;; + "24") + DISTRO_CODENAME="noble" + ;; *) - DISTRO_CODENAME="trusty" + DISTRO_CODENAME="noble" ;; esac } @@ -1637,20 +1494,21 @@ __debian_derivatives_translation() { DEBIAN_DERIVATIVES="(cumulus|devuan|kali|linuxmint|raspbian|bunsenlabs|turnkey)" # Mappings - cumulus_2_debian_base="7.0" - cumulus_3_debian_base="8.0" - cumulus_4_debian_base="10.0" - devuan_1_debian_base="8.0" - devuan_2_debian_base="9.0" + cumulus_5_debian_base="11.0" + cumulus_6_debian_base="12.0" + devuan_4_debian_base="11.0" + devuan_5_debian_base="12.0" kali_1_debian_base="7.0" kali_2021_debian_base="10.0" - linuxmint_1_debian_base="8.0" - raspbian_8_debian_base="8.0" - raspbian_9_debian_base="9.0" - raspbian_10_debian_base="10.0" + linuxmint_4_debian_base="11.0" + linuxmint_5_debian_base="12.0" raspbian_11_debian_base="11.0" + raspbian_12_debian_base="12.0" bunsenlabs_9_debian_base="9.0" - turnkey_9_debian_base="9.0" + bunsenlabs_11_debian_base="11.0" + bunsenlabs_12_debian_base="12.0" + turnkey_11_debian_base="11.0" + turnkey_12_debian_base="12.0" # Translate Debian derivatives to their base Debian version match=$(echo "$DISTRO_NAME_L" | grep -E ${DEBIAN_DERIVATIVES}) @@ -1718,14 +1576,9 @@ __debian_codename_translation() { ;; "12") DISTRO_CODENAME="bookworm" - # FIXME - TEMPORARY - # use bullseye packages until bookworm packages are available - DISTRO_CODENAME="bullseye" - DISTRO_MAJOR_VERSION=11 - rv=11 ;; *) - DISTRO_CODENAME="stretch" + DISTRO_CODENAME="bookworm" ;; esac } @@ -1738,8 +1591,8 @@ __debian_codename_translation() { __check_end_of_life_versions() { case "${DISTRO_NAME_L}" in debian) - # Debian versions below 9 are not supported - if [ "$DISTRO_MAJOR_VERSION" -lt 9 ]; then + # Debian versions below 11 are not supported + if [ "$DISTRO_MAJOR_VERSION" -lt 11 ]; then echoerror "End of life distributions are not supported." echoerror "Please consider upgrading to the next stable. See:" echoerror " https://wiki.debian.org/DebianReleases" @@ -1750,18 +1603,18 @@ __check_end_of_life_versions() { ubuntu) # Ubuntu versions not supported # - # < 16.04 - # = 16.10 - # = 17.04, 17.10 - # = 18.10 - # = 19.04, 19.10 + # < 20.04 # = 20.10 - if [ "$DISTRO_MAJOR_VERSION" -lt 16 ] || \ - [ "$DISTRO_MAJOR_VERSION" -eq 17 ] || \ - [ "$DISTRO_MAJOR_VERSION" -eq 19 ] || \ - { [ "$DISTRO_MAJOR_VERSION" -eq 16 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ - { [ "$DISTRO_MAJOR_VERSION" -eq 18 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ - { [ "$DISTRO_MAJOR_VERSION" -eq 20 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; }; then + # = 21.04, 21.10 + # = 22.10 + # = 23.04, 23.10 + if [ "$DISTRO_MAJOR_VERSION" -lt 20 ] || \ + { [ "$DISTRO_MAJOR_VERSION" -eq 20 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ + { [ "$DISTRO_MAJOR_VERSION" -eq 21 ] && [ "$DISTRO_MINOR_VERSION" -eq 04 ]; } || \ + { [ "$DISTRO_MAJOR_VERSION" -eq 21 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ + { [ "$DISTRO_MAJOR_VERSION" -eq 22 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ + { [ "$DISTRO_MAJOR_VERSION" -eq 23 ] && [ "$DISTRO_MINOR_VERSION" -eq 04 ]; } || \ + { [ "$DISTRO_MAJOR_VERSION" -eq 23 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; }; then echoerror "End of life distributions are not supported." echoerror "Please consider upgrading to the next stable. See:" echoerror " https://wiki.ubuntu.com/Releases" @@ -1805,8 +1658,8 @@ __check_end_of_life_versions() { ;; fedora) - # Fedora lower than 33 are no longer supported - if [ "$DISTRO_MAJOR_VERSION" -lt 33 ]; then + # Fedora lower than 38 are no longer supported + if [ "$DISTRO_MAJOR_VERSION" -lt 39 ]; then echoerror "End of life distributions are not supported." echoerror "Please consider upgrading to the next stable. See:" echoerror " https://fedoraproject.org/wiki/Releases" @@ -1815,8 +1668,8 @@ __check_end_of_life_versions() { ;; centos) - # CentOS versions lower than 7 are no longer supported - if [ "$DISTRO_MAJOR_VERSION" -lt 7 ]; then + # CentOS versions lower than 8 are no longer supported + if [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then echoerror "End of life distributions are not supported." echoerror "Please consider upgrading to the next stable. See:" echoerror " http://wiki.centos.org/Download" @@ -1825,8 +1678,8 @@ __check_end_of_life_versions() { ;; red_hat*linux) - # Red Hat (Enterprise) Linux versions lower than 7 are no longer supported - if [ "$DISTRO_MAJOR_VERSION" -lt 7 ]; then + # Red Hat (Enterprise) Linux versions lower than 8 are no longer supported + if [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then echoerror "End of life distributions are not supported." echoerror "Please consider upgrading to the next stable. See:" echoerror " https://access.redhat.com/support/policy/updates/errata/" @@ -1835,8 +1688,8 @@ __check_end_of_life_versions() { ;; oracle*linux) - # Oracle Linux versions lower than 7 are no longer supported - if [ "$DISTRO_MAJOR_VERSION" -lt 7 ]; then + # Oracle Linux versions lower than 8 are no longer supported + if [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then echoerror "End of life distributions are not supported." echoerror "Please consider upgrading to the next stable. See:" echoerror " http://www.oracle.com/us/support/library/elsp-lifetime-069338.pdf" @@ -1845,8 +1698,8 @@ __check_end_of_life_versions() { ;; scientific*linux) - # Scientific Linux versions lower than 7 are no longer supported - if [ "$DISTRO_MAJOR_VERSION" -lt 7 ]; then + # Scientific Linux versions lower than 8 are no longer supported + if [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then echoerror "End of life distributions are not supported." echoerror "Please consider upgrading to the next stable. See:" echoerror " https://www.scientificlinux.org/downloads/sl-versions/" @@ -1855,8 +1708,8 @@ __check_end_of_life_versions() { ;; cloud*linux) - # Cloud Linux versions lower than 7 are no longer supported - if [ "$DISTRO_MAJOR_VERSION" -lt 7 ]; then + # Cloud Linux versions lower than 8 are no longer supported + if [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then echoerror "End of life distributions are not supported." echoerror "Please consider upgrading to the next stable. See:" echoerror " https://docs.cloudlinux.com/index.html?cloudlinux_life-cycle.html" @@ -1875,20 +1728,11 @@ __check_end_of_life_versions() { fi ;; - freebsd) - # FreeBSD versions lower than 11 are EOL - if [ "$DISTRO_MAJOR_VERSION" -lt 11 ]; then - echoerror "Versions lower than FreeBSD 11 are EOL and no longer supported." - exit 1 - fi - ;; - *) ;; esac } - __gather_system_info echo @@ -1963,8 +1807,16 @@ if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ]; then fi fi +if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + if [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then + echoinfo "Installing salt api" + else + echoinfo "Configuring salt api" + fi +fi + if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then - echoinfo "Installing salt-cloud and required python-libcloud package" + echoinfo "Installing salt-cloud and required python3-libcloud package" fi if [ $_START_DAEMONS -eq $BS_FALSE ]; then @@ -2008,16 +1860,14 @@ fi if [ "$ITYPE" = "git" ]; then if [ "${GIT_REV}" = "master" ]; then - _POST_NEON_INSTALL=$BS_TRUE __TAG_REGEX_MATCH="MATCH" else case ${OS_NAME_L} in - openbsd|freebsd|netbsd|darwin ) + darwin ) __NEW_VS_TAG_REGEX_MATCH=$(echo "${GIT_REV}" | sed -E 's/^(v?3[0-9]{3}(\.[0-9]{1,2})?).*$/MATCH/') if [ "$__NEW_VS_TAG_REGEX_MATCH" = "MATCH" ]; then - _POST_NEON_INSTALL=$BS_TRUE __TAG_REGEX_MATCH="${__NEW_VS_TAG_REGEX_MATCH}" - echodebug "Post Neon Tag Regex Match On: ${GIT_REV}" + echodebug "Tag Regex Match On: ${GIT_REV}" else __TAG_REGEX_MATCH=$(echo "${GIT_REV}" | sed -E 's/^(v?[0-9]{1,4}\.[0-9]{1,2})(\.[0-9]{1,2})?.*$/MATCH/') echodebug "Pre Neon Tag Regex Match On: ${GIT_REV}" @@ -2026,9 +1876,8 @@ if [ "$ITYPE" = "git" ]; then * ) __NEW_VS_TAG_REGEX_MATCH=$(echo "${GIT_REV}" | sed 's/^.*\(v\?3[[:digit:]]\{3\}\(\.[[:digit:]]\{1,2\}\)\?\).*$/MATCH/') if [ "$__NEW_VS_TAG_REGEX_MATCH" = "MATCH" ]; then - _POST_NEON_INSTALL=$BS_TRUE __TAG_REGEX_MATCH="${__NEW_VS_TAG_REGEX_MATCH}" - echodebug "Post Neon Tag Regex Match On: ${GIT_REV}" + echodebug "Tag Regex Match On: ${GIT_REV}" else __TAG_REGEX_MATCH=$(echo "${GIT_REV}" | sed 's/^.*\(v\?[[:digit:]]\{1,4\}\.[[:digit:]]\{1,2\}\)\(\.[[:digit:]]\{1,2\}\)\?.*$/MATCH/') echodebug "Pre Neon Tag Regex Match On: ${GIT_REV}" @@ -2037,18 +1886,16 @@ if [ "$ITYPE" = "git" ]; then esac fi - if [ "$_POST_NEON_INSTALL" -eq $BS_TRUE ]; then - echo - echowarn "Post Neon git based installations will always install salt" - echowarn "and its dependencies using pip which will be upgraded to" - echowarn "at least v${_MINIMUM_PIP_VERSION}, and, in case the setuptools version is also" - echowarn "too old, it will be upgraded to at least v${_MINIMUM_SETUPTOOLS_VERSION}" - echo - echowarn "You have 10 seconds to cancel and stop the bootstrap process..." - echo - sleep 10 - _PIP_ALLOWED=$BS_TRUE - fi + echo + echowarn "git based installations will always install salt" + echowarn "and its dependencies using pip which will be upgraded to" + echowarn "at least v${_MINIMUM_PIP_VERSION}, and, in case the setuptools version is also" + echowarn "too old, it will be upgraded to at least v${_MINIMUM_SETUPTOOLS_VERSION} and less than v${_MAXIMUM_SETUPTOOLS_VERSION}" + echo + echowarn "You have 10 seconds to cancel and stop the bootstrap process..." + echo + sleep 10 + _PIP_ALLOWED=$BS_TRUE fi @@ -2080,12 +1927,17 @@ __wait_for_apt(){ # Timeout set at 15 minutes WAIT_TIMEOUT=900 + ## see if sync'ing the clocks helps + if [ -f /usr/sbin/hwclock ]; then + /usr/sbin/hwclock -s + fi + # Run our passed in apt command "${@}" 2>"$APT_ERR" APT_RETURN=$? # Make sure we're not waiting on a lock - while [ $APT_RETURN -ne 0 ] && grep -q '^E: Could not get lock' "$APT_ERR"; do + while [ "$APT_RETURN" -ne 0 ] && grep -q '^E: Could not get lock' "$APT_ERR"; do echoinfo "Aware of the lock. Patiently waiting $WAIT_TIMEOUT more seconds..." sleep 1 WAIT_TIMEOUT=$((WAIT_TIMEOUT - 1)) @@ -2109,6 +1961,7 @@ __wait_for_apt(){ # PARAMETERS: packages #---------------------------------------------------------------------------------------------------------------------- __apt_get_install_noinput() { + __wait_for_apt apt-get install -y -o DPkg::Options::=--force-confold "${@}"; return $? } # ---------- end of function __apt_get_install_noinput ---------- @@ -2118,6 +1971,7 @@ __apt_get_install_noinput() { # DESCRIPTION: (DRY) apt-get upgrade with noinput options #---------------------------------------------------------------------------------------------------------------------- __apt_get_upgrade_noinput() { + __wait_for_apt apt-get upgrade -y -o DPkg::Options::=--force-confold; return $? } # ---------- end of function __apt_get_upgrade_noinput ---------- @@ -2148,12 +2002,14 @@ __temp_gpg_pub() { # PARAMETERS: url #---------------------------------------------------------------------------------------------------------------------- __apt_key_fetch() { + + url=$1 tempfile="$(__temp_gpg_pub)" - __fetch_url "$tempfile" "$url" || return 1 - cp -f "$tempfile" /usr/share/keyrings/salt-archive-keyring.gpg && chmod 644 /usr/share/keyrings/salt-archive-keyring.gpg || return 1 + mkdir -p /etc/apt/keyrings + cp -f "$tempfile" /etc/apt/keyrings/salt-archive-keyring.pgp && chmod 644 /etc/apt/keyrings/salt-archive-keyring.pgp || return 1 rm -f "$tempfile" return 0 @@ -2166,6 +2022,7 @@ __apt_key_fetch() { # PARAMETERS: url #---------------------------------------------------------------------------------------------------------------------- __rpm_import_gpg() { + url=$1 tempfile="$(__temp_gpg_pub)" @@ -2290,10 +2147,15 @@ __git_clone_and_checkout() { if [ "$(git clone 2>&1 | grep 'single-branch')" != "" ]; then # The "--single-branch" option is supported, attempt shallow cloning echoinfo "Attempting to shallow clone $GIT_REV from Salt's repository ${_SALT_REPO_URL}" - if git clone --depth 1 --branch "$GIT_REV" "$_SALT_REPO_URL" "$__SALT_CHECKOUT_REPONAME"; then + ## Shallow cloning is resulting in the wrong version of Salt, even with a depth of 5 + ## getting 3007.0+0na.246d066 when it should be 3007.1+410.g246d066457, disabling for now + ## if git clone --depth 1 --branch "$GIT_REV" "$_SALT_REPO_URL" "$__SALT_CHECKOUT_REPONAME"; then + echodebug "git command, git clone --branch $GIT_REV $_SALT_REPO_URL $__SALT_CHECKOUT_REPONAME" + if git clone --branch "$GIT_REV" "$_SALT_REPO_URL" "$__SALT_CHECKOUT_REPONAME"; then # shellcheck disable=SC2164 cd "${_SALT_GIT_CHECKOUT_DIR}" __SHALLOW_CLONE=$BS_TRUE + echoinfo "shallow path (disabled shallow) git cloned $GIT_REV, version $(python3 salt/version.py)" else # Shallow clone above failed(missing upstream tags???), let's resume the old behaviour. echowarn "Failed to shallow clone." @@ -2307,10 +2169,13 @@ __git_clone_and_checkout() { fi if [ "$__SHALLOW_CLONE" -eq $BS_FALSE ]; then + echodebug "shallow clone false, BS_FALSE $BS_FALSE, git clone $_SALT_REPO_URL $__SALT_CHECKOUT_REPONAME" git clone "$_SALT_REPO_URL" "$__SALT_CHECKOUT_REPONAME" || return 1 # shellcheck disable=SC2164 cd "${_SALT_GIT_CHECKOUT_DIR}" + echoinfo "git cloned $GIT_REV, version $(python3 salt/version.py)" + if ! echo "$_SALT_REPO_URL" | grep -q -F -w "${_SALTSTACK_REPO_URL#*://}"; then # We need to add the saltstack repository as a remote and fetch tags for proper versioning echoinfo "Adding SaltStack's Salt repository as a remote" @@ -2403,7 +2268,7 @@ __movefile() { exit 1 fi - if [ $_KEEP_TEMP_FILES -eq $BS_TRUE ]; then + if [ "$_KEEP_TEMP_FILES" -eq $BS_TRUE ]; then # We're being told not to move files, instead copy them so we can keep # them around echodebug "Since BS_KEEP_TEMP_FILES=1 we're copying files instead of moving them" @@ -2520,14 +2385,17 @@ __overwriteconfig() { if [ -n "$_PY_EXE" ]; then good_python="$_PY_EXE" # If python does not have yaml installed we're on Arch and should use python2 + # but no more support, hence error out elif python -c "import yaml" 2> /dev/null; then - good_python=python + good_python=python # assume python is python 3 on Arch else - good_python=python2 + ## good_python=python2 + echoerror "Python 2 is no longer supported, only Python 3" + return 1 fi # Convert json string to a yaml string and write it to config file. Output is dumped into tempfile. - "$good_python" -c "import json; import yaml; jsn=json.loads('$json'); yml=yaml.safe_dump(jsn, line_break='\\n', default_flow_style=False); config_file=open('$target', 'w'); config_file.write(yml); config_file.close();" 2>$tempfile + "$good_python" -c "import json; import yaml; jsn=json.loads('$json'); yml=yaml.safe_dump(jsn, line_break='\\n', default_flow_style=False, sort_keys=False); config_file=open('$target', 'w'); config_file.write(yml); config_file.close();" 2>"$tempfile" # No python errors output to the tempfile if [ ! -s "$tempfile" ]; then @@ -2552,6 +2420,7 @@ __overwriteconfig() { # PARAMETERS: servicename #---------------------------------------------------------------------------------------------------------------------- __check_services_systemd() { + if [ $# -eq 0 ]; then echoerror "You need to pass a service name to check!" exit 1 @@ -2559,6 +2428,21 @@ __check_services_systemd() { echoerror "You need to pass a service name to check as the single argument to the function" fi + # check if systemd is functional, having systemctl present is insufficient + + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_FALSE ]; then + # already determined systemd is not functional, default is 1 + return 1 + fi + + _SYSTEMD_ACTIVE=$(/bin/systemctl daemon-reload 2>&1 | grep 'System has not been booted with systemd') + echodebug "__check_services_systemd _SYSTEMD_ACTIVE result ,$_SYSTEMD_ACTIVE," + if [ "$_SYSTEMD_ACTIVE" != "" ]; then + _SYSTEMD_FUNCTIONAL=$BS_FALSE + echodebug "systemd is not functional, despite systemctl being present, setting _SYSTEMD_FUNCTIONAL false, $_SYSTEMD_FUNCTIONAL" + return 1 + fi + servicename=$1 echodebug "Checking if service ${servicename} is enabled" @@ -2578,6 +2462,7 @@ __check_services_systemd() { # PARAMETERS: servicename #---------------------------------------------------------------------------------------------------------------------- __check_services_upstart() { + if [ $# -eq 0 ]; then echoerror "You need to pass a service name to check!" exit 1 @@ -2605,6 +2490,7 @@ __check_services_upstart() { # PARAMETERS: servicename #---------------------------------------------------------------------------------------------------------------------- __check_services_sysvinit() { + if [ $# -eq 0 ]; then echoerror "You need to pass a service name to check!" exit 1 @@ -2631,6 +2517,7 @@ __check_services_sysvinit() { # PARAMETERS: servicename #---------------------------------------------------------------------------------------------------------------------- __check_services_debian() { + if [ $# -eq 0 ]; then echoerror "You need to pass a service name to check!" exit 1 @@ -2652,38 +2539,13 @@ __check_services_debian() { } # ---------- end of function __check_services_debian ---------- -#--- FUNCTION ------------------------------------------------------------------------------------------------------- -# NAME: __check_services_openbsd -# DESCRIPTION: Return 0 or 1 in case the service is enabled or not -# PARAMETERS: servicename -#---------------------------------------------------------------------------------------------------------------------- -__check_services_openbsd() { - if [ $# -eq 0 ]; then - echoerror "You need to pass a service name to check!" - exit 1 - elif [ $# -ne 1 ]; then - echoerror "You need to pass a service name to check as the single argument to the function" - fi - - servicename=$1 - echodebug "Checking if service ${servicename} is enabled" - - # shellcheck disable=SC2086,SC2046,SC2144 - if rcctl get ${servicename} status; then - echodebug "Service ${servicename} is enabled" - return 0 - else - echodebug "Service ${servicename} is NOT enabled" - return 1 - fi -} # ---------- end of function __check_services_openbsd ---------- - #--- FUNCTION ------------------------------------------------------------------------------------------------------- # NAME: __check_services_openrc # DESCRIPTION: Return 0 or 1 in case the service is enabled or not # PARAMETERS: servicename #---------------------------------------------------------------------------------------------------------------------- __check_services_openrc() { + if [ $# -eq 0 ]; then echoerror "You need to pass a service name to check!" exit 1 @@ -2710,9 +2572,10 @@ __check_services_openrc() { # DESCRIPTION: Return 0 or 1 depending on successful creation of virtualenv #---------------------------------------------------------------------------------------------------------------------- __create_virtualenv() { + if [ ! -d "$_VIRTUALENV_DIR" ]; then echoinfo "Creating virtualenv ${_VIRTUALENV_DIR}" - if [ $_PIP_ALL -eq $BS_TRUE ]; then + if [ "$_PIP_ALL" -eq $BS_TRUE ]; then virtualenv --no-site-packages "${_VIRTUALENV_DIR}" || return 1 else virtualenv --system-site-packages "${_VIRTUALENV_DIR}" || return 1 @@ -2727,6 +2590,7 @@ __create_virtualenv() { # DESCRIPTION: Return 0 or 1 depending on successful activation of virtualenv #---------------------------------------------------------------------------------------------------------------------- __activate_virtualenv() { + set +o nounset # Is virtualenv empty if [ -z "$_VIRTUALENV_DIR" ]; then @@ -2753,7 +2617,7 @@ __install_pip_pkgs() { _pip_cmd="${_py_exe} -m pip" if [ "${_py_exe}" = "" ]; then - _py_exe='python' + _py_exe='python3' fi __check_pip_allowed @@ -2781,17 +2645,6 @@ __install_pip_pkgs() { ${_pip_cmd} install ${_pip_pkgs} || return 1 } -#--- FUNCTION ------------------------------------------------------------------------------------------------------- -# NAME: __install_tornado_pip -# PARAMETERS: python executable -# DESCRIPTION: Return 0 or 1 if successfully able to install tornado<5.0 -#---------------------------------------------------------------------------------------------------------------------- -__install_tornado_pip() { - # OS needs tornado <5.0 from pip - __check_pip_allowed "You need to allow pip based installations (-P) for Tornado <5.0 in order to install Salt on Python 3" - ## install pip if its not installed and install tornado - __install_pip_pkgs "tornado<5.0" "${1}" || return 1 -} #--- FUNCTION ------------------------------------------------------------------------------------------------------- # NAME: __install_pip_deps @@ -2829,19 +2682,20 @@ __install_pip_deps() { } # ---------- end of function __install_pip_deps ---------- #--- FUNCTION ------------------------------------------------------------------------------------------------------- -# NAME: __install_salt_from_repo_post_neon +# NAME: __install_salt_from_repo # DESCRIPTION: Return 0 or 1 if successfully able to install. Can provide a different python version to # install pip packages with. If $py_exe is not specified it will use the default python version. # PARAMETERS: py_exe #---------------------------------------------------------------------------------------------------------------------- -__install_salt_from_repo_post_neon() { +__install_salt_from_repo() { + _py_exe="$1" if [ "${_py_exe}" = "" ]; then - _py_exe='python' + _py_exe="python3" fi - echodebug "__install_salt_from_repo_post_neon py_exe=$_py_exe" + echodebug "__install_salt_from_repo py_exe=$_py_exe" _py_version=$(${_py_exe} -c "import sys; print('{0}.{1}'.format(*sys.version_info))") _pip_cmd="pip${_py_version}" @@ -2879,14 +2733,9 @@ except ImportError: EOM ) if ! ${_py_exe} -c "$CHECK_PIP_VERSION_SCRIPT"; then - # Upgrade pip to at least 1.2 which is when we can start using "python -m pip" - if [ "${_py_version}" = "3.5" ]; then - echodebug "Running '${_pip_cmd} install ${_POST_NEON_PIP_INSTALL_ARGS} pip>=${_MINIMUM_PIP_VERSION},<21.0'" - ${_pip_cmd} install ${_POST_NEON_PIP_INSTALL_ARGS} -v "pip>=${_MINIMUM_PIP_VERSION},<21.0" - else - echodebug "Running '${_pip_cmd} install ${_POST_NEON_PIP_INSTALL_ARGS} pip>=${_MINIMUM_PIP_VERSION}'" - ${_pip_cmd} install ${_POST_NEON_PIP_INSTALL_ARGS} -v "pip>=${_MINIMUM_PIP_VERSION}" - fi + # Upgrade pip to at least 1.2 which is when we can start using "python3 -m pip" + echodebug "Running '${_pip_cmd} install ${_PIP_INSTALL_ARGS} pip>=${_MINIMUM_PIP_VERSION}'" + ${_pip_cmd} install ${_PIP_INSTALL_ARGS} -v "pip>=${_MINIMUM_PIP_VERSION}" sleep 1 echodebug "PATH: ${PATH}" _pip_cmd="pip${_py_version}" @@ -2905,26 +2754,43 @@ EOM echodebug "Installed pip version: $(${_pip_cmd} --version)" fi - _setuptools_dep="setuptools>=${_MINIMUM_SETUPTOOLS_VERSION}" - if [ "$_PY_MAJOR_VERSION" -eq 2 ]; then - # We also lock setuptools to <45 which is the latest release to support both py2 and py3 - _setuptools_dep="${_setuptools_dep},<45" + _setuptools_dep="setuptools>=${_MINIMUM_SETUPTOOLS_VERSION},<${_MAXIMUM_SETUPTOOLS_VERSION}" + if [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi - echodebug "Running '${_pip_cmd} install wheel ${_setuptools_dep}'" - ${_pip_cmd} install --upgrade ${_POST_NEON_PIP_INSTALL_ARGS} wheel "${_setuptools_dep}" + _USE_BREAK_SYSTEM_PACKAGES="" + # shellcheck disable=SC2086,SC2090 + if { [ ${DISTRO_NAME_L} = "ubuntu" ] && [ "$DISTRO_MAJOR_VERSION" -ge 24 ]; } || \ + [ ${DISTRO_NAME_L} = "debian" ] && [ "$DISTRO_MAJOR_VERSION" -ge 12 ]; then + _USE_BREAK_SYSTEM_PACKAGES="--break-system-packages" + echodebug "OS is greater than / equal Debian 12 or Ubuntu 24.04, using ${_USE_BREAK_SYSTEM_PACKAGES}" + fi - echoinfo "Installing salt using ${_py_exe}" + echodebug "Running '${_pip_cmd} install ${_USE_BREAK_SYSTEM_PACKAGES} --upgrade ${_PIP_INSTALL_ARGS} wheel ${_setuptools_dep}" + ${_pip_cmd} install ${_USE_BREAK_SYSTEM_PACKAGES} --upgrade ${_PIP_INSTALL_ARGS} wheel "${_setuptools_dep}" + + echoinfo "Installing salt using ${_py_exe}, $(${_py_exe} --version)" cd "${_SALT_GIT_CHECKOUT_DIR}" || return 1 - mkdir /tmp/git/deps + mkdir -p /tmp/git/deps + echodebug "Created directory /tmp/git/deps" + echodebug "Installing Salt dependencies for Salt version $(python3 salt/version.py)" + + if [ ${DISTRO_NAME_L} = "ubuntu" ] && [ "$DISTRO_MAJOR_VERSION" -eq 22 ]; then + echodebug "Ubuntu 22.04 has problem with base.txt requirements file, not parsing sys_platform == 'win32', upgrading from default pip works" + echodebug "${_pip_cmd} install ${_USE_BREAK_SYSTEM_PACKAGES} --upgrade pip" + ${_pip_cmd} install ${_USE_BREAK_SYSTEM_PACKAGES} --upgrade pip || (echo "Failed to upgrade pip" && return 1) + fi + echoinfo "Downloading Salt Dependencies from PyPi" echodebug "Running '${_pip_cmd} download -d /tmp/git/deps ${_PIP_DOWNLOAD_ARGS} .'" ${_pip_cmd} download -d /tmp/git/deps ${_PIP_DOWNLOAD_ARGS} . || (echo "Failed to download salt dependencies" && return 1) echoinfo "Installing Downloaded Salt Dependencies" - echodebug "Running '${_pip_cmd} install --ignore-installed ${_POST_NEON_PIP_INSTALL_ARGS} /tmp/git/deps/*'" - ${_pip_cmd} install --ignore-installed ${_POST_NEON_PIP_INSTALL_ARGS} /tmp/git/deps/* || return 1 + echodebug "Running '${_pip_cmd} install ${_USE_BREAK_SYSTEM_PACKAGES} --ignore-installed ${_PIP_INSTALL_ARGS} /tmp/git/deps/*'" + ${_pip_cmd} install ${_USE_BREAK_SYSTEM_PACKAGES} --ignore-installed ${_PIP_INSTALL_ARGS} /tmp/git/deps/* || return 1 rm -f /tmp/git/deps/* echoinfo "Building Salt Python Wheel" @@ -2934,16 +2800,27 @@ EOM fi echodebug "Running '${_py_exe} setup.py --salt-config-dir=$_SALT_ETC_DIR --salt-cache-dir=${_SALT_CACHE_DIR} ${SETUP_PY_INSTALL_ARGS} bdist_wheel'" - ${_py_exe} setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} bdist_wheel || return 1 + ${_py_exe} setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR} ${SETUP_PY_INSTALL_ARGS}" bdist_wheel || return 1 mv dist/salt*.whl /tmp/git/deps/ || return 1 cd "${__SALT_GIT_CHECKOUT_PARENT_DIR}" || return 1 echoinfo "Installing Built Salt Wheel" - ${_pip_cmd} uninstall --yes salt 2>/dev/null || true - echodebug "Running '${_pip_cmd} install --no-deps --force-reinstall ${_POST_NEON_PIP_INSTALL_ARGS} /tmp/git/deps/salt*.whl'" - ${_pip_cmd} install --no-deps --force-reinstall \ - ${_POST_NEON_PIP_INSTALL_ARGS} \ + ${_pip_cmd} uninstall --yes ${_USE_BREAK_SYSTEM_PACKAGES} salt 2>/dev/null || true + + # Hack for getting current Arch working with git-master + if [ "${DISTRO_NAME}" = "Arch Linux" ]; then + _arch_dep="cryptography==42.0.7" # debug matching current Arch version of python-cryptography + echodebug "Running '${_pip_cmd} install --force-reinstall --break-system-packages ${_arch_dep}'" + ${_pip_cmd} install --force-reinstall --break-system-packages "${_arch_dep}" + fi + + echodebug "Running '${_pip_cmd} install ${_USE_BREAK_SYSTEM_PACKAGES} --no-deps --force-reinstall ${_PIP_INSTALL_ARGS} /tmp/git/deps/salt*.whl'" + + echodebug "Running ${_pip_cmd} install ${_USE_BREAK_SYSTEM_PACKAGES} --no-deps --force-reinstall ${_PIP_INSTALL_ARGS} --global-option=--salt-config-dir=$_SALT_ETC_DIR --salt-cache-dir=${_SALT_CACHE_DIR} ${SETUP_PY_INSTALL_ARGS} /tmp/git/deps/salt*.whl" + + ${_pip_cmd} install ${_USE_BREAK_SYSTEM_PACKAGES} --no-deps --force-reinstall \ + ${_PIP_INSTALL_ARGS} \ --global-option="--salt-config-dir=$_SALT_ETC_DIR --salt-cache-dir=${_SALT_CACHE_DIR} ${SETUP_PY_INSTALL_ARGS}" \ /tmp/git/deps/salt*.whl || return 1 @@ -2966,21 +2843,16 @@ EOM return 1 fi return 0 -} # ---------- end of function __install_salt_from_repo_post_neon ---------- +} # ---------- end of function __install_salt_from_repo ---------- -if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - if [ "x${_PY_MAJOR_VERSION}" = "x" ]; then - # Default to python 2 for pre Neon installs - _PY_MAJOR_VERSION=2 - fi -else - if [ "x${_PY_MAJOR_VERSION}" = "x" ]; then - # Default to python 3 for post Neon install - _PY_MAJOR_VERSION=3 - fi +# shellcheck disable=SC2268 +if [ "x${_PY_MAJOR_VERSION}" = "x" ]; then + # Default to python 3 for install + _PY_MAJOR_VERSION=3 fi + ####################################################################################################################### # # Distribution install functions @@ -3064,6 +2936,7 @@ fi # Ubuntu Install Functions # __enable_universe_repository() { + if [ "$(grep -R universe /etc/apt/sources.list /etc/apt/sources.list.d/ | grep -v '#')" != "" ]; then # The universe repository is already enabled return 0 @@ -3078,15 +2951,13 @@ __enable_universe_repository() { __install_saltstack_ubuntu_repository() { # Workaround for latest non-LTS Ubuntu + echodebug "__install_saltstack_ubuntu_repository() entry" + if { [ "$DISTRO_MAJOR_VERSION" -eq 20 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ - # remove 22 version when salt packages for 22.04 are available - [ "$DISTRO_MAJOR_VERSION" -eq 21 ] || [ "$DISTRO_MAJOR_VERSION" -eq 22 ]; then + { [ "$DISTRO_MAJOR_VERSION" -eq 22 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ + { [ "$DISTRO_MAJOR_VERSION" -eq 24 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ + [ "$DISTRO_MAJOR_VERSION" -eq 21 ] || [ "$DISTRO_MAJOR_VERSION" -eq 23 ] || [ "$DISTRO_MAJOR_VERSION" -eq 25 ]; then echowarn "Non-LTS Ubuntu detected, but stable packages requested. Trying packages for previous LTS release. You may experience problems." - UBUNTU_VERSION=20.04 - UBUNTU_CODENAME="focal" - else - UBUNTU_VERSION=${DISTRO_VERSION} - UBUNTU_CODENAME=${DISTRO_CODENAME} fi # Install downloader backend for GPG keys fetching @@ -3102,33 +2973,48 @@ __install_saltstack_ubuntu_repository() { __PACKAGES="${__PACKAGES} apt-transport-https ca-certificates" fi + ## include hwclock if not part of base OS (23.10 and up) + if [ ! -f /usr/sbin/hwclock ]; then + __PACKAGES="${__PACKAGES} util-linux-extra" + fi + # shellcheck disable=SC2086,SC2090 __apt_get_install_noinput ${__PACKAGES} || return 1 - __PY_VERSION_REPO="apt" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PY_VERSION_REPO="py3" + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is not supported, only Python 3" + return 1 fi # SaltStack's stable Ubuntu repository: - SALTSTACK_UBUNTU_URL="${HTTP_VAL}://${_REPO_URL}/${__PY_VERSION_REPO}/ubuntu/${UBUNTU_VERSION}/${__REPO_ARCH}/${STABLE_REV}" - echo "$__REPO_ARCH_DEB $SALTSTACK_UBUNTU_URL $UBUNTU_CODENAME main" > /etc/apt/sources.list.d/salt.list - - __apt_key_fetch "$SALTSTACK_UBUNTU_URL/salt-archive-keyring.gpg" || return 1 - + __fetch_url "/etc/apt/sources.list.d/salt.sources" "https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources" + __apt_key_fetch "${HTTP_VAL}://${_REPO_URL}/api/security/keypair/SaltProjectKey/public" || return 1 __wait_for_apt apt-get update || return 1 + + if [ "$STABLE_REV" != "latest" ]; then + # latest is default + STABLE_REV_MAJOR=$(echo "$STABLE_REV" | cut -d '.' -f 1) + if [ "$STABLE_REV_MAJOR" -eq "3006" ]; then + echo "Package: salt-*" > /etc/apt/preferences.d/salt-pin-1001 + echo "Pin: version 3006.*" >> /etc/apt/preferences.d/salt-pin-1001 + echo "Pin-Priority: 1001" >> /etc/apt/preferences.d/salt-pin-1001 + elif [ "$STABLE_REV_MAJOR" -eq "3007" ]; then + echo "Package: salt-*" > /etc/apt/preferences.d/salt-pin-1001 + echo "Pin: version 3007.*" >> /etc/apt/preferences.d/salt-pin-1001 + echo "Pin-Priority: 1001" >> /etc/apt/preferences.d/salt-pin-1001 + fi + fi + } __install_saltstack_ubuntu_onedir_repository() { + + echodebug "__install_saltstack_ubuntu_onedir_repository() entry" # Workaround for latest non-LTS Ubuntu if { [ "$DISTRO_MAJOR_VERSION" -eq 20 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ - [ "$DISTRO_MAJOR_VERSION" -eq 21 ]; then + { [ "$DISTRO_MAJOR_VERSION" -eq 22 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]; } || \ + [ "$DISTRO_MAJOR_VERSION" -eq 21 ] || [ "$DISTRO_MAJOR_VERSION" -eq 23 ] || [ "$DISTRO_MAJOR_VERSION" -eq 25 ]; then echowarn "Non-LTS Ubuntu detected, but stable packages requested. Trying packages for previous LTS release. You may experience problems." - UBUNTU_VERSION=20.04 - UBUNTU_CODENAME="focal" - else - UBUNTU_VERSION=${DISTRO_VERSION} - UBUNTU_CODENAME=${DISTRO_CODENAME} fi # Install downloader backend for GPG keys fetching @@ -3144,35 +3030,38 @@ __install_saltstack_ubuntu_onedir_repository() { __PACKAGES="${__PACKAGES} apt-transport-https ca-certificates" fi + ## include hwclock if not part of base OS (23.10 and up) + if [ ! -f /usr/sbin/hwclock ]; then + __PACKAGES="${__PACKAGES} util-linux-extra" + fi + # shellcheck disable=SC2086,SC2090 __apt_get_install_noinput ${__PACKAGES} || return 1 - __PY_VERSION_REPO="apt" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PY_VERSION_REPO="py3" - fi - # SaltStack's stable Ubuntu repository: - SALTSTACK_UBUNTU_URL="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_DIR}/${__PY_VERSION_REPO}/ubuntu/${UBUNTU_VERSION}/${__REPO_ARCH}/${ONEDIR_REV}/" - if [ "${ONEDIR_REV}" = "nightly" ] ; then - SALTSTACK_UBUNTU_URL="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_NIGHTLY_DIR}/${__PY_VERSION_REPO}/ubuntu/${UBUNTU_VERSION}/${__REPO_ARCH}/" - fi - echo "$__REPO_ARCH_DEB $SALTSTACK_UBUNTU_URL $UBUNTU_CODENAME main" > /etc/apt/sources.list.d/salt.list - - if [ "$(echo "${ONEDIR_REV}" | grep -E '(3004|3005)')" != "" ]; then - __apt_key_fetch "${SALTSTACK_UBUNTU_URL}salt-archive-keyring.gpg" || return 1 - elif [ "$(echo "${ONEDIR_REV}" | grep -E '(latest|nightly)')" != "" ]; then - __apt_key_fetch "${SALTSTACK_UBUNTU_URL}salt-archive-keyring.gpg" || \ - __apt_key_fetch "${SALTSTACK_UBUNTU_URL}SALT-PROJECT-GPG-PUBKEY-2023.gpg" || return 1 - else - __apt_key_fetch "${SALTSTACK_UBUNTU_URL}SALT-PROJECT-GPG-PUBKEY-2023.gpg" || return 1 - fi - + __fetch_url "/etc/apt/sources.list.d/salt.sources" "https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources" + __apt_key_fetch "${HTTP_VAL}://${_REPO_URL}/api/security/keypair/SaltProjectKey/public" || return 1 __wait_for_apt apt-get update || return 1 + + if [ "$ONEDIR_REV" != "latest" ]; then + # latest is default + ONEDIR_REV_MAJOR=$(echo "$ONEDIR_REV" | cut -d '.' -f 1) + if [ "$ONEDIR_REV_MAJOR" -eq "3006" ]; then + echo "Package: salt-*" > /etc/apt/preferences.d/salt-pin-1001 + echo "Pin: version 3006.*" >> /etc/apt/preferences.d/salt-pin-1001 + echo "Pin-Priority: 1001" >> /etc/apt/preferences.d/salt-pin-1001 + elif [ "$ONEDIR_REV_MAJOR" -eq "3007" ]; then + echo "Package: salt-*" > /etc/apt/preferences.d/salt-pin-1001 + echo "Pin: version 3007.*" >> /etc/apt/preferences.d/salt-pin-1001 + echo "Pin-Priority: 1001" >> /etc/apt/preferences.d/salt-pin-1001 + fi + fi } install_ubuntu_deps() { - if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then + + echodebug "install_ubuntu_deps() entry" + if [ "$_DISABLE_REPOS" -eq $BS_FALSE ]; then # Install add-apt-repository if ! __check_command_exists add-apt-repository; then __apt_get_install_noinput software-properties-common || return 1 @@ -3185,24 +3074,19 @@ install_ubuntu_deps() { __PACKAGES='' - if [ "$DISTRO_MAJOR_VERSION" -lt 16 ]; then - # Minimal systems might not have upstart installed, install it - __PACKAGES="upstart" + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - PY_PKG_VER=3 - else - PY_PKG_VER="" - fi - - if [ "$DISTRO_MAJOR_VERSION" -ge 16 ] && [ -z "$_PY_EXE" ]; then - __PACKAGES="${__PACKAGES} python2.7" + if [ "$DISTRO_MAJOR_VERSION" -ge 20 ] && [ -z "$_PY_EXE" ]; then + __PACKAGES="${__PACKAGES} python${PY_PKG_VER}" fi if [ "$_VIRTUALENV_DIR" != "null" ]; then - __PACKAGES="${__PACKAGES} python-virtualenv" + __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-virtualenv" fi + # Need python-apt for managing packages via Salt __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-apt" @@ -3215,6 +3099,11 @@ install_ubuntu_deps() { # Additionally install procps and pciutils which allows for Docker bootstraps. See 366#issuecomment-39666813 __PACKAGES="${__PACKAGES} procps pciutils" + ## include hwclock if not part of base OS (23.10 and up) + if [ ! -f /usr/sbin/hwclock ]; then + __PACKAGES="${__PACKAGES} util-linux-extra" + fi + # shellcheck disable=SC2086,SC2090 __apt_get_install_noinput ${__PACKAGES} || return 1 @@ -3228,14 +3117,10 @@ install_ubuntu_deps() { } install_ubuntu_stable_deps() { - if [ "${_SLEEP}" -eq "${__DEFAULT_SLEEP}" ] && [ "$DISTRO_MAJOR_VERSION" -lt 16 ]; then - # The user did not pass a custom sleep value as an argument, let's increase the default value - echodebug "On Ubuntu systems we increase the default sleep value to 10." - echodebug "See https://github.com/saltstack/salt/issues/12248 for more info." - _SLEEP=10 - fi - if [ $_START_DAEMONS -eq $BS_FALSE ]; then + echodebug "install_ubuntu_stable_deps() entry" + + if [ "$_START_DAEMONS" -eq $BS_FALSE ]; then echowarn "Not starting daemons on Debian based distributions is not working mostly because starting them is the default behaviour." fi @@ -3246,7 +3131,8 @@ install_ubuntu_stable_deps() { if [ "${_UPGRADE_SYS}" -eq $BS_TRUE ]; then if [ "${_INSECURE_DL}" -eq $BS_TRUE ]; then - if [ "$DISTRO_MAJOR_VERSION" -ge 20 ] || [ "$DISTRO_MAJOR_VERSION" -ge 21 ] || [ "$DISTRO_MAJOR_VERSION" -ge 22 ]; then + ## apt-key is deprecated + if [ "$DISTRO_MAJOR_VERSION" -ge 20 ]; then __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring && apt-get update || return 1 else __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring && @@ -3266,6 +3152,9 @@ install_ubuntu_stable_deps() { } install_ubuntu_git_deps() { + + echodebug "install_ubuntu_git_deps() entry" + __wait_for_apt apt-get update || return 1 if ! __check_command_exists git; then @@ -3278,65 +3167,27 @@ install_ubuntu_git_deps() { __git_clone_and_checkout || return 1 - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - PY_PKG_VER=3 - else - PY_PKG_VER="" + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - - __PACKAGES="" - - # See how we are installing packages - if [ "${_PIP_ALL}" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} python-dev swig libssl-dev libzmq3 libzmq3-dev" - - if ! __check_command_exists pip; then - __PACKAGES="${__PACKAGES} python-setuptools python-pip" - fi - - # Get just the apt packages that are required to build all the pythons - # shellcheck disable=SC2086 - __apt_get_install_noinput ${__PACKAGES} || return 1 - # Install the pythons from requirements (only zmq for now) - __install_pip_deps "${_SALT_GIT_CHECKOUT_DIR}/requirements/zeromq.txt" || return 1 - else - install_ubuntu_stable_deps || return 1 - - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PACKAGES="${__PACKAGES} python3-setuptools" - else - # There is no m2crypto package for Py3 at this time - only install for Py2 - __PACKAGES="${__PACKAGES} python-m2crypto" - fi - - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-crypto python${PY_PKG_VER}-jinja2" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-msgpack python${PY_PKG_VER}-requests" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-tornado python${PY_PKG_VER}-yaml" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-zmq" - __PACKAGES="${__PACKAGES} python-concurrent.futures" - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - # Install python-libcloud if asked to - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-libcloud" - fi - - # shellcheck disable=SC2086 - __apt_get_install_noinput ${__PACKAGES} || return 1 - fi - else - __PACKAGES="python${PY_PKG_VER}-dev python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" - if [ "$DISTRO_MAJOR_VERSION" -ge 22 ]; then - __PACKAGES="${__PACKAGES} g++" - fi - # shellcheck disable=SC2086 - __apt_get_install_noinput ${__PACKAGES} || return 1 + __PACKAGES="python${PY_PKG_VER}-dev python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" + if [ "$DISTRO_MAJOR_VERSION" -ge 22 ]; then + __PACKAGES="${__PACKAGES} g++" fi + ## include hwclock if not part of base OS (23.10 and up) + if [ ! -f /usr/sbin/hwclock ]; then + __PACKAGES="${__PACKAGES} util-linux-extra" + fi + + # shellcheck disable=SC2086 + __apt_get_install_noinput ${__PACKAGES} || return 1 + # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" CONFIG_SALT_FUNC="config_salt" fi @@ -3344,14 +3195,8 @@ install_ubuntu_git_deps() { } install_ubuntu_onedir_deps() { - if [ "${_SLEEP}" -eq "${__DEFAULT_SLEEP}" ] && [ "$DISTRO_MAJOR_VERSION" -lt 16 ]; then - # The user did not pass a custom sleep value as an argument, let's increase the default value - echodebug "On Ubuntu systems we increase the default sleep value to 10." - echodebug "See https://github.com/saltstack/salt/issues/12248 for more info." - _SLEEP=10 - fi - if [ $_START_DAEMONS -eq $BS_FALSE ]; then + if [ "$_START_DAEMONS" -eq $BS_FALSE ]; then echowarn "Not starting daemons on Debian based distributions is not working mostly because starting them is the default behaviour." fi @@ -3362,7 +3207,8 @@ install_ubuntu_onedir_deps() { if [ "${_UPGRADE_SYS}" -eq $BS_TRUE ]; then if [ "${_INSECURE_DL}" -eq $BS_TRUE ]; then - if [ "$DISTRO_MAJOR_VERSION" -ge 20 ] || [ "$DISTRO_MAJOR_VERSION" -ge 21 ]; then + ## apt-key is deprecated + if [ "$DISTRO_MAJOR_VERSION" -ge 20 ]; then __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring && apt-get update || return 1 else __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring && @@ -3382,6 +3228,7 @@ install_ubuntu_onedir_deps() { } install_ubuntu_stable() { + __PACKAGES="" if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then @@ -3397,6 +3244,10 @@ install_ubuntu_stable() { __PACKAGES="${__PACKAGES} salt-syndic" fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api" + fi + # shellcheck disable=SC2086 __apt_get_install_noinput ${__PACKAGES} || return 1 @@ -3404,6 +3255,7 @@ install_ubuntu_stable() { } install_ubuntu_git() { + # Activate virtualenv before install if [ "${_VIRTUALENV_DIR}" != "null" ]; then __activate_virtualenv || return 1 @@ -3412,43 +3264,28 @@ install_ubuntu_git() { if [ -n "$_PY_EXE" ]; then _PYEXE=${_PY_EXE} else - _PYEXE=python2.7 + echoerror "Python 2 is no longer supported, only Python 3" + return 1 fi - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - # We can use --prefix on debian based ditributions - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - _POST_NEON_PIP_INSTALL_ARGS="--target=/usr/lib/python3/dist-packages --install-option=--install-scripts=/usr/bin" - else - _POST_NEON_PIP_INSTALL_ARGS="--target=/usr/lib/python2.7/dist-packages --install-option=--install-scripts=/usr/bin" - fi - _POST_NEON_PIP_INSTALL_ARGS="" - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - cd "${_SALT_GIT_CHECKOUT_DIR}" || return 1 + _PIP_INSTALL_ARGS="" + __install_salt_from_repo "${_PY_EXE}" || return 1 + cd "${_SALT_GIT_CHECKOUT_DIR}" || return 1 - # Account for new path for services files in later releases - if [ -d "pkg/common" ]; then - _SERVICE_DIR="pkg/common" - else - _SERVICE_DIR="pkg" - fi - - sed -i 's:/usr/bin:/usr/local/bin:g' ${_SERVICE_DIR}/*.service - return 0 - fi - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then - # shellcheck disable=SC2086 - "${_PYEXE}" setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install --install-layout=deb || return 1 + # Account for new path for services files in later releases + if [ -d "pkg/common" ]; then + _SERVICE_DIR="pkg/common" else - # shellcheck disable=SC2086 - "${_PYEXE}" setup.py ${SETUP_PY_INSTALL_ARGS} install --install-layout=deb || return 1 + _SERVICE_DIR="pkg" fi + sed -i 's:/usr/bin:/usr/local/bin:g' "${_SERVICE_DIR}"/*.service return 0 + } install_ubuntu_onedir() { + __PACKAGES="" if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then @@ -3464,6 +3301,10 @@ install_ubuntu_onedir() { __PACKAGES="${__PACKAGES} salt-syndic" fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api" + fi + # shellcheck disable=SC2086 __apt_get_install_noinput ${__PACKAGES} || return 1 @@ -3471,6 +3312,7 @@ install_ubuntu_onedir() { } install_ubuntu_stable_post() { + for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot [ $fname = "api" ] && continue @@ -3480,7 +3322,8 @@ install_ubuntu_stable_post() { [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /bin/systemctl ]; then + ## if [ -f /bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then # Using systemd /bin/systemctl is-enabled salt-$fname.service > /dev/null 2>&1 || ( /bin/systemctl preset salt-$fname.service > /dev/null 2>&1 && @@ -3497,6 +3340,7 @@ install_ubuntu_stable_post() { } install_ubuntu_git_post() { + for fname in api master minion syndic; do # Skip if not meant to be installed [ $fname = "api" ] && \ @@ -3512,7 +3356,7 @@ install_ubuntu_git_post() { _SERVICE_DIR="${_SALT_GIT_CHECKOUT_DIR}/pkg" fi - if [ -f /bin/systemctl ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then __copyfile "${_SERVICE_DIR}/salt-${fname}.service" "/lib/systemd/system/salt-${fname}.service" # Skip salt-api since the service should be opt-in and not necessarily started on boot @@ -3521,21 +3365,6 @@ install_ubuntu_git_post() { systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service) sleep 1 systemctl daemon-reload - elif [ -f /sbin/initctl ]; then - _upstart_conf="/etc/init/salt-$fname.conf" - # We have upstart support - echodebug "There's upstart support" - if [ ! -f $_upstart_conf ]; then - # upstart does not know about our service, let's copy the proper file - echowarn "Upstart does not appear to know about salt-$fname" - echodebug "Copying ${_SERVICE_DIR}/salt-$fname.upstart to $_upstart_conf" - __copyfile "${_SERVICE_DIR}/salt-${fname}.upstart" "$_upstart_conf" - # Set service to know about virtualenv - if [ "${_VIRTUALENV_DIR}" != "null" ]; then - echo "SALT_USE_VIRTUALENV=${_VIRTUALENV_DIR}" > /etc/default/salt-${fname} - fi - /sbin/initctl reload-configuration || return 1 - fi # No upstart support in Ubuntu!? elif [ -f "${_SALT_GIT_CHECKOUT_DIR}/pkg/salt-${fname}.init" ]; then echodebug "There's NO upstart support!?" @@ -3548,7 +3377,7 @@ install_ubuntu_git_post() { update-rc.d salt-$fname defaults else - echoerror "Neither upstart nor init.d was setup for salt-$fname" + echoerror "No init.d was setup for salt-$fname" fi done @@ -3556,13 +3385,12 @@ install_ubuntu_git_post() { } install_ubuntu_restart_daemons() { - [ $_START_DAEMONS -eq $BS_FALSE ] && return - # Ensure upstart configs / systemd units are loaded - if [ -f /bin/systemctl ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then + [ "$_START_DAEMONS" -eq $BS_FALSE ] && return + + # Ensure systemd units are loaded + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then systemctl daemon-reload - elif [ -f /sbin/initctl ]; then - /sbin/initctl reload-configuration fi for fname in api master minion syndic; do @@ -3574,7 +3402,7 @@ install_ubuntu_restart_daemons() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /bin/systemctl ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then echodebug "There's systemd support while checking salt-$fname" systemctl stop salt-$fname > /dev/null 2>&1 systemctl start salt-$fname.service && continue @@ -3586,18 +3414,6 @@ install_ubuntu_restart_daemons() { fi fi - if [ -f /sbin/initctl ]; then - echodebug "There's upstart support while checking salt-$fname" - - if status salt-$fname 2>/dev/null | grep -q running; then - stop salt-$fname || (echodebug "Failed to stop salt-$fname" && return 1) - fi - - start salt-$fname && continue - # We failed to start the service, let's test the SysV code below - echodebug "Failed to start salt-$fname using Upstart" - fi - if [ ! -f /etc/init.d/salt-$fname ]; then echoerror "No init.d support for salt-$fname was found" return 1 @@ -3611,6 +3427,7 @@ install_ubuntu_restart_daemons() { } install_ubuntu_check_services() { + for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot [ $fname = "api" ] && continue @@ -3620,10 +3437,8 @@ install_ubuntu_check_services() { [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /bin/systemctl ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then __check_services_systemd salt-$fname || return 1 - elif [ -f /sbin/initctl ] && [ -f /etc/init/salt-${fname}.conf ]; then - __check_services_upstart salt-$fname || return 1 elif [ -f /etc/init.d/salt-$fname ]; then __check_services_debian salt-$fname || return 1 fi @@ -3641,12 +3456,12 @@ install_ubuntu_check_services() { # Debian Install Functions # __install_saltstack_debian_repository() { - DEBIAN_RELEASE="$DISTRO_MAJOR_VERSION" - DEBIAN_CODENAME="$DISTRO_CODENAME" - __PY_VERSION_REPO="apt" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PY_VERSION_REPO="py3" + echodebug "__install_saltstack_debian_repository() entry" + + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi # Install downloader backend for GPG keys fetching @@ -3665,22 +3480,37 @@ __install_saltstack_debian_repository() { # shellcheck disable=SC2086,SC2090 __apt_get_install_noinput ${__PACKAGES} || return 1 - # amd64 is just a part of repository URI, 32-bit pkgs are hosted under the same location - SALTSTACK_DEBIAN_URL="${HTTP_VAL}://${_REPO_URL}/${__PY_VERSION_REPO}/debian/${DEBIAN_RELEASE}/${__REPO_ARCH}/${STABLE_REV}" - echo "$__REPO_ARCH_DEB $SALTSTACK_DEBIAN_URL $DEBIAN_CODENAME main" > "/etc/apt/sources.list.d/salt.list" - - __apt_key_fetch "$SALTSTACK_DEBIAN_URL/salt-archive-keyring.gpg" || return 1 + ## SALTSTACK_DEBIAN_URL="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_DIR}/${__PY_VERSION_REPO}/debian/${DEBIAN_RELEASE}/${__REPO_ARCH}/${STABLE_REV}" + ## echo "$__REPO_ARCH_DEB $SALTSTACK_DEBIAN_URL $DEBIAN_CODENAME main" > "/etc/apt/sources.list.d/salt.list" + ## __apt_key_fetch "$SALTSTACK_DEBIAN_URL/SALT-PROJECT-GPG-PUBKEY-2023.gpg" || return 1 + ## __wait_for_apt apt-get update || return 1 + __fetch_url "/etc/apt/sources.list.d/salt.sources" "https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources" + __apt_key_fetch "${HTTP_VAL}://${_REPO_URL}/api/security/keypair/SaltProjectKey/public" || return 1 __wait_for_apt apt-get update || return 1 + + if [ "$STABLE_REV" != "latest" ]; then + # latest is default + STABLE_REV_MAJOR=$(echo "$STABLE_REV" | cut -d '.' -f 1) + if [ "$STABLE_REV_MAJOR" -eq "3006" ]; then + echo "Package: salt-*" > /etc/apt/preferences.d/salt-pin-1001 + echo "Pin: version 3006.*" >> /etc/apt/preferences.d/salt-pin-1001 + echo "Pin-Priority: 1001" >> /etc/apt/preferences.d/salt-pin-1001 + elif [ "$STABLE_REV_MAJOR" -eq "3007" ]; then + echo "Package: salt-*" > /etc/apt/preferences.d/salt-pin-1001 + echo "Pin: version 3007.*" >> /etc/apt/preferences.d/salt-pin-1001 + echo "Pin-Priority: 1001" >> /etc/apt/preferences.d/salt-pin-1001 + fi + fi } __install_saltstack_debian_onedir_repository() { - DEBIAN_RELEASE="$DISTRO_MAJOR_VERSION" - DEBIAN_CODENAME="$DISTRO_CODENAME" - __PY_VERSION_REPO="apt" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PY_VERSION_REPO="py3" + echodebug "__install_saltstack_debian_onedir_repository() entry" + + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi # Install downloader backend for GPG keys fetching @@ -3699,80 +3529,30 @@ __install_saltstack_debian_onedir_repository() { # shellcheck disable=SC2086,SC2090 __apt_get_install_noinput ${__PACKAGES} || return 1 - # amd64 is just a part of repository URI, 32-bit pkgs are hosted under the same location - SALTSTACK_DEBIAN_URL="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_DIR}/${__PY_VERSION_REPO}/debian/${DEBIAN_RELEASE}/${__REPO_ARCH}/${ONEDIR_REV}/" - if [ "${ONEDIR_REV}" = "nightly" ] ; then - SALTSTACK_DEBIAN_URL="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_NIGHTLY_DIR}/${__PY_VERSION_REPO}/debian/${DEBIAN_RELEASE}/${__REPO_ARCH}/" - fi - echo "$__REPO_ARCH_DEB $SALTSTACK_DEBIAN_URL $DEBIAN_CODENAME main" > "/etc/apt/sources.list.d/salt.list" - - if [ "$(echo "${ONEDIR_REV}" | grep -E '(3004|3005)')" != "" ]; then - __apt_key_fetch "${SALTSTACK_DEBIAN_URL}salt-archive-keyring.gpg" || return 1 - elif [ "$(echo "${ONEDIR_REV}" | grep -E '(latest|nightly)')" != "" ]; then - __apt_key_fetch "${SALTSTACK_DEBIAN_URL}salt-archive-keyring.gpg" || \ - __apt_key_fetch "${SALTSTACK_DEBIAN_URL}SALT-PROJECT-GPG-PUBKEY-2023.gpg" || return 1 - else - __apt_key_fetch "${SALTSTACK_DEBIAN_URL}SALT-PROJECT-GPG-PUBKEY-2023.gpg" || return 1 - fi - - __wait_for_apt apt-get update || return 1 -} - -install_debian_deps() { - if [ $_START_DAEMONS -eq $BS_FALSE ]; then - echowarn "Not starting daemons on Debian based distributions is not working mostly because starting them is the default behaviour." - fi - - # No user interaction, libc6 restart services for example - export DEBIAN_FRONTEND=noninteractive - + __fetch_url "/etc/apt/sources.list.d/salt.sources" "https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources" + __apt_key_fetch "${HTTP_VAL}://${_REPO_URL}/api/security/keypair/SaltProjectKey/public" || return 1 __wait_for_apt apt-get update || return 1 - if [ "${_UPGRADE_SYS}" -eq $BS_TRUE ]; then - # Try to update GPG keys first if allowed - if [ "${_INSECURE_DL}" -eq $BS_TRUE ]; then - if [ "$DISTRO_MAJOR_VERSION" -ge 10 ]; then - __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring && apt-get update || return 1 - else - __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring && - apt-key update && apt-get update || return 1 - fi + if [ "$ONEDIR_REV" != "latest" ]; then + # latest is default + ONEDIR_REV_MAJOR=$(echo "$ONEDIR_REV" | cut -d '.' -f 1) + if [ "$ONEDIR_REV_MAJOR" -eq "3006" ]; then + echo "Package: salt-*" > /etc/apt/preferences.d/salt-pin-1001 + echo "Pin: version 3006.*" >> /etc/apt/preferences.d/salt-pin-1001 + echo "Pin-Priority: 1001" >> /etc/apt/preferences.d/salt-pin-1001 + elif [ "$ONEDIR_REV_MAJOR" -eq "3007" ]; then + echo "Package: salt-*" > /etc/apt/preferences.d/salt-pin-1001 + echo "Pin: version 3007.*" >> /etc/apt/preferences.d/salt-pin-1001 + echo "Pin-Priority: 1001" >> /etc/apt/preferences.d/salt-pin-1001 fi - - __apt_get_upgrade_noinput || return 1 fi - - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - PY_PKG_VER=3 - else - PY_PKG_VER="" - fi - - # Additionally install procps and pciutils which allows for Docker bootstraps. See 366#issuecomment-39666813 - __PACKAGES='procps pciutils' - - # YAML module is used for generating custom master/minion configs - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-yaml" - - # shellcheck disable=SC2086 - __apt_get_install_noinput ${__PACKAGES} || return 1 - - if [ "$_DISABLE_REPOS" -eq "$BS_FALSE" ] || [ "$_CUSTOM_REPO_URL" != "null" ]; then - __check_dpkg_architecture || return 1 - __install_saltstack_debian_repository || return 1 - fi - - if [ "${_EXTRA_PACKAGES}" != "" ]; then - echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}" - # shellcheck disable=SC2086 - __apt_get_install_noinput ${_EXTRA_PACKAGES} || return 1 - fi - - return 0 } install_debian_onedir_deps() { - if [ $_START_DAEMONS -eq $BS_FALSE ]; then + + echodebug "install_debian_onedir_git_deps() entry" + + if [ "$_START_DAEMONS" -eq $BS_FALSE ]; then echowarn "Not starting daemons on Debian based distributions is not working mostly because starting them is the default behaviour." fi @@ -3795,10 +3575,9 @@ install_debian_onedir_deps() { __apt_get_upgrade_noinput || return 1 fi - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - PY_PKG_VER=3 - else - PY_PKG_VER="" + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi # Additionally install procps and pciutils which allows for Docker bootstraps. See 366#issuecomment-39666813 @@ -3824,75 +3603,14 @@ install_debian_onedir_deps() { return 0 } -install_debian_git_pre() { - if ! __check_command_exists git; then - __apt_get_install_noinput git || return 1 - fi - - if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then - __apt_get_install_noinput ca-certificates - fi - - __git_clone_and_checkout || return 1 - - # Let's trigger config_salt() - if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" - CONFIG_SALT_FUNC="config_salt" - fi -} - install_debian_git_deps() { - install_debian_deps || return 1 - install_debian_git_pre || return 1 - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - PY_PKG_VER=3 - else - PY_PKG_VER="" - fi + echodebug "install_debian_git_deps() entry" - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - __PACKAGES="libzmq3 libzmq3-dev lsb-release python-apt python-backports.ssl-match-hostname" - __PACKAGES="${__PACKAGES} python-crypto python-jinja2 python-msgpack python-m2crypto" - __PACKAGES="${__PACKAGES} python-requests python-tornado python-yaml python-zmq" - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - # Install python-libcloud if asked to - __PACKAGES="${__PACKAGES} python-libcloud" - fi - - # shellcheck disable=SC2086 - __apt_get_install_noinput ${__PACKAGES} || return 1 - else - __PACKAGES="python${PY_PKG_VER}-dev python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" - echodebug "install_debian_git_deps() Installing ${__PACKAGES}" - # shellcheck disable=SC2086 - __apt_get_install_noinput ${__PACKAGES} || return 1 - fi - - return 0 -} - -install_debian_7_git_deps() { - install_debian_deps || return 1 - install_debian_git_deps || return 1 - - return 0 -} - -install_debian_8_git_deps() { - - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - echodebug "CALLING install_debian_git_deps" - install_debian_git_deps || return 1 - return 0 - fi - - install_debian_deps || return 1 + __wait_for_apt apt-get update || return 1 if ! __check_command_exists git; then - __apt_get_install_noinput git || return 1 + __apt_get_install_noinput git-core || return 1 fi if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then @@ -3901,124 +3619,28 @@ install_debian_8_git_deps() { __git_clone_and_checkout || return 1 - __PACKAGES="libzmq3 libzmq3-dev lsb-release python-apt python-crypto python-jinja2" - __PACKAGES="${__PACKAGES} python-m2crypto python-msgpack python-requests python-systemd" - __PACKAGES="${__PACKAGES} python-yaml python-zmq python-concurrent.futures" - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - # Install python-libcloud if asked to - __PACKAGES="${__PACKAGES} python-libcloud" + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi - __PIP_PACKAGES='' - if (__check_pip_allowed >/dev/null 2>&1); then - __PIP_PACKAGES='tornado<5.0' - # Install development environment for building tornado Python module - __PACKAGES="${__PACKAGES} build-essential python-dev" - - if ! __check_command_exists pip; then - __PACKAGES="${__PACKAGES} python-pip" - fi - # Attempt to configure backports repo on non-x86_64 system - elif [ $_DISABLE_REPOS -eq $BS_FALSE ] && [ "$DPKG_ARCHITECTURE" != "amd64" ]; then - # Check if Debian Backports repo already configured - if ! apt-cache policy | grep -q 'Debian Backports'; then - echo 'deb http://httpredir.debian.org/debian jessie-backports main' > \ - /etc/apt/sources.list.d/backports.list - fi - - __wait_for_apt apt-get update || return 1 - - # python-tornado package should be installed from backports repo - __PACKAGES="${__PACKAGES} python-backports.ssl-match-hostname python-tornado/jessie-backports" - else - __PACKAGES="${__PACKAGES} python-backports.ssl-match-hostname python-tornado" - fi + __PACKAGES="python${PY_PKG_VER}-dev python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" + echodebug "install_debian_git_deps() Installing ${__PACKAGES}" # shellcheck disable=SC2086 __apt_get_install_noinput ${__PACKAGES} || return 1 - if [ "${__PIP_PACKAGES}" != "" ]; then - # shellcheck disable=SC2086,SC2090 - pip install -U ${__PIP_PACKAGES} || return 1 - fi - # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" CONFIG_SALT_FUNC="config_salt" fi return 0 } -install_debian_9_git_deps() { - - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - install_debian_git_deps || return 1 - return 0 - fi - - install_debian_deps || return 1 - install_debian_git_pre || return 1 - - __PACKAGES="libzmq5 lsb-release" - - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - PY_PKG_VER=3 - else - PY_PKG_VER="" - - # These packages are PY2-ONLY - __PACKAGES="${__PACKAGES} python-backports-abc python-m2crypto python-concurrent.futures" - fi - - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-apt python${PY_PKG_VER}-crypto python${PY_PKG_VER}-jinja2" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-msgpack python${PY_PKG_VER}-requests python${PY_PKG_VER}-systemd" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-tornado python${PY_PKG_VER}-yaml python${PY_PKG_VER}-zmq" - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - # Install python-libcloud if asked to - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-libcloud" - fi - - # shellcheck disable=SC2086 - __apt_get_install_noinput ${__PACKAGES} || return 1 - - return 0 -} - -install_debian_10_git_deps() { - - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - install_debian_git_deps || return 1 - return 0 - fi - - install_debian_deps || return 1 - install_debian_git_pre || return 1 - - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - _py=${_PY_EXE} - PY_PKG_VER=3 - __PACKAGES="python${PY_PKG_VER}-distutils" - else - _py="python" - PY_PKG_VER="" - __PACKAGES="" - fi - - __install_tornado_pip ${_py}|| return 1 - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-msgpack python${PY_PKG_VER}-jinja2" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-tornado python${PY_PKG_VER}-yaml python${PY_PKG_VER}-zmq" - - # shellcheck disable=SC2086 - __apt_get_install_noinput ${__PACKAGES} || return 1 - - return 0 -} - install_debian_stable() { + __PACKAGES="" if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then @@ -4034,81 +3656,70 @@ install_debian_stable() { __PACKAGES="${__PACKAGES} salt-syndic" fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api" + fi + # shellcheck disable=SC2086 __apt_get_install_noinput ${__PACKAGES} || return 1 return 0 } -install_debian_7_stable() { - install_debian_stable || return 1 +install_debian_11_git_deps() { + + install_debian_git_deps || return 1 return 0 } -install_debian_8_stable() { - install_debian_stable || return 1 - return 0 -} +install_debian_12_git_deps() { -install_debian_9_stable() { - install_debian_stable || return 1 + install_debian_git_deps || return 1 return 0 } install_debian_git() { + if [ -n "$_PY_EXE" ]; then _PYEXE=${_PY_EXE} else - _PYEXE=python + ## _PYEXE=python + echoerror "Python 2 is no longer supported, only Py3 packages" + return 1 fi - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - # We can use --prefix on debian based ditributions - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - _POST_NEON_PIP_INSTALL_ARGS="--target=/usr/lib/python3/dist-packages --install-option=--install-scripts=/usr/bin" - else - _POST_NEON_PIP_INSTALL_ARGS="--target=/usr/lib/python2.7/dist-packages --install-option=--install-scripts=/usr/bin" - fi - _POST_NEON_PIP_INSTALL_ARGS="" - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - cd "${_SALT_GIT_CHECKOUT_DIR}" || return 1 + # We can use --prefix on debian based ditributions - # Account for new path for services files in later releases - if [ -d "pkg/common" ]; then - _SERVICE_DIR="pkg/common" - else - _SERVICE_DIR="pkg" - fi + _PIP_INSTALL_ARGS="" - sed -i 's:/usr/bin:/usr/local/bin:g' ${_SERVICE_DIR}/*.service - return 0 - fi + __install_salt_from_repo "${_PY_EXE}" || return 1 + cd "${_SALT_GIT_CHECKOUT_DIR}" || return 1 - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then - # shellcheck disable=SC2086 - "${_PYEXE}" setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install --install-layout=deb || return 1 + # Account for new path for services files in later releases + if [ -d "pkg/common" ]; then + _SERVICE_DIR="pkg/common" else - # shellcheck disable=SC2086 - "${_PYEXE}" setup.py ${SETUP_PY_INSTALL_ARGS} install --install-layout=deb || return 1 + _SERVICE_DIR="pkg" fi + + sed -i 's:/usr/bin:/usr/local/bin:g' "${_SERVICE_DIR}"/*.service + return 0 } -install_debian_7_git() { +install_debian_11_git() { + install_debian_git || return 1 return 0 } -install_debian_8_git() { - install_debian_git || return 1 - return 0 -} +install_debian_12_git() { -install_debian_9_git() { install_debian_git || return 1 return 0 } install_debian_onedir() { + __PACKAGES="" if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then @@ -4124,6 +3735,10 @@ install_debian_onedir() { __PACKAGES="${__PACKAGES} salt-syndic" fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api" + fi + # shellcheck disable=SC2086 __apt_get_install_noinput ${__PACKAGES} || return 1 @@ -4131,6 +3746,7 @@ install_debian_onedir() { } install_debian_git_post() { + for fname in api master minion syndic; do # Skip if not meant to be installed [ "$fname" = "api" ] && \ @@ -4147,7 +3763,7 @@ install_debian_git_post() { fi # Configure SystemD for Debian 8 "Jessie" and later - if [ -f /bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then if [ ! -f /lib/systemd/system/salt-${fname}.service ] || \ { [ -f /lib/systemd/system/salt-${fname}.service ] && [ $_FORCE_OVERWRITE -eq $BS_TRUE ]; }; then if [ -f "${_SERVICE_DIR}/salt-${fname}.service" ]; then @@ -4165,29 +3781,12 @@ install_debian_git_post() { /bin/systemctl enable "salt-${fname}.service" SYSTEMD_RELOAD=$BS_TRUE - - # Install initscripts for Debian 7 "Wheezy" - elif [ ! -f "/etc/init.d/salt-$fname" ] || \ - { [ -f "/etc/init.d/salt-$fname" ] && [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; }; then - __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/deb/salt-${fname}.init" "/etc/init.d/salt-${fname}" - __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/deb/salt-${fname}.environment" "/etc/default/salt-${fname}" - - if [ ! -f "/etc/init.d/salt-${fname}" ]; then - echowarn "The init script for salt-${fname} was not found, skipping it..." - continue - fi - - chmod +x "/etc/init.d/salt-${fname}" - - # Skip salt-api since the service should be opt-in and not necessarily started on boot - [ "$fname" = "api" ] && continue - - update-rc.d "salt-${fname}" defaults fi done } install_debian_2021_post() { + # Kali 2021 (debian derivative) disables all network services by default # Using archlinux post function to enable salt systemd services install_arch_linux_post || return 1 @@ -4195,6 +3794,7 @@ install_debian_2021_post() { } install_debian_restart_daemons() { + [ "$_START_DAEMONS" -eq $BS_FALSE ] && return 0 for fname in api master minion syndic; do @@ -4206,8 +3806,8 @@ install_debian_restart_daemons() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /bin/systemctl ]; then - # Debian 8 uses systemd + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then + # Debian 8 and above uses systemd /bin/systemctl stop salt-$fname > /dev/null 2>&1 /bin/systemctl start salt-$fname.service && continue if [ "$_ECHO_DEBUG" -eq $BS_TRUE ]; then @@ -4223,6 +3823,7 @@ install_debian_restart_daemons() { } install_debian_check_services() { + for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot [ $fname = "api" ] && continue @@ -4232,7 +3833,7 @@ install_debian_check_services() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then __check_services_systemd salt-$fname || return 1 elif [ -f /etc/init.d/salt-$fname ]; then __check_services_debian salt-$fname || return 1 @@ -4251,54 +3852,55 @@ install_debian_check_services() { # __install_saltstack_fedora_onedir_repository() { - if [ "$ITYPE" = "stable" ]; then - REPO_REV="$ONEDIR_REV" - else - REPO_REV="latest" + + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi - __PY_VERSION_REPO="yum" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PY_VERSION_REPO="py3" - fi - - GPG_KEY="SALT-PROJECT-GPG-PUBKEY-2023.pub" - - REPO_FILE="/etc/yum.repos.d/salt.repo" - - if [ ! -s "$REPO_FILE" ] || [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; then - FETCH_URL="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_DIR}/${__PY_VERSION_REPO}/fedora/${DISTRO_MAJOR_VERSION}/${CPU_ARCH_L}/${ONEDIR_REV}" - if [ "${ONEDIR_REV}" = "nightly" ] ; then - FETCH_URL="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_NIGHTLY_DIR}/${__PY_VERSION_REPO}/fedora/${DISTRO_MAJOR_VERSION}/${CPU_ARCH_L}/" + if [ ! -s "$YUM_REPO_FILE" ] || [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; then + FETCH_URL="https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo" + __fetch_url "${YUM_REPO_FILE}" "${FETCH_URL}" + if [ "$ONEDIR_REV" != "latest" ]; then + # 3006.x is default + REPO_REV_MAJOR=$(echo "$ONEDIR_REV" | cut -d '.' -f 1) + if [ "$REPO_REV_MAJOR" -eq "3007" ]; then + # Enable the Salt 3007 STS repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-3007-sts + fi + else + # Enable the Salt LATEST repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-latest fi + dnf clean expire-cache || return 1 - __fetch_url "${REPO_FILE}" "${FETCH_URL}.repo" - - __rpm_import_gpg "${FETCH_URL}/${GPG_KEY}" || return 1 - - yum clean metadata || return 1 - elif [ "$REPO_REV" != "latest" ]; then + elif [ "$ONEDIR_REV" != "latest" ]; then echowarn "salt.repo already exists, ignoring salt version argument." - echowarn "Use -F (forced overwrite) to install $REPO_REV." + echowarn "Use -F (forced overwrite) to install $ONEDIR_REV." fi return 0 } install_fedora_deps() { + if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then dnf -y update || return 1 fi __PACKAGES="${__PACKAGES:=}" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -lt 3 ]; then - echoerror "There are no Python 2 stable packages for Fedora, only Py3 packages" + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" return 1 fi # Salt on Fedora is Py3 PY_PKG_VER=3 + ## find no dnf-utils in Fedora packaging archives and yum-utils EL7 and F30, none after + ## but find it on 8 and 9 Centos Stream __PACKAGES="${__PACKAGES} dnf-utils libyaml procps-ng python${PY_PKG_VER}-crypto python${PY_PKG_VER}-jinja2" __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-msgpack python${PY_PKG_VER}-requests python${PY_PKG_VER}-zmq" __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-pip python${PY_PKG_VER}-m2crypto python${PY_PKG_VER}-pyyaml" @@ -4313,84 +3915,11 @@ install_fedora_deps() { return 0 } -install_fedora_stable() { - if [ "$STABLE_REV" = "latest" ]; then - __SALT_VERSION="" - else - __SALT_VERSION="$(dnf list --showduplicates salt | grep "$STABLE_REV" | head -n 1 | awk '{print $2}')" - if [ "x${__SALT_VERSION}" = "x" ]; then - echoerror "Could not find a stable install for Salt ${STABLE_REV}" - exit 1 - fi - echoinfo "Installing Stable Package Version ${__SALT_VERSION}" - __SALT_VERSION="-${__SALT_VERSION}" - fi - __PACKAGES="" - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then - __PACKAGES="${__PACKAGES} salt-cloud${__SALT_VERSION}" - fi - if [ "$_INSTALL_MASTER" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} salt-master${__SALT_VERSION}" - fi - if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} salt-minion${__SALT_VERSION}" - fi - if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} salt-syndic${__SALT_VERSION}" - fi - - # shellcheck disable=SC2086 - __dnf_install_noinput ${__PACKAGES} || return 1 - - __python="python3" - if ! __check_command_exists python3; then - echoerror "Could not find a python3 binary?!" - return 1 - fi - - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - __check_pip_allowed "You need to allow pip based installations (-P) for Tornado <5.0 in order to install Salt" - __installed_tornado_rpm=$(rpm -qa | grep python${PY_PKG_VER}-tornado) - if [ -n "${__installed_tornado_rpm}" ]; then - echodebug "Removing system package ${__installed_tornado_rpm}" - rpm -e --nodeps "${__installed_tornado_rpm}" || return 1 - fi - __get_site_packages_dir_code=$(cat << EOM -import site -print([d for d in site.getsitepackages() if d.startswith('/usr/lib/python')][0]) -EOM -) - __target_path=$(${__python} -c "${__get_site_packages_dir_code}") - echodebug "Running '${__python}' -m pip install --target ${__target_path} 'tornado<5.0'" - "${__python}" -m pip install --target "${__target_path}" "tornado<5" || return 1 - fi - - return 0 -} - -install_fedora_stable_post() { - for fname in api master minion syndic; do - # Skip salt-api since the service should be opt-in and not necessarily started on boot - [ $fname = "api" ] && continue - - # Skip if not meant to be installed - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - - systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service) - sleep 1 - systemctl daemon-reload - done -} - install_fedora_git_deps() { - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - # Packages are named python3- - PY_PKG_VER=3 - else - PY_PKG_VER=2 + + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi __PACKAGES="" @@ -4409,79 +3938,40 @@ install_fedora_git_deps() { __git_clone_and_checkout || return 1 - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - - if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then - __PACKAGES="${__PACKAGES} ca-certificates" - fi - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-libcloud python${PY_PKG_VER}-netaddr" - fi - - install_fedora_deps || return 1 - - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - if __check_command_exists python3; then - __python="python3" - fi - elif [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 2 ]; then - if __check_command_exists python2; then - __python="python2" - fi - else - if ! __check_command_exists python; then - echoerror "Unable to find a python binary?!" - return 1 - fi - # Let's hope it's the right one - __python="python" - fi - - grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" | while IFS=' - ' read -r dep; do - echodebug "Running '${__python}' -m pip install '${dep}'" - "${__python}" -m pip install "${dep}" || return 1 - done - else - __PACKAGES="python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" - if [ "${DISTRO_VERSION}" -ge 35 ]; then - __PACKAGES="${__PACKAGES} gcc-c++" - fi - # shellcheck disable=SC2086 - __dnf_install_noinput ${__PACKAGES} || return 1 - fi + __PACKAGES="python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc gcc-c++" + # shellcheck disable=SC2086 + __dnf_install_noinput ${__PACKAGES} || return 1 # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" CONFIG_SALT_FUNC="config_salt" fi + _fedora_dep="contextvars" + echodebug "Running '${_PY_EXE} -m pip install --upgrade ${_fedora_dep}'" + ${_PY_EXE} -m pip install --upgrade "${_fedora_dep}" + return 0 } install_fedora_git() { + if [ "${_PY_EXE}" != "" ]; then _PYEXE=${_PY_EXE} echoinfo "Using the following python version: ${_PY_EXE} to install salt" else - _PYEXE='python2' + echoerror "Python 2 is no longer supported, only Py3 packages" + return 1 fi - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - return 0 - fi - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then - ${_PYEXE} setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install --prefix=/usr || return 1 - else - ${_PYEXE} setup.py ${SETUP_PY_INSTALL_ARGS} install --prefix=/usr || return 1 - fi + __install_salt_from_repo "${_PY_EXE}" || return 1 return 0 + } install_fedora_git_post() { + for fname in api master minion syndic; do # Skip if not meant to be installed [ $fname = "api" ] && \ @@ -4509,10 +3999,12 @@ install_fedora_git_post() { systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service) sleep 1 systemctl daemon-reload + done } install_fedora_restart_daemons() { + [ $_START_DAEMONS -eq $BS_FALSE ] && return for fname in api master minion syndic; do @@ -4535,6 +4027,7 @@ install_fedora_restart_daemons() { } install_fedora_check_services() { + for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot [ $fname = "api" ] && continue @@ -4567,19 +4060,13 @@ install_fedora_onedir_deps() { fi # If -R was passed, we need to configure custom repo url with rsync-ed packages - # Which is still handled in __install_saltstack_rhel_repository. This call has + # Which is still handled in __install_saltstack_rhel_onedir_repository. This call has # its own check in case -r was passed without -R. if [ "$_CUSTOM_REPO_URL" != "null" ]; then __install_saltstack_fedora_onedir_repository || return 1 fi - if [ "$DISTRO_MAJOR_VERSION" -ge 8 ]; then - __PACKAGES="dnf-utils chkconfig" - else - __PACKAGES="yum-utils chkconfig" - fi - - __PACKAGES="${__PACKAGES} procps" + __PACKAGES="dnf-utils chkconfig procps-ng" # shellcheck disable=SC2086 __yum_install_noinput ${__PACKAGES} || return 1 @@ -4596,6 +4083,7 @@ install_fedora_onedir_deps() { install_fedora_onedir() { + STABLE_REV=$ONEDIR_REV #install_fedora_stable || return 1 @@ -4614,6 +4102,10 @@ install_fedora_onedir() { __PACKAGES="${__PACKAGES} salt-syndic" fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api" + fi + # shellcheck disable=SC2086 __yum_install_noinput ${__PACKAGES} || return 1 @@ -4621,11 +4113,26 @@ install_fedora_onedir() { } install_fedora_onedir_post() { + STABLE_REV=$ONEDIR_REV - install_fedora_stable_post || return 1 + + for fname in api master minion syndic; do + # Skip salt-api since the service should be opt-in and not necessarily started on boot + [ $fname = "api" ] && continue + + # Skip if not meant to be installed + [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue + [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue + [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue + + systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service) + sleep 1 + systemctl daemon-reload + done return 0 } + # # Ended Fedora Install Functions # @@ -4635,133 +4142,40 @@ install_fedora_onedir_post() { # # CentOS Install Functions # -__install_saltstack_rhel_repository() { - if [ "${DISTRO_MAJOR_VERSION}" -ge 9 ]; then - echoerror "Old stable repository unavailable on RH variants greater than or equal to 9" - echoerror "Use the stable install type." - exit 1 - fi - - if [ "$ITYPE" = "stable" ]; then - repo_rev="$STABLE_REV" - else - repo_rev="latest" - fi - - __PY_VERSION_REPO="yum" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PY_VERSION_REPO="py3" - fi - - # Avoid using '$releasever' variable for yum. - # Instead, this should work correctly on all RHEL variants. - base_url="${HTTP_VAL}://${_REPO_URL}/${__PY_VERSION_REPO}/redhat/${DISTRO_MAJOR_VERSION}/\$basearch/${repo_rev}/" - if [ "${DISTRO_MAJOR_VERSION}" -eq 7 ]; then - gpg_key="SALTSTACK-GPG-KEY.pub base/RPM-GPG-KEY-CentOS-7" - elif [ "${DISTRO_MAJOR_VERSION}" -ge 9 ]; then - gpg_key="SALTSTACK-GPG-KEY2.pub" - else - gpg_key="SALTSTACK-GPG-KEY.pub" - fi - - gpg_key_urls="" - for key in $gpg_key; do - gpg_key_urls=$(printf "${base_url}${key},%s" "$gpg_key_urls") - done - - repo_file="/etc/yum.repos.d/salt.repo" - - if [ ! -s "$repo_file" ] || [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; then - cat <<_eof > "$repo_file" -[saltstack] -name=SaltStack ${repo_rev} Release Channel for RHEL/CentOS \$releasever -baseurl=${base_url} -skip_if_unavailable=True -gpgcheck=1 -gpgkey=${gpg_key_urls} -enabled=1 -enabled_metadata=1 -_eof - - fetch_url="${HTTP_VAL}://${_REPO_URL}/${__PY_VERSION_REPO}/redhat/${DISTRO_MAJOR_VERSION}/${CPU_ARCH_L}/${repo_rev}/" - for key in $gpg_key; do - __rpm_import_gpg "${fetch_url}${key}" || return 1 - done - - yum clean metadata || return 1 - elif [ "$repo_rev" != "latest" ]; then - echowarn "salt.repo already exists, ignoring salt version argument." - echowarn "Use -F (forced overwrite) to install $repo_rev." - fi - - return 0 -} - __install_saltstack_rhel_onedir_repository() { - if [ "$ITYPE" = "stable" ]; then - repo_rev="$ONEDIR_REV" - else - repo_rev="latest" + + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi - __PY_VERSION_REPO="yum" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PY_VERSION_REPO="py3" - fi - - # Avoid using '$releasever' variable for yum. - # Instead, this should work correctly on all RHEL variants. - base_url="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_DIR}/${__PY_VERSION_REPO}/redhat/${DISTRO_MAJOR_VERSION}/\$basearch/${ONEDIR_REV}/" - if [ "${ONEDIR_REV}" = "nightly" ] ; then - base_url="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_NIGHTLY_DIR}/${__PY_VERSION_REPO}/redhat/${DISTRO_MAJOR_VERSION}/\$basearch/" - fi - if [ "$(echo "${ONEDIR_REV}" | grep -E '(3004|3005)')" != "" ] || [ "${ONEDIR_REV}" = "nightly" ]; then - if [ "${DISTRO_MAJOR_VERSION}" -eq 9 ]; then - gpg_key="SALTSTACK-GPG-KEY2.pub" - else - gpg_key="SALTSTACK-GPG-KEY.pub" - fi - else - gpg_key="SALT-PROJECT-GPG-PUBKEY-2023.pub" - fi - - gpg_key_urls="" - for key in $gpg_key; do - gpg_key_urls=$(printf "${base_url}${key},%s" "$gpg_key_urls") - done - - repo_file="/etc/yum.repos.d/salt.repo" - - if [ ! -s "$repo_file" ] || [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; then - cat <<_eof > "$repo_file" -[saltstack] -name=SaltStack ${repo_rev} Release Channel for RHEL/CentOS \$releasever -baseurl=${base_url} -skip_if_unavailable=True -gpgcheck=1 -gpgkey=${gpg_key_urls} -enabled=1 -enabled_metadata=1 -_eof - - fetch_url="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_DIR}/${__PY_VERSION_REPO}/redhat/${DISTRO_MAJOR_VERSION}/${CPU_ARCH_L}/${ONEDIR_REV}/" - if [ "${ONEDIR_REV}" = "nightly" ] ; then - fetch_url="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_NIGHTLY_DIR}/${__PY_VERSION_REPO}/redhat/${DISTRO_MAJOR_VERSION}/${CPU_ARCH_L}/" + if [ ! -s "$YUM_REPO_FILE" ] || [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; then + FETCH_URL="https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo" + __fetch_url "${YUM_REPO_FILE}" "${FETCH_URL}" + if [ "$ONEDIR_REV" != "latest" ]; then + # 3006.x is default + REPO_REV_MAJOR=$(echo "$ONEDIR_REV" | cut -d '.' -f 1) + if [ "$REPO_REV_MAJOR" -eq "3007" ]; then + # Enable the Salt 3007 STS repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-3007-sts + fi + else + # Enable the Salt LATEST repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-latest fi - for key in $gpg_key; do - __rpm_import_gpg "${fetch_url}${key}" || return 1 - done - - yum clean metadata || return 1 - elif [ "$repo_rev" != "latest" ]; then + dnf clean expire-cache || return 1 + elif [ "$ONEDIR_REV" != "latest" ]; then echowarn "salt.repo already exists, ignoring salt version argument." - echowarn "Use -F (forced overwrite) to install $repo_rev." + echowarn "Use -F (forced overwrite) to install $ONEDIR_REV." fi return 0 } install_centos_stable_deps() { + if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then yum -y update || return 1 fi @@ -4773,48 +4187,18 @@ install_centos_stable_deps() { fi if [ "$_DISABLE_REPOS" -eq "$BS_FALSE" ]; then - __install_saltstack_rhel_repository || return 1 + echoerror "old-stable packages are no longer supported and are End-Of-Life." + return 1 fi # If -R was passed, we need to configure custom repo url with rsync-ed packages - # Which is still handled in __install_saltstack_rhel_repository. This call has + # Which is still handled in __install_saltstack_rhel_onedir_repository. This call has # its own check in case -r was passed without -R. if [ "$_CUSTOM_REPO_URL" != "null" ]; then - __install_saltstack_rhel_repository || return 1 + __install_saltstack_rhel_onedir_repository || return 1 fi - if [ "$DISTRO_MAJOR_VERSION" -ge 8 ]; then - __PACKAGES="dnf-utils chkconfig" - else - __PACKAGES="yum-utils chkconfig" - fi - - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - if [ "$DISTRO_MAJOR_VERSION" -ge 8 ]; then - # YAML module is used for generating custom master/minion configs - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PACKAGES="${__PACKAGES} python3-pyyaml python3-setuptools" - else - __PACKAGES="${__PACKAGES} python2-pyyaml" - fi - elif [ "$DISTRO_MAJOR_VERSION" -eq 7 ]; then - # YAML module is used for generating custom master/minion configs - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PACKAGES="${__PACKAGES} python36-PyYAML python36-setuptools" - else - __PACKAGES="${__PACKAGES} PyYAML" - fi - else - # YAML module is used for generating custom master/minion configs - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PACKAGES="${__PACKAGES} python34-PyYAML python34-setuptools" - else - __PACKAGES="${__PACKAGES} PyYAML" - fi - fi - fi - - __PACKAGES="${__PACKAGES} procps" + __PACKAGES="yum-utils chkconfig procps-ng findutils" # shellcheck disable=SC2086 __yum_install_noinput ${__PACKAGES} || return 1 @@ -4825,11 +4209,11 @@ install_centos_stable_deps() { __yum_install_noinput ${_EXTRA_PACKAGES} || return 1 fi - return 0 } install_centos_stable() { + __PACKAGES="" if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then @@ -4845,6 +4229,10 @@ install_centos_stable() { __PACKAGES="${__PACKAGES} salt-syndic" fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api" + fi + # shellcheck disable=SC2086 __yum_install_noinput ${__PACKAGES} || return 1 @@ -4859,6 +4247,7 @@ install_centos_stable() { } install_centos_stable_post() { + SYSTEMD_RELOAD=$BS_FALSE for fname in api master minion syndic; do @@ -4870,7 +4259,7 @@ install_centos_stable_post() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then /bin/systemctl is-enabled salt-${fname}.service > /dev/null 2>&1 || ( /bin/systemctl preset salt-${fname}.service > /dev/null 2>&1 && /bin/systemctl enable salt-${fname}.service > /dev/null 2>&1 @@ -4890,14 +4279,14 @@ install_centos_stable_post() { } install_centos_git_deps() { + # First try stable deps then fall back to onedir deps if that one fails # if we're installing on a Red Hat based host that doesn't have the classic # package repos available. # Set ONEDIR_REV to STABLE_REV in case we # end up calling install_centos_onedir_deps ONEDIR_REV=${STABLE_REV} - install_centos_onedir_deps || \ - return 1 + install_centos_onedir_deps || return 1 if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then __yum_install_noinput ca-certificates || return 1 @@ -4912,111 +4301,23 @@ install_centos_git_deps() { __PACKAGES="" if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - if [ "$DISTRO_MAJOR_VERSION" -ge 8 ]; then - # Packages are named python3- - PY_PKG_VER=3 - __PACKAGES="${__PACKAGES} python3" - else - # Packages are named python36- - PY_PKG_VER=36 - __PACKAGES="${__PACKAGES} python36" - fi + # Packages are named python3- + PY_PKG_VER=3 + __PACKAGES="${__PACKAGES} python3" else - PY_PKG_VER="" - if [ "$DISTRO_MAJOR_VERSION" -ge 8 ]; then - __PACKAGES="${__PACKAGES} python2" - elif [ "$DISTRO_MAJOR_VERSION" -eq 6 ]; then - PY_PKG_VER=27 - __PACKAGES="${__PACKAGES} python27" - else - __PACKAGES="${__PACKAGES} python" - fi + echoerror "Python 2 is no longer supported, only Python 3" + return 1 fi - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - _install_m2crypto_req=false - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - _py=${_PY_EXE} - if [ "$DISTRO_MAJOR_VERSION" -gt 6 ]; then - _install_m2crypto_req=true - fi - else - if [ "$DISTRO_MAJOR_VERSION" -eq 6 ]; then - _install_m2crypto_req=true - fi - _py="python" + __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" - # Only Py2 needs python-futures - __PACKAGES="${__PACKAGES} python-futures" + # shellcheck disable=SC2086 + __yum_install_noinput ${__PACKAGES} || return 1 - # There is no systemd-python3 package as of this writing - if [ "$DISTRO_MAJOR_VERSION" -ge 7 ]; then - __PACKAGES="${__PACKAGES} systemd-python" - fi - fi - - if [ "$DISTRO_MAJOR_VERSION" -ge 8 ]; then - __install_tornado_pip ${_py} || return 1 - __PACKAGES="${__PACKAGES} python3-m2crypto" - else - __PACKAGES="${__PACKAGES} m2crypto python${PY_PKG_VER}-crypto" - fi - - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-jinja2" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-msgpack python${PY_PKG_VER}-requests" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-tornado python${PY_PKG_VER}-zmq" - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-libcloud" - fi - - if [ "${_INSTALL_PY}" -eq "${BS_TRUE}" ]; then - # Install Python if "-y" was passed in. - __install_python || return 1 - fi - - if [ "${_PY_EXE}" != "" ] && [ "$_PIP_ALLOWED" -eq "$BS_TRUE" ]; then - # If "-x" is defined, install dependencies with pip based on the Python version given. - _PIP_PACKAGES="m2crypto!=0.33.0 jinja2 msgpack-python pycrypto PyYAML tornado<5.0 zmq futures>=2.0" - - # install swig and openssl on cent6 - if $_install_m2crypto_req; then - __yum_install_noinput openssl-devel swig || return 1 - fi - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # Filter out any commented lines from the requirements file - _REQ_LINES="$(grep '^[^#]' "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - for SINGLE_PACKAGE in ${_PIP_PACKAGES}; do - __REQUIRED_VERSION="$(grep "${SINGLE_PACKAGE}" "${_REQ_LINES}")" - if [ "${__REQUIRED_VERSION}" != "" ]; then - _PIP_PACKAGES=$(echo "$_PIP_PACKAGES" | sed "s/${SINGLE_PACKAGE}/${__REQUIRED_VERSION}/") - fi - done - fi - - if [ "$_INSTALL_CLOUD" -eq "${BS_TRUE}" ]; then - _PIP_PACKAGES="${_PIP_PACKAGES} apache-libcloud" - fi - - __install_pip_pkgs "${_PIP_PACKAGES}" "${_PY_EXE}" || return 1 - else - # shellcheck disable=SC2086 - __yum_install_noinput ${__PACKAGES} || return 1 - fi - else - if [ "${_INSTALL_PY}" -eq "${BS_TRUE}" ] && [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then - # Install Python if "-y" was passed in. - __install_python || return 1 - fi - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" - # shellcheck disable=SC2086 - __yum_install_noinput ${__PACKAGES} || return 1 - fi # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" CONFIG_SALT_FUNC="config_salt" fi @@ -5024,29 +4325,23 @@ install_centos_git_deps() { } install_centos_git() { + if [ "${_PY_EXE}" != "" ]; then _PYEXE=${_PY_EXE} echoinfo "Using the following python version: ${_PY_EXE} to install salt" else - _PYEXE='python2' + echoerror "Python 2 is no longer supported, only Python 3" + return 1 fi echodebug "_PY_EXE: $_PY_EXE" - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - return 0 - fi - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then - $_PYEXE setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install --prefix=/usr || return 1 - else - $_PYEXE setup.py ${SETUP_PY_INSTALL_ARGS} install --prefix=/usr || return 1 - fi + __install_salt_from_repo "${_PY_EXE}" || return 1 return 0 } install_centos_git_post() { + SYSTEMD_RELOAD=$BS_FALSE for fname in api master minion syndic; do @@ -5063,7 +4358,8 @@ install_centos_git_post() { else _SERVICE_FILE="${_SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-${fname}.service" fi - if [ -f /bin/systemctl ]; then + + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then if [ ! -f "/usr/lib/systemd/system/salt-${fname}.service" ] || \ { [ -f "/usr/lib/systemd/system/salt-${fname}.service" ] && [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; }; then __copyfile "${_SERVICE_FILE}" /usr/lib/systemd/system @@ -5087,7 +4383,8 @@ install_centos_git_post() { } install_centos_onedir_deps() { - if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then + + if [ "$_UPGRADE_SYS" -eq "$BS_TRUE" ]; then yum -y update || return 1 fi @@ -5102,19 +4399,13 @@ install_centos_onedir_deps() { fi # If -R was passed, we need to configure custom repo url with rsync-ed packages - # Which is still handled in __install_saltstack_rhel_repository. This call has - # its own check in case -r was passed without -R. + # Which was still handled in __install_saltstack_rhel_repository, which was for old-stable which + # is removed since End-Of-Life. This call has its own check in case -r was passed without -R. if [ "$_CUSTOM_REPO_URL" != "null" ]; then __install_saltstack_rhel_onedir_repository || return 1 fi - if [ "$DISTRO_MAJOR_VERSION" -ge 8 ]; then - __PACKAGES="dnf-utils chkconfig" - else - __PACKAGES="yum-utils chkconfig" - fi - - __PACKAGES="${__PACKAGES} procps" + __PACKAGES="yum-utils chkconfig procps-ng findutils" # shellcheck disable=SC2086 __yum_install_noinput ${__PACKAGES} || return 1 @@ -5125,48 +4416,39 @@ install_centos_onedir_deps() { __yum_install_noinput ${_EXTRA_PACKAGES} || return 1 fi - return 0 } -# This function has been modified to allow for specific versions to be installed -# when not using the salt repo install_centos_onedir() { + yum clean metadata + yum makecache + __PACKAGES="" - local cloud='salt-cloud' - local master='salt-master' - local minion='salt-minion' - local syndic='salt-syndic' - local ver="$_ONEDIR_REV" - - if [ ! -z $ver ]; then - cloud+="-$ver" - master+="-$ver" - minion+="-$ver" - syndic+="-$ver" - fi - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then - __PACKAGES="${__PACKAGES} $cloud" + __PACKAGES="${__PACKAGES} salt-cloud-${STABLE_REV}" fi if [ "$_INSTALL_MASTER" -eq $BS_TRUE ];then - __PACKAGES="${__PACKAGES} $master" + __PACKAGES="${__PACKAGES} salt-master-${STABLE_REV}" fi if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} $minion" + __PACKAGES="${__PACKAGES} salt-minion-${STABLE_REV}" fi if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ];then - __PACKAGES="${__PACKAGES} $syndic" + __PACKAGES="${__PACKAGES} salt-syndic-${STABLE_REV}" + fi + + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api-${STABLE_REV}" fi # shellcheck disable=SC2086 __yum_install_noinput ${__PACKAGES} || return 1 - return 0 } install_centos_onedir_post() { + SYSTEMD_RELOAD=$BS_FALSE for fname in api master minion syndic; do @@ -5178,7 +4460,7 @@ install_centos_onedir_post() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then /bin/systemctl is-enabled salt-${fname}.service > /dev/null 2>&1 || ( /bin/systemctl preset salt-${fname}.service > /dev/null 2>&1 && /bin/systemctl enable salt-${fname}.service > /dev/null 2>&1 @@ -5198,7 +4480,8 @@ install_centos_onedir_post() { } install_centos_restart_daemons() { - [ $_START_DAEMONS -eq $BS_FALSE ] && return + + [ "$_START_DAEMONS" -eq $BS_FALSE ] && return for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot @@ -5209,26 +4492,11 @@ install_centos_restart_daemons() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /sbin/initctl ] && [ -f /etc/init/salt-${fname}.conf ]; then - # We have upstart support and upstart knows about our service - if ! /sbin/initctl status salt-$fname > /dev/null 2>&1; then - # Everything is in place and upstart gave us an error code? Fail! - return 1 - fi - - # upstart knows about this service. - # Let's try to stop it, and then start it - /sbin/initctl stop salt-$fname > /dev/null 2>&1 - # Restart service - if ! /sbin/initctl start salt-$fname > /dev/null 2>&1; then - # Failed the restart?! - return 1 - fi - elif [ -f /etc/init.d/salt-$fname ]; then + if [ -f /etc/init.d/salt-$fname ]; then # Disable stdin to fix shell session hang on killing tee pipe service salt-$fname stop < /dev/null > /dev/null 2>&1 service salt-$fname start < /dev/null - elif [ -f /usr/bin/systemctl ]; then + elif [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then # CentOS 7 uses systemd /usr/bin/systemctl stop salt-$fname > /dev/null 2>&1 /usr/bin/systemctl start salt-$fname.service && continue @@ -5242,21 +4510,25 @@ install_centos_restart_daemons() { } install_centos_testing_deps() { + install_centos_stable_deps || return 1 return 0 } install_centos_testing() { + install_centos_stable || return 1 return 0 } install_centos_testing_post() { + install_centos_stable_post || return 1 return 0 } install_centos_check_services() { + for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot [ $fname = "api" ] && continue @@ -5266,12 +4538,10 @@ install_centos_check_services() { [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /sbin/initctl ] && [ -f /etc/init/salt-${fname}.conf ]; then - __check_services_upstart salt-$fname || return 1 - elif [ -f /etc/init.d/salt-$fname ]; then - __check_services_sysvinit salt-$fname || return 1 - elif [ -f /usr/bin/systemctl ]; then - __check_services_systemd salt-$fname || return 1 + if [ -f "/etc/init.d/salt-$fname" ]; then + __check_services_sysvinit "salt-$fname" || return 1 + elif [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then + __check_services_systemd "salt-$fname" || return 1 fi done @@ -5287,286 +4557,343 @@ install_centos_check_services() { # RedHat Install Functions # install_red_hat_linux_stable_deps() { + install_centos_stable_deps || return 1 return 0 } install_red_hat_linux_git_deps() { + install_centos_git_deps || return 1 return 0 } install_red_hat_linux_onedir_deps() { + install_centos_onedir_deps || return 1 return 0 } install_red_hat_enterprise_stable_deps() { + install_red_hat_linux_stable_deps || return 1 return 0 } install_red_hat_enterprise_git_deps() { + install_red_hat_linux_git_deps || return 1 return 0 } install_red_hat_enterprise_onedir_deps() { + install_red_hat_linux_onedir_deps || return 1 return 0 } install_red_hat_enterprise_linux_stable_deps() { + install_red_hat_linux_stable_deps || return 1 return 0 } install_red_hat_enterprise_linux_git_deps() { + install_red_hat_linux_git_deps || return 1 return 0 } install_red_hat_enterprise_linux_onedir_deps() { + install_red_hat_linux_onedir_deps || return 1 return 0 } install_red_hat_enterprise_server_stable_deps() { + install_red_hat_linux_stable_deps || return 1 return 0 } install_red_hat_enterprise_server_git_deps() { + install_red_hat_linux_git_deps || return 1 return 0 } install_red_hat_enterprise_server_onedir_deps() { + install_red_hat_linux_onedir_deps || return 1 return 0 } install_red_hat_enterprise_workstation_stable_deps() { + install_red_hat_linux_stable_deps || return 1 return 0 } install_red_hat_enterprise_workstation_git_deps() { + install_red_hat_linux_git_deps || return 1 return 0 } install_red_hat_enterprise_workstation_onedir_deps() { + install_red_hat_linux_timat_deps || return 1 return 0 } install_red_hat_linux_stable() { + install_centos_stable || return 1 return 0 } install_red_hat_linux_git() { + install_centos_git || return 1 return 0 } install_red_hat_linux_onedir() { + install_centos_onedir || return 1 return 0 } install_red_hat_enterprise_stable() { + install_red_hat_linux_stable || return 1 return 0 } install_red_hat_enterprise_git() { + install_red_hat_linux_git || return 1 return 0 } install_red_hat_enterprise_onedir() { + install_red_hat_linux_onedir || return 1 return 0 } install_red_hat_enterprise_linux_stable() { + install_red_hat_linux_stable || return 1 return 0 } install_red_hat_enterprise_linux_git() { + install_red_hat_linux_git || return 1 return 0 } install_red_hat_enterprise_linux_onedir() { + install_red_hat_linux_onedir || return 1 return 0 } install_red_hat_enterprise_server_stable() { + install_red_hat_linux_stable || return 1 return 0 } install_red_hat_enterprise_server_git() { + install_red_hat_linux_git || return 1 return 0 } install_red_hat_enterprise_server_onedir() { + install_red_hat_linux_onedir || return 1 return 0 } install_red_hat_enterprise_workstation_stable() { + install_red_hat_linux_stable || return 1 return 0 } install_red_hat_enterprise_workstation_git() { + install_red_hat_linux_git || return 1 return 0 } install_red_hat_enterprise_workstation_onedir() { + install_red_hat_linux_onedir || return 1 return 0 } install_red_hat_linux_stable_post() { + install_centos_stable_post || return 1 return 0 } install_red_hat_linux_restart_daemons() { + install_centos_restart_daemons || return 1 return 0 } install_red_hat_linux_git_post() { + install_centos_git_post || return 1 return 0 } install_red_hat_enterprise_stable_post() { + install_red_hat_linux_stable_post || return 1 return 0 } install_red_hat_enterprise_restart_daemons() { + install_red_hat_linux_restart_daemons || return 1 return 0 } install_red_hat_enterprise_git_post() { + install_red_hat_linux_git_post || return 1 return 0 } install_red_hat_enterprise_linux_stable_post() { + install_red_hat_linux_stable_post || return 1 return 0 } install_red_hat_enterprise_linux_restart_daemons() { + install_red_hat_linux_restart_daemons || return 1 return 0 } install_red_hat_enterprise_linux_git_post() { + install_red_hat_linux_git_post || return 1 return 0 } install_red_hat_enterprise_server_stable_post() { + install_red_hat_linux_stable_post || return 1 return 0 } install_red_hat_enterprise_server_restart_daemons() { + install_red_hat_linux_restart_daemons || return 1 return 0 } install_red_hat_enterprise_server_git_post() { + install_red_hat_linux_git_post || return 1 return 0 } install_red_hat_enterprise_workstation_stable_post() { + install_red_hat_linux_stable_post || return 1 return 0 } install_red_hat_enterprise_workstation_restart_daemons() { + install_red_hat_linux_restart_daemons || return 1 return 0 } install_red_hat_enterprise_workstation_git_post() { + install_red_hat_linux_git_post || return 1 return 0 } install_red_hat_linux_testing_deps() { + install_centos_testing_deps || return 1 return 0 } install_red_hat_linux_testing() { + install_centos_testing || return 1 return 0 } install_red_hat_linux_testing_post() { + install_centos_testing_post || return 1 return 0 } install_red_hat_enterprise_testing_deps() { + install_centos_testing_deps || return 1 return 0 } install_red_hat_enterprise_testing() { + install_centos_testing || return 1 return 0 } install_red_hat_enterprise_testing_post() { + install_centos_testing_post || return 1 return 0 } install_red_hat_enterprise_server_testing_deps() { + install_centos_testing_deps || return 1 return 0 } install_red_hat_enterprise_server_testing() { + install_centos_testing || return 1 return 0 } install_red_hat_enterprise_server_testing_post() { + install_centos_testing_post || return 1 return 0 } install_red_hat_enterprise_workstation_testing_deps() { + install_centos_testing_deps || return 1 return 0 } install_red_hat_enterprise_workstation_testing() { + install_centos_testing || return 1 return 0 } install_red_hat_enterprise_workstation_testing_post() { + install_centos_testing_post || return 1 return 0 } @@ -5580,11 +4907,13 @@ install_red_hat_enterprise_workstation_testing_post() { # Oracle Linux Install Functions # install_oracle_linux_stable_deps() { + # Install Oracle's EPEL. - if [ ${_EPEL_REPOS_INSTALLED} -eq $BS_FALSE ]; then + if [ "${_EPEL_REPOS_INSTALLED}" -eq $BS_FALSE ]; then _EPEL_REPO=oracle-epel-release-el${DISTRO_MAJOR_VERSION} if ! rpm -q "${_EPEL_REPO}" > /dev/null; then - __yum_install_noinput "${_EPEL_REPO}" + # shellcheck disable=SC2086 + __yum_install_noinput ${_EPEL_REPO} fi _EPEL_REPOS_INSTALLED=$BS_TRUE fi @@ -5969,6 +5298,7 @@ install_cloud_linux_check_services() { # Alpine Linux Install Functions # install_alpine_linux_stable_deps() { + _PIP_INSTALL_ARGS="" if ! grep -q '^[^#].\+alpine/.\+/community' /etc/apk/repositories; then # Add community repository entry based on the "main" repo URL __REPO=$(grep '^[^#].\+alpine/.\+/main\>' /etc/apk/repositories) @@ -5987,6 +5317,7 @@ install_alpine_linux_stable_deps() { } install_alpine_linux_git_deps() { + _PIP_INSTALL_ARGS="" install_alpine_linux_stable_deps || return 1 if ! __check_command_exists git; then @@ -5995,33 +5326,14 @@ install_alpine_linux_git_deps() { __git_clone_and_checkout || return 1 - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - apk -U add python2 py-virtualenv py2-crypto py2-m2crypto py2-setuptools \ - py2-jinja2 py2-yaml py2-markupsafe py2-msgpack py2-psutil \ - py2-zmq zeromq py2-requests || return 1 - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # We're on the master branch, install whichever tornado is on the requirements file - __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - if [ "${__REQUIRED_TORNADO}" != "" ]; then - apk -U add py2-tornado || return 1 - fi - fi - else - apk -U add python3 python3-dev py3-pip py3-setuptools g++ linux-headers zeromq-dev openrc || return 1 - _PY_EXE=python3 - return 0 - fi - - # Let's trigger config_salt() - if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" - CONFIG_SALT_FUNC="config_salt" - fi + apk -U add python3 python3-dev py3-pip py3-setuptools g++ linux-headers zeromq-dev openrc || return 1 + _PY_EXE=python3 + return 0 } install_alpine_linux_stable() { __PACKAGES="salt" + _PIP_INSTALL_ARGS="" if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then __PACKAGES="${__PACKAGES} salt-cloud" @@ -6036,26 +5348,23 @@ install_alpine_linux_stable() { __PACKAGES="${__PACKAGES} salt-syndic" fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api" + fi + # shellcheck disable=SC2086 - apk -U add ${__PACKAGES} || return 1 + apk -U add "${__PACKAGES}" || return 1 return 0 } install_alpine_linux_git() { - - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - return 0 - fi - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then - python2 setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install || return 1 - else - python2 setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1 - fi + _PIP_INSTALL_ARGS="" + __install_salt_from_repo "${_PY_EXE}" || return 1 + return 0 } install_alpine_linux_post() { + _PIP_INSTALL_ARGS="" for fname in api master minion syndic; do # Skip if not meant to be installed [ $fname = "api" ] && \ @@ -6085,6 +5394,7 @@ install_alpine_linux_post() { } install_alpine_linux_restart_daemons() { + _PIP_INSTALL_ARGS="" [ "${_START_DAEMONS}" -eq $BS_FALSE ] && return for fname in api master minion syndic; do @@ -6103,6 +5413,7 @@ install_alpine_linux_restart_daemons() { } install_alpine_linux_check_services() { + _PIP_INSTALL_ARGS="" for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot [ $fname = "api" ] && continue @@ -6119,6 +5430,7 @@ install_alpine_linux_check_services() { } daemons_running_alpine_linux() { + _PIP_INSTALL_ARGS="" [ "${_START_DAEMONS}" -eq $BS_FALSE ] && return FAILED_DAEMONS=0 @@ -6152,167 +5464,21 @@ daemons_running_alpine_linux() { # Amazon Linux AMI Install Functions # -install_amazon_linux_ami_deps() { - # Shim to figure out if we're using old (rhel) or new (aws) rpms. - _USEAWS=$BS_FALSE - pkg_append="python" - - if [ "$ITYPE" = "stable" ]; then - repo_rev="$STABLE_REV" - else - repo_rev="latest" - fi - - if echo $repo_rev | grep -E -q '^archive'; then - year=$(echo "$repo_rev" | cut -d '/' -f 2 | cut -c1-4) - else - year=$(echo "$repo_rev" | cut -c1-4) - fi - - if echo "$repo_rev" | grep -E -q '^(latest|2016\.11)$' || \ - [ "$year" -gt 2016 ]; then - _USEAWS=$BS_TRUE - pkg_append="python27" - fi - - # We need to install yum-utils before doing anything else when installing on - # Amazon Linux ECS-optimized images. See issue #974. - __yum_install_noinput yum-utils - - # Do upgrade early - if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then - yum -y update || return 1 - fi - - if [ $_DISABLE_REPOS -eq $BS_FALSE ] || [ "$_CUSTOM_REPO_URL" != "null" ]; then - __REPO_FILENAME="salt.repo" - - # Set a few vars to make life easier. - if [ $_USEAWS -eq $BS_TRUE ]; then - base_url="$HTTP_VAL://${_REPO_URL}/yum/amazon/latest/\$basearch/$repo_rev/" - gpg_key="${base_url}SALTSTACK-GPG-KEY.pub" - repo_name="SaltStack repo for Amazon Linux" - else - base_url="$HTTP_VAL://${_REPO_URL}/yum/redhat/6/\$basearch/$repo_rev/" - gpg_key="${base_url}SALTSTACK-GPG-KEY.pub" - repo_name="SaltStack repo for RHEL/CentOS 6" - fi - - # This should prob be refactored to use __install_saltstack_rhel_repository() - # With args passed in to do the right thing. Reformatted to be more like the - # amazon linux yum file. - if [ ! -s "/etc/yum.repos.d/${__REPO_FILENAME}" ]; then - cat <<_eof > "/etc/yum.repos.d/${__REPO_FILENAME}" -[saltstack-repo] -name=$repo_name -failovermethod=priority -priority=10 -gpgcheck=1 -gpgkey=$gpg_key -baseurl=$base_url -_eof - fi - - fi - - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - # Package python-ordereddict-1.1-2.el6.noarch is obsoleted by python26-2.6.9-2.88.amzn1.x86_64 - # which is already installed - __PACKAGES="m2crypto ${pkg_append}-crypto ${pkg_append}-jinja2 ${pkg_append}-PyYAML" - __PACKAGES="${__PACKAGES} ${pkg_append}-msgpack ${pkg_append}-requests ${pkg_append}-zmq" - __PACKAGES="${__PACKAGES} ${pkg_append}-futures" - # shellcheck disable=SC2086 - __yum_install_noinput ${__PACKAGES} || return 1 - fi - - if [ "${_EXTRA_PACKAGES}" != "" ]; then - echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}" - # shellcheck disable=SC2086 - __yum_install_noinput ${_EXTRA_PACKAGES} || return 1 - fi -} - -install_amazon_linux_ami_git_deps() { - if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then - yum -y install ca-certificates || return 1 - fi - - PIP_EXE='pip' - if __check_command_exists python2.7; then - if ! __check_command_exists pip2.7; then - if ! __check_command_exists easy_install-2.7; then - __yum_install_noinput python27-setuptools - fi - /usr/bin/easy_install-2.7 pip || return 1 - fi - PIP_EXE='/usr/local/bin/pip2.7' - _PY_EXE='python2.7' - fi - - install_amazon_linux_ami_deps || return 1 - - if ! __check_command_exists git; then - __yum_install_noinput git || return 1 - fi - - __git_clone_and_checkout || return 1 - - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - __PACKAGES="" - __PIP_PACKAGES="" - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - __check_pip_allowed "You need to allow pip based installations (-P) in order to install apache-libcloud" - __PACKAGES="${__PACKAGES} python27-pip" - __PIP_PACKAGES="${__PIP_PACKAGES} apache-libcloud>=$_LIBCLOUD_MIN_VERSION" - fi - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # We're on the master branch, install whichever tornado is on the requirements file - __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - if [ "${__REQUIRED_TORNADO}" != "" ]; then - __PACKAGES="${__PACKAGES} ${pkg_append}-tornado" - fi - fi - - if [ "${__PACKAGES}" != "" ]; then - # shellcheck disable=SC2086 - __yum_install_noinput ${__PACKAGES} || return 1 - fi - - if [ "${__PIP_PACKAGES}" != "" ]; then - # shellcheck disable=SC2086 - ${PIP_EXE} install ${__PIP_PACKAGES} || return 1 - fi - else - __PACKAGES="python27-pip python27-setuptools python27-devel gcc" - # shellcheck disable=SC2086 - __yum_install_noinput ${__PACKAGES} || return 1 - fi - - # Let's trigger config_salt() - if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" - CONFIG_SALT_FUNC="config_salt" - fi - - return 0 -} - +# Support for Amazon Linux 2 install_amazon_linux_ami_2_git_deps() { if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then yum -y install ca-certificates || return 1 fi + if [ "$_PY_MAJOR_VERSION" -eq 2 ]; then + echoerror "Python 2 is no longer supported, only Python 3" + return 1 + fi + install_amazon_linux_ami_2_deps || return 1 - if [ "$_PY_MAJOR_VERSION" -eq 2 ]; then - PY_PKG_VER=2 - PIP_EXE='/bin/pip' - else - PY_PKG_VER=3 - PIP_EXE='/bin/pip3' - fi + PY_PKG_VER=3 + PIP_EXE='/bin/pip3' __PACKAGES="python${PY_PKG_VER}-pip" if ! __check_command_exists "${PIP_EXE}"; then @@ -6326,61 +5492,14 @@ install_amazon_linux_ami_2_git_deps() { __git_clone_and_checkout || return 1 - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then + __PACKAGES="python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools python${PY_PKG_VER}-devel gcc" - __PACKAGES="" - __PIP_PACKAGES="" - - if [ "$_INSTALL_CLOUD" -eq "$BS_TRUE" ]; then - __check_pip_allowed "You need to allow pip based installations (-P) in order to install apache-libcloud" - if [ "$PARSED_VERSION" -eq "2" ]; then - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq "3" ]; then - __PACKAGES="${__PACKAGES} python3-pip" - __PIP_PACKAGES="${__PIP_PACKAGES} tornado<$_TORNADO_MAX_PY3_VERSION" - else - __PACKAGES="${__PACKAGES} python2-pip" - fi - else - __PACKAGES="${__PACKAGES} python27-pip" - fi - __PIP_PACKAGES="${__PIP_PACKAGES} apache-libcloud>=$_LIBCLOUD_MIN_VERSION" - fi - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # We're on the master branch, install whichever tornado is on the requirements file - __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - if [ "${__REQUIRED_TORNADO}" != "" ]; then - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq "3" ]; then - __PIP_PACKAGES="${__PIP_PACKAGES} tornado<$_TORNADO_MAX_PY3_VERSION" - else - __PACKAGES="${__PACKAGES} ${pkg_append}${PY_PKG_VER}-tornado" - fi - fi - fi - - if [ "${__PIP_PACKAGES}" != "" ]; then - __check_pip_allowed "You need to allow pip based installations (-P) in order to install ${__PIP_PACKAGES}" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-pip" - fi - - if [ "${__PACKAGES}" != "" ]; then - # shellcheck disable=SC2086 - __yum_install_noinput ${__PACKAGES} || return 1 - fi - - if [ "${__PIP_PACKAGES}" != "" ]; then - # shellcheck disable=SC2086 - ${PIP_EXE} install ${__PIP_PACKAGES} || return 1 - fi - else - __PACKAGES="python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools python${PY_PKG_VER}-devel gcc" - # shellcheck disable=SC2086 - __yum_install_noinput ${__PACKAGES} || return 1 - fi + # shellcheck disable=SC2086 + __yum_install_noinput ${__PACKAGES} || return 1 # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" CONFIG_SALT_FUNC="config_salt" fi @@ -6388,26 +5507,9 @@ install_amazon_linux_ami_2_git_deps() { } install_amazon_linux_ami_2_deps() { - # Shim to figure out if we're using old (rhel) or new (aws) rpms. - _USEAWS=$BS_FALSE - pkg_append="python" - - if [ "$ITYPE" = "stable" ]; then - repo_rev="$STABLE_REV" - else - repo_rev="latest" - fi - - if echo $repo_rev | grep -E -q '^archive'; then - year=$(echo "$repo_rev" | cut -d '/' -f 2 | cut -c1-4) - else - year=$(echo "$repo_rev" | cut -c1-4) - fi - - if echo "$repo_rev" | grep -E -q '^(latest|2016\.11)$' || \ - [ "$year" -gt 2016 ]; then - _USEAWS=$BS_TRUE - pkg_append="python" + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi # We need to install yum-utils before doing anything else when installing on @@ -6420,56 +5522,24 @@ install_amazon_linux_ami_2_deps() { fi if [ $_DISABLE_REPOS -eq $BS_FALSE ] || [ "$_CUSTOM_REPO_URL" != "null" ]; then - __REPO_FILENAME="salt.repo" - __PY_VERSION_REPO="yum" - PY_PKG_VER="" - repo_label="saltstack-repo" - repo_name="SaltStack repo for Amazon Linux 2" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __REPO_FILENAME="salt.repo" - __PY_VERSION_REPO="py3" - PY_PKG_VER=3 - repo_label="saltstack-py3-repo" - repo_name="SaltStack Python 3 repo for Amazon Linux 2" + if [ ! -s "${YUM_REPO_FILE}" ]; then + FETCH_URL="https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo" + __fetch_url "${YUM_REPO_FILE}" "${FETCH_URL}" + if [ "$STABLE_REV" != "latest" ]; then + # 3006.x is default + REPO_REV_MAJOR=$(echo "$STABLE_REV" | cut -d '.' -f 1) + if [ "$REPO_REV_MAJOR" -eq "3007" ]; then + # Enable the Salt 3007 STS repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-3007-sts + fi + else + # Enable the Salt LATEST repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-latest + fi + dnf clean expire-cache || return 1 fi - - base_url="$HTTP_VAL://${_REPO_URL}/${__PY_VERSION_REPO}/amazon/2/\$basearch/$repo_rev/" - gpg_key="${base_url}SALTSTACK-GPG-KEY.pub,${base_url}base/RPM-GPG-KEY-CentOS-7" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - gpg_key="${base_url}SALTSTACK-GPG-KEY.pub" - fi - - # This should prob be refactored to use __install_saltstack_rhel_repository() - # With args passed in to do the right thing. Reformatted to be more like the - # amazon linux yum file. - if [ ! -s "/etc/yum.repos.d/${__REPO_FILENAME}" ]; then - cat <<_eof > "/etc/yum.repos.d/${__REPO_FILENAME}" -[$repo_label] -name=$repo_name -failovermethod=priority -priority=10 -gpgcheck=1 -gpgkey=$gpg_key -baseurl=$base_url -_eof - fi - - fi - - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - # Package python-ordereddict-1.1-2.el6.noarch is obsoleted by python26-2.6.9-2.88.amzn1.x86_64 - # which is already installed - if [ -n "${PY_PKG_VER}" ] && [ "${PY_PKG_VER}" -eq 3 ]; then - __PACKAGES="${pkg_append}${PY_PKG_VER}-m2crypto ${pkg_append}${PY_PKG_VER}-pyyaml" - else - __PACKAGES="m2crypto PyYAML ${pkg_append}-futures" - fi - - __PACKAGES="${__PACKAGES} ${pkg_append}${PY_PKG_VER}-crypto ${pkg_append}${PY_PKG_VER}-jinja2 procps-ng" - __PACKAGES="${__PACKAGES} ${pkg_append}${PY_PKG_VER}-msgpack ${pkg_append}${PY_PKG_VER}-requests ${pkg_append}${PY_PKG_VER}-zmq" - - # shellcheck disable=SC2086 - __yum_install_noinput ${__PACKAGES} || return 1 fi if [ "${_EXTRA_PACKAGES}" != "" ]; then @@ -6480,20 +5550,9 @@ _eof } install_amazon_linux_ami_2_onedir_deps() { - # Shim to figure out if we're using old (rhel) or new (aws) rpms. - _USEAWS=$BS_FALSE - pkg_append="python" - - if [ "$ITYPE" = "onedir" ]; then - repo_rev="$ONEDIR_REV" - else - repo_rev="latest" - fi - - if echo $repo_rev | grep -E -q '^archive'; then - year=$(echo "$repo_rev" | cut -d '/' -f 2 | cut -c1-4) - else - year=$(echo "$repo_rev" | cut -c1-4) + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi # We need to install yum-utils before doing anything else when installing on @@ -6506,64 +5565,24 @@ install_amazon_linux_ami_2_onedir_deps() { fi if [ $_DISABLE_REPOS -eq $BS_FALSE ] || [ "$_CUSTOM_REPO_URL" != "null" ]; then - __REPO_FILENAME="salt.repo" - __PY_VERSION_REPO="yum" - PY_PKG_VER="" - repo_label="saltstack-repo" - repo_name="SaltStack repo for Amazon Linux 2" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __REPO_FILENAME="salt.repo" - __PY_VERSION_REPO="py3" - PY_PKG_VER=3 - repo_label="saltstack-py3-repo" - repo_name="SaltStack Python 3 repo for Amazon Linux 2" + if [ ! -s "${YUM_REPO_FILE}" ]; then + FETCH_URL="https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo" + __fetch_url "${YUM_REPO_FILE}" "${FETCH_URL}" + if [ "$ONEDIR_REV" != "latest" ]; then + # 3006.x is default + REPO_REV_MAJOR=$(echo "$ONEDIR_REV" | cut -d '.' -f 1) + if [ "$REPO_REV_MAJOR" -eq "3007" ]; then + # Enable the Salt 3007 STS repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-3007-sts + fi + else + # Enable the Salt LATEST repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-latest + fi + dnf clean expire-cache || return 1 fi - - base_url="$HTTP_VAL://${_REPO_URL}/${_ONEDIR_DIR}/${__PY_VERSION_REPO}/amazon/2/\$basearch/$repo_rev/" - if [ "${ONEDIR_REV}" = "nightly" ] ; then - base_url="$HTTP_VAL://${_REPO_URL}/${_ONEDIR_NIGHTLY_DIR}/${__PY_VERSION_REPO}/amazon/2/\$basearch/" - fi - - if [ "$(echo "${ONEDIR_REV}" | grep -E '(3004|3005)')" != "" ] || [ "${ONEDIR_REV}" = "nightly" ]; then - gpg_key="${base_url}SALTSTACK-GPG-KEY.pub,${base_url}base/RPM-GPG-KEY-CentOS-7" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - gpg_key="${base_url}SALTSTACK-GPG-KEY.pub" - fi - else - gpg_key="${base_url}SALT-PROJECT-GPG-PUBKEY-2023.pub" - fi - - # This should prob be refactored to use __install_saltstack_rhel_repository() - # With args passed in to do the right thing. Reformatted to be more like the - # amazon linux yum file. - if [ ! -s "/etc/yum.repos.d/${__REPO_FILENAME}" ]; then - cat <<_eof > "/etc/yum.repos.d/${__REPO_FILENAME}" -[$repo_label] -name=$repo_name -failovermethod=priority -priority=10 -gpgcheck=1 -gpgkey=$gpg_key -baseurl=$base_url -_eof - fi - - fi - - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - # Package python-ordereddict-1.1-2.el6.noarch is obsoleted by python26-2.6.9-2.88.amzn1.x86_64 - # which is already installed - if [ -n "${PY_PKG_VER}" ] && [ "${PY_PKG_VER}" -eq 3 ]; then - __PACKAGES="${pkg_append}${PY_PKG_VER}-m2crypto ${pkg_append}${PY_PKG_VER}-pyyaml" - else - __PACKAGES="m2crypto PyYAML ${pkg_append}-futures" - fi - - __PACKAGES="${__PACKAGES} ${pkg_append}${PY_PKG_VER}-crypto ${pkg_append}${PY_PKG_VER}-jinja2 procps-ng" - __PACKAGES="${__PACKAGES} ${pkg_append}${PY_PKG_VER}-msgpack ${pkg_append}${PY_PKG_VER}-requests ${pkg_append}${PY_PKG_VER}-zmq" - - # shellcheck disable=SC2086 - __yum_install_noinput ${__PACKAGES} || return 1 fi if [ "${_EXTRA_PACKAGES}" != "" ]; then @@ -6573,41 +5592,6 @@ _eof fi } -install_amazon_linux_ami_stable() { - install_centos_stable || return 1 - return 0 -} - -install_amazon_linux_ami_stable_post() { - install_centos_stable_post || return 1 - return 0 -} - -install_amazon_linux_ami_restart_daemons() { - install_centos_restart_daemons || return 1 - return 0 -} - -install_amazon_linux_ami_git() { - install_centos_git || return 1 - return 0 -} - -install_amazon_linux_ami_git_post() { - install_centos_git_post || return 1 - return 0 -} - -install_amazon_linux_ami_testing() { - install_centos_testing || return 1 - return 0 -} - -install_amazon_linux_ami_testing_post() { - install_centos_testing_post || return 1 - return 0 -} - install_amazon_linux_ami_2_stable() { install_centos_stable || return 1 return 0 @@ -6658,6 +5642,133 @@ install_amazon_linux_ami_2_onedir_post() { return 0 } +# Support for Amazon Linux 2023 +# the following code needs adjustment to allow for 2023, 2024, 2025, etc - 2023 for now +install_amazon_linux_ami_2023_git_deps() { + if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then + yum -y install ca-certificates || return 1 + fi + + install_amazon_linux_ami_2023_onedir_deps || return 1 + + PY_PKG_VER=3 + PIP_EXE='/bin/pip3' + __PACKAGES="python${PY_PKG_VER}-pip" + + if ! __check_command_exists "${PIP_EXE}"; then + # shellcheck disable=SC2086 + __yum_install_noinput ${__PACKAGES} || return 1 + fi + + if ! __check_command_exists git; then + __yum_install_noinput git || return 1 + fi + + __git_clone_and_checkout || return 1 + + __PACKAGES="python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools python${PY_PKG_VER}-devel gcc" + + # shellcheck disable=SC2086 + __yum_install_noinput ${__PACKAGES} || return 1 + + # Let's trigger config_salt() + if [ "$_TEMP_CONFIG_DIR" = "null" ]; then + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" + CONFIG_SALT_FUNC="config_salt" + fi + + return 0 +} + +install_amazon_linux_ami_2023_onedir_deps() { + + # We need to install yum-utils before doing anything else when installing on + # Amazon Linux ECS-optimized images. See issue #974. + __yum_install_noinput yum-utils + + # Do upgrade early + if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then + yum -y update || return 1 + fi + + if [ $_DISABLE_REPOS -eq $BS_FALSE ] || [ "$_CUSTOM_REPO_URL" != "null" ]; then + if [ ! -s "${YUM_REPO_FILE}" ]; then + FETCH_URL="https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo" + __fetch_url "${YUM_REPO_FILE}" "${FETCH_URL}" + if [ "$ONEDIR_REV" != "latest" ]; then + # 3006.x is default + REPO_REV_MAJOR=$(echo "$ONEDIR_REV" | cut -d '.' -f 1) + if [ "$REPO_REV_MAJOR" -eq "3007" ]; then + # Enable the Salt 3007 STS repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-3007-sts + fi + else + # Enable the Salt LATEST repo + dnf config-manager --set-disable salt-repo-* + dnf config-manager --set-enabled salt-repo-latest + fi + dnf clean expire-cache || return 1 + fi + fi + + if [ "${_EXTRA_PACKAGES}" != "" ]; then + echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}" + # shellcheck disable=SC2086 + __yum_install_noinput ${_EXTRA_PACKAGES} || return 1 + fi +} + +install_amazon_linux_ami_2023_stable() { + install_centos_stable || return 1 + return 0 +} + +install_amazon_linux_ami_2023_stable_post() { + install_centos_stable_post || return 1 + return 0 +} + +install_amazon_linux_ami_2023_restart_daemons() { + install_centos_restart_daemons || return 1 + return 0 +} + +install_amazon_linux_ami_2023_git() { + install_centos_git || return 1 + return 0 +} + +install_amazon_linux_ami_2023_git_post() { + install_centos_git_post || return 1 + return 0 +} + +install_amazon_linux_ami_2023_testing() { + install_centos_testing || return 1 + return 0 +} + +install_amazon_linux_ami_2023_testing_post() { + install_centos_testing_post || return 1 + return 0 +} + +install_amazon_linux_ami_2023_check_services() { + install_centos_check_services || return 1 + return 0 +} + +install_amazon_linux_ami_2023_onedir() { + install_centos_stable || return 1 + return 0 +} + +install_amazon_linux_ami_2023_onedir_post() { + install_centos_stable_post || return 1 + return 0 +} + # # Ended Amazon Linux AMI Install Functions # @@ -6685,7 +5796,8 @@ install_arch_linux_stable_deps() { fi if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 2 ]; then - PY_PKG_VER=2 + echoerror "Python 2 is no longer supported, only Python 3" + return 1 else PY_PKG_VER="" fi @@ -6693,6 +5805,7 @@ install_arch_linux_stable_deps() { # YAML module is used for generating custom master/minion configs # shellcheck disable=SC2086 pacman -Su --noconfirm --needed python${PY_PKG_VER}-yaml + pacman -Su --noconfirm --needed python${PY_PKG_VER}-tornado if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then # shellcheck disable=SC2086 @@ -6716,33 +5829,21 @@ install_arch_linux_git_deps() { __git_clone_and_checkout || return 1 - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - pacman -R --noconfirm python2-distribute - pacman -Su --noconfirm --needed python2-crypto python2-setuptools python2-jinja \ - python2-m2crypto python2-markupsafe python2-msgpack python2-psutil \ - python2-pyzmq zeromq python2-requests python2-systemd || return 1 - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # We're on the master branch, install whichever tornado is on the requirements file - __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - if [ "${__REQUIRED_TORNADO}" != "" ]; then - pacman -Su --noconfirm --needed python2-tornado - fi - fi + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 2 ]; then + echoerror "Python 2 is no longer supported, only Python 3" + return 1 else - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 2 ]; then - PY_PKG_VER=2 - else - PY_PKG_VER="" - fi - __PACKAGES="python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" - # shellcheck disable=SC2086 - pacman -Su --noconfirm --needed ${__PACKAGES} + PY_PKG_VER="" fi + __PACKAGES="python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" + + # shellcheck disable=SC2086 + pacman -Su --noconfirm --needed ${__PACKAGES} + # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" CONFIG_SALT_FUNC="config_salt" fi @@ -6770,19 +5871,16 @@ install_arch_linux_stable() { } install_arch_linux_git() { + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 2 ]; then + echoerror "Python 2 is no longer supported, only Python 3" + return 1 + fi - _POST_NEON_PIP_INSTALL_ARGS="${_POST_NEON_PIP_INSTALL_ARGS} --use-pep517" + _PIP_INSTALL_ARGS="${_PIP_INSTALL_ARGS} --use-pep517" _PIP_DOWNLOAD_ARGS="${_PIP_DOWNLOAD_ARGS} --use-pep517" - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - return 0 - fi - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then - python2 setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install || return 1 - else - python2 setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1 - fi + __install_salt_from_repo "${_PY_EXE}" || return 1 + return 0 } @@ -6806,7 +5904,7 @@ install_arch_linux_post() { # Skip salt-api since the service should be opt-in and not necessarily started on boot [ $fname = "api" ] && continue - if [ -f /usr/bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then # Using systemd /usr/bin/systemctl is-enabled salt-$fname.service > /dev/null 2>&1 || ( /usr/bin/systemctl preset salt-$fname.service > /dev/null 2>&1 && @@ -6837,7 +5935,7 @@ install_arch_linux_git_post() { _SERVICE_DIR="${_SALT_GIT_CHECKOUT_DIR}/pkg/rpm" fi - if [ -f /usr/bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then __copyfile "${_SERVICE_DIR}/salt-${fname}.service" "/lib/systemd/system/salt-${fname}.service" # Skip salt-api since the service should be opt-in and not necessarily started on boot @@ -6859,7 +5957,7 @@ install_arch_linux_git_post() { } install_arch_linux_restart_daemons() { - [ $_START_DAEMONS -eq $BS_FALSE ] && return + [ "$_START_DAEMONS" -eq $BS_FALSE ] && return for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot @@ -6870,7 +5968,7 @@ install_arch_linux_restart_daemons() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /usr/bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then /usr/bin/systemctl stop salt-$fname.service > /dev/null 2>&1 /usr/bin/systemctl start salt-$fname.service && continue echodebug "Failed to start salt-$fname using systemd" @@ -6886,7 +5984,7 @@ install_arch_linux_restart_daemons() { } install_arch_check_services() { - if [ ! -f /usr/bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then # Not running systemd!? Don't check! return 0 fi @@ -6928,57 +6026,91 @@ install_arch_linux_onedir_post() { # __install_saltstack_photon_onedir_repository() { - if [ "$ITYPE" = "stable" ]; then - REPO_REV="$ONEDIR_REV" - else - REPO_REV="latest" + echodebug "__install_saltstack_photon_onedir_repository() entry" + + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi - __PY_VERSION_REPO="yum" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - __PY_VERSION_REPO="py3" - fi - - REPO_FILE="/etc/yum.repos.d/salt.repo" - - if [ ! -s "$REPO_FILE" ] || [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; then - FETCH_URL="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_DIR}/${__PY_VERSION_REPO}/photon/${DISTRO_MAJOR_VERSION}/${CPU_ARCH_L}/${ONEDIR_REV}" - if [ "${ONEDIR_REV}" = "nightly" ] ; then - FETCH_URL="${HTTP_VAL}://${_REPO_URL}/${_ONEDIR_NIGHTLY_DIR}/${__PY_VERSION_REPO}/photon/${DISTRO_MAJOR_VERSION}/${CPU_ARCH_L}/" + if [ ! -s "$YUM_REPO_FILE" ] || [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; then + ## Photon tdnf doesn't support config-manager + ## FETCH_URL="https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo" + ## __fetch_url "${YUM_REPO_FILE}" "${FETCH_URL}" + # shellcheck disable=SC2129 + if [ "$ONEDIR_REV" != "latest" ]; then + # 3006.x is default + REPO_REV_MAJOR=$(echo "$ONEDIR_REV" | cut -d '.' -f 1) + if [ "$REPO_REV_MAJOR" -eq "3007" ]; then + # Enable the Salt 3007 STS repo + ## tdnf config-manager --set-disable salt-repo-* + ## tdnf config-manager --set-enabled salt-repo-3007-sts + echo "[salt-repo-3007-sts]" > "${YUM_REPO_FILE}" + echo "name=Salt Repo for Salt v3007 STS" >> "${YUM_REPO_FILE}" + echo "baseurl=https://packages.broadcom.com/artifactory/saltproject-rpm/" >> "${YUM_REPO_FILE}" + echo "skip_if_unavailable=True" >> "${YUM_REPO_FILE}" + echo "priority=10" >> "${YUM_REPO_FILE}" + echo "enabled=1" >> "${YUM_REPO_FILE}" + echo "enabled_metadata=1" >> "${YUM_REPO_FILE}" + echo "gpgcheck=1" >> "${YUM_REPO_FILE}" + echo "exclude=*3006* *3008* *3009* *3010*" >> "${YUM_REPO_FILE}" + echo "gpgkey=https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public" >> "${YUM_REPO_FILE}" + else + # Salt 3006 repo + echo "[salt-repo-3006-lts]" > "${YUM_REPO_FILE}" + echo "name=Salt Repo for Salt v3006 LTS" >> "${YUM_REPO_FILE}" + echo "baseurl=https://packages.broadcom.com/artifactory/saltproject-rpm/" >> "${YUM_REPO_FILE}" + echo "skip_if_unavailable=True" >> "${YUM_REPO_FILE}" + echo "priority=10" >> "${YUM_REPO_FILE}" + echo "enabled=1" >> "${YUM_REPO_FILE}" + echo "enabled_metadata=1" >> "${YUM_REPO_FILE}" + echo "gpgcheck=1" >> "${YUM_REPO_FILE}" + echo "exclude=*3007* *3008* *3009* *3010*" >> "${YUM_REPO_FILE}" + echo "gpgkey=https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public" >> "${YUM_REPO_FILE}" + fi + else + # Enable the Salt LATEST repo + ## tdnf config-manager --set-disable salt-repo-* + ## tdnf config-manager --set-enabled salt-repo-latest + echo "[salt-repo-latest]" > "${YUM_REPO_FILE}" + echo "name=Salt Repo for Salt LATEST release" >> "${YUM_REPO_FILE}" + echo "baseurl=https://packages.broadcom.com/artifactory/saltproject-rpm/" >> "${YUM_REPO_FILE}" + echo "skip_if_unavailable=True" >> "${YUM_REPO_FILE}" + echo "priority=10" >> "${YUM_REPO_FILE}" + echo "enabled=1" >> "${YUM_REPO_FILE}" + echo "enabled_metadata=1" >> "${YUM_REPO_FILE}" + echo "gpgcheck=1" >> "${YUM_REPO_FILE}" + echo "gpgkey=https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public" >> "${YUM_REPO_FILE}" fi - - __fetch_url "${REPO_FILE}" "${FETCH_URL}.repo" - - GPG_KEY="SALT-PROJECT-GPG-PUBKEY-2023.pub" - - __rpm_import_gpg "${FETCH_URL}/${GPG_KEY}" || return 1 - tdnf makecache || return 1 - elif [ "$REPO_REV" != "latest" ]; then + elif [ "$ONEDIR_REV" != "latest" ]; then echowarn "salt.repo already exists, ignoring salt version argument." - echowarn "Use -F (forced overwrite) to install $REPO_REV." + echowarn "Use -F (forced overwrite) to install $ONEDIR_REV." fi return 0 } install_photon_deps() { + echodebug "install_photon_deps() entry" + + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 + fi + if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then tdnf -y update || return 1 fi __PACKAGES="${__PACKAGES:=}" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -lt 3 ]; then - echoerror "There are no Python 2 stable packages for Fedora, only Py3 packages" - return 1 - fi - PY_PKG_VER=3 __PACKAGES="${__PACKAGES} libyaml procps-ng python${PY_PKG_VER}-crypto python${PY_PKG_VER}-jinja2" __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-msgpack python${PY_PKG_VER}-requests python${PY_PKG_VER}-zmq" __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-pip python${PY_PKG_VER}-m2crypto python${PY_PKG_VER}-pyyaml" __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-systemd" + if [ "${_EXTRA_PACKAGES}" != "" ]; then echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}" fi @@ -6990,6 +6122,8 @@ install_photon_deps() { } install_photon_stable_post() { + echodebug "install_photon_stable_post() entry" + for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot [ $fname = "api" ] && continue @@ -7006,17 +6140,21 @@ install_photon_stable_post() { } install_photon_git_deps() { - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - # Packages are named python3- - PY_PKG_VER=3 - else - PY_PKG_VER=2 + echodebug "install_photon_git_deps() entry" + + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi + # Packages are named python3- + PY_PKG_VER=3 + __PACKAGES="" if ! __check_command_exists ps; then __PACKAGES="${__PACKAGES} procps-ng" fi + if ! __check_command_exists git; then __PACKAGES="${__PACKAGES} git" fi @@ -7029,55 +6167,28 @@ install_photon_git_deps() { __git_clone_and_checkout || return 1 - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then + __PACKAGES="python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc glibc-devel linux-devel.x86_64 cython${PY_PKG_VER}" - if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then - __PACKAGES="${__PACKAGES} ca-certificates" - fi - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-libcloud python${PY_PKG_VER}-netaddr" - fi + echodebug "install_photon_git_deps() distro major version, ${DISTRO_MAJOR_VERSION}" - install_photon_deps || return 1 - - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 3 ]; then - if __check_command_exists python3; then - __python="python3" - fi - elif [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 2 ]; then - if __check_command_exists python2; then - __python="python2" - fi - else - if ! __check_command_exists python; then - echoerror "Unable to find a python binary?!" - return 1 - fi - # Let's hope it's the right one - __python="python" - fi - - grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" | while IFS=' - ' read -r dep; do - echodebug "Running '${__python}' -m pip install '${dep}'" - "${__python}" -m pip install "${dep}" || return 1 - done - else - __PACKAGES="python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc glibc-devel linux-devel.x86_64" - # shellcheck disable=SC2086 - __tdnf_install_noinput ${__PACKAGES} || return 1 + ## Photon 5 container is missing systemd on default installation + if [ "${DISTRO_MAJOR_VERSION}" -lt 5 ]; then + __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-tornado" fi + # shellcheck disable=SC2086 + __tdnf_install_noinput ${__PACKAGES} || return 1 + if [ "${DISTRO_MAJOR_VERSION}" -gt 3 ]; then # Need newer version of setuptools on Photon - _setuptools_dep="setuptools>=${_MINIMUM_SETUPTOOLS_VERSION}" - echodebug "Running '${_PY_EXE} -m pip --upgrade install ${_setuptools_dep}'" + _setuptools_dep="setuptools>=${_MINIMUM_SETUPTOOLS_VERSION},<${_MAXIMUM_SETUPTOOLS_VERSION}" + echodebug "Running '${_PY_EXE} -m pip install --upgrade ${_setuptools_dep}'" ${_PY_EXE} -m pip install --upgrade "${_setuptools_dep}" fi # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" CONFIG_SALT_FUNC="config_salt" fi @@ -7085,11 +6196,14 @@ install_photon_git_deps() { } install_photon_git() { + echodebug "install_photon_git() entry" + if [ "${_PY_EXE}" != "" ]; then _PYEXE=${_PY_EXE} echoinfo "Using the following python version: ${_PY_EXE} to install salt" else - _PYEXE='python2' + echoerror "Python 2 is no longer supported, only Python 3" + return 1 fi if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then @@ -7101,6 +6215,8 @@ install_photon_git() { } install_photon_git_post() { + echodebug "install_photon_git_post() entry" + for fname in api master minion syndic; do # Skip if not meant to be installed [ $fname = "api" ] && \ @@ -7132,7 +6248,9 @@ install_photon_git_post() { } install_photon_restart_daemons() { - [ $_START_DAEMONS -eq $BS_FALSE ] && return + [ "$_START_DAEMONS" -eq $BS_FALSE ] && return + echodebug "install_photon_restart_daemons() entry" + for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot @@ -7154,6 +6272,8 @@ install_photon_restart_daemons() { } install_photon_check_services() { + echodebug "install_photon_check_services() entry" + for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot [ $fname = "api" ] && continue @@ -7170,6 +6290,8 @@ install_photon_check_services() { } install_photon_onedir_deps() { + echodebug "install_photon_onedir_deps() entry" + if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then tdnf -y update || return 1 @@ -7186,8 +6308,8 @@ install_photon_onedir_deps() { fi # If -R was passed, we need to configure custom repo url with rsync-ed packages - # Which is still handled in __install_saltstack_rhel_repository. This call has - # its own check in case -r was passed without -R. + # Which was handled in __install_saltstack_rhel_repository buu that hanlded old-stable which is for + # releases which are End-Of-Life. This call has its own check in case -r was passed without -R. if [ "$_CUSTOM_REPO_URL" != "null" ]; then __install_saltstack_photon_onedir_repository || return 1 fi @@ -7209,6 +6331,8 @@ install_photon_onedir_deps() { install_photon_onedir() { + echodebug "install_photon_onedir() entry" + STABLE_REV=$ONEDIR_REV __PACKAGES="" @@ -7226,6 +6350,10 @@ install_photon_onedir() { __PACKAGES="${__PACKAGES} salt-syndic" fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api" + fi + # shellcheck disable=SC2086 __tdnf_install_noinput ${__PACKAGES} || return 1 @@ -7243,526 +6371,6 @@ install_photon_onedir_post() { # ####################################################################################################################### -####################################################################################################################### -# -# FreeBSD Install Functions -# - -# Using a separate conf step to head for idempotent install... -__configure_freebsd_pkg_details() { - _SALT_ETC_DIR="/usr/local/etc/salt" - _PKI_DIR=${_SALT_ETC_DIR}/pki - _POST_NEON_PIP_INSTALL_ARGS="--prefix=/usr/local" -} - -install_freebsd_deps() { - __configure_freebsd_pkg_details - pkg install -y pkg -} - -install_freebsd_git_deps() { - install_freebsd_deps || return 1 - - if ! __check_command_exists git; then - /usr/local/sbin/pkg install -y git || return 1 - fi - __git_clone_and_checkout || return 1 - - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - - SALT_DEPENDENCIES=$(/usr/local/sbin/pkg rquery %dn py39-salt) - # shellcheck disable=SC2086 - /usr/local/sbin/pkg install -y ${SALT_DEPENDENCIES} python || return 1 - - /usr/local/sbin/pkg install -y py39-requests || return 1 - /usr/local/sbin/pkg install -y py39-tornado4 || return 1 - - else - /usr/local/sbin/pkg install -y python py39-pip py39-setuptools libzmq4 libunwind || return 1 - fi - - echodebug "Adapting paths to FreeBSD" - # The list of files was taken from Salt's BSD port Makefile - for file in doc/man/salt-key.1 doc/man/salt-cp.1 doc/man/salt-minion.1 \ - doc/man/salt-syndic.1 doc/man/salt-master.1 doc/man/salt-run.1 \ - doc/man/salt.7 doc/man/salt.1 doc/man/salt-call.1; do - [ ! -f $file ] && continue - echodebug "Patching ${file}" - sed -in -e "s|/etc/salt|${_SALT_ETC_DIR}|" \ - -e "s|/srv/salt|${_SALT_ETC_DIR}/states|" \ - -e "s|/srv/pillar|${_SALT_ETC_DIR}/pillar|" ${file} - done - if [ ! -f salt/syspaths.py ]; then - # We still can't provide the system paths, salt 0.16.x - # Let's patch salt's source and adapt paths to what's expected on FreeBSD - echodebug "Replacing occurrences of '/etc/salt' with ${_SALT_ETC_DIR}" - # The list of files was taken from Salt's BSD port Makefile - for file in conf/minion conf/master salt/config.py salt/client.py \ - salt/modules/mysql.py salt/utils/parsers.py salt/modules/tls.py \ - salt/modules/postgres.py salt/utils/migrations.py; do - [ ! -f $file ] && continue - echodebug "Patching ${file}" - sed -in -e "s|/etc/salt|${_SALT_ETC_DIR}|" \ - -e "s|/srv/salt|${_SALT_ETC_DIR}/states|" \ - -e "s|/srv/pillar|${_SALT_ETC_DIR}/pillar|" ${file} - done - fi - echodebug "Finished patching" - - # Let's trigger config_salt() - if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" - CONFIG_SALT_FUNC="config_salt" - - fi - - return 0 -} - -install_freebsd_stable() { -# -# installing latest version of salt from FreeBSD CURRENT ports repo -# - # shellcheck disable=SC2086 - /usr/local/sbin/pkg install -y py39-salt || return 1 - - return 0 -} - -install_freebsd_git() { - - # /usr/local/bin/python3 in FreeBSD is a symlink to /usr/local/bin/python3.7 - __PYTHON_PATH=$(readlink -f "$(command -v python3)") - __ESCAPED_PYTHON_PATH=$(echo "${__PYTHON_PATH}" | sed 's/\//\\\//g') - - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - __install_salt_from_repo_post_neon "${__PYTHON_PATH}" || return 1 - for script in salt_api salt_master salt_minion salt_proxy salt_syndic; do - __fetch_url "/usr/local/etc/rc.d/${script}" "https://raw.githubusercontent.com/freebsd/freebsd-ports/master/sysutils/py-salt/files/${script}.in" || return 1 - sed -i '' 's/%%PREFIX%%/\/usr\/local/g' /usr/local/etc/rc.d/${script} - sed -i '' "s/%%PYTHON_CMD%%/${__ESCAPED_PYTHON_PATH}/g" /usr/local/etc/rc.d/${script} - chmod +x /usr/local/etc/rc.d/${script} || return 1 - done - - return 0 - fi - - # Install from git - if [ ! -f salt/syspaths.py ]; then - # We still can't provide the system paths, salt 0.16.x - ${__PYTHON_PATH} setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1 - else - ${__PYTHON_PATH} setup.py \ - --salt-root-dir=/ \ - --salt-config-dir="${_SALT_ETC_DIR}" \ - --salt-cache-dir="${_SALT_CACHE_DIR}" \ - --salt-sock-dir=/var/run/salt \ - --salt-srv-root-dir="${_SALT_ETC_DIR}" \ - --salt-base-file-roots-dir="${_SALT_ETC_DIR}/states" \ - --salt-base-pillar-roots-dir="${_SALT_ETC_DIR}/pillar" \ - --salt-base-master-roots-dir="${_SALT_ETC_DIR}/salt-master" \ - --salt-logs-dir=/var/log/salt \ - --salt-pidfile-dir=/var/run \ - ${SETUP_PY_INSTALL_ARGS} install \ - || return 1 - fi - - for script in salt_api salt_master salt_minion salt_proxy salt_syndic; do - __fetch_url "/usr/local/etc/rc.d/${script}" "https://raw.githubusercontent.com/freebsd/freebsd-ports/master/sysutils/py-salt/files/${script}.in" || return 1 - sed -i '' 's/%%PREFIX%%/\/usr\/local/g' /usr/local/etc/rc.d/${script} - sed -i '' "s/%%PYTHON_CMD%%/${__ESCAPED_PYTHON_PATH}/g" /usr/local/etc/rc.d/${script} - chmod +x /usr/local/etc/rc.d/${script} || return 1 - done - - # And we're good to go - return 0 -} - -install_freebsd_stable_post() { - for fname in api master minion syndic; do - # Skip salt-api since the service should be opt-in and not necessarily started on boot - [ $fname = "api" ] && continue - - # Skip if not meant to be installed - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - - enable_string="salt_${fname}_enable=YES" - grep "$enable_string" /etc/rc.conf >/dev/null 2>&1 - [ $? -eq 1 ] && sysrc $enable_string - - done -} - -install_freebsd_git_post() { - install_freebsd_stable_post || return 1 - return 0 -} - -install_freebsd_restart_daemons() { - [ $_START_DAEMONS -eq $BS_FALSE ] && return - - for fname in api master minion syndic; do - # Skip salt-api since the service should be opt-in and not necessarily started on boot - [ $fname = "api" ] && continue - - # Skip if not meant to be installed - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - - service salt_$fname stop > /dev/null 2>&1 - service salt_$fname start - done -} - -install_freebsd_onedir() { -# -# call install_freebsd_stable -# - install_freebsd_stable || return 1 - - return 0 -} -# -# Ended FreeBSD Install Functions -# -####################################################################################################################### - -####################################################################################################################### -# -# OpenBSD Install Functions -# - -install_openbsd_deps() { - if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then - OPENBSD_REPO='https://cdn.openbsd.org/pub/OpenBSD' - echoinfo "setting package repository to $OPENBSD_REPO" - echo "${OPENBSD_REPO}" >/etc/installurl || return 1 - fi - - if [ "${_EXTRA_PACKAGES}" != "" ]; then - echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}" - # shellcheck disable=SC2086 - pkg_add -I -v ${_EXTRA_PACKAGES} || return 1 - fi - return 0 -} - -install_openbsd_git_deps() { - install_openbsd_deps || return 1 - - if ! __check_command_exists git; then - pkg_add -I -v git || return 1 - fi - __git_clone_and_checkout || return 1 - - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - pkg_add -I -v py3-pip py3-setuptools - fi - - # - # Let's trigger config_salt() - # - if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" - CONFIG_SALT_FUNC="config_salt" - fi - - return 0 -} - -install_openbsd_git() { - # - # Install from git - # - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - return 0 - fi - - if [ ! -f salt/syspaths.py ]; then - # We still can't provide the system paths, salt 0.16.x - /usr/local/bin/python2.7 setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1 - fi - return 0 -} - -install_openbsd_stable() { - pkg_add -r -I -v salt || return 1 - return 0 -} - -install_openbsd_post() { - for fname in api master minion syndic; do - [ $fname = "api" ] && continue - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - - rcctl enable salt_$fname - done - - return 0 -} - -install_openbsd_check_services() { - for fname in api master minion syndic; do - # Skip salt-api since the service should be opt-in and not necessarily started on boot - [ $fname = "api" ] && continue - - # Skip if not meant to be installed - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && continue - - if [ -f /etc/rc.d/salt_${fname} ]; then - __check_services_openbsd salt_${fname} || return 1 - fi - done - - return 0 -} - -install_openbsd_restart_daemons() { - [ $_START_DAEMONS -eq $BS_FALSE ] && return - - for fname in api master minion syndic; do - # Skip salt-api since the service should be opt-in and not necessarily started on boot - [ $fname = "api" ] && continue - - # Skip if not meant to be installed - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - - rcctl restart salt_${fname} - done - - return 0 -} - -install_openbsd_onedir() { -# -# Call install_openbsd_stable -# - install_openbsd_stable || return 1 - - return 0 -} -# -# Ended OpenBSD Install Functions -# -####################################################################################################################### - -####################################################################################################################### -# -# SmartOS Install Functions -# -install_smartos_deps() { - smartos_deps="$(pkgin show-deps salt | grep '^\s' | grep -v '\snot' | xargs) py27-m2crypto" - pkgin -y install "${smartos_deps}" || return 1 - - # Set _SALT_ETC_DIR to SmartOS default if they didn't specify - _SALT_ETC_DIR=${BS_SALT_ETC_DIR:-/opt/local/etc/salt} - # We also need to redefine the PKI directory - _PKI_DIR=${_SALT_ETC_DIR}/pki - - # Let's trigger config_salt() - if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - # Let's set the configuration directory to /tmp - _TEMP_CONFIG_DIR="/tmp" - CONFIG_SALT_FUNC="config_salt" - - # Let's download, since they were not provided, the default configuration files - if [ ! -f "$_SALT_ETC_DIR/minion" ] && [ ! -f "$_TEMP_CONFIG_DIR/minion" ]; then - # shellcheck disable=SC2086 - curl $_CURL_ARGS -s -o "$_TEMP_CONFIG_DIR/minion" -L \ - https://raw.githubusercontent.com/saltstack/salt/master/conf/minion || return 1 - fi - if [ ! -f "$_SALT_ETC_DIR/master" ] && [ ! -f $_TEMP_CONFIG_DIR/master ]; then - # shellcheck disable=SC2086 - curl $_CURL_ARGS -s -o "$_TEMP_CONFIG_DIR/master" -L \ - https://raw.githubusercontent.com/saltstack/salt/master/conf/master || return 1 - fi - fi - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - pkgin -y install py27-apache-libcloud || return 1 - fi - - if [ "${_EXTRA_PACKAGES}" != "" ]; then - echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}" - # shellcheck disable=SC2086 - pkgin -y install ${_EXTRA_PACKAGES} || return 1 - fi - - return 0 -} - -install_smartos_git_deps() { - install_smartos_deps || return 1 - - if ! __check_command_exists git; then - pkgin -y install git || return 1 - fi - - __git_clone_and_checkout || return 1 - - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # Install whichever tornado is in the requirements file - __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - __check_pip_allowed "You need to allow pip based installations (-P) in order to install the python package '${__REQUIRED_TORNADO}'" - - # Install whichever futures is in the requirements file - __REQUIRED_FUTURES="$(grep futures "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - __check_pip_allowed "You need to allow pip based installations (-P) in order to install the python package '${__REQUIRED_FUTURES}'" - - if [ "${__REQUIRED_TORNADO}" != "" ]; then - if ! __check_command_exists pip; then - pkgin -y install py27-pip - fi - pip install -U "${__REQUIRED_TORNADO}" - fi - - if [ "${__REQUIRED_FUTURES}" != "" ]; then - if ! __check_command_exists pip; then - pkgin -y install py27-pip - fi - pip install -U "${__REQUIRED_FUTURES}" - fi - fi - else - if ! __check_command_exists pip; then - pkgin -y install py27-pip - fi - pkgin -y install py27-setuptools - fi - - # Let's trigger config_salt() - if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" - CONFIG_SALT_FUNC="config_salt" - fi - - return 0 -} - -install_smartos_stable() { - pkgin -y install salt || return 1 - return 0 -} - -install_smartos_git() { - - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - return 0 - fi - - # Use setuptools in order to also install dependencies - # lets force our config path on the setup for now, since salt/syspaths.py only got fixed in 2015.5.0 - USE_SETUPTOOLS=1 /opt/local/bin/python setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install || return 1 - return 0 -} - -install_smartos_post() { - smf_dir="/opt/custom/smf" - - # Install manifest files if needed. - for fname in api master minion syndic; do - # Skip if not meant to be installed - [ $fname = "api" ] && \ - ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - - svcs network/salt-$fname > /dev/null 2>&1 - if [ $? -eq 1 ]; then - if [ ! -f "$_TEMP_CONFIG_DIR/salt-$fname.xml" ]; then - # shellcheck disable=SC2086 - curl $_CURL_ARGS -s -o "$_TEMP_CONFIG_DIR/salt-$fname.xml" -L \ - "https://raw.githubusercontent.com/saltstack/salt/master/pkg/smartos/salt-$fname.xml" - fi - svccfg import "$_TEMP_CONFIG_DIR/salt-$fname.xml" - if [ "${VIRTUAL_TYPE}" = "global" ]; then - if [ ! -d "$smf_dir" ]; then - mkdir -p "$smf_dir" || return 1 - fi - if [ ! -f "$smf_dir/salt-$fname.xml" ]; then - __copyfile "$_TEMP_CONFIG_DIR/salt-$fname.xml" "$smf_dir/" || return 1 - fi - fi - fi - done - - return 0 -} - -install_smartos_git_post() { - smf_dir="/opt/custom/smf" - - # Install manifest files if needed. - for fname in api master minion syndic; do - # Skip if not meant to be installed - [ $fname = "api" ] && \ - ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - - svcs "network/salt-$fname" > /dev/null 2>&1 - if [ $? -eq 1 ]; then - svccfg import "${_SALT_GIT_CHECKOUT_DIR}/pkg/smartos/salt-$fname.xml" - if [ "${VIRTUAL_TYPE}" = "global" ]; then - if [ ! -d $smf_dir ]; then - mkdir -p "$smf_dir" - fi - if [ ! -f "$smf_dir/salt-$fname.xml" ]; then - __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/smartos/salt-$fname.xml" "$smf_dir/" - fi - fi - fi - done - - return 0 -} - -install_smartos_restart_daemons() { - [ $_START_DAEMONS -eq $BS_FALSE ] && return - - for fname in api master minion syndic; do - # Skip salt-api since the service should be opt-in and not necessarily started on boot - [ $fname = "api" ] && continue - - # Skip if not meant to be installed - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - - # Stop if running && Start service - svcadm disable salt-$fname > /dev/null 2>&1 - svcadm enable salt-$fname - done - - return 0 -} -install_smartos_onedir() { -# -# call install_smartos_stable -# - install_smartos_stable || return 1 - - return 0 -} -# -# Ended SmartOS Install Functions -# -####################################################################################################################### ####################################################################################################################### # @@ -7844,7 +6452,7 @@ __zypper_install() { __opensuse_prep_install() { # DRY function for common installation preparatory steps for SUSE - if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then + if [ "$_DISABLE_REPOS" -eq $BS_FALSE ]; then # Is the repository already known __set_suse_pkg_repo # Check zypper repos and refresh if necessary @@ -7876,7 +6484,7 @@ install_opensuse_stable_deps() { # YAML module is used for generating custom master/minion configs # requests is still used by many salt modules # Salt needs python-zypp installed in order to use the zypper module - __PACKAGES="python-PyYAML python-requests python-zypp" + __PACKAGES="python${PY_PKG_VER}-PyYAML python${PY_PKG_VER}-requests python${PY_PKG_VER}-zypp" # shellcheck disable=SC2086 __zypper_install ${__PACKAGES} || return 1 @@ -7903,27 +6511,11 @@ install_opensuse_git_deps() { __git_clone_and_checkout || return 1 - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - __zypper_install patch || return 1 - - __PACKAGES="libzmq5 python-Jinja2 python-m2crypto python-msgpack-python python-pycrypto python-pyzmq python-xml python-futures" - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # We're on the master branch, install whichever tornado is on the requirements file - __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - if [ "${__REQUIRED_TORNADO}" != "" ]; then - __PACKAGES="${__PACKAGES} python-tornado" - fi - fi - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} python-apache-libcloud" - fi # Check for Tumbleweed - elif [ "${DISTRO_MAJOR_VERSION}" -ge 20210101 ]; then + if [ "${DISTRO_MAJOR_VERSION}" -ge 20210101 ]; then __PACKAGES="python3-pip gcc-c++ python3-pyzmq-devel" else - __PACKAGES="python-pip python-setuptools gcc" + __PACKAGES="python3-pip python3-setuptools gcc" fi # shellcheck disable=SC2086 @@ -7931,7 +6523,7 @@ install_opensuse_git_deps() { # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" CONFIG_SALT_FUNC="config_salt" fi @@ -7958,6 +6550,10 @@ install_opensuse_stable() { __PACKAGES="${__PACKAGES} salt-syndic" fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ]; then + __PACKAGES="${__PACKAGES} salt-api" + fi + # shellcheck disable=SC2086 __zypper_install $__PACKAGES || return 1 @@ -7965,12 +6561,7 @@ install_opensuse_stable() { } install_opensuse_git() { - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - return 0 - fi - - python setup.py ${SETUP_PY_INSTALL_ARGS} install --prefix=/usr || return 1 + __install_salt_from_repo "${_PY_EXE}" || return 1 return 0 } @@ -7988,7 +6579,7 @@ install_opensuse_stable_post() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /bin/systemctl ] || [ -f /usr/bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service) sleep 1 systemctl daemon-reload @@ -8011,7 +6602,7 @@ install_opensuse_git_post() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if command -v systemctl; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then use_usr_lib=$BS_FALSE if [ "${DISTRO_MAJOR_VERSION}" -ge 15 ]; then @@ -8052,7 +6643,7 @@ install_opensuse_onedir_post() { } install_opensuse_restart_daemons() { - [ $_START_DAEMONS -eq $BS_FALSE ] && return + [ "$_START_DAEMONS" -eq $BS_FALSE ] && return for fname in api master minion syndic; do # Skip salt-api since the service should be opt-in and not necessarily started on boot @@ -8063,7 +6654,7 @@ install_opensuse_restart_daemons() { [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - if [ -f /bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then systemctl stop salt-$fname > /dev/null 2>&1 systemctl start salt-$fname.service && continue echodebug "Failed to start salt-$fname using systemd" @@ -8079,7 +6670,7 @@ install_opensuse_restart_daemons() { } install_opensuse_check_services() { - if [ ! -f /bin/systemctl ]; then + if [ "$_SYSTEMD_FUNCTIONAL" -eq $BS_TRUE ]; then # Not running systemd!? Don't check! return 0 fi @@ -8113,11 +6704,10 @@ install_opensuse_15_stable_deps() { # SUSE only packages Salt for Python 3 on Leap 15 # Py3 is the default bootstrap install for Leap 15 - # However, git installs might specify "-x python2" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 2 ]; then - PY_PKG_VER=2 - else - PY_PKG_VER=3 + # However, git installs that specify "-x python2" are disallowed + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi # YAML module is used for generating custom master/minion configs @@ -8145,47 +6735,20 @@ install_opensuse_15_git_deps() { __git_clone_and_checkout || return 1 - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 2 ]; then - PY_PKG_VER=2 - else - PY_PKG_VER=3 + if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -ne 3 ]; then + echoerror "Python version is no longer supported, only Python 3" + return 1 fi - __PACKAGES="python${PY_PKG_VER}-xml" - - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - - # Py3 is the default bootstrap install for Leap 15 - # However, git installs might specify "-x python2" - if [ -n "$_PY_EXE" ] && [ "$_PY_MAJOR_VERSION" -eq 2 ]; then - # This is required by some of the python2 packages below - __PACKAGES="${__PACKAGES} libpython2_7-1_0 python2-futures python-ipaddress" - fi - - __PACKAGES="${__PACKAGES} libzmq5 python${PY_PKG_VER}-Jinja2 python${PY_PKG_VER}-msgpack" - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-pycrypto python${PY_PKG_VER}-pyzmq" - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # We're on the master branch, install whichever tornado is on the requirements file - __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - if [ "${__REQUIRED_TORNADO}" != "" ]; then - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-tornado" - fi - fi - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-apache-libcloud" - fi - else - __PACKAGES="${__PACKAGES} python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" - fi + PY_PKG_VER=3 + __PACKAGES="python${PY_PKG_VER}-xml python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" # shellcheck disable=SC2086 __zypper_install ${__PACKAGES} || return 1 # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" + _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf" CONFIG_SALT_FUNC="config_salt" fi @@ -8196,17 +6759,12 @@ install_opensuse_15_git() { # Py3 is the default bootstrap install for Leap 15 if [ -n "$_PY_EXE" ]; then - _PYEXE=${_PY_EXE} + _PYEXE="${_PY_EXE}" else _PYEXE=python3 fi - if [ "${_POST_NEON_INSTALL}" -eq $BS_TRUE ]; then - __install_salt_from_repo_post_neon "${_PY_EXE}" || return 1 - return 0 - fi - - ${_PYEXE} setup.py ${SETUP_PY_INSTALL_ARGS} install --prefix=/usr || return 1 + __install_salt_from_repo "${_PY_EXE}" || return 1 return 0 } @@ -8291,266 +6849,6 @@ install_suse_15_restart_daemons() { # ####################################################################################################################### -####################################################################################################################### -# -# SUSE Enterprise 12 -# - -install_suse_12_stable_deps() { - __opensuse_prep_install || return 1 - - # YAML module is used for generating custom master/minion configs - # requests is still used by many salt modules - # Salt needs python-zypp installed in order to use the zypper module - __PACKAGES="python-PyYAML python-requests python-zypp" - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} python-apache-libcloud" - fi - - # shellcheck disable=SC2086,SC2090 - __zypper_install ${__PACKAGES} || return 1 - - # SLES 11 SP3 ships with both python-M2Crypto-0.22.* and python-m2crypto-0.21 and we will be asked which - # we want to install, even with --non-interactive. - # Let's try to install the higher version first and then the lower one in case of failure - __zypper_install 'python-M2Crypto>=0.22' || __zypper_install 'python-M2Crypto>=0.21' || return 1 - - if [ "${_EXTRA_PACKAGES}" != "" ]; then - echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}" - # shellcheck disable=SC2086 - __zypper_install ${_EXTRA_PACKAGES} || return 1 - fi - - return 0 -} - -install_suse_12_git_deps() { - install_suse_12_stable_deps || return 1 - - if ! __check_command_exists git; then - __zypper_install git-core || return 1 - fi - - __git_clone_and_checkout || return 1 - - __PACKAGES="" - # shellcheck disable=SC2089 - __PACKAGES="${__PACKAGES} libzmq4 python-Jinja2 python-msgpack-python python-pycrypto" - __PACKAGES="${__PACKAGES} python-pyzmq python-xml" - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # We're on the master branch, install whichever tornado is on the requirements file - __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - if [ "${__REQUIRED_TORNADO}" != "" ]; then - __PACKAGES="${__PACKAGES} python-tornado" - fi - fi - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} python-apache-libcloud" - fi - - # shellcheck disable=SC2086 - __zypper_install ${__PACKAGES} || return 1 - - # Let's trigger config_salt() - if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" - CONFIG_SALT_FUNC="config_salt" - fi - - return 0 -} - -install_suse_12_onedir_deps() { - install_suse_12_stable_deps || return 1 - return 0 -} - -install_suse_12_stable() { - install_opensuse_stable || return 1 - return 0 -} - -install_suse_12_git() { - install_opensuse_git || return 1 - return 0 -} - -install_suse_12_onedir() { - install_opensuse_stable || return 1 - return 0 -} - -install_suse_12_stable_post() { - install_opensuse_stable_post || return 1 - return 0 -} - -install_suse_12_git_post() { - install_opensuse_git_post || return 1 - return 0 -} - -install_suse_12_onedir_post() { - install_opensuse_stable_post || return 1 - return 0 -} - -install_suse_12_restart_daemons() { - install_opensuse_restart_daemons || return 1 - return 0 -} - -# -# End of SUSE Enterprise 12 -# -####################################################################################################################### - -####################################################################################################################### -# -# SUSE Enterprise 11 -# - -install_suse_11_stable_deps() { - __opensuse_prep_install || return 1 - - # YAML module is used for generating custom master/minion configs - __PACKAGES="python-PyYAML" - - # shellcheck disable=SC2086,SC2090 - __zypper_install ${__PACKAGES} || return 1 - - # SLES 11 SP3 ships with both python-M2Crypto-0.22.* and python-m2crypto-0.21 and we will be asked which - # we want to install, even with --non-interactive. - # Let's try to install the higher version first and then the lower one in case of failure - __zypper_install 'python-M2Crypto>=0.22' || __zypper_install 'python-M2Crypto>=0.21' || return 1 - - if [ "${_EXTRA_PACKAGES}" != "" ]; then - echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}" - # shellcheck disable=SC2086 - __zypper_install ${_EXTRA_PACKAGES} || return 1 - fi - - return 0 -} - -install_suse_11_git_deps() { - install_suse_11_stable_deps || return 1 - - if ! __check_command_exists git; then - __zypper_install git || return 1 - fi - - __git_clone_and_checkout || return 1 - - __PACKAGES="" - # shellcheck disable=SC2089 - __PACKAGES="${__PACKAGES} libzmq4 python-Jinja2 python-msgpack-python python-pycrypto" - __PACKAGES="${__PACKAGES} python-pyzmq python-xml python-zypp" - - if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then - # We're on the master branch, install whichever tornado is on the requirements file - __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")" - if [ "${__REQUIRED_TORNADO}" != "" ]; then - __PACKAGES="${__PACKAGES} python-tornado" - fi - fi - - if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then - __PACKAGES="${__PACKAGES} python-apache-libcloud" - fi - - # shellcheck disable=SC2086 - __zypper_install ${__PACKAGES} || return 1 - - # Let's trigger config_salt() - if [ "$_TEMP_CONFIG_DIR" = "null" ]; then - _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/" - CONFIG_SALT_FUNC="config_salt" - fi - - return 0 -} - -install_suse_11_onedir_deps() { - install_suse_11_stable_deps || return 1 - return 0 -} - -install_suse_11_stable() { - install_opensuse_stable || return 1 - return 0 -} - -install_suse_11_git() { - install_opensuse_git || return 1 - return 0 -} - -install_suse_11_onedir() { - install_opensuse_stable || return 1 - return 0 -} - -install_suse_11_stable_post() { - install_opensuse_stable_post || return 1 - return 0 -} - -install_suse_11_git_post() { - install_opensuse_git_post || return 1 - return 0 -} - -install_suse_11_onedir_post() { - install_opensuse_stable_post || return 1 - return 0 -} - -install_suse_11_restart_daemons() { - install_opensuse_restart_daemons || return 1 - return 0 -} - - -# -# End of SUSE Enterprise 11 -# -####################################################################################################################### - -####################################################################################################################### -# -# SUSE Enterprise General Functions -# - -# Used for both SLE 11 and 12 -install_suse_check_services() { - if [ ! -f /bin/systemctl ]; then - # Not running systemd!? Don't check! - return 0 - fi - - for fname in api master minion syndic; do - # Skip salt-api since the service should be opt-in and not necessarily started on boot - [ $fname = "api" ] && continue - - # Skip if not meant to be installed - [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue - [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue - [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue - - __check_services_systemd salt-$fname || return 1 - done - - return 0 -} - -# -# End of SUSE Enterprise General Functions -# -####################################################################################################################### ####################################################################################################################### # @@ -8608,9 +6906,15 @@ __gentoo_pre_dep() { mkdir /etc/portage fi - # Enable Python 3.7 target for Salt Neon using GIT - if [ "${ITYPE}" = "git" ] && [ "${GIT_REV}" = "v3000" ]; then - EXTRA_PYTHON_TARGET=python3_7 + # Enable Python 3.10 target for Salt 3006 or later, otherwise 3.7 as previously, using GIT + if [ "${ITYPE}" = "git" ]; then + GIT_REV_MAJOR=$(echo "${GIT_REV}" | awk -F "." '{print $1}') + if [ "${GIT_REV_MAJOR}" = "v3006" ] || [ "${GIT_REV_MAJOR}" = "v3007" ]; then + EXTRA_PYTHON_TARGET=python3_10 + else + # assume pre-3006, so leave it as Python 3.7 + EXTRA_PYTHON_TARGET=python3_7 + fi fi if [ -n "${EXTRA_PYTHON_TARGET:-}" ]; then @@ -8626,7 +6930,6 @@ __gentoo_post_dep() { echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}" # shellcheck disable=SC2086 __autounmask ${_EXTRA_PACKAGES} || return 1 - # shellcheck disable=SC2086 __emerge ${_EXTRA_PACKAGES} || return 1 fi @@ -8670,27 +6973,6 @@ install_gentoo_git_deps() { GENTOO_GIT_PACKAGES="${GENTOO_GIT_PACKAGES:-} dev-vcs/git" fi - # Salt <3000 does not automatically install dependencies. It has to be done manually. - if [ "${_POST_NEON_INSTALL}" -eq $BS_FALSE ]; then - GENTOO_GIT_PACKAGES="${GENTOO_GIT_PACKAGES:-} - sys-apps/pciutils - dev-python/pyyaml - dev-python/pyzmq - dev-python/libnacl - dev-python/pycryptodome - dev-python/py - dev-python/requests - /etc/paths.d/salt fi @@ -9159,17 +7404,20 @@ install_macosx_stable_post() { } install_macosx_onedir_post() { + install_macosx_stable_post || return 1 return 0 } install_macosx_git_post() { + install_macosx_stable_post || return 1 return 0 } install_macosx_restart_daemons() { - [ $_START_DAEMONS -eq $BS_FALSE ] && return + + [ "$_START_DAEMONS" -eq $BS_FALSE ] && return if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then /bin/launchctl unload -w /Library/LaunchDaemons/com.saltstack.salt.minion.plist || return 1 @@ -9194,6 +7442,7 @@ install_macosx_restart_daemons() { # the -c options is passed. # config_salt() { + # If the configuration directory is not passed, return [ "$_TEMP_CONFIG_DIR" = "null" ] && return @@ -9237,7 +7486,7 @@ config_salt() { # Check if a minion config file already exists and move to .bak if needed if [ -f "$_SALT_ETC_DIR/minion" ] && [ "$CREATE_BAK" -eq "$BS_TRUE" ]; then - __movefile "$_SALT_ETC_DIR/minion" "$_SALT_ETC_DIR/minion.bak" $BS_TRUE || return 1 + __movefile "$_SALT_ETC_DIR/minion" "$_SALT_ETC_DIR/minion.bak" "$BS_TRUE" || return 1 CONFIGURED_ANYTHING=$BS_TRUE fi @@ -9280,8 +7529,11 @@ config_salt() { if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ] && [ "$_CONFIG_ONLY" -eq $BS_TRUE ]; then OVERWRITE_MASTER_CONFIGS=$BS_TRUE fi + if [ "$_INSTALL_SALT_API" -eq $BS_TRUE ] && [ "$_CONFIG_ONLY" -eq $BS_TRUE ]; then + OVERWRITE_MASTER_CONFIGS=$BS_TRUE + fi - if [ "$_INSTALL_MASTER" -eq $BS_TRUE ] || [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ] || [ "$OVERWRITE_MASTER_CONFIGS" -eq $BS_TRUE ] || [ "$_CUSTOM_MASTER_CONFIG" != "null" ]; then + if [ "$_INSTALL_MASTER" -eq $BS_TRUE ] || [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ] || [ "$_INSTALL_SALT_API" -eq $BS_TRUE ] || [ "$OVERWRITE_MASTER_CONFIGS" -eq $BS_TRUE ] || [ "$_CUSTOM_MASTER_CONFIG" != "null" ]; then # Create the PKI directory [ -d "$_PKI_DIR/master" ] || (mkdir -p "$_PKI_DIR/master" && chmod 700 "$_PKI_DIR/master") || return 1 @@ -9290,7 +7542,7 @@ config_salt() { # Check if a master config file already exists and move to .bak if needed if [ -f "$_SALT_ETC_DIR/master" ] && [ "$CREATE_BAK" -eq "$BS_TRUE" ]; then - __movefile "$_SALT_ETC_DIR/master" "$_SALT_ETC_DIR/master.bak" $BS_TRUE || return 1 + __movefile "$_SALT_ETC_DIR/master" "$_SALT_ETC_DIR/master.bak" "$BS_TRUE" || return 1 CONFIGURED_ANYTHING=$BS_TRUE fi @@ -9304,7 +7556,7 @@ config_salt() { CONFIGURED_ANYTHING=$BS_TRUE fi - # Copy the master's keys if found + # Copy the masters keys if found if [ -f "$_TEMP_CONFIG_DIR/master.pem" ]; then __movefile "$_TEMP_CONFIG_DIR/master.pem" "$_PKI_DIR/master/" || return 1 chmod 400 "$_PKI_DIR/master/master.pem" || return 1 @@ -9334,7 +7586,7 @@ config_salt() { done fi - if [ "$_CONFIG_ONLY" -eq $BS_TRUE ] && [ $CONFIGURED_ANYTHING -eq $BS_FALSE ]; then + if [ "$_CONFIG_ONLY" -eq $BS_TRUE ] && [ "$CONFIGURED_ANYTHING" -eq $BS_FALSE ]; then echowarn "No configuration or keys were copied over. No configuration was done!" exit 0 fi @@ -9352,6 +7604,7 @@ config_salt() { # as long as the -k option is passed. # preseed_master() { + # Create the PKI directory if [ "$(find "$_TEMP_KEYS_DIR" -maxdepth 1 -type f | wc -l)" -lt 1 ]; then @@ -9386,6 +7639,7 @@ preseed_master() { # This function checks if all of the installed daemons are running or not. # daemons_running_onedir() { + [ "$_START_DAEMONS" -eq $BS_FALSE ] && return 0 FAILED_DAEMONS=0 @@ -9423,6 +7677,7 @@ daemons_running_onedir() { # This function checks if all of the installed daemons are running or not. # daemons_running() { + [ "$_START_DAEMONS" -eq $BS_FALSE ] && return 0 FAILED_DAEMONS=0 @@ -9437,7 +7692,7 @@ daemons_running() { # shellcheck disable=SC2009 if [ "${DISTRO_NAME}" = "SmartOS" ]; then - if [ "$(svcs -Ho STA salt-$fname)" != "ON" ]; then + if [ "$(svcs -Ho STA "salt-$fname")" != "ON" ]; then echoerror "salt-$fname was not found running" FAILED_DAEMONS=$((FAILED_DAEMONS + 1)) fi @@ -9447,7 +7702,7 @@ daemons_running() { fi done - return $FAILED_DAEMONS + return ${FAILED_DAEMONS} } # # Ended daemons running check function @@ -9470,9 +7725,10 @@ if [ ${_NO_DEPS} -eq $BS_FALSE ]; then fi DEPS_INSTALL_FUNC="null" -for FUNC_NAME in $(__strip_duplicates "$DEP_FUNC_NAMES"); do - if __function_defined "$FUNC_NAME"; then - DEPS_INSTALL_FUNC="$FUNC_NAME" +# shellcheck disable=SC2086 +for FUNC_NAME in $(__strip_duplicates ${DEP_FUNC_NAMES}); do + if __function_defined ${FUNC_NAME}; then + DEPS_INSTALL_FUNC=${FUNC_NAME} break fi done @@ -9582,7 +7838,7 @@ for FUNC_NAME in $(__strip_duplicates "$DAEMONS_RUNNING_FUNC_NAMES"); do done echodebug "DAEMONS_RUNNING_FUNC=${DAEMONS_RUNNING_FUNC}" -# Let's get the check services function +# Lets get the check services function if [ ${_DISABLE_SALT_CHECKS} -eq $BS_FALSE ]; then CHECK_SERVICES_FUNC_NAMES="install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_${ITYPE}_check_services" CHECK_SERVICES_FUNC_NAMES="$CHECK_SERVICES_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_${ITYPE}_check_services" @@ -9615,7 +7871,7 @@ fi # Install dependencies -if [ ${_NO_DEPS} -eq $BS_FALSE ] && [ $_CONFIG_ONLY -eq $BS_FALSE ]; then +if [ "${_NO_DEPS}" -eq $BS_FALSE ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then # Only execute function is not in config mode only echoinfo "Running ${DEPS_INSTALL_FUNC}()" if ! ${DEPS_INSTALL_FUNC}; then @@ -9639,7 +7895,7 @@ if [ "$_CUSTOM_MASTER_CONFIG" != "null" ] || [ "$_CUSTOM_MINION_CONFIG" != "null _TEMP_CONFIG_DIR="$_SALT_ETC_DIR" fi - if [ ${_NO_DEPS} -eq $BS_FALSE ] && [ $_CONFIG_ONLY -eq $BS_TRUE ]; then + if [ "${_NO_DEPS}" -eq $BS_FALSE ] && [ "$_CONFIG_ONLY" -eq $BS_TRUE ]; then # Execute function to satisfy dependencies for configuration step echoinfo "Running ${DEPS_INSTALL_FUNC}()" if ! ${DEPS_INSTALL_FUNC}; then @@ -9713,6 +7969,7 @@ fi if [ "$STARTDAEMONS_INSTALL_FUNC" != "null" ] && [ ${_START_DAEMONS} -eq $BS_TRUE ]; then echoinfo "Running ${STARTDAEMONS_INSTALL_FUNC}()" echodebug "Waiting ${_SLEEP} seconds for processes to settle before checking for them" + # shellcheck disable=SC2086 sleep ${_SLEEP} if ! ${STARTDAEMONS_INSTALL_FUNC}; then echoerror "Failed to run ${STARTDAEMONS_INSTALL_FUNC}()!!!" @@ -9724,6 +7981,7 @@ fi if [ "$DAEMONS_RUNNING_FUNC" != "null" ] && [ ${_START_DAEMONS} -eq $BS_TRUE ]; then echoinfo "Running ${DAEMONS_RUNNING_FUNC}()" echodebug "Waiting ${_SLEEP} seconds for processes to settle before checking for them" + # shellcheck disable=SC2086 sleep ${_SLEEP} # Sleep a little bit to let daemons start if ! ${DAEMONS_RUNNING_FUNC}; then echoerror "Failed to run ${DAEMONS_RUNNING_FUNC}()!!!" @@ -9746,7 +8004,7 @@ if [ "$DAEMONS_RUNNING_FUNC" != "null" ] && [ ${_START_DAEMONS} -eq $BS_TRUE ]; echodebug "Running salt-$fname by hand outputs: $(nohup salt-$fname -l debug)" - [ ! -f /var/log/salt/$fname ] && echodebug "/var/log/salt/$fname does not exist. Can't cat its contents!" && continue + [ ! -f "/var/log/salt/$fname" ] && echodebug "/var/log/salt/$fname does not exist. Can't cat its contents!" && continue echodebug "DAEMON LOGS for $fname:" echodebug "$(cat /var/log/salt/$fname)" diff --git a/salt/sensoroni/soc_sensoroni.yaml b/salt/sensoroni/soc_sensoroni.yaml index 7b8495dc5..71a2c779b 100644 --- a/salt/sensoroni/soc_sensoroni.yaml +++ b/salt/sensoroni/soc_sensoroni.yaml @@ -1,6 +1,6 @@ sensoroni: enabled: - description: Enable or disable Sensoroni. + description: Enable or disable the per-node SOC agent process. This process is used for performing node-related jobs and reporting node metrics back to SOC. Disabling this process is unsupported and will result in an improperly functioning grid. advanced: True helpLink: grid.html config: diff --git a/salt/soc/config.sls b/salt/soc/config.sls index 7607da5ff..4134d8b77 100644 --- a/salt/soc/config.sls +++ b/salt/soc/config.sls @@ -176,6 +176,15 @@ socusersroles: - require: - sls: manager.sync_es_users +socclientsroles: + file.managed: + - name: /opt/so/conf/soc/soc_clients_roles + - user: 939 + - group: 939 + - mode: 600 + - allow_empty: true + - create: true + socuploaddir: file.directory: - name: /nsm/soc/uploads @@ -198,6 +207,49 @@ socsensoronirepos: - mode: 775 - makedirs: True + +create_custom_local_yara_repo_template: + git.present: + - name: /nsm/rules/custom-local-repos/local-yara + - bare: False + - force: True + +add_readme_custom_local_yara_repo_template: + file.managed: + - name: /nsm/rules/custom-local-repos/local-yara/README + - source: salt://soc/files/soc/detections_custom_repo_template_readme.jinja + - user: 939 + - group: 939 + - template: jinja + - context: + repo_type: "yara" + + +create_custom_local_sigma_repo_template: + git.present: + - name: /nsm/rules/custom-local-repos/local-sigma + - bare: False + - force: True + +add_readme_custom_local_sigma_repo_template: + file.managed: + - name: /nsm/rules/custom-local-repos/local-sigma/README + - source: salt://soc/files/soc/detections_custom_repo_template_readme.jinja + - user: 939 + - group: 939 + - template: jinja + - context: + repo_type: "sigma" + +socore_own_custom_repos: + file.directory: + - name: /nsm/rules/custom-local-repos/ + - user: socore + - group: socore + - recurse: + - user + - group + {% else %} {{sls}}_state_not_allowed: diff --git a/salt/soc/defaults.yaml b/salt/soc/defaults.yaml index f191fd054..d61588b42 100644 --- a/salt/soc/defaults.yaml +++ b/salt/soc/defaults.yaml @@ -119,6 +119,13 @@ soc: - identity_id - http_request.headers.user-agent - msg + ':hydra:': + - soc_timestamp + - event.dataset + - http_request.headers.x-real-ip + - identity_id + - http_request.headers.user-agent + - msg '::conn': - soc_timestamp - event.dataset @@ -1311,9 +1318,11 @@ soc: jobDir: jobs kratos: hostUrl: + hydra: + hostUrl: elastalertengine: aiRepoUrl: https://github.com/Security-Onion-Solutions/securityonion-resources - aiRepoBranch: generated-summaries-stable + aiRepoBranch: generated-summaries-published aiRepoPath: /opt/sensoroni/ai_summary_repos showAiSummaries: true autoUpdateEnabled: true @@ -1342,11 +1351,17 @@ soc: license: Elastic-2.0 folder: sigma/stable community: true + - repo: file:///nsm/rules/custom-local-repos/local-sigma + license: Elastic-2.0 + community: false airgap: - repo: file:///nsm/rules/detect-sigma/repos/securityonion-resources license: Elastic-2.0 folder: sigma/stable community: true + - repo: file:///nsm/rules/custom-local-repos/local-sigma + license: Elastic-2.0 + community: false sigmaRulePackages: - core - emerging_threats_addon @@ -1394,9 +1409,10 @@ soc: - rbac/custom_roles userFiles: - rbac/users_roles + - rbac/clients_roles strelkaengine: aiRepoUrl: https://github.com/Security-Onion-Solutions/securityonion-resources - aiRepoBranch: generated-summaries-stable + aiRepoBranch: generated-summaries-published aiRepoPath: /opt/sensoroni/ai_summary_repos showAiSummaries: true autoEnabledYaraRules: @@ -1412,16 +1428,22 @@ soc: - repo: https://github.com/Security-Onion-Solutions/securityonion-yara license: DRL community: true + - repo: file:///nsm/rules/custom-local-repos/local-yara + license: Elastic-2.0 + community: false airgap: - repo: file:///nsm/rules/detect-yara/repos/securityonion-yara license: DRL community: true + - repo: file:///nsm/rules/custom-local-repos/local-yara + license: Elastic-2.0 + community: false yaraRulesFolder: /opt/sensoroni/yara/rules stateFilePath: /opt/sensoroni/fingerprints/strelkaengine.state integrityCheckFrequencySeconds: 1200 suricataengine: aiRepoUrl: https://github.com/Security-Onion-Solutions/securityonion-resources - aiRepoBranch: generated-summaries-stable + aiRepoBranch: generated-summaries-published aiRepoPath: /opt/sensoroni/ai_summary_repos showAiSummaries: true autoUpdateEnabled: true @@ -1435,6 +1457,8 @@ soc: rulesFingerprintFile: /opt/sensoroni/fingerprints/emerging-all.fingerprint stateFilePath: /opt/sensoroni/fingerprints/suricataengine.state integrityCheckFrequencySeconds: 1200 + ignoredSidRanges: + - '1100000-1101000' client: enableReverseLookup: false docsUrl: /docs/ @@ -1625,23 +1649,23 @@ soc: showSubtitle: true - name: HTTP description: HTTP grouped by destination port - query: 'tags:http | groupby destination.port' + query: 'tags:(http OR http2) | groupby destination.port' showSubtitle: true - name: HTTP description: HTTP grouped by status code and message - query: 'tags:http | groupby http.status_code http.status_message' + query: 'tags:(http OR http2) | groupby http.status_code http.status_message' showSubtitle: true - name: HTTP description: HTTP grouped by method and user agent - query: 'tags:http | groupby http.method http.useragent' + query: 'tags:(http OR http2) | groupby http.method http.useragent' showSubtitle: true - name: HTTP description: HTTP grouped by virtual host - query: 'tags:http | groupby http.virtual_host' + query: 'tags:(http OR http2) | groupby http.virtual_host' showSubtitle: true - name: HTTP description: HTTP with exe downloads - query: 'tags:http AND file.resp_mime_types:*exec* | groupby http.virtual_host' + query: 'tags:(http OR http2) AND file.resp_mime_types:*exec* | groupby http.virtual_host' showSubtitle: true - name: Intel description: Intel framework hits grouped by indicator @@ -1868,7 +1892,7 @@ soc: query: 'tags:ftp | groupby ftp.command | groupby -sankey ftp.command source.ip | groupby source.ip | groupby -sankey source.ip destination.ip | groupby destination.ip | groupby destination.port | groupby destination_geo.organization_name | groupby ftp.argument | groupby ftp.user' - name: HTTP description: HTTP (Hyper Text Transport Protocol) network metadata - query: 'tags:http | groupby http.method | groupby -sankey http.method http.virtual_host | groupby http.virtual_host | groupby http.uri | groupby http.useragent | groupby http.status_code | groupby http.status_message | groupby file.resp_mime_types | groupby source.ip | groupby destination.ip | groupby destination.port | groupby destination_geo.organization_name' + query: 'tags:(http OR http2) | groupby http.method | groupby -sankey http.method http.virtual_host | groupby http.virtual_host | groupby http.uri | groupby http.useragent | groupby http.status_code | groupby http.status_message | groupby file.resp_mime_types | groupby source.ip | groupby destination.ip | groupby destination.port | groupby destination_geo.organization_name' - name: Intel description: Zeek Intel framework hits query: 'tags:intel | groupby intel.indicator | groupby -sankey intel.indicator source.ip | groupby source.ip | groupby -sankey source.ip destination.ip | groupby destination.ip | groupby destination.port | groupby intel.indicator_type | groupby intel.seen_where' @@ -2244,7 +2268,7 @@ soc: description: Show all custom detections - name: "All Detections - Enabled" query: "so_detection.isEnabled:true | groupby so_detection.language | groupby so_detection.ruleset so_detection.severity" - description: Show all enalbed Detections + description: Show all enabled Detections - name: "All Detections - Disabled" query: "so_detection.isEnabled:false | groupby so_detection.language | groupby so_detection.ruleset so_detection.severity" description: Show all disabled Detections @@ -2263,7 +2287,18 @@ soc: - name: "Detections with Overrides" query: "_exists_:so_detection.overrides | groupby so_detection.language | groupby so_detection.ruleset so_detection.isEnabled" description: Show Detections that have Overrides + detectionEngineStatusQueries: | + suricata: + default: 'tags:so-soc AND suricata | groupby log.level | groupby event.action | groupby soc.fields.error' + IntegrityFailure: 'event.action: "integrity check failed" AND soc.fields.detectionEngine:"suricata" | table event.dataset soc.fields.deployedButNotEnabledCount soc.fields.enabledButNotDeployedCount soc.fields.syncId' + elastalert: + default: 'tags:so-soc AND elastalert | groupby log.level | groupby event.action | groupby soc.fields.error' + IntegrityFailure: 'event.action: "integrity check failed" AND soc.fields.detectionEngine:"elastalert" | table event.dataset soc.fields.deployedButNotEnabledCount soc.fields.enabledButNotDeployedCount soc.fields.syncId' + strelka: + default: 'tags:so-soc AND strelka | groupby log.level | groupby event.action | groupby soc.fields.error' + IntegrityFailure: 'event.action: "integrity check failed" AND soc.fields.detectionEngine:"strelka" | table event.dataset soc.fields.deployedButNotEnabledCount soc.fields.enabledButNotDeployedCount soc.fields.syncId' detection: + showUnreviewedAiSummaries: false presets: severity: customEnabled: false diff --git a/salt/soc/enabled.sls b/salt/soc/enabled.sls index 99499115c..32437bd99 100644 --- a/salt/soc/enabled.sls +++ b/salt/soc/enabled.sls @@ -44,6 +44,7 @@ so-soc: - /opt/so/conf/soc/custom.js:/opt/sensoroni/html/js/custom.js:ro - /opt/so/conf/soc/custom_roles:/opt/sensoroni/rbac/custom_roles:ro - /opt/so/conf/soc/soc_users_roles:/opt/sensoroni/rbac/users_roles:rw + - /opt/so/conf/soc/soc_clients_roles:/opt/sensoroni/rbac/clients_roles:rw - /opt/so/conf/soc/queue:/opt/sensoroni/queue:rw - /opt/so/saltstack:/opt/so/saltstack:rw - /opt/so/conf/soc/migrations:/opt/so/conf/soc/migrations:rw @@ -82,6 +83,7 @@ so-soc: - file: soccustom - file: soccustomroles - file: socusersroles + - file: socclientsroles delete_so-soc_so-status.disabled: file.uncomment: diff --git a/salt/soc/files/bin/salt-relay.sh b/salt/soc/files/bin/salt-relay.sh index 4b183b20a..18ce8c0b0 100755 --- a/salt/soc/files/bin/salt-relay.sh +++ b/salt/soc/files/bin/salt-relay.sh @@ -89,7 +89,7 @@ function manage_user() { add) email=$(echo "$request" | jq -r .email) password=$(echo "$request" | jq -r .password) - role=$(echo "$request" | jq -r .role) + perm=$(echo "$request" | jq -r .role) firstName=$(echo "$request" | jq -r .firstName) lastName=$(echo "$request" | jq -r .lastName) note=$(echo "$request" | jq -r .note) @@ -97,7 +97,7 @@ function manage_user() { response=$(echo "$password" | so-user "$op" --email "$email" --firstName "$firstName" --lastName "$lastName" --note "$note" --role "$role" --skip-sync) exit_code=$? ;; - add|enable|disable|delete) + enable|disable|delete) email=$(echo "$request" | jq -r .email) log "Performing user '$op' for user '$email'" response=$(so-user "$op" --email "$email" --skip-sync) @@ -155,6 +155,77 @@ function manage_user() { fi } +function manage_client() { + id=$1 + request=$2 + op=$(echo "$request" | jq -r .operation) + + webResponse="true" + max_tries=10 + tries=0 + while [[ $tries -lt $max_tries ]]; do + case "$op" in + add) + name=$(echo "$request" | jq -r .name) + note=$(echo "$request" | jq -r .note) + log "Performing client '$op' for client with name '$name' and note '$note'" + response=$(so-client "$op" --name "$name" --note "$note" --json) + exit_code=$? + webResponse=$response + ;; + delete) + client_id=$(echo "$request" | jq -r .id) + log "Performing client '$op' for client '$client_id'" + response=$(so-client "$op" --id "$client_id") + exit_code=$? + ;; + addperm|delperm) + client_id=$(echo "$request" | jq -r .id) + perm=$(echo "$request" | jq -r .permission) + log "Performing '$op' for client '$client_id' with permission '$perm'" + response=$(so-client "$op" --id "$client_id" --permission "$perm") + exit_code=$? + ;; + generate-secret) + client_id=$(echo "$request" | jq -r .id) + log "Performing '$op' operation for client '$client_id'" + response=$(so-client "$op" --id "$client_id" --json) + exit_code=$? + webResponse=$response + ;; + update) + client_id=$(echo "$request" | jq -r .id) + name=$(echo "$request" | jq -r .name) + note=$(echo "$request" | jq -r .note) + searchusername=$(echo "$request" | jq -r .searchusername) + log "Performing '$op' update for client '$client_id' with name '$name', search username '$searchusername', and note '$note'" + response=$(so-client "$op" --id "$client_id" --name "$name" --searchusername "$searchusername" --note "$note") + exit_code=$? + ;; + *) + response="Unsupported client operation: $op" + exit_code=1 + ;; + esac + + tries=$((tries+1)) + if [[ "$response" == "Another process is using so-user"* ]]; then + log "Retrying after brief delay to let so-user unlock ($tries/$max_tries)" + sleep 5 + else + break + fi + done + + if [[ exit_code -eq 0 ]]; then + log "Successful command execution" + respond "$id" "$webResponse" + else + log "Unsuccessful command execution: $response ($exit_code)" + respond "$id" "false" + fi +} + function manage_salt() { id=$1 request=$2 @@ -319,6 +390,9 @@ while true; do list-minions) list_minions "$id" ;; + manage-client) + manage_client "$id" "${request}" + ;; manage-minion) manage_minion "$id" "${request}" ;; diff --git a/salt/soc/files/soc/detections_custom_repo_template_readme.jinja b/salt/soc/files/soc/detections_custom_repo_template_readme.jinja new file mode 100644 index 000000000..228a467bf --- /dev/null +++ b/salt/soc/files/soc/detections_custom_repo_template_readme.jinja @@ -0,0 +1,94 @@ +{% if repo_type == 'yara' %} +# YARA Local Custom Rules Repository + +This folder has already been initialized as a git repo +and your Security Onion grid is configured to import any YARA rule files found here. + +Just add your rule file and commit it. + +For example: + +** Note: If this is your first time making changes to this repo, you may run into the following error: + +fatal: detected dubious ownership in repository at '/nsm/rules/custom-local-repos/local-yara' +To add an exception for this directory, call: + git config --global --add safe.directory /nsm/rules/custom-local-repos/local-yara + +This means that the user you are running commands as does not match the user that is used for this git repo (socore). +You will need to make sure your rule files are accessible to the socore user, so either su to socore +or add the exception and then chown the rule files later. + +Also, you will be asked to set some configuration: +``` +Author identity unknown +*** Please tell me who you are. +Run + git config --global user.email "you@example.com" + git config --global user.name "Your Name" +to set your account's default identity. +Omit --global to set the identity only in this repository. +``` + +Run these commands, ommitting the `--global`. + +With that out of the way: + +First, create the rule file with a .yar extension: +`vi my_custom_rule.yar` + +Next, use git to stage the new rule to be committed: +`git add my_custom_rule.yar` + +Finally, commit it: +`git commit -m "Initial commit of my_custom_rule.yar"` + +The next time the Strelka / YARA engine syncs, the new rule should be imported +If there are errors, review the sync log to troubleshoot further. + +{% elif repo_type == 'sigma' %} +# Sigma Local Custom Rules Repository + +This folder has already been initialized as a git repo +and your Security Onion grid is configured to import any Sigma rule files found here. + +Just add your rule file and commit it. + +For example: + +** Note: If this is your first time making changes to this repo, you may run into the following error: + +fatal: detected dubious ownership in repository at '/nsm/rules/custom-local-repos/local-sigma' +To add an exception for this directory, call: + git config --global --add safe.directory /nsm/rules/custom-local-repos/local-sigma + +This means that the user you are running commands as does not match the user that is used for this git repo (socore). +You will need to make sure your rule files are accessible to the socore user, so either su to socore +or add the exception and then chown the rule files later. + +Also, you will be asked to set some configuration: +``` +Author identity unknown +*** Please tell me who you are. +Run + git config --global user.email "you@example.com" + git config --global user.name "Your Name" +to set your account's default identity. +Omit --global to set the identity only in this repository. +``` + +Run these commands, ommitting the `--global`. + +With that out of the way: + +First, create the rule file with a .yml or .yaml extension: +`vi my_custom_rule.yml` + +Next, use git to stage the new rule to be committed: +`git add my_custom_rule.yml` + +Finally, commit it: +`git commit -m "Initial commit of my_custom_rule.yml"` + +The next time the Elastalert / Sigma engine syncs, the new rule should be imported +If there are errors, review the sync log to troubleshoot further. +{% endif %} \ No newline at end of file diff --git a/salt/soc/files/soc/sigma_so_pipeline.yaml b/salt/soc/files/soc/sigma_so_pipeline.yaml index 8314361f5..df8b2709a 100644 --- a/salt/soc/files/soc/sigma_so_pipeline.yaml +++ b/salt/soc/files/soc/sigma_so_pipeline.yaml @@ -106,3 +106,23 @@ transformations: - type: include_fields fields: - event.code + # Maps process_creation rules to endpoint process creation logs + # This is an OS-agnostic mapping, to account for logs that don't specify source OS + - id: endpoint_process_create_windows_add-fields + type: add_condition + conditions: + event.category: 'process' + event.type: 'start' + rule_conditions: + - type: logsource + category: process_creation + # Maps file_event rules to endpoint file creation logs + # This is an OS-agnostic mapping, to account for logs that don't specify source OS + - id: endpoint_file_create_add-fields + type: add_condition + conditions: + event.category: 'file' + event.type: 'creation' + rule_conditions: + - type: logsource + category: file_event \ No newline at end of file diff --git a/salt/soc/soc_soc.yaml b/salt/soc/soc_soc.yaml index 308044d50..c27228ab6 100644 --- a/salt/soc/soc_soc.yaml +++ b/salt/soc/soc_soc.yaml @@ -1,6 +1,6 @@ soc: enabled: - description: You can enable or disable SOC. + description: Enables or disables SOC. WARNING - Disabling this setting is unsupported and will cause the grid to malfunction. Re-enabling this setting is a manual effort via SSH. advanced: True telemetryEnabled: title: SOC Telemetry @@ -117,6 +117,7 @@ soc: syntax: yaml helpLink: notifications.html forcedType: string + jinjaEscaped: True additionalSev1Alerters: title: "Notifications: Sev 1/Informational Alerters" description: "Specify specific alerters to use when alerting at the info severity level or higher. These alerters will be used unless overridden by higher severity alerter settings. Specify one alerter name (Ex: 'email') per line. Alerters refers to ElastAlert 2 alerters, as documented at https://elastalert2.readthedocs.io. A full update of the ElastAlert rule engine, via the Detections screen, is required in order to apply these changes. Requires a valid Security Onion license key." @@ -132,6 +133,7 @@ soc: syntax: yaml helpLink: notifications.html forcedType: string + jinjaEscaped: True additionalSev2Alerters: title: "Notifications: Sev 2/Low Alerters" description: "Specify specific alerters to use when alerting at the low severity level or higher. These alerters will be used unless overridden by higher severity alerter settings. Specify one alerter name (Ex: 'email') per line. Alerters refers to ElastAlert 2 alerters, as documented at https://elastalert2.readthedocs.io. A full update of the ElastAlert rule engine, via the Detections screen, is required in order to apply these changes. Requires a valid Security Onion license key." @@ -147,6 +149,7 @@ soc: syntax: yaml helpLink: notifications.html forcedType: string + jinjaEscaped: True additionalSev3Alerters: title: "Notifications: Sev 3/Medium Alerters" description: "Specify specific alerters to use when alerting at the medium severity level or higher. These alerters will be used unless overridden by higher severity alerter settings. Specify one alerter name (Ex: 'email') per line. Alerters refers to ElastAlert 2 alerters, as documented at https://elastalert2.readthedocs.io. A full update of the ElastAlert rule engine, via the Detections screen, is required in order to apply these changes. Requires a valid Security Onion license key." @@ -162,6 +165,7 @@ soc: syntax: yaml helpLink: notifications.html forcedType: string + jinjaEscaped: True additionalSev4Alerters: title: "Notifications: Sev 4/High Alerters" description: "Specify specific alerters to use when alerting at the high severity level or critical severity level. These alerters will be used unless overridden by critical severity alerter settings. Specify one alerter name (Ex: 'email') per line. Alerters refers to ElastAlert 2 alerters, as documented at https://elastalert2.readthedocs.io. A full update of the ElastAlert rule engine, via the Detections screen, is required in order to apply these changes. Requires a valid Security Onion license key." @@ -177,6 +181,7 @@ soc: syntax: yaml helpLink: notifications.html forcedType: string + jinjaEscaped: True additionalSev5Alerters: title: "Notifications: Sev 5/Critical Alerters" description: "Specify specific alerters to use when alerting at the critical severity level. Specify one alerter name (Ex: 'email') per line. Alerters refers to ElastAlert 2 alerters, as documented at https://elastalert2.readthedocs.io. A full update of the ElastAlert rule engine, via the Detections screen, is required in order to apply these changes. Requires a valid Security Onion license key." @@ -192,6 +197,7 @@ soc: syntax: yaml helpLink: notifications.html forcedType: string + jinjaEscaped: True additionalUserDefinedNotifications: customAlerters: description: "Specify custom notification alerters to use when the Sigma rule contains the following tag: so.alerters.customAlerters. This setting can be duplicated to create new custom alerter configurations. Specify one alerter name (Ex: 'email') per line. Alerters refers to ElastAlert 2 alerters, as documented at https://elastalert2.readthedocs.io. A full update of the ElastAlert rule engine, via the Detections screen, is required in order to apply these changes. Requires a valid Security Onion license key." @@ -208,6 +214,7 @@ soc: helpLink: notifications.html duplicates: True forcedType: string + jinjaEscaped: True autoEnabledSigmaRules: default: &autoEnabledSigmaRules description: 'Sigma rules to automatically enable on initial import. Format is $Ruleset+$Level - for example, for the core community ruleset and critical level rules: core+critical. These will be applied based on role if defined and default if not.' @@ -383,6 +390,12 @@ soc: advanced: True forcedType: "[]{}" helpLink: suricata.html + ignoredSidRanges: + description: 'List of Suricata SID ranges to ignore during the Integrity Check. This is useful for ignoring specific rules not governed by the UI. Each line should contain 1 range in the format "1100000-1200000". The ranges are treated as inclusive.' + global: True + advanced: True + forcedType: "[]string" + helpLink: detections.html#rule-engine-status client: enableReverseLookup: description: Set to true to enable reverse DNS lookups for IP addresses in the SOC UI. @@ -454,8 +467,18 @@ soc: alerts: *appSettings cases: *appSettings dashboards: *appSettings - detections: *appSettings + detections: + <<: *appSettings + detectionEngineStatusQueries: + description: Queries mapped to the detection engine statuses. Acceptable statuses are "Migrating", "Importing", "MigrationFailure", "IntegrityFailure", "SyncFailure", "ImportPending", "Syncing", and "Healthy" and will fallback to a "default" entry if specified. + global: True + syntax: yaml + multiline: True + forcedType: "string" detection: + showUnreviewedAiSummaries: + description: Show AI summaries in detections even if they have not yet been reviewed by a human. + global: True templateDetections: suricata: description: The template used when creating a new Suricata detection. [publicId] will be replaced with an unused Public Id. diff --git a/salt/stig/soc_stig.yaml b/salt/stig/soc_stig.yaml index 597aab809..81794c5de 100644 --- a/salt/stig/soc_stig.yaml +++ b/salt/stig/soc_stig.yaml @@ -1,6 +1,6 @@ stig: enabled: - description: You can enable or disable the application of STIGS using oscap. Note that the actions performed by OSCAP are not automatically reversible. Requires a valid Security Onion license key. + description: Enables or disables the application of STIGS using oscap. Note that the actions performed by OSCAP are not automatically reversible. Requires a valid Security Onion license key. forcedType: bool advanced: True run_interval: diff --git a/salt/strelka/filestream/config.sls b/salt/strelka/filestream/config.sls index 0f9f38914..2809bd8b1 100644 --- a/salt/strelka/filestream/config.sls +++ b/salt/strelka/filestream/config.sls @@ -99,12 +99,14 @@ filecheck.log: - name: /opt/so/log/strelka/filecheck.log - user: {{ filecheck_runas }} - group: {{ filecheck_runas }} + - replace: False filecheck_stdout.log: file.managed: - name: /opt/so/log/strelka/filecheck_stdout.log - user: {{ filecheck_runas }} - group: {{ filecheck_runas }} + - replace: False {% if GLOBALS.md_engine == 'ZEEK' %} diff --git a/salt/strelka/soc_strelka.yaml b/salt/strelka/soc_strelka.yaml index 947215bd5..1dc4fa455 100644 --- a/salt/strelka/soc_strelka.yaml +++ b/salt/strelka/soc_strelka.yaml @@ -1,7 +1,7 @@ strelka: backend: enabled: - description: You can enable or disable Strelka backend. + description: Enables or disables the Strelka file analysis process. helpLink: strelka.html config: backend: diff --git a/salt/suricata/soc_suricata.yaml b/salt/suricata/soc_suricata.yaml index f865468e1..8b5ce7b11 100644 --- a/salt/suricata/soc_suricata.yaml +++ b/salt/suricata/soc_suricata.yaml @@ -1,6 +1,6 @@ suricata: enabled: - description: You can enable or disable Suricata. + description: Enables or disables the Suricata process. This process is used for triggering alerts and optionally for protocol metadata collection and full packet capture. helpLink: suricata.html thresholding: sids__yaml: diff --git a/salt/telegraf/soc_telegraf.yaml b/salt/telegraf/soc_telegraf.yaml index e6e7ea9a2..b54913da7 100644 --- a/salt/telegraf/soc_telegraf.yaml +++ b/salt/telegraf/soc_telegraf.yaml @@ -1,6 +1,7 @@ telegraf: enabled: - description: You can enable or disable Telegraf. + description: Enables the grid metrics collection process. WARNING - Security Onion grid health monitoring requires this process to remain enabled. Disabling it will cause unexpected and unsupported results. + advanced: True helpLink: influxdb.html config: interval: diff --git a/salt/top.sls b/salt/top.sls index 7365e0e83..437c44bf8 100644 --- a/salt/top.sls +++ b/salt/top.sls @@ -12,6 +12,7 @@ base: '*': - cron.running - repo.client + - versionlock - ntp - schedule - logrotate @@ -61,6 +62,7 @@ base: - influxdb - soc - kratos + - hydra - sensoroni - telegraf - firewall @@ -90,6 +92,7 @@ base: - strelka.manager - soc - kratos + - hydra - firewall - manager - sensoroni @@ -122,6 +125,7 @@ base: - influxdb - soc - kratos + - hydra - firewall - sensoroni - telegraf @@ -168,6 +172,7 @@ base: - strelka.manager - soc - kratos + - hydra - firewall - manager - sensoroni @@ -219,6 +224,7 @@ base: - strelka.manager - soc - kratos + - hydra - sensoroni - telegraf - firewall @@ -271,6 +277,7 @@ base: - sensoroni - telegraf - elasticfleet.install_agent_grid + - stig 'J@desktop:gui:enabled:^[Tt][Rr][Uu][Ee]$ and ( G@saltversion:{{saltversion}} and G@os:OEL )': - match: compound diff --git a/salt/vars/globals.map.jinja b/salt/vars/globals.map.jinja index 0a4995c0c..000cfa354 100644 --- a/salt/vars/globals.map.jinja +++ b/salt/vars/globals.map.jinja @@ -53,6 +53,7 @@ {% do GLOBALS.update({ 'application_urls': { + 'hydra': 'http://' ~ GLOBALS.manager ~ ':4445/', 'kratos': 'http://' ~ GLOBALS.manager ~ ':4434/', 'elastic': 'https://' ~ GLOBALS.manager ~ ':9200/', 'influxdb': 'https://' ~ GLOBALS.manager ~ ':8086/' diff --git a/salt/versionlock/defaults.yaml b/salt/versionlock/defaults.yaml new file mode 100644 index 000000000..cacd1d7bb --- /dev/null +++ b/salt/versionlock/defaults.yaml @@ -0,0 +1,2 @@ +versionlock: + hold: [] diff --git a/salt/versionlock/init.sls b/salt/versionlock/init.sls new file mode 100644 index 000000000..a310356b4 --- /dev/null +++ b/salt/versionlock/init.sls @@ -0,0 +1,19 @@ +# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one +# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at +# https://securityonion.net/license; you may not use this file except in compliance with the +# Elastic License 2.0. + +{% if grains.os_family == 'Debian' or (grains.os_family == 'RedHat' and salt['pkg.version']('python3-dnf-plugin-versionlock') != "") %} +{% from 'versionlock/map.jinja' import VERSIONLOCKMERGED %} +{% for pkg in VERSIONLOCKMERGED.hold %} +{{pkg}}_held: + pkg.held: + - name: {{pkg}} +{% endfor %} + +{% for pkg in VERSIONLOCKMERGED.UNHOLD %} +{{pkg}}_unheld: + pkg.unheld: + - name: {{pkg}} +{% endfor %} +{% endif %} diff --git a/salt/versionlock/map.jinja b/salt/versionlock/map.jinja new file mode 100644 index 000000000..1477657bc --- /dev/null +++ b/salt/versionlock/map.jinja @@ -0,0 +1,38 @@ +{# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one + or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at + https://securityonion.net/license; you may not use this file except in compliance with the + Elastic License 2.0. #} + +{% import_yaml 'versionlock/defaults.yaml' as VERSIONLOCKDEFAULTS %} +{% set VERSIONLOCKMERGED = salt['pillar.get']('versionlock', VERSIONLOCKDEFAULTS.versionlock, merge=True) %} + +{% if grains.os_family == 'RedHat' %} +{% set HELD = salt['pkg.list_holds']() %} +{% else %} +{% set HELD = salt['pkg.get_selections'](state='hold')['hold'] %} +{% endif %} + +{# these are packages held / versionlock in other states #} +{% set PACKAGES_HELD_IN_OTHER_STATES = [ + 'salt', + 'salt-master', + 'salt-minion', + 'containerd.io', + 'docker-ce', + 'docker-ce-cli', + 'docker-ce-rootless-extras' +] %} + +{# remove packages held in other states from hold list #} +{% do VERSIONLOCKMERGED.update({'hold': VERSIONLOCKMERGED['hold'] | unique | reject('in', PACKAGES_HELD_IN_OTHER_STATES) | list }) %} + +{# initiate VERSIONLOCKMERGED.UNHOLD #} +{% do VERSIONLOCKMERGED.update({'UNHOLD': []}) %} + +{# if a package is currently held but not set to be held, unhold it #} +{% for item in HELD %} + {% set base_name = item.rsplit('-', 2)[0] %} + {% if base_name not in VERSIONLOCKMERGED['hold'] and base_name not in PACKAGES_HELD_IN_OTHER_STATES and base_name not in VERSIONLOCKMERGED['UNHOLD'] %} + {% do VERSIONLOCKMERGED['UNHOLD'].append(base_name) %} + {% endif %} +{% endfor %} diff --git a/salt/versionlock/soc_versionlock.yaml b/salt/versionlock/soc_versionlock.yaml new file mode 100644 index 000000000..92fd69875 --- /dev/null +++ b/salt/versionlock/soc_versionlock.yaml @@ -0,0 +1,7 @@ +versionlock: + hold: + description: List of packages to prevent from upgrading. To reduce the frequency of required reboots, add 'kernel' to this list for RedHat based OS families. For Debian, please see the documentation. + global: True + forcedType: "[]string" + multiline: True + helpLink: versionlock.html diff --git a/salt/zeek/defaults.yaml b/salt/zeek/defaults.yaml index 2621c2738..b4291640a 100644 --- a/salt/zeek/defaults.yaml +++ b/salt/zeek/defaults.yaml @@ -26,7 +26,6 @@ zeek: local: load: - misc/loaded-scripts - - tuning/defaults - misc/capture-loss - frameworks/software/vulnerable - frameworks/software/version-changes @@ -70,6 +69,7 @@ zeek: - zeek-plugin-profinet - zeek-spicy-wireguard - zeek-spicy-stun + - http2 load-sigs: - frameworks/signatures/detect-windows-shells redef: diff --git a/salt/zeek/soc_zeek.yaml b/salt/zeek/soc_zeek.yaml index 1594eed58..f5f718114 100644 --- a/salt/zeek/soc_zeek.yaml +++ b/salt/zeek/soc_zeek.yaml @@ -1,6 +1,6 @@ zeek: enabled: - description: You can enable or disable ZEEK on all sensors or a single sensor. + description: Controls whether the Zeek (network packet inspection) process runs. Disabling this process could result in loss of network protocol metadata. If Suricata was selected as the protocol metadata engine during setup then this will already be disabled. helpLink: zeek.html config: local: diff --git a/setup/so-functions b/setup/so-functions index 23b16156d..914e0c2cd 100755 --- a/setup/so-functions +++ b/setup/so-functions @@ -42,9 +42,19 @@ logCmd() { ### End Logging Section ### airgap_rules() { - # Copy the rules for suricata if using Airgap + # Copy the rules for detections if using Airgap mkdir -p /nsm/rules - cp -Rv /root/SecurityOnion/agrules/* /nsm/rules/ + logCmd "rsync -av /root/SecurityOnion/agrules/ /nsm/rules/" + + # Copy over the securityonion-resources repo + logCmd "rsync -av /root/SecurityOnion/agrules/securityonion-resources /nsm/" +} + +airgap_detection_summaries() { + # Copy summaries over to SOC and checkout the correct branch + logCmd "rsync -av --chown=socore:socore /nsm/securityonion-resources /opt/so/conf/soc/ai_summary_repos" + logCmd "git config --global --add safe.directory /opt/so/conf/soc/ai_summary_repos/securityonion-resources" + logCmd "git -C /opt/so/conf/soc/ai_summary_repos/securityonion-resources checkout generated-summaries-published" } add_admin_user() { @@ -781,6 +791,7 @@ create_manager_pillars() { redis_pillar idstools_pillar kratos_pillar + hydra_pillar soc_pillar idh_pillar influxdb_pillar @@ -793,7 +804,7 @@ create_manager_pillars() { create_repo() { title "Create the repo directory" - logCmd "dnf -y install yum-utils createrepo" + logCmd "dnf -y install yum-utils createrepo_c" logCmd "createrepo /nsm/repo" } @@ -1098,6 +1109,8 @@ generate_passwords(){ INFLUXTOKEN=$(head -c 64 /dev/urandom | base64 --wrap=0) SENSORONIKEY=$(get_random_value) KRATOSKEY=$(get_random_value) + HYDRAKEY=$(get_random_value) + HYDRASALT=$(get_random_value) REDISPASS=$(get_random_value) SOCSRVKEY=$(get_random_value 64) IMPORTPASS=$(get_random_value) @@ -1293,6 +1306,24 @@ kratos_pillar() { "" > "$kratos_pillar_file" } +hydra_pillar() { + title "Create the Hydra pillar file" + touch $adv_hydra_pillar_file + touch $hydra_pillar_file + chmod 660 $hydra_pillar_file + printf '%s\n'\ + "hydra:"\ + " config:"\ + " secrets:"\ + " system:"\ + " - '$HYDRAKEY'"\ + " oidc:"\ + " subject_identifiers:"\ + " pairwise:"\ + " salt: '$HYDRASALT'"\ + "" > "$hydra_pillar_file" +} + create_global() { title "Creating the global.sls" touch $adv_global_pillar_file @@ -1330,8 +1361,8 @@ create_global() { echo " registry_host: '$HOSTNAME'" >> $global_pillar_file echo " endgamehost: '$ENDGAMEHOST'" >> $global_pillar_file - if [ "$install_type" = 'EVAL' ]; then - echo " pcapengine: SURICATA" >> $global_pillar_file + if [[ $is_standalone || $is_eval ]]; then + echo " pcapengine: SURICATA" >> $global_pillar_file fi } @@ -1394,10 +1425,10 @@ make_some_dirs() { mkdir -p $local_salt_dir/salt/firewall/portgroups mkdir -p $local_salt_dir/salt/firewall/ports - for THEDIR in bpf pcap elasticsearch ntp firewall redis backup influxdb strelka sensoroni soc docker zeek suricata nginx telegraf logstash soc manager kratos idstools idh elastalert stig global kafka;do - mkdir -p $local_salt_dir/pillar/$THEDIR - touch $local_salt_dir/pillar/$THEDIR/adv_$THEDIR.sls - touch $local_salt_dir/pillar/$THEDIR/soc_$THEDIR.sls + for THEDIR in bpf pcap elasticsearch ntp firewall redis backup influxdb strelka sensoroni soc docker zeek suricata nginx telegraf logstash soc manager kratos hydra idstools idh elastalert stig global kafka versionlock; do + mkdir -p $local_salt_dir/pillar/$THEDIR + touch $local_salt_dir/pillar/$THEDIR/adv_$THEDIR.sls + touch $local_salt_dir/pillar/$THEDIR/soc_$THEDIR.sls done } @@ -1629,6 +1660,7 @@ reinstall_init() { # Backup (and erase) directories in /nsm to prevent app errors backup_dir /nsm/mysql "$date_string" backup_dir /nsm/kratos "$date_string" + backup_dir /nsm/hydra "$date_string" backup_dir /nsm/influxdb "$date_string" # Uninstall local Elastic Agent, if installed @@ -1818,7 +1850,6 @@ repo_sync_local() { # After the download is complete run createrepo create_repo fi - else # Add the proper repos for unsupported stuff echo "Adding Repos" @@ -1834,9 +1865,9 @@ repo_sync_local() { fi dnf install -y yum-utils device-mapper-persistent-data lvm2 curl -fsSL https://repo.securityonion.net/file/so-repo/prod/2.4/so/so.repo | tee /etc/yum.repos.d/so.repo - rpm --import https://repo.saltproject.io/salt/py3/redhat/9/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub + rpm --import https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - curl -fsSL "https://repo.saltproject.io/salt/py3/redhat/9/x86_64/minor/$SALTVERSION.repo" | tee /etc/yum.repos.d/salt.repo + curl -fsSL "https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.repo" | tee /etc/yum.repos.d/salt.repo dnf repolist curl --retry 5 --retry-delay 60 -A "netinstall/$SOVERSION/$OS/$(uname -r)/1" https://sigs.securityonion.net/checkup --output /tmp/install else @@ -1869,27 +1900,22 @@ saltify() { logCmd "mkdir -vp /etc/apt/keyrings" logCmd "wget -q --inet4-only -O /etc/apt/keyrings/docker.pub https://download.docker.com/linux/ubuntu/gpg" + # Download public key + logCmd "curl -fsSL -o /etc/apt/keyrings/salt-archive-keyring-2023.pgp https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public" + # Create apt repo target configuration + echo "deb [signed-by=/etc/apt/keyrings/salt-archive-keyring-2023.pgp arch=amd64] https://packages.broadcom.com/artifactory/saltproject-deb/ stable main" | sudo tee /etc/apt/sources.list.d/salt.list + if [[ $is_ubuntu ]]; then - - # Add Salt Repo - logCmd "curl -fsSL -o /etc/apt/keyrings/salt-archive-keyring-2023.gpg https://repo.saltproject.io/salt/py3/ubuntu/$UBVER/amd64/minor/$SALTVERSION/SALT-PROJECT-GPG-PUBKEY-2023.gpg" - echo "deb [signed-by=/etc/apt/keyrings/salt-archive-keyring-2023.gpg] https://repo.saltproject.io/salt/py3/ubuntu/$UBVER/amd64/minor/$SALTVERSION/ $OSVER main" | sudo tee /etc/apt/sources.list.d/salt.list - # Add Docker Repo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" else - # Add Salt Repo *NOTE* You have to use debian 11 since it isn't out for 12 - logCmd "curl -fsSL -o /etc/apt/keyrings/salt-archive-keyring-2023.gpg https://repo.saltproject.io/salt/py3/debian/11/amd64/minor/$SALTVERSION/SALT-PROJECT-GPG-PUBKEY-2023.gpg" - echo "deb [signed-by=/etc/apt/keyrings/salt-archive-keyring-2023.gpg] https://repo.saltproject.io/salt/py3/debian/11/amd64/minor/$SALTVERSION/ bullseye main" | sudo tee /etc/apt/sources.list.d/salt.list - # Add Docker Repo curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $OSVER stable" > /etc/apt/sources.list.d/docker.list - fi - logCmd "apt-key add /etc/apt/keyrings/salt-archive-keyring-2023.gpg" + logCmd "apt-key add /etc/apt/keyrings/salt-archive-keyring-2023.pgp" #logCmd "apt-key add /opt/so/gpg/SALTSTACK-GPG-KEY.pub" logCmd "apt-key add /etc/apt/keyrings/docker.pub" diff --git a/setup/so-setup b/setup/so-setup index cb4e7ebf0..b7723da37 100755 --- a/setup/so-setup +++ b/setup/so-setup @@ -692,8 +692,10 @@ if ! [[ -f $install_opt_file ]]; then logCmd "so-minion -o=setup" title "Creating Global SLS" - # Airgap Rules - airgap_rules + if [[ $is_airgap ]]; then + # Airgap Rules + airgap_rules + fi manager_pillar @@ -763,6 +765,10 @@ if ! [[ -f $install_opt_file ]]; then logCmd "salt-call state.apply suricata -l info" fi fi + if [[ $is_airgap ]]; then + title "Syncing AI-Generated Detection Summaries" + airgap_detection_summaries + fi title "Setting up Kibana Default Space" logCmd "so-kibana-space-defaults" add_web_user diff --git a/setup/so-variables b/setup/so-variables index ecc29b554..fc253df0a 100644 --- a/setup/so-variables +++ b/setup/so-variables @@ -160,6 +160,12 @@ export kratos_pillar_file adv_kratos_pillar_file="$local_salt_dir/pillar/kratos/adv_kratos.sls" export adv_kratos_pillar_file +hydra_pillar_file="$local_salt_dir/pillar/hydra/soc_hydra.sls" +export hydra_pillar_file + +adv_hydra_pillar_file="$local_salt_dir/pillar/hydra/adv_hydra.sls" +export adv_hydra_pillar_file + idstools_pillar_file="$local_salt_dir/pillar/idstools/soc_idstools.sls" export idstools_pillar_file diff --git a/sigs/securityonion-2.4.110-20241004.iso.sig b/sigs/securityonion-2.4.110-20241004.iso.sig new file mode 100644 index 000000000..40bc093e2 Binary files /dev/null and b/sigs/securityonion-2.4.110-20241004.iso.sig differ diff --git a/sigs/securityonion-2.4.110-20241010.iso.sig b/sigs/securityonion-2.4.110-20241010.iso.sig new file mode 100644 index 000000000..90849a7b6 Binary files /dev/null and b/sigs/securityonion-2.4.110-20241010.iso.sig differ