diff --git a/package/secubox/luci-app-cyberfeed/root/usr/libexec/rpcd/luci.cyberfeed b/package/secubox/luci-app-cyberfeed/root/usr/libexec/rpcd/luci.cyberfeed old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-gitea/root/usr/libexec/rpcd/luci.gitea b/package/secubox/luci-app-gitea/root/usr/libexec/rpcd/luci.gitea old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-glances/root/usr/libexec/rpcd/luci.glances b/package/secubox/luci-app-glances/root/usr/libexec/rpcd/luci.glances old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-haproxy/root/usr/libexec/rpcd/luci.haproxy b/package/secubox/luci-app-haproxy/root/usr/libexec/rpcd/luci.haproxy old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-hexojs/Makefile b/package/secubox/luci-app-hexojs/Makefile index 38cd31b2..e75f133e 100644 --- a/package/secubox/luci-app-hexojs/Makefile +++ b/package/secubox/luci-app-hexojs/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-hexojs PKG_VERSION:=1.0.0 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_ARCH:=all PKG_LICENSE:=MIT diff --git a/package/secubox/luci-app-hexojs/htdocs/luci-static/resources/hexojs/api.js b/package/secubox/luci-app-hexojs/htdocs/luci-static/resources/hexojs/api.js index 14b0c025..6b8d5917 100644 --- a/package/secubox/luci-app-hexojs/htdocs/luci-static/resources/hexojs/api.js +++ b/package/secubox/luci-app-hexojs/htdocs/luci-static/resources/hexojs/api.js @@ -154,6 +154,13 @@ var callDeployStatus = rpc.declare({ expect: {} }); +var callPublishToWww = rpc.declare({ + object: 'luci.hexojs', + method: 'publish_to_www', + params: ['path'], + expect: {} +}); + // ============================================ // Preview // ============================================ @@ -478,6 +485,7 @@ return baseclass.extend({ clean: callClean, deploy: callDeploy, getDeployStatus: callDeployStatus, + publishToWww: callPublishToWww, // Preview previewStart: callPreviewStart, diff --git a/package/secubox/luci-app-hexojs/htdocs/luci-static/resources/view/hexojs/sync.js b/package/secubox/luci-app-hexojs/htdocs/luci-static/resources/view/hexojs/sync.js index c433e2d6..578ae0ab 100644 --- a/package/secubox/luci-app-hexojs/htdocs/luci-static/resources/view/hexojs/sync.js +++ b/package/secubox/luci-app-hexojs/htdocs/luci-static/resources/view/hexojs/sync.js @@ -28,6 +28,19 @@ var callGiteaSaveConfig = rpc.declare({ params: ['enabled', 'gitea_url', 'gitea_user', 'gitea_token', 'content_repo', 'content_branch', 'auto_sync'] }); +var callBuild = rpc.declare({ + object: 'luci.hexojs', + method: 'generate', + expect: {} +}); + +var callPublishToWww = rpc.declare({ + object: 'luci.hexojs', + method: 'publish_to_www', + params: ['path'], + expect: {} +}); + return view.extend({ title: _('Content Sync'), wizardStep: 0, @@ -210,6 +223,50 @@ return view.extend({ }); }, + // ============================================ + // Build & Publish Actions + // ============================================ + + handleBuild: function() { + ui.showModal(_('Building Site'), [ + E('p', { 'class': 'spinning' }, _('Generating static files...')) + ]); + + callBuild().then(function(result) { + ui.hideModal(); + if (result.success) { + ui.addNotification(null, E('p', _('Site built successfully!')), 'info'); + } else { + ui.addNotification(null, E('p', result.error || _('Build failed')), 'error'); + } + }).catch(function(err) { + ui.hideModal(); + ui.addNotification(null, E('p', _('Error: %s').format(err.message || err)), 'error'); + }); + }, + + handlePublish: function() { + var self = this; + var path = document.querySelector('#publish-path'); + var publishPath = path ? path.value : '/www/blog'; + + ui.showModal(_('Publishing Site'), [ + E('p', { 'class': 'spinning' }, _('Building and publishing to %s...').format(publishPath)) + ]); + + callPublishToWww(publishPath).then(function(result) { + ui.hideModal(); + if (result.success) { + ui.addNotification(null, E('p', _('Published to %s!').format(result.path || publishPath)), 'info'); + } else { + ui.addNotification(null, E('p', result.error || _('Publish failed')), 'error'); + } + }).catch(function(err) { + ui.hideModal(); + ui.addNotification(null, E('p', _('Error: %s').format(err.message || err)), 'error'); + }); + }, + // ============================================ // Gitea Actions // ============================================ @@ -297,6 +354,49 @@ return view.extend({ ]) : '' ]), + // Build & Publish Card + E('div', { 'class': 'hexo-card' }, [ + E('div', { 'class': 'hexo-card-header' }, [ + E('div', { 'class': 'hexo-card-title' }, [ + E('span', { 'style': 'margin-right: 8px;' }, '\uD83D\uDE80'), + _('Build & Publish') + ]) + ]), + E('p', { 'style': 'margin-bottom: 16px; color: var(--hexo-text-muted);' }, + _('Build static files and publish to web server.')), + E('div', { 'style': 'display: grid; grid-template-columns: 1fr 1fr; gap: 16px;' }, [ + // Build Section + E('div', { 'class': 'hexo-card', 'style': 'background: var(--hexo-bg-input);' }, [ + E('h4', { 'style': 'margin-bottom: 8px;' }, ['\uD83D\uDD28 ', _('Build')]), + E('p', { 'style': 'font-size: 13px; color: var(--hexo-text-muted); margin-bottom: 12px;' }, + _('Generate static HTML files from your content.')), + E('button', { + 'class': 'hexo-btn hexo-btn-primary', + 'click': function() { self.handleBuild(); } + }, _('Build Site')) + ]), + // Publish Section + E('div', { 'class': 'hexo-card', 'style': 'background: var(--hexo-bg-input);' }, [ + E('h4', { 'style': 'margin-bottom: 8px;' }, ['\uD83C\uDF10 ', _('Publish')]), + E('p', { 'style': 'font-size: 13px; color: var(--hexo-text-muted); margin-bottom: 12px;' }, + _('Copy built files to web server directory.')), + E('div', { 'class': 'hexo-form-group', 'style': 'margin-bottom: 8px;' }, [ + E('input', { + 'type': 'text', + 'id': 'publish-path', + 'class': 'hexo-input', + 'value': '/www/blog', + 'placeholder': '/www/blog' + }) + ]), + E('button', { + 'class': 'hexo-btn hexo-btn-success', + 'click': function() { self.handlePublish(); } + }, _('Publish to Web')) + ]) + ]) + ]), + // Gitea Integration Card E('div', { 'class': 'hexo-card' }, [ E('div', { 'class': 'hexo-card-header' }, [ diff --git a/package/secubox/luci-app-hexojs/root/usr/libexec/rpcd/luci.hexojs b/package/secubox/luci-app-hexojs/root/usr/libexec/rpcd/luci.hexojs old mode 100644 new mode 100755 index d945218d..101cab00 --- a/package/secubox/luci-app-hexojs/root/usr/libexec/rpcd/luci.hexojs +++ b/package/secubox/luci-app-hexojs/root/usr/libexec/rpcd/luci.hexojs @@ -1544,6 +1544,45 @@ gitea_save_config() { json_dump } +# Publish to /www (portal) +publish_to_www() { + read input + json_load "$input" + json_get_var path path + + json_init + + if ! is_running; then + json_add_boolean "success" 0 + json_add_string "error" "Container not running" + json_dump + return + fi + + # Default path is /www/blog + [ -z "$path" ] && path="/www/blog" + + # Set portal path in UCI for hexoctl + uci set hexojs.portal=hexojs + uci set hexojs.portal.path="$path" + uci commit hexojs + + # Run publish command + local output=$("$HEXOCTL" publish 2>&1) + local result=$? + + if [ "$result" -eq 0 ]; then + json_add_boolean "success" 1 + json_add_string "message" "Published to $path" + json_add_string "path" "$path" + else + json_add_boolean "success" 0 + json_add_string "error" "$output" + fi + + json_dump +} + # ============================================ # Service Control # ============================================ @@ -1634,7 +1673,8 @@ case "$1" in "gitea_setup": {}, "gitea_clone": {}, "gitea_sync": {}, - "gitea_save_config": {"enabled": "bool", "gitea_url": "str", "gitea_user": "str", "gitea_token": "str", "content_repo": "str", "content_branch": "str", "auto_sync": "bool"} + "gitea_save_config": {"enabled": "bool", "gitea_url": "str", "gitea_user": "str", "gitea_token": "str", "content_repo": "str", "content_branch": "str", "auto_sync": "bool"}, + "publish_to_www": {"path": "str"} } EOF ;; @@ -1686,6 +1726,7 @@ EOF gitea_clone) gitea_clone ;; gitea_sync) gitea_sync ;; gitea_save_config) gitea_save_config ;; + publish_to_www) publish_to_www ;; *) echo '{"error": "Unknown method"}' ;; esac ;; diff --git a/package/secubox/luci-app-hexojs/root/usr/share/rpcd/acl.d/luci-app-hexojs.json b/package/secubox/luci-app-hexojs/root/usr/share/rpcd/acl.d/luci-app-hexojs.json index 2104e057..6aad33d2 100644 --- a/package/secubox/luci-app-hexojs/root/usr/share/rpcd/acl.d/luci-app-hexojs.json +++ b/package/secubox/luci-app-hexojs/root/usr/share/rpcd/acl.d/luci-app-hexojs.json @@ -56,7 +56,8 @@ "gitea_setup", "gitea_clone", "gitea_sync", - "gitea_save_config" + "gitea_save_config", + "publish_to_www" ] }, "uci": ["hexojs"] diff --git a/package/secubox/luci-app-localai/root/usr/libexec/rpcd/luci.localai b/package/secubox/luci-app-localai/root/usr/libexec/rpcd/luci.localai old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-magicmirror2/root/usr/libexec/rpcd/luci.magicmirror2 b/package/secubox/luci-app-magicmirror2/root/usr/libexec/rpcd/luci.magicmirror2 old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-metabolizer/root/usr/libexec/rpcd/luci.metabolizer b/package/secubox/luci-app-metabolizer/root/usr/libexec/rpcd/luci.metabolizer old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-mmpm/root/usr/libexec/rpcd/luci.mmpm b/package/secubox/luci-app-mmpm/root/usr/libexec/rpcd/luci.mmpm old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-ollama/root/usr/libexec/rpcd/luci.ollama b/package/secubox/luci-app-ollama/root/usr/libexec/rpcd/luci.ollama old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-picobrew/root/usr/libexec/rpcd/luci.picobrew b/package/secubox/luci-app-picobrew/root/usr/libexec/rpcd/luci.picobrew old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-streamlit/root/usr/libexec/rpcd/luci.streamlit b/package/secubox/luci-app-streamlit/root/usr/libexec/rpcd/luci.streamlit old mode 100644 new mode 100755 diff --git a/package/secubox/luci-app-tor-shield/root/usr/libexec/rpcd/luci.tor-shield b/package/secubox/luci-app-tor-shield/root/usr/libexec/rpcd/luci.tor-shield old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-cyberfeed/files/etc/init.d/cyberfeed b/package/secubox/secubox-app-cyberfeed/files/etc/init.d/cyberfeed old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-gitea/files/etc/init.d/gitea b/package/secubox/secubox-app-gitea/files/etc/init.d/gitea old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-glances/files/etc/init.d/glances b/package/secubox/secubox-app-glances/files/etc/init.d/glances old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-haproxy/files/etc/init.d/haproxy b/package/secubox/secubox-app-haproxy/files/etc/init.d/haproxy old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-hexojs/files/etc/init.d/hexojs b/package/secubox/secubox-app-hexojs/files/etc/init.d/hexojs old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-localai/files/etc/init.d/localai b/package/secubox/secubox-app-localai/files/etc/init.d/localai old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-magicmirror2/files/etc/init.d/magicmirror2 b/package/secubox/secubox-app-magicmirror2/files/etc/init.d/magicmirror2 old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-metabolizer/files/etc/init.d/metabolizer b/package/secubox/secubox-app-metabolizer/files/etc/init.d/metabolizer old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-mmpm/files/etc/init.d/mmpm b/package/secubox/secubox-app-mmpm/files/etc/init.d/mmpm old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-ollama/files/etc/init.d/ollama b/package/secubox/secubox-app-ollama/files/etc/init.d/ollama old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-picobrew/files/etc/init.d/picobrew b/package/secubox/secubox-app-picobrew/files/etc/init.d/picobrew old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-streamlit/files/etc/init.d/streamlit b/package/secubox/secubox-app-streamlit/files/etc/init.d/streamlit old mode 100644 new mode 100755 diff --git a/package/secubox/secubox-app-tor/files/etc/init.d/tor-shield b/package/secubox/secubox-app-tor/files/etc/init.d/tor-shield old mode 100644 new mode 100755