diff --git a/baseTemplate/templates/baseTemplate/index.html b/baseTemplate/templates/baseTemplate/index.html index eb135bb4f..b298a07f1 100755 --- a/baseTemplate/templates/baseTemplate/index.html +++ b/baseTemplate/templates/baseTemplate/index.html @@ -575,6 +575,19 @@ +
  • + + + {% trans "Plugins" %} + + +
  • + diff --git a/examplePlugin/__init__.py b/examplePlugin/__init__.py new file mode 100644 index 000000000..93ca77eeb --- /dev/null +++ b/examplePlugin/__init__.py @@ -0,0 +1 @@ +default_app_config = 'examplePlugin.apps.ExamplepluginConfig' \ No newline at end of file diff --git a/examplePlugin/admin.py b/examplePlugin/admin.py new file mode 100644 index 000000000..13be29d96 --- /dev/null +++ b/examplePlugin/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/examplePlugin/apps.py b/examplePlugin/apps.py new file mode 100644 index 000000000..daac439e9 --- /dev/null +++ b/examplePlugin/apps.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class ExamplepluginConfig(AppConfig): + name = 'examplePlugin' + + def ready(self): + import signals diff --git a/examplePlugin/migrations/__init__.py b/examplePlugin/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examplePlugin/models.py b/examplePlugin/models.py new file mode 100644 index 000000000..1dfab7604 --- /dev/null +++ b/examplePlugin/models.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models + +# Create your models here. diff --git a/examplePlugin/signals.py b/examplePlugin/signals.py new file mode 100644 index 000000000..37168d64d --- /dev/null +++ b/examplePlugin/signals.py @@ -0,0 +1,16 @@ +from django.dispatch import receiver +from django.http import HttpResponse +from websiteFunctions.signals import postWebsiteDeletion +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging + +# This plugin respond to an event after CyberPanel core finished deleting a website. +# Original request object is passed, body can be accessed with request.body. + +# If any Event handler returns a response object, CyberPanel will stop further processing and returns your response to browser. +# To continue processing just return 200 from your events handlers. + +@receiver(postWebsiteDeletion) +def rcvr(sender, **kwargs): + request = kwargs['request'] + logging.writeToFile('Hello World from Example Plugin.') + return HttpResponse('Hello World from Example Plugin.') diff --git a/examplePlugin/tests.py b/examplePlugin/tests.py new file mode 100644 index 000000000..5982e6bcd --- /dev/null +++ b/examplePlugin/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/examplePlugin/urls.py b/examplePlugin/urls.py new file mode 100644 index 000000000..5c68f92d1 --- /dev/null +++ b/examplePlugin/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import url +import views + +urlpatterns = [ + + url(r'^$', views.examplePlugin, name='examplePlugin'), +] \ No newline at end of file diff --git a/examplePlugin/views.py b/examplePlugin/views.py new file mode 100644 index 000000000..c8c4e619e --- /dev/null +++ b/examplePlugin/views.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import render, HttpResponse + +# Create your views here. + +def examplePlugin(request): + return HttpResponse('This is homepage of an example plugin.') diff --git a/pluginInstaller/__init__.py b/pluginInstaller/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pluginInstaller/examplePlugin.zip b/pluginInstaller/examplePlugin.zip new file mode 100644 index 000000000..a44c789b9 Binary files /dev/null and b/pluginInstaller/examplePlugin.zip differ diff --git a/pluginInstaller/pluginInstaller.py b/pluginInstaller/pluginInstaller.py new file mode 100644 index 000000000..a015696a6 --- /dev/null +++ b/pluginInstaller/pluginInstaller.py @@ -0,0 +1,253 @@ +import subprocess +import shlex +import argparse +import os +import tarfile +import shutil +import time + +class pluginInstaller: + installLogPath = "/home/cyberpanel/modSecInstallLog" + tempRulesFile = "/home/cyberpanel/tempModSecRules" + mirrorPath = "cyberpanel.net" + + @staticmethod + def stdOut(message): + print("\n\n") + print ("[" + time.strftime( + "%I-%M-%S-%a-%b-%Y") + "] #########################################################################\n") + print("[" + time.strftime("%I-%M-%S-%a-%b-%Y") + "] " + message + "\n") + print ("[" + time.strftime( + "%I-%M-%S-%a-%b-%Y") + "] #########################################################################\n") + + ### Functions Related to plugin installation. + + @staticmethod + def extractPlugin(pluginName): + pathToPlugin = pluginName + '.zip' + command = 'unzip ' + pathToPlugin + ' -d /usr/local/CyberCP' + subprocess.call(shlex.split(command)) + + @staticmethod + def upgradingSettingsFile(pluginName): + data = open("/usr/local/CyberCP/CyberCP/settings.py", 'r').readlines() + writeToFile = open("/usr/local/CyberCP/CyberCP/settings.py", 'w') + + for items in data: + if items.find("'emailPremium',") > -1: + writeToFile.writelines(items) + writeToFile.writelines(" '" + pluginName + "',\n") + else: + writeToFile.writelines(items) + + writeToFile.close() + + @staticmethod + def upgradingURLs(pluginName): + data = open("/usr/local/CyberCP/CyberCP/urls.py", 'r').readlines() + writeToFile = open("/usr/local/CyberCP/CyberCP/urls.py", 'w') + print('hello world') + + for items in data: + if items.find("manageservices") > -1: + writeToFile.writelines(items) + writeToFile.writelines(" url(r'^" + pluginName + "/',include('" + pluginName + ".urls')),\n") + print('hello world') + else: + writeToFile.writelines(items) + + writeToFile.close() + + @staticmethod + def informCyberPanel(pluginName): + pluginPath = '/home/cyberpanel/plugins' + + if not os.path.exists(pluginPath): + os.mkdir(pluginPath) + + pluginFile = pluginPath + '/' + pluginName + command = 'touch ' + pluginFile + subprocess.call(shlex.split(command)) + + @staticmethod + def addInterfaceLink(pluginName): + data = open("/usr/local/CyberCP/baseTemplate/templates/baseTemplate/index.html", 'r').readlines() + writeToFile = open("/usr/local/CyberCP/baseTemplate/templates/baseTemplate/index.html", 'w') + + pluginCheck = 0 + + for items in data: + if items.find('{% trans "Plugins" %}') > -1: + pluginCheck = 1 + elif pluginCheck == 1 and items.find('