Ravada.pm 177 KB
Newer Older
1
2
3
4
5
package Ravada;

use warnings;
use strict;

Francesc Guasch's avatar
Francesc Guasch committed
6
our $VERSION = '1.3.1';
Francesc Guasch's avatar
Francesc Guasch committed
7

8
use Carp qw(carp croak cluck);
9
use Data::Dumper;
10
use DBIx::Connector;
11
use File::Copy;
Francesc Guasch's avatar
Francesc Guasch committed
12
13
use Hash::Util qw(lock_hash unlock_hash);
use IPC::Run3 qw(run3);
14
use Mojo::JSON qw( encode_json decode_json );
15
use Moose;
Francesc Guasch's avatar
Francesc Guasch committed
16
use POSIX qw(WNOHANG);
17
use Proc::PID::File;
Francesc Guasch's avatar
Francesc Guasch committed
18
use Time::HiRes qw(gettimeofday tv_interval);
19
use YAML;
20
use MIME::Base64;
21
use Socket qw( inet_aton inet_ntoa );
22
use Image::Magick::Q16;
23

Francesc Guasch's avatar
Francesc Guasch committed
24
25
26
no warnings "experimental::signatures";
use feature qw(signatures);

Francesc Guasch's avatar
Francesc Guasch committed
27
use Ravada::Auth;
Francesc Guasch's avatar
Francesc Guasch committed
28
use Ravada::Booking;
29
use Ravada::Request;
Francesc Guasch's avatar
Francesc Guasch committed
30
use Ravada::Repository::ISO;
31
use Ravada::VM::Void;
32

Francesc Guasch's avatar
Francesc Guasch committed
33
our %VALID_VM;
Francesc Guasch's avatar
Francesc Guasch committed
34
our %ERROR_VM;
35
our $TIMEOUT_STALE_PROCESS;
Francesc Guasch's avatar
Francesc Guasch committed
36
37
38
39
40
41
42

eval {
    require Ravada::VM::KVM and do {
        Ravada::VM::KVM->import;
    };
    $VALID_VM{KVM} = 1;
};
Francesc Guasch's avatar
Francesc Guasch committed
43
44
45
46
47
48
49
50
51
$ERROR_VM{KVM} = $@;

eval {
    require Ravada::VM::Void and do {
        Ravada::VM::Void->import;
    };
    $VALID_VM{Void} = 1;
};
$ERROR_VM{Void} = $@;
Francesc Guasch's avatar
Francesc Guasch committed
52

53
54
55
no warnings "experimental::signatures";
use feature qw(signatures);

Francesc Guasch's avatar
Francesc Guasch committed
56
57
58
our %VALID_CONFIG = (
    vm => undef
    ,warn_error => undef
Francesc Guasch's avatar
Francesc Guasch committed
59
    ,db => {user => undef, password => undef,  hostname => undef, host => undef, db => undef}
Francesc Guasch's avatar
Francesc Guasch committed
60
61
62
63
64
65
    ,ldap => { admin_user => { dn => undef, password => undef }
        ,filter => undef
        ,base => undef
        ,auth => undef
        ,admin_group => undef
        ,ravada_posix_group => undef
Francesc Guasch's avatar
Francesc Guasch committed
66
67
        ,groups_base => undef
        ,field => undef
68
69
        ,server => undef
        ,port => undef
Francesc Guasch's avatar
Francesc Guasch committed
70
        ,size_limit => undef
Francesc Guasch's avatar
Francesc Guasch committed
71
    }
Francesc Guasch's avatar
Francesc Guasch committed
72
    ,log => undef
Francesc Guasch's avatar
Francesc Guasch committed
73
74
);

Francesc Guasch's avatar
Francesc Guasch committed
75
76
=head1 NAME

77
Ravada - Remote Virtual Desktop Manager
Francesc Guasch's avatar
Francesc Guasch committed
78
79
80
81
82
83
84
85
86

=head1 SYNOPSIS

  use Ravada;

  my $ravada = Ravada->new()

=cut

87
88

our $FILE_CONFIG = "/etc/ravada.conf";
89
$FILE_CONFIG = undef if ! -e $FILE_CONFIG;
90
91
92
93
94

###########################################################################

our $CONNECTOR;
our $CONFIG = {};
95
our $FORCE_DEBUG = 0;
96
our $DEBUG;
Francesc Guasch's avatar
Francesc Guasch committed
97
our $VERBOSE;
98
our $CAN_FORK = 1;
99
our $CAN_LXC = 0;
100
101

# Seconds to wait for other long process
102
our $SECONDS_WAIT_CHILDREN = 5;
103

104
105
our $DIR_SQL = "sql/mysql";
$DIR_SQL = "/usr/share/doc/ravada/sql/mysql" if ! -e $DIR_SQL;
106

107
108
109
our $USER_DAEMON;
our $USER_DAEMON_NAME = 'daemon';

110
111
112
our $FIRST_TIME_RUN = 1;
$FIRST_TIME_RUN = 0 if $0 =~ /\.t$/;

113
has 'connector' => (
114
115
116
117
118
119
        is => 'rw'
);

has 'config' => (
    is => 'ro'
    ,isa => 'Str'
120
121
);

122
123
124
125
126
127
has 'warn_error' => (
    is => 'rw'
    ,isa => 'Bool'
    ,default => sub { 1 }
);

Francesc Guasch's avatar
Francesc Guasch committed
128
129
130
131
132
133
134
=head2 BUILD

Internal constructor

=cut


135
136
sub BUILD {
    my $self = shift;
137
    if ($self->config()) {
138
        _init_config($self->config);
139
    } else {
140
        _init_config($FILE_CONFIG) if $FILE_CONFIG && -e $FILE_CONFIG;
141
    }
142

Francesc Guasch's avatar
Francesc Guasch committed
143
    if ( $self->connector ) {
joansp's avatar
joansp committed
144
        $CONNECTOR = $self->connector
Francesc Guasch's avatar
Francesc Guasch committed
145
146
    } else {
        $CONNECTOR = $self->_connect_dbh();
147
        $self->connector($CONNECTOR);
Francesc Guasch's avatar
Francesc Guasch committed
148
    }
Francesc Guasch's avatar
Francesc Guasch committed
149
    Ravada::Auth::init($CONFIG);
150

151
152
}

153
154
155
156
157
158
159
sub _set_first_time_run($self) {
    my $sth = $CONNECTOR->dbh->table_info('%',undef,'domains','TABLE');
    my $info = $sth->fetchrow_hashref();
    $sth->finish;
    if  ( keys %$info ) {
        $FIRST_TIME_RUN = 0;
    } else {
160
        print "Installing " if $0 !~ /\.t$/;
161
162
163
    }
}

