Back Midas Rome Roody Rootana
  Midas DAQ System, Page 9 of 139  Not logged in ELOG logo
ID Date Author Topic Subjectdown
  1158   28 Jan 2016 Amy RobertsSuggestionscript command limited to 256 characters; remove limit?
Using low-level memory allocation routines in higher-level programs like mhttpd makes me nervous.

We could use vector arrays to allow variable-sized allocation, and use the data() member function to access the char* needed for functions like strlcat,
db_get_data, and db_sprintf.

This conforms to the c++ standard, but doesn't require explicit freeing by the user - at least, not when you're allocating std::vector<char>.

Amy

> Thank you for reporting this problem:
> 
> a) ODB key *names* are restricted to 31 characters (32 bytes, last byte is a NUL), not 256 characters.
> b) ODB string length is unlimited (32-bit length field)
> c) ODB C API "db_get_value" & co require fixed length buffer and most users of this API provide a 256-byte fixed buffer for strings, some of them also do not 
> check the status code, resulting in silent truncation. (I think the ODB functions themselves report truncation to midas.log, so not completely silent).
> 
> We try to fix this where we must - but it is cumbersome with the current ODB API - as in your fix on has to:
> - get the ODB key, extract size
> - allocate buffer
> - call db_get_value() & co
> - use the data
> - remember to free the buffer on each and every return path
> 
> The first three steps could become one if we had an ODB "get_data" function that automatically allocated the data buffer.
> 
> But the main source of bugs will be the last step - remember to free the buffer, always.
> 
> P.S.
> 
> We are not alone in pondering how to do this best. If you want to see it "done right",
> read the fresh-off-the-presses book "Go Programming Language" by Alan Donovan and Brian Kernighan,
> http://www.gopl.io/
> 
> Brian Kernighan is the "K" in K&R "C programming language", still around and kicking, now at Google.
> Sadly the "R" passed away in 2011 - http://www.nytimes.com/2011/10/14/technology/dennis-ritchie-programming-trailblazer-dies-at-70.html
> 
> K.O.
> 
> > Both the /Script and /CustomScript trees in the ODB allow users to trigger a 
> > script via Midas - which silently truncates command strings longer than 
> > 256 characters.
> > 
> > I'd prefer that Midas place no limit on string length.  Failing that, it would be
> > helpful to have character limits called out in the documentation 
> > (https://midas.triumf.ca/MidasWiki/index.php//Script_ODB_tree#.3Cscript-name.3E_key_or_subtree,
> > https://midas.triumf.ca/MidasWiki/index.php//Customscript_ODB_tree).
> > 
> > As far as I can tell, odb.c allows arbitrarily large strings in the ODB data.  
> > (Although key *names* are restricted to 256 characters.)  I've submitted one 
> > possible version of an arbitrary-length exec_script() as a pull request 
> > (https://bitbucket.org/tmidas/midas/pull-requests/).
> > 
> > Am I misunderstanding any critical pieces?  Does Midas intentionally treat 
> > strings in the ODB as limited to 256 characters?
  1166   26 Feb 2016 Konstantin OlchanskiSuggestionscript command limited to 256 characters; remove limit?
> Using low-level memory allocation routines in higher-level programs like mhttpd makes me nervous.

It should not, people have used malloc() for decades now without much injury to themselves. (Thomas corrects me: some people had big injury to their pride, me included).

> We could use vector arrays to allow variable-sized allocation, and use the data() member function to access the char* needed for functions like strlcat,
> db_get_data, and db_sprintf.

I thought auto_ptr was the correct tool to allocate "I just need a few bytes for a few minutes" arrays, but there is some discrepancy
between delete and delete[] (with brackets) and auto_ptr p(new char[i]) is verboten (even though it compiles just fine).

I ended up writing a custom replacement for auto_ptr called auto_string - now in mhttpd.cxx available for use in other places like this.

Still I think a db_get_data() that returns allocated memory is the correct solution. But this memory still needs to be released and lacking auto_ptr it opens the door for memory leaks.

> This conforms to the c++ standard, but doesn't require explicit freeing by the user - at least, not when you're allocating std::vector<char>

I do not think std::vector<char> can be cast into "char*" and used as replacement of "char str[100]" or "char* str = malloc(i);"

In other new, the limit on the command length is now removed.

K.O.

> 
> Amy
> 
> > Thank you for reporting this problem:
> > 
> > a) ODB key *names* are restricted to 31 characters (32 bytes, last byte is a NUL), not 256 characters.
> > b) ODB string length is unlimited (32-bit length field)
> > c) ODB C API "db_get_value" & co require fixed length buffer and most users of this API provide a 256-byte fixed buffer for strings, some of them also do not 
> > check the status code, resulting in silent truncation. (I think the ODB functions themselves report truncation to midas.log, so not completely silent).
> > 
> > We try to fix this where we must - but it is cumbersome with the current ODB API - as in your fix on has to:
> > - get the ODB key, extract size
> > - allocate buffer
> > - call db_get_value() & co
> > - use the data
> > - remember to free the buffer on each and every return path
> > 
> > The first three steps could become one if we had an ODB "get_data" function that automatically allocated the data buffer.
> > 
> > But the main source of bugs will be the last step - remember to free the buffer, always.
> > 
> > P.S.
> > 
> > We are not alone in pondering how to do this best. If you want to see it "done right",
> > read the fresh-off-the-presses book "Go Programming Language" by Alan Donovan and Brian Kernighan,
> > http://www.gopl.io/
> > 
> > Brian Kernighan is the "K" in K&R "C programming language", still around and kicking, now at Google.
> > Sadly the "R" passed away in 2011 - http://www.nytimes.com/2011/10/14/technology/dennis-ritchie-programming-trailblazer-dies-at-70.html
> > 
> > K.O.
> > 
> > > Both the /Script and /CustomScript trees in the ODB allow users to trigger a 
> > > script via Midas - which silently truncates command strings longer than 
> > > 256 characters.
> > > 
> > > I'd prefer that Midas place no limit on string length.  Failing that, it would be
> > > helpful to have character limits called out in the documentation 
> > > (https://midas.triumf.ca/MidasWiki/index.php//Script_ODB_tree#.3Cscript-name.3E_key_or_subtree,
> > > https://midas.triumf.ca/MidasWiki/index.php//Customscript_ODB_tree).
> > > 
> > > As far as I can tell, odb.c allows arbitrarily large strings in the ODB data.  
> > > (Although key *names* are restricted to 256 characters.)  I've submitted one 
> > > possible version of an arbitrary-length exec_script() as a pull request 
> > > (https://bitbucket.org/tmidas/midas/pull-requests/).
> > > 
> > > Am I misunderstanding any critical pieces?  Does Midas intentionally treat 
> > > strings in the ODB as limited to 256 characters?
  1180   13 Jun 2016 Konstantin OlchanskiInforunning mhttpd on port 443
mhttpd running as non-root cannot bind to standard https port 443. By default, mhttpd uses port 
8443 and it works just fine, but some applications such as the SSLlabs https tester insist on using 
port 443.

To connect mhttpd with port 443, I use the tcpproxy package from
git://git.spreadspace.org/tcpproxy.git

./tcpproxy -D -U -p 443 -r localhost4 -o 8443

(you can run this from rc.local)

(to remember, for best security one should run mhttpd behind an industry-standard https proxy)

K.O.
  969   27 Feb 2014 Andreas SuterSuggestionrunlog is "ugly"
I have a couple of questions and suggestions concerning the "new" CSS style of the mhttpd, especially related to the runlog

  1. If I am not mistaken, the mhttpd.css is hard coded (path/name) into the mhttpd. Wouldn't it be beneficial to have ODB entries where to get is from? This way people could change the look and feel more freely.
  2. Especially the look and feel of the runlog is unsatisfactorily from my point of view. See . The old style was much more readable. I could recover the old style look and feel by slightly changing the mhttpd.cxx where I changed in show_rawfile(const char*) "dialogTable" to "runlogTable" in the table class. This way I could tinker around with the mhttpd.css by adding the following stuff there:
    • adding .runlogTable in line 289 :
    • adding some style information for the runlogTable :
This way the "old" runlog look and feel recovered : , which I think is much more readable.
  • If possible, I would love to have alternating background colors between the runs for readability reasons, but I am not sure how easy it would be to add something like this.
    I not much experience with HTML/CSS yet, though a concrete implementation might be different.
  •   970   27 Feb 2014 Konstantin OlchanskiSuggestionrunlog is "ugly"
    > If I am not mistaken, the mhttpd.css is hard coded (path/name) into the mhttpd.
    
    mhttpd.css is served from $MIDASSYS/resources/mhttpd.css. The actual path is reported on the mhttpd 
    "help" page.
    
    (I think the internal mhttpd.css and mhttpd.js should be removed as no longer useful - nothing will work 
    right if the real mhttpd.js and mhttpd.css cannot be served).
    
    > Especially the look and feel of the runlog is unsatisfactorily from my point of view.
    
    persons in charge of implementing the CSS stuff failed to convert quite a few pages, for example, the elog 
    and the history editor pages were left completely broken. (mostly fixed now).
    
    so thank you for reporting the runlog breakage, I hope Stefan & co can fix it quickly. (I cannot do - I have 
    have no runlog pages on any of my test experiments).
    
    > the old style was much more readable.
    
    I think the new style is not too bad, except for a few visual artefacts here and there, the general comment 
    that CSS is too complicated and hard to debug and the fact that over-subtle colouring yields inconsistent 
    visuals between different monitors and ambient lighting conditions. (persons who select the colours always 
    respond that "but to me, it looks just fine on my laptop", making it hard to resolve any issues).
    
    > I could recover the old style look and feel by slightly changing the mhttpd.cxx
    
    If you post the patches that fix it for you, I can commit them to midas. (git diff | mail olchansk@triumf.ca).
    
    K.O.
      973   28 Feb 2014 Andreas SuterSuggestionrunlog is "ugly"
    Understand me right, I mostly like the new style, except the runlog as reported.
    Attached you will find the diff's you were asking for. But as pointed out, I
    haven't worked so far on CSS and hence this should be checked!!
    
    I understand that the mhttpd.js needs to be the default one, however, mhttpd.css
    might be left to the end-user to adopt to their specific needs. I shortly
    checked in the mhttpd demon. It checks for the resources path in the ODB. If it
    also would check for a CSS name, mhttpd.css could be changed/adopted by the
    end-users without breaking things (at least it would then be their one business).
    
    > > If I am not mistaken, the mhttpd.css is hard coded (path/name) into the mhttpd.
    > 
    > mhttpd.css is served from $MIDASSYS/resources/mhttpd.css. The actual path is
    reported on the mhttpd 
    > "help" page.
    > 
    > (I think the internal mhttpd.css and mhttpd.js should be removed as no longer
    useful - nothing will work 
    > right if the real mhttpd.js and mhttpd.css cannot be served).
    > 
    > > Especially the look and feel of the runlog is unsatisfactorily from my point
    of view.
    > 
    > persons in charge of implementing the CSS stuff failed to convert quite a few
    pages, for example, the elog 
    > and the history editor pages were left completely broken. (mostly fixed now).
    > 
    > so thank you for reporting the runlog breakage, I hope Stefan & co can fix it
    quickly. (I cannot do - I have 
    > have no runlog pages on any of my test experiments).
    > 
    > > the old style was much more readable.
    > 
    > I think the new style is not too bad, except for a few visual artefacts here
    and there, the general comment 
    > that CSS is too complicated and hard to debug and the fact that over-subtle
    colouring yields inconsistent 
    > visuals between different monitors and ambient lighting conditions. (persons
    who select the colours always 
    > respond that "but to me, it looks just fine on my laptop", making it hard to
    resolve any issues).
    > 
    > > I could recover the old style look and feel by slightly changing the mhttpd.cxx
    > 
    > If you post the patches that fix it for you, I can commit them to midas. (git
    diff | mail olchansk@triumf.ca).
    > 
    > K.O.
    Attachment 1: mhttpd.cxx.diff
    diff --git a/src/mhttpd.cxx b/src/mhttpd.cxx
    index 7437897..3940b96 100755
    --- a/src/mhttpd.cxx
    +++ b/src/mhttpd.cxx
    @@ -3445,7 +3445,7 @@ void show_rawfile(const char *path)
        rsprintf("</table>");
     
        //main table:
    -   rsprintf("<table class=\"dialogTable\">");
    +   rsprintf("<table class=\"runlogTable\">");
        /*---- menu buttons ----*/
        rsprintf("<tr><td colspan=2>\n");
        rsprintf("<input type=submit name=cmd value=\"ELog\">\n");
    
    Attachment 2: mhttpd.css.diff
    diff --git a/resources/mhttpd.css b/resources/mhttpd.css
    index 71c73a4..066cfe6 100644
    --- a/resources/mhttpd.css
    +++ b/resources/mhttpd.css
    @@ -286,7 +286,7 @@ div.wrapper{
         margin: 0 auto -3em;
     }
     
    -.historyConfigTable, .dialogTable, .messageBox, .genericTable, .sequencerTable{
    +.historyConfigTable, .runlogTable, .dialogTable, .messageBox, .genericTable, .sequencerTable{
     	border-radius: 12px;
     	border: 2px solid #00B26B;
     	background-color: #EEEEEE;
    @@ -304,6 +304,22 @@ table.sequencerTable td table{
     	margin: 0px;
     }
     
    +table.genericTable tr:nth-child(even){
    +	background: #EEEEEE;
    +}
    +table.genericTable tr:nth-child(odd){
    +	background: #FAFAFA;
    +}
    +
    +table.runlogTable td{
    +        border:none;
    +        text-align: left;
    +        font-family: monospace;
    +}
    +
    +table.runlogTable pre{
    +        line-height: 125%;
    +}
     
     table.dialogTable td{
     	border:none;
    
      974   28 Feb 2014 Stefan RittSuggestionrunlog is "ugly"
     > If I am not mistaken, the mhttpd.css is hard coded (path/name) into the mhttpd.
    
    I agree that this should be removed, Unfortunately I'm away right now, so I will fix it next week. Also will put in 
    Andreas' diffs.
    
    /Stefan
      977   07 Mar 2014 Stefan RittSuggestionrunlog is "ugly"
    I put mhttpd.css and mhttpd.js into the ODB, so every experiment can change it. I put also Andreas' modifications of the CSS file for the runlog table and 
    committed the changes.
    
    /Stefan
      1273   18 Apr 2017 Andreas SuterBug Reportrun start/stop oddity
    I stumbled over an oddity which I would like to understand better. Here the
    boundaries:
    - Enable non-localhost RPC -> y
    - Disable RPC hosts check  -> y
    
    1) I am starting a run from ODBedit (start now -v):
    
    07:13:11.272 2017/04/19 [ODBEdit,INFO] Run #26 started
    
    07:13:25.516 2017/04/19 [Logger,LOG] File '/data/max/dlog/lem17_0026.root'
    CRC32C checksum: 0x05ca4e7e, 1523383 bytes
    
    On this little test experiment there is not much running, but it already shows
    the effect I wanted to understand.
    
    2) I am stopping the run from ODBedit (stop -v):
    
    07:13:25.519 2017/04/19 [ODBEdit,INFO] Run #26 stopped
    
    So, everything looks perfectly fine up to this point.
    
    3) Now the 'strange' thing happens. To any point in time after this, I will stop
    ODBEdit which results in the following messages:
    
    07:13:32.335 2017/04/19 [ODBEdit,INFO] Program ODBEdit on host pc7962 stopped
    
    07:13:32.335 2017/04/19 [Logger,ERROR] [midas.c:14079:rpc_server_receive,ERROR]
    rpc check ok, abort canceled
    
    This I do NOT understand! It looks as if the Logger (or any other client which
    gets the run state transition) thinks that some Client (here ODBEdit) has a
    broken connection. At least this is how I understand the comment in midas.c /
    rpc_server_receive(). Is something broken in the de-registration from the RPC
    server? By the way, all clients where running on the localhost, i.e. no remote
    connection used here.
    
    All this only happens if a run transition took place.
    
    Unfortunately I do not understand the system well enough to suggest any fix to
    this :-( and hence would appreciate any help. 
      1288   02 May 2017 Konstantin OlchanskiBug Reportrun start/stop oddity
    I should really get around to fix this junk error message:
    
    > 07:13:32.335 2017/04/19 [Logger,ERROR] [midas.c:14079:rpc_server_receive,ERROR]
    > rpc check ok, abort canceled
    
    What happens is this. For each run transition, cm_transition does RPC calls
    to each client telling them to transition. So even if you run only on localhost, there is still
    tcp connections being created and broken to do these RPCs. These connections are
    typically created and left open, but when you stop odbedit, it's connections would
    be closed/broken. Now in the midas rpc code there is confusion between the main rpc
    connection for remote clients and temporary rpc connections for run transitions. This
    confusion is the cause of these junk error messages - first the code thinks that the main rpc
    connection is closed it it should commit suicide (abort), then it find that it was
    just an rpc connection and there is no need to die.
    
    https://bitbucket.org/tmidas/midas/issues/44/junk-messages-about-rpc-check-ok-abort
    
    >
    > - Enable non-localhost RPC -> y
    > - Disable RPC hosts check  -> y
    > 
    
    this is unsafe:
    
    if you only run on localhost, "enable non-localhost rpc" should be "n" and midas will no listen to any 
    outside connections (except for mhttpd, of course).
    
    if you have remote clients, enable non-localhost rpc and enter their hostnames to the access control list.
    
    "disable rpc hosts check" is for the case where you do not know the hostnames of your remote clients, 
    for example when they come from dynamic ip addresses on a wifi network.
    
    In this case you tell midas to accept connections from everybody everywhere in the world
    and hopefully you have a firewall somewhere to prevent the evil hackers from actually connecting.
    I hope this is not your situation.
    
    K.O.
      2633   22 Nov 2023 Pavel MuratForumrun number from an external (*SQL) db?
    Dear MIDAQ developers,
    
    I wonder if there is a non-intrusive way to have an external (wrt MIDAS)*SQL database 
    serving as a primary source of the run number information for a MIDAS-based DAQ system? 
    - like a plugin with a getNextRunNumber() function, for example, or a special client?
    
    Here is the use case: 
    
    - multiple subdetectors are taking test data during early commissioning 
    - a postgres db is a single sorce of run numbers.
    - test runs taken by different subsystems are assigned different [unique] run numbers and 
      the data taken by the subsystem are identified not by the run number/dataset name , but 
      by the run type, different for different susbsystems.
    
    -- many thanks, regards, Pasha
      2634   22 Nov 2023 Ben SmithForumrun number from an external (*SQL) db?
    > I wonder if there is a non-intrusive way to have an external (wrt MIDAS)*SQL database 
    > serving as a primary source of the run number information for a MIDAS-based DAQ system? 
    > - like a plugin with a getNextRunNumber() function, for example, or a special client?
    
    One of my experiments has special rules for run numbering as well. I created a client that registers a begin-of-run transition handler with sequence 1 (so it's the first client to handle the begin-of-run transition). That client updates "/Runinfo/Run number" in the ODB. 
    
    This mostly works. mlogger will create .mid files based on the new run number, the ODB dumps within those files show the new run number etc.
    
    But there are 2 quirks. Let's say your client changed the number from 11 to 400. The message log will say "Run #11 started" and "Run #400 stopped". And the history system will record the start/stop times the same way. That only matters for when you're viewing history plots on the webpage and zoom in far enough to see the run transitions (represented by green and red vertical dashed lines) - the green line will be labelled 11 and the red line 400.
    
    Depending on the exact logic you need, you may be able to avoid these quirks by also recomputing the run number before the user even tries to start a run (e.g. after the end of the previous run, or when the user changes an important setting in the ODB). If you're changing the run number between runs, make sure to set it to "desired number - 1", as midas will increment the run number automatically before handling the next start run request.
      2635   22 Nov 2023 Stefan RittForumrun number from an external (*SQL) db?
    > - multiple subdetectors are taking test data during early commissioning 
    > - a postgres db is a single sorce of run numbers.
    > - test runs taken by different subsystems are assigned different [unique] run numbers and 
    >   the data taken by the subsystem are identified not by the run number/dataset name , but 
    >   by the run type, different for different susbsystems.
    
    For that purpose I would not "mis-use" run numbers. Run number are meant to be incremented 
    sequentially, like if you have a time-stamp in seconds since 1.1.1970 (Unix time). Intead, I 
    would add additional attributes under /Experiment/Run Parameters like "Subsystem type", "Run 
    mode (production/commissioning)" etc. You have much more freedom in choosing any number of 
    attributes there. Then, send this attributes to your postgred db via "/Logger/Runlog/SQL/Links 
    BOR". Then you can query your database to give you all runs of a certain subtype or mode.
    
    See https://daq00.triumf.ca/MidasWiki/index.php/Logging_to_a_mySQL_database
    
    Stefan
      2636   01 Dec 2023 Pavel MuratForumrun number from an external (*SQL) db?
    > > - multiple subdetectors are taking test data during early commissioning 
    > > - a postgres db is a single sorce of run numbers.
    > > - test runs taken by different subsystems are assigned different [unique] run numbers and 
    > >   the data taken by the subsystem are identified not by the run number/dataset name , but 
    > >   by the run type, different for different susbsystems.
    > 
    > For that purpose I would not "mis-use" run numbers. Run number are meant to be incremented 
    > sequentially, like if you have a time-stamp in seconds since 1.1.1970 (Unix time). Intead, I 
    > would add additional attributes under /Experiment/Run Parameters like "Subsystem type", "Run 
    > mode (production/commissioning)" etc. You have much more freedom in choosing any number of 
    > attributes there. Then, send this attributes to your postgred db via "/Logger/Runlog/SQL/Links 
    > BOR". Then you can query your database to give you all runs of a certain subtype or mode.
    > 
    > See https://daq00.triumf.ca/MidasWiki/index.php/Logging_to_a_mySQL_database
    > 
    > Stefan
    
    Ben, Stefan - thanks much for your suggestions!(and apologies for the thanks being delayed) 
    
    Stefan, I don't think we're talking 'mis-use' - rather different subdetectors being commisisoned 
    at different locations, on an uncorrelated schedule, using independent run control (RC) instances. 
    At this point in time, we can't use a common RC instance. 
    The collected data, however, are written back into a common storage, and we need to avoid two 
    subdetectors  using the same run number. As all RC instances can connect to the same database and request a 
    run number from there, an external DB serving run numbers to multiple clients looks as a reasonable solution, 
    which provides unique run numbers for everyone. Of course, the run number gets incremented (although on the DB 
    server side), and of course different susbystems are assigned different subsystem types. 
    
    So, in essense, it is about _where_ the run number is incremented - the RC vs the DB. 
    If there were a good strategy to implement a DB-based solution that w/o violating 
    first principles of Midas:), I'd be happy to contribute. It looks like a legitimate use case.
    
    -- let me know, regards, Pasha 
      2638   02 Dec 2023 Stefan RittForumrun number from an external (*SQL) db?
    > Stefan, I don't think we're talking 'mis-use' - rather different subdetectors being commisisoned 
    > at different locations, on an uncorrelated schedule, using independent run control (RC) instances. 
    > At this point in time, we can't use a common RC instance. 
    > The collected data, however, are written back into a common storage, and we need to avoid two 
    > subdetectors  using the same run number. As all RC instances can connect to the same database and request a 
    > run number from there, an external DB serving run numbers to multiple clients looks as a reasonable solution, 
    > which provides unique run numbers for everyone. Of course, the run number gets incremented (although on the DB 
    > server side), and of course different susbystems are assigned different subsystem types. 
    > 
    > So, in essense, it is about _where_ the run number is incremented - the RC vs the DB. 
    > If there were a good strategy to implement a DB-based solution that w/o violating 
    > first principles of Midas:), I'd be happy to contribute. It looks like a legitimate use case.
    
    Ok, maybe attitude comes from the fact that I never used such a scheme in the last 30 years with midas.
    
    If you go in this direction, there is an alternative to what Ben wrote: Use the sequencer to start a run.
    The sequencer script can obtain a new run number from a central instance (e.g. by calling a shell script 
    like 'curl ...' to obtain the new run number, then put it into /Runinfo/Run number as Ben wrote. This has
    the advantage that the run is _started_ already with the correct number, so the history system is fine.
    
    The script can then wait for n events, then stop the run etc. A sequencer script will also be necessary if
    you want to configure your electronics (see next answer...)
    
    Stefan
      2640   02 Dec 2023 Pavel MuratForumrun number from an external (*SQL) db?
    > 
    > If you go in this direction, there is an alternative to what Ben wrote: Use the sequencer to start a run.
    > The sequencer script can obtain a new run number from a central instance (e.g. by calling a shell script 
    > like 'curl ...' to obtain the new run number, then put it into /Runinfo/Run number as Ben wrote. This has
    > the advantage that the run is _started_ already with the correct number, so the history system is fine.
    > 
    
    Hi Stefan, this sounds like a perfect solution - thanks! - and leads to another, more technical, question:
    
    - how does one communicate with an external shell script from MSL ? I looked at the MIDAS Sequencer page 
      
      https://daq00.triumf.ca/MidasWiki/index.php/Sequencer
    
      and didn't find an immediately obvious candidate among the MSL commands. 
      The closest seems to be 
    
      'SCRIPT script [, a, b, c, ...]' 
    
      but I couldn't easily figure how to propagate the output of the script back to MIDAS. 
      Let say, the script creates an ASCII file with the next run number. What is the easiest 
      way to import the run number into ODB? - Should an external script spawn a [short-lived] 
      MIDAS client ?  - That would work, but I'm almost sure there is a more straightforward solution. 
    
      Of course, the assumption that the 'SCRIPT' command provides the solution could be wrong.
    
    -- thanks again, regards, Pasha
      2642   03 Dec 2023 Pavel MuratForumrun number from an external (*SQL) db?
    > - how does one communicate with an external shell script from MSL ? 
    
    trying to answer my own question, as I didn't find a clear answer in the forum archive :
    
    1. one could have a MSL script with a 'SCRIPT ./myscript.sh' command in it - 
       that would run a shell script named 'myscript.sh'
       [that was not obvious from the documentation on MIDAS wiki, and adding a couple of clarifying 
        sentences there would go long ways]
    
    2. if a script produces an ascii file with a known name, for example, 'a.odb', with the following two lines:
    
    --------------------------------------- a.odb
    [/Runinfo]
    Run number  = INT32 : 105
    --------------------------------------- end a.odb
    
    one can use the 'odbload' MSL command :
    
    odbload a.odb
    
    and get the run number set to 105. It works, but I'm curious if that is the right (envisaged) 
    way of interacting with the shell scripts, or one could do better than that.
    
    -- thanks, regards, Pasha
      2643   04 Dec 2023 Stefan RittForumrun number from an external (*SQL) db?
    > - how does one communicate with an external shell script from MSL ? I looked at the MIDAS Sequencer page 
    >   
    >   https://daq00.triumf.ca/MidasWiki/index.php/Sequencer
    > 
    >   and didn't find an immediately obvious candidate among the MSL commands. 
    >   The closest seems to be 
    > 
    >   'SCRIPT script [, a, b, c, ...]' 
    > 
    >   but I couldn't easily figure how to propagate the output of the script back to MIDAS. 
    >   Let say, the script creates an ASCII file with the next run number. What is the easiest 
    >   way to import the run number into ODB? - Should an external script spawn a [short-lived] 
    >   MIDAS client ?  - That would work, but I'm almost sure there is a more straightforward solution. 
    
    The output of the SCRTIP command is stored in the variable $SCRIPT_RESULT. Please pull midas to get this
    new functionality.
    
    Stefan
      2644   04 Dec 2023 Stefan RittForumrun number from an external (*SQL) db?
    >    [that was not obvious from the documentation on MIDAS wiki, and adding a couple of clarifying 
    >     sentences there would go long ways]
    
    I added a sentence there. Please have a look. If you like more info, please write it yourself and send it to me. 
    It's always better if that comes from users than from me.
    
     
    > 2. if a script produces an ascii file with a known name, for example, 'a.odb', with the following two lines:
    
    Use $SCRIPT_RESULT as described before.
    
    Best,
    Stefan
      1143   24 Nov 2015 Robert PattieForumrpc_client_dispatch error
    I'm trying to set up an experiment with 2 frontends for the first time.  When I
    start the remote frontend I get the following errors:
    
    first time (odd attempt):
    
    [MCS_Frontend_203,ERROR] [midas.c:9678:rpc_server_connect,ERROR] mserver
    subprocess could not be started (check path)
    [MCS_Frontend_203,ERROR] [mfe.c:2696:mainFE,ERROR] Cannot connect to experiment
    'Default' on host 'ucntau-daq.lanl.gov', status 503
    
    second time (even attempt):
    
    MCS6A_frontend: src/midas.c:9085: rpc_client_dispatch: Assertion `n ==
    sizeof(NET_COMMAND_HEADER) + 4 * sizeof(INT)' failed.
    
    On the local host I'm running : mlogger, a frontend, an analzer, mhttp, and
    mserver.  I followed the instructions for adding the remote computer to the
    RPC_ALLOWED list and I do see that the remote frontend was able to edit the
    local odb equipment list.  At present I'm not running an event builder I just
    wanted to get the frontends connected to start.  Do I need to have the mserver
    running on both computers?  Any suggestions on where to start troubleshooting this?
    
    Thanks 
    ELOG V3.1.4-2e1708b5