]>
code.delx.au - offlineimap/blob - offlineimap/init.py
480778f1712c937da3d4e67e01fa31c25f3e66e3
1 # OfflineIMAP initialization code
2 # Copyright (C) 2002-2007 John Goerzen
3 # <jgoerzen@complete.org>
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 from offlineimap
import imapserver
, repository
, folder
, mbnames
, threadutil
, version
, syncmaster
, accounts
21 from offlineimap
. localeval
import LocalEval
22 from offlineimap
. threadutil
import InstanceLimitedThread
, ExitNotifyThread
23 from offlineimap
. ui
import UIBase
24 import re
, os
, os
. path
, offlineimap
, sys
25 from offlineimap
. CustomConfig
import CustomConfigParser
26 from threading
import *
27 import threading
, socket
28 from getopt
import getopt
39 global lockfd
, hasfcntl
42 lockfd
= open ( config
. getmetadatadir () + "/lock" , "w" )
44 fcntl
. flock ( lockfd
, fcntl
. LOCK_EX | fcntl
. LOCK_NB
)
49 def startup ( versionno
):
50 assert versionno
== version
. versionstr
, "Revision of main program ( %s ) does not match that of library ( %s ). Please double-check your PYTHONPATH and installation locations." % ( versionno
, version
. versionstr
)
52 if '--help' in sys
. argv
[ 1 :]:
53 sys
. stdout
. write ( version
. getcmdhelp () + " \n " )
56 for optlist
in getopt ( sys
. argv
[ 1 :], 'P:1oa:c:d:l:u:h' )[ 0 ]:
57 options
[ optlist
[ 0 ]] = optlist
[ 1 ]
59 if options
. has_key ( '-h' ):
60 sys
. stdout
. write ( version
. getcmdhelp ())
61 sys
. stdout
. write ( " \n " )
63 configfilename
= os
. path
. expanduser ( "~/.offlineimaprc" )
64 if options
. has_key ( '-c' ):
65 configfilename
= options
[ '-c' ]
66 if options
. has_key ( '-P' ):
67 if not options
. has_key ( '-1' ):
68 sys
. stderr
. write ( "FATAL: profile mode REQUIRES -1 \n " )
70 profiledir
= options
[ '-P' ]
72 threadutil
. setprofiledir ( profiledir
)
73 sys
. stderr
. write ( "WARNING: profile mode engaged; \n Potentially large data will be created in " + profiledir
+ " \n " )
75 config
= CustomConfigParser ()
76 if not os
. path
. exists ( configfilename
):
77 sys
. stderr
. write ( " *** Config file %s does not exist; aborting! \n " % configfilename
)
80 config
. read ( configfilename
)
82 ui
= offlineimap
. ui
. detector
. findUI ( config
, options
. get ( '-u' ))
83 UIBase
. setglobalui ( ui
)
85 if options
. has_key ( '-l' ):
86 ui
. setlogfd ( open ( options
[ '-l' ], 'wt' ))
90 if options
. has_key ( '-d' ):
91 for debugtype
in options
[ '-d' ]. split ( ',' ):
92 ui
. add_debug ( debugtype
. strip ())
93 if debugtype
== 'imap' :
95 if debugtype
== 'thread' :
96 threading
._ VERBOSE
= 1
98 if options
. has_key ( '-o' ):
99 # FIXME: maybe need a better
100 for section
in accounts
. getaccountlist ( config
):
101 config
. remove_option ( 'Account ' + section
, "autorefresh" )
106 pidfd
= open ( config
. getmetadatadir () + "/pid" , "w" )
107 pidfd
. write ( os
. getpid ())
113 if options
. has_key ( '-l' ):
114 sys
. stderr
= ui
. logfile
116 socktimeout
= config
. getdefaultint ( "general" , "socktimeout" , 0 )
118 socket
. setdefaulttimeout ( socktimeout
)
120 activeaccounts
= config
. get ( "general" , "accounts" )
121 if options
. has_key ( '-a' ):
122 activeaccounts
= options
[ '-a' ]
123 activeaccounts
= activeaccounts
. replace ( " " , "" )
124 activeaccounts
= activeaccounts
. split ( "," )
125 allaccounts
= accounts
. AccountHashGenerator ( config
)
128 for account
in activeaccounts
:
129 if account
not in allaccounts
:
130 if len ( allaccounts
) == 0 :
131 errormsg
= 'The account " %s " does not exist because no accounts are defined!' % account
133 errormsg
= 'The account " %s " does not exist. Valid accounts are:' % account
134 for name
in allaccounts
. keys ():
135 errormsg
+= ' \n %s ' % name
136 ui
. terminate ( 1 , errortitle
= 'Unknown Account " %s "' % account
, errormsg
= errormsg
)
137 syncaccounts
[ account
] = allaccounts
[ account
]
143 if options
. has_key ( '-1' ):
144 threadutil
. initInstanceLimit ( "ACCOUNTLIMIT" , 1 )
146 threadutil
. initInstanceLimit ( "ACCOUNTLIMIT" ,
147 config
. getdefaultint ( "general" , "maxsyncaccounts" , 1 ))
149 for reposname
in config
. getsectionlist ( 'Repository' ):
150 for instancename
in [ "FOLDER_" + reposname
,
151 "MSGCOPY_" + reposname
]:
152 if options
. has_key ( '-1' ):
153 threadutil
. initInstanceLimit ( instancename
, 1 )
155 threadutil
. initInstanceLimit ( instancename
,
156 config
. getdefaultint ( 'Repository ' + reposname
, "maxconnections" , 1 ))
158 threadutil
. initexitnotify ()
159 t
= ExitNotifyThread ( target
= syncmaster
. syncitall
,
161 kwargs
= { 'accounts' : syncaccounts
,
169 threadutil
. exitnotifymonitorloop ( threadutil
. threadexited
)
173 ui
. mainException () # Also expected to terminate.