我们先分析下analyze-local-images这个客户端,然后在下一篇文章中在分析Clair。这样我们可以很清楚的了解到,analyze-local-images向Clair发送了什么数据。

首先analyze-local-images定义了几个全局变量。代码如下。

const (postLayerURI        = "/v1/layers"getLayerFeaturesURI = "/v1/layers/%s?vulnerabilities"httpPort            = 9279
)var (flagEndpoint        = flag.String("endpoint", "http://127.0.0.1:6060", "Address to Clair API")flagMyAddress       = flag.String("my-address", "127.0.0.1", "Address from the point of view of Clair")flagMinimumSeverity = flag.String("minimum-severity", "Negligible", "Minimum severity of vulnerabilities to show (Unknown, Negligible, Low, Medium, High, Critical, Defcon1)")flagColorMode       = flag.String("color", "auto", "Colorize the output (always, auto, never)")
)

在使用analyze-local-images时,我们可以指定一些参数。

analyze-local-images -endpoint "http://10.28.182.152:6060" -my-address "10.28.182.151" nginx:latest

其中,endpoint为clair主机的ip地址。my-address为运行 analyze-local-images这个客户端的地址。

postLayerURI是向clair API V1发送数据库的路由,getLayerFeaturesURI是从clair API V1获取漏洞信息的路由。

analyze-local-images在主函数调用intMain()函数,而intMain会首先去解析用户的输入参数。例如刚才的endpoint。

func intMain() int {  //解析命令行参数,并给刚才定义的一些全局变量赋值。  ......  //创建一个临时目录  tmpPath, err := ioutil.TempDir("", "analyze-local-image-")  //在/tmp目录下创建以analyze-local-image-开头的文件夹。  //为了能够清楚的观察/tmp下目录的变化,我们将defer os.RemoveAll(tmpPath)这句注释掉,再重新编译。  ......  //调用AnalyzeLocalImage方法分析镜像  go func() {  analyzeCh <- AnalyzeLocalImage(imageName, minSeverity, *flagEndpoint, *flagMyAddress, tmpPath)  }()
}

程序执行流程是main()->intMain()->AnalyzeLocalImage()。现在我们跟进入AnalyzeLocalImage()

镜像被解压到tmp目录下的目录结构如下。

func AnalyzeLocalImage(imageName string, minSeverity database.Severity, endpoint, myAddress, tmpPath string) error {  //保存镜像到tmp目录下  //调用save方法  //save方法的原理就是使用docker save 镜像名先将镜像打包成tar文件  //然后使用tar命令将文件再解压到tmp文件中。  err := save(imageName, tmpPath)  .......  //调用historyFromManifest方法,读取manifest.json文件获取每一层的id名,保存在layerIDs中。  //如果从manifest.json文件中获取不到,则读取历史记录  layerIDs, err := historyFromManifest(tmpPath)  if err != nil {  layerIDs, err = historyFromCommand(imageName)  }  ......  //如果clair不在本机,则在analyze-local-images上开启HTTP服务,默认端口为9279  ......  //分析每一层,既将每一层下的layer.tar文件发送到clair服务端  err = analyzeLayer(endpoint, tmpPath+"/"+layerIDs[i]+"/layer.tar", layerIDs[i], layerIDs[i-1])  ......
}  

到这里,程序的执行流程是main()->intMain()->AnalyzeLocalImage()—>analyzeLayer()->getLayer()

func AnalyzeLocalImage(imageName string, minSeverity database.Severity, endpoint, myAddress, tmpPath string) error {......//获取漏洞信息layer, err := getLayer(endpoint, layerIDs[len(layerIDs)-1])//打印漏洞报告......for _, feature := range layer.Features {if len(feature.Vulnerabilities) > 0 {for _, vulnerability := range feature.Vulnerabilities {severity := database.Severity(vulnerability.Severity)isSafe = falseif minSeverity.Compare(severity) > 0 {continue}hasVisibleVulnerabilities = truevulnerabilities = append(vulnerabilities, vulnerabilityInfo{vulnerability, feature, severity})}}}//排序输出报告美化.....}

通过源码分析可知,与clair后端进行交换的两个主要方法为analyzeLayer和getLayer。analyzeLayer向clair发送JSON格式的数据。而getLayer用来获取clair的请求。并将json格式数据解码后格式化输出。

至此,对analyze-local-images的源码已经分析完毕。从中可以可以看出。analyze-local-images做的事情很简单。

就是将layer.tar发送给clair。并将clair分析后的结果通过API接口获取到并在本地打印。那么下一篇文章,我们就深入剖析下clair的源码。

《Clair二次开发指南2——analyze-local-images源码剖析》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. layui横向时间线_炒股一生只买一种股票:股价K线形成这样后,必然有一波拉升...
  2. Linux——Ubuntu安装Fcitx以及Fcitx输入中文不显示候选词框的解决办法
  3. 《iOS应用软件设计之道》—— 2.5 何时画草图
  4. 怎么把GMS的软件转到HMS
  5. dederss.php美国与,dedecms添加rss订阅功能实现代码
  6. Java中常见流的分类及简单讲解
  7. 深度学习画图软件收集
  8. python参考手册小说_-精选版python 中文手册.pdf
  9. 计算机学生英语面试自我介绍ppt,大学生英语自我介绍ppt.doc
  10. Mac苹果电脑怎么调整磁盘区域的大小
  11. Android学习笔记-转载SQLite
  12. ajax执行先后顺序
  13. 基于JavaWeb的新闻发布管理系统设计与实现
  14. 自动关机及取消代码,bat文件代码
  15. 微博“超话”幻灭之后
  16. java object数组转list_java 如何将ListObject[]转换成List实体?
  17. 2022年广东省安全员A证第三批(主要负责人)考试题模拟考试题库模拟考试平台操作
  18. (转)用户调研必修:如何建立用户体验地图
  19. 简述信息系统安全设计要考虑的几个层面,每个层面可能存在的安全威胁及其应对措施
  20. Python绘制甘特图

热门文章

  1. 地形图加密高程点的两种方法CAD和ARCGIS
  2. php 下载脱离服务器,php 自动下载远程服务器文件
  3. Heapster源码编译,并制作heapster镜像
  4. php纯文字游戏源码,PHP文字游戏源码天空之城ol(1)
  5. 复旦大学桂韬:当NLP邂逅Social Media--构建计算机与网络语言的桥梁
  6. Hello Django--01
  7. 软件测试的流程是什么?软件测试的基本流程
  8. 使用doc4j生成word文档
  9. npm adduser 和 npm publish 的踩坑
  10. 零信任|IAM是基于动态身份的安全新边界