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

вторник, 10 июля 2018 г.

Як визначити дистрибутив та версію Linux?

В принципі Linux це ядро, але знати версію ядра це не еквівалент того, що ми одразу можемо дізнатися щось про дистрибутив системи. А от у останньому допоможе пакет inxi.
Запускаємо:
inxi -S
і дізнаємося дещо значно більше ніж просто про версію ядра.
$ inxi -S
System:    Host: askue Kernel: 2.6.32-573.22.1.el6.x86_64 x86_64 bits: 64 Console: tty 2
           Distro: CentOS release 6.7 (Final)
або
$ inxi -S
System:    Host: olden Kernel: 4.9.0-7-amd64 x86_64 (64 bit) Desktop: Cinnamon 3.2.7
           Distro: Debian GNU/Linux 9 (stretch)
Але й це не все, про систему можна та "залізо" можна дізнатися більше якщо запустити inxi з параметром -F:

$ inxi -F
System:    Host: askue Kernel: 2.6.32-573.22.1.el6.x86_64 x86_64 bits: 64 Console: tty 2
           Distro: CentOS release 6.7 (Final)
Machine:   Device: server System: Supermicro product: X10DRH v: 123456789 serial: 123456789
           Mobo: Supermicro model: X10DRH-C v: 1.01 serial: NM15AS011867
           UEFI [Legacy]: American Megatrends v: 2.0 date: 12/17/2015
CPU(s):    2 6 core Intel Xeon E5-2620 v3s (-MT-MCP-SMP-) cache: 30720 KB
           clock speeds: max: 2399 MHz 1: 2399 MHz 2: 2399 MHz 3: 2399 MHz 4: 2399 MHz 5: 2399 MHz 6: 2399 MHz
           7: 2399 MHz 8: 2399 MHz 9: 2399 MHz 10: 2399 MHz 11: 2399 MHz 12: 2399 MHz 13: 2399 MHz 14: 2399 MHz
           15: 2399 MHz 16: 2399 MHz 17: 2399 MHz 18: 2399 MHz 19: 2399 MHz 20: 2399 MHz 21: 2399 MHz
           22: 2399 MHz 23: 2399 MHz 24: 2399 MHz
Graphics:  Card: ASPEED ASPEED Graphics Family
           Display Server: N/A driver: N/A tty size: 211x53 Advanced Data: N/A for root out of X
Network:   Card-1: Intel I350 Gigabit Network Connection driver: igb
           IF: eth0 state: up speed: 1000 Mbps duplex: full mac: 0c:c4:7a:6c:de:ce
           Card-2: Intel I350 Gigabit Network Connection driver: igb
           IF: eth1 state: up speed: 1000 Mbps duplex: full mac: 0c:c4:7a:6c:de:cf
Drives:    HDD Total Size: 1999.3GB (0.2% used)
           ID-1: /dev/sda model: SMC3108 size: 1999.3GB
Partition: ID-1: / size: 9.5G used: 1.5G (17%) fs: ext4 dev: /dev/dm-0
           ID-2: /boot size: 477M used: 57M (13%) fs: ext4 dev: /dev/sda1
           ID-3: swap-1 size: 1.07GB used: 0.00GB (0%) fs: swap dev: /dev/dm-1
RAID:      No RAID devices: /proc/mdstat, md_mod kernel module present
Sensors:   System Temperatures: cpu: No active sensors found. Have you configured your sensors yet? mobo: N/A
Info:      Processes: 478 Uptime: 314 days Memory: 573.9/15838.4MB Init: Upstart runlevel: 3
           Client: Shell (bash) inxi: 2.3.56 
$ inxi -F
System:    Host: olden Kernel: 4.9.0-7-amd64 x86_64 (64 bit) Desktop: Cinnamon 3.2.7
           Distro: Debian GNU/Linux 9 (stretch)
Machine:   Device: desktop Mobo: ASUSTeK model: P5Q SE PLUS v: Rev 1.xx BIOS: American Megatrends v: 2204 date: 08/28/2009
CPU:       Quad core Intel Core2 Quad Q8300 (-MCP-) cache: 2048 KB 
           clock speeds: max: 2499 MHz 1: 2003 MHz 2: 2003 MHz 3: 2003 MHz 4: 2003 MHz
