Location: PHPKode > projects > C.A.S.I.M.I.R. > casimir/vm.php
<?php

include_once('include/config.php');
include_once('include/topmenu.php');
include_once('classes/mysql.class.php');
include_once('classes/SSHControl.class.php');
include_once('include/use_template.php');

$page_title = 'Gestion d\'une machine virtuelle';

session_start();
if (isset($_SESSION['rights']) && isset($_GET['vm_id'])) {
    $DB = new MySQL($MYSQL_SERVER, $MYSQL_DATABASE, $MYSQL_USER, $MYSQL_PASSWORD);
    $vm_info = $DB->GetVMInfo($_GET['vm_id'], $EXTERNAL_LINKS);
    if ($vm_info == array())
        header("Location: index.php"); // The VM does not exists !
    if ($_SESSION['rights'] != 0) { //Then we have to check if the machine belongs to the user
        if ($vm_info['User_ID'] != $_SESSION['user_id']) {
            header("Location: index.php");  //Let's send him to the main page
        }
    }
}
else header("Location: index.php");  //user is not connected, let's send him to the main page

$locations = BuildTopMenu($page_title, $_SESSION['rights']);
$actions = array (  'Machine' => array (    'Supprimer' => '?action=delete&vm_id='.$_GET['vm_id'],
                                            'Renommer' => '?action=edit&vm_id='.$_GET['vm_id'],
                                            'Configurer' => '?action=config&vm_id='.$_GET['vm_id']),
                    'Mon compte' => array ('Déconnecter' => 'logout.php'));
if ($_SESSION['rights'] == 0)
    $actions['Machine'] = array_merge($actions['Machine'], array('Attribuer' => '?action=transfert&vm_id='.$_GET['vm_id']));
$mainframe = array();
$action=array();
switch ($vm_info['Status']) { //What actions can apply to the vm regarding to it's state
    case 'SavedState'   : $action = array('Démarrer et reprendre' => 'start_resume'); break;
    case 'Stopped'      : $action = array('Démarrer' => 'start',
        'Démarrer sur un cdrom' => 'bootd',
        'Démarrer en pause' => 'start_paused'); break;
    case 'Paused'       : $action = array('Reprendre' => 'cont',
        'Voir et contrôler' => 'see',
        'Arrêter brutalement' => 'quit'); break;
    case 'Running'      : $action = array('Voir et contrôler' => 'see',
        'Ejecter le CDROM' => 'eject',
        'Charger un CDROM' => 'change',
        'Sauvegarder l\'état et arrêter' => 'suspend',
        'Mettre en pause'  => 'pause',
        'Envoyer le signal d\'arrêt' => 'powerdown',
        'Arrêter brutalement' => 'quit',
        'Envoyer le signal "Reset"' => 'reset'); break;
}

