zfs get all [volume]命令实现中构造数据结构

一、zfs get all [volume]命令源代码C实现中用到的数据结构有zprop_get_cbdata 和 callback_data,如下所示:

  typedef struct zprop_get_cbdata {
int cb_sources;
zfs_get_column_t cb_columns[ZFS_GET_NCOLS];
int cb_colwidths[ZFS_GET_NCOLS + ];
boolean_t cb_scripted;
boolean_t cb_literal;
boolean_t cb_first;
zprop_list_t *cb_proplist;
zfs_type_t cb_type;
} zprop_get_cbdata_t;

zprop_get_cbdata结构中主要用到的部分为zprop_list_t *cb_proplist;zfs_type_t cb_type;

  typedef struct callback_data {
uu_avl_t *cb_avl;
int cb_flags;
zfs_type_t cb_types;
zfs_sort_column_t *cb_sortcol;
zprop_list_t **cb_proplist;
int cb_depth_limit;
int cb_depth;
uint8_t cb_props_table[ZFS_NUM_PROPS];
} callback_data_t;

callback_data结构中主要用到的部分为cb_props_table[ZFS_NUM_PROPS]

二、设计的python数据结构

     props_list = POINTER(zprop_list_t)()
props_table = (c_ubyte * ZFS_NUM_PROPS)()
props_table[:] = [B_TRUE] * ZFS_NUM_PROPS props_reslist = dict()
iter_data = dict()
iter_data['props_list'] = props_list
iter_data['props_table'] = props_table
iter_data['props_reslist'] = props_reslist
iter_data['zfs_type'] = ZFS_TYPE_VOLUME

iter_data为构造的python数据结构,说明如下:

1.props_table = (c_ubyte * ZFS_NUM_PROPS)()  -- 类型定义

props_table[:] = [B_TRUE] * ZFS_NUM_PROPS  -- 初始化

iter_data['props_table'] = props_table

以上对应的为:uint8_t cb_props_table[ZFS_NUM_PROPS];

2. iter_data['zfs_type'] = ZFS_TYPE_VOLUME

以上对应的为:zfs_type_t cb_type;

3. props_list = POINTER(zprop_list_t)()

iter_data['props_list'] = props_list

以上对应的为:zprop_list_t *cb_proplist;

4.iter_data['props_reslist'] = props_reslist

用于存放数据(dict 属性值),用作返回

三、整体代码如下:

 def py_iter_zfs_list(zhp, arg):

     iter_data = arg.value

     props_reslist = iter_data['props_reslist']
