I''m using Fedora DS 1.0.4. I''ve written an application that uses Fedora DS and next I''m planning to write unit tests. I''m wondering if there is a way to delete the whole userRoot database and create it again? I searched the documentation and there seems to be a way to create the database from command line, but no way to delete it, except from the GUI? The reason I''d like to re-create the database is that it simplifies writing unit tests. Before each test case I''d like to re-create the database and import a fixture. Well, that''s how I''ve done unit tests for database applications before, perhaps someone has a better approach? Thank you for any advice! Best regards, Ville
Ville Silventoinen wrote:> I''m using Fedora DS 1.0.4. I''ve written an application that uses > Fedora DS and next I''m planning to write unit tests. I''m wondering if > there is a way to delete the whole userRoot database and create it > again? I searched the documentation and there seems to be a way to > create the database from command line, but no way to delete it, except > from the GUI?Just delete the entry (e.g. delete cn=userRoot,cn=ldbm database,cn=plugins,cn=config). You will have to do some sort of recursive deletion to remove all of the child entries. I think this is what the GUI does - just check the access logs for the server after deleting the database in the console.> > The reason I''d like to re-create the database is that it simplifies > writing unit tests. Before each test case I''d like to re-create the > database and import a fixture. Well, that''s how I''ve done unit tests > for database applications before, perhaps someone has a better approach? > > Thank you for any advice! > > Best regards, > Ville > > -- > Fedora-directory-users mailing list > Fedora-directory-users@redhat.com > https://www.redhat.com/mailman/listinfo/fedora-directory-users
On Thu, 22 Mar 2007, Richard Megginson wrote:> Ville Silventoinen wrote: >> I''m using Fedora DS 1.0.4. I''ve written an application that uses Fedora DS >> and next I''m planning to write unit tests. I''m wondering if there is a way >> to delete the whole userRoot database and create it again? I searched the >> documentation and there seems to be a way to create the database from >> command line, but no way to delete it, except from the GUI? > Just delete the entry (e.g. delete cn=userRoot,cn=ldbm > database,cn=plugins,cn=config). You will have to do some sort of recursive > deletion to remove all of the child entries. I think this is what the GUI > does - just check the access logs for the server after deleting the database > in the console.Thank you Richard, that worked very well. I also delete the mapping tree entry, which maps the suffix to the backend database: dn: cn="dc=ebi,dc=ac,dc=uk",cn=mapping tree,cn=config objectclass: top objectclass: extensibleObject objectclass: nsMappingTree nsslapd-state: backend nsslapd-backend: userRoot cn: dc=ebi,dc=ac,dc=uk The GUI works slightly differently, it sets nsslapd-state to "disabled" and removes the nsslapd-backend attribute. If anyone has a need for a script that can delete and create a database, I can send it to the list. I use Python with python-ldap package. Thank you very much for a fast response! Ville
Ville Silventoinen wrote:> On Thu, 22 Mar 2007, Richard Megginson wrote: > >> Ville Silventoinen wrote: >>> I''m using Fedora DS 1.0.4. I''ve written an application that uses >>> Fedora DS and next I''m planning to write unit tests. I''m wondering >>> if there is a way to delete the whole userRoot database and create >>> it again? I searched the documentation and there seems to be a way >>> to create the database from command line, but no way to delete it, >>> except from the GUI? >> Just delete the entry (e.g. delete cn=userRoot,cn=ldbm >> database,cn=plugins,cn=config). You will have to do some sort of >> recursive deletion to remove all of the child entries. I think this >> is what the GUI does - just check the access logs for the server >> after deleting the database in the console. > > Thank you Richard, that worked very well. I also delete the mapping > tree entry, which maps the suffix to the backend database: > > dn: cn="dc=ebi,dc=ac,dc=uk",cn=mapping tree,cn=config > objectclass: top > objectclass: extensibleObject > objectclass: nsMappingTree > nsslapd-state: backend > nsslapd-backend: userRoot > cn: dc=ebi,dc=ac,dc=uk > > The GUI works slightly differently, it sets nsslapd-state to > "disabled" and removes the nsslapd-backend attribute. > > If anyone has a need for a script that can delete and create a > database, I can send it to the list. I use Python with python-ldap > package. > > Thank you very much for a fast response!If you just want to restore the database to it''s initial state, you can just do an import - ldif2db or ldif2db.pl - this will remove the previous contents and create a new database. This might be sufficient for your purposes, without having to delete the database and mapping tree entries. See ldif2db.pl for how to invoke an import operation via ldap - you can do something similar in python-ldap: def startTaskAndWait(self,entry,verbose=False): # start the task dn = entry.dn self.add_s(entry) entry = self.getEntry(dn, ldap.SCOPE_BASE) if not entry: if verbose: print "Entry %s was added successfully, but I cannot search it" % dn return -1 elif verbose: print entry # wait for task completion - task is complete when the nsTaskExitCode attr is set attrlist = [''nsTaskLog'', ''nsTaskStatus'', ''nsTaskExitCode'', ''nsTaskCurrentItem'', ''nsTaskTotalItems''] done = False exitCode = 0 while not done: time.sleep(1) entry = self.getEntry(dn, ldap.SCOPE_BASE, "(objectclass=*)", attrlist) if verbose: print entry if entry.nsTaskExitCode: exitCode = int(entry.nsTaskExitCode) done = True return exitCode def importLDIF(self,file,suffix,be=None,verbose=False): cn = "import" + str(int(time.time())); dn = "cn=%s, cn=import, cn=tasks, cn=config" % cn entry = Entry(dn) entry.setValues(''objectclass'', ''top'', ''extensibleObject'') entry.setValues(''cn'', cn) entry.setValues(''nsFilename'', file) if be: entry.setValues(''nsInstance'', be) else: entry.setValues(''nsIncludeSuffix'', suffix) rc = self.startTaskAndWait(entry, verbose) if rc: if verbose: print "Error: import task %s for file %s exited with %d" % (cn,file,rc) else: if verbose: print "Import task %s for file %s completed successfully" % (cn,file) return rc> > Ville > > -- > Fedora-directory-users mailing list > Fedora-directory-users@redhat.com > https://www.redhat.com/mailman/listinfo/fedora-directory-users
On Fri, 23 Mar 2007, Richard Megginson wrote:> Ville Silventoinen wrote: >> On Thu, 22 Mar 2007, Richard Megginson wrote: >> >>> Ville Silventoinen wrote: >>>> I''m using Fedora DS 1.0.4. I''ve written an application that uses Fedora >>>> DS and next I''m planning to write unit tests. I''m wondering if there is a >>>> way to delete the whole userRoot database and create it again? I searched >>>> the documentation and there seems to be a way to create the database from >>>> command line, but no way to delete it, except from the GUI? >>> Just delete the entry (e.g. delete cn=userRoot,cn=ldbm >>> database,cn=plugins,cn=config). You will have to do some sort of >>> recursive deletion to remove all of the child entries. I think this is >>> what the GUI does - just check the access logs for the server after >>> deleting the database in the console. >> >> Thank you Richard, that worked very well. I also delete the mapping tree >> entry, which maps the suffix to the backend database: >> >> dn: cn="dc=ebi,dc=ac,dc=uk",cn=mapping tree,cn=config >> objectclass: top >> objectclass: extensibleObject >> objectclass: nsMappingTree >> nsslapd-state: backend >> nsslapd-backend: userRoot >> cn: dc=ebi,dc=ac,dc=uk >> >> The GUI works slightly differently, it sets nsslapd-state to "disabled" and >> removes the nsslapd-backend attribute. >> >> If anyone has a need for a script that can delete and create a database, I >> can send it to the list. I use Python with python-ldap package. >> >> Thank you very much for a fast response! > If you just want to restore the database to it''s initial state, you can just > do an import - ldif2db or ldif2db.pl - this will remove the previous contents > and create a new database. This might be sufficient for your purposes, > without having to delete the database and mapping tree entries. See > ldif2db.pl for how to invoke an import operation via ldapThis may be a stupid question but how do I get ldif2db.pl to remove the previous contents so it can create the entries? I tried like this: ./ldif2db.pl -v -D "cn=Directory Manager" -w mypassword -n userRoot -i /path/to/userRoot.ldif but in the errors log it shows for every entry "WARNING: Skipping duplicate entry". Thanks for the Python example! Ville
Ville Silventoinen wrote:> On Fri, 23 Mar 2007, Richard Megginson wrote: > >> Ville Silventoinen wrote: >>> On Thu, 22 Mar 2007, Richard Megginson wrote: >>> >>>> Ville Silventoinen wrote: >>>>> I''m using Fedora DS 1.0.4. I''ve written an application that uses >>>>> Fedora DS and next I''m planning to write unit tests. I''m wondering >>>>> if there is a way to delete the whole userRoot database and create >>>>> it again? I searched the documentation and there seems to be a way >>>>> to create the database from command line, but no way to delete it, >>>>> except from the GUI? >>>> Just delete the entry (e.g. delete cn=userRoot,cn=ldbm >>>> database,cn=plugins,cn=config). You will have to do some sort of >>>> recursive deletion to remove all of the child entries. I think >>>> this is what the GUI does - just check the access logs for the >>>> server after deleting the database in the console. >>> >>> Thank you Richard, that worked very well. I also delete the mapping >>> tree entry, which maps the suffix to the backend database: >>> >>> dn: cn="dc=ebi,dc=ac,dc=uk",cn=mapping tree,cn=config >>> objectclass: top >>> objectclass: extensibleObject >>> objectclass: nsMappingTree >>> nsslapd-state: backend >>> nsslapd-backend: userRoot >>> cn: dc=ebi,dc=ac,dc=uk >>> >>> The GUI works slightly differently, it sets nsslapd-state to >>> "disabled" and removes the nsslapd-backend attribute. >>> >>> If anyone has a need for a script that can delete and create a >>> database, I can send it to the list. I use Python with python-ldap >>> package. >>> >>> Thank you very much for a fast response! >> If you just want to restore the database to it''s initial state, you >> can just do an import - ldif2db or ldif2db.pl - this will remove the >> previous contents and create a new database. This might be >> sufficient for your purposes, without having to delete the database >> and mapping tree entries. See ldif2db.pl for how to invoke an import >> operation via ldap > > This may be a stupid question but how do I get ldif2db.pl to remove > the previous contents so it can create the entries? > > I tried like this: > > ./ldif2db.pl -v -D "cn=Directory Manager" -w mypassword -n userRoot > -i /path/to/userRoot.ldif > > but in the errors log it shows for every entry "WARNING: Skipping > duplicate entry".That usually means there are duplicate entries in your userRoot.ldif file - can you post it somewhere and post the link to it here? I''d rather not spam the list with a large ldif file.> > Thanks for the Python example! > > Ville > > -- > Fedora-directory-users mailing list > Fedora-directory-users@redhat.com > https://www.redhat.com/mailman/listinfo/fedora-directory-users
On Fri, 23 Mar 2007, Richard Megginson wrote:> Ville Silventoinen wrote: >> On Fri, 23 Mar 2007, Richard Megginson wrote: >> >>> Ville Silventoinen wrote: >>>> On Thu, 22 Mar 2007, Richard Megginson wrote: >>>> >>>>> Ville Silventoinen wrote: >>>>>> I''m using Fedora DS 1.0.4. I''ve written an application that uses Fedora >>>>>> DS and next I''m planning to write unit tests. I''m wondering if there is >>>>>> a way to delete the whole userRoot database and create it again? I >>>>>> searched the documentation and there seems to be a way to create the >>>>>> database from command line, but no way to delete it, except from the >>>>>> GUI? >>>>> Just delete the entry (e.g. delete cn=userRoot,cn=ldbm >>>>> database,cn=plugins,cn=config). You will have to do some sort of >>>>> recursive deletion to remove all of the child entries. I think this is >>>>> what the GUI does - just check the access logs for the server after >>>>> deleting the database in the console. >>>> >>>> Thank you Richard, that worked very well. I also delete the mapping tree >>>> entry, which maps the suffix to the backend database: >>>> >>>> dn: cn="dc=ebi,dc=ac,dc=uk",cn=mapping tree,cn=config >>>> objectclass: top >>>> objectclass: extensibleObject >>>> objectclass: nsMappingTree >>>> nsslapd-state: backend >>>> nsslapd-backend: userRoot >>>> cn: dc=ebi,dc=ac,dc=uk >>>> >>>> The GUI works slightly differently, it sets nsslapd-state to "disabled" >>>> and removes the nsslapd-backend attribute. >>>> >>>> If anyone has a need for a script that can delete and create a database, >>>> I can send it to the list. I use Python with python-ldap package. >>>> >>>> Thank you very much for a fast response! >>> If you just want to restore the database to it''s initial state, you can >>> just do an import - ldif2db or ldif2db.pl - this will remove the previous >>> contents and create a new database. This might be sufficient for your >>> purposes, without having to delete the database and mapping tree entries. >>> See ldif2db.pl for how to invoke an import operation via ldap >> >> This may be a stupid question but how do I get ldif2db.pl to remove the >> previous contents so it can create the entries? >> >> I tried like this: >> >> ./ldif2db.pl -v -D "cn=Directory Manager" -w mypassword -n userRoot -i >> /path/to/userRoot.ldif >> >> but in the errors log it shows for every entry "WARNING: Skipping duplicate >> entry". > That usually means there are duplicate entries in your userRoot.ldif file - > can you post it somewhere and post the link to it here? I''d rather not spam > the list with a large ldif file.Thanks Richard! You were right, all the entries were defined twice in the file. I don''t understand how that happened, I used the "Export Databases" task in the Console to create the file. If the file already exists, does it append new entries to it? I must have done something wrong... Just tested the import, it works very well. Entries are modified, removed and added to restore the original database. It''s very fast too (my test server runs on an old Pentium 3): Processed 9854 entries in 9 seconds. (1094.89 entries/sec) Thank you again! Ville
Ville Silventoinen wrote:> On Fri, 23 Mar 2007, Richard Megginson wrote: > >> Ville Silventoinen wrote: >>> On Fri, 23 Mar 2007, Richard Megginson wrote: >>> >>>> Ville Silventoinen wrote: >>>>> On Thu, 22 Mar 2007, Richard Megginson wrote: >>>>> >>>>>> Ville Silventoinen wrote: >>>>>>> I''m using Fedora DS 1.0.4. I''ve written an application that uses >>>>>>> Fedora DS and next I''m planning to write unit tests. I''m >>>>>>> wondering if there is a way to delete the whole userRoot >>>>>>> database and create it again? I searched the documentation and >>>>>>> there seems to be a way to create the database from command >>>>>>> line, but no way to delete it, except from the GUI? >>>>>> Just delete the entry (e.g. delete cn=userRoot,cn=ldbm >>>>>> database,cn=plugins,cn=config). You will have to do some sort of >>>>>> recursive deletion to remove all of the child entries. I think >>>>>> this is what the GUI does - just check the access logs for the >>>>>> server after deleting the database in the console. >>>>> >>>>> Thank you Richard, that worked very well. I also delete the >>>>> mapping tree entry, which maps the suffix to the backend database: >>>>> >>>>> dn: cn="dc=ebi,dc=ac,dc=uk",cn=mapping tree,cn=config >>>>> objectclass: top >>>>> objectclass: extensibleObject >>>>> objectclass: nsMappingTree >>>>> nsslapd-state: backend >>>>> nsslapd-backend: userRoot >>>>> cn: dc=ebi,dc=ac,dc=uk >>>>> >>>>> The GUI works slightly differently, it sets nsslapd-state to >>>>> "disabled" and removes the nsslapd-backend attribute. >>>>> >>>>> If anyone has a need for a script that can delete and create a >>>>> database, I can send it to the list. I use Python with python-ldap >>>>> package. >>>>> >>>>> Thank you very much for a fast response! >>>> If you just want to restore the database to it''s initial state, you >>>> can just do an import - ldif2db or ldif2db.pl - this will remove >>>> the previous contents and create a new database. This might be >>>> sufficient for your purposes, without having to delete the database >>>> and mapping tree entries. See ldif2db.pl for how to invoke an >>>> import operation via ldap >>> >>> This may be a stupid question but how do I get ldif2db.pl to remove >>> the previous contents so it can create the entries? >>> >>> I tried like this: >>> >>> ./ldif2db.pl -v -D "cn=Directory Manager" -w mypassword -n >>> userRoot -i /path/to/userRoot.ldif >>> >>> but in the errors log it shows for every entry "WARNING: Skipping >>> duplicate entry". >> That usually means there are duplicate entries in your userRoot.ldif >> file - can you post it somewhere and post the link to it here? I''d >> rather not spam the list with a large ldif file. > > Thanks Richard! You were right, all the entries were defined twice in > the file. I don''t understand how that happened, I used the "Export > Databases" > task in the Console to create the file. If the file already exists, > does it append new entries to it? I must have done something wrong...It might append to it. I''m not sure.> > Just tested the import, it works very well. Entries are modified, > removed and added to restore the original database. It''s very fast too > (my test server runs on an old Pentium 3): > > Processed 9854 entries in 9 seconds. (1094.89 entries/sec) > > Thank you again! > > Ville > > -- > Fedora-directory-users mailing list > Fedora-directory-users@redhat.com > https://www.redhat.com/mailman/listinfo/fedora-directory-users
Richard Megginson wrote:> Ville Silventoinen wrote: >> On Fri, 23 Mar 2007, Richard Megginson wrote: >> >>> Ville Silventoinen wrote: >>>> On Fri, 23 Mar 2007, Richard Megginson wrote: >>>> >>>>> Ville Silventoinen wrote: >>>>>> On Thu, 22 Mar 2007, Richard Megginson wrote: >>>>>> >>>>>>> Ville Silventoinen wrote: >>>>>>>> I''m using Fedora DS 1.0.4. I''ve written an application that >>>>>>>> uses Fedora DS and next I''m planning to write unit tests. I''m >>>>>>>> wondering if there is a way to delete the whole userRoot >>>>>>>> database and create it again? I searched the documentation and >>>>>>>> there seems to be a way to create the database from command >>>>>>>> line, but no way to delete it, except from the GUI? >>>>>>> Just delete the entry (e.g. delete cn=userRoot,cn=ldbm >>>>>>> database,cn=plugins,cn=config). You will have to do some sort >>>>>>> of recursive deletion to remove all of the child entries. I >>>>>>> think this is what the GUI does - just check the access logs for >>>>>>> the server after deleting the database in the console. >>>>>> >>>>>> Thank you Richard, that worked very well. I also delete the >>>>>> mapping tree entry, which maps the suffix to the backend database: >>>>>> >>>>>> dn: cn="dc=ebi,dc=ac,dc=uk",cn=mapping tree,cn=config >>>>>> objectclass: top >>>>>> objectclass: extensibleObject >>>>>> objectclass: nsMappingTree >>>>>> nsslapd-state: backend >>>>>> nsslapd-backend: userRoot >>>>>> cn: dc=ebi,dc=ac,dc=uk >>>>>> >>>>>> The GUI works slightly differently, it sets nsslapd-state to >>>>>> "disabled" and removes the nsslapd-backend attribute. >>>>>> >>>>>> If anyone has a need for a script that can delete and create a >>>>>> database, I can send it to the list. I use Python with >>>>>> python-ldap package. >>>>>> >>>>>> Thank you very much for a fast response! >>>>> If you just want to restore the database to it''s initial state, >>>>> you can just do an import - ldif2db or ldif2db.pl - this will >>>>> remove the previous contents and create a new database. This >>>>> might be sufficient for your purposes, without having to delete >>>>> the database and mapping tree entries. See ldif2db.pl for how to >>>>> invoke an import operation via ldap >>>> >>>> This may be a stupid question but how do I get ldif2db.pl to remove >>>> the previous contents so it can create the entries? >>>> >>>> I tried like this: >>>> >>>> ./ldif2db.pl -v -D "cn=Directory Manager" -w mypassword -n >>>> userRoot -i /path/to/userRoot.ldif >>>> >>>> but in the errors log it shows for every entry "WARNING: Skipping >>>> duplicate entry". >>> That usually means there are duplicate entries in your userRoot.ldif >>> file - can you post it somewhere and post the link to it here? I''d >>> rather not spam the list with a large ldif file. >> >> Thanks Richard! You were right, all the entries were defined twice in >> the file. I don''t understand how that happened, I used the "Export >> Databases" >> task in the Console to create the file. If the file already exists, >> does it append new entries to it? I must have done something wrong... > It might append to it. I''m not sure.I could not reproduce it. If I choose the same file name to export database, I get "File ''<filename>'' already exists. Its contents will be overwritten. Do you want to continue?" dialog box, and my existing file is really overwritten...>> >> Just tested the import, it works very well. Entries are modified, >> removed and added to restore the original database. It''s very fast >> too (my test server runs on an old Pentium 3): >> >> Processed 9854 entries in 9 seconds. (1094.89 entries/sec) >> >> Thank you again! >> >> Ville >> >> -- >> Fedora-directory-users mailing list >> Fedora-directory-users@redhat.com >> https://www.redhat.com/mailman/listinfo/fedora-directory-users > ------------------------------------------------------------------------ > > -- > Fedora-directory-users mailing list > Fedora-directory-users@redhat.com > https://www.redhat.com/mailman/listinfo/fedora-directory-users >
On Fri, 23 Mar 2007, Noriko Hosoi wrote:> Richard Megginson wrote: >> Ville Silventoinen wrote: >>> On Fri, 23 Mar 2007, Richard Megginson wrote: >>> >>>> Ville Silventoinen wrote: >>>>> On Fri, 23 Mar 2007, Richard Megginson wrote: >>>>> >>>>>> Ville Silventoinen wrote: >>>>>>> On Thu, 22 Mar 2007, Richard Megginson wrote: >>>>>>> >>>>>>>> Ville Silventoinen wrote: >>>>>>>>> I''m using Fedora DS 1.0.4. I''ve written an application that uses >>>>>>>>> Fedora DS and next I''m planning to write unit tests. I''m wondering >>>>>>>>> if there is a way to delete the whole userRoot database and create >>>>>>>>> it again? I searched the documentation and there seems to be a way >>>>>>>>> to create the database from command line, but no way to delete it, >>>>>>>>> except from the GUI? >>>>>>>> Just delete the entry (e.g. delete cn=userRoot,cn=ldbm >>>>>>>> database,cn=plugins,cn=config). You will have to do some sort of >>>>>>>> recursive deletion to remove all of the child entries. I think this >>>>>>>> is what the GUI does - just check the access logs for the server >>>>>>>> after deleting the database in the console. >>>>>>> >>>>>>> Thank you Richard, that worked very well. I also delete the mapping >>>>>>> tree entry, which maps the suffix to the backend database: >>>>>>> >>>>>>> dn: cn="dc=ebi,dc=ac,dc=uk",cn=mapping tree,cn=config >>>>>>> objectclass: top >>>>>>> objectclass: extensibleObject >>>>>>> objectclass: nsMappingTree >>>>>>> nsslapd-state: backend >>>>>>> nsslapd-backend: userRoot >>>>>>> cn: dc=ebi,dc=ac,dc=uk >>>>>>> >>>>>>> The GUI works slightly differently, it sets nsslapd-state to >>>>>>> "disabled" and removes the nsslapd-backend attribute. >>>>>>> >>>>>>> If anyone has a need for a script that can delete and create a >>>>>>> database, I can send it to the list. I use Python with python-ldap >>>>>>> package. >>>>>>> >>>>>>> Thank you very much for a fast response! >>>>>> If you just want to restore the database to it''s initial state, you can >>>>>> just do an import - ldif2db or ldif2db.pl - this will remove the >>>>>> previous contents and create a new database. This might be sufficient >>>>>> for your purposes, without having to delete the database and mapping >>>>>> tree entries. See ldif2db.pl for how to invoke an import operation via >>>>>> ldap >>>>> >>>>> This may be a stupid question but how do I get ldif2db.pl to remove the >>>>> previous contents so it can create the entries? >>>>> >>>>> I tried like this: >>>>> >>>>> ./ldif2db.pl -v -D "cn=Directory Manager" -w mypassword -n userRoot -i >>>>> /path/to/userRoot.ldif >>>>> >>>>> but in the errors log it shows for every entry "WARNING: Skipping >>>>> duplicate entry". >>>> That usually means there are duplicate entries in your userRoot.ldif file >>>> - can you post it somewhere and post the link to it here? I''d rather not >>>> spam the list with a large ldif file. >>> >>> Thanks Richard! You were right, all the entries were defined twice in the >>> file. I don''t understand how that happened, I used the "Export Databases" >>> task in the Console to create the file. If the file already exists, does >>> it append new entries to it? I must have done something wrong... >> It might append to it. I''m not sure. > I could not reproduce it. If I choose the same file name to export database, > I get "File ''<filename>'' already exists. Its contents will be overwritten. > Do you want to continue?" dialog box, and my existing file is really > overwritten...I tried it as well, I couldn''t reproduce the problem either. Unfortunately I deleted the file so I cannot check in which order the entries were. Thanks for the help. Ville