164
sub _install($self) {
165
    my $pid = Proc::PID::File->new(name => "ravada_install");
166
    $pid->file({dir => "/run/user/$>"}) if $>;
167
168
169
170
171
172
173
    if ( $pid->alive ) {
        print "Waiting for install process to finish" if $ENV{TERM};
        while ( $pid->alive ) {
            sleep 1;
            print "." if $ENV{TERM};
        }
        print "\n" if $ENV{TERM};
174
        return;
175
176
    }
    $pid->touch;
177
178
    $self->_set_first_time_run();

179
    $self->_create_tables();
180
    $self->_sql_create_tables();
181
    $self->_upgrade_tables();
182
    $self->_upgrade_timestamps();
183
    $self->_update_data();
184
    $self->_init_user_daemon();
185
    $self->_sql_insert_defaults();
186
187
188

    $self->_do_create_constraints();

189
    $pid->release();
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229

    print "\n" if $FIRST_TIME_RUN;

}

sub _do_create_constraints($self) {
    return if !$self->{_constraints};

    if ($CAN_FORK) {

        my $pid = fork();
        die "Error: I cannot fork" if !defined $pid;
        if ($pid) {
            $self->_add_pid($pid);
            return;
        }
    }

    my $pid_file = Proc::PID::File->new(name => "ravada_constraint");
    $pid_file->file({dir => "/run/user/$>"}) if $>;
    if ( $pid_file->alive ) {
        exit if $CAN_FORK;
        return;
    }
    $pid_file->touch;

    my $dbh = $CONNECTOR->dbh;
    for my $constraint (@{$self->{_constraints}}) {
        my ($name) = $constraint =~ /CONSTRAINT (\w+)\s/;

        warn "INFO: creating constraint $name \n"
        if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
        print "+" if $FIRST_TIME_RUN && !$CAN_FORK;

        $self->_clean_db_leftovers();

        my $sth = $dbh->do($constraint);
    }
    $pid_file->release;
    exit if $CAN_FORK;
230
231
}

232
233
234
235
236
237
sub _init_user_daemon {
    my $self = shift;
    return if $USER_DAEMON;

    $USER_DAEMON = Ravada::Auth::SQL->new(name => $USER_DAEMON_NAME);
    if (!$USER_DAEMON->id) {
Francesc Guasch's avatar
Francesc Guasch committed
238
239
240
241
242
243
244
245
        for (1 .. 120 ) {
            my @list = $self->_list_pids();
            last if !@list;
            sleep 1 if @list;
            $self->_wait_pids();
        }
        $USER_DAEMON = Ravada::Auth::SQL->new(name => $USER_DAEMON_NAME);
        return if $USER_DAEMON->id;
246
247
248
249
250
251
252
253
        $USER_DAEMON = Ravada::Auth::SQL::add_user(
            name => $USER_DAEMON_NAME,
            is_admin => 1
        );
        $USER_DAEMON = Ravada::Auth::SQL->new(name => $USER_DAEMON_NAME);
    }

}
254
255
sub _update_user_grants {
    my $self = shift;
Francesc Guasch's avatar
Francesc Guasch committed
256
    $self->_init_user_daemon();
257
    my $sth = $CONNECTOR->dbh->prepare("SELECT id FROM users WHERE is_temporary=0");
258
259
    my $id;
    $sth->execute;
Francesc Guasch's avatar
Francesc Guasch committed
260
    $sth->bind_columns(\$id);
261
    while ($sth->fetch) {
262
        my $user = Ravada::Auth::SQL->search_by_id($id) or confess "Unknown user id = $id";
Francesc Guasch's avatar
Francesc Guasch committed
263
264
        next if $user->name() eq $USER_DAEMON_NAME;

265
266
267
268
269
270
271
        my %grants = $user->grants();

        for my $key (keys %grants) {
            delete $grants{$key} if !defined $grants{$key};
        }
        next if keys %grants;

272
273
        $USER_DAEMON->grant_user_permissions($user);
        $USER_DAEMON->grant_admin_permissions($user)    if $user->is_admin;
274
275
276
277
    }
    $sth->finish;
}

