树莓派进水断电重启后Mysql起不来

错误日志类似于:

90119 12:55:54 InnoDB: Using Linux native AIO
190119 12:55:54 InnoDB: Initializing buffer pool, size = 128.0M
190119 12:55:54 InnoDB: Completed initialization of buffer pool
190119 12:55:54 InnoDB: highest supported file format is Barracuda.
190119 12:55:54  InnoDB: Starting crash recovery from checkpoint LSN=25825591529
InnoDB: Restoring possible half-written data pages from the doublewrite buffer...
190119 12:55:54  InnoDB: Starting final batch to recover 15 pages from redo log
190119 12:55:54 [ERROR] mysqld got signal 11 ;

解决办法:

修改/etc/my.cnf配置文件:
添加参数:
innodb_force_recovery = 6 (此项由1—6个级别一次往上修改参数在失败的情况下)
innodb_purge_threads = 0

整体配置如下:

[mysqld]
innodb_force_recovery=6
innodb_purge_threads = 0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

启动完后记得注释掉第一条第二条,否则有副作用,盲猜无法写入。

CentOS清除用户登录记录和命令历史方法

从删库到跑路

清除登陆系统成功的记录 [root@localhost root]# echo > /var/log/wtmp //此文件默认打开时乱码,可查到ip等信息

[root@localhost root]# last //此时即查不到用户登录信息
清除登陆系统失败的记录

[root@localhost root]# echo > /var/log/btmp //此文件默认打开时乱码,可查到登陆失败信息 [root@localhost root]# lastb //查不到登陆失败信息   清除历史执行命令

[root@localhost root]# history -c //清空历史执行命令

[root@localhost root]# echo > ./.bash_history //或清空用户目录下的这个文件即可   导入空历史记录

[root@localhost root]# vi /root/history //新建记录文件 [root@localhost root]# history -c //清除记录 

[root@localhost root]# history -r /root/history.txt //导入记录 

[root@localhost root]# history //查询导入结果

来源:https://www.cnblogs.com/jiftle/p/9604312.html


mysql delete删除数据磁盘空间不减少

某天公司腾讯云CDB服务器磁盘空间占用很高,而我们自己查看数据+索引则不多。原来我们日常定时删除操作delete并末释放磁盘空间。

   使用delete删除的时候,mysql并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,mysql会利用这些已删除的空间再写入。即,删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。(BTW:看官方文档上好像是innodb引擎的可以利用操作系统来帮忙回收这些碎片,MyISam的表没有办法自己回收,这里待定,后续再看下)

查看数据库上所有表的大小,大概能统计出所占空间大小。

mysql> use information_schema;
Database changed
mysql> SELECT TABLE_NAME,concat(round((DATA_LENGTH/1024/1024),2),'MB'),concat(round((INDEX_LENGTH/1024/1024),2),'MB') FROM `TABLES` ORDER BY DATA_LENGTH DESC;
+----------------------------------------------------+-----------------------------------------------+------------------------------------------------+
| TABLE_NAME                                         | concat(round((DATA_LENGTH/1024/1024),2),'MB') | concat(round((INDEX_LENGTH/1024/1024),2),'MB') |
+----------------------------------------------------+-----------------------------------------------+------------------------------------------------+
| report_copy                                   | 14729.00MB                                    | 18130.00MB                                     |
| s_num                                    | 11392.00MB                                    | 17689.91MB                                     |
| stat                                     | 5452.00MB                                     | 4741.80MB                                      |
| game_log                                      | 3522.00MB                                     | 6235.95MB                                      |

官方推荐使用 OPTIMIZE TABLE命令来优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片。

语法如下:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] …

注:该命令将会整理表数据和相关的索引数据的物理存储空间,用来减少占用的磁盘空间,并提高访问表时候的IO性能。但是,具体对表产生的影响是依赖于表使用的存储引擎的。该命令对视图无效。

该命令目前只对MyISAM、InnoDB,ARCHIVE的表起作用,其余引擎的不起作用

OPTIMIZE 在操作过程中会锁表,50多G数据表锁了将近1个小时,所以这点要特别注意。执行完毕释放了20G左右的空间,还是非常有效果的


