Fix that SA1300 is reported for overridden members or members needed for...

... implementing an interface
Fixes #771.

I improved the performance of this method a bit

Check if the symbol is a method, a property or an event. Otherwise it cant implement an interface
Check if it is implementing a member explicitly
Now that I only have to check implicit implementations I can pass the name of this method to GetMembers to reduce the number of checks I have to do.

I verified that it's fast by changing SA1300 locally to enforce a lowercase first letter instead of what it does now, which triggers a violation on nearly every member in the project. No noticeable impact resulted. :+1:


Event.data is not serialized to String

Websocket does not automatically serialize/deserialize data, so it has to be a string or blog/arraybuffer. Server.send happily accepts anything and propagates it to Websocket, which is wrong so it should check for type and throw an Error.

Thanks for opening this. I have pushed a change for this and I will do a release with it shortly


Support Request: Bot in switch mode is unreliable

Describe Your Problem
Updated description 3/19/23:
If I wait at least 10 seconds after the switch changes states, I can reliably change states again. If I wait less than 10 seconds after changing state, the next attempt to change state on any bot connected to my system returns "successful" but nothing happens.
Relevant log output
[3/10/2023, 3:36:09 PM] [SwitchBot] Bot: Kitchen Lights openAPIRefreshStatus: {"statusCode":100,"body":{"deviceId":"F2281EE72C84","deviceType":"Bot","hubDeviceId":"EAB63DCD318B","version":"V6.3","power":"off","battery":100,"deviceMode":"switchMode"},"message":"success"}
[3/10/2023, 3:36:09 PM] [SwitchBot] Bot: Kitchen Lights openAPIparseStatus
[3/10/2023, 3:36:09 PM] [SwitchBot] Bot: Kitchen Lights On: true
[3/10/2023, 3:36:09 PM] [SwitchBot] Bot: Kitchen Lights updateCharacteristic On: true
[3/10/2023, 3:36:17 PM] [SwitchBot] Bot: Kitchen Lights sign: ZGZQG7K7IXipy5wt5gX1eRThIx9TZAK37mSzt7Mu0pY=
[3/10/2023, 3:36:17 PM] [SwitchBot] Curtain: Living Room Curtains openAPIRefreshStatus
[3/10/2023, 3:36:17 PM] [SwitchBot] Curtain: Living Room Curtains sign: S3yeMOvq7n0KjO5GUNQzx8PQ18q1l1SteOgQ0jC7MXE=
[3/10/2023, 3:36:17 PM] [SwitchBot] Curtain: Bedroom Curtains openAPIRefreshStatus
[3/10/2023, 3:36:17 PM] [SwitchBot] Curtain: Bedroom Curtains sign: A+BBWao1Z7B32u7db84LuHI2CeUjSeWKAfmlkWJ6520=
[3/10/2023, 3:36:18 PM] [SwitchBot] Bot: Kitchen Lights openAPIRefreshStatus statusCode: 200
[3/10/2023, 3:36:18 PM] [SwitchBot] d: {"statusCode":100,"body":{"deviceId":"F2281EE72C84","deviceType":"Bot","hubDeviceId":"EAB63DCD318B","version":"V6.3","power":"off","battery":100,"deviceMode":"switchMode"},"message":"success"}
[3/10/2023, 3:36:18 PM] [SwitchBot] Bot: Kitchen Lights openAPIRefreshStatus: {"statusCode":100,"body":{"deviceId":"F2281EE72C84","deviceType":"Bot","hubDeviceId":"EAB63DCD318B","version":"V6.3","power":"off","battery":100,"deviceMode":"switchMode"},"message":"success"}

Config for homebridge-switchbot
{
    "bridge": {
        "name": "Homebridge 1ED6",
        "username": "0E:17:DC:38:1E:D6",
        "port": 51626,
        "pin": "xxx",
        "advertiser": "bonjour-hap"
    },
    "accessories": [],
    "platforms": [
        {
            "name": "Config",
            "port": 8581,
            "platform": "config"
        },
        {
            "name": "SwitchBot",
            "credentials": {
                "token": "xxx",
                "secret": "xxx",
                "notice": "Keep your Token & Secret a secret!"
            },
            "platform": "SwitchBot"
        }
    ]
}

Screenshots
No response
Device & Model
Switchbot Bot
Node.js Version
v18.13.0
NPM Version
v8.19.3
Homebridge Version
v1.6.0
Homebridge SwitchBot Plugin Version
v2.5.2
Homebridge Config UI X Plugin Version
v4.50.2
Operating System
I don't know (it's a pre-installed XOME device)

I just figured out where it shows the OS in the Homebridge interface: Debian GNU/Linux Bullseye (11)

As I continued playing with it I noticed it seems to be related to timing. If I wait at least 10 seconds after the switch changes states, I can reliably change states again. If I wait less than 10 seconds after changing state, the next attempt to change state returns "successful" but nothing happens.

Please try v2.6.0

Sorry for the slow response. I have been away from home traveling. I am back now. I updated to Homebridge 1.6.1 and I updated the Homebridge SwitchBot plugin to 2.6.2. The same behavior continues as described above.


Social Login options added #1391

Feature Added:
I have added the UI for Social Login options (Google, Facebook, Twitter) to the authentication page.
Changes Made:
Added buttons for Google, Facebook, and Twitter login in the UI.
Styled the buttons using CSS to match the overall design.
Added placeholder JavaScript functions that trigger an alert for each button, which can later be replaced with actual OAuth integration.

This PR focuses on adding the UI only for social logins. The actual integration of OAuth authentication (Google, Facebook, Twitter) has not been included.
Let me know if further adjustments are needed.

@kashish8001 Awesome contribution to Hacktoberfest'24! 🎉 Your work is super valuable. Keep up the great work!


Fix alpha imports in docs/permission/writing-a-policy.md

Signed-off-by: Joe Porpeglia<EMAIL_ADDRESS>Hey, I just made a Pull Request!

Fixing a couple imports that were missed in #11493
:heavy_check_mark: Checklist

[ ] A changeset describing the change and affected packages. (more info)
[ ] Added or updated documentation
[ ] Tests for new functionality and regression tests for bug fixes
[ ] Screenshots attached (for UI changes)
[ ] All your commits have a Signed-off-by line in the message. (more info)

@joeporpeglia thank you so much for raising this so quickly! Looks good as both references to backstage/plugin-catalog-common in the https://backstage.io/docs/permission/writing-a-policy doc would be updated :+1:

⭐


TEAM OF EXPERT  IN CRYPTOCURRENCY RECOVERY-HIRE TRUST GEEKS HACK EXPERT

A few months ago, I was approached by an individual who claimed to be a successful cryptocurrency trader with a foolproof investment opportunity. They promised high returns in a short period and assured me that my investment was safe and secure. Filled with excitement and the prospect of making quick profits, I decided to invest a significant amount of money in the scheme. The initial weeks seemed promising as I saw small returns on my investment, which further fueled my belief in the operation's legitimacy. However, as time passed, the individual became increasingly difficult to reach, and my requests to withdraw my profits were ignored. It soon became clear that I had fallen victim to a cryptocurrency investment scam. I had lost a substantial sum of money, and the promises of high returns were nothing but a facade to lure unsuspecting investors.   However, I refused to give up hope and began searching for solutions online. That's when I came across Trust Geeks Hack Expert  specializes in recovering stolen cryptocurrency. I reached out to them and explained my situation, and they immediately sprang into action. Through their expertise, determination, and relentless effort, they were able to track down my lost Bitcoin and recover it for me. I was overjoyed and relieved beyond words when I received the news that my funds had been successfully retrieved. If you find yourself in a similar situation look for assistance from Trust Geeks Hack Expert. I urge everyone to exercise caution when approached with investment opportunities that seem too good to be true, especially in the realm of cryptocurrency.
Contact Service
Email::  trustgeekshackexpert[Dot]fastservice[At]come
Website. https://trustgeekshackexpert.com/
Telegram ID : Trustgeekshackexpert

#11723 #19886 #recoveryexpert
#2017 #19742 #10644

Yes, there have been cases where individuals or entities have successfully recovered bitcoin lost to investment website, but it can be a complex and challenging process. Victims of investment scams can report the incident to Ultimate Crypto Restorer who is a legitimate and licensed asset recovery expert, all you need to do is to provide him detailed information about the scam, including transaction records and any communication with the scammer and your BTC recovery is assured.
CONTACT
WHATSAPP: +1(815)2950116


Fix warnings from Wartremover

We enabled Wartremoved in #199. For now it produces around 100 warnings. It would be nice if we can fix them and change the level from warning to error to prevent new things.
This is a perfect issue for newcomers. It's not necessary to fix all the warnings in one PR. The best idea would be to fix them file-by-file.

Hi all, I love scala and in particular this project, and I am happy to start contributing with these "easy" issues, since I am quite new to the language.
I have just fixed a couple of "inferred type containing Nothing" warnings in RequestReader.
Now I am just wondering how to fix the problem "Function has default arguments", since removing default arguments changes the api, and so it's not BC compatible.

Well. I think we can leverage between sane and super-functional approach. Default arguments is the most arguable wart in WartRemover (there is an epic ticket about it). Let's just disable this wart for now and keep default args in Finch.

Ok, as soon I have time I will go on with the other fixes, disabling the wart for default args.

There are a lot of "isInstanceOf is disabled" errors in simple pattern matches, like in this
[warn] /www/finch/core/src/main/scala/io/finch/route/Router.scala:100: isInstanceOf is disabled
[warn]       case (aa @ Some((a, _)), bb @ Some((b, _))) =>
[warn]                      ^

How to solve this? It looks to me like a normal pattern matching, maybe I'm missing something?

Internally pattern Some(a) looks like a: Some[_], so it's till uses is instance of. Perhaps, we can also skip this check.

This looks like a bug in WartRemover—there definitely will be a synthetic isInstanceOf here, but it's safe (not actually type-case). Here's a quick stab at a minimization:
// fine, no warning
(Some(1): Option[Int]) match { case x @ Some(_) => x }

// blows up with "isInstanceOf is disabled"
((Some(1), 'a'): (Option[Int], Char)) match { case (x @ Some(_), _) => x }

At a glance at WartRemover I don't see why there's a difference here, or any open issues that report this.

Hm. This is nice. Maybe the difference is that we match over two layers instead (tupple -> option)? Maybe test Some(Some(1)) match { .. } will confirm it.

