Ένα επεξεργασμένο mac.py που δεν αλλάζει τίποτα είναι το συνηθισμένο πρώτο σύμπτωμα. Το αρχείο στον δίσκο δεν είναι αυτό που εκτελεί ο Access Server· η υπηρεσία ταυτοποίησης φορτώνει το σενάριο από τη βάση δεδομένων διαμόρφωσης του διακομιστή, και ακριβώς αυτό το αποθηκευμένο αντίγραφο αποφασίζει για μια σύνδεση. Όσο η αποθηκευμένη τιμή δεν αντικατασταθεί, κάθε δοκιμή αποδεικνύει μόνο ότι το παλιό σενάριο λειτουργεί ακόμη.

Τρεις συνθήκες καθορίζουν την εργασία: αν η τιμή μπήκε ποτέ στη βάση διαμόρφωσης, αν δόθηκε εντολή στην υπηρεσία να τη φορτώσει ξανά, και αν ο κώδικας που αλλάξατε εκτελείται πράγματι σε κάθε σύνδεση. Καθεμία έχει διαφορετικό σύμπτωμα, και η διόρθωση της λάθος περίπτωσης σπαταλά ένα παράθυρο συντήρησης.

Το αρχείο είναι πηγή, όχι το αντίγραφο που εκτελείται

Ο Access Server κρατά το σενάριο post-auth κάτω από το κλειδί auth.module.post_auth_script. Η επεξεργασία του αρχείου ενημερώνει μόνο το αντίγραφο εργασίας σας. Ο δαίμονας διαβάζει την αποθηκευμένη τιμή, οπότε η αλλαγή μένει αόρατη μέχρι να διαγράψετε την παλιά καταχώριση και να τοποθετήσετε το νέο αρχείο στη θέση της. Αυτή η αποθηκευμένη τιμή είναι το μόνο αντίγραφο που συμβουλεύεται η υπηρεσία ταυτοποίησης.

Διαβάστε την πριν την αλλάξετε. Αν ταιριάζει ήδη με το αρχείο που επεξεργαστήκατε, το πρόβλημα δεν είναι στην αποθήκευση και πρέπει να περάσετε στο ζήτημα του εύρους. Αν δείχνει παλαιότερη έκδοση, η αλλαγή δεν έφτασε ποτέ στην υπηρεσία.

./sacli -k auth.module.post_auth_script ConfigGet

Αντικαταστήστε το αποθηκευμένο αντίγραφο και μετά εφαρμόστε το

Η διαγραφή πριν από την εγγραφή δεν είναι διακόσμηση. ConfigPut με --value_file αντικαθιστά την τιμή σε ένα βήμα, και ConfigDel πρώτα καθιστά αδύνατο να μείνει πίσω μια παλιά ή κατεστραμμένη καταχώριση. Κρατήστε αντίγραφο του σεναρίου που λειτουργεί έξω από τον κατάλογο σεναρίων πριν ξεκινήσετε.

./sacli -k auth.module.post_auth_script ConfigDel
# store the file, then apply it
./sacli -k auth.module.post_auth_script --value_file=/root/post_auth.py ConfigPut
./sacli start

sacli start εφαρμόζει την αλλαγμένη διαμόρφωση στις εσωτερικές υπηρεσίες, και αυτό κάνει το νέο σενάριο να τεθεί σε ισχύ. Δεν είναι το ίδιο με επανεκκίνηση ολόκληρου του μηχανήματος ή του δαίμονα, και δεν πρέπει να αντικαθίσταται από αυτό εκτός αν η αλλαγή σας το απαιτεί.

Χρησιμοποιήστε απόλυτη διαδρομή για το αρχείο τιμής και επιβεβαιώστε ότι ο root μπορεί να το διαβάσει. Μια διαδρομή που επιλύεται από το κέλυφός σας αλλά όχι από τον λογαριασμό υπηρεσίας δίνει αποθηκευμένη τιμή που φαίνεται σωστή στο ConfigGet και αποτυγχάνει στην πρώτη σύνδεση. Ελέγξτε το αποθηκευμένο αποτέλεσμα άλλη μια φορά μετά το sacli start, όχι πριν.

Εύρος μονάδας ή ανά σύνδεση: πού ανήκει το ερώτημα

