Commit 66b5253b authored by Francesc Guasch's avatar Francesc Guasch
Browse files

Merge branch 'develop' of https://github.com/UPC/ravada into develop

parents 13713d2e 3e152317
......@@ -98,6 +98,9 @@ $DIR_SQL = "/usr/share/doc/ravada/sql/mysql" if ! -e $DIR_SQL;
our $USER_DAEMON;
our $USER_DAEMON_NAME = 'daemon';
our $FIRST_TIME_RUN = 1;
$FIRST_TIME_RUN = 0 if $0 =~ /\.t$/;
has 'connector' => (
is => 'rw'
);
......@@ -146,6 +149,7 @@ sub _install($self) {
$self->_update_data();
$self->_init_user_daemon();
$self->_sql_insert_defaults();
print "\n" if $FIRST_TIME_RUN;
}
sub _init_user_daemon {
......@@ -574,7 +578,7 @@ sub _update_isos {
sub _scheduled_fedora_releases($self,$data) {
return if !exists $VALID_VM{KVM} ||!$VALID_VM{KVM};
return if !exists $VALID_VM{KVM} ||!$VALID_VM{KVM} || $>;
my $vm = $self->search_vm('KVM') or return; # TODO move ISO downloads off KVM
my @now = localtime(time);
......@@ -869,7 +873,8 @@ sub _update_table($self, $table, $field, $data, $verbose=0) {
warn("INFO: $table : $row->{$field} already added.\n") if $verbose;
next;
}
warn("INFO: updating $table : $row->{$field}\n") if $0 !~ /\.t$/;
warn("INFO: updating $table : $row->{$field}\n")
if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
my $sql =
"INSERT INTO $table "
......@@ -983,7 +988,10 @@ sub _add_indexes_generic($self) {
$type .=" INDEX " if $type=~ /^unique/i;
my $sql = "CREATE $type $if_not_exists $name on $table ($fields)";
warn "INFO: Adding index to $table: $name" if $0 !~ /\.t$/;
warn "INFO: Adding index to $table: $name"
if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
print "+" if $FIRST_TIME_RUN;
my $sth = $CONNECTOR->dbh->prepare($sql);
$sth->execute();
}
......@@ -1207,7 +1215,8 @@ sub _upgrade_table {
warn "INFO: changing $field\n"
." $row->{COLUMN_SIZE} to ".($new_size or '')."\n"
." $row->{TYPE_NAME} -> $new_type \n"
." in $table\n$definition\n" if $0 !~ /\.t$/;
." in $table\n$definition\n" if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
print "-" if $FIRST_TIME_RUN;
$dbh->do("alter table $table change $field $field $definition");
return;
}
......@@ -1219,11 +1228,14 @@ sub _upgrade_table {
$definition =~ s/DEFAULT.*ON UPDATE(.*)//i;
$sqlite_trigger = $1;
}
warn "INFO: adding $field $definition to $table\n" if $0 !~ /\.t$/;
warn "INFO: adding $field $definition to $table\n"
if!$FIRST_TIME_RUN && $0 !~ /\.t$/;
$dbh->do("alter table $table add $field $definition");
if ( $sqlite_trigger && !$self->_exists_trigger($dbh, "Update$field") ) {
$self->_sqlite_trigger($dbh,$table, $field, $sqlite_trigger);
}
print "-" if $FIRST_TIME_RUN;
return 1;
}
......@@ -1262,7 +1274,9 @@ sub _remove_field {
$sth->finish;
return if !$row;
warn "INFO: removing $field to $table\n" if $0 !~ /\.t$/;
warn "INFO: removing $field to $table\n"
if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
$dbh->do("alter table $table drop column $field");
return 1;
......@@ -1277,7 +1291,10 @@ sub _create_table {
$sth->finish;
return if keys %$info;
warn "INFO: creating table $table\n" if $0 !~ /\.t$/;
warn "INFO: creating table $table\n"
if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
print "." if $FIRST_TIME_RUN;
my $file_sql = "$DIR_SQL/$table.sql";
open my $in,'<',$file_sql or die "$! $file_sql";
......@@ -1295,7 +1312,9 @@ sub _insert_data {
my $file_sql = "$DIR_SQL/../data/insert_$table.sql";
return if ! -e $file_sql;
warn "INFO: inserting data for $table\n";
warn "INFO: inserting data for $table\n"
if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
open my $in,'<',$file_sql or die "$! $file_sql";
my $sql = '';
while (my $line = <$in>) {
......@@ -1326,6 +1345,7 @@ sub _create_tables {
}
sub _sql_create_tables($self) {
my $created = 0;
my $driver = lc($CONNECTOR->dbh->{Driver}{Name});
my %tables = (
settings => {
......@@ -1339,9 +1359,14 @@ sub _sql_create_tables($self) {
my $sth = $CONNECTOR->dbh->table_info('%',undef,$table,'TABLE');
my $info = $sth->fetchrow_hashref();
$sth->finish;
next if keys %$info;
if ( keys %$info ) {
$FIRST_TIME_RUN = 0;
next;
}
warn "INFO: creating table $table\n" if $0 !~ /\.t$/;
print "Installing " if !$created && $FIRST_TIME_RUN;
warn "INFO: creating table $table\n"
if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
my $sql_fields;
for my $field (sort keys %{$tables{$table}} ) {
......@@ -1352,8 +1377,9 @@ sub _sql_create_tables($self) {
my $sql = "CREATE TABLE $table ( $sql_fields )";
$CONNECTOR->dbh->do($sql);
$created++;
}
return $created;
}
sub _sql_insert_defaults($self){
......@@ -1450,7 +1476,10 @@ sub _sql_insert_defaults($self){
$sth->execute($entry->{$field{$table}});
my ($found) = $sth->fetchrow;
next if $found;
warn "INFO adding default $table ".Dumper($entry) if $0 !~ /t$/;
warn "INFO: adding default $table ".Dumper($entry)
if !$FIRST_TIME_RUN && $0 !~ /\.t$/;
$self->_sql_insert_values($table, $entry);
}
}
......@@ -3768,6 +3797,12 @@ sub _cmd_list_network_interfaces($self, $request) {
$request->output(encode_json(\@ifs));
}
sub _cmd_list_storage_pools($self, $request) {
my $id_vm = $request->args('id_vm');
my $vm = Ravada::VM->open( $id_vm );
$request->output(encode_json([ $vm->list_storage_pools ]));
}
sub _cmd_list_isos($self, $request){
my $vm_type = $request->args('vm_type');
......@@ -4217,6 +4252,8 @@ sub _req_method {
,compact => \&_cmd_compact
,purge => \&_cmd_purge
,list_storage_pools => \&_cmd_list_storage_pools
# Domain ports
,expose => \&_cmd_expose
,remove_expose => \&_cmd_remove_expose
......
......@@ -440,14 +440,14 @@ sub _login_bind {
for my $user (@user) {
my $dn = $user->dn;
$found++;
my $mesg = $LDAP_ADMIN->bind($dn, password => $password);
if ( !$mesg->code() ) {
my $ldap = _connect_ldap($dn, $password);
if ( $ldap ) {
$self->{_auth} = 'bind';
$self->{_ldap_entry} = $user;
return 1;
}
warn "ERROR: ".$mesg->code." : ".$mesg->error. " : Bad credentials for $dn"
if $Ravada::DEBUG && $mesg->code;
warn "ERROR: Bad credentials for $dn"
if $Ravada::DEBUG && $@;
}
return 0;
}
......
......@@ -570,6 +570,48 @@ sub _list_bases_vm($self, $id_node) {
return \@bases;
}
sub _list_bases_vm_all($self, $id_node) {
my $sth = $CONNECTOR->dbh->prepare(
"SELECT d.id, d.name FROM domains d, vms v "
." WHERE is_base=? AND vm=v.vm_type"
." AND d.vm =v.vm_type"
." AND v.id=?"
." ORDER BY d.name "
);
$sth->execute(1, $id_node);
my $sth_bv = $CONNECTOR->dbh->prepare(
"SELECT bv.enabled FROM bases_vm bv, domains d "
." WHERE bv.id_domain=? AND bv.id_vm=?"
." AND d.id = bv.id_domain "
);
my ($id_domain, $name_domain);
$sth->bind_columns(\($id_domain, $name_domain));
my $sth_clones = $CONNECTOR->dbh->prepare(
"SELECT count(*) FROM domain_instances "
." WHERE id_vm=? AND id_domain IN (SELECT id FROM domains WHERE id_base=?) "
);
my @bases;
while ( $sth->fetch ) {
$sth_bv->execute($id_domain, $id_node);
my ($enabled) = $sth_bv->fetchrow;
$sth_clones->execute($id_node,$id_domain);
my ($n_clones) = $sth_clones->fetchrow();
push @bases,{
id => $id_domain
,name => $name_domain
,clones => $n_clones
,enabled => ( $enabled or 0)
};
}
return \@bases;
}
sub _list_machines_vm($self, $id_node) {
my $sth = $CONNECTOR->dbh->prepare(
"SELECT d.id, name FROM domains d"
......@@ -585,6 +627,7 @@ sub _list_machines_vm($self, $id_node) {
return \@bases;
}
=head2 list_iso_images
Returns a reference to a list of the ISO images known by the system
......@@ -627,7 +670,8 @@ sub iso_file ($self, $vm_type) {
$self->wait_request($req);
return [] if $req->status ne 'done';
my $isos = decode_json($req->output());
my $isos = [];
$isos = decode_json($req->output()) if $req->output;
$self->_cache_store("list_isos",$isos);
......@@ -677,6 +721,41 @@ sub list_users($self,$name=undef) {
return \@users;
}
sub list_bases_network($self, $id_network) {
my $sth = $CONNECTOR->dbh->prepare("SELECT * FROM networks where name = 'default'");
$sth->execute;
my $default = $sth->fetchrow_hashref();
$sth->finish;
my $sth_nd = $CONNECTOR->dbh->prepare("SELECT id,allowed,anonymous FROM domains_network"
." WHERE id_domain=? AND id_network=? "
);
$sth = $CONNECTOR->dbh->prepare("SELECT * FROM domains where is_base=1 "
." ORDER BY name");
$sth->execute();
my @bases;
while (my $row = $sth->fetchrow_hashref) {
$row->{anonymous} = ( $default->{anonymous} or 0);
$sth_nd->execute($row->{id}, $id_network);
my ($id,$allowed, $anonymous) = $sth_nd->fetchrow;
$row->{anonymous} = $anonymous if defined $anonymous;
if (defined $allowed) {
$row->{allowed} = $allowed;
} else {
$row->{allowed} = 1;
}
lock_hash(%$row);
push @bases,($row);
}
return \@bases;
}
=head2 create_domain
Request the creation of a new domain or virtual machine
......
......@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: 0.1.0-alpha\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-03 10:12+0300\n"
"PO-Revision-Date: 2020-12-06 19:29+0000\n"
"PO-Revision-Date: 2020-12-09 22:09+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/ravada/"
"translation/pt/>\n"
......@@ -31,7 +31,7 @@ msgid "Machines List"
msgstr "Lista de Máquinas"
msgid "Users"
msgstr "Usuários"
msgstr "Utilizadores"
msgid "Choose a Machine to Start"
msgstr "Escolha uma Máquina para Começar"
......@@ -58,7 +58,7 @@ msgid "Clone/s"
msgstr "Clone/s"
msgid "Users List"
msgstr "Lista de Usuários"
msgstr "Lista de utilizadores"
msgid "Name"
msgstr "Nome"
......@@ -91,7 +91,7 @@ msgid "New Machine"
msgstr "Nova Máquina"
msgid "I want to change my password"
msgstr "Eu quero mudar a minha senha"
msgstr "Quero mudar a minha palavra-passe"
msgid "I want to change my language"
msgstr "Eu quero alterar o meu idioma"
......@@ -109,10 +109,10 @@ msgid "Catalan"
msgstr "Catalão"
msgid "New Password:"
msgstr "Nova Senha:"
msgstr "Nova palavra-passe:"
msgid "Confirm Password:"
msgstr "Confirmar Senha:"
msgstr "Confirmar palavra-passe:"
msgid "Submit"
msgstr "Enviar"
......@@ -121,7 +121,7 @@ msgid "Your language has been changed successfully"
msgstr "Seu idioma foi alterado com sucesso"
msgid "Your password has been changed successfully"
msgstr "Sua senha foi alterada com sucesso"
msgstr "A sua palavra-passe foi alterada com sucesso"
msgid "Password too small"
msgstr "Senha muito pequena"
......@@ -154,7 +154,7 @@ msgid "ShutDown"
msgstr "Desligar"
msgid "Screenshot"
msgstr "Captura de Tela"
msgstr "Captura de ecrã"
msgid "Paused"
msgstr "Pausada"
......@@ -199,7 +199,7 @@ msgid "machines"
msgstr "máquinas"
msgid "users"
msgstr "usuários"
msgstr "utilizadores"
msgid "messages"
msgstr "mensagens"
......@@ -324,7 +324,7 @@ msgid "can change the settings of any virtual machines "
msgstr "pode alterar as configurações de quaisquer máquinas virtuais "
msgid "cloned from one base owned by the user."
msgstr "clonada de uma das bases que o usuário possui."
msgstr "clonada de uma das bases que o utilizador possui."
msgid "can clone public virtual machines."
msgstr "pode clinar máquinas virtuais públicas."
......@@ -339,40 +339,42 @@ msgid "can create virtual machines."
msgstr "pode criar máquinas virtuais."
msgid "can grant permissions to other users"
msgstr "pode conceder permissões para outros usuários."
msgstr "pode conceder permissões para outros utilizadores"
msgid "can hibernate any virtual machine."
msgstr "pode hibernar qualquer máquina virtual."
msgid "can hibernate clones from virtual machines owned by the user."
msgstr "pode hibernar clones de máquinas virtuais que o usuário possua."
msgstr "pode hibernar clones de máquinas virtuais que o utilizador possua."
msgid "can hibernate any clone."
msgstr "pode hibernar qualquer clone."
msgid "can remove any virtual machines owned by the user."
msgstr "pode remover quaisquer máquinas virtuais que o usuário possua."
msgstr "pode remover quaisquer máquinas virtuais que o utilizador possua."
msgid "can remove any virtual machine."
msgstr "pode remover qualquer máquina virtual."
msgid "can remove clones from virtual machines owned by the user."
msgstr "pode remover clones de máquinas virtuais que o usuário possua."
msgstr "pode remover clones de máquinas virtuais que o utilizador possua."
msgid "can remove any clone."
msgstr "pode remover qualquer clone."
msgid "can take a screenshot of any virtual machine owned by the user."
msgstr "pode tirar uma captura de tela de qualquer máquina virtual que o usuário possua."
msgstr ""
"pode tirar uma captura de ecrã de qualquer máquina virtual que o utilizador "
"possua."
msgid "can take a screenshot of any virtual machine."
msgstr "pode tirar uma captura de tela de qualquer máquina virtual."
msgstr "pode tirar uma captura de ecrã de qualquer máquina virtual."
msgid "can shutdown any virtual machine."
msgstr "pode desligar qualquer máquina virtual."
msgid "can shutdown clones from virtual machines owned by the user."
msgstr "pode desligar clones de máquinas virtuais que o usuário possua."
msgstr "pode desligar clones de máquinas virtuais que o utilizador possua."
msgid "Submit Query"
msgstr "Submeter Consulta"
......@@ -442,3 +444,546 @@ msgid ""
msgstr ""
"pode alterar as configurações de quaisquer máquinas virtuais "
"clonadas de uma base possuída pelo usuário."
msgid "Drivers"
msgstr "Drivers"
msgid "Yes, shutwdown all the clones"
msgstr "Sim, desligar todos os clones"
msgid "Keep in mind that there may be users using a clone"
msgstr "Lembre-se que pode haver utilizadores que usam um clone"
msgid "Shutdown all clones"
msgstr "Desligar todos os clones"
msgid "These actions affect all the clones on the machine"
msgstr "Estas ações afetam todos os clones da máquina"
msgid "Add description"
msgstr "Adicionar descrição"
msgid "Enable last for not allowed restrictions."
msgstr "Ativar por último para restrições não permitidas."
msgid "entries."
msgstr "entradas."
msgid "has at least"
msgstr "tem pelo menos"
msgid "No entries found"
msgstr "Nenhuma entrada encontrada"
msgid "Verifying"
msgstr "A verificar"
msgid "save"
msgstr "gravar"
msgid "verify"
msgstr "verificar"
msgid "If none of the previous match, access is denied."
msgstr "Se nenhum dos anteriores corresponde, o acesso é negado."
msgid "If none of the previous match, access is allowed."
msgstr "Se nenhum dos anteriores corresponde, o acesso é permitido."
msgid "Default"
msgstr "Predefinição"
msgid "Last"
msgstr "Último"
msgid "Allowed"
msgstr "Permitido"
msgid "Value"
msgstr "Valor"
msgid "Attribute"
msgstr "Atributo"
msgid "not found in LDAP server"
msgstr "não encontrado no servidor LDAP"
msgid "User name"
msgstr "Nome de utilizador"
msgid "Type a typical LDAP user name to fetch the attribute list"
msgstr ""
"Digite um nome de utilizador LDAP típico para ir buscar a lista de atributos"
msgid "Italian"
msgstr "Italiano"
msgid "Vietnamese"
msgstr "Vietnamita"
msgid "Session timeout"
msgstr "Tempo limite da sessão"
msgid "Empty password"
msgstr "Palavra-passe vazia"
msgid "Empty login name"
msgstr "Nome de login vazio"
msgid "Access denied"
msgstr "Acesso negado"
msgid "Start all clones"
msgstr "Iniciar todos os clones"
msgid "Update password"
msgstr "Atualizar a palavra-passe"
msgid "Change password"
msgstr "Alterar a palavra-passe"
msgid "Setting your default language"
msgstr "Definir o seu idioma predefinido"
msgid "A node with that name already exists."
msgstr "Já existe um nó com esse nome."
msgid "Address"
msgstr "Endereço"
msgid "New Node"
msgstr "Novo nó"
msgid "licensed."
msgstr "licenciado."
msgid "Thanks to:"
msgstr "Obrigado a:"
msgid "This VM is running and can't be renamed."
msgstr "Esta VM está a funcionar e não pode ser renomeada."
msgid "The changes will apply on next restart"
msgstr "As alterações serão aplicadas no próximo reinício"
msgid "Add"
msgstr "Adicionar"
msgid "You need a screenshot in order to copy it to the base machine."
msgstr "Precisa de uma captura do ecrã para copiá-la para a máquina base."
msgid "Copying the screenshot, please wait a moment..."
msgstr "A copiar a imagem do ecrã, por favor, espere um momento…"
msgid "You need to run the machine in order to take a screenshot."
msgstr "Precisa executar a máquina para tirar uma foto do ecrã."
msgid "Saving the screenshot, please wait a moment..."
msgstr "A gravar a captura de ecrã, por favor, espere um momento…"
msgid "Set base picture"
msgstr "Definir imagem de base"
msgid "Take screenshot"
msgstr "Capturar o ecrã"
msgid "The machine must be started to take the screenshot."
msgstr "A máquina deve estar ligada para fazer a captura de ecrã."
msgid "Remove"
msgstr "Remover"
msgid "The machine is down."
msgstr "A máquina está desligada."
msgid "Start again"
msgstr "Começar de novo"
msgid "view"
msgstr "visão"
msgid "The password for this virtual machine connection is :"
msgstr "A palavra-passe para esta conexão de máquina virtual é :"
msgid "Read more."
msgstr "Leia mais."
msgid "Portuguese"
msgstr "Português"
msgid "copied to clipboard"
msgstr "copiado para a área de transferência"
msgid "in your downloads folder."
msgstr "na sua pasta de descarregas."
msgid "If you can not see the machine screen in a few seconds check for a file called"
msgstr ""
"Se não conseguir ver o ecrã da máquina em alguns segundos, verifique se há "
"um ficheiro chamado"
msgid "Press SHIFT + F12 to exit"
msgstr "Pressione SHIFT + F12 para sair"
msgid "Change the owner of the machine"
msgstr "Mudar o proprietário da máquina"
msgid "Owner"
msgstr "Proprietário"
msgid "Volatile Clones"
msgstr "Clones voláteis"
msgid "This information will be available to the users"
msgstr "Esta informação estará disponível para os utilizadores"
msgid "Confirm Password can only contain words and numbers"
msgstr "A confirmação da palavra-passe só pode conter palavras e números"
msgid "Confirm Password must be at least 5 characters"
msgstr "A confirmação da palavra-passe deve ter pelo menos 5 caracteres"
msgid "Confirm Password can not exceed 20 characters"
msgstr "A confirmação da palavra-passe não pode exceder 20 caracteres"
msgid "Confirm Password is required"
msgstr "É necessário confirmar a palavra-passe"
msgid "Password can only contain words and numbers"