예제 #1
0
    def _update_validated_data_from_url(validated_data: Dict[str, Any],
                                        url: str) -> Dict:
        if url.startswith("file:"):
            plugin_path = url[5:]
            json_path = os.path.join(plugin_path, "plugin.json")
            json = load_json_file(json_path)
            if not json:
                raise ValidationError(
                    "Could not load plugin.json from: {}".format(json_path))
            validated_data["plugin_type"] = "local"
            validated_data["url"] = url
            validated_data["tag"] = None
            validated_data["archive"] = None
            validated_data["name"] = json.get("name", json_path.split("/")[-2])
            validated_data["description"] = json.get("description", "")
            validated_data["config_schema"] = json.get("config", [])
            validated_data["source"] = None
            posthog_version = json.get("posthogVersion", None)
        else:
            parsed_url = parse_url(url, get_latest_if_none=True)
            if parsed_url:
                validated_data["url"] = parsed_url["root_url"]
                validated_data["tag"] = parsed_url.get("tag", None)
                validated_data["archive"] = download_plugin_archive(
                    validated_data["url"], validated_data["tag"])
                plugin_json = get_json_from_archive(validated_data["archive"],
                                                    "plugin.json")
                if not plugin_json:
                    raise ValidationError(
                        "Could not find plugin.json in the plugin")
                validated_data["name"] = plugin_json["name"]
                validated_data["description"] = plugin_json.get(
                    "description", "")
                validated_data["config_schema"] = plugin_json.get("config", [])
                validated_data["source"] = None
                posthog_version = plugin_json.get("posthogVersion", None)
            else:
                raise ValidationError(
                    "Must be a GitHub/GitLab repository or a npm package URL!")

            # Keep plugin type as "repository" or reset to "custom" if it was something else.
            if (validated_data.get("plugin_type", None) !=
                    Plugin.PluginType.CUSTOM and validated_data.get(
                        "plugin_type", None) != Plugin.PluginType.REPOSITORY):
                validated_data["plugin_type"] = Plugin.PluginType.CUSTOM

        if posthog_version and not settings.MULTI_TENANCY:
            try:
                spec = SimpleSpec(posthog_version.replace(" ", ""))
            except ValueError:
                raise ValidationError(
                    f'Invalid PostHog semantic version requirement "{posthog_version}"!'
                )
            if not (Version(VERSION) in spec):
                raise ValidationError(
                    f'Currently running PostHog version {VERSION} does not match this plugin\'s semantic version requirement "{posthog_version}".'
                )

        return validated_data
예제 #2
0
    def check_for_updates(self, request: request.Request, **kwargs):
        if not can_install_plugins(self.organization):
            raise PermissionDenied("Plugin installation is not available for the current organization!")
        plugin = self.get_object()
        latest_url = parse_url(plugin.url, get_latest_if_none=True)
        plugin.latest_tag = latest_url.get("tag", latest_url.get("version", None))
        plugin.latest_tag_checked_at = now()
        plugin.save()

        return Response({"plugin": PluginSerializer(plugin).data})
예제 #3
0
    def check_for_updates(self, request: request.Request, **kwargs):
        if not can_install_plugins_via_api(self.organization):
            raise ValidationError("Plugin installation via the web is disabled!")

        plugin = self.get_object()
        latest_url = parse_url(plugin.url, get_latest_if_none=True)
        plugin.latest_tag = latest_url.get("tag", latest_url.get("version", None))
        plugin.latest_tag_checked_at = now()
        plugin.save()

        return Response({"plugin": PluginSerializer(plugin).data})
예제 #4
0
    def check_for_updates(self, request: request.Request, **kwargs):
        if not can_install_plugins(self.organization):
            raise PermissionDenied(
                "Plugin installation is not available for the current organization!"
            )

        plugin = self.get_object()
        latest_url = parse_url(plugin.url, get_latest_if_none=True)

        # use update to not trigger the post_save signal and avoid telling the plugin server to reload vms
        Plugin.objects.filter(id=plugin.id).update(latest_tag=latest_url.get(
            "tag", latest_url.get("version", None)),
                                                   latest_tag_checked_at=now())

        return Response({"plugin": PluginSerializer(plugin).data})