Graphics:  Card: NVIDIA G73 [GeForce 7600 GS]
           Display Server: X.Org 1.19.2 driver: nvidia Resolution: 1920x1080@60.00hz, 1920x1080@60.00hz
           GLX Renderer: GeForce 7600 GS/PCIe/SSE2 GLX Version: 2.1.2 NVIDIA 304.137
Audio:     Card Intel 82801JI (ICH10 Family) HD Audio Controller driver: snd_hda_intel
           Sound: Advanced Linux Sound Architecture v: k4.9.0-7-amd64
Network:   Card: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller driver: r8169
           IF: eth0 state: up speed: 1000 Mbps duplex: full mac: 20:cf:30:19:46:f7
Drives:    HDD Total Size: 2320.5GB (35.7% used)
           ID-1: /dev/sdb model: WDC_WD20EFRX size: 2000.4GB
           ID-2: /dev/sda model: SAMSUNG_HD321KJ size: 320.1GB
Partition: ID-1: / size: 9.1G used: 3.1G (36%) fs: ext4 dev: /dev/sda1
           ID-2: /usr size: 14G used: 11G (79%) fs: ext4 dev: /dev/sda6
           ID-3: /home size: 184G used: 161G (93%) fs: ext4 dev: /dev/sda5
           ID-4: /var size: 74G used: 13G (18%) fs: ext4 dev: /dev/sda7
           ID-5: /tmp size: 11G used: 29M (1%) fs: ext4 dev: /dev/sda9
           ID-6: swap-1 size: 3.00GB used: 0.08GB (3%) fs: swap dev: /dev/sda8
Sensors:   System Temperatures: cpu: 35.5C mobo: 47.0C gpu: 71C
           Fan Speeds (in rpm): cpu: 2220 psu: 0 sys-1: 1117
