On 06/02/2013 03:43 PM, Amos Jeffries wrote:
> On 1/06/2013 5:14 a.m., Alex Rousskov wrote:
>> On 05/31/2013 10:05 AM, Tsantilas Christos wrote:
>>> On 05/27/2013 07:12 PM, Alex Rousskov wrote:
>>>> On 05/27/2013 04:54 AM, Tsantilas Christos wrote:
>>>>> On 05/26/2013 10:05 PM, Kinkie wrote:
>>>>>>>> The only thing I would like to see differently implemented is the
>>>>>>>> syntax used to include files:
>>>>>>>> file(path) would be IMO easier to understand and less prone to
>>>>>>>> confusion than the proposed syntax.
>>>>>>> OK.
>>>>>>> But imagine in the future also the following syntax:
>>>>>>> file:/path/file
>>>>>>> system:/usr/local/squid/bin/my-squid-conf (to read from an
>>>>>>> executable
>>>>>>> stdout configuration options)
>>>>>>> http://hostname/cfgfile (to get from web page configuration)
>>>>>>>
>>>>>>> All the above can be implemented in the future...
>>>>>> Sure, I agree.
>>>>>>
>>>>>> file(/path/file)
>>>>>> system(/some/executable)
>>>>>> http_get(http://hostname/file)
>>>>> Well, this is not a bad scheme :-)
>>>>>
>>>>> Just the file:/path/to/file a little easier to implement. But not
>>>>> something important...
>>>>
>>>> I agree that file() is a good alternative. Amos (and others), do you
>>>> have a preference between
>>>>
>>>>    file:"/path/file"
>>>>
>>>> and
>>>>
>>>>    file("/path/file")
>>>>
>>>>
>>>> syntax?
>>>>
>>> About these two schemes I have a different suggestion.
>>> Some opensource packages using the "file:/" or "db:/" for dynamic data.
>>>
>>> I do not know if it make sense for squid but I am suggesting the
>>> following scheme
>>>    1) Use the file("path") syntax for configuration file parsing
>>>    2) preserve the file:/ or db:/  etc for dynamic data. For example
>>> acls
>>> values stored in bdb or sql server.
>>
>> Stepping back a little, I think there are two big problems with the "URL
>> scheme-like" approaches (file:, db:, etc.):
>>
>> 1) They combine the method of access (local file, HTTP, database query,
>> etc.) with the meaning of the received information (configuration values
>> to use now or configuration values to interpret at the time of directive
>> use). With function-like style, this is not a problem:
>>
>>    # static configurations to use now:
>>    parameters("/usr/local/etc/config.txt")
>>    parameters("http://example.com/config.txt";)
>>    parameters("db:config_table")
>>
>>    # dynamically updated configuration:
>>    dynamic_parameters("/usr/local/etc/config.txt")
> The above is rather ambiguous, is that a text string or a filename? this
> is the problem we seek to resolve with "file:" prefix.
> 
>>    dynamic_parameters("http://example.com/config.txt";)
>>    dynamic_parameters("db:config_table")
> 
> I think you have stepped back too far on this point. The interpretation
> is imposed by the parser context:
> 
>   include file:/somewhere
>   acl foo dstdomain file:/somewhere2
>   directive_with_options parameter=file:/somewhere3
>   fancy_directive parameters="http://example.com/config.txt";
> more_parameters="http://example.com/config.txt method=QUERY"
> 
> The syntax we are deciding is specifically the syntax for the delimiter
> between access method and location. We seem to be getting side-tracked
> by the implementation choice of placing these checks inside NextToken()
> due to the first two lines above being representative of how files are
> currently used in squid.conf. They are in no way representative of the
> future possibilities and should not be limiting the potential usage
> anywhere elase in the config (as demonstrated by the latter two of my
> lines above, and most of your examples).
> 
> Also the access methods we will have here are likely to be quite
> restricted, either to direct filesystem methods or network locations -
> all of which are URI-representable methods.
> 
> 
>> 2) They make it difficult to add other options/parameters for that
>> access (e.g., HTTP request method or database reload frequency). With
>> function-like style, this is not a problem:
>>
>>    parameters("http://example.com/config.txt";, method=QUERY)
>>    dynamic_parameters("db:config_table", reload_frequency=1s)
> 
> I notice you are using the db:config_table syntax here for the access
> method and location. Which supports the point that these ":" separator
> is the best one to use for simplicity, parser re-use and familiarity for
> the users.
> 
> 
> I say we go with "file:" for now and leave the design of context
> extensions to a later point when such extensions are needed.
> 
> 
> Back to the code ...
> 
> As submitted the presence of specific checks for file:"..." in
> NextToken() seems to be a bit restrictive on what can be done with them
> and appears to loose the EOL marker for detecting the end of current
> directive options. I think nextToken() should just return the
> file:whatever token to the requestor and let that directives context
> handle whether it becomes a file parsed by the ConfigParser or not.
> Exposing a method which allows handlers like include directive to push a
> file to be loaded onto the stack of files currently being parsed should
> be sufficient for that.
> 
> If we allow the config to side-track itself into a sub-file at any point
> we could end up with weird/undersirable things like this happening:
> 
> squid.conf:
>   directive_A  param file:/foo other_parameters
> 
> foo:
>  param2
>  new_directive something
>  directive_A2
> 
> and directive_A2 gets the other_parameters instead of directive_A1.
> Which is rather far from what we want in most situations.

Currently the user can not add a directive_A2 inside such file. It will
be treated as options of the directive_A. But this is a desired behaviour.

Imagine the case you have a big file with acl values, eg hostnames. You
do not want to have them in one line.

The code, handles all tokens in a file given from "file:/foo" as tokens
exist in the same line. For example:
http_port file:"/path/to/port_8082.conf" disable-pmtu-discovery=always

/path/to/port_8082.conf:
8082
ssl-bump
generate-host-certificates=on
options=NO_TLSv1_2



> 
> We have two main use-cases for sub-files right now; the include
> directive - where the file is a set of directive lines, and everywhere
> else - where the file is a series of options for the current directive
> at one per line.

The include directive is a different think.

> 
> Amos
> 

Reply via email to