The following doesn't get the warning, so it looks like the tuple and Some are interacting somehow:
(Some(Some(1)): Option[Option[Int]]) match { case x @ Some(Some(_)) => x }

I'm going to spend ten minutes looking into this and then just report it if I can't tell what's up.

Awesome! Thank you @travisbrown! At lest it fit well into a FixItWeek :)

Okay, reported. Doesn't look like there's a trivial solution, unfortunately.

Thanks @travisbrown!
I've ran into another problem in the Json package, I get a lot of "Inferred type Any" just because Json case classes have the Any type in the constructor arguments. I don't think that is the expected behavior for the Any check.
I've already reported the problem.

Hi all,
I think I have finished at least what I could do...
Summarizing, the remaining warnings are:

Some false isInstanceOf warnings due to https://github.com/puffnfresh/wartremover/issues/152
A lot of Inferred type containing Any in the Json package, see this issue. It is not clear if that rule should allow Any in some signatures or not, but for sure its behavior is inconsistent.
Some Statements must return Unit due to mutable expressions like map += (id -> u)in a statement position.

The rest of the warnings should be fixed, let me know how to proceed for the above points.
Thanks!

I think this may be closed already. We're pretty good here.


Request for Nullscape compatibility

Currently when nullscape is being used with enderite, the enderite ore only generates in the default end biomes and it only spawns low down on the y axis (not in the full height that nullscape adds) it would be fantastic if you could add compatibility for this, thanks!

I'm also having issues with it generating on the surface with nullscape installed.

Oh, is that why it's so rare?  I didn't realize they would cause problems with each other.  Lots of mods have config files for where they generate, is there such a config file?  It would probably be a json or json5 file.
I'm on 1.19.2 Fabric


unexpected custom media behavior

If I declare my custom media for retina as
@custom-media --retina (min-resolution: 192dpi) and (-webkit-min-device-pixel-ratio: 2);
in output css it would be
@media (-webkit-min-device-pixel-ratio: 2) and (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) and (-webkit-min-device-pixel-ratio: 2)
First part of generated rule breaks the second's part logic, doesn't it?

This is autoprefixer problem. Just no write redundant -webkit-min-device-pixel-ratio: 2:
@custom-media --retina (min-resolution: 192dpi)

If you no want modify your code, you can clean prefixes before run postcss. See https://github.com/postcss/autoprefixer#outdated-prefixes


neutrinojs URL looks like spam

The neutrinojs URL in https://github.com/cookpete/auto-changelog/blob/master/README.md looks like it has been commandeered by… something…

Seems https://github.com/neutrinojs/neutrino was archived in February, and they didn't hold on to the website forever (see https://github.com/neutrinojs/webpack-chain/issues/358)
We should just remove the link from the readme.


PeerJ CSS files missing

The CSS of PeerJ has changed, so has https://fnogatz.github.io/paper-now-chrjs/
It should provide the CSS directly.

Resolved via 0e49d7e37cecbc9547ec48ee0e5fc752b148d073.


Wrong Installation status

How to categorize this issue?

/kind bug
/priority 3
What happened:
The installation resource is in the succeeded state, even though the corresponding DeployItem is still processing.
The installation resource has NOT been successful before.
(shoot--d060239--garden:ls-system) ~  k get installations.landscaper.gardener.cloud
NAME                PHASE       CONFIGGEN   EXECUTION           AGE
container-default   Succeeded               container-default   44d
gardenlet-test      Succeeded               gardenlet-test      39m
(shoot--d060239--garden:ls-system) ~  k get deployitems.landscaper.gardener.cloud
NAME                             TYPE                                  PHASE         EXPORTREF   AGE
container-default-deploy-kqq2x   landscaper.gardener.cloud/helm        Succeeded                 44d
gardenlet-test-deploy-78fjn      landscaper.gardener.cloud/container   Progressing               39m

Logs of the landscaper
"level":"error","ts":"2021-08-09T11:56:25.377Z","logger":"setup.controllers.Installations","msg":"unable to set installation status","installation":"ls-system/gardenlet-test","error":"Operation cannot be fulfilled on installations.landscaper.gardener.cloud \"gardenlet-test\": the object has been modified; please apply your changes to the latest version and try again"}
{"level":"error","ts":"2021-08-09T11:56:25.426Z","logger":"setup.controllers.Installations.controller.installation","msg":"Reconciler error","reconciler group":"landscaper.gardener.cloud","reconciler kind":"Installation","name":"gardenlet-test","namespace":"ls-system","error":"Operation cannot be fulfilled on installations.landscaper.gardener.cloud \"gardenlet-test\": the object has been modified; please apply your changes to the latest version and try again"}
{"level":"info","ts":"2021-08-09T11:56:30.730Z","logger":"setup.controllers.DeployItem","msg":"reconcile","resource":"ls-system/gardenlet-test-deploy-78fjn"}
{"level":"info","ts":"2021-08-09T11:56:30.730Z","logger":"setup.controllers.Executions","msg":"reconcile","resource":"ls-system/gardenlet-test"}
{"level":"info","ts":"2021-08-09T11:56:31.645Z","logger":"setup.controllers.DeployItem","msg":"reconcile","resource":"ls-system/gardenlet-test-deploy-78fjn"}
{"level":"info","ts":"2021-08-09T11:56:31.645Z","logger":"setup.controllers.Executions","msg":"reconcile","resource":"ls-system/gardenlet-test"}
{"level":"info","ts":"2021-08-09T12:06:08.000Z","logger":"setup.controllers.DeployItem","msg":"reconcile","resource":"ls-system/gardenlet-test-deploy-78fjn"}
{"level":"info","ts":"2021-08-09T12:06:08.873Z","logger":"setup.controllers.DeployItem","msg":"reconcile","resource":"ls-system/gardenlet-test-deploy-78fjn"}
{"level":"info","ts":"2021-08-09T12:06:08.873Z","logger":"setup.controllers.Executions","msg":"reconcile","resource":"ls-system/gardenlet-test"}

What you expected to happen:
The installation CRD is also processing.
How to reproduce it (as minimally and precisely as possible):
Anything else we need to know?:
Environment:

Landscaper version:
Kubernetes version (use kubectl version):
Others:

Here is another example of this:

It is problematic because other scripts typically wait for the installation to succeed. In this case the Installation already succeeded before the deploy item.

@schrodit Should we close this issue? While #275 probably didn't solve the root problem, it will most likely act as a workaround for this problem.

yes agree. The new reconciliation process actively detects changes. So that state should never happen again.
So closing it for now.


Refactor platforms and sensors to remove weakrefs

This reafactor splits Platform functionality into moving (Movable) and and sensor-holding (Platform) functionality. Removes the need for sensors to hold weakrefs back to their platform.
Platforms now have a movement_controller: Movable Property to control movement, and attribute access on the Platform is proxied to its movement_controller, if not directly provided by the Platform. Also, the Platform constructor will try to construct a movement_controller, if one is not provided, using its input arguments. When a Sensor is added to a Platform, the Sensor's movement_controller is set equal to the Platform's movement_controller.
The external interface to these classes is very similar to before: The major change being that sensors now hold their own mounting/rotation offsets, rather than the platform holding them. This massively reduces the amount of book-keeping needed.
Also, sensors no long have a platform  Property from which to get their position: they now have a movement_controller instead.

This change means the we have no weakrefs in the codebase, and so the __deepcopy__ implmentation that I build in base.py is no longer tested (or, in fact, needed).
Should it be deleted? I think it probably should, as I would argue we shouldn't be re-introducing weakrefs later.

Looks good. 👍
Was wondering if moveable would be better under platform i.e. stonesoup.platform.moveable?

It was there originally. I moved it to its own folder because of the import of Platform in stonesoup/platform/__init__.py. That import leads to a circular import if Moveable is within stonesoup/platform. I will have another think if there is a better way, though.

Looks good. 👍
Was wondering if moveable would be better under platform i.e. stonesoup.platform.moveable?

It was there originally. I moved it to its own folder because of the import of Platform in stonesoup/platform/__init__.py. That import leads to a circular import if Moveable is within stonesoup/platform. I will have another think if there is a better way, though.

I hadn't realised that would cause an issue. Fine to leave it where it is then.

Looks good. There are a few lines of code that could be tested quite easily to get coverage up to ~100%. These are mainly instances where errors get raised.

I have added the tests that were obvious to me... I think this gets coverage of files I touched up to 100%


Ho can i get functions calls?

Description
No response

This should require upper level applications to implement.

llama.cpp and LLamaSharp don't currently have any function calling support. That will probably change in the future :)

The LLamaWorker project based on the LLamaSharp, has preliminarily implemented function calling.

@sangyuxiaowu that looks really cool - if you'd like to submit a PR adding a link to it in this section of the readme that would be great :D

Thank you

@sangyuxiaowu that looks really cool - if you'd like to submit a PR adding a link to it in this section of the readme that would be great :D

I have already added it to the relevant project application examples before, does it seem that more introduction is needed?
Currently, it is:  LLamaWorker (ASP.NET Web API like OAI)
Maybe:  LLamaWorker (ASP.NET Web API like OAI and Function Calling Support) ？
I tested the performance of Llama3.1 today and it seems to be good. Multiple tools can be called in parallel.

I have already added it to the relevant project application examples before, does it seem that more introduction is needed?

So you have, sorry about that! Looks like I can't read 😅


Can this model be used as an encoder?

Hello, I was working on a project where I'm required to encode two images for finding multiclass semantic difference between them.
Can you please tell which one should I use(with Channel attention or without)? and what changes should i consider?

Hi, @nikhilbyte
I don't know the specifics of your data and tasks, but maybe you can do it by changing the last few layers of the model.


Issue with the demo_impedance_ctrl_python.py

There is an error observed while calling the Impedance Controller in the demo file. The Impedance Controller takes 6 attributes, which were not called in this file (line 32).

Hi Max,
The name of the file I was talking about is demo_impedance_ctrl_python.py, it is located in the demos folder.
I have implemented the same system, semi successfully using the following line of code.
ctrls = [ImpedanceController(name[i], pin_robot, root_names[i], endeff_names[i], 6 , [0,1,2,3,4,5,6,7]) for i in range(len(endeff_names))]

ok thanks,
I strongly suggest you have a look a the demo_XXX_cpp.py they refer to the python bindings and is therefore much more tested and we do run it on our robots.
The demo on the python one is referring to pure python implementation which is kinda deprecated...
In the future I will remove the pure python code in favor of the C++ bindings, sorry for the misleading code.


