2015-07-15 2 views
0

Я новичок в python и, вероятно, начал с чего-то немного сложного. Тем не менее, я почти там.Проблемы с отступом или секвенированием с python

Моя проблема заключается в том, что я немного затрудняюсь понять, как группировать или упорядочивать группу операторов в моем коде (мой синтаксис также, вероятно, ошибочен) с помощью try и except или if, elsif и else. Мне действительно нужно, чтобы кто-то сказал, что я должен использовать это вместо этого, и я могу понять это оттуда.

Вот диаграмма того, что я пытаюсь сделать:

https://drive.google.com/file/d/0BxtxgkV8mylgSFRuMnZtaEpXLVE/view?usp=sharing

И вот мой код до сих пор (обратите внимание, что это моя первая программа питон - на самом деле первая программа любого рода - так Я был бы признателен, если вы не разорвет меня на части слишком плохо для любого форматирования или синтаксических ошибок - обновленными включить Johns FIX)

import ldap 
import os 
import subprocess 
import uuid 
from pwd import getpwnam 

# Lookup all the users in the cloud group 
path='dc=saao' 
l=ldap.open('ldap1.cape') 
l.protocol_version = ldap.VERSION3 
l.simple_bind('dc=cape') 
a=l.search_s(path,ldap.SCOPE_SUBTREE,'cn=cloudcape') 

# Add members to uids 
uids=a[0][1]['memberUid'] 

# Check if a bindmount already exists or it not, that each cloud group user has the required directory i.e. /home/USER/cloud and /var/www/owncloud/data/USER/files 
for uid in uids: 
    cloudfiledir="/var/www/owncloud/data/"+uid+"/files" 
    clouddir="/home/"+uid+"/cloud" 
    try: 
     subprocess.check_output(["mountpoint", cloudfiledir]) 
     # If the output is all good, their bind mount is setup and mounted 
     break 
    except: 
     print uid+" has not logged into ownCloud yet - please ask them to do so and then try again" 
     break 
    # Now check if they have the required directories 
    try: 
     if os.path.isdir(cloudfiledir): 
      print "user "+ uid +" has a data directory in the owncloud data directory- this is good." 
      if os.path.isdir("/home/"+uid+"/cloud"): 
       print "user "+ uid +" has a cloud dir in their home directory - this is good." 
      else: 
       # They don't have a cloud directory, creating one 
       print uid+" does not have a cloud folder in their home directory, creating it" 
       if not os.path.exists("/home/"+uid+"/cloud"): 
        os.makedirs("/home/"+uid+"/cloud") 
        # Now set permissions ("+uid+":Domain Users) - os.chown(path, uid, gid) 
        os.chown("/home/"+uid+"/cloud", "+uid+", "Domain Users") 
       else: 
        break 
       # Now make sure the cloufilesdir is empty 
       if not os.listdir(cloudfiledir): 
        print "Empty" 
        break 
except: 
    print "rename and recreate the folder" 
    os.rename(clouddir, clouddir + str(uuid.uuid4())) 
    os.makedirs(clouddir) 
    os.chown(clouddir, 33, 33) 

print "Now let's bind mount the directories" 

# Bind each users home dir to their cloud dir 
# Eg: bindfs -M www-data --create-for-user=1168 --create-for-group=513 /home/simon/cloud /var/www/owncloud/data/simon/files 
# Still figuring this bit out 
for user in a[0][1]['memberUid']: 
    filt = "(uid=" + user + ")" 
    u=l.search_s(path, ldap.SCOPE_SUBTREE, filt, ['uidNumber']) 
    print "\t", user, "filter: ", filt, u, "or" 
    uid = u[0][1]['uidNumber'][0] 
    print "\t\t", user, filt, uid 
    command = 'bindfs -M www-data --create-for-user=' + uid + ' --create-for-group=513 ' + '/home/' + user + '/cloud' + ' /var/www/owncloud/data/' + user + '/files' 
    print "BINGO: ", command, "\n" 

совет Джона фиксированной мой, кроме синтаксиса, не мне нужно, чтобы попытаться понять, почему программа ОНЛ y запускается для первого UID, а не для остальных (в настоящее время в группе ldap есть 5, из которых я вручную смонтирован, поэтому ожидаю, что произойдет 3 привязки привязок).

Я был бы признателен за любые рекомендации, поскольку я продолжаю пытаться понять это путем проб и ошибок.

