import ro.fortsoft.pf4j.PluginState; | import ro.fortsoft.pf4j.PluginState; | ||||
import ro.fortsoft.pf4j.PluginWrapper; | import ro.fortsoft.pf4j.PluginWrapper; | ||||
import ro.fortsoft.pf4j.Version; | |||||
import com.gitblit.Constants; | import com.gitblit.Constants; | ||||
import com.gitblit.Constants.AccessPermission; | import com.gitblit.Constants.AccessPermission; | ||||
* PLUGIN MANAGER | * PLUGIN MANAGER | ||||
*/ | */ | ||||
@Override | |||||
public Version getSystemVersion() { | |||||
return pluginManager.getSystemVersion(); | |||||
} | |||||
@Override | @Override | ||||
public void startPlugins() { | public void startPlugins() { | ||||
pluginManager.startPlugins(); | pluginManager.startPlugins(); |
import ro.fortsoft.pf4j.PluginState; | import ro.fortsoft.pf4j.PluginState; | ||||
import ro.fortsoft.pf4j.PluginWrapper; | import ro.fortsoft.pf4j.PluginWrapper; | ||||
import ro.fortsoft.pf4j.Version; | |||||
import com.gitblit.models.PluginRegistry.InstallState; | import com.gitblit.models.PluginRegistry.InstallState; | ||||
import com.gitblit.models.PluginRegistry.PluginRegistration; | import com.gitblit.models.PluginRegistry.PluginRegistration; | ||||
public interface IPluginManager extends IManager { | public interface IPluginManager extends IManager { | ||||
/** | |||||
* Returns the system version. | |||||
* | |||||
* @return the system version | |||||
*/ | |||||
Version getSystemVersion(); | |||||
/** | /** | ||||
* Starts all plugins. | * Starts all plugins. | ||||
*/ | */ |
import ro.fortsoft.pf4j.PluginState; | import ro.fortsoft.pf4j.PluginState; | ||||
import ro.fortsoft.pf4j.PluginStateEvent; | import ro.fortsoft.pf4j.PluginStateEvent; | ||||
import ro.fortsoft.pf4j.PluginStateListener; | import ro.fortsoft.pf4j.PluginStateListener; | ||||
import ro.fortsoft.pf4j.PluginVersion; | |||||
import ro.fortsoft.pf4j.PluginWrapper; | import ro.fortsoft.pf4j.PluginWrapper; | ||||
import ro.fortsoft.pf4j.Version; | |||||
import com.gitblit.Constants; | |||||
import com.gitblit.Keys; | import com.gitblit.Keys; | ||||
import com.gitblit.models.PluginRegistry; | import com.gitblit.models.PluginRegistry; | ||||
import com.gitblit.models.PluginRegistry.InstallState; | import com.gitblit.models.PluginRegistry.InstallState; | ||||
* the Dagger DI and retrieve extensions provided by active plugins. | * the Dagger DI and retrieve extensions provided by active plugins. | ||||
* | * | ||||
* @author David Ostrovsky | * @author David Ostrovsky | ||||
* @author James Moger | |||||
* | * | ||||
*/ | */ | ||||
public class PluginManager implements IPluginManager, PluginStateListener { | public class PluginManager implements IPluginManager, PluginStateListener { | ||||
File dir = runtimeManager.getFileOrFolder(Keys.plugins.folder, "${baseFolder}/plugins"); | File dir = runtimeManager.getFileOrFolder(Keys.plugins.folder, "${baseFolder}/plugins"); | ||||
dir.mkdirs(); | dir.mkdirs(); | ||||
this.runtimeManager = runtimeManager; | this.runtimeManager = runtimeManager; | ||||
this.pf4j = new DefaultPluginManager(dir); | this.pf4j = new DefaultPluginManager(dir); | ||||
try { | |||||
Version systemVersion = Version.createVersion(Constants.getVersion()); | |||||
pf4j.setSystemVersion(systemVersion); | |||||
} catch (Exception e) { | |||||
logger.error(null, e); | |||||
} | |||||
} | |||||
@Override | |||||
public Version getSystemVersion() { | |||||
return pf4j.getSystemVersion(); | |||||
} | } | ||||
@Override | @Override | ||||
return PluginState.STARTED.equals(state); | return PluginState.STARTED.equals(state); | ||||
} | } | ||||
@Override | |||||
public synchronized boolean upgradePlugin(String pluginId, String url, boolean verifyChecksum) throws IOException { | public synchronized boolean upgradePlugin(String pluginId, String url, boolean verifyChecksum) throws IOException { | ||||
// ensure we can download the update BEFORE we remove the existing one | // ensure we can download the update BEFORE we remove the existing one | ||||
File file = download(url, verifyChecksum); | File file = download(url, verifyChecksum); | ||||
(file.getName().toLowerCase().endsWith(".sha1") | (file.getName().toLowerCase().endsWith(".sha1") | ||||
|| file.getName().toLowerCase().endsWith(".md5")); | || file.getName().toLowerCase().endsWith(".md5")); | ||||
} | } | ||||
}); | }); | ||||
if (checksums != null) { | if (checksums != null) { | ||||
for (PluginWrapper pw : pf4j.getPlugins()) { | for (PluginWrapper pw : pf4j.getPlugins()) { | ||||
String id = pw.getDescriptor().getPluginId(); | String id = pw.getDescriptor().getPluginId(); | ||||
PluginVersion pv = pw.getDescriptor().getVersion(); | |||||
Version pv = pw.getDescriptor().getVersion(); | |||||
PluginRegistration reg = map.get(id); | PluginRegistration reg = map.get(id); | ||||
if (reg != null) { | if (reg != null) { | ||||
reg.installedRelease = pv.toString(); | reg.installedRelease = pv.toString(); |
import ro.fortsoft.pf4j.PluginDescriptor; | import ro.fortsoft.pf4j.PluginDescriptor; | ||||
import ro.fortsoft.pf4j.PluginState; | import ro.fortsoft.pf4j.PluginState; | ||||
import ro.fortsoft.pf4j.PluginWrapper; | import ro.fortsoft.pf4j.PluginWrapper; | ||||
import ro.fortsoft.pf4j.Version; | |||||
import com.gitblit.manager.IGitblit; | import com.gitblit.manager.IGitblit; | ||||
import com.gitblit.models.PluginRegistry.InstallState; | import com.gitblit.models.PluginRegistry.InstallState; | ||||
import com.gitblit.models.UserModel; | import com.gitblit.models.UserModel; | ||||
import com.gitblit.utils.FlipTable; | import com.gitblit.utils.FlipTable; | ||||
import com.gitblit.utils.FlipTable.Borders; | import com.gitblit.utils.FlipTable.Borders; | ||||
import com.gitblit.utils.StringUtils; | |||||
import com.google.common.base.Joiner; | import com.google.common.base.Joiner; | ||||
/** | /** | ||||
new UnloggedFailure(1, String.format("Failed to install %s", urlOrId)); | new UnloggedFailure(1, String.format("Failed to install %s", urlOrId)); | ||||
} | } | ||||
} else { | } else { | ||||
PluginRelease pv = gitblit.lookupRelease(urlOrId, version); | |||||
if (pv == null) { | |||||
throw new Failure(1, String.format("Plugin \"%s\" is not in the registry!", urlOrId)); | |||||
PluginRelease pr = gitblit.lookupRelease(urlOrId, version); | |||||
if (pr == null) { | |||||
throw new UnloggedFailure(1, String.format("Plugin \"%s\" is not in the registry!", urlOrId)); | |||||
} | } | ||||
if (gitblit.installPlugin(pv.url, !disableChecksum)) { | |||||
// enforce minimum system requirement | |||||
if (!StringUtils.isEmpty(pr.requires)) { | |||||
Version requires = Version.createVersion(pr.requires); | |||||
Version system = gitblit.getSystemVersion(); | |||||
boolean isValid = system.isZero() || system.atLeast(requires); | |||||
if (!isValid) { | |||||
String msg = String.format("Plugin \"%s:%s\" requires Gitblit %s", | |||||
urlOrId, pr.version, pr.requires); | |||||
throw new UnloggedFailure(1, msg); | |||||
} | |||||
} | |||||
if (gitblit.installPlugin(pr.url, !disableChecksum)) { | |||||
stdout.println(String.format("Installed %s", urlOrId)); | stdout.println(String.format("Installed %s", urlOrId)); | ||||
} else { | } else { | ||||
throw new UnloggedFailure(1, String.format("Failed to install %s", urlOrId)); | throw new UnloggedFailure(1, String.format("Failed to install %s", urlOrId)); | ||||
throw new UnloggedFailure("Invalid plugin specified!"); | throw new UnloggedFailure("Invalid plugin specified!"); | ||||
} | } | ||||
PluginRelease pv = gitblit.lookupRelease(pluginWrapper.getPluginId(), version); | |||||
if (pv == null) { | |||||
PluginRelease pr = gitblit.lookupRelease(pluginWrapper.getPluginId(), version); | |||||
if (pr == null) { | |||||
throw new UnloggedFailure(1, String.format("Plugin \"%s\" is not in the registry!", pluginWrapper.getPluginId())); | throw new UnloggedFailure(1, String.format("Plugin \"%s\" is not in the registry!", pluginWrapper.getPluginId())); | ||||
} | } | ||||
// enforce minimum system requirement | |||||
if (!StringUtils.isEmpty(pr.requires)) { | |||||
Version requires = Version.createVersion(pr.requires); | |||||
Version system = gitblit.getSystemVersion(); | |||||
boolean isValid = system.isZero() || system.atLeast(requires); | |||||
if (!isValid) { | |||||
throw new Failure(1, String.format("Plugin \"%s:%s\" requires Gitblit %s", | |||||
pluginWrapper.getPluginId(), pr.version, pr.requires)); | |||||
} | |||||
} | |||||
try { | try { | ||||
if (gitblit.upgradePlugin(pluginWrapper.getPluginId(), pv.url, !disableChecksum)) { | |||||
if (gitblit.upgradePlugin(pluginWrapper.getPluginId(), pr.url, !disableChecksum)) { | |||||
stdout.println(String.format("Upgraded %s", pluginWrapper.getPluginId())); | stdout.println(String.format("Upgraded %s", pluginWrapper.getPluginId())); | ||||
} else { | } else { | ||||
throw new UnloggedFailure(1, String.format("Failed to upgrade %s", pluginWrapper.getPluginId())); | throw new UnloggedFailure(1, String.format("Failed to upgrade %s", pluginWrapper.getPluginId())); |