3 """ Sync PostgreSQL users with system users """
4 # Copyright (C) 2001, 2002, 2006 James Troup <james@nocrew.org>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 ################################################################################
23 # <aj> what's wrong with me!?!?!?
24 # <aj> i was just nice to some mormon doorknockers!!!
27 # <Omnic> I'm gonna have to kick your ass when you come over
28 # <Culus> aj: GET THE HELL OUT OF THE CABAL! :P
30 ################################################################################
37 from daklib.config import Config
38 from daklib.dbconn import *
39 from daklib import utils
41 ################################################################################
43 def usage (exit_code=0):
44 print """Usage: dak import-users-from-passwd [OPTION]...
45 Sync PostgreSQL's users with system users.
47 -h, --help show this help and exit
48 -n, --no-action don't do anything
49 -q, --quiet be quiet about what is being done
50 -v, --verbose explain what is being done"""
53 ################################################################################
58 Arguments = [('n', "no-action", "Import-Users-From-Passwd::Options::No-Action"),
59 ('q', "quiet", "Import-Users-From-Passwd::Options::Quiet"),
60 ('v', "verbose", "Import-Users-From-Passwd::Options::Verbose"),
61 ('h', "help", "Import-Users-From-Passwd::Options::Help")]
62 for i in [ "no-action", "quiet", "verbose", "help" ]:
63 if not cnf.has_key("Import-Users-From-Passwd::Options::%s" % (i)):
64 cnf["Import-Users-From-Passwd::Options::%s" % (i)] = ""
66 arguments = apt_pkg.ParseCommandLine(cnf.Cnf, Arguments, sys.argv)
67 Options = cnf.SubTree("Import-Users-From-Passwd::Options")
72 utils.warn("dak import-users-from-passwd takes no non-option arguments.")
75 session = DBConn().session()
76 valid_gid = int(cnf.get("Import-Users-From-Passwd::ValidGID",""))
79 for entry in pwd.getpwall():
82 if valid_gid and gid != valid_gid:
83 if Options["Verbose"]:
84 print "Skipping %s (GID %s != Valid GID %s)." % (uname, gid, valid_gid)
86 passwd_unames[uname] = ""
89 q = session.execute("SELECT usename FROM pg_user")
90 for i in q.fetchall():
92 postgres_unames[uname] = ""
94 known_postgres_unames = {}
95 for i in cnf.get("Import-Users-From-Passwd::KnownPostgres","").split(","):
97 known_postgres_unames[uname] = ""
99 keys = postgres_unames.keys()
102 if not passwd_unames.has_key(uname) and not known_postgres_unames.has_key(uname):
103 print "I: Deleting %s from Postgres, no longer in passwd or list of known Postgres users" % (uname)
104 q = session.execute('DROP USER "%s"' % (uname))
106 keys = passwd_unames.keys()
108 safe_name = re.compile('^[A-Za-z0-9]+$')
110 if not postgres_unames.has_key(uname):
111 if not Options["Quiet"]:
112 print "Creating %s user in Postgres." % (uname)
113 if not Options["No-Action"]:
114 if safe_name.match(uname):
115 # NB: I never figured out how to use a bind parameter for this query
116 # XXX: Fix this as it looks like a potential SQL injection attack to me
117 # (hence the safe_name match we do)
118 q = session.execute('CREATE USER "%s"' % (uname))
120 print "NOT CREATING USER %s. Doesn't match safety regex" % uname
124 #######################################################################################
126 if __name__ == '__main__':