官网插件只支持从message字段获取数据

如果数据源inputs为jdbc的话,读取的数据是json数组,也没有message字段无法入库 源码如下

def flush(events, close=false)
  documents = ""
  event_num = 0
  events.each do |event|
     documents << event.get("[message]") << "\n"
     event_num += 1
  end

  @logger.info("get event num: #{event_num}")
  @logger.debug("get documents: #{documents}")

  hosts = get_host_addresses()

  @request_headers["label"] = label_prefix + "_" + @db + "_" + @table + "_" + Time.now.strftime('%Y%m%d%H%M%S_%L')
  make_request(documents, hosts, @http_query, 1, hosts.sample)
end

改造后如下,将唯一的区别是配置文件中的columns是必填的 数据将以columns顺序进行读取封装

def flush(events, close=false)
  columns = @columns.split(",")
  documents = ""
  event_num = 0
  events.each do |event|
     line = ""
     columns.each do |col|
       v = event.get("["+col.strip+"]").nil? == true ? "" : event.get("["+col.strip+"]")
       line << v.to_s << ","
     end
     documents << line[0, line.length - 1] << "\n"
     event_num += 1
  end

  @logger.info("get event num: #{event_num}")
  @logger.debug("get documents: #{documents}")

  hosts = get_host_addresses()

  @request_headers["label"] = label_prefix + "_" + @db + "_" + @table + "_" + Time.now.strftime('%Y%m%d%H%M%S_%L')
  make_request(documents, hosts, @http_query, 1, hosts.sample)
   	end

Read More

centos7 vsftpd 笔记

1、下载 rpm包

wget http://vault.centos.org/7.4.1708/os/Source/SPackages/vsftpd-3.0.2-22.el7.src.rpm

2、 创建用户(安装的时候会默认使用使用这个用户)

useradd mockbuild

3、进行源码的安装

rpm -ivh vsftpd-3.0.2-22.el7.src.rpm

4、查看/root/rpmbuild/SOURCES

解压

5、修改logging.c

注释函数 vsf_log_do_log_to_file中的

// str_replace_unprintable(p_str, '?');

保存

6、修改完成后返回上一层,使用 tar -zcvf vsftpd-3.0.2.tar.gz vsftpd-3.0.2/命令对vsftpd-3.0.2目录进行压缩

7、压缩完成后返回上一层,进入SPECS/目录下rpmbuild -bb vsftpd.spec命令生成新的vsftpd rpm安装包 在打包之前先使用yum -y install rpm-build和 yum -y install rpmdevtools安装打包环境 使用rpmbuild -bb vsftpd.spec进行打包

8、有依赖的使用yum安装即可

yum -y install pam-devel libcap-devel openssl-devel tcp_wrappers-devel

9、最后使用rpmbuild -bb vsftpd.spec再进行打包操作就OK了(一定要确认已经安装gcc)打包完成后就可以在rpmbuild/RPMS/x86_64目录下看到新生成的vsftpd包了

Read More

删除数据库中重复数据并保留一条数据

delete from TableName where exists (select * from TableName a where a.field1=TableName.field1 and 
a.field2=TableName.field2 group by field1,field2 having count(*) > 1)
and TableName.rowid not in (select min(rowid) from TableName group by field1,field2 having count(*)>1) 

Read More

linux 笔记

vagrant安装

vagrant box add centos ./centos-7.0-x86_64.box	// 添加box
vagrant init centos	// 初始化
vagrant up	// 启动
vagrant ssh	// ssh测试

配置network

# dhcp 自动分配ip  需要路由器
config.vm.network "public_network", use_dhcp_assigned_default_route: true

切换yum源

// 第一步:备份你的原镜像文件,以免出错后可以恢复。
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
// 下载新的CentOS-Base.repo 到/etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

遇到的问题 : wget: unable to resolve host address

# vi /etc/resolv.conf 
// 添加如下内容(默认里面什么都没有)
nameserver 8.8.8.8
nameserver 8.8.4.4

// clean 后生成缓存
yum clean all
yum makecache

更新系统

yum -y update
// 查看系统信息
uname -a

安装mysql

# 下载mysql源安装包
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
# 安装mysql源
yum localinstall mysql57-community-release-el7-8.noarch.rpm
# 安装MySQL
yum install mysql-community-server
# 启动MySQL服务
systemctl start mysqld
# 查看MySQL的启动状态
systemctl status mysqld

