def create(cls, vlist):
        parties = super(Party, cls).create(vlist)

        #pool = Pool()
        #Badge = pool.get('access.control.badge')
        #Badge.isonas_badge_sync([], parties)

        isonas = Isonasacs(
            config.get('Isonas', 'host'), config.get('Isonas', 'port'))
        isonas.logon(
            config.get('Isonas', 'clientid'), config.get('Isonas', 'password'))
        groupname = config.get('Isonas', 'groupname')

        # need to check if parties have badges
        # partiestocreatebadges

        for party in parties:
            if party.badges:
                name = party.name.encode('ascii', 'replace')[:20]
                try:
                    isonas.add('IDFILE', name, '', '', party.code.encode('ascii'))
                    isonas.add('GROUPS', party.code.encode('ascii'), groupname.encode('ascii'))
                except IsonasacsError:
                    print 'Party Create IsonasacsError exception'
                    pass

        return parties
    def write(cls, *args):
        super(Badge, cls).write(*args)
        badges = sum(args[0:None:2], [])
        cls.isonas_badge_sync(badges, [])

        isonas = Isonasacs(
            config.get('Isonas', 'host'), config.get('Isonas', 'port'))
        isonas.logon(
            config.get('Isonas', 'clientid'), config.get('Isonas', 'password'))
        for badge in badges:
            if badge.disabled:
                isonas.update('BADGES', badge.code.encode('ascii'), 0, 0, '', '')
            else:
                isonas.update('BADGES', badge.code.encode('ascii'), 0, 0, 0, '')
    def create(cls, vlist):
        badges = super(Badge, cls).create(vlist)
        
        #cls.isonas_badge_sync(badges, [])
        
        isonas = Isonasacs(
            config.get('Isonas', 'host'), config.get('Isonas', 'port'))
        isonas.logon(
            config.get('Isonas', 'clientid'), config.get('Isonas', 'password'))

        for badge in badges:
            if badge.disabled:
                isonas.add('BADGES', badge.party.code.encode('ascii'), badge.code.encode('ascii'), 0, 0, '', '', 2)
            else:
                isonas.add('BADGES', badge.party.code.encode('ascii'), badge.code.encode('ascii'), 0, 0, 0, '', 2)

        return badges
    def write(cls, *args):
        super(Party, cls).write(*args)
        parties = sum(args[0:None:2], [])

        #pool = Pool()
        #Badge = pool.get('access.control.badge')
        #Badge.isonas_badge_sync([], parties)
        isonas = Isonasacs(
            config.get('Isonas', 'host'), config.get('Isonas', 'port'))
        isonas.logon(
            config.get('Isonas', 'clientid'), config.get('Isonas', 'password'))

        for party in parties:
            if party.badges:
                try:
                    idfile = isonas.query('IDFILE', party.code.encode('ascii'))
                except IsonasacsError:
                    pass
                else:
                    party_name = party.name.encode('ascii', 'replace')
                    if idfile[0] != party_name:
                        isonas.update('IDFILE', party_name, '', '', party.code.encode('ascii'))
    def isonas_badge_sync(cls):
        """
        Method used with Cron to synchronise Tryton Badges with Isonas

        method used by cron to search for all badges and synchronise between Tryton and Isonas.
        Currently cron is set every 2 hours.
        isonas_
        - queryall -> create a set with all the IDS
        - create a set from Tryton badges
        - check for the difference of the sets ( authority is TRYTON set)
        - set of isonas - set of tryton = badges to delete from isonas
        - set of tryton - set of isonas = badges to create in isonas
        - what about badges to disable....
        """
        start_time = time()
        tryton_badges = cls.search([ ]) # get all badges from Tryton
        tryton_badges_dict = {}
        print '#### CREATE badge dictionary'
        for badge in tryton_badges:
            tryton_badges_dict[badge.code] = badge

        tryton_badges_codes = set(b.code for b in tryton_badges) # set of all badge numbers

        Party = Pool().get('party.party')
        tryton_idfiles = Party.search([('badges', '!=', None)])
        tryton_idfiles_dict = {}
        ## Create a dictionary of parties
        for idfile in tryton_idfiles:
            tryton_idfiles_dict[idfile.code] = idfile
        tryton_idfiles_codes = set(p.code for p in tryton_idfiles)
        #print 'tryton_idfiles_codes %s' % tryton_idfiles_codes

        print 'connect to ISONAS'
        Isonas_connection = Isonasacs(config.get('Isonas', 'host'), \
             config.get('Isonas', 'port'))
        Isonas_connection.logon(config.get('Isonas', 'clientid'), \
            config.get('Isonas', 'password'))
        isonas_idfile_groupname = config.get('Isonas','groupname')

        # get all 'IDFILES' of the tryton_user group
        isonas_tryton_group_idfiles = Isonas_connection.query('GROUP', \
            isonas_idfile_groupname)
        # get al 'IDFILES' for updating
        isonas_all_idfiles = Isonas_connection.query_all('IDFILE')
        isonas_idfiles_codes = set()
        isonas_idfiles_dict = {}
        for idfile_code in isonas_tryton_group_idfiles:
            isonas_idfiles_codes.add(idfile_code[1])
            isonas_idfiles_dict[idfile_code[1]] = Isonas_connection.query('IDFILE',idfile_code[1])

        # get all the badges from ISONAS controller
        isonas_badges = Isonas_connection.query_all('BADGES')
        isonas_badges_codes = set(badge[0] for badge in isonas_badges)

        idfiles_to_delete = isonas_idfiles_codes - tryton_idfiles_codes
        # !!!! Can I delete idfiles that have badges? yes - it will delete the badges too
        for idfile_idstring in idfiles_to_delete:
            #print 'idfile_idstring %s ' % idfile_idstring
            Isonas_connection.delete('IDFILE', idfile_idstring)

        # print '#### badges to delete'
        # for badge in badges_to_delete:
        #    print 'badge %s' % badge
        #     Isonas_connection.delete('BADGES', badge)

        idfiles_to_create = tryton_idfiles_codes - isonas_idfiles_codes
        idfiles_to_update = tryton_idfiles_codes - idfiles_to_create
        badges_to_create = tryton_badges_codes - isonas_badges_codes
        badges_to_update = tryton_badges_codes - badges_to_create

        ##### CREATE ######
        print '#### CREATE IDFILES'
        for idfile_code in idfiles_to_create:
            Isonas_connection.add('IDFILE', tryton_idfiles_dict[idfile_code].name.encode('ascii'),'','',idfile_code.encode('ascii'))
            Isonas_connection.add('GROUPS', idfile_code.encode('ascii'), isonas_idfile_groupname.encode('ascii'))
        
        print '--- %s seconds ---' % (time() - start_time)

        print '#### CREATE BADGES'
        for badge in badges_to_create:
            badgestatus = tryton_badges_dict[badge].disabled
            if tryton_badges_dict[badge].disabled:
                Isonas_connection.add('BADGES', tryton_badges_dict[badge].party.code.encode('ascii'), badge.encode('ascii'), 0, 0,'','',2 )
            else:
                Isonas_connection.add('BADGES', tryton_badges_dict[badge].party.code.encode('ascii'), badge.encode('ascii'), 0, 0,0,'',2)
        
        print '--- %s seconds ---' % (time() - start_time)
        
        #### UPDATE idfiles'
        print '#### UPDATE IDFILES'
        for idfile_code in idfiles_to_update:
            isonasidfile = Isonas_connection.query('IDFILE', idfile_code.encode('ascii') )
            if isonasidfile[0] != tryton_idfiles_dict[idfile_code].name:
                Isonas_connection.update('IDFILE',tryton_idfiles_dict[idfile_code].name.encode('ascii'),'','', idfile_code.encode('ascii') )

        print '--- %s seconds ---' % (time() - start_time)

        print '#### UPDATE badges'
        for badge in badges_to_update:
            if tryton_badges_dict[badge].disabled:
                Isonas_connection.update('BADGES',badge.encode('ascii'),0,'',)
            else:
               Isonas_connection.update('BADGES',badge.encode('ascii'),0,'',)

        print '--- %s seconds ---' % (time() - start_time)

    # @classmethod
    # def create(cls, vlist):
    #     """
    #     ir.cron( needs id )
    #     nextcall = now or now
    #     ir.model.data has a method getid(<modulename>,<xmlid>) return id in db
    #     """
    #     Sequence = Pool().get('ir.sequence')
    #     Configuration = Pool().get('party.access.control.isonas.configuration')

    #     vlist = [x.copy() for x in vlist]
    #     for values in vlist:
    #         if not values.get('code'):
    #             config = Configuration(1)
    #             values['code'] = Sequence.get_id(config.party_sequence.id)
    #         values.setdefault('addresses', None)
    #     return super(Party, cls).create(vlist)
    def isonas_badge_sync(cls, badges=None, parties=None):
        """
        Method used with Cron to synchronise Tryton Badges with Isonas

        method used by cron to search for all badges and synchronise between
        Tryton and Isonas.
        Currently cron is set every 2 hours.
        isonas_
        - queryall -> create a set with all the IDS
        - create a set from Tryton badges
        - check for the difference of the sets ( authority is TRYTON set)
        - set of isonas - set of tryton = badges to delete from isonas
        - set of tryton - set of isonas = badges to create in isonas
        - what about badges to disable....
        """
        pool = Pool()
        Party = pool.get('party.party')

        start_time = time()

        # get all badges from Tryton
        if badges is None and parties is None:
            tryton_badges = {b.code: b for b in cls.search([])}
        else:
            tryton_badges = {b.code: b for b in badges}

        if badges is None and parties is None:
            tryton_idfiles = {p.code: p
                for p in Party.search([('badges', '!=', None)])}
        else:
            tryton_idfiles = {p.code: p for p in parties}

        isonas = Isonasacs(
            config.get('Isonas', 'host'), config.get('Isonas', 'port'))
        isonas.logon(
            config.get('Isonas', 'clientid'), config.get('Isonas', 'password'))
        groupname = config.get('Isonas', 'groupname')

        print '--- BEFORE IDFILE QUERY %s seconds ---' % (time() - start_time)

        # get all 'IDFILES' of the groupname
        isonas_group_idfiles_codes = set(idfile[1] for idfile in isonas.query('GROUP', groupname))

        print '--- AFTER GROUP QUERY %s seconds ---' % (time() - start_time)

        # get all 'IDFILES' from ISONAS
        isonas_all_idfiles_codes = set(idfile[0] for idfile in isonas.query_all('IDFILE'))

        print '--- AFTER IDFILE QUERY %s seconds ---' % (time() - start_time)

        # get all the badges from ISONAS controller
        isonas_badges = {b[0]: b for b in isonas.query_all('BADGES')}

        print '--- AFTER BADGES QUERY %s seconds ---' % (time() - start_time)

        tryton_idfiles_codes = set(tryton_idfiles.keys())
        tryton_badges_codes = set(tryton_badges.keys())
        isonas_badges_codes = set(isonas_badges.keys())

        # uncomment following section to allow deletion
        # if badges is None and parties is None:
            # idfiles_to_delete = isonas_all_idfiles_codes - tryton_idfiles_codes
        # else:
            # Partial synchronisation so nothing to delete
            #idfiles_to_delete = []

        idfiles_to_create = tryton_idfiles_codes - isonas_all_idfiles_codes
        idfiles_to_update = tryton_idfiles_codes.intersection(isonas_all_idfiles_codes)
        idfiles_to_add_to_group = tryton_idfiles_codes - isonas_group_idfiles_codes
        # idfiles_to_add_to_group = idfiles_to_add_to_group - idfiles_to_create
        badges_to_create = tryton_badges_codes - isonas_badges_codes
        badges_to_update = tryton_badges_codes.intersection(isonas_badges_codes)

        ### DELETE
        # uncomment following section to allow deletion
        # XXX Can I delete idfiles that have badges?
        # yes - it will delete the badges too
        # for idstring in idfiles_to_delete:
            # print '** delete idfile %s' % idstring
            # isonas.delete('IDFILE', idstring)

        ### CREATE
        for code in idfiles_to_create:
            party = tryton_idfiles[code]
            name = party.name.encode('ascii', 'replace')
            isonas.add('IDFILE', name, '', '', code.encode('ascii'))
            # isonas.add('GROUPS', code.encode('ascii'), groupname.encode('ascii'))

        print '--- FINISHED creating idfiles %s seconds ---' % (time() - start_time)

        for code in badges_to_create:
            badge = tryton_badges[code]
            if badge.disabled:
                isonas.add('BADGES', badge.party.code.encode('ascii'), code.encode('ascii'), 0, 0, '', '', 2)
            else:
                isonas.add('BADGES', badge.party.code.encode('ascii'), code.encode('ascii'), 0, 0, 0, '', 2)

        print '--- FINISHED creating badges %s seconds ---' % (time() - start_time)

        #### UPDATE GROUP
        for code in idfiles_to_add_to_group:
            isonas.add('GROUPS', code.encode('ascii'), groupname.encode('ascii'))

        print '--- FINISHED updating groups %s seconds ---' % (time() - start_time)

        ### UPDATE idfiles'
        # get the details of all the IDFILES'
        isonas_idfiles_details = {}
        for idstring in idfiles_to_update:
            isonas_idfiles_details[idstring] = isonas.query('IDFILE', idstring.encode('ascii'))

        for code in idfiles_to_update:
            idfile = isonas_idfiles_details[code]
            party = tryton_idfiles[code]
            party_name = party.name.encode('ascii', 'replace')[:20]
            if idfile[0] != party_name:
                isonas.update('IDFILE', party_name, '', '', code.encode('ascii'))

        for code in badges_to_update:
            badge = tryton_badges[code]
            if badge.disabled:
                isonas.update('BADGES', code.encode('ascii'), 0, 0, '', '')
            else:
                isonas.update('BADGES', code.encode('ascii'), 0, 0, 0, '')
