643 | | for backend in [os.path.join(directory, b) for b in os.listdir(directory) if os.path.isfile(os.path.join(directory, b)) and (b != myname)] : |
644 | | answer = os.popen(backend, "r") |
| 643 | tmpdir = tempfile.gettempdir() |
| 644 | lockfilename = os.path.join(tmpdir, "%s..LCK" % myname) |
| 645 | if os.path.exists(lockfilename) : |
| 646 | # there's already a lockfile, see if still used |
| 647 | lockfile = open(lockfilename, "r") |
| 648 | pid = int(lockfile.read()) |
| 649 | lockfile.close() |
646 | | devices = [line.strip() for line in answer.readlines()] |
647 | | except : |
648 | | devices = [] |
649 | | status = answer.close() |
650 | | if status is None : |
651 | | for d in devices : |
652 | | # each line is of the form : 'xxxx xxxx "xxxx xxx" "xxxx xxx"' |
653 | | # so we have to decompose it carefully |
654 | | fdevice = cStringIO.StringIO("%s" % d) |
655 | | tokenizer = shlex.shlex(fdevice) |
656 | | tokenizer.wordchars = tokenizer.wordchars + r".:,?!~/\_$*-+={}[]()#" |
657 | | arguments = [] |
658 | | while 1 : |
659 | | token = tokenizer.get_token() |
660 | | if token : |
661 | | arguments.append(token) |
662 | | else : |
663 | | break |
664 | | fdevice.close() |
665 | | try : |
666 | | (devicetype, device, name, fullname) = arguments |
667 | | except ValueError : |
668 | | pass # ignore this 'bizarre' device |
669 | | else : |
670 | | if name.startswith('"') and name.endswith('"') : |
671 | | name = name[1:-1] |
672 | | if fullname.startswith('"') and fullname.endswith('"') : |
673 | | fullname = fullname[1:-1] |
674 | | print '%s cupspykota:%s "PyKota+%s" "PyKota managed %s"' % (devicetype, device, name, fullname) |
| 651 | # see if the pid contained in the lock file is still running |
| 652 | os.kill(pid, 0) |
| 653 | except OSError, e : |
| 654 | if e.errno != errno.EPERM : |
| 655 | # process doesn't exist anymore, remove the lock |
| 656 | os.remove(lockfilename) |
| 657 | |
| 658 | if not os.path.exists(lockfilename) : |
| 659 | lockfile = open(lockfilename, "w") |
| 660 | lockfile.write("%i" % os.getpid()) |
| 661 | lockfile.close() |
| 662 | # we will execute each existing backend in device enumeration mode |
| 663 | # and generate their PyKota accounting counterpart |
| 664 | for backend in [os.path.join(directory, b) for b in os.listdir(directory) if os.path.isfile(os.path.join(directory, b)) and (b != myname)] : |
| 665 | answer = os.popen(backend, "r") |
| 666 | try : |
| 667 | devices = [line.strip() for line in answer.readlines()] |
| 668 | except : |
| 669 | devices = [] |
| 670 | status = answer.close() |
| 671 | if status is None : |
| 672 | for d in devices : |
| 673 | # each line is of the form : 'xxxx xxxx "xxxx xxx" "xxxx xxx"' |
| 674 | # so we have to decompose it carefully |
| 675 | fdevice = cStringIO.StringIO("%s" % d) |
| 676 | tokenizer = shlex.shlex(fdevice) |
| 677 | tokenizer.wordchars = tokenizer.wordchars + r".:,?!~/\_$*-+={}[]()#" |
| 678 | arguments = [] |
| 679 | while 1 : |
| 680 | token = tokenizer.get_token() |
| 681 | if token : |
| 682 | arguments.append(token) |
| 683 | else : |
| 684 | break |
| 685 | fdevice.close() |
| 686 | try : |
| 687 | (devicetype, device, name, fullname) = arguments |
| 688 | except ValueError : |
| 689 | pass # ignore this 'bizarre' device |
| 690 | else : |
| 691 | if name.startswith('"') and name.endswith('"') : |
| 692 | name = name[1:-1] |
| 693 | if fullname.startswith('"') and fullname.endswith('"') : |
| 694 | fullname = fullname[1:-1] |
| 695 | print '%s cupspykota:%s "PyKota+%s" "PyKota managed %s"' % (devicetype, device, name, fullname) |
| 696 | os.remove(lockfilename) |