项目记录 -- 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等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分 ...
随机推荐
- DAY1敏捷冲刺
站立式会议 工作安排 (1)服务器配置 (2)数据库建表 (3)页面初步样式设计 (4)主要页面之间的交互 燃尽图 代码提交记录 感想 林一心:后端云服务器的配置确实是一个挑战,目前还在摸索中 赵意: ...
- Window命令行工具操作文件
1,cd 命令用来切换目录 2,mkdir用来创建文件夹 3,rmdir用来删除空文件夹 4,创建指定类型的文件 type nul>"文件名和后缀" 5,打开指定文件用sta ...
- 父类与子类的转换as,is
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 封装字符串的Format操作
相信即使再讨厌MFC的朋友也不会把厌恶牵扯到CString类上,而且CString现在也提升为ATL和MFC的共享类.用CString类,当然不能忘记它的Format方法,其用于格式化字符串.示例操作 ...
- html/css/javascript知识点集锦;完全小白开搞web编程
知识点集锦 1.在html模板的代码中会有下面一类: {% block title %} Blog entries {% endblock %}这里的 block 和 endblock 是神马? {% ...
- 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 ...
- 操作 使用XML的方法
XmlHelper是一个工具类 public static class XMLHelper { /// <summary> /// XML的编码方式,默认是UTF-8 /// </s ...
- BZOJ 3507 通配符匹配(贪心+hash或贪心+AC自动机)
首先可以对n个目标串单独进行处理. 对于每个目标串,考虑把模式串按'*'进行划分为cnt段.首尾两段一定得于原串进行匹配.剩下的cnt-2段尽量与最靠左的起点进行匹配. 对于剩下的cnt-2段.每段又 ...
- JS执行上下文(执行环境)详细图解
JS执行上下文(执行环境)详细图解 先随便放张图 我们在JS学习初期或者面试的时候常常会遇到考核变量提升的思考题.比如先来一个简单一点的. console.log(a); // 这里会打印出什么? v ...
- [洛谷4609] [FJOI2016]建筑师
题目描述 LOJ题面:https://loj.ac/problem/2173. 洛谷题面:https://www.luogu.org/problemnew/show/P4609. Solution [ ...