Créer des modules supplémentaires contre la fraude

De ISPWiki.

BILLmanager vous permet d'ajouter votre propre module gestionnaire. Le module de détection anti fraude consiste en 2 fichiers:

  1. Le fichier XML décrit comment installer l'interface de connexion nommée comme billmgr_mod_xxx.xml, où xxx est un symbole aléatoire. Le fichier doit être placé dans le répertoire /usr/local/ispmgr/etc/ et encodé en UTF-8.
  2. Le fichier binaire ou (dépend de la langue) textuel du module gestionnaire. Le fichier doit être placé dans le catalogue /usr/local/ispmgr/sbin/, le nom de fichier doit commencer par fp.

Sommaire

Structure de fichiers XML

Le document XML consiste en 2 parties:

  • Description des champs du formulaire
  • Champs localisés
<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
	<metadata name="fraudparam_xxx" type="form"> <!-- xxx - name of your module without '''fp''' -->
		<form>
			<!--Configuration fields that are necessary for your module.  They are displayed when providing the module properties-->
			<field name="field_name_1">
				<input type="text" name="field_name_1"/>
			</field>
			<!--...-->
			<field name="field_name_n">
				<input type="text" name="field_name_n"/>
			</field>
		</form>
	</metadata>

	<lang name="en"> <!-- Multiple languages can be described in an XML document. The English language must be present for correct operation -->
		<messages name="fraudconf">
			<msg name="xxx">XXX</msg> <!-- xxx - your module name without '''fp''', XXX is a module name on the list -->
		</messages>

		<messages name="fraudparam_xxx"> <!-- xxx - your module name without '''fp''' -->
			<msg name="title">Title</msg> <!-- Property form heading -->
			<msg name="field_name_1">field name 1</msg> <!-- Module property field name -->
			<msg name="hint_field_name_1">hint field name 1</msg> <!-- A hint that is shown when moving the mouse cursor over a field's name -->
			<!--...-->
			<msg name="field_name_n">field name n</msg>
			<msg name="hint_field_name_n">hint field name n</msg>
		</messages>
	</lang>

	<lang name="ru">
		<!--The same parameters in another language -->
	</lang>
</mgrdata>

Structure du module

BILLmanager appelle le fichier du module en lui donnant les informations nécessaires via les paramètres de la ligne de commande.

Le module gestionnaire doit traiter les paramètres de la ligne de commande et répondre aux commandes.

La configuration du module est sauvegardée dans le fichier /usr/local/ispmgr/etc/fptextmagic.conf en format suivant: <parameter name> <value>. Chaque paramètre est spécifié dans une ligne séparée. Le module informe BILLmanager de sa terminaison:

  • en cas de succès, appelez la commande '/usr/local/ispmgr/sbin/mgrctl -m billmgr -o xml longtask.finish elid=(PID файл запуска) status=ok'
  • en cas d'erreur, appelez la commande '/usr/local/ispmgr/sbin/mgrctl -m billmgr -o xml longtask.finish elid=(PID файл запуска) status=err errmsg=(texte d'erreur)'

En savoir plus LongTask

Paramètres

  • validate - 'ok' doit être passé au courant de sortie.
  • tune - vous pouvez passer le document XML qui décrit l'interface au courant de sortie standard.
  • type - un type de module doit être passé: utilisez 'sms', si un texto est d'être envoyé, ou 'call', si l'appel est d'être fait.
  • call - appelez le gestionnaire afin d'envoyer un texto ou de faire un appel. La version complète fait comme suit 'fpxxx call ccode phone code lang', où call est la commande gestionnaire, ccode est le code de pays dans le numéro de téléphone, phone est le numéro de téléphone, code est le code de vérification, lang est la langue de l'utilisateur par défaut.

Exemple

Cette section décrit comment créer un script de module afin de connecter à l'API TextMagic (le texte XMLprésenté ci-dessous est un exemple et vous ne pouvez pas l'utiliser).

Document XML

Exemple:

<?xml version="1.0" encoding="UTF-8"?>
<mgrdata>
	<metadata name="fraudparam_textmagic" type="form">
		<form>

Configuration de module:

			<field name="username">
				<input type="text" name="username" empty="no"/>
			</field>
			<field name="password">
				<input type="text" name="password" empty="no"/>
			</field>
			<field name="phonereg">
				<input type="text" name="phonereg"/>
			</field>
		</form>
	</metadata>

Paramètres du formulaire en anglais:

	<lang name="en">
		<messages name="fraudconf">
			<msg name="textmagic">Text Magic</msg>
		</messages>

		<messages name="fraudparam_textmagic">
			<msg name="title">Phone check from Text Magic</msg>
			<msg name="username">User name</msg>
			<msg name="hint_username">Specify a user name</msg>
			<msg name="password">Password</msg>
			<msg name="hint_password">Specify a password</msg>
			<msg name="phonereg">Phone filter</msg>
			<msg name="hint_phonereg">Specify a phone filter. This field can be empty.</msg>
		</messages>
	</lang>