if (!isset($_GET['action'])) {      // We should then display the page without doing any action
    $message = '<p>';
    foreach($action as $caption => $link) {
        $message .= '<a href=?vm_id='.$_GET['vm_id'].'&action='.$link.'>'.$caption."</a><br>\n";
    }
    $message .= '</p>';
} else {
   /** $good_actions = array();
    foreach ($action as $label => $item)
        array_push($good_actions, $item);
    if (!in_array($_GET['action'], $good_actions)) //Illegal action
        header("Location: index.php"); **/

    $server_info = $DB->GetServerInfo($vm_info['Serv_ID']);
    $SSH = new SSHControl($server_info['Serv_IP'], $server_info['SSH_Port'], $QEMU_IDENTITY);
    $VM = array_merge($vm_info, $server_info);
    switch ($_GET['action']) {
        case 'start':
            $SSH->StartVM($VM);
            $DB->ChangeVMStatus($VM, 'Running');
            $message = 'La machine a été démarrée';
            break;
        case 'quit':
            $SSH->SendQemuCommand($VM, 'quit');
            $DB->ChangeVMStatus($VM, 'Stopped');
            $message = 'La machine a été arrêtée';
            break;
        case 'see':
            $server_info = $DB->GetServerInfo($vm_info['Serv_ID']);
            $SSH = new SSHControl($server_info['Serv_IP'], $server_info['SSH_Port'], $QEMU_IDENTITY);
            $VM = array_merge($vm_info, $server_info);

            $vnc_port=5900+$VM['Suffix'];
            $SSH->OpenVNCPort($VM, $vnc_port);
            $message = '<p>
    <APPLET CODE="VncViewer.class" ARCHIVE="vnc/VncViewer.jar" WIDTH="800" HEIGHT="632">
      <PARAM NAME="PORT" VALUE="'.$vnc_port.'">
      <PARAM NAME="HOST" VALUE="'.$VM['Serv_IP'].'">
    </APPLET>
    </p>';
            break;
        case 'start_paused':
            $SSH->StartVM($VM, true);
            $DB->ChangeVMStatus($VM, 'Paused');
            $message = 'La machine a été démarrée';
            break;
        case 'start_resume':
            $SSH->StartVM($VM, true, true);
            $SSH->SendQemuCommand($VM, 'delvm vm');
            $DB->ChangeVMStatus($VM, 'Paused');
            $message = 'La machine a été démarrée <u>en pause</u>';
            break;
        case 'cont':
            $SSH->SendQemuCommand($VM, 'cont');
            $DB->ChangeVMStatus($VM, 'Running');
            $message = 'La machine n\'est plus en pause';
            break;
        case 'pause':
            $SSH->SendQemuCommand($VM, 'stop');
            $DB->ChangeVMStatus($VM, 'Paused');
            $message = 'La machine est en pause';
            break;
        case 'eject':
            $SSH->SendQemuCommand($VM, 'eject cdrom');
            $message = 'Le CDROM à été éjecté';
            break;
        case 'suspend':
            $SSH->SendQemuCommand($VM, 'savevm vm');
            $SSH->SendQemuCommand($VM, 'quit');
            $DB->ChangeVMStatus($VM, 'SavedState');
            $message = 'La machine a été suspendue, son état est sauvegardé sur le disque dur';
            break;
        case 'reset':
            $SSH->SendQemuCommand($VM, 'system_reset');
            $message = 'La machine a été redémarrée';
            break;
        case 'delete':
            if (isset($_GET['confirm'])) {
                $SSH->DeleteVM($VM);
                $DB->DeleteVM($VM);
                $message = 'La machine virtuelle à bien été supprimée.';
            } else {
                $message = '<p>
Êtes-vous bien sûr(e) de vouloir supprimer cette machine ?<br>
Cette suppression est <u>irréversible</u> et vous perdrez <u>définitivement</u> les données qu\'elle contient<br>
<br>
<a href="vm.php?action=delete&vm_id='.$_GET['vm_id'].'&confirm=1">Oui, je sais ce que je fais.</a><br>
<a href="vm.php?vm_id='.$_GET['vm_id'].'">Non, je préffère annuler cette demande.</a></p>';
            }
            break;
        case 'edit':
            if (isset($_POST['Mac_Name'])) {
                if (empty($_POST['Mac_Name'])) {
                    $message = 'Le nom ne doit pas être vide !';
                } else {
                    $DB->UpdateVMName($VM, $_POST['Mac_Name']);
                    $message = 'La machine virtuelle à bien été renommée.';
                }
            } else {
                $message = '<form action="vm.php?action=edit&vm_id='.$_GET['vm_id'].'" method="post" name="name">
<p>Choisissez un nouveau nom pour cette machine : <br>
<input name="Mac_Name" value=""> <br>
<input type="submit" value="Modifier">
</p></form>';
            }
            break;
        case 'transfert':
            if ($_SESSION['rights'] == 0) {
                if (isset($_POST['to'])) {
                    $DB->TransfertVM($VM, $_POST['to']);
                    $message = 'La machine virtuelle à été transférée à un autre utilisateur';
                } else {
                    $message = '
<form action="?action=transfert&vm_id='.$_GET['vm_id'].'" method="post" name="serv">
    <p> Nouveau propriétaire de la machine virtuelle : <br>
        <select name="to">';
                    $users = $DB->GetAllUsers();
                    foreach ($users as $user)
                        if ($user['User_ID'] != $VM['User_ID'])
                            $message .= '<option value ="'.$user['User_ID'].'">'.$user['FullName'].'</option>';
                    $message .= '</select>
    </p>
    <p>
        <input type="submit" value="Attribuer">
    </p>
</form>
';
                }
            } else {
                $message = 'Vous devez être administrateur pour pouvoir transférer une machine virtuelle.';
            }
            break;
        case 'config' :

            //Preparing data:
            $accel_modes = array(   array('name' => 'Standard', 'selected' => '', 'emulator' => 'qemu', 'accel' => ''),
                                    array('name' => 'Lent', 'selected' => '', 'emulator' => 'qemu', 'accel' => '-no-kqemu'),
                                    array('name' => 'Rapide', 'selected' => '', 'emulator' => 'qemu', 'accel' => '-kernel-kqemu'),
                                    array('name' => 'Matériel', 'selected' => '', 'emulator' => 'kvm', 'accel' => ''));
            foreach ($accel_modes as $modeNr => $mode)
                if (($mode['emulator'] == $vm_info['Emulator']) && ($mode['accel'] == $vm_info['Accel']))
                    $accel_modes[$modeNr]['selected'] = 'selected';


            if (isset($_POST['Accel'])) {   //Then the form was posted
                if (isset($_POST['Localtime']))
                    $localtime = 1;
                else
                    $localtime = 0;
                $DB->VMConfig($vm_info['Mac_ID'], $accel_modes[$_POST['Accel']]['emulator'], $accel_modes[$_POST['Accel']]['accel'], $localtime);
                $message = 'La machine virtuelle à été reconfigurée<br>
La nouvelle configuration sera active après un arrêt complet de la machine virtuelle.';
            } else {                        //Then no form was posted, we display it
                $message = '
<form action="?action=config&vm_id='.$_GET['vm_id'].'" method="post" name="conf">
    <p> Mode accélération : <br>
        <select name="Accel">';
                foreach ($accel_modes as $modeNr => $mode) {
                    $message .= '<option value="'.$modeNr.'" '.$mode['selected'].'>'.$mode['name'].'</option>';
                }
                $message .= '</select>
    </p>
    <p> 
        <input type="checkbox" name="Localtime" ';
    if ($vm_info['Localtime'])
        $message .= 'checked';
    $message .= '>Donner l\'heure locale à la machine (utile pour Windows)
    </p>
    <p>
        <input type="submit" value="Appliquer">
    </p>
</form>
';
            }
            break;
        case 'change':
            $cdroms = $SSH->ListDirectory($VM['CDs_Path']);
            if (isset($_POST['CDROM'])) {
                if (in_array($_POST['CDROM'], $cdroms)) {
                    $SSH->SendQemuCommand($VM, 'change cdrom '.$VM['CDs_Path'].'/'.$_POST['CDROM']);
                    $message = 'L\'image CD à bien été chargée.';
                } else {
                    $message = 'L\'image CD spécifiée n\'est pas valide';
                }
            } else {
                        $message = '
    <form action="?action=change&vm_id='.$_GET['vm_id'].'" method="post" name="cd">
    
    <p> Choisissez une image ISO : <br>
        <select name="CDROM">';
                        foreach ($cdroms as $cdrom)
                            $message .= '<option value ="'.$cdrom.'">'.$cdrom.'</option>';
                        $message .= '</select>
    </p>
    <p>
        <input type="submit" value="Insérer dans le lecteur">
    </p>
	</form>
            ';
            }
            break;
        case 'bootd':
            $cdroms = $SSH->ListDirectory($VM['CDs_Path']);
            if (isset($_POST['CDROM'])) {
                if (in_array($_POST['CDROM'], $cdroms)) {
                    $SSH->StartVM($VM, true, false, 'd');
                    $SSH->SendQemuCommand($VM, 'change cdrom '.$VM['CDs_Path'].'/'.$_POST['CDROM']);
                    $SSH->SendQemuCommand($VM, 'cont');
                    $DB->ChangeVMStatus($VM, 'Running');
                    $message = 'L\'image CD à bien été chargée, la machine virtuelle est démarrée.';
                } else {
                    $message = 'L\'image CD spécifiée n\'est pas valide';
                }
            } else {
                        $message = '
    <form action="?action=bootd&vm_id='.$_GET['vm_id'].'" method="post" name="cd">
    
    <p> Choisissez une image ISO sur laquelle démarrer : <br>
        <select name="CDROM">';
                        foreach ($cdroms as $cdrom)
                            $message .= '<option value ="'.$cdrom.'">'.$cdrom.'</option>';
                        $message .= '</select>
    </p>
    <p>
        <input type="submit" value="Insérer dans le lecteur">
    </p>
	</form>
            ';
            }
            break;
        default :
            $message = 'Cette commande n\'est pas reconnue';
            break;
    }
}
$mainframe[$vm_info['Mac_Name']] = array('Contrôle' => '<p>'.$message.'</p>');
BuildPage($page_title, $locations, $mainframe, $actions);
?>
Return current item: C.A.S.I.M.I.R.