Statistics
| Branch: | Tag: | Revision:

root / ui / templates / list.html @ 038383b1

History | View | Annotate | Download (10.5 kB)

1 42f67a2a Dimitris Moraitis
{% load i18n %}
2 42f67a2a Dimitris Moraitis
3 1c86af5b Christodoulos Psaltis
<div id="machinesview" class="list">
4 1c86af5b Christodoulos Psaltis
    <div id="spinner"></div>
5 b303ba05 Christodoulos Psaltis
    <div class="actions">
6 379a34cf Dimitris Moraitis
        <a id="action-start">Start</a>
7 379a34cf Dimitris Moraitis
        <a id="action-reboot">Reboot</a>
8 379a34cf Dimitris Moraitis
        <a id="action-shutdown">Shutdown</a>
9 b303ba05 Christodoulos Psaltis
        <br />
10 379a34cf Dimitris Moraitis
        <a id="action-destroy">Destroy</a>
11 b303ba05 Christodoulos Psaltis
        <br />
12 379a34cf Dimitris Moraitis
        <a id="action-details">Show Details</a>
13 379a34cf Dimitris Moraitis
        <a id="action-group">Add to group</a>
14 b303ba05 Christodoulos Psaltis
        <br />
15 379a34cf Dimitris Moraitis
        <a id="action-band">Out of band</a>
16 b303ba05 Christodoulos Psaltis
        <br />
17 379a34cf Dimitris Moraitis
        <a id="action-attach">Attach disk</a>
18 379a34cf Dimitris Moraitis
        <a id="action-detach">Detach disk</a>
19 b303ba05 Christodoulos Psaltis
        <br />
20 379a34cf Dimitris Moraitis
        <a id="action-connect">Connect to network</a>
21 379a34cf Dimitris Moraitis
        <a id="action-disconnect">Disconnect from net</a>
22 b303ba05 Christodoulos Psaltis
    </div>
23 008b3ae8 Christodoulos Psaltis
    <table class="list-machines" style="display: none">
24 1c86af5b Christodoulos Psaltis
        <thead> 
25 1c86af5b Christodoulos Psaltis
            <tr> 
26 1e03328c Christodoulos Psaltis
                <th id="selection" class="select-running">
27 1e03328c Christodoulos Psaltis
                    <input type="checkbox"/>
28 190e3256 Dimitris Moraitis
                    <div class="expand-icon"></div>          
29 164d6386 Christodoulos Psaltis
                </th>
30 7dda8900 Christodoulos Psaltis
                <th id="os">OS</th> 
31 7dda8900 Christodoulos Psaltis
                <th id="name">Name</th> 
32 7dda8900 Christodoulos Psaltis
                <th id="ip">IP</th> 
33 7dda8900 Christodoulos Psaltis
                <th id="group">Group</th>
34 7dda8900 Christodoulos Psaltis
                <th id="status">Status</th> 
35 4da3085a Dimitris Moraitis
            </tr>
36 4da3085a Dimitris Moraitis
        </thead> 
37 48ce8b68 Christodoulos Psaltis
        <tbody class="machines"></tbody>
38 1c86af5b Christodoulos Psaltis
    </table>
39 190e3256 Dimitris Moraitis
        <ul class="dropdown-selector" style="display: none">
40 190e3256 Dimitris Moraitis
                <li class="select-all" ><a href="#">all</a></li>
41 190e3256 Dimitris Moraitis
                <li class="select-none"><a href="#">none</a></li>
42 190e3256 Dimitris Moraitis
                <li class="select-group"><a href="#">group</a></li>
43 190e3256 Dimitris Moraitis
        </ul>  
44 b303ba05 Christodoulos Psaltis
</div>
45 c3b3043d Dimitris Moraitis
46 c3b3043d Dimitris Moraitis
<script>
47 990772be Dimitris Moraitis

48 35b8688f Christodoulos Psaltis
// select/deselect all from checkbox widget of table headers
49 35b8688f Christodoulos Psaltis
$("table thead tr th#selection :checkbox").live('change', function() {
50 35b8688f Christodoulos Psaltis
    if ( $(this).is(":checked") ) {
51 008b3ae8 Christodoulos Psaltis
        $(":checkbox").attr("checked", true);
52 35b8688f Christodoulos Psaltis
    }
53 35b8688f Christodoulos Psaltis
    else {
54 008b3ae8 Christodoulos Psaltis
        $(":checkbox").attr("checked", false);
55 35b8688f Christodoulos Psaltis
    }
56 4da3085a Dimitris Moraitis
        updateActions();
57 190e3256 Dimitris Moraitis
        return false;
58 35b8688f Christodoulos Psaltis
});
59 35b8688f Christodoulos Psaltis

