mailpie/scripts/mailpie-admin
Jeff Epler 1834728020 use volatile directory for indices
this helps with zfs, because we don't want to snapshot these files
2015-11-16 17:40:52 -06:00

133 lines
4.1 KiB
Python
Executable file

#!/usr/bin/python
# vim: set fileencoding=utf-8 : sts=4 : et : sw=4
# This is a component of mailpie, a full-text search for email
#
# Copyright © 2008 Jeff Epler <jepler@unpythonic.net>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import getopt
import mailpie.swishfilter
import mailpie.log
import os
import sys
def usage(result=0):
print """mailpie-admin: Perform mailpie database administration
Usage: %s [-B dir] [-s] [-r id...]
-B dir, --base=dir Choose base location of the mailpie storage.
Default: $HOME/.mailpie
Action:
-s, --statistics Show statistics about the mailpie database
-r, --remove id... Remove items from the database by id
""" % sys.argv[0]
raise SystemExit, result
def get_stats(base):
count = 0
size = 0
disk_size = 0
for dirpath, dirnames, filenames in os.walk(base):
dirnames.sort()
mailpie.log.progress(dirpath)
count += len(filenames)
for f in filenames:
try:
st = os.stat(os.path.join(dirpath, f))
except os.error:
continue
size += st.st_size
disk_size += 512 * st.st_blocks
for d in dirnames:
try:
st = os.stat(os.path.join(dirpath, d))
except os.error:
continue
size += st.st_size
disk_size += 512 * st.st_blocks
index_size = 0
for dirpath, dirnames, filenames in os.walk(base + "-volatile"):
for f in filenames:
f = base + "." + suffix
for f in filenames:
try:
st = os.stat(os.path.join(dirpath, f))
except os.error:
continue
index_size += st.st_size
disk_size += 512 * st.st_blocks
return {'count': count, 'message_size': size, 'disk_size': disk_size,
'index_size': index_size}
def remove_one(base, hash):
path = os.path.join(base, hash[:2], hash[2:])
try:
os.unlink(path)
except os.error, detail:
print "Removing %s: %s" % (path, detail)
def remove(base, args):
for a in args: remove_one(base, a)
TiB = 1024.**4
GiB = 1024.**3
MiB = 1024.**2
KiB = 1024.
def human(s):
if s > 10000*GiB: return "%6.1f TiB" % (s / TiB)
if s > 10000*MiB: return "%6.1f GiB" % (s / GiB)
if s > 10000*KiB: return "%6.1f MiB" % (s / MiB)
if s > 10000: return "%6.1f KiB" % (s / KiB)
return "%6.1fb" % s
def stats(base):
data = get_stats(base)
mailpie.log.log("Message count: %6d", data['count'])
mailpie.log.log("Total message size: %10s", human(data['message_size']))
mailpie.log.log("Total index size: %10s", human(data['index_size']))
mailpie.log.log("Disk space used: %10s", human(data['disk_size']))
NO_OPERATION, STATISTICS, REMOVE = range(3)
def main(args):
try:
opts, args = getopt.getopt(args, "srB:", ["statistics", "base="])
except getopt.error, detail:
usage(detail)
BASE = os.path.expanduser("~/.mailpie")
operation = NO_OPERATION
for k, v in opts:
if k == "-s" or k == "--statistics":
operation = STATISTICS
if k == "-r" or k == "--remove":
operation = REMOVE
if k == "-B" or k == "--base":
BASE = v
if operation == STATISTICS:
stats(BASE)
elif operation == REMOVE:
remove(BASE, args)
else:
usage("Must specify an action")
if __name__ == '__main__':
main(sys.argv[1:])