Пример #7
0
 def setUp(self):
     _Telnet = Mock()
     self._telnet = _Telnet()
     self._telnet.read_until.return_value = '<LOGON>'
     self.isonasacs = Isonasacs('localhost', 7101, _Telnet=_Telnet)
     self._telnet.reset_mock()
Пример #8
0
class TestISONASACS(unittest.TestCase):

    def setUp(self):
        _Telnet = Mock()
        self._telnet = _Telnet()
        self._telnet.read_until.return_value = '<LOGON>'
        self.isonasacs = Isonasacs('localhost', 7101, _Telnet=_Telnet)
        self._telnet.reset_mock()

    def test_logon(self):
        self._telnet.read_until.return_value = '<LOGON ACCEPTED>|'
        self.isonasacs.logon('clientid', 'password')
        self._telnet.write.assert_called_once_with(
            '<LOGON><clientid><password>|')

    def test_logon_failure(self):
        self._telnet.read_until.return_value = '<ERROR>Access Denied|'
        self.assertRaises(IsonasacsError,
            self.isonasacs.logon, 'clientid', 'wrongpassword')

    def test_add(self):
        self._telnet.read_until.return_value = '<ACK>|'
        self.isonasacs.add('IDFILE', 'LastName', 'ID')
        self._telnet.write.assert_called_once_with(
            '<ADD><IDFILE><LastName><ID>|')

    def test_add_failure(self):
        self._telnet.read_until.return_value = '<ERROR>|'
        self.assertRaises(IsonasacsError, self.isonasacs.add, 'foo')

    def test_delete(self):
        self._telnet.read_until.return_value = '<ACK>|'
        self.isonasacs.delete('IDFILE', 'ID')
        self._telnet.write.assert_called_once_with(
            '<DELETE><IDFILE><ID>|')

    def test_update(self):
        self._telnet.read_until.return_value = '<ACK>|'
        self.isonasacs.update('IDFILE', 'ID', 'LastName')
        self._telnet.write.assert_called_once_with(
            '<UPDATE><IDFILE><ID><LastName>|')

    def test_query_all(self):
        self._telnet.read_until.side_effect = [
            '<ALL IDFILE><1>|', '<ALL IDFILE><2>|', '<ALL IDFILE><3>|',
            '<END IDFILE>|']
        self.assertEqual(self.isonasacs.query_all('IDFILE'),
            [['1'], ['2'], ['3']])
        self._telnet.write.assert_called_once_with(
            '<QUERY><ALL IDFILE>|')

    def test_query(self):
        self._telnet.read_until.return_value = (
            '<IDFILE><LastName><FirstName><Initial><1>|')
        self.assertEqual(self.isonasacs.query('IDFILE', '1'),
            ['LastName', 'FirstName', 'Initial', '1'])
        self._telnet.write.assert_called_once_with(
            '<QUERY><IDFILE><1>|')

    def test_query_group(self):
        self._telnet.read_until.side_effect = [
            '<GROUP><group><1>|', '<GROUP><group><2>|', '<END GROUP>|']
        self.assertEqual(self.isonasacs.query('GROUP', 'group'),
            [['group', '1'], ['group', '2']])
        self._telnet.write.assert_called_once_with(
            '<QUERY><GROUP><group>|')