60 190e3256 Dimitris Moraitis
// select all from drop down menu
61 190e3256 Dimitris Moraitis
$("ul.dropdown-selector li.select-all a").live('click', function() {
62 190e3256 Dimitris Moraitis
        $(":checkbox").attr("checked", true);
63 79b68e7c Christodoulos Psaltis
    $(".dropdown-selector").slideToggle('medium');
64 82bf6df0 Dimitris Moraitis
        updateActions();
65 190e3256 Dimitris Moraitis
        return false;        
66 1e03328c Christodoulos Psaltis
});
67 1e03328c Christodoulos Psaltis

68 190e3256 Dimitris Moraitis
// select none from drop down menu
69 190e3256 Dimitris Moraitis
$("ul.dropdown-selector li.select-none a").live('click', function() {
70 190e3256 Dimitris Moraitis
        $(":checkbox").attr("checked", false);
71 79b68e7c Christodoulos Psaltis
    $(".dropdown-selector").slideToggle('medium');
72 82bf6df0 Dimitris Moraitis
        updateActions();
73 190e3256 Dimitris Moraitis
        return false;        
74 164d6386 Christodoulos Psaltis
});
75 164d6386 Christodoulos Psaltis

76 190e3256 Dimitris Moraitis
// select group from drop down menu
77 190e3256 Dimitris Moraitis
$("ul.dropdown-selector li.select-group a").live('click', function() {
78 190e3256 Dimitris Moraitis
        $(":checkbox").attr("checked", true);
79 79b68e7c Christodoulos Psaltis
    $(".dropdown-selector").slideToggle('medium');
80 82bf6df0 Dimitris Moraitis
        updateActions();
81 190e3256 Dimitris Moraitis
        return false;
82 190e3256 Dimitris Moraitis
});
83 190e3256 Dimitris Moraitis

84 190e3256 Dimitris Moraitis
// menu toggle, running menu
85 190e3256 Dimitris Moraitis
$("table.list-machines thead tr th#selection .expand-icon").click( function (obj) {
86 190e3256 Dimitris Moraitis
        $(".dropdown-selector").slideToggle('medium');
87 164d6386 Christodoulos Psaltis
    return false;
88 164d6386 Christodoulos Psaltis
});
89 164d6386 Christodoulos Psaltis

90 bd96a56b Christodoulos Psaltis
// TODO: This should be populated with more rules for all available states
91 a9d8ed3a Christodoulos Psaltis
var actions = { 'reboot':                ['ACTIVE', 'REBOOT', 'multiple'],
92 a9d8ed3a Christodoulos Psaltis
                                'shutdown':                ['ACTIVE', 'REBOOT', 'multiple'],
93 a9d8ed3a Christodoulos Psaltis
                                'connect':                ['ACTIVE', ],
94 a9d8ed3a Christodoulos Psaltis
                                'disconnect':        ['ACTIVE', 'network'],
95 a9d8ed3a Christodoulos Psaltis
                                'band':                        ['ACTIVE', 'REBOOT'],
96 a9d8ed3a Christodoulos Psaltis
                                'details':                ['ACTIVE', 'REBOOT', 'STOPPED'],
97 a9d8ed3a Christodoulos Psaltis
                                'start':                 ['STOPPED', 'multiple'],
98 48ce8b68 Christodoulos Psaltis
                                'destroy':                ['ACTIVE', 'STOPPED', 'REBOOT', 'ERROR', 'multiple'],
99 a9d8ed3a Christodoulos Psaltis
                                'group':                ['ACTIVE', 'STOPPED', 'REBOOT','multiple'],
100 0604f74f Dimitris Moraitis
                           };
101 0604f74f Dimitris Moraitis