props_list = iter_data['props_list']
props_table = iter_data['props_table']
zfs_type = iter_data['zfs_type']
cur_type = libzfs.zfs_get_type(zhp) CBFUNC = CFUNCTYPE(c_int, c_void_p, c_void_p)
iter_zfs = CBFUNC(py_iter_zfs_list) user_props = nvlist_p() if cur_type & zfs_type:
libzfs.zfs_prune_proplist(zhp, props_table)
libzfs.zfs_expand_proplist(zhp, byref(props_list), 0, 0) prop = create_string_buffer(ZFS_MAXPROPLEN)
strval = c_char_p()
userprops = libzfs.zfs_get_user_props(zhp)
propval = nvlist_p()
sourcetype = c_int()
libzfs.zfs_prop_to_name.restype = c_char_p while props_list:
pn = props_list.contents
propname = '-'
propstr = '-' if pn.pl_prop != ZPROP_INVAL:
if libzfs.zfs_prop_get(zhp, pn.pl_prop, prop, \
ZFS_MAXPROPLEN, 0, 0, 0, B_FALSE) != 0:
if pn.pl_all :
props_list = cast(pn.pl_next, POINTER(zprop_list_t))
continue
if libzfs.zfs_prop_valid_for_type(pn.pl_prop, \
ZFS_TYPE_VOLUME) :
props_list = cast(pn.pl_next, POINTER(zprop_list_t))
continue
propstr = '-'
else:
propstr = prop.value.decode()
propname = libzfs.zfs_prop_to_name(pn.pl_prop).decode()
elif libzfs.zfs_prop_userquota(pn.pl_user_prop) :
if libzfs.zfs_prop_get_userquota(zhp, pn.pl_user_prop, \
prop, ZFS_MAXPROPLEN, B_FALSE) == 0:
propstr = prop.value.decode()
else:
propstr = '-'
propname = pn.pl_user_prop.decode()
elif libzfs.zfs_prop_written(pn.pl_user_prop) :
if libzfs.zfs_prop_get_written(zhp, pn.pl_user_prop, \
prop, ZFS_MAXPROPLEN, B_FALSE) == 0:
propstr = prop.value.decode()
else:
propstr = '-'
propname = pn.pl_user_prop.decode()
else:
if lbnvpair.nvlist_lookup_nvlist(user_props, pn.pl_user_prop, \
byref(propval)) != 0 :
if pn.pl_all :
props_list = cast(pn.pl_next, POINTER(zprop_list_t))
continue
propstr = '-'
else :
lbnvpair.nvlist_lookup_string(propval, \
ZPROP_VALUE, byref(strval))
propstr = strval.value.decode()
propname = pn.pl_user_prop.decode()
props_reslist.update({propname:propstr})
props_list = cast(pn.pl_next, POINTER(zprop_list_t)) libzfs.zfs_close(zhp)
return 0 def zvol_get_all_props(name):
ret = [0, '']
props_list = POINTER(zprop_list_t)()
props_table = (c_ubyte * ZFS_NUM_PROPS)()
props_table[:] = [B_TRUE] * ZFS_NUM_PROPS props_reslist = dict()
iter_data = dict()
iter_data['props_list'] = props_list
iter_data['props_table'] = props_table
iter_data['props_reslist'] = props_reslist
iter_data['zfs_type'] = ZFS_TYPE_VOLUME g_zfs = libzfs.libzfs_init()
libzfs.libzfs_error_description.restype = c_char_p zhp = libzfs.zfs_path_to_zhandle(g_zfs, \
bytes(name, encoding='ascii'), ZFS_TYPE_VOLUME) if not zhp:
ret[0] = libzfs.libzfs_errno(g_zfs)
ret[1] = libzfs.libzfs_error_description(g_zfs).decode()
return None libzfs.zprop_free_list(iter_data['props_list'])
py_iter_zfs_list(zhp, py_object(iter_data)) libzfs.libzfs_fini(g_zfs)
return props_reslist

代码说明:

1.构造数据调用的方法:

py_iter_zfs_list(zhp, py_object(iter_data))

def py_iter_zfs_list(zhp, arg):

  iter_data = arg.value

												