예제 #5
0
    def _update_validated_data_from_url(self, validated_data: Dict[str, Any],
                                        url: str) -> Dict:
        if url.startswith("file:"):
            plugin_path = url[5:]
            json_path = os.path.join(plugin_path, "plugin.json")
            json = load_json_file(json_path)
            if not json:
                raise ValidationError(
                    "Could not load plugin.json from: {}".format(json_path))
            validated_data["plugin_type"] = "local"
            validated_data["url"] = url
            validated_data["tag"] = None
            validated_data["archive"] = None
            validated_data["name"] = json.get("name", json_path.split("/")[-2])
            validated_data["description"] = json.get("description", "")
            validated_data["config_schema"] = json.get("config", {})
            validated_data["source"] = None
        else:
            parsed_url = parse_url(url, get_latest_if_none=True)
            if parsed_url:
                validated_data["url"] = parsed_url["root_url"]
                validated_data["tag"] = parsed_url.get(
                    "version", parsed_url.get("tag", None))
                validated_data["archive"] = download_plugin_archive(
                    validated_data["url"], validated_data["tag"])
                plugin_json = get_json_from_archive(validated_data["archive"],
                                                    "plugin.json")
                if not plugin_json:
                    raise ValidationError(
                        "Could not find plugin.json in the plugin")
                validated_data["name"] = plugin_json["name"]
                validated_data["description"] = plugin_json.get(
                    "description", "")
                validated_data["config_schema"] = plugin_json.get("config", {})
                validated_data["source"] = None
            else:
                raise ValidationError(
                    "Must be a GitHub repository or a NPM package URL!")

            # Keep plugin type as "repository" or reset to "custom" if it was something else.
            if (validated_data.get("plugin_type", None) !=
                    Plugin.PluginType.CUSTOM and validated_data.get(
                        "plugin_type", None) != Plugin.PluginType.REPOSITORY):
                validated_data["plugin_type"] = Plugin.PluginType.CUSTOM

        return validated_data
예제 #6
0
파일: plugin.py 프로젝트: sbauch/posthog
    def create(self, validated_data: Dict, *args: Any, **kwargs: Any) -> Plugin:
        if not can_install_plugins_via_api():
            raise ValidationError("Plugin installation via the web is disabled!")

        local_plugin = validated_data.get("url", "").startswith("file:")

        if local_plugin:
            plugin_path = validated_data["url"][5:]
            json_path = os.path.join(plugin_path, "plugin.json")
            json = load_json_file(json_path)
            if not json:
                raise ValidationError("Could not load plugin.json from: {}".format(json_path))
            validated_data["name"] = json.get("name", json_path.split("/")[-2])
            validated_data["description"] = json.get("description", "")
            validated_data["config_schema"] = json.get("config", {})
        else:
            parsed_url = parse_url(validated_data["url"], get_latest_if_none=True)
            if parsed_url:
                validated_data["url"] = parsed_url["root_url"]
                validated_data["tag"] = parsed_url.get("version", parsed_url.get("tag", None))
                validated_data["archive"] = download_plugin_archive(validated_data["url"], validated_data["tag"])
                plugin_json = get_json_from_archive(validated_data["archive"], "plugin.json")
                if not plugin_json:
                    raise ValidationError("Could not find plugin.json in the plugin")
                validated_data["name"] = plugin_json["name"]
                validated_data["description"] = plugin_json.get("description", "")
                validated_data["config_schema"] = plugin_json.get("config", {})
            else:
                raise ValidationError("Must be a GitHub repository or a NPM package URL!")

        if len(Plugin.objects.filter(name=validated_data["name"])) > 0:
            raise ValidationError('Plugin with name "{}" already installed!'.format(validated_data["name"]))

        validated_data["from_web"] = True
        plugin = super().create(validated_data)
        reload_plugins_on_workers()
        return plugin
예제 #7
0
    def _get_validated_data_for_url(self, url: str) -> Dict:
        validated_data: Dict[str, Any] = {}
        if url.startswith("file:"):
            plugin_path = url[5:]
            json_path = os.path.join(plugin_path, "plugin.json")
            json = load_json_file(json_path)
            if not json:
                raise ValidationError(
                    "Could not load plugin.json from: {}".format(json_path))
            validated_data["url"] = url
            validated_data["tag"] = None
            validated_data["archive"] = None
            validated_data["name"] = json.get("name", json_path.split("/")[-2])
            validated_data["description"] = json.get("description", "")
            validated_data["config_schema"] = json.get("config", {})
        else:
            parsed_url = parse_url(url, get_latest_if_none=True)
            if parsed_url:
                validated_data["url"] = parsed_url["root_url"]
                validated_data["tag"] = parsed_url.get(
                    "version", parsed_url.get("tag", None))
                validated_data["archive"] = download_plugin_archive(
                    validated_data["url"], validated_data["tag"])
                plugin_json = get_json_from_archive(validated_data["archive"],
                                                    "plugin.json")
                if not plugin_json:
                    raise ValidationError(
                        "Could not find plugin.json in the plugin")
                validated_data["name"] = plugin_json["name"]
                validated_data["description"] = plugin_json.get(
                    "description", "")
                validated_data["config_schema"] = plugin_json.get("config", {})
            else:
                raise ValidationError(
                    "Must be a GitHub repository or a NPM package URL!")

        return validated_data