102 379a34cf Dimitris Moraitis
// on checkbox click, update the actions
103 bdbd43a1 Christodoulos Psaltis
$("tbody input[type='checkbox']").live('change', function() { 
104 bdbd43a1 Christodoulos Psaltis
    updateActions();
105 bdbd43a1 Christodoulos Psaltis
    pending_actions = [];
106 bdbd43a1 Christodoulos Psaltis
    $(".selected").removeClass('selected');
107 bdbd43a1 Christodoulos Psaltis
    update_confirmations(); 
108 bdbd43a1 Christodoulos Psaltis
});
109 4da3085a Dimitris Moraitis

110 df1257a5 Christodoulos Psaltis
$("div.confirm_multiple button").click(function() {
111 df1257a5 Christodoulos Psaltis
    $(".selected").removeClass('selected');
112 df1257a5 Christodoulos Psaltis
});
113 df1257a5 Christodoulos Psaltis

114 d7c4ab32 Dimitris Moraitis
// destroy action
115 ae0aea6d Dimitris Moraitis
$("a.enabled#action-destroy").live('click', function() {
116 217b2431 Dimitris Moraitis
        var checked = $("table.list-machines tbody input[type='checkbox']:checked");
117 bdbd43a1 Christodoulos Psaltis
    $(".selected").removeClass('selected');
118 bdbd43a1 Christodoulos Psaltis
    $(this).addClass('selected');
119 990772be Dimitris Moraitis
        pending_actions = []; // reset pending actions
120 217b2431 Dimitris Moraitis
        checked.each(function(i,c) {
121 48ce8b68 Christodoulos Psaltis
                serverID=c.id;
122 990772be Dimitris Moraitis
                serverName = $('#'+serverID+' span.name').text();
123 990772be Dimitris Moraitis
                pending_actions.push([destroy, serverID]);
124 217b2431 Dimitris Moraitis
        });
125 990772be Dimitris Moraitis
        update_confirmations();
126 217b2431 Dimitris Moraitis
        return false;
127 d7c4ab32 Dimitris Moraitis
});
128 d7c4ab32 Dimitris Moraitis

129 ae0aea6d Dimitris Moraitis
$("a.enabled#action-reboot").live('click', function() {
130 42f67a2a Dimitris Moraitis
        var checked = $("table.list-machines tbody input[type='checkbox']:checked");
131 bdbd43a1 Christodoulos Psaltis
    $(".selected").removeClass('selected');
132 bdbd43a1 Christodoulos Psaltis
    $(this).addClass('selected');
133 990772be Dimitris Moraitis
        pending_actions = []; // reset pending actions
134 217b2431 Dimitris Moraitis
        checked.each(function(i,c) {
135 48ce8b68 Christodoulos Psaltis
                serverID=c.id;
136 990772be Dimitris Moraitis
                serverName = $('#'+serverID+' span.name').text();
137 990772be Dimitris Moraitis
                pending_actions.push([reboot, serverID]);
138 217b2431 Dimitris Moraitis
        });
139 990772be Dimitris Moraitis
        update_confirmations();
140 217b2431 Dimitris Moraitis
        return false;
141 d7c4ab32 Dimitris Moraitis
});
142 d7c4ab32 Dimitris Moraitis

143 a37690bd Markos Gogoulos
$("a.enabled#action-start").live('click', function() {
144 42f67a2a Dimitris Moraitis
        var checked = $("table.list-machines tbody input[type='checkbox']:checked");
145 bdbd43a1 Christodoulos Psaltis
    $(".selected").removeClass('selected');
146 bdbd43a1 Christodoulos Psaltis
    $(this).addClass('selected');
147 990772be Dimitris Moraitis
        pending_actions = []; // reset pending actions
148 217b2431 Dimitris Moraitis
        checked.each(function(i,c) {
149 48ce8b68 Christodoulos Psaltis
                serverID=c.id;
150 990772be Dimitris Moraitis
                serverName = $('#'+serverID+' span.name').text();
151 990772be Dimitris Moraitis
                pending_actions.push([start, serverID]);
152 217b2431 Dimitris Moraitis
        });
153 990772be Dimitris Moraitis
        update_confirmations();
154 217b2431 Dimitris Moraitis
        return false;
155 a37690bd Markos Gogoulos
});
156 a37690bd Markos Gogoulos

