[Zope-Checkins] SVN: Zope/trunk/ Support for using zopectl on
Windows has been added. All commands are supported and there
are two Windows specific ones: install and remove,
which install or remove the Windows service. The start,
stop and restart commands handle the Windows service.
Hanno Schlichting
plone at hannosch.info
Thu May 3 14:35:21 EDT 2007
Log message for revision 75066:
Support for using zopectl on Windows has been added. All commands are supported and there are two Windows specific ones: install and remove, which install or remove the Windows service. The start, stop and restart commands handle the Windows service.
Changed:
U Zope/trunk/doc/CHANGES.txt
U Zope/trunk/lib/python/Zope2/Startup/zopectl.py
A Zope/trunk/skel/bin/zopectl.bat.in
-=-
Modified: Zope/trunk/doc/CHANGES.txt
===================================================================
--- Zope/trunk/doc/CHANGES.txt 2007-05-03 18:27:55 UTC (rev 75065)
+++ Zope/trunk/doc/CHANGES.txt 2007-05-03 18:35:20 UTC (rev 75066)
@@ -51,6 +51,12 @@
Features added
+ - Support for using zopectl on Windows has been added. All commands are
+ supported and there are two Windows specific ones: install and remove,
+ which install or remove the Windows service. The start, stop and
+ restart commands handle the Windows service. In order to use them, you
+ need to call 'bin\zopectl install' once.
+
- ZCatalog result objects (catalog brains) now have an interface,
ZCatalog.interfaces.ICatalogBrain.
Modified: Zope/trunk/lib/python/Zope2/Startup/zopectl.py
===================================================================
--- Zope/trunk/lib/python/Zope2/Startup/zopectl.py 2007-05-03 18:27:55 UTC (rev 75065)
+++ Zope/trunk/lib/python/Zope2/Startup/zopectl.py 2007-05-03 18:35:20 UTC (rev 75066)
@@ -48,6 +48,9 @@
from ZConfig.components.logger.handlers import FileHandlerFactory
from ZConfig.datatypes import existing_dirpath
+WIN = False
+if sys.platform[:3].lower() == "win":
+ WIN = True
def string_list(arg):
return arg.split()
@@ -127,6 +130,12 @@
self.python = sys.executable
self.zdrun = os.path.join(os.path.dirname(zdaemon.__file__),
"zdrun.py")
+ if WIN:
+ # Add the path to the zopeservice.py script, which is needed for
+ # some of the Windows specific commands
+ servicescript = os.path.join(self.directory, 'bin', 'zopeservice.py')
+ self.servicescript = '"%s" %s' % (self.python, servicescript)
+
self.exitcodes = [0, 2]
if self.logfile is None and config.eventlog is not None:
for handler in config.eventlog.handler_factories:
@@ -158,11 +167,59 @@
args = [opt, svalue]
return args
+ if WIN:
+ def get_status(self):
+ # get_status from zdaemon relies on *nix specific socket handling.
+ # We just don't support getting the status and sending actions to
+ # the control server on Windows. This could be extended to ask for
+ # the status of the Windows service though
+ self.zd_up = 0
+ self.zd_pid = 0
+ self.zd_status = None
+ return
+
+ def do_stop(self, arg):
+ # Stop the Windows service
+ program = "%s stop" % self.options.servicescript
+ print program
+ os.system(program)
+
+ def do_restart(self, arg):
+ # Restart the Windows service
+ program = "%s restart" % self.options.servicescript
+ print program
+ os.system(program)
+
+ # Add extra commands to install and remove the Windows service
+
+ def do_install(self, arg):
+ program = "%s install" % self.options.servicescript
+ print program
+ os.system(program)
+
+ def help_install(self):
+ print "install -- Installs Zope as a Windows service."
+
+ def do_remove(self, arg):
+ program = "%s remove" % self.options.servicescript
+ print program
+ os.system(program)
+
+ def help_remove(self):
+ print "remove -- Removes the Zope Windows service."
+
def do_start(self, arg):
# signal to Zope that it is being managed
- #(to indicate it's web-restartable)
+ # (to indicate it's web-restartable)
os.putenv('ZMANAGED', '1')
- ZDCmd.do_start(self, arg)
+ if WIN:
+ # On Windows start the service, this fails with a reasonable
+ # error message as long as the service is not installed
+ program = "%s start" % self.options.servicescript
+ print program
+ os.system(program)
+ else:
+ ZDCmd.do_start(self, arg)
def get_startup_cmd(self, python, more):
cmdline = ( '%s -c "from Zope2 import configure;'
@@ -179,12 +236,17 @@
os.system(cmdline)
def do_foreground(self, arg):
- self.options.program[1:1] = ["-X", "debug-mode=on"]
- try:
+ if WIN:
+ # Adding arguments to the program is not supported on Windows
+ # and the runzope script doesn't put you in debug-mode either
ZDCmd.do_foreground(self, arg)
- finally:
- self.options.program.remove("-X")
- self.options.program.remove("debug-mode=on")
+ else:
+ self.options.program[1:1] = ["-X", "debug-mode=on"]
+ try:
+ ZDCmd.do_foreground(self, arg)
+ finally:
+ self.options.program.remove("-X")
+ self.options.program.remove("debug-mode=on")
def help_debug(self):
print "debug -- run the Zope debugger to inspect your database"
@@ -262,19 +324,23 @@
args.insert(0, self.options.python)
print 'Running tests via: %s' % ' '.join(args)
- pid = os.fork()
- if pid == 0: # child
- os.execv(self.options.python, args)
-
- # Parent process running (execv replaces process in child
- while True:
- try:
- os.waitpid(pid, 0)
- except (OSError, KeyboardInterrupt):
- continue
- else:
- break
+ if WIN:
+ # Windows process handling is quite different
+ os.system(' '.join(args))
+ else:
+ pid = os.fork()
+ if pid == 0: # child
+ os.execv(self.options.python, args)
+ # Parent process running (execv replaces process in child
+ while True:
+ try:
+ os.waitpid(pid, 0)
+ except (OSError, KeyboardInterrupt):
+ continue
+ else:
+ break
+
def help_test(self):
print "test [args]+ -- run unit / functional tests."
print " See $ZOPE_HOME/bin/test.py --help for syntax."
@@ -317,7 +383,8 @@
# If it is not reset, 'os.wait[pid]' can non-deterministically fail.
# Thus, use a way such that "SIGCHLD" is definitely reset in children.
#signal.signal(signal.SIGCHLD, signal.SIG_IGN)
- if os.uname()[0] != 'Darwin':
+ if not WIN and os.uname()[0] != 'Darwin':
+ # On Windows the os.uname method does not exist.
# On Mac OS X, setting up a signal handler causes waitpid to
# raise EINTR, which is not preventable via the Python signal
# handler API and can't be dealt with properly as we can't pass
Copied: Zope/trunk/skel/bin/zopectl.bat.in (from rev 75039, Zope/trunk/skel/bin/runzope.bat.in)
===================================================================
--- Zope/trunk/skel/bin/runzope.bat.in 2007-05-03 07:18:30 UTC (rev 75039)
+++ Zope/trunk/skel/bin/zopectl.bat.in 2007-05-03 18:35:20 UTC (rev 75066)
@@ -0,0 +1,8 @@
+ at set ZOPE_HOME=<<ZOPE_HOME>>
+ at set INSTANCE_HOME=<<INSTANCE_HOME>>
+ at set PYTHON=%ZOPE_HOME%\bin\python.exe
+ at set SOFTWARE_HOME=%ZOPE_HOME%\lib\python
+ at set CONFIG_FILE=%INSTANCE_HOME%\etc\zope.conf
+ at set PYTHONPATH=%SOFTWARE_HOME%
+ at set ZDCTL=%SOFTWARE_HOME%\Zope2\Startup\zopectl.py
+"%PYTHON%" "%ZDCTL%" -C "%CONFIG_FILE%" %1 %2 %3 %4 %5 %6 %7
More information about the Zope-Checkins
mailing list