Поиск по этому блогу

пятница, 27 ноября 2015 г.

speedtest у консолі

Так, мабуть всі знають про iperf. Для нього треба щоб була серверна частина та клієнтська. Це не завжди можливо, якщо немає десь у теренах зайвого хоста.

Але всі, або майже всі, знають такий ресурс як http://www.speedtest.net/. Чи можна скористуватись ним не заходячи з браузера на сайт? Виявляється, що можна.

Далі покроково.
Встановлюємо пакет python-pip і вже з pip-у встановлюємо клієнта для http://www.speedtest.net/:
$ sudo aptitude install python-pip
$ sudo pip install speedtest-cli
Оновити клієнта можна завжди так:
$ sudo pip install speedtest-cli --upgrade
Після цього в нас з'явиться скрипт /usr/local/bin/speedtest-cli.
$ speedtest-cli --help
usage: speedtest-cli [-h] [--bytes] [--share] [--simple] [--list]
                     [--server SERVER] [--mini MINI] [--source SOURCE]
                     [--timeout TIMEOUT] [--secure] [--version]

Command line interface for testing internet bandwidth using speedtest.net.
--------------------------------------------------------------------------
https://github.com/sivel/speedtest-cli

optional arguments:
  -h, --help         show this help message and exit
  --bytes            Display values in bytes instead of bits. Does not affect
                     the image generated by --share
  --share            Generate and provide a URL to the speedtest.net share
                     results image
  --simple           Suppress verbose output, only show basic information
  --list             Display a list of speedtest.net servers sorted by
                     distance
  --server SERVER    Specify a server ID to test against
  --mini MINI        URL of the Speedtest Mini server
  --source SOURCE    Source IP address to bind to
  --timeout TIMEOUT  HTTP timeout in seconds. Default 10
  --secure           Use HTTPS instead of HTTP when communicating with
                     speedtest.net operated servers
  --version          Show the version number and exit
Скрипт можна запустити без будь-яких параметрів, тоді ми отримаємо тест з найближчого ресурсу (ну або начебто найближчого):
$ speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Ukrcom Ltd. (aaa.bbb.ccc.ddd)...
Selecting best server based on latency...
Hosted by MIIT (Kiev) [0.00 km]: 1.992 ms
Testing download speed........................................
Download: 680.18 Mbit/s
Testing upload speed..................................................
Upload: 272.63 Mbit/s
Якщо скрипту вказати опцію --bytes то швидкість буде виведено не в бітах, а в байтах (комусь треба?).
Також можна отримати посилання на малюнок до проведеного тесту, використовуємо опцію --share:
$ speedtest-cli --share
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Ukrcom Ltd. (aaa.bbb.ccc.ddd)...
Selecting best server based on latency...
Hosted by x.ua - CDN (Kiev) [0.00 km]: 1.5 ms
Testing download speed........................................
Download: 916.29 Mbit/s
Testing upload speed..................................................
Upload: 358.14 Mbit/s
Share results: http://www.speedtest.net/result/4866524488.png
З опцією --simple скрипт просто видасть мінімум інформації:
$ speedtest-cli --simple
Ping: 1.423 ms
Download: 550.00 Mbit/s
Upload: 258.33 Mbit/s
З опцією --list скрипт виведе список всіх доступних публічних серверів для тестування. З них можна відфільтрувати лише ті які нас цікавлять:
$ speedtest-cli --list | grep Kiev
3230) Life Astelit LLC (Kiev, Ukraine) [0.00 km]
2518) Volia (Kiev, Ukraine) [0.00 km]
 831) JSC Ukrtelecom (Kiev, Ukraine) [0.00 km]
