commit
bd632bb3e4
3 changed files with 241 additions and 0 deletions
@ -0,0 +1,140 @@ |
|||||||
|
<?php |
||||||
|
// |
||||||
|
// Скрипт для проведения платежей из Frontol Торговля 4.9 в АСР Гидра через API HID |
||||||
|
// |
||||||
|
|
||||||
|
// Логирование переданного для дальнейших разборок по кассам |
||||||
|
$f = fopen('/var/domains/kassa/opl.log',"a+"); |
||||||
|
$varp = print_r($_POST,true); |
||||||
|
fwrite($f,date('d.m.Y H:i:s').' '.$varp."\n"); |
||||||
|
fclose($f); |
||||||
|
|
||||||
|
// Коннект к Oracle |
||||||
|
$conn = oci_connect('USER', 'PASSWD', 'localhost/DB', 'UTF8'); |
||||||
|
|
||||||
|
if(!$conn){ |
||||||
|
// |
||||||
|
echo 'connection fail'; |
||||||
|
echo json_encode(array('result' => 'ERROR'),JSON_UNESCAPED_UNICODE ); |
||||||
|
die(); |
||||||
|
} else { |
||||||
|
if ($_POST['a'] && $_POST['b'] && $_POST['c'] && $_POST['d']){ |
||||||
|
|
||||||
|
// нормализация переданных значений |
||||||
|
$a = 1*floatval(str_replace(array(',','/','*','-','+'),'.',$_POST['a'])); // сумма |
||||||
|
$b = 1*$_POST['b']; // код лицевого счета |
||||||
|
$c = $_POST['c']; // касса |
||||||
|
$d = 1*floatval(str_replace(array(',','/','*','-','+'),'.',$_POST['d'])); // тип документа: 1 - платеж, 2 - сторно настраивается во Frontol |
||||||
|
|
||||||
|
// преобразование номера кассы в символьное значение для запроса |
||||||
|
$firms = array('k9110001' => 'KASSA_1', 'k9110002' => 'KASSA_2', 'k9110003' => 'KASSA_3', |
||||||
|
'k9110004' => 'KASSA_4', 'k9110005' => 'KASSA_5', 'k9110006' => 'KASSA_6', |
||||||
|
'k9110007' => 'KASSA_7'); |
||||||
|
// Инициализация сессии в базе |
||||||
|
if(array_key_exists($c,$firms)) |
||||||
|
{ |
||||||
|
$q = " |
||||||
|
BEGIN |
||||||
|
MAIN.INIT( |
||||||
|
vch_VC_IP => '127.0.0.1', |
||||||
|
vch_VC_USER => 'net_interface', |
||||||
|
vch_VC_PASS => 'PASSWD', |
||||||
|
vch_VC_APP_CODE => 'NETSERV_HID', |
||||||
|
vch_VC_CLN_APPID => 'test'); |
||||||
|
END; |
||||||
|
"; |
||||||
|
$stid = oci_parse($conn, $q); |
||||||
|
oci_execute($stid); |
||||||
|
if($e = oci_error($stid)){ |
||||||
|
// ошибка при инициализации |
||||||
|
echo json_encode(array('result' => 'ERROR'),JSON_UNESCAPED_UNICODE ); |
||||||
|
} |
||||||
|
|
||||||
|
if($d == 1){ |
||||||
|
// Если передан тип документа 1, то это документ оплаты. Выполняем оплату |
||||||
|
$q = " |
||||||
|
DECLARE |
||||||
|
res1 NUMBER; |
||||||
|
res2 DATE; |
||||||
|
BEGIN |
||||||
|
EX_PAYMENTS_PKG.EX_PAYMENTS_CHARGE( |
||||||
|
vch_VC_TO_BANK => 'KASSA', |
||||||
|
vch_VC_TO_ACCOUNT => '".$firms[$c]."', |
||||||
|
num_N_SUM => ".$a.", |
||||||
|
num_Fee => 0, |
||||||
|
vch_PayType => 'RMM_KIND_Kassa', |
||||||
|
vch_Currency => 'RUB', |
||||||
|
vch_VC_TRANSACTION_ID => '11112222', |
||||||
|
num_N_FORWHO_ACCOUNT_ID => ".$b.", |
||||||
|
dt_D_TAKING => SYSDATE, |
||||||
|
num_N_DOC_ID => res1, |
||||||
|
dt_D_LOAD => res2 |
||||||
|
); |
||||||
|
END;"; |
||||||
|
} |
||||||
|
else { |
||||||
|
// в противоположном случае считаем, что передан документ возврата, так как иное в кассовой программе не обрабатывается |
||||||
|
// сначала выдергиваем номер последнего документа оплаты по лицевому счету |
||||||
|
$q = " |
||||||
|
select N_DOC_ID from |
||||||
|
SD_V_PAYMENTS_T |
||||||
|
where |
||||||
|
n_forwho_account_id = ".$b." |
||||||
|
and d_time in ( |
||||||
|
SELECT max(PT.D_TIME) DT |
||||||
|
FROM SD_V_PAYMENTS_T PT |
||||||
|
WHERE |
||||||
|
PT.N_DOC_STATE_ID = SYS_CONTEXT('CONST', 'DOC_STATE_Actual') |
||||||
|
AND pt.n_forwho_account_id = ".$b." |
||||||
|
) |
||||||
|
"; |
||||||
|
$stid = oci_parse($conn, $q); |
||||||
|
oci_execute($stid); |
||||||
|
if($e = oci_error($stid)){ |
||||||
|
echo json_encode(array('result' => 'ERROR'),JSON_UNESCAPED_UNICODE ); |
||||||
|
die(); |
||||||
|
} |
||||||
|
else { |
||||||
|
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS); |
||||||
|
} |
||||||
|
// проводим сторнирование полученного документа |
||||||
|
$q = " |
||||||
|
DECLARE |
||||||
|
num_N_DOC_ID_NEW NUMBER := NULL; |
||||||
|
num_N_DOC_ID NUMBER := ".$row['N_DOC_ID']."; |
||||||
|
BEGIN |
||||||
|
SD_DOCUMENTS_PKG.SD_DOCUMENTS_COPY( |
||||||
|
num_N_DOC_ID_OLD => num_N_DOC_ID, |
||||||
|
num_N_DOC_ID_NEW => num_N_DOC_ID_NEW, |
||||||
|
num_N_STORNO_DOC_ID => num_N_DOC_ID); |
||||||
|
SD_DOCUMENTS_PKG.SD_DOCUMENTS_CHANGE_STATE( |
||||||
|
num_N_DOC_ID => num_N_DOC_ID_NEW, |
||||||
|
num_N_NEW_DOC_STATE_ID => 4003); |
||||||
|
END; |
||||||
|
"; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
$stid = oci_parse($conn, $q); |
||||||
|
oci_execute($stid); |
||||||
|
|
||||||
|
if($e = oci_error($stid)){ |
||||||
|
// любая ошибка - сигнал в кассовую программу о немедленном прекращении оплаты |
||||||
|
echo json_encode(array('result' => 'ERROR'),JSON_UNESCAPED_UNICODE ); |
||||||
|
} else { |
||||||
|
// все нормально проводим в кассовом аппарате |
||||||
|
echo json_encode(array('result' => 'OK'),JSON_UNESCAPED_UNICODE ); |
||||||
|
} |
||||||
|
oci_close($conn); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
echo json_encode(array('result' => 'ERROR'),JSON_UNESCAPED_UNICODE ); |
||||||
|
|
||||||
|
} |
||||||
|
} else { |
||||||
|
echo json_encode(array('result' => 'ERROR'),JSON_UNESCAPED_UNICODE ); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
?> |
||||||
@ -0,0 +1,101 @@ |
|||||||
|
#!/usr/bin/env python |
||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Скрипт следит за деградацией RAID1-массивов с автоматической подменой дисков на резервный |
||||||
|
|
||||||
|
import subprocess |
||||||
|
import shlex |
||||||
|
import re |
||||||
|
import smtplib |
||||||
|
from email.mime.text import MIMEText |
||||||
|
|
||||||
|
# входящие параметры |
||||||
|
|
||||||
|
# от кого буд отправляться исходящие e-mail |
||||||
|
me = 'script@mysmtp.ru' |
||||||
|
# кому их отправлять |
||||||
|
you = 'me@mysmtp.ru' |
||||||
|
# сервер SMTP |
||||||
|
smtp_server = 'smtp.mysmtp.ru' |
||||||
|
|
||||||
|
# имя резервного диска |
||||||
|
spare = 'sda5' |
||||||
|
|
||||||
|
# инициализация глобальных переменных |
||||||
|
namemd = {} |
||||||
|
statemd = list() |
||||||
|
sd = '' |
||||||
|
sdn = '' |
||||||
|
md = '' |
||||||
|
|
||||||
|
# функция выполнения внешнего приложения с возвратом его вывода |
||||||
|
def get_cmd_output(cmd): |
||||||
|
args = shlex.split(cmd) |
||||||
|
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
||||||
|
res = p.communicate()[0] |
||||||
|
|
||||||
|
return res |
||||||
|
|
||||||
|
# функция отсыла диагностических сообщений |
||||||
|
def send_eml(txt): |
||||||
|
msg = MIMEText(txt) |
||||||
|
msg['Subject'] = 'The contents of ' |
||||||
|
msg['From'] = me |
||||||
|
msg['To'] = you |
||||||
|
s = smtplib.SMTP(smtp_server) |
||||||
|
s.sendmail(me, [you], msg.as_string()) |
||||||
|
s.quit() |
||||||
|
|
||||||
|
# читаем из /proc/mdstat |
||||||
|
res = get_cmd_output('cat /home/netmoose/!/mdstat') |
||||||
|
# разбираем на ключевые слова результат |
||||||
|
result = re.finditer( ur"(md\d+)|(sd.\d+)\[(\d+)\][\s\n]|\[([U_]+)\]", res ) |
||||||
|
|
||||||
|
# пробегаем по найденному и создаем список |
||||||
|
for match in result : |
||||||
|
for group_index, group in enumerate( match.groups() ) : |
||||||
|
if group : |
||||||
|
if group.find('sd') and group.find('md') and len(group)==1 : |
||||||
|
sdn = group |
||||||
|
namemd[md][sdn] = dict({'name':sd,'state':''}) |
||||||
|
elif group.find('sd') and group.find('md') : |
||||||
|
statemd = list(group) |
||||||
|
i = 0 |
||||||
|
for st in statemd : |
||||||
|
# print "md: %s, i: %s, st: %s" % (md,i,st) |
||||||
|
namemd[md][str(i)]['state'] = st |
||||||
|
i += 1 |
||||||
|
elif group.find('md') : |
||||||
|
sd = group |
||||||
|
else : |
||||||
|
namemd[group] = dict() |
||||||
|
md = group |
||||||
|
|
||||||
|
|
||||||
|
# проходим по созданному выше списку и проверяем состояние дисков, в случае аварии удаляем старый из массива и добавляем резервный |
||||||
|
for md in namemd: |
||||||
|
for sd in namemd[md].keys(): |
||||||
|
if namemd[md][sd]['state'] == '_': |
||||||
|
print "/sbin/mdadm /dev/%s -f /dev/%s"%(md,namemd[md][sd]['name']) |
||||||
|
try: |
||||||
|
fail = get_cmd_output("/sbin/mdadm /dev/%s -f /dev/%s"%(md,namemd[md][sd]['name'])) |
||||||
|
except: |
||||||
|
print "ЖОПА!!!!" |
||||||
|
finally: |
||||||
|
exit(0) |
||||||
|
print "/sbin/mdadm /dev/%s -r /dev/%s"%(md,namemd[md][sd]['name']) |
||||||
|
try: |
||||||
|
remv = get_cmd_output("/sbin/mdadm /dev/%s -r /dev/%s"%(md,namemd[md][sd]['name'])) |
||||||
|
except: |
||||||
|
print "ЖОПА!!!!" |
||||||
|
finally: |
||||||
|
exit(0) |
||||||
|
print "/sbin/mdadm /dev/%s -a /dev/%s"%(md,spare) |
||||||
|
try: |
||||||
|
newadd = get_cmd_output("/sbin/mdadm /dev/%s -a /dev/%s"%(md,spare)) |
||||||
|
except: |
||||||
|
print "ЖОПА!!!!" |
||||||
|
finally: |
||||||
|
exit(0) |
||||||
|
else: |
||||||
|
print "Хорошо" |
||||||
Loading…
Reference in new issue