Заранее спасибо.

Simon

+0

Мне трудно поверить, что это буквально ваша первая программа. Если так - это слишком амбициозно. В любом случае ваш 'except' должен иметь уровень отступа, который соответствует соответствующему' try' –

+0

. Спасибо John Coleman. Я согласен, что это слишком амбициозно, но мой проект требует этого, поэтому я должен был учиться на резком конце. Я буду реализовывать ваши предложения и отзывы. –

ответ

0

Так, много читать и задавать некоторые мудрые коллеги позже, я много гораздо более глубокое понимание того, как для петель работают, что разрыв делает и насколько полезным может быть по-прежнему.

Вот мой последний кусок кода:

#!/usr/bin/python 
import ldap 
import os 
import subprocess 
import uuid 
from pwd import getpwnam 
# Lookup all the users in the cloudcape group 
path='dc=cape' 
l=ldap.open('ldap1.cape') 
l.protocol_version = ldap.VERSION3 
l.simple_bind('dc=cape') 
a=l.search_s(path,ldap.SCOPE_SUBTREE,'cn=cloudcape') 
# Add members to uids 
uids=a[0][1]['memberUid'] 
# Check if a bindmount already exists or it not, that each cloud group user has the required directory i.e.home/USER/cloud and /var/www/owncloud/data/USER/files 
for uid in uids: 
    # Define the directory paths 
    cloudfiledir="/var/www/owncloud/data/"+uid+"/files" 
    clouddir="/home/"+uid+"/cloud" 
    try: 
     subprocess.check_output(["mountpoint", cloudfiledir]) 
     # If the output is all good, their bind mount is setup and mounted, if not carry on 
    except subprocess.CalledProcessError: 
     print uid+" does not have a mountpoint" 
    else: 
     continue 
    # Check if they have /var/www/owncloud/data/UID 
    if not os.path.isdir(cloudfiledir): 
     print uid+" does not have a owncloud directory structure in /var/www/owncloud, creating it" 
     os.makedirs("/var/www/owncloud/data/"+uid+"") 
     os.makedirs("/var/www/owncloud/data/"+uid+"/files") 
     os.makedirs("/var/www/owncloud/data/"+uid+"/cache") 
     # Now set permissions ("+uid+":Domain Users) - os.chown(path, uid, gid) 
     os.chown("/var/www/owncloud/data/"+uid+"", 33, 33) 
     os.chown("/var/www/owncloud/data/"+uid+"/files", 33, 33) 
     os.chown("/var/www/owncloud/data/"+uid+"/cache/", 33, 33) 
    # Now check if the have /home/UID/cloud 
    if not os.path.isdir(clouddir): 
     # They don't have a cloud directory, creating one 
     print uid+" does not have a cloud folder in their home directory, creating it" 
     os.makedirs(clouddir) 
     # Now set permissions ("+uid+":Domain Users) - os.chown(path, uid, gid) 
     os.chown(clouddir, "+uid+", "Domain Users") 
    # Now make sure the cloudfilesdir is empty 
    try: 
     if not os.listdir(cloudfiledir) == []: 
      print "The mount point is not empty" 
      os.rename(cloudfiledir, cloudfiledir + str(uuid.uuid4())) 
      os.makedirs(cloudfiledir) 
      os.chown(cloudfiledir, 33, 33) 
    except: 
     print "The mount point is empty, moving on" 

    print "Now let's bind mount the directories" 
    # Bind each users home dir to their cloud dir 
    filt = "(uid=" + uid + ")" 
    userid=l.search_s(path, ldap.SCOPE_SUBTREE, filt, ['uidNumber']) 
    print "\t", uid, "filter: ", filt, userid, "or" 
    numuid = userid[0][1]['uidNumber'][0] 
    print "\t\t", uid, filt, uid 
    os.system('bindfs -M www-data --create-for-user=' + numuid + ' --create-for-group=513 ' + '/home/' + uid + '/cloud' + ' /var/www/owncloud/data/' + uid + '/files') 

Я не сомневаюсь, есть более простые и более эффективные способы сделать это, но на данный момент, код делает то, что я хочу, чтобы это сделать. Мне все еще нужно создать некоторую отказоустойчивость, я уже заметил одну область, где она может потерпеть неудачу, если существует определенный каталог, но это проблема следующей недели.

Смежные вопросы