157 a37690bd Markos Gogoulos
$("a.enabled#action-shutdown").live('click', function() {
158 42f67a2a Dimitris Moraitis
        var checked = $("table.list-machines tbody input[type='checkbox']:checked");
159 bdbd43a1 Christodoulos Psaltis
    $(".selected").removeClass('selected');
160 bdbd43a1 Christodoulos Psaltis
    $(this).addClass('selected');
161 990772be Dimitris Moraitis
        pending_actions = []; // reset pending actions
162 217b2431 Dimitris Moraitis
        checked.each(function(i,c) {
163 48ce8b68 Christodoulos Psaltis
                serverID=c.id;
164 990772be Dimitris Moraitis
                serverName = $('#'+serverID+' span.name').text();
165 990772be Dimitris Moraitis
                pending_actions.push([shutdown, serverID]);
166 217b2431 Dimitris Moraitis
        });
167 990772be Dimitris Moraitis
        update_confirmations();
168 217b2431 Dimitris Moraitis
        return false;
169 d7c4ab32 Dimitris Moraitis
});
170 d7c4ab32 Dimitris Moraitis

171 eae0a59a Dimitris Moraitis
function update_machines_view(data){
172 eae0a59a Dimitris Moraitis
    /* 
173 1a49199e Dimitris Moraitis
    Go through the servers in the input data. Update existing entries, add
174 eae0a59a Dimitris Moraitis
    new ones to the list
175 1a49199e Dimitris Moraitis
    */
176 1a49199e Dimitris Moraitis
        tableData = vmTable.fnGetData();
177 1a49199e Dimitris Moraitis
    $.each(data.servers, function(i,server){        
178 1a49199e Dimitris Moraitis
        current = -1;
179 c459a72f Christodoulos Psaltis
        // check server status to select the appropriate OS icon
180 c459a72f Christodoulos Psaltis
        osTag = image_tags[server.imageRef]
181 e2ccad35 Dimitris Moraitis
        var osIcon = osTag + ".png", imgStr, imgSrc;
182 c459a72f Christodoulos Psaltis

183 1a49199e Dimitris Moraitis
                // check if the server already exists in the datatable
184 1a49199e Dimitris Moraitis
                tableData.forEach(function(row,index){
185 1a49199e Dimitris Moraitis
                        
186 1a49199e Dimitris Moraitis
                        if (row[0].split(' ')[2].replace('id=','') == server.id){
187 1a49199e Dimitris Moraitis
                                current = index;
188 1a49199e Dimitris Moraitis
                        } 
189 1a49199e Dimitris Moraitis
                });
190 eae0a59a Dimitris Moraitis
        
191 1a49199e Dimitris Moraitis
        if (current != -1){ // if it's there, simply update the values
192 1a49199e Dimitris Moraitis
                        try {
193 1a49199e Dimitris Moraitis
                                console.info(server.name + ' from ' 
194 1a49199e Dimitris Moraitis
                                                        + tableData[current][5] + ' to ' + STATUS_MESSAGES[server.status]);
195 e2ccad35 Dimitris Moraitis
                        } catch(err) {}                
196 0e1531b4 Markos Gogoulos
                        if (server.status == "DELETED") {
197 1a49199e Dimitris Moraitis
                                vmTable.fnDeleteRow(current);        
198 e2ccad35 Dimitris Moraitis
                        } else { // server exists and should not be deleted                
199 c459a72f Christodoulos Psaltis
                // check server status to select the appropriate OS icon
200 c459a72f Christodoulos Psaltis
                if (['ERROR', 'STOPPED'].indexOf(server.status) >= 0) {
201 c459a72f Christodoulos Psaltis
                    osIcon = osTag + "-off.png";
202 c459a72f Christodoulos Psaltis
                }
203 e2ccad35 Dimitris Moraitis
                                // if the new state does not differ from the previous one
204 e2ccad35 Dimitris Moraitis
                                if (tableData[current][5].indexOf(STATUS_MESSAGES[server.status]) > -1){
205 e2ccad35 Dimitris Moraitis
                                        // do nothing
206 e2ccad35 Dimitris Moraitis
                                } else { // state has changed
207 e2ccad35 Dimitris Moraitis
                                        //$('#'+server.id).parent().parent().find('.list-logo').attr('src').indexOf('wave')>-1){
208 e2ccad35 Dimitris Moraitis
                                        
209 e2ccad35 Dimitris Moraitis
                                        imgSrc = "static/wave.gif";
210 e2ccad35 Dimitris Moraitis
                                        tableData[current][0] = "<input class="+server.status+" id="+server.id+" type=checkbox>";
211 e2ccad35 Dimitris Moraitis
                                        imgStr = "<img class=list-logo src=" + imgSrc + " title=" + osTag + " height=16 width=16 />";
212 e2ccad35 Dimitris Moraitis
                                        tableData[current][1] = "<span class=imagetag>" + osTag + "</span>" + imgStr;
213 e2ccad35 Dimitris Moraitis
                                        tableData[current][2] = "<a class=name><span class=name>" + server.name + "</span></a>";
214 e2ccad35 Dimitris Moraitis
                                        tableData[current][3] = "<a class=ip><span class=public>"+ server.addresses.public.ip.addr + "</span></a>";
215 e2ccad35 Dimitris Moraitis
                                        //tableData[current][4] = "group"; //TODO
216 e2ccad35 Dimitris Moraitis
                                        tableData[current][5] = "<span class=status>" + STATUS_MESSAGES[server.status] + "</span>";
217 e2ccad35 Dimitris Moraitis
                                        vmTable.fnUpdate(tableData[current],current);
218 e2ccad35 Dimitris Moraitis

219 e2ccad35 Dimitris Moraitis
                                        //try{console.info('vm ' + server.id + ' from ' + tableData[current][5] + ' to ' + STATUS_MESSAGES[server.status])} catch(err) {}                                                
220 e2ccad35 Dimitris Moraitis
                                        setTimeout("$('#"+server.id+"').parent().parent().find('.list-logo').attr('src','static/os_logos/" + osIcon+"')", 2000);                                        
221 6d0a36e5 Dimitris Moraitis
                                }
222 1a49199e Dimitris Moraitis
                        }
223 1a49199e Dimitris Moraitis
                        updateActions();
224 0e1531b4 Markos Gogoulos
        } else if (server.status != "DELETED") { // does not exist, we should create it
225 48ce8b68 Christodoulos Psaltis
            // check server status to select the appropriate OS icon
226 48ce8b68 Christodoulos Psaltis
            if (['ERROR', 'STOPPED'].indexOf(server.status) >= 0) {
227 48ce8b68 Christodoulos Psaltis
                osIcon = osTag + "-off.png";
228 eae0a59a Dimitris Moraitis
            }
229 48ce8b68 Christodoulos Psaltis
            // add new row to the table
230 48ce8b68 Christodoulos Psaltis
            vmTable.fnAddData([
231 48ce8b68 Christodoulos Psaltis
                "<input class=" + server.status + " id=" + server.id + " type=checkbox>",
232 48ce8b68 Christodoulos Psaltis
                "<span class=imagetag>" + osTag + "</span><img class=list-logo src=static/os_logos/" + osIcon +
233 48ce8b68 Christodoulos Psaltis
                    " title=" + osTag + " height=16 width=16>",
234 48ce8b68 Christodoulos Psaltis
                "<a class=name><span class=name>" + server.name + "</span></a>",
235 48ce8b68 Christodoulos Psaltis
                "<a class=ip><span class=public>"+ server.addresses.public.ip.addr + "</span></a>",
236 48ce8b68 Christodoulos Psaltis
                "group",
237 48ce8b68 Christodoulos Psaltis
                "<span class=status>" + STATUS_MESSAGES[server.status] + "</span>"
238 48ce8b68 Christodoulos Psaltis
            ]);
239 eae0a59a Dimitris Moraitis
        }
240 eae0a59a Dimitris Moraitis
    });
241 1a49199e Dimitris Moraitis
        updateActions();
242 48ce8b68 Christodoulos Psaltis
        $("#spinner").hide();        
243 48ce8b68 Christodoulos Psaltis
    // in case there are no data, leave the page empty
244 eae0a59a Dimitris Moraitis
    if ($("div.list table.list-machines tbody").length > 0) {
245 48ce8b68 Christodoulos Psaltis
        $("div.list div.dataTables_filter").show();
246 48ce8b68 Christodoulos Psaltis
        $("div.list div.dataTables_filter input").show();
247 eae0a59a Dimitris Moraitis
        $("div.list table.list-machines").show();
248 eae0a59a Dimitris Moraitis
        $("div.list div.actions").show();
249 eae0a59a Dimitris Moraitis
    }
250 ed4781b5 Dimitris Moraitis
        
251 ed4781b5 Dimitris Moraitis
        // set confirm box position
252 e2ccad35 Dimitris Moraitis
    if (window.innerHeight - 200 < $('#machinesview').height())
253 ed4781b5 Dimitris Moraitis
        $('.confirm_multiple').addClass('fixed');
254 ed4781b5 Dimitris Moraitis
    else
255 ed4781b5 Dimitris Moraitis
        $('.confirm_multiple').removeClass('fixed');
256 eae0a59a Dimitris Moraitis
}
257 eae0a59a Dimitris Moraitis

