Я работаю над сценарием, который даст вам информацию о некоторых устройствах Cisco.
class COMMAND
{
...
private $intbrief;
private $core;
private $allcommand;
...
public function __construct()
{
require_once 'class.php';
$this->core = new CLASS();$this->allcommand = array(
array( "id" => "brief",
"def" => "show ip interface brief | exclude un",
"vrf" => false,
"val" => "",
),
array( "id" => "vrf",
"def" => "show ip interface ".$this->intbrief." | include VPN Routing/Forwarding",
"vrf" => false,
"val" => "",
));
}
...
private function validip($ip)
{
// return true or false
}
public function go($_ip, $_user, $_pass )
{
if($this->validip($_ip))
{
$this->ip = $_ip;
$this->user = $_user;
$this->pass = $_pass;
return $this->logic();
} else {
echo "Invalid Options\n";
exit(1);
}
}private function logic()
{
foreach ($this->allcommand as $i => &$row)
{
if(method_exists($this, $row['id']))
{
if(!empty($this->intbrief))
{
echo "\n\n\n\t".$this->intbrief."---TRUE\n\n\n";
}
if(isset($this->vrf) and $row['vrf'] == true)
{
$command = $row['def']." vrf ".$this->vrf;
} else {
$command = $row['def'];
}
// Send commands to telnet class
$output = $this->core->GetOutputOf($this->ip, $this->user, $this->pass, $command);// Send to parse functions
$row['val'] = $this->$row['id']($output);
} else {
echo "Check functions from allcommand array\n";
exit(1);
}
}
return $this->allcommand;
}
private function brief($match)
{
// parsing output ...
$this->intbrief = $output; // e.g. $this->intbrief = "FastEthernet0/1";
}
private function vrf($match)
{
// parsing output ...
$this->vrf = $output;
}
}
$com = new COMMAND();
$f = $com->go($ip, $user, $password);
Петля работает просто отлично, но …
Массив vrf def является show ip interface | include VPN Routing/Forwarding
— без $this->intbrief
потому что это ноль …. Но почему? Я проверил это в цикле …
if(!empty($this->intbrief))
{
echo "\n\n\n\t".$this->intbrief."---TRUE\n\n\n";
}
… и это правда. Так где же ошибка?
Я хочу выполнить что-то вроде show ip interface FastEthernet0/1 | include VPN ...
Я получу информацию «FastEthernet0 / 1» из краткого описания функций
Спасибо за помощь
cdpb
Я снова переосмыслил проблемы и немного протестировал, я думаю, что проблема заключается в создании массива. При создании массива переменные в значениях массива анализируются, а затем значения фиксируются в этом экземпляре массива. Поэтому я думаю, что размещение $ this-> allcommand в конструкции или в любых других функциях не имеет значения. Чтобы решить эту проблему и не слишком сильно изменить структуру вашего класса, я бы предложил при объявлении массива allcommand
в
$this->allcommand = array(
array( "id" => "brief",
"def" => "show ip interface brief | exclude un",
"vrf" => false,
"val" => "",
),
array( "id" => "vrf",
"def" => "show ip interface <inf> | include VPN Routing/Forwarding",
"vrf" => false,
"val" => "",
));
Вы можете затем в функции логики, после получения $command = $row['def'];
сделать preg_replace
или же str_replace
преобразовать <inf>
если есть какое-либо значение $this->intbrief
, Не может быть лучшим решением, но я могу выйти.
Хорошая идея!
Я также немного протестировал и построил что-то вроде цикла while в отдельной функции, которая будет выдавать только одну часть массива за раз. Идея заключается в том, что в каждом цикле цикла переменные внутри будут устанавливаться снова.
Похоже:
....
private function arraycommand()
{
static $i = 1;
$allcommand = array(
array( "id" => "brief",
"def" => "show ip interface brief | exclude un",
"vrf" => false,
),
array( "id" => "vrf",
"def" => "show ip interface ".$this->intbrief." | include VPN Routing/Forwarding",
"vrf" => false,
),
);
while(count($allcommand) >= $i)
{
$t = $i -1;
$i++;
return $allcommand[$t];
}
return false;
}
private function logic()
{
while(true)
{
$allcommand = array($this->arraycommand());
if(!$allcommand[0] == false)
{
foreach ($allcommand as $i => &$row)
{
...
}
} else break;
}
return output
}
....
Это не очень красиво закодировано, но это работает 🙂
Спасибо за вашу помощь!!!