2012-04-04 13:09:09 +01:00
/*
2014-03-07 14:38:51 +01:00
* libvirtd - config . c : daemon start of day , guest process & i / o management
2012-04-04 13:09:09 +01:00
*
2015-04-13 16:05:46 +02:00
* Copyright ( C ) 2006 - 2012 , 2014 , 2015 Red Hat , Inc .
2012-04-04 13:09:09 +01:00
* Copyright ( C ) 2006 Daniel P . Berrange
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
2012-09-20 16:30:55 -06:00
* License along with this library . If not , see
2012-07-21 18:06:23 +08:00
* < http : //www.gnu.org/licenses/>.
2012-04-04 13:09:09 +01:00
*
* Author : Daniel P . Berrange < berrange @ redhat . com >
*/
# include <config.h>
# include "libvirtd-config.h"
2012-12-12 16:35:35 +00:00
# include "virconf.h"
2012-12-12 18:06:53 +00:00
# include "viralloc.h"
2012-12-13 18:21:53 +00:00
# include "virerror.h"
2012-12-12 17:59:27 +00:00
# include "virlog.h"
2012-04-04 15:00:17 +01:00
# include "rpc/virnetserver.h"
2012-04-04 13:09:09 +01:00
# include "configmake.h"
2012-04-04 15:00:17 +01:00
# include "remote/remote_protocol.h"
# include "remote/remote_driver.h"
2013-04-03 12:36:23 +02:00
# include "virstring.h"
# include "virutil.h"
2012-04-04 13:09:09 +01:00
# define VIR_FROM_THIS VIR_FROM_CONF
2014-02-28 12:16:17 +00:00
VIR_LOG_INIT ( " daemon.libvirtd-config " ) ;
2012-04-04 13:09:09 +01:00
2014-03-18 09:19:33 +01:00
static int
remoteConfigGetAuth ( virConfPtr conf ,
2016-07-08 11:37:40 +01:00
const char * filename ,
2014-03-18 09:19:33 +01:00
const char * key ,
2016-07-08 11:37:40 +01:00
int * auth )
2014-03-18 09:19:33 +01:00
{
2016-07-08 11:37:40 +01:00
char * authstr = NULL ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueString ( conf , key , & authstr ) < 0 )
2012-04-04 13:09:09 +01:00
return - 1 ;
2016-07-08 11:37:40 +01:00
if ( ! authstr )
2012-04-04 13:09:09 +01:00
return 0 ;
2016-07-08 11:37:40 +01:00
if ( STREQ ( authstr , " none " ) ) {
2012-04-04 13:09:09 +01:00
* auth = VIR_NET_SERVER_SERVICE_AUTH_NONE ;
2012-09-20 12:58:29 +01:00
# if WITH_SASL
2016-07-08 11:37:40 +01:00
} else if ( STREQ ( authstr , " sasl " ) ) {
2012-04-04 13:09:09 +01:00
* auth = VIR_NET_SERVER_SERVICE_AUTH_SASL ;
# endif
2016-07-08 11:37:40 +01:00
} else if ( STREQ ( authstr , " polkit " ) ) {
2012-04-04 13:09:09 +01:00
* auth = VIR_NET_SERVER_SERVICE_AUTH_POLKIT ;
} else {
2012-07-18 19:26:35 +01:00
virReportError ( VIR_ERR_CONFIG_UNSUPPORTED ,
2016-07-08 11:37:40 +01:00
_ ( " %s: %s: unsupported auth %s " ) ,
filename , key , authstr ) ;
VIR_FREE ( authstr ) ;
2012-04-04 13:09:09 +01:00
return - 1 ;
}
2016-07-08 11:37:40 +01:00
VIR_FREE ( authstr ) ;
2012-04-04 13:09:09 +01:00
return 0 ;
}
int
daemonConfigFilePath ( bool privileged , char * * configfile )
{
if ( privileged ) {
2013-05-03 14:39:39 +02:00
if ( VIR_STRDUP ( * configfile , SYSCONFDIR " /libvirt/libvirtd.conf " ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
} else {
2012-05-03 12:36:27 -04:00
char * configdir = NULL ;
2012-04-04 13:09:09 +01:00
2012-05-24 13:29:42 +01:00
if ( ! ( configdir = virGetUserConfigDirectory ( ) ) )
2012-04-04 13:09:09 +01:00
goto error ;
2012-05-03 12:36:27 -04:00
if ( virAsprintf ( configfile , " %s/libvirtd.conf " , configdir ) < 0 ) {
VIR_FREE ( configdir ) ;
2013-07-04 11:58:18 +02:00
goto error ;
2012-04-04 13:09:09 +01:00
}
2012-05-03 12:36:27 -04:00
VIR_FREE ( configdir ) ;
2012-04-04 13:09:09 +01:00
}
return 0 ;
2014-03-25 07:45:38 +01:00
error :
2012-04-04 13:09:09 +01:00
return - 1 ;
}
struct daemonConfig *
daemonConfigNew ( bool privileged ATTRIBUTE_UNUSED )
{
struct daemonConfig * data ;
char * localhost ;
int ret ;
2013-07-04 11:58:18 +02:00
if ( VIR_ALLOC ( data ) < 0 )
2012-04-04 13:09:09 +01:00
return NULL ;
data - > listen_tls = 1 ;
data - > listen_tcp = 0 ;
2013-05-03 14:39:39 +02:00
if ( VIR_STRDUP ( data - > tls_port , LIBVIRTD_TLS_PORT ) < 0 | |
VIR_STRDUP ( data - > tcp_port , LIBVIRTD_TCP_PORT ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
/* Only default to PolicyKit if running as root */
2013-01-08 22:19:00 +00:00
# if WITH_POLKIT
2012-04-04 13:09:09 +01:00
if ( privileged ) {
data - > auth_unix_rw = REMOTE_AUTH_POLKIT ;
data - > auth_unix_ro = REMOTE_AUTH_POLKIT ;
} else {
# endif
data - > auth_unix_rw = REMOTE_AUTH_NONE ;
data - > auth_unix_ro = REMOTE_AUTH_NONE ;
2013-01-08 22:19:00 +00:00
# if WITH_POLKIT
2012-04-04 13:09:09 +01:00
}
# endif
2013-05-03 14:39:39 +02:00
if ( VIR_STRDUP ( data - > unix_sock_rw_perms ,
data - > auth_unix_rw = = REMOTE_AUTH_POLKIT ? " 0777 " : " 0700 " ) < 0 | |
2015-04-13 16:05:46 +02:00
VIR_STRDUP ( data - > unix_sock_ro_perms , " 0777 " ) < 0 | |
VIR_STRDUP ( data - > unix_sock_admin_perms , " 0700 " ) < 0 )
2013-05-03 14:39:39 +02:00
goto error ;
2012-04-04 13:09:09 +01:00
2012-09-20 12:58:29 +01:00
# if WITH_SASL
2012-04-04 13:09:09 +01:00
data - > auth_tcp = REMOTE_AUTH_SASL ;
# else
data - > auth_tcp = REMOTE_AUTH_NONE ;
# endif
data - > auth_tls = REMOTE_AUTH_NONE ;
data - > mdns_adv = 0 ;
data - > min_workers = 5 ;
data - > max_workers = 20 ;
2014-03-04 18:55:24 +01:00
data - > max_clients = 5000 ;
2016-02-29 08:33:20 -05:00
data - > max_queued_clients = 1000 ;
2014-03-04 18:55:24 +01:00
data - > max_anonymous_clients = 20 ;
2012-04-04 13:09:09 +01:00
data - > prio_workers = 5 ;
data - > max_requests = 20 ;
data - > max_client_requests = 5 ;
data - > audit_level = 1 ;
data - > audit_logging = 0 ;
data - > keepalive_interval = 5 ;
data - > keepalive_count = 5 ;
2015-04-13 16:05:46 +02:00
data - > admin_min_workers = 5 ;
data - > admin_max_workers = 20 ;
data - > admin_max_clients = 5000 ;
data - > admin_max_queued_clients = 20 ;
data - > admin_max_client_requests = 5 ;
data - > admin_keepalive_interval = 5 ;
data - > admin_keepalive_count = 5 ;
2013-04-26 17:39:11 +01:00
localhost = virGetHostname ( ) ;
2012-04-04 13:09:09 +01:00
if ( localhost = = NULL ) {
/* we couldn't resolve the hostname; assume that we are
* running in disconnected operation , and report a less
* useful Avahi string
*/
2013-06-07 15:20:35 +02:00
ret = VIR_STRDUP ( data - > mdns_name , " Virtualization Host " ) ;
2012-04-04 13:09:09 +01:00
} else {
char * tmp ;
/* Extract the host part of the potentially FQDN */
if ( ( tmp = strchr ( localhost , ' . ' ) ) )
* tmp = ' \0 ' ;
ret = virAsprintf ( & data - > mdns_name , " Virtualization Host %s " ,
localhost ) ;
}
VIR_FREE ( localhost ) ;
if ( ret < 0 )
2013-07-04 11:58:18 +02:00
goto error ;
2012-04-04 13:09:09 +01:00
return data ;
2014-03-25 07:45:38 +01:00
error :
2012-04-04 13:09:09 +01:00
daemonConfigFree ( data ) ;
return NULL ;
}
void
daemonConfigFree ( struct daemonConfig * data )
{
char * * tmp ;
if ( ! data )
return ;
VIR_FREE ( data - > listen_addr ) ;
VIR_FREE ( data - > tls_port ) ;
VIR_FREE ( data - > tcp_port ) ;
2013-06-28 13:10:10 -04:00
tmp = data - > access_drivers ;
while ( tmp & & * tmp ) {
VIR_FREE ( * tmp ) ;
tmp + + ;
}
VIR_FREE ( data - > access_drivers ) ;
2012-04-04 13:09:09 +01:00
2015-04-13 16:05:46 +02:00
VIR_FREE ( data - > unix_sock_admin_perms ) ;
2012-04-04 13:09:09 +01:00
VIR_FREE ( data - > unix_sock_ro_perms ) ;
VIR_FREE ( data - > unix_sock_rw_perms ) ;
VIR_FREE ( data - > unix_sock_group ) ;
VIR_FREE ( data - > unix_sock_dir ) ;
VIR_FREE ( data - > mdns_name ) ;
tmp = data - > tls_allowed_dn_list ;
while ( tmp & & * tmp ) {
VIR_FREE ( * tmp ) ;
tmp + + ;
}
VIR_FREE ( data - > tls_allowed_dn_list ) ;
tmp = data - > sasl_allowed_username_list ;
while ( tmp & & * tmp ) {
VIR_FREE ( * tmp ) ;
tmp + + ;
}
VIR_FREE ( data - > sasl_allowed_username_list ) ;
2016-06-03 17:53:18 +01:00
VIR_FREE ( data - > tls_priority ) ;
2012-04-04 13:09:09 +01:00
VIR_FREE ( data - > key_file ) ;
VIR_FREE ( data - > ca_file ) ;
VIR_FREE ( data - > cert_file ) ;
VIR_FREE ( data - > crl_file ) ;
2012-04-12 17:10:42 +08:00
VIR_FREE ( data - > host_uuid ) ;
2016-05-03 12:12:41 +03:00
VIR_FREE ( data - > host_uuid_source ) ;
2012-04-04 13:09:09 +01:00
VIR_FREE ( data - > log_filters ) ;
VIR_FREE ( data - > log_outputs ) ;
VIR_FREE ( data ) ;
}
2012-04-04 13:14:19 +01:00
static int
daemonConfigLoadOptions ( struct daemonConfig * data ,
const char * filename ,
virConfPtr conf )
2012-04-04 13:09:09 +01:00
{
2016-07-08 11:37:40 +01:00
if ( virConfGetValueBool ( conf , " listen_tcp " , & data - > listen_tcp ) < 0 )
goto error ;
if ( virConfGetValueBool ( conf , " listen_tls " , & data - > listen_tls ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " tls_port " , & data - > tls_port ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " tcp_port " , & data - > tcp_port ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " listen_addr " , & data - > listen_addr ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( remoteConfigGetAuth ( conf , filename , " auth_unix_rw " , & data - > auth_unix_rw ) < 0 )
2012-04-04 13:09:09 +01:00
goto error ;
2013-01-08 22:19:00 +00:00
# if WITH_POLKIT
2012-04-04 13:09:09 +01:00
/* Change default perms to be wide-open if PolicyKit is enabled.
* Admin can always override in config file
*/
if ( data - > auth_unix_rw = = REMOTE_AUTH_POLKIT ) {
VIR_FREE ( data - > unix_sock_rw_perms ) ;
2013-05-03 14:39:39 +02:00
if ( VIR_STRDUP ( data - > unix_sock_rw_perms , " 0777 " ) < 0 )
2012-04-04 13:09:09 +01:00
goto error ;
}
# endif
2016-07-08 11:37:40 +01:00
if ( remoteConfigGetAuth ( conf , filename , " auth_unix_ro " , & data - > auth_unix_ro ) < 0 )
2012-04-04 13:09:09 +01:00
goto error ;
2016-07-08 11:37:40 +01:00
if ( remoteConfigGetAuth ( conf , filename , " auth_tcp " , & data - > auth_tcp ) < 0 )
2012-04-04 13:09:09 +01:00
goto error ;
2016-07-08 11:37:40 +01:00
if ( remoteConfigGetAuth ( conf , filename , " auth_tls " , & data - > auth_tls ) < 0 )
2012-04-04 13:09:09 +01:00
goto error ;
2016-07-08 11:37:40 +01:00
if ( virConfGetValueStringList ( conf , " access_drivers " , false ,
& data - > access_drivers ) < 0 )
2013-04-17 12:01:24 +01:00
goto error ;
2016-07-08 11:37:40 +01:00
if ( virConfGetValueString ( conf , " unix_sock_group " , & data - > unix_sock_group ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " unix_sock_admin_perms " , & data - > unix_sock_admin_perms ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " unix_sock_ro_perms " , & data - > unix_sock_ro_perms ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " unix_sock_rw_perms " , & data - > unix_sock_rw_perms ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueString ( conf , " unix_sock_dir " , & data - > unix_sock_dir ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueBool ( conf , " mdns_adv " , & data - > mdns_adv ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " mdns_name " , & data - > mdns_name ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueBool ( conf , " tls_no_sanity_certificate " , & data - > tls_no_sanity_certificate ) < 0 )
goto error ;
if ( virConfGetValueBool ( conf , " tls_no_verify_certificate " , & data - > tls_no_verify_certificate ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueString ( conf , " key_file " , & data - > key_file ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " cert_file " , & data - > cert_file ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " ca_file " , & data - > ca_file ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " crl_file " , & data - > crl_file ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueStringList ( conf , " tls_allowed_dn_list " , false ,
& data - > tls_allowed_dn_list ) < 0 )
2012-04-04 13:09:09 +01:00
goto error ;
2016-07-08 11:37:40 +01:00
if ( virConfGetValueStringList ( conf , " sasl_allowed_username_list " , false ,
& data - > sasl_allowed_username_list ) < 0 )
2012-04-04 13:09:09 +01:00
goto error ;
2016-07-08 11:37:40 +01:00
if ( virConfGetValueString ( conf , " tls_priority " , & data - > tls_priority ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueUInt ( conf , " min_workers " , & data - > min_workers ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " max_workers " , & data - > max_workers ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " max_clients " , & data - > max_clients ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " max_queued_clients " , & data - > max_queued_clients ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " max_anonymous_clients " , & data - > max_anonymous_clients ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueUInt ( conf , " prio_workers " , & data - > prio_workers ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueUInt ( conf , " max_requests " , & data - > max_requests ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " max_client_requests " , & data - > max_client_requests ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueUInt ( conf , " admin_min_workers " , & data - > admin_min_workers ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " admin_max_workers " , & data - > admin_max_workers ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " admin_max_clients " , & data - > admin_max_clients ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " admin_max_queued_clients " , & data - > admin_max_queued_clients ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " admin_max_client_requests " , & data - > admin_max_client_requests ) < 0 )
goto error ;
2015-04-13 16:05:46 +02:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueUInt ( conf , " audit_level " , & data - > audit_level ) < 0 )
goto error ;
if ( virConfGetValueBool ( conf , " audit_logging " , & data - > audit_logging ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueString ( conf , " host_uuid " , & data - > host_uuid ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " host_uuid_source " , & data - > host_uuid_source ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueUInt ( conf , " log_level " , & data - > log_level ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " log_filters " , & data - > log_filters ) < 0 )
goto error ;
if ( virConfGetValueString ( conf , " log_outputs " , & data - > log_outputs ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueInt ( conf , " keepalive_interval " , & data - > keepalive_interval ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " keepalive_count " , & data - > keepalive_count ) < 0 )
goto error ;
2012-04-04 13:09:09 +01:00
2016-07-08 11:37:40 +01:00
if ( virConfGetValueInt ( conf , " admin_keepalive_interval " , & data - > admin_keepalive_interval ) < 0 )
goto error ;
if ( virConfGetValueUInt ( conf , " admin_keepalive_count " , & data - > admin_keepalive_count ) < 0 )
goto error ;
2015-04-13 16:05:46 +02:00
2012-04-04 13:09:09 +01:00
return 0 ;
2014-03-25 07:45:38 +01:00
error :
2012-04-04 13:09:09 +01:00
return - 1 ;
}
2012-04-04 13:14:19 +01:00
/* Read the config file if it exists.
* Only used in the remote case , hence the name .
*/
int
daemonConfigLoadFile ( struct daemonConfig * data ,
const char * filename ,
bool allow_missing )
{
virConfPtr conf ;
int ret ;
if ( allow_missing & &
access ( filename , R_OK ) = = - 1 & &
errno = = ENOENT )
return 0 ;
conf = virConfReadFile ( filename , 0 ) ;
if ( ! conf )
return - 1 ;
ret = daemonConfigLoadOptions ( data , filename , conf ) ;
virConfFree ( conf ) ;
return ret ;
}
int daemonConfigLoadData ( struct daemonConfig * data ,
const char * filename ,
const char * filedata )
{
virConfPtr conf ;
int ret ;
conf = virConfReadMem ( filedata , strlen ( filedata ) , 0 ) ;
if ( ! conf )
return - 1 ;
ret = daemonConfigLoadOptions ( data , filename , conf ) ;
virConfFree ( conf ) ;
return ret ;
}