278
279
280
281
282
sub _update_isos {
    my $self = shift;
    my $table = 'iso_images';
    my $field = 'name';
    my %data = (
283
284
285
	    androidx86 => {
                    name => 'Android 8.1 x86'
            ,description => 'Android-x86 64 bits. Requires an user provided ISO image.'
Francesc Guasch's avatar
Francesc Guasch committed
286
                   ,arch => 'x86_64'
287
288
289
290
                    ,xml => 'android-amd64.xml'
             ,xml_volume => 'android-volume.xml'
	     ,min_disk_size => '4'
        },
Francesc Guasch's avatar
Francesc Guasch committed
291
292
293
        arch_1909 => {
                    name => 'Arch Linux 19.09'
            ,description => 'Arch Linux 19.09.01 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
294
                   ,arch => 'x86_64'
Francesc Guasch's avatar
Francesc Guasch committed
295
296
                    ,xml => 'bionic-amd64.xml'
             ,xml_volume => 'bionic64-volume.xml'
297
298
299
300
301
302
303
304
                    ,url => 'https://archive.archlinux.org/iso/2019.09.01/'
                    ,file_re => 'archlinux-2019.09.01-x86_64.iso'
                    ,md5_url => ''
                    ,md5 => '1d6bdf5cbc6ca98c31f02d23e418dd96'
        },
	mate_focal_fossa => {
                    name => 'Ubuntu Mate Focal Fossa 64 bits'
            ,description => 'Ubuntu Mate 20.04 (Focal Fossa) 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
305
                   ,arch => 'x86_64'
306
307
                    ,xml => 'focal_fossa-amd64.xml'
             ,xml_volume => 'focal_fossa64-volume.xml'
308
309
                    ,url => 'http://cdimage.ubuntu.com/ubuntu-mate/releases/20.04.*/release/ubuntu-mate-20.04.*-desktop-amd64.iso'
                ,sha256_url => '$url/SHA256SUMS'
Francesc Guasch's avatar
Francesc Guasch committed
310
            ,options => { machine => 'pc-q35', bios => 'UEFI' }
Francesc Guasch's avatar
Francesc Guasch committed
311
        },
Joel Alarcón's avatar
Joel Alarcón committed
312
313
314
        mate_bionic => {
                    name => 'Ubuntu Mate Bionic 64 bits'
            ,description => 'Ubuntu Mate 18.04 (Bionic Beaver) 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
315
                   ,arch => 'x86_64'
Joel Alarcón's avatar
Joel Alarcón committed
316
317
318
                    ,xml => 'bionic-amd64.xml'
             ,xml_volume => 'bionic64-volume.xml'
                    ,url => 'http://cdimage.ubuntu.com/ubuntu-mate/releases/18.04.*/release/ubuntu-mate-18.04.*-desktop-amd64.iso'
Paula Paez's avatar
Paula Paez committed
319
                ,sha256_url => '$url/SHA256SUMS'
Joel Alarcón's avatar
Joel Alarcón committed
320
321
322
323
324
325
326
327
        },
        mate_bionic_i386 => {
                    name => 'Ubuntu Mate Bionic 32 bits'
            ,description => 'Ubuntu Mate 18.04 (Bionic Beaver) 32 bits'
                   ,arch => 'i386'
                    ,xml => 'bionic-i386.xml'
             ,xml_volume => 'bionic32-volume.xml'
                    ,url => 'http://cdimage.ubuntu.com/ubuntu-mate/releases/18.04.*/release/ubuntu-mate-18.04.*-desktop-i386.iso'
328
                ,sha256_url => '$url/SHA256SUMS'
Joel Alarcón's avatar
Joel Alarcón committed
329
        },
frankiejol's avatar
frankiejol committed
330
331
332
        ubuntu_xenial => {
                    name => 'Ubuntu Xenial Xerus 64 bits'
            ,description => 'Ubuntu 16.04 LTS Xenial Xerus 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
333
                   ,arch => 'x86_64'
frankiejol's avatar
frankiejol committed
334
335
336
337
338
339
340
                    ,xml => 'xenial64-amd64.xml'
             ,xml_volume => 'xenial64-volume.xml'
                    ,url => 'http://releases.ubuntu.com/16.04/ubuntu-16.04.*-desktop-amd64.iso'
                ,sha256_url => '$url/SHA256SUMS'
                ,min_disk_size => '10'
        },

fv3rdugo's avatar
fv3rdugo committed
341
        mate_xenial => {
Fernando Verdugo's avatar
Fernando Verdugo committed
342
                    name => 'Ubuntu Mate Xenial'
fv3rdugo's avatar
fv3rdugo committed
343
            ,description => 'Ubuntu Mate 16.04.3 (Xenial) 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
344
                   ,arch => 'x86_64'
fv3rdugo's avatar
fv3rdugo committed
345
346
347
                    ,xml => 'yakkety64-amd64.xml'
             ,xml_volume => 'yakkety64-volume.xml'
                    ,url => 'http://cdimage.ubuntu.com/ubuntu-mate/releases/16.04.*/release/ubuntu-mate-16.04.*-desktop-amd64.iso'
348
                ,sha256_url => '$url/SHA256SUMS'
349
                ,min_disk_size => '10'
fv3rdugo's avatar
fv3rdugo committed
350
        },
351
352
353
	,focal_fossa=> {
                    name => 'Ubuntu Focal Fossa'
            ,description => 'Ubuntu 20.04 Focal Fossa 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
354
                   ,arch => 'x86_64'
355
356
                    ,xml => 'focal_fossa-amd64.xml'
             ,xml_volume => 'focal_fossa64-volume.xml'
357
                    ,url => 'http://releases.ubuntu.com/20.04/'
358
                ,file_re => '^ubuntu-20.04.*-desktop-amd64.iso'
Francesc Guasch's avatar
Francesc Guasch committed
359
                ,sha256_url => '$url/SHA256SUMS'
360
          ,min_disk_size => '9'
Francesc Guasch's avatar
Francesc Guasch committed
361
362
            ,options => { machine => 'pc-q35', bios => 'UEFI' }
                   ,arch => 'x86_64'
363
364
        }

Joel Alarcón's avatar
Joel Alarcón committed
365
366
367
        ,bionic=> {
                    name => 'Ubuntu Bionic Beaver'
            ,description => 'Ubuntu 18.04 Bionic Beaver 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
368
                   ,arch => 'x86_64'
Joel Alarcón's avatar
Joel Alarcón committed
369
370
371
                    ,xml => 'bionic-amd64.xml'
             ,xml_volume => 'bionic64-volume.xml'
                    ,url => 'http://releases.ubuntu.com/18.04/'
372
                ,file_re => '^ubuntu-18.04.*desktop-amd64.iso'
373
                ,sha256_url => '$url/SHA256SUMS'
Joel Alarcón's avatar
Joel Alarcón committed
374
          ,min_disk_size => '9'
Francesc Guasch's avatar
Francesc Guasch committed
375
            ,arch => 'x86_64'
Joel Alarcón's avatar
Joel Alarcón committed
376
377
        }

Francesc Guasch's avatar
Francesc Guasch committed
378
379
380
        ,serena64 => {
            name => 'Mint 18.1 Mate 64 bits'
    ,description => 'Mint Serena 18.1 with Mate Desktop based on Ubuntu Xenial 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
381
           ,arch => 'x86_64'
Francesc Guasch's avatar
Francesc Guasch committed
382
383
            ,xml => 'xenial64-amd64.xml'
     ,xml_volume => 'xenial64-volume.xml'
Francesc Guasch's avatar
Francesc Guasch committed
384
385
            ,url => 'https://mirrors.edge.kernel.org/linuxmint/stable/18.3'
        ,file_re => 'linuxmint-18.3-mate-64bit.iso'
Francesc Guasch's avatar
Francesc Guasch committed
386
387
        ,md5_url => ''
            ,md5 => 'c5cf5c5d568e2dfeaf705cfa82996d93'
388
            ,min_disk_size => '10'
Francesc Guasch's avatar
Francesc Guasch committed
389
390

        }
391
392
393
        ,mint20_64 => {
            name => 'Mint 20 Mate 64 bits'
    ,description => 'Mint Ulyana 20 with Mate Desktop 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
394
           ,arch => 'x86_64'
Joel Alarcón's avatar
Joel Alarcón committed
395
396
            ,xml => 'xenial64-amd64.xml'
     ,xml_volume => 'xenial64-volume.xml'
Francesc Guasch's avatar
Francesc Guasch committed
397
398
            ,url => 'https://mirrors.edge.kernel.org/linuxmint/stable/20.2'
        ,file_re => 'linuxmint-20.2-mate-64bit.iso'
399
        ,sha256_url => '$url/sha256sum.txt'
Joel Alarcón's avatar
Joel Alarcón committed
400
401
402
403
404
            ,min_disk_size => '15'
        }
        ,alpine381_64 => {
            name => 'Alpine 3.8 64 bits'
    ,description => 'Alpine Linux 3.8 64 bits ( Minimal Linux Distribution )'
Francesc Guasch's avatar
Francesc Guasch committed
405
           ,arch => 'x86_64'
Joel Alarcón's avatar
Joel Alarcón committed
406
407
408
409
410
            ,xml => 'alpine-amd64.xml'
     ,xml_volume => 'alpine381_64-volume.xml'
            ,url => 'http://dl-cdn.alpinelinux.org/alpine/v3.8/releases/x86_64/'
        ,file_re => 'alpine-standard-3.8.1-x86_64.iso'
        ,sha256_url => 'http://dl-cdn.alpinelinux.org/alpine/v3.8/releases/x86_64/alpine-standard-3.8.1-x86_64.iso.sha256'
Francesc Guasch's avatar
Francesc Guasch committed
411
412
            ,min_disk_size => '2'
            ,options => { machine => 'pc-q35', bios => 'UEFI' }
Joel Alarcón's avatar
Joel Alarcón committed
413
414
415
416
        }
        ,alpine381_32 => {
            name => 'Alpine 3.8 32 bits'
    ,description => 'Alpine Linux 3.8 32 bits ( Minimal Linux Distribution )'
Francesc Guasch's avatar
Francesc Guasch committed
417
           ,arch => 'i686'
Joel Alarcón's avatar
Joel Alarcón committed
418
419
420
            ,xml => 'alpine-i386.xml'
     ,xml_volume => 'alpine381_32-volume.xml'
            ,url => 'http://dl-cdn.alpinelinux.org/alpine/v3.8/releases/x86/'
Francesc Guasch's avatar
Francesc Guasch committed
421
            ,options => { machine => 'pc-i440fx' }
Joel Alarcón's avatar
Joel Alarcón committed
422
423
424
425
        ,file_re => 'alpine-standard-3.8.1-x86.iso'
        ,sha256_url => 'http://dl-cdn.alpinelinux.org/alpine/v3.8/releases/x86/alpine-standard-3.8.1-x86.iso.sha256'
            ,min_disk_size => '1'
        }
426
427
428
        ,fedora_28 => {
            name => 'Fedora 28'
            ,description => 'RedHat Fedora 28 Workstation 64 bits'
429
            ,url => 'https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/28/Workstation/x86_64/iso/Fedora-Workstation-netinst-x86_64-28-.*\.iso'
Francesc Guasch's avatar
Francesc Guasch committed
430
            ,arch => 'x86_64'
Francesc Guasch's avatar
Francesc Guasch committed
431
432
            ,xml => 'xenial64-amd64.xml'
            ,xml_volume => 'xenial64-volume.xml'
433
            ,sha256_url => '$url/Fedora-Workstation-28-.*-x86_64-CHECKSUM'
434
            ,min_disk_size => '10'
435
436
437
438
        }
	      ,kubuntu_64_focal_fossa => {
            name => 'Kubuntu Focal Fossa 64 bits'
            ,description => 'Kubuntu 20.04 Focal Fossa 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
439
            ,arch => 'x86_64'
440
441
            ,xml => 'focal_fossa-amd64.xml'
            ,xml_volume => 'focal_fossa64-volume.xml'
442
443
444
            ,sha256_url => '$url/SHA256SUMS'
            ,url => 'http://cdimage.ubuntu.com/kubuntu/releases/20.04.*/release/'
            ,file_re => 'kubuntu-20.04.*-desktop-amd64.iso'
445
            ,rename_file => 'kubuntu_focal_fossa_64.iso'
Francesc Guasch's avatar
Francesc Guasch committed
446
            ,options => { machine => 'pc-q35', bios => 'UEFI' }
Francesc Guasch's avatar
Francesc Guasch committed
447
        }
Joel Alarcón's avatar
Joel Alarcón committed
448
449
450
        ,kubuntu_64 => {
            name => 'Kubuntu Bionic Beaver 64 bits'
            ,description => 'Kubuntu 18.04 Bionic Beaver 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
451
            ,arch => 'x86_64'
Joel Alarcón's avatar
Joel Alarcón committed
452
453
            ,xml => 'bionic-amd64.xml'
            ,xml_volume => 'bionic64-volume.xml'
Paula Paez's avatar
Paula Paez committed
454
            ,sha256_url => '$url/SHA256SUMS'
Joel Alarcón's avatar
Joel Alarcón committed
455
            ,url => 'http://cdimage.ubuntu.com/kubuntu/releases/18.04/release/'
456
            ,file_re => 'kubuntu-18.04.\d+-desktop-amd64.iso'
Joel Alarcón's avatar
Joel Alarcón committed
457
458
459
460
461
462
463
464
            ,rename_file => 'kubuntu_bionic_64.iso'
        }
        ,kubuntu_32 => {
            name => 'Kubuntu Bionic Beaver 32 bits'
            ,description => 'Kubuntu 18.04 Bionic Beaver 32 bits'
            ,arch => 'i386'
            ,xml => 'bionic-i386.xml'
            ,xml_volume => 'bionic32-volume.xml'
Paula Paez's avatar
Paula Paez committed
465
            ,sha256_url => '$url/SHA256SUMS'
Joel Alarcón's avatar
Joel Alarcón committed
466
            ,url => 'http://cdimage.ubuntu.com/kubuntu/releases/18.04/release/'
467
            ,file_re => 'kubuntu-18.04.\d+-desktop-i386.iso'
Joel Alarcón's avatar
Joel Alarcón committed
468
469
            ,rename_file => 'kubuntu_bionic_32.iso'
        }
470
471
472
        ,suse_15 => {
            name => "openSUSE Leap 15"
            ,description => "openSUSE Leap 15 64 bits"
Francesc Guasch's avatar
Francesc Guasch committed
473
            ,arch => 'x86_64'
474
475
476
            ,xml => 'bionic-amd64.xml'
            ,xml_volume => 'bionic64-volume.xml'
            ,url => 'https://download.opensuse.org/distribution/leap/15.0/iso/'
477
            ,sha256_url => '$url/openSUSE-Leap-15.\d+-NET-x86_64.iso.sha256'
478
479
480
            ,file_re => 'openSUSE-Leap-15.\d+-NET-x86_64.iso'

        }
Joel Alarcón's avatar
Joel Alarcón committed
481
482
483
        ,xubuntu_beaver_64 => {
            name => 'Xubuntu Bionic Beaver 64 bits'
            ,description => 'Xubuntu 18.04 Bionic Beaver 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
484
            ,arch => 'x86_64'
Joel Alarcón's avatar
Joel Alarcón committed
485
486
            ,xml => 'bionic-amd64.xml'
            ,xml_volume => 'bionic64-volume.xml'
487
            ,sha256_url => '$url/../SHA256SUMS'
Joel Alarcón's avatar
Joel Alarcón committed
488
489
490
491
492
493
494
            ,url => 'http://archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/current/images/netboot/'
            ,file_re => 'mini.iso'
            ,rename_file => 'xubuntu_bionic_64.iso'
        }
        ,xubuntu_beaver_32 => {
            name => 'Xubuntu Bionic Beaver 32 bits'
            ,description => 'Xubuntu 18.04 Bionic Beaver 32 bits'
Francesc Guasch's avatar
Francesc Guasch committed
495
            ,arch => 'i386'
Joel Alarcón's avatar
Joel Alarcón committed
496
497
498
499
500
501
502
            ,xml => 'bionic-i386.xml'
            ,xml_volume => 'bionic32-volume.xml'
            ,md5_url => '$url/../MD5SUMS'
            ,url => 'http://archive.ubuntu.com/ubuntu/dists/bionic/main/installer-i386/current/images/netboot/'
            ,file_re => 'mini.iso'
            ,rename_file => 'xubuntu_bionic_32.iso'
        }
Francesc Guasch's avatar
Francesc Guasch committed
503
504
        ,xubuntu_xenial => {
            name => 'Xubuntu Xenial Xerus'
505
            ,description => 'Xubuntu 16.04 Xenial Xerus 64 bits (LTS)'
Francesc Guasch's avatar
Francesc Guasch committed
506
507
508
509
            ,url => 'http://archive.ubuntu.com/ubuntu/dists/xenial/main/installer-amd64/current/images/netboot/mini.iso'
           ,xml => 'yakkety64-amd64.xml'
            ,xml_volume => 'yakkety64-volume.xml'
            ,md5 => 'fe495d34188a9568c8d166efc5898d22'
510
            ,rename_file => 'xubuntu_xenial_mini.iso'
511
            ,min_disk_size => '10'
Francesc Guasch's avatar
Francesc Guasch committed
512
        }
513
	,lubuntu_bionic_64 => {
Joel Alarcón's avatar
Joel Alarcón committed
514
515
516
             name => 'Lubuntu Bionic Beaver 64 bits'
             ,description => 'Lubuntu 18.04 Bionic Beaver 64 bits'
             ,url => 'http://cdimage.ubuntu.com/lubuntu/releases/18.04.*/release/lubuntu-18.04.*-desktop-amd64.iso'
517
             ,sha256_url => '$url/SHA256SUMS'
Joel Alarcón's avatar
Joel Alarcón committed
518
519
520
521
522
523
524
525
             ,xml => 'bionic-amd64.xml'
             ,xml_volume => 'bionic64-volume.xml'
         }
         ,lubuntu_bionic_32 => {
             name => 'Lubuntu Bionic Beaver 32 bits'
             ,description => 'Lubuntu 18.04 Bionic Beaver 32 bits'
             ,arch => 'i386'
             ,url => 'http://cdimage.ubuntu.com/lubuntu/releases/18.04.*/release/lubuntu-18.04.*-desktop-i386.iso'
526
             ,sha256_url => '$url/SHA256SUMS'
Joel Alarcón's avatar
Joel Alarcón committed
527
528
529
             ,xml => 'bionic-i386.xml'
             ,xml_volume => 'bionic32-volume.xml'
        }
530
531
532
        ,lubuntu_xenial => {
            name => 'Lubuntu Xenial Xerus'
            ,description => 'Xubuntu 16.04 Xenial Xerus 64 bits (LTS)'
533
534
            ,url => 'http://cdimage.ubuntu.com/lubuntu/releases/16.04.*/release/'
            ,file_re => 'lubuntu-16.04.*-desktop-amd64.iso'
frankiejol's avatar
frankiejol committed
535
            ,sha256_url => '$url/SHA256SUMS'
536
537
            ,xml => 'yakkety64-amd64.xml'
            ,xml_volume => 'yakkety64-volume.xml'
538
            ,min_disk_size => '10'
539
        }
540
541
542
543
        ,debian_jessie_32 => {
            name =>'Debian Jessie 32 bits'
            ,description => 'Debian 8 Jessie 32 bits'
            ,url => 'http://cdimage.debian.org/cdimage/archive/^8\..*/i386/iso-cd/'
544
            ,file_re => 'debian-8.[\d\.]+-i386-xfce-CD-1.iso'
545
            ,md5_url => '$url/MD5SUMS'
546
            ,xml => 'jessie-i386.xml'
547
            ,xml_volume => 'jessie-volume.xml'
548
            ,min_disk_size => '10'
549
550
551
552
553
554
555
556
557
        }
        ,debian_jessie_64 => {
            name =>'Debian Jessie 64 bits'
            ,description => 'Debian 8 Jessie 64 bits'
            ,url => 'http://cdimage.debian.org/cdimage/archive/^8\..*/amd64/iso-cd/'
            ,file_re => 'debian-8.[\d\.]+-amd64-xfce-CD-1.iso'
            ,md5_url => '$url/MD5SUMS'
            ,xml => 'jessie-amd64.xml'
            ,xml_volume => 'jessie-volume.xml'
558
            ,min_disk_size => '10'
Francesc Guasch's avatar
Francesc Guasch committed
559
            ,arch => 'x86_64'
560
        }
561
562
563
       ,debian_stretch_32 => {
            name =>'Debian Stretch 32 bits'
            ,description => 'Debian 9 Stretch 32 bits (XFCE desktop)'
Francesc Guasch's avatar
Francesc Guasch committed
564
            ,url => 'https://cdimage.debian.org/cdimage/archive/^9\..*\d$/i386/iso-cd/'
565
566
567
568
569
570
571
            ,file_re => 'debian-9.[\d\.]+-i386-xfce-CD-1.iso'
            ,md5_url => '$url/MD5SUMS'
            ,xml => 'jessie-i386.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,min_disk_size => '10'
        }
        ,debian_stretch_64 => {
572
            name =>'Debian Stretch 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
573
            ,description => 'Debian 9 Stretch 64 bits (XFCE desktop)'
574
            ,url => 'https://cdimage.debian.org/cdimage/archive/^9\..*/amd64/iso-cd/'
575
            ,file_re => 'debian-9.[\d\.]+-amd64-xfce-CD-1.iso'
576
            ,md5_url => '$url/MD5SUMS'
577
578
            ,xml => 'jessie-amd64.xml'
            ,xml_volume => 'jessie-volume.xml'
579
            ,min_disk_size => '10'
Francesc Guasch's avatar
Francesc Guasch committed
580
            ,arch => 'x86_64'
581
        }
582
583
584
        ,debian_buster_64=> {
            name =>'Debian Buster 64 bits'
            ,description => 'Debian 10 Buster 64 bits (XFCE desktop)'
585
            ,url => 'https://cdimage.debian.org/cdimage/archive/^10\..*\d$/amd64/iso-cd/'
586
587
588
589
590
            ,file_re => 'debian-10.[\d\.]+-amd64-xfce-CD-1.iso'
            ,md5_url => '$url/MD5SUMS'
            ,xml => 'jessie-amd64.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,min_disk_size => '10'
Francesc Guasch's avatar
Francesc Guasch committed
591
            ,arch => 'x86_64'
592
593
594
595
        }
        ,debian_buster_32=> {
            name =>'Debian Buster 32 bits'
            ,description => 'Debian 10 Buster 32 bits (XFCE desktop)'
596
            ,url => 'https://cdimage.debian.org/cdimage/archive/^10\..*\d$/i386/iso-cd/'
597
            ,file_re => 'debian-10.[\d\.]+-i386-(netinst|xfce-CD-1).iso'
598
599
600
601
602
            ,md5_url => '$url/MD5SUMS'
            ,xml => 'jessie-i386.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,min_disk_size => '10'
        }
603
604
        ,debian_bullseye_64=> {
            name =>'Debian Bullseye 64 bits'
Francesc Guasch's avatar
Francesc Guasch committed
605
            ,arch => 'x86_64'
606
607
608
609
610
611
612
            ,description => 'Debian 11 Bullseye 64 bits (netinst)'
            ,url => 'https://cdimage.debian.org/debian-cd/^11\..*\d$/amd64/iso-cd/'
            ,file_re => 'debian-11.[\d\.]+-amd64-netinst.iso'
            ,sha256_url => '$url/SHA256SUMS'
            ,xml => 'jessie-amd64.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,min_disk_size => '10'
Francesc Guasch's avatar
Francesc Guasch committed
613
            ,options => { machine => 'pc-q35', bios => 'UEFI' }
614
615
616
        }
        ,debian_bullseye_32=> {
            name =>'Debian Bullseye 32 bits'
Francesc Guasch's avatar
Francesc Guasch committed
617
            ,arch => 'i686'
618
619
620
621
622
623
624
            ,description => 'Debian 10 Bullseye 32 bits (netinst)'
            ,url => 'https://cdimage.debian.org/debian-cd/^11\..*\d$/i386/iso-cd/'
            ,file_re => 'debian-11.[\d\.]+-i386-netinst.iso'
            ,sha256_url => '$url/SHA256SUMS'
            ,xml => 'jessie-i386.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,min_disk_size => '10'
Francesc Guasch's avatar
Francesc Guasch committed
625
            ,options => { machine => 'pc-i440fx' }
626
        }
627
628
629
        ,devuan_beowulf_amd64=> {
            name =>'Devuan Beowulf 64 bits'
            ,description => 'Devuan Beowulf Desktop Live (amd64)'
Francesc Guasch's avatar
Francesc Guasch committed
630
            ,arch => 'x86_64'
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
            ,url => 'http://tw1.mirror.blendbyte.net/devuan-cd/devuan_beowulf/desktop-live/'
            ,file_re => 'devuan_beowulf_.*_amd64_desktop-live.iso'
            ,sha256_url => '$url/SHASUMS.txt'
            ,xml => 'jessie-amd64.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,min_disk_size => '10'
        }
        ,devuan_beowulf_i386=> {
            name =>'Devuan Beowulf 32 bits'
            ,description => 'Devuan Beowulf Desktop Live (i386)'
            ,arch => 'i386'
            ,url => 'http://tw1.mirror.blendbyte.net/devuan-cd/devuan_beowulf/desktop-live/'
            ,file_re => 'devuan_beowulf_.*_i386_desktop-live.iso'
            ,sha256_url => '$url/SHASUMS.txt'
            ,xml => 'jessie-i386.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,min_disk_size => '10'
        }
649
650
651
        ,parrot_xfce_amd64 => {
            name => 'Parrot Home Edition XFCE'
            ,description => 'Parrot Home Edition XFCE 64 Bits'
Francesc Guasch's avatar
Francesc Guasch committed
652
            ,arch => 'x86_64'
653
654
655
656
657
658
659
660
661
662
            ,xml => 'jessie-amd64.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,url => 'https://download.parrot.sh/parrot/iso/4.11.2/'
            ,file_re => 'Parrot-xfce-4.11.2_amd64.iso'
            ,sha256_url => '$url/signed-hashes.txt'
            ,min_disk_size => '10'
        }
        ,parrot_mate_amd64 => {
		  name => 'Parrot Security Edition MATE'
            ,description => 'Parrot Security Edition MATE 64 Bits'
Francesc Guasch's avatar
Francesc Guasch committed
663
            ,arch => 'x86_64'
664
665
666
667
668
669
670
            ,xml => 'jessie-amd64.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,url => 'https://download.parrot.sh/parrot/iso/4.11.2/'
            ,file_re => 'Parrot-security-4.11.2_amd64.iso'
            ,sha256_url => '$url/signed-hashes.txt'
            ,min_disk_size => '10'
        }
671
672
673
        ,kali_64 => {
            name => 'Kali Linux 2020'
            ,description => 'Kali Linux 2020 64 Bits'
Francesc Guasch's avatar
Francesc Guasch committed
674
            ,arch => 'x86_64'
675
676
677
678
679
680
681
682
683
684
            ,xml => 'jessie-amd64.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,url => 'https://cdimage.kali.org/kali-2020.\d+/'
            ,file_re => 'kali-linux-2020.\d+-installer-amd64.iso'
            ,sha256_url => '$url/SHA256SUMS'
            ,min_disk_size => '10'
        }
        ,kali_64_netinst => {
            name => 'Kali Linux 2020 (NetInstaller)'
            ,description => 'Kali Linux 2020 64 Bits (light NetInstall)'
Francesc Guasch's avatar
Francesc Guasch committed
685
            ,arch => 'x86_64'
686
687
688
689
690
691
692
            ,xml => 'jessie-amd64.xml'
            ,xml_volume => 'jessie-volume.xml'
            ,url => 'https://cdimage.kali.org/kali-2020.\d+/'
            ,file_re => 'kali-linux-2020.\d+-installer-netinst-amd64.iso'
            ,sha256_url => '$url/SHA256SUMS'
            ,min_disk_size => '10'
        }
joelalju's avatar
joelalju committed
693
        ,windows_7 => {
Francesc Guasch's avatar
Francesc Guasch committed
694
          name => 'Windows 7'
695
696
          ,description => 'Windows 7 64 bits. Requires an user provided ISO image.'
            .'<a target="_blank" href="http://ravada.readthedocs.io/en/latest/docs/new_iso_image.html">[help]</a>'
joelalju's avatar
joelalju committed
697
          ,xml => 'windows_7.xml'
joelalju's avatar
joelalju committed
698
          ,xml_volume => 'wisuvolume.xml'
699
          ,min_disk_size => '21'
Francesc Guasch's avatar
Francesc Guasch committed
700
          ,arch => 'x86_64'
joelalju's avatar
joelalju committed
701
702
703
704
705
706
        }
        ,windows_10 => {
          name => 'Windows 10'
          ,description => 'Windows 10 64 bits. Requires an user provided ISO image.'
          .'<a target="_blank" href="http://ravada.readthedocs.io/en/latest/docs/new_iso_image.html">[help]</a>'
          ,xml => 'windows_10.xml'
707
          ,xml_volume => 'windows10-volume.xml'
708
          ,min_disk_size => '21'
709
          ,min_swap_size => '2'
Francesc Guasch's avatar
Francesc Guasch committed
710
          ,arch => 'x86_64'
711
          ,extra_iso => 'https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.215-\d+/virtio-win-0.1.\d+.iso'
joelalju's avatar
joelalju committed
712
        }
joelalju's avatar
joelalju committed
713
714
715
716
717
718
        ,windows_xp => {
          name => 'Windows XP'
          ,description => 'Windows XP 64 bits. Requires an user provided ISO image.'
          .'<a target="_blank" href="http://ravada.readthedocs.io/en/latest/docs/new_iso_image.html">[help]</a>'
          ,xml => 'windows_xp.xml'
          ,xml_volume => 'wisuvolume.xml'
719
          ,min_disk_size => '3'
Francesc Guasch's avatar
Francesc Guasch committed
720
          ,arch => 'x86_64'
joelalju's avatar
joelalju committed
721
722
723
724
725
726
727
        }
        ,windows_12 => {
          name => 'Windows 2012'
          ,description => 'Windows 2012 64 bits. Requires an user provided ISO image.'
          .'<a target="_blank" href="http://ravada.readthedocs.io/en/latest/docs/new_iso_image.html">[help]</a>'
          ,xml => 'windows_12.xml'
          ,xml_volume => 'wisuvolume.xml'
728
          ,min_disk_size => '21'
Francesc Guasch's avatar
Francesc Guasch committed
729
          ,arch => 'x86_64'
joelalju's avatar
joelalju committed
730
731
732
733
734
735
736
        }
        ,windows_8 => {
          name => 'Windows 8.1'
          ,description => 'Windows 8.1 64 bits. Requires an user provided ISO image.'
          .'<a target="_blank" href="http://ravada.readthedocs.io/en/latest/docs/new_iso_image.html">[help]</a>'
          ,xml => 'windows_8.xml'
          ,xml_volume => 'wisuvolume.xml'
737
          ,min_disk_size => '21'
Francesc Guasch's avatar
Francesc Guasch committed
738
          ,arch => 'x86_64'
joelalju's avatar
joelalju committed
739
        }
Daniel Sanchez's avatar
Daniel Sanchez committed
740
741
742
743
744
745
       ,empty_32bits => {
          name => 'Empty Machine 32 bits'
          ,description => 'Empty Machine 32 bits Boot PXE'
          ,xml => 'empty-i386.xml'
          ,xml_volume => 'jessie-volume.xml'
          ,min_disk_size => '0'
746
          ,has_cd => 0
Daniel Sanchez's avatar
Daniel Sanchez committed
747
748
749
750
751
752
753
        }
       ,empty_64bits => {
          name => 'Empty Machine 64 bits'
          ,description => 'Empty Machine 64 bits Boot PXE'
          ,xml => 'empty-amd64.xml'
          ,xml_volume => 'jessie-volume.xml'
          ,min_disk_size => '0'
Francesc Guasch's avatar
Francesc Guasch committed
754
          ,arch => 'x86_64'
755
          ,has_cd => 0
Daniel Sanchez's avatar
Daniel Sanchez committed
756
        }
757
    );
758
    $self->_scheduled_fedora_releases(\%data) if $0 !~ /\.t$/;
759
    $self->_update_table($table, $field, \%data);
760
    $self->_update_table_isos_url(\%data);
761
762
763

}