258 a1a31201 Dimitris Moraitis
function display_success(serverID) {
259 6d0a36e5 Dimitris Moraitis
        // do nothing
260 879748ec Markos Gogoulos
}
261 879748ec Markos Gogoulos

262 879748ec Markos Gogoulos
// indicate that the requested action was not completed
263 038383b1 Dimitris Moraitis
function display_failure(status, serverID, action, responseText) {
264 695e1b21 Dimitris Moraitis
        osIcon = $('#'+serverID).parent().parent().find('.list-logo');
265 695e1b21 Dimitris Moraitis
        osIcon.attr('src',osIcon.attr('os'));
266 038383b1 Dimitris Moraitis
    ajax_error(status, serverID, action, responseText);
267 a1a31201 Dimitris Moraitis
}
268 a1a31201 Dimitris Moraitis

269 48ce8b68 Christodoulos Psaltis
var vmTable = $("div.list table.list-machines").dataTable({
270 48ce8b68 Christodoulos Psaltis
    "bInfo": false,
271 48ce8b68 Christodoulos Psaltis
    "bRetrieve": true,
272 48ce8b68 Christodoulos Psaltis
    "bPaginate": false,
273 48ce8b68 Christodoulos Psaltis
    "bAutoWidth": false,
274 48ce8b68 Christodoulos Psaltis
    "bSort": true,    
275 48ce8b68 Christodoulos Psaltis
    "bStateSave": true,
276 48ce8b68 Christodoulos Psaltis
    "sScrollY": "270px",
277 48ce8b68 Christodoulos Psaltis
    "sScrollX": "515px",
278 48ce8b68 Christodoulos Psaltis
    "sScrollXInner": "500px",
279 48ce8b68 Christodoulos Psaltis
    "aoColumnDefs": [
280 48ce8b68 Christodoulos Psaltis
        { "bSortable": false, "aTargets": [ 0 ] }
281 48ce8b68 Christodoulos Psaltis
    ]
282 48ce8b68 Christodoulos Psaltis
});
283 48ce8b68 Christodoulos Psaltis