FOUNDATIONS: Retrieve Refugee By Id

Hi @TylerDDev, if you want to push a branch that is not finished yet, you can make a "Draft" PR.


Ability to Rename Projects

Proposal
Renaming previously made projects
Use-Case
Will provide a far better user experience
Is this a feature you are interested in implementing yourself?
No

Hey I'm a newbie and I'm interested to work on this issue, can you please elaborate how do want the process of renaming projects to be?

@0x00zer0day Happy to, should be relatively straightforward. The UI for this isn't ready yet.
Question, what is your preference? UI work (React) or back-end work (NestJS/GraphQL)?
p.s. I'm available on our Discord as "Ariel" for help.

sure, your discord please?

Please join the Pezzo Discord, you'll be able to find me there as "Ariel".

Alright, thanks!

@yotahassan This should now be live on Pezzo Cloud, and available on v0.6.2.


Response with nested errors

Hi,
I'm maintaining an application where the error response from the server is given like this:
{"address":{"location":["This field may not be null."]}}

This results in a Uncaught TypeError: payload[key].forEach is not a function.
To get around it I have modified the _drfToJsonAPIValidationErrors function to look like this:
  _drfToJsonAPIValidationErrors: function(payload, keyprefix = '') {
    let out = [];
    for (let key in payload) {
      if (payload.hasOwnProperty(key)) {
        if (Object.prototype.toString.call( payload[key] ) === '[object Array]') {
          payload[key].forEach((error) => {
            if (key === this.get('nonFieldErrorsKey')) {
              out.push({
                source: { pointer: '/data' },
                detail: error,
                title: 'Validation Error'
              });
            } else {
              out.push({
                source: { pointer: `/data/attributes/${keyprefix}${key}` },
                detail: error,
                title: 'Invalid Attribute'
              });
            }
          });
        } else {
          // should this be "key." or "key/" ?
          out = out.concat(this._drfToJsonAPIValidationErrors(payload[key], `${keyprefix}${key}.`));
        }
      }
    }
    return out;
  },

While this is good enough for me, could this be beneficial to others? Should I submit a PR?
And, should the nested keys be split with a "." or a "/" (so "/data/attributes/address/location" or "/data/attributes/address.location")?

And just in case this info is valuable, I'm using ember-data.model-fragments to handle the model with nested attributes.
// models/task.js
export default DS.Model.extend(MapMarkerMixin, {
  contact: DS.hasOneFragment('contact'),
  address: DS.hasOneFragment('address'),
  // ... other fields
});

// models/address.js
export default DS.ModelFragment.extend({
  location: DS.hasOneFragment('location'),
  // ... other fields
});

Thanks! :)

Thanks for reporting.  Would you mind sharing an example of a DRF serializer that would produce nested errors such as this?

@dustinfarris
Just got this issue as well I have a customer model that includes the "user" relation (one-to-one) and getting this:,
Example output that will make exception:
{"account":{"first_name":["This field may not be null."],"email":["This field may not be null."],"last_name":["This field may not be null."]}}

Causes this JS error:
Uncaught TypeError: payload[key].forEach is not a function
exports.default.DS.default.RESTAdapter.extend._drfToJsonAPIValidationErrors._loop
@ drf.js:118_drfToJsonAPIValidationErrors
@ drf.js:137handleResponse
@ drf.js:91superFunction
@ ember.debug.js:17013handleResponse
@ data-adapter-mixin.js:59apply

The related DRF serializer:
class CustomerSerializer(serializers.ModelSerializer):
    account = UserSerializer(read_only=False)
    # ....

Great, thanks for the example code.  I'll look into this.

See #137


Remove unnecessary type variables

In types that are used by snarky, we've historically used a type variable for each type appearing in a field. These type variables are never actually useful to us, make type errors hard to read, and make type discovery far more opaque.
To get the same level of field sharing, we should consider converting e.g.
(* src/lib/mina_state/protocol_state.ml *)
module Body = struct
  module Poly = struct
    [%%versioned
    module Stable = struct
      module V1 = struct
        type ('state_hash, 'blockchain_state, 'consensus_state, 'constants) t =
          { genesis_state_hash: 'state_hash
          ; blockchain_state: 'blockchain_state
          ; consensus_state: 'consensus_state
          ; constants: 'constants }
      end
    end]
  end

  module Value = struct
    [%%versioned
    module Stable = struct
      module V1 = struct
        type t =
          ( State_hash.Stable.V1.t
          , Blockchain_state.Value.Stable.V1.t
          , Consensus.Data.Consensus_state.Value.Stable.V1.t
          , Protocol_constants_checked.Value.Stable.V1.t )
          Poly.Stable.V1.t
        [@@deriving eq, ord, bin_io, hash, sexp, yojson, version]

        let to_latest = Fn.id
      end
    end]
  end

  type ('state_hash, 'blockchain_state, 'consensus_state, 'constants) t =
    ('state_hash, 'blockchain_state, 'consensus_state, 'constants) Poly.t

  type value = Value.t [@@deriving sexp, yojson]

  type var =
    ( State_hash.var
    , Blockchain_state.var
    , Consensus.Data.Consensus_state.var
    , Protocol_constants_checked.var )
    Poly.t

  ...
end

to use functors to give concrete types
module Body = struct
  module Poly (State_hash : TYPE) (Blockchain_state : TYPE) (Consensus_state : TYPE) (Constants : TYPE) = struct
      type t =
        { genesis_state_hash: State_hash.t
        ; blockchain_state: Blockchain_state.t
        ; consensus_state: Consensus_state.t
        ; constants: Constants.t }
      [@@deriving sexp, eq, compare, yojson, hash, version, hlist]
      end
    end]
  end

  module Value = struct
    [%%versioned
    module Stable = struct
      module V2 = struct
        type t =
          Poly(State_hash.Stable.V1)(Blockchain_state.Value.Stable.V1)
            (Consensus.Data.Consensus_state.Value.Stable.V1)(Protocol_constants_checked.Value.Stable.V1)
          .t =
          { genesis_state_hash: State_hash.Value.Stable.V1.t
          ; blockchain_state: Blockchain_state.Value.Stable.V1.t
          ; consensus_state: Consensus.Data.Consensus_state.Value.Stable.V1.t
          ; constants: Protocol_constants_checked.Value.Stable.V1.t }
        [@@deriving eq, ord, bin_io, hash, sexp, yojson, version]

        let to_latest = Fn.id
      end
    end]
  end

  type value = Value.t [@@deriving sexp, yojson]

  type var =
    Poly(State_hash.Var)(Blockchain_state.Var)(Consensus.Data.Consensus_state.Var)
      (Protocol_constants_checked.Var).t =
    { genesis_state_hash: State_hash.Var.t
    ; blockchain_state: Blockchain_state.Var.t
    ; consensus_state: Consensus.Data.Consensus_state.Var.t
    ; constants: Protocol_constants_checked.Var.t }
end

Of particular benefit are:

MerlinTypeOf in your editor of choice will tell you about the record's fields and their types directly
we don't need to add explicit annotations to ensure that the polymorphic type is instantiated with the right field types
we don't need to explicitly refer to the path of the polymorphic record's fields (e.g. {Protocol_state.Poly.genesis_state_hash= ...; ...})
we can still convert between types fairly easily using the Poly functor
type declarations are far more informative without becoming hugely longer.

#8581 is a different approach to this issue. I'd say that using a functor is more flexible, and much less difficult to implement.

The example functor returns a versioned type, which the ppx lint rules currently reject.

Making these changes requires a hard fork, since the version byte in serializations introduced by the versioned Poly will disappear (which is a good thing).
We should probably "version" these functors (Poly_V1, etc.), since they may differ when creating versioned types.

Making these changes requires a hard fork, since the version byte in serializations introduced by the versioned Poly will disappear (which is a good thing).

Completely agree, and looking forward to this 😁

We should probably "version" these functors (Poly_V1, etc.), since the functors may differ when creating versioned types.

