Exemple #1
0
 def handle(self, *args, **options):
     self.options = options
     try:
         load_configuration_file(self.options['config'])
         if settings.config.has_key('username'):
             if settings.config['username'].endswith(DebianUser.base_dn):
                 settings.DATABASES['ldap']['USER'] = settings.config[
                     'username']
             else:
                 settings.DATABASES['ldap']['USER'] = '******' % (
                     settings.config['username'], DebianUser.base_dn)
         else:
             raise CommandError(
                 _('configuration file must specify username parameter'))
         if settings.config.has_key('password'):
             settings.DATABASES['ldap']['PASSWORD'] = settings.config[
                 'password']
         else:
             raise CommandError(
                 _('configuration file must specify password parameter'))
         message = email.message_from_file(sys.stdin)
         result = self.process_message(message)
         self.generate_reply(message, result)
     except Exception as err:
         raise CommandError(err)
Exemple #2
0
    def handle(self, *args, **options):
        self.options = options

        logged_in_uid = ''

        try:
            load_configuration_file(options['config'])
        except Exception as err:
            raise CommandError(err)

        if not options['binddn']:
            options['binddn'] = getpass.getuser()
        if options['binddn'].endswith(DebianUser.base_dn):
            settings.DATABASES['ldap']['USER'] = options['binddn']
            logged_in_uid = options['binddn'].split(',')[0].split('=')[0]
        else:
            settings.DATABASES['ldap']['USER'] = '******' % (
                options['binddn'], DebianUser.base_dn)
            logged_in_uid = options['binddn']

        if not options['passwd']:
            try:
                options['passwd'] = getpass.getpass()
            except EOFError:
                self.stdout.write('\n')
                return
        if not options['passwd']:
            raise CommandError(_('must specify password'))
        settings.DATABASES['ldap']['PASSWORD'] = options['passwd']

        try:
            logged_in_user = DebianUser.objects.get(uid=logged_in_uid)
            self.error = False
            if args:
                for looked_up_uid in args:
                    try:
                        looked_up_user = DebianUser.objects.get(
                            uid__exact=looked_up_uid)
                        self.validate_user(looked_up_user)
                    except ObjectDoesNotExist:
                        self.error = True
                        if options['verbosity'] > '0':
                            self.stdout.write(
                                _('nak:%s:uid does not exist\n' % (uid)))
            else:
                looked_up_users = DebianUser.objects.all()
                for looked_up_user in looked_up_users:
                    self.validate_user(looked_up_user)
            if self.error:
                raise CommandError(_('validation errors detected'))
        except ObjectDoesNotExist:
            raise CommandError(_('user not found'))
        except ldap.INVALID_CREDENTIALS:
            raise CommandError(_('invalid credentials'))
        except Exception as err:
            raise CommandError(err)
Exemple #3
0
    def handle(self, *args, **options):
        self.options = options

        logged_in_uid = ''

        try:
            load_configuration_file(options['config'])
        except Exception as err:
            raise CommandError(err)

        if not options['binddn']:
            options['binddn'] = getpass.getuser()
        if options['binddn'].endswith(User.base_dn):
            settings.DATABASES['ldap']['USER'] = options['binddn']
            logged_in_uid = options['binddn'].split(',')[0].split('=')[0]
        else:
            settings.DATABASES['ldap']['USER'] = '******' % (options['binddn'], User.base_dn)
            logged_in_uid = options['binddn']

        if not options['passwd']:
            try:
                options['passwd'] = getpass.getpass()
            except EOFError:
                self.stdout.write('\n')
                return
        if not options['passwd']:
            raise CommandError('must specify password')
        settings.DATABASES['ldap']['PASSWORD'] = options['passwd']

        try:
            logged_in_user = User.objects.get(uid=logged_in_uid)
            self.error = False
            if args:
                for looked_up_uid in args:
                    try:
                        looked_up_user = User.objects.get(uid__exact=looked_up_uid)
                        self.validate_user(looked_up_user)
                    except ObjectDoesNotExist:
                        self.error = True
                        if options['verbosity'] > '0':
                            self.stdout.write('nak:%s:uid does not exist\n' % (uid))
            else:
                looked_up_users = User.objects.all()
                for looked_up_user in looked_up_users:
                    self.validate_user(looked_up_user)
            if self.error:
                raise CommandError('validation errors detected')
        except ObjectDoesNotExist:
            raise CommandError('user not found')
        except ldap.INVALID_CREDENTIALS:
            raise CommandError('invalid credentials')
        except Exception as err:
            raise CommandError(err)
