Skip to content

Commit a1df637

Browse files
committed
split /data attachment from kvm media attachment
backend config for media control remove .disabled adding settings toggle add default text
1 parent a4978d9 commit a1df637

File tree

6 files changed

+69
-19
lines changed

6 files changed

+69
-19
lines changed

kvmapp/system/init.d/S03usbdev

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ start_usb_dev(){
8282
ln -s functions/hid.GS2 configs/c.1
8383
fi
8484

85+
# dedicated for media
8586
if [ -e /boot/usb.disk0 ]
8687
then
8788
mkdir functions/mass_storage.disk0
@@ -95,17 +96,20 @@ start_usb_dev(){
9596
disk=$(cat /boot/usb.disk0)
9697
if [ -z "${disk}" ]
9798
then
98-
# if [ ! -e /mnt/usbdisk.img ]
99-
# then
100-
# fallocate -l 8G /mnt/usbdisk.img
101-
# mkfs.vfat /mnt/usbdisk.img
102-
# fi
103-
echo /dev/mmcblk0p3 > functions/mass_storage.disk0/lun.0/file
99+
echo "" > functions/mass_storage.disk0/lun.0/file
104100
else
105101
cat /boot/usb.disk0 > functions/mass_storage.disk0/lun.0/file
106102
fi
107103
fi
108104

105+
# mount data partition
106+
if [ -e /boot/usb.disk1 ]
107+
then
108+
mkdir functions/mass_storage.disk1
109+
ln -s functions/mass_storage.disk1 configs/c.1/
110+
echo /dev/mmcblk0p3 > functions/mass_storage.disk1/lun.0/file
111+
fi
112+
109113
ls /sys/class/udc/ | cat > UDC
110114
echo device > /proc/cviusb/otg_role
111115
}

server/proto/vm.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type DeleteScriptReq struct {
5757

5858
type GetVirtualDeviceRsp struct {
5959
Network bool `json:"network"`
60+
Media bool `json:"media"`
6061
Disk bool `json:"disk"`
6162
}
6263

server/service/storage/image.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616

1717
const (
1818
imageDirectory = "/data"
19-
imageNone = "/dev/mmcblk0p3"
19+
imageNone = ""
2020
cdromFlag = "/sys/kernel/config/usb_gadget/g0/functions/mass_storage.disk0/lun.0/cdrom"
2121
mountDevice = "/sys/kernel/config/usb_gadget/g0/functions/mass_storage.disk0/lun.0/file"
2222
roFlag = "/sys/kernel/config/usb_gadget/g0/functions/mass_storage.disk0/lun.0/ro"
@@ -105,8 +105,9 @@ func (s *Service) MountImage(c *gin.Context) {
105105

106106
// reset usb
107107
commands := []string{
108-
"echo > /sys/kernel/config/usb_gadget/g0/UDC",
109-
"ls /sys/class/udc/ | cat > /sys/kernel/config/usb_gadget/g0/UDC",
108+
// this should not be required for media change, reset of the full gadget can break hid on some devices
109+
//"echo > /sys/kernel/config/usb_gadget/g0/UDC",
110+
//"ls /sys/class/udc/ | cat > /sys/kernel/config/usb_gadget/g0/UDC",
110111
}
111112

112113
for _, command := range commands {

server/service/vm/virtual-device.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import (
1414

1515
const (
1616
virtualNetwork = "/boot/usb.rndis0"
17-
virtualDisk = "/boot/usb.disk0"
17+
virtualMedia = "/boot/usb.disk0"
18+
virtualDisk = "/boot/usb.disk1"
1819
)
1920

2021
var (
@@ -31,28 +32,43 @@ var (
3132
"/etc/init.d/S03usbdev start",
3233
}
3334

34-
mountDiskCommands = []string{
35+
mountMediaCommands = []string{
3536
"touch /boot/usb.disk0",
3637
"/etc/init.d/S03usbdev stop",
3738
"/etc/init.d/S03usbdev start",
3839
}
3940

40-
unmountDiskCommands = []string{
41+
unmountMediaCommands = []string{
4142
"/etc/init.d/S03usbdev stop",
4243
"rm -rf /sys/kernel/config/usb_gadget/g0/configs/c.1/mass_storage.disk0",
4344
"rm /boot/usb.disk0",
4445
"/etc/init.d/S03usbdev start",
4546
}
47+
48+
mountDiskCommands = []string{
49+
"touch /boot/usb.disk1",
50+
"/etc/init.d/S03usbdev stop",
51+
"/etc/init.d/S03usbdev start",
52+
}
53+
54+
unmountDiskCommands = []string{
55+
"/etc/init.d/S03usbdev stop",
56+
"rm -rf /sys/kernel/config/usb_gadget/g0/configs/c.1/mass_storage.disk1",
57+
"rm /boot/usb.disk1",
58+
"/etc/init.d/S03usbdev start",
59+
}
4660
)
4761

4862
func (s *Service) GetVirtualDevice(c *gin.Context) {
4963
var rsp proto.Response
5064

5165
network, _ := isDeviceExist(virtualNetwork)
66+
media, _ := isDeviceExist(virtualMedia)
5267
disk, _ := isDeviceExist(virtualDisk)
5368

5469
rsp.OkRspWithData(c, &proto.GetVirtualDeviceRsp{
5570
Network: network,
71+
Media: media,
5672
Disk: disk,
5773
})
5874
log.Debugf("get virtual device success")
@@ -80,6 +96,15 @@ func (s *Service) UpdateVirtualDevice(c *gin.Context) {
8096
} else {
8197
commands = unmountNetworkCommands
8298
}
99+
case "media":
100+
device = virtualMedia
101+
102+
exist, _ := isDeviceExist(device)
103+
if !exist {
104+
commands = mountMediaCommands
105+
} else {
106+
commands = unmountMediaCommands
107+
}
83108
case "disk":
84109
device = virtualDisk
85110

web/src/i18n/locales/en.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,9 @@ const en = {
266266
},
267267
hidOnly: 'HID-Only Mode',
268268
disk: 'Virtual Disk',
269-
diskDesc: 'Mount virtual U-disk on the remote host',
269+
diskDesc: 'Mount SD card on the remote host',
270+
media: "Virtual Image",
271+
mediaDesc: 'Attach virtual image device to the remote host',
270272
network: 'Virtual Network',
271273
networkDesc: 'Mount virtual network card on the remote host',
272274
reboot: 'Reboot',

web/src/pages/desktop/menu/settings/device/virtual-devices.tsx

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ export const VirtualDevices = () => {
88
const { t } = useTranslation();
99

1010
const [isNetworkOn, setIsNetworkOn] = useState(false);
11+
const [isMediaOn, setIsMediaOn] = useState(false);
1112
const [isDiskOn, setIsDiskOn] = useState(false);
12-
const [loading, setLoading] = useState(''); // '' | 'network' | 'disk'
13+
const [loading, setLoading] = useState(''); // '' | 'network' | 'media' | 'disk'
1314

1415
useEffect(() => {
1516
api.getVirtualDevice().then((rsp) => {
@@ -18,11 +19,12 @@ export const VirtualDevices = () => {
1819
}
1920

2021
setIsNetworkOn(rsp.data.network);
22+
setIsMediaOn(rsp.data.media);
2123
setIsDiskOn(rsp.data.disk);
2224
});
2325
}, []);
2426

25-
function update(device: 'network' | 'disk') {
27+
function update(device: 'network' | 'media' | 'disk') {
2628
if (loading) return;
2729
setLoading(device);
2830

@@ -33,10 +35,16 @@ export const VirtualDevices = () => {
3335
return;
3436
}
3537

36-
if (device === 'network') {
37-
setIsNetworkOn(rsp.data.on);
38-
} else {
39-
setIsDiskOn(rsp.data.on);
38+
switch (device) {
39+
case 'network':
40+
setIsNetworkOn(rsp.data.on);
41+
break;
42+
case 'media':
43+
setIsMediaOn(rsp.data.on);
44+
break;
45+
case 'disk':
46+
setIsDiskOn(rsp.data.on);
47+
break;
4048
}
4149
})
4250
.finally(() => {
@@ -46,6 +54,15 @@ export const VirtualDevices = () => {
4654

4755
return (
4856
<>
57+
<div className="flex items-center justify-between">
58+
<div className="flex flex-col">
59+
<span>{t('settings.device.media')}</span>
60+
<span className="text-xs text-neutral-500">{t('settings.device.mediaDesc')}</span>
61+
</div>
62+
63+
<Switch checked={isMediaOn} loading={loading === 'media'} onChange={() => update('media')} />
64+
</div>
65+
4966
<div className="flex items-center justify-between">
5067
<div className="flex flex-col">
5168
<span>{t('settings.device.disk')}</span>

0 commit comments

Comments
 (0)