2015-07-06 19:30:18 +03:00
/*
* Copyright ( C ) 2011 - 2014 Red Hat , Inc .
*
* This file is part of LVM2 .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
* of the GNU General Public License v .2 .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2015-07-06 19:30:18 +03:00
*/
# include "tool.h"
2011-06-14 06:36:38 +04:00
# include "lvmetad-client.h"
2011-07-20 19:15:41 +04:00
# include "label.h"
# include "lvmcache.h"
# include "metadata.h"
2011-06-14 06:36:38 +04:00
2011-07-18 18:48:30 +04:00
const char * uuid1 = " abcd-efgh " ;
const char * uuid2 = " bbcd-efgh " ;
const char * vgid = " yada-yada " ;
2011-07-20 19:15:41 +04:00
const char * uuid3 = " cbcd-efgh " ;
2011-07-18 18:48:30 +04:00
const char * metadata2 = " { \n "
" id = \" yada-yada \" \n "
" seqno = 15 \n "
" status = [ \" READ \" , \" WRITE \" ] \n "
" flags = [] \n "
" extent_size = 8192 \n "
" physical_volumes { \n "
" pv0 { \n "
" id = \" abcd-efgh \" \n "
" } \n "
" pv1 { \n "
" id = \" bbcd-efgh \" \n "
" } \n "
2011-07-19 20:48:13 +04:00
" pv2 { \n "
" id = \" cbcd-efgh \" \n "
" } \n "
2011-07-18 18:48:30 +04:00
" } \n "
" } \n " ;
2011-07-20 19:15:41 +04:00
void _handle_reply ( daemon_reply reply ) {
2011-07-18 18:48:30 +04:00
const char * repl = daemon_reply_str ( reply , " response " , NULL ) ;
2011-07-20 19:15:41 +04:00
const char * status = daemon_reply_str ( reply , " status " , NULL ) ;
const char * vgid = daemon_reply_str ( reply , " vgid " , NULL ) ;
2011-07-18 18:48:30 +04:00
fprintf ( stderr , " [C] REPLY: %s \n " , repl ) ;
if ( ! strcmp ( repl , " failed " ) )
fprintf ( stderr , " [C] REASON: %s \n " , daemon_reply_str ( reply , " reason " , " unknown " ) ) ;
2011-07-20 19:15:41 +04:00
if ( vgid )
fprintf ( stderr , " [C] VGID: %s \n " , vgid ) ;
if ( status )
fprintf ( stderr , " [C] STATUS: %s \n " , status ) ;
2011-07-18 18:48:30 +04:00
daemon_reply_destroy ( reply ) ;
}
2011-07-20 19:15:41 +04:00
void _pv_add ( daemon_handle h , const char * uuid , const char * metadata )
{
daemon_reply reply = daemon_send_simple ( h , " pv_add " , " uuid = %s " , uuid ,
" metadata = %b " , metadata ,
NULL ) ;
_handle_reply ( reply ) ;
}
2011-07-18 18:48:30 +04:00
2011-07-20 19:15:41 +04:00
int scan ( daemon_handle h , char * fn ) {
struct device * dev = dev_cache_get ( fn , NULL ) ;
2011-07-18 18:48:30 +04:00
2011-07-20 19:15:41 +04:00
struct label * label ;
if ( ! label_read ( dev , & label , 0 ) ) {
fprintf ( stderr , " [C] no label found on %s \n " , fn ) ;
return ;
}
char uuid [ 64 ] ;
2016-05-31 10:56:10 +03:00
if ( ! id_write_format ( dev - > pvid , uuid , 64 ) ) {
fprintf ( stderr , " [C] Failed to format PV UUID for %s " , dev_name ( dev ) ) ;
return ;
}
2011-07-20 19:15:41 +04:00
fprintf ( stderr , " [C] found PV: %s \n " , uuid ) ;
struct lvmcache_info * info = ( struct lvmcache_info * ) label - > info ;
struct physical_volume pv = { 0 , } ;
if ( ! ( info - > fmt - > ops - > pv_read ( info - > fmt , dev_name ( dev ) , & pv , 0 ) ) ) {
fprintf ( stderr , " [C] Failed to read PV %s " , dev_name ( dev ) ) ;
return ;
}
struct format_instance_ctx fic ;
struct format_instance * fid = info - > fmt - > ops - > create_instance ( info - > fmt , & fic ) ;
struct metadata_area * mda ;
struct volume_group * vg = NULL ;
dm_list_iterate_items ( mda , & info - > mdas ) {
struct volume_group * this = mda - > ops - > vg_read ( fid , " " , mda ) ;
if ( this & & ! vg | | this - > seqno > vg - > seqno )
vg = this ;
}
if ( vg ) {
char * buf = NULL ;
/* TODO. This is not entirely correct, since export_vg_to_buffer
* adds trailing garbage to the buffer . We may need to use
* export_vg_to_config_tree and format the buffer ourselves . It
* does , however , work for now , since the garbage is well
* formatted and has no conflicting keys with the rest of the
* request . */
export_vg_to_buffer ( vg , & buf ) ;
daemon_reply reply =
daemon_send_simple ( h , " pv_add " , " uuid = %s " , uuid ,
" metadata = %b " , strchr ( buf , ' { ' ) ,
NULL ) ;
_handle_reply ( reply ) ;
}
}
void _dump_vg ( daemon_handle h , const char * uuid )
{
daemon_reply reply = daemon_send_simple ( h , " vg_by_uuid " , " uuid = %s " , uuid , NULL ) ;
2011-07-18 18:48:30 +04:00
fprintf ( stderr , " [C] reply buffer: %s \n " , reply . buffer ) ;
daemon_reply_destroy ( reply ) ;
2011-07-20 19:15:41 +04:00
}
int main ( int argc , char * * argv ) {
daemon_handle h = lvmetad_open ( ) ;
2014-11-29 00:31:51 +03:00
/* FIXME Missing error path */
2011-07-20 19:15:41 +04:00
if ( argc > 1 ) {
int i ;
2015-07-30 11:34:10 +03:00
struct cmd_context * cmd = create_toolcontext ( 0 , NULL , 0 , 0 , 1 , 1 ) ;
2011-07-20 19:15:41 +04:00
for ( i = 1 ; i < argc ; + + i ) {
const char * uuid = NULL ;
scan ( h , argv [ i ] ) ;
}
destroy_toolcontext ( cmd ) ;
2014-11-29 00:31:51 +03:00
/* FIXME Missing lvmetad_close() */
2011-07-20 19:15:41 +04:00
return 0 ;
}
_pv_add ( h , uuid1 , NULL ) ;
_pv_add ( h , uuid2 , metadata2 ) ;
_dump_vg ( h , vgid ) ;
_pv_add ( h , uuid3 , NULL ) ;
2011-07-18 18:48:30 +04:00
2014-11-29 00:31:51 +03:00
daemon_close ( h ) ; /* FIXME lvmetad_close? */
2011-06-14 06:36:38 +04:00
return 0 ;
}