5121) MIIT (Kiev, Ukraine) [0.00 km]
5072) x.ua - CDN (Kiev, Ukraine) [0.00 km]
5477) Lanet Network (Kiev, Ukraine) [0.00 km]
6312) Ipnet (Kiev, Ukraine) [0.00 km]
5884) Adamant Ltd. (Kiev, Ukraine) [0.00 km]
6010) Triolan (Kiev, Ukraine) [0.00 km]
6446) Kyivstar (Kiev, Ukraine) [0.00 km]
5447) Cosmonova (Kiev, Ukraine) [0.00 km]
6195) UnderNet (Kiev, Ukraine) [0.00 km]
6088) Prostonet (Kiev, Ukraine) [0.00 km]
6578) Vega (Farlep-Invest) (Kiev, Ukraine) [0.00 km]
1108) NetAssist (Kiev, Ukraine) [0.00 km]
Відповідно можна провести й тестування не до сервера який буде обрано автоматично, а до сервера який ми вкажемо самі:
$ speedtest-cli --server 6195 --share
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Ukrcom Ltd. (aaa.bbb.ccc.ddd)...
Hosted by UnderNet (Kiev) [0.00 km]: 1.691 ms
Testing download speed........................................
Download: 917.25 Mbit/s
Testing upload speed..................................................
Upload: 359.15 Mbit/s
Share results: http://www.speedtest.net/result/4866536345.png
Ну, а якщо десь у Вас є сервер зі Speedtest Mini то тестування можна провести й до нього, задавши опцію --mini та вказавши відповідний url до сервера:
$ speedtest-cli --mini http://speed.ukrhub.net/
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Ukrcom Ltd. (aaa.bbb.ccc.ddd)...
Hosted by Speedtest Mini (speed.ukrhub.net) [0.00 km]: 8.2 ms
Testing download speed........................................
Download: 787.69 Mbit/s
Testing upload speed..................................................
Upload: 333.48 Mbit/s
Ну і останнє (куди ж без цього?) - поточна версія скрипту:
$ speedtest-cli --version
0.3.4

вторник, 20 октября 2015 г.

MikroTik: RouterOS прозорий web-proxy

