# rolling binary updates from server to clients



## Barnon (Jun 12, 2009)

I haven't had any luck searching for this, perhaps someone here 
can point me in the right direction.

Is there an app to enable a FreeBSD server to perform binary
updates on a host of FreeBSD clients.

Example 1: A binary update to an application (FireFox) is needed on all 
           clients.The server needs to PUSH this out to 10 machines.   

Example 2: A binary update is needed, but not available, so the server
           needs to compile the source and push the resulting binary
           updates out to the 10 clients.

In case 2, I believe the server can generate a package from source
and make it available to the clients as a partial solution. It would
be best however if the server could push the updates out without
having to run a pkg_add or portupgrade on every machine through a login.


----------



## keramida@ (Jun 13, 2009)

Barnon said:
			
		

> I haven't had any luck searching for this, perhaps someone here can point me in the right direction.
> 
> Is there an app to enable a FreeBSD server to perform binary updates on a host of FreeBSD clients.



One of the ways to do that is what you guessed and described below.  By building pre-compiled packages and having the clients _pull_ them from a package server.



			
				Barnon said:
			
		

> Example 1: A binary update to an application (FireFox) is needed on all clients. The server needs to PUSH this out to 10 machines



If all the clients have the _same_ set of packages, and they have 99% identical configuration options in their /usr/local filesystems, it may be more efficient to update the packages in _only one_ client and then push the changes from the server to the clients or pull from each client.  Using net/rsync or a similar tool may be much faster than running portupgrade a few dozen or more than a hundred times.

If there are more than one "type" of clients, but they fall in just a handful of categories, you should investigate tools like jails and sysutils/cfengine.

For example, if you have two different client types, and they need a different set of packages installed in their /usr/local filesystems, but they run the same FreeBSD release, you can:


 Prepare two jails in the server: one for each client type.  These will be used as pre-mastering / staging areas for client updates.
 Install sysutils/cfengine on the server, and use it to track the configuration files of each client "master image".
 Update the packages in each jail.
 Check the new package versions and make sure that they work. 
 Push the updates from each jail to the clients that use this type of "client image".  This part can use rsync, rdiff-backup or some other form of filesystem synchronization.


----------