Paramètres du formulaire en russe:

	<lang name="ru">
		<messages name="fraudconf">
			<msg name="textmagic">Text Magic</msg>
		</messages>

		<messages name="fraudparam_textmagic">
			<msg name="title">Phone verification from Text Magic</msg>
			<msg name="username">Username</msg>
			<msg name="hint_username">Enter a username</msg>
			<msg name="password">Password</msg>
			<msg name="hint_password">Enter a password</msg>
			<msg name="phonereg">Phone number filter</msg>
			<msg name="hint_phonereg">Allowed phone numbers.You may leave this field blank</msg>
		</messages>
	</lang>
</mgrdata>

Script gestionnaire

Script gestionnaire écrit en PHP

#!/usr/bin/php
<?php

Installez votre propre gestionnaire d'erreurs afin de les faire en log au lieu de transmission dans le courant de sortie:

	set_error_handler("tmErrorHandler");

Ouvrez le fichier log:

	$log_file = fopen("/usr/local/ispmgr/var/fptextmagic.log", "a");
	fwrite($log_file, "=======".date("M j H:i:s") . "[] " ."=======\n");

Enregistrez les paramètres dans le log:

	foreach($argv as $line_num => $line) {
		fwrite($log_file, date("M j H:i:s") . "[] " . $line_num.":".$line."\n");
	}

Les paramètres acceptés doivent être traités (le premier paramètre est le nom de fichier lancé). Si le nombre est inférieur à 2, affichez les informations sur l'utilisation du module. 3 ou 4 paramètres sont passés pour la commande call, donc, le module doit accepter 4 ou 5 paramètres:

	if ($argc<2) {
		usage();
	} else {
		switch($argv[1]) {

Retournez 'ok':

			case "validate":
				echo "ok";
				break;
			case "tune":
				break;

Retournez le type de module sms:

			case "type":
				echo "sms";
				break;

Lancez le gestionnaire d'envoi de TEXTO:

			case "call":
				if ($argc<5 || $argc>6) {
					fwrite($log_file, date("M j H:i:s") . "[] " . "Invalid params number." . "\n");

					usage();
				} else {
					fwrite($log_file, date("M j H:i:s") . "[] " . "Start call API." . "\n");

					if ($argc == 4) {
						callapi($argv[2] . $argv[3], $argv[4]);
					} else {
						callapi($argv[2] . $argv[3], $argv[4], $argv[5]);
					}
				}
				break;
			default:
				usage();
		}	
	}

	fwrite($log_file, "=======".date("M j H:i:s") . "[] " ."=======\n");
	fclose($log_file);

