mirror of
https://github.com/gechandesu/os_release.git
synced 2026-01-02 14:09:35 +03:00
init
This commit is contained in:
8
.editorconfig
Normal file
8
.editorconfig
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.v]
|
||||||
|
indent_style = tab
|
||||||
8
.gitattributes
vendored
Normal file
8
.gitattributes
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
* text=auto eol=lf
|
||||||
|
*.bat eol=crlf
|
||||||
|
|
||||||
|
*.v linguist-language=V
|
||||||
|
*.vv linguist-language=V
|
||||||
|
*.vsh linguist-language=V
|
||||||
|
v.mod linguist-language=V
|
||||||
|
.vdocignore linguist-language=ignore
|
||||||
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Binaries for programs and plugins
|
||||||
|
main
|
||||||
|
os_release
|
||||||
|
*.exe
|
||||||
|
*.exe~
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
|
# Ignore binary output folders
|
||||||
|
bin/
|
||||||
|
|
||||||
|
# Ignore common editor/system specific metadata
|
||||||
|
.DS_Store
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
# ENV
|
||||||
|
.env
|
||||||
|
|
||||||
|
# vweb and database
|
||||||
|
*.db
|
||||||
|
*.js
|
||||||
20
README.md
Normal file
20
README.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Freedesktop OS Release
|
||||||
|
|
||||||
|
`os_release` module implements the os-release, initrd-release and extension-release
|
||||||
|
file parser per Freedesktop standard. Those files are intended for operating system
|
||||||
|
identification. Learn more at
|
||||||
|
[os-release(5)](https://www.freedesktop.org/software/systemd/man/latest/os-release.html)
|
||||||
|
manual page.
|
||||||
|
|
||||||
|
Usage example:
|
||||||
|
|
||||||
|
```v
|
||||||
|
import os_release
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
release_data := os_release.os_release()
|
||||||
|
os_name := release_data['PRETTY_NAME'] or { 'Linux' }
|
||||||
|
os_version := release_data['VERSION_ID'] or { '0' }
|
||||||
|
println('OS: ${os_name} ${os_version}')
|
||||||
|
}
|
||||||
|
```
|
||||||
22
UNLICENSE
Normal file
22
UNLICENSE
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
|
commercial or non-commercial, and by any means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
|
software dedicate any and all copyright interest in the software to the public
|
||||||
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
|
the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of relinquishment in
|
||||||
|
perpetuity of all present and future rights to this software under copyright
|
||||||
|
law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||||
|
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
69
os_release.v
Normal file
69
os_release.v
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
module os_release
|
||||||
|
|
||||||
|
import os
|
||||||
|
import strings
|
||||||
|
|
||||||
|
// options contains list of default os-release, initrd-release, extension-release options.
|
||||||
|
pub const options = ['NAME', 'ID', 'ID_LIKE', 'PRETTY_NAME', 'CPE_NAME', 'VARIANT', 'VARIANT_ID',
|
||||||
|
'VERSION', 'VERSION_ID', 'VERSION_CODENAME', 'BUILD_ID', 'IMAGE_ID', 'IMAGE_VERSION',
|
||||||
|
'RELEASE_TYPE', 'HOME_URL', 'DOCUMENTATION_URL', 'SUPPORT_URL', 'BUG_REPORT_URL',
|
||||||
|
'PRIVACY_POLICY_URL', 'SUPPORT_END', 'LOGO', 'ANSI_COLOR', 'VENDOR_NAME', 'VENDOR_URL',
|
||||||
|
'EXPERIMENT', 'EXPERIMENT_URL', 'DEFAULT_HOSTNAME', 'ARCHITECTURE', 'SYSEXT_LEVEL',
|
||||||
|
'CONFEXT_LEVEL', 'SYSEXT_SCOPE', 'CONFEXT_SCOPE', 'PORTABLE_PREFIXES']!
|
||||||
|
|
||||||
|
// os_release reads `/etc/os-release` and `/usr/lib/os-release` files and returns parsed
|
||||||
|
// os-release data. Empty map will be returned if files does not exits or reading issues
|
||||||
|
// caused. The resulting map will contain only options that is present in actual os-release
|
||||||
|
// file.
|
||||||
|
pub fn os_release() map[string]string {
|
||||||
|
mut ret := map[string]string{}
|
||||||
|
for file in ['/etc/os-release', '/usr/lib/os-release'] {
|
||||||
|
ret = parse_file(file) or { continue }
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse_file reads the `file` and returns map of os-release key-value pairs.
|
||||||
|
pub fn parse_file(file string) !map[string]string {
|
||||||
|
return parse(os.read_file(file)!)
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse parses the `content` string and returns map of os-release key-value pairs.
|
||||||
|
// Example:
|
||||||
|
// ```
|
||||||
|
// assert os_release.parse('PRETTY_NAME="Debian GNU/Linux 13 (trixie)"') == {'PRETTY_NAME': 'Debian GNU/Linux 13 (trixie)'}
|
||||||
|
// ```
|
||||||
|
pub fn parse(content string) map[string]string {
|
||||||
|
mut ret := map[string]string{}
|
||||||
|
for raw_line in content.split_into_lines() {
|
||||||
|
line := raw_line.trim_space()
|
||||||
|
if line.is_blank() || line.starts_with('#') {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
key, value := line.split_once('=') or { continue }
|
||||||
|
if key == '' {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ret = {
|
||||||
|
...ret
|
||||||
|
key: unescape(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unescape(s string) string {
|
||||||
|
mut ret := strings.new_builder(128)
|
||||||
|
for i := 0; i < s.len; i++ {
|
||||||
|
if (i == 0 || i == s.len - 1) && s[i] in [`"`, `'`] {
|
||||||
|
continue // trim leading and trailing quotes
|
||||||
|
}
|
||||||
|
if s[i] == `\\` && i + 1 < s.len {
|
||||||
|
ret.write_byte(s[i + 1])
|
||||||
|
i++
|
||||||
|
} else {
|
||||||
|
ret.write_byte(s[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret.str()
|
||||||
|
}
|
||||||
21
os_release_test.v
Normal file
21
os_release_test.v
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
module os_release
|
||||||
|
|
||||||
|
fn test_os_release() {
|
||||||
|
$if !windows {
|
||||||
|
r := os_release()
|
||||||
|
dump(r)
|
||||||
|
assert r['NAME'] != ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_os_release_parser() {
|
||||||
|
content := r'ID=linux
|
||||||
|
NAME="Linux"
|
||||||
|
PRETTY_NAME="Linux"
|
||||||
|
VARIANT="\$erver\ Edition"'.trim_indent()
|
||||||
|
result := parse(content)
|
||||||
|
assert result['ID'] == 'linux'
|
||||||
|
assert result['NAME'] == 'Linux'
|
||||||
|
assert result['PRETTY_NAME'] == 'Linux'
|
||||||
|
assert result['VARIANT'] == r'$erver Edition'
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user