I'm not sure how necessary that is if we expand the aliases, since the linter will be able to check the actual structure of the type when it's expanded. (If ocaml/ocaml#10777 is considered for merge, we might be able to achieve this with polys instead of functors too, but I don't expect that any time soon.)

I'm not sure how necessary that is if we expand the aliases

Right, if we keep around older versions, we may need multiple Poly functors, and it would be good to have a systematic way to distinguish them.

We should have a standard module type name for the functor arguments, like Poly_arg.  Unfortunately, the actual type will differ from case to case, because of the deriving contents, so we can't declare such a type once and for all. For Account.t, a signature that works is
sig
  type t [@@deriving sexp, equal, compare, hash, yojson]
end

We could use a ppx like:
[%%sig_type_derives sexp, equal, compare, hash, json]

to create such module types.


Use tf attribute names in path specifications for late-initialization filters

What problem are you facing?

Please see the comment https://github.com/crossplane-contrib/terrajet/pull/85#issuecomment-937523984 for the context. I believe it makes sense to provide a more consistent developer experience while authoring resource configurations for Terrajet-based resources.
How could Terrajet help solve your problem?

We could use the Paved syntax with tf attribute names as path elements.

Closed with https://github.com/crossplane-contrib/terrajet/pull/128


Add REST API documentation

@jamesdbloom Just curious, with this are you looking for a section in the documentation that describes the calls available in the ProxyClient (I'm assuming these are the endpoints you are referring to; dumpToLog, status, etc) so that someone can leverage Postman or a similar tool, are you thinking of implementing something like swagger, or are you thinking of a custom UI?

Initial version of the REST API can be found at https://app.swaggerhub.com/apis/jamesdbloom/mock-server_api/10.8

I'm closing this as the REST API is currently documented using swagger and open api.  I am in the process of re-writing the documentation on the main website so I will also produce a "nicer" version of the REST API documentation there.


Consider adding preview

Consider thinking through if pulumi preview is useful and needed in an operator, and how it would work.
e.g. Do we store preview links in CR statuses, or hook up GitHub PR webhooks to provide the Pulumi GitHub app preview-in-a-PR capability, or is this not needed at all for an operator?

I haven't used the operator yet, but have started looking into it. If I understand what this ticket is about, we absolutely need the previews in PRs/MRs. This is essential functionality to be able to see what is changing.

This is functionality we would definitely need in order to adopt the operator in production.

Without a means of checking the changes beforehand we are also unable to use the operator in production. I’d love to have a way to authorize the changes in the Pulumi SaaS console.

Curious to hear what the desired experience here would be from the standpoint of the operator?
As such the operator is designed to reflect the desired state for a stack backed by a git repository. While this fits into a CI/CD landscape, modeling all CI/CD workflows might be an over-extension. Certainly providing a reasonable preview experience by running the equivalent of pulumi preview and providing the output seems well within the operator's domain. However, modeling an entire approval workflow would seem to better fit a distinct construct/controller entirely. Assuming the stack CR allows a mechanism to request a preview or preview + apply and stack CR exposes preview information, an approval workflow could be crafted in code written against the kubernetes API on top of that. Would that be a reasonable compromise?
We are planning to release support for "constrain to preview" - https://github.com/pulumi/pulumi/issues/2318 this quarter, as per the public roadmap which would enable providing stronger guarantees on previewed vs. final state.

@viveklak since most git repos used with the operator are managed services with their own approval workflows (e.g. GitHub PRs), I don't know if this feature request should include an operator-managed review workflow.
In our case, all we need is a preview link posted in a GitHub PR after every commit to see the diff, same as you see the file diff for stacks. Then, approval happens on the PR, change gets merged and operator applies it from the main/master branch.

all we need is a preview link posted in a GitHub PR after every commit to see the diff

@sfc-gh-alytvynov Do you see this as something built into the operator, or an integration with the operator (or you don't care so long as it works)? Flux has something like this -- https://fluxcd.io/docs/components/notification/provider/#git-commit-status -- which won't work for this purpose as it stands, but could be adapted or emulated.

@squaremo something built into the operator would be strongly preferred.
I'd rather not set up yet another system and deal with provisioning access/credentials for it, which the operator already has.

From my point of view it would be cool to support the feature to provide an proved plan file like https://www.pulumi.com/blog/announcing-public-preview-update-plans/
But I only have unclear picture of how this would match the idea of reconciliation done by an kubernetes-operator/controller. If something changes on the target-side how do you want to create and provide a new plan with approach that is outside of the operator-system.
Maybe the operator could provide an event and write the plan to an configmap-style updateplan-customresource. And an approver has to "sign" it of by annotating the cr or something similar?
Signing could be done via kubectl or by your ci/cd/monitoring(the event) which could prepare a pr/approval-request in your system of choice based on the updatePlan-content. Approving your pr then writes back the same updatePlan just with the annotation.
The updatePlan could/should reference the resource version of your pulumi-stack cr to make it easier to find matching updatePlans. My gut feelings says that this should maybe an requirement(should) and not optional(could). But I am unsure how often the resource version of the stack-cr is updated and if this is under control of the pulumi operator.

Assuming the stack CR allows a mechanism to request a preview or preview + apply and stack CR exposes preview information, an approval workflow could be crafted in code written against the kubernetes API on top of that. Would that be a reasonable compromise?

Seems reasonable to me. There are many ways the approval mechanism could be implemented, as long as the primitives are there, so it makes sense to leave it as something to be built upon PKO's foundational capabilities.
For me, at least, the main point in having preview would be to enable the basic flow of preview/apply using Kubernetes only. So, the same way we can execute preview/apply using Pulumi CLI only or via GitOps only (based on the CLI or automation), it would be nice to be able to execute preview/apply using PKO only. This would also enable other custom automations in k8s on top of PKO, not only approval.


Add support for passing a client_id value through ConvexClient

This will allow mobile clients to identify themselves.

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

shipped with https://github.com/get-convex/convex-rs/commit/cabf104660985a45e54d723238743b3f0292ac3d


core: add DisableHTMLEscape flag to json_formatter

This will enable logging URLs with special characters like "&" and "%".
HTML escaping support was only however added in go 1.7, so it is not compatible with 1.6 :(

Any plans on getting this fixed and merged in to the master?

Any update on this issues?

I can't really do anything here, since the CI needs to be adjusted to drop go 1.6 support for the tests to pass. The library seems to be abandoned though :(

CI now drops support for 1.6.. Can this PR be merged?

bump for this issue. would be really nice to have this. we are at go 1.13 now btw.

@igorsechyn Any interest in rebasing this PR?

some news?

made a pull request that resolved conflicts here:
https://github.com/sirupsen/logrus/pull/1113

Fixed in #1113. Thank you @igorsechyn !


Connection Timeout, Driver Crash on Windows

Laravel Version: 5.8

PHP Version: 7.2.20

Database Driver & Version: SQL Server 2019

PHP Driver version or file name: php_pdo_sqlsrv-5.8.1-7.2-nts-vc15-x86

SQL Server version: Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64)
Aug 22 2017 17:04:49
Copyright (C) 2017 Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 (Build 17763: ) (Hypervisor)

Client operating system: Windows server 2019 datacenter

Description:
I got this case where after a series of find/update/inserts on a SQLSRV database, the connection shutsdown, close or some other error.
After a series of tries, I found that if I do a simple DB::reconnect() after the error, the connection works again, so I don't know if is driver related issue or from the framework.
I opened this issue on the msphpsql too, but I think that maybe this problem insn't there. https://github.com/microsoft/msphpsql/issues/1140
Some of the errors:
SQLSTATE[IMC06]: [Microsoft][ODBC Driver 17 for SQL Server]A conexão foi desfeita e a recuperação não é possível. A conexão está marcada pelo driver do cliente como não recuperável. Não houve nenhuma tentativa de restaurar a conexão. {"exception":"[object] (PDOException(code: IMC06): SQLSTATE[IMC06]: [Microsoft][ODBC Driver 17 for SQL Server]A conexão foi desfeita e a recuperação não é possível. A conexão está marcada pelo driver do cliente como não recuperável. Não houve nenhuma tentativa de restaurar a conexão.

Steps To Reproduce:
I get to write a simple code that generates de error:
 $n =0 ; while($n <=1000) { Transportadora::limit(1)->get(); echo $n . "\n" ; $n++; }

With this code the error shows on the 393 count always, and if a do a simple reconnect, it works again.
This is the error the above scripts throws.
Illuminate/Database/QueryException with message 'SQLSTATE[08S01]: [Microsoft][ODBC Driver 17 for SQL Server]Provedor TCP: An existing connection was forcibly closed by the remote host.
 (SQL: select top 1 * from [Transportadora])'
https://github.com/microsoft/msphpsql/issues/1140

Hey there,
Unfortunately we don't support this version anymore. Please check out our support policy on which versions we are currently supporting. Can you please try to upgrade to the latest version and see if your problem persists? We'll help you out and re-open this issue if so.
Thanks!

I've updated the project to laravel 6.0 and the problem still happens.
I've tried a simple script in pure php and it didn't throw the error.

@elton182 this honestly looks like a network problem


Added the icon to topnav

I personally don't like how this looks. I think we just need to have the article's name in TopNav when in discussion view (and also add in a back button)


How to speed up the training and prediction with GPU like GPyTorch and GPFlow?

HI,
I just want to know how to speed up the training and prediction with GPU like GPyTorch and GPFlow? Since the amount of the data is huge like 100,000 points. I really want to realize the multi-fidelity models with GPU support.
Can someone give me some advices?

Hi there! Have a look at the multi-fidelity deep GP example implemented in Emukit: https://github.com/EmuKit/emukit/tree/main/emukit/examples/multi_fidelity_dgp
It is built with GPFlow 1.x and provides an Emukit-compatible model.


[HxTooltip] Text not updating

Repro steps
When a tooltip's Text parameter is adjusted dynamically (changed from the initial Text value), a tooltip with the old text stays rendered and cannot be closed. When the tooltip is activated (onhover for instance), then a tooltip with the new text is rendered above the old one.
cc @hakenr, @crdo
Update
This issue occurs only in a structure where the element with the event leading to changing the tooltip text resides in the tooltip's ChildContent - might correlate with the tooltip being shown while the text is changing.

Duplicates #439


Remove null check for setupAction

there is already one which throws an ArgumentNullException

Hi @campersau, I'm your friendly neighborhood .NET Foundation Pull Request Bot (You can call me DNFBOT). Thanks for your contribution!

This seems like a small (but important) contribution, so no Contribution License Agreement is required at this point. Real humans will now evaluate your PR.

TTYL, DNFBOT;

@campersau nice catch! Assigning to @javiercn to review and merge.

f3ba776257359380df415cab3b1590ecd6419dbd


Create GLOWS Validation tests for L1A and L1B

Create tests against the level 1 validation data for GLOWS. Also validate that the CDF files are correctly produced without errors.

Completed in PR #889


Binding/Prepared Statements

As far as I can tell, join-monster does not use bind variables in oracle or otherwise. Is there any way within join-monster to allow bind variables (in oracle) or some other way of making sure that the database doesn't need to recreate the query plan every time?
(I'm stuck with Oracle, but open question on the same issue with PostgreSQL as well.)

Not yet. This is something we'd like to add.

isn't this supported by using knex (or some other query builder) out of the box ?

whilst pretty much any DB layer supports it, yes, join-monster doesn't support generating it yet.

wouldn't it be better to use some query builder instead of raw strings to support this ? Like using a composable sql query builder api to do a better sql query building than strings or template litterals ? Or instead of building it as a hardcoded query building capacity within knex, (which at the moment is done by pure text composition if I remember correctly) ?
I don't know if this is already possible, perhaps doing something like: sqlExpr: (table) =>  knex.raw(COALESCE(:table:.key, 'ok'), {table}) is already enough ?

that's the reason this issue is left open.
because right now join monster works by generating a base sql statement + joins.
In the case of wheres based on query arguments, the where function can only return a (promised) string.
This means that there is currently no way to use truely parameterized queries with JM (as you can't return a string and a map of parameter keys to parameter values).
That being said, there's no reason you can't pre-sanitize your values (and you certainly should). Knex's raw is one way to do it.
At my company, we run sqlstring over each query argument before returning it from a where function.
Whilst these methods works fine (as long as there are no issues with the library's security!), you lose out on a big part of DB level optimisation. By hard inserting the query arguments, it means (as far as the DB is concerned) you are send a completely new SQL request every time.
Which means that the DB can't cache/pre-optimise a query execution plan.
Using true parameterized queries allows you to better take advantage of the DB's optimisation.

I see, but my point is join monster should not be responsible for how the sql is parsed and passed to the db-engine, it should only expect an interface. I mean, instead of the sql ast, there should probably be an ast type (the type being a parameter, like knex for instance). The reason why I say this is because, composing knex objects together to build a query (even if those objects are knex.raw) does yield Prepared Statements in the db when executed. The fact that it the above example is not yielding parametrized query is simply because we go through the custom join monster ast (which enforces string types as you said)...
In essence, I think join monster should manipulate sql query part objects, not  parsing any real sql per say, just composing. Then the end user would be expected to use an interface/library that is composable.
In terms of interface:

a function compose(QueryObject a, QueryObject b) returning QueryObject made of a and b
a function execute(QueryObject) actually sending the query object to the database and or, transforming it into text
That should be enough, don't know if this is clear though. Another way to go would be to expect actual sql capabilities in the interface like where, orderBy etc..

JM does generate its own AST before passing this to a builder to generate the SQL as per your configured implementation.
Right now the supported implementations are (at least..) MySQL, PostgreSQL, Oracle.
However, there's no reason that someone couldn't PR a builder which generates what you want.
Though I doubt it would be useful beyond whatever library you design it for (each library would probably have its own flavours of "query part objects" with no common standard).
JM ultimately is designed to be library agnostic. By generating a raw SQL statement by default, it means that it's easily interoperable with pretty much any DB library in node.
Parameterized queries are something difficult because not only does their syntax and nuances differ per SQL flavour, some libraries within the same SQL flavour handle them differently (i.e. within mysql some libraries support only ? ambiguous binding where parameter order really matters, some also support :named binding).

JM does generate its own AST before passing this to a builder to generate the SQL as per your >configured implementation.

Yeah I know I was just making a case for the argument: "it shouldn't, let the query-builder type of libraries do this".

Right now the supported implementations are (at least..) MySQL, PostgreSQL, Oracle.
However, there's no reason that someone couldn't PR a builder which generates what you want.

Again, what I'm saying is: a lot of work for things that have already been done. If, the expected metadata was returning a query object type (defined as a configuration at the beginning), this would not be necessary, it would be expected from the user in his metadata creation in the schemas

Though I doubt it would be useful beyond whatever library you design it for (each library would >probably have its own flavours of "query part objects" with no common standard).

Except if it's a parameter itself, that's why I was talking about interfaces.
This would defacto solve the issue with prepared statements and hugely simplify the extensibility of the lib. But in the end this is a huge amount of work though, with little practical benefits in the short term.
@acarl005 perhaps you have any reflections on this ?

Has plan to do this?  Here is my solution #360 , but may need add more test

with little practical benefits in the short term

Am I missing something? Because from what I know, some queries are very slow without bindings.
Like was already said by @james-scott-meta:

making sure that the database doesn't need to recreate the query plan every time

So from this point of view I would put this issue pretty big priority and try to merge something like @s97712 is suggesting asap.


Throw error on load assignments with integer numbers as user IDs

Have the same issue.
Please fix it asap.


Various small fixes after merge

After you merged in my changes, I hit some small issues that turned into larger ones. I fixed up some of the failing tests, and got things working with my two test projects again. Here are the results of those fixes.
I hope the transaction changes aren't a problem, it helped me track down some issues converting to objects, and it made sense to leave them that way.
Reworks all transactions to be a disposable object so they can be wrapped in using blocks as well as tracked in transaction service
Updated all internal transactions to use Transaction object
Added try/finally to Find in LiteCollection to close the enumerator and finalize the transaction
Fixed VisitValue (QueryVisitor) to handle enums properly on all platforms
Accounted for issue where an index was added implicitly based on a BsonDocument would not crash (Reflection.cs)

Please wait with the merge, so that I can finalize my pullrequest and don't want to start over a 3rd time ^^
I can copy those fixes too, cause I changed many of the tests anyway, if its ok with @mbdavid

Hi @negue, no problems. I will wait. @szurgot implmement a diferent (and nice) option with Transaction. I amazing how many minds think better and one.
I saw your source @negue, and you organize solution with a lot of plataform names (like Android and iOS). I have no knowledge about .net plataform (other than full .net) so I don't understand what the diferente. On big diference I saw is that you implement custom Reflection function (removing Emit) like this PR: https://github.com/mbdavid/LiteDB/pull/140 but @szurgot still with Emit. Is that right?

That source you saw was the one before the dev got merged to master.
Emit is still working on .Net35 / .Net45 Platforms, on others I use Expression.Compile instead of Reflection (GetConstructor).
I splitted them up so that each Platform has their own platform specific calls, anyway once im Home I can push the final changes with a summary of what changed / removed.
Also nearly all tests working on for every platform, incl. encryption.

@mbdavid we should create a slack or gitter  group , easier to discuss ^^

@negue I see what you did in your previous commit, and it looks pretty good. If you're doing the same with the new commit, I can apply my changes on top of that pretty easily if necessary.
@mbdavid I did my changes in place because I didn't want to disrupt the existing project too much, but these changes will simplify the code base back down, and provide good cross platform support easily.


Frame Rate Caps at 60fps - any way to improve?

What OS are you using (uname -a, or Windows version)?
Ubuntu 20.10, AMD Ryzen 9 + nvidia RTX 2060
What programming language are you using (C/C++/Go/Rust)?
Go 1.14
What did you expect to see and what you saw instead?
The FPS seem to cap at 60fps, using requestAnimationFrame, running a web app inside of a Go desktop container (using Wails project, which relies on webview). I see the same code running at 120FPS in a normal browser.
Any idea why? Is this a limitation of webview, or something else?

I am not sure why it seems to be throttling. I do not think we are not doing it on purpose, it might mean we have to dig into webkit core. I would like to know how this looks on Windows and more specifically macOS.

I am not sure why it seems to be throttling. I do not think we are not doing it on purpose, it might mean we have to dig into webkit core. I would like to know how this looks on Windows and more specifically macOS.

Likewise. Here is the FPS counter code component I'm using, if it helps... it's importing Preact, but can easily be changed to React or some other component framework:
https://gist.github.com/rw3iss/3ef2160c741498b579bf203b14021d54

Likewise. Here is the FPS counter code component I'm using, if it helps... it's importing Preact, but can easily be changed to React or some other component framework:
https://gist.github.com/rw3iss/3ef2160c741498b579bf203b14021d54

https://stackoverflow.com/questions/7422427/android-webview-slow
Possibly related?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    // chromium, enable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    // older android version, disable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Additional note:
In my own webkit (webview derivative) applications I use the following for local execution.
    webkit_settings_set_hardware_acceleration_policy(settings, WEBKIT_HARDWARE_ACCELERATION_POLICY_ALWAYS);
    webkit_settings_set_enable_offline_web_application_cache(settings, 1);

I dont think webView has this in its interface, but it should be easy to add.

Thanks @dlannan Seems related, but I'm not sure (I'm a web developer :-p). I will come back to this when I revisit the desktop component of this app, and try some of that.


muting: Replace JQuery fadeIn/fadeOut with native CSS transitions.

This commit resolves the issue of animation smoothness by replacing the fadeIn/fadeOut methods of jQuery with native CSS transitions. CSS transitions are generally faster and more efficient since they are built into the browser and do not require external libraries like jQuery.
Fixes: #25376.

Screen capture:

This feels fine to me in manual testing, but note that I wasn't able to reproduce the issue in dev when I last tried.

I believe it would be beneficial to have @amanagr review this, as he was able to reproduce the issue and may have additional context that could be useful.

@amanagr, I have updated the PR to reflect the changes in the pointer-events property usage to the visibility property as you proposed on CZO. Ready for the next round of review.

This is what I see. For some reason, opacity transition is not working.

I'm having difficulty doing anything else because I can't reproduce the issue. I've also attempted to throttle the CPU, but it doesn't seem to have any effect.

@amanagr, have you tested this with a cleared cache or in incognito mode?

Closing in favour of #25737


[FEAT] A separate browserless images

Describe the benefit this feature would provide to the project
Browser less image would let people unsatisfied with a browser at rpm-ostree level have a possibility to have an image that do not need layering to use, of course I do know the problem linked with flatpak browser, but at lease this browser less images (why not the one based on fedora gnome), would remove every package useless for browser in flatpak.
Reducing the surface attack for people who don't' want to use chrome, but also let those same people have the layering disabled in rpm-ostree.
Describe the solution you'd like
An image version who do not ship any browser or dependency browser related not needed by flatpak browser.
Disclamer
I do know that using flatpak browser have drawback and they will not be hardened, if this image is done I can help to create a wiki page (if not already here) how to harden flatpak browser as much as possible.
I do also know that username space will be needed for this image and so no version without it can be safely done.
I know replacing or modify the default browser is not in scope, but having an image without any browser may be (why I ask and why I would totally understand a refusal)
Declaration

[x] I declare that I have read the README and my feature request is in-scope.

Deliberately making images less secure by forcing users to use browsers in flatpak is not only not in scope, but against everything this project stands for. This also makes very little sense overall.

Deliberately making images less secure by forcing users to use browsers in flatpak is not only not in scope, but against everything this project stands for. This also makes very little sense overall.

When it's true if you think about chromium based browser and the clash between both sandbox but that is quite false in case (of mine) where it's firefox that will be used as flatpak.
But even in case of chromium this kind of compromise is "technically" better than layering, also "again technically" base browser always have access to full home when flatpak one can be tweaked to avoid it.
So in this case I think (but some may think I'm wrong) we are more in the "what do I prefer to" case.

How is it even technically better than layering? This makes no sense. The chromium sandbox is not for you to deny /home access to the browser. Please read the README, this is specifically answered.

How is it even technically better than layering? This makes no sense. The chromium sandbox is not for you to deny /home access to the browser. Running chromium as a flatpak severely reduces the effectiveness of the chromium sandbox, thus should be avoided. Using firefox is a security nightmare as a whole. Please read the README, this is specifically answered.

So if I understand well you solely decide that no images will never be browser less...
Ok it seem I'm in a project of security people that cannot tolerate that other people have different threats model.
I don't have the time for that kind of pointless debate.
But funnily but forcing out people with other threats model you only will reduce their security since they will use the basic fedora without hardening.
An so you will do the exact opposite of the goal of this project
Congratulations I guess ?

I am not the maintainer.

threat model

The largest attack surface of the overwhelming majority of desktop use cases is the browser. As a result, you'll notice this project and projects like GrapheneOS providing a maximally hardened browser experience out of the box. You don't see GrapheneOS shipping browserless images :slightly_smiling_face: because that would be irresponsible. A maximally hardened project should be especially focused on hardening the largest attack surface in the image. Removing the browser completely would do exactly the opposite of this.

it's firefox that will be used as flatpak

There is nothing preventing you from using firefox as a flatpak on secureblue today. Having chromium installed does not increase attack surface in the same way it would on android where the default browser is used as a webview. This isn't the case on desktop linux. If you don't want to use chromium, then don't use it. Just don't expect support for other browsers.
 If we're both using a browser to browse the web, we have at a bare minimum highly overlapping threat models.

But funnily but forcing out people with other threats model you only will reduce their security since they will use the basic fedora without hardening.

Anyone neglecting to protect themselves against the largest point of attack surface in their system never had security as their top priority to begin with. They are not the target audience of this project

@qoijjj
First for : Having chromium installed does not increase attack surface is not true ANY software unused is a surface attack because it can have security hole.
So :
What do you think about a browser less image but with the hack some use (using toolbox or distrobox as way to install any other browser) ?
with the addition of :
$ toolbox run mkdir /home/foo
$ toolbox run env HOME=/home/foo bash
Or some trick in the file in /etc/profile.d inside the toolbox to override $HOME
I would give a way to have a browser less image, Browser and their dependency isolated, do not rely on flatpak and have a way to easily change browser and finally isolating making more difficult to the browser to have access to user home without broking the sandbox ?
Of course this toolbox may need a copy of the hardening done for chromium but it's more a detail rather than a major block
The post install could automate this kind of toolbx creation

is not true ANY software unused is a surface attack because it can have security hole.

If the software is simply present on the disk but never run, then this is very theoretical. But again, you are asking for support for an unsupported use case. You are welcome to use bluebuild to make an image based on secureblue for your own use case.

What do you think about a browser less image

As I already said above: "anyone neglecting to protect themselves against the largest point of attack surface in their system never had security as their top priority to begin with. They are not the target audience of this project"

I would give a way to have a browser less image

It is not in scope. You are welcome to use blue-build to use secureblue as a base image to make your own, per https://github.com/secureblue/secureblue?tab=readme-ov-file#customization. Several other users are already doing this.


piscsi_bridge on Bookworm

As per the discussion in https://github.com/PiSCSI/piscsi/issues/1321 , there are signs that the current solution for spinning up piscsi_bridge isn't working anymore on Debian 12 Bookworm.
This ticket is to further investigate.
The current setup is a network bridge configuration that says:
auto piscsi_bridge
iface piscsi_bridge inet dhcp
        bridge_ports eth0

And then using dhcpcd to denyinterfaces for the bridged interface to force traffic through the bridge.
https://github.com/PiSCSI/piscsi/wiki/Dayna-Port-SCSI-Link

With bullseye brctl shows the expected output, i.e. including eth0.

Maybe using Proxy ARP instead of the current bridge setup would be an option: https://wiki.debian.org/BridgeNetworkConnectionsProxyArp
https://hackmd.io/@akiranet/H1gpqUAUO
This would also have the benefit that DHCP could be used when the WiFi interface on the Pi is used as the network interface for the Daynaport

@rdmark I am getting more and more confused. It looks as if the bridge is set up with the piscsi_bridge script even though piscsi sets up the bridge automatically when there is none. The primary idea was that piscsi sets up everything automatically, so that no unecessary static/global re-configuration of the Pi was required. I may simply be missing something.

@fdanapfel Doesn't Proxy ARP require the systemd.networkd network stack? Last time I researched this (a year ago) I found a few potential blockers and didn't proceed with a POC. But I'm an amateur and may have missed some obvious solution. :)
Notes in https://github.com/PiSCSI/piscsi/issues/917

@uweseimet Maybe it has something to do with dhcpcd that requires the bridge to be created on boot time, hence depending on interfaces.d to configure it earlier than what piscsi can do? I'm just guessing though.

@rdmark This may indeed be the case. I noticed that when NOT configuring the bridge beforehand "brctl show" does not list eth0 (this time on bullseye). Maybe the solution for bookworm will provide more insight.
I'm slowly making progress with my setup for the Atari I think. What I do not understand right now is where the Atari's IP address comes from. When eth0 is use there is no <IP_ADDRESS> network. Can you tell me which IP is the one the Atari has to use, and what the gateway IP address is? Is the gateway IP address the address of the piscsi bridge?

@fdanapfel Doesn't Proxy ARP require the systemd.networkd network stack? Last time I researched this (a year ago) I found a few potential blockers and didn't proceed with a POC. But I'm an amateur and may have missed some obvious solution. :)
Notes in #917

@rdmark No, it doesn't if you look at the links I posted you'll see they use parprouted.

@rdmark This may indeed be the case. I noticed that when NOT configuring the bridge beforehand "brctl show" does not list eth0 (this time on bullseye). Maybe the solution for bookworm will provide more insight. I'm slowly making progress with my setup for the Atari I think. What I do not understand right now is where the Atari's IP address comes from. When eth0 is used there is no <IP_ADDRESS> network. Can you tell me which IP is the one the Atari has to use, and what the gateway IP address is? Is the gateway IP address the address of the piscsi bridge? I don't think the Wiki addresses this because it assumes that the computer supports DHCP, which for the Atari driver is not the case. As soon as this is working I will add an Atari network setup section to the Wiki :).

@uweseimet If you use eth0 (the physical network interface on the Pi), then the Atari will need to get a static IP from the network the Pi is connected to, and the gateway IP address will be the same as for all other systems on that network.
So for example if the Network the Pi is connected to is 192.168.0. the gateway for this network will most likely be <IP_ADDRESS> (you can actually check on the Pi with route or netstat). And you can then assign a static IP address on the Atari that is outside of the range of the IP Adresses that your DHCP server assigns (for example, if the DHCP server uses <IP_ADDRESS> to <IP_ADDRESS> as the range of IP addresses it assigns for DHCP requests, you could use <IP_ADDRESS> as the static IP for the Atari.

@fdanapfel It works, thank you for helping with this! I can now successfully ping <IP_ADDRESS>, and get correct traceroute information for this address.

I will keep this ticket open until I have also managed to get everything running with wlan0 instead of eth0.

@rdmark When using wlan0 instead of eth0 it did not work out of the box. When both eth0 and wlan0 are up it fails. This is because piscsi tries to configure eth0 by default when it is available. When you add "denyinterfaces eth0" it works. It also works by explicitly launching piscsi with the interface parameter, e.g.
>piscsi -id 6 -t scdp -f interface=wlan0

For scenarios where you do no want to or cannot use DHCP launching with the parameter is the best solution, because you would not want to enable DHCP when you do not need it, just in order to block eth0. This is also something useful for the Wiki.

My assumption was that bookworm with wlan0 instead of eth0 would work but it did not. As far as I can tell the bridge was set up correctly:
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether dc:a6:32:98:c9:d2  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet <IP_ADDRESS>  netmask <IP_ADDRESS>
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 10  bytes 1558 (1.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10  bytes 1558 (1.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

piscsi0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::b810:beff:fe3c:3a7e  prefixlen 64  scopeid 0x20<link>
        ether ba:10:be:3c:3a:7e  txqueuelen 1000  (Ethernet)
        RX packets 16  bytes 2142 (2.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 48  bytes 6350 (6.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

piscsi_bridge: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet <IP_ADDRESS>  netmask <IP_ADDRESS>  broadcast <IP_ADDRESS>
        inet6 fe80::d0f0:2eff:fea9:fc41  prefixlen 64  scopeid 0x20<link>
        ether ba:10:be:3c:3a:7e  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 32  bytes 4270 (4.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet <IP_ADDRESS>  netmask <IP_ADDRESS>  broadcast <IP_ADDRESS>
        inet6 2a02:8071:2284:5340::8d74  prefixlen 128  scopeid 0x0<global>
        inet6 fe80::fe21:de36:d352:a82f  prefixlen 64  scopeid 0x20<link>
        ether dc:a6:32:98:c9:d3  txqueuelen 1000  (Ethernet)
        RX packets 2197  bytes 194095 (189.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1265  bytes 202752 (198.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

The daynaport log looks normal, with regular polling. The Atari can ping the pi, which which IMHO means that nothing is wrong on the client side. But IP forwarding did not appear to work. I was not able to run traceroute and also could not connect to an ftp server. On the Atari the setup was identical with the one that worked fine with bullseye.

@uweseimet Some research suggests that RPiOS Bookworm deprecated dhcpcd in favor of nm (Network Manager).
https://forums.raspberrypi.com/viewtopic.php?t=357739
https://networkmanager.dev/docs/api/latest/

@uweseimet Over at Discord we were suggested one workaround to try: Disable nm management of the relevant interface. This might theoretically allow dhcpcd to control them again.
https://wiki.debian.org/NetworkManager#Wired_Networks_are_Unmanaged

@rdmark I suggest that the Discord users who want to help with this just try this out. They do not even need piscsi for that, do they, because this is an external setup. If they have found a good solution they might add it to the Wiki.
In the ideal case there will be a solution that can be coded directly in piscsi, just like the existing bridge stuff. But such a solution might not exist.

Don’t hesitate to drop by Discord every now and then to encourage more contributions. ;)
In any case, we should make a decision today. Either spend more time to try to figure out how to get the network bridge to work on Bookworm. Or, cut one last release for Bullseye.
Was there anything specific in your changes to C++ code or build system that interferes with building or operating on Bullseye?
On the Python side, there shouldn’t be any blocker.
On Sat, Nov 11, 2023 at 6:02 PM, Uwe Seimet @.***(mailto:On Sat, Nov 11, 2023 at 6:02 PM, Uwe Seimet < wrote:

@.***(https://github.com/rdmark) I suggest that the Discord users who want to help with this just try this out. They do not even need piscsi for that, do they, because this is an external setup. If they have found a good solution they might add it to the Wiki.
In the ideal case there will be a solution that can be coded directly in piscsi, just like the existing bridge stuff. But such a solution might not exist.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you were mentioned.Message ID: @.***>

@rdmark Yes, more support would definitely help, and in this case it is not about C++, python or SCSI. IMO based on what we know so far the network bridge issue is not related to anything that is part of the piscsi release.
So far I have not found any issues on bullseye, and with my daynaport setup I have even tested more features that I have tested before. @benjamink has also done a lot of testing. But note that my tests only cover the C++ part and the remote interface. I neither use easyinstall nor the web UI.

When I'm back from vacation I'll try to find some time to really understand the bridge setup & see if I can help find a solution for Bookworm.  I have a good bit of Linux experience but am definitely not a networking guru by any means.

Looks to me as if there are two issues with bookworm, with are both not caused by PiSCSI. Please correct me if I am missing something.

Setting up a bridge has changed compared to bullseye. This affects using the daynaport emulation with eth0, but not with wlan0.
IP-forwarding with the iptables settings that were working for bullseye does not work anymore. This affects using the daynaport emulation in general.

@uweseimet FYI the 23.11.01 version has been tagged. I'm drafting the release notes now. Tomorrow I will attempt to run the image gen scripts. After that I'll flag the release as "current" and announce it broadly.

@rdmark Thank you for spending your time on the release process.

For the record: With minor tweaking every except piscsi now also compiles on FreeBS 14.0. I added instructions to https://github.com/PiSCSI/piscsi/wiki/Setup-Instructions. Of course, the only binary that might be useful is scsictl when connecting remotely to a Pi.
It's not unlikely that based on the same instructions compiling also works on a recent Mac.

First problem on Bookworm resolved with manual bridge creation:
>brctl addbr piscsi_bridge
>brctl addif piscsi_bridge eth0
>brctl show
bridge name     bridge id               STP enabled     interfaces
piscsi_bridge           8000.dca63298c9d2       no              eth0

My conclusion: The instructions on the Wiki for eth0 are not correct/outdated, and there is no need for the piscsi_bridge script. piscsi does all that is required automatically if there is not yet any bridge. This is what until recently I thought was the case anyway. Am I missing something?

@uweseimet I just did some tests on my RaSCSI board attached to a Raspberry Pi Zero 2W, which has only WLAN but no Ethernet, which I think confirm your conclusion.
I use the standard "bullseye" image with piscsi updated to the November 2023 Release and I've used the Configure network bridge for WiFi (static IP + NAT) option in easyinstall.sh to set up the network for the DaynaPort.
When the PiSSCSI is turned on and without having any SCSI devices enabled then there is no piscsi_bridge, since there is also no configuration script for it in /etc/network/interfaces.d/:
pi@rascsi:~ $ scsictl -l
No devices currently attached.
pi@rascsi:~ $ brctl show
pi@rascsi:~ $ ls -la /etc/network/interfaces.d/
total 8
drwxr-xr-x 2 root root 4096 Nov  4  2020 .
drwxr-xr-x 7 root root 4096 Feb  6  2022 ..

Only the iptables rules for the NAT setup are present:
pi@rascsi:~ $ sudo iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 104 packets, 16602 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 102 packets, 15450 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 3199 packets, 192K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 3199 packets, 192K bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all  --  *      wlan0   <IP_ADDRESS>/24        <IP_ADDRESS>/0

Also only the default network config for the WLAN interface exists at this point:
pi@rascsi:~ $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet <IP_ADDRESS>/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether e4:5f:01:78:10:a2 brd ff:ff:ff:ff:ff:ff
    inet <IP_ADDRESS>/24 brd <IP_ADDRESS> scope global dynamic noprefixroute wlan0
       valid_lft 862290sec preferred_lft 754290sec
    inet6 2003:c9:d742:e100:e539:577:d97a:c1e5/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 7099sec preferred_lft 1002sec
    inet6 fe80::2395:4ece:5c50:5d10/64 scope link
       valid_lft forever preferred_lft forever

If I now enable the DaynaPort adapter in PiSCSI all of a sudden the piscsi_pridge appears, but it only has the piscsi0 interface attached (since there is no eth0 on the Zero 2W):
pi@rascsi:~ $ scsictl -i 6 -c attach -t scdp -f wlan0:<IP_ADDRESS>/24
pi@rascsi:~ $ scsictl -l
+----+-----+------+-------------------------------------
| ID | LUN | TYPE | IMAGE FILE
+----+-----+------+-------------------------------------
|  6 |   0 | SCDP | DaynaPort SCSI/Link
+----+-----+------+-------------------------------------
pi@rascsi:~ $ brctl show
bridge name	bridge id		STP enabled	interfaces
piscsi_bridge		8000.f2bbaf3d1c2f	no		piscsi0
pi@rascsi:~ $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet <IP_ADDRESS>/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether e4:5f:01:78:10:a2 brd ff:ff:ff:ff:ff:ff
    inet <IP_ADDRESS>/24 brd <IP_ADDRESS> scope global dynamic noprefixroute wlan0
       valid_lft 861955sec preferred_lft 753955sec
    inet6 2003:c9:d742:e100:e539:577:d97a:c1e5/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 7036sec preferred_lft 1567sec
    inet6 fe80::2395:4ece:5c50:5d10/64 scope link
       valid_lft forever preferred_lft forever
3: piscsi0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master piscsi_bridge state UNKNOWN group default qlen 1000
    link/ether f2:bb:af:3d:1c:2f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::f0bb:afff:fe3d:1c2f/64 scope link
       valid_lft forever preferred_lft forever
4: piscsi_bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether f2:bb:af:3d:1c:2f brd ff:ff:ff:ff:ff:ff
    inet <IP_ADDRESS>/24 brd <IP_ADDRESS> scope global piscsi_bridge
       valid_lft forever preferred_lft forever
    inet6 fe80::ecc3:e7ff:feb3:f5e7/64 scope link
       valid_lft forever preferred_lft forever

Still nothing in /etc/network/interfaces.d/:
pi@rascsi:~ $ ls -la /etc/network/interfaces.d/
total 8
drwxr-xr-x 2 root root 4096 Nov  4  2020 .
drwxr-xr-x 7 root root 4096 Feb  6  2022 ..

So the instructions in the wiki are indeed wrong, and there is no need to manually create the piscsi_bridge in /etc/network/interfaces.d/ since piscsi always automatically seems to create it when the DaynaPort is attached.
But I think the piscsi code is also wrong, because based on the instructions in the Wiki the piscsi_bridge is only needed when using a pysical Ethernet port for the Daynaport, but not when using WLAN. So PiSCSI should only create the bridge if eth0 is specified when enabling the DaynaPort, but not when specifiyfying wlan0.

@fdanapfel The piscsi code currently programmatically does what old instructions said should be done. Before I extended piscsi in order to do that, you had to execute the network commands that PiSCSI is now logging on trace level (e.g ">brctl delif ...") manually.
If this can be improved/fixed I will try to address this.

@uweseimet Ah, OK. As I've mentioned in https://github.com/PiSCSI/piscsi/issues/1331#issuecomment-1805620723 it would be great if the whole network setup for the DaynaPort adapter could be changed so that it uses parprouted instead of the current bridge/NAT configuration, which would have the benefit that DHCP could also be used if the DaynaPort connects to the network via WLAN.

@fdanapfel I am open for any kind of improvement, but due to my lack of networking knowledge it is sometimes hard for me to evaluate some suggestions. Any active work (code/script changes) from your side would be appreciated.
By the way, we are in need of reviewers for C++ code changes. Do you volunteer?

@uweseimet Sorry, wish I could help, but  I have next to no knowledge of C++ (I only did a very small bit of C++ coding when I was at university 2 decades ago). I'm more a "sysadmin" type, so I can help with testing things at the OS level.
Is there a way to prevent the automatic creation of the piscsi_bridge when the DaynaPort adapter is enabled? If yes then I could try to figure out if I could get the parprouted setup working so that the DaynaPort can communicate over WLAN with the rest of the network without using the NAT setup.

@fdanapfel When there is already a bridge piscsi does not create it but uses it. At least that's the idea. If you need a change in piscsi to help you with testing, just tell me, and I can do that in a branch. But only very small changes for now, as long as there still several open tickets,.

@rdmark @uweseimet I've now managed to get the WLAN bridge setup using parprouted working on bullseye and created a new issue describing the required steps: https://github.com/PiSCSI/piscsi/issues/1387

@uweseimet As far as I know STiNG only supports static IPs, but no DHCP.

@rdmark @uweseimet I was now able to verify that the piscsi_bridge is not needed when using the "Wireless Raspberry Pi Setup" mentioned at https://github.com/PiSCSI/piscsi/wiki/Dayna-Port-SCSI-Link.
This is how the setup of the network interfaces looks after activating the daynaport on bookworm:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet <IP_ADDRESS>/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether e4:5f:01:78:10:a2 brd ff:ff:ff:ff:ff:ff
    inet <IP_ADDRESS>/24 brd <IP_ADDRESS> scope global dynamic noprefixroute wlan0
       valid_lft 840250sec preferred_lft 840250sec
    inet6 2003:c9:d701:1200:470a:d09a:e629:147e/64 scope global dynamic noprefixroute
       valid_lft 6986sec preferred_lft 3386sec
    inet6 fe80::8d9b:2326:42e9:e441/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: piscsi0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master piscsi_bridge state UNKNOWN group default qlen 1000
    link/ether 4e:a1:a1:3b:c0:74 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::4ca1:a1ff:fe3b:c074/64 scope link
       valid_lft forever preferred_lft forever
4: piscsi_bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 4e:a1:a1:3b:c0:74 brd ff:ff:ff:ff:ff:ff
    inet <IP_ADDRESS>/24 brd <IP_ADDRESS> scope global piscsi_bridge
       valid_lft forever preferred_lft forever
    inet6 fe80::7cd4:98ff:fe16:c0db/64 scope link
       valid_lft forever preferred_lft forever

No NAT rules are set up in iptables at this point:
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
frank@bookworm:~ $ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

I then manually removed the piscsi_bridge that was automatically created:
$ sudo /sbin/ip link delete piscsi_bridge
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet <IP_ADDRESS>/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether e4:5f:01:78:10:a2 brd ff:ff:ff:ff:ff:ff
    inet <IP_ADDRESS>/24 brd <IP_ADDRESS> scope global dynamic noprefixroute wlan0
       valid_lft 840209sec preferred_lft 840209sec
    inet6 2003:c9:d701:1200:470a:d09a:e629:147e/64 scope global dynamic noprefixroute
       valid_lft 6946sec preferred_lft 3346sec
    inet6 fe80::8d9b:2326:42e9:e441/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: piscsi0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 4e:a1:a1:3b:c0:74 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::4ca1:a1ff:fe3b:c074/64 scope link
       valid_lft forever preferred_lft forever

The IP address previously assigned to the pscsi_bridge interface was then assigned to the piscsi0 interface:
$ sudo /sbin/ip addr add <IP_ADDRESS>/24 brd + dev piscsi0
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet <IP_ADDRESS>/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether e4:5f:01:78:10:a2 brd ff:ff:ff:ff:ff:ff
    inet <IP_ADDRESS>/24 brd <IP_ADDRESS> scope global dynamic noprefixroute wlan0
       valid_lft 840190sec preferred_lft 840190sec
    inet6 2003:c9:d701:1200:470a:d09a:e629:147e/64 scope global dynamic noprefixroute
       valid_lft 6927sec preferred_lft 3327sec
    inet6 fe80::8d9b:2326:42e9:e441/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: piscsi0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 4e:a1:a1:3b:c0:74 brd ff:ff:ff:ff:ff:ff
    inet <IP_ADDRESS>/24 brd <IP_ADDRESS> scope global piscsi0
       valid_lft forever preferred_lft forever
    inet6 fe80::4ca1:a1ff:fe3b:c074/64 scope link
       valid_lft forever preferred_lft forever

Then the iptables rules for enabling NAT were set up according to the wiki:
$ sudo iptables --flush
$ sudo iptables -X
$ sudo iptables -Z
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o wlan0 -s <IP_ADDRESS>/24 -j MASQUERADE
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
$ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  <IP_ADDRESS>/24        anywhere

Afterwards I was able to access the network from both an Atari TT030 (with both STiNG and MiNT) and a Mac SE/30 (with System 7.5.5 with MacTCP)  using a static IP assigned on both systems.
Therefore I would suggest that at least when only wlan0 is available or in case wlan0 has been explicitly defined as the network interface when enabling the daynaport, the piscsi_bridge should not be automatically be created by piscsi on either bullseye or bookworm.

@fdanapfel As far as SCSI2Pi is concerned, can you please create a respective ticket in the SCSI2Pi project?

@uweseimet Done: https://github.com/uweseimet/scsi2pi/issues/64


Neo4j session.run summary is 'None'

This used to return the summary in an earlier version of this library, but I noticed it no longer returns the summary now.

Neo4j version: AuraDB
Neo4j Mode: AuraDB single instance
Driver version: python neo4j-driver 4.4.1
Operating system: Mac 12.3
Steps to reproduce

1. create cypher
2. run cypher

Expected behavior

show summary from run response

Actual behavior

response `_summary` property shows `None`

Cypher query:
MATCH (A  { `SSID`: "SouthPark_Guest" })
MATCH (B  { `SSID`: "SouthPark_Guest" })
WHERE A.BSSID <> B.BSSID
MERGE (A) - [r :`EXTENDS`] -> (B)
RETURN *

neo4j.work.result.Result:

Hi. For debugging it's fine to look into attribute and methods that start with _. But please refrain from using them for anything else. If you want to access the summary of a query, you have to consume the result (API docs). This will not only return the summary but make sure the driver does what's necessary to obtain it.
I hope this helps. I'll be closing this issue as it does not seem to be a bug in the driver. However, you are welcome to keep commenting should you need more support or think there is a bug.


Any proper example on how to use PlayAssetDelivery (How to pack asset packs)?

Is there any proper (complete) example available on how to use this ANE, or the API, cannot find any of those.
trying to include it in my project, and i m keep getting the error message:
-1046: Type was not found or was not a compile-time constant: AssetFile.
(using adobe animate 2024, AIR SDK <IP_ADDRESS>

I managed to publish the APK file successfully, but the .aab file isn't generated.
I m using Adobe Animate, should I use the command line for publishing?
I can't find the steps needed, I have always used Adobe Animate for publishing applications.
Thanks in advance.

Animate doesn't (yet?) directly support Android App Bundles, so you could use the command line, or you could look at the workaround option: https://airsdk.dev/docs/tutorials/platform/android/packaging-android-app-bundles#ides-without-aab-option

Thank you very much, I appreciate the quick response.

Just checking, have you added the extra services that are required for this in the manifest additions in your app descriptor file? See the "Configure the application" section of the wiki:
https://github.com/airsdk/ANE-PlayAssetDelivery/wiki

Yes, I copied that section from there and added the extensionIds as well.

Here is  the section for android:
<android>
	  <assetPacks>
		  <assetPack delivery="install-time" folder="assets/" id="soundAssets"/>
	</assetPacks>
	  <manifestAdditions><![CDATA[
		<manifest android:installLocation="auto">
			<uses-sdk android:minSdkVersion="22" android:targetSdkVersion="33"  />
			<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
			<uses-permission android:name="android.permission.INTERNET"/>
			<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
			<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
			<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
			<uses-permission android:name="android.permission.WAKE_LOCK"/>
			<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
			<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
			<application android:enabled="true">
				<activity
					android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity"
					android:enabled="false"
					android:exported="false"
					android:stateNotNeeded="true" />
				<service
					android:name="com.google.android.play.core.assetpacks.AssetPackExtractionService"
					android:enabled="false"
					android:exported="true" />
				<service
					android:name="com.google.android.play.core.assetpacks.ExtractionForegroundService"
					android:enabled="false"
					android:exported="false" />
			</application>
		</manifest>]]>
	</manifestAdditions>
</android>
<versionLabel>1.3.1</versionLabel>

en

com.harman.PlayAssetDelivery
com.google.android.play

Hello and thank you for your response.
Is the kotlin ane needed?

I did everything above and still getting the same error:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
sample code:
var assets:PlayAssetDelivery = App.Instance.GetAssets();
if (assets == null)
{
trace("PlayAssetDelivery is null!");
}
var strPath:String = assets.getAssetAbsolutePath("soundAssets", soundId);
trace("strPath: " + strPath); // path is null here....
var soundBytes:ByteArray = new ByteArray();
var asset:AssetFile = assets.openInstallTimeAsset(soundId);
asset is null here!!!

Any suggestions?

What does GetAssets() do? Could you post the logs from the device as well?

GetAssets() returns the initialized PlayAssetDelivery.
I will post the logs in a while.

Here is the log, i hope it helps.
log.txt

Hmm - I'm wondering if this is due to some versioning mismatches...
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/tasks/TaskCompletionSource;

Can I check which version of the Play Asset Delivery ANE you have, and of the com.google.android.play.ane one too? If you open the .ane files within a zip manager and look for "META-INF/ANE/extension.xml", you should see a "versionNumber" field.
In our version 9, we updated to use the com.google.android.play:asset-delivery package, with an associated switch in Java including from com.google.android.play.core.tasks.Task to com.google.android.gms.tasks.Task.
@marchbold are you able to confirm whether there's a particular version of the play ANE that would be needed to correspond with this? Or is it more that we would need to also specify a Gradle dependency upon a GMS package within the ANE platform file? (there wasn't anything in the migration steps for this .. but reading between the lines, I would think that we perhaps need this too..?)

Update -> we maybe need to include a dependency on
com.google.android.gms:play-services-tasks:18.1.0

Let me get that updated and see whether it helps.
FYI we were also trying to get our test app into a suitable state for publishing as sample code, but running into some "interesting" issues with Android platform (compile sdk level) 34...

@hantouan are you able to try with the attached ANE please? (this is zipped up, so unzip it to get at the .ane file)
thanks
PlayAssetDelivery.ane.zip

I will try that in the morning, can't do that right now

d

The ANE versionNumber is 9

This would indicate you are missing the com.distriqt.playservices.Base extension. Check the updated docs here for the required extension list:
https://github.com/airsdk/ANE-PlayAssetDelivery/wiki/Get-Started

Still getting the same errors.
log.txt

Did you grab the latest release?

Ah .. so, trying it here, and it looks like it doesn't work if we have that dependency just included in the grade build file for the ANE code itself... we need that to be included within the main application that links in the ANE.
So we would need to switch to add this gradle dependency into the ANE as a separate (XML-based) dependency rather than having this in the ANE java build configuration.
.... will get an updated version prepared and hopefully check it here before posting, we've managed to get a reproduction of the issue I think..

@hantouan  please try with this ANE file:
PlayAssetDelivery.ane.zip
To install it, you can use ADT:
adt -installApp -package "App(64bit).aab"

because internally that would just do the same as the two bundletool commands (assuming bundletool already knows about your keystore, i.e. if you've ever built any debug stuff in Android Studio..)
FYI we've also put our test case now up online:
https://github.com/airsdk/Adobe-Runtime-Support/tree/master/samples/android_play_asset_delivery
thanks

I built and run the test case and it seems it works, but not for install-time assets, here is the output:

ANE is supported
Checking status for install-time asset pack
Could not read install-time asset file
Checking status for asset pack: fast_follow_asset_pack
Asset pack not found: requesting
Status event -> fast_follow_asset_pack, 1
Status event -> fast_follow_asset_pack, 2
Download Progress = 50%
Status event -> fast_follow_asset_pack, 3
Transfer Progress = 0%
Status event -> fast_follow_asset_pack, 4
Status event -> fast_follow_asset_pack, 4
Checking status for asset pack: on_demand_asset_pack
Asset pack not found: requesting
Status event -> on_demand_asset_pack, 1
Status event -> on_demand_asset_pack, 2
Download Progress = 0%
Status event -> on_demand_asset_pack, 3
Transfer Progress = 0%
Status event -> on_demand_asset_pack, 4
Status event -> on_demand_asset_pack, 4

Did you install the bundle via ADT? I think your manual bundletool usage is missing the "local testing" flag.
See e.g. https://stackoverflow.com/a/67542386
If it's not working after adding that, can you capture logcat output for it (either from Android Studio / ADB, or adt -deviceLog -platform android)
thanks

Did you install the bundle via ADT? I think your manual bundletool usage is missing the "local testing" flag.

I used adt this time.

That's odd .. nothing massively obvious in the log but the test case works for me.
Can I suggest uninstalling the app from your phone and rebooting it? then re-install.. (and maybe even change the application ID?) - potentially it got into a weird scenario with the older version and maybe didn't install the install-time APK properly....
thanks

Same thing :).
I have also changed the ID.
Is there any chance that my phone is the problem? it is a samsung A20e.


Run baremetal job for any changes to scripts

We use different nodesets and networking for pre-provisioned and baremetal jobs. We should run baremetal job for any changes to things like gen-nncp.sh, so as to avoid issues like https://issues.redhat.com/browse/OSPCIX-185.

/test install-yamls-deploy

/lgtm


Include Discord in navigation-bar plus in footer

Ready to merge.

never close an issue before the pr is merged.
Instead, add "closes #59" to pr description


updated ruby version 2.6.6

updated ruby version to 2.6.6
enabled cucumber tests on azure yaml file

Creating a new branch for this


Add check property

Coverage increased (+2.6%) to 32.149% when pulling 49304e056904cf72193a705258b8f5d30ace308f on loadPropertyException into 8063157d3dd9642c37fa80a2ba49fec2ae9ff21f on master.