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. DAY1敏捷冲刺

    站立式会议 工作安排 (1)服务器配置 (2)数据库建表 (3)页面初步样式设计 (4)主要页面之间的交互 燃尽图 代码提交记录 感想 林一心:后端云服务器的配置确实是一个挑战,目前还在摸索中 赵意: ...

  2. Window命令行工具操作文件

    1,cd 命令用来切换目录 2,mkdir用来创建文件夹 3,rmdir用来删除空文件夹 4,创建指定类型的文件 type nul>"文件名和后缀" 5,打开指定文件用sta ...

  3. 父类与子类的转换as,is

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 封装字符串的Format操作

    相信即使再讨厌MFC的朋友也不会把厌恶牵扯到CString类上,而且CString现在也提升为ATL和MFC的共享类.用CString类,当然不能忘记它的Format方法,其用于格式化字符串.示例操作 ...

  5. html/css/javascript知识点集锦;完全小白开搞web编程

    知识点集锦 1.在html模板的代码中会有下面一类: {% block title %} Blog entries {% endblock %}这里的 block 和 endblock 是神马? {% ...

  6. Android studio出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"的解决办法

    最近更新了一下Android Studio(下文简写成AS),然后打开工程发现出现Error:Unable to tunnel through proxy. Proxy returns "H ...

  7. 操作 使用XML的方法

    XmlHelper是一个工具类 public static class XMLHelper { /// <summary> /// XML的编码方式,默认是UTF-8 /// </s ...

  8. BZOJ 3507 通配符匹配(贪心+hash或贪心+AC自动机)

    首先可以对n个目标串单独进行处理. 对于每个目标串,考虑把模式串按'*'进行划分为cnt段.首尾两段一定得于原串进行匹配.剩下的cnt-2段尽量与最靠左的起点进行匹配. 对于剩下的cnt-2段.每段又 ...

  9. JS执行上下文(执行环境)详细图解

    JS执行上下文(执行环境)详细图解 先随便放张图 我们在JS学习初期或者面试的时候常常会遇到考核变量提升的思考题.比如先来一个简单一点的. console.log(a); // 这里会打印出什么? v ...

  10. [洛谷4609] [FJOI2016]建筑师

    题目描述 LOJ题面:https://loj.ac/problem/2173. 洛谷题面:https://www.luogu.org/problemnew/show/P4609. Solution [ ...