Closed theofficialgman closed 1 month ago
Yeah, I think there's a valid use case for this. Not sure if the browser chart is the right place, as that is more useful if there's some kind of grouping, bit perhaps the visits table could have a toggle to either show the Browser and OS columns, or the raw user agent.
Not sure if the browser chart is the right place, as that is more useful if there's some kind of grouping
The chart would be nice if automatic grouping could be performed based on just the user agent.
Just to provide out usecase, we currently us the user agent Pi-Apps Raspberry Pi app store
and have the nginx server filter out anything else to prevent any unintended traffic. I want to basically extend that to include hardware/operating systems info which are client already has parsed from the host system
ex:
Pi-Apps Raspberry Pi app store; Raspberry Pi 5 Model B Rev 1.0; Debian GNU/Linux 12 (bookworm)
Pi-Apps Raspberry Pi app store; Xiaomi Mi Pad 5 Pro (CSOT); Armbian 24.8.2 noble
Pi-Apps Raspberry Pi app store; Orange Pi 5 Pro; Armbian 24.5.2 noble
Pi-Apps Raspberry Pi app store; Apple MacBook Air (M1, 2020); Ubuntu 24.04 LTS
Pi-Apps Raspberry Pi app store; Nintendo Switch (OLED model); Ubuntu 24.04.1 LTS
Just an FYI, we settled on the following format which can be extended as fit:
Raspberry Pi 400 Rev 1.0; bcm2711; 78c331be78aed33be478e6e07eb153510dfe1016; 29cdefbea8e21c23a927222cb9ccd9139ace8a3c; Debian 12; 64
which corresponds to
model name; SOC name; hash of machine-id; hash of serial-number; OS Name and Version; architecture
How exactly would you expect those user agents to be grouped in a chart? Because they seem like unique values, so you would end up with one segment per visitor, which defeats a bit the value of a chart.
How exactly would you benefit from a doughnut chart displaying that kind of information? For me it would be very hard to use effectively.
The Browsers chart is designed in a way that you see, from a high level perspective, the most used browsers from people visiting your link/s. A very convoluted chart would not be very useful for the average Shlink user.
How exactly would you expect those user agents to be grouped in a chart? Because they seem like unique values, so you would end up with one segment per visitor, which defeats a bit the value of a chart.
Similar to how the browsers are grouped and parsed already. Generally your parsing only has to look at the last stanza to determine the browser being used but you have used a library to do that parsing for you. If you didn't parse the user agent you would have hundreds (maybe thousands) of lines.
I currently just use the output from shlink-cli to get the data I am interested in. So I use a combination of sed/awk/regex to look only at unique entries (entries where the whole user agent does not match) for a particular stanza(s) such as OS Name and Version and Architecture, and then print the the number of matches.
So to explain it with an example with the following input data:
OrangePi Zero2 W; ; 99ae61246fcfdb8f381b04ff9cf5d0a7e769d951; d4530a2adc11437012590d7aaf0f0d6597ec35eb; Debian 11; 64
Parallels ARM Virtual Machine 0.1; ; 3809897d61a69951c0970ffe5f774d97392a0ab4; ; Ubuntu 20.04; 64
Raspberry Pi 3 Model B Plus Rev 1.3; bcm2837; 37cc68b6b5e62a9ae45ebf65297cd0da68dec2cb; 147b5343dcb57b0e391ae56c9be3fe30201e6361; Raspbian 12; 32
Raspberry Pi 4 Model B Rev 1.1; bcm2711; 099b24e21d0cdabcb1e7d9f6af93f2589c84ddd3; 686a22a610318923d58d12581edff584b159a565; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.1; bcm2711; 912443a52e006ab4ecd38f22d114ad808283f2f1; a23d9a3cf07cdaf725a71d206a346a6380921608; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.1; bcm2711; cc71683cec0ac1a65d8e1d8fb2c3229ffb6722f7; 6ab62162255ad9a63a2524b83231eef1a3654936; Raspbian 11; 32
Raspberry Pi 4 Model B Rev 1.1; bcm2711; cc71683cec0ac1a65d8e1d8fb2c3229ffb6722f7; 6ab62162255ad9a63a2524b83231eef1a3654936; Raspbian 11; 32
Raspberry Pi 4 Model B Rev 1.1; bcm2711; cc71683cec0ac1a65d8e1d8fb2c3229ffb6722f7; 6ab62162255ad9a63a2524b83231eef1a3654936; Raspbian 11; 32
Raspberry Pi 4 Model B Rev 1.1; bcm2711; cc71683cec0ac1a65d8e1d8fb2c3229ffb6722f7; 6ab62162255ad9a63a2524b83231eef1a3654936; Raspbian 11; 32
Raspberry Pi 4 Model B Rev 1.1; bcm2711; cc71683cec0ac1a65d8e1d8fb2c3229ffb6722f7; 6ab62162255ad9a63a2524b83231eef1a3654936; Raspbian 11; 32
Raspberry Pi 4 Model B Rev 1.2; bcm2711; 694496e75d2a9a7847fba48397691328b622c22c; 3c05c9498eb07eac6286e6c68de1c894054eab70; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.2; bcm2711; bc6d6e39d689b143f3b8dd99c235fc9206cf17e4; 9c0ac44d39cbf23b167c5d79935787ad96678459; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; 17e913d4284a2733ed1524e08a1d90e1d2aa39d7; 52256c7463935077f182ea96677e9a8c3d4144b9; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; 778ddbfd2a3679cf01a17d570e3bbcb079d8c3f1; 355f3861adef250fe00d0181093faf05a35ef917; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; 830ba037ae9f2b4163fca9e15c91eaa1b4d6dc6c; b7621eaca921b842d68c1d3b7fb51adf56223ded; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; a261c911d2cc61f1b3e0301578e3ac8411947068; 84c89311451905258387ce7a2d6395ed9d0b27ac; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; a261c911d2cc61f1b3e0301578e3ac8411947068; 84c89311451905258387ce7a2d6395ed9d0b27ac; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; a261c911d2cc61f1b3e0301578e3ac8411947068; 84c89311451905258387ce7a2d6395ed9d0b27ac; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; a261c911d2cc61f1b3e0301578e3ac8411947068; 84c89311451905258387ce7a2d6395ed9d0b27ac; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; a261c911d2cc61f1b3e0301578e3ac8411947068; 84c89311451905258387ce7a2d6395ed9d0b27ac; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; a261c911d2cc61f1b3e0301578e3ac8411947068; 84c89311451905258387ce7a2d6395ed9d0b27ac; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; 0f68f6c86de011568beb5621527e2267862c944c; 5e9f4f1914c57edc21b38e8a63a7ff3a4ddc0821; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; 0f68f6c86de011568beb5621527e2267862c944c; 5e9f4f1914c57edc21b38e8a63a7ff3a4ddc0821; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; 0f68f6c86de011568beb5621527e2267862c944c; 5e9f4f1914c57edc21b38e8a63a7ff3a4ddc0821; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; 6057cbb165c3f487171daeab8477ccccf61df3bc; 74dbe466a632dc871feac2db344e2305d08101fe; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; 6057cbb165c3f487171daeab8477ccccf61df3bc; 74dbe466a632dc871feac2db344e2305d08101fe; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; 6057cbb165c3f487171daeab8477ccccf61df3bc; 74dbe466a632dc871feac2db344e2305d08101fe; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; c0792c26720cdb5731733e3dae09d1af393f25da; c1ab705b5f821aec2b4dc28b3672aab104c7e284; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; c0792c26720cdb5731733e3dae09d1af393f25da; c1ab705b5f821aec2b4dc28b3672aab104c7e284; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; c0792c26720cdb5731733e3dae09d1af393f25da; c1ab705b5f821aec2b4dc28b3672aab104c7e284; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; c0792c26720cdb5731733e3dae09d1af393f25da; c1ab705b5f821aec2b4dc28b3672aab104c7e284; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; c0792c26720cdb5731733e3dae09d1af393f25da; c1ab705b5f821aec2b4dc28b3672aab104c7e284; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; c0792c26720cdb5731733e3dae09d1af393f25da; c1ab705b5f821aec2b4dc28b3672aab104c7e284; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; c0792c26720cdb5731733e3dae09d1af393f25da; c1ab705b5f821aec2b4dc28b3672aab104c7e284; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; dd5ac6a6afd2bb0021e87b1aeccb76efc393bbd0; 2c68b2e5c575a62553961bb58b8073a5903ca11e; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; dd5ac6a6afd2bb0021e87b1aeccb76efc393bbd0; 2c68b2e5c575a62553961bb58b8073a5903ca11e; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; fb567134fd5d272090ab5ccf4b394e8deaa2135a; 736a9df010a8c291e31cb982004a68b46a8e61ec; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; fb567134fd5d272090ab5ccf4b394e8deaa2135a; 736a9df010a8c291e31cb982004a68b46a8e61ec; Debian 12; 64
Raspberry Pi 400 Rev 1.0; bcm2711; 29af57abf21052246db5e511303a71eb6faeb553; a01780ab6695e1222f293f41fac6c45a2dbf777e; Debian 12; 64
Raspberry Pi 400 Rev 1.0; bcm2711; 31c4d36e378171e81aa4220d1133aa5a62f553a2; fe8e7f2b40ee6bb0746465145d1b9a4a20c5bc28; Raspbian 11; 32
Raspberry Pi 400 Rev 1.1; bcm2711; a7ee805a2487c924f5a6f9d98d6b2c44ba9be014; de3aa34146ebac71ed517ca4264875ae3fb962f6; Raspbian 11; 32
Raspberry Pi 400 Rev 1.1; bcm2711; ba0cda3a8a5b67be21a67a8380b19cc4853fa852; b5ddc97315b8d01b72e3a96388ca4a6b0e3a70c6; Debian 12; 64
Raspberry Pi 400 Rev 1.1; bcm2711; ed1ca333ef3117befb25498e150ee8c1c59593af; 69ae384cb6023026e8d79b50a94164a1a4479cf6; Ubuntu 24.04; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 0184feff2f50550f4e947d4961dfffeac8161bae; f20e4dbd489455a6a68d61787abdda8b5da8dcca; Ubuntu 24.04; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 0184feff2f50550f4e947d4961dfffeac8161bae; f20e4dbd489455a6a68d61787abdda8b5da8dcca; Ubuntu 24.04; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 057323e64741e18cb432bd85800934e0a89560eb; df1d91ff665aa4998eeee5735f27f627d8db9334; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 057323e64741e18cb432bd85800934e0a89560eb; df1d91ff665aa4998eeee5735f27f627d8db9334; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 057323e64741e18cb432bd85800934e0a89560eb; df1d91ff665aa4998eeee5735f27f627d8db9334; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 057323e64741e18cb432bd85800934e0a89560eb; df1d91ff665aa4998eeee5735f27f627d8db9334; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 057323e64741e18cb432bd85800934e0a89560eb; df1d91ff665aa4998eeee5735f27f627d8db9334; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 11f612b71c3544cc327819954280e5d68fba4c23; a9f47262f88f3b55f8bda20fc7883b98fb3782fe; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 239c9cf0a6a40e632956deadc997bcb95592637b; 9a7001fa9a7e22ce34386fdf75a366b633c194fb; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 239c9cf0a6a40e632956deadc997bcb95592637b; 9a7001fa9a7e22ce34386fdf75a366b633c194fb; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 239c9cf0a6a40e632956deadc997bcb95592637b; 9a7001fa9a7e22ce34386fdf75a366b633c194fb; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 242d0487e02c61e4724ffd96fa32770447ec29cc; 2186437031c4c8ec2e4dbccaf67cc9067a1402b4; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 242d0487e02c61e4724ffd96fa32770447ec29cc; 2186437031c4c8ec2e4dbccaf67cc9067a1402b4; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 242d0487e02c61e4724ffd96fa32770447ec29cc; 2186437031c4c8ec2e4dbccaf67cc9067a1402b4; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 254d7d3a3be3fe0f9391e20f95f0972252761c90; 166092e646f07c49c6659c3126731ab68f9757fb; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 2d5905483e3b6c4cf4794dbe04aa17d56d61dfd3; b28b214f719e9947e53c2409a04b5e4bf6d74b5d; Ubuntu 24.04; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 3bc8fc2a80bc3b13da781f5cd765f3462095cfba; 95e8d627e88491b27e62adac70dbc99423bd6e07; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 3bc8fc2a80bc3b13da781f5cd765f3462095cfba; 95e8d627e88491b27e62adac70dbc99423bd6e07; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 3bc8fc2a80bc3b13da781f5cd765f3462095cfba; 95e8d627e88491b27e62adac70dbc99423bd6e07; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 3bc8fc2a80bc3b13da781f5cd765f3462095cfba; 95e8d627e88491b27e62adac70dbc99423bd6e07; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 3bc8fc2a80bc3b13da781f5cd765f3462095cfba; 95e8d627e88491b27e62adac70dbc99423bd6e07; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 4461ba2daaa90d27dfb4c93f86b351fdba68d167; 42d252f915485832fadb9de69e8c148952154306; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 77ae45201ea4d2efa7acb8e5ff976d9ed5b9b612; 2dc3e4401c969f0ad080c5ee4632079b7a4e18b2; Ubuntu 24.04; 64
first duplicates are removed (ie: sort -u
can be used for cli)
OrangePi Zero2 W; ; 99ae61246fcfdb8f381b04ff9cf5d0a7e769d951; d4530a2adc11437012590d7aaf0f0d6597ec35eb; Debian 11; 64
Parallels ARM Virtual Machine 0.1; ; 3809897d61a69951c0970ffe5f774d97392a0ab4; ; Ubuntu 20.04; 64
Raspberry Pi 3 Model B Plus Rev 1.3; bcm2837; 37cc68b6b5e62a9ae45ebf65297cd0da68dec2cb; 147b5343dcb57b0e391ae56c9be3fe30201e6361; Raspbian 12; 32
Raspberry Pi 4 Model B Rev 1.1; bcm2711; 099b24e21d0cdabcb1e7d9f6af93f2589c84ddd3; 686a22a610318923d58d12581edff584b159a565; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.1; bcm2711; 912443a52e006ab4ecd38f22d114ad808283f2f1; a23d9a3cf07cdaf725a71d206a346a6380921608; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.1; bcm2711; cc71683cec0ac1a65d8e1d8fb2c3229ffb6722f7; 6ab62162255ad9a63a2524b83231eef1a3654936; Raspbian 11; 32
Raspberry Pi 4 Model B Rev 1.2; bcm2711; 694496e75d2a9a7847fba48397691328b622c22c; 3c05c9498eb07eac6286e6c68de1c894054eab70; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.2; bcm2711; bc6d6e39d689b143f3b8dd99c235fc9206cf17e4; 9c0ac44d39cbf23b167c5d79935787ad96678459; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; 17e913d4284a2733ed1524e08a1d90e1d2aa39d7; 52256c7463935077f182ea96677e9a8c3d4144b9; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; 778ddbfd2a3679cf01a17d570e3bbcb079d8c3f1; 355f3861adef250fe00d0181093faf05a35ef917; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; 830ba037ae9f2b4163fca9e15c91eaa1b4d6dc6c; b7621eaca921b842d68c1d3b7fb51adf56223ded; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.4; bcm2711; a261c911d2cc61f1b3e0301578e3ac8411947068; 84c89311451905258387ce7a2d6395ed9d0b27ac; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; 0f68f6c86de011568beb5621527e2267862c944c; 5e9f4f1914c57edc21b38e8a63a7ff3a4ddc0821; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; 6057cbb165c3f487171daeab8477ccccf61df3bc; 74dbe466a632dc871feac2db344e2305d08101fe; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; c01f415b74f8bac2e4a561ca5d5fa0bcc8965dfd; 42fecf24f1b44d54fa62e5e2fb8ffb8a6d46e8f3; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; c0792c26720cdb5731733e3dae09d1af393f25da; c1ab705b5f821aec2b4dc28b3672aab104c7e284; Debian 11; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; dd5ac6a6afd2bb0021e87b1aeccb76efc393bbd0; 2c68b2e5c575a62553961bb58b8073a5903ca11e; Debian 12; 64
Raspberry Pi 4 Model B Rev 1.5; bcm2711; fb567134fd5d272090ab5ccf4b394e8deaa2135a; 736a9df010a8c291e31cb982004a68b46a8e61ec; Debian 12; 64
Raspberry Pi 400 Rev 1.0; bcm2711; 29af57abf21052246db5e511303a71eb6faeb553; a01780ab6695e1222f293f41fac6c45a2dbf777e; Debian 12; 64
Raspberry Pi 400 Rev 1.0; bcm2711; 31c4d36e378171e81aa4220d1133aa5a62f553a2; fe8e7f2b40ee6bb0746465145d1b9a4a20c5bc28; Raspbian 11; 32
Raspberry Pi 400 Rev 1.1; bcm2711; a7ee805a2487c924f5a6f9d98d6b2c44ba9be014; de3aa34146ebac71ed517ca4264875ae3fb962f6; Raspbian 11; 32
Raspberry Pi 400 Rev 1.1; bcm2711; ba0cda3a8a5b67be21a67a8380b19cc4853fa852; b5ddc97315b8d01b72e3a96388ca4a6b0e3a70c6; Debian 12; 64
Raspberry Pi 400 Rev 1.1; bcm2711; ed1ca333ef3117befb25498e150ee8c1c59593af; 69ae384cb6023026e8d79b50a94164a1a4479cf6; Ubuntu 24.04; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 0184feff2f50550f4e947d4961dfffeac8161bae; f20e4dbd489455a6a68d61787abdda8b5da8dcca; Ubuntu 24.04; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 057323e64741e18cb432bd85800934e0a89560eb; df1d91ff665aa4998eeee5735f27f627d8db9334; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 10a4e3fa7d24bb9e0b6334ad3917c90ab291bf10; fdbbbc3cd6e01ab9fc83edf738c34dcf477ea7d8; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 11f612b71c3544cc327819954280e5d68fba4c23; a9f47262f88f3b55f8bda20fc7883b98fb3782fe; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 239c9cf0a6a40e632956deadc997bcb95592637b; 9a7001fa9a7e22ce34386fdf75a366b633c194fb; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 242d0487e02c61e4724ffd96fa32770447ec29cc; 2186437031c4c8ec2e4dbccaf67cc9067a1402b4; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 254d7d3a3be3fe0f9391e20f95f0972252761c90; 166092e646f07c49c6659c3126731ab68f9757fb; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 2d5905483e3b6c4cf4794dbe04aa17d56d61dfd3; b28b214f719e9947e53c2409a04b5e4bf6d74b5d; Ubuntu 24.04; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 3bc8fc2a80bc3b13da781f5cd765f3462095cfba; 95e8d627e88491b27e62adac70dbc99423bd6e07; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 4461ba2daaa90d27dfb4c93f86b351fdba68d167; 42d252f915485832fadb9de69e8c148952154306; Debian 12; 64
Raspberry Pi 5 Model B Rev 1.0; bcm2712; 77ae45201ea4d2efa7acb8e5ff976d9ed5b9b612; 2dc3e4401c969f0ad080c5ee4632079b7a4e18b2; Ubuntu 24.04; 64
then simply print the column(s) of interest with awk: (eg: awk -F'; ' '{print $5,$6}'
)
Debian 11 64
Ubuntu 20.04 64
Raspbian 12 32
Debian 12 64
Debian 12 64
Raspbian 11 32
Debian 11 64
Debian 12 64
Debian 12 64
Debian 12 64
Debian 12 64
Debian 12 64
Debian 12 64
Debian 12 64
Debian 12 64
Debian 11 64
Debian 12 64
Debian 12 64
Debian 12 64
Raspbian 11 32
Raspbian 11 32
Debian 12 64
Ubuntu 24.04 64
Ubuntu 24.04 64
Debian 12 64
Debian 12 64
Debian 12 64
Debian 12 64
Debian 12 64
Debian 12 64
Ubuntu 24.04 64
Debian 12 64
Debian 12 64
Debian 12 64
Ubuntu 24.04 64
and any number of commands or programs can count the above and chart the matches there
Oh! But then you don't want to see the raw user agents (your original request), you actually want existing capabilities, in this case, the OS chart it seems, which is something already supported.
The problem is that you are providing non-standard user agents, which cannot be parsed following standard methods. That's why all visits with those user agents end up in "other".
You should make sure those clients are using standard user agent formats, and then everything should work out of the box.
Here you can see the format you should be following https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
And bowser is the library used here to resolve browser names and operating systems from user agents, in case you want to test it.
The logic is pretty simple https://github.com/shlinkio/shlink-web-component/blob/main/src/visits/utils/index.ts#L22
Oh! But then you don't want to see the raw user agents (your original request), you actually want existing capabilities, in this case, the OS chart it seems, which is something already supported.
Raw user agents would allow me to use the "search" tool that exists and search for particular matches. I would still prefer that be an option.
The problem is that you are providing non-standard user agents, which cannot be parsed following standard methods. That's why all visits with those user agents end up in "other".
I'm well aware.
You should make sure those clients are using standard user agent formats, and then everything should work out of the box.
Ha! LOL. There is no such thing as "standard user agent formats". Go read bowser source and that will be clear.
Here you can see the format you should be following https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
See above, and not useful for my intentions.
And bowser is the library used here to resolve browser names and operating systems from user agents, in case you want to test it.
Yeah I already looked it over hours ago before my previous comment. It is unmaintained (for years) and not at all useful for this regard. Everything is hardcoded in bowser which is which it has 100s of open issues an fails to recognize any real version strings after its last update date (2020).
The logic is pretty simple https://github.com/shlinkio/shlink-web-component/blob/main/src/visits/utils/index.ts#L22
I'm well aware but can't do much because of this https://github.com/shlinkio/shlink-web-client/discussions/1300
Ok, this is derailing and it's becoming harder for me to actually understand what's wanted or not.
I don't like your tone either, so I'm closing this for now.
If you open another issue, showing the expected respect, with a concise and concrete request, which would be useful for the general user base and not just for you, I'll reconsider.
Summary
Under the "Browser" (or another new configurable column). It would be nice to show the raw user agent sent instead of the hardcoded parsed list: https://github.com/shlinkio/shlink-web-component/blob/c974790cabc1396ce7be744507142fd95bedeb52/src/visits/utils/index.ts#L7-L20
Use case
In usecases where the user agent is customized by the sender (or simply not in the hardcoded list) it would be nice to view this information within the web interface.
We use shlink specifically for tracking install/uninstall/update's for applications in pi-apps (https://github.com/Botspot/pi-apps). We use the /track function exclusively (and have no need for shlink's redirects functionality) and have control over the user agent that gets sent client side. We would like to add some of our own custom information to the user agent (ie: hardware and operating system information). We can see this raw user agent information in the shlink cli (or by parsing the database directly) but it would be nice to have this also exposed via the web client. The Operating Systems and Browsers categories provide us no use because of the custom user agent so they just show "Other"