2019-07-13 19:51:56 +03:00
/*
* virsh - completer - network . c : virsh completer callbacks related to networks
*
* Copyright ( C ) 2019 Red Hat , Inc .
*
* 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
* License along with this library . If not , see
* < http : //www.gnu.org/licenses/>.
*/
# include <config.h>
# include "virsh-completer-network.h"
2021-09-26 11:57:38 +03:00
# include "virsh-util.h"
2019-07-13 19:51:56 +03:00
# include "viralloc.h"
# include "virsh-network.h"
# include "virsh.h"
char * *
virshNetworkNameCompleter ( vshControl * ctl ,
2019-10-14 15:44:29 +03:00
const vshCmd * cmd G_GNUC_UNUSED ,
2019-07-13 19:51:56 +03:00
unsigned int flags )
{
2021-03-11 10:16:13 +03:00
virshControl * priv = ctl - > privData ;
2019-07-13 19:51:56 +03:00
virNetworkPtr * nets = NULL ;
int nnets = 0 ;
size_t i = 0 ;
char * * ret = NULL ;
2020-12-01 11:21:32 +03:00
g_auto ( GStrv ) tmp = NULL ;
2019-07-13 19:51:56 +03:00
virCheckFlags ( VIR_CONNECT_LIST_NETWORKS_INACTIVE |
VIR_CONNECT_LIST_NETWORKS_ACTIVE |
VIR_CONNECT_LIST_NETWORKS_PERSISTENT ,
NULL ) ;
if ( ! priv - > conn | | virConnectIsAlive ( priv - > conn ) < = 0 )
return NULL ;
if ( ( nnets = virConnectListAllNetworks ( priv - > conn , & nets , flags ) ) < 0 )
return NULL ;
2020-09-14 17:24:44 +03:00
tmp = g_new0 ( char * , nnets + 1 ) ;
2019-07-13 19:51:56 +03:00
for ( i = 0 ; i < nnets ; i + + ) {
const char * name = virNetworkGetName ( nets [ i ] ) ;
2019-10-20 14:49:46 +03:00
tmp [ i ] = g_strdup ( name ) ;
2019-07-13 19:51:56 +03:00
}
2019-10-16 14:43:36 +03:00
ret = g_steal_pointer ( & tmp ) ;
2019-07-13 19:51:56 +03:00
for ( i = 0 ; i < nnets ; i + + )
2021-09-26 11:57:38 +03:00
virshNetworkFree ( nets [ i ] ) ;
2020-09-14 17:10:15 +03:00
g_free ( nets ) ;
2019-07-13 19:51:56 +03:00
return ret ;
}
char * *
2019-10-14 15:44:29 +03:00
virshNetworkEventNameCompleter ( vshControl * ctl G_GNUC_UNUSED ,
const vshCmd * cmd G_GNUC_UNUSED ,
2019-07-13 19:51:56 +03:00
unsigned int flags )
{
size_t i = 0 ;
2020-12-01 11:21:32 +03:00
g_auto ( GStrv ) tmp = NULL ;
2019-07-13 19:51:56 +03:00
virCheckFlags ( 0 , NULL ) ;
2020-09-14 17:24:44 +03:00
tmp = g_new0 ( char * , VIR_NETWORK_EVENT_ID_LAST + 1 ) ;
2019-07-13 19:51:56 +03:00
2019-10-20 14:49:46 +03:00
for ( i = 0 ; i < VIR_NETWORK_EVENT_ID_LAST ; i + + )
tmp [ i ] = g_strdup ( virshNetworkEventCallbacks [ i ] . name ) ;
2019-07-13 19:51:56 +03:00
2019-10-21 21:19:09 +03:00
return g_steal_pointer ( & tmp ) ;
2019-07-13 19:51:56 +03:00
}
char * *
virshNetworkPortUUIDCompleter ( vshControl * ctl ,
2019-10-14 15:44:29 +03:00
const vshCmd * cmd G_GNUC_UNUSED ,
2019-07-13 19:51:56 +03:00
unsigned int flags )
{
2021-03-11 10:16:13 +03:00
virshControl * priv = ctl - > privData ;
2019-07-13 19:51:56 +03:00
virNetworkPtr net = NULL ;
virNetworkPortPtr * ports = NULL ;
int nports = 0 ;
size_t i = 0 ;
char * * ret = NULL ;
virCheckFlags ( 0 , NULL ) ;
if ( ! priv - > conn | | virConnectIsAlive ( priv - > conn ) < = 0 )
return NULL ;
if ( ! ( net = virshCommandOptNetwork ( ctl , cmd , NULL ) ) )
2020-09-22 23:19:26 +03:00
return NULL ;
2019-07-13 19:51:56 +03:00
if ( ( nports = virNetworkListAllPorts ( net , & ports , flags ) ) < 0 )
return NULL ;
2020-09-14 17:24:44 +03:00
ret = g_new0 ( char * , nports + 1 ) ;
2019-07-13 19:51:56 +03:00
for ( i = 0 ; i < nports ; i + + ) {
char uuid [ VIR_UUID_STRING_BUFLEN ] ;
2019-10-20 14:49:46 +03:00
if ( virNetworkPortGetUUIDString ( ports [ i ] , uuid ) < 0 )
2019-07-13 19:51:56 +03:00
goto error ;
2019-10-20 14:49:46 +03:00
ret [ i ] = g_strdup ( uuid ) ;
2019-07-13 19:51:56 +03:00
virNetworkPortFree ( ports [ i ] ) ;
}
2020-09-14 17:10:15 +03:00
g_free ( ports ) ;
2019-07-13 19:51:56 +03:00
return ret ;
error :
for ( ; i < nports ; i + + )
virNetworkPortFree ( ports [ i ] ) ;
2020-09-14 17:10:15 +03:00
g_free ( ports ) ;
2019-07-13 19:51:56 +03:00
for ( i = 0 ; i < nports ; i + + )
2020-09-14 17:10:15 +03:00
g_free ( ret [ i ] ) ;
g_free ( ret ) ;
2019-07-13 19:51:56 +03:00
return NULL ;
}
2020-09-11 10:13:08 +03:00
char * *
virshNetworkUUIDCompleter ( vshControl * ctl ,
const vshCmd * cmd G_GNUC_UNUSED ,
unsigned int flags )
{
2021-03-11 10:16:13 +03:00
virshControl * priv = ctl - > privData ;
2020-09-11 10:13:08 +03:00
virNetworkPtr * nets = NULL ;
int nnets = 0 ;
size_t i = 0 ;
char * * ret = NULL ;
2020-12-01 11:21:32 +03:00
g_auto ( GStrv ) tmp = NULL ;
2020-09-11 10:13:08 +03:00
virCheckFlags ( 0 , NULL ) ;
if ( ! priv - > conn | | virConnectIsAlive ( priv - > conn ) < = 0 )
return NULL ;
if ( ( nnets = virConnectListAllNetworks ( priv - > conn , & nets , flags ) ) < 0 )
return NULL ;
2020-09-14 17:24:44 +03:00
tmp = g_new0 ( char * , nnets + 1 ) ;
2020-09-11 10:13:08 +03:00
for ( i = 0 ; i < nnets ; i + + ) {
char uuid [ VIR_UUID_STRING_BUFLEN ] ;
if ( virNetworkGetUUIDString ( nets [ i ] , uuid ) < 0 )
goto cleanup ;
tmp [ i ] = g_strdup ( uuid ) ;
}
ret = g_steal_pointer ( & tmp ) ;
cleanup :
for ( i = 0 ; i < nnets ; i + + )
2021-09-26 11:57:38 +03:00
virshNetworkFree ( nets [ i ] ) ;
2020-09-14 17:10:15 +03:00
g_free ( nets ) ;
2020-09-11 10:13:08 +03:00
return ret ;
}
2020-11-10 12:51:00 +03:00
char * *
virshNetworkDhcpMacCompleter ( vshControl * ctl ,
const vshCmd * cmd ,
unsigned int flags )
{
2021-03-11 10:16:13 +03:00
virshControl * priv = ctl - > privData ;
2020-11-10 12:51:00 +03:00
virNetworkDHCPLeasePtr * leases = NULL ;
2021-09-26 11:57:38 +03:00
g_autoptr ( virshNetwork ) network = NULL ;
2020-11-10 12:51:00 +03:00
int nleases ;
size_t i = 0 ;
char * * ret = NULL ;
2020-12-01 11:21:32 +03:00
g_auto ( GStrv ) tmp = NULL ;
2020-11-10 12:51:00 +03:00
virCheckFlags ( 0 , NULL ) ;
if ( ! priv - > conn | | virConnectIsAlive ( priv - > conn ) < = 0 )
return NULL ;
if ( ! ( network = virshCommandOptNetwork ( ctl , cmd , NULL ) ) )
return NULL ;
if ( ( nleases = virNetworkGetDHCPLeases ( network , NULL , & leases , flags ) ) < 0 )
goto cleanup ;
tmp = g_new0 ( char * , nleases + 1 ) ;
for ( i = 0 ; i < nleases ; i + + ) {
virNetworkDHCPLeasePtr lease = leases [ i ] ;
tmp [ i ] = g_strdup ( lease - > mac ) ;
}
ret = g_steal_pointer ( & tmp ) ;
cleanup :
if ( leases ) {
for ( i = 0 ; i < nleases ; i + + )
virNetworkDHCPLeaseFree ( leases [ i ] ) ;
VIR_FREE ( leases ) ;
}
return ret ;
}
2022-01-10 14:41:03 +03:00
char * *
virshNetworkUpdateCommandCompleter ( vshControl * ctl G_GNUC_UNUSED ,
const vshCmd * cmd G_GNUC_UNUSED ,
unsigned int flags )
{
char * * ret = NULL ;
size_t i ;
virCheckFlags ( 0 , NULL ) ;
ret = g_new0 ( char * , VIR_NETWORK_UPDATE_COMMAND_LAST + 1 ) ;
/* The first item in the enum is not accepted by virsh, But there's "add"
* which is accepted an is just an alias to " add-last " . */
ret [ 0 ] = g_strdup ( " add " ) ;
for ( i = 1 ; i < VIR_NETWORK_UPDATE_COMMAND_LAST ; i + + )
ret [ i ] = g_strdup ( virshNetworkUpdateCommandTypeToString ( i ) ) ;
return ret ;
}
2022-01-10 14:44:23 +03:00
char * *
virshNetworkUpdateSectionCompleter ( vshControl * ctl G_GNUC_UNUSED ,
const vshCmd * cmd G_GNUC_UNUSED ,
unsigned int flags )
{
char * * ret = NULL ;
size_t i ;
virCheckFlags ( 0 , NULL ) ;
ret = g_new0 ( char * , VIR_NETWORK_SECTION_LAST ) ;
/* The first item in the enum is not accepted by virsh. */
for ( i = 1 ; i < VIR_NETWORK_SECTION_LAST ; i + + )
ret [ i - 1 ] = g_strdup ( virshNetworkSectionTypeToString ( i ) ) ;
return ret ;
}