source: lmd/trunk/fuentes/lmd-server.install/usr/share/llxbootmanager/www-boot/pxemenu.d/10-ltsp.php @ 392

Last change on this file since 392 was 392, checked in by hectorgh, 4 years ago

adding project files

File size: 8.0 KB
Line 
1<?php
2     
3$MenuEntryList=array();
4 
5class menu_entry{
6        var $label;
7        var $menu_label;
8        var $kernel;
9        var $append;
10       
11        public function menu_entry(){
12        $this->label;
13        $this->menu_label;
14        $this->kernel;
15        $this->append;
16        }
17       
18        public function is_empty(){
19        //echo "FUNC IS EMPRTY\n";
20                if ($this->label!="") return false;
21                else return true;
22               
23        }
24       
25        public function get_kernel_version($kernel){
26       
27                // Exclude first part of kernel
28               
29                if ($kernel=="") return "";
30               
31                $pos_vmlinuz=strpos($kernel,'vmlinuz');
32                $tmp_str=substr($kernel,$pos_vmlinuz+8);
33               
34                // Search first char
35               
36                $str_array=str_split($tmp_str);
37                $kernel_str="";
38                $i=0;
39               
40                while ( (preg_match("/^[a-zA-Z]$/", $str_array[$i])==0)&&($i<20) ){ // is not a char
41                        //echo "!".preg_match("/^[a-zA-Z]$/", $str_array[$i])."!\n";
42                        $kernel_str=$kernel_str.$str_array[$i];
43                        $i++;
44                }
45               
46                $kernel_str=substr ($kernel_str, 0, strlen($kernel_str)-1) ;
47                return ($kernel_str);
48               
49               
50        }
51       
52        public function compare_kernels($v1, $v2){
53
54                if($v1==$v2) return 0;
55                else if($v1=="") return 1;
56                else if($v2=="") return -1;
57               
58               
59                $v1_array=explode("-", $v1);
60                $v1_version=$v1_array[0];
61                $v1_subversion=$v1_array[1];
62                $v2_array=explode("-", $v2);
63                $v2_version=$v2_array[0];
64                $v2_subversion=$v2_array[1];
65               
66                // Compare version
67               
68                $v1_version_exploded=explode(".", $v1_version);
69                $v2_version_exploded=explode(".", $v2_version);
70               
71                for($i=0; $i<count($v1_version_exploded); $i++ ){
72                        //echo "* Comparing ".$v1_version_exploded[$i]." with ".$v2_version_exploded[$i]."*\n";
73                        if($v1_version_exploded[$i] > $v2_version_exploded[$i]) return -1;
74                        else if ($v1_version_exploded[$i] < $v2_version_exploded[$i]) return 1;
75                        // elsewhere $v1_version_exploded[$i] = $v2_version_exploded[$i]
76                }
77                // Here, versions are equal
78                if ($v1_subversion>$v2_subversion) return -1;
79                else  if ($v1_subversion>$v2_subversion) return 1;
80                else return 0; // Are equal
81               
82                return -2; // unknown error
83               
84        }
85       
86        public function is_pae($kernel){
87                return  (strpos($kernel,'pae') !== false);
88        }
89       
90        public function set_menu_entry($label, $menu_label, $kernel, $append){
91                //echo  "TESTING MENU ENTRY to $kernel AND append=$append\n";
92               
93                $v1=$this->get_kernel_version($this->kernel);  // v1 is current kernel
94               
95               
96                if ($v1==""){ // If v1 is null, set kernel
97                        $this->label=$label;
98                        $this->menu_label=$menu_label;
99                        $this->kernel=$kernel;
100                        $this->append=$append;
101                } else { // if not, compare versions
102                       
103                        $v2=$this->get_kernel_version($kernel);         // v2 is candidate kernel
104                       
105                        $result_compare_versions=$this->compare_kernels($v1, $v2);
106                       
107                       
108                        if ($result_compare_versions==-1 || $result_compare_versions==0) // v1 is major
109                        {
110                                if($this->is_pae($this->kernel) && !($this->is_pae($kernel))) { // but v2 is not pae and v1 is -> So, v2
111                                        $this->label=$label;
112                                        $this->menu_label=$menu_label;
113                                        $this->kernel=$kernel;
114                                        $this->append=$append;
115                                } // nothing to do if v1 is major
116                        }
117                        else {
118                                if( !($this->is_pae($kernel) && !($this->is_pae($this->kernel)))) {  // v2 is major and v1 is PAE
119                                        $this->label=$label;
120                                        $this->menu_label=$menu_label;
121                                        $this->kernel=$kernel;
122                                        $this->append=$append;
123                                }
124                                }
125                        } // else if ($v1=="")
126                } // function
127       
128
129        private function get_default_boot(){
130            try{
131                $string = file_get_contents("/etc/ltsp/bootopts/defaultboot.json");
132                $json=json_decode($string,true);
133                $GLOBALS['default_boot']=$json["default_boot"]; // Setting defualt boot,
134                return $json["default_boot"];
135            } catch (Exception $e) {
136                return "";
137            }
138
139        }
140
141
142        public function print_entry(){         
143                global $MenuEntryList;
144                $MenuEntry=new stdClass();
145                $MenuEntry->id="ltsp_".preg_replace('/\s+/', '', $this->label);
146                $MenuEntry->label=$this->menu_label;
147                //$MenuEntry->label=$this->label;
148                $MenuEntry->menuString="";
149               
150                $MenuEntry->menuString=$MenuEntry->menuString.$this->label;
151                $MenuEntry->menuString=$MenuEntry->menuString.$this->menu_label;
152                // Debug: echo substr($this->label,6, -1);
153                // Debug: echo $this->get_default_boot();
154                //if($this->get_default_boot()==substr($this->label,6,-1))
155                //    $MenuEntry->menuString=$MenuEntry->menuString."menu default\n";
156                $MenuEntry->menuString=$MenuEntry->menuString.$this->kernel;
157                $MenuEntry->menuString=$MenuEntry->menuString.$this->append;
158                $MenuEntry->menuString=$MenuEntry->menuString."ipappend 3\n\n";
159               
160                array_push($MenuEntryList, $MenuEntry);
161        }
162
163}
164 
165 
166function check_sanity($nbd_name,$nbd_id){
167        // Check if nbd_name is according to its nbd_id, exists conf file and img.
168
169        //echo "Checking: $nbd_name with $nbd_id";
170
171        $nbd_conf_dir="/etc/nbd-server/conf.d/";
172        $nbd_conf_prefix="ltsp_";
173        $nbd_conf_ext=".conf";
174        $lines=file($nbd_conf_dir.$nbd_conf_prefix.$nbd_name.$nbd_conf_ext);
175
176        if (substr($lines[0], 0, -1)=="[".$nbd_id."]") {
177                $i=1;
178                do{
179                        list($attribute, $value)=split( "=" ,$lines[$i]);
180                        if (trim($attribute)=="exportname"){
181                                // Exist this exportname img?
182                                if (is_file(trim($value))) return true;
183                        }
184                        $i++;
185                } while ($i<count($lines));
186        }
187
188        // If we are here... bad luck...
189        return false;
190       
191}
192
193
194function getName($dir){
195        // Check if exists /etc/ltsp/images/$dir and gets image name
196        try{
197                $string = file_get_contents("/etc/ltsp/images/".$dir.".json"); 
198                $json=json_decode($string,true);
199                return $json["name"];
200        } catch (Exception $e) {
201                return $dir;
202        }
203}
204
205
206
207# Global dirs
208$path="/var/lib/tftpboot/ltsp/";
209$dir_desc = opendir($path);
210$base_dir="/opt/ltsp/";
211
212#GET VARS
213$MANUFACTURER=$_GET["manufacturer"];
214$PRODUCT=$_GET["product"];
215$IP=$_GET["ip"];
216$MAC=$_GET["mac"];
217
218
219//Main loop
220while ($dir = readdir($dir_desc)) 
221{
222    if (is_file($path.$dir."/pxelinux.cfg/default")&&($dir!=".")&&($dir!="..")){
223
224        //echo "dir is $dir and default is a file\n";
225        $lines = file($path.$dir."/pxelinux.cfg/default");
226
227        // Setting candidate menu entry
228        $candidate=new menu_entry();
229       
230        foreach ($lines as $line_num => $line) {
231
232            // getting vmlinuz
233            if ((strpos($line,'vmlinuz') !== false)&&(strpos($line,'kernel') !== false)){
234                $kernel=trim(str_replace("kernel", "", $line ));
235                $kernel_line="kernel pxe-ltsp/$dir/$kernel\n";
236            }
237       
238            if (strpos($line,'nbdroot') !== false){
239                if (check_sanity($dir, $base_dir.$dir)){
240                       
241                        // Append Line:
242                        $append_line=$line;
243
244                        // Getting ip for next-server:
245                        $server=str_replace("'","",$_GET['next-server']);
246
247                        // Setting nbd_id
248                        $nbd_id=$base_dir.$dir;
249                       
250                        $append_line=str_replace("{server}",$server,$append_line);
251                        $append_line=str_replace("{nbd_id}",$nbd_id,$append_line);
252
253                        $string = file_get_contents("/etc/ltsp/images/".$dir.".json"); 
254                        $json=json_decode($string,true);
255                        if ($json["kernel_extra_params"]!="undefined") $append_line=$append_line . " " . $json["kernel_extra_params"];
256
257                        // Checking if exists lts.conf file for image
258                        if (is_file(trim("/var/lib/tftpboot/ltsp/$dir/lts.conf")))
259                            $mergelts=" MERGELTSCONF=true\n";
260                        else
261                            $mergelts=" MERGELTSCONF=false\n";
262                           
263                        $append_line=str_replace(PHP_EOL, '', $append_line);
264                        $append_line=str_replace("initrd=","initrd=/pxe-ltsp/$dir/",$append_line);
265                        $append_line=$append_line.$mergelts;
266
267                                               
268                        //Use the ipxe vars
269               
270                        // Getting Name for label
271                        $name=getName($dir); // Gets the name of $dir
272                        //echo "Setting $name\n";
273                       
274                        if ($candidate->is_empty()){
275                                $label_candidate="label $dir\n";
276                                $menu_candidate="menu label $name\n";
277                                $kernel_candidate="$kernel_line";
278                                $append_candidate="$append_line";
279                                $candidate->set_menu_entry($label_candidate, $menu_candidate,  $kernel_candidate, $append_candidate);
280                        } else {
281                                $label_candidate="label $dir\n";
282                                $menu_candidate="menu label $name\n";
283                                $kernel_candidate="$kernel_line";
284                                $append_candidate="$append_line";
285                                $candidate->set_menu_entry($label_candidate, $menu_candidate,  $kernel_candidate, $append_candidate);
286                        }
287                       
288                   }
289               
290              }
291             
292        } 
293       
294        if  (!($candidate->is_empty())) {
295                $candidate->print_entry();
296        }
297       
298       
299        }
300       
301
302}
303
304
305// "Return" MenuEntryListObject
306$MenuEntryListObject=$MenuEntryList;
307
308?>
309
Note: See TracBrowser for help on using the repository browser.