flask/python对mongodb的一些操作

首先是安装mongodb yum install -y mongodb-server mongodb Installing for dependencies: boost-filesystem boost-iostreams boost-program-options boost-system boost-thread gperftools-libs libicu libunwind v8 会装一堆依赖包,boost库,icu库,v8库,gperftools库,都是很厉害的库啊! 启动: service mongod start 导入海量数据: [root@ovs-16-11-2 ~]# mongoimport -d mydb -c prj01 --type csv --file opendata_projects.csv --headerline connected to: 127.0.0.1 Thu Jul 28 09:50:47.002 Progress: 39118658/470754183 8% Thu Jul 28 09:50:47.002 74400 24800/second Thu Jul 28 09:50:50.033 Progress: 80042213/470754183 17% Thu Jul 28 09:50:50.033 150700 25116/second Thu Jul 28 09:50:53.145 Progress: 108143323/470754183 22% Thu Jul 28 09:50:53.145 202700 22522/second Thu Jul 28 09:50:56.004 Progress: 149781879/470754183 31% Thu Jul 28 09:50:56.004 280000 23333/second Thu Jul 28 09:50:59.001 Progress: 179705162/470754183 38% Thu Jul 28 09:50:59.001 336200 22413/second Thu Jul 28 09:51:03.385 Progress: 212197023/470754183 45% Thu Jul 28 09:51:03.385 396400 20863/second Thu Jul 28 09:51:06.015 Progress: 236552399/470754183 50% Thu Jul 28 09:51:06.015 441700 20077/second Thu Jul 28 09:51:09.299 Progress: 264365847/470754183 56% Thu Jul 28 09:51:09.299 493300 19732/second Thu Jul 28 09:51:12.001 Progress: 304790148/470754183 64% Thu Jul 28 09:51:12.001 568500 20303/second Thu Jul 28 09:51:15.033 Progress: 323508057/470754183 68% Thu Jul 28 09:51:15.033 603300 19461/second Thu Jul 28 09:51:18.607 Progress: 361610334/470754183 76% Thu Jul 28 09:51:18.607 674200 19829/second Thu Jul 28 09:51:21.000 Progress: 393748962/470754183 83% Thu Jul 28 09:51:21.000 733700 19829/second Thu Jul 28 09:51:24.007 Progress: 427667505/470754183 90% Thu Jul 28 09:51:24.007 796900 19922/second Thu Jul 28 09:51:27.001 Progress: 459658299/470754183 97% Thu Jul 28 09:51:27.001 857300 19937/second Thu Jul 28 09:51:27.793 check 9 878853 Thu Jul 28 09:51:27.979 imported 878852 objects 进入命令行,看看库的整体情况: ...

2024年1月18日

F5 irule之google站长认证别样用法

公司的网站要过google认证,需要在网站根目录下放一个文件,googleb1e6d9a50ea8xxxx.html 内容如下: google-site-verification: googleb1e6d9a50ea8xxxx.html 这个无比简单,怎么又跟F5和irule扯上关系了呢?! 哎,因为居然要做两个域名,m.xxx.com和h.xxx.com,这两个域名都要过认证,而且悲剧的是,这两个域名实际代理的是同一台后端服务器的同一个tomcat进程。 鉴于这个东西这么简单,干脆在F5上来一段irule解决问题: when HTTP_REQUEST { if { ([string tolower [HTTP::path]] starts_with "/googleb1e6d9a50ea8xxxx.html") && ([string tolower [HTTP::host]] equals "m.xxx.com") } { HTTP::respond 200 content "google-site-verification: googleb1e6d9a50ea8xxxx.html" } } 由于没有复用ip,所以在h.xxx.com同样修改以上脚本并应用即可。 如果是穷光蛋作风,在F5上复用了IP做了虚拟主机转发,也修改修改脚本即可。

2024年1月18日

mbox文件中的=3D是什么鬼(quoted-printable编码)