Exemple #4
0
 def handle(self, *args, **options):
     self.options = options
     try:
         load_configuration_file(self.options['config'])
         if settings.config.has_key('username'):
             if settings.config['username'].endswith(DebianUser.base_dn):
                 settings.DATABASES['ldap']['USER'] = settings.config[
                     'username']
             else:
                 settings.DATABASES['ldap']['USER'] = '******' % (
                     settings.config['username'], DebianUser.base_dn)
         else:
             raise CommandError(
                 _('configuration file must specify username parameter'))
         if settings.config.has_key('password'):
             settings.DATABASES['ldap']['PASSWORD'] = settings.config[
                 'password']
         else:
             raise CommandError(
                 _('configuration file must specify password parameter'))
         message = email.message_from_file(sys.stdin)
         user = None
         key = ''
         val = '[%s]' % (time.strftime("%a, %d %b %Y %H:%M:%S",
                                       time.gmtime(time.time())))
         if not key:  # determine user from signature
             try:
                 (fingerprint, content, timestamp) = verify_message(message)
                 user = get_user_from_fingerprint(fingerprint)
                 key = 'activityPGP'
                 val += ' "%s" ' % (fingerprint)
             except:
                 pass
         if not key:  # determine user from headers
             try:
                 user = get_user_from_headers(message)
                 key = 'activityFrom'
                 val += ' "%s" ' % (message.get('From'))
             except:
                 pass
         if user:
             val += ' "%s" "%s"' % (message.get('X-Mailing-List'),
                                    message.get('Message-ID'))
             if self.options['dryrun']:
                 sys.stdout.write('%s: %s\n' % (key, val))
             else:
                 user.do_update(key, val)
                 user.save()
     except Exception as err:
         raise CommandError(err)
Exemple #5
0
    def handle(self, *args, **options):
        logged_in_uid = ''
        looked_up_uid = ''

        if len(args) == 0:
            looked_up_uid = getpass.getuser()
        elif len(args) == 1:
            looked_up_uid = args[0]
        else:
            raise CommandError(_('must specify at most one uid as argument'))

        try:
            load_configuration_file(options['config'])
        except Exception as err:
            raise CommandError(err)

        if not options['binddn']:
            options['binddn'] = getpass.getuser()
        if options['binddn'].endswith(DebianUser.base_dn):
            settings.DATABASES['ldap']['USER'] = options['binddn']
            logged_in_uid = options['binddn'].split(',')[0].split('=')[0]
        else:
            settings.DATABASES['ldap']['USER'] = '******' % (
                options['binddn'], DebianUser.base_dn)
            logged_in_uid = options['binddn']

        if not options['passwd']:
            try:
                options['passwd'] = getpass.getpass()
            except EOFError:
                self.stdout.write('\n')
                return
        if not options['passwd']:
            raise CommandError(_('must specify password'))
        settings.DATABASES['ldap']['PASSWORD'] = options['passwd']

        try:
            logged_in_user = DebianUser.objects.get(uid=logged_in_uid)
            looked_up_user = DebianUser.objects.get(uid=looked_up_uid)
            if logged_in_user.dn is looked_up_user.dn or 'adm' in logged_in_user.supplementaryGid:
                Handler(self.stdout, looked_up_user, logged_in_user).cmdloop()
            else:
                raise CommandError(_('insufficient privileges'))
        except ObjectDoesNotExist:
            raise CommandError(_('user not found'))
        except ldap.INVALID_CREDENTIALS:
            raise CommandError(_('invalid credentials'))
        except Exception as err:
            raise CommandError(err)
