fix(luci-app-cloner): Fix SSH host key mismatch and button disabled issues
- Fix build button being unclickable by properly handling disabled attribute (only set when isBuilding is true, not undefined/false) - Fix SSH host key mismatch errors in do_scp by cleaning stale known_hosts entries from all possible locations (/root/.ssh, /.ssh, /overlay/upper/.ssh) before transfers - prevents failures after device reflash - Add cursor:pointer style to build button for better UX Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
b5b2b98b68
commit
4ee7fe2143
@ -836,7 +836,22 @@ return view.extend({
|
|||||||
renderBuildTab: function() {
|
renderBuildTab: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
var p = this.buildProgress || {};
|
var p = this.buildProgress || {};
|
||||||
var isBuilding = p.building;
|
var isBuilding = !!p.building;
|
||||||
|
|
||||||
|
// Build button attributes - only set disabled when building
|
||||||
|
var selectAttrs = {
|
||||||
|
'id': 'device-type-select',
|
||||||
|
'style': 'padding:10px;background:var(--kiss-bg2);border:1px solid var(--kiss-line);border-radius:6px;color:var(--kiss-text);font-size:14px;min-width:250px;cursor:pointer;'
|
||||||
|
};
|
||||||
|
var buttonAttrs = {
|
||||||
|
'class': 'kiss-btn kiss-btn-blue',
|
||||||
|
'style': 'cursor:pointer;',
|
||||||
|
'click': function() { self.handleBuild(); }
|
||||||
|
};
|
||||||
|
if (isBuilding) {
|
||||||
|
selectAttrs.disabled = true;
|
||||||
|
buttonAttrs.disabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
return E('div', {}, [
|
return E('div', {}, [
|
||||||
// Build Controls
|
// Build Controls
|
||||||
@ -844,18 +859,10 @@ return view.extend({
|
|||||||
E('span', {}, '🔨 Build Clone Image')
|
E('span', {}, '🔨 Build Clone Image')
|
||||||
], E('div', {}, [
|
], E('div', {}, [
|
||||||
E('div', { 'style': 'display:flex;gap:12px;align-items:center;flex-wrap:wrap;' }, [
|
E('div', { 'style': 'display:flex;gap:12px;align-items:center;flex-wrap:wrap;' }, [
|
||||||
E('select', {
|
E('select', selectAttrs, this.devices.map(function(dev) {
|
||||||
'id': 'device-type-select',
|
|
||||||
'style': 'padding:10px;background:var(--kiss-bg2);border:1px solid var(--kiss-line);border-radius:6px;color:var(--kiss-text);font-size:14px;min-width:250px;',
|
|
||||||
'disabled': isBuilding
|
|
||||||
}, this.devices.map(function(dev) {
|
|
||||||
return E('option', { 'value': dev.id }, dev.name + ' (' + dev.cpu + ')');
|
return E('option', { 'value': dev.id }, dev.name + ' (' + dev.cpu + ')');
|
||||||
})),
|
})),
|
||||||
E('button', {
|
E('button', buttonAttrs, isBuilding ? ['⏳ ', 'Building...'] : ['🔨 ', 'Start Build']),
|
||||||
'class': 'kiss-btn kiss-btn-blue',
|
|
||||||
'disabled': isBuilding,
|
|
||||||
'click': function() { self.handleBuild(); }
|
|
||||||
}, isBuilding ? ['⏳ ', 'Building...'] : ['🔨 ', 'Start Build']),
|
|
||||||
isBuilding ? E('span', { 'style': 'color:var(--kiss-yellow);font-size:13px;' }, '⚠️ Build in progress...') : null
|
isBuilding ? E('span', { 'style': 'color:var(--kiss-yellow);font-size:13px;' }, '⚠️ Build in progress...') : null
|
||||||
].filter(Boolean)),
|
].filter(Boolean)),
|
||||||
E('p', { 'style': 'color:var(--kiss-muted);font-size:12px;margin-top:12px;margin-bottom:0;' },
|
E('p', { 'style': 'color:var(--kiss-muted);font-size:12px;margin-top:12px;margin-bottom:0;' },
|
||||||
|
|||||||
@ -793,7 +793,24 @@ do_scp() {
|
|||||||
# dropbear doesn't have scp, use dbclient with cat for file transfer
|
# dropbear doesn't have scp, use dbclient with cat for file transfer
|
||||||
local ip=$(echo "$dest" | cut -d':' -f1 | sed 's/root@//')
|
local ip=$(echo "$dest" | cut -d':' -f1 | sed 's/root@//')
|
||||||
local remote_path=$(echo "$dest" | cut -d':' -f2)
|
local remote_path=$(echo "$dest" | cut -d':' -f2)
|
||||||
|
|
||||||
|
# Check source file exists
|
||||||
|
[ ! -f "$src" ] && return 1
|
||||||
|
|
||||||
|
# Clean any stale host keys (prevents mismatch errors after device reflash)
|
||||||
|
for khfile in /root/.ssh/known_hosts /.ssh/known_hosts /overlay/upper/.ssh/known_hosts; do
|
||||||
|
[ -f "$khfile" ] && sed -i "/^$ip /d" "$khfile" 2>/dev/null
|
||||||
|
done
|
||||||
|
|
||||||
|
# Transfer file - dbclient with -y accepts new host keys
|
||||||
cat "$src" | dbclient -i "$SSH_KEY" -y "root@$ip" "cat > $remote_path" 2>/dev/null
|
cat "$src" | dbclient -i "$SSH_KEY" -y "root@$ip" "cat > $remote_path" 2>/dev/null
|
||||||
|
local ret=$?
|
||||||
|
|
||||||
|
# Verify file exists on remote (BusyBox compatible)
|
||||||
|
if [ $ret -eq 0 ]; then
|
||||||
|
dbclient -i "$SSH_KEY" -y "root@$ip" "[ -s $remote_path ]" 2>/dev/null && return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
do_list_remotes() {
|
do_list_remotes() {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user