Налаштовуємо proxy-сервер.
Вмикаємо proxy:
/ip proxy
set cache-administrator=admin@email.com enabled=yes
Коригуємо доступ до деяких ресурсів.
/ip proxy access
add action=deny dst-host=xxx-tracker.com
add action=deny dst-host=*.pornhub.com
add action=deny dst-host=:xxx src-address=192.172.10.240/28
add action=deny dst-host=:porn src-address=192.172.10.240/28
add action=deny dst-host=:sex src-address=192.172.10.240/28
add action=deny dst-host=:tracker src-address=192.172.10.240/28
add action=deny dst-host=:mail src-address=192.172.10.240/28
add action=deny path=*.exe
add action=deny path=*.com
add action=deny path=*.dll
add action=deny path=*.cmd
add action=deny path=*.bat 
Регулюємо що зберігати у кеші, а що ні. Наприклад не треба зберігати динамічній контент, а це у нас явно всі php-скрипти та get-запити (містять "?" у запиті).
/ip proxy cache
add path="/*\\.html"
add path="/*\\.htm"
add path="/*\\.js"
add path="/*\\.css"
add path="/*\\.jpg"
add path="/*\\.gif"
add path="/*\\.png"
add path="/*\\.ico"
add path="/*\\.mp3"
add path="/*\\.bmp"
add path="/*\\.flv"
add action=deny path="/*\\.php*"
add action=deny path="/*\\\?*"
add path=/*
Прозоро перенаправляємо трафік, що адресується до web-ресурсів (80/tcp) на порт налаштованого proxy-сервера:
/ip firewall nat
add action=redirect chain=dstnat dst-port=80 in-interface=bridge-local \
    protocol=tcp to-ports=8080
Перевіряємо, що потрапляє у cache, а що ні:
> /ip proxy cache print detail without-paging   
Flags: X - disabled 
 0   dst-port="" path=/*\.html action=allow hits=0 

 1   dst-port="" path=/*\.htm action=allow hits=0 

 2   dst-port="" path=/*\.js action=allow hits=26 

 3   dst-port="" path=/*\.css action=allow hits=12 

 4   dst-port="" path=/*\.jpg action=allow hits=103 

 5   dst-port="" path=/*\.gif action=allow hits=57 

 6   dst-port="" path=/*\.png action=allow hits=41 

 7   dst-port="" path=/*\.ico action=allow hits=2 

 8   dst-port="" path=/*\.mp3 action=allow hits=0 

 9   dst-port="" path=/*\.bmp action=allow hits=0 

10   dst-port="" path=/*\.flv action=allow hits=0

среда, 29 июля 2015 г.

Juniper EX2200-24T-4G оновлення прошивки

root@:RE:0% cd /var/tmp
root@:RE:0% mkdir usb
Вставляємо флешку де записано прошивку, монтуємо її та копіюємо firmware:
root@:RE:0% ls -l /dev/da1*
crw-r-----  1 root  operator    0,  83 Jun 25 18:23 /dev/da1
crw-r-----  1 root  operator    0,  84 Jun 25 18:23 /dev/da1s1
root@:RE:0% mount_msdosfs /dev/da1s1 usb
root@:RE:0% cp usb/jinstall-ex-2200-12.3R10.2-domestic-signed.tgz .
root@:RE:0% umount /var/tmp/usb
Переходимо у cli та оновлюємось:
root@:RE:0% cli
root> request system software add jinstall-ex-2200-12.3R10.2-domestic-signed.tgz
root> request system reboot
Оновлюємось. Після того як все закінчиться знову заходимо у систему.
root@:RE:0% cli
root> show system storage partitions 
fpc0:
--------------------------------------------------------------------------
Boot Media: internal (da0)
Active Partition: da0s1a
Backup Partition: da0s2a
Currently booted from: active (da0s1a)

Partitions information:
  Partition  Size   Mountpoint
  s1a        183M   /         
  s2a        184M   altroot   
  s3d        369M   /var/tmp  
  s3e        123M   /var      
  s4d        62M    /config   

root> show system snapshot media internal   
fpc0:
--------------------------------------------------------------------------
Information for snapshot on       internal (/dev/da0s1a) (primary)
Creation date: Jun 25 19:00:55 2015
JUNOS version on snapshot:
  jbase  : ex-12.3R10.2
  jkernel-ex-2200: 12.3R10.2
  jcrypto-ex: 12.3R10.2
  jdocs-ex: 12.3R10.2
  jswitch-ex: 12.3R10.2
  jpfe-ex22x: 12.3R10.2
  jroute-ex: 12.3R10.2
  jweb-ex: 12.3R10.2
  fips-mode-arm: 12.3R10.2
Information for snapshot on       internal (/dev/da0s2a) (backup)
Creation date: Jun 25 18:18:09 2015
JUNOS version on snapshot:
  jbase  : ex-12.3R4.6
  jkernel-ex-2200: 12.3R4.6
  jcrypto-ex: 12.3R4.6
  jdocs-ex: 12.3R4.6
  jswitch-ex: 12.3R4.6
  jpfe-ex22x: 12.3R4.6
  jroute-ex: 12.3R4.6                   
  jweb-ex: 12.3R4.6
  fips-mode-arm: 12.3R4.6
Сінхронизуємо розділи:
root> request system snapshot media internal slice alternate
root> show system snapshot media internal 
fpc0:
--------------------------------------------------------------------------
Information for snapshot on       internal (/dev/da0s1a) (primary)
Creation date: Jun 25 19:00:55 2015
JUNOS version on snapshot:
  jbase  : ex-12.3R10.2
  jkernel-ex-2200: 12.3R10.2
  jcrypto-ex: 12.3R10.2
  jdocs-ex: 12.3R10.2
  jswitch-ex: 12.3R10.2
  jpfe-ex22x: 12.3R10.2
  jroute-ex: 12.3R10.2
  jweb-ex: 12.3R10.2
  fips-mode-arm: 12.3R10.2
Information for snapshot on       internal (/dev/da0s2a) (backup)
Creation date: Jun 25 19:24:54 2015
JUNOS version on snapshot:
  jbase  : ex-12.3R10.2
  jkernel-ex-2200: 12.3R10.2
  jcrypto-ex: 12.3R10.2
  jdocs-ex: 12.3R10.2
  jswitch-ex: 12.3R10.2
  jpfe-ex22x: 12.3R10.2
  jroute-ex: 12.3R10.2                  
  jweb-ex: 12.3R10.2
  fips-mode-arm: 12.3R10.2
Про всяк випадок перезавантажуємось:
root> request system reboot
і переконуємось, що все гаразд.

понедельник, 11 мая 2015 г.

Розборки з Sencha ExtJS 5. Використання Sencha Cmd з Ext JS 5.

Генеруємо додаток:
olden@olden:~/public_html/web$ sencha -sdk /home/olden/public_html/web/ext-5.1.0 generate app OSBB /home/olden/public_html/web/app 
Sencha Cmd v5.1.2.52
[INF] Processing Build Descriptor : default
[INF] Loading app json manifest...
[INF] Appending content to /home/olden/public_html/web/app/bootstrap.js
[INF] Writing content to /home/olden/public_html/web/app/bootstrap.json
Переходимо у додаток:
olden@olden:~/public_html/web$ cd app/
olden@olden:~/public_html/web/app$
На цей час маємо наступну структуру каталогів (розбираємо до третього рівня):
olden@olden:~/public_html/web/app$ tree -d -L 3 --noreport 
.
├── app
│   ├── model
│   ├── store
│   └── view
│       └── main
├── build
│   └── temp
│       └── development
├── ext
│   ├── build
│   ├── cmd
│   ├── licenses
│   ├── overrides
│   │   ├── app
│   │   ├── dom
│   │   ├── event
│   │   └── plugin
│   ├── packages
│   │   ├── ext-aria
│   │   ├── ext-charts
│   │   ├── ext-locale
│   │   ├── ext-theme-aria
│   │   ├── ext-theme-base
│   │   ├── ext-theme-classic
│   │   ├── ext-theme-classic-sandbox
│   │   ├── ext-theme-crisp
│   │   ├── ext-theme-crisp-touch
│   │   ├── ext-theme-gray
│   │   ├── ext-theme-neptune
│   │   ├── ext-theme-neptune-touch
│   │   ├── ext-theme-neutral
│   │   ├── ext-touch-sizing
│   │   ├── ext-ux
│   │   ├── sencha-amf
│   │   ├── sencha-charts
│   │   ├── sencha-core
│   │   └── sencha-soap
│   └── src
│       ├── app
│       ├── button
│       ├── container
│       ├── dashboard
│       ├── dd
│       ├── dom
│       ├── event
│       ├── flash
│       ├── form
│       ├── fx
│       ├── grid
│       ├── layout
│       ├── menu
│       ├── panel
│       ├── picker
│       ├── plugin
│       ├── resizer
│       ├── rtl
│       ├── selection
│       ├── slider
│       ├── sparkline
│       ├── state
│       ├── tab
│       ├── tip
│       ├── toolbar
│       ├── tree
│       ├── util
│       ├── ux
│       ├── view
│       └── window
├── overrides
├── packages
├── resources
└── sass
    ├── etc
    ├── example
    ├── src
    └── var

.sencha/                   # Sencha‐specific files (primarily configuration)
app/                       # Application‐specific content
  sencha.cfg               # Application configuration file for SenchaCmd
  Boot.js                  # Private, low‐level dynamic loader for JSand CSS
  Microloader.js           # Loads app based on app.json content
  build‐impl.xml           # Standard application build script
  *‐impl.xml               # Implementations of various build phases
  defaults.properties      # Default values and docs for build properties
  ext.properties           # Build property values specific to ExtJS
  *.defaults.properties    # Build properties by environment (e.g."testing")
  plugin.xml               # Application‐level plugin for SenchaCmd
  codegen.json             # Data for merging generated code during upgrade
workspace/                 # Workspace‐specific content (see below)
  sencha.cfg               # Workspace configuration file for SenchaCmd
  plugin.xml               # Workspace‐level plugin for SenchaCmd
ext/                       # A copy of the ExtJS SDK
  cmd/                     # Framework‐specific content for SenchaCmd
    sencha.cfg             # Framework configuration file for SenchaCmd
  packages/                # Framework supplied packages
    ext‐theme‐classic/     # ExtJS Theme Package for Classic
    ext‐theme‐neptune/     # ExtJS Theme Package for Neptune
    ...                    # Other theme and locale packages
  src/                     # The ExtJS source
  ...
index.html                 # The entry point to your application
app.json                   # Application manifest
app.js                     # Launches the Application class
app/                       # Your application's source code in MVC structure
  model/                   # Folder for application model classes
  store/                   # Folder for application stores
  view/                    # Folder for application view classes
    main/                  # Folder for the classes implementing the Main View
      Main.js              # The Main View
      MainModel.js         # The `Ext.app.ViewModel` for the Main View
      MainController.js    # The `Ext.app.ViewController` for the Main View
  Application.js           # The `Ext.app.Application` class
packages/                  # SenchaCmd packages

build/                     # The folder where build output is placed
Збираємо додаток:
olden@olden:~/public_html/web/app$ sencha app build
Sencha Cmd v5.1.2.52
[INF] Processing Build Descriptor : default
[INF] Using GPL Version of Ext JS version 5.1.0.107 from /home/olden/public_html/web/app/ext.
[INF] The implications of using GPL version can be found here (http://www.sencha.com/products/extjs/licensing).
[INF] Loading app json manifest...
[INF] Appending content to /home/olden/public_html/web/app/bootstrap.js
[INF] Writing content to /home/olden/public_html/web/app/bootstrap.json
[INF] Compressing data with YuiJavascriptCompressor
[INF] merging 219 input resources into /home/olden/public_html/web/app/build/production/OSBB/resources
[INF] merged 219 resources into /home/olden/public_html/web/app/build/production/OSBB/resources
[INF] merging 0 input resources into /home/olden/public_html/web/app/build/production/OSBB
[INF] merged 0 resources into /home/olden/public_html/web/app/build/production/OSBB
[INF] writing sass content to /home/olden/public_html/web/app/build/temp/production/OSBB/sass/OSBB-all.scss.tmp
[INF] appending sass content to /home/olden/public_html/web/app/build/temp/production/OSBB/sass/OSBB-all.scss.tmp
[INF] appending sass content to /home/olden/public_html/web/app/build/temp/production/OSBB/sass/OSBB-all.scss.tmp
[INF] writing sass content to /home/olden/public_html/web/app/build/temp/production/OSBB/sass/config.rb
[INF] executing compass using system installed ruby runtime
   create OSBB-all.css 
[INF] writing sass content to /home/olden/public_html/web/app/build/temp/production/OSBB/slicer-temp/OSBB-example.scss.tmp
[INF] writing sass content to /home/olden/public_html/web/app/build/temp/production/OSBB/slicer-temp/config.rb
[INF] executing compass using system installed ruby runtime
   create OSBB-example.css 
[INF] Writing content to /home/olden/public_html/web/app/sass/example/bootstrap.json
[INF] Writing content to /home/olden/public_html/web/app/sass/example/bootstrap.js
[INF] Capturing theme image
[INF] Capture complete
[INF] Slicing images...
[INF] Slicing complete - generated 320 images
[INF] Copying page resources to /home/olden/public_html/web/app/build/production/OSBB
[INF] Writing content to /home/olden/public_html/web/app/build/production/OSBB/app.json
[INF] Writing content to /home/olden/public_html/web/app/build/production/OSBB/microloader.js
[INF] Appending content to /home/olden/public_html/web/app/build/production/OSBB/microloader.js
[INF] Building output markup to /home/olden/public_html/web/app/build/production/OSBB/index.html
[INF] Writing content to /home/olden/public_html/web/app/build/production/OSBB/index.html
Стартуемо Sencha Web Server для перевірки зібраного додатку:
olden@olden:~/public_html/web/app$ sencha web start
Sencha Cmd v5.1.2.52
[INF] Mapping http://localhost:1841/ to ....
[INF] ------------------------------------------------------------------
[INF] Starting web server at : http://localhost:1841
[INF] ------------------------------------------------------------------
Як бачимо, тепер додаток присутній за url http://localhost:1841

Подивимось як можна розширити наш додаток. Подивимось допомогу до sencha generate:
olden@olden:~/public_html/web/app$ sencha help generate Sencha Cmd v5.1.2.52 sencha generate This category contains code generators used to generate applications as well as add new classes to the application. Commands * app - Generates a starter application * controller - Generates a Controller for the current application * form - Generates a Form for the current application (Sencha Touch Specific) * model - Generates a Model for the current application * package - Generates a starter package * profile - Generates a Profile for the current application (Sencha Touch Specific) * theme - Generates a theme page for slice operations (Ext JS Specific) * view - Generates a View for the current application (Ext JS Specific) * workspace - Initializes a multi-app workspace
Генеруємо нову модель:
olden@olden:~/public_html/web/app$ sencha generate model User id:int,name,email
Sencha Cmd v5.1.2.52
Генеруємо бачення:
olden@olden:~/public_html/web/app$ sencha generate view osbb.Thing
Sencha Cmd v5.1.2.52
Також можна згенерувати бачення ґрунтуючись на іншому базовому класі:
sencha generate view -base Ext.tab.Panel osbb.Thing
але ця опція не підтримується при використанні Sencha Architect.

Генеруємо контролер:
olden@olden:~/public_html/web/app$ sencha generate controller Central
Sencha Cmd v5.1.2.52
Властивості додатку можна подивитись у app.json, каталогу проекту. Також додаткові властивості можна знайти у файлах .sencha/app/*.properties. Конфігураційні опції можна подивитись у .sencha/app/sencha.cfg.

sencha build шукає файли додатку орієнтуючись на зміст опції classpath у файлі app.json:
olden@olden:~/public_html/web/app$ grep -C5 classpath app.json 
     * Comma-separated string with the paths of directories or files to search. Any classes
     * declared in these locations will be available in your class "requires" or in calls
     * to "Ext.require". The "app.dir" variable below is expanded to the path where the
     * application resides (the same folder in which this file is located).
     */
    "classpath": "${app.dir}/app",

    "overrides": "${app.dir}/overrides",

    /**
     * The Sencha Framework for this application: "ext" or "touch".

За матеріалами http://docs.sencha.com/cmd/5.x/touch/cmd_app.html

вторник, 10 марта 2015 г.

Дзеркалювання трафіку на Juniper ex2200-24t-4g

Мета: весь трафік у vlan-і 3016 дзеркально відображати у vlan 2998:
vlans {
    v_2998 {
        vlan-id 2998;
    }
    v_3016 {
        vlan-id 3016;
    }
}
ethernet-switching-options {
    analyzer TRAFF {
        loss-priority high;
        input {
            ingress {
                vlan v_3016;
            }
        }
        output {
            vlan {
                v_2998;
            }
        }
    }
}

вторник, 17 февраля 2015 г.

DSDT…

У продовження до попередньої статті DSDT + GRUB2, замість використання
# cat /sys/firmware/acpi/tables/DSDT > dsdt.dat
можна скористатись утілітами acpidump та acpixtract:
acpidump | tee acpidump.out
acpixtract acpidump.out
Після чого отримаємо файли DSDT.dat та SSDT.dat. Хоча є приклади коли SSDT файлів отримується більше ніж один. В мене такого не сталося. Іноді при простій декомпіляції iasl -d dsdt.dat може з'явитись попередження, щось на кшталт:
iASL Warning: There were 2 external control methods found during
disassembly, but additional ACPI tables to resolve these externals
were not specified. The resulting disassembler output file may not
compile because the disassembler did not know how many arguments
to assign to these methods. To specify the tables needed to resolve
external control method references, use the one of the following
example iASL invocations:
    iasl -e <ssdt1.aml,ssdt2.aml...> -d <dsdt.aml>
    iasl -e <dsdt.aml,ssdt2.aml...> -d <ssdt1.aml>
так от, після цього процедура декомпіляції дещо змінюється:
iasl -e 'SSDT.dat' -d DSDT.dat
Компіляцію проводимо як і раніше:
iasl -tc DSDT.dsl

DSDT + GRUB2

DSDT - Differentiated System Description Table.

Як правило з цім звіром, DSDT, у першу чергу стикаються ті хто намагається ставити хакінтоши з кловерами, тощо. Що таке ж це за звір - DSDT? Наведу цитату з інструкції по встановленню хакінтошу, можливо й трішечки застарілу, але за змістом взагалі вірну:
„…«дифференцированная таблица описания системы» содержит сведения обо всех ключевых устройствах, из которых состоит компьютер, а также о параметрах и режимах их функционирования“
Взагалі то сучасні Linux-и і без того непогано справляються з отриманням відомостей про пристрої комп'ютера на якому працюють, але якщо є бажання трішечки їм у цьому допомогти то тоді ця замітка для вас.

Є декілька шляхів для досягнення мети.
  1. initrd
  2. додання у ядро
  3. додання у завантажувач (grub2)
Відповідно нам знадобиться grub2. Ставиться він як і завжди, без якихось додаткових танців з бубном, тому зупинятись на цьому кроці особливо не буду.
Далі, додаємо скрипт /etc/grub.d/01_acpi з наступним вмістом:
#!/bin/sh
set -e

# Uncomment to load custom ACPI table
GRUB_CUSTOM_ACPI="/boot/dsdt.aml"


# DON'T MODIFY ANYTHING BELOW THIS LINE!


prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib


#. /usr/share/grub/grub-mkconfig_lib
. /usr/lib/grub/grub-mkconfig_lib
#. ${libdir}/grub/grub-mkconfig_lib


# Load custom ACPI table
if [ x${GRUB_CUSTOM_ACPI} != x ] && [ -f ${GRUB_CUSTOM_ACPI} ] && is_path_readable_by_grub ${GRUB_CUSTOM_ACPI}; then
    echo "Found custom ACPI table: ${GRUB_CUSTOM_ACPI}" >&2
    prepare_grub_to_access_device `${grub_probe} --target=device ${GRUB_CUSTOM_ACPI}` | sed -e "s/^/  /"
    cat << EOF
  acpi (\$root)`make_system_path_relative_to_its_root ${GRUB_CUSTOM_ACPI}`
EOF
fi
Додаємо скрипту атрибут запуску:
chmod +x /etc/grub.d/01_acpi
Основний момент, скомпильована DSDT буде знаходитись у файлі /boot/dsdt.aml. Це логічно, так як саме розділ /boot читається grub-ом, але за бажанням можете спробувати змінити.

Як створити цей самий dsdt.aml? Для початку встановлюємо пакет iasl - Intel ASL compiler/decompiler.
# cd /tmp/
# cat /sys/firmware/acpi/tables/DSDT > dsdt.dat
# iasl -d dsdt.dat
На цьому кроці ми отримали dsdt.dsl. Це звичайний текстовий файл що містить дизасембльований з AML ASL код, який можна редагувати через звичний vim. Після цього можемо спробувати ASL код скомпілювати назад у AML:
# iasl dsdt.dsl
На виході отримаємо dsdt.aml який і перемістимо (чи скопіюємо) у /boot. У ідеальному випадку мета досягнута, але ідеал майже завжди далекий від життя, тому на етапі компіляції майже завжди з'являються помилки. Зазвичай причина полягає у тому що можна спостерігати або недбайливе ставлення виробників заліза до DSDT, або у тому, що більшість з них користується компілятором ASL від MicroSoft, який аж ніяк не гірше за Intel-овський, але в нього не такі жорсткі вимоги щодо використання специфікацій ASL. Тому іноді те, що MicroSoft компілятор спокійно "схаває", а, наприклад, віртуальні машини ACPI спокійно виконають, компілятор від Intel просто відмовиться зібрати. Тому запасаймось терпінням і готуймось приводити dsdt.dsl у відповідність до специфікацій.

Приклад деяких помилок та їх виправлення:
  1. Invalid object type for reserved name (found BUFFER, requires Package)
    У специфікації йде мова про те, що будь-яка змінна (значення для повернення) повинна бути Package, але у ASL-файлі вона позначена як Buffer:
    Name (_PLD, Buffer (0x10)
    {
        /* 0000 */    0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
        /* 0008 */    0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    })
    diff:
    @@ -1,4 +1,4 @@
    -Name (_PLD, Buffer (0x10)
    +Name (_PLD, Package (0x10)
     {
         /* 0000 */    0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
         /* 0008 */    0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  2. Invalid object type for reserved name (found ZERO, requires Buffer)
    Метод повертає 0, хоча вказано, що до повернення очікується тип Buffer:
    Method (_CRS, 0, NotSerialized)
    {
        If (OSFL ())
        {
            Return (Zero)
        }
        Else
        {
            Return (LCRO (^^PCI0.IMAP.PR0E))
        }
    }
    diff:
    @@ -2,7 +2,7 @@
     {
         If (OSFL ())
         {
    -        Return (Zero) // Ошибка тут
    +        Return (Buffer () { Zero })
         }
         Else
         {
  3. Non-hex letters must be upper case
    Маленькі букви використовуються там де повинні б були бути великі.
    Device (WMI0)
    {
        Name (_HID, "pnp0c14")
        // …
    }
    diff:
    @@ -1,5 +1,5 @@
     Device (WMI0)
     {
    -    Name (_HID, "pnp0c14")
    +    Name (_HID, "PNP0C14")
         // …
     }
  4. Invalid combination of Length and Min/Max fixed flags
    У загальному випадку виникає при визначенні поля Length. У наведеному прикладі змінюємо Length 0x00000000 на 0x00000001, так як Length вираховується за формулою:
    Length = Range Maximum - Range Minimum + 1
    DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
        0x00000000,         // Granularity
        0x00000000,         // Range Minimum
        0x00000000,         // Range Maximum
        0x00000000,         // Translation Offset
        0x00000000,         // Length
    ,, _Y1C, AddressRangeMemory, TypeStatic)
    diff:
    @@ -3,6 +3,6 @@
         0x00000000,         // Range Minimum
         0x00000000,         // Range Maximum
         0x00000000,         // Translation Offset
    -    0x00000000,         // Length
    +    0x00000001,         // Length
     ,, _Y1C, AddressRangeMemory, TypeStatic)
Далі про основні типи попереджень. Майте на увазі, що попередження то не є помилка.
  1. Use of compiler reserved name (_T_0)
    Виправляється заміною _T_0 на T_0. Те саме й з _T_1, _T_2 тощо.
  2. Not all control paths return a value
    У методі присутні розгалуження але не всі з них закінчуються Return:
    Method (MP0P, 1, NotSerialized)
    {
        If (LEqual (Arg0, 0x00)) { Return (P0P0) }
        If (LEqual (Arg0, 0x01)) { Return (P0P1) }
        If (LEqual (Arg0, 0x02)) { Return (P0P2) }
        If (LEqual (Arg0, 0x03)) { Return (P0P3) }
        If (LEqual (Arg0, 0x04)) { Return (P0P4) }
    }
    diff:
    @@ -5,5 +5,6 @@
         If (LEqual (Arg0, 0x02)) { Return (P0P2) }
         If (LEqual (Arg0, 0x03)) { Return (P0P3) }
         If (LEqual (Arg0, 0x04)) { Return (P0P4) }
    +    Return (Zero)
     }
  3. Called method may not always return a value
    Майже те саме що й попередній пункт, але тут мова йде про те, що не завжди метод повертає значення.
  4. Possible operator timeout is ignored
    Використання мутексів зрозумілого мало що було знайдено:
    Acquire (MUTE, 0x03E8)
    тому або залишаємо як є, або, якщо попередження мулять очі, змінюємо на наступне:
    Acquire (MUTE, 0xFFFF)
Можуть бути й інші помилки. З часом, можливо, додам і про них інформацію, але у будь-якому разі Google у допомогу ;)

четверг, 8 января 2015 г.

Ігри з xkbcomp

Раніше вже була стаття про асинхронне перемикання розкладок клавіатури і знову це питання розглядати не має сенсу, але от зіштовхнувся з цікавим моментом щодо української мови. Полягає він у тому, що деякі web-браузери, наприклад chrome вміють робити синтаксичну перевірку, базуючись на словниках, тощо. Так от, у тому варіанті що було опубліковано раніше все гарно, але такі слова як "об’єкт", де апостроф розташовано під тильдою, не проходять перевірки і підкреслюються червоним. А все тому, що апостроф не справжній, точніше справжній, але не зовсім, він не той який, наприклад, розуміє Google Chrome при перевірці ;)
  • Апостроф що маємо у стандартній розкладці ua - ’ (U+2019)
  • Апостроф який "вимагає" Google Chrome - ' (U+0027)
