项目记录 -- zfs get all [volume] python实现的数据构造
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实现的数据构造的更多相关文章
- IOS客户端Coding项目记录导航
IOS客户端Coding项目记录(一) a:UITextField设置出现清除按键 b:绘画一条下划线 表格一些设置 c:可以定义表头跟底部视图(代码接上面) d:隐藏本页的导航栏 e:UIEdge ...
- Unity Project Wizard (最近打开的项目记录)
最近打开工程列表 当用Unity打开过的项目越来越多之后,在最近打开项目记录框中就会变的很长,那么如何才能删除最近打开的记录呢? Unity4.x最近打开的工程记录 Unity5.x最近打开的工程记录 ...
- jenkins构建项目记录2(tag)
与jenkins构建项目记录1不同的是通过tag拉去对应版本代码 1.先安装创建(git parameter) 2.general设置 name可任意命名,下面源码管理设置时变量会引用到. 3.源码管 ...
- Linux下部署docker记录(1)-Volume使用
之前部署了Linux下部署docker记录(0)-基础环境安装,接下来看看Docker Volume的使用. Docker volume使用1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文 ...
- 2.3 Hive的数据类型讲解及实际项目中如何使用python脚本对数据进行ETL
一.hive Data Types https://cwiki. apache. org/confluence/display/HiveLanguageManual+Types Numeric Typ ...
- 用Python浅析股票数据
用Python浅析股票数据 本文将使用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系,最后使用移动平均线方法初探投资策略. 数据导入 这里将股票数据存储在stockData ...
- python 手机App数据抓取实战二抖音用户的抓取
前言 什么?你问我国庆七天假期干了什么?说出来你可能不信,我爬取了cxk坤坤的抖音粉丝数据,我也不知道我为什么这么无聊. 本文主要记录如何使用appium自动化工具实现抖音App模拟滑动,然后分析数据 ...
- 通过Python将监控数据由influxdb写入到MySQL
一.项目背景 我们知道InfluxDB是最受欢迎的时序数据库(TSDB).InfluxDB具有 持续高并发写入.无更新:数据压缩存储:低查询延时 的特点.从下面这个权威的统计图中,就可以看出Influ ...
- Spark大型项目实战:电商用户行为分析大数据平台
本项目主要讲解了一套应用于互联网电商企业中,使用Java.Spark等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分 ...
随机推荐
- PHP给图片添加图片水印
涉及到的函数: 1.file_get_contents():用于将文件的内容读入到一个字符串中的首选方法.如果操作系统支持,还会使用内存映射技术来增强性能. 2.list():list() 函数用于在 ...
- 关于new delete的说明
1. 删除空指针不会有问题,因为C++的标准规定在delete时首先会判断指针是否为空,为空就不再处理,所以也就不会有问题. 2. delete一个非空指针之后,并不会将该指针自动置为空.此时如果重复 ...
- BZOJ4871 Shoi2017摧毁“树状图”(树形dp)
设f[i][0/1/2/3/4/5]表示i子树中选一条链不包含根/i子树中选一条链包含根但不能继续向上延伸/i子树中选一条链可以继续向上延伸/选两条链不包含根/选两条链包含根但不能继续向上延伸/选两条 ...
- 廖雪峰老师Python教程读后笔记
廖老师网站:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 花几天时间看了廖老师的 ...
- 具体数学二项式至生成函数章-----致敬Kunth
关于标题取得这么奇怪.因为在具体数学中.这两章是分开叙述的.并且分别叙述得淋漓尽致! 我只参悟其中关于生成函数的一小部分内容(暂时于我够用了.) 提二项式系数之前不得不提组合数.以往在高中用的是符号C ...
- 【题解】HNOI2016序列
也想了有半天,没有做出来……实际上做法确实也是十分精妙的.这里推荐一个blog,个人认为这位博主讲得挺好了:Sengxian's Blog; 感觉启示是:首先要加强对莫队算法 & ST表的熟练 ...
- bzoj 1037: [ZJOI2008]生日聚会Party (dp)
dp,但是要顺推容易点 const mm=; var f:..,..,..,..]of longint; n,m,kk,now,sum,i,j,k1,k2:longint; function max( ...
- POJ 2774 求两个串的最长公共前缀 | 后缀数组
#include<cstdio> #include<algorithm> #include<cstring> #define N 200005 using name ...
- BZOJ2924 [Poi1998]Flat broken lines 【Dilworth定理 + 树状数组】
题目链接 BZOJ2924 题解 题面有误..是\(45°\) 如果两个点间连线与\(x\)轴夹角在\(45°\)以内,那么它们之间连边 求最小路径覆盖 = 最长反链 由于\(45°\)比较难搞,我们 ...
- Linux实验二
一 第一个实验 Linux基础 1 通过娄老师关于分析学霸学渣的前言 明白了真正的学习一门功课应该是思考本质 而不是纯属记忆 2 全部的命令如下 Linux命令格式:command [o ...