Module de l'utilisation de fonction:

	function usage() {
		print("ISPsystem BILLmanager plugin v1.0
Text Magic integration plugin.
Usage:
	validate - print 'ok';
	tune - no return value;
	type - return 'sms' as type of plugin;
	call 'country_code' 'phone_number' 'verification_code' 'lang' - execute plugin function.\n");
}

Fonction de l'envoi d'un TEXTO:

	function callapi($phone, $code, $lang = "en") {
		global $log_file;

		fwrite($log_file, date("M j H:i:s") . "[] " . "Phone: " . $phone . " Code: " . $code . "\n");

		$msg = "Your verification code is ".$code;

Retirez les paramètres depuis le fichier de configuration:

		$lines = file("/usr/local/ispmgr/etc/fptextmagic.conf", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

		$params = array();

		foreach ($lines as $line_num => $line) {
			$arr_key = "";
			$arr_val = "";
			list($arr_key, $arr_val) = explode(" ", $line, 2);
			$params += array($arr_key => $arr_val);
		}

		$curl_client = curl_init("https://www.textmagic.com/app/api");

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

Faites le tableau avec les paramètres fournis sur le serveur:

		$data = array("username" => $params["username"], "password" => $params["password"], "cmd" => "send",
			      "text" => $msg, "phone" => $phone, "unicode" => "0");

		curl_setopt($curl_client, CURLOPT_SSL_VERIFYPEER, 0);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		curl_setopt($curl_client, CURLOPT_POST, 1);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		curl_setopt($curl_client, CURLOPT_POSTFIELDS, $data);

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		$output = curl_exec($curl_client); //If the request is successfully processed, 1 is put to $output. If not, nothing is specified.  

		fwrite($log_file, date("M j H:i:s") . "[] " . curl_error($curl_client) . "\n");

		fwrite($log_file, date("M j H:i:s") . "[] " . $output . "\n");

Terminez le module:

		fwrite($log_file, date("M j H:i:s") . "[] Finish task with PID file " . getenv("MGR_LT_PID") . "\n");

		if ($output == "1") {
			exec("/usr/local/ispmgr/sbin/mgrctl -m billmgr -o xml longtask.finish elid=". getenv("MGR_LT_PID") ." status=ok");
		} else {
			exec("/usr/local/ispmgr/sbin/mgrctl -m billmgr -o xml longtask.finish elid=". getenv("MGR_LT_PID") ." status=err errmsg='Error with cURL'");
		}

		curl_close($curl_client);
	}

Fonction de gestionnaire d'erreurs:

	function tmErrorHandler($errno, $errstr, $errfile, $errline) {
		global $log_file;
		fwrite($log_file, date("M j H:i:s") . "[] " . "Error [" . $errno . "] ErrMsg: " . $errstr . ". In file: " . $errfile . ". In line: " . $errline . "\n");
	    return true;
	}
?>

Script gestionnaire écrit en Python 2.6

Indiquez le script gestionnaire et importez les modules nécessaires:

#! /usr/bin/env python
import sys, string, time, httplib, urllib, os, subprocess

Spécifiez les fontions demandées


Spécifiez la fonction de sortie dans le log:

def log(msg):
	log_file.write(time.strftime("%b %d %H:%M:%S[] ") + msg + "\n")

Spécifiez le fonction de sortie des informations sur l'utilisation de script:

def usage():
	print "ISPsystem BILLmanager plugin v1.0"
	print "Text Magic integration plugin."
	print "Usage:"
	print "\tvalidate - print 'ok';"
	print "\ttune - no return value;"
	print "\ttype - return 'sms' as type of plugin;"
	print "\tcall 'country_code' 'phone_number' 'verification_code' 'lang' - execute plugin function.\n"

Spécifiez la fonction de traitement de l'envoi d'un TEXTO:

def callapi(phone, code, lang="en"):
	log("Start call api: phone = " + phone + ", code = " + code + ", lang = " + lang)
	msg = "Your verification code is " + code

Ouvrez le fichier de configuration:

	config = open("/usr/local/ispmgr/etc/fptextmagic.conf", "r")
	params = {}
	for line in config.readlines():
		line = string.strip(line, " \n")
		kv = line.split(" ")
		try:
			params[kv[0]] = kv[1]
		except IndexError:
			params[kv[0]] = ""
	config.close()

Faites un tableau des paramètres fournis sur le serveur et envoyez une requête au serveur en utilisant l'objet de HTTPSConnection:

	params = urllib.urlencode({'username': params["username"], 'password': params["password"], 'cmd': "send", "text": "Your verification code is " + code, 'phone': phone, 'unicode': "0"})
	headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
	http_client = httplib.HTTPSConnection("www.textmagic.com");
	http_client.request("POST", "/app/api", params, headers)
	response = http_client.getresponse()
	data = response.read()
	log(str(response.status) + ":" + str(data))

Terminez le module si la variable MGR_LT_PID est spécifiée. Envoyez les informations sur le statut à BILLmanager:

	if MGR_LT_PID == "None":
		log("Standalong. No finish action")
	else:
		if response.status == 200:
			subprocess.Popen(["/usr/local/ispmgr/sbin/mgrctl", "-m", "billmgr", "-o", "xml", "longtask.finish", "elid=" + str(os.getenv("MGR_LT_PID")), "status=ok"]);
		else:
			subprocess.Popen(["/usr/local/ispmgr/sbin/mgrctl", "-m", "billmgr", "-o", "xml", "longtask.finish", "elid=" + str(os.getenv("MGR_LT_PID")), "status=err", "errmsg='Error with cURL'"]);

Code principal de script


Ouvrez le log afin d'ajouter lemessage:

log_file = open("/usr/local/ispmgr/var/fptextmagic.log", "a")

Redirigez des erreurs au log:

sys.stderr = log_file

Retirez la variable qui contient le nom de PID de processus longtask

MGR_LT_PID = str(os.getenv("MGR_LT_PID"))

Traitez les paramètres de la ligne de commande:

if len(sys.argv) < 2:
	log("Too few parameters, print usage")
	usage()
else:

Sortissez en la commande validate:

	if sys.argv[1] == "validate":
		print "ok"

Sortissez en la commande tune:

	elif sys.argv[1] == "tune":
		print ""

Sortissez en la commande type:

	elif sys.argv[1] == "type":
		print "sms"

Traitez la commande d'envoi des messages (retirez les paramètres et lancez la fonction d'envoi):

	elif sys.argv[1] == "call":
		if len(sys.argv) < 5 or len(sys.argv) > 6:
			log("Too few or a lot parameters, print usage")
			usage()
		else:
			phone = sys.argv[2] + sys.argv[3]
			code = sys.argv[4]
			if len(sys.argv) == 5:
				callapi(phone, code)
			elif len(sys.argv) == 6:
				lang = sys.argv[5]
				callapi(phone, code, lang)
			else:
				log("Too few or a lot parameters, print usage")
				usage()
	else:
		usage()

Fermez le pointeur vers le log:

log_file.close()
Cet article vous a-t-il été utile? Oui | Non
Outils personnels