пятница, 10 января 2025 г.

Bitrix / Добавляем в корзину товар, которого нет в каталоге.

ajax запрос...

$(".cartr").on("click", function() {

        $.ajax({

            type: 'POST',

            cache: false,

            url: '/services/cart/',

            data: {item: $(this).closest('.replacement').attr('value')+';'+$(this).closest('.replacement').find(".price").text()},

            success: function (data) {

                $('.basket-line-block-icon-cart').text(data['count']+" позиции");

                $(this).find("path").css('stroke: #836063;');

            }

    });

        return false;

});



Обработка ajax запрос...

/services/cart/index.php

 <?php

require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");

use \Bitrix\Main\Loader;


Loader::includeModule('iblock');

Loader::includeModule('sale');

Loader::includeModule('catalog');


if ((include $_SERVER["DOCUMENT_ROOT"].'/services/include.php') != TRUE) {

    exit;

}


if(isset($_POST['item'])) {

    $json = $_POST['item'];

    header("Content-type: application/json; charset=UTF-8");

    header("Cache-Control: must-revalidate");

    header("Pragma: no-cache");

    header("Expires: -1");

    $arr = explode(';', $json);

    $vowels = array(" ", "₽", " ");

    $siteId = 's1'; // ID сайта, к которому будет привязана корзина

    $basket = \Bitrix\Sale\Basket::create($siteId);


    $item = $basket->createItem('catalog', rand(10000000000, 11000000000));

    $item->setFields([

            'QUANTITY' => '1',

            'CURRENCY' => Bitrix\Currency\CurrencyManager::getBaseCurrency(),

            'LID' => Bitrix\Main\Context::getCurrent()->getSite(),

            'NAME' => $arr[0]." / ".$arr[1],

            'PRICE' => ceil(floatval(str_replace($vowels, "", $arr[2]))),

            'CUSTOM_PRICE' => 'Y',

    ]);

    $b = $basket->save();

    $dbRes = \Bitrix\Sale\Basket::getList(

[

'select' => ['NAME', 'QUANTITY'],

'filter' => [

'=FUSER_ID' => \Bitrix\Sale\Fuser::getId(), 

'=ORDER_ID' => null,

'=LID' => \Bitrix\Main\Context::getCurrent()->getSite(),

'=CAN_BUY' => 'Y',

]

]

    );

    $c=0;

    while ($item = $dbRes->fetch())

    {

        $c++;

    }

    print json_encode(array('result' => $b->isSuccess(), 'count' =>  $c, 'user' => \Bitrix\Sale\Fuser::getId()));

}


воскресенье, 11 августа 2024 г.

Получение буфера обмена по SSH

sudo nvim /etc/ssh/sshd_config 

Удаляем диезы # у сток:

X11Forwarding yes

X11DisplayOffset 10

X11UseLocalhost yes


Перезапускаем SSHD

sudo systemctl reload sshd

Теперь подключаемся по ssh с параметром -X
ssh -X user@192.168.0.2

Проверяем. Открываем файл в nvim.
nvim index.html

Выделяем какой-либо текст. Например:
gg^G$

Копируем.
YY

Вставляем в текстовом редакторе на локальной машине.
Shift+Ins

четверг, 12 октября 2023 г.

ssh туннель (бесплатный VPN по SSH)

На удаленной машине:

Настраиваем ssh сервер.

sudo nvim /etc/ssh/sshd_config 

PermitTunnel yes

AllowTCPForwarding yes


Перезапускаем ssh сервер.

systemctl restart sshd



На локальной машине

sudo su

ssh -f -v -o Tunnel=point-to-point -o ServerAliveInterval=10 -o TCPKeepAlive=yes -w 100:100 root@IP-remote-host \

'/sbin/ifconfig tun100 172.16.40.1 netmask 255.255.255.252 pointopoint 172.16.40.2' && \

/sbin/ifconfig tun100 172.16.40.2 netmask 255.255.255.252 pointopoint 172.16.40.1


где IP-remote-host - IP удаленной машины.


Проверяем открыт-ли порт на удаленной машине

nc -zvw3 IP-remote-host

 Connection to IP-remote-host port [tcp/ssh] succeeded!

четверг, 14 сентября 2023 г.

Изменить уровень запуска в systemd



В Ubuntu 16.04 вместо init используется systemd, поэтому понятие runlevelsзаменяется термином targets. Таким образом, действительно существует соответствие между уровнями запуска на основе init и целями на основе systemd: Mapping between runlevels and systemd targets
 ┌─────────┬───────────────────┐
 │Runlevel           │ Target                                           │ 
 ├─────────┼───────────────────┤
 │0                       │ poweroff.target                             │ 
 ├─────────┼───────────────────┤
 │1                       │ rescue.target                                 │ 
 ├─────────┼───────────────────┤
 │2, 3, 4               │ multi-user.target                           │
 ├─────────┼───────────────────┤ 
 │5                       │ graphical.target                            │ 
 ├─────────┼───────────────────┤ 
 │6                       │ reboot.target                                 │  
 └─────────┴───────────────────┘