Η Python εκτελεί τις δηλώσεις επιπέδου μονάδας μία φορά, όταν φορτώνεται το σενάριο. Ένα ερώτημα βάσης δεδομένων γραμμένο στην κορυφή του αρχείου διαβάζει επομένως τον πίνακα κατά τη φόρτωση και κρατά αυτή την απάντηση για κάθε επόμενη σύνδεση. Αυτός είναι ο δεύτερος λόγος που μια αλλαγή φαίνεται να μην κάνει τίποτα: ο κώδικας εκτελείται, αλλά όχι όταν το περιμένετε.

Βάλτε το ερώτημα μέσα στον χειριστή post_auth ώστε να εκτελείται για κάθε ταυτοποίηση. Διατηρήστε την τεκμηριωμένη υπογραφή, προσαρμόστε το αποτέλεσμα ταυτοποίησης που λαμβάνει ο χειριστής και επιστρέψτε το ίδιο αντικείμενο αντί για έναν γυμνό αριθμό.

Κρατήστε και τη διαχείριση της σύνδεσης μέσα στον χειριστή. Μια σύνδεση που ανοίγει κατά την εισαγωγή μπορεί να κλείσει από τον διακομιστή πριν συνδεθεί ο πρώτος χρήστης, και το σφάλμα που προκύπτει μοιάζει με απορριφθέντα διαπιστευτήρια παρά με σπασμένο σενάριο.

Δύο διαδρομές απόρριψης, ένας ιδιοκτήτης

Αν η απόφαση είναι τοπικό ερώτημα, ο χειριστής Python κατέχει το αποτέλεσμα. Αν είναι εξωτερικός έλεγχος HTTP, αφήστε την κατάσταση εξόδου της εντολής να μεταφέρει την απάντηση: ένα περιτύλιγμα που εξέρχεται με μη μηδενικό κωδικό απορρίπτει τη σύνδεση, και η κατάσταση της τελευταίας εντολής γίνεται κατάσταση του σεναρίου χωρίς ρητό exit.

Κρατήστε το μυστικό έξω από τη λίστα διεργασιών. Ένα αρχείο αναγνώσιμο από τον root ή μια τιμή περιβάλλοντος που περνά η υπηρεσία είναι ασφαλέστερη από ένα όρισμα που μπορεί να διαβάσει κάθε τοπικός χρήστης από το ps. Καρφιτσώστε το τελικό σημείο σε μια μεταβλητή πριν την κλήση, ώστε ένα τυπογραφικό λάθος να αποτυγχάνει στη διαμόρφωση και όχι στη σύνδεση κάποιου. Περιστρέψτε αυτό το μυστικό όπως κάθε άλλο διαπιστευτήριο.

Επιλέξτε έναν ιδιοκτήτη ανά έλεγχο. Ένα σενάριο που και ρωτά τη βάση και καλεί υπηρεσία HTTP χρειάζεται δηλωμένο κανόνα προτεραιότητας για την περίπτωση που τα δύο διαφωνούν, αλλιώς ο λόγος απόρριψης στο αρχείο καταγραφής δεν θα ταιριάζει με ό,τι ειπώθηκε στον χρήστη.

Εφαρμόστε το χωρίς να κλειδώσετε τον διαχειριστή

Δύο δικλείδες κάνουν την αλλαγή αναστρέψιμη: ένας δεύτερος λογαριασμός διαχειριστή που δεν εξαρτάται από το σενάριο, και ένα γνωστό καλό αντίγραφο φυλαγμένο έξω από τον κατάλογο σεναρίων. Εφαρμόστε την αλλαγή σε παράθυρο συντήρησης και μετά παρακολουθήστε μία δοκιμαστική σύνδεση και μία σκόπιμη απόρριψη πριν αποσυνδεθείτε. Αν το αρχείο καταγραφής δείξει συντακτικό σφάλμα αντί για απόφαση ταυτοποίησης, το αποθηκευμένο σενάριο είναι σπασμένο και κάθε σύνδεση θα αποτυγχάνει.

Δύο συνθήκες λένε περιμένετε: δεν μπορείτε να διαβάσετε το αρχείο τιμής ως root, ή δεν έχετε δεύτερη διαδρομή στη διεπαφή διαχείρισης. Και οι δύο μετατρέπουν μια μικρή αλλαγή σε κλείδωμα, και καμία δεν αξίζει δοκιμή σε διακομιστή παραγωγής στο τέλος της ημέρας. Η τεκμηρίωση του Access Server καλύπτει τη διεπαφή post-auth και τα υποστηριζόμενα πεδία της.

Σχετικά άρθρα