Browse Source

Agent: change to multi-thread; auto-add configured Unix users

master
Pekka Helenius 3 years ago
parent
commit
693c20be0d
1 changed files with 85 additions and 55 deletions
  1. +85
    -55
      tools/pamusb-agent

+ 85
- 55
tools/pamusb-agent View File

@ -19,8 +19,11 @@ import os
import sys
import pwd
import getopt
import signal
import re
import syslog
import gi
import threading
gi.require_version('UDisks', '2.0')
@ -138,78 +141,105 @@ if not os.path.exists(options['check']):
print("You might specify manually pamusb-check's location using --check.")
usage()
username = pwd.getpwuid(os.getuid())[0]
logger = Log()
doc = et.parse(options['configFile'])
users = doc.findall('users/user')
for user in users:
if user.get('id') == username:
break
else:
logger.error('User %s not found in configuration file' % username)
sys.exit(1)
events = {
def userDeviceThread(user):
userName = user.get('id')
events = {
'lock' : [],
'unlock' : []
}
}
for hotplug in user.findall('agent'):
events[hotplug.get('event')].append(hotplug.text)
for hotplug in user.findall('agent'):
events[hotplug.get('event')].append(hotplug.text)
deviceName = user.find('device').text.strip()
deviceName = user.find('device').text.strip()
devices = doc.findall("devices/device")
for device in devices:
if device.get('id') == deviceName:
break
else:
logger.error('Device %s not found in configurtion file' % deviceName)
sys.exit(1)
devices = doc.findall("devices/device")
for device in devices:
if device.get('id') == deviceName:
break
logger.error('Device %s not found in configuration file' % deviceName)
sys.exit(1)
serial = device.find('serial').text.strip()
def authChangeCallback(event):
if event == 'removed':
logger.info('Device "%s" has been removed, ' \
'locking down user "%s"...' % (deviceName, username))
for cmd in events['lock']:
logger.info('Running "%s"' % cmd)
os.system(cmd)
logger.info('Locked.')
return
logger.info('Device "%s" has been inserted. ' \
'Performing verification...' % deviceName)
cmdLine = "%s --quiet --config=%s --service=pamusb-agent %s" % (
options['check'], options['configFile'], username)
logger.info('Executing "%s"' % cmdLine)
if not os.system(cmdLine):
logger.info('Authentication succeeded. ' \
'Unlocking user "%s"...' % username)
for cmd in events['unlock']:
logger.info('Running "%s"' % cmd)
os.system(cmd)
logger.info('Unlocked.')
else:
logger.info('Authentication failed for device %s. ' \
'Keeping user "%s" locked down.' % (deviceName, username))
serial = device.find('serial').text.strip()
def authChangeCallback(event):
if event == 'removed':
logger.info('Device "%s" has been removed, ' \
'locking down user "%s"...' % (deviceName, userName))
for cmd in events['lock']:
logger.info('Running "%s"' % cmd)
os.system(cmd)
logger.info('Locked.')
return
logger.info('Device "%s" has been inserted. ' \
'Performing verification...' % deviceName)
cmdLine = "%s --debug --config=%s --service=pamusb-agent %s" % (
options['check'], options['configFile'], userName)
logger.info('Executing "%s"' % cmdLine)
if not os.system(cmdLine):
logger.info('Authentication succeeded. ' \
'Unlocking user "%s"...' % userName)
for cmd in events['unlock']:
logger.info('Running "%s"' % cmd)
os.system(cmd)
logger.info('Unlocked.')
else:
logger.info('Authentication failed for device %s. ' \
'Keeping user "%s" locked down.' % (deviceName, userName))
hpDev = HotPlugDevice(serial)
hpDev.addCallback(authChangeCallback)
logger.info('Watching device "%s" for user "%s"' % (deviceName, userName))
hpDev.run()
udisks = UDisks.Client.new_sync()
udisksObjectManager = udisks.get_object_manager()
hpDev = HotPlugDevice(serial)
hpDev.addCallback(authChangeCallback)
sysUsers= []
validUsers = []
with open('/etc/passwd', 'r') as f:
for line in f.readlines():
sysUser = re.sub(r'^(.*?):.*', '\\1', line[:-1])
sysUsers.append(sysUser)
f.close()
logger.info('pamusb-agent up and running.')
for userObj in users:
userId = userObj.get('id')
for sysUser_ in sysUsers:
if (userId == sysUser_ and
userObj not in validUsers):
validUsers.append(userObj)
# logger.error('User %s not found in configuration file' % username)
for user in validUsers:
threading.Thread(
target=userDeviceThread,
args=(user,)
).start()
if options['daemon'] and os.fork():
sys.exit(0)
logger.info('pamusb-agent up and running.')
logger.info('Watching device "%s" for user "%s"' % (deviceName, username))
def sig_handler(sig, frame):
logger.info('Stopping agent.')
sys.exit(0)
try:
hpDev.run()
except KeyboardInterrupt:
logger.error('Caught keyboard interruption, exiting...')
sys_signals = ['SIGINT', 'SIGTERM', 'SIGTSTP', 'SIGTTIN', 'SIGTTOU']
for i in sys_signals:
signal.signal(getattr(signal, i), sig_handler)

Loading…
Cancel
Save