"Лікується" це достатньо просто і у тому можливі два шляхи вирішення питання.
  1. Для стандартної розкладки звикаємо користуватись замість "тильді ~" - ’ - комбінацією shift+~ - '
  2. Але для тих кого не влаштовує перший варіант, кому він здається незручним, є інший шлях - відредагуємо відповідним чином /usr/share/X11/xkb/symbols/ua
Змінюємо інструкцію "key <TLDE>":
--- ua.bak      2015-01-08 10:53:25.063880519 +0200
+++ ua  2015-01-08 11:35:45.301045284 +0200
@@ -11,7 +11,7 @@
  
     name[Group1]= "Ukrainian";
 
-    key <TLDE> {    [           U2019,   apostrophe,    U0301,   asciitilde     ]       };       // Apostrophe and Stress symbol
+    key <TLDE> {    [      apostrophe,        U2026,    U0301,   asciitilde     ]       };       // Apostrophe and Stress symbol
     key <AE02> {    [               1,      exclam,  onesuperior               ]       };
     key <AE02> {    [               2,    quotedbl,  twosuperior               ]       };
     key <AE03> {    [               3,  numerosign,         U00A7,    U20B4     ]       };       // Paragraph and Hryvnia sign

Отримали наступне:
  1. На місці ~ маємо звичайний апостроф, який розуміє Google Chrome при синтаксичній перевірці української мови;
  2. На місці shift+~ маємо  три крапки - … (не знаю як кому, але мені вони іноді бувають потрібні)
З незручностей маємо лише одну, якщо колись оновиться пакет xkb-data то відповідне редагування можливо доведеться робити ще раз.