764
765
766
767
sub _update_table_isos_url($self, $data) {
    my $sth = $CONNECTOR->dbh->prepare("SELECT * FROM iso_images WHERE name=?");
    for my $release (sort keys %$data) {
        my $entry = $data->{$release};
Francesc Guasch's avatar
Francesc Guasch committed
768
769
770
771
772
773
774
        if (exists $entry->{options} && $entry->{options} 
            && ref($entry->{options})
        ) {
            unlock_hash(%$entry);
            $entry->{options} = encode_json($entry->{options});
            lock_hash(%$entry);
        }
775
776
777
778
779
780
781
782
783
        $sth->execute($entry->{name});
        my $row = $sth->fetchrow_hashref();
        for my $field (keys %$entry) {
            next if defined $row->{$field} && $row->{$field} eq $entry->{$field};
            my $sth_update = $CONNECTOR->dbh->prepare(
                "UPDATE iso_images SET $field=?"
                ." WHERE id=?"
            );
            $sth_update->execute($entry->{$field}, $row->{id});
784
            warn("INFO: updating $release $field '".($row->{$field} or '')."' -> '$entry->{$field}'\n")
785
786
787
788
789
            if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
        }
    }
}

790
sub _scheduled_fedora_releases($self,$data) {
791

792
    return if !exists $VALID_VM{KVM} ||!$VALID_VM{KVM} || $>;
793
    my $vm = $self->search_vm('KVM') or return; # TODO move ISO downloads off KVM
794

795
796
797
798
    my @now = localtime(time);
    my $year = $now[5]+1900;
    my $month = $now[4]+1;

799
800
801
802
803
804
    my $url_archive
    = 'https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/';

    my $url_current
    = 'http://ftp.halifax.rwth-aachen.de/fedora/linux/releases/';

805
    my $release = 27;
806

807
808
809
810
811
812
    for my $y ( 2018 .. $year ) {
        for my $m ( 5, 11 ) {
            return if $y == $year && $m>$month;
            $release++;
            my $name = "fedora_".$release;
            next if exists $data->{$name};
813
814
815
816

            my $url = $url_archive;
            $url = $url_current if $y>=$year-1;

817
818
819
            my $url_file = $url.$release
                    .'/Workstation/x86_64/iso/Fedora-Workstation-.*-x86_64-'.$release
                    .'-.*\.iso';
820
821
822
            my @found;
            eval { @found = $vm->_search_url_file($url_file) };
            die $@ if $@ && $@ !~ /Not Found/i;
823
824
825
826
827
828
829
830
831
832
            if(!@found) {
                next if $url =~ m{//archives};

                $url_file = $url_archive.$release
                    .'/Workstation/x86_64/iso/Fedora-Workstation-.*-x86_64-'.$release
                    .'-.*\.iso';
                @found = $vm->_search_url_file($url_file);
                next if !scalar(@found);
            }

833
834
835
            $data->{$name} = {
            name => 'Fedora '.$release
            ,description => "RedHat Fedora $release Workstation 64 bits"
Francesc Guasch's avatar
Francesc Guasch committed
836
            ,arch => 'x86_64'
837
            ,url => $url_file
838
839
840
841
842
843
844
845
846
            ,xml => 'xenial64-amd64.xml'
            ,xml_volume => 'xenial64-volume.xml'
            ,sha256_url => '$url/Fedora-Workstation-'.$release.'-.*-x86_64-CHECKSUM'
            ,min_disk_size => 10 + $release-27
            };
        }
    }
}

Francesc Guasch's avatar
Francesc Guasch committed
847
sub _add_domain_drivers_display($self) {
Francesc Guasch's avatar
Francesc Guasch committed
848
    my $port_rdp = 3389;
Francesc Guasch's avatar
Francesc Guasch committed
849
850
851
852
853
    my %data = (
        'KVM' => [
            'spice'
            ,'vnc'
            ,{name => 'x2go', data => 22 }
Francesc Guasch's avatar
Francesc Guasch committed
854
            ,{name => 'Windows RDP', value => 'rdp', data => $port_rdp}
Francesc Guasch's avatar
Francesc Guasch committed
855
856
857
858
859
        ]
        ,'Void' => [
            'void'
            ,'spice'
            ,{name => 'x2go', data => 22 }
Francesc Guasch's avatar
Francesc Guasch committed
860
            ,{name => 'Windows RDP', value => 'rdp' , data => $port_rdp }
Francesc Guasch's avatar
Francesc Guasch committed
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
        ]
    );

    my $id_type = Ravada::Utils::max_id($CONNECTOR->dbh, 'domain_drivers_types')+1;
    my $id_option = Ravada::Utils::max_id($CONNECTOR->dbh, 'domain_drivers_options');
    for my $vm ( keys %data) {
        my $type = {
            id => $id_type
            ,name => 'display'
            ,description => 'Display'
            ,vm => $vm
        };

        $self->_update_table('domain_drivers_types','name,vm',$type)
            and do {
            for my $option ( @{$data{$vm}} ) {
                if (!ref($option)) {
                    $option = { name => $option
                        ,value => $option
                    };
                }
                $option->{value} = $option->{name} if !exists $option->{value};
                $option->{id_driver_type} = $id_type;
                $option->{id} = ++$id_option;
                $self->_update_table('domain_drivers_options','id_driver_type,name',$option)
            }
            $id_type++;
        };
    }
}

892
893
894
895
896
897
898
sub _update_domain_drivers_types($self) {

    my $data = {
        image => {
            id => 4,
            ,name => 'image'
           ,description => 'Graphics Options'
899
           ,vm => 'KVM'
900
901
902
903
904
        },
        jpeg => {
            id => 5,
            ,name => 'jpeg'
           ,description => 'Graphics Options'
905
           ,vm => 'KVM'
906
907
908
909
910
        },
        zlib => {
            id => 6,
            ,name => 'zlib'
           ,description => 'Graphics Options'
911
           ,vm => 'KVM'
912
913
914
915
916
        },
        playback => {
            id => 7,
            ,name => 'playback'
           ,description => 'Graphics Options'
917
           ,vm => 'KVM'
918
919
920
921
922
923

        },
        streaming => {
            id => 8,
            ,name => 'streaming'
           ,description => 'Graphics Options'
924
           ,vm => 'KVM'
925
926

        }
Francesc Guasch's avatar
Francesc Guasch committed
927
928
929
930
931
932
        ,disk => {
            id => 9
            ,name => 'disk'
            ,vm => 'KVM'
        }

933
934
    };
    $self->_update_table('domain_drivers_types','id',$data);
Francesc Guasch's avatar
Francesc Guasch committed
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
    my $id = Ravada::Utils::max_id($CONNECTOR->dbh, 'domain_drivers_types');
    my $id_option = Ravada::Utils::max_id($CONNECTOR->dbh, 'domain_drivers_options');
    my $data_options;
    for my $item (keys %$data) {
        unlock_hash(%{$data->{$item}});
        $data->{$item}->{id} = ++$id;
        $data->{$item}->{vm} = 'Void';

        next if $item eq 'disk';

        $id_option++;
        $data_options->{"$item.on"} = {
            id => $id_option
            ,id_driver_type => $id
            ,name => "$item.on"
            ,value => "compression=on"
        };
        $id_option++;
        $data_options->{"$item.off"} = {
            id => $id_option
            ,id_driver_type => $id
            ,name => "$item.off"
            ,value => "compression=off"
        };

    }
    $self->_update_table('domain_drivers_types','name,vm',$data)
        and $self->_update_table('domain_drivers_options','id_driver_type,name',$data_options);
963
964
965
966
967
968

    my $sth = $CONNECTOR->dbh->prepare(
        "UPDATE domain_drivers_types SET vm='KVM' WHERE vm='qemu'"
    );
    $sth->execute;
    $sth->finish;
969
970
}

971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
sub _update_domain_drivers_options($self) {

    my $data = {
        qxl => {
            id => 1,
            ,id_driver_type => 1,
            ,name => 'QXL'
           ,value => 'type="qxl" ram="65536" vram="65536" vgamem="16384" heads="1" primary="yes"'
        },
        vmvga => {
            id => 2,
            ,id_driver_type => 1,
            ,name => 'VMVGA'
           ,value => 'type="vmvga" vram="16384" heads="1" primary="yes"'
        },
        cirrus => {
            id => 3,
            ,id_driver_type => 1,
            ,name => 'Cirrus'
           ,value => 'type="cirrus" vram="16384" heads="1" primary="yes"'
        },
        vga => {
            id => 4,
            ,id_driver_type => 1,
            ,name => 'VGA'
           ,value => 'type="vga" vram="16384" heads="1" primary="yes"'
        },
        ich6 => {
            id => 6,
            ,id_driver_type => 2,
For faster browsing, not all history is shown. View entire blame