Архив рубрики: Linux

Наработки и статьи по работе с Linux

Вложеный запрос в процедуре MySQL, курсоры и прочие прелести

Оставляю код процедуры для «истории».

CREATE  PROCEDURE `GetInfo`(IN `mac_sw` VARCHAR(20), IN `port_sw` VARCHAR(20)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN
DECLARE value2 varchar(200); 
DECLARE type2 int(11); 
DECLARE code2 int(11); 
DECLARE cnt INT(10);
DECLARE DONE integer default 0;
DECLARE ip_cur CURSOR FOR SELECT code, type, value FROM dhcp_subnets where segment_id in (SELECT segment_id FROM dhcp_clients_by_relay WHERE upper(relay_id) = upper(mac_sw) AND upper(relay_port) = upper(port_sw)) UNION SELECT code, type, value FROM dhcp_clients_by_relay WHERE upper(relay_id) = upper(mac_sw) AND upper(relay_port) = upper(port_sw) ORDER BY CODE;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
   OPEN ip_cur;  
   SET cnt=0;
   REPEAT
     FETCH ip_cur INTO code2,type2,value2;
     IF NOT DONE THEN
       SELECT code2 as code,type2 as type,value2 as value;
    END IF;
    SET cnt=cnt+1;
   UNTIL DONE END REPEAT;
   CLOSE ip_cur;
  IF cnt=1 THEN 
   SELECT 1 as code,5 as type,"255.255.224.0" as value;
   SELECT 3 as code,5 as type,"172.30.128.1" as value;
   SELECT 6 as code,5 as type,"11.163.82.1,8.8.8.8" as value;
   SELECT 15 as code,4 as type,"цывацу.ru" as value;
   SELECT 51 as code,2 as type,"86400" as value;
   SELECT 1009 as code,5 as type,CONCAT("172.30.",ROUND((RAND() * (254 - 0)) + 0),".",ROUND((RAND() * (254 - 0)) + 0)) as value;
  END IF;
END

Работа с Атол 55Ф из python, ветка драйверов 10.х

В продолжение предыдущей статьи о работе с Атол чрез python. Там описывалась работа с драйверами из ветки ДТО 9.х Всё хорошо, но в них не поддерживаются «электронные чеки». Собственно из-за чего всё и затевалось у меня. К сожалению работа с драйверами 10.х существенно отличается от 9.х Но к счастью есть ресурс http://integration.atol.ru, в котором достаточно всё хорошо разжевано с примерами. Правда без учета специфики Linux.

Итак, что нужно для того что-бы «поработать» с драйверами в Ubuntu.

1) Штатно установить драйвера deb из папки installer
2) В зависимости от того, скольки битная система, скопировать в папку проекта содержимое linux-86 или linux-x64. Если драйвера установлены верно, то при запуске fptr10_t.sh можно будет увидеть что-то вроде:

3) В архиве с драйверами ищем libfptr10.py и копируем в файл проекта python

4) Далее если мы будем для инициализации драйвера использовать код из примеров вида:

#!/usr/bin/python2
# -*- coding: utf-8 -*-


import sys
import os
from libfptr10 import IFptr


, то получим ошибку:

root@pavelpc:~/reserved/getcoding/atol/test/ver10# ./kkt_10.py
Traceback (most recent call last):
  File "./kkt_10.py", line 7, in <module>
    from libfptr10 import IFptr
ImportError: dynamic module does not define init function (initlibfptr10)

На сколько мне, не сильно подкованному в python и cpp, удалось выяснить, проблема в не верно скомпилированном libfptr10.so Возможно в следующих версиях драйвера она уйдет.

А пока, выходом у меня является дописание функционального кода в конце файла libfptr10.py, после описания класса IFptr

Например:

LIBRARY_PATH = os.path.dirname(os.path.abspath(__file__))
fptr = IFptr(os.path.join(LIBRARY_PATH, "libfptr10.so"))
print (fptr)

fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_55F))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_TCPIP))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPADDRESS, "192.168.0.99")
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPPORT,"5555")
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_LIBRARY_PATH,"/home/pavel/reserved/getcoding/atol/test/ver10")
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_ACCESS_PASSWORD,"0")
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_USER_PASSWORD,"30")
res=fptr.applySingleSettings()
print (res);

fptr.open()

isOpened = fptr.isOpened()
print ("Opened:"+str(isOpened));

fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_STATUS)
fptr.queryData()
operatorID      = fptr.getParamInt(IFptr.LIBFPTR_PARAM_OPERATOR_ID)
print (operatorID)
logicalNumber   = fptr.getParamInt(IFptr.LIBFPTR_PARAM_LOGICAL_NUMBER)
shiftState      = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_STATE)
serialNumber    = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER)
modelName       = fptr.getParamString(IFptr.LIBFPTR_PARAM_MODEL_NAME)
firmwareVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION)
print (modelName)

Кое-что уже выводит:

Сброс пароля root в MySQL 5.7

Алгоритм сброса теперь несколько отличается чем ранее.

1) Запускаем MySQL в safe mode

service mysqld stop
sudo mysqld_safe --skip-grant-tables &

2) Заходим в MySQL и сбрасываем пароль

mysql -u root mysql
update user set authentication_string=PASSWORD("новый_пароль") where User='root';
FLUSH PRIVILEGES;

Возможно захочется понизить уровень безопасности:

set global validate_password_policy=LOW

3) Добавление НОВЫХ пользователей:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

Автоматическое определение пути интерпретатора в скриптах Linux

Если не известно под какой версией дистрибутива запускается тот или иной скрипт, то можно воспользоваться утилитой env для поиска пути. В этом случае заголовок скрипта будет примерно такой:

#!/usr/bin/env php
<?php
 echo "Hello!";
?>

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

Сия надпись говорит о том, что вы скорее пытаетсеь создать пользователя MySQL со слишком простым паролем.

Решение (плохое):

mysql> SET GLOBAL validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)

Хорошее решение конечно придумать пароль сложнее