Exemple #6
0
    def handle(self, *args, **options):
        logged_in_uid = ''
        looked_up_uid = ''

        if len(args) == 0:
            looked_up_uid = getpass.getuser()
        elif len(args) == 1:
            looked_up_uid = args[0]
        else:
            raise CommandError(_('must specify at most one uid as argument'))

        try:
            load_configuration_file(options['config'])
        except Exception as err:
            raise CommandError(err)

        if not options['binddn']:
            options['binddn'] = getpass.getuser()
        if options['binddn'].endswith(DebianUser.base_dn):
            settings.DATABASES['ldap']['USER'] = options['binddn']
            logged_in_uid = options['binddn'].split(',')[0].split('=')[0]
        else:
            settings.DATABASES['ldap']['USER'] = '******' % (options['binddn'], DebianUser.base_dn)
            logged_in_uid = options['binddn']

        if not options['passwd']:
            try:
                options['passwd'] = getpass.getpass()
            except EOFError:
                self.stdout.write('\n')
                return
        if not options['passwd']:
            raise CommandError(_('must specify password'))
        settings.DATABASES['ldap']['PASSWORD'] = options['passwd']

        try:
            logged_in_user = DebianUser.objects.get(uid=logged_in_uid)
            looked_up_user = DebianUser.objects.get(uid=looked_up_uid)
            if logged_in_user.dn is looked_up_user.dn or 'adm' in logged_in_user.supplementaryGid:
                Handler(self.stdout, looked_up_user, logged_in_user).cmdloop()
            else:
                raise CommandError(_('insufficient privileges'))
        except ObjectDoesNotExist:
            raise CommandError(_('user not found'))
        except ldap.INVALID_CREDENTIALS:
            raise CommandError(_('invalid credentials'))
        except Exception as err:
            raise CommandError(err)
Exemple #7
0
 def handle(self, *args, **options):
     self.options = options
     try:
         load_configuration_file(self.options['config'])
         if settings.config.has_key('username'):
             if settings.config['username'].endswith(DebianUser.base_dn):
                 settings.DATABASES['ldap']['USER'] = settings.config['username']
             else:
                 settings.DATABASES['ldap']['USER'] = '******' % (settings.config['username'], DebianUser.base_dn)
         else:
             raise CommandError(_('configuration file must specify username parameter'))
         if settings.config.has_key('password'):
             settings.DATABASES['ldap']['PASSWORD'] = settings.config['password']
         else:
             raise CommandError(_('configuration file must specify password parameter'))
     except Exception as err:
         raise CommandError(err)
     self.dstdir = os.path.join(settings.CACHE_DIR, 'hosts')
     self.makedirs(self.dstdir)
     self.tpldir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'templates'))
     self.finder = TemplateLookup(directories=[self.tpldir], encoding_errors='ignore', output_encoding='utf-8')
     try:
         with open(os.path.join(self.dstdir, 'ud-generate.lock'), 'w') as f:
             lock_acquired = False
             lock_time_out = time.time() + 300
             while not lock_acquired:
                 try:
                     fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
                     lock_acquired = True
                 except IOError:
                     if time.time() > lock_time_out:
                         raise Exception(_('unable to acquire lock'))
                     time.sleep(2)
             if self.options['force'] or self.need_update() :
                 with open(os.path.join(self.dstdir, 'last_update.trace'), 'w') as f:
                     self.marshall()
                     self.generate()
                     last_generate = datetime.utcnow().strftime('%Y%m%d%H%M%S.%fZ')
                     if not hasattr(self, 'last_file_mod') :
                         self.last_file_mod = last_generate
                     if not hasattr(self, 'last_ldap_mod') :
                         self.last_ldap_mod = last_generate
                     f.write(yaml.dump({'last_file_mod': self.last_file_mod, 'last_ldap_mod': self.last_ldap_mod, 'last_generate': last_generate}))
                 if self.options['mq']:
                     notify_via_mq(self.options, 'Update forced' if self.options['force'] else 'Update needed')
     except Exception as err:
         raise CommandError(err)