最近在搞邮局。有个很奇怪的问题,就是打开mbox的文件,比如说: /var/spool/mail/root 里面信件的部分有奇怪的3D字符: <table cellpadding=3D"0" cellspacing=3D"0" style=3D"text-align:le= ft;color:#454545;background-color:#fff;font-size:14px;border-radius:10px;pa= 注意,中间多了若干个3D,最后也多了=号 这是什么鬼呢? 搜了一圈,原来这是quoted-printable编解码,跟Base64类似,base64和quoted-printable这两种编码都是在电子邮件中常见的编码方式。 基本知识: 如果=号出现在一行最后,表示换行,那么: he= llo 意思就是连起来的hello 如果中间出现=3D,那就是一个=号的意思 所以style=3D"text"意思就是style=“text” 英文字符除了=以外不做处理,其他字符的编码为=加这个字符的两个字节的16进制数。 弄明白了吧。 给一段处理mbox的python程序,可以用来读邮件: #!/usr/bin/env python # -*- coding: utf-8 -*- import mailbox import base64 import os import sys import email import quopri filename = "/var/spool/mail/zrr" mb = mailbox.mbox(filename) nmes = len(mb) for i in range(len(mb)): print "\n\n\n\n\n" print "-------------------------------------------------------------------------------------------------" print "Email", i print "-------------------------------------------------------------------------------------------------" mes = mb.get_message(i) em = email.message_from_string(mes.as_string()) subject = em.get('Subject') if subject.find('=?') != -1: ll = email.header.decode_header(subject) subject = "" for l in ll: subject = subject + l[0] em_from = em.get('From') if em_from.find('=?') != -1: ll = email.header.decode_header(em_from) em_from = "" for l in ll: em_from = em_from + l[0] print "From: %s - Subject: %s" %(em_from, subject) print "-------------------------------------------------------------------------------------------------" if mes.is_multipart(): for part in mes.get_payload(): print quopri.decodestring(part.get_payload()) else: print quopri.decodestring(mes.get_payload())

2024年1月18日

Linux下virtual FTP的搭建pure-ftpd

用过proftpd和vs-ftpd,proftpd有巨恐怖的sftp细粒度控制,特殊场合非常好。 但是总觉得都很复杂,我们文件系统的底层是GlusterFS,在之上建立虚用户,用proftpd和vs-ftpd都感觉复杂。 所以一直在找简单的方法,最后发现了pure-ftpd,很简单!!! 首先建一个无任何登陆权的新用户,注意,uid必须在500以上,不能用系统缺省的用户ftp,后面改pure-ftpd.conf时会有说明: useradd -u1000 -U -s/sbin/nologin -M ftpuser 安装pure-ftpd yum -y install pure-ftpd 修改配置: vi /etc/pure-ftpd/pure-ftpd.conf ChrootEveryone yes AnonymousOnly no NoAnonymous yes PureDB /etc/pure-ftpd/pureftpd.pdb #PAMAuthentication yes UnixAuthentication yes #注意,这里就指出了最小uid,所以第一步建立用户的时候uid不能小于500,否则pure-ftpd无法认证 MinUID 500 CreateHomeDir yes 改完后,我们来增加个用户,注意语法,test是虚拟用户名,-u和-g是虚拟用户对应linux系统的系统用户,就是我们第一步建立的那个无登陆权的ftpuser,-d是home目录,这个不用建,用户第一次登陆的时候pure-ftpd会自动建立: pure-pw useradd test -u ftpuser -g ftpuser -d /var/www/ppp 重建hash pure-pw mkdb 重启pure-ftpd service restart pure-ftpd ok,搞定了,一定要注意uid的问题。其他无复杂的地方。

2024年1月18日

GlusterFS的日常应用

