components
  1. <?php
  2.  
  3. $components=array("libconfig","nt-watchdog","nt-log","nt-metrics","libnt","nt-cmdtree","nt-proto","nt-pipe","nt-filters","nt-sdh","nt-service","ns-cli","nt-flows","nt-io","nt-pkt-collector","nt-dec","nt-proto2db","nt-shmdb","nt-sdh-asm","nt-net","nt-dataflows","libntgsm","nt-aaadb","nt-filters-manager","nt-feeder","vitok");
  4. // возвращает список компонент родителей (нужна оптимизация под текущие списки с исчерпывающими значениями)
  5. function get_component_parents($component){
  6.     switch ($component) {
  7.         case "vitok":              $parents=["nt-feeder"]; break;
  8.         case "nt-feeder":          $parents=["nt-service", "nt-filters-manager","nt-dataflows", "nt-pkt-collector", "nt-io"]; break;
  9.         case "libntgsm":           $parents=["nt-dec","nt-shmdb","nt-pipe"]; break;
  10.         case "libnt":              $parents=["nt-log"]; break;
  11.         case "ns-cli":             $parents=["nt-metrics"]; break;
  12.         case "nt-service":         $parents=["nt-metrics"]; break;
  13.         case "nt-aaadb":           $parents=["nt-pipe","nt-dec","nt-shmdb","nt-service"]; break;
  14.         case "nt-cmdtree":         $parents=["nt-log"]; break;
  15.         case "nt-dataflows":       $parents=["nt-pipe","nt-shmdb"]; break;
  16.         case "nt-dec":             $parents=["nt-metrics","nt-proto"]; break;
  17.         case "nt-io":              $parents=["nt-metrics","nt-cmdtree"]; break;
  18.         case "nt-filters":         $parents=["nt-metrics"]; break;
  19.         case "nt-filters-manager": $parents=["nt-filters","nt-net"]; break;
  20.         case "nt-flows":           $parents=["libnt","nt-metrics"]; break;
  21.         case "nt-log":             $parents=["libconfig"]; break;
  22.         case "nt-metrics":         $parents=["nt-log"]; break;
  23.         case "nt-net":             $parents=["nt-pipe","nt-flows","nt-dec"]; break;
  24.         case "nt-pipe":            $parents=["nt-metrics"]; break;
  25.         case "nt-pkt-collector":   $parents=["nt-pipe"]; break;
  26.         case "nt-proto":           $parents=["libnt"]; break;
  27.         case "nt-proto2db":        $parents=["nt-proto","nt-metrics"]; break;
  28.         case "nt-sdh":             $parents=["nt-metrics"]; break;
  29.         case "nt-sdh-asm":         $parents=["nt-io","nt-sdh"]; break;
  30.         case "nt-shmdb":           $parents=["nt-proto","nt-metrics","nt-cmdtree"]; break;
  31.         default:                   $parents=[];
  32.     }
  33.     return $parents;
  34. }
  35.  
  36. // возвращает массив пар "компонент" => [ список компонент родителей ]
  37. function get_parents_list($components){
  38.     $parents_list=array();
  39.     foreach($components as $component){
  40.         $parents_list[$component]=get_component_parents($component);
  41.     }
  42.     return $parents_list;
  43. }
  44.  
  45. // возвращает список предков компонента конкретного уровня (level 0 - parents, level 1 - grandparents, ...)
  46. function get_component_ancestors_level($component,$level){
  47.     $parents_level=array();
  48.     $parents=get_component_parents($component);
  49.     if(!empty($parents)){
  50.         foreach($parents as $parent){
  51.             $parents_level[] = $parent;
  52.         }
  53.     }
  54.     if ($level >= 1){
  55.         for ($i = 1; $i <= $level; $i++) {
  56.             $prev_parents_level=$parents_level; $parents_level=array();
  57.             if (!empty($prev_parents_level)){
  58.                 foreach ($prev_parents_level as $pre_parent) {
  59.                     foreach (get_component_ancestors_level($pre_parent, 0) as $pre_pre_parent) {
  60.                         $parents_level[] = $pre_pre_parent;
  61.                     }
  62.                 }
  63.             }
  64.         }
  65.     }
  66.     return $parents_level;
  67. }
  68.  
  69. function get_component_ancestors($component){
  70.     global $parents_list;
  71.     $parents=array();
  72.     for ($level = 0; $level <= count(array_keys($parents_list))-1; $level++) {
  73.         $component_parents_level=array();
  74.         $component_parents_level=get_component_ancestors_level($component,$level);
  75.         if (!empty($component_parents_level)){
  76.             // так видно, что некоторый компонент может оказатся предком запрашиваемого компонента на разных уровнях
  77.             foreach ($component_parents_level as $parent) { $parents[$parent][] = $level; }
  78.             //
  79.             //foreach ($component_parents_level as $parent) { $parents[$level][] = $parent; }
  80.             //$parents[$level]=[];
  81.             //foreach ($component_parents_level as $parent) {
  82.             //    if(!in_array ($parent, $parents[$level])){ $parents[$level][] = $parent; }
  83.             //}
  84.         } else {
  85.             continue;
  86.         }
  87.     }
  88.     return $parents;
  89. }
  90. // возвращает список потомков компонента конкретного уровня (level 0 - child, level 1 - grandsons, ...)
  91. function get_component_childs_level($current_component,$level){
  92.     global $parents_list;
  93.     $childs_level = array();
  94.     foreach ($parents_list as $component=>$depends) {
  95.         if ($current_component != $component and in_array ($current_component, $depends)) {  
  96.             $childs_level[] = $component;
  97.         }
  98.     }
  99.     if ($level >= 1){
  100.         for ($i = 1; $i <= $level; $i++) {
  101.             $prev_level_childs=$childs_level; $childs_level = array();
  102.             if (!empty($prev_level_childs)){
  103.                 foreach ($prev_level_childs as $pre_child) {
  104.                     foreach (get_component_childs_level($pre_child, 0, $parents_list) as $child) {
  105.                         if(!in_array ($child, $childs_level)){ $childs_level[] = $child; }
  106.                     }
  107.                 }
  108.             }
  109.         }
  110.     }
  111.     return $childs_level;
  112. }
  113.  
  114. // возвращает исчерпывающий список потомков компонента
  115. function get_component_childs($component){
  116.     global $parents_list;
  117.     $childs=array();
  118.     $q_components=count(array_keys($parents_list));
  119.     for ($level = 0; $level <= $q_components-1; $level++) {
  120.         $component_childs_level=array();
  121.         $component_childs_level=get_component_childs_level($component,$level,$parents_list);
  122.         if (!empty($component_childs_level)){  
  123.             foreach ($component_childs_level as $child) { $childs[$child][] = $level; }
  124.         } else {
  125.             continue;
  126.         }
  127.     }
  128.     return $childs;
  129. }
  130.  
  131. // отрисовывает таблицы для redmine
  132. function get_redmine_table($components){
  133.     $separator ='|';
  134.     $footer=str_repeat($separator,3);
  135.     $summ=str_repeat($separator,3);
  136.     echo "table{width: 100%; background-color: #eee;}.n";
  137.     foreach ($components as $component) {
  138.         $depends_str='';
  139.         foreach ($components as $current_component) {
  140.             $component_ancestors_list=get_component_ancestors($component);
  141.             if(in_array ($current_component,array_keys($component_ancestors_list))){
  142.                 $value=max($component_ancestors_list[$current_component]);
  143.                 $depends_str.="={background-color: #00${value}f${value}f;color: white;}. $value|";
  144.             } elseif ("$current_component" == "$component") {
  145.                 $depends_str.="=.x|";
  146.             } else {
  147.                 $depends_str.="|";
  148.             }
  149.         }
  150.         echo($separator.count($component_ancestors_list).$separator.$component.$separator.$depends_str."n");
  151.         $footer.=$component.$separator;
  152.         $summ.=count(get_component_childs($component)).$separator;
  153.     }
  154.     echo $footer."n".$summ."n";
  155. }
  156.  
  157. $parents_list=get_parents_list($components);
  158. get_redmine_table($components);
  159.  
  160.  
  161. ?>
Parsed in 0.158 seconds