Exemple de création d'un nouveau serveur
Le but de cet exemple est de montrer toutes les actions à faire pour créer un serveur simple. Le serveur que nous allons faire permet de gérer les contacts. Pour un contact nous aurons son nom, son prénom, son adresse mail et son numéro de téléphone. Nous pourrons ensuite créer de nouveau contact, en supprimer et en modifier.
Note: pour un tel exemple, utiliser le CardsServer est une meilleure solution dans la pratique.
Nous nous placerons dans le cas où Glasnost est installé et que le serveur contact est en fonctionnement. Tous les fichiers sont donc ceux que l'on trouve après une installation de Glasnost, et non pas ceux que l'on a dans les sources du projet.
Le fichier /usr/lib/python2.1/site-packages/glasnost/common/ContactsCommon.py contient le code commun au server et au proxy
__doc__ = """Glasnost Contacts Common Models""" __version__ = '0.5.4' from ObjectsCommon import AdminCommon, ObjectCommon class AdminContactsCommon(AdminCommon): pass class ContactCommon(ObjectCommon): name = None name_kind_isPublicForXmlRpc = 1 name_kind_isRequired = 1 name_kindName = 'String' firstname = None firstname_kind_isPublicForXmlRpc = 1 firstname_kind_isRequired = 0 firstname_kindName = 'String' email = None email_kind_isPublicForXmlRpc = 1 email_kind_isRequired = 0 email_kindName = 'String' phone = None phone_kind_isPublicForXmlRpc = 1 phone_kind_isRequired = 0 phone_kindName = 'String' readersSet = None readersSet_kind_isPublicForXmlRpc = 1 readersSet_kind_item_kindName = 'Id' readersSet_kind_item_kind_serverRoles = ['groups', 'people'] readersSet_kindName = 'Sequence' writersSet = None writersSet_kind_isPublicForXmlRpc = 1 writersSet_kind_item_kindName = 'Id' writersSet_kind_item_kind_serverRoles = ['groups', 'people'] writersSet_kind_requiredCount = 1 writersSet_kindName = 'Sequence' def canCache(self): return 1 def getLabel(self): label = self.name if label is None: return '' return label
Le fichier /usr/lib/glasnost/servers/ContactsServer/ContactsServer.py contient le code server.
#!/usr/bin/env python __version__ = '0.5.4' import __builtin__ __builtin__.__dict__['_'] = lambda x: x __builtin__.__dict__['N_'] = lambda x: x import time from glasnost.common.faults import * from glasnost.common.ContactsCommon import * from glasnost.server.ObjectsServer import ObjectServerMixin, AdminServerMixin, ObjectsServer from glasnost.server.things import register applicationName = 'ContactsServer' applicationRole = 'contacts' # all time in lowercase applicationTokens = None dispatcher = None class AdminContacts(AdminServerMixin, AdminContactsCommon): pass register(AdminContacts) class Contact(ObjectServerMixin, ContactCommon): pass register(Contact) class ContactsServer(ObjectsServer): Admin = AdminContacts useAdminWritersSet = 1 useModificationTime = 1 useReadersSet = 1 useWritersSet = 1 version = __version__ def deleteAll(self, virtualServerId, applicationToken, userToken): if not self.isAdmin(virtualServerId, userToken): raise FaultUserAccessDenied() //put code here def registerXmlRpcMethods(self): ObjectsServer.registerXmlRpcMethods(self) self.registerXmlRpcMethod('deleteAll') contactsServer = ContactsServer() if __name__ == "__main__": contactsServer.launch(applicationName, applicationRole)
Dans ce serveur nous avons commencé la méthode deleteAll, qui vérifie que la personne qui essaie de tout supprimer en a les droits. Le code qui supprime réellement tous les contacts n'a pas été fait pour que cet exemple reste simple. Une fois notre méthode écrite il faut l'enregistrer pour que le proxy puisse l'utiliser, ceci se fait par la méthode registerXmlRpcMethod.
Le fichier /usr/lib/python2.1/site-packages/glasnost/proxy/ContactsProxy.py contient le code du proxy.
__doc__ = """Glasnost Contacts Proxy""" __version__ = '0.5.4' from glasnost.common.ContactsCommon import * from DispatcherProxy import callServer, getApplicationToken from ObjectsProxy import register, ObjectsProxy, ObjectProxyMixin from tools import * class AdminContacts(AdminContactsCommon): pass register(AdminContacts) class Contact(ObjectProxyMixin, ContactCommon): def getProxy(self): return contactsProxy register(Contact) class ContactsProxy(ObjectsProxy): adminClassName = 'AdminContacts' objectClassName = 'Contact' objectIdName = 'contactId' objectName = N_('contact') objectNameCapitalized = N_('Contact') objectsName = N_('contacts') objectsNameCapitalized = N_('Contacts') serverRole = 'contacts' def deleteAll(self, userToken, context = None, serverId = None): serverId = self.getServerId(context=context, serverId=serverId) callServer(serverId, 'deleteAll', [serverId, getApplicationToken(context=context), userToken]) contactsProxy = ContactsProxy()
Le fichier /usr/lib/python2.1/site-packages/glasnost/web/ContactsWeb.py ontient le code du web.
__doc__ = """Glasnost Contacts Web""" __version__ = '0.5.4' from glasnost.proxy.ContactsProxy import * from ObjectsWeb import register, AdminMixin, ObjectWebMixin, ObjectsWebMixin class AdminContacts(AdminMixin, AdminContacts): pass register(AdminContacts) class Contact(ObjectWebMixin, Contact): name_kind_widget_fieldLabel = N_('Name') name_kind_widget_size = 40 name_kind_widgetName = 'InputText' firstname_kind_widget_fieldLabel = N_('Firstname') firstname_kind_widget_size = 40 firstname_kind_widgetName = 'InputText' email_kind_widget_fieldLabel = N_('Email') email_kind_widget_size = 40 email_kind_widgetName = 'InputText' phone_kind_widget_fieldLabel = N_('Phone') phone_kind_widget_size = 40 phone_kind_widgetName = 'InputText' readersSet_kind_item_kind_defaultValue = 'user' readersSet_kind_item_kind_widget_noneLabel = N_('Everybody') readersSet_kind_item_kind_widgetName = 'SelectId' readersSet_kind_widget_fieldLabel = N_('Reader') readersSet_kind_widget_fieldLabelPlural = N_('Readers') readersSet_kind_widgetName = 'Multi' writersSet_kind_item_kind_defaultValue = 'user' writersSet_kind_item_kind_widgetName = 'SelectId' writersSet_kind_widget_fieldLabel = N_('Writer') writersSet_kind_widget_fieldLabelPlural = N_('Writers') writersSet_kind_widgetName = 'Multi' register(Contact) class ContactsWeb(ObjectsWebMixin, ContactsProxy): adminClass = AdminContacts contactsWeb = ContactsWeb()
En plus de nos champs, on définit aussi les champs writers et readers. Sans cela nous ne pourrions pas mettre des droits particuliers pour chaque fiche contact.
Il nous reste maintenant à modifier quelques fichiers pour que notre serveur soit pris en compte dans l'application.
Ouvrez le fichier /usr/lib/python2.1/site-packages/glasnost/web/tools.py, et modifiez la fonction getServerRoleAndIdNameFromModuleName pour lui ajouter la ligne:
'contacts': ('contacts', 'contactId'),
Dans le même fichier, dans la fonction getWebForServerRole ajouter la ligne
from ContactsWeb import contactsWeb
Ouvrez le fichier /usr/lib/python2.1/site-packages/glasnost/proxy/tools_new.py et modifiez la fonction getAllBaseProxies pour lui ajouter la ligne:
from ContactsProxy import contactsProxy
Il nous reste maintenant le fichier de configuration de Glasnost à modifier pour indiquer qu'il existe un nouveau serveur. Ouvrez le fichier /etc/glasnost/config et à la fin de ce fichier ajouté une entrée pour votre serveur comme ceci:
[ContactsServer] ServerHostName = localhost ServerPort = 8030
Vous devrez sûrement choisir un autre serverPort que le 8030, car il sera sûrement déjà utilisé par un autre serveur Glasnost.
Voila, vous venez de finir, il ne vous reste plus qu'à redémarrer Glasnost et le serveur web.
/etc/init.d/glasnost restart ; /etc/init.d/apache restart