284 146b6003 Dimitris Moraitis
if (images.length == 0) {
285 146b6003 Dimitris Moraitis
    // populate image list
286 146b6003 Dimitris Moraitis
    update_images();
287 146b6003 Dimitris Moraitis
}
288 146b6003 Dimitris Moraitis
if (flavors.length == 0) {
289 146b6003 Dimitris Moraitis
    // configure flavors
290 146b6003 Dimitris Moraitis
    update_flavors(); 
291 146b6003 Dimitris Moraitis
}
292 c53d09e2 Christodoulos Psaltis
// set the label of the multiple buttons 
293 c53d09e2 Christodoulos Psaltis
$('div.confirm_multiple button.yes').text('Confirm');
294 c53d09e2 Christodoulos Psaltis
$('div.confirm_multiple button.no').text('Cancel');
295 82bf6df0 Dimitris Moraitis

296 82bf6df0 Dimitris Moraitis
// reposition multiple confirmation box on window resize
297 82bf6df0 Dimitris Moraitis
$(window).resize(function(){
298 82bf6df0 Dimitris Moraitis
    if (this.innerHeight - 200 < $('#machinesview').height())
299 82bf6df0 Dimitris Moraitis
        $('.confirm_multiple').addClass('fixed');
300 82bf6df0 Dimitris Moraitis
    else
301 82bf6df0 Dimitris Moraitis
        $('.confirm_multiple').removeClass('fixed');
302 82bf6df0 Dimitris Moraitis
});
303 82bf6df0 Dimitris Moraitis

304 c53d09e2 Christodoulos Psaltis
// start updating vm list
305 146b6003 Dimitris Moraitis
update_vms(UPDATE_INTERVAL);
306 42f67a2a Dimitris Moraitis
307 35b8688f Christodoulos Psaltis
</script>