Exemple #8
0
 def handle(self, *args, **options):
     self.options = options
     try:
         load_configuration_file(self.options['config'])
         if settings.config.has_key('username'):
             if settings.config['username'].endswith(DebianUser.base_dn):
                 settings.DATABASES['ldap']['USER'] = settings.config['username']
             else:
                 settings.DATABASES['ldap']['USER'] = '******' % (settings.config['username'], DebianUser.base_dn)
         else:
             raise CommandError(_('configuration file must specify username parameter'))
         if settings.config.has_key('password'):
             settings.DATABASES['ldap']['PASSWORD'] = settings.config['password']
         else:
             raise CommandError(_('configuration file must specify password parameter'))
         message = email.message_from_file(sys.stdin)
         user = None
         key = ''
         val = '[%s]' % ( time.strftime("%a, %d %b %Y %H:%M:%S",time.gmtime(time.time())) )
         if not key: # determine user from signature
             try:
                 (fingerprint, content, timestamp) = verify_message(message)
                 user = get_user_from_fingerprint(fingerprint)
                 key = 'activityPGP'
                 val += ' "%s" ' % (fingerprint)
             except:
                 pass
         if not key: # determine user from headers
             try:
                 user = get_user_from_headers(message)
                 key = 'activityFrom'
                 val += ' "%s" ' % (message.get('From'))
             except:
                 pass
         if user:
             val += ' "%s" "%s"' % (message.get('X-Mailing-List'), message.get('Message-ID'))
             if self.options['dryrun']:
                 sys.stdout.write('%s: %s\n' % (key, val))
             else:
                 user.do_update(key, val)
                 user.save()
     except Exception as err:
         raise CommandError(err)
Exemple #9
0
 def handle(self, *args, **options):
     self.options = options
     try:
         load_configuration_file(self.options['config'])
         if settings.config.has_key('username'):
             if settings.config['username'].endswith(User.base_dn):
                 settings.DATABASES['ldap']['USER'] = settings.config['username']
             else:
                 settings.DATABASES['ldap']['USER'] = '******' % (settings.config['username'], User.base_dn)
         else:
             raise CommandError('configuration file must specify username parameter')
         if settings.config.has_key('password'):
             settings.DATABASES['ldap']['PASSWORD'] = settings.config['password']
         else:
             raise CommandError('configuration file must specify password parameter')
         message = email.message_from_file(sys.stdin)
         result = self.process_message(message)
         self.generate_reply(message, result)
     except Exception as err:
         raise CommandError(err)
Exemple #10
0
 def handle(self, *args, **options):
     self.options = options
     try:
         load_configuration_file(self.options['config'])
         if self.options['inetd']:
             try:
                 handler = GenericHandler()
                 uid = sys.stdin.readline(512).strip()
                 sys.stdout.write(handler.handle(uid).encode('utf-8'))
             except Exception as err:
                 sys.stdout.write(u'error has occured\n'.encode('utf-8'))
             finally:
                 sys.stdout.flush()
         else: # run as daemon
             server = FingerServer(('', 79), FingerHandler)
             if self.options['foreground']:
                 server.serve_forever()
             else:
                 with daemon.DaemonContext(uid=pwd.getpwnam('nobody').pw_uid, gid=grp.getgrnam('nogroup').gr_gid):
                     server.serve_forever()
     except Exception as err:
         raise CommandError(err)