基本上搭建glusterfs都是用了2个副本,用来保证数据冗余 建立新卷,/export/test-vol目录不用事先建立,会自动建立的: gluster volume create test-vol replica 2 transport tcp 172.16.8.5:/export/test-vol/ 172.16.8.6:/export/test-vol/ 如上建立新卷后,test-vol的属主是root,如果我们想基于gfs之上做个虚拟的vsftpd,建设用户是virtual.virtual,500.500 设置卷uid/gid属性: gluster volume set test-vol storage.owner-uid 500 gluster volume set test-vol storage.owner-gid 500 设置卷的quota空间配额: gluster volume quota test-vol enable gluster volume quota test-vol limit-usage / 10GB gluster volume quota test-vol limit-usage /path/in/volume 2G gluster volume set test-vol features.quota-timeout 30 gluster volume quota test-vol list gluster volume quota test-vol list /path/in/volume 去掉quota限制: gluster volume quota test-vol remove / gluster volume quota test-Vol remove /path/in/volume 优化tcp参数: gluster volume set test-vol diagnostics.brick-log-level WARNING gluster volume set test-vol diagnostics.client-log-level WARNING gluster volume set test-vol nfs.enable-ino32 on gluster volume set test-vol nfs.addr-namelookup off gluster volume set test-vol nfs.disable on gluster volume set test-vol performance.cache-max-file-size 2MB gluster volume set test-vol performance.cache-refresh-timeout 4 gluster volume set test-vol performance.cache-size 256MB gluster volume set test-vol performance.write-behind-window-size 4M gluster volume set test-vol performance.io-thread-count 32 设置卷访问权限 ...

2024年1月18日

ipxe中menu.c32和vesamenu.c32的用法

在做pxelinux启动的过程中,不可避免的会用到菜单选项。有两个选择,menu.c32 和 vesamenu.c32。 效果如下: menu.c32 vesamenu.c32 区别就是一个地方,我们看一下配置文件: default vesamenu.c32 PROMPT 0 NOESCAPE 0 ALLOWOPTIONS 0 TIMEOUT 200 MENU TITLE Boot Menu LABEL Ghost_Client_UNDI MENU LABEL ^1. Ghost Client UNDI MENU DEFAULT kernel memdisk append keeppxe initrd=imz/Client_undi.imz LABEL Ghost_Client_NDIS MENU LABEL ^2. Ghost Client NDIS kernel memdisk APPEND keeppxe initrd=imz/Client_ndis.IMZ LABEL WinPE MENU LABEL ^3. WinPE 2.0 KERNEL boot/pxeboot.0 LABEL PartedMagic MENU LABEL ^4. Parted Magic kernel utils/pmagic/bzImage LABEL Local_Drive MENU LABEL ^5. Boot Local Drive # localboot 0 KERNEL chain.c32 APPEND hd0 0 区别就是第一行: ...

2024年1月18日

ipxe启动Dos 6.22

太古老的命题了,如果想玩Dos 6.22之下的游戏,那就需要引动一个Dos系统了。 系统文件倒是现成的,Dos6.22.img。 如何做个ipxe的启动呢? 简单,依样画葫芦,修改boot2.php case '\52:54:00:7f:65:bb': echo "initrd http://172.16.8.1/ks/dos/Dos6.22.img\n"; echo "chain http://172.16.8.1/ks/dos/memdisk\n"; break; memdisk是从syslinux中拷贝的,也是神器。 其实可以用sanboot来启动的,但是那样起动起来的系统对C盘无写权限,因为dos下没有san的驱动可用。 所以改用memdisk,这样权限变为可写的了。

2024年1月18日

ipxe与aoe启动

先普及一下,aoe(ata over ethernet),跟iscsi差不多,不过是硬盘协议走在了以太网上。iscsi是3层的协议,aoe是二层的协议。 因为是二层的,所以没有网关、路由等等,相对强制的,客户端和服务器端必须是位于同一子网内。 先装服务端vblade: yum install vblade 然后准备存储空间,像lv、raw文件、硬盘(/dev/sdb)、硬盘分区(/dev/sdb1)或者raid磁盘/dev/md0都可以用作储存。 做一块20G的raw文件存储空间: mkdir /storage dd if=/dev/zero of=/storage/storage1.img bs=1024k count=20000 做一块aoe硬盘: vbladed 65535 255 eth0 /storage/storage1.img 解释一下 vbladed 后面跟了2个数字,第一个是主序列号,可以从 0-65535,第二个是次序列号,可以从0-255。然后跟发布的网卡,最后是存储空间。 最好把vbladed放入/etc/rc.d/rc.local vi /etc/rc.local vbladed 65535 255 eth0 /storage/storage1.img ok,服务器端的工作就完成了,大家看到了,基本什么也没设,因为是走在二层么。 然后ipxe部分就简单了,依样画葫芦修改boot2.php: case '\52:54:00:d9:fe:43': echo "set keep-san 1\n"; echo "sanboot aoe:e65535.255\n"; break; 搞定

