субота, 8 квітня 2017 р.

WooCommerce category (categories) and product's

Документація з WooCommerce не надихає на код, а чомусь, відсилає в адмінку Wordpress-у.
/* STEP1: parent = 0
   find top-level categories
   знаходимо теки на верхнього рівня
*/
$cats0 = get_terms( 'product_cat',
                    array( 'hide_empty' => false,
                           'fields'     => 'ids',
                           'parent'     => '0',
                           'orderby'    => 'term_id',
                           'order'      => 'ASC'
                   ));
foreach ( $cats0 as $cat0_id ) {
  $cat0 = get_term( $cat0_id, 'product_cat' );
  echo $cat0->name;
  echo $cat0->slug;
  echo $cat0->description;
  /* рибимо те, що потрібно з категорією */


  /* STEP1: parent = $cat0_id
     find next-level categories
     знаходимо теки на рівень нижче
  */
  $cars1 = get_terms( 'product_cat',
                       array( 'hide_empty' => false,
                              'fields'     => 'ids',
                              'parent'     => $cat0_id,
                              'orderby'    => 'term_id',
                              'order'      => 'ASC'
                      ));
  foreach ( $cats1 as $cat1_id ) {
    $cat1 = get_term( $cat1_id, 'product_cat' );
    echo $cat1->name;
    echo $cat1->slug;
    echo $cat1->description;
    /* рибимо те, що потрібно з під-категорією */


    /* STEP3: products
       find products in this category
       знаходимо товари в цій категорії
    */
    if( $_SERVER['REQUEST_URI'] == '/shop/' ){
      $args = array( 'post_type'      => 'product',
                     'posts_per_page' => 6,
                     'product_cat'    => $cat1->slug,
                     'orderby'        => 'name',
                     'order'          => 'ASC'
                   );
      $loop = new WP_Query( $args );
      while ( $loop->have_posts() ) : $loop->the_post();
        global $product;

        /* id */
        echo get_permalink( $loop->post->ID );

        /* title */
        echo $loop->post->post_title;

        /* sale! */
        woocommerce_show_product_sale_flash(
                   $post, $product);

        /* image */
        if (has_post_thumbnail( $loop->post->ID ))
          echo get_the_post_thumbnail(
                   $loop->post->ID, 'shop_catalog');
        else
          echo '<img src="'
               .woocommerce_placeholder_img_src()
               .'"   alt="Placeholder"
                     width="300px" height="300px" />';

        /* description */
        echo strip_tags( $loop->post->post_content );

        /* price */
        echo $product->get_price_html();

        /* add to cart */
        woocommerce_template_loop_add_to_cart(
                   $loop->post, $product );

      endwhile;
      wp_reset_query();
    } /* if $_SERVER['REQUEST_URI'] */
  }   /* foreach $terms1            */
}     /* foreach $terms             */



середа, 8 березня 2017 р.

SSH-тунель з Windows-клієнта через Mikrotik

Задача: зробити віддалений доступ до Windows-сервера з Windows-клаєнта через Mikrotik.

1. Завантажити й встановити PuTTY (наприклад, putty-0.68-installer.msi)
2. Згенерувати ключі - puttygen.exe
2.1. Просто натисніть й рухайте мишкою поки не заповниться синій бігунок.
2.2. Згенеровані ключі потрібно зберегти: public.key та private.key.
 
2.3.АЛЕ, записаний нами приватний ключ не буде прийнятий Mikrotik-ом. Тому потрібно виділити все у віконці

зкопіювати й записати у файл public.key.
3. Сам файл public.ket потрібно перенести на Mikrotik:

pscp.exe -scp -P 22 -pw userpass public.key username@mikrotik:/userkey.pub

4. Імпортуємо (прив’язуємо) ключ до користувача:
5. Завантажуємо ключ в ssh-agent-а:

pageant.exe C:\Program Files\putty\keys\
private.ppk


6. Тепер робимо тунель командою plink.exe:

plink -batch -ssh -N username@mikrotik -P 22 -pw userpass -L 15110:server:3389



понеділок, 6 березня 2017 р.

Mikrotik з OpenVPN

Файл налаштування клієнта:
client
dev tap
port 1194
proto tcp

remote 192.168.88.1 1194             # VPN server IP : PORT
nobind

ca ca.crt
cert clientname.crt
key clientname.key

#comp-lzo
persist-key
persist-tun

verb 3
auth-user-pass pass.txt

route-method exe
route-delay 2
route 192.168.1.0 255.255.255.255 192.168.88.1

Файл pass.txt:
clientname
clientpass

понеділок, 27 лютого 2017 р.

Debian 7 та MySQL server 5.6+

