@@ -13,6 +13,7 @@ const SYSUPDATES_CRON_SCRIPT_PATH = "/etc/cron.hourly/sysupdate";
1313/// must be the same as https://github.com/nakamochi/sysupdates/blob/master/update.sh
1414const SYSUPDATES_RUN_SCRIPT_NAME = "update.sh" ;
1515const SYSUPDATES_RUN_SCRIPT_PATH = "/ssd/sysupdates/" ++ SYSUPDATES_RUN_SCRIPT_NAME ;
16+ const SYSUPDATES_DEFAULT_URL = "https://github.com/nakamochi/sysupdates.git" ;
1617
1718/// must be the same as https://github.com/nakamochi/sysupdates/tree/master/lnd
1819pub const LND_OS_USER = "lnd" ;
@@ -47,6 +48,7 @@ pub const Data = struct {
4748 bcrypt_hash : []const u8 , // std.crypto.bcrypt .phc format
4849 incorrect_attempts : u8 , // reset after each successful unlock
4950 } = null ,
51+ sysurl : []const u8 ,
5052 syschannel : SysupdatesChannel ,
5153 syscronscript : []const u8 ,
5254 sysrunscript : []const u8 ,
@@ -105,27 +107,50 @@ fn initData(allocator: std.mem.Allocator, filepath: []const u8) !Data {
105107}
106108
107109fn inferData () Data {
110+ const sysupdates_channel_data = inferSysupdatesChannel (SYSUPDATES_CRON_SCRIPT_PATH );
108111 return .{
109- .syschannel = inferSysupdatesChannel (SYSUPDATES_CRON_SCRIPT_PATH ),
112+ .sysurl = sysupdates_channel_data .url ,
113+ .syschannel = sysupdates_channel_data .channel ,
110114 .syscronscript = SYSUPDATES_CRON_SCRIPT_PATH ,
111115 .sysrunscript = SYSUPDATES_RUN_SCRIPT_PATH ,
112116 };
113117}
114118
115- fn inferSysupdatesChannel (cron_script_path : []const u8 ) SysupdatesChannel {
119+ fn inferSysupdatesChannel (cron_script_path : []const u8 ) struct { url : [] const u8 , channel : SysupdatesChannel } {
116120 var buf : [1024 ]u8 = undefined ;
117- const bytes = std .fs .cwd ().readFile (cron_script_path , & buf ) catch return .master ;
121+ const bytes = std .fs .cwd ().readFile (cron_script_path , & buf )
122+ catch return .{ .url = SYSUPDATES_DEFAULT_URL , .channel = .master };
118123 var it = std .mem .tokenizeScalar (u8 , bytes , '\n ' );
119- // looking for "/ssd/sysupdates/update.sh <channel>?" where <channel> may be in quotes
124+ // looking for "/ssd/sysupdates/update.sh [ <channel> [<url>]]", both may be in quotes
120125 const needle = SYSUPDATES_RUN_SCRIPT_NAME ;
121126 while (it .next ()) | line | {
122127 if (std .mem .indexOf (u8 , line , needle )) | i | {
123128 var s = line [i + needle .len .. ];
124- s = std .mem .trim (u8 , s , " \n '\" " );
125- return std .meta .stringToEnum (SysupdatesChannel , s ) orelse .master ;
129+ const spacepos = std .mem .indexOf (u8 , s , " " );
130+ if (spacepos == null ) {
131+ s = std .mem .trim (u8 , s , "\n '\" " );
132+ const channel = std .meta .stringToEnum (SysupdatesChannel , s )
133+ orelse return .{ .url = SYSUPDATES_DEFAULT_URL , .channel = .master };
134+ return .{ .url = SYSUPDATES_DEFAULT_URL , .channel = channel };
135+ }
136+ else {
137+ var it2 = std .mem .tokenizeScalar (u8 , s , ' ' );
138+ var channelstr = it2 .next ();
139+ if (channelstr == null ) {
140+ break ;
141+ }
142+ channelstr = std .mem .trim (u8 , channelstr .? , "\n '\" " );
143+ const channel = std .meta .stringToEnum (SysupdatesChannel , channelstr .? ) orelse .master ;
144+ var url = it2 .next ();
145+ if (url == null ) {
146+ return .{ .url = SYSUPDATES_DEFAULT_URL , .channel = channel };
147+ }
148+ url = std .mem .trim (u8 , url .? , "\n '\" " );
149+ return .{ .url = url .? , .channel = channel };
150+ }
126151 }
127152 }
128- return .master ;
153+ return .{ . url = SYSUPDATES_DEFAULT_URL , . channel = . master } ;
129154}
130155
131156fn inferStaticData (allocator : std.mem.Allocator ) ! StaticData {
@@ -509,6 +534,7 @@ test "ndconfig: init existing" {
509534 defer tmp .cleanup ();
510535 try tmp .dir .writeFile ("conf.json" ,
511536 \\{
537+ \\"sysurl": "https://github.com/nakamochi/sysupdates.git",
512538 \\"syschannel": "dev",
513539 \\"syscronscript": "/cron/sysupdates.sh",
514540 \\"sysrunscript": "/sysupdates/run.sh"
@@ -546,6 +572,7 @@ test "ndconfig: dump" {
546572 .arena = & conf_arena ,
547573 .confpath = confpath ,
548574 .data = .{
575+ .sysurl = SYSUPDATES_DEFAULT_URL ,
549576 .syschannel = .master ,
550577 .syscronscript = "cronscript.sh" ,
551578 .sysrunscript = "runscript.sh" ,
@@ -579,6 +606,7 @@ test "ndconfig: switch sysupdates and infer" {
579606 .arena = & conf_arena ,
580607 .confpath = confpath ,
581608 .data = .{
609+ .sysurl = SYSUPDATES_DEFAULT_URL ,
582610 .syschannel = .master ,
583611 .syscronscript = cronscript ,
584612 .sysrunscript = SYSUPDATES_RUN_SCRIPT_PATH ,
@@ -591,7 +619,7 @@ test "ndconfig: switch sysupdates and infer" {
591619 const parsed = try testLoadConfigData (confpath );
592620 defer parsed .deinit ();
593621 try t .expectEqual (SysupdatesChannel .dev , parsed .value .syschannel );
594- try t .expectEqual (SysupdatesChannel .dev , inferSysupdatesChannel (cronscript ));
622+ try t .expectEqual (SysupdatesChannel .dev , inferSysupdatesChannel (cronscript ). channel );
595623}
596624
597625test "ndconfig: switch sysupdates with .run=true" {
@@ -618,6 +646,7 @@ test "ndconfig: switch sysupdates with .run=true" {
618646 .arena = conf_arena ,
619647 .confpath = try tmp .join (&.{"conf.json" }),
620648 .data = .{
649+ .sysurl = SYSUPDATES_DEFAULT_URL ,
621650 .syschannel = .master ,
622651 .syscronscript = try tmp .join (&.{"cronscript.sh" }),
623652 .sysrunscript = try tmp .join (&.{runscript }),
@@ -653,6 +682,7 @@ test "ndconfig: genLndConfig" {
653682 .arena = conf_arena ,
654683 .confpath = undefined , // unused
655684 .data = .{
685+ .sysurl = SYSUPDATES_DEFAULT_URL ,
656686 .syschannel = .master , // unused
657687 .syscronscript = undefined , // unused
658688 .sysrunscript = undefined , // unused
@@ -756,6 +786,7 @@ test "ndconfig: screen lock" {
756786 const confpath = try tmp .join (&.{"conf.json" });
757787 try tmp .dir .writeFile (confpath ,
758788 \\{
789+ \\"sysurl": "https://github.com/nakamochi/sysupdates.git",
759790 \\"syschannel": "dev",
760791 \\"syscronscript": "/cron/sysupdates.sh",
761792 \\"sysrunscript": "/sysupdates/run.sh"
@@ -774,6 +805,7 @@ test "ndconfig: screen lock" {
774805 try tmp .dir .writeFile (confpath ,
775806 \\{
776807 \\"slock": null,
808+ \\"sysurl": "https://github.com/nakamochi/sysupdates.git",
777809 \\"syschannel": "dev",
778810 \\"syscronscript": "/cron/sysupdates.sh",
779811 \\"sysrunscript": "/sysupdates/run.sh"
@@ -793,6 +825,7 @@ test "ndconfig: screen lock" {
793825 .confpath = newpinconf ,
794826 .data = .{
795827 .slock = null ,
828+ .sysurl = SYSUPDATES_DEFAULT_URL ,
796829 .syschannel = .master , // unused
797830 .syscronscript = undefined , // unused
798831 .sysrunscript = undefined , // unused
0 commit comments