<feed xmlns='http://www.w3.org/2005/Atom'>
<title>awwan, branch main</title>
<subtitle>Configuration management software, scriptable shell with SSH support.</subtitle>
<id>http://git.kilabit.info/awwan/atom?h=main</id>
<link rel='self' href='http://git.kilabit.info/awwan/atom?h=main'/>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/'/>
<updated>2026-03-26T23:31:33Z</updated>
<entry>
<title>go.mod: update pakakeh.go to the tip</title>
<updated>2026-03-26T23:31:33Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-03-26T23:29:41Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=5290db947e7971cadc7464019e1cbc80082a572a'/>
<id>urn:sha1:5290db947e7971cadc7464019e1cbc80082a572a</id>
<content type='text'>
This fix the issue on play command where remote server only has one
public key in the known_hosts file with the following error:

  initSSHClient: NewClientInteractive: dialWithSigners: \
    ssh: handshake failed: knownhosts: key mismatch with known_hosts \
    files [/home/ms/.ssh/known_hosts]

This changes require replacing golang.org/x/crypto module with our
own forks that implement the fix on the [ssh/knownhosts] package.
</content>
</entry>
<entry>
<title>all: fix chmod/chown if destination is directory</title>
<updated>2026-02-15T06:45:38Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-02-15T06:44:39Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=83a162bfa6e6eba78ae439e193682c19b9cd4744'/>
<id>urn:sha1:83a162bfa6e6eba78ae439e193682c19b9cd4744</id>
<content type='text'>
Given the following command

  #put!+0644 src/file dst/

If the dst is a directory, it would cause the directory permission
changes to 0644.
This changes fix it by checking if the destination is a directory first.
If we cannot stat the dst, skip the chmod/chown command.
</content>
</entry>
<entry>
<title>all: fix data race in Play and in integration tests</title>
<updated>2026-02-15T06:37:31Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-02-15T06:03:38Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=19d58e9a4c900aec1d63de45a655657c760b1235'/>
<id>urn:sha1:19d58e9a4c900aec1d63de45a655657c760b1235</id>
<content type='text'>
When the Play command executed from the web user interface, there is a
possibility that concurrent requests set the sshConfig field in Awwan
struct at the same time.

In the integration tests for TestAwwan_Play_withLocal and
TestExecLocal_sudo, the data race happens when writing to the same
buffer for stdout and stderr, so we split them into separate buffers.

There is also data race in SSE connection, when handler for ExecuteTail
write to the same buffer with worker keep alive.
This has been fixed on pakakeh.go module.
</content>
</entry>
<entry>
<title>all: fix integration tests from previous refactoring</title>
<updated>2026-02-15T05:36:37Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-02-15T05:36:37Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=827a2741e4fcb8e6feb5bf76acb20799c2913451'/>
<id>urn:sha1:827a2741e4fcb8e6feb5bf76acb20799c2913451</id>
<content type='text'>
When we made the refactoring, we forgot to run the test-integration task
which cause some tests are fails.
</content>
</entry>
<entry>
<title>cmd/awwan: add option to auto shutdown idle serve</title>
<updated>2026-02-11T18:29:15Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-02-11T17:21:57Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=1aa46846bc1bfe64c1608e8a536b1732cc3d3b1a'/>
<id>urn:sha1:1aa46846bc1bfe64c1608e8a536b1732cc3d3b1a</id>
<content type='text'>
The `-shutdown-idle` option set the duration when the "serve" command
will stop accepting new connections and shutting down the HTTP server.
</content>
</entry>
<entry>
<title>all: change Serve parameters to struct `ServeOptions`</title>
<updated>2026-02-11T18:29:15Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-02-11T17:17:29Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=ff5a7ecdb8aa0ccfe4bd4f71648e7254e470c930'/>
<id>urn:sha1:ff5a7ecdb8aa0ccfe4bd4f71648e7254e470c930</id>
<content type='text'>
In case we needs to add another parameter, which will do later, the
argument will be too long.
Using parameters is acceptable only for 2 to 3 arguments.
</content>
</entry>
<entry>
<title>internal/cmd/www-awwan: add option to set shutdown idle duration</title>
<updated>2026-02-11T16:05:40Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-02-11T16:05:40Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=2686a70d0eeb14c0eba68f449658827e144e75a2'/>
<id>urn:sha1:2686a70d0eeb14c0eba68f449658827e144e75a2</id>
<content type='text'>
The `-shutdown-idle` option set the duration when server will stop
accepting new connections and shutting down.
</content>
</entry>
<entry>
<title>Release awwan v0.13.1 (2026-02-09)</title>
<updated>2026-02-09T06:38:58Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-02-09T06:38:58Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=9657823ef282479a6609fd77c74c3f64cb512ebd'/>
<id>urn:sha1:9657823ef282479a6609fd77c74c3f64cb512ebd</id>
<content type='text'>
**🌼 internal/cmd/www-awwan: implement socket based activation using systemd**

This allow us to run www-awwan only when its activated in the local
environment.

**🌼 cmd/awwan: implement socket based activation on serve command**

The "awwan serve" command now can run based on socket activation under
systemd.

**🌼 _wui/doc: use default ciigo style**

The default ciigo style provides consistent style with kilabit.info
and have support for light and dark themes.

**💧 all: fix data race in tests and [httpServer.ExecuteTail]**

In the test for AwwanLocal, use buffer with lock, so each write and
read is safe.

In the httpServer, the test found data race during ExecuteTail when
accessing [ExecResponse.EndAt].
We fix it by locking the resource during call to end() and when
accessing the EndAt field.

**💧 _ops/awwan-tour: fix build with latest mkosi**

The option "Incremental" and "CacheDirectory" in mkosi.conf has been moved
to section "[Build]".

**💧 all: use separate buffer for stdout and stderr in TestAwwanLocal**

This is to fix flaky test on TestAwwanLocal.

**🌼 all: improve the Server-Sent Events (SSE) output**

In the ExecResponse, store the event in the Output instead of message
data, so the server can iterate the Output directly and pass it to
WriteEvent directly.

The event ID now start at 1 with type "begin".
This is to minimize confusion when comparing empty Last-Event-ID from
client, which is equal to 0.
</content>
</entry>
<entry>
<title>go.mod: update all dependencies</title>
<updated>2026-02-09T06:31:58Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-02-09T06:31:58Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=4ab4e659ede69431ecf9f673bbf943386423de9b'/>
<id>urn:sha1:4ab4e659ede69431ecf9f673bbf943386423de9b</id>
<content type='text'>
This update affect the [ciigo.Serve] call in internal/cmd/www-awwan.
</content>
</entry>
<entry>
<title>internal: include the robots.txt from _wui/doc/ and _wui/ directory</title>
<updated>2026-02-08T09:12:42Z</updated>
<author>
<name>Shulhan</name>
<email>ms@kilabit.info</email>
</author>
<published>2026-02-08T08:50:46Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/awwan/commit/?id=92f24cfe94e74c5cd6c58330a8eef1ca0ff5aced'/>
<id>urn:sha1:92f24cfe94e74c5cd6c58330a8eef1ca0ff5aced</id>
<content type='text'>
The robots.txt in _wui/doc/ is for awwan.org, while in _wui/ is for
tour.awwan.org.

This remove the unneeded robots.txt from _tour/ directory that we
previously assume for tour.
</content>
</entry>
</feed>