Видалити попередню версію (5.5):
sudo apt-get purge mysql*
sudo apt-get autoremove
sudo apt-get autoclean
sudo rm -rf /var/log/mysql
sudo rm -rf /var/log/mysql.*
sudo rm -rf /var/lib/mysql
Додати репозіторій (взяти з https://dev.mysql.com/downloads/repo/apt/)
wget http://repo.mysql.com/mysql-apt-config_0.8.2-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.2-1_all.deb
Після цих дій буде створений файл /etc/apt/sources.list.d/mysql.list з такими рядками:
deb http://repo.mysql.com/apt/debian/ wheezy mysql-5.6
deb-src http://repo.mysql.com/apt/debian/ wheezy mysql-5.6
Оновити ключі:
sudo apt-key adv --keyserver pgp.mit.edu \
    --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5

Встановити mysql 5.6:
sudo apt-get update
sudo apt-get install mysql-server-5.6

пʼятниця, 10 лютого 2017 р.

Міграція з VPS Debian 7 на VPS Debian 8

Переношу свій хостинг на новий Debian:

1. $ ssh root@vps-new
2. apt-get update
3. apt-get upgrade
4. dpkg-reconfigure locales
4.1. Locales to be generated: uk_UA.UTF-8 UTF-8 - Ok
4.2. Default locale for the system environment: uk_UA.UTF-8 - Ok
5. Ctrl+D
6. $ ssh root@vps-new
7. groupadd -r wheel
8. useradd -m -g wheel -s /bin/bash superuser
9. passwd superuser
10. додати рядок у /etc/sudoers:
       %wheel  ALL=(ALL)       NOPASSWD: ALL
11. $ sudo mcedit /etc/hostname - srv170210
12. $ sudo hostname -F /etc/hostname
13. $ wget http://vestacp.com/pub/vst-install.sh
14. $ sudo bash vst-install.sh --nginx yes --apache yes --phpfpm no --vsftpd yes --proftpd no --exim yes --dovecot yes --spamassassin yes --clamav no --named yes --iptables yes --fail2ban yes --mysql yes --postgresql no --remi no --quota no --hostname srv170210 --email superuser@email.com --force
15. Згадав, що планував змінити php на 7.х
15.1. $ dpkg --list | grep php | awk '/^ii/{ print $2}'
15.2. $ x="$(dpkg --list | grep php | awk '/^ii/{ print $2}')"
15.3. $ sudo apt-get --purge remove $x
16. Видалив php5, встановлюю php7
16.1. $ wget https://www.dotdeb.org/dotdeb.gpg
16.2. $ sudo apt-key add dotdeb.gpg
16.3. $ echo -e "deb http://packages.dotdeb.org jessie all\ndeb-src http://packages.dotdeb.org jessie all" > dotdeb.list
16.4. $ sudo cp dotdeb.list /etc/apt/sources.list.d/
16.5. $ sudo apt-get update
16.6. $ sudo apt-get install php7.0 php7.0-common php-pear
16.7. $ sudo apt-get -f install
16.8. $ sudo apt-get install libapache2-mod-php7.0
17. Перенесення бекапів
17.1. root@vps-old:# scp /home/backup/admin.2017-02-10.tar superuser@vps-new:~/home/backup/
18. Відновлення бекапів
18.1. v-restore-user admin admin.2017-02-10.tar
19. Власне, все.

четвер, 17 листопада 2016 р.

MikroTik доступ до внутрішнього сервера

Проблема Є внутрішня мережа з сервером приєднаним до інтернету через MikroTik.
Зовнішня IP-адреса: AAA.BBB.CCC.DDD.
Внутрішня мережа: 192.168.88.0/24.
ІР-адреса серверу: 192.168.88.10.
Потрібно надати доступ ззовні до певних портів внутрішнього сервера.

Рішення
1) Надаємо доступ до внутрішніх портів іззовні:

General
  • Chain: dstnat
  • Protocol: 6 (tcp)
  • Dst. Port: 80,8083
  • Int. Interface: ether1
Action
  • Action: netmap
  • To Addresses: 192.168.88.10

2) Перенаправляємо запити з внутрішньої мережі до зовнішньої адреси на внутрішнью адресу:

General
  • Chain: dstnat
  • Src. Address: 192.168.88.0/24
  • Dst. Address: AAA.BBB.CCC.DDD
  • Protocol: 6 (tcp)
  • Dst. Port: 80,8083
Action
  • Action: dst-nat
  • To Addresses: 192.168.88.10

3) Підмінюємо адресу внутрішніх запитів на адресу роутера:

General
  • Chain: srcnat
  • Src. Address: 192.168.88.0/24
  • Dst. Address: 192.168.88.10
  • Protocol: 6 (tcp)
  • Dst. Port: 80,8083
Action
  • Action: src-nat
  • To Addresses: 192.168.88.1

Доступ для SSH з внутрішньої мережі не забезпечуємо:

General
  • Chain: dstnat
  • Protocol: 6 (tcp)
  • Dst. Port:2222
  • In. Interface: ether1
Action
  • Action:netmap
  • To Addresses: 192.168.88.10
  • To Ports: 22

неділя, 21 серпня 2016 р.

При черговому оновленні з’явилось попередження:
Reading package lists... Done
W: GPG error: http://nginx.org wheezy Release: 
The following signatures were invalid: KEYEXPIRED 1471427554

Це ключ nginx-а, - його оновлення:
wget https://nginx.org/keys/nginx_signing.key -O - | sudo apt-key add -