项目记录 -- 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等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分 ...
随机推荐
- 全面了解 Nginx 到底能做什么
来源:https://www.jianshu.com/p/8bf73d1a758c 前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可 ...
- MenuStrip的自动显示
/// <summary> /// 主界面接受F11时,显示菜单 /// 通过改写Form的ProcessCmdKey实现 /// </summary> /// <par ...
- VS05错误:部署WEB文件失败
直接生成一个空项目就不存在这个问题了.
- BZOJ 1407 Savage(拓展欧几里得)
这题的时间复杂度真玄学... O(m*n^2).1e8也能过啊... 首先题目保证m<=1e6. 这启发我们枚举或者二分答案? 但是答案不满足单调性,考虑从小到大枚举m. 对于每一个m,枚举两个 ...
- Python高级数据类型模块collections
collections模块提供更加高级的容器数据类型,替代Python的内置dict,list, set,和tuple Counter对象 提供计数器,支持方便和快速的计数.返回的是一个以元素为键, ...
- 【题解】Atcoder ARC#85 E-MUL
……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...
- 【刷题】BZOJ 4259 残缺的字符串
Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同 ...
- UVA.11384 Help is needed for Dexter (思维题)
UVA.11384 Help is needed for Dexter (思维题) 题意分析 同样水题一道,这回思路对了. 给出数字n,面对一个1,2,3,4--n的数字序列,你可以对他们的部分或者全 ...
- 【枚举暴力】【UVA11464】 Even Parity
传送门 Description 给你一个0/1矩阵,可以将矩阵中的0变成1,问最少经过多少此操作使得矩阵任意一元素四周的元素和为偶数. Input 第一行是一个整数T代表数据组数,每组数据包含以下内容 ...
- 基于MeanShift的目标跟踪算法及实现
这次将介绍基于MeanShift的目标跟踪算法,首先谈谈简介,然后给出算法实现流程,最后实现了一个单目标跟踪的MeanShift算法[matlab/c两个版本] csdn贴公式比较烦,原谅我直接截图了 ...