踩过的坑: optimize 本质是alter table

mysql 5.5 的改表过程如下

1.创建一张新的临时表 tmp

2.把旧表锁住,禁止插入删除,只允许读写 (这就是为什么上面的insert语句都停留在waiting for table metadata lock)

3.把数据不断的从旧表,拷贝到新的临时表,(这就是上面报copy to tmp table)

4.等表拷贝完后,进行瞬间的rename操作

5.旧表删除掉

所以optimize最大的问题是锁表,锁表会导致insert,delete,update语句堵住,确保操作时业务切走。

alter table会复制一个表出来,磁盘空间会增加,操作完成合删除旧表。 这一过程可能会爆磁盘
————————————————
版权声明:本文为CSDN博主「qq13650793239」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq13650793239/java/article/details/84889975

zabbix数据库占用磁盘空间较大的处理方法

du -h /* |sort -nr  使用此命令一步步排查发现/var/lib/mysql/zabbix/这个目录占用磁盘空间较大

发现history_log.ibd这个文件最大,达到了38G,此文件对应的是zabbix库里的history_log表

找到问题原因后就好解决,进入zabbix,删除history_log表较早的数据即可

进入MySQL的zabbix库

delete from history_log where clock < 1540483200;   删除小于这个时间戳的数据

optimize table  history_log     delete操作以后使用optimize table table_name 会立刻释放磁盘空间

df -h   最后再验证一下磁盘空间是否有变化

先删除 history_log.

delete from history_log where clock < 1540483200;   删除小于这个时间戳的数据

optimize table  history_log 

依然空间占用很大。使用以下命令查询tab占用:

MariaDB [zabbix]> SELECT table_name AS “Tables”, round(((data_length + index_length) / 1024 / 1024), 2) “Size in MB” FROM information_schema.TABLES WHERE table_schema = ‘zabbix’ ORDER BY (data_length + index_length) DESC;
————————————–+

Tables                     Size in MB

————————————–+

history_text                 776627.66
history_uint                   7623.14
history                        1819.95
trends_uint                     541.81
history_str                     404.22
trends                          246.09
events                          190.95
alerts                          139.75
auditlog                         36.09
sessions                         30.14
event_recovery                   16.55
history_log                      16.39
items                             7.11
items_applications                2.80

可以看到,history_text占据了绝对空间。

使用以下命令删除7天前的history_text:

delete from history_text where clock <1586361600;

执行时间较长。等待中


参考来源:https://www.cnblogs.com/leon2659/p/9924627.html

Python 写CSV文件

import csv

def WriteinfoToCsv(filename,itemname,iteminfo):
    '''
    :param filename:String类型
    :param itemname:list类型
    :param iteminfo:list类型
    :return: 1
    '''
    with open(filename, 'w',newline='', encoding='utf-8-sig') as f:
        writer = csv.writer(f)
        writer.writerow(itemname)
        writer.writerow(iteminfo)
    return 1

Zabbix api获取某 item的最新值

参考下面函数:

def getValueFromHost(host,itemName):
    '''
    :param host: host name,usually ip,like '10.189.66.131',but need to be string type.
    :param itemName: like "*cpu_model*", need to be string type.
    :return: The last value of itemName for specific 'host'. String type.
    '''
    for h in zapi.item.get(output=["itemid", "name", "hostid", "value_type", "lastvalue"], host=host,
                           search={"name": '*'+itemName+'*'}, searchWildcardsEnabled='1'):
        return (h['lastvalue'])

def getValueFromItem(host,item):
    '''
    :param host:
    :param item:
    :return:  return 数组
    '''
    data=[]
    for eachItem in item:
        data.append(getValueFromHost(host,eachItem))
    return data

另外,获取某主机资产清单值,使用以下函数:


def getInventorydataFromHostName(hostname,item):
    for h in zapi.host.get(output=['host'], filter={'host': hostname},
                           selectInventory=[item]):
        return h['inventory'][item]

另外,预先导入:

from pyzabbix import ZabbixAPI, ZabbixAPIException
from datetime import datetime
import time
import warnings

Ansible入门初探

先安装ansible,设置免密。


# 查看模块参数
[root@ansible ~]# ansible-doc -s command

# 在192.168.1.31服务器上面执行ls命令,默认是在当前用户的家目录/root
[root@ansible ~]# ansible 192.168.1.31 -a ‘ls’

# chdir 先切换工作目录,再执行后面的命令,一般情况下在编译时候使用
[root@ansible ~]# ansible 192.168.1.31 -a ‘chdir=/tmp pwd’
192.168.1.31 | CHANGED | rc=0 >>
/tmp

# creates 如果creates的文件存在,则执行后面的操作
[root@ansible ~]# ansible 192.168.1.31 -a ‘creates=/tmp ls /etc/passwd’ #tmp目录存在,则不执行后面的ls命令
192.168.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp exists
[root@ansible ~]# ansible 192.168.1.31 -a ‘creates=/tmp11 ls /etc/passwd’ # tmp11文件不存在,则执行后面的ls命令
192.168.1.31 | CHANGED | rc=0 >>
/etc/passwd

# removes 和creates相反,如果removes的文件存在,才执行后面的操作
[root@ansible ~]# ansible 192.168.1.31 -a ‘removes=/tmp ls /etc/passwd’ #tmp文件存在,则执行了后面的ls命令
192.168.1.31 | CHANGED | rc=0 >>
/etc/passwd
[root@ansible ~]# ansible 192.168.1.31 -a ‘removes=/tmp11 ls /etc/passwd’ #tmp11文件不存在,则没有执行后面的ls命令
192.168.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp11 does not exist

# 查看模块参数
[root@ansible ~]# ansible-doc -s shell

[root@ansible ~]# ansible 192.168.1.31 -m shell -a ‘mkdir /tmp/test’
[root@ansible ~]# ansible 192.168.1.31 -m shell -a ‘ls /tmp’

#执行下面这条命令,每次执行都会更新文件的时间戳
[root@ansible ~]# ansible 192.168.1.31 -m shell -a ‘cd /tmp/test && touch 1.txt && ls’
192.168.1.31 | CHANGED | rc=0 >>
1.txt

# 由于有时候不想更新文件的创建时间戳,则如果存在就不执行creates
[root@ansible ~]# ansible 192.168.1.31 -m shell -a ‘creates=/tmp/test/1.txt cd /tmp/test && touch 1.txt && ls’
192.168.1.31 | SUCCESS | rc=0 >>
skipped, since /tmp/test/1.txt exists

# 查看模块参数
[root@ansible ~]# ansible-doc -s script

# 编写shell脚本
[root@ansible ~]# vim ansible_test.sh
#!/bin/bash
echo `hostname`

# 在所有被管理机器上执行该脚本
[root@ansible ~]# ansible all -m script -a ‘/root/ansible_test.sh’
192.168.1.32 | CHANGED => {
“changed”: true,
“rc”: 0,
“stderr”: “Shared connection to 192.168.1.32 closed.\r\n”,
“stderr_lines”: [
“Shared connection to 192.168.1.32 closed.”
],
“stdout”: “linux.node02.com\r\n”,
“stdout_lines”: [
“linux.node02.com”
]
}
……

# 查看模块参数
[root@ansible ~]# ansible-doc -s file
path #要管理的文件路径
recurse #递归
state:
directory #创建目录,如果目标不存在则创建目录及其子目录
touch #创建文件,如果文件存在,则修改文件 属性

absent #删除文件或目录
mode #设置文件或目录权限
owner #设置文件或目录属主信息
group #设置文件或目录属组信息
link #创建软连接,需要和src配合使用
hard #创建硬连接,需要和src配合使用

# 创建目录
[root@ansible ~]# ansible 192.168.1.31 -m file -a ‘path=/tmp/test1 state=directory’

# 创建文件
[root@ansible ~]# ansible 192.168.1.31 -m file -a ‘path=/tmp/test2 state=touch’

# 建立软链接(src表示源文件,path表示目标文件)
[root@ansible ~]# ansible 192.168.1.31 -m file -a ‘src=/tmp/test1 path=/tmp/test3 state=link’

# 删除文件
[root@ansible ~]# ansible 192.168.1.31 -m file -a ‘path=/tmp/test2 state=absent’

# 创建文件时同时设置权限等信息
[root@ansible ~]# ansible 192.168.1.31 -m file -a ‘path=/tmp/test4 state=directory mode=775 owner=root group=root’

# 查看模块参数
[root@ansible ~]# ansible-doc -s copy
src #需要copy的文件的源路径
dest #需要copy的文件的目标路径
backup #对copy的文件进行备份
content #直接在远程主机被管理文件中添加内容,会覆盖原文件内容
mode #对copy到远端的文件设置权限
owner #对copy到远端的文件设置属主
group #对copy到远端文件设置属组

# 复制文件到远程主机并改名
[root@ansible ~]# ansible 192.168.1.31 -m copy -a ‘dest=/tmp/a.sh src=/root/ansible_test.sh’

# 复制文件到远程主机,并备份远程文件,安装时间信息备份文件(当更新文件内容后,重新copy时用到)
[root@ansible ~]# ansible 192.168.1.31 -m copy -a ‘dest=/tmp/a.sh src=/root/ansible_test.sh backup=yes’

# 直接在远程主机a.sh中添加内容
[root@ansible ~]# ansible 192.168.1.31 -m copy -a ‘dest=/tmp/a.sh content=”#!/bin/bash\n echo `uptime`”‘

# 复制文件到远程主机,并设置权限及属主与属组
[root@ansible ~]# ansible 192.168.1.31 -m copy -a ‘dest=/tmp/passwd src=/etc/passwd mode=700 owner=root group=root’

# 查看模块参数
[root@ansible ~]# ansible-doc -s fetch
src #指定需要从远端机器拉取的文件路径
dest #指定从远端机器拉取下来的文件存放路径

# 从被管理机器上拉取cron日志文件,默认会已管理节点地址创建一个目录,并存放在内
[root@ansible ~]# ansible 192.168.1.31 -m fetch -a ‘dest=/tmp src=/var/log/cron’

[root@ansible ~]# tree /tmp/192.168.1.31/
/tmp/192.168.1.31/
└── var
└── log
└── cron
directories, 1 file

# 查看模块参数
[root@ansible ~]# ansible-doc -s user
name #指定用户的名字
home #指定用户的家目录
uid #指定用户的uid
group #指定用户的用户组
groups #指定用户的附加组
password #指定用户的密码
shell #指定用户的登录shell
create_home #是否创建用户家目录,默认是yes
remove #删除用户时,指定是否删除家目录
state:
absent #删除用户

# 创建用户名指定家目录,指定uid及组
[root@ansible ~]# ansible 192.168.1.31 -m user -a ‘name=mysql home=/opt/mysql uid=1002 group=root’
[root@ansible ~]# ansible 192.168.1.31 -m shell -a ‘id mysql && ls -l /opt’
192.168.1.31 | CHANGED | rc=0 >>
uid=1002(mysql) gid=0(root) 组=0(root)
总用量 0
drwx—— 3 mysql root 78 5月 27 18:13 mysql

# 创建用户,不创建家目录,并且不能登录
[root@ansible ~]# ansible 192.168.1.31 -m user -a ‘name=apache shell=/bin/nologin uid=1003 create_home=no’
[root@ansible ~]# ansible 192.168.1.31 -m shell -a ‘id apache && tail -1 /etc/passwd’
192.168.1.31 | CHANGED | rc=0 >>
uid=1003(apache) gid=1003(apache) 组=1003(apache)
apache:x:1003:1003::/home/apache:/bin/nologin

# 删除用户
[root@ansible ~]# ansible 192.168.1.31 -m user -a ‘name=apache state=absent’

# 删除用户并删除家目录
[root@ansible ~]# ansible 192.168.1.31 -m user -a ‘name=mysql state=absent remove=yes’

# 查看模块参数
[root@ansible ~]# ansible-doc -s group
name #指定组的名字
gid #指定组的gid
state:
absent #删除组
present #创建组(默认的状态)

# 创建组
[root@ansible ~]# ansible 192.168.1.31 -m group -a ‘name=www’

# 创建组并指定gid
[root@ansible ~]# ansible 192.168.1.31 -m group -a ‘name=www1 gid=1005’

# 删除组
[root@ansible ~]# ansible 192.168.1.31 -m group -a ‘name=www1 state=absent’

# 查看模块参数
[root@ansible ~]# ansible-doc -s yum
name #指定要操作的软件包名字
download_dir #指定下载软件包的存放路径,需要配合download_only一起使用
download_only #只下载软件包,而不进行安装,和yum –downloadonly一样
list:
installed #列出所有已安装的软件包
updates #列出所有可以更新的软件包
repos #列出所有的yum仓库
state:
installed, present #安装软件包(两者任选其一都可以)
removed, absent #卸载软件包
latest #安装最新软件包

# 列出所有已安装的软件包
[root@ansible ~]# ansible 192.168.1.31 -m yum -a ‘list=installed’

# 列出所有可更新的软件包
[root@ansible ~]# ansible 192.168.1.31 -m yu

[root@ansible ~]# ansible 192.168.1.31 -m yum -a ‘list=repos’

#只下载软件包并到指定目录下
[root@ansible ~]# ansible 192.168.1.31 -m yum -a ‘name=httpd download_only=yes download_dir=/tmp’

#安装软件包
[root@ansible ~]# ansible 192.168.1.31 -m yum -a ‘name=httpd state=installed’

#卸载软件包
[root@ansible ~]# ansible 192.168.1.31 -m yum -a ‘name=httpd state=removed’

#安装包组,类似yum groupinstall ‘Development Tools’
[root@ansible ~]# ansible 192.168.1.31 -m yum -a ‘name=”@Development Tools” state=installed’

# 查看模块参数
[root@ansible ~]# ansible-doc -s pip

# 使用pip时,需要保证被管理机器上有python-pip软件包
[root@ansible ~]# ansible 192.168.1.31 -m yum -a ‘name=python-pip’

# 安装pip包
[root@ansible ~]# ansible 192.168.1.31 -m pip -a ‘name=flask’

# 查看模块参数
[root@ansible ~]# ansible-doc -s service
name #指定需要管理的服务名
enabled #指定是否开机自启动
state: #指定服务状态
started #启动服务
stopped #停止服务
restarted #重启服务
reloaded #重载服务

# 启动服务,并设置开机自启动
[root@ansible ~]# ansible 192.168.1.31 -m service -a ‘name=crond state=started enabled=yes’

# 查看模块参数
[root@ansible ~]# ansible-doc -s cron
job #指定需要执行的任务
minute #分钟
hour #小时
day #天
month #月
weekday #周
name #对计划任务进行描述
state:
absetn #删除计划任务

# 创建一个计划任务,并描述是干嘛用的
[root@ansible ~]# ansible 192.168.1.31 -m cron -a “name=’这是一个测试的计划任务’ minute=* hour=* day=* month=* weekday=* job=’/bin/bash /root/test.sh'”
[root@ansible ~]# ansible 192.168.1.31 -m shell -a ‘crontab -l’
192.168.1.31 | CHANGED | rc=0 >>
#Ansible: 这是一个测试的计划任务
* * * * * /bin/bash /root/test.sh

# 创建一个没有带描述的计划任务
[root@ansible ~]# ansible 192.168.1.31 -m cron -a “job=’/bin/sh /root/test.sh'”

# 删除计划任务
[root@ansible ~]# ansible 192.168.1.31 -m cron -a “name=’None’ job=’/bin/sh /root/test.sh’ state=absent”

# 查看模块参数
[root@ansible ~]# ansible-doc -s setup

# 查看系统所有信息
[root@ansible ~]# ansible 192.168.1.31 -m setup

# filter 对系统信息进行过滤
[root@ansible ~]# ansible 192.168.1.31 -m setup -a ‘filter=ansible_all_ipv4_addresses’

# 常用的过滤选项
ansible_all_ipv4_addresses 所有的ipv4地址
ansible_all_ipv6_addresses 所有的ipv6地址
ansible_architecture 系统的架构
ansible_date_time 系统时间
ansible_default_ipv4 系统的默认ipv4地址
ansible_distribution 系统名称
ansible_distribution_file_variety 系统的家族
ansible_distribution_major_version 系统的版本
ansible_domain 系统所在的域
ansible_fqdn 系统的主机名
ansible_hostname 系统的主机名,简写
ansible_os_family 系统的家族
ansible_processor_cores cpu的核数
ansible_processor_count cpu的颗数
ansible_processor_vcpus cpu的个数

转载来源https://www.cnblogs.com/yanjieli/p/10969143.html

关于3月26日github被中间人攻击

https://pic4.zhimg.com/80/v2-e4b7a6249ff43f2b899a429c4fbb3ea4_720w.jpg

先把图存下来。立志自己写加密代理。

以下内容转载来源:https://tech.sina.com.cn/digi/2020-03-27/doc-iimxyqwa3455657.shtml

关于BGP攻击,参考https://www.cloudflare.com/learning/security/glossary/bgp-hijacking/

截至发稿,国内访问 GitHub 网站会报证书错误,如下图所示:

据了解,GitHub 疑似遭到了中间人攻击。

中间人攻击(英语:Man-in-the-middle attack,缩写:MITM)在密码学和计算机安全领域中是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。在许多情况下这是很简单的(例如,在一个未加密的 Wi-Fi 无线接入点的接受范围内的中间人攻击者,可以将自己作为一个中间人插入这个网络)。

中间人攻击能成功的前提条件是攻击者能将自己伪装成每一个参与会话的终端,并且不被其他终端识破。中间人攻击是一个(缺乏)相互认证的攻击。大多数的加密协议都专门加入了一些特殊的认证方法以阻止中间人攻击。例如,SSL 协议可以验证参与通讯的一方或双方使用的证书是否是由权威的受信任的数字证书认证机构颁发,并且能执行双向身份认证。

简而言之,所谓的中间人攻击就是通过拦截正常的网络通信数据,并进行数据篡改和嗅探,而通信的双方却毫不知情。

目前访问 GitHub 提示的这个不受信任的证书的颁布者是 [email protected]

记录zabbix低级自动发现的json格式,以及相应脚本

json格式如下:

{
“data”: [
{
“{#HOSTIP}”: “/var/log/audit”
},
{
“{#HOSTIP}”: “/var/log/chrony”
},
{
“{#HOSTIP}”: “/var/log/cups”
},
{
“{#HOSTIP}”: “/var/log/gdm”
},
{
“{#HOSTIP}”: “/var/log/glusterfs”
},
{
“{#HOSTIP}”: “/var/log/httpd”
},
{
“{#HOSTIP}”: “/var/log/mariadb”
},
{
“{#HOSTIP}”: “/var/log/ntpstats”
},
{
“{#HOSTIP}”: “/var/log/php-fpm”
},
{
“{#HOSTIP}”: “/var/log/pluto”
},
{
“{#HOSTIP}”: “/var/log/ppp”
},
{
“{#HOSTIP}”: “/var/log/qemu-ga”
},
{
“{#HOSTIP}”: “/var/log/sa”
},
{
“{#HOSTIP}”: “/var/log/samba”
},
{
“{#HOSTIP}”: “/var/log/speech-dispatcher”
},
{
“{#HOSTIP}”: “/var/log/sssd”
},
{
“{#HOSTIP}”: “/var/log/tuned”
}
]
}

产生该json格式的python代码参考:

#!/usr/bin/env python3
#encoding=utf-8
import os
import sys
import json

FileDir=’/var/log/’

def CheckHostip(filedir):
output = os.popen(‘find ‘+filedir+’* -maxdepth 0 -type d’)
hostip = str(output.read())
hostip = hostip[:hostip.find(‘\r’)]
hostdirlist = hostip.split(‘\n’)
return (hostdirlist)

def returnjson(fileDir):

thislist=[]
for i in CheckHostip(fileDir):
thislist.append({
“{#HOSTIP}”:i

})
a = {
“data”: thislist
}
print(json.dumps(a, sort_keys=True, indent=2))
return 1

if __name__==”__main__”:
returnjson(FileDir)