Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

file contents match foreach loop

Pagina: 1
Acties:

Onderwerpen


  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
Hi all,

ik zit met een klein issue, waar ik even niet uitkom. wanneer ik vmrun, run (Linux), worden de resultaten naar een bestand weggeschreven. Hierna lees ik dit bestand uit, en match ik op hostnames om zo de vm's per esx hosts te krijgen.

hier een voorbeeld:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
// list unique esx hosts \\

shell_exec("vmrun -h <hosts> -u <user> -p <password> list | cut -d'/' -f2 | cut -d']' -f1 | cut -d':' -f1 | egrep -v '(<string>|<string>)' | grep -i <string>  > /var/log/vm/vlist");
$hostfile=file("/var/log/vm/vlist");
$hostfile=array_unique($hostfile);
asort($hostfile);
$esxhosts=count($hostfile);

// Get total vm's from file \\

shell_exec("vmrun -h <host> -u <user> -p <password> list > /var/log/vm/list");
$number_of_vms=shell_exec("cat /var/log/vm/vlist | wc -l");
$max_vm_per_host=25;
$max_vm_total=$max_vm_per_host*$esxhosts;
$vms_left=$max_vm_total-$number_of_vms;
        print "<table align='center' border='1' cellpadding='3' cellspacing='0'>";
        print "<tr><td colspan='2'><b><ENV>: <...> environment</b></td></tr>";
        print "<tr><td>Total ESX hosts: </td><td>".$esxhosts."</td></tr>";
        print "<tr><td>Number of VM's: </td><td>$number_of_vms</td></tr>";
        print "<tr><td>Max VM's for <env>: </td><td>$max_vm_total</td></tr>";
        print "<tr><td>VM's left</td><td>$vms_left</td></tr>";
        print "</table><br>";

///// Main Table \\\\\\
////////////\\\\\\\\\\\\
    print "<table align='center' border='1' cellpadding='3' cellspacing='0' >";
$count=1;

foreach($hostfile as $host) {

    // find all instances of $host from $file
    $host=trim($host); // remove any white space from $host.
    $file=file_get_contents('/var/log/vm/list') or die($php_errormsg);
    $numvms=substr_count($file,$host );
    if($numvms < 20){
                print "<tr><td bgcolor=#AFDCEC>$count: </td><td bgcolor=#C3FDB8><a href=\"scripts/hostid.php?id=".$host."\" target=\_blank\">".htmlspecialchars($host)."</a></td><td bgcolor='#C3FDB8'align='left'>total vm's: $numvms</td></tr>";
        } elseif($numvms < 24) {
                print "<tr><td bgcolor=#AFDCEC>$count: </td><td bgcolor=#C3FDB8><a href=\"scripts/hostid.php?id=".$host."\" target=\_blank\">".htmlspecialchars($host)."</a></td><td bgcolor='orange'align='left'>total vm's: $numvms</td></tr>";
        } elseif($numvms > 24) {
                print "<tr><td bgcolor=#AFDCEC>$count: </td><td bgcolor=#C3FDB8><a href=\"scripts/hostid.php?id=".$host."\" target=\_blank\">".htmlspecialchars($host)."</a></td><td bgcolor='red'align='left'>total vm's: $numvms</td></tr>";
        }
$count++;
}
    print "</table>";
?>


Dit werkt, alleen wordt er 1 esx host niet weergegeven, ik heb de file vlist bekeken, en alle esxhosts staan netjes onder elkaar. Voor alle andere esx hosts wordt er dus gezocht naar het aantal matches voor $host in /var/log/vm/list, en wordt het aantal vm's per esx host gewoon aangegeven, op 1 na dus, deze esx host wordt ook totaal niet weer gegeven op de pagina.

dmv $count kan ik goed zien welke er wordt weggelaten:

1: host1
2: host2
3: host3
4: host4
5: host5
7: host7
8: host8
etc etc

host 6 wordt hier dus weggelaten, terwijl hij wel degelijk in de lijst voorkomt.

Wanneer ik trim aanpas naar:

PHP:
1
$host=trim($host, "\n"); // remove any white space from $host

worden wel alle esx hosts weergegeven (inclusief nr 6 dus), alleen nu zijn er geen matches meer voor het aantal vm's per host...

Heb trim op verschillende manieren getest, ik heb geprobeerd de file anders uit te lezen, maar krijg dan errors als: array to string conversion etc.

De file is gewoon 1 lange lijst met hosts, en op de manier zoals ik hem nu uitlees, werkt het niet helemaal goed.

Is er een andere mogelijkheid, om dit op een nette manier op te lossen ?

p.s. Ben geen php guru ofzo, ben ook nog aan het leren :-)

  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
FYI

problem solved.

Zat hem in de elseif en elseif, de laatste elseif heb ik vervangen door else, alle hosts met exact 24 instances werden genegeerd.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ja, en nog enkel die if/else om enkel een $class string op low/medium/high te zetten (of kleurtje als semantiek je echt niet boeit) en zodoende niet meer een hele lap html 3x te hebben staan.

{signature}


  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
Voutloos schreef op dinsdag 03 april 2012 @ 13:37:
Ja, en nog enkel die if/else om enkel een $class string op low/medium/high te zetten (of kleurtje als semantiek je echt niet boeit) en zodoende niet meer een hele lap html 3x te hebben staan.
Het werkt ondertussen allemaal naar behoren :D, is nog een aardig tooltje geworden.

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Heb je ook gedaan wat Voutloos aangaf?

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
Guillome schreef op dinsdag 03 april 2012 @ 18:13:
Heb je ook gedaan wat Voutloos aangaf?
Zou ik daar iets meer uitleg over kunnen krijgen, snap even niet wat er precies gezegd wordt over die if else loop.

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Je doet 3 keer een echo van een hele lange htmlstring. Enig verschil is je classname of style. En daar gebruik je nu een if elseif else voor met 3 keer dezelfde string.

Doe beter een switch en een variabele met de classname of style, en gebruik die

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
Guillome schreef op woensdag 04 april 2012 @ 11:28:
Je doet 3 keer een echo van een hele lange htmlstring. Enig verschil is je classname of style. En daar gebruik je nu een if elseif else voor met 3 keer dezelfde string.

Doe beter een switch en een variabele met de classname of style, en gebruik die
Ok, even kijken hoe zo'n switch werkt, nog niet gedaan in php, zal wel moeten lukken neem ik aan :-)

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Ja das niet zo moeilijk :) Maar het gaat voornamelijk om de rest van het verhaaltje

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • MarcHeijerman
  • Registratie: December 2007
  • Laatst online: 03-08 21:10
Alles gefixed :-), tool werkt goed. Thanks for the replies.
Pagina: 1