cryptDB安装分析
cryptDB的安装脚步是用ruby语言写的,由于这里对ruby语言不熟悉,只能做简答的分析。我们先看看cryptDB的目录结构。
主要的目录有bins、doc、main、udf目录,下面我们通过分析其安装脚步来看cryptDB到底干了什么。
一、安装
在script目录下有个install.rb文件,cryptDB是通过该文件进行安装的,在安装时执行以下命令即可(注意cryptDB是安装的Ubutun13.0.4上的)
- install.rb cryptDB的路径名
#!/usr/bin/env ruby require 'etc'
require 'fileutils' $usage =
"Usage: ./install <path-to-cryptdb> [automake-version] [gcc-version]" SHADOW_NAME = "shadow"
PROXY_NAME = "proxy-src"
MYSQL_NAME = "mysql-src"
TAR_GZ = ".tar.gz" class String
def cyan
"\033[36m#{self}\033[0m"
end def red
"\033[31m#{self}\033[0m"
end def bold
"\033[1m#{self}\033[22m"
end
end # NOTE: For whatever reason we fail to get the correct exit code when
# apt-get fails; and execution continues per-normal.
def get_pkgs
p_puts "Retrieving packages..." pkg_shell = ShellDoer.new("~")
pkg_shell.>(%q{
sudo apt-get install gawk liblua5.1-0-dev libntl-dev \
libmysqlclient-dev libssl-dev libbsd-dev \
libevent-dev libglib2.0-dev libgmp-dev \
mysql-server libaio-dev automake \
gtk-doc-tools flex cmake libncurses5-dev \
bison g++ make
})
end def fn(cdb_path, in_make_v=nil, in_gcc_v=nil)
cryptdb_path = File.expand_path(cdb_path)
cryptdb_shell = ShellDoer.new(cryptdb_path)
bins_path = File.join(cryptdb_path, "bins/") #############################
# mysql-proxy
# ###########################
# + automake fixups.
p_puts "Checking automake..." automake_version =
if in_make_v
in_make_v
else
first_line_version(%x(automake --version))
end if automake_version.nil?
fail no_version_fail("automake")
end p_puts "Building mysql-proxy..." # untar
proxy_path = File.join(cryptdb_path, PROXY_NAME)
proxy_tar_path = File.join(bins_path, PROXY_NAME) + TAR_GZ
cryptdb_shell.>("rm -rf #{proxy_path}")
cryptdb_shell.>("tar zxf #{proxy_tar_path}") mp_shell = ShellDoer.new(proxy_path)
proxy_install_path = File.join(bins_path, "proxy-bin")
mp_shell.>("./autogen.sh")
mp_shell.>("./configure --enable-maintainer-mode --with-lua=lua5.1 --prefix=\"#{proxy_install_path}\"")
mp_shell.>("make")
mp_shell.>("make install")
mp_shell.>("rm -rf #{proxy_path}") #############################
# gcc
#############################
p_puts "Checking gcc..." gcc_version =
if in_gcc_v
in_gcc_v
else
first_line_version(%x(gcc --version))
end if gcc_version.nil?
fail no_version_fail("gcc")
end if Version.new(gcc_version) < Version.new("4.6")
fail("update your gcc version to >= 4.6 before installing!")
end #############################
# mysql
#############################
p_puts "Building mysql..." # untar
mysql_path = File.join(cryptdb_path, MYSQL_NAME)
mysql_tar_path = File.join(bins_path, MYSQL_NAME) + TAR_GZ
cryptdb_shell.>("rm -rf #{mysql_path}")
cryptdb_shell.>("tar zxf #{mysql_tar_path}") mysql_build_path = File.join(mysql_path, "/build")
Dir.mkdir(mysql_build_path) if false == File.exists?(mysql_build_path) mysql_shell = ShellDoer.new(mysql_build_path)
mysql_shell.>("cmake -DWITH_EMBEDDED_SERVER=on -DENABLE_DTRACE=off ..")
mysql_shell.>("make") #############################
# cryptdb
#############################
p_puts "Building cryptdb..." conf_path = File.join(cryptdb_path, "conf", "config.mk")
File.open(conf_path, 'w') do |file|
file.write(generate_config(mysql_path))
end
cryptdb_shell.>("make clean")
cryptdb_shell.>("make")
cryptdb_shell.>("service mysql stop", true)
cryptdb_shell.>("make install")
cryptdb_shell.>("service mysql start") shadow_path = File.join(cryptdb_path, SHADOW_NAME)
cryptdb_shell.>("rm -rf #{shadow_path}")
cryptdb_shell.>("mkdir #{shadow_path}") # Give the user access to all the stuff we created.
cryptdb_shell.>("chown -R #{Etc.getlogin} #{cryptdb_path}") # remind the user about EDBDIR
p_puts "You must do: export EDBDIR=/full/path/to/cryptdb/ before running cryptdb; we recommend putting it into your .bashrc"
end class ShellDoer
def initialize(dir)
@dir = dir
end def >(cmd, ignore=false)
pretty_execute(cmd, ignore)
end private
def pretty_execute(cmd, ignore)
%x(cd #{@dir} && #{cmd.strip} 1>&2)
if $?.exitstatus != 0 && false == ignore
fail "`#{cmd}` failed".red.bold
end
end
end def no_version_fail(name)
"unable to determine #{name} version, supply version # thru command line argument.\n#{$usage}\n"
end def first_line_version(text)
/([0-9]+\.[0-9]+(?:\.[0-9]+)?)/.match(text.split("\n").first)[0]
end # > Version numbers must have at least 1 number.
# > Only numbers and 'dot' are valid.
class Version < Array
def initialize(s)
if s.empty?
fail "empty strings are not version numbers!"
end parsed = parse_version(s)
if parsed.empty?
fail "unable to parse '#{s}' as version number"
end
super(parsed)
end def >=(v2)
fail "versions only compare with versions" if !v2.is_a?(Version)
m = [self.size, v2.size].max
(pad(self, m) <=> pad(v2, m)) >= 0
end def <(v2)
fail "versions only compare with versions" if !v2.is_a?(Version)
m = [self.size, v2.size].max
(pad(self, m) <=> pad(v2, m)) < 0
end private
def pad(a, size)
return a if size < a.size
a + [0] * (size - a.size)
end def parse_version(v)
v.scan(/([0-9]+)\.?/).map(&:first).map(&:to_i)
end
end def p_puts(output_me)
puts output_me.cyan.bold
end def generate_config(mysql_path)
["MYSRC := #{mysql_path}",
"MYBUILD := $(MYSRC)/build",
"RPATH := 1",
"",
"## To enable debugging:",
"# CXXFLAGS += -g",
"",
"## To use a different compiler:",
"# CXX := g++-4.6",
"",
"## Where UDFs go:",
"MYSQL_PLUGIN_DIR := /usr/lib/mysql/plugin"].join("\n")
end def test_version
pairs = [["1.1", "1.3"],
["1.5", "2.5"],
["1.12.2", "2.3"],
["", "8.9"],
["1.0.0.1", "1.1"],
["3.4.5", "4.5.2"],
["2.0", "5.1.0.0"],
["0.1", "0.1.0.0.2"],
["", "0.1"]] pairs.inject(true) do |acc, (low, high)|
Version.new(low) < Version.new(high) &&
Version.new(high) >= Version.new(low) &&
acc
end
end def root?
if 0 != Process.uid
fail "root required to install dependencies and UDFs".red.bold
end
end #############################
#############################
# Execution Begins Here
#############################
#############################
if ARGV.size() < 1 || ARGV.size() > 3
fail $usage
end root?()
get_pkgs()
fn(ARGV[0], ARGV[1], ARGV[2]) #TODO: add restart of Mysql server after UDF updates
从注释中可以看出安装的顺序是mysql-proxy(这是一个mysql的代理软件,开源),gcc版本检查、mysql编译(这里不安装,因为需要用到其中的库)、最后是cryptdb的编译和安装。
二、mysql-proxy安装
mysql-proxy只是一个代理软件,而cryptDB是在该代理软件上做的开发,关于该代理软件可自行百度或google。从安装脚步中可以大概看出,通过我们传入的cryptDB的路径名来获取mysql-proxy.src.tar.gz位置,然后对其进行解压并安装到/full/path/to/cryptDB/bins/proxy-bin目录下
三、GCC版本检查
GCC的版本必须大于等于4.6
四、mysql的编译
mysql的源代码和mysql-proxy源代码都放在bins目录下,将mysql的源代码解压的/full/path/to/cryptdb/mysql-src/build下,然后执行make进行编译。
五、cryptdb编译
在编译cryptdb时,直接在其主目录下进行编译。/full/path/to/cryptdb/下执行make、service mysql stop、make install、service mysql start一些列命令就可以完成cryptDB的安装了。
六、运行
其实是在运行mysql-proxy代理软件,为我们的加密服务则在wrapper.lua文件中,关于mysql-proxy的简单使用可参考
http://www.cnblogs.com/itech/archive/2011/09/22/2185365.html
cryptDB安装分析的更多相关文章
- MONO 安装 分析
你是安装在/etc下的吧? 5.2是没有serverbusy的提示的,那时,它就傻等,给人造成down的假像.而现在的版本,会提示的. 你升级时,upgrade后边加参数了吗? 加了 /etc/jw ...
- Android中应用安装分析
#1 安装方式 1 安装系统APK和预制APK时,通过PMS的构造函数中安装,即第一次开机时安装应用,没有安装界面. 2 网络下载安装,通过应用商店等,即调用PackageManager.instal ...
- oracle安装分析
oracle的安装 1.下载Oracle 11g 2.解压两个压缩包到同一目录(内容合并),即"database",然后单击解压目录下的"setup.exe"文 ...
- 企业内部从零开始安装docker hadoop 提纲
下载apache 项目 http://mirror.bit.edu.cn/apache/ 下载 centos 7 安装 盘 iso 大约7G 安装 centos7 copy 光盘盘中的 packag ...
- 安装windows操作系统
我认为windows安装有两种源文件,一种是ghost(.gho),一种是安装包(setup.exe). ghost安装是把将一个硬盘中的数据(.gho)完全相同地恢复到系统硬盘中.优点是速度快,而且 ...
- Android/Linux boot time分析优化
如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...
- CounterBreach安装测试的全部过程
CounterBreach安装测试的全部过程 1安装数据库审计的网关 Admin进入 Impcfg初始化 选择网关 是否替换另一个网关? 否 是否改变默认管理口 设置管理口地址 192.168.1.2 ...
- 利用C#查看特定服务是否安装
需求:想通过C#代码来查看IIS服务或者MSMQ是否已经安装 分析:IIS服务和MSMQ安装完成后都会创建windows服务,所以我们只需要查看对应的服务是否存在即可. 准备工作: IIS服务名称:W ...
- JVM内存溢出分析java.lang.OutOfMemoryError: Java heap space
JVM内存溢出查询java.lang.OutOfMemoryError: Java heap space查出具体原因分为几个预备步骤 1.在运行java程序是必须设置jvm -XX:+HeapDump ...
随机推荐
- Backbone模型
现在进入最关键的组件 - 模型.模型用来存储应用的所有数据,以及直接和数据操作相关的逻辑.Backbone中的模型类是Backbone.Model,它包含了数据存储,数据验证,以及数据发生变动时触发相 ...
- 【ubuntu】中文输入法安装二三事
本来很愉快地刷着JS程序,很有感慨啊,想写篇博客记一下学习笔记,结果忘记了博客账号,后来通过邮箱找回了之后想要开始写..发现ubuntu的中文输入法不能用啊(其实不是不能用,就是小白没搞清楚状况,双系 ...
- 初学嵌入式STM32基础下选哪款开发板适合学习
iTOP-4412开发板 目前为止,在用户网盘上已经积累了多达100G以上资料, 这些资料都是和4412相关的,并不是随便拼凑起来的!同时我们也完全开放原厂资料. 鉴于用户对于海量资料无从下手的问题, ...
- WEB安全--CSRF剖析
CSRF攻击:攻击者构造合法的HTTP请求,随后利用用户的身份操作用户帐户的一种攻击方式. 一.CSRF攻击原理CSRF的攻击建立在浏览器与Web服务器的会话中:欺骗用户访问URL.二.CSRF攻击场 ...
- USACO section1.2 Transformation
/* ID: vincent63 LANG: C TASK: transform */ #include <stdio.h> #include<stdlib.h> #inclu ...
- sass揭秘之变量(转载)
出处:http://www.w3cplus.com/preprocessor/sass-basic-variable.html 因为文章内含有很多sass代码,如需自己动手查看编译结果,推荐使用sas ...
- 边工作边刷题:70天一遍leetcode: day 75
Group Shifted Strings 要点:开始就想到了string之间前后字符diff要相同. 思维混乱的地方:和某个string的diff之间是没有关系的.所以和单个string是否在那个点 ...
- uGUI练习(三) KeyBoard Navigation
练习目标 练习通过键盘在按钮或其它Selectable类型组件上导航 步骤 创建一排的Button,及一个右边的Button 2.查看Button的属性里有一栏下拉列表Navigation,默认选择的 ...
- java 13-6 Char的包装类Character
1.Character 类在对象中包装一个基本类型 char 的值 此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写,反之亦然 构造方法: Characte ...
- static,静态关键字的详解
一,使用static声明属性 class Person{ // 定义Person类 String name ; // 定义name属性,暂时不封装 int age ; // 定义age属性,暂时不封装 ...