# 开机启动
systemctl enable mysqld
systemctl daemon-reload

# 修改root本地登录密码
# mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码
grep 'temporary password' /var/log/mysqld.log
# 登录mysql
mysql -u root -p
#修改密码策略
vi /etc/my.cnf
# 添加
validate_password_policy=0
# 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';

# 添加远程登录用户
# 默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须修改root允许远程连接,或者添加一个允许远程连接的帐户,为了安全起见,添加一个新的帐户:
GRANT ALL PRIVILEGES ON *.* TO 'cqb'@'%' IDENTIFIED BY 'cqb' WITH GRANT OPTION;
#配置默认编码为utf8
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'

关闭firewall

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

安装git

wget https://github.com/git/git/archive/v2.9.2.tar.gz
tar zxvf v2.9.2.tar.gz
cd git-2.9.2

// 环境
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install  gcc perl-ExtUtils-MakeMaker

make prefix=/usr/local/git all
make prefix=/usr/local/git install

Read More

上例子: //app.js

const Koa = require('koa');
const CSRF = require('koa-csrf');
const router = require('koa-router')();
const ejsRender = require('koa-ejs');

const app = new Koa();

//view
ejsRender(app, {
    root: path.join(__dirname, 'views'),
    layout: false,
    viewExt: 'html',
    cache: false,
    debug: true
});

//csrf
app.use(new CSRF({
  invalidSessionSecretMessage: 'Invalid session secret',
  invalidSessionSecretStatusCode: 403,
  invalidTokenMessage: 'Invalid CSRF token',
  invalidTokenStatusCode: 403,
  excludedMethods: [ 'GET', 'HEAD', 'OPTIONS' ],
  disableQuery: false
}));

//router
router.get(/\/.*/, async (ctx, next) => {
    ctx.state.csrf = ctx.csrf;
    await next();
});

router.get('/', async (ctx, next)=>{
    await next();
    await ctx.render('index');
});

app.use(router.routes());

app.listen(3000,()=>{
    console.log("server listen on 3000");
});

//index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui">
    <meta name="screen-orientation" content="portrait"/>
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <meta name="full-screen" content="yes">
    <meta name="x5-fullscreen" content="true">
    <meta name="_csrf" content="<%= csrf %>">
    <title>Koa</title>
</head>
<body>
    <div id="app">
        Hello World!
    </div>

	<script src="/lib/jquery-1.11.3.min.js"></script>
</body>
</html>

Read More

避免点击劫持

添加 X-Frame-Options 响应头

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>, <iframe> 或者 <object> 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。

使用 X-Frame-Options

X-Frame-Options 有三个值:

DENY

表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。

SAMEORIGIN

表示该页面可以在相同域名页面的 frame 中展示。

ALLOW-FROM uri

表示该页面可以在指定来源的 frame 中展示。

换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。

###配置 Apache

配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 ‘site’ 的配置中:

Header always append X-Frame-Options SAMEORIGIN

配置 nginx

配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 ‘http’, ‘server’ 或者 ‘location’ 的配置中:

add_header X-Frame-Options SAMEORIGIN;

配置 IIS

配置 IIS 发送 X-Frame-Options 响应头,添加下面的配置到 Web.config 文件中:

<system.webServer>
  ...

  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>

  ...
</system.webServer>

结果

在 Firefox 尝试加载 frame 的内容时,如果 X-Frame-Options 响应头设置为禁止访问了,那么 Firefox 会用 about:blank 展现到 frame 中。也许从某种方面来讲的话,展示为错误消息会更好一点。

参考 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options

Read More

在IE和Safari浏览器中,一个域名网页嵌入另外一个域名网页的iframe的时候会发现不能保持cookies,导致session丢失。

如果在localhost域名下嵌入另外域名的iframe没有问题

例:在domain A中嵌入domain B 的iframe

<iframe src="http://www.domain-B.com/login.html"></iframe>

domain B 中登录或注册等创建需要的session

<form action="dologin.html" method="post">
	<input name="username">
	<input type="password" name="passwrod">
	<input type="submit" value="提交">
</form>

domain B 中编写action

String redirect = request.getParameter("redirect");

if(loginSuccess){
	getSession().setAttribute("user", user);
}

//重新定位到domain A的地址
return "redirect:"+redirect;

Read More