Теперь, чтобы просто изменить «уровни запуска» в 16.04, вы можете использовать, например:

sudo systemctl isolate multi-user.target


Чтобы сделать это «уровнем запуска» по умолчанию, вы можете использовать:

sudo systemctl enable multi-user.target 
sudo systemctl set-default multi-user.target

воскресенье, 27 августа 2023 г.

remap caps lock ctrl

в консоли, а не в X11

sudo usermod -a -G input user

где user - имя пользователя


evtest

No device specified, trying to scan all of /dev/input/event*

Available devices:

/dev/input/event4:      AT Translated Set 2 keyboard 



evtest /dev/input/event4                                                                            


Input driver version is 1.0.1                                                                                                            

Input device ID: bus 0x11 vendor 0x1 product 0x1 version 0xab41                                                                          

Event: time 1630747582.938161, type 4 (EV_MSC), code 4 (MSC_SCAN), value 3a

Event: time 1630747582.938161, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 0



dmesg | grep input


sudo vim /lib/udev/hwdb.d/90-keyboard-changes.hwdb

evdev:input:b0011v0001p0001*KEYBOARD_KEY_3a=leftctrl


systemd-hwdb -s update

udevadm trigger /dev/input/event4


Тест

evtest /dev/input/event4

Event: time 1630751006.715770, type 4 (EV_MSC), code 4 (MSC_SCAN), value 3a

Event: time 1630751006.715770, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1

четверг, 17 августа 2023 г.

Создание LVM на «горячей» машине

 Создать LVM раздел на уже установленной системе просто. Первым шагом будет убедиться, что раздел, который Вы хотите сделать LVM не примонтирован, а лучше вообще не создан. В случае, если он не создан, то нужно выполнить команды:


fdisk /dev/mb123, где /dev/mb123 — диск на котором мы создаём раздел.


Жмём d для удаления раздела. enter


Далее объявляем раздел LVM. Для этого жмём t, указываем номер раздела и вводим id lvm. Это 8e. Жмём w — записать изменения на диск.


Проделываем подобные операции со всеми дисками, которые планируется добавить в LVM массив. Что бы проверить успешность действий выше можно ввести команду:


fdisk -l /dev/mb123


В выводе мы увидим раздел с меткой LVM.


Теперь нужно создать физические разделы на LVM. Для этого воспользуемся командой:


pvcreate /dev/mb123  и для остальных дисков так же.


Ну и теперь объединяем их в один логический раздел:


vgcreate vg0 /dev/mb123 /dev/sdb1 (тут указываются все разделы, которые нужно объединить в один)


Далее нужно создать том на логическом разделе командой lvcreate:


lvcreate -L2G -nlogvol1 vg0 (где logvol1 метка тома)


Для монтирования LVM используются следующие конструкции, изменённые для конкретного случая:


mkfs.ext4 /dev/vg0/logvol1 — создаётся файловая система


И монтируем её

mount /dev/vg0/storage1 /home


Для постоянного монтирования раздела добавляем строку в fstab:

vi /etc/fstab

/dev/vg0/storage1  /home    ext4    defaults        1 2

суббота, 31 декабря 2022 г.

yii2 docker-compose.yml



На старте уже должны стоять docker, docker-compose, php и php-composer.

Создаем папку с проектом и в ней папку docker.


mkdir lk_site

cd lk_site && mkdir docker

cd docker


В папке docker создаем файл docker-compose.yml для поднятия окружения разработки.


vim docker-compose.yml

 

start____________________________________________________________

# Последняя версия docker-compose

version: '3'


# Создаем общую сеть deafult для всех контейнеров

networks:

  default:

    driver: bridge

services:

  web:

    build: ./web

    # Подключаем к общей сети с другими контейнерами

    networks: 

       - default

    # Запускаем только после db

    depends_on: 

      - db    

    # Линкуем внешнюю папку с исходниками внутрь

    volumes:

      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}

      - "../conf/apache2:/etc/apache2/sites-available"

    ports:

      - 8085:80

    working_dir: ${APP_PATH_CONTAINER}

  db:

    image: mariadb

    # Подключаем к общей сети с другими контейнерами

    networks: 

      - default

    restart: always

    environment:

      MARIADB_ROOT_PASSWORD: example

      MARIADB_DATABASE: yii2db

      MARIADB_USER: userdb

      MARIADB_PASSWORD: secret

    volumes:

      - ${DB_PATH_HOST}:/var/lib/mysql

  adminer:

    image: adminer

    restart: always

    ports:

      - 8088:8080 

  composer:

    image: composer:2.0.8

    volumes:

      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}

    working_dir: ${APP_PATH_CONTAINER}

    command: composer install

  nvim:

    build: ./nvim

    tty: true

    volumes:

      - ${APP_PATH_HOST}:${APP_PATH_CONTAINER}

    working_dir: ${APP_PATH_CONTAINER}


