58 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								--------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								Meta-dependencies,
							 | 
						||
| 
								 | 
							
								Nico Schottelius, 2005-05-24
							 | 
						||
| 
								 | 
							
								--------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1. What are Meta-Dependencies?
							 | 
						||
| 
								 | 
							
								2. What are the advantages / disadvantages of it?
							 | 
						||
| 
								 | 
							
								3. The solutions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1. What are Meta-Dependencies?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A Meta-depedency describes the type of service another service wants, but
							 | 
						||
| 
								 | 
							
								not the exact service.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Example:
							 | 
						||
| 
								 | 
							
								   remote-services/ssh wants a dns-resolver, it does not care about
							 | 
						||
| 
								 | 
							
								   what it is (tinycache, bind, maradns, ...), but that it does
							 | 
						||
| 
								 | 
							
								   name caching.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								2. What are the advantages / disadvantages of it?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Meta means beeing indirect. Indirect means beeing slow. So, if
							 | 
						||
| 
								 | 
							
								cinit would have to care about meta-dependencies, the code would become
							 | 
						||
| 
								 | 
							
								much bigger and slower.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								On the other hand, one would perhaps like to use meta-dependencies, if
							 | 
						||
| 
								 | 
							
								one tests different services with the same functionality or switches
							 | 
						||
| 
								 | 
							
								them dependending on the situation (see profile.support).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								3. The solutions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								As told above, cinit won't care about meta-dependencies and as you'll see
							 | 
						||
| 
								 | 
							
								why it does not even need to.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The first solution would be to have a mapping table outside of cinit.
							 | 
						||
| 
								 | 
							
								This table could be a file for every meta-dependency and contain the
							 | 
						||
| 
								 | 
							
								possibilities:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   dns-resolver:
							 | 
						||
| 
								 | 
							
								      remote-services/bind
							 | 
						||
| 
								 | 
							
								      local-services/tinydns
							 | 
						||
| 
								 | 
							
								      ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								So one would have to call a program, which creates the real cinit
							 | 
						||
| 
								 | 
							
								configuration. This is imho not a very elegant solution and could cause
							 | 
						||
| 
								 | 
							
								problems, when handling self-written services.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Another possibility is to use symlinks: Create service-directories
							 | 
						||
| 
								 | 
							
								for all services beeing installed, but do dependencies in "wants/"
							 | 
						||
| 
								 | 
							
								and "needs/" to a symlink (for instance create /etc/cinit/meta
							 | 
						||
| 
								 | 
							
								and link to real services in there):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   /etc/cinit/meta/dns-resolver -> ../remote-services/bind/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This way you have the indirection (meta-dependencies) in the filesystem
							 | 
						||
| 
								 | 
							
								and cinit does not need any additional code.
							 |