so we have various tool versions installed in a central place, and a
.modulerc in the root there contains all defaults.
something like
$ tree -a --charset=ascii /tmp/tool
/tmp/tool
|-- .modulerc
|-- X
| |-- .common
| |-- v1 -> .common
| |-- v2 -> .common
| `-- v3 -> .common
`-- Y
|-- .common
|-- v1 -> .common
`-- v2 -> .common
That /tmp/tool/.modulerc contains something like this:
$ cat /tmp/tool/.modulerc
#%Module
if { ![info exists X_DEFAULT ] } {
set X_DEFAULT X/v2
module-version $X_DEFAULT default
}
if { ![info exists Y_DEFAULT ] } {
set Y_DEFAULT Y/v1
module-version $Y_DEFAULT default
}
Then we have various projects that can take a while to complete, and each
can have it's own set of defaults.
We thought about doing that by having each project have it's own .modulerc
with a set of defaults, and adding that to the MODULEPATH
Now ideally we would just define a module-version command in a .modulerc,
and once that's set, all subsequent module-versions for that same tool will
just be ignored. But that doesn't seem to happen, as it not only gives a
warning, but seems to remove the default version completely.
$ tree -a --charset=ascii /tmp/prj
/tmp/prj
|-- A
| `-- .modulerc
`-- B
`-- .modulerc
$ cat /tmp/prj/A/.modulerc
#%Module
if { ![info exists X_DEFAULT ] } {
set X_DEFAULT X/v1
module-version $X_DEFAULT default
}
$ echo $MODULEPATH
/tmp/prj/A:/tmp/tool
$ module --version
Modules Release 5.0.0 (2021-09-12)
$ module avail -t --color=never
/tmp/tool:
X/v1(default)
X/v2
X/v3
Y/v1(default)
Y/v2
$ module load X
WARNING: Symbolic version 'X/default' already defined
$ module list
Currently Loaded Modulefiles:
1) X/v3
I expected X/v1 to be loaded here....
Now it works if I load it like this (but it still complains about that
WARNING: Symbolic version already defined)
$ module unload X
$ module load X/default
WARNING: Symbolic version 'X/default' already defined
$ module list
Currently Loaded Modulefiles:
1) X/v1
Looking at the debug output there's a few things that jump out to me:
It seems to remove that X_DEFAULT variable I set? And then it still seems
to want to eval /tmp/tool/.modulerc, it calls module-version, which
according to the tcl source code should not call setModuleResolution when
it finds that duplicate, but that still seems to happen, and it defaults
back to the latest version
Evaluate modulerc: '/tmp/prj/A/.modulerc'
DEBUG [#1:.modulerc] readModuleContent: /tmp/prj/A/.modulerc
DEBUG [#1:.modulerc] module-version: X/v1 default
DEBUG [#1:.modulerc] setModuleResolution: X/default resolved to X/v1
DEBUG [#1:.modulerc] setModuleResolution: X resolved to X/v1
DEBUG [#1:.modulerc] setModuleResolution: set symbols 'default' to X/v1
DEBUG [#1:.modulerc] setModuleResolution: module-version X/default = X/v1
Evaluate modulerc: '/tmp/tool/.modulerc'
DEBUG [#1:.modulerc] resetInterpState: removing on __modrc_1 var X_DEFAULT
DEBUG [#1:.modulerc] readModuleContent: /tmp/tool/.modulerc
DEBUG [#1:.modulerc] module-version: X/v2 default
WARNING: Symbolic version 'X/default' already defined
DEBUG setModuleResolution: X/default resolved to X/v3
DEBUG setModuleResolution: define auto symbolic version 'X/default'
targeting X/v3
Here is the complete output of "module -D load X"
DEBUG setState: cmdline set to '/opt/modules/5.0.0/libexec/modulecmd.tcl
tcsh -D load X'
DEBUG setConf: tcl_ext_lib set to
'/opt/modules/5.0.0/lib/libtclenvmodules.so'
DEBUG Load Tcl extension library
(/opt/modules/5.0.0/lib/libtclenvmodules.so)
DEBUG setState: tcl_ext_lib_loaded set to '1'
DEBUG setConf: siteconfig set to '/opt/modules/5.0.0/etc/siteconfig.tcl'
DEBUG sourceSiteConfig: Source site configuration
(/opt/modules/5.0.0/etc/siteconfig.tcl)
DEBUG setState: siteconfig_loaded set to '1'
DEBUG setConf: locked_configs set to ''
DEBUG setState: shell set to 'tcsh'
DEBUG setState: shelltype set to 'csh'
DEBUG setState: subcmd set to 'load'
DEBUG setState: subcmd_args set to 'X'
DEBUG setState: init_error_report set to '1'
DEBUG setConf: verbosity set to 'debug'
DEBUG setState: is_stderr_tty set to '1'
DEBUG setConf: term_background set to 'dark'
DEBUG setConf: colors set to
'hi=1:db=2:tr=2:se=2:er=91:wa=93:me=95:in=94:mp=1;94:di=94:al=96:va=93:sy=95:de=4:cm=92:aL=100:L=90;47:H=2:F=41:nF=43:S=46:sS=44'
DEBUG setConf: color set to '1'
DEBUG setConf: pager set to '/usr/bin/less -eFKRX'
DEBUG setState: paginate set to '1'
DEBUG setState: report_format set to 'regular'
DEBUG setState: reportfd set to 'file6'
DEBUG lappendState: modulefile appended with '{}'
DEBUG module: cmd='load', args='X'
DEBUG setConf: avail_indepth set to '1'
DEBUG setConf: search_match set to 'starts_with'
DEBUG parseModuleCommandArgs: (show_oneperline=0, show_mtime=0,
show_filter=, search_filter=, search_match=starts_with, dump_state=0,
addpath_pos=prepend, not_req=0, otherargs=X)
DEBUG setConf: advanced_version_spec set to '1'
DEBUG setConf: variant_shortcut set to ''
DEBUG setModuleVersSpec: Set module 'X' (escglob 'X'), module name '.' (re
'\.'), module root 'X', version cmp 'eq', version(s) '', variant(s) '' and
module name version spec 'X' for argument 'X'
DEBUG lappendState: always_read_full_file appended with '1'
DEBUG lappendState: commandname appended with 'load'
DEBUG lappendState: try_modulefile appended with '0'
DEBUG runModulerc: running...
DEBUG setState: rc_running set to '1'
DEBUG unsetState: rc_running unset
DEBUG cmdModuleLoad: loading X (context=load, uasked=1)
DEBUG lappendState: mode appended with 'load'
DEBUG getPathToModule: finding 'X' in '' (report_issue=1, look_loaded=no,
excdir='')
DEBUG setState: is_win set to '0'
DEBUG setState: path_separator set to ':'
DEBUG resolvStringWithEnv: '/tmp/prj/A' resolved to '/tmp/prj/A'
DEBUG setState: cwd set to '/tmp/prj'
DEBUG resolvStringWithEnv: '/tmp/tool' resolved to '/tmp/tool'
DEBUG setConf: icase set to 'search'
DEBUG setConf: extended_default set to '1'
DEBUG setConf: implicit_default set to '1'
DEBUG getModules: get 'X' in /tmp/prj/A (fetch_mtime=0,
search=rc_defs_included resolve, filter=)
DEBUG findModules: finding 'X' in /tmp/prj/A (depthlvl=0, fetch_mtime=0)
DEBUG setConf: ignored_dirs set to 'CVS RCS SCCS .svn .git .SYNC .sos'
DEBUG findModules: found .modulerc
DEBUG findModules: create cache entry '/tmp/prj/A:X:0:0'
DEBUG lappendState: modulefile appended with '/tmp/prj/A/.modulerc'
DEBUG lappendState: modulename appended with '.modulerc'
DEBUG lappendState: specifiedname appended with '.modulerc'
DEBUG [#1:.modulerc] lappendState: debug_msg_prefix appended with
'{[#1:.modulerc] }'
DEBUG [#1:.modulerc] setState: inhibit_errreport set to '0'
Evaluate modulerc: '/tmp/prj/A/.modulerc'
DEBUG [#1:.modulerc] execute-modulerc: creating interp __modrc_1
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc var tcl_version
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc var tcl_interactive
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc var
ModuleToolVersion
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc var ModuleTool
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc var auto_path
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc var tcl_pkgPath
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc var tcl_patchLevel
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc var tcl_platform
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc var tcl_library
DEBUG [#1:.modulerc] dumpInterpState: saving for __modrc proc list
auto_load clock unknown tclLog auto_qualify auto_execok auto_import
auto_load_index
DEBUG [#1:.modulerc] resetInterpState: saving for __modrc_1 command list
module-version tell socket subst open eof pwd glob list module-hide pid
exec auto_load_index time unknown eval module-forbid lassign lrange
module-virtual is-loaded fblocked lsearch auto_import gets case lappend
proc break variable llength module-info auto_execok return linsert is-used
error catch clock info split readModuleContent array if fconfigure concat
join lreplace source fcopy global switch auto_qualify update close cd for
auto_load file append lreverse format unload read package set binary
namespace scan versioncmp apply module-tag trace seek while chan flush
after vwait dict system continue uplevel foreach lset rename fileevent
regexp module-alias lrepeat upvar reportInternalBug formatErrStackTrace
encoding expr unset load regsub interp exit setModulesVersion puts incr
lindex lsort tclLog uname string
DEBUG [#1:.modulerc] readModuleContent: /tmp/prj/A/.modulerc
DEBUG [#1:.modulerc] module-version: X/v1 default
DEBUG [#1:.modulerc] setModuleResolution: X/default resolved to X/v1
DEBUG [#1:.modulerc] setModuleResolution: X resolved to X/v1
DEBUG [#1:.modulerc] setModuleResolution: set symbols 'default' to X/v1
DEBUG [#1:.modulerc] setModuleResolution: module-version X/default = X/v1
DEBUG setState: debug_msg_prefix set to ''
DEBUG setState: specifiedname set to ''
DEBUG setState: modulename set to ''
DEBUG setState: modulefile set to '{}'
DEBUG setState: hiding_threshold set to '0'
Get modules: {X/default} matching 'X' in '/tmp/prj/A'
DEBUG getModules: create cache entry '/tmp/prj/A:X:0:rc_defs_included
resolve:'
DEBUG getModules: get 'X' in /tmp/tool (fetch_mtime=0,
search=rc_defs_included resolve, filter=)
DEBUG findModules: finding 'X' in /tmp/tool (depthlvl=0, fetch_mtime=0)
DEBUG checkValidModule: /tmp/tool/X/v1
DEBUG readModuleContent: /tmp/tool/X/v1
DEBUG setConf: mcookie_version_check set to '1'
DEBUG checkValidModule: /tmp/tool/X/v3
DEBUG readModuleContent: /tmp/tool/X/v3
DEBUG checkValidModule: /tmp/tool/X/.common
DEBUG readModuleContent: /tmp/tool/X/.common
DEBUG checkValidModule: /tmp/tool/X/v2
DEBUG readModuleContent: /tmp/tool/X/v2
DEBUG findModules: found X/v3 .modulerc X/.common X/v1 X/v2
DEBUG findModules: create cache entry '/tmp/tool:X:0:0'
DEBUG lappendState: modulefile appended with '/tmp/tool/.modulerc'
DEBUG lappendState: modulename appended with '.modulerc'
DEBUG lappendState: specifiedname appended with '.modulerc'
DEBUG [#1:.modulerc] lappendState: debug_msg_prefix appended with
'{[#1:.modulerc] }'
Evaluate modulerc: '/tmp/tool/.modulerc'
DEBUG [#1:.modulerc] resetInterpState: removing on __modrc_1 var errorMsg
DEBUG [#1:.modulerc] resetInterpState: removing on __modrc_1 var X_DEFAULT
DEBUG [#1:.modulerc] readModuleContent: /tmp/tool/.modulerc
DEBUG [#1:.modulerc] module-version: X/v2 default
WARNING: Symbolic version 'X/default' already defined
DEBUG [#1:.modulerc] module-version: Y/v1 default
DEBUG [#1:.modulerc] setModuleResolution: Y/default resolved to Y/v1
DEBUG [#1:.modulerc] setModuleResolution: Y resolved to Y/v1
DEBUG [#1:.modulerc] setModuleResolution: set symbols 'default' to Y/v1
DEBUG [#1:.modulerc] setModuleResolution: module-version Y/default = Y/v1
DEBUG setState: debug_msg_prefix set to ''
DEBUG setState: specifiedname set to ''
DEBUG setState: modulename set to ''
DEBUG setState: modulefile set to '{}'
DEBUG setModuleResolution: X/default resolved to X/v3
DEBUG setModuleResolution: define auto symbolic version 'X/default'
targeting X/v3
DEBUG setModuleResolution: X/latest resolved to X/v3
DEBUG setModuleResolution: define auto symbolic version 'X/latest'
targeting X/v3
Get modules: {X X/default X/v3 X/latest X/v1 X/v2} matching 'X' in
'/tmp/tool'
DEBUG getModules: create cache entry '/tmp/tool:X:0:rc_defs_included
resolve:'
DEBUG getEqArrayKey: key 'X' in array 'mod_list' matches 'X'
DEBUG getEqArrayKey: key 'X/v3' in array 'mod_list' matches 'X/v3'
Select module: 'X/v3' (/tmp/tool/X/v3) matching 'X/v3'
DEBUG lappendState: evalid appended with 'load-X/v3-0'
DEBUG lappendState: msgrecordid appended with 'load-X/v3-0'
DEBUG setConf: unload_match_order set to 'returnlast'
DEBUG setState: lm_info_cached set to '1'
DEBUG setState: sub1_separator set to '&'
DEBUG setState: sub2_separator set to '|'
DEBUG cacheCurrentModules: 0 loaded
DEBUG getLoadedMatchingName: '' matches 'X/v3'
DEBUG pushSettings: settings saved (#1)
DEBUG setConf: auto_handling set to '1'
DEBUG getUnmetDependentLoadedModuleList: get dependent of upcoming loaded
'X/v3'
DEBUG doesModuleConflict: 'X/v3' conflicts with '' (declared as '')
DEBUG getDependentLoadedModuleList: get loaded mod dependent of ''
(strong=0, direct=0, nporeq=0, loading=0, sat_constraint=1, being_unload=0)
DEBUG getDependentLoadedModuleList: got ''
DEBUG getUnmetDependentLoadedModuleList: got ''
DEBUG cmdModuleLoad: depre mod list is ''
DEBUG lappendState: modulefile appended with '/tmp/tool/X/v3'
DEBUG lappendState: modulename appended with 'X/v3'
DEBUG lappendState: modulenamevr appended with 'X/v3'
DEBUG lappendState: specifiedname appended with 'X'
DEBUG [#1:load:X/v3] lappendState: debug_msg_prefix appended with
'{[#1:load:X/v3] }'
DEBUG [#1:load:X/v3] setState: inhibit_interp set to '0'
DEBUG [#1:load:X/v3] execute-modulefile: creating interp __modfile_load_1
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile var tcl_version
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile var
tcl_interactive
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile var
ModuleToolVersion
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile var ModuleTool
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile var auto_path
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile var tcl_pkgPath
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile var
tcl_patchLevel
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile var tcl_platform
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile var tcl_library
DEBUG [#1:load:X/v3] dumpInterpState: saving for __modfile proc list
auto_load clock unknown tclLog auto_qualify auto_execok auto_import
auto_load_index
DEBUG [#1:load:X/v3] resetInterpState: saving for __modfile_load_1 command
list module-version tell socket subst conflict open eof pwd glob list
module-hide pid exec auto_load_index time unknown eval module-forbid
lassign lrange module-virtual module-user append-path reportWarning
is-loaded fblocked lsearch auto_import gets report case lappend proc setenv
break variable llength set-function module-info prereq auto_execok return
linsert is-used error catch clock info split variant readModuleContent
array if fconfigure concat join lreplace source fcopy global switch
isVerbosityLevel auto_qualify update module-log unset-alias reportError
close reportCmdTrace cd for auto_load file append lreverse source-sh getenv
format unload read package set binary namespace scan versioncmp apply
module-tag raiseErrorCount trace unsetenv seek while isWin chan flush after
vwait is-saved dict system getvariant continue uplevel is-avail remove-path
foreach lset rename chdir fileevent module-whatis regexp module-alias
x-resource lrepeat upvar formatErrStackTrace reportInternalBug encoding
expr unset prepend-path load regsub module-verbosity module-trace
unset-function exit interp set-alias _puts puts incr lindex lsort tclLog
module uname string
DEBUG [#1:load:X/v3] readModuleContent: /tmp/tool/X/v3
DEBUG [#1:load:X/v3] module-info: name
DEBUG [#1:load:X/v3] conflict: X
DEBUG [#1:load:X/v3] is-loaded: X
DEBUG [#1:load:X/v3] getLoadedMatchingName: '' matches 'X'
DEBUG [#1:load:X/v3] append-path: PATH /tool/X/v3
DEBUG [#1:load:X/v3] add-path: (PATH /tool/X/v3) pos=append
DEBUG [#1:load:X/v3] setModuleVersSpec: Set module 'X/v3' (escglob
'X/v3'), module name 'X' (re ''), module root 'X', version cmp 'eq',
version(s) '', variant(s) '' and module name version spec 'X/v3' for
argument 'X/v3'
DEBUG [#1:load:X/v3] execute-modulefile: exiting /tmp/tool/X/v3
DEBUG setState: debug_msg_prefix set to ''
DEBUG setState: specifiedname set to ''
DEBUG setState: modulename set to ''
DEBUG setState: modulenamevr set to ''
DEBUG setState: modulefile set to '{}'
DEBUG doesModuleConflict: 'X/v3' conflicts with '' (declared as '')
DEBUG setState: force set to '0'
DEBUG add-path: (LOADEDMODULES X/v3) pos=append
DEBUG parsePathCommandArgs: (delim=:, allow_dup=0, idx_val=0,
ign_refcount=0, var=LOADEDMODULES, val=X/v3, nbval=1)
DEBUG set-env: LOADEDMODULES=X/v3
DEBUG interp-sync-env: set var='::env(LOADEDMODULES)', val='X/v3' on
interp(s) __modfile_load_1 __modrc_1
DEBUG add-path: (--duplicates _LMFILES_ /tmp/tool/X/v3) pos=append
DEBUG parsePathCommandArgs: (delim=:, allow_dup=1, idx_val=0,
ign_refcount=0, var=_LMFILES_, val=/tmp/tool/X/v3, nbval=1)
DEBUG set-env: _LMFILES_=/tmp/tool/X/v3
DEBUG interp-sync-env: set var='::env(_LMFILES_)', val='/tmp/tool/X/v3' on
interp(s) __modfile_load_1 __modrc_1
DEBUG doesModuleConflict: 'X/v3' conflicts with '' (declared as '')
DEBUG setModuleDependency: set requirements of 'X/v3' to ''
DEBUG setModuleDependency: set NPO requirements of 'X/v3' to ''
DEBUG add-path: (__MODULES_LMCONFLICT X/v3&X) pos=append
DEBUG parsePathCommandArgs: (delim=:, allow_dup=0, idx_val=0,
ign_refcount=0, var=__MODULES_LMCONFLICT, val=X/v3&X, nbval=1)
DEBUG set-env: __MODULES_LMCONFLICT=X/v3&X
DEBUG interp-sync-env: set var='::env(__MODULES_LMCONFLICT)', val='X/v3&X'
on interp(s) __modfile_load_1 __modrc_1
DEBUG add-path: (__MODULES_LMALTNAME X/v3&as|X/default&as|X/latest)
pos=append
DEBUG parsePathCommandArgs: (delim=:, allow_dup=0, idx_val=0,
ign_refcount=0, var=__MODULES_LMALTNAME, val=X/v3&as|X/default&as|X/latest,
nbval=1)
DEBUG set-env: __MODULES_LMALTNAME=X/v3&as|X/default&as|X/latest
DEBUG interp-sync-env: set var='::env(__MODULES_LMALTNAME)',
val='X/v3&as|X/default&as|X/latest' on interp(s) __modfile_load_1 __modrc_1
DEBUG popSettings: previously saved settings flushed (#1)
DEBUG setConf: term_width set to '0'
DEBUG setState: term_columns set to '138'
DEBUG unsetState: report_sep_next unset
DEBUG setState: report_sep_next set to '1'
Loading X/v3
Evaluate modulefile: '/tmp/tool/X/v3' as 'X/v3'
DEBUG unsetState: report_sep_next unset
DEBUG setState: report_sep_next set to '1'
DEBUG setState: evalid set to ''
DEBUG setState: msgrecordid set to ''
DEBUG setState: mode set to ''
DEBUG setState: try_modulefile set to ''
DEBUG setState: commandname set to ''
DEBUG setState: always_read_full_file set to ''
DEBUG renderSettings: called.
DEBUG setState: autoinit set to '0'
DEBUG setState: error_count set to '0'
DEBUG setState: return_false set to '0'
DEBUG renderTrue: called.
On Thu, Oct 7, 2021 at 12:10 PM Thomas M. Payerle <pa...@um...> wrote:
> I haven't use the hack recently, and only used it on older (3.x) versions
> of modules, but in my cases just using set and a Tcl var worked. But also
> my situation was only dealing with a single modulerc file as well.
>
> I would suggest trying full-fledged env variables and see if that makes a
> difference.
>
> Otherwise, you might want to see if you can create and post a minimalist
> example of the issue --- I am only guessing that your issue is the same as
> the one I am referring to (I do not even recall the exact error message for
> the issue I am referring to, but it was similar to yours), but your issue
> might be something completely different. It is hard to tell from just an
> error message.
>
> On Thu, Oct 7, 2021 at 11:53 AM Robbin Bonthond <ro...@bo...>
> wrote:
>
>> hi,
>>
>> Thank you for the hint, do I need to use environment variables? it seems
>> that a "set x y" isn't global between various .modulerc files.
>>
>> robbin
>>
>> On Wed, Oct 6, 2021 at 6:59 PM Thomas M. Payerle <pa...@um...> wrote:
>>
>>> You might want to look at
>>> https://kb.hlrs.de/platforms/index.php/Module_command
>>> Toward the end, Global Default section.
>>>
>>> Basically, for each module version invocation, create an unique env
>>> variable and test for the env variable before doing the module version call.
>>>
>>> It's an ugly hack, but it gets the job done
>>>
>>>
>>> On Wed, Oct 6, 2021 at 4:24 PM Robbin Bonthond <ro...@bo...>
>>> wrote:
>>>
>>>> Hello,
>>>>
>>>> Is there a way to turn off the warning "WARNING: Symbolic version
>>>> 'tool/default' already defined"?
>>>>
>>>> Robbin
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Modules-interest mailing list
>>>> Mod...@li...
>>>> https://lists.sourceforge.net/lists/listinfo/modules-interest
>>>>
>>>
>>>
>>> --
>>> Tom Payerle
>>> DIT-ACIGS/Mid-Atlantic Crossroads pa...@um...
>>> 5825 University Research Park (301) 405-6135
>>> University of Maryland
>>> College Park, MD 20740-3831
>>> _______________________________________________
>>> Modules-interest mailing list
>>> Mod...@li...
>>> https://lists.sourceforge.net/lists/listinfo/modules-interest
>>>
>> _______________________________________________
>> Modules-interest mailing list
>> Mod...@li...
>> https://lists.sourceforge.net/lists/listinfo/modules-interest
>>
>
>
> --
> Tom Payerle
> DIT-ACIGS/Mid-Atlantic Crossroads pa...@um...
> 5825 University Research Park (301) 405-6135
> University of Maryland
> College Park, MD 20740-3831
> _______________________________________________
> Modules-interest mailing list
> Mod...@li...
> https://lists.sourceforge.net/lists/listinfo/modules-interest
>
|