end____________________________________________________________

    

В папке docker создаем файл .ENV

vim .ENV


start____________________________________________________________

#PATHS

DB_PATH_HOST= ../databases

APP_PATH_HOST= ../www

APP_PATH_CONTAINER= /var/www/html/

end____________________________________________________________


В папке web создаем файл конфигурации нашего контейнера Dockerfile.

    

mkdir web

cd web


vim Dockerfile


start____________________________________________________________

FROM php:7.4-apache


# Install system dependencies

RUN apt-get update && apt-get install -y \

    curl \

    libpng-dev \

    libonig-dev \

    libxml2-dev \

    zip \

    unzip


# Clear cache

RUN apt-get clean && rm -rf /var/lib/apt/lists/*


# Install PHP extensions

RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# gd with-freetype требуется для капчи в yii2. После для проверки "php -r 'var_dump(gd_info());'"

RUN docker-php-ext-configure gd --with-freetype   && docker-php-ext-install gd


WORKDIR /var/www/html/

end____________________________________________________________


В папке nvim создаем файл конфигурации нашего контейнера Dockerfile astronvim.

    

cd .. && mkdir nvim

cd nvim


vim Dockerfile


start____________________________________________________________

FROM alpine:edge


# Install system dependencies

RUN apk add bash git lua nodejs npm lazygit bottom python3 go neovim ripgrep alpine-sdk --update


RUN git clone https://github.com/AstroNvim/AstroNvim ~/.config/nvim


RUN nvim --headless -c "autocmd User PackerComplete quitall"


WORKDIR /var/www/html/

end____________________________________________________________



Для apache2 создаем папку lk_site/conf/apache2 и файл 000-default.conf в ней. Файлик может изменяться, в зависимости от того, как вы хотите настроить apache2 на своем проекте. Его можно менять локально, т.к. он подключается через volume. Но надо не забывать внутри контейнера перезагружать apache2: service apache2 reload


cd ../.. && mkdir conf

cd conf && mkdir apache2

cd apache2


vim 000-default.conf


start____________________________________________________________

<VirtualHost *:80>                                                                              

        ServerName lk.site.ru


        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/html


        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #Include conf-available/serve-cgi-bin.conf

</VirtualHost>

end____________________________________________________________


Все команды выполняются из корневой папки.


cd ..


Выполняем команду создания проекта:

composer create-project --prefer-dist yiisoft/yii2-app-advanced:2.0.47 www


В файле composer.json меняем это

    "repositories": [

        {

            "type": "composer",

            "url": "https://asset-packagist.org"

        }

    ]

на это

    "repositories": [

        {

            "type": "composer",

            "url": "https://asset-packagist.org",

            "options": {

            "ssl": {

          "verify_peer": false

            }

            }

        }

    ]


Запускаем окружение:

docker-compose -f docker/docker-compose.yml up -d --build


Инициализируем проект:

www/init --env=Development --overwrite=All


Открываем в редакторе файл www/common/config/main-local.php и заполняем его данными для подключения к БД.


Подключаемся к контейнеру:

docker exec -it docker_web_1 bash


Выполняем команду миграции БД:

php /var/www/html/yii migrate


Создаем папку для логов mkdir /var/www/html/log


И выходим exit



Тормозим сервис:

docker-compose -f docker/docker-compose.yml down


Запускаем его заново:

docker-compose -f docker/docker-compose.yml up -d


Открываем localhost:8085 в браузере и смотрим на новый сайт.


Шпаргалка:

Из папки doker

docker-compose ps - вывести список контенеров в папке docker

docker-compose stop web

docker-compose stop db

docker-compose rm web - удуалить



Применение

Основные команды для Docker:


docker-compose up -d

чтобы запустить все службы в вашем стеке в фоновом режиме


docker-compose ps

вывести список запущенных сервисов


docker-compose logs -f

просматривать журналы для всех служб, непрерывно


docker-compose stop

чтобы изящно остановить все службы в вашем стеке


docker-compose kill

немедленно остановить все службы в вашем стеке


docker-compose down -v

чтобы остановить и удалить все службы, помните о потере данных, когда не используются хост-тома


Для запуска команд в контейнере


docker-compose run --rm web composer install

запускает установку композитора в новом контейнере


docker-compose exec web bash

выполняет bash в запущенной php службе

вторник, 27 декабря 2022 г.

mc unknown terminal tmux

bash-4.2$ mc
Unknown terminal: screen.xterm-256colorCheck the TERM environment variable. Also make sure that the terminal is defined in the terminfo database. Alternatively, set the TERMCAP environment variable to the desired termcap entry.

Решение: 
bash-4.2$ export TERM=xterm

Также можно добавить export TERM=xterm в .profile если есть права. 

Split / разбить dump

//Разбить дамп по 50000 строк for i in `ls *.sql`; do split -d -l 50000 -a 4 --additional-suffix=.sql $i "$(basename "$i" .sq...