Доступ Python к информации о квотах NFS?


Существуют ли какие-либо модули Python, которые позволят мне получить доступ к информации о квоте NFS без необходимости разбора выходных данных команды quota? Я знаю, что если бы у меня была достаточная мотивация, я мог бы написать свой собственный код ONC/RPC, используя модуль Python xdrlib, но я надеюсь от всего сердца, что мне не придется так тесно связываться с внутренностями NFS.

В идеале я надеюсь на существующую реализацию RPC или какой-то модуль более высокого уровня (например, оболочку для существующая библиотека Си или что-то еще).

Приемлемой заменой будет что-то вроде команды quota, которая производит более машиночитаемый вывод.
2 2

2 ответа:

Этот вопрос был первоначально порожден проблемами с версией 3.13 команды quota, которая по существу бесполезна в качестве инструмента для конечного пользователя для определения информации о квотах. Например, если alice запускает quota, она может увидеть вывод следующим образом:

Disk quotas for user alice (uid 100): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
fileserver.example.com:/staff/b/bob
                9254720  9728000 10240000          119768       0       0       
Алиса справедливо задалась бы вопросом, какое это имеет отношение к ее счету.

Оказывается, что умы, стоящие за пакетом quota-utils, наконец-то осознали проблемы, присущие инструменту; с версией 4.00 (доступна в Fedora 16) есть несколько новых доступных опций, которые превращают команду quota в нечто, что действительно производит полезную информацию.

Особый интерес представляет вариант -f:

-f, --filesystem-list     display quota information only for given filesystems

Итак, теперь пользователь может запустить:

quota -f ~

И получить информацию о квоте для их домашнего каталога. Кроме того, опция -s будет отображать "читаемые человеком" числа вместо отображения всего в виде блоков.

Для Алисы это может выглядеть например:

$ quota -s -f ~
Disk quotas for user alice (uid 100): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
fileserver.example.com:/staff/a/alice
              9038M   9500M  10000M            120k       0       0        

Кроме того, есть два варианта, которые значительно облегчают обработку выходных данных из quota в скрипте:

  • опция -w запрещает перенос строки, если имя "файловой системы" слишком длинное.
  • опция -p отображает 0 для льготного времени, если пользователь не находится в ситуации превышения квоты. Это означает, что всегда существует одно и то же количество полей (в то время как в предыдущей версии quota количество полей может варьироваться в зависимости от ситуация).

Объединив все вышесказанное, мы получим примерно следующее:

$ quota -wp -f ~
Disk quotas for user alice (uid 100): 
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
fileserver.example.com:/staff/a/alice 9254720  9728000 10240000       0  119768 0

Который намного полезнее для автоматизации.

command_array = ['quota', '-wp', '-f', '/home/nfs/user1']
output = subprocess.check_output(command_array)
# use only the second line, this is util info
beauty_output = output.split('\n')[2].split()
remote_fs = beauty_output[0]
blocks = beauty_output[1]
quota = beauty_output[2]
limit = beauty_output[3]
...

Считайте, что/home/nfs / user1-это точка монтирования nfs. Я сделал это таким образом.