2017-05-28 3 views
-1

J'ai essayé d'obtenir la valeur et la substitution de perl subroutine pour obtenir la partie requise de la chaîne à partir du sous-programme randomips dans exim.conf. Cependant, lorsque j'utilise la substitution de chaîne i obtenir erreur comme suit:Exim obtenant des informations d'identification aléatoires dans exim.conf

Here is what I am trying to achieve

Je suis en train de diviser la chaîne par deux points et obtenir la première occurrence comme « interface ». Je vais utiliser la deuxième occurrence comme « helo_data

exim.pl

sub randomhosts { 
@inet = ("x.x.x.1:hostname1.domain.com","x.x.x.2:hostname2.domain.com","x.x.x.3:hostname3.domain.com" 
); 

return $inet[int rand($#inet+1)]; 

} 

exim.conf

dkim_remote_smtp: 
    driver = smtp 
    interface = "${perl{randomhosts}%:*}" 
    helo_data = "${sender_address_domain}" 

erreur que je reçois est la suivante:.

"failed to expand "interface" option for dkim_remote_smtp transport: missing '}' after 'perl'". Probablement la syntaxe Toute aide?

+0

Il me semble que vous avez un fichier de configuration et que vous essayez simplement de taper des commandes perl dans l'espoir d'obtenir un résultat dont je ne suis pas sûr. Veuillez nettoyer la question pour clarifier ce que vous voulez réellement. Si vous voulez utiliser perl pour faire quelque chose, veuillez poster un code utilisable ou au moins assez pour avoir une chance de deviner ce que vous essayez de faire. – bytepusher

+0

Je l'ai édité. Je ne sais pas ce que je peux expliquer de plus. Fondamentalement, je suis en train de faire pivoter ips douane avec leurs noms d'hôtes personnalisés respectifs dans exim qui est construit avec perl – Motsim

+1

S'il vous plaît corriger le formatage de votre question. Une partie de votre code est en cours de formatage en texte brut. Si vous voulez que nous regardions votre code, il est poli de le rendre aussi facile à comprendre que possible. En outre, votre définition de '@ inet' semble manquer de quelques guillemets - ce qui signifie que le code tel qu'il est ne compile même pas. Si vous ne vous souciez pas assez de nous donner une copie exacte de votre code, alors pourquoi voudrions-nous vous aider? –

Répondre

2

Le code que vous essayez de copier a été écrit par quelqu'un qui ne sait pas grand-chose à propos de Perl. Il comprend cette ligne:

return $inet[int rand($#inet+1)]; 

Un programmeur Perl écrirait cela comme

return $inet[rand @inet]; 

Je pense qu'il ya quelques problèmes ici - avec une syntaxe et une avec Exim votre syntaxe Perl.

Exim vous donne cette erreur:

failed to expand "interface" option for dkim_remote_smtp transport: missing '}' after 'perl'

Je ne sais rien à appeler Perl de Exim, mais this page mentionne une syntaxe comme ${perl{foo}} (qui est similaire à celui utilisé dans la page que vous êtes copier à partir de) et un comme ${perl{foo}{argument}} pour appeler un sous-programme et lui passer un argument.Nulle part ne mentionne la syntaxe comme la vôtre:

${perl{randomhosts}%:*} 

Je ne sais pas où vous avez cette syntaxe de, mais il semble probable que ce soit la cause de votre première erreur.

Dans un commentaire, vous dites

I am stying to get first part of string before colon for each random array value for "interface" and part after colon for "helo_data"

Il me semble que Exim ne supporte pas cette exigence. Vous devrez appeler la fonction deux fois pour obtenir les deux informations dont vous avez besoin. Vous pourriez être en mesure de le faire dans le Perl en utilisant quelque chose comme state variables - mais ce serait beaucoup plus complexe que le code que vous avez actuellement là. Deuxièmement, votre code Perl a une erreur de syntaxe, donc même si Exim était capable d'appeler votre code, cela ne fonctionnerait pas.

Le code que vous copiez des jeux en @inet comme ceci:

@inet = ("x.x.x.1", "x.x.x.2", "x.x.x.3", "x.x.x.4"); 

Votre code équivalent est la suivante:

@inet = (
    "x.x.x.1:hostname1.domain.com", 
    "x.x.x.2:hostname2.domain.com, 
    x.x.x.3:hostname3.domain.com 
); 

J'ai reformaté ce, pour rendre les problèmes plus évidents. Il vous manque un certain nombre de guillemets autour des éléments du tableau. (Note: Je vois que pendant que j'ai écrit cette réponse, vous avez fixe.)

Mise à jour: Ok, voici un code à mettre en exim.pl qui fait ce que vous voulez.

use feature qw[state]; 

sub randomhosts { 
    state $current; 

    my @inet = (
    "x.x.x.1:hostname1.domain.com", 
    "x.x.x.2:hostname2.domain.com", 
    "x.x.x.3:hostname3.domain.com" 
); 

    if ($_[0] eq 'generate') { 
    shift; 
    @{$current}{qw[ip host]} = split /:/, $inet[rand @inet]; 
    } 

    return $current->{$_[0]}; 
} 

Il génère une nouvelle paire ip/hôte si son premier argument est 'generate'. Il retournera ensuite le nom d'hôte ou l'adresse IP de la paire générée. Je pense que vous pouvez probablement l'appeler à partir de votre fichier de configuration Exim comme ceci:

Mais je ne suis pas expert en Exim, de sorte que la syntaxe pourrait avoir besoin de peaufinage.

+0

Merci pour votre aide Dave. Cependant, cette syntaxe exim était le problème. La méthode que vous avez introduite ici réalise ce que j'essayais d'obtenir. Merci encore .. – Motsim

+0

@Motsim: Je suis content que ce soit utile. J'espère que vous avez pris le temps de comprendre comment cela fonctionne plutôt que de simplement le copier et le coller. Stack Overflow n'est pas un service d'écriture de code gratuit. –

1

Tout d'abord, je voudrais noter que je n'ai pas travaillé avec exim, donc je ne peux pas dire exactement ce que vous essayez de faire et pourquoi vous avez fait les choses exactement ainsi.

Dans le lien que vous avez publié, une méthode appelée « randinet » est ajouté à exim.pl et la ligne d'interface dans exim.conf est remplacé par

interface = "${perl{randinet}}"

Vous avez mis en place une méthode « » randomhosts et a remplacé la ligne d'interface avec

interface = "${perl{randomhosts}%:*}"

maintenant, l'analyseur se plaint de ne pas trouver le support de fermeture. C'est probablement dû aux symboles que vous vous êtes senti libre d'ajouter mais l'analyseur n'a pas la liberté d'ignorer.

Je vous suggère d'essayer

interface = "${perl{randomhosts}}"

+0

Merci beaucoup de répondre.J'essaie d'obtenir la première partie de la chaîne avant le deux-points pour chaque valeur de tableau aléatoire pour "interface" et une partie après le deux-points pour "helo_data". Par conséquent, ne peut pas utiliser uniquement "" $ {perl {randomhosts}} ". – Motsim