commit
bd632bb3e4
3 changed files with 241 additions and 0 deletions
@ -0,0 +1,140 @@
@@ -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 @@
@@ -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