Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F120822414
cmd_mailbox_cleanup.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
6 KB
Referenced Files
None
Subscribers
None
cmd_mailbox_cleanup.py
View Options
# -*- coding: utf-8 -*-
# Copyright 2010-2013 Kolab Systems AG (http://www.kolabsys.com)
#
# Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen a kolabsys.com>
#
# 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 3 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, see <http://www.gnu.org/licenses/>.
#
import
ldap
import
sys
import
commands
import
pykolab
from
pykolab
import
imap_utf7
from
pykolab.auth
import
Auth
from
pykolab.imap
import
IMAP
from
pykolab.translate
import
_
log
=
pykolab
.
getLogger
(
'pykolab.cli'
)
conf
=
pykolab
.
getConf
()
def
__init__
():
commands
.
register
(
'mailbox_cleanup'
,
execute
,
description
=
description
())
def
cli_options
():
my_option_group
=
conf
.
add_cli_parser_option_group
(
_
(
"CLI Options"
))
my_option_group
.
add_option
(
'--dry-run'
,
dest
=
"dryrun"
,
action
=
"store_true"
,
default
=
False
,
help
=
_
(
"Do not actually delete mailboxes, but report what mailboxes would have been deleted."
)
)
def
description
():
return
_
(
"Clean up mailboxes that do no longer have an owner."
)
def
execute
(
*
args
,
**
kw
):
"""
List mailboxes
"""
auth
=
Auth
()
domains
=
auth
.
list_domains
()
imap
=
IMAP
()
imap
.
connect
()
domain_folders
=
{}
subjects
=
[]
# Placeholder for subjects that would have already been deleted
subjects_deleted
=
[]
for
domain
in
domains
.
keys
():
domain_folders
[
domain
]
=
imap
.
lm
(
"user/
%%
@
%s
"
%
(
domain
))
for
domain
in
domain_folders
.
keys
():
auth
=
Auth
(
domain
=
domain
)
auth
.
connect
(
domain
)
for
folder
in
domain_folders
[
domain
]:
user
=
folder
.
replace
(
'user/'
,
''
)
try
:
recipient
=
auth
.
find_recipient
(
user
)
except
ldap
.
NO_SUCH_OBJECT
,
errmsg
:
if
not
user
in
subjects_deleted
and
conf
.
dryrun
:
subjects_deleted
.
append
(
user
)
if
conf
.
dryrun
:
log
.
info
(
_
(
"Would have deleted folder 'user/
%s
' (dryrun)"
)
%
(
user
))
else
:
log
.
info
(
_
(
"Deleting folder 'user/
%s
'"
)
%
(
user
))
continue
if
len
(
recipient
)
==
0
or
recipient
==
[]:
if
not
user
in
subjects_deleted
and
conf
.
dryrun
:
subjects_deleted
.
append
(
user
)
if
conf
.
dryrun
:
log
.
info
(
_
(
"Would have deleted folder 'user/
%s
' (dryrun)"
)
%
(
user
))
else
:
log
.
info
(
_
(
"Deleting folder 'user/
%s
'"
)
%
(
user
))
try
:
imap
.
dm
(
folder
)
except
:
log
.
error
(
_
(
"Error deleting folder 'user/
%s
'"
)
%
(
user
))
else
:
log
.
debug
(
_
(
"Valid recipient found for 'user/
%s
'"
)
%
(
user
),
level
=
6
)
if
not
user
in
subjects
:
subjects
.
append
(
user
)
imap_domains
=
[]
folders
=
imap
.
lm
()
for
folder
in
folders
:
namespace
=
folder
.
split
(
'/'
)[
0
]
mailbox
=
folder
.
split
(
'/'
)[
1
]
if
len
(
mailbox
.
split
(
'@'
))
>
1
:
domain
=
mailbox
.
split
(
'@'
)[
1
]
if
not
domain
in
domains
.
keys
()
and
not
domain
in
imap_domains
:
imap_domains
.
append
(
domain
)
for
domain
in
imap_domains
:
for
folder
in
imap
.
lm
(
'user/
%%
@
%s
'
%
(
domain
)):
user
=
folder
.
replace
(
'user/'
,
''
)
if
not
user
in
subjects_deleted
and
conf
.
dryrun
:
subjects_deleted
.
append
(
user
)
if
conf
.
dryrun
:
log
.
info
(
_
(
"Would have deleted folder '
%s
' (dryrun)"
)
%
(
folder
))
else
:
log
.
info
(
_
(
"Deleting folder '
%s
'"
)
%
(
folder
))
try
:
imap
.
dm
(
folder
)
except
:
log
.
error
(
_
(
"Error deleting folder '
%s
'"
)
%
(
folder
))
for
folder
in
imap
.
lm
(
'shared/
%%
@
%s
'
%
(
domain
)):
if
conf
.
dryrun
:
log
.
info
(
_
(
"Would have deleted folder '
%s
' (dryrun)"
)
%
(
folder
))
else
:
log
.
info
(
_
(
"Deleting folder '
%s
'"
)
%
(
folder
))
try
:
imap
.
dm
(
folder
)
except
:
log
.
error
(
_
(
"Error deleting folder '
%s
'"
)
%
(
folder
))
for
folder
in
[
x
for
x
in
imap
.
lm
()
if
not
x
.
startswith
(
'DELETED/'
)]:
folder
=
imap_utf7
.
decode
(
folder
)
acls
=
imap
.
list_acls
(
folder
)
for
subject
in
acls
.
keys
():
if
subject
==
'anyone'
:
log
.
info
(
_
(
"Skipping removal of ACL
%s
for subject
%s
on folder
%s
"
)
%
(
acls
[
subject
],
subject
,
folder
)
)
continue
if
not
subject
in
subjects
and
not
subject
in
subjects_deleted
:
if
conf
.
dryrun
:
log
.
info
(
_
(
"Would have deleted ACL
%s
for subject
%s
on folder
%s
"
)
%
(
acls
[
subject
],
subject
,
folder
)
)
else
:
log
.
info
(
_
(
"Deleting ACL
%s
for subject
%s
on folder
%s
"
)
%
(
acls
[
subject
],
subject
,
folder
)
)
try
:
imap
.
set_acl
(
folder
,
aci_subject
,
''
)
except
:
log
.
error
(
_
(
"Error removing ACL
%s
for subject
%s
from folder
%s
"
)
%
(
acls
[
subject
],
subject
,
folder
)
)
File Metadata
Details
Attached
Mime Type
text/x-script.python
Expires
Fri, Apr 24, 9:49 AM (1 w, 4 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
e7/b2/b7d41fd2db15233e3bc7ba84fd5a
Default Alt Text
cmd_mailbox_cleanup.py (6 KB)
Attached To
Mode
rP pykolab
Attached
Detach File
Event Timeline