Exemple #11
0
 def handle(self, *args, **options):
     self.options = options
     try:
         load_configuration_file(self.options['config'])
         if settings.config.has_key('username'):
             if settings.config['username'].endswith(User.base_dn):
                 settings.DATABASES['ldap']['USER'] = settings.config['username']
             else:
                 settings.DATABASES['ldap']['USER'] = '******' % (settings.config['username'], User.base_dn)
         else:
             raise CommandError('configuration file must specify username parameter')
         if settings.config.has_key('password'):
             settings.DATABASES['ldap']['PASSWORD'] = settings.config['password']
         else:
             raise CommandError('configuration file must specify password parameter')
         server = FingerServer(('', 79), FingerHandler)
         if self.options['foreground']:
             server.serve_forever()
         else:
             with daemon.DaemonContext(): # TODO drop root
                 server.serve_forever()
     except Exception as err:
         raise CommandError(err)
Exemple #12
0
 def handle(self, *args, **options):
     self.options = options
     try:
         load_configuration_file(self.options['config'])
         if self.options['inetd']:
             try:
                 handler = GenericHandler()
                 uid = sys.stdin.readline(512).strip()
                 sys.stdout.write(handler.handle(uid).encode('utf-8'))
             except Exception as err:
                 sys.stdout.write(u'error has occurred\n'.encode('utf-8'))
             finally:
                 sys.stdout.flush()
         else:  # run as daemon
             server = FingerServer(('', 79), FingerHandler)
             if self.options['foreground']:
                 server.serve_forever()
             else:
                 with daemon.DaemonContext(
                         uid=pwd.getpwnam('nobody').pw_uid,
                         gid=grp.getgrnam('nogroup').gr_gid):
                     server.serve_forever()
     except Exception as err:
         raise CommandError(err)
Exemple #13
0
 def handle(self, *args, **options):
     self.options = options
     try:
         load_configuration_file(self.options['config'])
         if settings.config.has_key('username'):
             if settings.config['username'].endswith(DebianUser.base_dn):
                 settings.DATABASES['ldap']['USER'] = settings.config[
                     'username']
             else:
                 settings.DATABASES['ldap']['USER'] = '******' % (
                     settings.config['username'], DebianUser.base_dn)
         else:
             raise CommandError(
                 _('configuration file must specify username parameter'))
         if settings.config.has_key('password'):
             settings.DATABASES['ldap']['PASSWORD'] = settings.config[
                 'password']
         else:
             raise CommandError(
                 _('configuration file must specify password parameter'))
     except Exception as err:
         raise CommandError(err)
     self.dstdir = os.path.join(settings.CACHE_DIR, 'hosts')
     self.makedirs(self.dstdir)
     self.tpldir = os.path.abspath(
         os.path.join(os.path.dirname(__file__), 'templates'))
     self.finder = TemplateLookup(directories=[self.tpldir],
                                  encoding_errors='ignore',
                                  output_encoding='utf-8')
     try:
         with open(os.path.join(self.dstdir, 'ud-generate.lock'), 'w') as f:
             lock_acquired = False
             lock_time_out = time.time() + 300
             while not lock_acquired:
                 try:
                     fcntl.lockf(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
                     lock_acquired = True
                 except IOError:
                     if time.time() > lock_time_out:
                         raise Exception(_('unable to acquire lock'))
                     time.sleep(2)
             if self.options['force'] or self.need_update():
                 with open(os.path.join(self.dstdir, 'last_update.trace'),
                           'w') as f:
                     self.marshall()
                     self.generate()
                     last_generate = datetime.utcnow().strftime(
                         '%Y%m%d%H%M%S.%fZ')
                     if not hasattr(self, 'last_file_mod'):
                         self.last_file_mod = last_generate
                     if not hasattr(self, 'last_ldap_mod'):
                         self.last_ldap_mod = last_generate
                     f.write(
                         yaml.dump({
                             'last_file_mod': self.last_file_mod,
                             'last_ldap_mod': self.last_ldap_mod,
                             'last_generate': last_generate
                         }))
                 if self.options['mq']:
                     notify_via_mq(
                         self.options, 'Update forced'
                         if self.options['force'] else 'Update needed')
     except Exception as err:
         raise CommandError(err)