commit bd632bb3e45e7ec693a6163f602cde29207a51b5 Author: netmoose Date: Mon Sep 22 18:39:13 2014 +1100 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/oplnew.php b/oplnew.php new file mode 100644 index 0000000..6098b00 --- /dev/null +++ b/oplnew.php @@ -0,0 +1,140 @@ + '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 ); +} +} + +?> \ No newline at end of file diff --git a/raid1spare.py b/raid1spare.py new file mode 100755 index 0000000..e44dbef --- /dev/null +++ b/raid1spare.py @@ -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 "Хорошо"