Info:      Processes: 281 Uptime: 1:03 Memory: 3754.7/7987.1MB Client: Shell (bash) inxi: 2.3.5 
ну й не забуваймо про
man inxi
А ще можна уважно подивитися у бік:
$ cat /etc/*-release
$ cat /etc/issue

пятница, 8 июня 2018 г.

jks від Приватбанку конвертувати в pem та/або p12

Отримати список аліасів
$ keytool -list -keystore pb_2711913473.jks
Enter keystore password:  

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

pb_sign_2711913473, 18 січ. 1970, PrivateKeyEntry, 
Certificate fingerprint (SHA1): A6:32:B1:C6:13:B0:64:E3:D1:42:AC:B4:4E:B4:1E:E5:23:72:11:CC

Експортувати у pem:
$ keytool -exportcert -alias pb_sign_2711913473 -keystore pb_2711913473.jks -rfc -file pb_2711913473.pem
Enter keystore password:  
Certificate stored in file <pb_2711913473.pem>

Згенерувати jks на підставі створеного pem:
$ rm pb_2711913473.jks
$ keytool -import -trustcacerts -keystore pb_2711913473.jks -storepass PASSWORD -noprompt -file pb_2711913473.pem -alias pb_sign_2711913473
Certificate was added to keystore

Згенерувати p12 на підставі створеного jks:
$ keytool -importkeystore -srckeystore pb_2711913473.jks -destkeystore pb_2711913473.p12 -srcstoretype jks -deststoretype pkcs12
Enter destination keystore password:  
Re-enter new password: 
Enter source keystore password:  
Entry for alias pb_sign_2711913473 successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or cancelled


пятница, 1 декабря 2017 г.

Як перевірити з'єднання по https/http2?

Сподіваюся, що всім відомо, що звичайне з'єднання по http-протоколу можна перевірити використовуючи звичайну команду telnet:
$ telnet google.com.ua 80
Trying 172.217.20.163...
Connected to google.com.ua.
Escape character is '^]'.
GET /
HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.com.ua/?gfe_rd=cr&dcr=0&ei=51chWtS7ErTi8Aed2bXIBA
Content-Length: 272
Date: Fri, 01 Dec 2017 13:23:51 GMT

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.ua/?gfe_rd=cr&dcr=0&ei=51chWtS7ErTi8Aed2bXIBA">here</A>.
</BODY></HTML>
Connection closed by foreign host.
А як перевірити https/http2?
Виявляється, що теж доволі просто:
$ openssl s_client -connect google.com.ua:443
CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = google.com
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=google.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIgzjCCH7agAwIBAgIIC3opcadHGlowDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
…skip…
aVs=
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
---
SSL handshake has read 11078 bytes and written 415 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: CF87F01549DC0A0F009A3BE4125C7FC4CEA275ECA69BB770311C6D36FCF9D3F3
    Session-ID-ctx: 
    Master-Key: BFED552D2D80DDC539E59DAE4593F349FD4CB9AD334F3515640D213C3948771855C5F4EAA378025EF179BAD5FDC952AA
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 100800 (seconds)
    TLS session ticket:
    0000 - 00 f6 8f 2c 19 9c a3 e3-1b 90 16 f0 0d c3 f7 c2   ...,............
    …skip…
    00d0 - 13 56 e8 9f 2e                                    .V...

    Start Time: 1512134921
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
GET /
HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: https://www.google.com.ua/?gfe_rd=cr&dcr=0&ei=DFkhWt_PNa_i8Aeci6y4AQ
Content-Length: 273
Date: Fri, 01 Dec 2017 13:28:44 GMT
Alt-Svc: hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.com.ua/?gfe_rd=cr&dcr=0&ei=DFkhWt_PNa_i8Aeci6y4AQ">here</A>.
</BODY></HTML>
read:errno=0
От так от.

Приблизно те саме, але для smtp TLS:
openssl s_client -starttls smtp -crlf -connect smtp.mailgun.org:587
Ну, а по інших моментах певно man openssl допомогти зможе :)

среда, 21 июня 2017 г.

SSL Let's Encrypt

https://letsencrypt.org/getting-started/

Про проект Let's Encrypt - центр сертифікації, що надає безкоштовні криптографічні сертифікати X.509 для TLS шифрування (HTTPS). Процес видачі та подовження сертифікатів повністю автоматизовано. Сертифікати рівня «domain validation».

Все робиться через certbot, процес повністю автоматизовано.

Так як доступу до серверу pbx.ukrhub.net у нас немає (та він нам й не потрібний) то нехай відповідальний за цей сервер самостійно згенерує валідний сертифікат та налаштує cron для коректного його оновлення.

На прикладі для nginx.
$ sudo aptitude install certbot -t jessie-backports
$ sudo certbot certonly --webroot -w /var/www/olden.org.ua -d olden.org.ua
У конфігурації nginx. /etc/nginx/sites-enable/you.domain.name
ssl_certificate /etc/letsencrypt/live/you.domain.name/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/olden.org.ua/privkey.pem;
Ну і десь у cron-і
$ sudo certbot renew

вторник, 20 декабря 2016 г.

Як розбити flac по наявному cue у Linux?

Як виявилося тема ця не нова. Найпростіший шлях такий. Встановлюємо:
sudo aptitude install cuetools shntool flac
Далі, припустимо у нас є наступні файли:
$ ls -1 Океан\ Ельзи\ -\ Без\ меж.*
Океан Ельзи - Без меж.cue
Океан Ельзи - Без меж.flac
Тоді розбити оригінальний flac на окремі композиції можна так:
$ cuebreakpoints Океан\ Ельзи\ -\ Без\ меж.cue | \
  shnsplit -o flac Океан\ Ельзи\ -\ Без\ меж.flac
Після чого отримуємо наступний список файлів:
$ ls -1 split-track*
split-track01.flac
split-track02.flac
split-track03.flac
split-track04.flac
split-track05.flac
split-track06.flac
split-track07.flac
split-track08.flac
split-track09.flac
split-track10.flac
split-track11.flac
Окремий файл - окрема композиція.
Але є певна проблема, у отриманих файлах відсутня інформація про виконавця, альбом, тощо. Це не зовсім зручно, якщо збираємося додати ці файли у сучасні медіаплеєри, які вміють читати ці метадані.

Покроково.
Кількість композицій:
$ cueprint -d '%N' Океан\ Ельзи\ -\ Без\ меж.cue
11
Метадані по композиції №1:
$ cueprint -n 1 Океан\ Ельзи\ -\ Без\ меж.cue | iconv -f cp1251
Track 1 Information
arranger: 
composer: 
genre:  
ISRC:  
message: 
track number: 1
perfomer: Океан Ельзи
title:  Віддай мені (свою любов)
ISRC (CD-TEXT): 
або у заданому форматі:
$ cueprint -n 1 -t \
  'ARRANGER=%A\nCOMPOSER=%C\nGENRE=%G\nMESSAGE=%M\nTRACKNUMBER=%n\nARTIST=%p\nTITLE=%t\nALBUM=%T\n' \
  Океан\ Ельзи\ -\ Без\ меж.cue | \
  iconv -f cp1251
ARRANGER=
COMPOSER=
GENRE=
MESSAGE=
TRACKNUMBER=1
ARTIST=Океан Ельзи
TITLE=Віддай мені (свою любов)
ALBUM=Без меж

Всі ці моменти можна об'єднати у скрипт. Проект можна завантажити звідси splitflac.

UPDATE:
Був отримав помилку:
shnsplit: error: m:ss.ff format can only be used with CD-quality files
Таблетка:
cuebreakpoints *.cue | sed s/$/0/ | shnsplit -t %n -o flac *.flac

четверг, 27 октября 2016 г.

RouterOS та передача маршрутної інформації у DHCP

Певно, що тим, хто читає цей нотаток, відомо, що у DHCP можна передавати окрім всього іншого й маршрутну інформацію. Тут розглянемо як це робиться у RouterOS та намалюємо маленький скрипт який допоможе в цій роботі у подальшому.

RFC3442 має назву The Classless Static Route Option for Dynamic Host Configuration Protocol (DHCP) version 4 і описує формат опції 121, в якій передається маршрутна інформація. Для тієї самої задачі слугує й опція 249, але про неї окремо.

Формат опції у RFC виглядає так:
  Code Len Destination 1    Router 1
   +-----+---+----+-----+----+----+----+----+----+
   | 121 | n | d1 | ... | dN | r1 | r2 | r3 | r4 |
   +-----+---+----+-----+----+----+----+----+----+

    Destination 2       Router 2
   +----+-----+----+----+----+----+----+
   | d1 | ... | dN | r1 | r2 | r3 | r4 |
   +----+-----+----+----+----+----+----+
Тобто маємо безпосередньо код опції, наступний байт це кількість мережевих бітів (маска мережі), потім йдуть октети, що описують номер мережі та 4 байти/октети, що описують маршрутизатор через який має бути побудовано маршрут. Також у RFC читаємо, що для декількох маршрутів вони можуть бути склеєні.

Окрему увагу заслуговує кількість Destination октетів. У RFC можна побачити наступне:
        Width of subnet mask     Number of significant octets
                     0                     0
                  1- 8                     1
                  9-16                     2
                 17-24                     3
                 25-32                     4
Це все справедливо як для опції 121 так і для опції 249. Єдине зауваження щодо опції 249, яке знайшов на хабрі, те, що до маршрутної інформації варто додавати 00[адреса шлюзу]. Пишуть, що це справедливо для комп'ютерів під керуванням ОС Windows.

Все це була не дуже цікава, але не менш важлива теорія, приступимо до практики.

Озброївшись знаннями з RFC3442 можна доволі швидко написати додаток, що буде обчислювати маршрути й формувати відповідний вивід. Я полюбляю Perl тому скрипт було написано саме на ньому, https://github.com/oldengremlin/route-4-dhcp/blob/master/rfc3442.route-4-dhcp.pl:

Поставимо на меті описати маршрут на мережі RFC1918 через /dev/null. Взагалі то було б непогано змаршрутизувати їх через 127.0.0.1, але ж через описані опції маршрути можуть бути додано лише через ті адреси до яких клієнт може знати як дістатися. Тому, припустимо, що у нашій мережі 192.168.88.0/24 не існує хоста 192.168.88.2, а трафік пустимо через нього.

Назвемо скрипт rfc3442.route-4-dhcp та запустимо його з параметрами:
$ rfc3442.route-4-dhcp 10.0.0.0/8 192.168.88.2 172.16.0.0/12 192.168.88.2 192.168.0.0/16 192.168.88.2
option_121_route_10.0.0.0/8_via_192.168.88.2 : 0x080ac0a85802
option_249_route_10.0.0.0/8_via_192.168.88.2 : 0x080ac0a85802
option_121_route_172.16.0.0/12_via_192.168.88.2 : 0x0cac10c0a85802
option_249_route_172.16.0.0/12_via_192.168.88.2 : 0x0cac10c0a85802
option_121_route_192.168.0.0/16_via_192.168.88.2 : 0x10c0a8c0a85802
option_249_route_192.168.0.0/16_via_192.168.88.2 : 0x10c0a8c0a85802
aggregate_opt_121 : 0x080ac0a858020cac10c0a8580210c0a8c0a85802
aggregate_opt_249 : 0x080ac0a858020cac10c0a8580210c0a8c0a85802

Передаємо скрипту пари у вигляді мережа-шлюз і отримуємо попарний вивід для окремих мереж і останніми строками сукупну маршрутну інформацію для всіх мереж.

Тепер перенесемо всю цю інформацію у RouterOS:
/ip dhcp-server option
add code=121 name=aggregate_opt_121_over_fakeip_192.168.88.2 value=0x080ac0a858020cac10c0a8580210c0a8c0a85802
add code=249 name=aggregate_opt_249_over_fakeip_192.168.88.2 value=0x080ac0a858020cac10c0a8580210c0a8c0a8580200c0a85801

Щодо опції 249 читаємо зауваження нагорі і дивимося як було додано маршрут через основну адресу маршрутизатора - 192.168.88.1.

Опції задано, тепер їх можна додати у список опцій у описі мережі в налаштуваннях dhcp-серверу. Якщо у dhcp-сервері вже було налаштовано передачу інформації щодо wpad то разом з маршрутною інформацією команда налаштування мережі може виглядати якось так:
/ip dhcp-server network
add address=192.168.88.0/24 comment=dhcp-server dhcp-option=\
    auto-proxy-config,aggregate_opt_121_over_fakeip_192.168.88.2,aggregate_opt_249_over_fakeip_192.168.88.2,disable_nbt dns-server=\
    192.168.88.1 gateway=192.168.88.1 netmask=24 ntp-server=192.168.88.1

Домашнім завданням може бути написання скрипту якій розшифровує 0x080ac0a858020cac10c0a8580210c0a8c0a85802 у зворотньому напрямку ;)

среда, 26 октября 2016 г.

RouterOS та налаштування Proxy через DHCP

Рік тому публікував тут як налаштувати прозорий web-proxy на Мікротиці. Але сталося, що частині комп'ютерів, які це вміють, треба було якось віддавати налаштування щодо proxy автоматично.

Для isc dhcp серверу було знайдено опис щодо option 252, через яку можна налаштувати Web Proxy Autodiscovery Protocol (надалі wpad). Зазвичай налаштовується якось так:
option wpad code 252 = text;
option wpad "http://192.168.xxx.xxx/wpad.dat";
де http://192.168.xxx.xxx/wpad.dat вказує на файл налаштувань проксі.

Того самого ефекту можна досягнути у RouterOS наступним чином. Додаємо налаштування dhcp-опції та додаємо її до налаштувань мережі у dhcp-server-і:
/ip dhcp-server option add code=252 name=auto-proxy-config value="'http://192.168.xxx.xxx/wpad.dat'"
/ip dhcp-server network … dhcp-option=auto-proxy-config
Після додання опції клієнти які підтримують wpad автоматично завантажать wpad.dat та застосують налаштування з нього.

Приклад вмісту доволі простого wpan.dat:
// Функція використання проксі
function FindProxyForURL(url, host)
{
    // якщо текстове ім'я хоста без точок, то з'єднуємо з ним безпосередньо (корисно для локальних адрес)
    if (isPlainHostName(host)) { return "DIRECT"; }

    // якщо хост в мережі 192.168.88.0/24 або в мережі 127.0.0.0/8 то до нього підключаємося напряму
    if (isInNet (host, "192.168.88.0", "255.255.255.0") || isInNet (host, "127.0.0.0", "255.0.0.0")) { return "DIRECT"; }

    // якщо жодна умова не виконується - повертаємо ім'я проксі
    return "PROXY 192.168.88.1:8080; DIRECT";
}

Доступні наступні функції:

isResolvable(host) — запит імені хоста (перевірка існування) на DNS-сервері.
Приклад:
if (isResolvable(host))

dnsResolve(host) — запит DNS-сервера для перекладу імені в IP.
Приклад:
if (dnsResolve(host) == "xxx.xxx.xxx.xxx")

myIpAddress() — повертає IP-адреса (що складається з цілих чисел і точок) вузла, на якому запущений браузер.
Приклад:
if (myIpAddress() == "xxx.xxx.xxx.xxx")

isPlainHostName(host) — перевіряє, чи містяться точки в імені вузла. якщо точка знайдена, то повертається значення false; якщо немає, повертається значення true.
Приклад:
if (isPlainHostName(host))

dnsDomainLevels(host) — повертає ціле число, яке дорівнює кількості точок в імені вузла.
Приклад:
if (dnsDomainLevels(host) > 0)

dnsDomainIs(host, ".company.com") — повертає значення true, якщо домен з імені вузла збігається з заданим доменом.
Приклад:
if (isPlainHostName(host) || dnsDomainIs(host, ".company.com"))

localHostOrDomainIs(host, "www.company.com") — повертає значення true, якщо домен з імені вузла збігається з заданим доменом. Виконується тільки для URL-адрес, що відносяться до локального домену.
Приклад:
if (!localHostOrDomainIs(host, "www.company.com"))

shExpMatch(str, shexp) — повертає значення true, якщо str відповідає шаблоном оболонки shexp.
Приклад:
if (shExpMatch(host, "*.com"))

isInNet(host, pattern, mask) — повертає значення true, якщо IP-адреса вузла відповідає зазначеному шаблоном (наприклад, 127.0.0.0). mask вказує, яку частина IP-адреси слід зіставляти (255 = зіставляти, 0 = ігнорувати).
Приклад:
if (isInNet(host, "999.99.9.9", "255.0.255.0"))

url.substring(0, n) — витягує вказану кількість знаків з початку рядка
Приклад:
url.substring(0, 4)

weekdayRange( day1 [, day2] [,"GMT"] ) — повертає значення true, якщо поточний
час системи потрапляє в діапазон, заданий з використанням параметрів і необов'язковий параметр GMT вказує, якщо задано не місцевий час, а час за Гринвічем.
Приклад:
if(weekdayRange("WED", "SAT", "GMT"))

dateRange(day1 [,month1] [,year1] [,day2] [,month2] [,year2] [,gmt] )
day — число дня місяцю між 1 и 31;
month — місяць: JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC;
year — повний (чотиризначний) рік;
gmt — зона GMT (по Гринвічу).
Приклад:
dateRange (1) // true якщо сьогодні перше число, використовується локальний час.
dateRange (1, "GMT") // true сьогодні перше число, використовується час за Гринвічем.
dateRange (1, 15) // true якщо сьогодні число в діапазоні від 1 до 15-е.
dateRange (24, "DEC") // true кожне 24-е грудня.
dateRange (24, "DEC", 1995) // true якщо сьогодні 24е-е грудня 1995 року.
dateRange ( "JAN", "MAR") // true з січня по березень
dateRange (1, "JUN", 15, "AUG") // true з 1 червня по 15-е серпня (включно).
dateRange (1, "JUN", 15, 1995, "AUG", 1995) // true з 1-го червня 1995 року по 15-е червня 1995 року.
dateRange ( "OCT", 1995, "MAR", 1996) // true з жовтня 1995 по березень 1996 (включно).
dateRange (1995) // true протягом 1995 року.
dateRange (1995, 1997) // true з 1995 до 1997

timeRange(hour1 [,min1] [,sec1] [,hour2] [,min2] [,sec2] [,gmt] )
hour — час від 0 до 23;
min — хвилини від 0 до 59;
sec — секунди від 0 до 59;
gmt — зона GMT (по Гринвічу).
Приклад:
timerange (12) // true до 13:00.
timerange (12, 13) // true з 12:00 до 13:00.
timerange (12, "GMT") // true з початку для до 13:00 за Гринвічем.
timerange (9, 17) // true from 9am to 5pm.
timerange (8, 30, 17, 00) // true з 8:30 to 17:00.
timerange (0, 0, 0, 0, 0, 30) // true з півночі і до 00:00:30 секунд.

Також ще підтримуються змінні.
Приклад:
ip_host  = dnsResolve(host);
ip_localnet = "192.168.0.0";
ip_localhost = "127.0.0.1";
proxy_general = "PROXY gwhost.my:3128";
proxy_local = "PROXY localhost:3128";