cloudron 7.0.1 → 7.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cloudron +2 -1
- package/bin/cloudron-build +1 -1
- package/package.json +1 -1
- package/src/actions.js +70 -64
- package/src/appstore-actions.js +2 -2
- package/src/build-actions.js +36 -24
- package/src/config.js +6 -6
- package/src/versions-actions.js +1 -1
- package/udo apt update +549 -0
package/bin/cloudron
CHANGED
|
@@ -19,7 +19,7 @@ program.version(pkg.version);
|
|
|
19
19
|
// global options
|
|
20
20
|
program.option('--server <server>', 'Cloudron domain')
|
|
21
21
|
.option('--token <token>', 'Cloudron token')
|
|
22
|
-
.option('--allow-selfsigned', 'Accept self signed SSL certificate')
|
|
22
|
+
.option('--allow-selfsigned', 'Accept self signed SSL certificate') // do not removed, used in e2e!
|
|
23
23
|
.option('--accept-selfsigned', 'Accept self signed SSL certificate')
|
|
24
24
|
.option('--no-wait', 'Do not wait for the operation to finish');
|
|
25
25
|
|
|
@@ -165,6 +165,7 @@ program.command('install')
|
|
|
165
165
|
.option('-a, --alias-domains [domain,...]', 'Alias domains')
|
|
166
166
|
.option('-m, --memory-limit [domain,...]', 'Memory Limit (e.g 1.5G, 512M)')
|
|
167
167
|
.option('--appstore-id <appid[@version]>', 'Use app from the store')
|
|
168
|
+
.option('--versions-url <url>', 'Install community app from CloudronVersions.json URL')
|
|
168
169
|
.option('--no-sso', 'Disable Cloudron SSO [false]')
|
|
169
170
|
.option('--debug [cmd...]', 'Enable debug mode', false)
|
|
170
171
|
.option('--readonly', 'Mount filesystem readonly. Default is read/write in debug mode.')
|
package/bin/cloudron-build
CHANGED
|
@@ -26,7 +26,7 @@ program.command('build', { isDefault: true })
|
|
|
26
26
|
.description('Build an app. This is the default subcommand')
|
|
27
27
|
.option('--build-arg <namevalue>', 'Build arg passed to docker. Can be used multiple times', collectArgs, [])
|
|
28
28
|
.option('-f, --file <dockerfile>', 'Name of the Dockerfile')
|
|
29
|
-
.option('--
|
|
29
|
+
.option('--repository [repository url]', 'Change the repository. This url is stored for future builds for this project. e.g registry/username/projectname')
|
|
30
30
|
.option('--no-cache', 'Do not use cache')
|
|
31
31
|
.option('--no-push', 'Do not push built image to registry')
|
|
32
32
|
.option('--raw', 'Raw output build log')
|
package/package.json
CHANGED
package/src/actions.js
CHANGED
|
@@ -103,35 +103,13 @@ async function stopActiveTask(app, options) {
|
|
|
103
103
|
if (response.status !== 204) throw `Failed to stop active task: ${requestError(response)}`;
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
assert.strictEqual(typeof options, 'object');
|
|
109
|
-
|
|
110
|
-
const response = await createRequest('GET', '/api/v1/apps', options);
|
|
111
|
-
if (response.status !== 200) throw new Error(`Failed to install app: ${requestError(response)}`);
|
|
112
|
-
|
|
113
|
-
const matchingApps = response.body.apps.filter(function (app) {
|
|
114
|
-
return !app.appStoreId && app.manifest.dockerImage.startsWith(repository); // never select apps from the store
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
if (matchingApps.length === 0) return [ ];
|
|
118
|
-
if (matchingApps.length === 1) return matchingApps[0];
|
|
119
|
-
|
|
120
|
-
console.log();
|
|
121
|
-
console.log('Available apps using same repository %s:', repository);
|
|
122
|
-
matchingApps.sort(function (a, b) { return a.fqdn < b.fqdn ? -1 : 1; });
|
|
123
|
-
matchingApps.forEach(function (app, index) {
|
|
124
|
-
console.log('[%s]\t%s', index, app.fqdn);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
let index;
|
|
128
|
-
while (true) {
|
|
129
|
-
index = parseInt(await readline.question('Choose app [0-' + (matchingApps.length-1) + ']: ', {}), 10);
|
|
130
|
-
if (isNaN(index) || index < 0 || index > matchingApps.length-1) console.log('Invalid selection');
|
|
131
|
-
else break;
|
|
132
|
-
}
|
|
106
|
+
function saveCwdAppId(appId, manifestFilePath) {
|
|
107
|
+
if (!manifestFilePath) return;
|
|
133
108
|
|
|
134
|
-
|
|
109
|
+
const sourceDir = path.dirname(manifestFilePath);
|
|
110
|
+
const cwdConfig = config.getCwdConfig(sourceDir);
|
|
111
|
+
cwdConfig.appId = appId;
|
|
112
|
+
config.setCwdConfig(sourceDir, cwdConfig);
|
|
135
113
|
}
|
|
136
114
|
|
|
137
115
|
// appId may be the appId or the location
|
|
@@ -140,20 +118,19 @@ async function getApp(options) {
|
|
|
140
118
|
|
|
141
119
|
const app = options.app || null;
|
|
142
120
|
|
|
143
|
-
if (!app) {
|
|
121
|
+
if (!app) {
|
|
144
122
|
const manifestFilePath = locateManifest();
|
|
145
|
-
|
|
146
123
|
if (!manifestFilePath) throw new Error(NO_APP_FOUND_ERROR_STRING);
|
|
147
124
|
|
|
148
125
|
const sourceDir = path.dirname(manifestFilePath);
|
|
149
|
-
const
|
|
126
|
+
const cwdConfig = config.getCwdConfig(sourceDir);
|
|
150
127
|
|
|
151
|
-
if (!
|
|
128
|
+
if (!cwdConfig.appId) throw new Error(NO_APP_FOUND_ERROR_STRING);
|
|
152
129
|
|
|
153
|
-
const
|
|
154
|
-
if (
|
|
130
|
+
const response = await createRequest('GET', `/api/v1/apps/${cwdConfig.appId}`, options);
|
|
131
|
+
if (response.status !== 200) throw new Error(NO_APP_FOUND_ERROR_STRING);
|
|
155
132
|
|
|
156
|
-
return
|
|
133
|
+
return response.body;
|
|
157
134
|
} else if (app.match(/.{8}-.{4}-.{4}-.{4}-.{8}/)) { // it is an id
|
|
158
135
|
const response = await createRequest('GET', `/api/v1/apps/${app}`, options);
|
|
159
136
|
if (response.status !== 200) throw new Error(`Failed to get app: ${requestError(response)}`);
|
|
@@ -554,34 +531,46 @@ async function install(localOptions, cmd) {
|
|
|
554
531
|
const options = cmd.optsWithGlobals();
|
|
555
532
|
|
|
556
533
|
try {
|
|
557
|
-
|
|
558
|
-
const { manifest, manifestFilePath } = result;
|
|
559
|
-
|
|
534
|
+
let manifest = null, manifestFilePath = null, versionsUrl = null;
|
|
560
535
|
let sourceArchiveFilePath = null; // will be set if we need to send a tarball
|
|
561
536
|
|
|
562
|
-
if (
|
|
563
|
-
const
|
|
564
|
-
const
|
|
537
|
+
if (options.versionsUrl) {
|
|
538
|
+
const [url, version] = options.versionsUrl.split('@');
|
|
539
|
+
const request = createRequest('GET', `/api/v1/community/app?url=${encodeURIComponent(url)}&version=${encodeURIComponent(version || 'latest')}`, options);
|
|
540
|
+
const response = await request;
|
|
541
|
+
if (response.status !== 200) return exit(`Failed to get community app: ${requestError(response)}`);
|
|
565
542
|
|
|
566
|
-
|
|
567
|
-
|
|
543
|
+
manifest = response.body.manifest;
|
|
544
|
+
versionsUrl = response.body.versionsUrl;
|
|
545
|
+
} else {
|
|
546
|
+
const result = await getManifest(options.appstoreId || '');
|
|
547
|
+
manifest = result.manifest;
|
|
548
|
+
manifestFilePath = result.manifestFilePath;
|
|
568
549
|
|
|
569
|
-
|
|
570
|
-
const
|
|
550
|
+
if (!manifest.dockerImage) { // not a manifest from appstore
|
|
551
|
+
const sourceDir = path.dirname(manifestFilePath);
|
|
552
|
+
const image = options.image || config.getCwdConfig(sourceDir).dockerImage;
|
|
571
553
|
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
return ignoreMatcher(name.slice(sourceDir.length + 1)); // make name as relative path
|
|
575
|
-
}
|
|
576
|
-
});
|
|
554
|
+
if (!image) {
|
|
555
|
+
console.log('No build detected. This package will be built on the server.');
|
|
577
556
|
|
|
578
|
-
|
|
579
|
-
|
|
557
|
+
const dockerignoreFilePath = path.join(sourceDir, '.dockerignore');
|
|
558
|
+
const ignoreMatcher = dockerignoreMatcher(dockerignoreFilePath);
|
|
580
559
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
560
|
+
const tarStream = tar.pack(sourceDir, {
|
|
561
|
+
ignore: function (name) {
|
|
562
|
+
return ignoreMatcher(name.slice(sourceDir.length + 1)); // make name as relative path
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
sourceArchiveFilePath = path.join(os.tmpdir(), `cloudron-source-${Date.now()}.tar`);
|
|
567
|
+
const sourceArchiveStream = fs.createWriteStream(sourceArchiveFilePath);
|
|
568
|
+
|
|
569
|
+
const [tarError] = await safe(stream.pipeline(tarStream, sourceArchiveStream));
|
|
570
|
+
if (tarError) return exit(`Could not create source archive: ${tarError.message}`);
|
|
571
|
+
} else {
|
|
572
|
+
manifest.dockerImage = image;
|
|
573
|
+
}
|
|
585
574
|
}
|
|
586
575
|
}
|
|
587
576
|
|
|
@@ -600,10 +589,10 @@ async function install(localOptions, cmd) {
|
|
|
600
589
|
const tmp = kv.split('=');
|
|
601
590
|
secondaryDomains[tmp[0]] = await selectDomain(tmp[1], options);
|
|
602
591
|
}
|
|
603
|
-
} else {
|
|
592
|
+
} else if (manifest) {
|
|
604
593
|
secondaryDomains = await querySecondaryDomains(null /* existing app */, manifest, options);
|
|
605
594
|
}
|
|
606
|
-
} else if (manifest.httpPorts) { // just put in defaults
|
|
595
|
+
} else if (manifest && manifest.httpPorts) { // just put in defaults
|
|
607
596
|
for (const env in manifest.httpPorts) {
|
|
608
597
|
secondaryDomains[env] = await selectDomain(manifest.httpPorts[env].defaultValue, options);
|
|
609
598
|
}
|
|
@@ -629,10 +618,10 @@ async function install(localOptions, cmd) {
|
|
|
629
618
|
if (isNaN(parseInt(tmp[1], 10))) return; // disable the port
|
|
630
619
|
ports[tmp[0]] = parseInt(tmp[1], 10);
|
|
631
620
|
});
|
|
632
|
-
} else {
|
|
621
|
+
} else if (manifest) {
|
|
633
622
|
ports = await queryPortBindings(null /* existing app */, manifest);
|
|
634
623
|
}
|
|
635
|
-
} else { // just put in defaults
|
|
624
|
+
} else if (manifest) { // just put in defaults
|
|
636
625
|
const allPorts = Object.assign({}, manifest.tcpPorts, manifest.udpPorts);
|
|
637
626
|
for (const portName in allPorts) {
|
|
638
627
|
ports[portName] = allPorts[portName].defaultValue;
|
|
@@ -655,7 +644,6 @@ async function install(localOptions, cmd) {
|
|
|
655
644
|
|
|
656
645
|
const data = {
|
|
657
646
|
appStoreId: options.appstoreId || '', // note case change
|
|
658
|
-
manifest: options.appstoreId ? null : manifest, // cloudron ignores manifest anyway if appStoreId is set
|
|
659
647
|
location: domainObject.subdomain, // LEGACY
|
|
660
648
|
subdomain: domainObject.subdomain,
|
|
661
649
|
domain: domainObject.domain,
|
|
@@ -667,8 +655,14 @@ async function install(localOptions, cmd) {
|
|
|
667
655
|
env
|
|
668
656
|
};
|
|
669
657
|
|
|
658
|
+
if (versionsUrl) {
|
|
659
|
+
data.versionsUrl = versionsUrl;
|
|
660
|
+
} else {
|
|
661
|
+
data.manifest = options.appstoreId ? null : manifest; // cloudron ignores manifest anyway if appStoreId is set
|
|
662
|
+
}
|
|
663
|
+
|
|
670
664
|
// the sso only applies for apps which allow optional sso
|
|
671
|
-
if (manifest.optionalSso) data.sso = options.sso;
|
|
665
|
+
if (manifest && manifest.optionalSso) data.sso = options.sso;
|
|
672
666
|
|
|
673
667
|
if (options.debug) { // 'true' when no args. otherwise, array
|
|
674
668
|
const debugCmd = options.debug === true ? [ '/bin/bash', '-c', 'echo "Repair mode. Use the webterminal or cloudron exec to repair. Sleeping" && sleep infinity' ] : options.debug;
|
|
@@ -680,7 +674,7 @@ async function install(localOptions, cmd) {
|
|
|
680
674
|
options.wait = false; // in debug mode, health check never succeeds
|
|
681
675
|
}
|
|
682
676
|
|
|
683
|
-
if (!options.appstoreId && manifest.icon) {
|
|
677
|
+
if (!options.appstoreId && !options.versionsUrl && manifest && manifest.icon) {
|
|
684
678
|
let iconFilename = manifest.icon.slice(0, 7) === 'file://' ? manifest.icon.slice(7) : manifest.icon;
|
|
685
679
|
iconFilename = path.resolve(path.dirname(manifestFilePath), iconFilename); // resolve filename wrt manifest
|
|
686
680
|
data.icon = safe.fs.readFileSync(iconFilename, { encoding: 'base64' });
|
|
@@ -720,6 +714,8 @@ async function install(localOptions, cmd) {
|
|
|
720
714
|
|
|
721
715
|
const appId = response.body.id;
|
|
722
716
|
|
|
717
|
+
saveCwdAppId(appId, manifestFilePath);
|
|
718
|
+
|
|
723
719
|
console.log('App is being installed.');
|
|
724
720
|
|
|
725
721
|
if (!options.wait) return;
|
|
@@ -841,7 +837,7 @@ async function update(localOptions, cmd) {
|
|
|
841
837
|
|
|
842
838
|
if (!manifest.dockerImage) { // not a manifest from appstore
|
|
843
839
|
const sourceDir = path.dirname(manifestFilePath);
|
|
844
|
-
const image = options.image || config.
|
|
840
|
+
const image = options.image || config.getCwdConfig(sourceDir).dockerImage;
|
|
845
841
|
|
|
846
842
|
if (!image) {
|
|
847
843
|
console.log('No docker image detected. Creating source archive from this folder.');
|
|
@@ -900,6 +896,8 @@ async function update(localOptions, cmd) {
|
|
|
900
896
|
}
|
|
901
897
|
if (response.status !== 202) return exit(`Failed to update app: ${requestError(response)}`);
|
|
902
898
|
|
|
899
|
+
saveCwdAppId(app.id, manifestFilePath);
|
|
900
|
+
|
|
903
901
|
process.stdout.write('\n => ' + 'Waiting for app to be updated ');
|
|
904
902
|
|
|
905
903
|
await waitForFinishInstallation(app.id, response.body.taskId, options);
|
|
@@ -1007,6 +1005,14 @@ async function uninstall(localOptions, cmd) {
|
|
|
1007
1005
|
await waitForTask(response.body.taskId, options);
|
|
1008
1006
|
const response2 = await createRequest('GET', `/api/v1/apps/${app.id}`, options);
|
|
1009
1007
|
if (response2.status === 404) {
|
|
1008
|
+
const manifestFilePath = locateManifest();
|
|
1009
|
+
if (manifestFilePath) {
|
|
1010
|
+
const sourceDir = path.dirname(manifestFilePath);
|
|
1011
|
+
const cwdConfig = config.getCwdConfig(sourceDir);
|
|
1012
|
+
delete cwdConfig.appId;
|
|
1013
|
+
config.setCwdConfig(sourceDir, cwdConfig);
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1010
1016
|
console.log('\n\nApp %s successfully uninstalled.', app.fqdn);
|
|
1011
1017
|
} else if (response2.body.installationState === 'error') {
|
|
1012
1018
|
console.log('\n\nApp uninstallation failed.\n');
|
package/src/appstore-actions.js
CHANGED
|
@@ -235,7 +235,7 @@ async function verifyManifest(localOptions, cmd) {
|
|
|
235
235
|
const manifest = result.manifest;
|
|
236
236
|
|
|
237
237
|
const sourceDir = path.dirname(manifestFilePath);
|
|
238
|
-
const appConfig = config.
|
|
238
|
+
const appConfig = config.getCwdConfig(sourceDir);
|
|
239
239
|
|
|
240
240
|
// image can be passed in options for buildbot
|
|
241
241
|
if (options.image) {
|
|
@@ -282,7 +282,7 @@ async function upload(localOptions, cmd) {
|
|
|
282
282
|
const manifest = result.manifest;
|
|
283
283
|
|
|
284
284
|
const sourceDir = path.dirname(manifestFilePath);
|
|
285
|
-
const appConfig = config.
|
|
285
|
+
const appConfig = config.getCwdConfig(sourceDir);
|
|
286
286
|
|
|
287
287
|
// image can be passed in options for buildbot
|
|
288
288
|
if (options.image) {
|
package/src/build-actions.js
CHANGED
|
@@ -16,6 +16,20 @@ import stream from 'stream/promises';
|
|
|
16
16
|
import superagent from '@cloudron/superagent';
|
|
17
17
|
import tar from 'tar-fs';
|
|
18
18
|
|
|
19
|
+
function getEffectiveBuildServiceConfig(options) {
|
|
20
|
+
const buildServiceConfig = config.getBuildServiceConfig();
|
|
21
|
+
|
|
22
|
+
if (options.buildServiceUrl) {
|
|
23
|
+
buildServiceConfig.type = 'remote';
|
|
24
|
+
buildServiceConfig.url = options.buildServiceUrl;
|
|
25
|
+
if (buildServiceConfig.url.indexOf('://') === -1) buildServiceConfig.url = `https://${buildServiceConfig.url}`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (options.buildServiceToken) buildServiceConfig.token = options.buildServiceToken;
|
|
29
|
+
|
|
30
|
+
return buildServiceConfig;
|
|
31
|
+
}
|
|
32
|
+
|
|
19
33
|
function requestError(response) {
|
|
20
34
|
if (response.status === 401 || response.status === 403) return 'Invalid token. Use cloudron build login again.';
|
|
21
35
|
|
|
@@ -26,9 +40,9 @@ function requestError(response) {
|
|
|
26
40
|
async function login(localOptions, cmd) {
|
|
27
41
|
const options = cmd.optsWithGlobals();
|
|
28
42
|
|
|
29
|
-
const buildServiceConfig =
|
|
43
|
+
const buildServiceConfig = getEffectiveBuildServiceConfig(options);
|
|
30
44
|
|
|
31
|
-
let url =
|
|
45
|
+
let url = buildServiceConfig.url;
|
|
32
46
|
if (!url) {
|
|
33
47
|
url = await readline.question('Build Service URL: ', {});
|
|
34
48
|
if (!url) return exit('No build service URL provided.');
|
|
@@ -37,7 +51,7 @@ async function login(localOptions, cmd) {
|
|
|
37
51
|
|
|
38
52
|
console.log(`Build Service login (${url}):`);
|
|
39
53
|
|
|
40
|
-
const token =
|
|
54
|
+
const token = buildServiceConfig.token || await readline.question('Token: ', {});
|
|
41
55
|
|
|
42
56
|
const response = await superagent.get(`${url}/api/v1/profile`).query({ accessToken: token }).ok(() => true);
|
|
43
57
|
if (response.status === 401 || response.status === 403) return exit(`Authentication error: ${requestError(response)}`);
|
|
@@ -188,11 +202,11 @@ async function buildLocal(manifest, sourceDir, appConfig, options) {
|
|
|
188
202
|
|
|
189
203
|
appConfig.dockerImage = dockerImage;
|
|
190
204
|
appConfig.dockerImageSha256 = match[1]; // stash this separately for now
|
|
191
|
-
config.
|
|
205
|
+
config.setCwdConfig(sourceDir, appConfig);
|
|
192
206
|
}
|
|
193
207
|
|
|
194
|
-
async function buildRemote(manifest, sourceDir, appConfig, options) {
|
|
195
|
-
console.log('Using build service',
|
|
208
|
+
async function buildRemote(manifest, sourceDir, appConfig, options, buildServiceConfig) {
|
|
209
|
+
console.log('Using build service', buildServiceConfig.url);
|
|
196
210
|
|
|
197
211
|
let tag;
|
|
198
212
|
if (options.tag) {
|
|
@@ -211,8 +225,6 @@ async function buildRemote(manifest, sourceDir, appConfig, options) {
|
|
|
211
225
|
else if (fs.existsSync(`${sourceDir}/Dockerfile.cloudron`)) dockerfile = 'Dockerfile.cloudron';
|
|
212
226
|
else if (fs.existsSync(`${sourceDir}/cloudron/Dockerfile`)) dockerfile = 'cloudron/Dockerfile';
|
|
213
227
|
|
|
214
|
-
const buildServiceConfig = config.getBuildServiceConfig();
|
|
215
|
-
|
|
216
228
|
console.log(`Building ${dockerfile} as ${dockerImage}`);
|
|
217
229
|
|
|
218
230
|
const sourceArchiveFilePath = path.join(os.tmpdir(), path.basename(sourceDir) + '.tar.gz');
|
|
@@ -260,7 +272,7 @@ async function buildRemote(manifest, sourceDir, appConfig, options) {
|
|
|
260
272
|
|
|
261
273
|
appConfig.dockerImage = dockerImage;
|
|
262
274
|
// appConfig.dockerImageSha256 = match[1]; // stash this separately for now
|
|
263
|
-
config.
|
|
275
|
+
config.setCwdConfig(sourceDir, appConfig);
|
|
264
276
|
|
|
265
277
|
console.log(`Docker image: ${dockerImage}`);
|
|
266
278
|
console.log('\nBuild successful');
|
|
@@ -281,13 +293,13 @@ async function build(localOptions, cmd) {
|
|
|
281
293
|
const manifest = result.manifest;
|
|
282
294
|
const sourceDir = path.dirname(manifestFilePath);
|
|
283
295
|
|
|
284
|
-
const appConfig = config.
|
|
285
|
-
const buildServiceConfig =
|
|
296
|
+
const appConfig = config.getCwdConfig(sourceDir);
|
|
297
|
+
const buildServiceConfig = getEffectiveBuildServiceConfig(options);
|
|
286
298
|
|
|
287
299
|
let repository = appConfig.repository;
|
|
288
|
-
if (!repository || options.
|
|
289
|
-
if (typeof options.
|
|
290
|
-
repository = options.
|
|
300
|
+
if (!repository || options.repository) {
|
|
301
|
+
if (typeof options.repository === 'string') {
|
|
302
|
+
repository = options.repository;
|
|
291
303
|
} else {
|
|
292
304
|
repository = await readline.question(`Enter docker repository (e.g registry/username/${manifest.id || path.basename(sourceDir)}): `, {});
|
|
293
305
|
if (!repository) exit('No repository provided');
|
|
@@ -298,12 +310,12 @@ async function build(localOptions, cmd) {
|
|
|
298
310
|
if (parts.length > 1) exit(`repository should not be a URL. Try again without ${parts[0]}://`);
|
|
299
311
|
|
|
300
312
|
appConfig.repository = repository;
|
|
301
|
-
config.
|
|
313
|
+
config.setCwdConfig(sourceDir, appConfig);
|
|
302
314
|
}
|
|
303
315
|
|
|
304
316
|
appConfig.gitCommit = execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim(); // when the build gets saved, save the gitCommit also
|
|
305
317
|
if (buildServiceConfig.type === 'remote' && buildServiceConfig.url) {
|
|
306
|
-
await buildRemote(manifest, sourceDir, appConfig, options);
|
|
318
|
+
await buildRemote(manifest, sourceDir, appConfig, options, buildServiceConfig);
|
|
307
319
|
} else {
|
|
308
320
|
await buildLocal(manifest, sourceDir, appConfig, options);
|
|
309
321
|
}
|
|
@@ -312,7 +324,7 @@ async function build(localOptions, cmd) {
|
|
|
312
324
|
async function logs(localOptions, cmd) {
|
|
313
325
|
const options = cmd.optsWithGlobals();
|
|
314
326
|
|
|
315
|
-
const buildServiceConfig =
|
|
327
|
+
const buildServiceConfig = getEffectiveBuildServiceConfig(options);
|
|
316
328
|
if (buildServiceConfig.type !== 'remote') return exit('This command only works with the build service. Use cloudron build login first.');
|
|
317
329
|
|
|
318
330
|
if (!options.id) return exit('buildId is required');
|
|
@@ -324,7 +336,7 @@ async function logs(localOptions, cmd) {
|
|
|
324
336
|
async function status(localOptions, cmd) {
|
|
325
337
|
const options = cmd.optsWithGlobals();
|
|
326
338
|
|
|
327
|
-
const buildServiceConfig =
|
|
339
|
+
const buildServiceConfig = getEffectiveBuildServiceConfig(options);
|
|
328
340
|
if (buildServiceConfig.type !== 'remote') return exit('This command only works with the build service. Use cloudron build login first.');
|
|
329
341
|
|
|
330
342
|
if (!options.id) return exit('buildId is required');
|
|
@@ -337,7 +349,7 @@ async function status(localOptions, cmd) {
|
|
|
337
349
|
async function push(localOptions, cmd) {
|
|
338
350
|
const options = cmd.optsWithGlobals();
|
|
339
351
|
|
|
340
|
-
const buildServiceConfig =
|
|
352
|
+
const buildServiceConfig = getEffectiveBuildServiceConfig(options);
|
|
341
353
|
if (buildServiceConfig.type !== 'remote') return exit('This command only works with the build service. Use cloudron build login first.');
|
|
342
354
|
|
|
343
355
|
if (!options.id) return exit('buildId is required');
|
|
@@ -374,13 +386,13 @@ async function clear(/* localOptions, cmd */) {
|
|
|
374
386
|
|
|
375
387
|
const sourceDir = path.dirname(manifestFilePath);
|
|
376
388
|
|
|
377
|
-
config.
|
|
389
|
+
config.unsetCwdConfig(sourceDir);
|
|
378
390
|
}
|
|
379
391
|
|
|
380
|
-
async function info(
|
|
381
|
-
|
|
392
|
+
async function info(localOptions, cmd) {
|
|
393
|
+
const options = cmd.optsWithGlobals();
|
|
382
394
|
|
|
383
|
-
const buildService =
|
|
395
|
+
const buildService = getEffectiveBuildServiceConfig(options);
|
|
384
396
|
console.log(`Build service type: ${buildService.type || 'local'}`);
|
|
385
397
|
if (buildService.type === 'remote') console.log(`Build service URL: ${buildService.url}`);
|
|
386
398
|
|
|
@@ -389,7 +401,7 @@ async function info(/* localOptions, cmd */) {
|
|
|
389
401
|
if (!manifestFilePath) return exit();
|
|
390
402
|
|
|
391
403
|
const sourceDir = path.dirname(manifestFilePath);
|
|
392
|
-
const appConfig = config.
|
|
404
|
+
const appConfig = config.getCwdConfig(sourceDir);
|
|
393
405
|
|
|
394
406
|
console.log('Build info');
|
|
395
407
|
if (appConfig?.dockerImage) {
|
package/src/config.js
CHANGED
|
@@ -60,9 +60,9 @@ function setAppStoreToken(value) {
|
|
|
60
60
|
set(['appStore', appStoreOrigin().replace('https://', ''), 'token'], value);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
const
|
|
63
|
+
const getCwdConfig = (p) => get(['apps', p]) || {};
|
|
64
|
+
const setCwdConfig = (p, c) => set(['apps', p], c);
|
|
65
|
+
const unsetCwdConfig = (p) => unset(['apps', p]);
|
|
66
66
|
|
|
67
67
|
const getBuildServiceConfig = () => get('buildService') || {};
|
|
68
68
|
const setBuildServiceConfig = (c) => set('buildService', c);
|
|
@@ -94,9 +94,9 @@ export {
|
|
|
94
94
|
appStoreOrigin,
|
|
95
95
|
|
|
96
96
|
// per app
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
getCwdConfig,
|
|
98
|
+
setCwdConfig,
|
|
99
|
+
unsetCwdConfig,
|
|
100
100
|
|
|
101
101
|
// build service
|
|
102
102
|
getBuildServiceConfig,
|
package/src/versions-actions.js
CHANGED
|
@@ -85,7 +85,7 @@ async function addOrUpdate(localOptions, cmd) {
|
|
|
85
85
|
const manifest = result.manifest;
|
|
86
86
|
|
|
87
87
|
const sourceDir = path.dirname(manifestFilePath);
|
|
88
|
-
const appConfig = config.
|
|
88
|
+
const appConfig = config.getCwdConfig(sourceDir);
|
|
89
89
|
|
|
90
90
|
if (options.image) {
|
|
91
91
|
manifest.dockerImage = options.image;
|
package/udo apt update
ADDED
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
[32mauctex[0m/questing,questing 13.2-1.1 all
|
|
2
|
+
integrated document editing environment for TeX etc.
|
|
3
|
+
|
|
4
|
+
[32mbibata-cursor-theme[0m/questing,questing 2.0.6-1 all
|
|
5
|
+
Bibata is open source, compact, and material designed cursor set
|
|
6
|
+
|
|
7
|
+
[32mbig-cursor[0m/questing,questing 3.16 all
|
|
8
|
+
larger mouse cursors for X
|
|
9
|
+
|
|
10
|
+
[32mbreeze[0m/questing,now 4:6.4.5-0ubuntu1 amd64 [installed,automatic]
|
|
11
|
+
Default Plasma theme (Metapackage)
|
|
12
|
+
|
|
13
|
+
[32mbreeze-cursor-theme[0m/questing,questing,now 4:6.4.5-0ubuntu1 all [installed,automatic]
|
|
14
|
+
Default Plasma cursor theme
|
|
15
|
+
|
|
16
|
+
[32mbudgie-hotcorners-applet[0m/questing 1.9.0-1 amd64
|
|
17
|
+
Applet providing hotcorners capabilities for the Budgie Desktop
|
|
18
|
+
|
|
19
|
+
[32mcairo-dock-showmouse-plug-in[0m/questing 3.5.1-1build1 amd64
|
|
20
|
+
Showmouse plug-in Cairo-dock
|
|
21
|
+
|
|
22
|
+
[32mchameleon-cursor-theme[0m/questing,questing 0.5-8 all
|
|
23
|
+
modern but not gaudy X11 mouse theme
|
|
24
|
+
|
|
25
|
+
[32mcomixcursors-lefthanded[0m/questing,questing 0.10.0-1 all
|
|
26
|
+
X11 mouse pointer themes with a comic art feeling (LH, translucent)
|
|
27
|
+
|
|
28
|
+
[32mcomixcursors-lefthanded-opaque[0m/questing,questing 0.10.0-1 all
|
|
29
|
+
X11 mouse pointer themes with a comic art feeling (LH, opaque)
|
|
30
|
+
|
|
31
|
+
[32mcomixcursors-righthanded[0m/questing,questing 0.10.0-1 all
|
|
32
|
+
X11 mouse pointer themes with a comic art feeling (RH, translucent)
|
|
33
|
+
|
|
34
|
+
[32mcomixcursors-righthanded-opaque[0m/questing,questing 0.10.0-1 all
|
|
35
|
+
X11 mouse pointer themes with a comic art feeling (RH, opaque)
|
|
36
|
+
|
|
37
|
+
[32mcrystalcursors[0m/questing,questing 1.1.1-14.1 all
|
|
38
|
+
X11 mouse theme with the crystal look&feel
|
|
39
|
+
|
|
40
|
+
[32mcursor[0m/unknown,now 2.5.26-1772083177 amd64 [installed]
|
|
41
|
+
The AI Code Editor.
|
|
42
|
+
|
|
43
|
+
[32mcursor-nightly[0m/unknown 2.7.0-pre.5.patch.0-1772235562 amd64
|
|
44
|
+
The AI Code Editor.
|
|
45
|
+
|
|
46
|
+
[32mcursor-sandbox-apparmor[0m/unknown,unknown,unknown,now 0.2.0 all [installed]
|
|
47
|
+
AppArmor profile for Cursor sandbox helper (Enterprise)
|
|
48
|
+
|
|
49
|
+
[32mdangen[0m/questing 0.5-7 amd64
|
|
50
|
+
shoot 'em up game where accurate shooting matters
|
|
51
|
+
|
|
52
|
+
[32mdde-qt5integration[0m/questing 5.7.12-1build1 amd64
|
|
53
|
+
Qt5 theme integration for Deepin application
|
|
54
|
+
|
|
55
|
+
[32mdeepin-icon-theme[0m/questing,questing 2025.03.27-1 all
|
|
56
|
+
Icon Theme for Deepin software and Deepin Desktop Environment
|
|
57
|
+
|
|
58
|
+
[32mdmz-cursor-theme[0m/questing,questing,now 0.4.5.3 all [installed,automatic]
|
|
59
|
+
Style neutral, scalable cursor theme
|
|
60
|
+
|
|
61
|
+
[32me-wrapper[0m/questing,questing 0.2-1 all
|
|
62
|
+
invoke your editor, with optional file:lineno handling
|
|
63
|
+
|
|
64
|
+
[32melpa-bar-cursor[0m/questing,questing 2.0-2 all
|
|
65
|
+
switch Emacs block cursor to a bar
|
|
66
|
+
|
|
67
|
+
[32melpa-beacon[0m/questing,questing 1.3.4-3 all
|
|
68
|
+
highlight the cursor whenever the window scrolls
|
|
69
|
+
|
|
70
|
+
[32melpa-cfrs[0m/questing,questing 1.6.0-4 all
|
|
71
|
+
Child-frame based read-string for Emacs
|
|
72
|
+
|
|
73
|
+
[32melpa-crdt[0m/questing,questing 0.3.5-4 all
|
|
74
|
+
collaborative editing environment for Emacs
|
|
75
|
+
|
|
76
|
+
[32melpa-expand-region[0m/questing,questing 1.0.0-2 all
|
|
77
|
+
Increase selected region in Emacs by semantic units
|
|
78
|
+
|
|
79
|
+
[32melpa-org-appear[0m/questing,questing 0.3.0-3 all
|
|
80
|
+
auto-toggle visibility of org mode elements
|
|
81
|
+
|
|
82
|
+
[32melpa-php-mode[0m/questing,questing 1.27.0-1 all
|
|
83
|
+
PHP Mode for GNU Emacs
|
|
84
|
+
|
|
85
|
+
[32mfierce[0m/questing,questing 1.6.0-1 all
|
|
86
|
+
Domain DNS scanner
|
|
87
|
+
|
|
88
|
+
[32mfonts-texgyre[0m/questing,questing 20180621-6 all
|
|
89
|
+
OpenType fonts based on URW Fonts
|
|
90
|
+
|
|
91
|
+
[32mfuse-emulator-gtk[0m/questing 1.6.0+dfsg1-2build4 amd64
|
|
92
|
+
The Free Unix Spectrum Emulator (GTK version)
|
|
93
|
+
|
|
94
|
+
[32mfuse-emulator-sdl[0m/questing 1.6.0+dfsg1-2build4 amd64
|
|
95
|
+
The Free Unix Spectrum Emulator (SDL version)
|
|
96
|
+
|
|
97
|
+
[32mgdl-astrolib[0m/questing,questing 2022.09.12+dfsg-2 all
|
|
98
|
+
Low-level astronomy software for GDL
|
|
99
|
+
|
|
100
|
+
[32mgeany-plugin-addons[0m/questing 2.1+dfsg-2 amd64
|
|
101
|
+
miscellaneous plugins for Geany
|
|
102
|
+
|
|
103
|
+
[32mgeany-plugin-autoclose[0m/questing 2.1+dfsg-2 amd64
|
|
104
|
+
auto-closing plugin for Geany
|
|
105
|
+
|
|
106
|
+
[32mgeany-plugin-automark[0m/questing 2.1+dfsg-2 amd64
|
|
107
|
+
auto-mark plugin for Geany
|
|
108
|
+
|
|
109
|
+
[32mgeany-plugin-doc[0m/questing 2.1+dfsg-2 amd64
|
|
110
|
+
documentation plugin for Geany
|
|
111
|
+
|
|
112
|
+
[32mgeany-plugin-pairtaghighlighter[0m/questing 2.1+dfsg-2 amd64
|
|
113
|
+
tag pair highlighter plugin for Geany
|
|
114
|
+
|
|
115
|
+
[32mgedit-latex-plugin[0m/questing,questing 46.2.2-1 all
|
|
116
|
+
gedit plugin for composing and compiling LaTeX documents
|
|
117
|
+
|
|
118
|
+
[32mgnome-settings-daemon[0m/questing,now 49.0-1ubuntu3 amd64 [installed,automatic]
|
|
119
|
+
daemon handling the GNOME session settings
|
|
120
|
+
|
|
121
|
+
[32mgolang-github-atomicgo-cursor-dev[0m/questing,questing 0.2.0-2 all
|
|
122
|
+
Move the terminal cursor in any direction on every operating system (library)
|
|
123
|
+
|
|
124
|
+
[32mgolang-github-bmatsuo-lmdb-go-dev[0m/questing,questing 1.8.0+git20170215.a14b5a3-4build1 all
|
|
125
|
+
Bindings for the LMDB C library
|
|
126
|
+
|
|
127
|
+
[32mgolang-github-jaguilar-vt100-dev[0m/questing,questing 0.0~git20201024.81de19c-2 all
|
|
128
|
+
raw-mode vt100 screen reader
|
|
129
|
+
|
|
130
|
+
[32mgolang-github-konsorten-go-windows-terminal-sequences-dev[0m/questing,questing 1.0.2-3 all
|
|
131
|
+
Enable support for Windows Terminal Colors
|
|
132
|
+
|
|
133
|
+
[32mgolang-github-tonistiigi-vt100-dev[0m/questing,questing 0.0~git20240514.90bafcd-2 all
|
|
134
|
+
Raw-mode vt100 screen reader (library)
|
|
135
|
+
|
|
136
|
+
[32mgolang-github-vmihailenco-msgpack.v5-dev[0m/questing,questing 5.4.1-1 all
|
|
137
|
+
MessagePack (msgpack.org) encoding for Golang (library)
|
|
138
|
+
|
|
139
|
+
[32mgt5[0m/questing,questing 1.5.0~20111220+bzr29-4 all
|
|
140
|
+
shell program to display visual disk usage with navigation
|
|
141
|
+
|
|
142
|
+
[32mhuman-theme[0m/questing,questing 0.39.3 all
|
|
143
|
+
Human theme
|
|
144
|
+
|
|
145
|
+
[32mhyprcursor-util[0m/questing 0.1.11-1 amd64
|
|
146
|
+
Utility to manipulate hyprcusor and xcursor themes
|
|
147
|
+
|
|
148
|
+
[32micoutils[0m/questing 0.32.3-6 amd64
|
|
149
|
+
Create and extract MS Windows icons and cursors
|
|
150
|
+
|
|
151
|
+
[32minspectrum[0m/questing 0.3.1-1build2 amd64
|
|
152
|
+
tool for visualising captured radio signals
|
|
153
|
+
|
|
154
|
+
[32mjournal-brief[0m/questing,questing 1.1.8-3 all
|
|
155
|
+
Show interesting new systemd journal entries
|
|
156
|
+
|
|
157
|
+
[32mkakoune[0m/questing 2024.05.18-2ubuntu1 amd64
|
|
158
|
+
Vim-inspired, selection-oriented code editor
|
|
159
|
+
|
|
160
|
+
[32mkeynav[0m/questing 0.20180421~git6505bd0d-3.1 amd64
|
|
161
|
+
keyboard-driven mouse cursor mover
|
|
162
|
+
|
|
163
|
+
[32mkmousetool[0m/questing,now 4:25.08.1-0ubuntu1 amd64 [installed,automatic]
|
|
164
|
+
mouse manipulation tool for the disabled
|
|
165
|
+
|
|
166
|
+
[32mknot-resolver[0m/questing 5.7.5-1 amd64
|
|
167
|
+
caching, DNSSEC-validating DNS resolver
|
|
168
|
+
|
|
169
|
+
[32mlibansi-terminal-ocaml[0m/questing 0.8.5-5build4 amd64
|
|
170
|
+
colors and cursor movements for OCaml applications (runtime files)
|
|
171
|
+
|
|
172
|
+
[32mlibansi-terminal-ocaml-dev[0m/questing 0.8.5-5build4 amd64
|
|
173
|
+
colors and cursor movements for OCaml applications (dev files)
|
|
174
|
+
|
|
175
|
+
[32mlibcatalyst-view-csv-perl[0m/questing,questing 1.8-1 all
|
|
176
|
+
CSV view class for the Catalyst web framework
|
|
177
|
+
|
|
178
|
+
[32mlibdbix-class-cursor-cached-perl[0m/questing,questing 1.001004-3 all
|
|
179
|
+
cursor object with built-in caching support
|
|
180
|
+
|
|
181
|
+
[32mlibghc-ansi-terminal-dev[0m/questing 1.0.2-1 amd64
|
|
182
|
+
Simple ANSI terminal support, with Windows compatibility
|
|
183
|
+
|
|
184
|
+
[32mlibghc-ansi-terminal-doc[0m/questing,questing 1.0.2-1 all
|
|
185
|
+
Simple ANSI terminal support, with Windows compatibility; documentation
|
|
186
|
+
|
|
187
|
+
[32mlibghc-ansi-terminal-prof[0m/questing 1.0.2-1 amd64
|
|
188
|
+
Simple ANSI terminal support, with Windows compatibility; profiling libraries
|
|
189
|
+
|
|
190
|
+
[32mlibghc-terminal-progress-bar-dev[0m/questing 0.4.2-2 amd64
|
|
191
|
+
A simple progress bar in the terminal
|
|
192
|
+
|
|
193
|
+
[32mlibghc-terminal-progress-bar-doc[0m/questing,questing 0.4.2-2 all
|
|
194
|
+
A simple progress bar in the terminal; documentation
|
|
195
|
+
|
|
196
|
+
[32mlibghc-terminal-progress-bar-prof[0m/questing 0.4.2-2 amd64
|
|
197
|
+
A simple progress bar in the terminal; profiling libraries
|
|
198
|
+
|
|
199
|
+
[32mlibhyprcursor-dev[0m/questing 0.1.11-1 amd64
|
|
200
|
+
hyprland cursor format, library and utilities (headers)
|
|
201
|
+
|
|
202
|
+
[32mlibhyprcursor0[0m/questing 0.1.11-1 amd64
|
|
203
|
+
hyprland cursor format, library and utilities
|
|
204
|
+
|
|
205
|
+
[32mlibmonospaceif-dev[0m/questing 0.7.15-2.1 amd64
|
|
206
|
+
Interface translating libfizmo output into monospaced text
|
|
207
|
+
|
|
208
|
+
[32mlibmygui-dev[0m/questing 3.4.2+dfsg-1.1build1 amd64
|
|
209
|
+
Fast, simple and flexible GUI for OpenMW - development files
|
|
210
|
+
|
|
211
|
+
[32mlibmygui.ogreplatform0debian1t64[0m/questing 3.4.2+dfsg-1.1build1 amd64
|
|
212
|
+
Fast, simple and flexible GUI - Ogre interface
|
|
213
|
+
|
|
214
|
+
[32mlibmygui.opengl3platform0debian1t64[0m/questing 3.4.2+dfsg-1.1build1 amd64
|
|
215
|
+
Fast, simple and flexible GUI - OpenGL3 interface
|
|
216
|
+
|
|
217
|
+
[32mlibmygui.openglplatform0debian1t64[0m/questing 3.4.2+dfsg-1.1build1 amd64
|
|
218
|
+
Fast, simple and flexible GUI - OpenGL interface
|
|
219
|
+
|
|
220
|
+
[32mlibmyguiengine3debian1t64[0m/questing 3.4.2+dfsg-1.1build1 amd64
|
|
221
|
+
Fast, simple and flexible GUI - shared library
|
|
222
|
+
|
|
223
|
+
[32mlibodbccr2[0m/questing,now 2.3.12-2ubuntu2 amd64 [installed,automatic]
|
|
224
|
+
ODBC Cursor library for Unix
|
|
225
|
+
|
|
226
|
+
[32mlibpaperclips-java[0m/questing,questing 1.0.4-3 all
|
|
227
|
+
Simplified Java Printing Support for SWT
|
|
228
|
+
|
|
229
|
+
[32mlibpaperclips-java-doc[0m/questing,questing 1.0.4-3 all
|
|
230
|
+
Documentation for libpaperclips-java
|
|
231
|
+
|
|
232
|
+
[32mlibrust-cursor-icon-dev[0m/questing 1.1.0-2 amd64
|
|
233
|
+
Cross platform cursor icon type - Rust source code
|
|
234
|
+
|
|
235
|
+
[32mlibrust-hickory-recursor-dev[0m/questing 0.24.1-1 amd64
|
|
236
|
+
*WARNING* This library is experimental - Rust source code
|
|
237
|
+
|
|
238
|
+
[32mlibrust-regex-cursor-dev[0m/questing 0.1.4-1 amd64
|
|
239
|
+
Regex fork that can search discontiguous haystacks - Rust source code
|
|
240
|
+
|
|
241
|
+
[32mlibrust-wayland-cursor-0.29-dev[0m/questing 0.29.5-6 amd64
|
|
242
|
+
Bindings to libwayland-cursor - Rust source code
|
|
243
|
+
|
|
244
|
+
[32mlibrust-wayland-cursor-dev[0m/questing 0.31.11-1 amd64
|
|
245
|
+
Bindings to libwayland-cursor - Rust source code
|
|
246
|
+
|
|
247
|
+
[32mlibrust-xcursor-dev[0m/questing 0.3.4-1 amd64
|
|
248
|
+
Loading XCursor themes - Rust source code
|
|
249
|
+
|
|
250
|
+
[32mlibstartup-notification0[0m/questing,now 0.12-8 amd64 [installed,automatic]
|
|
251
|
+
library for program launch feedback (shared library)
|
|
252
|
+
|
|
253
|
+
[32mlibstartup-notification0-dev[0m/questing 0.12-8 amd64
|
|
254
|
+
library for program launch feedback (development headers)
|
|
255
|
+
|
|
256
|
+
[32mlibt3key-bin[0m/questing 0.2.10-1.1 amd64
|
|
257
|
+
Utilities for working with libt3key terminal descriptions
|
|
258
|
+
|
|
259
|
+
[32mlibt3key-dev[0m/questing 0.2.10-1.1 amd64
|
|
260
|
+
Development files for libt3key
|
|
261
|
+
|
|
262
|
+
[32mlibt3key1[0m/questing 0.2.10-1.1 amd64
|
|
263
|
+
Terminal key sequence database library
|
|
264
|
+
|
|
265
|
+
[32mlibtickit-widget-entry-plugin-completion-perl[0m/questing,questing 0.02-1 all
|
|
266
|
+
word-completion plugin for Tickit::Widget::Entry
|
|
267
|
+
|
|
268
|
+
[32mlibwayland-cursor++1[0m/questing 1.0.0-6 amd64
|
|
269
|
+
wayland compositor infrastructure - cursor library C++ bindings
|
|
270
|
+
|
|
271
|
+
[32mlibwayland-cursor0[0m/questing,now 1.24.0-1build1 amd64 [installed,automatic]
|
|
272
|
+
wayland compositor infrastructure - cursor library
|
|
273
|
+
|
|
274
|
+
[32mlibx11-protocol-other-perl[0m/questing,questing 31-1 all
|
|
275
|
+
miscellaneous X11::Protocol helpers
|
|
276
|
+
|
|
277
|
+
[32mlibxcb-cursor-dev[0m/questing 0.1.5-1 amd64
|
|
278
|
+
utility libraries for X C Binding -- cursor, development files
|
|
279
|
+
|
|
280
|
+
[32mlibxcb-cursor0[0m/questing,now 0.1.5-1 amd64 [installed]
|
|
281
|
+
utility libraries for X C Binding -- cursor
|
|
282
|
+
|
|
283
|
+
[32mlibxcursor-dev[0m/questing 1:1.2.3-1 amd64
|
|
284
|
+
X cursor management library (development files)
|
|
285
|
+
|
|
286
|
+
[32mlibxcursor1[0m/questing,now 1:1.2.3-1 amd64 [installed,automatic]
|
|
287
|
+
X cursor management library
|
|
288
|
+
|
|
289
|
+
[32mlibxfixes-dev[0m/questing 1:6.0.0-2build1 amd64
|
|
290
|
+
X11 miscellaneous 'fixes' extension library (development headers)
|
|
291
|
+
|
|
292
|
+
[32mlibxfixes3[0m/questing,now 1:6.0.0-2build1 amd64 [installed,automatic]
|
|
293
|
+
X11 miscellaneous 'fixes' extension library
|
|
294
|
+
|
|
295
|
+
[32mlibxmlbeans-java[0m/questing,questing 4.0.0-2 all
|
|
296
|
+
Java library for accessing XML by binding it to Java types
|
|
297
|
+
|
|
298
|
+
[32mlibzed-ocaml[0m/questing 3.2.3-1build6 amd64
|
|
299
|
+
abstract engine for text edition in OCaml (runtime)
|
|
300
|
+
|
|
301
|
+
[32mlibzed-ocaml-dev[0m/questing 3.2.3-1build6 amd64
|
|
302
|
+
abstract engine for text edition in OCaml (development tools)
|
|
303
|
+
|
|
304
|
+
[32mliquidwar[0m/questing 5.6.5-2.1 amd64
|
|
305
|
+
truly original multiplayer wargame
|
|
306
|
+
|
|
307
|
+
[32mliquidwar-data[0m/questing,questing 5.6.5-2.1 all
|
|
308
|
+
data files for Liquid War
|
|
309
|
+
|
|
310
|
+
[32mliquidwar-server[0m/questing 5.6.5-2.1 amd64
|
|
311
|
+
Liquid War server
|
|
312
|
+
|
|
313
|
+
[32mmate-settings-daemon[0m/questing 1.26.1-1.2 amd64
|
|
314
|
+
daemon handling the MATE session settings
|
|
315
|
+
|
|
316
|
+
[32mmate-settings-daemon-common[0m/questing,questing 1.26.1-1.2 all
|
|
317
|
+
daemon handling the MATE session settings (common files)
|
|
318
|
+
|
|
319
|
+
[32mmate-settings-daemon-dev[0m/questing 1.26.1-1.2 amd64
|
|
320
|
+
daemon handling the MATE session settings (development files)
|
|
321
|
+
|
|
322
|
+
[32mmle[0m/questing 1.7.2-1 amd64
|
|
323
|
+
flexible terminal-based editor
|
|
324
|
+
|
|
325
|
+
[32mmygui-doc[0m/questing,questing 3.4.2+dfsg-1.1build1 all
|
|
326
|
+
API documentations for MyGUI library
|
|
327
|
+
|
|
328
|
+
[32mnim-lapper-dev[0m/questing,questing 0.1.8-1 all
|
|
329
|
+
simple, fast interval searches for nim
|
|
330
|
+
|
|
331
|
+
[32mnode-ansi[0m/questing,questing 0.3.1-2 all
|
|
332
|
+
Advanced ANSI formatting tool for Node.js
|
|
333
|
+
|
|
334
|
+
[32mnode-ansi-escapes[0m/questing,questing 5.0.0+really.4.3.1-1 all
|
|
335
|
+
ANSI escape codes for manipulating the terminal
|
|
336
|
+
|
|
337
|
+
[32mnode-charm[0m/questing,questing 1.0.2-3 all
|
|
338
|
+
ansi control sequences for terminal cursor hopping and colors
|
|
339
|
+
|
|
340
|
+
[32mnode-cli-cursor[0m/questing,questing 4.0.0-3 all
|
|
341
|
+
Toggle the CLI cursor
|
|
342
|
+
|
|
343
|
+
[32mnode-console-control-strings[0m/questing,questing 1.1.0-3 all
|
|
344
|
+
cross-platform tested terminal/console command strings
|
|
345
|
+
|
|
346
|
+
[32mnode-restore-cursor[0m/questing,questing 4.0.0-4 all
|
|
347
|
+
Gracefully restore the CLI cursor on exit
|
|
348
|
+
|
|
349
|
+
[32mnode-y-codemirror[0m/questing,questing 3.0.1-2 all
|
|
350
|
+
node-yjs binding to a CodeMirror editor
|
|
351
|
+
|
|
352
|
+
[32mnode-yjs[0m/questing,questing 13.6.8-1 all
|
|
353
|
+
CRDT framework with a powerful abstraction of shared data
|
|
354
|
+
|
|
355
|
+
[32mobs-advanced-scene-switcher[0m/questing 1.29.2-1ubuntu1 amd64
|
|
356
|
+
plugin for OBS Studio to improve the scene switching
|
|
357
|
+
|
|
358
|
+
[32moneko[0m/questing 1.2.sakura.6-16 amd64
|
|
359
|
+
cat chases the cursor (now a mouse) around the screen
|
|
360
|
+
|
|
361
|
+
[32moxygen-cursor-theme[0m/questing,questing 0.0.2012-06-kde4.8-6ubuntu1 all
|
|
362
|
+
Oxygen mouse cursor theme
|
|
363
|
+
|
|
364
|
+
[32moxygen-cursor-theme-extra[0m/questing,questing 0.0.2012-06-kde4.8-6ubuntu1 all
|
|
365
|
+
Oxygen mouse cursor theme - extra colors
|
|
366
|
+
|
|
367
|
+
[32mpacvim[0m/questing 1.1.1-1.1 amd64
|
|
368
|
+
pacman game concept with vim command
|
|
369
|
+
|
|
370
|
+
[32mpaje.app[0m/questing 1.98-2build1 amd64
|
|
371
|
+
generic visualization tool (Gantt chart and more)
|
|
372
|
+
|
|
373
|
+
[32mpaper-icon-theme[0m/questing,questing 1.5.0+git20200312.aa3e8af-6 all
|
|
374
|
+
simple and modern icon and cursor theme
|
|
375
|
+
|
|
376
|
+
[32mpd-hcs[0m/questing 0.2.1-4build1 amd64
|
|
377
|
+
Pd library of experiments in UNIX, the Pd GUI, and more
|
|
378
|
+
|
|
379
|
+
[32mpdns-recursor[0m/questing 5.2.4-2build2 amd64
|
|
380
|
+
PowerDNS Recursor
|
|
381
|
+
|
|
382
|
+
[32mphinger-cursor-theme[0m/questing,questing 1.1-0ubuntu1 all
|
|
383
|
+
The most over-engineered cursor theme
|
|
384
|
+
|
|
385
|
+
[32mphosh-osk-stub[0m/questing 0.46.0-1 amd64
|
|
386
|
+
An alternative on screen keyboard for Phosh
|
|
387
|
+
|
|
388
|
+
[32mphosh-osk-stub-doc[0m/questing,questing 0.46.0-1 all
|
|
389
|
+
API documentation for Phosh's OSK stub
|
|
390
|
+
|
|
391
|
+
[32mpinfo[0m/questing 0.6.13-2 amd64
|
|
392
|
+
user-friendly console-based viewer for Info document files
|
|
393
|
+
|
|
394
|
+
[32mpython-bsddb3-doc[0m/questing,questing 6.2.9-4build1 all
|
|
395
|
+
Documentation for the python Berkeley DB interface module
|
|
396
|
+
|
|
397
|
+
[32mpython-psycopg2-doc[0m/questing,questing 2.9.10-1build1 all
|
|
398
|
+
Python module for PostgreSQL (documentation package)
|
|
399
|
+
|
|
400
|
+
[32mpython3-ansi[0m/questing,questing 0.1.5-2 all
|
|
401
|
+
cursor movement and graphics - Python 3
|
|
402
|
+
|
|
403
|
+
[32mpython3-asyncpg[0m/questing 0.30.0-1.1 amd64
|
|
404
|
+
asyncio PosgtreSQL driver
|
|
405
|
+
|
|
406
|
+
[32mpython3-bsddb3[0m/questing 6.2.9-4build1 amd64
|
|
407
|
+
Python interface for Berkeley DB (Python 3.x)
|
|
408
|
+
|
|
409
|
+
[32mpython3-consolekit[0m/questing,questing 1.7.2-2 all
|
|
410
|
+
Additional utilities for click
|
|
411
|
+
|
|
412
|
+
[32mpython3-easyansi[0m/questing,questing 0.3-4 all
|
|
413
|
+
terminal framework for colors, cursor movements, and drawing
|
|
414
|
+
|
|
415
|
+
[32mpython3-mplcursors[0m/questing,questing 0.6-2 all
|
|
416
|
+
Interactive data selection cursors for Matplotlib
|
|
417
|
+
|
|
418
|
+
[32mpython3-psycopg2[0m/questing 2.9.10-1build1 amd64
|
|
419
|
+
Python 3 module for PostgreSQL
|
|
420
|
+
|
|
421
|
+
[32mpython3-psycopg2cffi[0m/questing 2.9.0-1 amd64
|
|
422
|
+
implementation of the psycopg2 module using cffi
|
|
423
|
+
|
|
424
|
+
[32mpython3-tktooltip[0m/questing 3.1.2-1 amd64
|
|
425
|
+
simple yet fully customisable tooltip/pop-up implementation
|
|
426
|
+
|
|
427
|
+
[32mruby-tty-cursor[0m/questing,questing 0.7.1-2 all
|
|
428
|
+
Library to help move the terminal cursor around and manipulate text
|
|
429
|
+
|
|
430
|
+
[32msabily-themes[0m/questing,questing 1.7build1 all
|
|
431
|
+
Sabily themes
|
|
432
|
+
|
|
433
|
+
[32mslop[0m/questing 7.6-4ubuntu1 amd64
|
|
434
|
+
queries for a selection from the user and prints the region to stdout
|
|
435
|
+
|
|
436
|
+
[32msmenu[0m/questing 1.4.0-1 amd64
|
|
437
|
+
curse-based CLI selection box
|
|
438
|
+
|
|
439
|
+
[32mspeakup-doc[0m/questing,questing 3.1.6.dfsg.1-7 all
|
|
440
|
+
Documentation for speakup kernel modules
|
|
441
|
+
|
|
442
|
+
[32mstaden[0m/questing 2.0.0+b11-7 amd64
|
|
443
|
+
DNA sequence assembly (Gap4/Gap5), editing and analysis tools
|
|
444
|
+
|
|
445
|
+
[32mstaden-common[0m/questing,questing 2.0.0+b11-7 all
|
|
446
|
+
Architecture independent files for Staden
|
|
447
|
+
|
|
448
|
+
[32mtea[0m/questing 63.3.0-1 amd64
|
|
449
|
+
graphical text editor with syntax highlighting
|
|
450
|
+
|
|
451
|
+
[32mteseq[0m/questing 1.1.1-5 amd64
|
|
452
|
+
utility for rendering terminal typescripts human-readable
|
|
453
|
+
|
|
454
|
+
[32mtklib[0m/questing,questing 0.9-1 all
|
|
455
|
+
standard Tk Library
|
|
456
|
+
|
|
457
|
+
[32mtopp[0m/questing 2.6.0+cleaned1-4build7 amd64
|
|
458
|
+
set of programs implementing The OpenMS Proteomic Pipeline
|
|
459
|
+
|
|
460
|
+
[32mubuntume-themes[0m/questing,questing 1.7build1 all
|
|
461
|
+
Sabily themes (transitional package)
|
|
462
|
+
|
|
463
|
+
[32mukui-settings-daemon[0m/questing 4.0.0.2-1 amd64
|
|
464
|
+
daemon handling the UKUI session settings
|
|
465
|
+
|
|
466
|
+
[32mukui-settings-daemon-common[0m/questing,questing 4.0.0.2-1 all
|
|
467
|
+
daemon handling the UKUI session settings (common files)
|
|
468
|
+
|
|
469
|
+
[32munclutter[0m/questing 8-26 amd64
|
|
470
|
+
hides the mouse cursor in X after a period of inactivity
|
|
471
|
+
|
|
472
|
+
[32munclutter-xfixes[0m/questing 1.6-1build2 amd64
|
|
473
|
+
hide the X mouse cursor after a period of inactivity, using XFixes
|
|
474
|
+
|
|
475
|
+
[32munity-settings-daemon[0m/questing 15.04.1+21.10.20220802-0ubuntu6 amd64
|
|
476
|
+
daemon handling the Unity session settings
|
|
477
|
+
|
|
478
|
+
[32muqm[0m/questing 0.8.0+dfsg-3.2 amd64
|
|
479
|
+
The Ur-Quan Masters - An inter-galactic adventure game
|
|
480
|
+
|
|
481
|
+
[32muqm-content[0m/questing,questing 0.8.0+deb-1 all
|
|
482
|
+
The Ur-Quan Masters - Game data files
|
|
483
|
+
|
|
484
|
+
[32muqm-music[0m/questing,questing 0.8.0+deb-1 all
|
|
485
|
+
The Ur-Quan Masters - Game music files
|
|
486
|
+
|
|
487
|
+
[32muqm-russian[0m/questing,questing 1.0.2-6 all
|
|
488
|
+
Russian addon for 'The Ur-Quan Masters' game
|
|
489
|
+
|
|
490
|
+
[32muqm-voice[0m/questing,questing 0.8.0+deb-1 all
|
|
491
|
+
The Ur-Quan Masters - Voice files
|
|
492
|
+
|
|
493
|
+
[32mval-and-rick[0m/questing 0.1a.dfsg1-7build1 amd64
|
|
494
|
+
shooter game
|
|
495
|
+
|
|
496
|
+
[32mval-and-rick-data[0m/questing,questing 0.1a.dfsg1-7build1 all
|
|
497
|
+
shooter game - game data
|
|
498
|
+
|
|
499
|
+
[32mvim-textobj-user[0m/questing,questing 0.7.6-3 all
|
|
500
|
+
Vim plugin for user-defined text objects
|
|
501
|
+
|
|
502
|
+
[32mvis[0m/questing 0.9-1 amd64
|
|
503
|
+
Modern, legacy free, simple yet efficient vim-like editor
|
|
504
|
+
|
|
505
|
+
[32mwmdrawer[0m/questing 0.10.5-6.1build2 amd64
|
|
506
|
+
Window Maker dockapp providing a drawer to launch applications
|
|
507
|
+
|
|
508
|
+
[32mwmfire[0m/questing 1.2.4-8 amd64
|
|
509
|
+
very cool fiery way of showing your CPU usage
|
|
510
|
+
|
|
511
|
+
[32mx11-apps[0m/questing,now 7.7+11build3 amd64 [installed,automatic]
|
|
512
|
+
X applications
|
|
513
|
+
|
|
514
|
+
[32mxbanish[0m/questing 1.8-1 amd64
|
|
515
|
+
banish the mouse cursor when typing, show it again when the mouse moves
|
|
516
|
+
|
|
517
|
+
[32mxbattbar[0m/questing 1.4.9-2 amd64
|
|
518
|
+
Display battery status in X11
|
|
519
|
+
|
|
520
|
+
[32mxcur2png[0m/questing 0.7.1-1.1 amd64
|
|
521
|
+
program to convert X cursors into PNG images
|
|
522
|
+
|
|
523
|
+
[32mxcursor-themes[0m/questing,questing,now 1.0.6-0ubuntu1 all [installed,automatic]
|
|
524
|
+
Base X cursor themes
|
|
525
|
+
|
|
526
|
+
[32mxfce4-eyes-plugin[0m/questing 4.6.2-1 amd64
|
|
527
|
+
eyes that follow your mouse for the Xfce4 panel
|
|
528
|
+
|
|
529
|
+
[32mxfoil[0m/questing 6.99.dfsg+1-3 amd64
|
|
530
|
+
program for the design and analysis of subsonic airfoils
|
|
531
|
+
|
|
532
|
+
[32mxgterm[0m/questing 2.2+dfsg-1 amd64
|
|
533
|
+
Terminal emulator to work with IRAF
|
|
534
|
+
|
|
535
|
+
[32mxidle[0m/questing 20200802 amd64
|
|
536
|
+
run program after inactivity or edge sensitive
|
|
537
|
+
|
|
538
|
+
[32mxmlbeans[0m/questing,questing 4.0.0-2 all
|
|
539
|
+
Java library for accessing XML by binding it to Java types - tools
|
|
540
|
+
|
|
541
|
+
[32mxwit[0m/questing 3.4-16 amd64
|
|
542
|
+
collection of simple routines to call some X11 functions
|
|
543
|
+
|
|
544
|
+
[32myorick-curses[0m/questing 0.1-7 amd64
|
|
545
|
+
interface to the (n)curses library for the Yorick language
|
|
546
|
+
|
|
547
|
+
[32mzsh-autosuggestions[0m/questing,questing 0.7.1-1 all
|
|
548
|
+
Fish-like fast/unobtrusive autosuggestions for zsh
|
|
549
|
+
|