[Twisted-Python] twistd and passphrase

Mike Pelletier mike at mkp.ca
Tue Sep 5 11:18:49 MDT 2006


On Tuesday 05 September 2006 12:21, Lorenzo Allegrucci wrote:
> Hi,
>
> I'm using twistd to run my server as a daemon but I couldn't find a way
> to prompt the user for a passphrase (such passphrase is used by the
> server to read its SSL key).  I tried getpass() but it doesn't work
> because /dev/stdin is already redirected to /dev/null.  How can I ask
> for a passphrase using twistd?
> Thank you

Hi, Lorenzo.  I'm going to assume you are completely new to Twisted.  
Apologies if this is not so; just skip ahead 2-4 paragraphs.  Apologies also 
for my awkward writing.

Abstractly, the way to do this is to write a Protocol that uses a Transport to 
prompt the user and receive their response, and wire it all together with a 
Factory.  (Though in the case of stdio, the Factory is purely conceptual as 
explained below.)

A Protocol is responsible for the reading and writing of a connection, without 
concern for the exact nature of that connection.  A Transport is concerned 
with the nature of a connection without having to know anything about where 
the connection came from.  And a Factory is responsible for the creation of 
connections (either by originating or accepting them), creating the Transport 
object that will represent and manage that connection, and attaching a 
Protocol to the Transport.  Though I think that for your immediate purposes, 
you can ignore Factories, since when twisted starts up stdio is 
already "connected".

Less abstractly, what you need to do is instantiate 
twisted.internet.stdio.StandardIO, which is a Transport, passing the 
constructor an instance of your password-prompting Protocol.  In doing this, 
you are acting as the Factory by "accepting" the stdio connection, creating a 
Transport to deal with the connection, and associating the Transport with a 
Protocol.

As I said at the beginning, you will need to write the Protocol class 
yourself.  There is an example of a Protocol that uses the StandardIO 
Transport in twisted.test.process_twisted which you can use as a model.  I 
kinda think there already exists a Protocol that does what you need 
(including turning off character echoing, etc) but I cannot recall where I 
might have encountered it.  Perhaps someone else can help there.

If you want your server to be able to start up unattended (for instance, 
whenever the system is rebooted) you might want to consider using telnet or 
SSH rather than stdin for reading the password.  You should be able to re-use 
the same Protocol (except maybe for the part that turns off echoing).  You 
are never going to be able to read a password from stdin if twisted is 
starting up in daemon mode.  As you noticed, in daemon mode stdin has been 
closed before you have a chance to do anything with it.  You would instead 
have to start it in "foreground" mode, then read the password with your 
Protocol, and once the password has been validated ask twistd to switch to 
daemon mode.  (If indeed there even exists an interface for daemonizing after 
the fact; I've never looked.)  And of course, if you launch twistd in 
foreground mode from a boot script, the boot process will block until someone 
comes along and types the password, which is usually a Bad Thing.

Gosh, that was even an more awkward explanation than I'd expected.  I hope you 
manage to get something out of it.

Mike.




More information about the Twisted-Python mailing list