2024年1月18日

ipxe远程启动iscsi上面的克隆卷

按上一篇所说,我们已经弄了个iscsi上面的win7卷,其实就是把萝卜花园的win7 clone到了一个10G的文件卷上。 引申问题: 大家其实可以用qcow2的文件格式保存的: qemu-img create -f qcow2 /export/iscsi/windows7.qcow2 60G vi /etc/tgt/targets.conf <target iqn.2016-07.com.renhe:renhe-16-8-6.disk03> backing-store /export/iscsi/disk03.img backing-store /export/iscsi/windows7.qcow2 write-cache off </target> tgt-admin --execute 那么,我们如何让ipxe直接起动这个iscsi卷呢? 还是编辑boot2.php即可: case '\52:54:00:d9:fe:43': echo "sanboot iscsi:172.16.8.6::3260:1:iqn.2016-07.iscsi:disk03\n"; break; 注意啊,查遍很多网上资料: sanboot的参数都是iscsi:ip::::iqn,实际无论是实体机的pxe,还是kvm虚拟机的pxe,都无法启动。以下格式才是正确的: iscsi:ip::3260:1:iqn 这样装个win7就简单了,拷贝一下disk03.img这个模板,启动pxe即可 #!/bin/bash virt-install \ --name=pxe-16-11-8 \ --vcpu=2 \ --ram=4096 \ --nodisks \ --boot network \ --os-type=windows \ --os-variant=win7 \ --network bridge=br0 \ --vnc --vnclisten=0.0.0.0 --vncport=5910 以后就可以用这个办法瞬间弄出一堆win虚机了,用完就删除

2024年1月18日

kvm使用iscsi作为存储池安装win

最近都在研究ipxe和iscsi,那么如何让kvm使用存储在iscsi上面的文件卷呢? 假设我们已经按之前的文章架好了iscsi: 造个10G文件: dd if=/dev/zero of=/export/iscsi/disk03.img count=0 bs=1 seek=10G 服务端增加iscsi target vi /etc/tgt/targets.conf <target iqn.2016-07.com.renhe:renhe-16-8-6.disk03> backing-store /export/iscsi/disk03.img write-cache off </target> tgt-admin --execute isci准备好了,然后我们去kvm定义池子:myiscsi virsh virsh# pool-define-as myiscsi 172.16.8.6 - iqn.2016-07.com.renhe:renhe-16-8-6.disk03 - /dev/disk/by-path virsh# pool-start myiscsi Name State Autostart ----------------------------------------- myiscsi active no virsh# pool-autostart myiscsi virsh # pool-list Name State Autostart ----------------------------------------- myiscsi active yes virsh# vol-list myiscsi Name Path ----------------------------------------- unit:0:0:1 /dev/disk/by-path/ip-172.16.8.6:3260-iscsi-iqn.2016-07.com.renhe:renhe-16-8-6.disk03-lun-1 ok,记下来这个Name:unit:0:0:1 然后我们来安装win的kvm吧,直接clone输出到硬盘 virt-install \ --name=iscsi-16-11-9 \ --vcpu=2 \ --ram=4096 \ --cdrom=/export/kvm/iso/Luobo_Ghost_Win7_SP1_x86_2015_0904.iso \ --boot network,cdrom,hd,menu=on \ --disk vol=myiscsi/unit:0:0:1 \ --os-type=windows \ --os-variant=win7 \ --network bridge=br0 \ --vnc --vnclisten=0.0.0.0 --vncport=5911 注意上面disk的参数,myiscsi/unit:0:0:1 ...

2024年1月18日