项目记录 -- zfs get all [volume] python实现的数据构造的更多相关文章

  1. IOS客户端Coding项目记录导航

    IOS客户端Coding项目记录(一) a:UITextField设置出现清除按键 b:绘画一条下划线  表格一些设置 c:可以定义表头跟底部视图(代码接上面) d:隐藏本页的导航栏 e:UIEdge ...

  2. Unity Project Wizard (最近打开的项目记录)

    最近打开工程列表 当用Unity打开过的项目越来越多之后,在最近打开项目记录框中就会变的很长,那么如何才能删除最近打开的记录呢? Unity4.x最近打开的工程记录 Unity5.x最近打开的工程记录 ...

  3. jenkins构建项目记录2(tag)

    与jenkins构建项目记录1不同的是通过tag拉去对应版本代码 1.先安装创建(git parameter) 2.general设置 name可任意命名,下面源码管理设置时变量会引用到. 3.源码管 ...

  4. Linux下部署docker记录(1)-Volume使用

    之前部署了Linux下部署docker记录(0)-基础环境安装,接下来看看Docker Volume的使用. Docker volume使用1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文 ...

  5. 2.3 Hive的数据类型讲解及实际项目中如何使用python脚本对数据进行ETL

    一.hive Data Types https://cwiki. apache. org/confluence/display/HiveLanguageManual+Types Numeric Typ ...

  6. 用Python浅析股票数据

    用Python浅析股票数据 本文将使用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系,最后使用移动平均线方法初探投资策略. 数据导入 这里将股票数据存储在stockData ...

  7. python 手机App数据抓取实战二抖音用户的抓取

    前言 什么?你问我国庆七天假期干了什么?说出来你可能不信,我爬取了cxk坤坤的抖音粉丝数据,我也不知道我为什么这么无聊. 本文主要记录如何使用appium自动化工具实现抖音App模拟滑动,然后分析数据 ...

  8. 通过Python将监控数据由influxdb写入到MySQL

    一.项目背景 我们知道InfluxDB是最受欢迎的时序数据库(TSDB).InfluxDB具有 持续高并发写入.无更新:数据压缩存储:低查询延时 的特点.从下面这个权威的统计图中,就可以看出Influ ...

  9. Spark大型项目实战:电商用户行为分析大数据平台

    本项目主要讲解了一套应用于互联网电商企业中,使用Java.Spark等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分 ...

随机推荐

  1. PHP给图片添加图片水印

    涉及到的函数: 1.file_get_contents():用于将文件的内容读入到一个字符串中的首选方法.如果操作系统支持,还会使用内存映射技术来增强性能. 2.list():list() 函数用于在 ...

  2. 关于new delete的说明

    1. 删除空指针不会有问题,因为C++的标准规定在delete时首先会判断指针是否为空,为空就不再处理,所以也就不会有问题. 2. delete一个非空指针之后,并不会将该指针自动置为空.此时如果重复 ...

  3. BZOJ4871 Shoi2017摧毁“树状图”(树形dp)

    设f[i][0/1/2/3/4/5]表示i子树中选一条链不包含根/i子树中选一条链包含根但不能继续向上延伸/i子树中选一条链可以继续向上延伸/选两条链不包含根/选两条链包含根但不能继续向上延伸/选两条 ...

  4. 廖雪峰老师Python教程读后笔记

    廖老师网站:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 花几天时间看了廖老师的 ...

  5. 具体数学二项式至生成函数章-----致敬Kunth

    关于标题取得这么奇怪.因为在具体数学中.这两章是分开叙述的.并且分别叙述得淋漓尽致! 我只参悟其中关于生成函数的一小部分内容(暂时于我够用了.) 提二项式系数之前不得不提组合数.以往在高中用的是符号C ...

  6. 【题解】HNOI2016序列

    也想了有半天,没有做出来……实际上做法确实也是十分精妙的.这里推荐一个blog,个人认为这位博主讲得挺好了:Sengxian's Blog; 感觉启示是:首先要加强对莫队算法 & ST表的熟练 ...

  7. bzoj 1037: [ZJOI2008]生日聚会Party (dp)

    dp,但是要顺推容易点 const mm=; var f:..,..,..,..]of longint; n,m,kk,now,sum,i,j,k1,k2:longint; function max( ...

  8. POJ 2774 求两个串的最长公共前缀 | 后缀数组

    #include<cstdio> #include<algorithm> #include<cstring> #define N 200005 using name ...

  9. BZOJ2924 [Poi1998]Flat broken lines 【Dilworth定理 + 树状数组】

    题目链接 BZOJ2924 题解 题面有误..是\(45°\) 如果两个点间连线与\(x\)轴夹角在\(45°\)以内,那么它们之间连边 求最小路径覆盖 = 最长反链 由于\(45°\)比较难搞,我们 ...

  10. Linux实验二

    一        第一个实验 Linux基础 1 通过娄老师关于分析学霸学渣的前言 明白了真正的学习一门功课应该是思考本质 而不是纯属记忆 2 全部的命令如下 Linux命令格式:command [o ...